@pingux/astro 2.92.1 → 2.93.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.
Files changed (40) hide show
  1. package/lib/cjs/components/ArrayField/ArrayField.js +10 -3
  2. package/lib/cjs/components/ArrayField/ArrayField.stories.d.ts +3 -0
  3. package/lib/cjs/components/ArrayField/ArrayField.stories.js +65 -2
  4. package/lib/cjs/components/ArrayField/ArrayField.test.js +26 -0
  5. package/lib/cjs/components/SelectField/Select.styles.d.ts +2 -0
  6. package/lib/cjs/components/SelectField/SelectField.d.ts +4 -0
  7. package/lib/cjs/components/SelectField/SelectField.js +18 -91
  8. package/lib/cjs/components/SelectField/SelectField.stories.d.ts +50 -0
  9. package/lib/cjs/components/SelectField/SelectField.stories.js +4 -1
  10. package/lib/cjs/components/SelectField/SelectField.test.d.ts +1 -0
  11. package/lib/cjs/components/SelectField/SelectField.test.js +20 -4
  12. package/lib/cjs/components/SelectField/index.d.ts +1 -0
  13. package/lib/cjs/components/SelectFieldBase/SelectFieldBase.d.ts +11 -0
  14. package/lib/cjs/components/SelectFieldBase/SelectFieldBase.js +26 -83
  15. package/lib/cjs/components/SelectFieldBase/SelectFieldBase.test.d.ts +1 -0
  16. package/lib/cjs/components/SelectFieldBase/SelectFieldBase.test.js +10 -4
  17. package/lib/cjs/components/SelectFieldBase/index.d.ts +1 -0
  18. package/lib/cjs/components/TextAreaField/TextAreaField.test.js +10 -9
  19. package/lib/cjs/hooks/useSelectField/useSelectField.d.ts +12 -7
  20. package/lib/cjs/types/TextAreaField.d.ts +2 -13
  21. package/lib/cjs/types/arrayField.d.ts +7 -3
  22. package/lib/cjs/types/selectField.d.ts +23 -0
  23. package/lib/cjs/types/selectField.js +6 -0
  24. package/lib/cjs/types/shared/dom.d.ts +1 -0
  25. package/lib/cjs/types/shared/fieldProps.d.ts +12 -0
  26. package/lib/cjs/types/shared/fieldProps.js +6 -0
  27. package/lib/cjs/types/textField.d.ts +2 -11
  28. package/lib/components/ArrayField/ArrayField.js +10 -3
  29. package/lib/components/ArrayField/ArrayField.stories.js +63 -1
  30. package/lib/components/ArrayField/ArrayField.test.js +26 -0
  31. package/lib/components/SelectField/Select.styles.js +1 -0
  32. package/lib/components/SelectField/SelectField.js +19 -92
  33. package/lib/components/SelectField/SelectField.stories.js +4 -1
  34. package/lib/components/SelectField/SelectField.test.js +20 -4
  35. package/lib/components/SelectFieldBase/SelectFieldBase.js +27 -84
  36. package/lib/components/SelectFieldBase/SelectFieldBase.test.js +10 -4
  37. package/lib/components/TextAreaField/TextAreaField.test.js +10 -9
  38. package/lib/types/selectField.js +1 -0
  39. package/lib/types/shared/fieldProps.js +1 -0
  40. package/package.json +1 -2
@@ -30,7 +30,7 @@ var _pendoID = require("../../utils/devUtils/constants/pendoID");
30
30
  var _statuses = _interopRequireDefault(require("../../utils/devUtils/constants/statuses"));
31
31
  var _ariaAttributes = require("../../utils/docUtils/ariaAttributes");
32
32
  var _react2 = require("@emotion/react");
33
- var _excluded = ["addButtonLabel", "defaultValue", "fieldControlWrapperProps", "value", "label", "helperText", "status", "onAdd", "onChange", "onDelete", "renderField", "labelProps", "maxSize", "maxSizeText"],
33
+ var _excluded = ["addButtonLabel", "defaultValue", "fieldControlWrapperProps", "value", "label", "helperText", "status", "onAdd", "onChange", "onDelete", "renderField", "labelProps", "maxSize", "maxSizeText", "slots"],
34
34
  _excluded2 = ["id", "onComponentRender", "fieldValue"];
35
35
  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); }
36
36
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -52,6 +52,7 @@ var ArrayField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
52
52
  labelProps = props.labelProps,
53
53
  maxSize = props.maxSize,
54
54
  maxSizeText = props.maxSizeText,
55
+ slots = props.slots,
55
56
  others = (0, _objectWithoutProperties2["default"])(props, _excluded);
56
57
  var valueRef = _react["default"].useRef(value);
57
58
  valueRef.current = value;
@@ -121,6 +122,9 @@ var ArrayField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
121
122
  raLabelProps = _useLabel.labelProps;
122
123
  var isLimitReached = !!maxSize && (value || fieldValues).length >= maxSize;
123
124
  var isDisabled = (value || fieldValues).length === 1;
125
+
126
+ // renders of the bottom bar if one or more of the components within it should render
127
+ var shouldShowBottomBar = !isLimitReached || (slots === null || slots === void 0 ? void 0 : slots.left) || (slots === null || slots === void 0 ? void 0 : slots.right);
124
128
  var renderedItem = (0, _react.useCallback)(function (id, fieldValue, otherFieldProps, onComponentRender, labelId) {
125
129
  if (onComponentRender) {
126
130
  return onComponentRender(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, labelId, otherFieldProps);
@@ -154,7 +158,10 @@ var ArrayField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
154
158
  status: status
155
159
  }, helperText), isLimitReached && (0, _react2.jsx)(_.FieldHelperText, {
156
160
  status: _statuses["default"].DEFAULT
157
- }, maxSizeText || "Maximum ".concat(maxSize, " items.")), !isLimitReached && (0, _react2.jsx)(_.Button, {
161
+ }, maxSizeText || "Maximum ".concat(maxSize, " items.")), shouldShowBottomBar && (0, _react2.jsx)(_.Box, {
162
+ isRow: true,
163
+ gap: "md"
164
+ }, (slots === null || slots === void 0 ? void 0 : slots.left) && (slots === null || slots === void 0 ? void 0 : slots.left), !isLimitReached && (0, _react2.jsx)(_.Button, {
158
165
  "aria-label": "Add field",
159
166
  variant: "link",
160
167
  onPress: onFieldAdd,
@@ -165,7 +172,7 @@ var ArrayField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
165
172
  }, (0, _react2.jsx)(_.Text, {
166
173
  variant: "label",
167
174
  color: "active"
168
- }, addButtonLabel)));
175
+ }, addButtonLabel)), (slots === null || slots === void 0 ? void 0 : slots.right) && (slots === null || slots === void 0 ? void 0 : slots.right)));
169
176
  });
170
177
  ArrayField.defaultProps = {
171
178
  addButtonLabel: '+ Add',
@@ -9,3 +9,6 @@ export declare const WithLimitedItemsNumber: StoryFn<ArrayFieldProps>;
9
9
  export declare const Customizations: ({ ...args }: {
10
10
  [x: string]: any;
11
11
  }) => React.JSX.Element;
12
+ export declare const WithBothSlots: ({ ...args }: {
13
+ [x: string]: any;
14
+ }) => React.JSX.Element;
@@ -12,7 +12,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
12
12
  _Object$defineProperty(exports, "__esModule", {
13
13
  value: true
14
14
  });
15
- exports["default"] = exports.WithLimitedItemsNumber = exports.Uncontrolled = exports.Customizations = exports.Controlled = void 0;
15
+ exports["default"] = exports.WithLimitedItemsNumber = exports.WithBothSlots = exports.Uncontrolled = exports.Customizations = exports.Controlled = void 0;
16
16
  var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
17
17
  var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
18
18
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
@@ -318,4 +318,67 @@ var Customizations = function Customizations(_ref5) {
318
318
  }
319
319
  }, args));
320
320
  };
321
- exports.Customizations = Customizations;
321
+ exports.Customizations = Customizations;
322
+ var WithBothSlots = function WithBothSlots(_ref6) {
323
+ var args = (0, _extends2["default"])({}, ((0, _objectDestructuringEmpty2["default"])(_ref6), _ref6));
324
+ var LeftSlot = (0, _react2.jsx)(_index.Button, {
325
+ "aria-label": "Add field",
326
+ variant: "link",
327
+ sx: {
328
+ width: 'fit-content',
329
+ mt: 'xs'
330
+ }
331
+ }, (0, _react2.jsx)(_index.Text, {
332
+ variant: "label",
333
+ color: "active"
334
+ }, "Left slot"));
335
+ var RightSlot = (0, _react2.jsx)(_index.Button, {
336
+ "aria-label": "Add field",
337
+ variant: "link",
338
+ sx: {
339
+ width: 'fit-content',
340
+ mt: 'xs'
341
+ }
342
+ }, (0, _react2.jsx)(_index.Text, {
343
+ variant: "label",
344
+ color: "active"
345
+ }, "Right slot"));
346
+ return (0, _react2.jsx)(_index.ArrayField, (0, _extends2["default"])({
347
+ defaultValue: defaultData,
348
+ sx: {
349
+ width: '450px'
350
+ },
351
+ labelProps: {
352
+ hintText: 'Example Hint',
353
+ isRequired: true,
354
+ helpHintProps: {
355
+ direction: 'top'
356
+ }
357
+ },
358
+ slots: {
359
+ left: LeftSlot,
360
+ right: RightSlot
361
+ },
362
+ renderField: function renderField(id, fieldValue, onFieldValueChange, onFieldDelete, isDisabled, otherFieldProps) {
363
+ return (0, _react2.jsx)(_index.Box, {
364
+ width: "400px"
365
+ }, (0, _react2.jsx)(_index.TextField, (0, _extends2["default"])({
366
+ "aria-label": "Text field",
367
+ value: fieldValue,
368
+ onChange: function onChange(e) {
369
+ return onFieldValueChange(e, id);
370
+ },
371
+ mr: "xs",
372
+ slots: {
373
+ inContainer: (0, _react2.jsx)(_index.ArrayFieldDeleteButton, {
374
+ isDisabled: isDisabled,
375
+ onDelete: function onDelete() {
376
+ return onFieldDelete(id);
377
+ }
378
+ })
379
+ }
380
+ }, otherFieldProps)));
381
+ }
382
+ }, args));
383
+ };
384
+ exports.WithBothSlots = WithBothSlots;
@@ -227,4 +227,30 @@ test('displays max size label if provided', function () {
227
227
  });
228
228
  expect(_testWrapper.screen.queryByText('+ Add')).not.toBeInTheDocument();
229
229
  expect(_testWrapper.screen.getByText(maxSizeText)).toBeInTheDocument();
230
+ });
231
+ test('renders left slot content', function () {
232
+ var leftSlotContent = (0, _react2.jsx)("div", {
233
+ "data-testid": "left-slot"
234
+ }, "Left Slot Content");
235
+ getComponent({
236
+ slots: {
237
+ left: leftSlotContent
238
+ }
239
+ });
240
+ var leftSlot = _testWrapper.screen.getByTestId('left-slot');
241
+ expect(leftSlot).toBeInTheDocument();
242
+ expect(leftSlot).toHaveTextContent('Left Slot Content');
243
+ });
244
+ test('renders right slot content', function () {
245
+ var rightSlotContent = (0, _react2.jsx)("div", {
246
+ "data-testid": "right-slot"
247
+ }, "Right Slot Content");
248
+ getComponent({
249
+ slots: {
250
+ right: rightSlotContent
251
+ }
252
+ });
253
+ var rightSlot = _testWrapper.screen.getByTestId('right-slot');
254
+ expect(rightSlot).toBeInTheDocument();
255
+ expect(rightSlot).toHaveTextContent('Right Slot Content');
230
256
  });
@@ -0,0 +1,2 @@
1
+ import { ThemeUICSSObject } from 'theme-ui';
2
+ export declare const select: ThemeUICSSObject;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { SelectFieldProps } from '../../types/selectField';
3
+ declare const SelectField: React.ForwardRefExoticComponent<SelectFieldProps<object> & React.RefAttributes<HTMLSelectElement>>;
4
+ export default SelectField;
@@ -19,10 +19,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/he
19
19
  var _objectDestructuringEmpty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectDestructuringEmpty"));
20
20
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
21
21
  var _react = _interopRequireWildcard(require("react"));
22
- var _propTypes = _interopRequireDefault(require("prop-types"));
23
22
  var _hooks = require("../../hooks");
24
- var _ariaAttributes = require("../../utils/docUtils/ariaAttributes");
25
- var _fieldAttributes = require("../../utils/docUtils/fieldAttributes");
26
23
  var _statusProp = require("../../utils/docUtils/statusProp");
27
24
  var _SelectFieldBase = _interopRequireDefault(require("../SelectFieldBase"));
28
25
  var _react2 = require("@emotion/react");
@@ -31,100 +28,30 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
31
28
  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; }
32
29
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
33
30
  var SelectField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
34
- var status = props.status;
31
+ /* istanbul ignore next */
32
+ var status = props.status,
33
+ _props$placeholder = props.placeholder,
34
+ placeholder = _props$placeholder === void 0 ? 'Select' : _props$placeholder,
35
+ _props$align = props.align,
36
+ align = _props$align === void 0 ? 'start' : _props$align,
37
+ _props$direction = props.direction,
38
+ direction = _props$direction === void 0 ? 'bottom' : _props$direction,
39
+ _props$scrollBoxProps = props.scrollBoxProps,
40
+ scrollBoxProps = _props$scrollBoxProps === void 0 ? {
41
+ margin: '300px'
42
+ } : _props$scrollBoxProps;
35
43
  (0, _hooks.usePropWarning)(props, 'disabled', 'isDisabled');
36
44
  var _useSelectField = (0, _hooks.useSelectField)(props, ref),
37
45
  selectFieldProps = (0, _extends2["default"])({}, ((0, _objectDestructuringEmpty2["default"])(_useSelectField), _useSelectField));
38
- return (0, _react2.jsx)(_SelectFieldBase["default"], (0, _extends2["default"])({}, props, selectFieldProps, {
46
+ return (0, _react2.jsx)(_SelectFieldBase["default"], (0, _extends2["default"])({
47
+ placeholder: placeholder,
48
+ align: align,
49
+ direction: direction,
50
+ scrollBoxProps: scrollBoxProps
51
+ }, props, selectFieldProps, {
39
52
  "aria-invalid": status === 'error' && true
40
53
  }));
41
54
  });
42
- SelectField.propTypes = _objectSpread(_objectSpread(_objectSpread({
43
- /** Alignment of the popover menu relative to the trigger. */
44
- align: _propTypes["default"].oneOf(['start', 'end', 'middle']),
45
- /** Where the popover menu opens relative to its trigger. */
46
- direction: _propTypes["default"].oneOf(['top', 'right', 'bottom', 'left']),
47
- /** The initial selected key in the collection (uncontrolled). */
48
- defaultSelectedKey: _propTypes["default"].string,
49
- /** Default text rendered if no option is selected. Deprecated. */
50
- defaultText: _propTypes["default"].string,
51
- /** Array of keys to disable within the options list. */
52
- disabledKeys: _propTypes["default"].arrayOf(_propTypes["default"].string),
53
- /** Whether the collection allows empty selection. */
54
- hasNoEmptySelection: _propTypes["default"].bool,
55
- /** Whether the field has a status indicator. */
56
- hasNoStatusIndicator: _propTypes["default"].bool,
57
- /** Text rendered below the input. */
58
- helperText: _propTypes["default"].node,
59
- /** If present this prop will cause a help hint to render in the label of the field. */
60
- hintText: _propTypes["default"].string,
61
- /** Sets the default open state of the menu. */
62
- isDefaultOpen: _propTypes["default"].bool,
63
- /** Whether the input is disabled. */
64
- isDisabled: _propTypes["default"].bool,
65
- /** Whether the items are currently loading. */
66
- isLoading: _propTypes["default"].bool,
67
- /** @ignore Whether the menu should automatically flip direction when space is limited. */
68
- isNotFlippable: _propTypes["default"].bool,
69
- /** Sets the open state of the menu. */
70
- isOpen: _propTypes["default"].bool,
71
- /** @ignore Whether the input can be selected but not changed by the user. */
72
- isReadOnly: _propTypes["default"].bool,
73
- /** Whether user input is required on the input before form submission. */
74
- isRequired: _propTypes["default"].bool,
75
- /**
76
- * *For performance reasons, use this prop instead of Array.map when iteratively rendering Items*.
77
- * For use with [dynamic collections](https://react-spectrum.adobe.com/react-stately/collections.html#dynamic-collections).
78
- */
79
- items: _propTypes["default"].arrayOf(_propTypes["default"].shape({})),
80
- /** The label for the select element. */
81
- label: _propTypes["default"].node,
82
- /** The name for the select element, used when submitting a form. */
83
- name: _propTypes["default"].string,
84
- /** Temporary text that occupies the text input when it is empty. */
85
- placeholder: _propTypes["default"].string,
86
- /** The currently selected key in the collection (controlled). */
87
- selectedKey: _propTypes["default"].string,
88
- /** Determines the textarea status indicator and helper text styling. Eg. float. */
89
- labelMode: _propTypes["default"].string,
90
- /**
91
- * Handler that is called when more items should be loaded, e.g. while scrolling near the bottom.
92
- *
93
- * () => any
94
- */
95
- onLoadMore: _propTypes["default"].func,
96
- /**
97
- * Method that is called when the open state of the menu changes.
98
- *
99
- * (isOpen: boolean) => void
100
- */
101
- onOpenChange: _propTypes["default"].func,
102
- /**
103
- * Handler that is called when the selection changes.
104
- *
105
- * (key: Key) => any
106
- */
107
- onSelectionChange: _propTypes["default"].func
108
- }, _fieldAttributes.inputFieldAttributesBasePropTypes), {}, {
109
- /** Provides a way to insert markup in specified places. */
110
- slots: _propTypes["default"].shape({
111
- /** The given node will be inserted before the text in field container. */
112
- leftOfData: _propTypes["default"].node,
113
- /** The given node will be inserted into the field container. */
114
- inContainer: _propTypes["default"].node
115
- }),
116
- /**
117
- * Props object passed along to `useSelect` from React Aria, `useSelectState` from React Stately,
118
- * and/or the visible button representation for the select input.
119
- */
120
- controlProps: _propTypes["default"].shape({}),
121
- /** Props object that is spread directly into the ScrollBox element. */
122
- // /** Props object that is spread directly into the ScrollBox element. */
123
- /** @ignore */
124
- scrollBoxProps: _propTypes["default"].shape({
125
- maxHeight: _propTypes["default"].string
126
- })
127
- }, _statusProp.statusPropTypes), _ariaAttributes.ariaAttributesBasePropTypes);
128
55
  SelectField.defaultProps = _objectSpread({
129
56
  placeholder: 'Select',
130
57
  align: 'start',
@@ -0,0 +1,50 @@
1
+ import React, { Key } from 'react';
2
+ export type SelectItemProps = {
3
+ name?: string;
4
+ id?: string;
5
+ key?: Key;
6
+ };
7
+ export type SelectSectionProps = {
8
+ name?: string;
9
+ key?: string;
10
+ children?: SelectItemProps[];
11
+ };
12
+ declare const _default: {
13
+ title: string;
14
+ component: React.ForwardRefExoticComponent<import("../../types/selectField").SelectFieldProps<object> & React.RefAttributes<HTMLSelectElement>>;
15
+ parameters: {
16
+ docs: {
17
+ page: () => React.JSX.Element;
18
+ source: {
19
+ type: string;
20
+ };
21
+ };
22
+ };
23
+ argTypes: any;
24
+ args: {
25
+ label: string;
26
+ labelMode: string;
27
+ };
28
+ };
29
+ export default _default;
30
+ export declare const Default: (args: any) => React.JSX.Element;
31
+ export declare const WithSections: (args: any) => React.JSX.Element;
32
+ export declare const WithCustomHeight: (args: any) => React.JSX.Element;
33
+ export declare const FloatLabel: () => React.JSX.Element;
34
+ export declare const Controlled: () => React.JSX.Element;
35
+ export declare const WithNoneOption: () => React.JSX.Element;
36
+ export declare const WithSlots: () => React.JSX.Element;
37
+ export declare const DisabledField: () => React.JSX.Element;
38
+ export declare const DisabledOptions: () => React.JSX.Element;
39
+ export declare const NoOptionsAvailable: () => React.JSX.Element;
40
+ export declare const HelperText: () => React.JSX.Element;
41
+ export declare const DynamicItems: {
42
+ (): React.JSX.Element;
43
+ parameters: {
44
+ docs: {
45
+ storyDescription: string;
46
+ };
47
+ };
48
+ };
49
+ export declare const AsyncLoading: () => React.JSX.Element;
50
+ export declare const WithoutStatusIndicator: () => React.JSX.Element;
@@ -351,7 +351,10 @@ var HelperText = function HelperText() {
351
351
  }, "Yellow"));
352
352
  };
353
353
  exports.HelperText = HelperText;
354
- var options = (0, _map["default"])(_context = (0, _fill["default"])(_context2 = new Array(200)).call(_context2)).call(_context, function (_, i) {
354
+ var options = (0, _map["default"])(_context = (0, _fill["default"])(_context2 = new Array(200)).call(_context2, {
355
+ key: 'string',
356
+ name: 'string'
357
+ })).call(_context, function (_, i) {
355
358
  return {
356
359
  key: "option-".concat(i),
357
360
  name: "Option ".concat(i)
@@ -20,7 +20,7 @@ var items = [{
20
20
  var withSection = [{
21
21
  name: 'Animals',
22
22
  key: 'Animals',
23
- kids: [{
23
+ children: [{
24
24
  name: 'Aardvark'
25
25
  }, {
26
26
  name: 'Kangaroo'
@@ -30,7 +30,7 @@ var withSection = [{
30
30
  }, {
31
31
  name: 'People',
32
32
  key: 'People',
33
- kids: [{
33
+ children: [{
34
34
  name: 'Michael'
35
35
  }, {
36
36
  name: 'Dwight'
@@ -40,7 +40,7 @@ var withSection = [{
40
40
  }, {
41
41
  name: null,
42
42
  key: 'Fruit',
43
- kids: [{
43
+ children: [{
44
44
  name: 'Apple'
45
45
  }, {
46
46
  name: 'Strawberry'
@@ -81,7 +81,7 @@ var getComponentWithSections = function getComponentWithSections() {
81
81
  }), function (section) {
82
82
  return (0, _react2.jsx)(_index.Section, {
83
83
  key: section.key,
84
- items: section.kids,
84
+ items: section.children,
85
85
  title: section.name
86
86
  }, function (item) {
87
87
  return (0, _react2.jsx)(_index.Item, {
@@ -155,4 +155,20 @@ test('a blank title does not render', function () {
155
155
  var button = _testWrapper.screen.getByRole('button');
156
156
  _userEvent["default"].click(button);
157
157
  expect(_testWrapper.screen.queryByText('Fruit')).not.toBeInTheDocument();
158
+ });
159
+ test('renders placeholder text', function () {
160
+ var placeholderText = 'Select an option';
161
+ getComponent({
162
+ placeholder: placeholderText
163
+ });
164
+ var placeholder = _testWrapper.screen.getByText(placeholderText);
165
+ expect(placeholder).toBeInTheDocument();
166
+ });
167
+ test('renders default placeholder text', function () {
168
+ var placeholderText = 'Select';
169
+ getComponent({
170
+ placeholder: placeholderText
171
+ });
172
+ var placeholder = _testWrapper.screen.getByText(placeholderText);
173
+ expect(placeholder).toBeInTheDocument();
158
174
  });
@@ -0,0 +1 @@
1
+ export { default } from './SelectField';
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { SelectFieldBaseProps } from '../../types/selectField';
3
+ /**
4
+ * Select field (dropdown) that does not rely on native browser or mobile implementations.
5
+ *
6
+ * Utilizes [useSelect](https://react-spectrum.adobe.com/react-aria/useSelect.html) from React Aria
7
+ * and [useSelectState](https://react-spectrum.adobe.com/react-stately/useSelectState.html) from
8
+ * React Stately.
9
+ */
10
+ declare const SelectFieldBase: React.ForwardRefExoticComponent<SelectFieldBaseProps & React.RefAttributes<HTMLSelectElement>>;
11
+ export default SelectFieldBase;
@@ -15,19 +15,16 @@ _Object$defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
17
  exports["default"] = void 0;
18
- var _values = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/values"));
19
18
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
20
19
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
21
20
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
22
21
  var _react = _interopRequireWildcard(require("react"));
23
22
  var _reactAria = require("react-aria");
24
- var _propTypes = _interopRequireDefault(require("prop-types"));
25
23
  var _uuid = require("uuid");
26
24
  var _useGetTheme2 = _interopRequireDefault(require("../../hooks/useGetTheme"));
27
25
  var _labelModes = require("../../utils/devUtils/constants/labelModes");
28
26
  var _pendoID = require("../../utils/devUtils/constants/pendoID");
29
27
  var _ariaAttributes = require("../../utils/docUtils/ariaAttributes");
30
- var _statusProp = require("../../utils/docUtils/statusProp");
31
28
  var _Box = _interopRequireDefault(require("../Box"));
32
29
  var _Button = _interopRequireDefault(require("../Button"));
33
30
  var _FieldHelperText = _interopRequireDefault(require("../FieldHelperText"));
@@ -48,33 +45,34 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "functi
48
45
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
49
46
  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; }
50
47
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
51
- var SelectFieldBase = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
52
- var columnStyleProps = _ref.columnStyleProps,
53
- defaultText = _ref.defaultText,
54
- fieldContainerProps = _ref.fieldContainerProps,
55
- fieldControlInputProps = _ref.fieldControlInputProps,
56
- fieldControlWrapperProps = _ref.fieldControlWrapperProps,
57
- fieldLabelProps = _ref.fieldLabelProps,
58
- helperText = _ref.helperText,
59
- isLoadingInitial = _ref.isLoadingInitial,
60
- label = _ref.label,
61
- labelMode = _ref.labelMode,
62
- name = _ref.name,
63
- overlay = _ref.overlay,
64
- placeholder = _ref.placeholder,
65
- slots = _ref.slots,
66
- state = _ref.state,
67
- status = _ref.status,
68
- trigger = _ref.trigger,
69
- triggerProps = _ref.triggerProps,
70
- triggerRef = _ref.triggerRef,
71
- valueProps = _ref.valueProps,
72
- others = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
48
+ var SelectFieldBase = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
49
+ var columnStyleProps = props.columnStyleProps,
50
+ defaultText = props.defaultText,
51
+ fieldContainerProps = props.fieldContainerProps,
52
+ fieldControlInputProps = props.fieldControlInputProps,
53
+ fieldControlWrapperProps = props.fieldControlWrapperProps,
54
+ fieldLabelProps = props.fieldLabelProps,
55
+ helperText = props.helperText,
56
+ isLoadingInitial = props.isLoadingInitial,
57
+ label = props.label,
58
+ labelMode = props.labelMode,
59
+ name = props.name,
60
+ overlay = props.overlay,
61
+ placeholder = props.placeholder,
62
+ slots = props.slots,
63
+ state = props.state,
64
+ status = props.status,
65
+ trigger = props.trigger,
66
+ triggerProps = props.triggerProps,
67
+ triggerRef = props.triggerRef,
68
+ valueProps = props.valueProps,
69
+ others = (0, _objectWithoutProperties2["default"])(props, _excluded);
73
70
  var _getAriaAttributeProp = (0, _ariaAttributes.getAriaAttributeProps)(others),
74
71
  ariaProps = _getAriaAttributeProp.ariaProps;
75
72
  var _useGetTheme = (0, _useGetTheme2["default"])(),
76
73
  icons = _useGetTheme.icons;
77
- var MenuDown = icons.MenuDown;
74
+ var MenuDown = icons.MenuDown,
75
+ MenuUp = icons.MenuUp;
78
76
  var helperTextId = (0, _react.useMemo)(function () {
79
77
  return (0, _uuid.v4)();
80
78
  }, []);
@@ -98,14 +96,11 @@ var SelectFieldBase = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
98
96
  "aria-hidden": "true",
99
97
  variant: "forms.select.arrow"
100
98
  }, (0, _react2.jsx)(_Icon["default"], {
101
- icon: MenuDown,
99
+ icon: state.isOpen ? MenuUp : MenuDown,
102
100
  title: {
103
101
  name: 'Menu down'
104
102
  },
105
- size: "md",
106
- sx: state.isOpen ? {
107
- transform: 'rotate(180deg)'
108
- } : null
103
+ size: "md"
109
104
  }))), slots === null || slots === void 0 ? void 0 : slots.inContainer);
110
105
  return (0, _react2.jsx)(_Box["default"], (0, _extends2["default"])({
111
106
  ref: ref,
@@ -123,57 +118,5 @@ var SelectFieldBase = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
123
118
  id: helperTextId
124
119
  }, helperText));
125
120
  });
126
- SelectFieldBase.propTypes = _objectSpread(_objectSpread({
127
- /** Default text rendered if no option is selected. Deprecated. */
128
- defaultText: _propTypes["default"].string,
129
- /** Text rendered below the input. */
130
- helperText: _propTypes["default"].node,
131
- /** The label for the select element. */
132
- label: _propTypes["default"].node,
133
- /** Determines the textarea status indicator and helper text styling. Eg. float. */
134
- labelMode: _propTypes["default"].oneOf((0, _values["default"])(_labelModes.modes)),
135
- /** The name for the select element, used when submitting a form. */
136
- name: _propTypes["default"].string,
137
- /** Temporary text that occupies the text input when it is empty. */
138
- placeholder: _propTypes["default"].string,
139
- /** Determines whether to use column styles. */
140
- columnStyleProps: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].shape({})]),
141
- /** Determines props that applied to root container. */
142
- fieldContainerProps: _propTypes["default"].shape({
143
- sx: _propTypes["default"].shape({})
144
- }),
145
- /** Determines props that applied to control field. */
146
- fieldControlInputProps: _propTypes["default"].shape({
147
- className: _propTypes["default"].string
148
- }),
149
- /** Determines props that applied to label of field. */
150
- fieldLabelProps: _propTypes["default"].shape({}),
151
- /** Determines whether elements are loading and whether they haven't already appeared in list. */
152
- isLoadingInitial: _propTypes["default"].bool,
153
- /** Container for list with options */
154
- overlay: _propTypes["default"].node,
155
- /** State returned by useSelectState */
156
- state: _propTypes["default"].shape({
157
- isOpen: _propTypes["default"].bool,
158
- selectedItem: _propTypes["default"].shape({
159
- rendered: _propTypes["default"].node
160
- })
161
- }),
162
- /** Provides a way to insert markup in specified places. */
163
- slots: _propTypes["default"].shape({
164
- /** The given node will be inserted before the text in field container. */
165
- leftOfData: _propTypes["default"].node,
166
- /** The given node will be inserted into the field container. */
167
- inContainer: _propTypes["default"].node
168
- }),
169
- /** Control for interaction with SelectField */
170
- trigger: _propTypes["default"].node,
171
- /** Props for the popup trigger element. */
172
- triggerProps: _propTypes["default"].shape({}),
173
- /** Determines ref that applied to control */
174
- triggerRef: _propTypes["default"].shape({}),
175
- /** Props for the element representing the selected value. */
176
- valueProps: _propTypes["default"].shape({})
177
- }, _statusProp.statusPropTypes), _ariaAttributes.ariaAttributesBasePropTypes);
178
121
  var _default = SelectFieldBase;
179
122
  exports["default"] = _default;
@@ -81,7 +81,8 @@ beforeAll(function () {
81
81
  return 1024;
82
82
  });
83
83
  jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) {
84
- return cb();
84
+ cb(0);
85
+ return 0;
85
86
  });
86
87
  jest.useFakeTimers();
87
88
  });
@@ -165,7 +166,9 @@ test('clicking on the visible button opens the popuplist', function () {
165
166
  var button = _testWrapper.screen.getByRole('button');
166
167
  expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
167
168
  expect(_testWrapper.screen.queryByRole('option')).not.toBeInTheDocument();
168
- _userEvent["default"].click(button);
169
+ if (button) {
170
+ _userEvent["default"].click(button);
171
+ }
169
172
  expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
170
173
  expect(_testWrapper.screen.queryAllByRole('option')).toHaveLength(3);
171
174
  });
@@ -181,7 +184,7 @@ test('clicking on an option then renders its text in the button', function () {
181
184
  _userEvent["default"].click(button);
182
185
  var options = _testWrapper.screen.queryAllByRole('option');
183
186
  _userEvent["default"].click(options[0]);
184
- expect(button).toHaveTextContent(options[0].textContent);
187
+ expect(button).toHaveTextContent(items[0].name);
185
188
  });
186
189
  test('hovering an option applies correct styles', function () {
187
190
  getComponent();
@@ -306,7 +309,10 @@ test('two listbox can not be open at the same time', function () {
306
309
  test('Item accepts a data-id and the data-id can be found in the DOM', function () {
307
310
  getComponent();
308
311
  var button = _testWrapper.screen.queryByRole('button');
309
- _userEvent["default"].click(button);
312
+ expect(button).toBeInTheDocument();
313
+ if (button) {
314
+ _userEvent["default"].click(button);
315
+ }
310
316
  var options = _testWrapper.screen.queryAllByRole('option');
311
317
  expect(options).toHaveLength(items.length);
312
318
  expect(options[0]).toHaveAttribute('data-id', items[0].name);
@@ -0,0 +1 @@
1
+ export { default } from './SelectFieldBase';