@spothero/ui 15.1.0 → 15.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +0 -18
  2. package/package.json +2 -3
  3. package/styles/v2/components/Modal/styles/dialogContainer.js +0 -1
  4. package/styles/v2/components/Radio/Radio.jsx +1 -1
  5. package/styles/v2/components/Radio/RadioGroup.jsx +1 -1
  6. package/v2/index.js +1 -1
  7. package/v2/index.js.map +1 -1
  8. package/styles/Alert/Alert.jsx +0 -45
  9. package/styles/Alert/Alert.spec.js +0 -85
  10. package/styles/AutoSuggestInput/AutoSuggestInput.jsx +0 -429
  11. package/styles/AutoSuggestInput/AutoSuggestInput.spec.js +0 -132
  12. package/styles/AutoSuggestInput/AutoSuggestItem.jsx +0 -61
  13. package/styles/AutoSuggestInput/AutoSuggestList.jsx +0 -85
  14. package/styles/Badge/Badge.jsx +0 -24
  15. package/styles/Badge/Badge.spec.js +0 -43
  16. package/styles/Chart/Chart.jsx +0 -185
  17. package/styles/Chart/Chart.spec.js +0 -369
  18. package/styles/Checkbox/Checkbox.jsx +0 -159
  19. package/styles/Checkbox/Checkbox.spec.js +0 -142
  20. package/styles/DateTime/DatePicker.jsx +0 -281
  21. package/styles/DateTime/DatePicker.spec.js +0 -186
  22. package/styles/DateTime/DatePickerCalendar.jsx +0 -170
  23. package/styles/DateTime/DatePickerCalendarNavigation.jsx +0 -44
  24. package/styles/DateTime/DatePickerCalendarWithRange.jsx +0 -218
  25. package/styles/DateTime/DateTimePicker.jsx +0 -266
  26. package/styles/DateTime/DateTimePicker.spec.js +0 -60
  27. package/styles/DateTime/DateTimeRangePicker.jsx +0 -629
  28. package/styles/DateTime/DateTimeRangePicker.spec.js +0 -425
  29. package/styles/DateTime/TimePicker.jsx +0 -158
  30. package/styles/DateTime/TimePicker.spec.js +0 -148
  31. package/styles/DateTime/date-time-assertions.js +0 -89
  32. package/styles/DateTime/index.js +0 -6
  33. package/styles/ErrorBoundary/ErrorBoundary.jsx +0 -76
  34. package/styles/ErrorBoundary/ErrorBoundary.spec.js +0 -72
  35. package/styles/Flyout/Flyout.jsx +0 -147
  36. package/styles/Flyout/Flyout.spec.js +0 -117
  37. package/styles/Form/Form.jsx +0 -151
  38. package/styles/Form/Form.spec.js +0 -148
  39. package/styles/Form/FormElementError.jsx +0 -18
  40. package/styles/Form/FormGroup.jsx +0 -32
  41. package/styles/Form/FormGroupError.jsx +0 -24
  42. package/styles/Form/index.js +0 -4
  43. package/styles/GooglePlacesSearchInput/GooglePlacesSearchInput.jsx +0 -215
  44. package/styles/GooglePlacesSearchInput/GooglePlacesSearchInput.spec.js +0 -213
  45. package/styles/GooglePlacesSearchInput/PoweredByGoogle.jsx +0 -43
  46. package/styles/GooglePlacesSearchInput/index.js +0 -2
  47. package/styles/HorizontalRule/HorizontalRule.jsx +0 -36
  48. package/styles/HorizontalRule/HorizontalRule.spec.js +0 -94
  49. package/styles/Label/Label.jsx +0 -22
  50. package/styles/Label/Label.spec.js +0 -11
  51. package/styles/Notification/Notification.jsx +0 -117
  52. package/styles/Notification/Notification.spec.js +0 -154
  53. package/styles/Notification/NotificationContainer.jsx +0 -90
  54. package/styles/Notification/NotificationPropTypes.js +0 -20
  55. package/styles/Notification/index.js +0 -2
  56. package/styles/PasswordControl/PasswordControl.jsx +0 -197
  57. package/styles/PasswordControl/PasswordControl.spec.js +0 -236
  58. package/styles/Portal/Portal.jsx +0 -65
  59. package/styles/Portal/Portal.spec.js +0 -45
  60. package/styles/PulseLoader/PulseLoader.jsx +0 -71
  61. package/styles/PulseLoader/PulseLoader.spec.js +0 -63
  62. package/styles/Radio/Radio.jsx +0 -114
  63. package/styles/Radio/Radio.spec.js +0 -128
  64. package/styles/Radio/RadioGroup.jsx +0 -105
  65. package/styles/Radio/index.js +0 -2
  66. package/styles/RenderInBody/RenderInBody.jsx +0 -56
  67. package/styles/RenderInBody/RenderInBody.spec.js +0 -24
  68. package/styles/Select/Select.jsx +0 -251
  69. package/styles/Select/Select.spec.js +0 -254
  70. package/styles/Select/SelectItemPropTypes.js +0 -19
  71. package/styles/Select/index.js +0 -2
  72. package/styles/SelectControlled/SelectControlled.jsx +0 -250
  73. package/styles/SelectControlled/SelectControlled.spec.js +0 -290
  74. package/styles/SelectControlled/index.js +0 -1
  75. package/styles/Sprite/Sprite.jsx +0 -16
  76. package/styles/Sprite/Sprite.spec.js +0 -11
  77. package/styles/Tabs/Tab.jsx +0 -38
  78. package/styles/Tabs/TabContent.jsx +0 -46
  79. package/styles/Tabs/TabNavigation.jsx +0 -64
  80. package/styles/Tabs/TabPanel.jsx +0 -30
  81. package/styles/Tabs/Tabs.jsx +0 -87
  82. package/styles/Tabs/Tabs.spec.js +0 -201
  83. package/styles/Tabs/index.js +0 -5
  84. package/styles/TextArea/TextArea.jsx +0 -137
  85. package/styles/TextArea/TextArea.spec.js +0 -111
  86. package/styles/TextInput/TextInput.jsx +0 -159
  87. package/styles/TextInput/TextInput.spec.js +0 -263
  88. package/styles/TextInput/TextInputPropTypes.js +0 -88
  89. package/styles/TextInput/index.js +0 -2
  90. package/styles/Tooltip/Tooltip.jsx +0 -230
  91. package/styles/Tooltip/Tooltip.spec.js +0 -170
@@ -1,201 +0,0 @@
1
- describe('<Tabs />', () => {
2
- context('Display', () => {
3
- context('Default', () => {
4
- beforeEach(() => {
5
- cy.visitStory('v1/Tabs/Display', 'Default');
6
- });
7
-
8
- it('Should take in and display basic tab and panel content, with default active states and custom classes', () => {
9
- cy.get('.Tabs')
10
- .find('.Tab')
11
- .should('have.length', 4)
12
- .eq(0)
13
- .should('have.class', 'Tab-active')
14
- .get('.Tabs')
15
- .find('.TabPanel')
16
- .should('have.length', 4)
17
- .eq(0)
18
- .should('have.class', 'TabPanel-active')
19
- // check that the mobile select component is rendered
20
- .get('.Tabs')
21
- .find('.TabNavigation-select')
22
- .find('option')
23
- .should('have.length', 4)
24
- .eq(0)
25
- .should('be.selected');
26
- });
27
-
28
- it('Should apply custom classes to all components', () => {
29
- cy.get('.Tabs')
30
- .should(
31
- 'have.class',
32
- 'custom-tab-component restaurant-menus'
33
- )
34
- .find('.TabNavigation')
35
- .should('have.class', 'tab-nav menu-nav')
36
- .get('.Tabs')
37
- .find('.Tab')
38
- .eq(0)
39
- .should('have.class', 'menu-tab special-menu')
40
- .get('.Tabs')
41
- .find('.TabContent')
42
- .should(
43
- 'have.class',
44
- 'tab-content-container restaurant-menus-container'
45
- )
46
- .get('.Tabs')
47
- .find('.TabPanel')
48
- .eq(3)
49
- .should('have.class', 'menu-content dessert-menu-content');
50
- });
51
-
52
- it('Should have visible Select on mobile viewport and visible tabs otherwise', () => {
53
- cy.get('.Tabs')
54
- .find('.TabNavigation-select')
55
- .should('not.be.visible')
56
- .get('.Tabs')
57
- .find('.Tab')
58
- .should('be.visible')
59
- .viewport('iphone-6')
60
- .get('.Tabs')
61
- .find('.TabNavigation-select')
62
- .should('be.visible')
63
- .get('.Tabs')
64
- .find('.Tab')
65
- .should('not.be.visible');
66
- });
67
- });
68
-
69
- context('Child Nodes', () => {
70
- it('Should take in and display complex tab and panel content', () => {
71
- cy.visitStory('v1/Tabs/Display', 'ChildNodes')
72
- // Check that spans exist in the tab
73
- .get('.Tabs')
74
- .find('.Tab')
75
- .eq(0)
76
- .find('span.breakfast-tab')
77
- .should('exist')
78
- .should('contain', 'Breakfast Menu')
79
- // Check that icon is in the tab
80
- .get('.Tabs')
81
- .find('.Tab')
82
- .eq(3)
83
- .find('.Icon')
84
- .should('exist')
85
- // Check that span/div exists in the panel
86
- .get('.Tabs')
87
- .find('.TabPanel')
88
- .eq(0)
89
- .find('span.bacon')
90
- .should('exist')
91
- .get('.Tabs')
92
- .find('.TabPanel')
93
- .eq(0)
94
- .find('div.toast')
95
- .should('exist')
96
- // Check that ul/li exists in the panel
97
- .get('.Tabs')
98
- .find('.TabPanel')
99
- .eq(1)
100
- .find('ul')
101
- .should('exist')
102
- .find('li')
103
- .should('have.length', 3);
104
- });
105
- });
106
-
107
- context('Selected Index', () => {
108
- it('Should display specified tab and content', () => {
109
- cy.visitStory('v1/Tabs/Display', 'SelectedIndex')
110
- .get('.Tabs')
111
- .find('.Tab')
112
- .eq(3)
113
- .should('have.class', 'Tab-active')
114
- .get('.Tabs')
115
- .find('.TabPanel')
116
- .eq(3)
117
- .should('have.class', 'TabPanel-active')
118
- // check that the mobile select component has the correct option selected
119
- .get('.Tabs')
120
- .find('.TabNavigation-select option')
121
- .eq(3)
122
- .should('be.selected');
123
- });
124
- });
125
-
126
- context('Render Active Only', () => {
127
- it('Should render only tab content corresponding to the active tab', () => {
128
- cy.visitStory('v1/Tabs/Display', 'RenderActiveOnly')
129
- .get('.Tabs')
130
- .find('.TabPanel')
131
- .should('have.length', 1)
132
- .should('have.class', 'TabPanel-active')
133
- .should('contain', 'Bacon, Eggs, and Toast')
134
- .get('.Tabs')
135
- .find('.Tab')
136
- .eq(2)
137
- .click()
138
- .get('.Tabs')
139
- .find('.TabPanel')
140
- .should('have.length', 1)
141
- .should('have.class', 'TabPanel-active')
142
- .should(
143
- 'contain',
144
- 'Prime Rib, Mashed Potatoes, and Glazed Carrots'
145
- );
146
- });
147
- });
148
- });
149
-
150
- context('Methods', () => {
151
- context('On Select', () => {
152
- beforeEach(() => {
153
- cy.visitStory('v1/Tabs/Methods', 'OnSelect', {
154
- onBeforeLoad: contentWindow => {
155
- contentWindow.onTabSelect = evt => {
156
- console.log(`onTabSelect`); // eslint-disable-line no-console
157
- };
158
-
159
- cy.stub(contentWindow, 'onTabSelect').as('onTabSelect');
160
- },
161
- });
162
- });
163
-
164
- it('Should be called when a tab is selected', () => {
165
- cy.get('.Tabs')
166
- .find('.Tab')
167
- .eq(1)
168
- .should('not.have.class', 'Tab-active')
169
- .click()
170
- .get('@onTabSelect')
171
- .should('be.called')
172
- // check that selecting from the mobile select component also calls @onTabSelect
173
- .viewport('iphone-6')
174
- .get('.Tabs')
175
- // cannot use selectItem method due to rerender of TabNavigation
176
- .find('.TabNavigation-select select')
177
- .select('2')
178
- .get('@onTabSelect')
179
- .should('be.called');
180
- });
181
-
182
- it('Should not be called when a tab is already active', () => {
183
- cy.get('.Tabs')
184
- .find('.Tab')
185
- .eq(0)
186
- .should('have.class', 'Tab-active')
187
- .click()
188
- .get('@onTabSelect')
189
- .should('not.be.called')
190
- // check that selecting from the mobile select component does not call @onTabSelect
191
- .viewport('iphone-6')
192
- .get('.Tabs')
193
- // cannot use selectItem method due to rerender of TabNavigation
194
- .find('.TabNavigation-select select')
195
- .select('0')
196
- .get('@onTabSelect')
197
- .should('not.be.called');
198
- });
199
- });
200
- });
201
- });
@@ -1,5 +0,0 @@
1
- export {default as Tab} from './Tab';
2
- export {default as Tabs} from './Tabs';
3
- export {default as TabPanel} from './TabPanel';
4
- export {default as TabContent} from './TabContent';
5
- export {default as TabNavigation} from './TabNavigation';
@@ -1,137 +0,0 @@
1
- import React, {Component} from 'react';
2
- import PropTypes from 'prop-types';
3
- import classNames from 'classnames';
4
-
5
- export default class TextArea extends Component {
6
- static propTypes = {
7
- /** Additional class(es) to add to the component. */
8
- className: PropTypes.string,
9
- /** A unique name which is used to identify this element. If belonging to a form this is used as the key for serialization and is required. */
10
- name: PropTypes.string,
11
- /** Text to display in the field before a user starts to type in the textarea. */
12
- placeholder: PropTypes.string,
13
- /** A custom label (typically a Label component) to display above the textarea. */
14
- label: PropTypes.element,
15
- /** Whether this field is required during validation. */
16
- required: PropTypes.bool,
17
- /** Disallows user interaction. */
18
- disabled: PropTypes.bool,
19
- /** Whether the textarea should be auto focused when mounted. */
20
- autoFocus: PropTypes.bool,
21
- /** A custom help element to place below the input. */
22
- helpNode: PropTypes.node,
23
- /** A custom validation error (typically a FormElementError component) to display when this component is part of a form and is invalid. */
24
- error: PropTypes.element,
25
- /** The default value to display in the textarea when mounted. */
26
- defaultValue: PropTypes.string,
27
- /** Specifies the maximum number of characters allowed. */
28
- maxLength: PropTypes.number,
29
- /** A custom icon (typically an Icon component) to show in the textarea. */
30
- icon: PropTypes.element,
31
- /**
32
- * Function to execute when the textarea changes.
33
- *
34
- * @param {SyntheticEvent} evt - The React `SyntheticEvent`.
35
- */
36
- onChange: PropTypes.func,
37
- /**
38
- * Function to execute when the element is marked as invalid by a validation check.
39
- *
40
- * @param {ValidityState} validationState - ValidityState object for more fine grained control over error handling in a parent component if desired.
41
- */
42
- onInvalid: PropTypes.func,
43
- };
44
- state = {
45
- validationState: null,
46
- };
47
-
48
- componentDidMount() {
49
- this._textarea.addEventListener('invalid', this._onInvalid);
50
- }
51
-
52
- componentWillUnmount() {
53
- this._textarea.removeEventListener('invalid', this._onInvalid);
54
- }
55
-
56
- _onInvalid = evt => {
57
- evt.preventDefault();
58
-
59
- const {onInvalid} = this.props;
60
- const validationState = evt.currentTarget.validity;
61
-
62
- this.setState({
63
- validationState,
64
- });
65
-
66
- if (onInvalid) {
67
- onInvalid(validationState);
68
- }
69
- };
70
-
71
- _onChange = evt => {
72
- const {onChange} = this.props;
73
-
74
- this.setState({
75
- validationState: null,
76
- });
77
-
78
- if (onChange) {
79
- onChange(evt);
80
- }
81
- };
82
-
83
- render() {
84
- const {
85
- className,
86
- name,
87
- label,
88
- placeholder,
89
- disabled,
90
- required,
91
- autoFocus,
92
- helpNode,
93
- error,
94
- defaultValue,
95
- maxLength,
96
- icon,
97
- } = this.props;
98
- const {validationState} = this.state;
99
- const isValid = validationState ? validationState.isValid : true;
100
- const classes = classNames(
101
- 'TextArea',
102
- 'FormElement',
103
- {'TextArea-with-icon': icon},
104
- {'FormElement-contains-error': !isValid},
105
- className
106
- );
107
-
108
- return (
109
- <div className={classes}>
110
- <div className="FormElement-control-container">
111
- {label}
112
- <div className="FormElement-control">
113
- <textarea
114
- ref={node => {
115
- this._textarea = node;
116
- }}
117
- className="FormElement-item"
118
- name={name}
119
- placeholder={placeholder}
120
- required={required}
121
- disabled={disabled}
122
- autoFocus={autoFocus}
123
- maxLength={maxLength}
124
- defaultValue={defaultValue}
125
- onChange={this._onChange}
126
- />
127
- {icon}
128
- </div>
129
- </div>
130
- {helpNode && (
131
- <div className="FormElement-help-text">{helpNode}</div>
132
- )}
133
- {!isValid && error}
134
- </div>
135
- );
136
- }
137
- }
@@ -1,111 +0,0 @@
1
- describe('<TextArea />', () => {
2
- context('Display', () => {
3
- context('Default', () => {
4
- it('Should have placeholder, default value, label, help text, and custom class names', () => {
5
- cy.visitStory('v1/TextArea/Display', 'Default')
6
- .get('.TextArea')
7
- .should('exist')
8
- .and('have.class', 'custom-class1')
9
- .and('have.class', 'custom-class2')
10
- .find('textarea')
11
- .should('have.attr', 'name', 'message')
12
- .and('have.attr', 'placeholder', 'Enter Message Here')
13
- .and('have.value', 'Dear Sir or Madam:')
14
- .get('.TextArea')
15
- .find('.Label')
16
- .contains('Customer Feedback')
17
- .get('.TextArea')
18
- .find('.FormElement-help-text')
19
- .contains('Additional help node text');
20
- });
21
- });
22
-
23
- context('Icon', () => {
24
- it('Should render with an icon', () => {
25
- cy.visitStory('v1/TextArea/Display', 'Icon')
26
- .get('.TextArea')
27
- .find('.Icon')
28
- .should('exist');
29
- });
30
- });
31
-
32
- context('Disabled', () => {
33
- it('Is disabled', () => {
34
- cy.visitStory('v1/TextArea/Display', 'Disabled')
35
- .get('.TextArea')
36
- .find('textarea')
37
- .should('be.disabled');
38
- });
39
- });
40
-
41
- context('Auto Focus', () => {
42
- it('Receives focus after rendered', () => {
43
- cy.visitStory('v1/TextArea/Display', 'AutoFocus')
44
- .focused()
45
- .should('have.attr', 'name', 'message');
46
- });
47
- });
48
-
49
- context('Max Length', () => {
50
- it('Has maxlength attribute and does not allow more characters', () => {
51
- // longstring is 143 characters long
52
- const longstring =
53
- '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890AAA';
54
-
55
- cy.visitStory('v1/TextArea/Display', 'MaxLength')
56
- .get('.TextArea')
57
- .find('textarea')
58
- .should('have.attr', 'maxlength', '140')
59
- .type(longstring, {delay: 0})
60
- .should('have.value', longstring.substring(0, 140));
61
- });
62
- });
63
- });
64
-
65
- context('Methods', () => {
66
- describe('On Change', () => {
67
- it('Executes the method when a change is detected', () => {
68
- cy.visitStory('v1/TextArea/Methods', 'Default', {
69
- onBeforeLoad: contentWindow => {
70
- contentWindow.onTextAreaChange = evt => {
71
- console.log(`onTextAreaChange`); // eslint-disable-line no-console
72
- };
73
-
74
- cy.stub(contentWindow, 'onTextAreaChange').as(
75
- 'onTextAreaChange'
76
- );
77
- },
78
- })
79
- .get('.TextArea')
80
- .find('textarea')
81
- .type('I have a complaint', {delay: 0})
82
- .get('@onTextAreaChange')
83
- .should('be.called');
84
- });
85
- });
86
-
87
- describe('On Invalid', () => {
88
- it('Displays an error if the input is invalid', () => {
89
- cy.visitStory('v1/TextArea/Methods', 'OnInvalid')
90
- .get('.TextArea')
91
- .find('textarea')
92
- // Show error on empty field since this is required
93
- .should('have.value', '')
94
- .get('button[type=submit]')
95
- .click()
96
- .get('.TextArea')
97
- .find('.FormElementError')
98
- .should('exist')
99
- // Don't show error on field with content
100
- .get('.TextArea')
101
- .find('textarea')
102
- .type('I have a complaint', {delay: 0})
103
- .get('button[type=submit]')
104
- .click()
105
- .get('.TextArea')
106
- .find('.FormElementError')
107
- .should('not.exist');
108
- });
109
- });
110
- });
111
- });
@@ -1,159 +0,0 @@
1
- import React, {Component} from 'react';
2
- import classNames from 'classnames';
3
- import InputElement from 'react-input-mask';
4
- import Loader from 'v1/components/Loader/Loader';
5
- import TextInputPropTypes from './TextInputPropTypes';
6
-
7
- export default class TextInput extends Component {
8
- static propTypes = TextInputPropTypes;
9
- static defaultProps = {
10
- type: 'text',
11
- maskChar: null,
12
- iconPosition: 'left',
13
- };
14
- state = {
15
- validationState: null,
16
- };
17
-
18
- componentDidMount() {
19
- this._input
20
- ?.getInputDOMNode()
21
- ?.addEventListener('invalid', this._onInvalid);
22
- }
23
-
24
- componentDidUpdate(prevProps, prevState) {
25
- if (prevProps.focus !== this.props.focus) {
26
- this._checkFocus();
27
- }
28
- }
29
-
30
- componentWillUnmount() {
31
- this._input
32
- ?.getInputDOMNode()
33
- ?.removeEventListener('invalid', this._onInvalid);
34
- }
35
-
36
- _onInvalid = evt => {
37
- evt.preventDefault();
38
-
39
- const {onInvalid} = this.props;
40
- const validationState = evt.currentTarget.validity;
41
-
42
- this.setState({
43
- validationState,
44
- });
45
-
46
- if (onInvalid) {
47
- onInvalid(validationState);
48
- }
49
- };
50
-
51
- _onChange = evt => {
52
- const {onChange} = this.props;
53
-
54
- this.setState({
55
- validationState: null,
56
- });
57
-
58
- if (onChange) {
59
- onChange(evt);
60
- }
61
- };
62
-
63
- _checkFocus() {
64
- if (this.props.focus) {
65
- this._input?.getInputDOMNode()?.focus();
66
- }
67
- }
68
-
69
- /**
70
- * Getter for the input DOM element.
71
- *
72
- * @public
73
- * @returns {Element} - The input element.
74
- */
75
- get node() {
76
- return this._input?.getInputDOMNode();
77
- }
78
-
79
- render() {
80
- const {
81
- className,
82
- name,
83
- type,
84
- label,
85
- placeholder,
86
- pattern,
87
- required,
88
- disabled,
89
- loading,
90
- autoFocus,
91
- error,
92
- defaultValue,
93
- icon,
94
- iconPosition,
95
- helpNode,
96
- inline,
97
- readOnly,
98
- maxLength,
99
- min,
100
- max,
101
- mask,
102
- maskChar,
103
- additionalInputProps,
104
- onFocus,
105
- onBlur,
106
- } = this.props;
107
- const {validationState} = this.state;
108
- const isValid = validationState ? validationState.valid : true;
109
- const classes = classNames(
110
- 'TextInput',
111
- 'FormElement',
112
- {'FormElement-inline': inline},
113
- {'FormElement-with-icon': icon},
114
- {'FormElement-loading': loading},
115
- {[`FormElement-with-icon-${iconPosition}`]: icon},
116
- {'FormElement-contains-error': !isValid},
117
- className
118
- );
119
-
120
- return (
121
- <div className={classes}>
122
- {label}
123
- <div className="FormElement-control">
124
- <InputElement
125
- ref={node => {
126
- this._input = node;
127
- }}
128
- className="FormElement-item"
129
- name={name}
130
- type={type}
131
- placeholder={placeholder}
132
- disabled={disabled}
133
- autoFocus={autoFocus}
134
- required={required}
135
- pattern={pattern}
136
- maxLength={maxLength}
137
- min={min}
138
- max={max}
139
- onChange={this._onChange}
140
- onFocus={onFocus}
141
- onBlur={onBlur}
142
- mask={mask}
143
- maskChar={maskChar}
144
- alwaysShowMask={false}
145
- readOnly={readOnly}
146
- defaultValue={defaultValue}
147
- {...additionalInputProps}
148
- />
149
- {icon}
150
- {loading && <Loader size={16} borderWidth={2} />}
151
- </div>
152
- {helpNode && (
153
- <div className="FormElement-help-text">{helpNode}</div>
154
- )}
155
- {!isValid && error}
156
- </div>
157
- );
158
- }
159
- }