@patternfly/react-data-view 7.0.0-prerelease.3 → 7.0.0-prerelease.4

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 (124) hide show
  1. package/dist/cjs/DataView/DataView.d.ts +3 -1
  2. package/dist/cjs/DataViewCheckboxFilter/DataViewCheckboxFilter.d.ts +29 -0
  3. package/dist/cjs/DataViewCheckboxFilter/DataViewCheckboxFilter.js +70 -0
  4. package/dist/cjs/DataViewCheckboxFilter/DataViewCheckboxFilter.test.d.ts +1 -0
  5. package/dist/cjs/DataViewCheckboxFilter/DataViewCheckboxFilter.test.js +25 -0
  6. package/dist/cjs/DataViewCheckboxFilter/index.d.ts +2 -0
  7. package/dist/cjs/DataViewCheckboxFilter/index.js +23 -0
  8. package/dist/cjs/DataViewFilters/DataViewFilters.d.ts +25 -0
  9. package/dist/cjs/DataViewFilters/DataViewFilters.js +85 -0
  10. package/dist/cjs/DataViewFilters/DataViewFilters.test.d.ts +1 -0
  11. package/dist/cjs/DataViewFilters/DataViewFilters.test.js +19 -0
  12. package/dist/cjs/DataViewFilters/index.d.ts +2 -0
  13. package/dist/cjs/DataViewFilters/index.js +23 -0
  14. package/dist/cjs/DataViewTable/DataViewTable.d.ts +8 -0
  15. package/dist/cjs/DataViewTableBasic/DataViewTableBasic.d.ts +1 -0
  16. package/dist/cjs/DataViewTableHead/DataViewTableHead.d.ts +1 -0
  17. package/dist/cjs/DataViewTableTree/DataViewTableTree.d.ts +1 -0
  18. package/dist/cjs/DataViewTableTree/DataViewTableTree.js +26 -14
  19. package/dist/cjs/DataViewTextFilter/DataViewTextFilter.d.ts +21 -0
  20. package/dist/cjs/DataViewTextFilter/DataViewTextFilter.js +26 -0
  21. package/dist/cjs/DataViewTextFilter/DataViewTextFilter.test.d.ts +1 -0
  22. package/dist/cjs/DataViewTextFilter/DataViewTextFilter.test.js +22 -0
  23. package/dist/cjs/DataViewTextFilter/index.d.ts +2 -0
  24. package/dist/cjs/DataViewTextFilter/index.js +23 -0
  25. package/dist/cjs/DataViewToolbar/DataViewToolbar.d.ts +10 -4
  26. package/dist/cjs/DataViewToolbar/DataViewToolbar.js +29 -6
  27. package/dist/cjs/Hooks/filters.d.ts +14 -0
  28. package/dist/cjs/Hooks/filters.js +69 -0
  29. package/dist/cjs/Hooks/filters.test.d.ts +1 -0
  30. package/dist/cjs/Hooks/filters.test.js +50 -0
  31. package/dist/cjs/Hooks/index.d.ts +2 -0
  32. package/dist/cjs/Hooks/index.js +2 -0
  33. package/dist/cjs/Hooks/pagination.d.ts +1 -0
  34. package/dist/cjs/Hooks/selection.d.ts +1 -1
  35. package/dist/cjs/Hooks/selection.js +4 -2
  36. package/dist/cjs/Hooks/sort.d.ts +32 -0
  37. package/dist/cjs/Hooks/sort.js +47 -0
  38. package/dist/cjs/Hooks/sort.test.d.ts +1 -0
  39. package/dist/cjs/Hooks/sort.test.js +68 -0
  40. package/dist/cjs/InternalContext/InternalContext.d.ts +1 -0
  41. package/dist/cjs/index.d.ts +4 -0
  42. package/dist/cjs/index.js +7 -1
  43. package/dist/dynamic/DataViewCheckboxFilter/package.json +1 -0
  44. package/dist/dynamic/DataViewFilters/package.json +1 -0
  45. package/dist/dynamic/DataViewTextFilter/package.json +1 -0
  46. package/dist/esm/DataView/DataView.d.ts +3 -1
  47. package/dist/esm/DataViewCheckboxFilter/DataViewCheckboxFilter.d.ts +29 -0
  48. package/dist/esm/DataViewCheckboxFilter/DataViewCheckboxFilter.js +62 -0
  49. package/dist/esm/DataViewCheckboxFilter/DataViewCheckboxFilter.test.d.ts +1 -0
  50. package/dist/esm/DataViewCheckboxFilter/DataViewCheckboxFilter.test.js +20 -0
  51. package/dist/esm/DataViewCheckboxFilter/index.d.ts +2 -0
  52. package/dist/esm/DataViewCheckboxFilter/index.js +2 -0
  53. package/dist/esm/DataViewFilters/DataViewFilters.d.ts +25 -0
  54. package/dist/esm/DataViewFilters/DataViewFilters.js +58 -0
  55. package/dist/esm/DataViewFilters/DataViewFilters.test.d.ts +1 -0
  56. package/dist/esm/DataViewFilters/DataViewFilters.test.js +14 -0
  57. package/dist/esm/DataViewFilters/index.d.ts +2 -0
  58. package/dist/esm/DataViewFilters/index.js +2 -0
  59. package/dist/esm/DataViewTable/DataViewTable.d.ts +8 -0
  60. package/dist/esm/DataViewTableBasic/DataViewTableBasic.d.ts +1 -0
  61. package/dist/esm/DataViewTableHead/DataViewTableHead.d.ts +1 -0
  62. package/dist/esm/DataViewTableTree/DataViewTableTree.d.ts +1 -0
  63. package/dist/esm/DataViewTableTree/DataViewTableTree.js +26 -14
  64. package/dist/esm/DataViewTextFilter/DataViewTextFilter.d.ts +21 -0
  65. package/dist/esm/DataViewTextFilter/DataViewTextFilter.js +19 -0
  66. package/dist/esm/DataViewTextFilter/DataViewTextFilter.test.d.ts +1 -0
  67. package/dist/esm/DataViewTextFilter/DataViewTextFilter.test.js +17 -0
  68. package/dist/esm/DataViewTextFilter/index.d.ts +2 -0
  69. package/dist/esm/DataViewTextFilter/index.js +2 -0
  70. package/dist/esm/DataViewToolbar/DataViewToolbar.d.ts +10 -4
  71. package/dist/esm/DataViewToolbar/DataViewToolbar.js +7 -4
  72. package/dist/esm/Hooks/filters.d.ts +14 -0
  73. package/dist/esm/Hooks/filters.js +65 -0
  74. package/dist/esm/Hooks/filters.test.d.ts +1 -0
  75. package/dist/esm/Hooks/filters.test.js +48 -0
  76. package/dist/esm/Hooks/index.d.ts +2 -0
  77. package/dist/esm/Hooks/index.js +2 -0
  78. package/dist/esm/Hooks/pagination.d.ts +1 -0
  79. package/dist/esm/Hooks/selection.d.ts +1 -1
  80. package/dist/esm/Hooks/selection.js +4 -2
  81. package/dist/esm/Hooks/sort.d.ts +32 -0
  82. package/dist/esm/Hooks/sort.js +43 -0
  83. package/dist/esm/Hooks/sort.test.d.ts +1 -0
  84. package/dist/esm/Hooks/sort.test.js +66 -0
  85. package/dist/esm/InternalContext/InternalContext.d.ts +1 -0
  86. package/dist/esm/index.d.ts +4 -0
  87. package/dist/esm/index.js +4 -0
  88. package/dist/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +9 -9
  90. package/patternfly-docs/content/extensions/data-view/examples/Components/Components.md +5 -3
  91. package/patternfly-docs/content/extensions/data-view/examples/Components/DataViewTableExample.tsx +1 -1
  92. package/patternfly-docs/content/extensions/data-view/examples/EventsContext/EventsContext.md +1 -0
  93. package/patternfly-docs/content/extensions/data-view/examples/EventsContext/EventsExample.tsx +28 -6
  94. package/patternfly-docs/content/extensions/data-view/examples/Functionality/FiltersExample.tsx +107 -0
  95. package/patternfly-docs/content/extensions/data-view/examples/Functionality/Functionality.md +67 -2
  96. package/patternfly-docs/content/extensions/data-view/examples/Functionality/SortingExample.tsx +87 -0
  97. package/src/DataView/DataView.tsx +3 -2
  98. package/src/DataViewCheckboxFilter/DataViewCheckboxFilter.test.tsx +24 -0
  99. package/src/DataViewCheckboxFilter/DataViewCheckboxFilter.tsx +175 -0
  100. package/src/DataViewCheckboxFilter/__snapshots__/DataViewCheckboxFilter.test.tsx.snap +197 -0
  101. package/src/DataViewCheckboxFilter/index.ts +2 -0
  102. package/src/DataViewFilters/DataViewFilters.test.tsx +21 -0
  103. package/src/DataViewFilters/DataViewFilters.tsx +144 -0
  104. package/src/DataViewFilters/__snapshots__/DataViewFilters.test.tsx.snap +194 -0
  105. package/src/DataViewFilters/index.tsx +2 -0
  106. package/src/DataViewTable/DataViewTable.tsx +23 -3
  107. package/src/DataViewTableBasic/DataViewTableBasic.tsx +1 -0
  108. package/src/DataViewTableHead/DataViewTableHead.tsx +1 -0
  109. package/src/DataViewTableTree/DataViewTableTree.tsx +40 -18
  110. package/src/DataViewTextFilter/DataViewTextFilter.test.tsx +24 -0
  111. package/src/DataViewTextFilter/DataViewTextFilter.tsx +54 -0
  112. package/src/DataViewTextFilter/__snapshots__/DataViewTextFilter.test.tsx.snap +203 -0
  113. package/src/DataViewTextFilter/index.ts +2 -0
  114. package/src/DataViewToolbar/DataViewToolbar.tsx +47 -28
  115. package/src/DataViewToolbar/__snapshots__/DataViewToolbar.test.tsx.snap +44 -0
  116. package/src/Hooks/filters.test.tsx +62 -0
  117. package/src/Hooks/filters.ts +97 -0
  118. package/src/Hooks/index.ts +2 -0
  119. package/src/Hooks/pagination.ts +1 -0
  120. package/src/Hooks/selection.ts +3 -2
  121. package/src/Hooks/sort.test.tsx +84 -0
  122. package/src/Hooks/sort.ts +87 -0
  123. package/src/InternalContext/InternalContext.tsx +1 -0
  124. package/src/index.ts +6 -0
@@ -0,0 +1,194 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`DataViewFilters component should render correctly 1`] = `
4
+ <div>
5
+ <div
6
+ class="pf-v6-c-toolbar"
7
+ data-ouia-component-id="DataViewToolbar"
8
+ data-ouia-component-type="PF6/Toolbar"
9
+ data-ouia-safe="true"
10
+ id="pf-random-id-0"
11
+ >
12
+ <div
13
+ class="pf-v6-c-toolbar__content"
14
+ >
15
+ <div
16
+ class="pf-v6-c-toolbar__content-section"
17
+ >
18
+ <div
19
+ class="pf-v6-c-toolbar__item"
20
+ >
21
+ <div
22
+ class="pf-v6-c-toolbar__group pf-m-toggle-group pf-m-show-on-xl"
23
+ data-ouia-component-id="DataViewFilters"
24
+ >
25
+ <div
26
+ class="pf-v6-c-toolbar__toggle"
27
+ >
28
+ <button
29
+ aria-disabled="false"
30
+ aria-haspopup="false"
31
+ aria-label="Show Filters"
32
+ class="pf-v6-c-button pf-m-plain"
33
+ data-ouia-component-id="OUIA-Generated-Button-plain-1"
34
+ data-ouia-component-type="PF6/Button"
35
+ data-ouia-safe="true"
36
+ type="button"
37
+ >
38
+ <span
39
+ class="pf-v6-c-button__icon"
40
+ >
41
+ <svg
42
+ aria-hidden="true"
43
+ class="pf-v6-svg"
44
+ fill="currentColor"
45
+ height="1em"
46
+ role="img"
47
+ viewBox="0 0 512 512"
48
+ width="1em"
49
+ >
50
+ <path
51
+ d="M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z"
52
+ />
53
+ </svg>
54
+ </span>
55
+ </button>
56
+ </div>
57
+ <div
58
+ class="pf-v6-c-toolbar__group pf-m-filter-group"
59
+ >
60
+ <div>
61
+ <button
62
+ aria-expanded="false"
63
+ class="pf-v6-c-menu-toggle"
64
+ data-ouia-component-id="OUIA-Generated-MenuToggle-1"
65
+ data-ouia-component-type="PF6/MenuToggle"
66
+ data-ouia-safe="true"
67
+ type="button"
68
+ >
69
+ <span
70
+ class="pf-v6-c-menu-toggle__icon"
71
+ >
72
+ <svg
73
+ aria-hidden="true"
74
+ class="pf-v6-svg"
75
+ fill="currentColor"
76
+ height="1em"
77
+ role="img"
78
+ viewBox="0 0 512 512"
79
+ width="1em"
80
+ >
81
+ <path
82
+ d="M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z"
83
+ />
84
+ </svg>
85
+ </span>
86
+ <span
87
+ class="pf-v6-c-menu-toggle__text"
88
+ >
89
+ One
90
+ </span>
91
+ <span
92
+ class="pf-v6-c-menu-toggle__controls"
93
+ >
94
+ <span
95
+ class="pf-v6-c-menu-toggle__toggle-icon"
96
+ >
97
+ <svg
98
+ aria-hidden="true"
99
+ class="pf-v6-svg"
100
+ fill="currentColor"
101
+ height="1em"
102
+ role="img"
103
+ viewBox="0 0 320 512"
104
+ width="1em"
105
+ >
106
+ <path
107
+ d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"
108
+ />
109
+ </svg>
110
+ </span>
111
+ </span>
112
+ </button>
113
+ </div>
114
+ <div
115
+ class="pf-v6-c-toolbar__item"
116
+ data-ouia-component-id="DataViewTextFilter"
117
+ >
118
+ <div
119
+ class="pf-v6-c-text-input-group"
120
+ data-ouia-component-id="DataViewTextFilter-input"
121
+ >
122
+ <div
123
+ class="pf-v6-c-text-input-group__main pf-m-icon"
124
+ >
125
+ <span
126
+ class="pf-v6-c-text-input-group__text"
127
+ >
128
+ <span
129
+ class="pf-v6-c-text-input-group__icon"
130
+ >
131
+ <svg
132
+ aria-hidden="true"
133
+ class="pf-v6-svg"
134
+ fill="currentColor"
135
+ height="1em"
136
+ role="img"
137
+ viewBox="0 0 512 512"
138
+ width="1em"
139
+ >
140
+ <path
141
+ d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
142
+ />
143
+ </svg>
144
+ </span>
145
+ <input
146
+ aria-label="One filter"
147
+ class="pf-v6-c-text-input-group__text-input"
148
+ id="one"
149
+ placeholder="Filter by One"
150
+ type="text"
151
+ value=""
152
+ />
153
+ </span>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ <div
163
+ class="pf-v6-c-toolbar__content pf-m-hidden"
164
+ hidden=""
165
+ >
166
+ <div
167
+ class="pf-v6-c-toolbar__group"
168
+ />
169
+ <div
170
+ class="pf-v6-c-toolbar__group pf-m-action-group-inline"
171
+ >
172
+ <div
173
+ class="pf-v6-c-toolbar__item"
174
+ >
175
+ <button
176
+ aria-disabled="false"
177
+ class="pf-v6-c-button pf-m-link pf-m-inline"
178
+ data-ouia-component-id="DataViewToolbar-clear-all-filters"
179
+ data-ouia-component-type="PF6/Button"
180
+ data-ouia-safe="true"
181
+ type="button"
182
+ >
183
+ <span
184
+ class="pf-v6-c-button__text"
185
+ >
186
+ Clear filters
187
+ </span>
188
+ </button>
189
+ </div>
190
+ </div>
191
+ </div>
192
+ </div>
193
+ </div>
194
+ `;
@@ -0,0 +1,2 @@
1
+ export { default } from './DataViewFilters';
2
+ export * from './DataViewFilters';
@@ -8,18 +8,38 @@ import { DataViewTableTree, DataViewTableTreeProps } from '../DataViewTableTree'
8
8
  import { DataViewTableBasic, DataViewTableBasicProps } from '../DataViewTableBasic';
9
9
 
10
10
  // Table head typings
11
- export type DataViewTh = ReactNode | { cell: ReactNode; props?: ThProps };
11
+ export type DataViewTh = ReactNode | {
12
+ /** Table head cell node */
13
+ cell: ReactNode;
14
+ /** Props passed to Th */
15
+ props?: ThProps
16
+ };
12
17
  export const isDataViewThObject = (value: DataViewTh): value is { cell: ReactNode; props?: ThProps } => value != null && typeof value === 'object' && 'cell' in value;
13
18
 
14
19
  // Basic table typings
15
- export interface DataViewTrObject { row: DataViewTd[], id?: string, props?: TrProps }
16
- export type DataViewTd = ReactNode | { cell: ReactNode; props?: TdProps };
20
+ export interface DataViewTrObject {
21
+ /** Array of rows */
22
+ row: DataViewTd[],
23
+ /** Unique identifier of a row */
24
+ id?: string,
25
+ /** Props passed to Tr */
26
+ props?: TrProps
27
+ }
28
+
29
+ export type DataViewTd = ReactNode | {
30
+ /** Table body cell node */
31
+ cell: ReactNode;
32
+ /** Props passed to Td */
33
+ props?: TdProps
34
+ };
35
+
17
36
  export type DataViewTr = DataViewTd[] | DataViewTrObject;
18
37
 
19
38
  export const isDataViewTdObject = (value: DataViewTd): value is { cell: ReactNode; props?: TdProps } => value != null && typeof value === 'object' && 'cell' in value;
20
39
  export const isDataViewTrObject = (value: DataViewTr): value is { row: DataViewTd[], id?: string } => value != null && typeof value === 'object' && 'row' in value;
21
40
 
22
41
  // Tree table typings
42
+ /** extends DataViewTrObject */
23
43
  export interface DataViewTrTree extends DataViewTrObject { id: string, children?: DataViewTrTree[] }
24
44
 
25
45
  export type DataViewTableProps =
@@ -11,6 +11,7 @@ import { DataViewTableHead } from '../DataViewTableHead';
11
11
  import { DataViewTh, DataViewTr, isDataViewTdObject, isDataViewTrObject } from '../DataViewTable';
12
12
  import { DataViewState } from '../DataView/DataView';
13
13
 
14
+ /** extends TableProps */
14
15
  export interface DataViewTableBasicProps extends Omit<TableProps, 'onSelect' | 'rows'> {
15
16
  /** Columns definition */
16
17
  columns: DataViewTh[];
@@ -8,6 +8,7 @@ import {
8
8
  import { useInternalContext } from '../InternalContext';
9
9
  import { DataViewTh, isDataViewThObject } from '../DataViewTable';
10
10
 
11
+ /** extends TheadProps */
11
12
  export interface DataViewTableHeadProps extends TheadProps {
12
13
  /** Indicates whether table is a tree */
13
14
  isTreeTable?: boolean;
@@ -12,24 +12,46 @@ import { DataViewTableHead } from '../DataViewTableHead';
12
12
  import { DataViewTh, DataViewTrTree, isDataViewTdObject } from '../DataViewTable';
13
13
  import { DataViewState } from '../DataView/DataView';
14
14
 
15
- const getDescendants = (node: DataViewTrTree): DataViewTrTree[] => (!node.children || !node.children.length) ? [ node ] : node.children.flatMap(getDescendants);
16
-
17
- const isNodeChecked = (node: DataViewTrTree, isSelected: (node: DataViewTrTree) => boolean) => {
18
- let allSelected = true;
19
- let someSelected = false;
20
-
21
- for (const descendant of getDescendants(node)) {
22
- const selected = !!isSelected?.(descendant);
23
-
24
- someSelected ||= selected;
25
- allSelected &&= selected;
26
-
27
- if (!allSelected && someSelected) { return null }
28
- }
29
-
30
- return allSelected;
15
+ const getNodesAffectedBySelection = (
16
+ allRows: DataViewTrTree[],
17
+ node: DataViewTrTree,
18
+ isChecking: boolean,
19
+ isSelected?: (item: DataViewTrTree) => boolean
20
+ ): DataViewTrTree[] => {
21
+
22
+ const getDescendants = (node: DataViewTrTree): DataViewTrTree[] =>
23
+ node.children ? node.children.flatMap(getDescendants).concat(node) : [ node ];
24
+
25
+ const findParent = (child: DataViewTrTree, rows: DataViewTrTree[]): DataViewTrTree | undefined =>
26
+ rows.find(row => row.children?.some(c => c === child)) ??
27
+ rows.flatMap(row => row.children ?? []).map(c => findParent(child, [ c ])).find(p => p);
28
+
29
+ const getAncestors = (node: DataViewTrTree): DataViewTrTree[] => {
30
+ const ancestors: DataViewTrTree[] = [];
31
+ let parent = findParent(node, allRows);
32
+ while (parent) {
33
+ ancestors.push(parent);
34
+ parent = findParent(parent, allRows);
35
+ }
36
+ return ancestors;
37
+ };
38
+
39
+ const affectedNodes = new Set([ node, ...getDescendants(node) ]);
40
+
41
+ getAncestors(node).forEach(ancestor => {
42
+ const allChildrenSelected = ancestor.children?.every(child => isSelected?.(child) || affectedNodes.has(child));
43
+ const anyChildAffected = ancestor.children?.some(child => affectedNodes.has(child) || child.id === node.id);
44
+
45
+ if (isChecking ? !isSelected?.(ancestor) && allChildrenSelected : isSelected?.(ancestor) && anyChildAffected) {
46
+ affectedNodes.add(ancestor);
47
+ }
48
+ });
49
+
50
+ return Array.from(affectedNodes);
31
51
  };
32
52
 
53
+
54
+ /** extends TableProps */
33
55
  export interface DataViewTableTreeProps extends Omit<TableProps, 'onSelect' | 'rows'> {
34
56
  /** Columns definition */
35
57
  columns: DataViewTh[];
@@ -82,7 +104,7 @@ export const DataViewTableTree: React.FC<DataViewTableTreeProps> = ({
82
104
  }
83
105
  const isExpanded = expandedNodeIds.includes(node.id);
84
106
  const isDetailsExpanded = expandedDetailsNodeNames.includes(node.id);
85
- const isChecked = isSelected && isNodeChecked(node, isSelected);
107
+ const isChecked = isSelected?.(node);
86
108
  let icon = leafIcon;
87
109
  if (node.children) {
88
110
  icon = isExpanded ? expandedIcon : collapsedIcon;
@@ -99,7 +121,7 @@ export const DataViewTableTree: React.FC<DataViewTableTreeProps> = ({
99
121
  const otherDetailsExpandedNodeIds = prevDetailsExpanded.filter(id => id !== node.id);
100
122
  return isDetailsExpanded ? otherDetailsExpandedNodeIds : [ ...otherDetailsExpandedNodeIds, node.id ];
101
123
  }),
102
- onCheckChange: (isSelectDisabled?.(node) || !onSelect) ? undefined : (_event, isChecking) => onSelect?.(isChecking, getDescendants(node)),
124
+ onCheckChange: (isSelectDisabled?.(node) || !onSelect) ? undefined : (_event, isChecking) => onSelect?.(isChecking, getNodesAffectedBySelection(rows, node, isChecking, isSelected)),
103
125
  rowIndex,
104
126
  props: {
105
127
  isExpanded,
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import DataViewTextFilter, { DataViewTextFilterProps } from './DataViewTextFilter';
4
+ import DataViewToolbar from '../DataViewToolbar';
5
+
6
+ describe('DataViewTextFilter component', () => {
7
+ const mockOnChange = jest.fn();
8
+
9
+ const defaultProps: DataViewTextFilterProps = {
10
+ filterId: 'test-filter',
11
+ title: 'Test Filter',
12
+ value: 'initial value',
13
+ onChange: mockOnChange,
14
+ };
15
+
16
+ it('should render correctly', () => {
17
+ const { container } = render(<DataViewToolbar
18
+ filters={
19
+ <DataViewTextFilter {...defaultProps} />
20
+ }
21
+ />);
22
+ expect(container).toMatchSnapshot();
23
+ });
24
+ });
@@ -0,0 +1,54 @@
1
+ import React from 'react';
2
+ import { SearchInput, SearchInputProps, ToolbarFilter, ToolbarFilterProps } from '@patternfly/react-core';
3
+
4
+ /** extends SearchInputProps */
5
+ export interface DataViewTextFilterProps extends SearchInputProps {
6
+ /** Unique key for the filter attribute */
7
+ filterId: string;
8
+ /** Current filter value */
9
+ value?: string;
10
+ /** Filter title displayed in the toolbar */
11
+ title: string;
12
+ /** Callback for when the input value changes */
13
+ onChange?: (event: React.FormEvent<HTMLInputElement> | undefined, value: string) => void;
14
+ /** Controls visibility of the filter in the toolbar */
15
+ showToolbarItem?: ToolbarFilterProps['showToolbarItem'];
16
+ /** Trims input value on change */
17
+ trimValue?: boolean;
18
+ /** Custom OUIA ID */
19
+ ouiaId?: string;
20
+ }
21
+
22
+ export const DataViewTextFilter: React.FC<DataViewTextFilterProps> = ({
23
+ filterId,
24
+ title,
25
+ value = '',
26
+ onChange,
27
+ onClear = () => onChange?.(undefined, ''),
28
+ showToolbarItem,
29
+ trimValue = true,
30
+ ouiaId = 'DataViewTextFilter',
31
+ ...props
32
+ }: DataViewTextFilterProps) => (
33
+ <ToolbarFilter
34
+ key={ouiaId}
35
+ data-ouia-component-id={ouiaId}
36
+ labels={value.length > 0 ? [ { key: title, node: value } ] : []}
37
+ deleteLabel={() => onChange?.(undefined, '')}
38
+ categoryName={title}
39
+ showToolbarItem={showToolbarItem}
40
+ >
41
+ <SearchInput
42
+ searchInputId={filterId}
43
+ value={value}
44
+ onChange={(e, inputValue) => onChange?.(e, trimValue ? inputValue.trim() : inputValue)}
45
+ onClear={onClear}
46
+ placeholder={`Filter by ${title}`}
47
+ aria-label={`${title ?? filterId} filter`}
48
+ data-ouia-component-id={`${ouiaId}-input`}
49
+ {...props}
50
+ />
51
+ </ToolbarFilter>
52
+ );
53
+
54
+ export default DataViewTextFilter;
@@ -0,0 +1,203 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`DataViewTextFilter component should render correctly 1`] = `
4
+ <div>
5
+ <div
6
+ class="pf-v6-c-toolbar"
7
+ data-ouia-component-id="DataViewToolbar"
8
+ data-ouia-component-type="PF6/Toolbar"
9
+ data-ouia-safe="true"
10
+ id="pf-random-id-0"
11
+ >
12
+ <div
13
+ class="pf-v6-c-toolbar__content"
14
+ >
15
+ <div
16
+ class="pf-v6-c-toolbar__content-section"
17
+ >
18
+ <div
19
+ class="pf-v6-c-toolbar__item"
20
+ >
21
+ <div
22
+ class="pf-v6-c-toolbar__item"
23
+ data-ouia-component-id="DataViewTextFilter"
24
+ >
25
+ <div
26
+ class="pf-v6-c-text-input-group"
27
+ data-ouia-component-id="DataViewTextFilter-input"
28
+ >
29
+ <div
30
+ class="pf-v6-c-text-input-group__main pf-m-icon"
31
+ >
32
+ <span
33
+ class="pf-v6-c-text-input-group__text"
34
+ >
35
+ <span
36
+ class="pf-v6-c-text-input-group__icon"
37
+ >
38
+ <svg
39
+ aria-hidden="true"
40
+ class="pf-v6-svg"
41
+ fill="currentColor"
42
+ height="1em"
43
+ role="img"
44
+ viewBox="0 0 512 512"
45
+ width="1em"
46
+ >
47
+ <path
48
+ d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
49
+ />
50
+ </svg>
51
+ </span>
52
+ <input
53
+ aria-label="Test Filter filter"
54
+ class="pf-v6-c-text-input-group__text-input"
55
+ id="test-filter"
56
+ placeholder="Filter by Test Filter"
57
+ type="text"
58
+ value="initial value"
59
+ />
60
+ </span>
61
+ </div>
62
+ <div
63
+ class="pf-v6-c-text-input-group__utilities"
64
+ >
65
+ <button
66
+ aria-disabled="false"
67
+ aria-label="Reset"
68
+ class="pf-v6-c-button pf-m-plain"
69
+ data-ouia-component-id="OUIA-Generated-Button-plain-2"
70
+ data-ouia-component-type="PF6/Button"
71
+ data-ouia-safe="true"
72
+ type="button"
73
+ >
74
+ <span
75
+ class="pf-v6-c-button__icon"
76
+ >
77
+ <svg
78
+ aria-hidden="true"
79
+ class="pf-v6-svg"
80
+ fill="currentColor"
81
+ height="1em"
82
+ role="img"
83
+ viewBox="0 0 352 512"
84
+ width="1em"
85
+ >
86
+ <path
87
+ d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"
88
+ />
89
+ </svg>
90
+ </span>
91
+ </button>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ <div
99
+ class="pf-v6-c-toolbar__content"
100
+ >
101
+ <div
102
+ class="pf-v6-c-toolbar__group"
103
+ >
104
+ <div
105
+ class="pf-v6-c-toolbar__item pf-m-label-group pf-m-label-group"
106
+ >
107
+ <div
108
+ class="pf-v6-c-label-group pf-m-category"
109
+ >
110
+ <div
111
+ class="pf-v6-c-label-group__main"
112
+ >
113
+ <span
114
+ aria-hidden="true"
115
+ class="pf-v6-c-label-group__label"
116
+ id="pf-random-id-1"
117
+ >
118
+ Test Filter
119
+ </span>
120
+ <ul
121
+ aria-labelledby="pf-random-id-1"
122
+ class="pf-v6-c-label-group__list"
123
+ role="list"
124
+ >
125
+ <li
126
+ class="pf-v6-c-label-group__list-item"
127
+ >
128
+ <span
129
+ class="pf-v6-c-label pf-m-filled"
130
+ >
131
+ <span
132
+ class="pf-v6-c-label__content"
133
+ >
134
+ <span
135
+ class="pf-v6-c-label__text"
136
+ >
137
+ initial value
138
+ </span>
139
+ </span>
140
+ <span
141
+ class="pf-v6-c-label__actions"
142
+ >
143
+ <button
144
+ aria-disabled="false"
145
+ aria-label="Close initial value"
146
+ class="pf-v6-c-button pf-m-plain pf-m-no-padding"
147
+ data-ouia-component-id="OUIA-Generated-Button-plain-3"
148
+ data-ouia-component-type="PF6/Button"
149
+ data-ouia-safe="true"
150
+ type="button"
151
+ >
152
+ <span
153
+ class="pf-v6-c-button__icon"
154
+ >
155
+ <svg
156
+ aria-hidden="true"
157
+ class="pf-v6-svg"
158
+ fill="currentColor"
159
+ height="1em"
160
+ role="img"
161
+ viewBox="0 0 352 512"
162
+ width="1em"
163
+ >
164
+ <path
165
+ d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"
166
+ />
167
+ </svg>
168
+ </span>
169
+ </button>
170
+ </span>
171
+ </span>
172
+ </li>
173
+ </ul>
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ <div
179
+ class="pf-v6-c-toolbar__group pf-m-action-group-inline"
180
+ >
181
+ <div
182
+ class="pf-v6-c-toolbar__item"
183
+ >
184
+ <button
185
+ aria-disabled="false"
186
+ class="pf-v6-c-button pf-m-link pf-m-inline"
187
+ data-ouia-component-id="DataViewToolbar-clear-all-filters"
188
+ data-ouia-component-type="PF6/Button"
189
+ data-ouia-safe="true"
190
+ type="button"
191
+ >
192
+ <span
193
+ class="pf-v6-c-button__text"
194
+ >
195
+ Clear filters
196
+ </span>
197
+ </button>
198
+ </div>
199
+ </div>
200
+ </div>
201
+ </div>
202
+ </div>
203
+ `;
@@ -0,0 +1,2 @@
1
+ export { default } from './DataViewTextFilter';
2
+ export * from './DataViewTextFilter';