@pingux/astro 1.22.0-alpha.1 → 1.23.0-alpha.0
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 +17 -0
- package/lib/cjs/components/ArrayField/ArrayField.js +35 -12
- package/lib/cjs/components/ArrayField/ArrayFieldItem.js +50 -0
- package/lib/cjs/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.js +23 -3
- package/lib/cjs/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.stories.js +114 -2
- package/lib/cjs/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.test.js +28 -1
- package/lib/components/ArrayField/ArrayField.js +26 -12
- package/lib/components/ArrayField/ArrayFieldItem.js +31 -0
- package/lib/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.js +23 -3
- package/lib/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.stories.js +106 -0
- package/lib/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.test.js +22 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
@@ -3,6 +3,23 @@
|
|
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.22.0](https://gitlab.corp.pingidentity.com/ux/pingux/compare/@pingux/astro@1.21.1...@pingux/astro@1.22.0) (2022-07-06)
|
7
|
+
|
8
|
+
|
9
|
+
### Bug Fixes
|
10
|
+
|
11
|
+
* [UIP-5501] NumberField accessibility violation ([f64e54b](https://gitlab.corp.pingidentity.com/ux/pingux/commit/f64e54b80708bda1bcd85c2fff77d4e8c7160330))
|
12
|
+
|
13
|
+
|
14
|
+
### Features
|
15
|
+
|
16
|
+
* [UIP-5524] Add red border to error inputs ([a748a63](https://gitlab.corp.pingidentity.com/ux/pingux/commit/a748a63108f3d2dbb786e60d2ed11ebd2ee1c422))
|
17
|
+
* [UIP-5541] Environmental breadcrumbs popover state ([3d1307a](https://gitlab.corp.pingidentity.com/ux/pingux/commit/3d1307a2f5d26563b2d25b3e6e5d1981817f1ad5))
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
6
23
|
## [1.21.1](https://gitlab.corp.pingidentity.com/ux/pingux/compare/@pingux/astro@1.21.0...@pingux/astro@1.21.1) (2022-06-28)
|
7
24
|
|
8
25
|
|
@@ -68,6 +68,8 @@ var _statuses = _interopRequireDefault(require("../../utils/devUtils/constants/s
|
|
68
68
|
|
69
69
|
var _isValidPositiveInt = _interopRequireDefault(require("../../utils/devUtils/props/isValidPositiveInt"));
|
70
70
|
|
71
|
+
var _ArrayFieldItem = _interopRequireDefault(require("./ArrayFieldItem"));
|
72
|
+
|
71
73
|
var _react2 = require("@emotion/react");
|
72
74
|
|
73
75
|
var _excluded = ["addButtonLabel", "defaultValue", "value", "label", "helperText", "status", "onAdd", "onChange", "onDelete", "renderField", "labelProps", "maxSize", "maxSizeText"],
|
@@ -102,6 +104,22 @@ var ArrayField = function ArrayField(props) {
|
|
102
104
|
maxSize = props.maxSize,
|
103
105
|
maxSizeText = props.maxSizeText,
|
104
106
|
others = (0, _objectWithoutProperties2["default"])(props, _excluded);
|
107
|
+
|
108
|
+
var valueRef = _react["default"].useRef(value);
|
109
|
+
|
110
|
+
valueRef.current = value;
|
111
|
+
|
112
|
+
var onAddRef = _react["default"].useRef(onAdd);
|
113
|
+
|
114
|
+
onAddRef.current = onAdd;
|
115
|
+
|
116
|
+
var onChangeRef = _react["default"].useRef(onChange);
|
117
|
+
|
118
|
+
onChangeRef.current = onChange;
|
119
|
+
|
120
|
+
var onDeleteRef = _react["default"].useRef(onDelete);
|
121
|
+
|
122
|
+
onDeleteRef.current = onDelete;
|
105
123
|
var isControlled = value !== undefined;
|
106
124
|
var createEmptyField = (0, _react.useCallback)(function () {
|
107
125
|
return {
|
@@ -134,16 +152,16 @@ var ArrayField = function ArrayField(props) {
|
|
134
152
|
}
|
135
153
|
|
136
154
|
if (isControlled) {
|
137
|
-
|
155
|
+
onChangeRef.current(mapArrayFieldWithNewValue(valueRef.current, tempValue, fieldId));
|
138
156
|
} else {
|
139
157
|
setFieldValues(function (oldValues) {
|
140
158
|
return mapArrayFieldWithNewValue(oldValues, tempValue, fieldId);
|
141
159
|
});
|
142
160
|
}
|
143
|
-
}, [isControlled, mapArrayFieldWithNewValue
|
161
|
+
}, [isControlled, mapArrayFieldWithNewValue]);
|
144
162
|
var onFieldDelete = (0, _react.useCallback)(function (fieldId) {
|
145
163
|
if (isControlled) {
|
146
|
-
|
164
|
+
onDeleteRef.current(fieldId);
|
147
165
|
} else {
|
148
166
|
setFieldValues(function (oldValues) {
|
149
167
|
return (0, _filter["default"])(oldValues).call(oldValues, function (_ref) {
|
@@ -152,10 +170,10 @@ var ArrayField = function ArrayField(props) {
|
|
152
170
|
});
|
153
171
|
});
|
154
172
|
}
|
155
|
-
}, [isControlled
|
173
|
+
}, [isControlled]);
|
156
174
|
var onFieldAdd = (0, _react.useCallback)(function () {
|
157
|
-
if (
|
158
|
-
return
|
175
|
+
if (onAddRef.current) {
|
176
|
+
return onAddRef.current();
|
159
177
|
}
|
160
178
|
|
161
179
|
return setFieldValues(function (oldValues) {
|
@@ -163,7 +181,7 @@ var ArrayField = function ArrayField(props) {
|
|
163
181
|
|
164
182
|
return (0, _concat["default"])(_context = []).call(_context, oldValues, [createEmptyField()]);
|
165
183
|
});
|
166
|
-
}, [createEmptyField
|
184
|
+
}, [createEmptyField]);
|
167
185
|
|
168
186
|
var _useLabel = (0, _label.useLabel)(_objectSpread({}, props)),
|
169
187
|
raLabelProps = _useLabel.labelProps;
|
@@ -180,11 +198,16 @@ var ArrayField = function ArrayField(props) {
|
|
180
198
|
fieldValue = _ref2.fieldValue,
|
181
199
|
otherFieldProps = (0, _objectWithoutProperties2["default"])(_ref2, _excluded2);
|
182
200
|
var isDisabled = (value || fieldValues).length === 1;
|
183
|
-
return (0, _react2.jsx)(
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
201
|
+
return (0, _react2.jsx)(_ArrayFieldItem["default"], (0, _extends2["default"])({
|
202
|
+
key: id,
|
203
|
+
id: id,
|
204
|
+
isDisabled: isDisabled,
|
205
|
+
fieldValue: fieldValue,
|
206
|
+
onComponentRender: onComponentRender,
|
207
|
+
onFieldValueChange: onFieldValueChange,
|
208
|
+
onFieldDelete: onFieldDelete,
|
209
|
+
renderField: renderField
|
210
|
+
}, otherFieldProps));
|
188
211
|
})), helperText && (0, _react2.jsx)(_FieldHelperText["default"], {
|
189
212
|
status: status
|
190
213
|
}, helperText), isLimitReached && (0, _react2.jsx)(_FieldHelperText["default"], {
|
@@ -0,0 +1,50 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
|
7
|
+
_Object$defineProperty(exports, "__esModule", {
|
8
|
+
value: true
|
9
|
+
});
|
10
|
+
|
11
|
+
exports["default"] = void 0;
|
12
|
+
|
13
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
|
14
|
+
|
15
|
+
var _react = _interopRequireDefault(require("react"));
|
16
|
+
|
17
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
18
|
+
|
19
|
+
var _Box = _interopRequireDefault(require("../Box"));
|
20
|
+
|
21
|
+
var _react2 = require("@emotion/react");
|
22
|
+
|
23
|
+
var _excluded = ["id", "onComponentRender", "fieldValue", "isDisabled", "onFieldDelete", "onFieldValueChange", "renderField"];
|
24
|
+
|
25
|
+
var ArrayFieldItem = /*#__PURE__*/_react["default"].memo(function (_ref) {
|
26
|
+
var id = _ref.id,
|
27
|
+
onComponentRender = _ref.onComponentRender,
|
28
|
+
fieldValue = _ref.fieldValue,
|
29
|
+
isDisabled = _ref.isDisabled,
|
30
|
+
onFieldDelete = _ref.onFieldDelete,
|
31
|
+
onFieldValueChange = _ref.onFieldValueChange,
|
32
|
+
renderField = _ref.renderField,
|
33
|
+
otherFieldProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
34
|
+
return (0, _react2.jsx)(_Box["default"], {
|
35
|
+
as: "li",
|
36
|
+
mb: "xs"
|
37
|
+
}, onComponentRender ? onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) : renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps));
|
38
|
+
});
|
39
|
+
|
40
|
+
ArrayFieldItem.propTypes = {
|
41
|
+
id: _propTypes["default"].string,
|
42
|
+
onComponentRender: _propTypes["default"].func,
|
43
|
+
fieldValue: _propTypes["default"].string,
|
44
|
+
isDisabled: _propTypes["default"].bool,
|
45
|
+
onFieldDelete: _propTypes["default"].func,
|
46
|
+
onFieldValueChange: _propTypes["default"].func,
|
47
|
+
renderField: _propTypes["default"].func
|
48
|
+
};
|
49
|
+
var _default = ArrayFieldItem;
|
50
|
+
exports["default"] = _default;
|
@@ -74,7 +74,7 @@ var _index = require("../../index");
|
|
74
74
|
|
75
75
|
var _react2 = require("@emotion/react");
|
76
76
|
|
77
|
-
var _excluded = ["children", "disabledKeys", "emptySearchText", "items", "itemsFilter", "onNamePress", "onPopoverClose", "onPopoverOpen", "onSelectionChange", "name", "searchProps", "selectedItem"];
|
77
|
+
var _excluded = ["children", "disabledKeys", "emptySearchText", "isDefaultOpen", "isOpen", "items", "itemsFilter", "onOpenChange", "onNamePress", "onPopoverClose", "onPopoverOpen", "onSelectionChange", "name", "searchProps", "selectedItem"];
|
78
78
|
|
79
79
|
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); }
|
80
80
|
|
@@ -89,8 +89,11 @@ var EnvironmentBreadcrumb = /*#__PURE__*/(0, _react.forwardRef)(function (props,
|
|
89
89
|
var children = props.children,
|
90
90
|
imperativeDisabledKeys = props.disabledKeys,
|
91
91
|
emptySearchText = props.emptySearchText,
|
92
|
+
isDefaultOpen = props.isDefaultOpen,
|
93
|
+
isOpen = props.isOpen,
|
92
94
|
items = props.items,
|
93
95
|
imperativeItemsFilter = props.itemsFilter,
|
96
|
+
onOpenChange = props.onOpenChange,
|
94
97
|
onNamePress = props.onNamePress,
|
95
98
|
imperativeOnPopoverClose = props.onPopoverClose,
|
96
99
|
imperativeOnPopoverOpen = props.onPopoverOpen,
|
@@ -155,7 +158,11 @@ var EnvironmentBreadcrumb = /*#__PURE__*/(0, _react.forwardRef)(function (props,
|
|
155
158
|
});
|
156
159
|
};
|
157
160
|
|
158
|
-
var popoverState = (0, _overlays.useOverlayTriggerState)({
|
161
|
+
var popoverState = (0, _overlays.useOverlayTriggerState)({
|
162
|
+
defaultOpen: isDefaultOpen,
|
163
|
+
isOpen: isOpen,
|
164
|
+
onOpenChange: onOpenChange
|
165
|
+
});
|
159
166
|
var handlePopoverClose = (0, _react.useCallback)(function () {
|
160
167
|
if (imperativeOnPopoverClose) {
|
161
168
|
imperativeOnPopoverClose();
|
@@ -355,7 +362,20 @@ EnvironmentBreadcrumb.propTypes = {
|
|
355
362
|
disabledKeys: _propTypes["default"].arrayOf(_propTypes["default"].string),
|
356
363
|
|
357
364
|
/** Text that will be shown if no search results found. */
|
358
|
-
emptySearchText: _propTypes["default"].string
|
365
|
+
emptySearchText: _propTypes["default"].string,
|
366
|
+
|
367
|
+
/** Sets the default open state of the overlay. */
|
368
|
+
isDefaultOpen: _propTypes["default"].bool,
|
369
|
+
|
370
|
+
/** Whether the overlay is currently open. */
|
371
|
+
isOpen: _propTypes["default"].bool,
|
372
|
+
|
373
|
+
/**
|
374
|
+
* Method that is called when the open state of the menu changes.
|
375
|
+
*
|
376
|
+
* `(isOpen: boolean, overlayTrigger: OverlayTriggerAction) => void`
|
377
|
+
*/
|
378
|
+
onOpenChange: _propTypes["default"].func
|
359
379
|
};
|
360
380
|
EnvironmentBreadcrumb.defaultProps = {
|
361
381
|
emptySearchText: 'No Search Result'
|
@@ -26,7 +26,7 @@ _Object$defineProperty(exports, "__esModule", {
|
|
26
26
|
value: true
|
27
27
|
});
|
28
28
|
|
29
|
-
exports["default"] = exports.WithSections = exports.OrgLevel = exports.Default = void 0;
|
29
|
+
exports["default"] = exports.WithSections = exports.OrgLevel = exports.DefaultOpen = exports.Default = exports.ControlledMenu = void 0;
|
30
30
|
|
31
31
|
var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
|
32
32
|
|
@@ -298,4 +298,116 @@ var OrgLevel = function OrgLevel() {
|
|
298
298
|
});
|
299
299
|
};
|
300
300
|
|
301
|
-
exports.OrgLevel = OrgLevel;
|
301
|
+
exports.OrgLevel = OrgLevel;
|
302
|
+
|
303
|
+
var DefaultOpen = function DefaultOpen() {
|
304
|
+
var _useState7 = (0, _react.useState)({
|
305
|
+
name: 'Dog',
|
306
|
+
isSandbox: true
|
307
|
+
}),
|
308
|
+
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
309
|
+
selectedEnvironment = _useState8[0],
|
310
|
+
setSelectedEnvironment = _useState8[1];
|
311
|
+
|
312
|
+
var envNode = (0, _react2.jsx)(_index.Box, {
|
313
|
+
isRow: true
|
314
|
+
}, (0, _react2.jsx)(_index.Text, {
|
315
|
+
color: "inherit"
|
316
|
+
}, selectedEnvironment.name), selectedEnvironment.isSandbox ? (0, _react2.jsx)(_index.Chip, {
|
317
|
+
label: "SANDBOX",
|
318
|
+
variant: "boxes.environmentChip",
|
319
|
+
bg: "neutral.40"
|
320
|
+
}) : null);
|
321
|
+
|
322
|
+
var findEnvObj = function findEnvObj(envName) {
|
323
|
+
return (0, _find["default"])(defaultEnvironments).call(defaultEnvironments, function (_ref5) {
|
324
|
+
var name = _ref5.name;
|
325
|
+
return name === envName;
|
326
|
+
});
|
327
|
+
};
|
328
|
+
|
329
|
+
var handleSelectionChange = function handleSelectionChange(newEnvName) {
|
330
|
+
var envObj = findEnvObj(newEnvName);
|
331
|
+
setSelectedEnvironment(_objectSpread({}, envObj));
|
332
|
+
};
|
333
|
+
|
334
|
+
return (0, _react2.jsx)(_EnvironmentBreadcrumb["default"], {
|
335
|
+
items: defaultEnvironments,
|
336
|
+
name: "Globochem",
|
337
|
+
selectedItem: envNode,
|
338
|
+
onSelectionChange: handleSelectionChange,
|
339
|
+
isDefaultOpen: true
|
340
|
+
}, function (_ref6) {
|
341
|
+
var name = _ref6.name,
|
342
|
+
isSandbox = _ref6.isSandbox;
|
343
|
+
return (0, _react2.jsx)(_index.Item, {
|
344
|
+
key: name,
|
345
|
+
textValue: name
|
346
|
+
}, name, isSandbox ? (0, _react2.jsx)(_index.Chip, {
|
347
|
+
label: "SANDBOX",
|
348
|
+
variant: "boxes.environmentChip",
|
349
|
+
bg: "neutral.40"
|
350
|
+
}) : null);
|
351
|
+
});
|
352
|
+
};
|
353
|
+
|
354
|
+
exports.DefaultOpen = DefaultOpen;
|
355
|
+
|
356
|
+
var ControlledMenu = function ControlledMenu() {
|
357
|
+
var _useState9 = (0, _react.useState)(false),
|
358
|
+
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
|
359
|
+
isOpen = _useState10[0],
|
360
|
+
setIsOpen = _useState10[1];
|
361
|
+
|
362
|
+
var _useState11 = (0, _react.useState)({
|
363
|
+
name: 'Shark',
|
364
|
+
isSandbox: true
|
365
|
+
}),
|
366
|
+
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
|
367
|
+
selectedEnvironment = _useState12[0],
|
368
|
+
setSelectedEnvironment = _useState12[1];
|
369
|
+
|
370
|
+
var envNode = (0, _react2.jsx)(_index.Box, {
|
371
|
+
isRow: true
|
372
|
+
}, (0, _react2.jsx)(_index.Text, {
|
373
|
+
color: "inherit"
|
374
|
+
}, selectedEnvironment.name), selectedEnvironment.isSandbox ? (0, _react2.jsx)(_index.Chip, {
|
375
|
+
label: "SANDBOX",
|
376
|
+
variant: "boxes.environmentChip",
|
377
|
+
bg: "neutral.40"
|
378
|
+
}) : null);
|
379
|
+
|
380
|
+
var findEnvObj = function findEnvObj(envName) {
|
381
|
+
return (0, _find["default"])(defaultEnvironments).call(defaultEnvironments, function (_ref7) {
|
382
|
+
var name = _ref7.name;
|
383
|
+
return name === envName;
|
384
|
+
});
|
385
|
+
};
|
386
|
+
|
387
|
+
var handleSelectionChange = function handleSelectionChange(newEnvName) {
|
388
|
+
var envObj = findEnvObj(newEnvName);
|
389
|
+
setSelectedEnvironment(_objectSpread({}, envObj));
|
390
|
+
};
|
391
|
+
|
392
|
+
return (0, _react2.jsx)(_EnvironmentBreadcrumb["default"], {
|
393
|
+
items: defaultEnvironments,
|
394
|
+
name: "Globochem",
|
395
|
+
selectedItem: envNode,
|
396
|
+
onSelectionChange: handleSelectionChange,
|
397
|
+
isOpen: isOpen,
|
398
|
+
onOpenChange: setIsOpen
|
399
|
+
}, function (_ref8) {
|
400
|
+
var name = _ref8.name,
|
401
|
+
isSandbox = _ref8.isSandbox;
|
402
|
+
return (0, _react2.jsx)(_index.Item, {
|
403
|
+
key: name,
|
404
|
+
textValue: name
|
405
|
+
}, name, isSandbox ? (0, _react2.jsx)(_index.Chip, {
|
406
|
+
label: "SANDBOX",
|
407
|
+
variant: "boxes.environmentChip",
|
408
|
+
bg: "neutral.40"
|
409
|
+
}) : null);
|
410
|
+
});
|
411
|
+
};
|
412
|
+
|
413
|
+
exports.ControlledMenu = ControlledMenu;
|
@@ -295,4 +295,31 @@ test('should have no accessibility violations', /*#__PURE__*/(0, _asyncToGenerat
|
|
295
295
|
}
|
296
296
|
}
|
297
297
|
}, _callee2);
|
298
|
-
})));
|
298
|
+
})));
|
299
|
+
test('should be open when isDefaultOpen is true', function () {
|
300
|
+
getComponent({
|
301
|
+
isDefaultOpen: true
|
302
|
+
});
|
303
|
+
expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
|
304
|
+
expect(_testWrapper.screen.queryAllByRole('option')).toHaveLength(3);
|
305
|
+
|
306
|
+
_userEvent["default"].click(_testWrapper.screen.getByText(testSelectedItem));
|
307
|
+
|
308
|
+
expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
|
309
|
+
expect(_testWrapper.screen.queryAllByRole('option')).not.toHaveLength(3);
|
310
|
+
});
|
311
|
+
test('should respond to onOpenChange', function () {
|
312
|
+
var onOpenChange = jest.fn();
|
313
|
+
getComponent({
|
314
|
+
onOpenChange: onOpenChange
|
315
|
+
});
|
316
|
+
expect(onOpenChange).not.toHaveBeenCalled();
|
317
|
+
|
318
|
+
_userEvent["default"].click(_testWrapper.screen.getByText(testSelectedItem));
|
319
|
+
|
320
|
+
expect(onOpenChange).toHaveBeenNthCalledWith(1, true);
|
321
|
+
|
322
|
+
_userEvent["default"].click(_testWrapper.screen.getByText(testSelectedItem));
|
323
|
+
|
324
|
+
expect(onOpenChange).toHaveBeenNthCalledWith(2, false);
|
325
|
+
});
|
@@ -32,6 +32,7 @@ import Text from '../Text';
|
|
32
32
|
import Label from '../Label';
|
33
33
|
import statuses from '../../utils/devUtils/constants/statuses';
|
34
34
|
import isValidPositiveInt from '../../utils/devUtils/props/isValidPositiveInt';
|
35
|
+
import ArrayFieldItem from './ArrayFieldItem';
|
35
36
|
/**
|
36
37
|
* Displays array collections providing useful functions and
|
37
38
|
* optimizations for arrays.
|
@@ -57,6 +58,14 @@ var ArrayField = function ArrayField(props) {
|
|
57
58
|
maxSizeText = props.maxSizeText,
|
58
59
|
others = _objectWithoutProperties(props, _excluded);
|
59
60
|
|
61
|
+
var valueRef = React.useRef(value);
|
62
|
+
valueRef.current = value;
|
63
|
+
var onAddRef = React.useRef(onAdd);
|
64
|
+
onAddRef.current = onAdd;
|
65
|
+
var onChangeRef = React.useRef(onChange);
|
66
|
+
onChangeRef.current = onChange;
|
67
|
+
var onDeleteRef = React.useRef(onDelete);
|
68
|
+
onDeleteRef.current = onDelete;
|
60
69
|
var isControlled = value !== undefined;
|
61
70
|
var createEmptyField = useCallback(function () {
|
62
71
|
return {
|
@@ -89,16 +98,16 @@ var ArrayField = function ArrayField(props) {
|
|
89
98
|
}
|
90
99
|
|
91
100
|
if (isControlled) {
|
92
|
-
|
101
|
+
onChangeRef.current(mapArrayFieldWithNewValue(valueRef.current, tempValue, fieldId));
|
93
102
|
} else {
|
94
103
|
setFieldValues(function (oldValues) {
|
95
104
|
return mapArrayFieldWithNewValue(oldValues, tempValue, fieldId);
|
96
105
|
});
|
97
106
|
}
|
98
|
-
}, [isControlled, mapArrayFieldWithNewValue
|
107
|
+
}, [isControlled, mapArrayFieldWithNewValue]);
|
99
108
|
var onFieldDelete = useCallback(function (fieldId) {
|
100
109
|
if (isControlled) {
|
101
|
-
|
110
|
+
onDeleteRef.current(fieldId);
|
102
111
|
} else {
|
103
112
|
setFieldValues(function (oldValues) {
|
104
113
|
return _filterInstanceProperty(oldValues).call(oldValues, function (_ref) {
|
@@ -107,10 +116,10 @@ var ArrayField = function ArrayField(props) {
|
|
107
116
|
});
|
108
117
|
});
|
109
118
|
}
|
110
|
-
}, [isControlled
|
119
|
+
}, [isControlled]);
|
111
120
|
var onFieldAdd = useCallback(function () {
|
112
|
-
if (
|
113
|
-
return
|
121
|
+
if (onAddRef.current) {
|
122
|
+
return onAddRef.current();
|
114
123
|
}
|
115
124
|
|
116
125
|
return setFieldValues(function (oldValues) {
|
@@ -118,7 +127,7 @@ var ArrayField = function ArrayField(props) {
|
|
118
127
|
|
119
128
|
return _concatInstanceProperty(_context = []).call(_context, oldValues, [createEmptyField()]);
|
120
129
|
});
|
121
|
-
}, [createEmptyField
|
130
|
+
}, [createEmptyField]);
|
122
131
|
|
123
132
|
var _useLabel = useLabel(_objectSpread({}, props)),
|
124
133
|
raLabelProps = _useLabel.labelProps;
|
@@ -136,11 +145,16 @@ var ArrayField = function ArrayField(props) {
|
|
136
145
|
otherFieldProps = _objectWithoutProperties(_ref2, _excluded2);
|
137
146
|
|
138
147
|
var isDisabled = (value || fieldValues).length === 1;
|
139
|
-
return ___EmotionJSX(
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
148
|
+
return ___EmotionJSX(ArrayFieldItem, _extends({
|
149
|
+
key: id,
|
150
|
+
id: id,
|
151
|
+
isDisabled: isDisabled,
|
152
|
+
fieldValue: fieldValue,
|
153
|
+
onComponentRender: onComponentRender,
|
154
|
+
onFieldValueChange: onFieldValueChange,
|
155
|
+
onFieldDelete: onFieldDelete,
|
156
|
+
renderField: renderField
|
157
|
+
}, otherFieldProps));
|
144
158
|
})), helperText && ___EmotionJSX(FieldHelperText, {
|
145
159
|
status: status
|
146
160
|
}, helperText), isLimitReached && ___EmotionJSX(FieldHelperText, {
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
|
2
|
+
var _excluded = ["id", "onComponentRender", "fieldValue", "isDisabled", "onFieldDelete", "onFieldValueChange", "renderField"];
|
3
|
+
import React from 'react';
|
4
|
+
import PropTypes from 'prop-types';
|
5
|
+
import Box from '../Box';
|
6
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
7
|
+
var ArrayFieldItem = /*#__PURE__*/React.memo(function (_ref) {
|
8
|
+
var id = _ref.id,
|
9
|
+
onComponentRender = _ref.onComponentRender,
|
10
|
+
fieldValue = _ref.fieldValue,
|
11
|
+
isDisabled = _ref.isDisabled,
|
12
|
+
onFieldDelete = _ref.onFieldDelete,
|
13
|
+
onFieldValueChange = _ref.onFieldValueChange,
|
14
|
+
renderField = _ref.renderField,
|
15
|
+
otherFieldProps = _objectWithoutProperties(_ref, _excluded);
|
16
|
+
|
17
|
+
return ___EmotionJSX(Box, {
|
18
|
+
as: "li",
|
19
|
+
mb: "xs"
|
20
|
+
}, onComponentRender ? onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) : renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps));
|
21
|
+
});
|
22
|
+
ArrayFieldItem.propTypes = {
|
23
|
+
id: PropTypes.string,
|
24
|
+
onComponentRender: PropTypes.func,
|
25
|
+
fieldValue: PropTypes.string,
|
26
|
+
isDisabled: PropTypes.bool,
|
27
|
+
onFieldDelete: PropTypes.func,
|
28
|
+
onFieldValueChange: PropTypes.func,
|
29
|
+
renderField: PropTypes.func
|
30
|
+
};
|
31
|
+
export default ArrayFieldItem;
|
@@ -12,7 +12,7 @@ import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance
|
|
12
12
|
import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
|
13
13
|
import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
|
14
14
|
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
|
15
|
-
var _excluded = ["children", "disabledKeys", "emptySearchText", "items", "itemsFilter", "onNamePress", "onPopoverClose", "onPopoverOpen", "onSelectionChange", "name", "searchProps", "selectedItem"];
|
15
|
+
var _excluded = ["children", "disabledKeys", "emptySearchText", "isDefaultOpen", "isOpen", "items", "itemsFilter", "onOpenChange", "onNamePress", "onPopoverClose", "onPopoverOpen", "onSelectionChange", "name", "searchProps", "selectedItem"];
|
16
16
|
|
17
17
|
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; }
|
18
18
|
|
@@ -39,8 +39,11 @@ var EnvironmentBreadcrumb = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
39
39
|
var children = props.children,
|
40
40
|
imperativeDisabledKeys = props.disabledKeys,
|
41
41
|
emptySearchText = props.emptySearchText,
|
42
|
+
isDefaultOpen = props.isDefaultOpen,
|
43
|
+
isOpen = props.isOpen,
|
42
44
|
items = props.items,
|
43
45
|
imperativeItemsFilter = props.itemsFilter,
|
46
|
+
onOpenChange = props.onOpenChange,
|
44
47
|
onNamePress = props.onNamePress,
|
45
48
|
imperativeOnPopoverClose = props.onPopoverClose,
|
46
49
|
imperativeOnPopoverOpen = props.onPopoverOpen,
|
@@ -103,7 +106,11 @@ var EnvironmentBreadcrumb = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
103
106
|
});
|
104
107
|
};
|
105
108
|
|
106
|
-
var popoverState = useOverlayTriggerState({
|
109
|
+
var popoverState = useOverlayTriggerState({
|
110
|
+
defaultOpen: isDefaultOpen,
|
111
|
+
isOpen: isOpen,
|
112
|
+
onOpenChange: onOpenChange
|
113
|
+
});
|
107
114
|
var handlePopoverClose = useCallback(function () {
|
108
115
|
if (imperativeOnPopoverClose) {
|
109
116
|
imperativeOnPopoverClose();
|
@@ -303,7 +310,20 @@ EnvironmentBreadcrumb.propTypes = {
|
|
303
310
|
disabledKeys: PropTypes.arrayOf(PropTypes.string),
|
304
311
|
|
305
312
|
/** Text that will be shown if no search results found. */
|
306
|
-
emptySearchText: PropTypes.string
|
313
|
+
emptySearchText: PropTypes.string,
|
314
|
+
|
315
|
+
/** Sets the default open state of the overlay. */
|
316
|
+
isDefaultOpen: PropTypes.bool,
|
317
|
+
|
318
|
+
/** Whether the overlay is currently open. */
|
319
|
+
isOpen: PropTypes.bool,
|
320
|
+
|
321
|
+
/**
|
322
|
+
* Method that is called when the open state of the menu changes.
|
323
|
+
*
|
324
|
+
* `(isOpen: boolean, overlayTrigger: OverlayTriggerAction) => void`
|
325
|
+
*/
|
326
|
+
onOpenChange: PropTypes.func
|
307
327
|
};
|
308
328
|
EnvironmentBreadcrumb.defaultProps = {
|
309
329
|
emptySearchText: 'No Search Result'
|
@@ -253,4 +253,110 @@ export var OrgLevel = function OrgLevel() {
|
|
253
253
|
return ___EmotionJSX(EnvironmentBreadcrumb, {
|
254
254
|
name: "Globochem"
|
255
255
|
});
|
256
|
+
};
|
257
|
+
export var DefaultOpen = function DefaultOpen() {
|
258
|
+
var _useState7 = useState({
|
259
|
+
name: 'Dog',
|
260
|
+
isSandbox: true
|
261
|
+
}),
|
262
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
263
|
+
selectedEnvironment = _useState8[0],
|
264
|
+
setSelectedEnvironment = _useState8[1];
|
265
|
+
|
266
|
+
var envNode = ___EmotionJSX(Box, {
|
267
|
+
isRow: true
|
268
|
+
}, ___EmotionJSX(Text, {
|
269
|
+
color: "inherit"
|
270
|
+
}, selectedEnvironment.name), selectedEnvironment.isSandbox ? ___EmotionJSX(Chip, {
|
271
|
+
label: "SANDBOX",
|
272
|
+
variant: "boxes.environmentChip",
|
273
|
+
bg: "neutral.40"
|
274
|
+
}) : null);
|
275
|
+
|
276
|
+
var findEnvObj = function findEnvObj(envName) {
|
277
|
+
return _findInstanceProperty(defaultEnvironments).call(defaultEnvironments, function (_ref5) {
|
278
|
+
var name = _ref5.name;
|
279
|
+
return name === envName;
|
280
|
+
});
|
281
|
+
};
|
282
|
+
|
283
|
+
var handleSelectionChange = function handleSelectionChange(newEnvName) {
|
284
|
+
var envObj = findEnvObj(newEnvName);
|
285
|
+
setSelectedEnvironment(_objectSpread({}, envObj));
|
286
|
+
};
|
287
|
+
|
288
|
+
return ___EmotionJSX(EnvironmentBreadcrumb, {
|
289
|
+
items: defaultEnvironments,
|
290
|
+
name: "Globochem",
|
291
|
+
selectedItem: envNode,
|
292
|
+
onSelectionChange: handleSelectionChange,
|
293
|
+
isDefaultOpen: true
|
294
|
+
}, function (_ref6) {
|
295
|
+
var name = _ref6.name,
|
296
|
+
isSandbox = _ref6.isSandbox;
|
297
|
+
return ___EmotionJSX(Item, {
|
298
|
+
key: name,
|
299
|
+
textValue: name
|
300
|
+
}, name, isSandbox ? ___EmotionJSX(Chip, {
|
301
|
+
label: "SANDBOX",
|
302
|
+
variant: "boxes.environmentChip",
|
303
|
+
bg: "neutral.40"
|
304
|
+
}) : null);
|
305
|
+
});
|
306
|
+
};
|
307
|
+
export var ControlledMenu = function ControlledMenu() {
|
308
|
+
var _useState9 = useState(false),
|
309
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
310
|
+
isOpen = _useState10[0],
|
311
|
+
setIsOpen = _useState10[1];
|
312
|
+
|
313
|
+
var _useState11 = useState({
|
314
|
+
name: 'Shark',
|
315
|
+
isSandbox: true
|
316
|
+
}),
|
317
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
318
|
+
selectedEnvironment = _useState12[0],
|
319
|
+
setSelectedEnvironment = _useState12[1];
|
320
|
+
|
321
|
+
var envNode = ___EmotionJSX(Box, {
|
322
|
+
isRow: true
|
323
|
+
}, ___EmotionJSX(Text, {
|
324
|
+
color: "inherit"
|
325
|
+
}, selectedEnvironment.name), selectedEnvironment.isSandbox ? ___EmotionJSX(Chip, {
|
326
|
+
label: "SANDBOX",
|
327
|
+
variant: "boxes.environmentChip",
|
328
|
+
bg: "neutral.40"
|
329
|
+
}) : null);
|
330
|
+
|
331
|
+
var findEnvObj = function findEnvObj(envName) {
|
332
|
+
return _findInstanceProperty(defaultEnvironments).call(defaultEnvironments, function (_ref7) {
|
333
|
+
var name = _ref7.name;
|
334
|
+
return name === envName;
|
335
|
+
});
|
336
|
+
};
|
337
|
+
|
338
|
+
var handleSelectionChange = function handleSelectionChange(newEnvName) {
|
339
|
+
var envObj = findEnvObj(newEnvName);
|
340
|
+
setSelectedEnvironment(_objectSpread({}, envObj));
|
341
|
+
};
|
342
|
+
|
343
|
+
return ___EmotionJSX(EnvironmentBreadcrumb, {
|
344
|
+
items: defaultEnvironments,
|
345
|
+
name: "Globochem",
|
346
|
+
selectedItem: envNode,
|
347
|
+
onSelectionChange: handleSelectionChange,
|
348
|
+
isOpen: isOpen,
|
349
|
+
onOpenChange: setIsOpen
|
350
|
+
}, function (_ref8) {
|
351
|
+
var name = _ref8.name,
|
352
|
+
isSandbox = _ref8.isSandbox;
|
353
|
+
return ___EmotionJSX(Item, {
|
354
|
+
key: name,
|
355
|
+
textValue: name
|
356
|
+
}, name, isSandbox ? ___EmotionJSX(Chip, {
|
357
|
+
label: "SANDBOX",
|
358
|
+
variant: "boxes.environmentChip",
|
359
|
+
bg: "neutral.40"
|
360
|
+
}) : null);
|
361
|
+
});
|
256
362
|
};
|
@@ -250,4 +250,25 @@ test('should have no accessibility violations', /*#__PURE__*/_asyncToGenerator(
|
|
250
250
|
}
|
251
251
|
}
|
252
252
|
}, _callee2);
|
253
|
-
})));
|
253
|
+
})));
|
254
|
+
test('should be open when isDefaultOpen is true', function () {
|
255
|
+
getComponent({
|
256
|
+
isDefaultOpen: true
|
257
|
+
});
|
258
|
+
expect(screen.queryByRole('listbox')).toBeInTheDocument();
|
259
|
+
expect(screen.queryAllByRole('option')).toHaveLength(3);
|
260
|
+
userEvent.click(screen.getByText(testSelectedItem));
|
261
|
+
expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
|
262
|
+
expect(screen.queryAllByRole('option')).not.toHaveLength(3);
|
263
|
+
});
|
264
|
+
test('should respond to onOpenChange', function () {
|
265
|
+
var onOpenChange = jest.fn();
|
266
|
+
getComponent({
|
267
|
+
onOpenChange: onOpenChange
|
268
|
+
});
|
269
|
+
expect(onOpenChange).not.toHaveBeenCalled();
|
270
|
+
userEvent.click(screen.getByText(testSelectedItem));
|
271
|
+
expect(onOpenChange).toHaveBeenNthCalledWith(1, true);
|
272
|
+
userEvent.click(screen.getByText(testSelectedItem));
|
273
|
+
expect(onOpenChange).toHaveBeenNthCalledWith(2, false);
|
274
|
+
});
|