@patternfly/react-core 6.5.0-prerelease.24 → 6.5.0-prerelease.25

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 (136) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  22. package/dist/dynamic/components/Compass/package.json +1 -1
  23. package/dist/dynamic/components/Content/package.json +1 -1
  24. package/dist/dynamic/components/DataList/package.json +1 -1
  25. package/dist/dynamic/components/DatePicker/package.json +1 -1
  26. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  27. package/dist/dynamic/components/Divider/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hero/package.json +1 -1
  38. package/dist/dynamic/components/Hint/package.json +1 -1
  39. package/dist/dynamic/components/Icon/package.json +1 -1
  40. package/dist/dynamic/components/InputGroup/package.json +1 -1
  41. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  42. package/dist/dynamic/components/Label/package.json +1 -1
  43. package/dist/dynamic/components/List/package.json +1 -1
  44. package/dist/dynamic/components/LoginPage/package.json +1 -1
  45. package/dist/dynamic/components/Masthead/package.json +1 -1
  46. package/dist/dynamic/components/Menu/package.json +1 -1
  47. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  48. package/dist/dynamic/components/Modal/package.json +1 -1
  49. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  50. package/dist/dynamic/components/Nav/package.json +1 -1
  51. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  52. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  53. package/dist/dynamic/components/NumberInput/package.json +1 -1
  54. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  55. package/dist/dynamic/components/Page/package.json +1 -1
  56. package/dist/dynamic/components/Pagination/package.json +1 -1
  57. package/dist/dynamic/components/Panel/package.json +1 -1
  58. package/dist/dynamic/components/Popover/package.json +1 -1
  59. package/dist/dynamic/components/Progress/package.json +1 -1
  60. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  61. package/dist/dynamic/components/Radio/package.json +1 -1
  62. package/dist/dynamic/components/SearchInput/package.json +1 -1
  63. package/dist/dynamic/components/Select/package.json +1 -1
  64. package/dist/dynamic/components/Sidebar/package.json +1 -1
  65. package/dist/dynamic/components/SimpleList/package.json +1 -1
  66. package/dist/dynamic/components/Skeleton/package.json +1 -1
  67. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  68. package/dist/dynamic/components/Slider/package.json +1 -1
  69. package/dist/dynamic/components/Spinner/package.json +1 -1
  70. package/dist/dynamic/components/Switch/package.json +1 -1
  71. package/dist/dynamic/components/Tabs/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/TimePicker/package.json +1 -1
  76. package/dist/dynamic/components/Timestamp/package.json +1 -1
  77. package/dist/dynamic/components/Title/package.json +1 -1
  78. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  79. package/dist/dynamic/components/Toolbar/package.json +1 -1
  80. package/dist/dynamic/components/Tooltip/package.json +1 -1
  81. package/dist/dynamic/components/TreeView/package.json +1 -1
  82. package/dist/dynamic/components/Truncate/package.json +1 -1
  83. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/package.json +1 -1
  92. package/dist/dynamic/helpers/AnimationsProvider/AnimationsProvider/package.json +1 -1
  93. package/dist/dynamic/helpers/AnimationsProvider/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  102. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  103. package/dist/dynamic/helpers/package.json +1 -1
  104. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  105. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  106. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  107. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  108. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  109. package/dist/dynamic/helpers/util/package.json +1 -1
  110. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  111. package/dist/dynamic/layouts/Flex/package.json +1 -1
  112. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  113. package/dist/dynamic/layouts/Grid/package.json +1 -1
  114. package/dist/dynamic/layouts/Level/package.json +1 -1
  115. package/dist/dynamic/layouts/Split/package.json +1 -1
  116. package/dist/dynamic/layouts/Stack/package.json +1 -1
  117. package/dist/dynamic/styles/package.json +1 -1
  118. package/dist/esm/components/ClipboardCopy/ClipboardCopy.d.ts +8 -0
  119. package/dist/esm/components/ClipboardCopy/ClipboardCopy.d.ts.map +1 -1
  120. package/dist/esm/components/ClipboardCopy/ClipboardCopy.js +4 -2
  121. package/dist/esm/components/ClipboardCopy/ClipboardCopy.js.map +1 -1
  122. package/dist/js/components/ClipboardCopy/ClipboardCopy.d.ts +8 -0
  123. package/dist/js/components/ClipboardCopy/ClipboardCopy.d.ts.map +1 -1
  124. package/dist/js/components/ClipboardCopy/ClipboardCopy.js +4 -2
  125. package/dist/js/components/ClipboardCopy/ClipboardCopy.js.map +1 -1
  126. package/dist/umd/assets/{output-BbsSnXfK.css → output-ClqppqYH.css} +17730 -17730
  127. package/dist/umd/react-core.min.js +2 -2
  128. package/helpers/package.json +1 -1
  129. package/layouts/package.json +1 -1
  130. package/next/package.json +1 -1
  131. package/package.json +2 -2
  132. package/src/components/ClipboardCopy/ClipboardCopy.tsx +16 -1
  133. package/src/components/ClipboardCopy/__tests__/ClipboardCopy.test.tsx +72 -0
  134. package/src/components/ClipboardCopy/__tests__/__snapshots__/ClipboardCopy.test.tsx.snap +1 -1
  135. package/src/components/Dropdown/examples/Dropdown.md +13 -1
  136. package/src/components/Dropdown/examples/DropdownWithSplit.tsx +97 -0
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.5.0-prerelease.23","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.5.0-prerelease.24","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.5.0-prerelease.23","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.5.0-prerelease.24","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.5.0-prerelease.23","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.5.0-prerelease.24","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.5.0-prerelease.24",
3
+ "version": "6.5.0-prerelease.25",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -63,5 +63,5 @@
63
63
  "react": "^17 || ^18 || ^19",
64
64
  "react-dom": "^17 || ^18 || ^19"
65
65
  },
66
- "gitHead": "a5726d0a999e6397b5df4e339b03c01efdb0f070"
66
+ "gitHead": "e9f9e1fc3f1dfdc3f9474618a303d2f811ea06c5"
67
67
  }
@@ -55,6 +55,10 @@ export interface ClipboardCopyProps extends Omit<React.HTMLProps<HTMLDivElement>
55
55
  textAriaLabel?: string;
56
56
  /** Aria-label to use on the ClipboardCopyToggle. */
57
57
  toggleAriaLabel?: string;
58
+ /** ID to use on the TextInput. */
59
+ inputId?: string;
60
+ /** Name attribute to use on the TextInput. */
61
+ inputName?: string;
58
62
  /** Flag to show if the input is read only. */
59
63
  isReadOnly?: boolean;
60
64
  /** Flag to determine if clipboard copy is in the expanded state initially */
@@ -91,6 +95,10 @@ export interface ClipboardCopyProps extends Omit<React.HTMLProps<HTMLDivElement>
91
95
  onCopy?: (event: React.ClipboardEvent<HTMLDivElement>, text?: React.ReactNode) => void;
92
96
  /** A function that is triggered on changing the text. */
93
97
  onChange?: (event: React.FormEvent, text?: string) => void;
98
+ /** Callback function when text input is focused */
99
+ onInputFocus?: (event?: any) => void;
100
+ /** Callback function when text input is blurred (focus leaves) */
101
+ onInputBlur?: (event?: any) => void;
94
102
  /** The text which is copied. */
95
103
  children: string | string[];
96
104
  /** Additional actions for inline clipboard copy. Should be wrapped with ClipboardCopyAction. */
@@ -177,6 +185,8 @@ class ClipboardCopy extends Component<ClipboardCopyProps, ClipboardCopyState> {
177
185
  /* eslint-disable @typescript-eslint/no-unused-vars */
178
186
  isExpanded,
179
187
  onChange, // Don't pass to <div>
188
+ onInputFocus, // Don't pass to <div>
189
+ onInputBlur, // Don't pass to <div>
180
190
  /* eslint-enable @typescript-eslint/no-unused-vars */
181
191
  isReadOnly,
182
192
  isCode,
@@ -189,6 +199,8 @@ class ClipboardCopy extends Component<ClipboardCopyProps, ClipboardCopyState> {
189
199
  clickTip,
190
200
  textAriaLabel,
191
201
  toggleAriaLabel,
202
+ inputId,
203
+ inputName,
192
204
  variant,
193
205
  position,
194
206
  className,
@@ -295,8 +307,11 @@ class ClipboardCopy extends Component<ClipboardCopyProps, ClipboardCopyState> {
295
307
  readOnlyVariant={isReadOnly || this.state.expanded ? 'default' : undefined}
296
308
  onChange={this.updateText}
297
309
  value={this.state.expanded ? this.state.textWhenExpanded : copyableText}
298
- id={`text-input-${id}`}
310
+ id={inputId ?? `text-input-${id}`}
311
+ name={inputName}
299
312
  aria-label={textAriaLabel}
313
+ onFocus={onInputFocus}
314
+ onBlur={onInputBlur}
300
315
  {...(isCode && { dir: 'ltr' })}
301
316
  />
302
317
  <ClipboardCopyButton
@@ -309,6 +309,18 @@ test('Passes textAriaLabel to TextInput', () => {
309
309
  expect(screen.getByRole('textbox')).toHaveAccessibleName('text label');
310
310
  });
311
311
 
312
+ test('Passes inputId to TextInput', () => {
313
+ render(<ClipboardCopy inputId="custom-input-id">{children}</ClipboardCopy>);
314
+
315
+ expect(screen.getByRole('textbox')).toHaveAttribute('id', 'custom-input-id');
316
+ });
317
+
318
+ test('Passes inputName to TextInput', () => {
319
+ render(<ClipboardCopy inputName="custom-input-name">{children}</ClipboardCopy>);
320
+
321
+ expect(screen.getByRole('textbox')).toHaveAttribute('name', 'custom-input-name');
322
+ });
323
+
312
324
  test('Calls onChange when ClipboardCopy textinput is typed in', async () => {
313
325
  const onChangeMock = jest.fn();
314
326
  const user = userEvent.setup();
@@ -338,6 +350,66 @@ test('Does not call onChange when ClipboardCopy textinput is not typed in', asyn
338
350
  expect(onChangeMock).not.toHaveBeenCalled();
339
351
  });
340
352
 
353
+ test('Calls onFocus when ClipboardCopy textinput is focused', async () => {
354
+ const onFocusMock = jest.fn();
355
+ const user = userEvent.setup();
356
+
357
+ render(<ClipboardCopy onInputFocus={onFocusMock}>{children}</ClipboardCopy>);
358
+
359
+ await user.click(screen.getByRole('textbox'));
360
+
361
+ expect(onFocusMock).toHaveBeenCalledTimes(1);
362
+ });
363
+
364
+ test('Does not call onFocus when ClipboardCopy textinput is not focused', async () => {
365
+ const onFocusMock = jest.fn();
366
+ const user = userEvent.setup();
367
+
368
+ render(
369
+ <>
370
+ <ClipboardCopy onInputFocus={onFocusMock}>{children}</ClipboardCopy>
371
+ <input aria-label="native input" />
372
+ </>
373
+ );
374
+
375
+ await user.click(screen.getByRole('textbox', { name: 'native input' }));
376
+
377
+ expect(onFocusMock).not.toHaveBeenCalled();
378
+ });
379
+
380
+ test('Calls onBlur when ClipboardCopy textinput loses focus', async () => {
381
+ const onBlurMock = jest.fn();
382
+ const user = userEvent.setup();
383
+
384
+ render(
385
+ <>
386
+ <ClipboardCopy onInputBlur={onBlurMock}>{children}</ClipboardCopy>
387
+ <input aria-label="native input" />
388
+ </>
389
+ );
390
+
391
+ await user.click(screen.getByRole('textbox', { name: 'Copyable input' }));
392
+ await user.click(screen.getByRole('textbox', { name: 'native input' }));
393
+
394
+ expect(onBlurMock).toHaveBeenCalledTimes(1);
395
+ });
396
+
397
+ test('Does not call onBlur when ClipboardCopy textinput does not lose focus', async () => {
398
+ const onBlurMock = jest.fn();
399
+ const user = userEvent.setup();
400
+
401
+ render(
402
+ <>
403
+ <ClipboardCopy onInputBlur={onBlurMock}>{children}</ClipboardCopy>
404
+ <input aria-label="native input" />
405
+ </>
406
+ );
407
+
408
+ await user.click(screen.getByRole('textbox', { name: 'native input' }));
409
+
410
+ expect(onBlurMock).not.toHaveBeenCalled();
411
+ });
412
+
341
413
  test('Calls onCopy when ClipboardCopyButton is clicked', async () => {
342
414
  const onCopyMock = jest.fn();
343
415
  const user = userEvent.setup();
@@ -18,7 +18,7 @@ exports[`Matches snapshot 1`] = `
18
18
  <input
19
19
  aria-invalid="false"
20
20
  aria-label="Copyable input"
21
- data-ouia-component-id="OUIA-Generated-TextInputBase-36"
21
+ data-ouia-component-id="OUIA-Generated-TextInputBase-42"
22
22
  data-ouia-component-type="PF6/TextInput"
23
23
  data-ouia-safe="true"
24
24
  id="text-input-generated-id"
@@ -16,7 +16,7 @@ propComponents:
16
16
  ]
17
17
  ---
18
18
 
19
- import { useState } from 'react';
19
+ import { useState, useRef } from 'react';
20
20
  import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
21
21
 
22
22
  ## Examples
@@ -63,3 +63,15 @@ To provide users with more context about a `<DropdownItem>`, pass a short messag
63
63
  ```ts file="./DropdownWithDescriptions.tsx"
64
64
 
65
65
  ```
66
+
67
+ ### Split toggle with checkbox
68
+
69
+ To combine a checkbox or other control with a dropdown menu, use a split button.
70
+
71
+ A `<MenuToggle>` can be rendered as a split button via `splitButtonItems`. Elements to be displayed before the dropdown toggle button (like the `<MenuToggleCheckbox>`) must be included in the `splitButtonItems`.
72
+
73
+ If the dropdown menu closes upon selection, you will need to manually shift focus back to the toggle element after a user selects an item from the menu.
74
+
75
+ ```ts file="./DropdownWithSplit.tsx"
76
+
77
+ ```
@@ -0,0 +1,97 @@
1
+ import {
2
+ Dropdown,
3
+ MenuToggle,
4
+ MenuToggleCheckbox,
5
+ DropdownItem,
6
+ DropdownList,
7
+ Divider,
8
+ MenuToggleElement
9
+ } from '@patternfly/react-core';
10
+ import { useRef, useState } from 'react';
11
+
12
+ export const DropdownSplitButtonText: React.FunctionComponent = () => {
13
+ const [isOpen, setIsOpen] = useState(false);
14
+ const toggleRef = useRef<MenuToggleElement>(null);
15
+
16
+ const onFocus = () => {
17
+ if (!toggleRef.current) {
18
+ return;
19
+ }
20
+
21
+ const toggleButton = toggleRef.current.querySelector('button[aria-expanded]');
22
+ toggleButton?.focus();
23
+ };
24
+
25
+ const onSelect = () => {
26
+ setIsOpen(false);
27
+ onFocus();
28
+ };
29
+
30
+ const onToggleClick = () => {
31
+ setIsOpen(!isOpen);
32
+ };
33
+
34
+ return (
35
+ <Dropdown
36
+ onSelect={onSelect}
37
+ onOpenChange={(isOpen: boolean) => setIsOpen(isOpen)}
38
+ toggle={(toggleRefCallback: React.Ref<MenuToggleElement>) => (
39
+ <MenuToggle
40
+ ref={(node) => {
41
+ // Handle both callback ref and useRef
42
+ if (typeof toggleRefCallback === 'function') {
43
+ toggleRefCallback(node);
44
+ } else if (toggleRefCallback) {
45
+ (toggleRefCallback as React.MutableRefObject<MenuToggleElement | null>).current = node;
46
+ }
47
+ (toggleRef as React.MutableRefObject<MenuToggleElement | null>).current = node;
48
+ }}
49
+ splitButtonItems={[
50
+ <MenuToggleCheckbox id="split-button-checkbox-example" key="split-checkbox" aria-label="Select all" />
51
+ ]}
52
+ aria-label="Dropdown with checkbox split button"
53
+ onClick={onToggleClick}
54
+ isExpanded={isOpen}
55
+ />
56
+ )}
57
+ isOpen={isOpen}
58
+ >
59
+ <DropdownList>
60
+ <DropdownItem value={0} key="action">
61
+ Action
62
+ </DropdownItem>
63
+ <DropdownItem
64
+ value={1}
65
+ key="link"
66
+ to="#default-link2"
67
+ // Prevent the default onClick functionality for example purposes
68
+ onClick={(ev: any) => ev.preventDefault()}
69
+ >
70
+ Link
71
+ </DropdownItem>
72
+ <DropdownItem value={2} isDisabled key="disabled action">
73
+ Disabled Action
74
+ </DropdownItem>
75
+ <DropdownItem value={3} isDisabled key="disabled link" to="#default-link4">
76
+ Disabled Link
77
+ </DropdownItem>
78
+ <DropdownItem
79
+ value={4}
80
+ isAriaDisabled
81
+ key="aria-disabled link"
82
+ to="#default-link5"
83
+ tooltipProps={{ content: 'aria-disabled link', position: 'top' }}
84
+ >
85
+ Aria-disabled Link
86
+ </DropdownItem>
87
+ <Divider component="li" key="separator" />
88
+ <DropdownItem value={5} key="separated action">
89
+ Separated Action
90
+ </DropdownItem>
91
+ <DropdownItem value={6} key="separated link" to="#default-link6" onClick={(ev) => ev.preventDefault()}>
92
+ Separated Link
93
+ </DropdownItem>
94
+ </DropdownList>
95
+ </Dropdown>
96
+ );
97
+ };