@pingux/astro 2.143.0-alpha.1 → 2.143.0-alpha.2

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.
@@ -1,5 +1,6 @@
1
1
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
2
  import React from 'react';
3
+ import { Item } from '@react-stately/collections';
3
4
  import userEvent from '@testing-library/user-event';
4
5
  import { act, fireEvent, render, screen } from '../../utils/testUtils/testWrapper';
5
6
  import { universalComponentTests } from '../../utils/testUtils/universalComponentTest';
@@ -7,6 +8,7 @@ import { universalFieldComponentTests } from '../../utils/testUtils/universalFor
7
8
  import SearchField from '.';
8
9
  import { jsx as ___EmotionJSX } from "@emotion/react";
9
10
  var testId = 'test-radio-group';
11
+ var testValue = 'Option';
10
12
  var testLabel = 'Test Label';
11
13
  var defaultProps = {
12
14
  'data-testid': testId,
@@ -16,6 +18,16 @@ var getComponent = function getComponent() {
16
18
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
17
19
  return render(___EmotionJSX(SearchField, _extends({}, defaultProps, props)));
18
20
  };
21
+ var getAutocompleteComponent = function getAutocompleteComponent() {
22
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
23
+ return render(___EmotionJSX(SearchField, _extends({}, defaultProps, props), ___EmotionJSX(Item, {
24
+ key: "1"
25
+ }, "Option 1"), ___EmotionJSX(Item, {
26
+ key: "2"
27
+ }, "Option 2"), ___EmotionJSX(Item, {
28
+ key: "3"
29
+ }, "Option 3")));
30
+ };
19
31
  universalFieldComponentTests({
20
32
  renderComponent: function renderComponent(props) {
21
33
  return ___EmotionJSX(SearchField, _extends({}, defaultProps, props));
@@ -216,4 +228,124 @@ test('clear button should not be present is hasNoClearButton=true ', function ()
216
228
  hasNoClearButton: true
217
229
  });
218
230
  expect(screen.queryByRole('button')).not.toBeInTheDocument();
231
+ });
232
+ describe('Autocomplete mode', function () {
233
+ beforeAll(function () {
234
+ jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(function () {
235
+ return 1000;
236
+ });
237
+ jest.spyOn(window.HTMLElement.prototype, 'clientHeight', 'get').mockImplementation(function () {
238
+ return 1000;
239
+ });
240
+ window.HTMLElement.prototype.scrollIntoView = jest.fn();
241
+ jest.spyOn(window.screen, 'width', 'get').mockImplementation(function () {
242
+ return 1024;
243
+ });
244
+ jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) {
245
+ cb(0);
246
+ return 0;
247
+ });
248
+ jest.useFakeTimers();
249
+ });
250
+ afterEach(function () {
251
+ jest.clearAllMocks();
252
+ });
253
+ test('default autocomplete search field', function () {
254
+ getAutocompleteComponent({
255
+ mode: 'autocomplete'
256
+ });
257
+ var search = screen.getByLabelText(testLabel);
258
+ var label = screen.getByText(testLabel);
259
+ expect(search).toBeInstanceOf(HTMLInputElement);
260
+ expect(label).toBeInstanceOf(HTMLLabelElement);
261
+ expect(search).toBeInTheDocument();
262
+ expect(label).toBeInTheDocument();
263
+ });
264
+ test('autocomplete options appear on user input', function () {
265
+ getAutocompleteComponent({
266
+ mode: 'autocomplete'
267
+ });
268
+ var control = screen.getByLabelText(testLabel);
269
+ userEvent.type(control, testValue);
270
+ expect(control).toHaveValue(testValue);
271
+ expect(screen.queryByText('Option 1')).toBeInTheDocument();
272
+ expect(screen.queryByText('Option 2')).toBeInTheDocument();
273
+ expect(screen.queryByText('Option 3')).toBeInTheDocument();
274
+ fireEvent.change(control, {
275
+ target: {
276
+ value: '3'
277
+ }
278
+ });
279
+ expect(screen.queryByText('Option 1')).not.toBeInTheDocument();
280
+ expect(screen.queryByText('Option 2')).not.toBeInTheDocument();
281
+ expect(screen.queryByText('Option 3')).toBeInTheDocument();
282
+ });
283
+ test('Allow custom values', function () {
284
+ var onSubmit = jest.fn();
285
+ getAutocompleteComponent({
286
+ mode: 'autocomplete',
287
+ onSubmit: onSubmit
288
+ });
289
+ var control = screen.getByLabelText(testLabel);
290
+ userEvent.type(control, 'Custom Value{enter}');
291
+ expect(onSubmit).toHaveBeenCalledWith('Custom Value');
292
+ });
293
+ test('clear button works in autocomplete mode', function () {
294
+ getAutocompleteComponent({
295
+ mode: 'autocomplete'
296
+ });
297
+ var search = screen.getByLabelText(testLabel);
298
+ userEvent.type(search, 'clear');
299
+ expect(search).toHaveValue('clear');
300
+ var clearButton = screen.getByRole('button');
301
+ expect(clearButton).toHaveAttribute('tabindex', '0');
302
+ act(function () {
303
+ clearButton.focus();
304
+ });
305
+ expect(clearButton).toHaveFocus();
306
+ fireEvent.keyDown(clearButton, {
307
+ key: 'Enter'
308
+ });
309
+ fireEvent.keyUp(clearButton, {
310
+ key: 'Enter'
311
+ });
312
+ expect(search).toHaveValue('');
313
+ });
314
+ test('Down arrow key open listbox popup', function () {
315
+ getAutocompleteComponent({
316
+ mode: 'autocomplete'
317
+ });
318
+ var search = screen.getByLabelText(testLabel);
319
+ act(function () {
320
+ search.focus();
321
+ });
322
+ expect(search).toHaveFocus();
323
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
324
+ fireEvent.keyDown(search, {
325
+ key: 'ArrowDown'
326
+ });
327
+ act(function () {
328
+ jest.runAllTimers();
329
+ });
330
+ expect(screen.getByRole('listbox')).toBeInTheDocument();
331
+ expect(screen.getByText('Option 1')).toBeInTheDocument();
332
+ });
333
+ test("No popup when there aren't any options", function () {
334
+ getAutocompleteComponent({
335
+ mode: 'autocomplete'
336
+ });
337
+ var search = screen.getByLabelText(testLabel);
338
+ act(function () {
339
+ search.focus();
340
+ });
341
+ expect(search).toHaveFocus();
342
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
343
+ userEvent.type(search, 'xyz');
344
+ act(function () {
345
+ jest.runAllTimers();
346
+ });
347
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
348
+ expect(screen.queryByText('Option 1')).not.toBeInTheDocument();
349
+ expect(search).toHaveValue('xyz');
350
+ });
219
351
  });
@@ -0,0 +1,79 @@
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 _extends from "@babel/runtime-corejs3/helpers/esm/extends";
10
+ import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
11
+ 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; }
12
+ 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) { _defineProperty(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; }
13
+ import React, { forwardRef } from 'react';
14
+ import { useSearchField } from 'react-aria';
15
+ import { useSearchFieldState } from 'react-stately';
16
+ import CloseIcon from '@pingux/mdi-react/CloseIcon';
17
+ import { Box, Icon, IconButton, Input, Label } from '../..';
18
+ import { useField, useLocalOrForwardRef, usePropWarning } from '../../hooks';
19
+ import { getPendoID } from '../../utils/devUtils/constants/pendoID';
20
+ import { jsx as ___EmotionJSX } from "@emotion/react";
21
+ var displayName = 'SearchField';
22
+ export var SearchFieldBase = /*#__PURE__*/forwardRef(function (props, ref) {
23
+ var autocomplete = props.autocomplete,
24
+ hasAutoFocus = props.hasAutoFocus,
25
+ hasNoClearButton = props.hasNoClearButton,
26
+ icon = props.icon,
27
+ isExcludedFromTabOrder = props.isExcludedFromTabOrder,
28
+ label = props.label,
29
+ controlProps = props.controlProps,
30
+ iconProps = props.iconProps,
31
+ labelProps = props.labelProps;
32
+ usePropWarning(props, 'disabled', 'isDisabled');
33
+ var searchRef = useLocalOrForwardRef(ref);
34
+ var state = useSearchFieldState(props);
35
+ var _useSearchField = useSearchField(_objectSpread({
36
+ autoComplete: autocomplete,
37
+ autoFocus: hasAutoFocus,
38
+ excludeFromTabOrder: isExcludedFromTabOrder
39
+ }, props), state, searchRef),
40
+ raLabelProps = _useSearchField.labelProps,
41
+ raInputProps = _useSearchField.inputProps,
42
+ clearButtonProps = _useSearchField.clearButtonProps;
43
+ var _useField = useField(_objectSpread(_objectSpread({}, props), {}, {
44
+ labelProps: _objectSpread(_objectSpread({}, labelProps), raLabelProps),
45
+ controlProps: _objectSpread(_objectSpread({}, controlProps), raInputProps)
46
+ })),
47
+ fieldContainerProps = _useField.fieldContainerProps,
48
+ fieldControlInputProps = _useField.fieldControlInputProps,
49
+ fieldControlWrapperProps = _useField.fieldControlWrapperProps,
50
+ fieldLabelProps = _useField.fieldLabelProps;
51
+ var handleKeyDownEvent = function handleKeyDownEvent(e) {
52
+ var key = e.key;
53
+ if (key === 'Enter' || key === ' ') {
54
+ state.setValue('');
55
+ }
56
+ };
57
+ return ___EmotionJSX(Box, _extends({}, getPendoID(displayName), fieldContainerProps), label && ___EmotionJSX(Label, fieldLabelProps), ___EmotionJSX(Box, _extends({
58
+ variant: "forms.search.wrapper"
59
+ }, fieldControlWrapperProps), ___EmotionJSX(Input, _extends({
60
+ variant: "forms.input.search",
61
+ ref: searchRef
62
+ }, fieldControlInputProps)), icon && ___EmotionJSX(Icon, _extends({
63
+ icon: icon,
64
+ variant: "forms.search.icon",
65
+ title: {
66
+ name: 'Search Icon'
67
+ }
68
+ }, iconProps)), !hasNoClearButton && state.value !== '' && ___EmotionJSX(IconButton, _extends({
69
+ tabIndex: 0,
70
+ onKeyDown: handleKeyDownEvent,
71
+ color: "text.secondary",
72
+ variant: "searchClearButton"
73
+ }, clearButtonProps), ___EmotionJSX(Icon, {
74
+ icon: CloseIcon,
75
+ title: {
76
+ name: 'Close Icon'
77
+ }
78
+ }))));
79
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "2.143.0-alpha.1",
3
+ "version": "2.143.0-alpha.2",
4
4
  "description": "React component library for Ping Identity's design system",
5
5
  "repository": {
6
6
  "type": "git",
@@ -99,6 +99,7 @@
99
99
  "@react-stately/toggle": "^3.8.5",
100
100
  "@react-stately/tree": "^3.7.4",
101
101
  "@react-stately/virtualizer": "~3.6.5",
102
+ "@react-types/combobox": "^3.13.8",
102
103
  "@react-types/slider": "^3.7.9",
103
104
  "@storybook/addon-actions": "^7.1.0",
104
105
  "@storybook/api": "^7.1.0",