@pingux/astro 1.10.0-alpha.4 → 1.10.1-alpha.1
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/CHANGELOG.md +19 -0
- package/lib/cjs/components/ArrayField/ArrayField.js +41 -25
- package/lib/cjs/components/ArrayField/ArrayField.stories.js +9 -0
- package/lib/cjs/components/ArrayField/ArrayField.test.js +5 -1
- package/lib/cjs/components/ComboBoxField/ComboBoxField.js +15 -1
- package/lib/cjs/components/ComboBoxField/ComboBoxField.test.js +22 -0
- package/lib/components/ArrayField/ArrayField.js +37 -25
- package/lib/components/ArrayField/ArrayField.stories.js +9 -0
- package/lib/components/ArrayField/ArrayField.test.js +5 -1
- package/lib/components/ComboBoxField/ComboBoxField.js +15 -1
- package/lib/components/ComboBoxField/ComboBoxField.test.js +14 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
@@ -3,6 +3,25 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
5
5
|
|
6
|
+
# [1.10.0](https://gitlab.corp.pingidentity.com/ux/pingux/compare/@pingux/astro@1.9.0...@pingux/astro@1.10.0) (2022-04-28)
|
7
|
+
|
8
|
+
|
9
|
+
### Bug Fixes
|
10
|
+
|
11
|
+
* [UIP-5300] Multiple inputs not focusable within AccordionGridGroup ([421f210](https://gitlab.corp.pingidentity.com/ux/pingux/commit/421f21046e0638c44ecb34085bd64af681301b3c))
|
12
|
+
* [UIP-5408] float label Tweaks ([eaa79fd](https://gitlab.corp.pingidentity.com/ux/pingux/commit/eaa79fd1da40eed988759a0d0e4c626d1c338dc2))
|
13
|
+
|
14
|
+
|
15
|
+
### Features
|
16
|
+
|
17
|
+
* [UIP-5334] add container widths to box ([5b672d2](https://gitlab.corp.pingidentity.com/ux/pingux/commit/5b672d2b3198e637ee7b0947a221e8ae3cdb60f3))
|
18
|
+
* [UIP-5397] ArrayField Component - Allow a limit on the number of Fields ([61dcdcd](https://gitlab.corp.pingidentity.com/ux/pingux/commit/61dcdcd929c540e8353996755889a320202ad003))
|
19
|
+
* [UIP-5401] Add initial Slider recipe ([1fba9ae](https://gitlab.corp.pingidentity.com/ux/pingux/commit/1fba9ae445f77359bf9db716864b7755e6d0c392))
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
6
25
|
# [1.9.0](https://gitlab.corp.pingidentity.com/ux/pingux/compare/@pingux/astro@1.8.1...@pingux/astro@1.9.0) (2022-04-21)
|
7
26
|
|
8
27
|
|
@@ -30,6 +30,8 @@ exports["default"] = void 0;
|
|
30
30
|
|
31
31
|
var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/values"));
|
32
32
|
|
33
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
34
|
+
|
33
35
|
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
|
34
36
|
|
35
37
|
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
|
@@ -46,8 +48,12 @@ var _react = _interopRequireWildcard(require("react"));
|
|
46
48
|
|
47
49
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
48
50
|
|
51
|
+
var _utils = require("@react-aria/utils");
|
52
|
+
|
49
53
|
var _uuid = require("uuid");
|
50
54
|
|
55
|
+
var _label = require("@react-aria/label");
|
56
|
+
|
51
57
|
var _Box = _interopRequireDefault(require("../Box"));
|
52
58
|
|
53
59
|
var _Button = _interopRequireDefault(require("../Button"));
|
@@ -56,13 +62,15 @@ var _FieldHelperText = _interopRequireDefault(require("../FieldHelperText"));
|
|
56
62
|
|
57
63
|
var _Text = _interopRequireDefault(require("../Text"));
|
58
64
|
|
65
|
+
var _Label = _interopRequireDefault(require("../Label"));
|
66
|
+
|
59
67
|
var _statuses = _interopRequireDefault(require("../../utils/devUtils/constants/statuses"));
|
60
68
|
|
61
69
|
var _isValidPositiveInt = _interopRequireDefault(require("../../utils/devUtils/props/isValidPositiveInt"));
|
62
70
|
|
63
71
|
var _react2 = require("@emotion/react");
|
64
72
|
|
65
|
-
var _excluded = ["addButtonLabel", "defaultValue", "value", "label", "helperText", "status", "onAdd", "onChange", "onDelete", "renderField", "maxSize", "maxSizeText"],
|
73
|
+
var _excluded = ["addButtonLabel", "defaultValue", "value", "label", "helperText", "status", "onAdd", "onChange", "onDelete", "renderField", "labelProps", "maxSize", "maxSizeText"],
|
66
74
|
_excluded2 = ["id", "onComponentRender", "fieldValue"];
|
67
75
|
|
68
76
|
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); }
|
@@ -73,22 +81,23 @@ function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (
|
|
73
81
|
|
74
82
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context3, _context4; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context3 = ownKeys(Object(source), !0)).call(_context3, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context4 = ownKeys(Object(source))).call(_context4, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
75
83
|
|
76
|
-
var ArrayField = function ArrayField(
|
84
|
+
var ArrayField = function ArrayField(props) {
|
77
85
|
var _context2;
|
78
86
|
|
79
|
-
var addButtonLabel =
|
80
|
-
defaultValue =
|
81
|
-
value =
|
82
|
-
label =
|
83
|
-
helperText =
|
84
|
-
status =
|
85
|
-
onAdd =
|
86
|
-
onChange =
|
87
|
-
onDelete =
|
88
|
-
renderField =
|
89
|
-
|
90
|
-
|
91
|
-
|
87
|
+
var addButtonLabel = props.addButtonLabel,
|
88
|
+
defaultValue = props.defaultValue,
|
89
|
+
value = props.value,
|
90
|
+
label = props.label,
|
91
|
+
helperText = props.helperText,
|
92
|
+
status = props.status,
|
93
|
+
onAdd = props.onAdd,
|
94
|
+
onChange = props.onChange,
|
95
|
+
onDelete = props.onDelete,
|
96
|
+
renderField = props.renderField,
|
97
|
+
labelProps = props.labelProps,
|
98
|
+
maxSize = props.maxSize,
|
99
|
+
maxSizeText = props.maxSizeText,
|
100
|
+
others = (0, _objectWithoutProperties2["default"])(props, _excluded);
|
92
101
|
var isControlled = value !== undefined;
|
93
102
|
var createEmptyField = (0, _react.useCallback)(function () {
|
94
103
|
return {
|
@@ -133,8 +142,8 @@ var ArrayField = function ArrayField(_ref) {
|
|
133
142
|
onDelete(fieldId);
|
134
143
|
} else {
|
135
144
|
setFieldValues(function (oldValues) {
|
136
|
-
return (0, _filter["default"])(oldValues).call(oldValues, function (
|
137
|
-
var id =
|
145
|
+
return (0, _filter["default"])(oldValues).call(oldValues, function (_ref) {
|
146
|
+
var id = _ref.id;
|
138
147
|
return id !== fieldId;
|
139
148
|
});
|
140
149
|
});
|
@@ -151,17 +160,21 @@ var ArrayField = function ArrayField(_ref) {
|
|
151
160
|
return (0, _concat["default"])(_context = []).call(_context, oldValues, [createEmptyField()]);
|
152
161
|
});
|
153
162
|
}, [createEmptyField, onAdd]);
|
163
|
+
|
164
|
+
var _useLabel = (0, _label.useLabel)(_objectSpread({}, props)),
|
165
|
+
raLabelProps = _useLabel.labelProps;
|
166
|
+
|
154
167
|
var isLimitReached = !!maxSize && (value || fieldValues).length >= maxSize;
|
155
|
-
return (0, _react2.jsx)(_Box["default"], others, (0, _react2.jsx)(
|
156
|
-
|
157
|
-
}
|
168
|
+
return (0, _react2.jsx)(_Box["default"], others, (0, _react2.jsx)(_Label["default"], (0, _extends2["default"])({}, raLabelProps, (0, _utils.mergeProps)(labelProps, raLabelProps, {
|
169
|
+
children: label
|
170
|
+
}))), (0, _react2.jsx)(_Box["default"], {
|
158
171
|
as: "ul",
|
159
172
|
pl: "0"
|
160
|
-
}, (0, _map["default"])(_context2 = value || fieldValues).call(_context2, function (
|
161
|
-
var id =
|
162
|
-
onComponentRender =
|
163
|
-
fieldValue =
|
164
|
-
otherFieldProps = (0, _objectWithoutProperties2["default"])(
|
173
|
+
}, (0, _map["default"])(_context2 = value || fieldValues).call(_context2, function (_ref2) {
|
174
|
+
var id = _ref2.id,
|
175
|
+
onComponentRender = _ref2.onComponentRender,
|
176
|
+
fieldValue = _ref2.fieldValue,
|
177
|
+
otherFieldProps = (0, _objectWithoutProperties2["default"])(_ref2, _excluded2);
|
165
178
|
var isDisabled = (value || fieldValues).length === 1;
|
166
179
|
return (0, _react2.jsx)(_Box["default"], {
|
167
180
|
as: "li",
|
@@ -204,6 +217,9 @@ ArrayField.propTypes = {
|
|
204
217
|
/** The rendered label for the field. */
|
205
218
|
label: _propTypes["default"].node,
|
206
219
|
|
220
|
+
/** Props object that is spread directly into the label element. */
|
221
|
+
labelProps: _propTypes["default"].shape({}),
|
222
|
+
|
207
223
|
/** Text to display before add button. Useful for errors or other info. */
|
208
224
|
helperText: _propTypes["default"].node,
|
209
225
|
|
@@ -84,6 +84,15 @@ var Uncontrolled = function Uncontrolled(_ref) {
|
|
84
84
|
var args = (0, _extends2["default"])({}, _ref);
|
85
85
|
return (0, _react2.jsx)(_index.ArrayField, (0, _extends2["default"])({
|
86
86
|
defaultValue: defaultData,
|
87
|
+
labelProps: {
|
88
|
+
hintText: 'Example Hint',
|
89
|
+
isRequired: true,
|
90
|
+
helpHintProps: {
|
91
|
+
tooltipProps: {
|
92
|
+
direction: 'top'
|
93
|
+
}
|
94
|
+
}
|
95
|
+
},
|
87
96
|
renderField: function renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) {
|
88
97
|
return (0, _react2.jsx)(_index.TextField, (0, _extends2["default"])({
|
89
98
|
"aria-label": "Text field",
|
@@ -36,7 +36,9 @@ var defaultProps = {
|
|
36
36
|
|
37
37
|
var getComponent = function getComponent() {
|
38
38
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
39
|
-
return (0, _testWrapper.render)((0, _react2.jsx)(_ArrayField["default"], (0, _extends2["default"])({
|
39
|
+
return (0, _testWrapper.render)((0, _react2.jsx)(_ArrayField["default"], (0, _extends2["default"])({
|
40
|
+
label: "test-label"
|
41
|
+
}, defaultProps, props)));
|
40
42
|
};
|
41
43
|
|
42
44
|
var renderField = function renderField(id, value, onFieldValueChange, onFieldDelete, otherFieldProps) {
|
@@ -194,6 +196,7 @@ test('onComponentRender displays fields correctly', function () {
|
|
194
196
|
}
|
195
197
|
}];
|
196
198
|
(0, _testWrapper.render)((0, _react2.jsx)(_ArrayField["default"], {
|
199
|
+
label: "test-label",
|
197
200
|
defaultValue: componentRenderData,
|
198
201
|
onChange: onChange
|
199
202
|
}));
|
@@ -202,6 +205,7 @@ test('onComponentRender displays fields correctly', function () {
|
|
202
205
|
});
|
203
206
|
test('creates empty field when no data passed', function () {
|
204
207
|
(0, _testWrapper.render)((0, _react2.jsx)(_ArrayField["default"], {
|
208
|
+
label: "test-label",
|
205
209
|
renderField: renderField
|
206
210
|
}));
|
207
211
|
expect(_testWrapper.screen.getByLabelText('Text field')).toBeInTheDocument();
|
@@ -121,6 +121,7 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
121
121
|
isNotFlippable = props.isNotFlippable,
|
122
122
|
direction = props.direction,
|
123
123
|
scrollBoxProps = props.scrollBoxProps,
|
124
|
+
controlProps = props.controlProps,
|
124
125
|
defaultFilter = props.defaultFilter;
|
125
126
|
var comboBoxOptions = {
|
126
127
|
children: children,
|
@@ -238,6 +239,11 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
238
239
|
});
|
239
240
|
(0, _utils.useLayoutEffect)(onResize, [onResize]);
|
240
241
|
|
242
|
+
var handleInputOpen = function handleInputOpen(e) {
|
243
|
+
if (!state.isOpen && menuTrigger === 'focus') buttonRef.current.click();
|
244
|
+
if (controlProps !== null && controlProps !== void 0 && controlProps.onClick) controlProps.onClick(e);
|
245
|
+
};
|
246
|
+
|
241
247
|
var style = _objectSpread(_objectSpread({}, overlayProps.style), {}, {
|
242
248
|
width: menuWidth,
|
243
249
|
minWidth: menuWidth
|
@@ -266,7 +272,10 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
266
272
|
labelProps: labelProps,
|
267
273
|
inputRef: inputRef,
|
268
274
|
triggerProps: buttonProps,
|
269
|
-
triggerRef: buttonRef
|
275
|
+
triggerRef: buttonRef,
|
276
|
+
controlProps: _objectSpread(_objectSpread({}, controlProps), {}, {
|
277
|
+
onClick: handleInputOpen
|
278
|
+
})
|
270
279
|
})), (0, _react2.jsx)(_PopoverContainer["default"], {
|
271
280
|
isOpen: state.isOpen,
|
272
281
|
ref: popoverRef,
|
@@ -414,6 +423,11 @@ ComboBoxField.propTypes = {
|
|
414
423
|
/** @ignore */
|
415
424
|
scrollBoxProps: _propTypes["default"].shape({
|
416
425
|
maxHeight: _propTypes["default"].string
|
426
|
+
}),
|
427
|
+
|
428
|
+
/** Props object that is spread directly into the ComboBoxInput element. */
|
429
|
+
controlProps: _propTypes["default"].shape({
|
430
|
+
onClick: _propTypes["default"].func
|
417
431
|
})
|
418
432
|
};
|
419
433
|
ComboBoxField.defaultProps = {
|
@@ -300,6 +300,28 @@ test('should open list on focus when menuTrigger is set to use focus', function
|
|
300
300
|
expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
|
301
301
|
expect(_testWrapper.screen.queryAllByRole('option')).toHaveLength(items.length);
|
302
302
|
});
|
303
|
+
test('should open list on focus on click after selection when menuTrigger is set to use focus', function () {
|
304
|
+
getComponent({
|
305
|
+
menuTrigger: 'focus'
|
306
|
+
});
|
307
|
+
|
308
|
+
var input = _testWrapper.screen.getByRole('combobox');
|
309
|
+
|
310
|
+
expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
|
311
|
+
|
312
|
+
_userEvent["default"].click(input);
|
313
|
+
|
314
|
+
expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
|
315
|
+
|
316
|
+
_userEvent["default"].click(_testWrapper.screen.queryAllByRole('option')[0]);
|
317
|
+
|
318
|
+
expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
|
319
|
+
expect(input).toHaveFocus();
|
320
|
+
|
321
|
+
_userEvent["default"].click(input);
|
322
|
+
|
323
|
+
expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
|
324
|
+
});
|
303
325
|
test('Item accepts a data-id and the data-id can be found in the DOM', function () {
|
304
326
|
getComponent();
|
305
327
|
|
@@ -6,13 +6,14 @@ import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-sta
|
|
6
6
|
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
7
7
|
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
8
8
|
import _Object$values from "@babel/runtime-corejs3/core-js-stable/object/values";
|
9
|
+
import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
|
9
10
|
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
|
10
11
|
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
11
12
|
import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
|
12
13
|
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
|
13
14
|
import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
|
14
15
|
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
|
15
|
-
var _excluded = ["addButtonLabel", "defaultValue", "value", "label", "helperText", "status", "onAdd", "onChange", "onDelete", "renderField", "maxSize", "maxSizeText"],
|
16
|
+
var _excluded = ["addButtonLabel", "defaultValue", "value", "label", "helperText", "status", "onAdd", "onChange", "onDelete", "renderField", "labelProps", "maxSize", "maxSizeText"],
|
16
17
|
_excluded2 = ["id", "onComponentRender", "fieldValue"];
|
17
18
|
|
18
19
|
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
@@ -21,31 +22,35 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
21
22
|
|
22
23
|
import React, { useCallback, useState } from 'react';
|
23
24
|
import PropTypes from 'prop-types';
|
25
|
+
import { mergeProps } from '@react-aria/utils';
|
24
26
|
import { v4 as uuid } from 'uuid';
|
27
|
+
import { useLabel } from '@react-aria/label';
|
25
28
|
import Box from '../Box';
|
26
29
|
import Button from '../Button';
|
27
30
|
import FieldHelperText from '../FieldHelperText';
|
28
31
|
import Text from '../Text';
|
32
|
+
import Label from '../Label';
|
29
33
|
import statuses from '../../utils/devUtils/constants/statuses';
|
30
34
|
import isValidPositiveInt from '../../utils/devUtils/props/isValidPositiveInt';
|
31
35
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
32
36
|
|
33
|
-
var ArrayField = function ArrayField(
|
37
|
+
var ArrayField = function ArrayField(props) {
|
34
38
|
var _context2;
|
35
39
|
|
36
|
-
var addButtonLabel =
|
37
|
-
defaultValue =
|
38
|
-
value =
|
39
|
-
label =
|
40
|
-
helperText =
|
41
|
-
status =
|
42
|
-
onAdd =
|
43
|
-
onChange =
|
44
|
-
onDelete =
|
45
|
-
renderField =
|
46
|
-
|
47
|
-
|
48
|
-
|
40
|
+
var addButtonLabel = props.addButtonLabel,
|
41
|
+
defaultValue = props.defaultValue,
|
42
|
+
value = props.value,
|
43
|
+
label = props.label,
|
44
|
+
helperText = props.helperText,
|
45
|
+
status = props.status,
|
46
|
+
onAdd = props.onAdd,
|
47
|
+
onChange = props.onChange,
|
48
|
+
onDelete = props.onDelete,
|
49
|
+
renderField = props.renderField,
|
50
|
+
labelProps = props.labelProps,
|
51
|
+
maxSize = props.maxSize,
|
52
|
+
maxSizeText = props.maxSizeText,
|
53
|
+
others = _objectWithoutProperties(props, _excluded);
|
49
54
|
|
50
55
|
var isControlled = value !== undefined;
|
51
56
|
var createEmptyField = useCallback(function () {
|
@@ -91,8 +96,8 @@ var ArrayField = function ArrayField(_ref) {
|
|
91
96
|
onDelete(fieldId);
|
92
97
|
} else {
|
93
98
|
setFieldValues(function (oldValues) {
|
94
|
-
return _filterInstanceProperty(oldValues).call(oldValues, function (
|
95
|
-
var id =
|
99
|
+
return _filterInstanceProperty(oldValues).call(oldValues, function (_ref) {
|
100
|
+
var id = _ref.id;
|
96
101
|
return id !== fieldId;
|
97
102
|
});
|
98
103
|
});
|
@@ -109,17 +114,21 @@ var ArrayField = function ArrayField(_ref) {
|
|
109
114
|
return _concatInstanceProperty(_context = []).call(_context, oldValues, [createEmptyField()]);
|
110
115
|
});
|
111
116
|
}, [createEmptyField, onAdd]);
|
117
|
+
|
118
|
+
var _useLabel = useLabel(_objectSpread({}, props)),
|
119
|
+
raLabelProps = _useLabel.labelProps;
|
120
|
+
|
112
121
|
var isLimitReached = !!maxSize && (value || fieldValues).length >= maxSize;
|
113
|
-
return ___EmotionJSX(Box, others, ___EmotionJSX(
|
114
|
-
|
115
|
-
}
|
122
|
+
return ___EmotionJSX(Box, others, ___EmotionJSX(Label, _extends({}, raLabelProps, mergeProps(labelProps, raLabelProps, {
|
123
|
+
children: label
|
124
|
+
}))), ___EmotionJSX(Box, {
|
116
125
|
as: "ul",
|
117
126
|
pl: "0"
|
118
|
-
}, _mapInstanceProperty(_context2 = value || fieldValues).call(_context2, function (
|
119
|
-
var id =
|
120
|
-
onComponentRender =
|
121
|
-
fieldValue =
|
122
|
-
otherFieldProps = _objectWithoutProperties(
|
127
|
+
}, _mapInstanceProperty(_context2 = value || fieldValues).call(_context2, function (_ref2) {
|
128
|
+
var id = _ref2.id,
|
129
|
+
onComponentRender = _ref2.onComponentRender,
|
130
|
+
fieldValue = _ref2.fieldValue,
|
131
|
+
otherFieldProps = _objectWithoutProperties(_ref2, _excluded2);
|
123
132
|
|
124
133
|
var isDisabled = (value || fieldValues).length === 1;
|
125
134
|
return ___EmotionJSX(Box, {
|
@@ -163,6 +172,9 @@ ArrayField.propTypes = {
|
|
163
172
|
/** The rendered label for the field. */
|
164
173
|
label: PropTypes.node,
|
165
174
|
|
175
|
+
/** Props object that is spread directly into the label element. */
|
176
|
+
labelProps: PropTypes.shape({}),
|
177
|
+
|
166
178
|
/** Text to display before add button. Useful for errors or other info. */
|
167
179
|
helperText: PropTypes.node,
|
168
180
|
|
@@ -62,6 +62,15 @@ export var Uncontrolled = function Uncontrolled(_ref) {
|
|
62
62
|
|
63
63
|
return ___EmotionJSX(ArrayField, _extends({
|
64
64
|
defaultValue: defaultData,
|
65
|
+
labelProps: {
|
66
|
+
hintText: 'Example Hint',
|
67
|
+
isRequired: true,
|
68
|
+
helpHintProps: {
|
69
|
+
tooltipProps: {
|
70
|
+
direction: 'top'
|
71
|
+
}
|
72
|
+
}
|
73
|
+
},
|
65
74
|
renderField: function renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) {
|
66
75
|
return ___EmotionJSX(TextField, _extends({
|
67
76
|
"aria-label": "Text field",
|
@@ -25,7 +25,9 @@ var defaultProps = {
|
|
25
25
|
|
26
26
|
var getComponent = function getComponent() {
|
27
27
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
28
|
-
return render(___EmotionJSX(ArrayField, _extends({
|
28
|
+
return render(___EmotionJSX(ArrayField, _extends({
|
29
|
+
label: "test-label"
|
30
|
+
}, defaultProps, props)));
|
29
31
|
};
|
30
32
|
|
31
33
|
var renderField = function renderField(id, value, onFieldValueChange, onFieldDelete, otherFieldProps) {
|
@@ -171,6 +173,7 @@ test('onComponentRender displays fields correctly', function () {
|
|
171
173
|
}
|
172
174
|
}];
|
173
175
|
render(___EmotionJSX(ArrayField, {
|
176
|
+
label: "test-label",
|
174
177
|
defaultValue: componentRenderData,
|
175
178
|
onChange: onChange
|
176
179
|
}));
|
@@ -179,6 +182,7 @@ test('onComponentRender displays fields correctly', function () {
|
|
179
182
|
});
|
180
183
|
test('creates empty field when no data passed', function () {
|
181
184
|
render(___EmotionJSX(ArrayField, {
|
185
|
+
label: "test-label",
|
182
186
|
renderField: renderField
|
183
187
|
}));
|
184
188
|
expect(screen.getByLabelText('Text field')).toBeInTheDocument();
|
@@ -75,6 +75,7 @@ var ComboBoxField = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
75
75
|
isNotFlippable = props.isNotFlippable,
|
76
76
|
direction = props.direction,
|
77
77
|
scrollBoxProps = props.scrollBoxProps,
|
78
|
+
controlProps = props.controlProps,
|
78
79
|
defaultFilter = props.defaultFilter;
|
79
80
|
var comboBoxOptions = {
|
80
81
|
children: children,
|
@@ -192,6 +193,11 @@ var ComboBoxField = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
192
193
|
});
|
193
194
|
useLayoutEffect(onResize, [onResize]);
|
194
195
|
|
196
|
+
var handleInputOpen = function handleInputOpen(e) {
|
197
|
+
if (!state.isOpen && menuTrigger === 'focus') buttonRef.current.click();
|
198
|
+
if (controlProps !== null && controlProps !== void 0 && controlProps.onClick) controlProps.onClick(e);
|
199
|
+
};
|
200
|
+
|
195
201
|
var style = _objectSpread(_objectSpread({}, overlayProps.style), {}, {
|
196
202
|
width: menuWidth,
|
197
203
|
minWidth: menuWidth
|
@@ -221,7 +227,10 @@ var ComboBoxField = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
221
227
|
labelProps: labelProps,
|
222
228
|
inputRef: inputRef,
|
223
229
|
triggerProps: buttonProps,
|
224
|
-
triggerRef: buttonRef
|
230
|
+
triggerRef: buttonRef,
|
231
|
+
controlProps: _objectSpread(_objectSpread({}, controlProps), {}, {
|
232
|
+
onClick: handleInputOpen
|
233
|
+
})
|
225
234
|
})), ___EmotionJSX(PopoverContainer, {
|
226
235
|
isOpen: state.isOpen,
|
227
236
|
ref: popoverRef,
|
@@ -369,6 +378,11 @@ ComboBoxField.propTypes = {
|
|
369
378
|
/** @ignore */
|
370
379
|
scrollBoxProps: PropTypes.shape({
|
371
380
|
maxHeight: PropTypes.string
|
381
|
+
}),
|
382
|
+
|
383
|
+
/** Props object that is spread directly into the ComboBoxInput element. */
|
384
|
+
controlProps: PropTypes.shape({
|
385
|
+
onClick: PropTypes.func
|
372
386
|
})
|
373
387
|
};
|
374
388
|
ComboBoxField.defaultProps = {
|
@@ -227,6 +227,20 @@ test('should open list on focus when menuTrigger is set to use focus', function
|
|
227
227
|
expect(screen.queryByRole('listbox')).toBeInTheDocument();
|
228
228
|
expect(screen.queryAllByRole('option')).toHaveLength(items.length);
|
229
229
|
});
|
230
|
+
test('should open list on focus on click after selection when menuTrigger is set to use focus', function () {
|
231
|
+
getComponent({
|
232
|
+
menuTrigger: 'focus'
|
233
|
+
});
|
234
|
+
var input = screen.getByRole('combobox');
|
235
|
+
expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
|
236
|
+
userEvent.click(input);
|
237
|
+
expect(screen.queryByRole('listbox')).toBeInTheDocument();
|
238
|
+
userEvent.click(screen.queryAllByRole('option')[0]);
|
239
|
+
expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
|
240
|
+
expect(input).toHaveFocus();
|
241
|
+
userEvent.click(input);
|
242
|
+
expect(screen.queryByRole('listbox')).toBeInTheDocument();
|
243
|
+
});
|
230
244
|
test('Item accepts a data-id and the data-id can be found in the DOM', function () {
|
231
245
|
getComponent();
|
232
246
|
var button = screen.queryByRole('button');
|