@pingux/astro 2.208.4-alpha.0 → 2.210.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +8 -0
  2. package/lib/cjs/components/PhoneNumberField/PhoneNumberField.d.ts +4 -0
  3. package/lib/cjs/components/PhoneNumberField/PhoneNumberField.js +299 -0
  4. package/lib/cjs/components/PhoneNumberField/PhoneNumberField.mdx +32 -0
  5. package/lib/cjs/components/PhoneNumberField/PhoneNumberField.stories.js +136 -0
  6. package/lib/cjs/components/PhoneNumberField/PhoneNumberField.test.js +158 -0
  7. package/lib/cjs/components/PhoneNumberField/index.d.ts +1 -0
  8. package/lib/cjs/components/PhoneNumberField/index.js +14 -0
  9. package/lib/cjs/index.d.ts +2 -0
  10. package/lib/cjs/index.js +56 -37
  11. package/lib/cjs/styles/themes/next-gen/convertedComponentList.js +1 -1
  12. package/lib/cjs/types/index.d.ts +1 -0
  13. package/lib/cjs/types/index.js +32 -21
  14. package/lib/cjs/types/phoneNumberField.d.ts +45 -0
  15. package/lib/cjs/types/phoneNumberField.js +6 -0
  16. package/lib/cjs/utils/designUtils/figmaLinks.d.ts +3 -0
  17. package/lib/cjs/utils/designUtils/figmaLinks.js +3 -0
  18. package/lib/cjs/utils/testUtils/universalFormSubmitTest.js +25 -11
  19. package/lib/components/PhoneNumberField/PhoneNumberField.js +288 -0
  20. package/lib/components/PhoneNumberField/PhoneNumberField.mdx +32 -0
  21. package/lib/components/PhoneNumberField/PhoneNumberField.stories.js +126 -0
  22. package/lib/components/PhoneNumberField/PhoneNumberField.test.js +155 -0
  23. package/lib/components/PhoneNumberField/index.js +1 -0
  24. package/lib/index.js +2 -0
  25. package/lib/styles/themes/next-gen/convertedComponentList.js +1 -1
  26. package/lib/types/index.js +1 -0
  27. package/lib/types/phoneNumberField.js +1 -0
  28. package/lib/utils/designUtils/figmaLinks.js +3 -0
  29. package/lib/utils/testUtils/universalFormSubmitTest.js +25 -11
  30. package/package.json +2 -1
@@ -0,0 +1,155 @@
1
+ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
+ import React from 'react';
3
+ import { createEvent, fireEvent, render, screen } from '@testing-library/react';
4
+ import { universalComponentTests } from '../../utils/testUtils/universalComponentTest';
5
+ import { universalFieldComponentTests } from '../../utils/testUtils/universalFormSubmitTest';
6
+ import PhoneNumberField from '.';
7
+ import { jsx as ___EmotionJSX } from "@emotion/react";
8
+ var testId = 'test-phone-number-field';
9
+ var testLabel = 'Test Label';
10
+ var defaultProps = {
11
+ 'data-testid': testId,
12
+ label: testLabel
13
+ };
14
+ var getComponent = function getComponent() {
15
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16
+ return render(___EmotionJSX(PhoneNumberField, _extends({}, defaultProps, props)));
17
+ };
18
+ universalFieldComponentTests({
19
+ renderComponent: function renderComponent(props) {
20
+ return ___EmotionJSX(PhoneNumberField, _extends({}, defaultProps, props));
21
+ },
22
+ testValue: '+12345678',
23
+ testLabel: testLabel,
24
+ componentType: 'PhoneNumberField'
25
+ });
26
+ universalComponentTests({
27
+ renderComponent: function renderComponent(props) {
28
+ return ___EmotionJSX(PhoneNumberField, _extends({}, defaultProps, props));
29
+ }
30
+ });
31
+ afterEach(function () {
32
+ jest.clearAllMocks();
33
+ });
34
+ test('default render has label, phone input, and country combobox', function () {
35
+ getComponent();
36
+ expect(screen.getByTestId(testId)).toBeInTheDocument();
37
+ expect(screen.getByText(testLabel)).toBeInstanceOf(HTMLLabelElement);
38
+ expect(screen.getByRole('textbox')).toBeInTheDocument();
39
+ expect(screen.getByRole('combobox')).toBeInTheDocument();
40
+ });
41
+ test('typing a non-numeric character does not update phone input value', function () {
42
+ getComponent();
43
+ var phoneInput = screen.getByRole('textbox');
44
+ fireEvent.change(phoneInput, {
45
+ target: {
46
+ value: 'a'
47
+ }
48
+ });
49
+ expect(phoneInput).toHaveValue('');
50
+ });
51
+ test('typing a "+" character is accepted', function () {
52
+ getComponent();
53
+ var phoneInput = screen.getByRole('textbox');
54
+ fireEvent.change(phoneInput, {
55
+ target: {
56
+ value: '+'
57
+ }
58
+ });
59
+ expect(phoneInput).toHaveValue('+');
60
+ });
61
+ test('typing "+" followed by digits is valid', function () {
62
+ getComponent();
63
+ var phoneInput = screen.getByRole('textbox');
64
+ fireEvent.change(phoneInput, {
65
+ target: {
66
+ value: '+123'
67
+ }
68
+ });
69
+ expect(phoneInput).toHaveValue('+123');
70
+ });
71
+ test('typing "+" followed by a letter is not accepted', function () {
72
+ getComponent();
73
+ var phoneInput = screen.getByRole('textbox');
74
+ fireEvent.change(phoneInput, {
75
+ target: {
76
+ value: '+a'
77
+ }
78
+ });
79
+ expect(phoneInput).toHaveValue('');
80
+ });
81
+ test('pasting a string with spaces and dashes strips non-numeric characters and dial code', function () {
82
+ getComponent();
83
+ var phoneInput = screen.getByRole('textbox');
84
+ var pasteEvent = createEvent.paste(phoneInput, {
85
+ clipboardData: {
86
+ getData: function getData() {
87
+ return '+1 (800) 555-1234';
88
+ }
89
+ }
90
+ });
91
+ fireEvent(phoneInput, pasteEvent);
92
+ expect(phoneInput).toHaveValue('8005551234');
93
+ });
94
+ test('pasting a string without leading "+" strips all non-numeric characters', function () {
95
+ getComponent();
96
+ var phoneInput = screen.getByRole('textbox');
97
+ var pasteEvent = createEvent.paste(phoneInput, {
98
+ clipboardData: {
99
+ getData: function getData() {
100
+ return '800-555-1234';
101
+ }
102
+ }
103
+ });
104
+ fireEvent(phoneInput, pasteEvent);
105
+ expect(phoneInput).toHaveValue('8005551234');
106
+ });
107
+ test('onChange callback is called with a valid phone number change', function () {
108
+ var onChange = jest.fn();
109
+ getComponent({
110
+ onChange: onChange
111
+ });
112
+ var phoneInput = screen.getByRole('textbox');
113
+ fireEvent.change(phoneInput, {
114
+ target: {
115
+ value: '+12345678'
116
+ }
117
+ });
118
+ expect(onChange).toHaveBeenCalled();
119
+ });
120
+ test('onChange callback is not called when an invalid character is typed', function () {
121
+ var onChange = jest.fn();
122
+ getComponent({
123
+ onChange: onChange
124
+ });
125
+ var phoneInput = screen.getByRole('textbox');
126
+ fireEvent.change(phoneInput, {
127
+ target: {
128
+ value: 'abc'
129
+ }
130
+ });
131
+ expect(onChange).not.toHaveBeenCalled();
132
+ });
133
+ test('isDisabled disables the phone input', function () {
134
+ getComponent({
135
+ isDisabled: true
136
+ });
137
+ var phoneInput = screen.getByRole('textbox');
138
+ expect(phoneInput).toBeDisabled();
139
+ });
140
+ test('helperText renders FieldHelperText content', function () {
141
+ var helperText = 'Enter your phone number';
142
+ getComponent({
143
+ helperText: helperText
144
+ });
145
+ expect(screen.getByText(helperText)).toBeInTheDocument();
146
+ });
147
+ test('controlled countryValue sets initial selected country', function () {
148
+ getComponent({
149
+ countryValue: 'US'
150
+ });
151
+ var phoneInput = screen.getByRole('textbox');
152
+ expect(phoneInput).toBeInTheDocument();
153
+ // The combobox should be present and the phone input available
154
+ expect(screen.getByRole('combobox')).toBeInTheDocument();
155
+ });
@@ -0,0 +1 @@
1
+ export { default } from './PhoneNumberField';
package/lib/index.js CHANGED
@@ -151,6 +151,8 @@ export { default as PanelHeaderMenu } from './components/PanelHeader/controls/Pa
151
151
  export { default as PanelHeaderSwitchField } from './components/PanelHeader/controls/PanelHeaderSwitchField';
152
152
  export { default as PasswordField } from './components/PasswordField';
153
153
  export * from './components/PasswordField';
154
+ export { default as PhoneNumberField } from './components/PhoneNumberField';
155
+ export * from './components/PhoneNumberField';
154
156
  export { default as PopoverContainer } from './components/PopoverContainer';
155
157
  export * from './components/PopoverContainer';
156
158
  export { default as PopoverMenu } from './components/PopoverMenu';
@@ -1,4 +1,4 @@
1
- var nextGenConvertedComponents = ['AccordionGridGroup', 'AccordionGroup', 'ArrayField', 'AstroProvider', 'Avatar', 'Badge', 'Base Components', 'Breadcrumbs', 'Button', 'ButtonBar', 'Callout', 'Card', 'CheckboxField', 'CodeView', 'ColorField', 'ComboBoxField', 'CopyText', 'DataTable', 'EnvironmentBreadcrumb', 'GridList', 'HelpHint', 'Icon', 'MaterialSymbolIcon', 'IconBadge', 'IconButton', 'IconWrapper', 'ImageUploadField', 'Loader', 'Link', 'LinkSelectField', 'ListView', 'ListViewItem', 'Message', 'Messages', 'Modal', 'MultiValuesField', 'MultivaluesField', 'NavBar', 'NavList', 'NavigationHeader', 'NextGen ListViewItem', 'NumberField', 'OverlayPanel', 'PageHeader', 'Pagination', 'PanelHeader', 'PasswordField', 'PopoverMenu', 'ProgressBar', 'RadioField', 'RadioGroupField', 'RangeCalendar', 'RequirementsList', 'RockerButtonGroup', 'SearchField', 'SelectField', 'Skeleton', 'SliderField', 'Stepper', 'Sticker Sheet', 'SwitchField', 'StatusIcon', 'Table', 'TableBase', 'Tabs', 'Text', 'TextAreaField', 'TextField', 'TooltipTrigger', 'ArrayField', 'ColorField', 'LinkSelectField', 'NumberField', 'SwitchField', 'Base Components', 'SliderField', 'ServerErrorBoundary', 'Avatar', 'Box', 'TimeField'];
1
+ var nextGenConvertedComponents = ['AccordionGridGroup', 'AccordionGroup', 'ArrayField', 'AstroProvider', 'Avatar', 'Badge', 'Base Components', 'Breadcrumbs', 'Button', 'ButtonBar', 'Callout', 'Card', 'CheckboxField', 'CodeView', 'ColorField', 'ComboBoxField', 'CopyText', 'DataTable', 'EnvironmentBreadcrumb', 'GridList', 'HelpHint', 'Icon', 'MaterialSymbolIcon', 'IconBadge', 'IconButton', 'IconWrapper', 'ImageUploadField', 'Loader', 'Link', 'LinkSelectField', 'ListView', 'ListViewItem', 'Message', 'Messages', 'Modal', 'MultiValuesField', 'MultivaluesField', 'NavBar', 'NavList', 'NavigationHeader', 'NextGen ListViewItem', 'NumberField', 'OverlayPanel', 'PageHeader', 'Pagination', 'PanelHeader', 'PasswordField', 'PhoneNumberField', 'PopoverMenu', 'ProgressBar', 'RadioField', 'RadioGroupField', 'RangeCalendar', 'RequirementsList', 'RockerButtonGroup', 'SearchField', 'SelectField', 'Skeleton', 'SliderField', 'Stepper', 'Sticker Sheet', 'SwitchField', 'StatusIcon', 'Table', 'TableBase', 'Tabs', 'Text', 'TextAreaField', 'TextField', 'TooltipTrigger', 'ArrayField', 'ColorField', 'LinkSelectField', 'NumberField', 'SwitchField', 'Base Components', 'SliderField', 'ServerErrorBoundary', 'Avatar', 'Box', 'TimeField'];
2
2
  export var componentSpecificNextGenBlacklist = {
3
3
  AstroProvider: ['Default', 'With Custom Theme Override'],
4
4
  Messages: ['Customization'],
@@ -42,6 +42,7 @@ export * from './navBar';
42
42
  export * from './navSideBar';
43
43
  export * from './overlayPanel';
44
44
  export * from './passwordField';
45
+ export * from './phoneNumberField';
45
46
  export * from './popoverContainer';
46
47
  export * from './popoverMenu';
47
48
  export * from './progressBar';
@@ -0,0 +1 @@
1
+ export {};
@@ -163,6 +163,9 @@ export var FIGMA_LINKS = {
163
163
  withAvatar: 'https://www.figma.com/design/XDGxYAgQkcHDVjyu8OGrBv/Onyx-Specs?node-id=4470-24174&m=dev',
164
164
  withExtraLongText: 'https://www.figma.com/file/bpbEw54gTTcdIiZs4PKK1p/Astro-Specs?node-id=44688%3A39713&mode=dev'
165
165
  },
166
+ phoneNumberField: {
167
+ "default": 'https://www.figma.com/design/XDGxYAgQkcHDVjyu8OGrBv/Onyx-Specs?node-id=8496-31873'
168
+ },
166
169
  popoverMenu: {
167
170
  "default": 'https://www.figma.com/file/Oa6VYtJcUJzEJuuRp0p4ls/Astro?type=design&node-id=0%3A3073&t=We3h7LaaFJQnxdSy-1'
168
171
  },
@@ -129,6 +129,7 @@ var useDefaultProps = function useDefaultProps(componentType) {
129
129
  name: name
130
130
  };
131
131
  case 'PasswordField':
132
+ case 'PhoneNumberField':
132
133
  return {
133
134
  value: value,
134
135
  onChange: function onChange(e) {
@@ -205,6 +206,7 @@ var getDefaultProps = function getDefaultProps(componentType, testValue) {
205
206
  name: name
206
207
  };
207
208
  case 'PasswordField':
209
+ case 'PhoneNumberField':
208
210
  case 'ComboBoxField':
209
211
  case 'NumberField':
210
212
  case 'MultivaluesField':
@@ -399,7 +401,7 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
399
401
  fireEvent.click(screen.getAllByRole('option', {
400
402
  name: testValue
401
403
  })[0]);
402
- _context2.next = 41;
404
+ _context2.next = 45;
403
405
  break;
404
406
  case 19:
405
407
  if (!(componentType === 'NumberField')) {
@@ -411,7 +413,7 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
411
413
  value: testValue
412
414
  }
413
415
  });
414
- _context2.next = 41;
416
+ _context2.next = 45;
415
417
  break;
416
418
  case 23:
417
419
  if (!(componentType === 'RadioGroupField')) {
@@ -419,7 +421,7 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
419
421
  break;
420
422
  }
421
423
  fireEvent.click(screen.getByLabelText(testValue));
422
- _context2.next = 41;
424
+ _context2.next = 45;
423
425
  break;
424
426
  case 27:
425
427
  if (!(componentType === 'PasswordField')) {
@@ -431,25 +433,37 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
431
433
  value: testValue
432
434
  }
433
435
  });
434
- _context2.next = 41;
436
+ _context2.next = 45;
435
437
  break;
436
438
  case 31:
439
+ if (!(componentType === 'PhoneNumberField')) {
440
+ _context2.next = 35;
441
+ break;
442
+ }
443
+ fireEvent.change(screen.getByRole('textbox'), {
444
+ target: {
445
+ value: testValue
446
+ }
447
+ });
448
+ _context2.next = 45;
449
+ break;
450
+ case 35:
437
451
  if (!(componentType === 'DatePicker')) {
438
- _context2.next = 40;
452
+ _context2.next = 44;
439
453
  break;
440
454
  }
441
455
  iconButton = screen.queryAllByRole('button');
442
- _context2.next = 35;
456
+ _context2.next = 39;
443
457
  return userEvent.click(iconButton[0]);
444
- case 35:
458
+ case 39:
445
459
  cells = screen.getAllByRole('gridcell');
446
460
  selected = _findInstanceProperty(cells).call(cells, function (cell) {
447
461
  return cell.getAttribute('aria-selected') === 'true';
448
462
  });
449
463
  expect(selected === null || selected === void 0 ? void 0 : selected.children[0]).toHaveAttribute('aria-label', 'Wednesday, August 10, 2022 selected');
450
- _context2.next = 41;
464
+ _context2.next = 45;
451
465
  break;
452
- case 40:
466
+ case 44:
453
467
  if (componentType === 'SliderField') {
454
468
  fireEvent.change(screen.getByRole('slider'), {
455
469
  target: {
@@ -463,7 +477,7 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
463
477
  }
464
478
  });
465
479
  }
466
- case 41:
480
+ case 45:
467
481
  fireEvent.submit(screen.getByRole('form', {
468
482
  hidden: true,
469
483
  name: /test form 2/i
@@ -471,7 +485,7 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
471
485
  expect(handleFormSubmit).toHaveBeenCalledWith({
472
486
  testName: String(testValue)
473
487
  });
474
- case 43:
488
+ case 47:
475
489
  case "end":
476
490
  return _context2.stop();
477
491
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "2.208.4-alpha.0",
3
+ "version": "2.210.0-alpha.0",
4
4
  "description": "React component library for Ping Identity's design system",
5
5
  "repository": {
6
6
  "type": "git",
@@ -158,6 +158,7 @@
158
158
  "@storybook/addon-console": "^3.0.0",
159
159
  "@storybook/addon-designs": "^11.0.0",
160
160
  "@storybook/addon-docs": "^10.2.8",
161
+ "@storybook/addon-mcp": "^0.7.0",
161
162
  "@storybook/preset-scss": "^1.0.3",
162
163
  "@storybook/react": "^10.2.8",
163
164
  "@storybook/react-vite": "^10.2.8",