@patternfly/react-core 5.0.0-alpha.62 → 5.0.0-alpha.63

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 (227) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/esm/components/CalendarMonth/CalendarMonth.d.ts.map +1 -1
  3. package/dist/esm/components/CalendarMonth/CalendarMonth.js +9 -11
  4. package/dist/esm/components/CalendarMonth/CalendarMonth.js.map +1 -1
  5. package/dist/esm/components/DualListSelector/DualListSelectorControl.d.ts +1 -1
  6. package/dist/esm/components/Menu/MenuItem.d.ts +1 -1
  7. package/dist/esm/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  8. package/dist/esm/components/MenuToggle/MenuToggle.js +3 -1
  9. package/dist/esm/components/MenuToggle/MenuToggle.js.map +1 -1
  10. package/dist/esm/components/Select/Select.d.ts +26 -192
  11. package/dist/esm/components/Select/Select.d.ts.map +1 -1
  12. package/dist/esm/components/Select/Select.js +51 -935
  13. package/dist/esm/components/Select/Select.js.map +1 -1
  14. package/dist/esm/components/Select/SelectGroup.d.ts +7 -8
  15. package/dist/esm/components/Select/SelectGroup.d.ts.map +1 -1
  16. package/dist/esm/components/Select/SelectGroup.js +4 -7
  17. package/dist/esm/components/Select/SelectGroup.js.map +1 -1
  18. package/dist/{js/next → esm}/components/Select/SelectList.d.ts +1 -1
  19. package/dist/esm/components/Select/SelectList.d.ts.map +1 -0
  20. package/dist/esm/{next/components → components}/Select/SelectList.js +1 -1
  21. package/dist/esm/components/Select/SelectList.js.map +1 -0
  22. package/dist/esm/components/Select/SelectOption.d.ts +13 -66
  23. package/dist/esm/components/Select/SelectOption.d.ts.map +1 -1
  24. package/dist/esm/components/Select/SelectOption.js +6 -192
  25. package/dist/esm/components/Select/SelectOption.js.map +1 -1
  26. package/dist/esm/components/Select/index.d.ts +1 -1
  27. package/dist/esm/components/Select/index.d.ts.map +1 -1
  28. package/dist/esm/components/Select/index.js +1 -1
  29. package/dist/esm/components/Select/index.js.map +1 -1
  30. package/dist/esm/deprecated/components/Select/Select.d.ts +199 -0
  31. package/dist/esm/deprecated/components/Select/Select.d.ts.map +1 -0
  32. package/dist/esm/deprecated/components/Select/Select.js +940 -0
  33. package/dist/esm/deprecated/components/Select/Select.js.map +1 -0
  34. package/dist/esm/deprecated/components/Select/SelectGroup.d.ts +13 -0
  35. package/dist/esm/deprecated/components/Select/SelectGroup.d.ts.map +1 -0
  36. package/dist/esm/deprecated/components/Select/SelectGroup.js +13 -0
  37. package/dist/esm/deprecated/components/Select/SelectGroup.js.map +1 -0
  38. package/dist/esm/deprecated/components/Select/SelectMenu.d.ts.map +1 -0
  39. package/dist/esm/{components → deprecated/components}/Select/SelectMenu.js +1 -1
  40. package/dist/esm/deprecated/components/Select/SelectMenu.js.map +1 -0
  41. package/dist/esm/deprecated/components/Select/SelectOption.d.ts +73 -0
  42. package/dist/esm/deprecated/components/Select/SelectOption.d.ts.map +1 -0
  43. package/dist/esm/deprecated/components/Select/SelectOption.js +196 -0
  44. package/dist/esm/deprecated/components/Select/SelectOption.js.map +1 -0
  45. package/dist/esm/deprecated/components/Select/SelectToggle.d.ts.map +1 -0
  46. package/dist/esm/{components → deprecated/components}/Select/SelectToggle.js +2 -2
  47. package/dist/esm/deprecated/components/Select/SelectToggle.js.map +1 -0
  48. package/dist/esm/{next → deprecated}/components/Select/index.d.ts +1 -1
  49. package/dist/esm/deprecated/components/Select/index.d.ts.map +1 -0
  50. package/dist/esm/{next → deprecated}/components/Select/index.js +1 -1
  51. package/dist/esm/deprecated/components/Select/index.js.map +1 -0
  52. package/dist/esm/deprecated/components/Select/selectConstants.d.ts.map +1 -0
  53. package/dist/esm/deprecated/components/Select/selectConstants.js.map +1 -0
  54. package/dist/esm/deprecated/components/index.d.ts +1 -0
  55. package/dist/esm/deprecated/components/index.d.ts.map +1 -1
  56. package/dist/esm/deprecated/components/index.js +1 -0
  57. package/dist/esm/deprecated/components/index.js.map +1 -1
  58. package/dist/esm/next/components/index.d.ts +0 -1
  59. package/dist/esm/next/components/index.d.ts.map +1 -1
  60. package/dist/esm/next/components/index.js +0 -1
  61. package/dist/esm/next/components/index.js.map +1 -1
  62. package/dist/js/components/CalendarMonth/CalendarMonth.d.ts.map +1 -1
  63. package/dist/js/components/CalendarMonth/CalendarMonth.js +8 -10
  64. package/dist/js/components/CalendarMonth/CalendarMonth.js.map +1 -1
  65. package/dist/js/components/DualListSelector/DualListSelectorControl.d.ts +1 -1
  66. package/dist/js/components/Menu/MenuItem.d.ts +1 -1
  67. package/dist/js/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  68. package/dist/js/components/MenuToggle/MenuToggle.js +3 -1
  69. package/dist/js/components/MenuToggle/MenuToggle.js.map +1 -1
  70. package/dist/js/components/Select/Select.d.ts +26 -192
  71. package/dist/js/components/Select/Select.d.ts.map +1 -1
  72. package/dist/js/components/Select/Select.js +51 -936
  73. package/dist/js/components/Select/Select.js.map +1 -1
  74. package/dist/js/components/Select/SelectGroup.d.ts +7 -8
  75. package/dist/js/components/Select/SelectGroup.d.ts.map +1 -1
  76. package/dist/js/components/Select/SelectGroup.js +4 -7
  77. package/dist/js/components/Select/SelectGroup.js.map +1 -1
  78. package/dist/{esm/next → js}/components/Select/SelectList.d.ts +1 -1
  79. package/dist/js/components/Select/SelectList.d.ts.map +1 -0
  80. package/dist/js/{next/components → components}/Select/SelectList.js +1 -1
  81. package/dist/js/components/Select/SelectList.js.map +1 -0
  82. package/dist/js/components/Select/SelectOption.d.ts +13 -66
  83. package/dist/js/components/Select/SelectOption.d.ts.map +1 -1
  84. package/dist/js/components/Select/SelectOption.js +7 -193
  85. package/dist/js/components/Select/SelectOption.js.map +1 -1
  86. package/dist/js/components/Select/index.d.ts +1 -1
  87. package/dist/js/components/Select/index.d.ts.map +1 -1
  88. package/dist/js/components/Select/index.js +1 -1
  89. package/dist/js/components/Select/index.js.map +1 -1
  90. package/dist/js/deprecated/components/Select/Select.d.ts +199 -0
  91. package/dist/js/deprecated/components/Select/Select.d.ts.map +1 -0
  92. package/dist/js/deprecated/components/Select/Select.js +944 -0
  93. package/dist/js/deprecated/components/Select/Select.js.map +1 -0
  94. package/dist/js/deprecated/components/Select/SelectGroup.d.ts +13 -0
  95. package/dist/js/deprecated/components/Select/SelectGroup.d.ts.map +1 -0
  96. package/dist/js/deprecated/components/Select/SelectGroup.js +17 -0
  97. package/dist/js/deprecated/components/Select/SelectGroup.js.map +1 -0
  98. package/dist/js/deprecated/components/Select/SelectMenu.d.ts.map +1 -0
  99. package/dist/js/{components → deprecated/components}/Select/SelectMenu.js +1 -1
  100. package/dist/js/deprecated/components/Select/SelectMenu.js.map +1 -0
  101. package/dist/js/deprecated/components/Select/SelectOption.d.ts +73 -0
  102. package/dist/js/deprecated/components/Select/SelectOption.d.ts.map +1 -0
  103. package/dist/js/deprecated/components/Select/SelectOption.js +200 -0
  104. package/dist/js/deprecated/components/Select/SelectOption.js.map +1 -0
  105. package/dist/js/deprecated/components/Select/SelectToggle.d.ts.map +1 -0
  106. package/dist/js/{components → deprecated/components}/Select/SelectToggle.js +2 -2
  107. package/dist/js/deprecated/components/Select/SelectToggle.js.map +1 -0
  108. package/dist/js/{next → deprecated}/components/Select/index.d.ts +1 -1
  109. package/dist/js/deprecated/components/Select/index.d.ts.map +1 -0
  110. package/dist/js/{next → deprecated}/components/Select/index.js +1 -1
  111. package/dist/js/deprecated/components/Select/index.js.map +1 -0
  112. package/dist/js/deprecated/components/Select/selectConstants.d.ts.map +1 -0
  113. package/dist/js/deprecated/components/Select/selectConstants.js.map +1 -0
  114. package/dist/js/deprecated/components/index.d.ts +1 -0
  115. package/dist/js/deprecated/components/index.d.ts.map +1 -1
  116. package/dist/js/deprecated/components/index.js +1 -0
  117. package/dist/js/deprecated/components/index.js.map +1 -1
  118. package/dist/js/next/components/index.d.ts +0 -1
  119. package/dist/js/next/components/index.d.ts.map +1 -1
  120. package/dist/js/next/components/index.js +0 -1
  121. package/dist/js/next/components/index.js.map +1 -1
  122. package/dist/umd/react-core.min.js +3 -3
  123. package/package.json +2 -2
  124. package/src/components/CalendarMonth/CalendarMonth.tsx +25 -15
  125. package/src/components/DatePicker/__tests__/__snapshots__/DatePicker.test.tsx.snap +22 -31
  126. package/src/components/LoginPage/examples/LoginPageLanguageSelect.tsx +28 -19
  127. package/src/components/MenuToggle/MenuToggle.tsx +2 -1
  128. package/src/components/MenuToggle/__tests__/__snapshots__/MenuToggle.test.tsx.snap +18 -10
  129. package/src/components/Select/Select.tsx +113 -1475
  130. package/src/components/Select/SelectGroup.tsx +13 -25
  131. package/src/{next/components → components}/Select/SelectList.tsx +1 -1
  132. package/src/components/Select/SelectOption.tsx +22 -452
  133. package/src/components/Select/examples/Select.md +11 -2897
  134. package/src/{next/components → components}/Select/examples/SelectBasic.tsx +1 -2
  135. package/src/{next/components → components}/Select/examples/SelectCheckbox.tsx +1 -2
  136. package/src/{next/components → components}/Select/examples/SelectGrouped.tsx +1 -2
  137. package/src/{next/components → components}/Select/examples/SelectMultiTypeahead.tsx +4 -1
  138. package/src/{next/components → components}/Select/examples/SelectTypeahead.tsx +4 -1
  139. package/src/components/Select/index.ts +1 -1
  140. package/src/components/Toolbar/__tests__/Toolbar.test.tsx +3 -21
  141. package/src/components/Toolbar/__tests__/__snapshots__/Toolbar.test.tsx.snap +12 -124
  142. package/src/components/Toolbar/examples/Toolbar.md +0 -1
  143. package/src/components/Toolbar/examples/ToolbarComponentManagedToggleGroups.tsx +59 -63
  144. package/src/components/Toolbar/examples/ToolbarConsumerManagedToggleGroups.tsx +58 -62
  145. package/src/components/Toolbar/examples/ToolbarCustomChipGroupContent.tsx +107 -23
  146. package/src/components/Toolbar/examples/ToolbarGroups.tsx +96 -59
  147. package/src/components/Toolbar/examples/ToolbarStacked.tsx +56 -39
  148. package/src/components/Toolbar/examples/ToolbarWithFilters.tsx +115 -28
  149. package/src/components/Tooltip/examples/TooltipOptions.tsx +53 -23
  150. package/src/demos/Card/Card.md +39 -23
  151. package/src/demos/CardDemos.md +99 -46
  152. package/src/demos/Toolbar.md +51 -21
  153. package/src/demos/examples/Tabs/TabsAndTable.tsx +5 -22
  154. package/src/deprecated/components/Select/Select.tsx +1495 -0
  155. package/src/deprecated/components/Select/SelectGroup.tsx +36 -0
  156. package/src/{components → deprecated/components}/Select/SelectMenu.tsx +2 -2
  157. package/src/deprecated/components/Select/SelectOption.tsx +461 -0
  158. package/src/{components → deprecated/components}/Select/SelectToggle.tsx +3 -3
  159. package/src/{components → deprecated/components}/Select/__tests__/Select.test.tsx +1 -1
  160. package/src/deprecated/components/Select/examples/Select.md +2937 -0
  161. package/src/{next → deprecated}/components/Select/index.ts +1 -1
  162. package/src/deprecated/components/index.ts +1 -0
  163. package/src/next/components/index.ts +0 -1
  164. package/dist/esm/components/Select/SelectMenu.d.ts.map +0 -1
  165. package/dist/esm/components/Select/SelectMenu.js.map +0 -1
  166. package/dist/esm/components/Select/SelectToggle.d.ts.map +0 -1
  167. package/dist/esm/components/Select/SelectToggle.js.map +0 -1
  168. package/dist/esm/components/Select/selectConstants.d.ts.map +0 -1
  169. package/dist/esm/components/Select/selectConstants.js.map +0 -1
  170. package/dist/esm/next/components/Select/Select.d.ts +0 -33
  171. package/dist/esm/next/components/Select/Select.d.ts.map +0 -1
  172. package/dist/esm/next/components/Select/Select.js +0 -56
  173. package/dist/esm/next/components/Select/Select.js.map +0 -1
  174. package/dist/esm/next/components/Select/SelectGroup.d.ts +0 -12
  175. package/dist/esm/next/components/Select/SelectGroup.d.ts.map +0 -1
  176. package/dist/esm/next/components/Select/SelectGroup.js +0 -10
  177. package/dist/esm/next/components/Select/SelectGroup.js.map +0 -1
  178. package/dist/esm/next/components/Select/SelectList.d.ts.map +0 -1
  179. package/dist/esm/next/components/Select/SelectList.js.map +0 -1
  180. package/dist/esm/next/components/Select/SelectOption.d.ts +0 -20
  181. package/dist/esm/next/components/Select/SelectOption.d.ts.map +0 -1
  182. package/dist/esm/next/components/Select/SelectOption.js +0 -10
  183. package/dist/esm/next/components/Select/SelectOption.js.map +0 -1
  184. package/dist/esm/next/components/Select/index.d.ts.map +0 -1
  185. package/dist/esm/next/components/Select/index.js.map +0 -1
  186. package/dist/js/components/Select/SelectMenu.d.ts.map +0 -1
  187. package/dist/js/components/Select/SelectMenu.js.map +0 -1
  188. package/dist/js/components/Select/SelectToggle.d.ts.map +0 -1
  189. package/dist/js/components/Select/SelectToggle.js.map +0 -1
  190. package/dist/js/components/Select/selectConstants.d.ts.map +0 -1
  191. package/dist/js/components/Select/selectConstants.js.map +0 -1
  192. package/dist/js/next/components/Select/Select.d.ts +0 -33
  193. package/dist/js/next/components/Select/Select.d.ts.map +0 -1
  194. package/dist/js/next/components/Select/Select.js +0 -59
  195. package/dist/js/next/components/Select/Select.js.map +0 -1
  196. package/dist/js/next/components/Select/SelectGroup.d.ts +0 -12
  197. package/dist/js/next/components/Select/SelectGroup.d.ts.map +0 -1
  198. package/dist/js/next/components/Select/SelectGroup.js +0 -14
  199. package/dist/js/next/components/Select/SelectGroup.js.map +0 -1
  200. package/dist/js/next/components/Select/SelectList.d.ts.map +0 -1
  201. package/dist/js/next/components/Select/SelectList.js.map +0 -1
  202. package/dist/js/next/components/Select/SelectOption.d.ts +0 -20
  203. package/dist/js/next/components/Select/SelectOption.d.ts.map +0 -1
  204. package/dist/js/next/components/Select/SelectOption.js +0 -14
  205. package/dist/js/next/components/Select/SelectOption.js.map +0 -1
  206. package/dist/js/next/components/Select/index.d.ts.map +0 -1
  207. package/dist/js/next/components/Select/index.js.map +0 -1
  208. package/src/next/components/Select/Select.tsx +0 -133
  209. package/src/next/components/Select/SelectGroup.tsx +0 -24
  210. package/src/next/components/Select/SelectOption.tsx +0 -31
  211. package/src/next/components/Select/examples/Select.md +0 -38
  212. /package/dist/esm/{components → deprecated/components}/Select/SelectMenu.d.ts +0 -0
  213. /package/dist/esm/{components → deprecated/components}/Select/SelectToggle.d.ts +0 -0
  214. /package/dist/esm/{components → deprecated/components}/Select/selectConstants.d.ts +0 -0
  215. /package/dist/esm/{components → deprecated/components}/Select/selectConstants.js +0 -0
  216. /package/dist/js/{components → deprecated/components}/Select/SelectMenu.d.ts +0 -0
  217. /package/dist/js/{components → deprecated/components}/Select/SelectToggle.d.ts +0 -0
  218. /package/dist/js/{components → deprecated/components}/Select/selectConstants.d.ts +0 -0
  219. /package/dist/js/{components → deprecated/components}/Select/selectConstants.js +0 -0
  220. /package/src/{components → deprecated/components}/Select/__tests__/SelectGroup.test.tsx +0 -0
  221. /package/src/{components → deprecated/components}/Select/__tests__/SelectOption.test.tsx +0 -0
  222. /package/src/{components → deprecated/components}/Select/__tests__/SelectToggle.test.tsx +0 -0
  223. /package/src/{components → deprecated/components}/Select/__tests__/__snapshots__/Select.test.tsx.snap +0 -0
  224. /package/src/{components → deprecated/components}/Select/__tests__/__snapshots__/SelectGroup.test.tsx.snap +0 -0
  225. /package/src/{components → deprecated/components}/Select/__tests__/__snapshots__/SelectOption.test.tsx.snap +0 -0
  226. /package/src/{components → deprecated/components}/Select/__tests__/__snapshots__/SelectToggle.test.tsx.snap +0 -0
  227. /package/src/{components → deprecated/components}/Select/selectConstants.tsx +0 -0
@@ -0,0 +1,36 @@
1
+ import * as React from 'react';
2
+ import styles from '@patternfly/react-styles/css/components/Select/select';
3
+ import { css } from '@patternfly/react-styles';
4
+
5
+ import { SelectConsumer, SelectVariant } from './selectConstants';
6
+
7
+ export interface SelectGroupProps extends React.HTMLProps<HTMLDivElement> {
8
+ /** Checkboxes within group. Must be React.ReactElement<SelectOptionProps>[] */
9
+ children?: React.ReactNode;
10
+ /** Additional classes added to the CheckboxSelectGroup control */
11
+ className?: string;
12
+ /** Group label */
13
+ label?: string;
14
+ /** ID for title label */
15
+ titleId?: string;
16
+ }
17
+
18
+ export const SelectGroup: React.FunctionComponent<SelectGroupProps> = ({
19
+ children = [],
20
+ className = '',
21
+ label = '',
22
+ titleId = '',
23
+ ...props
24
+ }: SelectGroupProps) => (
25
+ <SelectConsumer>
26
+ {({ variant }) => (
27
+ <div {...props} className={css(styles.selectMenuGroup, className)}>
28
+ <div className={css(styles.selectMenuGroupTitle)} id={titleId} aria-hidden>
29
+ {label}
30
+ </div>
31
+ {variant === SelectVariant.checkbox ? children : <ul role="listbox">{children}</ul>}
32
+ </div>
33
+ )}
34
+ </SelectConsumer>
35
+ );
36
+ SelectGroup.displayName = 'SelectGroup';
@@ -4,10 +4,10 @@ import formStyles from '@patternfly/react-styles/css/components/Form/form';
4
4
  import { css } from '@patternfly/react-styles';
5
5
  import { SelectOptionObject, SelectOption } from './SelectOption';
6
6
  import { SelectConsumer, SelectPosition, SelectVariant, SelectContextInterface } from './selectConstants';
7
- import { PickOptional } from '../../helpers/typeUtils';
7
+ import { PickOptional } from '../../../helpers/typeUtils';
8
8
 
9
9
  import { SelectGroup } from './SelectGroup';
10
- import { Divider } from '../Divider/Divider';
10
+ import { Divider } from '../../../components/Divider/Divider';
11
11
 
12
12
  export interface SelectMenuProps extends Omit<React.HTMLProps<HTMLElement>, 'checked' | 'selected' | 'ref'> {
13
13
  /** Content rendered inside the SelectMenu */
@@ -0,0 +1,461 @@
1
+ import * as React from 'react';
2
+ import styles from '@patternfly/react-styles/css/components/Select/select';
3
+ import checkStyles from '@patternfly/react-styles/css/components/Check/check';
4
+ import { css } from '@patternfly/react-styles';
5
+ import CheckIcon from '@patternfly/react-icons/dist/esm/icons/check-icon';
6
+ import { SelectConsumer, SelectVariant } from './selectConstants';
7
+ import StarIcon from '@patternfly/react-icons/dist/esm/icons/star-icon';
8
+ import { getUniqueId } from '../../../helpers/util';
9
+ import { KeyTypes } from '../../../helpers/constants';
10
+
11
+ export interface SelectOptionObject {
12
+ /** Function returns a string to represent the select option object */
13
+ toString(): string;
14
+ /** Function returns a true if the passed in select option is equal to this select option object, false otherwise */
15
+ compareTo?(selectOption: any): boolean;
16
+ }
17
+ export interface SelectOptionProps extends Omit<React.HTMLProps<HTMLElement>, 'type' | 'ref' | 'value'> {
18
+ /** Optional alternate display for the option */
19
+ children?: React.ReactNode;
20
+ /** Additional classes added to the Select Option */
21
+ className?: string;
22
+ /** Description of the item for single and both typeahead select variants */
23
+ description?: React.ReactNode;
24
+ /** Number of items matching the option */
25
+ itemCount?: number;
26
+ /** @hide Internal index of the option */
27
+ index?: number;
28
+ /** Indicates which component will be used as select item */
29
+ component?: React.ReactNode;
30
+ /** The value for the option, can be a string or select option object */
31
+ value: string | SelectOptionObject;
32
+ /** Flag indicating if the option is disabled */
33
+ isDisabled?: boolean;
34
+ /** Flag indicating if the option acts as a placeholder */
35
+ isPlaceholder?: boolean;
36
+ /** Flag indicating if the option acts as a "no results" indicator */
37
+ isNoResultsOption?: boolean;
38
+ /** @hide Internal flag indicating if the option is selected */
39
+ isSelected?: boolean;
40
+ /** @hide Internal flag indicating if the option is checked */
41
+ isChecked?: boolean;
42
+ /** Flag forcing the focused state */
43
+ isFocused?: boolean;
44
+ /** @hide Internal callback for ref tracking */
45
+ sendRef?: (
46
+ ref: React.ReactNode,
47
+ favoriteRef: React.ReactNode,
48
+ optionContainerRef: React.ReactNode,
49
+ index: number
50
+ ) => void;
51
+ /** @hide Internal callback for keyboard navigation */
52
+ keyHandler?: (index: number, innerIndex: number, position: string) => void;
53
+ /** Optional callback for click event */
54
+ onClick?: (event: React.MouseEvent | React.ChangeEvent) => void;
55
+ /** Id of the checkbox input */
56
+ inputId?: string;
57
+ /** @hide Internal Flag indicating if the option is favorited */
58
+ isFavorite?: boolean;
59
+ /** Aria label text for favoritable button when favorited */
60
+ ariaIsFavoriteLabel?: string;
61
+ /** Aria label text for favoritable button when not favorited */
62
+ ariaIsNotFavoriteLabel?: string;
63
+ /** ID of the item. Required for tracking favorites */
64
+ id?: string;
65
+ /** @hide Internal flag to apply the load styling to view more option */
66
+ isLoad?: boolean;
67
+ /** @hide Internal flag to apply the loading styling to spinner */
68
+ isLoading?: boolean;
69
+ /** @hide Internal callback for the setting the index of the next item to focus after view more is clicked */
70
+ setViewMoreNextIndex?: () => void;
71
+ /** @hide Flag indicating this is the last option when there is a footer */
72
+ isLastOptionBeforeFooter?: (index: number) => boolean;
73
+ /** @hide Flag indicating that the the option loading variant is in a grouped select */
74
+ isGrouped?: boolean;
75
+ }
76
+
77
+ export class SelectOption extends React.Component<SelectOptionProps> {
78
+ static displayName = 'SelectOption';
79
+ private ref = React.createRef<any>();
80
+ private liRef = React.createRef<any>();
81
+ private favoriteRef = React.createRef<any>();
82
+ static defaultProps: SelectOptionProps = {
83
+ className: '',
84
+ value: '',
85
+ index: 0,
86
+ isDisabled: false,
87
+ isPlaceholder: false,
88
+ isSelected: false,
89
+ isChecked: false,
90
+ isNoResultsOption: false,
91
+ component: 'button',
92
+ onClick: () => {},
93
+ sendRef: () => {},
94
+ keyHandler: () => {},
95
+ inputId: '',
96
+ isFavorite: null,
97
+ isLoad: false,
98
+ isLoading: false,
99
+ setViewMoreNextIndex: () => {},
100
+ isLastOptionBeforeFooter: () => false
101
+ };
102
+
103
+ componentDidMount() {
104
+ this.props.sendRef(
105
+ this.props.isDisabled ? null : this.ref.current,
106
+ this.props.isDisabled ? null : this.favoriteRef.current,
107
+ this.props.isDisabled ? null : this.liRef.current,
108
+ this.props.index
109
+ );
110
+ }
111
+
112
+ componentDidUpdate() {
113
+ this.props.sendRef(
114
+ this.props.isDisabled ? null : this.ref.current,
115
+ this.props.isDisabled ? null : this.favoriteRef.current,
116
+ this.props.isDisabled ? null : this.liRef.current,
117
+ this.props.index
118
+ );
119
+ }
120
+
121
+ onKeyDown = (event: React.KeyboardEvent, innerIndex: number, onEnter?: any, isCheckbox?: boolean) => {
122
+ const { index, keyHandler, isLastOptionBeforeFooter } = this.props;
123
+ let isLastItemBeforeFooter = false;
124
+ if (isLastOptionBeforeFooter !== undefined) {
125
+ isLastItemBeforeFooter = isLastOptionBeforeFooter(index);
126
+ }
127
+
128
+ if (event.key === KeyTypes.Tab) {
129
+ // More modal-like experience for checkboxes
130
+ if (isCheckbox && !isLastItemBeforeFooter) {
131
+ if (event.shiftKey) {
132
+ keyHandler(index, innerIndex, 'up');
133
+ } else {
134
+ keyHandler(index, innerIndex, 'down');
135
+ }
136
+ event.stopPropagation();
137
+ } else {
138
+ if (event.shiftKey) {
139
+ keyHandler(index, innerIndex, 'up');
140
+ } else {
141
+ keyHandler(index, innerIndex, 'tab');
142
+ }
143
+ }
144
+ }
145
+ event.preventDefault();
146
+ if (event.key === KeyTypes.ArrowUp) {
147
+ keyHandler(index, innerIndex, 'up');
148
+ } else if (event.key === KeyTypes.ArrowDown) {
149
+ keyHandler(index, innerIndex, 'down');
150
+ } else if (event.key === KeyTypes.ArrowLeft) {
151
+ keyHandler(index, innerIndex, 'left');
152
+ } else if (event.key === KeyTypes.ArrowRight) {
153
+ keyHandler(index, innerIndex, 'right');
154
+ } else if (event.key === KeyTypes.Enter) {
155
+ if (onEnter !== undefined) {
156
+ onEnter();
157
+ } else {
158
+ this.ref.current.click();
159
+ }
160
+ }
161
+ };
162
+
163
+ render() {
164
+ /* eslint-disable @typescript-eslint/no-unused-vars */
165
+ const {
166
+ children,
167
+ className,
168
+ id,
169
+ description,
170
+ itemCount,
171
+ value,
172
+ onClick,
173
+ isDisabled,
174
+ isPlaceholder,
175
+ isNoResultsOption,
176
+ isSelected,
177
+ isChecked,
178
+ isFocused,
179
+ sendRef,
180
+ keyHandler,
181
+ index,
182
+ component,
183
+ inputId,
184
+ isFavorite,
185
+ ariaIsFavoriteLabel = 'starred',
186
+ ariaIsNotFavoriteLabel = 'not starred',
187
+ isLoad,
188
+ isLoading,
189
+ setViewMoreNextIndex,
190
+ // eslint-disable-next-line no-console
191
+ isLastOptionBeforeFooter,
192
+ isGrouped = false,
193
+ ...props
194
+ } = this.props;
195
+ /* eslint-enable @typescript-eslint/no-unused-vars */
196
+ const Component = component as any;
197
+
198
+ if (!id && isFavorite !== null) {
199
+ // eslint-disable-next-line no-console
200
+ console.error('Please provide an id to use the favorites feature.');
201
+ }
202
+
203
+ const generatedId = id || getUniqueId('select-option');
204
+ const favoriteButton = (onFavorite: any) => (
205
+ <button
206
+ className={css(styles.selectMenuItem, styles.modifiers.action, styles.modifiers.favoriteAction)}
207
+ aria-label={isFavorite ? ariaIsFavoriteLabel : ariaIsNotFavoriteLabel}
208
+ onClick={() => {
209
+ onFavorite(generatedId.replace('favorite-', ''), isFavorite);
210
+ }}
211
+ onKeyDown={event => {
212
+ this.onKeyDown(event, 1, () => onFavorite(generatedId.replace('favorite-', ''), isFavorite));
213
+ }}
214
+ ref={this.favoriteRef}
215
+ >
216
+ <span className={css(styles.selectMenuItemActionIcon)}>
217
+ <StarIcon />
218
+ </span>
219
+ </button>
220
+ );
221
+
222
+ const itemDisplay = itemCount ? (
223
+ <span className={css(styles.selectMenuItemRow)}>
224
+ <span className={css(styles.selectMenuItemText)}>
225
+ {children || (value && value.toString && value.toString())}
226
+ </span>
227
+ <span className={css(styles.selectMenuItemCount)}>{itemCount}</span>
228
+ </span>
229
+ ) : (
230
+ children || value.toString()
231
+ );
232
+
233
+ const onViewMoreClick = (event: any) => {
234
+ // Set the index for the next item to focus after view more clicked, then call view more callback
235
+ setViewMoreNextIndex();
236
+ onClick(event);
237
+ };
238
+
239
+ const renderOption = (
240
+ onSelect: (
241
+ event: React.MouseEvent<any, MouseEvent> | React.ChangeEvent<HTMLInputElement>,
242
+ value: string | SelectOptionObject,
243
+ isPlaceholder?: boolean
244
+ ) => void,
245
+ onClose: () => void,
246
+ variant: string,
247
+ inputIdPrefix: string,
248
+ onFavorite: (itemId: string, isFavorite: boolean) => void,
249
+ shouldResetOnSelect: boolean
250
+ ) => {
251
+ if (variant !== SelectVariant.checkbox && isLoading && isGrouped) {
252
+ return (
253
+ <div
254
+ role="presentation"
255
+ className={css(styles.selectListItem, isLoading && styles.modifiers.loading, className)}
256
+ >
257
+ {children}
258
+ </div>
259
+ );
260
+ } else if (variant !== SelectVariant.checkbox && isLoad && isGrouped) {
261
+ return (
262
+ <div>
263
+ <button
264
+ {...props}
265
+ role="presentation"
266
+ className={css(styles.selectMenuItem, styles.modifiers.load, className)}
267
+ onClick={(event: any) => {
268
+ onViewMoreClick(event);
269
+ event.stopPropagation();
270
+ }}
271
+ ref={this.ref}
272
+ type="button"
273
+ >
274
+ {children || value.toString()}
275
+ </button>
276
+ </div>
277
+ );
278
+ } else if (variant !== SelectVariant.checkbox) {
279
+ return (
280
+ <li
281
+ id={generatedId}
282
+ role="presentation"
283
+ className={css(
284
+ isLoading && styles.selectListItem,
285
+ !isLoading && styles.selectMenuWrapper,
286
+ isFavorite && styles.modifiers.favorite,
287
+ isFocused && styles.modifiers.focus,
288
+ isLoading && styles.modifiers.loading
289
+ )}
290
+ ref={this.liRef}
291
+ >
292
+ {isLoading && children}
293
+ {isLoad && !isGrouped && (
294
+ <button
295
+ {...props}
296
+ className={css(styles.selectMenuItem, styles.modifiers.load, className)}
297
+ onClick={(event: any) => {
298
+ onViewMoreClick(event);
299
+ event.stopPropagation();
300
+ }}
301
+ ref={this.ref}
302
+ onKeyDown={(event: React.KeyboardEvent) => {
303
+ this.onKeyDown(event, 0);
304
+ }}
305
+ type="button"
306
+ >
307
+ {itemDisplay}
308
+ </button>
309
+ )}
310
+ {!isLoading && !isLoad && (
311
+ <>
312
+ <Component
313
+ {...props}
314
+ className={css(
315
+ styles.selectMenuItem,
316
+ isLoad && styles.modifiers.load,
317
+ isSelected && styles.modifiers.selected,
318
+ isDisabled && styles.modifiers.disabled,
319
+ description && styles.modifiers.description,
320
+ isFavorite !== null && styles.modifiers.link,
321
+ className
322
+ )}
323
+ onClick={(event: any) => {
324
+ if (!isDisabled) {
325
+ onClick(event);
326
+ onSelect(event, value, isPlaceholder);
327
+ shouldResetOnSelect && onClose();
328
+ }
329
+ }}
330
+ role="option"
331
+ aria-selected={isSelected || null}
332
+ ref={this.ref}
333
+ onKeyDown={(event: React.KeyboardEvent) => {
334
+ this.onKeyDown(event, 0);
335
+ }}
336
+ type="button"
337
+ >
338
+ {description && (
339
+ <React.Fragment>
340
+ <span className={css(styles.selectMenuItemMain)}>
341
+ {itemDisplay}
342
+ {isSelected && (
343
+ <span className={css(styles.selectMenuItemIcon)}>
344
+ <CheckIcon aria-hidden />
345
+ </span>
346
+ )}
347
+ </span>
348
+ <span className={css(styles.selectMenuItemDescription)}>{description}</span>
349
+ </React.Fragment>
350
+ )}
351
+ {!description && (
352
+ <React.Fragment>
353
+ {itemDisplay}
354
+ {isSelected && (
355
+ <span className={css(styles.selectMenuItemIcon)}>
356
+ <CheckIcon aria-hidden />
357
+ </span>
358
+ )}
359
+ </React.Fragment>
360
+ )}
361
+ </Component>
362
+ {isFavorite !== null && id && favoriteButton(onFavorite)}
363
+ </>
364
+ )}
365
+ </li>
366
+ );
367
+ } else if (variant === SelectVariant.checkbox && isLoad) {
368
+ return (
369
+ <button
370
+ className={css(
371
+ styles.selectMenuItem,
372
+ styles.modifiers.load,
373
+ isFocused && styles.modifiers.focus,
374
+ className
375
+ )}
376
+ onKeyDown={(event: React.KeyboardEvent) => {
377
+ this.onKeyDown(event, 0, undefined, true);
378
+ }}
379
+ onClick={(event: any) => {
380
+ onViewMoreClick(event);
381
+ event.stopPropagation();
382
+ }}
383
+ ref={this.ref}
384
+ >
385
+ {children || (value && value.toString && value.toString())}
386
+ </button>
387
+ );
388
+ } else if (variant === SelectVariant.checkbox && isLoading) {
389
+ return (
390
+ <div className={css(styles.selectListItem, isLoading && styles.modifiers.loading, className)}>{children}</div>
391
+ );
392
+ } else if (variant === SelectVariant.checkbox && !isNoResultsOption && !isLoading && !isLoad) {
393
+ return (
394
+ <label
395
+ {...props}
396
+ className={css(
397
+ checkStyles.check,
398
+ styles.selectMenuItem,
399
+ isDisabled && styles.modifiers.disabled,
400
+ description && styles.modifiers.description,
401
+ className
402
+ )}
403
+ onKeyDown={(event: React.KeyboardEvent) => {
404
+ this.onKeyDown(event, 0, undefined, true);
405
+ }}
406
+ >
407
+ <input
408
+ id={inputId || `${inputIdPrefix}-${value.toString()}`}
409
+ className={css(checkStyles.checkInput)}
410
+ type="checkbox"
411
+ onChange={event => {
412
+ if (!isDisabled) {
413
+ onClick(event);
414
+ onSelect(event, value);
415
+ }
416
+ }}
417
+ ref={this.ref}
418
+ checked={isChecked || false}
419
+ disabled={isDisabled}
420
+ />
421
+ <span className={css(checkStyles.checkLabel, isDisabled && styles.modifiers.disabled)}>{itemDisplay}</span>
422
+ {description && <div className={css(checkStyles.checkDescription)}>{description}</div>}
423
+ </label>
424
+ );
425
+ } else if (variant === SelectVariant.checkbox && isNoResultsOption && !isLoading && !isLoad) {
426
+ return (
427
+ <div>
428
+ <Component
429
+ {...props}
430
+ className={css(
431
+ styles.selectMenuItem,
432
+ isSelected && styles.modifiers.selected,
433
+ isDisabled && styles.modifiers.disabled,
434
+ className
435
+ )}
436
+ role="option"
437
+ aria-selected={isSelected || null}
438
+ ref={this.ref}
439
+ onKeyDown={(event: React.KeyboardEvent) => {
440
+ this.onKeyDown(event, 0, undefined, true);
441
+ }}
442
+ type="button"
443
+ >
444
+ {itemDisplay}
445
+ </Component>
446
+ </div>
447
+ );
448
+ }
449
+ };
450
+
451
+ return (
452
+ <SelectConsumer>
453
+ {({ onSelect, onClose, variant, inputIdPrefix, onFavorite, shouldResetOnSelect }) => (
454
+ <React.Fragment>
455
+ {renderOption(onSelect, onClose, variant, inputIdPrefix, onFavorite, shouldResetOnSelect)}
456
+ </React.Fragment>
457
+ )}
458
+ </SelectConsumer>
459
+ );
460
+ }
461
+ }
@@ -4,9 +4,9 @@ import buttonStyles from '@patternfly/react-styles/css/components/Button/button'
4
4
  import { css } from '@patternfly/react-styles';
5
5
  import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
6
6
  import { SelectVariant, SelectFooterTabbableItems } from './selectConstants';
7
- import { PickOptional } from '../../helpers/typeUtils';
8
- import { findTabbableElements } from '../../helpers/util';
9
- import { KeyTypes } from '../../helpers/constants';
7
+ import { PickOptional } from '../../../helpers/typeUtils';
8
+ import { findTabbableElements } from '../../../helpers/util';
9
+ import { KeyTypes } from '../../../helpers/constants';
10
10
 
11
11
  export interface SelectToggleProps extends Omit<React.HTMLProps<HTMLElement>, 'ref'> {
12
12
  /** HTML ID of dropdown toggle */
@@ -7,7 +7,7 @@ import { Select } from '../Select';
7
7
  import { SelectOption, SelectOptionObject } from '../SelectOption';
8
8
  import { SelectGroup } from '../SelectGroup';
9
9
  import { SelectVariant, SelectDirection } from '../selectConstants';
10
- import { KeyTypes } from '../../../helpers';
10
+ import { KeyTypes } from '../../../../helpers';
11
11
 
12
12
  class User implements SelectOptionObject {
13
13
  private firstName: string;