Skip to content

Commit 9047cac

Browse files
AdityaKhatritnagorra
authored andcommitted
Use renderer params in segment input options
1 parent 57adfe7 commit 9047cac

2 files changed

Lines changed: 90 additions & 51 deletions

File tree

components/Input/SegmentInput/Option/index.js

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
3-
import { randomString, isFalsy } from '@togglecorp/fujs';
3+
import {
4+
_cs,
5+
randomString,
6+
isFalsy,
7+
} from '@togglecorp/fujs';
48

59
import styles from './styles.scss';
610

@@ -16,12 +20,22 @@ const propTypes = {
1620
error: PropTypes.string,
1721
disabled: PropTypes.bool,
1822
readOnly: PropTypes.bool,
23+
renderer: PropTypes.func,
24+
rendererClassName: PropTypes.string,
25+
rendererParams: PropTypes.func,
26+
index: PropTypes.number.isRequired,
27+
datum: PropTypes.object, // eslint-disable-line react/forbid-prop-types
28+
data: PropTypes.array.isRequired, // eslint-disable-line react/forbid-prop-types
1929
};
2030

2131
const defaultProps = {
2232
error: '',
2333
disabled: false,
2434
readOnly: false,
35+
renderer: undefined,
36+
rendererClassName: '',
37+
rendererParams: undefined,
38+
datum: {},
2539
};
2640

2741
export default class SegmentOption extends React.PureComponent {
@@ -35,66 +49,61 @@ export default class SegmentOption extends React.PureComponent {
3549
this.inputId = randomString();
3650
}
3751

38-
getClassName = () => {
52+
render() {
3953
const {
54+
checked,
55+
data,
56+
datum,
4057
disabled,
4158
error,
42-
readOnly,
43-
checked,
44-
} = this.props;
45-
46-
const classNames = [
47-
'segment-option',
48-
styles.segmentOption,
49-
];
50-
51-
if (checked) {
52-
classNames.push('checked');
53-
classNames.push(styles.checked);
54-
}
55-
if (readOnly) {
56-
classNames.push('read-only');
57-
classNames.push(styles.readOnly);
58-
}
59-
if (disabled) {
60-
classNames.push('disabled');
61-
classNames.push(styles.disabled);
62-
}
63-
if (!isFalsy(error, [''])) {
64-
classNames.push('error');
65-
classNames.push(styles.error);
66-
}
67-
return classNames.join(' ');
68-
}
69-
70-
render() {
71-
const {
7259
id,
73-
onChange,
74-
checked,
60+
index,
7561
label,
7662
name,
63+
onChange,
64+
readOnly,
7765
renderer: Renderer,
78-
data,
66+
rendererClassName,
67+
rendererParams,
7968
} = this.props;
8069

81-
const classNames = this.getClassName();
70+
const classNames = _cs(
71+
'segment-option',
72+
styles.segmentOption,
73+
checked && 'checked',
74+
checked && styles.checked,
75+
readOnly && 'read-only',
76+
readOnly && styles.readOnly,
77+
disabled && 'disabled',
78+
disabled && styles.disabled,
79+
!isFalsy(error, ['']) && 'error',
80+
!isFalsy(error, ['']) && styles.error,
81+
);
82+
83+
const extraProps = rendererParams ? rendererParams(id, datum, index, data) : undefined;
8284

8385
return (
8486
<label
8587
htmlFor={this.inputId}
8688
className={classNames}
8789
>
8890
<input
89-
className={`${styles.segmentButtonInput} segment-option-input`}
91+
className={_cs(styles.segmentButtonInput, 'segment-option-input')}
9092
type="radio"
9193
onChange={onChange}
9294
checked={checked}
9395
id={this.inputId}
9496
value={id}
9597
name={name}
9698
/>
97-
{ Renderer ? <Renderer data={data} /> : label}
99+
{ Renderer ? (
100+
<Renderer
101+
className={rendererClassName}
102+
{...extraProps}
103+
/>
104+
) : (
105+
label
106+
)}
98107
</label>
99108
);
100109
}

components/Input/SegmentInput/index.js

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ const propTypes = {
1616
*/
1717
className: PropTypes.string,
1818

19+
itemClassName: PropTypes.string,
20+
1921
/**
2022
* Is input disabled?
2123
*/
@@ -52,6 +54,10 @@ const propTypes = {
5254
keySelector: PropTypes.func,
5355
readOnly: PropTypes.bool,
5456

57+
renderer: PropTypes.func,
58+
rendererClassName: PropTypes.string,
59+
rendererParams: PropTypes.func,
60+
5561
value: PropTypes.oneOfType([
5662
PropTypes.string,
5763
PropTypes.number,
@@ -63,6 +69,7 @@ const propTypes = {
6369

6470
const defaultProps = {
6571
className: '',
72+
itemClassName: '',
6673
disabled: false,
6774
readOnly: false,
6875
error: '',
@@ -74,6 +81,9 @@ const defaultProps = {
7481
keySelector: d => d.key,
7582
labelSelector: d => d.label,
7683
showHintAndError: true,
84+
renderer: undefined,
85+
rendererClassName: '',
86+
rendererParams: undefined,
7787
value: '',
7888
name: '',
7989
options: [],
@@ -132,19 +142,39 @@ class SegmentInput extends React.PureComponent {
132142
}
133143
}
134144

135-
rendererParams = (key, data) => ({
136-
label: this.props.labelSelector(data),
137-
id: String(this.props.keySelector(data)),
138-
onChange: this.handleInputChange,
139-
name: this.props.name,
140-
checked: String(this.props.value) === String(key),
141-
error: this.props.error,
142-
readOnly: this.props.readOnly,
143-
disabled: this.props.disabled,
144-
renderer: this.props.renderer,
145-
className: this.props.itemClassName,
146-
data,
147-
});
145+
rendererParams = (key, datum, index, data) => {
146+
const {
147+
labelSelector,
148+
keySelector,
149+
name,
150+
value,
151+
error,
152+
readOnly,
153+
renderer,
154+
disabled,
155+
itemClassName,
156+
rendererParams,
157+
rendererClassName,
158+
} = this.props;
159+
160+
return ({
161+
label: labelSelector(datum),
162+
id: String(keySelector(datum)),
163+
onChange: this.handleInputChange,
164+
name,
165+
checked: String(value) === String(key),
166+
error,
167+
readOnly,
168+
disabled,
169+
renderer,
170+
className: itemClassName,
171+
rendererParams,
172+
rendererClassName,
173+
datum,
174+
index,
175+
data,
176+
});
177+
}
148178

149179
render() {
150180
const {

0 commit comments

Comments
 (0)