@pingux/astro 1.3.1 → 1.3.2-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.
@@ -48,7 +48,6 @@ var FieldHelperText = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref)
48
48
 
49
49
  return (0, _react2.jsx)(_Text["default"], (0, _extends2["default"])({
50
50
  ref: ref,
51
- pt: "sm",
52
51
  variant: "fieldHelperText",
53
52
  role: "status"
54
53
  }, others, {
@@ -60,8 +60,6 @@ var _overlays = require("@react-aria/overlays");
60
60
 
61
61
  var _utils = require("@react-aria/utils");
62
62
 
63
- var _uuid = require("uuid");
64
-
65
63
  var _ = require("../..");
66
64
 
67
65
  var _ListBox = _interopRequireDefault(require("../ListBox"));
@@ -262,13 +260,17 @@ var MultivaluesField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref)
262
260
  } else if (hasCustomValue) {
263
261
  var _context3;
264
262
 
265
- var name = e.target.value;
266
- var id = (0, _uuid.v4)();
267
- selectionManager.toggleSelection(id);
263
+ var _key2 = e.target.value;
264
+
265
+ if (state.selectionManager.isSelected(_key2)) {
266
+ return;
267
+ }
268
+
269
+ selectionManager.toggleSelection(_key2);
268
270
  setCustomItems((0, _concat["default"])(_context3 = []).call(_context3, customItems, [{
269
- id: id,
270
- key: id,
271
- name: name
271
+ id: _key2,
272
+ key: _key2,
273
+ name: _key2
272
274
  }]));
273
275
  setFilterString('');
274
276
  }
@@ -276,6 +276,80 @@ test('changing the input value and hitting enter creates new value in non-restri
276
276
  var chipContainer = chip.parentElement;
277
277
  expect(chipContainer).toHaveAttribute('role', 'presentation');
278
278
  });
279
+ test('in non-restrictive mode "onSelectionChange" returns entered keys', function () {
280
+ var onSelectionChange = jest.fn();
281
+ getComponent({
282
+ mode: 'non-restrictive',
283
+ onSelectionChange: onSelectionChange
284
+ });
285
+
286
+ var input = _testWrapper.screen.getByRole('combobox');
287
+
288
+ var value = 'custom';
289
+
290
+ _userEvent["default"].type(input, value);
291
+
292
+ _userEvent["default"].type(input, '{enter}');
293
+
294
+ var chip = _testWrapper.screen.queryByText(value);
295
+
296
+ expect(chip).toBeInTheDocument();
297
+ expect(onSelectionChange).toBeCalledTimes(1);
298
+ expect(onSelectionChange.mock.calls[0][0].has(value)).toBeTruthy();
299
+ });
300
+ test('in non-restrictive mode the same value cannot be applied twice', function () {
301
+ var onSelectionChange = jest.fn();
302
+ getComponent({
303
+ mode: 'non-restrictive',
304
+ onSelectionChange: onSelectionChange
305
+ });
306
+
307
+ var input = _testWrapper.screen.getByRole('combobox');
308
+
309
+ var value = 'custom';
310
+
311
+ _userEvent["default"].type(input, value);
312
+
313
+ _userEvent["default"].type(input, '{enter}');
314
+
315
+ var chip = _testWrapper.screen.queryByText(value);
316
+
317
+ expect(chip).toBeInTheDocument();
318
+ expect(input).toHaveValue('');
319
+
320
+ _userEvent["default"].type(input, value);
321
+
322
+ _userEvent["default"].type(input, '{enter}');
323
+
324
+ expect(input).toHaveValue(value);
325
+ expect(onSelectionChange).toBeCalledTimes(1);
326
+ });
327
+ test('in non-restrictive mode the value that was already selected using the list cannot be applied', function () {
328
+ var onSelectionChange = jest.fn();
329
+ getComponent({
330
+ mode: 'non-restrictive',
331
+ onSelectionChange: onSelectionChange
332
+ });
333
+
334
+ var input = _testWrapper.screen.getByRole('combobox');
335
+
336
+ input.focus();
337
+
338
+ var listbox = _testWrapper.screen.getByRole('listbox');
339
+
340
+ var options = (0, _testWrapper.within)(listbox).getAllByRole('option');
341
+ var firstOption = options[0];
342
+ firstOption.click();
343
+ expect(onSelectionChange.mock.calls[0][0].has(items[0].name)).toBeTruthy();
344
+ onSelectionChange.mockClear();
345
+
346
+ _userEvent["default"].type(input, items[0].name);
347
+
348
+ _userEvent["default"].type(input, '{enter}');
349
+
350
+ expect(input).toHaveValue(items[0].name);
351
+ expect(onSelectionChange).not.toBeCalled();
352
+ });
279
353
  test('options can be focused via keyboard', function () {
280
354
  getComponent();
281
355
 
@@ -125,7 +125,8 @@ var SelectFieldBase = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref)
125
125
  state: state,
126
126
  triggerRef: triggerRef,
127
127
  label: label,
128
- name: name
128
+ name: name,
129
+ isDisabled: true
129
130
  }), trigger || defaultTrigger, overlay, helperText && (0, _react2.jsx)(_FieldHelperText["default"], {
130
131
  status: status
131
132
  }, helperText));
@@ -28,6 +28,8 @@ var _hooks = require("../../hooks");
28
28
 
29
29
  var _SelectFieldBase = _interopRequireDefault(require("./SelectFieldBase"));
30
30
 
31
+ var _constants = require("../Label/constants");
32
+
31
33
  var _react2 = require("@emotion/react");
32
34
 
33
35
  var items = [{
@@ -163,6 +165,20 @@ test('select field with helper text', function () {
163
165
  expect(fieldHelperText).toBeInTheDocument();
164
166
  expect(fieldHelperText).toHaveClass("is-".concat(_statuses["default"].ERROR));
165
167
  });
168
+ test('label floats after user\'s interacting', function () {
169
+ getComponent({
170
+ labelMode: _constants.modes.FLOAT,
171
+ value: ''
172
+ });
173
+
174
+ var textAreaContainer = _testWrapper.screen.getByTestId(testId);
175
+
176
+ expect(textAreaContainer).not.toHaveClass('is-float-label-active');
177
+
178
+ _userEvent["default"].tab();
179
+
180
+ expect(textAreaContainer).toHaveClass('is-float-label-active');
181
+ });
166
182
  test('clicking on the visible button opens the popuplist', function () {
167
183
  getComponent();
168
184
 
@@ -56,6 +56,8 @@ var _PopoverContainer = _interopRequireDefault(require("../../components/Popover
56
56
 
57
57
  var _ScrollBox = _interopRequireDefault(require("../../components/ScrollBox"));
58
58
 
59
+ var _constants = require("../../components/Label/constants");
60
+
59
61
  var _react2 = require("@emotion/react");
60
62
 
61
63
  function ownKeys(object, enumerableOnly) { var keys = (0, _keys["default"])(object); if (_getOwnPropertySymbols["default"]) { var symbols = (0, _getOwnPropertySymbols["default"])(object); if (enumerableOnly) symbols = (0, _filter["default"])(symbols).call(symbols, function (sym) { return (0, _getOwnPropertyDescriptor["default"])(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
@@ -140,6 +142,7 @@ var useSelectField = function useSelectField(props, ref) {
140
142
  menuProps = _useSelect.menuProps;
141
143
 
142
144
  var _useField = (0, _.useField)(_objectSpread(_objectSpread({}, props), {}, {
145
+ placeholder: props.labelMode === _constants.modes.FLOAT ? '' : placeholder,
143
146
  labelProps: _objectSpread(_objectSpread({}, props.labelProps), labelProps),
144
147
  containerProps: _objectSpread({
145
148
  isFloatLabelActive: state.selectedItem
@@ -63,7 +63,6 @@ var tabLabel = _objectSpread(_objectSpread(_objectSpread({}, base), wordWrap), {
63
63
 
64
64
  var fieldHelperText = _objectSpread(_objectSpread(_objectSpread({}, base), wordWrap), {}, {
65
65
  fontSize: 'sm',
66
- pb: 'sm',
67
66
  '&.is-default': {
68
67
  color: 'text.secondary'
69
68
  },
@@ -25,7 +25,6 @@ var FieldHelperText = /*#__PURE__*/forwardRef(function (props, ref) {
25
25
 
26
26
  return ___EmotionJSX(Text, _extends({
27
27
  ref: ref,
28
- pt: "sm",
29
28
  variant: "fieldHelperText",
30
29
  role: "status"
31
30
  }, others, {
@@ -27,7 +27,6 @@ import { FocusScope } from '@react-aria/focus';
27
27
  import { useListState } from '@react-stately/list';
28
28
  import { DismissButton, useOverlayPosition } from '@react-aria/overlays';
29
29
  import { useLayoutEffect, useResizeObserver } from '@react-aria/utils';
30
- import { v4 as uuid } from 'uuid';
31
30
  import { Chip, Icon, IconButton, PopoverContainer, ScrollBox, TextField } from '../..';
32
31
  import ListBox from '../ListBox';
33
32
  import { isIterableProp } from '../../utils/devUtils/props/isIterable';
@@ -220,13 +219,17 @@ var MultivaluesField = /*#__PURE__*/forwardRef(function (props, ref) {
220
219
  } else if (hasCustomValue) {
221
220
  var _context3;
222
221
 
223
- var name = e.target.value;
224
- var id = uuid();
225
- selectionManager.toggleSelection(id);
222
+ var _key2 = e.target.value;
223
+
224
+ if (state.selectionManager.isSelected(_key2)) {
225
+ return;
226
+ }
227
+
228
+ selectionManager.toggleSelection(_key2);
226
229
  setCustomItems(_concatInstanceProperty(_context3 = []).call(_context3, customItems, [{
227
- id: id,
228
- key: id,
229
- name: name
230
+ id: _key2,
231
+ key: _key2,
232
+ name: _key2
230
233
  }]));
231
234
  setFilterString('');
232
235
  }
@@ -212,6 +212,58 @@ test('changing the input value and hitting enter creates new value in non-restri
212
212
  var chipContainer = chip.parentElement;
213
213
  expect(chipContainer).toHaveAttribute('role', 'presentation');
214
214
  });
215
+ test('in non-restrictive mode "onSelectionChange" returns entered keys', function () {
216
+ var onSelectionChange = jest.fn();
217
+ getComponent({
218
+ mode: 'non-restrictive',
219
+ onSelectionChange: onSelectionChange
220
+ });
221
+ var input = screen.getByRole('combobox');
222
+ var value = 'custom';
223
+ userEvent.type(input, value);
224
+ userEvent.type(input, '{enter}');
225
+ var chip = screen.queryByText(value);
226
+ expect(chip).toBeInTheDocument();
227
+ expect(onSelectionChange).toBeCalledTimes(1);
228
+ expect(onSelectionChange.mock.calls[0][0].has(value)).toBeTruthy();
229
+ });
230
+ test('in non-restrictive mode the same value cannot be applied twice', function () {
231
+ var onSelectionChange = jest.fn();
232
+ getComponent({
233
+ mode: 'non-restrictive',
234
+ onSelectionChange: onSelectionChange
235
+ });
236
+ var input = screen.getByRole('combobox');
237
+ var value = 'custom';
238
+ userEvent.type(input, value);
239
+ userEvent.type(input, '{enter}');
240
+ var chip = screen.queryByText(value);
241
+ expect(chip).toBeInTheDocument();
242
+ expect(input).toHaveValue('');
243
+ userEvent.type(input, value);
244
+ userEvent.type(input, '{enter}');
245
+ expect(input).toHaveValue(value);
246
+ expect(onSelectionChange).toBeCalledTimes(1);
247
+ });
248
+ test('in non-restrictive mode the value that was already selected using the list cannot be applied', function () {
249
+ var onSelectionChange = jest.fn();
250
+ getComponent({
251
+ mode: 'non-restrictive',
252
+ onSelectionChange: onSelectionChange
253
+ });
254
+ var input = screen.getByRole('combobox');
255
+ input.focus();
256
+ var listbox = screen.getByRole('listbox');
257
+ var options = within(listbox).getAllByRole('option');
258
+ var firstOption = options[0];
259
+ firstOption.click();
260
+ expect(onSelectionChange.mock.calls[0][0].has(items[0].name)).toBeTruthy();
261
+ onSelectionChange.mockClear();
262
+ userEvent.type(input, items[0].name);
263
+ userEvent.type(input, '{enter}');
264
+ expect(input).toHaveValue(items[0].name);
265
+ expect(onSelectionChange).not.toBeCalled();
266
+ });
215
267
  test('options can be focused via keyboard', function () {
216
268
  getComponent();
217
269
  var input = screen.getByRole('combobox');
@@ -90,7 +90,8 @@ var SelectFieldBase = /*#__PURE__*/forwardRef(function (props, ref) {
90
90
  state: state,
91
91
  triggerRef: triggerRef,
92
92
  label: label,
93
- name: name
93
+ name: name,
94
+ isDisabled: true
94
95
  }), trigger || defaultTrigger, overlay, helperText && ___EmotionJSX(FieldHelperText, {
95
96
  status: status
96
97
  }, helperText));
@@ -10,6 +10,7 @@ import statuses from '../../utils/devUtils/constants/statuses';
10
10
  import { Item } from '../../index';
11
11
  import { useSelectField } from '../../hooks';
12
12
  import SelectFieldBase from './SelectFieldBase';
13
+ import { modes } from '../Label/constants';
13
14
  import { jsx as ___EmotionJSX } from "@emotion/react";
14
15
  var items = [{
15
16
  name: 'a'
@@ -135,6 +136,16 @@ test('select field with helper text', function () {
135
136
  expect(fieldHelperText).toBeInTheDocument();
136
137
  expect(fieldHelperText).toHaveClass("is-".concat(statuses.ERROR));
137
138
  });
139
+ test('label floats after user\'s interacting', function () {
140
+ getComponent({
141
+ labelMode: modes.FLOAT,
142
+ value: ''
143
+ });
144
+ var textAreaContainer = screen.getByTestId(testId);
145
+ expect(textAreaContainer).not.toHaveClass('is-float-label-active');
146
+ userEvent.tab();
147
+ expect(textAreaContainer).toHaveClass('is-float-label-active');
148
+ });
138
149
  test('clicking on the visible button opens the popuplist', function () {
139
150
  getComponent();
140
151
  var button = screen.getByRole('button');
@@ -25,6 +25,7 @@ import { useColumnStyles, useDeprecationWarning, useField } from '..';
25
25
  import ListBox from '../../components/ListBox';
26
26
  import PopoverContainer from '../../components/PopoverContainer';
27
27
  import ScrollBox from '../../components/ScrollBox';
28
+ import { modes } from '../../components/Label/constants';
28
29
  import { jsx as ___EmotionJSX } from "@emotion/react";
29
30
 
30
31
  var useSelectField = function useSelectField(props, ref) {
@@ -105,6 +106,7 @@ var useSelectField = function useSelectField(props, ref) {
105
106
  menuProps = _useSelect.menuProps;
106
107
 
107
108
  var _useField = useField(_objectSpread(_objectSpread({}, props), {}, {
109
+ placeholder: props.labelMode === modes.FLOAT ? '' : placeholder,
108
110
  labelProps: _objectSpread(_objectSpread({}, props.labelProps), labelProps),
109
111
  containerProps: _objectSpread({
110
112
  isFloatLabelActive: state.selectedItem
@@ -43,7 +43,6 @@ var tabLabel = _objectSpread(_objectSpread(_objectSpread({}, base), wordWrap), {
43
43
 
44
44
  var fieldHelperText = _objectSpread(_objectSpread(_objectSpread({}, base), wordWrap), {}, {
45
45
  fontSize: 'sm',
46
- pb: 'sm',
47
46
  '&.is-default': {
48
47
  color: 'text.secondary'
49
48
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "1.3.1",
3
+ "version": "1.3.2-alpha.2",
4
4
  "description": "PingUX themeable React component library",
5
5
  "author": "ux-development@pingidentity.com",
6
6
  "license": "Apache-2.0",