@automattic/vip-design-system 0.27.5 → 0.27.7
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.
- package/build/system/Form/Input.js +5 -16
- package/build/system/Form/Label.js +11 -6
- package/build/system/Form/Label.stories.js +49 -0
- package/build/system/Form/RequiredLabel.js +29 -0
- package/build/system/NewForm/FormAutocomplete.js +34 -12
- package/build/system/NewForm/FormAutocomplete.stories.js +25 -2
- package/build/system/NewForm/FormAutocomplete.test.js +36 -8
- package/build/system/NewForm/FormSelect.js +4 -1
- package/build/system/NewForm/FormSelect.stories.js +1 -0
- package/build/system/Wizard/Wizard.stories.js +19 -0
- package/build/system/Wizard/WizardStep.js +2 -1
- package/package.json +1 -1
- package/src/system/Form/Input.js +2 -6
- package/src/system/Form/Label.js +8 -2
- package/src/system/Form/Label.stories.jsx +36 -0
- package/src/system/Form/RequiredLabel.js +15 -0
- package/src/system/NewForm/FormAutocomplete.js +34 -8
- package/src/system/NewForm/FormAutocomplete.stories.jsx +21 -1
- package/src/system/NewForm/FormAutocomplete.test.js +9 -0
- package/src/system/NewForm/FormSelect.js +7 -1
- package/src/system/NewForm/FormSelect.stories.jsx +1 -0
- package/src/system/Wizard/Wizard.stories.jsx +10 -2
- package/src/system/Wizard/WizardStep.js +1 -0
|
@@ -20,19 +20,6 @@ var _themeUi = require("theme-ui");
|
|
|
20
20
|
var _jsxRuntime = require("theme-ui/jsx-runtime");
|
|
21
21
|
|
|
22
22
|
var _excluded = ["variant", "label", "forLabel", "hasError", "required", "sx", "errorMessage"];
|
|
23
|
-
|
|
24
|
-
var RequiredLabel = function RequiredLabel() {
|
|
25
|
-
return (0, _jsxRuntime.jsx)("span", {
|
|
26
|
-
sx: {
|
|
27
|
-
color: 'error',
|
|
28
|
-
display: 'inline-block',
|
|
29
|
-
ml: 2,
|
|
30
|
-
fontSize: 1
|
|
31
|
-
},
|
|
32
|
-
children: "(Required)"
|
|
33
|
-
});
|
|
34
|
-
};
|
|
35
|
-
|
|
36
23
|
var inputStyles = {
|
|
37
24
|
unset: 'all',
|
|
38
25
|
border: '1px solid',
|
|
@@ -57,7 +44,8 @@ var inputStyles = {
|
|
|
57
44
|
bg: 'backgroundSecondary'
|
|
58
45
|
},
|
|
59
46
|
'&::placeholder': {
|
|
60
|
-
color: 'placeholder'
|
|
47
|
+
color: 'placeholder',
|
|
48
|
+
opacity: 1
|
|
61
49
|
}
|
|
62
50
|
};
|
|
63
51
|
|
|
@@ -72,9 +60,10 @@ var Input = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref) {
|
|
|
72
60
|
errorMessage = _ref.errorMessage,
|
|
73
61
|
props = (0, _objectWithoutPropertiesLoose2["default"])(_ref, _excluded);
|
|
74
62
|
return (0, _jsxRuntime.jsxs)(_react["default"].Fragment, {
|
|
75
|
-
children: [label && (0, _jsxRuntime.
|
|
63
|
+
children: [label && (0, _jsxRuntime.jsx)(_.Label, {
|
|
64
|
+
required: required,
|
|
76
65
|
htmlFor: forLabel,
|
|
77
|
-
children:
|
|
66
|
+
children: label
|
|
78
67
|
}), (0, _jsxRuntime.jsx)(_themeUi.Input, (0, _extends2["default"])({
|
|
79
68
|
ref: ref,
|
|
80
69
|
id: forLabel,
|
|
@@ -13,17 +13,18 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
13
13
|
|
|
14
14
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
15
15
|
|
|
16
|
+
var _RequiredLabel = require("./RequiredLabel");
|
|
17
|
+
|
|
16
18
|
var _jsxRuntime = require("theme-ui/jsx-runtime");
|
|
17
19
|
|
|
18
|
-
var _excluded = ["sx"];
|
|
20
|
+
var _excluded = ["sx", "children", "required"];
|
|
19
21
|
|
|
20
|
-
/**
|
|
21
|
-
* Internal dependencies
|
|
22
|
-
*/
|
|
23
22
|
var Label = /*#__PURE__*/_react["default"].forwardRef(function (_ref, forwardRef) {
|
|
24
23
|
var sx = _ref.sx,
|
|
24
|
+
children = _ref.children,
|
|
25
|
+
required = _ref.required,
|
|
25
26
|
rest = (0, _objectWithoutPropertiesLoose2["default"])(_ref, _excluded);
|
|
26
|
-
return (0, _jsxRuntime.
|
|
27
|
+
return (0, _jsxRuntime.jsxs)("label", (0, _extends2["default"])({
|
|
27
28
|
sx: (0, _extends2["default"])({
|
|
28
29
|
fontWeight: 500,
|
|
29
30
|
fontSize: 2,
|
|
@@ -33,11 +34,15 @@ var Label = /*#__PURE__*/_react["default"].forwardRef(function (_ref, forwardRef
|
|
|
33
34
|
color: 'muted'
|
|
34
35
|
}, sx),
|
|
35
36
|
ref: forwardRef
|
|
36
|
-
}, rest
|
|
37
|
+
}, rest, {
|
|
38
|
+
children: [children, required && (0, _jsxRuntime.jsx)(_RequiredLabel.RequiredLabel, {})]
|
|
39
|
+
}));
|
|
37
40
|
});
|
|
38
41
|
|
|
39
42
|
exports.Label = Label;
|
|
40
43
|
Label.propTypes = {
|
|
44
|
+
children: _propTypes["default"].object,
|
|
45
|
+
required: _propTypes["default"].bool,
|
|
41
46
|
sx: _propTypes["default"].object
|
|
42
47
|
};
|
|
43
48
|
Label.displayName = 'Label';
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports["default"] = exports.Required = exports.Default = void 0;
|
|
7
|
+
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
|
|
10
|
+
var _ = require("..");
|
|
11
|
+
|
|
12
|
+
var _jsxRuntime = require("theme-ui/jsx-runtime");
|
|
13
|
+
|
|
14
|
+
/** @jsxImportSource theme-ui */
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Internal dependencies
|
|
18
|
+
*/
|
|
19
|
+
var _default = {
|
|
20
|
+
title: 'Form/Label'
|
|
21
|
+
};
|
|
22
|
+
exports["default"] = _default;
|
|
23
|
+
|
|
24
|
+
var DefaultComponent = function DefaultComponent(props) {
|
|
25
|
+
return (0, _jsxRuntime.jsx)(_.Form.Root, {
|
|
26
|
+
children: (0, _jsxRuntime.jsx)(_.Label, (0, _extends2["default"])({}, props, {
|
|
27
|
+
children: "Label"
|
|
28
|
+
}))
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
var Default = function Default() {
|
|
33
|
+
return (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
34
|
+
children: (0, _jsxRuntime.jsx)(DefaultComponent, {})
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
exports.Default = Default;
|
|
39
|
+
|
|
40
|
+
var Required = function Required() {
|
|
41
|
+
var args = {
|
|
42
|
+
required: true
|
|
43
|
+
};
|
|
44
|
+
return (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
45
|
+
children: (0, _jsxRuntime.jsx)(DefaultComponent, (0, _extends2["default"])({}, args))
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
exports.Required = Required;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.RequiredLabel = void 0;
|
|
5
|
+
|
|
6
|
+
var _jsxRuntime = require("theme-ui/jsx-runtime");
|
|
7
|
+
|
|
8
|
+
/** @jsxImportSource theme-ui */
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* External dependencies
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Internal dependencies
|
|
16
|
+
*/
|
|
17
|
+
var RequiredLabel = function RequiredLabel() {
|
|
18
|
+
return (0, _jsxRuntime.jsx)("span", {
|
|
19
|
+
sx: {
|
|
20
|
+
color: 'error',
|
|
21
|
+
display: 'inline-block',
|
|
22
|
+
ml: 2,
|
|
23
|
+
fontSize: 1
|
|
24
|
+
},
|
|
25
|
+
children: "(Required)"
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
exports.RequiredLabel = RequiredLabel;
|
|
@@ -33,7 +33,7 @@ var _FormSelectLoading = require("./FormSelectLoading");
|
|
|
33
33
|
|
|
34
34
|
var _jsxRuntime = require("theme-ui/jsx-runtime");
|
|
35
35
|
|
|
36
|
-
var _excluded = ["isInline", "forLabel", "options", "label", "getOptionLabel", "getOptionValue", "onChange", "onInputChange", "value", "showAllValues", "searchIcon", "loading", "displayMenu", "noOptionsMessage", "id", "className"];
|
|
36
|
+
var _excluded = ["isInline", "forLabel", "options", "label", "getOptionLabel", "getOptionValue", "onChange", "onInputChange", "value", "showAllValues", "searchIcon", "minLength", "debounce", "loading", "required", "displayMenu", "noOptionsMessage", "id", "className"];
|
|
37
37
|
|
|
38
38
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
39
39
|
|
|
@@ -136,7 +136,8 @@ var searchIconStyles = {
|
|
|
136
136
|
var FormAutocomplete = /*#__PURE__*/_react["default"].forwardRef(function (_ref, forwardRef) {
|
|
137
137
|
var isInline = _ref.isInline,
|
|
138
138
|
forLabel = _ref.forLabel,
|
|
139
|
-
options = _ref.options,
|
|
139
|
+
_ref$options = _ref.options,
|
|
140
|
+
options = _ref$options === void 0 ? [] : _ref$options,
|
|
140
141
|
label = _ref.label,
|
|
141
142
|
getOptionLabel = _ref.getOptionLabel,
|
|
142
143
|
getOptionValue = _ref.getOptionValue,
|
|
@@ -146,10 +147,13 @@ var FormAutocomplete = /*#__PURE__*/_react["default"].forwardRef(function (_ref,
|
|
|
146
147
|
value = _ref.value,
|
|
147
148
|
_ref$showAllValues = _ref.showAllValues,
|
|
148
149
|
showAllValues = _ref$showAllValues === void 0 ? true : _ref$showAllValues,
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
_ref$
|
|
152
|
-
|
|
150
|
+
searchIcon = _ref.searchIcon,
|
|
151
|
+
_ref$minLength = _ref.minLength,
|
|
152
|
+
minLength = _ref$minLength === void 0 ? 0 : _ref$minLength,
|
|
153
|
+
_ref$debounce = _ref.debounce,
|
|
154
|
+
debounce = _ref$debounce === void 0 ? 0 : _ref$debounce,
|
|
155
|
+
loading = _ref.loading,
|
|
156
|
+
required = _ref.required,
|
|
153
157
|
_ref$displayMenu = _ref.displayMenu,
|
|
154
158
|
displayMenu = _ref$displayMenu === void 0 ? 'overlay' : _ref$displayMenu,
|
|
155
159
|
_ref$noOptionsMessage = _ref.noOptionsMessage,
|
|
@@ -165,8 +169,11 @@ var FormAutocomplete = /*#__PURE__*/_react["default"].forwardRef(function (_ref,
|
|
|
165
169
|
isDirty = _useState[0],
|
|
166
170
|
setIsDirty = _useState[1];
|
|
167
171
|
|
|
172
|
+
var debounceTimeout;
|
|
173
|
+
|
|
168
174
|
var SelectLabel = function SelectLabel() {
|
|
169
175
|
return (0, _jsxRuntime.jsx)(_Label.Label, {
|
|
176
|
+
required: required,
|
|
170
177
|
htmlFor: forLabel || id,
|
|
171
178
|
children: label
|
|
172
179
|
});
|
|
@@ -202,14 +209,26 @@ var FormAutocomplete = /*#__PURE__*/_react["default"].forwardRef(function (_ref,
|
|
|
202
209
|
return optionLabel(option).toLowerCase().indexOf(query.toLowerCase()) >= 0;
|
|
203
210
|
});
|
|
204
211
|
}, [options]);
|
|
205
|
-
var
|
|
206
|
-
|
|
212
|
+
var handleInputChange = (0, _react.useCallback)(function (query) {
|
|
213
|
+
if (!debounce) {
|
|
214
|
+
return onInputChange(query);
|
|
215
|
+
}
|
|
207
216
|
|
|
208
|
-
|
|
209
|
-
|
|
217
|
+
clearTimeout(debounceTimeout);
|
|
218
|
+
|
|
219
|
+
if (!query.length || query.length >= minLength) {
|
|
220
|
+
debounceTimeout = setTimeout(function () {
|
|
221
|
+
onInputChange(query);
|
|
222
|
+
}, debounce);
|
|
223
|
+
}
|
|
224
|
+
}, [onInputChange, debounce, minLength]);
|
|
225
|
+
var suggest = (0, _react.useCallback)(function (query, populateResults) {
|
|
226
|
+
if (isDirty && onInputChange) {
|
|
227
|
+
handleInputChange(query);
|
|
210
228
|
}
|
|
211
229
|
|
|
212
|
-
|
|
230
|
+
var data = handleTypeChange(query);
|
|
231
|
+
populateResults(data == null ? void 0 : data.map(function (option) {
|
|
213
232
|
return optionLabel(option);
|
|
214
233
|
}));
|
|
215
234
|
}, [options, isDirty]);
|
|
@@ -253,6 +272,7 @@ FormAutocomplete.propTypes = {
|
|
|
253
272
|
showAllValues: _propTypes["default"].bool,
|
|
254
273
|
searchIcon: _propTypes["default"].bool,
|
|
255
274
|
loading: _propTypes["default"].bool,
|
|
275
|
+
required: _propTypes["default"].bool,
|
|
256
276
|
isInline: _propTypes["default"].bool,
|
|
257
277
|
forLabel: _propTypes["default"].string,
|
|
258
278
|
value: _propTypes["default"].string,
|
|
@@ -264,6 +284,8 @@ FormAutocomplete.propTypes = {
|
|
|
264
284
|
onInputChange: _propTypes["default"].func,
|
|
265
285
|
noOptionsMessage: _propTypes["default"].func,
|
|
266
286
|
onChange: _propTypes["default"].func,
|
|
267
|
-
className: _propTypes["default"].any
|
|
287
|
+
className: _propTypes["default"].any,
|
|
288
|
+
minLength: _propTypes["default"].number,
|
|
289
|
+
debounce: _propTypes["default"].number
|
|
268
290
|
};
|
|
269
291
|
FormAutocomplete.displayName = 'FormAutocomplete';
|
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
5
|
exports.__esModule = true;
|
|
6
|
-
exports["default"] = exports.WithSearchIcon = exports.WithLoading = exports.WithDefaultValue = exports.WithCustomMessages = exports.Inline = exports.Default = void 0;
|
|
6
|
+
exports["default"] = exports.WithSearchIcon = exports.WithLoading = exports.WithDefaultValue = exports.WithDebounce = exports.WithCustomMessages = exports.Inline = exports.Default = void 0;
|
|
7
7
|
|
|
8
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
9
|
|
|
10
10
|
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
11
11
|
|
|
12
|
+
var _react = require("react");
|
|
13
|
+
|
|
12
14
|
var Form = _interopRequireWildcard(require("."));
|
|
13
15
|
|
|
14
16
|
var _jsxRuntime = require("theme-ui/jsx-runtime");
|
|
@@ -81,7 +83,9 @@ var DefaultComponent = function DefaultComponent(_ref) {
|
|
|
81
83
|
|
|
82
84
|
var Default = function Default() {
|
|
83
85
|
return (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
84
|
-
children: (0, _jsxRuntime.jsx)(DefaultComponent, (0, _extends2["default"])({
|
|
86
|
+
children: (0, _jsxRuntime.jsx)(DefaultComponent, (0, _extends2["default"])({
|
|
87
|
+
required: true
|
|
88
|
+
}, args))
|
|
85
89
|
});
|
|
86
90
|
};
|
|
87
91
|
|
|
@@ -131,6 +135,25 @@ var WithLoading = function WithLoading() {
|
|
|
131
135
|
|
|
132
136
|
exports.WithLoading = WithLoading;
|
|
133
137
|
|
|
138
|
+
var WithDebounce = function WithDebounce() {
|
|
139
|
+
var _useState = (0, _react.useState)(null),
|
|
140
|
+
value = _useState[0],
|
|
141
|
+
setValue = _useState[1];
|
|
142
|
+
|
|
143
|
+
var customArgs = (0, _extends2["default"])({}, args, {
|
|
144
|
+
minLength: 3,
|
|
145
|
+
debounce: 300,
|
|
146
|
+
onInputChange: function onInputChange(query) {
|
|
147
|
+
setValue(query);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
return (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
151
|
+
children: ["Filter: ", value, (0, _jsxRuntime.jsx)(DefaultComponent, (0, _extends2["default"])({}, customArgs))]
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
exports.WithDebounce = WithDebounce;
|
|
156
|
+
|
|
134
157
|
var WithCustomMessages = function WithCustomMessages() {
|
|
135
158
|
var customArgs = (0, _extends2["default"])({}, args, {
|
|
136
159
|
noOptionsMessage: function noOptionsMessage() {
|
|
@@ -45,25 +45,53 @@ describe('<FormAutocomplete />', function () {
|
|
|
45
45
|
while (1) {
|
|
46
46
|
switch (_context.prev = _context.next) {
|
|
47
47
|
case 0:
|
|
48
|
-
_render = (0, _react.render)((0, _jsxRuntime.jsx)(_FormAutocomplete.FormAutocomplete,
|
|
49
|
-
id: "my_desert_list"
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
_render = (0, _react.render)((0, _jsxRuntime.jsx)(_FormAutocomplete.FormAutocomplete, {
|
|
49
|
+
id: "my_desert_list",
|
|
50
|
+
label: "This is a label"
|
|
51
|
+
})), container = _render.container; // Check for accessibility issues
|
|
52
52
|
|
|
53
53
|
_context.t0 = expect;
|
|
54
|
-
_context.next =
|
|
54
|
+
_context.next = 4;
|
|
55
55
|
return (0, _jestAxe.axe)(container);
|
|
56
56
|
|
|
57
|
-
case
|
|
57
|
+
case 4:
|
|
58
58
|
_context.t1 = _context.sent;
|
|
59
|
-
_context.next =
|
|
59
|
+
_context.next = 7;
|
|
60
60
|
return (0, _context.t0)(_context.t1).toHaveNoViolations();
|
|
61
61
|
|
|
62
|
-
case
|
|
62
|
+
case 7:
|
|
63
63
|
case "end":
|
|
64
64
|
return _context.stop();
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
}, _callee);
|
|
68
68
|
})));
|
|
69
|
+
it('renders the FormAutocomplete component with options', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
70
|
+
var _render2, container;
|
|
71
|
+
|
|
72
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
73
|
+
while (1) {
|
|
74
|
+
switch (_context2.prev = _context2.next) {
|
|
75
|
+
case 0:
|
|
76
|
+
_render2 = (0, _react.render)((0, _jsxRuntime.jsx)(_FormAutocomplete.FormAutocomplete, (0, _extends2["default"])({
|
|
77
|
+
id: "my_desert_list"
|
|
78
|
+
}, defaultProps))), container = _render2.container;
|
|
79
|
+
expect(_react.screen.getByLabelText(defaultProps.label)).toBeInTheDocument(); // Check for accessibility issues
|
|
80
|
+
|
|
81
|
+
_context2.t0 = expect;
|
|
82
|
+
_context2.next = 5;
|
|
83
|
+
return (0, _jestAxe.axe)(container);
|
|
84
|
+
|
|
85
|
+
case 5:
|
|
86
|
+
_context2.t1 = _context2.sent;
|
|
87
|
+
_context2.next = 8;
|
|
88
|
+
return (0, _context2.t0)(_context2.t1).toHaveNoViolations();
|
|
89
|
+
|
|
90
|
+
case 8:
|
|
91
|
+
case "end":
|
|
92
|
+
return _context2.stop();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}, _callee2);
|
|
96
|
+
})));
|
|
69
97
|
});
|
|
@@ -21,7 +21,7 @@ var _FormSelectContent = require("./FormSelectContent");
|
|
|
21
21
|
|
|
22
22
|
var _jsxRuntime = require("theme-ui/jsx-runtime");
|
|
23
23
|
|
|
24
|
-
var _excluded = ["isInline", "placeholder", "forLabel", "options", "label", "getOptionLabel", "getOptionValue", "onChange"],
|
|
24
|
+
var _excluded = ["isInline", "placeholder", "forLabel", "options", "required", "label", "getOptionLabel", "getOptionValue", "onChange"],
|
|
25
25
|
_excluded2 = ["options"];
|
|
26
26
|
|
|
27
27
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
@@ -79,6 +79,7 @@ var FormSelect = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, forw
|
|
|
79
79
|
placeholder = _ref2.placeholder,
|
|
80
80
|
forLabel = _ref2.forLabel,
|
|
81
81
|
options = _ref2.options,
|
|
82
|
+
required = _ref2.required,
|
|
82
83
|
label = _ref2.label,
|
|
83
84
|
getOptionLabel = _ref2.getOptionLabel,
|
|
84
85
|
getOptionValue = _ref2.getOptionValue,
|
|
@@ -118,6 +119,7 @@ var FormSelect = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, forw
|
|
|
118
119
|
|
|
119
120
|
var SelectLabel = function SelectLabel() {
|
|
120
121
|
return (0, _jsxRuntime.jsx)(_Label.Label, {
|
|
122
|
+
required: required,
|
|
121
123
|
htmlFor: forLabel || props.id,
|
|
122
124
|
children: label
|
|
123
125
|
});
|
|
@@ -149,6 +151,7 @@ exports.FormSelect = FormSelect;
|
|
|
149
151
|
FormSelect.propTypes = {
|
|
150
152
|
id: _propTypes["default"].string,
|
|
151
153
|
isInline: _propTypes["default"].bool,
|
|
154
|
+
required: _propTypes["default"].bool,
|
|
152
155
|
forLabel: _propTypes["default"].string,
|
|
153
156
|
placeholder: _propTypes["default"].string,
|
|
154
157
|
label: _propTypes["default"].string,
|
|
@@ -25,6 +25,19 @@ var _default = {
|
|
|
25
25
|
component: _.Wizard
|
|
26
26
|
};
|
|
27
27
|
exports["default"] = _default;
|
|
28
|
+
var options = [{
|
|
29
|
+
value: 'chocolate',
|
|
30
|
+
label: 'Chocolate'
|
|
31
|
+
}, {
|
|
32
|
+
value: 'strawberry',
|
|
33
|
+
label: 'Strawberry'
|
|
34
|
+
}, {
|
|
35
|
+
value: 'vanilla',
|
|
36
|
+
label: 'Vanilla'
|
|
37
|
+
}, {
|
|
38
|
+
value: 'coffee',
|
|
39
|
+
label: 'Coffee'
|
|
40
|
+
}];
|
|
28
41
|
|
|
29
42
|
var Default = function Default() {
|
|
30
43
|
var steps = [{
|
|
@@ -37,7 +50,13 @@ var Default = function Default() {
|
|
|
37
50
|
}), (0, _jsxRuntime.jsx)(_.Input, {
|
|
38
51
|
autoFocus: true,
|
|
39
52
|
placeholder: "yourdomain.com"
|
|
53
|
+
}), (0, _jsxRuntime.jsx)(_.Form.Autocomplete, {
|
|
54
|
+
label: "Autocomplete",
|
|
55
|
+
options: options
|
|
40
56
|
}), (0, _jsxRuntime.jsx)(_.Button, {
|
|
57
|
+
sx: {
|
|
58
|
+
mt: 3
|
|
59
|
+
},
|
|
41
60
|
children: "Continue"
|
|
42
61
|
})]
|
|
43
62
|
})
|
|
@@ -65,7 +65,8 @@ var WizardStep = /*#__PURE__*/_react["default"].forwardRef(function (_ref, forwa
|
|
|
65
65
|
borderTopColor: 'borders.2'
|
|
66
66
|
},
|
|
67
67
|
borderColor: active ? 'primary' : 'borders.2',
|
|
68
|
-
borderLeftColor: borderLeftColor
|
|
68
|
+
borderLeftColor: borderLeftColor,
|
|
69
|
+
overflow: 'inherit'
|
|
69
70
|
},
|
|
70
71
|
"data-step": order,
|
|
71
72
|
"data-active": active || undefined,
|
package/package.json
CHANGED
package/src/system/Form/Input.js
CHANGED
|
@@ -12,10 +12,6 @@ import PropTypes from 'prop-types';
|
|
|
12
12
|
import { Validation, Label } from '../';
|
|
13
13
|
import { Input as ThemeInput } from 'theme-ui';
|
|
14
14
|
|
|
15
|
-
const RequiredLabel = () => (
|
|
16
|
-
<span sx={ { color: 'error', display: 'inline-block', ml: 2, fontSize: 1 } }>(Required)</span>
|
|
17
|
-
);
|
|
18
|
-
|
|
19
15
|
const inputStyles = {
|
|
20
16
|
unset: 'all',
|
|
21
17
|
border: '1px solid',
|
|
@@ -37,6 +33,7 @@ const inputStyles = {
|
|
|
37
33
|
},
|
|
38
34
|
'&::placeholder': {
|
|
39
35
|
color: 'placeholder',
|
|
36
|
+
opacity: 1,
|
|
40
37
|
},
|
|
41
38
|
};
|
|
42
39
|
|
|
@@ -44,9 +41,8 @@ const Input = React.forwardRef(
|
|
|
44
41
|
( { variant, label, forLabel, hasError, required, sx = {}, errorMessage, ...props }, ref ) => (
|
|
45
42
|
<React.Fragment>
|
|
46
43
|
{ label && (
|
|
47
|
-
<Label htmlFor={ forLabel }>
|
|
44
|
+
<Label required={ required } htmlFor={ forLabel }>
|
|
48
45
|
{ label }
|
|
49
|
-
{ required && <RequiredLabel /> }
|
|
50
46
|
</Label>
|
|
51
47
|
) }
|
|
52
48
|
|
package/src/system/Form/Label.js
CHANGED
|
@@ -9,8 +9,9 @@ import PropTypes from 'prop-types';
|
|
|
9
9
|
/**
|
|
10
10
|
* Internal dependencies
|
|
11
11
|
*/
|
|
12
|
+
import { RequiredLabel } from './RequiredLabel';
|
|
12
13
|
|
|
13
|
-
const Label = React.forwardRef( ( { sx, ...rest }, forwardRef ) => (
|
|
14
|
+
const Label = React.forwardRef( ( { sx, children, required, ...rest }, forwardRef ) => (
|
|
14
15
|
<label
|
|
15
16
|
sx={ {
|
|
16
17
|
fontWeight: 500,
|
|
@@ -23,10 +24,15 @@ const Label = React.forwardRef( ( { sx, ...rest }, forwardRef ) => (
|
|
|
23
24
|
} }
|
|
24
25
|
ref={ forwardRef }
|
|
25
26
|
{ ...rest }
|
|
26
|
-
|
|
27
|
+
>
|
|
28
|
+
{ children }
|
|
29
|
+
{ required && <RequiredLabel /> }
|
|
30
|
+
</label>
|
|
27
31
|
) );
|
|
28
32
|
|
|
29
33
|
Label.propTypes = {
|
|
34
|
+
children: PropTypes.object,
|
|
35
|
+
required: PropTypes.bool,
|
|
30
36
|
sx: PropTypes.object,
|
|
31
37
|
};
|
|
32
38
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Internal dependencies
|
|
5
|
+
*/
|
|
6
|
+
import { Form, Label } from '..';
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
title: 'Form/Label',
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const DefaultComponent = props => (
|
|
13
|
+
<Form.Root>
|
|
14
|
+
<Label { ...props }>Label</Label>
|
|
15
|
+
</Form.Root>
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
export const Default = () => {
|
|
19
|
+
return (
|
|
20
|
+
<>
|
|
21
|
+
<DefaultComponent />
|
|
22
|
+
</>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const Required = () => {
|
|
27
|
+
const args = {
|
|
28
|
+
required: true,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<>
|
|
33
|
+
<DefaultComponent { ...args } />
|
|
34
|
+
</>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* External dependencies
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Internal dependencies
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const RequiredLabel = () => (
|
|
12
|
+
<span sx={ { color: 'error', display: 'inline-block', ml: 2, fontSize: 1 } }>(Required)</span>
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
export { RequiredLabel };
|
|
@@ -97,7 +97,7 @@ const FormAutocomplete = React.forwardRef(
|
|
|
97
97
|
{
|
|
98
98
|
isInline,
|
|
99
99
|
forLabel,
|
|
100
|
-
options,
|
|
100
|
+
options = [],
|
|
101
101
|
label,
|
|
102
102
|
getOptionLabel,
|
|
103
103
|
getOptionValue,
|
|
@@ -105,8 +105,11 @@ const FormAutocomplete = React.forwardRef(
|
|
|
105
105
|
onInputChange,
|
|
106
106
|
value,
|
|
107
107
|
showAllValues = true,
|
|
108
|
-
searchIcon
|
|
109
|
-
|
|
108
|
+
searchIcon,
|
|
109
|
+
minLength = 0,
|
|
110
|
+
debounce = 0,
|
|
111
|
+
loading,
|
|
112
|
+
required,
|
|
110
113
|
displayMenu = 'overlay',
|
|
111
114
|
noOptionsMessage = () => 'No results found.',
|
|
112
115
|
id = 'vip-autocomplete',
|
|
@@ -116,8 +119,13 @@ const FormAutocomplete = React.forwardRef(
|
|
|
116
119
|
forwardRef
|
|
117
120
|
) => {
|
|
118
121
|
const [ isDirty, setIsDirty ] = useState( false );
|
|
122
|
+
let debounceTimeout;
|
|
119
123
|
|
|
120
|
-
const SelectLabel = () =>
|
|
124
|
+
const SelectLabel = () => (
|
|
125
|
+
<Label required={ required } htmlFor={ forLabel || id }>
|
|
126
|
+
{ label }
|
|
127
|
+
</Label>
|
|
128
|
+
);
|
|
121
129
|
|
|
122
130
|
const inlineLabel = !! ( isInline && label );
|
|
123
131
|
|
|
@@ -158,13 +166,28 @@ const FormAutocomplete = React.forwardRef(
|
|
|
158
166
|
[ options ]
|
|
159
167
|
);
|
|
160
168
|
|
|
169
|
+
const handleInputChange = useCallback(
|
|
170
|
+
query => {
|
|
171
|
+
if ( ! debounce ) {
|
|
172
|
+
return onInputChange( query );
|
|
173
|
+
}
|
|
174
|
+
clearTimeout( debounceTimeout );
|
|
175
|
+
if ( ! query.length || query.length >= minLength ) {
|
|
176
|
+
debounceTimeout = setTimeout( () => {
|
|
177
|
+
onInputChange( query );
|
|
178
|
+
}, debounce );
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
[ onInputChange, debounce, minLength ]
|
|
182
|
+
);
|
|
183
|
+
|
|
161
184
|
const suggest = useCallback(
|
|
162
185
|
( query, populateResults ) => {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
data = onInputChange ? onInputChange( query ) : handleTypeChange( query );
|
|
186
|
+
if ( isDirty && onInputChange ) {
|
|
187
|
+
handleInputChange( query );
|
|
166
188
|
}
|
|
167
|
-
|
|
189
|
+
const data = handleTypeChange( query );
|
|
190
|
+
populateResults( data?.map( option => optionLabel( option ) ) );
|
|
168
191
|
},
|
|
169
192
|
[ options, isDirty ]
|
|
170
193
|
);
|
|
@@ -229,6 +252,7 @@ FormAutocomplete.propTypes = {
|
|
|
229
252
|
showAllValues: PropTypes.bool,
|
|
230
253
|
searchIcon: PropTypes.bool,
|
|
231
254
|
loading: PropTypes.bool,
|
|
255
|
+
required: PropTypes.bool,
|
|
232
256
|
isInline: PropTypes.bool,
|
|
233
257
|
forLabel: PropTypes.string,
|
|
234
258
|
value: PropTypes.string,
|
|
@@ -241,6 +265,8 @@ FormAutocomplete.propTypes = {
|
|
|
241
265
|
noOptionsMessage: PropTypes.func,
|
|
242
266
|
onChange: PropTypes.func,
|
|
243
267
|
className: PropTypes.any,
|
|
268
|
+
minLength: PropTypes.number,
|
|
269
|
+
debounce: PropTypes.number,
|
|
244
270
|
};
|
|
245
271
|
|
|
246
272
|
FormAutocomplete.displayName = 'FormAutocomplete';
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* Internal dependencies
|
|
5
5
|
*/
|
|
6
|
+
import { useState } from 'react';
|
|
6
7
|
import * as Form from '.';
|
|
7
8
|
|
|
8
9
|
export default {
|
|
@@ -44,7 +45,7 @@ const DefaultComponent = ( { label = 'Label', width = 250, ...rest } ) => (
|
|
|
44
45
|
export const Default = () => {
|
|
45
46
|
return (
|
|
46
47
|
<>
|
|
47
|
-
<DefaultComponent { ...args } />
|
|
48
|
+
<DefaultComponent required { ...args } />
|
|
48
49
|
</>
|
|
49
50
|
);
|
|
50
51
|
};
|
|
@@ -101,6 +102,25 @@ export const WithLoading = () => {
|
|
|
101
102
|
);
|
|
102
103
|
};
|
|
103
104
|
|
|
105
|
+
export const WithDebounce = () => {
|
|
106
|
+
const [ value, setValue ] = useState( null );
|
|
107
|
+
const customArgs = {
|
|
108
|
+
...args,
|
|
109
|
+
minLength: 3,
|
|
110
|
+
debounce: 300,
|
|
111
|
+
onInputChange: query => {
|
|
112
|
+
setValue( query );
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<>
|
|
118
|
+
Filter: { value }
|
|
119
|
+
<DefaultComponent { ...customArgs } />
|
|
120
|
+
</>
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
|
|
104
124
|
export const WithCustomMessages = () => {
|
|
105
125
|
const customArgs = {
|
|
106
126
|
...args,
|
|
@@ -22,6 +22,15 @@ const defaultProps = {
|
|
|
22
22
|
|
|
23
23
|
describe( '<FormAutocomplete />', () => {
|
|
24
24
|
it( 'renders the FormAutocomplete component', async () => {
|
|
25
|
+
const { container } = render(
|
|
26
|
+
<FormAutocomplete id="my_desert_list" label="This is a label" />
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
// Check for accessibility issues
|
|
30
|
+
await expect( await axe( container ) ).toHaveNoViolations();
|
|
31
|
+
} );
|
|
32
|
+
|
|
33
|
+
it( 'renders the FormAutocomplete component with options', async () => {
|
|
25
34
|
const { container } = render( <FormAutocomplete id="my_desert_list" { ...defaultProps } /> );
|
|
26
35
|
|
|
27
36
|
expect( screen.getByLabelText( defaultProps.label ) ).toBeInTheDocument();
|
|
@@ -58,6 +58,7 @@ const FormSelect = React.forwardRef(
|
|
|
58
58
|
placeholder,
|
|
59
59
|
forLabel,
|
|
60
60
|
options,
|
|
61
|
+
required,
|
|
61
62
|
label,
|
|
62
63
|
getOptionLabel,
|
|
63
64
|
getOptionValue,
|
|
@@ -105,7 +106,11 @@ const FormSelect = React.forwardRef(
|
|
|
105
106
|
[ onChange, getOptionByValue ]
|
|
106
107
|
);
|
|
107
108
|
|
|
108
|
-
const SelectLabel = () =>
|
|
109
|
+
const SelectLabel = () => (
|
|
110
|
+
<Label required={ required } htmlFor={ forLabel || props.id }>
|
|
111
|
+
{ label }
|
|
112
|
+
</Label>
|
|
113
|
+
);
|
|
109
114
|
|
|
110
115
|
const inlineLabel = !! ( isInline && label );
|
|
111
116
|
|
|
@@ -133,6 +138,7 @@ const FormSelect = React.forwardRef(
|
|
|
133
138
|
FormSelect.propTypes = {
|
|
134
139
|
id: PropTypes.string,
|
|
135
140
|
isInline: PropTypes.bool,
|
|
141
|
+
required: PropTypes.bool,
|
|
136
142
|
forLabel: PropTypes.string,
|
|
137
143
|
placeholder: PropTypes.string,
|
|
138
144
|
label: PropTypes.string,
|
|
@@ -8,13 +8,20 @@ import React from 'react';
|
|
|
8
8
|
/**
|
|
9
9
|
* Internal dependencies
|
|
10
10
|
*/
|
|
11
|
-
import { Wizard, Box, Label, Input, Button } from '..';
|
|
11
|
+
import { Wizard, Box, Label, Input, Button, Form } from '..';
|
|
12
12
|
|
|
13
13
|
export default {
|
|
14
14
|
title: 'Wizard',
|
|
15
15
|
component: Wizard,
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
+
const options = [
|
|
19
|
+
{ value: 'chocolate', label: 'Chocolate' },
|
|
20
|
+
{ value: 'strawberry', label: 'Strawberry' },
|
|
21
|
+
{ value: 'vanilla', label: 'Vanilla' },
|
|
22
|
+
{ value: 'coffee', label: 'Coffee' },
|
|
23
|
+
];
|
|
24
|
+
|
|
18
25
|
export const Default = () => {
|
|
19
26
|
const steps = [
|
|
20
27
|
{
|
|
@@ -25,7 +32,8 @@ export const Default = () => {
|
|
|
25
32
|
<Box>
|
|
26
33
|
<Label>Domain</Label>
|
|
27
34
|
<Input autoFocus placeholder="yourdomain.com" />
|
|
28
|
-
<
|
|
35
|
+
<Form.Autocomplete label="Autocomplete" options={ options } />
|
|
36
|
+
<Button sx={ { mt: 3 } }>Continue</Button>
|
|
29
37
|
</Box>
|
|
30
38
|
),
|
|
31
39
|
},
|