@pingux/astro 2.220.0 → 2.221.1-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.
Files changed (33) hide show
  1. package/lib/cjs/components/AIComponents/PromptInput/PromptInput.js +4 -1
  2. package/lib/cjs/components/FileInputField/FileInputField.d.ts +8 -0
  3. package/lib/cjs/components/FileInputField/FileInputField.js +19 -77
  4. package/lib/cjs/components/FileInputField/FileInputField.stories.js +7 -10
  5. package/lib/cjs/components/FileInputField/FileInputField.styles.d.ts +47 -0
  6. package/lib/cjs/components/FileInputField/FileInputField.test.js +3 -2
  7. package/lib/cjs/components/FileInputField/FileItem.d.ts +4 -0
  8. package/lib/cjs/components/FileInputField/FileItem.js +8 -16
  9. package/lib/cjs/components/FileInputField/FileSelect.d.ts +4 -0
  10. package/lib/cjs/components/FileInputField/FileSelect.js +1 -18
  11. package/lib/cjs/components/FileInputField/index.d.ts +1 -0
  12. package/lib/cjs/components/PhoneNumberField/PhoneNumberField.js +17 -7
  13. package/lib/cjs/components/PhoneNumberField/PhoneNumberField.test.js +111 -0
  14. package/lib/cjs/styles/themes/next-gen/next-gen.d.ts +5 -1
  15. package/lib/cjs/styles/themes/next-gen/variants/variants.d.ts +5 -1
  16. package/lib/cjs/styles/themes/next-gen/variants/variants.js +5 -1
  17. package/lib/cjs/types/fileInputField.d.ts +106 -0
  18. package/lib/cjs/types/fileInputField.js +6 -0
  19. package/lib/cjs/types/index.d.ts +1 -0
  20. package/lib/cjs/types/index.js +60 -49
  21. package/lib/cjs/types/input.d.ts +4 -3
  22. package/lib/components/AIComponents/PromptInput/PromptInput.js +4 -1
  23. package/lib/components/FileInputField/FileInputField.js +20 -78
  24. package/lib/components/FileInputField/FileInputField.stories.js +7 -10
  25. package/lib/components/FileInputField/FileInputField.test.js +3 -2
  26. package/lib/components/FileInputField/FileItem.js +8 -16
  27. package/lib/components/FileInputField/FileSelect.js +2 -20
  28. package/lib/components/PhoneNumberField/PhoneNumberField.js +17 -7
  29. package/lib/components/PhoneNumberField/PhoneNumberField.test.js +112 -1
  30. package/lib/styles/themes/next-gen/variants/variants.js +5 -1
  31. package/lib/types/fileInputField.js +1 -0
  32. package/lib/types/index.js +1 -0
  33. package/package.json +2 -2
@@ -24,16 +24,13 @@ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo
24
24
  import { mergeProps, useVisuallyHidden, VisuallyHidden } from 'react-aria';
25
25
  import { useDropzone } from 'react-dropzone';
26
26
  import pluralize from 'pluralize';
27
- import PropTypes from 'prop-types';
28
27
  import { v4 as uuidv4 } from 'uuid';
29
28
  import { Box, FieldHelperText, Input, Label, Loader } from '../..';
30
29
  import useField from '../../hooks/useField';
31
30
  import useStatusClasses from '../../hooks/useStatusClasses';
32
31
  import { getPendoID } from '../../utils/devUtils/constants/pendoID';
33
32
  import statuses from '../../utils/devUtils/constants/statuses';
34
- import { ariaAttributesBasePropTypes, getAriaAttributeProps } from '../../utils/docUtils/ariaAttributes';
35
- import { inputFieldAttributesBasePropTypes } from '../../utils/docUtils/fieldAttributes';
36
- import { statusDefaultProp, statusPropTypes } from '../../utils/docUtils/statusProp';
33
+ import { getAriaAttributeProps } from '../../utils/docUtils/ariaAttributes';
37
34
  import FileItem from './FileItem';
38
35
  import FileSelect from './FileSelect';
39
36
  import FileSelectIcon from './FileSelectIcon';
@@ -58,7 +55,8 @@ export var filterFileTypes = function filterFileTypes(_ref) {
58
55
  };
59
56
  var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
60
57
  var buttonProps = props.buttonProps,
61
- defaultButtonText = props.defaultButtonText,
58
+ _props$defaultButtonT = props.defaultButtonText,
59
+ defaultButtonText = _props$defaultButtonT === void 0 ? 'Select a file' : _props$defaultButtonT,
62
60
  defaultFileList = props.defaultFileList,
63
61
  uploadedFilesImperative = props.fileList,
64
62
  helperText = props.helperText,
@@ -71,7 +69,8 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
71
69
  label = props.label,
72
70
  onFileSelect = props.onFileSelect,
73
71
  onRemove = props.onRemove,
74
- status = props.status,
72
+ _props$status = props.status,
73
+ status = _props$status === void 0 ? 'default' : _props$status,
75
74
  textProps = props.textProps,
76
75
  fileTypes = props.fileTypes,
77
76
  others = _objectWithoutProperties(props, _excluded);
@@ -87,7 +86,7 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
87
86
  _useState6 = _slicedToArray(_useState5, 2),
88
87
  fileChangeMessage = _useState6[0],
89
88
  setFileChangeMessage = _useState6[1];
90
- var inputRef = useRef();
89
+ var inputRef = useRef(null);
91
90
  /* istanbul ignore next */
92
91
  useImperativeHandle(ref, function () {
93
92
  return inputRef.current;
@@ -104,11 +103,14 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
104
103
  fieldControlInputProps = _useField.fieldControlInputProps,
105
104
  fieldControlWrapperProps = _useField.fieldControlWrapperProps,
106
105
  fieldLabelProps = _useField.fieldLabelProps;
107
- var helperTextId = uuidv4();
106
+ var helperTextId = useMemo(function () {
107
+ return uuidv4();
108
+ }, []);
108
109
  var _useVisuallyHidden = useVisuallyHidden(),
109
110
  visuallyHiddenProps = _useVisuallyHidden.visuallyHiddenProps;
110
111
  var handleFileSelect = useCallback(function () {
111
- inputRef.current.value = null;
112
+ if (!inputRef.current) return;
113
+ inputRef.current.value = '';
112
114
  inputRef.current.click();
113
115
  }, [inputRef]);
114
116
  useEffect(function () {
@@ -116,7 +118,7 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
116
118
  // update/delete file status update on Safari
117
119
 
118
120
  if (status === statuses.ERROR) {
119
- setFileChangeMessage(helperText);
121
+ setFileChangeMessage(typeof helperText === 'string' ? helperText : '');
120
122
  } else if (fileChangeStatus) {
121
123
  var _context;
122
124
  setFileChangeMessage(_concatInstanceProperty(_context = "".concat(pluralize('file', fileChangeStatus.fileCount, true), " ")).call(_context, fileChangeStatus.status, " successfully"));
@@ -174,6 +176,7 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
174
176
  var handleOnChange = function handleOnChange(event) {
175
177
  handleFileUpload(event, event.target.files);
176
178
  };
179
+ var mergedInputProps = mergeProps(visuallyHiddenProps, fieldControlInputProps, getInputProps());
177
180
  var filesListNode = useMemo(function () {
178
181
  var handleFileDelete = function handleFileDelete(e, fileId) {
179
182
  setFileChangeMessage('');
@@ -228,7 +231,7 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
228
231
  }, getRootProps(), {
229
232
  // to pass accessibility test, this removes focusable dependents
230
233
  role: "none"
231
- }), ___EmotionJSX(Input, _extends({}, mergeProps(visuallyHiddenProps, fieldControlInputProps, getInputProps()), {
234
+ }), ___EmotionJSX(Input, _extends({}, mergedInputProps, {
232
235
  multiple: isMultiple,
233
236
  onChange: handleOnChange,
234
237
  ref: inputRef,
@@ -236,10 +239,11 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
236
239
  accept: fileTypes ? fileTypes === null || fileTypes === void 0 ? void 0 : fileTypes.join(',') : '*'
237
240
  })), filesListNode, shouldFileSelectRender() && (isIconButton ? ___EmotionJSX(FileSelectIcon, _extends({
238
241
  handleFileSelect: handleFileSelect,
239
- iconContainerProps: iconContainerProps,
240
- buttonProps: buttonProps,
241
- iconProps: iconProps,
242
- isDisabled: isDisabled || isLoading
242
+ iconContainerProps: iconContainerProps !== null && iconContainerProps !== void 0 ? iconContainerProps : {},
243
+ buttonProps: _objectSpread(_objectSpread({}, buttonProps), {}, {
244
+ isDisabled: isDisabled || isLoading
245
+ }),
246
+ iconProps: iconProps !== null && iconProps !== void 0 ? iconProps : {}
243
247
  }, ariaProps)) : ___EmotionJSX(FileSelect, _extends({
244
248
  buttonText: defaultButtonText,
245
249
  handleFileSelect: handleFileSelect,
@@ -252,7 +256,7 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
252
256
  },
253
257
  "data-testid": "file-input-field__loader"
254
258
  })), helperText && ___EmotionJSX(Box, {
255
- "aria-label": helperText,
259
+ "aria-label": typeof helperText === 'string' ? helperText : undefined,
256
260
  role: "marquee"
257
261
  }, ___EmotionJSX(FieldHelperText, {
258
262
  status: status,
@@ -264,66 +268,4 @@ var FileInputField = /*#__PURE__*/forwardRef(function (props, ref) {
264
268
  }, ___EmotionJSX(VisuallyHidden, null, ___EmotionJSX("h1", null, fileChangeMessage))));
265
269
  });
266
270
  FileInputField.displayName = displayName;
267
- FileInputField.propTypes = _objectSpread(_objectSpread(_objectSpread({
268
- /** The rendered label for the field. */
269
- label: PropTypes.node,
270
- /** Text rendered below the input. */
271
- helperText: PropTypes.node,
272
- /** Default button text that will be changed on the file name once file is uploaded */
273
- defaultButtonText: PropTypes.string,
274
- /** Defines whether input can accept multiple files or not */
275
- isMultiple: PropTypes.bool,
276
- /** Determines whether the loading indicator is shown. */
277
- isLoading: PropTypes.bool,
278
- /** Whether the field is disabled. */
279
- isDisabled: PropTypes.bool,
280
- /** Array of objects for uploaded files.
281
- * Objects should have the following structure:
282
- *
283
- * {
284
- *
285
- * fileObj: File object (optional),
286
- *
287
- * id: file id (required - will be returned on delete),
288
- *
289
- * name: file name that will be displayed (required - will be displayed),
290
- *
291
- * downloadLink: link for the file download (optional),
292
- *
293
- * status: file status (if error - icon of the
294
- * component will be red icon and warning sign)(optional),
295
- *
296
- * }
297
- * */
298
- fileList: PropTypes.arrayOf(PropTypes.shape(_objectSpread({
299
- fileObj: PropTypes.shape({}),
300
- id: PropTypes.string.isRequired,
301
- name: PropTypes.string.isRequired,
302
- downloadLink: PropTypes.string
303
- }, statusPropTypes))),
304
- /** Default array of objects for uploaded files. */
305
- defaultFileList: PropTypes.arrayOf(PropTypes.shape(_objectSpread({
306
- fileObj: PropTypes.shape({}),
307
- id: PropTypes.string.isRequired,
308
- name: PropTypes.string.isRequired,
309
- downloadLink: PropTypes.string
310
- }, statusPropTypes))),
311
- /** The handler that is called when the input files is uploaded.
312
- *
313
- * `(event, files) => void`
314
- * */
315
- onFileSelect: PropTypes.func,
316
- /** The handler that is called when an uploaded file got removed.
317
- *
318
- * `(fileId) => void`
319
- * */
320
- onRemove: PropTypes.func,
321
- /** These props will be spread to the field text component. */
322
- textProps: PropTypes.shape({}),
323
- /** Props object that is spread directly into the helphint element. */
324
- helpHintProps: PropTypes.shape({})
325
- }, statusPropTypes), ariaAttributesBasePropTypes), inputFieldAttributesBasePropTypes);
326
- FileInputField.defaultProps = _objectSpread({
327
- defaultButtonText: 'Select a file'
328
- }, statusDefaultProp);
329
271
  export default FileInputField;
@@ -103,7 +103,6 @@ export var ControlledState = function ControlledState(args) {
103
103
  error = _useState4[0],
104
104
  setError = _useState4[1];
105
105
  var handleFileSelect = function handleFileSelect(event, files) {
106
- // this is approximate conversion just for an example
107
106
  var uploadedFileSizeMb = files[0].size / 1e6;
108
107
  if (uploadedFileSizeMb > 2) {
109
108
  setError('Only files under 2 MB can be uploaded.');
@@ -113,14 +112,12 @@ export var ControlledState = function ControlledState(args) {
113
112
  name: files[0].name,
114
113
  downloadLink: 'link for testing purposes'
115
114
  }]);
116
- setError(null);
115
+ setError(undefined);
117
116
  }
118
117
  };
119
-
120
- // you would want to handle this differently in case you have multiple files
121
118
  var handleFileRemove = function handleFileRemove() {
122
119
  setUserFiles([]);
123
- setError(null);
120
+ setError(undefined);
124
121
  };
125
122
  return ___EmotionJSX(FileInputField, _extends({}, args, {
126
123
  label: "Controlled State With limit on file size upload below 2 mb",
@@ -128,7 +125,7 @@ export var ControlledState = function ControlledState(args) {
128
125
  onRemove: handleFileRemove,
129
126
  fileList: userFiles,
130
127
  sx: fitContentWidthSx,
131
- status: error && statuses.ERROR,
128
+ status: error ? statuses.ERROR : undefined,
132
129
  helperText: error,
133
130
  isMultiple: true
134
131
  }));
@@ -213,13 +210,13 @@ export var WithFileTypePdfAndImage = function WithFileTypePdfAndImage() {
213
210
  _useState6 = _slicedToArray(_useState5, 2),
214
211
  error = _useState6[0],
215
212
  setError = _useState6[1];
216
- var handleFileSelect = function handleFileSelect(event, files) {
213
+ var handleFileSelect = function handleFileSelect(_event, files) {
217
214
  var uploadedFileType = files[0].type;
218
215
  var isValidFileType = _someInstanceProperty(fileTypes).call(fileTypes, function (fileType) {
219
216
  return uploadedFileType.search(fileType) !== -1;
220
217
  });
221
218
  if (isValidFileType) {
222
- setError(null);
219
+ setError(undefined);
223
220
  } else {
224
221
  setError('Not a valid File Type. Only PDF and Image files are allowed.');
225
222
  }
@@ -230,9 +227,9 @@ export var WithFileTypePdfAndImage = function WithFileTypePdfAndImage() {
230
227
  fileTypes: fileTypes,
231
228
  onFileSelect: handleFileSelect,
232
229
  onRemove: function onRemove() {
233
- return setError(null);
230
+ return setError(undefined);
234
231
  },
235
- status: error && statuses.ERROR,
232
+ status: error ? statuses.ERROR : undefined,
236
233
  helperText: error
237
234
  });
238
235
  };
@@ -79,7 +79,8 @@ beforeAll(function () {
79
79
  afterAll(function () {
80
80
  _URL.createObjectURL = originalValue;
81
81
  });
82
- var getComponent = function getComponent(props) {
82
+ var getComponent = function getComponent() {
83
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
83
84
  return render(___EmotionJSX(FileInputField, _extends({}, defaultProps, props)));
84
85
  };
85
86
 
@@ -311,7 +312,7 @@ test('File upload should allow only image', /*#__PURE__*/_asyncToGenerator(/*#__
311
312
  return _regeneratorRuntime().wrap(function _callee7$(_context7) {
312
313
  while (1) switch (_context7.prev = _context7.next) {
313
314
  case 0:
314
- setStateMock = jest.fn();
315
+ setStateMock = jest.fn(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
315
316
  jest.spyOn(React, 'useState').mockImplementation(function (initialState) {
316
317
  return [initialState, setStateMock];
317
318
  });
@@ -6,8 +6,8 @@ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/inst
6
6
  import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
7
7
  import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
8
8
  import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
9
- import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
10
9
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
10
+ import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
11
11
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
12
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context2 = ownKeys(Object(t))).call(_context2, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
13
13
  import React, { useCallback, useRef } from 'react';
@@ -15,10 +15,8 @@ import { useVisuallyHidden } from 'react-aria';
15
15
  import ErrorIcon from '@pingux/mdi-react/AlertCircleIcon';
16
16
  import DeleteIcon from '@pingux/mdi-react/DeleteIcon';
17
17
  import InsertDriveFileIcon from '@pingux/mdi-react/InsertDriveFileIcon';
18
- import PropTypes from 'prop-types';
19
18
  import { Box, Button, Icon, IconButton, Text } from '../../index';
20
19
  import statuses from '../../utils/devUtils/constants/statuses';
21
- import { statusPropTypes } from '../../utils/docUtils/statusProp';
22
20
  import { jsx as ___EmotionJSX } from "@emotion/react";
23
21
  var FileItem = function FileItem(props) {
24
22
  var downloadLink = props.downloadLink,
@@ -33,7 +31,7 @@ var FileItem = function FileItem(props) {
33
31
  }, [id, handleFileDelete]);
34
32
  var _useVisuallyHidden = useVisuallyHidden(),
35
33
  visuallyHiddenProps = _useVisuallyHidden.visuallyHiddenProps;
36
- var downloadRef = useRef();
34
+ var downloadRef = useRef(null);
37
35
  var getFileIconProps = useCallback(function () {
38
36
  switch (status) {
39
37
  case statuses.ERROR:
@@ -56,7 +54,9 @@ var FileItem = function FileItem(props) {
56
54
  }
57
55
  }, [status]);
58
56
  var handleDownloadPress = function handleDownloadPress() {
59
- downloadRef.current.click();
57
+ if (downloadRef.current) {
58
+ downloadRef.current.click();
59
+ }
60
60
  };
61
61
  return ___EmotionJSX(Box, {
62
62
  isRow: true,
@@ -66,9 +66,9 @@ var FileItem = function FileItem(props) {
66
66
  }, ___EmotionJSX(Icon, _extends({
67
67
  size: 15,
68
68
  "data-testid": "file-uploaded__file-icon"
69
- }, getFileIconProps(), {
69
+ }, _objectSpread(_objectSpread({}, getFileIconProps()), {}, {
70
70
  isDisabled: isDisabled
71
- })), ___EmotionJSX(Button, {
71
+ }))), ___EmotionJSX(Button, {
72
72
  variant: "forms.fileInputField.button",
73
73
  mx: 5,
74
74
  isDisabled: isDisabled,
@@ -105,12 +105,4 @@ var FileItem = function FileItem(props) {
105
105
  id: "file-uploaded__download-link-".concat(id)
106
106
  })));
107
107
  };
108
- export default FileItem;
109
- FileItem.propTypes = _objectSpread({
110
- downloadLink: PropTypes.string,
111
- handleFileDelete: PropTypes.func,
112
- id: PropTypes.string,
113
- isDisabled: PropTypes.bool,
114
- name: PropTypes.string,
115
- textProps: PropTypes.shape({})
116
- }, statusPropTypes);
108
+ export default FileItem;
@@ -1,21 +1,9 @@
1
- import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
2
- import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
3
- import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
4
- import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
5
- import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
6
- import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
7
- import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
8
- import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
9
- import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
10
1
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
11
2
  import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
12
3
  var _excluded = ["buttonText", "handleFileSelect", "isDisabled", "textProps"];
13
- function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
14
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context2 = ownKeys(Object(t))).call(_context2, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
15
4
  import React from 'react';
16
- import PropTypes from 'prop-types';
17
5
  import { Button, Text } from '../..';
18
- import { ariaAttributesBasePropTypes, getAriaAttributeProps } from '../../utils/docUtils/ariaAttributes';
6
+ import { getAriaAttributeProps } from '../../utils/docUtils/ariaAttributes';
19
7
  import { jsx as ___EmotionJSX } from "@emotion/react";
20
8
  var FileSelect = function FileSelect(_ref) {
21
9
  var buttonText = _ref.buttonText,
@@ -37,10 +25,4 @@ var FileSelect = function FileSelect(_ref) {
37
25
  color: "active"
38
26
  }, textProps), buttonText));
39
27
  };
40
- export default FileSelect;
41
- FileSelect.propTypes = _objectSpread({
42
- buttonText: PropTypes.string,
43
- handleFileSelect: PropTypes.func,
44
- isDisabled: PropTypes.bool,
45
- textProps: PropTypes.shape({})
46
- }, ariaAttributesBasePropTypes);
28
+ export default FileSelect;
@@ -67,6 +67,7 @@ var parsePaste = function parsePaste(raw) {
67
67
  };
68
68
  };
69
69
  var PhoneNumberField = /*#__PURE__*/forwardRef(function (props, ref) {
70
+ var _fieldControlInputPro;
70
71
  var countryValue = props.countryValue,
71
72
  defaultCountryValue = props.defaultCountryValue,
72
73
  helperText = props.helperText,
@@ -229,6 +230,14 @@ var PhoneNumberField = /*#__PURE__*/forwardRef(function (props, ref) {
229
230
  borderBottomRightRadius: '0 !important'
230
231
  }
231
232
  });
233
+ var countryPickerScrollBoxSx = {
234
+ minWidth: 0,
235
+ '@media screen and (max-width: 500px)': {
236
+ width: '100%',
237
+ maxWidth: '100%',
238
+ overflowX: 'hidden'
239
+ }
240
+ };
232
241
  var countryLabel = function countryLabel(c) {
233
242
  var _context4, _context5;
234
243
  return _concatInstanceProperty(_context4 = _concatInstanceProperty(_context5 = "".concat(c.name)).call(_context5, c.name !== c["native"] ? " (".concat(c["native"], ")") : '', " +")).call(_context4, c.phone.split(',')[0]);
@@ -264,9 +273,7 @@ var PhoneNumberField = /*#__PURE__*/forwardRef(function (props, ref) {
264
273
  },
265
274
  scrollBoxProps: {
266
275
  maxHeight: '215px',
267
- sx: {
268
- minWidth: '280px'
269
- }
276
+ sx: countryPickerScrollBoxSx
270
277
  },
271
278
  items: fieldState.items,
272
279
  inputValue: currentCountryInputValue,
@@ -281,14 +288,17 @@ var PhoneNumberField = /*#__PURE__*/forwardRef(function (props, ref) {
281
288
  textValue: "+".concat(item[1].phone.split(',')[0])
282
289
  }, countryLabel(item[1]));
283
290
  }), ___EmotionJSX(Box, {
291
+ className: (_fieldControlInputPro = fieldControlInputProps.className) !== null && _fieldControlInputPro !== void 0 && _includesInstanceProperty(_fieldControlInputPro).call(_fieldControlInputPro, 'is-focused') ? 'phone-number-field__input-focused' : undefined,
284
292
  sx: {
285
- ml: '110px',
286
- width: 'calc(100% - 110px)',
293
+ ml: '109px',
294
+ width: 'calc(100% - 109px)',
287
295
  visibility: fieldState.isOpen ? 'hidden' : undefined,
296
+ '&.phone-number-field__input-focused': {
297
+ ml: '111px'
298
+ },
288
299
  '& input': {
289
300
  borderTopLeftRadius: '0 !important',
290
- borderBottomLeftRadius: '0 !important',
291
- borderLeft: 0
301
+ borderBottomLeftRadius: '0 !important'
292
302
  }
293
303
  }
294
304
  }, ___EmotionJSX(Input, _extends({
@@ -1,6 +1,28 @@
1
+ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
2
+ import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol";
3
+ import _Object$create from "@babel/runtime-corejs3/core-js-stable/object/create";
4
+ import _bindInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/bind";
5
+ import _Object$getPrototypeOf from "@babel/runtime-corejs3/core-js-stable/object/get-prototype-of";
6
+ import _Object$setPrototypeOf from "@babel/runtime-corejs3/core-js-stable/object/set-prototype-of";
7
+ import _Symbol$asyncIterator from "@babel/runtime-corejs3/core-js-stable/symbol/async-iterator";
8
+ import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
9
+ import _Symbol$iterator from "@babel/runtime-corejs3/core-js-stable/symbol/iterator";
10
+ import _reverseInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reverse";
11
+ import _typeof from "@babel/runtime-corejs3/helpers/esm/typeof";
12
+ import _asyncToGenerator from "@babel/runtime-corejs3/helpers/esm/asyncToGenerator";
1
13
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
14
+ function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (_Object$getPrototypeOf ? _Object$getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && _reverseInstanceProperty(o).call(o)); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
15
+ function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof _Symbol && _Symbol$iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
16
+ function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
17
+ function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
18
+ function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || _Promise); }
19
+ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof _Symbol && _Symbol$asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
20
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof _Symbol ? _Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = _Object$create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: _bindInstanceProperty(d).call(d, e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = _Object$getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(c); function f(e) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = _Object$create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
21
+ function _regeneratorDefine2(e, r, n, t) { var i = _Object$defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
22
+ function _OverloadYield(e, d) { this.v = e, this.k = d; }
2
23
  import React from 'react';
3
- import { createEvent, fireEvent, render, screen } from '@testing-library/react';
24
+ import { createEvent, fireEvent, render, screen, within } from '@testing-library/react';
25
+ import userEvent from '@testing-library/user-event';
4
26
  import { universalComponentTests } from '../../utils/testUtils/universalComponentTest';
5
27
  import { universalFieldComponentTests } from '../../utils/testUtils/universalFormSubmitTest';
6
28
  import PhoneNumberField from '.';
@@ -38,6 +60,95 @@ test('default render has label, phone input, and country combobox', function ()
38
60
  expect(screen.getByRole('textbox')).toBeInTheDocument();
39
61
  expect(screen.getByRole('combobox')).toBeInTheDocument();
40
62
  });
63
+ test('telephone input receives focus after tabbing from country picker', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
64
+ var countryPicker, phoneInput;
65
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
66
+ while (1) switch (_context.prev = _context.next) {
67
+ case 0:
68
+ getComponent();
69
+ countryPicker = screen.getByRole('combobox', {
70
+ name: 'Country Picker'
71
+ });
72
+ phoneInput = screen.getByRole('textbox');
73
+ _context.next = 5;
74
+ return userEvent.tab();
75
+ case 5:
76
+ expect(countryPicker).toHaveFocus();
77
+ _context.next = 8;
78
+ return userEvent.tab();
79
+ case 8:
80
+ expect(phoneInput).toHaveFocus();
81
+ expect(phoneInput).toHaveClass('is-focused');
82
+ case 10:
83
+ case "end":
84
+ return _context.stop();
85
+ }
86
+ }, _callee);
87
+ })));
88
+ test('narrow country picker stays accessible and locally constrained when opened', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
89
+ var narrowAvailableWidth, offsetWidthSpy, clientWidthSpy, clientHeightSpy, _listbox$parentElemen, countryPicker, listbox, options, popover, scrollBox;
90
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
91
+ while (1) switch (_context2.prev = _context2.next) {
92
+ case 0:
93
+ narrowAvailableWidth = 480;
94
+ offsetWidthSpy = jest.spyOn(window.HTMLElement.prototype, 'offsetWidth', 'get').mockImplementation(function getOffsetWidth() {
95
+ return this.querySelector('input') ? narrowAvailableWidth : 0;
96
+ });
97
+ clientWidthSpy = jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockReturnValue(narrowAvailableWidth);
98
+ clientHeightSpy = jest.spyOn(window.HTMLElement.prototype, 'clientHeight', 'get').mockReturnValue(1000);
99
+ _context2.prev = 4;
100
+ getComponent({
101
+ sx: {
102
+ width: "".concat(narrowAvailableWidth, "px")
103
+ }
104
+ });
105
+ countryPicker = screen.getByRole('combobox', {
106
+ name: 'Country Picker'
107
+ });
108
+ _context2.next = 9;
109
+ return userEvent.click(countryPicker);
110
+ case 9:
111
+ _context2.next = 11;
112
+ return screen.findByRole('listbox');
113
+ case 11:
114
+ listbox = _context2.sent;
115
+ options = within(listbox).getAllByRole('option', {
116
+ hidden: true
117
+ });
118
+ popover = listbox.closest('[role="presentation"]');
119
+ scrollBox = (_listbox$parentElemen = listbox.parentElement) === null || _listbox$parentElemen === void 0 ? void 0 : _listbox$parentElemen.parentElement;
120
+ expect(countryPicker).toHaveAttribute('aria-expanded', 'true');
121
+ expect(options.length).toBeGreaterThan(0);
122
+ expect(popover).toHaveStyle({
123
+ width: "".concat(narrowAvailableWidth, "px")
124
+ });
125
+ expect(popover).not.toHaveStyle({
126
+ 'min-width': '280px'
127
+ });
128
+ expect(scrollBox).toHaveStyle({
129
+ 'min-width': '0'
130
+ });
131
+ expect(scrollBox).toHaveStyleRule('width', '100%', {
132
+ media: 'screen and (max-width: 500px)'
133
+ });
134
+ expect(scrollBox).toHaveStyleRule('max-width', '100%', {
135
+ media: 'screen and (max-width: 500px)'
136
+ });
137
+ expect(scrollBox).toHaveStyleRule('overflow-x', 'hidden', {
138
+ media: 'screen and (max-width: 500px)'
139
+ });
140
+ case 23:
141
+ _context2.prev = 23;
142
+ offsetWidthSpy.mockRestore();
143
+ clientWidthSpy.mockRestore();
144
+ clientHeightSpy.mockRestore();
145
+ return _context2.finish(23);
146
+ case 28:
147
+ case "end":
148
+ return _context2.stop();
149
+ }
150
+ }, _callee2, null, [[4,, 23, 28]]);
151
+ })));
41
152
  test('typing a non-numeric character does not update phone input value', function () {
42
153
  getComponent();
43
154
  var phoneInput = screen.getByRole('textbox');
@@ -310,7 +310,11 @@ var rockerButton = {
310
310
  thumbSwitch: {
311
311
  textTransform: 'none',
312
312
  backgroundColor: 'backgroundBase',
313
- padding: 'md',
313
+ px: '20px',
314
+ py: '12px',
315
+ fontSize: 'md',
316
+ fontWeight: 0,
317
+ lineHeight: 'body',
314
318
  height: '50px',
315
319
  color: 'active',
316
320
  border: '1px solid',
@@ -0,0 +1 @@
1
+ export {};
@@ -19,6 +19,7 @@ export * from './datePicker';
19
19
  export * from './environmentBreadcrumb';
20
20
  export * from './expandableText';
21
21
  export * from './fieldHelperText';
22
+ export * from './fileInputField';
22
23
  export * from './footer';
23
24
  export * from './grid';
24
25
  export * from './helpHint';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "2.220.0",
3
+ "version": "2.221.1-alpha.0",
4
4
  "description": "React component library for Ping Identity's design system",
5
5
  "repository": {
6
6
  "type": "git",
@@ -46,7 +46,7 @@
46
46
  "@internationalized/number": "^3.6.0",
47
47
  "@monaco-editor/react": "4.4.2",
48
48
  "@pingux/mdi-react": "^1.2.0",
49
- "@pingux/onyx-tokens": "^0.41.1",
49
+ "@pingux/onyx-tokens": "^0.41.3-alpha.0",
50
50
  "@react-aria/accordion": "~3.0.0-alpha.11",
51
51
  "@react-aria/breadcrumbs": "^3.1.4",
52
52
  "@react-aria/button": "^3.13.2",