Skip to content

Commit a7272da

Browse files
committed
Merge branch 'feature/improve-input-error-behaviour' into develop
2 parents 3c70c24 + 9047cac commit a7272da

9 files changed

Lines changed: 117 additions & 56 deletions

File tree

components/Input/ColorInput/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const propTypes = {
5050

5151
disabled: PropTypes.bool,
5252
readOnly: PropTypes.bool,
53+
persistantHintAndError: PropTypes.bool,
5354
};
5455

5556
const defaultProps = {
@@ -61,6 +62,7 @@ const defaultProps = {
6162
showHintAndError: true,
6263
disabled: false,
6364
readOnly: false,
65+
persistantHintAndError: true,
6466
};
6567

6668
class ColorInput extends React.PureComponent {
@@ -136,6 +138,7 @@ class ColorInput extends React.PureComponent {
136138
hint,
137139
disabled,
138140
readOnly,
141+
persistantHintAndError,
139142
} = this.props;
140143

141144
const { showColorPicker } = this.state;
@@ -179,6 +182,7 @@ class ColorInput extends React.PureComponent {
179182
show={showHintAndError}
180183
hint={hint}
181184
error={error}
185+
persistant={persistantHintAndError}
182186
/>
183187
{
184188
showColorPicker && (

components/Input/HintAndError/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ const propTypes = {
88
show: PropTypes.bool,
99
error: PropTypes.string,
1010
hint: PropTypes.string,
11+
persistant: PropTypes.bool,
1112
};
1213

1314
const defaultProps = {
1415
show: true,
1516
error: undefined,
1617
hint: undefined,
18+
persistant: false,
1719
};
1820

1921
const emptyText = '-';
@@ -28,9 +30,10 @@ export default class InputHintAndError extends React.PureComponent {
2830
show,
2931
error,
3032
hint,
33+
persistant,
3134
} = this.props;
3235

33-
if (!show) {
36+
if (!show || (!persistant && !error)) {
3437
return null;
3538
}
3639

components/Input/HintAndError/styles.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
.input-hint-and-error {
32
overflow: hidden;
43
text-overflow: ellipsis;

components/Input/NonFieldErrors/styles.scss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
.non-field-errors {
32
display: flex;
43
text-align: center;
@@ -9,7 +8,8 @@
98
padding: var(--spacing-small);
109

1110
&.empty {
12-
color: transparent;
11+
display: none;
12+
// color: transparent;
1313
user-select: none;
1414
}
1515

components/Input/SegmentInput/Option/index.js

Lines changed: 47 additions & 36 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,64 +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,
59+
id,
60+
index,
61+
label,
62+
name,
63+
onChange,
4264
readOnly,
43-
checked,
65+
renderer: Renderer,
66+
rendererClassName,
67+
rendererParams,
4468
} = this.props;
4569

46-
const classNames = [
70+
const classNames = _cs(
4771
'segment-option',
4872
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 {
72-
id,
73-
onChange,
74-
checked,
75-
label,
76-
name,
77-
} = this.props;
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+
);
7882

79-
const classNames = this.getClassName();
83+
const extraProps = rendererParams ? rendererParams(id, datum, index, data) : undefined;
8084

8185
return (
8286
<label
8387
htmlFor={this.inputId}
8488
className={classNames}
8589
>
8690
<input
87-
className={`${styles.segmentButtonInput} segment-option-input`}
91+
className={_cs(styles.segmentButtonInput, 'segment-option-input')}
8892
type="radio"
8993
onChange={onChange}
9094
checked={checked}
9195
id={this.inputId}
9296
value={id}
9397
name={name}
9498
/>
95-
{label}
99+
{ Renderer ? (
100+
<Renderer
101+
className={rendererClassName}
102+
{...extraProps}
103+
/>
104+
) : (
105+
label
106+
)}
96107
</label>
97108
);
98109
}

components/Input/SegmentInput/index.js

Lines changed: 43 additions & 10 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,16 +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-
});
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+
}
145178

146179
render() {
147180
const {

components/Input/SelectInput/index.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ const propTypes = {
6060
optionLabelSelector: PropTypes.func,
6161

6262
renderEmpty: PropTypes.func,
63+
persistantHintAndError: PropTypes.bool,
6364
};
6465

6566
const defaultProps = {
@@ -82,6 +83,7 @@ const defaultProps = {
8283
showLabel: true,
8384
title: undefined,
8485
value: undefined,
86+
persistantHintAndError: true,
8587
};
8688

8789
class SelectInput extends React.PureComponent {
@@ -292,6 +294,7 @@ class SelectInput extends React.PureComponent {
292294
autoFocus,
293295
hideClearButton,
294296
className: classNameFromProps,
297+
persistantHintAndError,
295298
options,
296299
} = this.props;
297300

@@ -415,12 +418,12 @@ class SelectInput extends React.PureComponent {
415418
/>
416419
</div>
417420
</div>
418-
{ showHintAndError && (
419-
<HintAndError
420-
error={error}
421-
hint={hint}
422-
/>
423-
)}
421+
<HintAndError
422+
show={showHintAndError}
423+
error={error}
424+
hint={hint}
425+
persistant={persistantHintAndError}
426+
/>
424427
<Options
425428
className={optionsClassName}
426429
labelSelector={labelSelector}

components/Input/TextArea/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ const propTypes = {
6363
resize: PropTypes.string,
6464

6565
selectOnFocus: PropTypes.bool,
66+
persistantHintAndError: PropTypes.bool,
6667
};
6768

6869
const defaultProps = {
@@ -80,6 +81,7 @@ const defaultProps = {
8081
showHintAndError: true,
8182
value: '',
8283
selectOnFocus: false,
84+
persistantHintAndError: true,
8385
};
8486

8587
export class NormalTextArea extends React.PureComponent {
@@ -188,6 +190,7 @@ export class NormalTextArea extends React.PureComponent {
188190
showHintAndError,
189191
disabled,
190192
resize,
193+
persistantHintAndError,
191194
...otherProps
192195
} = this.props;
193196

@@ -216,6 +219,7 @@ export class NormalTextArea extends React.PureComponent {
216219
show={showHintAndError}
217220
hint={hint}
218221
error={error}
222+
persistant={persistantHintAndError}
219223
/>
220224
</div>
221225
);

0 commit comments

Comments
 (0)