@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.
- package/README.md +8 -0
- package/lib/cjs/components/PhoneNumberField/PhoneNumberField.d.ts +4 -0
- package/lib/cjs/components/PhoneNumberField/PhoneNumberField.js +299 -0
- package/lib/cjs/components/PhoneNumberField/PhoneNumberField.mdx +32 -0
- package/lib/cjs/components/PhoneNumberField/PhoneNumberField.stories.js +136 -0
- package/lib/cjs/components/PhoneNumberField/PhoneNumberField.test.js +158 -0
- package/lib/cjs/components/PhoneNumberField/index.d.ts +1 -0
- package/lib/cjs/components/PhoneNumberField/index.js +14 -0
- package/lib/cjs/index.d.ts +2 -0
- package/lib/cjs/index.js +56 -37
- package/lib/cjs/styles/themes/next-gen/convertedComponentList.js +1 -1
- package/lib/cjs/types/index.d.ts +1 -0
- package/lib/cjs/types/index.js +32 -21
- package/lib/cjs/types/phoneNumberField.d.ts +45 -0
- package/lib/cjs/types/phoneNumberField.js +6 -0
- package/lib/cjs/utils/designUtils/figmaLinks.d.ts +3 -0
- package/lib/cjs/utils/designUtils/figmaLinks.js +3 -0
- package/lib/cjs/utils/testUtils/universalFormSubmitTest.js +25 -11
- package/lib/components/PhoneNumberField/PhoneNumberField.js +288 -0
- package/lib/components/PhoneNumberField/PhoneNumberField.mdx +32 -0
- package/lib/components/PhoneNumberField/PhoneNumberField.stories.js +126 -0
- package/lib/components/PhoneNumberField/PhoneNumberField.test.js +155 -0
- package/lib/components/PhoneNumberField/index.js +1 -0
- package/lib/index.js +2 -0
- package/lib/styles/themes/next-gen/convertedComponentList.js +1 -1
- package/lib/types/index.js +1 -0
- package/lib/types/phoneNumberField.js +1 -0
- package/lib/utils/designUtils/figmaLinks.js +3 -0
- package/lib/utils/testUtils/universalFormSubmitTest.js +25 -11
- 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'],
|
package/lib/types/index.js
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
452
|
+
_context2.next = 44;
|
|
439
453
|
break;
|
|
440
454
|
}
|
|
441
455
|
iconButton = screen.queryAllByRole('button');
|
|
442
|
-
_context2.next =
|
|
456
|
+
_context2.next = 39;
|
|
443
457
|
return userEvent.click(iconButton[0]);
|
|
444
|
-
case
|
|
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 =
|
|
464
|
+
_context2.next = 45;
|
|
451
465
|
break;
|
|
452
|
-
case
|
|
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
|
|
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
|
|
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.
|
|
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",
|