@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 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
- onChange(mapArrayFieldWithNewValue(value, tempValue, fieldId));
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, onChange, value]);
161
+ }, [isControlled, mapArrayFieldWithNewValue]);
144
162
  var onFieldDelete = (0, _react.useCallback)(function (fieldId) {
145
163
  if (isControlled) {
146
- onDelete(fieldId);
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, onDelete]);
173
+ }, [isControlled]);
156
174
  var onFieldAdd = (0, _react.useCallback)(function () {
157
- if (onAdd) {
158
- return onAdd();
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, onAdd]);
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)(_Box["default"], {
184
- as: "li",
185
- mb: "xs",
186
- key: id
187
- }, onComponentRender ? onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) : renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps));
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
- onChange(mapArrayFieldWithNewValue(value, tempValue, fieldId));
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, onChange, value]);
107
+ }, [isControlled, mapArrayFieldWithNewValue]);
99
108
  var onFieldDelete = useCallback(function (fieldId) {
100
109
  if (isControlled) {
101
- onDelete(fieldId);
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, onDelete]);
119
+ }, [isControlled]);
111
120
  var onFieldAdd = useCallback(function () {
112
- if (onAdd) {
113
- return onAdd();
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, onAdd]);
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(Box, {
140
- as: "li",
141
- mb: "xs",
142
- key: id
143
- }, onComponentRender ? onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) : renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps));
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
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "1.22.0-alpha.1",
3
+ "version": "1.23.0-alpha.0",
4
4
  "description": "PingUX themeable React component library",
5
5
  "author": "ux-development@pingidentity.com",
6
6
  "license": "Apache-2.0",