@pingux/astro 1.2.0-alpha.0 → 1.2.0-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.
@@ -85,6 +85,9 @@ var BreadcrumbItem = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
85
85
  case 'Text':
86
86
  return _index.Text;
87
87
 
88
+ case 'Fragment':
89
+ return _react.Fragment;
90
+
88
91
  default:
89
92
  return elementType;
90
93
  }
@@ -12,9 +12,13 @@ _Object$defineProperty(exports, "__esModule", {
12
12
 
13
13
  exports["default"] = void 0;
14
14
 
15
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
16
+
15
17
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
16
18
 
17
- var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
19
+ var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
20
+
21
+ var _isArray = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/is-array"));
18
22
 
19
23
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
20
24
 
@@ -45,7 +49,11 @@ var Breadcrumbs = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
45
49
  icon = props.icon,
46
50
  iconProps = props.iconProps,
47
51
  onAction = props.onAction,
48
- others = (0, _objectWithoutProperties2["default"])(props, ["children", "icon", "iconProps", "onAction"]);
52
+ others = (0, _objectWithoutProperties2["default"])(props, ["children", "icon", "iconProps", "onAction"]); // the following filters undefined values passed as a child
53
+
54
+ var filteredChildren = (0, _isArray["default"])(children) ? (0, _filter["default"])(children).call(children, function (child) {
55
+ return child;
56
+ }) : children;
49
57
 
50
58
  var _useBreadcrumbs = (0, _breadcrumbs.useBreadcrumbs)(props),
51
59
  wrapperProps = _useBreadcrumbs.navProps;
@@ -57,26 +65,28 @@ var Breadcrumbs = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
57
65
  (0, _react.useImperativeHandle)(ref, function () {
58
66
  return breadcrumbsRef.current;
59
67
  });
60
- return (0, _react2.jsx)(_index.Box, (0, _extends2["default"])({
61
- ref: breadcrumbsRef,
62
- display: "flex",
63
- flexDirection: "row",
64
- alignItems: "center",
65
- sx: {
66
- overflow: 'auto'
67
- }
68
- }, (0, _utils.mergeProps)(wrapperProps, others)), (0, _map["default"])(children).call(children, function (child, idx) {
68
+ var createBreadcrumb = (0, _react.useCallback)(function (child, idx) {
69
+ var isCurrentItem = (0, _isArray["default"])(filteredChildren) && filteredChildren.length > 1 ? idx === children.length - 1 : true;
69
70
  return (0, _react2.jsx)(_react.Fragment, {
70
71
  key: "fragment-".concat(child.key)
71
72
  }, (0, _react2.jsx)(_BreadcrumbItem["default"], (0, _extends2["default"])({
72
73
  "data-id": child['data-id'],
73
- isCurrent: idx === children.length - 1,
74
+ isCurrent: isCurrentItem,
74
75
  onAction: onAction,
75
76
  actionKey: child.key
76
- }, child.props), child.props.children), icon && idx !== children.length - 1 && (0, _react2.jsx)(_index.Icon, (0, _extends2["default"])({
77
+ }, child.props), child.props.children), icon && !isCurrentItem && (0, _react2.jsx)(_index.Icon, (0, _extends2["default"])({
77
78
  icon: icon
78
79
  }, iconProps)));
79
- }));
80
+ }, [children.length, filteredChildren, icon, iconProps, onAction]);
81
+ return (0, _react2.jsx)(_index.Box, (0, _extends2["default"])({
82
+ ref: breadcrumbsRef,
83
+ display: "flex",
84
+ flexDirection: "row",
85
+ alignItems: "center",
86
+ sx: {
87
+ overflow: 'auto'
88
+ }
89
+ }, (0, _utils.mergeProps)(wrapperProps, others)), (0, _isArray["default"])(filteredChildren) ? (0, _map["default"])(filteredChildren).call(filteredChildren, createBreadcrumb) : createBreadcrumb(children));
80
90
  });
81
91
  Breadcrumbs.propTypes = {
82
92
  /** The icon to render in between each node. */
@@ -109,4 +109,13 @@ test('Item accepts a data-id and the data-id can be found in the DOM', function
109
109
 
110
110
  expect(item).toBeInTheDocument();
111
111
  expect(item).toHaveAttribute('data-id', testItemsArr[0]);
112
+ });
113
+ test('will render correctly with single child item', function () {
114
+ (0, _testWrapper.render)((0, _react2.jsx)(_Breadcrumbs["default"], (0, _utils.mergeProps)(defaultProps), (0, _react2.jsx)(_collections.Item, {
115
+ key: testItemsArr[0],
116
+ "data-id": testItemsArr[0],
117
+ isCurrent: true
118
+ }, testItemsArr[0])));
119
+ expect(_testWrapper.screen.getByTestId(testId)).toBeInTheDocument();
120
+ expect(_testWrapper.screen.getByText(testItemsArr[0])).toBeInTheDocument();
112
121
  });
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
6
+
7
+ var _Object$defineProperty2 = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
8
+
9
+ _Object$defineProperty2(exports, "__esModule", {
10
+ value: true
11
+ });
12
+
13
+ exports["default"] = void 0;
14
+
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
16
+
17
+ var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-properties"));
18
+
19
+ var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"));
20
+
21
+ var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"));
22
+
23
+ var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"));
24
+
25
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
26
+
27
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
28
+
29
+ var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
30
+
31
+ var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
32
+
33
+ var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
34
+
35
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
36
+
37
+ var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));
38
+
39
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
40
+
41
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
42
+
43
+ var _react = _interopRequireWildcard(require("react"));
44
+
45
+ var _i18n = require("@react-aria/i18n");
46
+
47
+ var _ChevronRightIcon = _interopRequireDefault(require("mdi-react/ChevronRightIcon"));
48
+
49
+ var _HomeIcon = _interopRequireDefault(require("mdi-react/HomeIcon"));
50
+
51
+ var _propTypes = _interopRequireDefault(require("prop-types"));
52
+
53
+ var _overlays = require("@react-stately/overlays");
54
+
55
+ var _overlays2 = require("@react-aria/overlays");
56
+
57
+ var _ArrowDropUpIcon = _interopRequireDefault(require("mdi-react/ArrowDropUpIcon"));
58
+
59
+ var _ArrowDropDownIcon = _interopRequireDefault(require("mdi-react/ArrowDropDownIcon"));
60
+
61
+ var _focus = require("@react-aria/focus");
62
+
63
+ var _list = require("@react-stately/list");
64
+
65
+ var _ListBox = _interopRequireDefault(require("../ListBox"));
66
+
67
+ var _isIterable = require("../../utils/devUtils/props/isIterable");
68
+
69
+ var _index = require("../../index");
70
+
71
+ var _react2 = require("@emotion/react");
72
+
73
+ function ownKeys(object, enumerableOnly) { var keys = (0, _keys["default"])(object); if (_getOwnPropertySymbols["default"]) { var symbols = (0, _getOwnPropertySymbols["default"])(object); if (enumerableOnly) symbols = (0, _filter["default"])(symbols).call(symbols, function (sym) { return (0, _getOwnPropertyDescriptor["default"])(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
74
+
75
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context2; (0, _forEach["default"])(_context2 = ownKeys(Object(source), true)).call(_context2, function (key) { (0, _defineProperty3["default"])(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors["default"]) { (0, _defineProperties["default"])(target, (0, _getOwnPropertyDescriptors["default"])(source)); } else { var _context3; (0, _forEach["default"])(_context3 = ownKeys(Object(source))).call(_context3, function (key) { (0, _defineProperty2["default"])(target, key, (0, _getOwnPropertyDescriptor["default"])(source, key)); }); } } return target; }
76
+
77
+ /** The Environment Picker with Search and Sections support */
78
+ var EnvironmentBreadcrumb = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
79
+ var children = props.children,
80
+ imperativeDisabledKeys = props.disabledKeys,
81
+ emptySearchText = props.emptySearchText,
82
+ items = props.items,
83
+ imperativeItemsFilter = props.itemsFilter,
84
+ onNamePress = props.onNamePress,
85
+ imperativeOnPopoverClose = props.onPopoverClose,
86
+ imperativeOnPopoverOpen = props.onPopoverOpen,
87
+ onSelectionChange = props.onSelectionChange,
88
+ name = props.name,
89
+ searchProps = props.searchProps,
90
+ selectedItem = props.selectedItem,
91
+ others = (0, _objectWithoutProperties2["default"])(props, ["children", "disabledKeys", "emptySearchText", "items", "itemsFilter", "onNamePress", "onPopoverClose", "onPopoverOpen", "onSelectionChange", "name", "searchProps", "selectedItem"]);
92
+
93
+ var _useState = (0, _react.useState)(''),
94
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
95
+ searchValue = _useState2[0],
96
+ setSearchValue = _useState2[1];
97
+
98
+ var breadcrumbsRef = (0, _react.useRef)();
99
+
100
+ var overlayRef = _react["default"].useRef();
101
+
102
+ var triggerRef = _react["default"].useRef();
103
+
104
+ var scrollBoxRef = _react["default"].useRef();
105
+ /* istanbul ignore next */
106
+
107
+
108
+ (0, _react.useImperativeHandle)(ref, function () {
109
+ return breadcrumbsRef.current;
110
+ });
111
+
112
+ var _useFilter = (0, _i18n.useFilter)({
113
+ sensitivity: 'base'
114
+ }),
115
+ contains = _useFilter.contains;
116
+
117
+ var filterNodesWithChildren = function filterNodesWithChildren(iterableNode) {
118
+ var nodeArr = (0, _from["default"])(iterableNode); // with this function we are filtering child items if they have sections
119
+ // we can't filter items because if it would be a section - we can't change childNodes
120
+ // eslint-disable-next-line array-callback-return,consistent-return
121
+
122
+ var filteredSections = (0, _map["default"])(nodeArr).call(nodeArr, function f(nodeItem) {
123
+ if ((nodeItem === null || nodeItem === void 0 ? void 0 : nodeItem.type) === 'item') {
124
+ var _nodeItem$value;
125
+
126
+ return contains(nodeItem === null || nodeItem === void 0 ? void 0 : (_nodeItem$value = nodeItem.value) === null || _nodeItem$value === void 0 ? void 0 : _nodeItem$value.name, searchValue) ? nodeItem : null;
127
+ }
128
+
129
+ if ((nodeItem === null || nodeItem === void 0 ? void 0 : nodeItem.type) === 'section') {
130
+ var _context;
131
+
132
+ return _objectSpread(_objectSpread({}, nodeItem), {}, {
133
+ childNodes: (0, _filter["default"])(_context = (0, _from["default"])(nodeItem.childNodes)).call(_context, f)
134
+ });
135
+ }
136
+ }); // we are filtering null items here since we were not able to filter them in previous function
137
+
138
+ return (0, _filter["default"])(filteredSections).call(filteredSections, function (item) {
139
+ return item;
140
+ });
141
+ };
142
+
143
+ var popoverState = (0, _overlays.useOverlayTriggerState)({});
144
+ var handlePopoverClose = (0, _react.useCallback)(function () {
145
+ if (imperativeOnPopoverClose) {
146
+ imperativeOnPopoverClose();
147
+ }
148
+
149
+ setSearchValue('');
150
+ popoverState.close();
151
+ }, [imperativeOnPopoverClose, popoverState]);
152
+ var handleSelectionChange = (0, _react.useCallback)(function (selectedItemSet) {
153
+ var _selectedItemSet = (0, _slicedToArray2["default"])(selectedItemSet, 1),
154
+ selectedItemKey = _selectedItemSet[0];
155
+
156
+ onSelectionChange(selectedItemKey);
157
+ handlePopoverClose();
158
+ }, [handlePopoverClose, onSelectionChange]);
159
+ var listBoxProps = {
160
+ children: children,
161
+ disabledKeys: imperativeDisabledKeys,
162
+ items: items,
163
+ filter: imperativeItemsFilter || filterNodesWithChildren,
164
+ onSelectionChange: handleSelectionChange,
165
+ selectedKeys: [],
166
+ selectionMode: 'single',
167
+ disallowEmptySelection: false
168
+ };
169
+ var listBoxState = (0, _list.useListState)(listBoxProps); // this function is recursively going through the children to see
170
+ // whether there are some items so that means that the array isn't empty
171
+
172
+ var checkIfListEmpty = (0, _react.useCallback)(function () {
173
+ // from the beginning we are assuming that the list is empty
174
+ // variable is not isListEmpty because checks below if(isListHasItems) is clearer
175
+ // to read than if(!isListEmpty) IMO
176
+ var isListHasItems = false; // eslint-disable-next-line consistent-return
177
+
178
+ (function f(listState) {
179
+ var _listState$collection;
180
+
181
+ // if the list has items - we don't need to go deeper into the recursion
182
+ if (isListHasItems) {
183
+ return;
184
+ } // here we are checking where are listItems array is stored
185
+
186
+
187
+ var listItemsArr = (listState === null || listState === void 0 ? void 0 : (_listState$collection = listState.collection) === null || _listState$collection === void 0 ? void 0 : _listState$collection.iterable) || (listState === null || listState === void 0 ? void 0 : listState.childNodes);
188
+
189
+ if ((listItemsArr === null || listItemsArr === void 0 ? void 0 : listItemsArr.length) > 0) {
190
+ // if there are a few listItems we are checking their types (can be sections) - if we have
191
+ // a few of 'items' type - we know that the list is not empty
192
+ if (listItemsArr[0].type === 'item') {
193
+ isListHasItems = true;
194
+ } else {
195
+ // this path will be taken if there are a few 'sections'
196
+ // - we need to go check them recursively
197
+ (0, _forEach["default"])(listItemsArr).call(listItemsArr, function (item) {
198
+ return f(item);
199
+ });
200
+ }
201
+ }
202
+ })(listBoxState);
203
+
204
+ return !isListHasItems;
205
+ }, [listBoxState]);
206
+
207
+ var _useOverlayTrigger = (0, _overlays2.useOverlayTrigger)({
208
+ type: 'listbox'
209
+ }, popoverState, triggerRef),
210
+ triggerProps = _useOverlayTrigger.triggerProps,
211
+ overlayProps = _useOverlayTrigger.overlayProps;
212
+
213
+ var handlePopoverOpen = function handlePopoverOpen() {
214
+ if (imperativeOnPopoverOpen) {
215
+ imperativeOnPopoverOpen();
216
+ }
217
+
218
+ popoverState.open();
219
+ };
220
+
221
+ var _useOverlayPosition = (0, _overlays2.useOverlayPosition)({
222
+ isOpen: popoverState.isOpen,
223
+ offset: 6,
224
+ onClose: handlePopoverClose,
225
+ overlayRef: overlayRef,
226
+ scrollRef: scrollBoxRef,
227
+ shouldUpdatePosition: true,
228
+ targetRef: triggerRef
229
+ }),
230
+ positionProps = _useOverlayPosition.overlayProps;
231
+
232
+ var EmptyListState = (0, _react2.jsx)(_index.Text, {
233
+ py: 10,
234
+ px: 15
235
+ }, emptySearchText);
236
+ var ItemsSelect = (0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_index.Button, (0, _extends2["default"])({}, triggerProps, {
237
+ onPress: handlePopoverOpen,
238
+ ref: triggerRef,
239
+ variant: "environmentBreadcrumb.current",
240
+ "aria-label": "".concat(typeof selectedItem === 'string' ? selectedItem : 'Selected Item')
241
+ }), selectedItem, (0, _react2.jsx)(_index.Icon, {
242
+ icon: popoverState.isOpen ? _ArrowDropUpIcon["default"] : _ArrowDropDownIcon["default"]
243
+ })), (0, _react2.jsx)(_index.PopoverContainer, (0, _extends2["default"])({}, overlayProps, positionProps, {
244
+ ref: overlayRef,
245
+ isOpen: popoverState.isOpen,
246
+ scrollRef: scrollBoxRef,
247
+ onClose: handlePopoverClose,
248
+ hasNoArrow: true,
249
+ isDismissable: true,
250
+ p: 10
251
+ }), (0, _react2.jsx)(_focus.FocusScope, {
252
+ restoreFocus: true,
253
+ autoFocus: true,
254
+ contain: true
255
+ }, (0, _react2.jsx)(_index.ScrollBox, {
256
+ ref: scrollBoxRef
257
+ }, (0, _react2.jsx)(_index.SearchField, (0, _extends2["default"])({
258
+ placeholder: "Search",
259
+ "aria-label": "Items Search",
260
+ "data-testid": "Environment-Breadcrumb-Search",
261
+ containerProps: {
262
+ // this one is needed to cancel default scrollBox items behavior
263
+ sx: {
264
+ overflow: 'visible'
265
+ }
266
+ },
267
+ onChange: setSearchValue
268
+ }, searchProps)), checkIfListEmpty() ? EmptyListState : (0, _react2.jsx)(_ListBox["default"], {
269
+ state: listBoxState,
270
+ "aria-label": "Items List"
271
+ })))));
272
+ var handleOnAction = (0, _react.useCallback)(function (actionKey) {
273
+ if (actionKey === 'name' && onNamePress) {
274
+ onNamePress();
275
+ }
276
+ }, [onNamePress]);
277
+ return (0, _react2.jsx)(_index.Breadcrumbs, (0, _extends2["default"])({
278
+ icon: _ChevronRightIcon["default"],
279
+ ref: breadcrumbsRef,
280
+ onAction: handleOnAction,
281
+ iconProps: {
282
+ color: 'neutral.70',
283
+ mx: 10
284
+ }
285
+ }, others), (0, _react2.jsx)(_index.Item, {
286
+ key: "name",
287
+ variant: "environmentBreadcrumb.current",
288
+ "data-testid": "name",
289
+ "aria-label": name
290
+ }, (0, _react2.jsx)(_index.Icon, {
291
+ icon: _HomeIcon["default"],
292
+ mr: 7
293
+ }), name), selectedItem && (0, _react2.jsx)(_index.Item, {
294
+ key: "itemsSelect",
295
+ elementType: "Fragment"
296
+ }, ItemsSelect));
297
+ });
298
+ var _default = EnvironmentBreadcrumb;
299
+ exports["default"] = _default;
300
+ EnvironmentBreadcrumb.propTypes = {
301
+ /** Callback function that fires when the selected key changes. */
302
+ onSelectionChange: _propTypes["default"].func,
303
+
304
+ /** Current environment */
305
+ selectedItem: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].node]),
306
+
307
+ /** Displayed name */
308
+ name: _propTypes["default"].string,
309
+
310
+ /** Callback function that fires when name pressed */
311
+ onNamePress: _propTypes["default"].func,
312
+
313
+ /** The list of environments. */
314
+ items: _isIterable.isIterableProp,
315
+
316
+ /** Filter function to generate a filtered list of nodes.
317
+ * (nodes: Iterable<Node>) => Iterable<Node>
318
+ * */
319
+ itemsFilter: _propTypes["default"].func,
320
+
321
+ /** Callback function that fires when the dropdown is opened. */
322
+ onPopoverOpen: _propTypes["default"].func,
323
+
324
+ /** Callback function that fires when the dropdown is closed. */
325
+ onPopoverClose: _propTypes["default"].func,
326
+
327
+ /** Props object that is spread directly into the SearchField element. */
328
+ searchProps: _propTypes["default"].shape({}),
329
+
330
+ /** Array of keys to disable within the options list. */
331
+ disabledKeys: _propTypes["default"].arrayOf(_propTypes["default"].string),
332
+
333
+ /** Text that will be shown if no search results found. */
334
+ emptySearchText: _propTypes["default"].string
335
+ };
336
+ EnvironmentBreadcrumb.defaultProps = {
337
+ emptySearchText: 'No Search Result'
338
+ };