@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.
- package/dist/cjs/DataView/DataView.d.ts +3 -1
- package/dist/cjs/DataViewCheckboxFilter/DataViewCheckboxFilter.d.ts +29 -0
- package/dist/cjs/DataViewCheckboxFilter/DataViewCheckboxFilter.js +70 -0
- package/dist/cjs/DataViewCheckboxFilter/DataViewCheckboxFilter.test.d.ts +1 -0
- package/dist/cjs/DataViewCheckboxFilter/DataViewCheckboxFilter.test.js +25 -0
- package/dist/cjs/DataViewCheckboxFilter/index.d.ts +2 -0
- package/dist/cjs/DataViewCheckboxFilter/index.js +23 -0
- package/dist/cjs/DataViewFilters/DataViewFilters.d.ts +25 -0
- package/dist/cjs/DataViewFilters/DataViewFilters.js +85 -0
- package/dist/cjs/DataViewFilters/DataViewFilters.test.d.ts +1 -0
- package/dist/cjs/DataViewFilters/DataViewFilters.test.js +19 -0
- package/dist/cjs/DataViewFilters/index.d.ts +2 -0
- package/dist/cjs/DataViewFilters/index.js +23 -0
- package/dist/cjs/DataViewTable/DataViewTable.d.ts +8 -0
- package/dist/cjs/DataViewTableBasic/DataViewTableBasic.d.ts +1 -0
- package/dist/cjs/DataViewTableHead/DataViewTableHead.d.ts +1 -0
- package/dist/cjs/DataViewTableTree/DataViewTableTree.d.ts +1 -0
- package/dist/cjs/DataViewTableTree/DataViewTableTree.js +26 -14
- package/dist/cjs/DataViewTextFilter/DataViewTextFilter.d.ts +21 -0
- package/dist/cjs/DataViewTextFilter/DataViewTextFilter.js +26 -0
- package/dist/cjs/DataViewTextFilter/DataViewTextFilter.test.d.ts +1 -0
- package/dist/cjs/DataViewTextFilter/DataViewTextFilter.test.js +22 -0
- package/dist/cjs/DataViewTextFilter/index.d.ts +2 -0
- package/dist/cjs/DataViewTextFilter/index.js +23 -0
- package/dist/cjs/DataViewToolbar/DataViewToolbar.d.ts +10 -4
- package/dist/cjs/DataViewToolbar/DataViewToolbar.js +29 -6
- package/dist/cjs/Hooks/filters.d.ts +14 -0
- package/dist/cjs/Hooks/filters.js +69 -0
- package/dist/cjs/Hooks/filters.test.d.ts +1 -0
- package/dist/cjs/Hooks/filters.test.js +50 -0
- package/dist/cjs/Hooks/index.d.ts +2 -0
- package/dist/cjs/Hooks/index.js +2 -0
- package/dist/cjs/Hooks/pagination.d.ts +1 -0
- package/dist/cjs/Hooks/selection.d.ts +1 -1
- package/dist/cjs/Hooks/selection.js +4 -2
- package/dist/cjs/Hooks/sort.d.ts +32 -0
- package/dist/cjs/Hooks/sort.js +47 -0
- package/dist/cjs/Hooks/sort.test.d.ts +1 -0
- package/dist/cjs/Hooks/sort.test.js +68 -0
- package/dist/cjs/InternalContext/InternalContext.d.ts +1 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +7 -1
- package/dist/dynamic/DataViewCheckboxFilter/package.json +1 -0
- package/dist/dynamic/DataViewFilters/package.json +1 -0
- package/dist/dynamic/DataViewTextFilter/package.json +1 -0
- package/dist/esm/DataView/DataView.d.ts +3 -1
- package/dist/esm/DataViewCheckboxFilter/DataViewCheckboxFilter.d.ts +29 -0
- package/dist/esm/DataViewCheckboxFilter/DataViewCheckboxFilter.js +62 -0
- package/dist/esm/DataViewCheckboxFilter/DataViewCheckboxFilter.test.d.ts +1 -0
- package/dist/esm/DataViewCheckboxFilter/DataViewCheckboxFilter.test.js +20 -0
- package/dist/esm/DataViewCheckboxFilter/index.d.ts +2 -0
- package/dist/esm/DataViewCheckboxFilter/index.js +2 -0
- package/dist/esm/DataViewFilters/DataViewFilters.d.ts +25 -0
- package/dist/esm/DataViewFilters/DataViewFilters.js +58 -0
- package/dist/esm/DataViewFilters/DataViewFilters.test.d.ts +1 -0
- package/dist/esm/DataViewFilters/DataViewFilters.test.js +14 -0
- package/dist/esm/DataViewFilters/index.d.ts +2 -0
- package/dist/esm/DataViewFilters/index.js +2 -0
- package/dist/esm/DataViewTable/DataViewTable.d.ts +8 -0
- package/dist/esm/DataViewTableBasic/DataViewTableBasic.d.ts +1 -0
- package/dist/esm/DataViewTableHead/DataViewTableHead.d.ts +1 -0
- package/dist/esm/DataViewTableTree/DataViewTableTree.d.ts +1 -0
- package/dist/esm/DataViewTableTree/DataViewTableTree.js +26 -14
- package/dist/esm/DataViewTextFilter/DataViewTextFilter.d.ts +21 -0
- package/dist/esm/DataViewTextFilter/DataViewTextFilter.js +19 -0
- package/dist/esm/DataViewTextFilter/DataViewTextFilter.test.d.ts +1 -0
- package/dist/esm/DataViewTextFilter/DataViewTextFilter.test.js +17 -0
- package/dist/esm/DataViewTextFilter/index.d.ts +2 -0
- package/dist/esm/DataViewTextFilter/index.js +2 -0
- package/dist/esm/DataViewToolbar/DataViewToolbar.d.ts +10 -4
- package/dist/esm/DataViewToolbar/DataViewToolbar.js +7 -4
- package/dist/esm/Hooks/filters.d.ts +14 -0
- package/dist/esm/Hooks/filters.js +65 -0
- package/dist/esm/Hooks/filters.test.d.ts +1 -0
- package/dist/esm/Hooks/filters.test.js +48 -0
- package/dist/esm/Hooks/index.d.ts +2 -0
- package/dist/esm/Hooks/index.js +2 -0
- package/dist/esm/Hooks/pagination.d.ts +1 -0
- package/dist/esm/Hooks/selection.d.ts +1 -1
- package/dist/esm/Hooks/selection.js +4 -2
- package/dist/esm/Hooks/sort.d.ts +32 -0
- package/dist/esm/Hooks/sort.js +43 -0
- package/dist/esm/Hooks/sort.test.d.ts +1 -0
- package/dist/esm/Hooks/sort.test.js +66 -0
- package/dist/esm/InternalContext/InternalContext.d.ts +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/patternfly-docs/content/extensions/data-view/examples/Components/Components.md +5 -3
- package/patternfly-docs/content/extensions/data-view/examples/Components/DataViewTableExample.tsx +1 -1
- package/patternfly-docs/content/extensions/data-view/examples/EventsContext/EventsContext.md +1 -0
- package/patternfly-docs/content/extensions/data-view/examples/EventsContext/EventsExample.tsx +28 -6
- package/patternfly-docs/content/extensions/data-view/examples/Functionality/FiltersExample.tsx +107 -0
- package/patternfly-docs/content/extensions/data-view/examples/Functionality/Functionality.md +67 -2
- package/patternfly-docs/content/extensions/data-view/examples/Functionality/SortingExample.tsx +87 -0
- package/src/DataView/DataView.tsx +3 -2
- package/src/DataViewCheckboxFilter/DataViewCheckboxFilter.test.tsx +24 -0
- package/src/DataViewCheckboxFilter/DataViewCheckboxFilter.tsx +175 -0
- package/src/DataViewCheckboxFilter/__snapshots__/DataViewCheckboxFilter.test.tsx.snap +197 -0
- package/src/DataViewCheckboxFilter/index.ts +2 -0
- package/src/DataViewFilters/DataViewFilters.test.tsx +21 -0
- package/src/DataViewFilters/DataViewFilters.tsx +144 -0
- package/src/DataViewFilters/__snapshots__/DataViewFilters.test.tsx.snap +194 -0
- package/src/DataViewFilters/index.tsx +2 -0
- package/src/DataViewTable/DataViewTable.tsx +23 -3
- package/src/DataViewTableBasic/DataViewTableBasic.tsx +1 -0
- package/src/DataViewTableHead/DataViewTableHead.tsx +1 -0
- package/src/DataViewTableTree/DataViewTableTree.tsx +40 -18
- package/src/DataViewTextFilter/DataViewTextFilter.test.tsx +24 -0
- package/src/DataViewTextFilter/DataViewTextFilter.tsx +54 -0
- package/src/DataViewTextFilter/__snapshots__/DataViewTextFilter.test.tsx.snap +203 -0
- package/src/DataViewTextFilter/index.ts +2 -0
- package/src/DataViewToolbar/DataViewToolbar.tsx +47 -28
- package/src/DataViewToolbar/__snapshots__/DataViewToolbar.test.tsx.snap +44 -0
- package/src/Hooks/filters.test.tsx +62 -0
- package/src/Hooks/filters.ts +97 -0
- package/src/Hooks/index.ts +2 -0
- package/src/Hooks/pagination.ts +1 -0
- package/src/Hooks/selection.ts +3 -2
- package/src/Hooks/sort.test.tsx +84 -0
- package/src/Hooks/sort.ts +87 -0
- package/src/InternalContext/InternalContext.tsx +1 -0
- 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
|
+
`;
|
|
@@ -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 | {
|
|
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 {
|
|
16
|
-
|
|
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
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
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,
|
|
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
|
+
`;
|