@patternfly/react-data-view 6.1.0-prerelease.1 → 6.1.0
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 +15 -1
- package/dist/cjs/DataView/DataView.js +14 -3
- 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/DataViewEventsContext/DataViewEventsContext.d.ts +16 -0
- package/dist/cjs/DataViewEventsContext/DataViewEventsContext.js +62 -0
- package/dist/cjs/DataViewEventsContext/DataViewEventsContext.test.d.ts +1 -0
- package/dist/cjs/DataViewEventsContext/DataViewEventsContext.test.js +72 -0
- package/dist/cjs/DataViewEventsContext/index.d.ts +2 -0
- package/dist/cjs/DataViewEventsContext/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 +49 -0
- package/dist/cjs/DataViewTable/DataViewTable.js +18 -0
- package/dist/cjs/DataViewTable/DataViewTable.test.d.ts +1 -0
- package/dist/cjs/DataViewTable/DataViewTable.test.js +57 -0
- package/dist/cjs/DataViewTable/index.d.ts +2 -0
- package/dist/cjs/DataViewTable/index.js +23 -0
- package/dist/cjs/DataViewTableBasic/DataViewTableBasic.d.ts +19 -0
- package/dist/cjs/DataViewTableBasic/DataViewTableBasic.js +71 -0
- package/dist/cjs/DataViewTableBasic/DataViewTableBasic.test.d.ts +1 -0
- package/dist/cjs/DataViewTableBasic/DataViewTableBasic.test.js +43 -0
- package/dist/cjs/DataViewTableBasic/index.d.ts +2 -0
- package/dist/cjs/DataViewTableBasic/index.js +23 -0
- package/dist/cjs/DataViewTableHead/DataViewTableHead.d.ts +14 -0
- package/dist/cjs/DataViewTableHead/DataViewTableHead.js +57 -0
- package/dist/cjs/DataViewTableHead/DataViewTableHead.test.d.ts +1 -0
- package/dist/cjs/DataViewTableHead/DataViewTableHead.test.js +36 -0
- package/dist/cjs/DataViewTableHead/index.d.ts +2 -0
- package/dist/cjs/DataViewTableHead/index.js +23 -0
- package/dist/cjs/DataViewTableTree/DataViewTableTree.d.ts +25 -0
- package/dist/cjs/DataViewTableTree/DataViewTableTree.js +144 -0
- package/dist/cjs/DataViewTableTree/DataViewTableTree.test.d.ts +1 -0
- package/dist/cjs/DataViewTableTree/DataViewTableTree.test.js +90 -0
- package/dist/cjs/DataViewTableTree/index.d.ts +2 -0
- package/dist/cjs/DataViewTableTree/index.js +23 -0
- 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 +11 -3
- package/dist/cjs/DataViewToolbar/DataViewToolbar.js +30 -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 +14 -1
- package/dist/cjs/Hooks/pagination.js +36 -4
- package/dist/cjs/Hooks/pagination.test.js +1 -1
- package/dist/cjs/Hooks/selection.d.ts +3 -3
- package/dist/cjs/Hooks/selection.js +4 -4
- package/dist/cjs/Hooks/selection.test.js +4 -4
- 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 +26 -0
- package/dist/cjs/InternalContext/InternalContext.js +40 -0
- package/dist/cjs/InternalContext/InternalContext.test.d.ts +1 -0
- package/dist/cjs/InternalContext/InternalContext.test.js +56 -0
- package/dist/cjs/InternalContext/index.d.ts +2 -0
- package/dist/cjs/InternalContext/index.js +23 -0
- package/dist/cjs/index.d.ts +16 -0
- package/dist/cjs/index.js +26 -2
- package/dist/dynamic/DataViewCheckboxFilter/package.json +1 -0
- package/dist/dynamic/DataViewEventsContext/package.json +1 -0
- package/dist/dynamic/DataViewFilters/package.json +1 -0
- package/dist/dynamic/DataViewTable/package.json +1 -0
- package/dist/dynamic/DataViewTableBasic/package.json +1 -0
- package/dist/dynamic/DataViewTableHead/package.json +1 -0
- package/dist/dynamic/DataViewTableTree/package.json +1 -0
- package/dist/dynamic/DataViewTextFilter/package.json +1 -0
- package/dist/dynamic/InternalContext/package.json +1 -0
- package/dist/esm/DataView/DataView.d.ts +15 -1
- package/dist/esm/DataView/DataView.js +13 -2
- 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/DataViewEventsContext/DataViewEventsContext.d.ts +16 -0
- package/dist/esm/DataViewEventsContext/DataViewEventsContext.js +34 -0
- package/dist/esm/DataViewEventsContext/DataViewEventsContext.test.d.ts +1 -0
- package/dist/esm/DataViewEventsContext/DataViewEventsContext.test.js +67 -0
- package/dist/esm/DataViewEventsContext/index.d.ts +2 -0
- package/dist/esm/DataViewEventsContext/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 +49 -0
- package/dist/esm/DataViewTable/DataViewTable.js +8 -0
- package/dist/esm/DataViewTable/DataViewTable.test.d.ts +1 -0
- package/dist/esm/DataViewTable/DataViewTable.test.js +52 -0
- package/dist/esm/DataViewTable/index.d.ts +2 -0
- package/dist/esm/DataViewTable/index.js +2 -0
- package/dist/esm/DataViewTableBasic/DataViewTableBasic.d.ts +19 -0
- package/dist/esm/DataViewTableBasic/DataViewTableBasic.js +44 -0
- package/dist/esm/DataViewTableBasic/DataViewTableBasic.test.d.ts +1 -0
- package/dist/esm/DataViewTableBasic/DataViewTableBasic.test.js +38 -0
- package/dist/esm/DataViewTableBasic/index.d.ts +2 -0
- package/dist/esm/DataViewTableBasic/index.js +2 -0
- package/dist/esm/DataViewTableHead/DataViewTableHead.d.ts +14 -0
- package/dist/esm/DataViewTableHead/DataViewTableHead.js +30 -0
- package/dist/esm/DataViewTableHead/DataViewTableHead.test.d.ts +1 -0
- package/dist/esm/DataViewTableHead/DataViewTableHead.test.js +31 -0
- package/dist/esm/DataViewTableHead/index.d.ts +2 -0
- package/dist/esm/DataViewTableHead/index.js +2 -0
- package/dist/esm/DataViewTableTree/DataViewTableTree.d.ts +25 -0
- package/dist/esm/DataViewTableTree/DataViewTableTree.js +117 -0
- package/dist/esm/DataViewTableTree/DataViewTableTree.test.d.ts +1 -0
- package/dist/esm/DataViewTableTree/DataViewTableTree.test.js +85 -0
- package/dist/esm/DataViewTableTree/index.d.ts +2 -0
- package/dist/esm/DataViewTableTree/index.js +2 -0
- 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 +11 -3
- package/dist/esm/DataViewToolbar/DataViewToolbar.js +8 -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 +14 -1
- package/dist/esm/Hooks/pagination.js +36 -4
- package/dist/esm/Hooks/pagination.test.js +1 -1
- package/dist/esm/Hooks/selection.d.ts +3 -3
- package/dist/esm/Hooks/selection.js +4 -4
- package/dist/esm/Hooks/selection.test.js +4 -4
- 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 +26 -0
- package/dist/esm/InternalContext/InternalContext.js +12 -0
- package/dist/esm/InternalContext/InternalContext.test.d.ts +1 -0
- package/dist/esm/InternalContext/InternalContext.test.js +51 -0
- package/dist/esm/InternalContext/index.d.ts +2 -0
- package/dist/esm/InternalContext/index.js +2 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.js +16 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -15
- package/patternfly-docs/content/extensions/data-view/examples/DataView/DataView.md +63 -0
- package/patternfly-docs/content/extensions/data-view/examples/DataView/EventsExample.tsx +130 -0
- package/patternfly-docs/content/extensions/data-view/examples/DataView/PredefinedLayoutFullExample.tsx +275 -0
- package/patternfly-docs/content/extensions/data-view/examples/Table/DataViewTableEmptyExample.tsx +57 -0
- package/patternfly-docs/content/extensions/data-view/examples/Table/DataViewTableErrorExample.tsx +45 -0
- package/patternfly-docs/content/extensions/data-view/examples/Table/DataViewTableExample.tsx +67 -0
- package/patternfly-docs/content/extensions/data-view/examples/Table/DataViewTableLoadingExample.tsx +27 -0
- package/patternfly-docs/content/extensions/data-view/examples/Table/DataViewTableTreeExample.tsx +71 -0
- package/patternfly-docs/content/extensions/data-view/examples/Table/SortingExample.tsx +87 -0
- package/patternfly-docs/content/extensions/data-view/examples/Table/Table.md +130 -0
- package/patternfly-docs/content/extensions/data-view/examples/Toolbar/DataViewToolbarActionsExample.tsx +27 -0
- package/patternfly-docs/content/extensions/data-view/examples/Toolbar/DataViewToolbarExample.tsx +36 -0
- package/patternfly-docs/content/extensions/data-view/examples/Toolbar/FiltersExample.tsx +107 -0
- package/patternfly-docs/content/extensions/data-view/examples/Toolbar/PaginationExample.tsx +56 -0
- package/patternfly-docs/content/extensions/data-view/examples/Toolbar/SelectionExample.tsx +57 -0
- package/patternfly-docs/content/extensions/data-view/examples/Toolbar/Toolbar.md +142 -0
- package/patternfly-docs/pages/index.js +1 -1
- package/src/DataView/DataView.tsx +28 -5
- package/src/DataView/__snapshots__/DataView.test.tsx.snap +2 -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/DataViewEventsContext/DataViewEventsContext.test.tsx +105 -0
- package/src/DataViewEventsContext/DataViewEventsContext.tsx +70 -0
- package/src/DataViewEventsContext/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.test.tsx +80 -0
- package/src/DataViewTable/DataViewTable.tsx +57 -0
- package/src/DataViewTable/__snapshots__/DataViewTable.test.tsx.snap +1042 -0
- package/src/DataViewTable/index.ts +2 -0
- package/src/DataViewTableBasic/DataViewTableBasic.test.tsx +65 -0
- package/src/DataViewTableBasic/DataViewTableBasic.tsx +83 -0
- package/src/DataViewTableBasic/__snapshots__/DataViewTableBasic.test.tsx.snap +555 -0
- package/src/DataViewTableBasic/index.ts +2 -0
- package/src/DataViewTableHead/DataViewTableHead.test.tsx +50 -0
- package/src/DataViewTableHead/DataViewTableHead.tsx +54 -0
- package/src/DataViewTableHead/__snapshots__/DataViewTableHead.test.tsx.snap +227 -0
- package/src/DataViewTableHead/index.ts +2 -0
- package/src/DataViewTableTree/DataViewTableTree.test.tsx +113 -0
- package/src/DataViewTableTree/DataViewTableTree.tsx +186 -0
- package/src/DataViewTableTree/__snapshots__/DataViewTableTree.test.tsx.snap +1200 -0
- package/src/DataViewTableTree/index.ts +2 -0
- 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 +48 -22
- package/src/DataViewToolbar/__snapshots__/DataViewToolbar.test.tsx.snap +52 -8
- 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.test.tsx +1 -1
- package/src/Hooks/pagination.ts +69 -12
- package/src/Hooks/selection.test.tsx +5 -5
- package/src/Hooks/selection.ts +7 -7
- package/src/Hooks/sort.test.tsx +84 -0
- package/src/Hooks/sort.ts +87 -0
- package/src/InternalContext/InternalContext.test.tsx +89 -0
- package/src/InternalContext/InternalContext.tsx +52 -0
- package/src/InternalContext/index.ts +2 -0
- package/src/index.ts +24 -0
- package/patternfly-docs/content/extensions/data-view/about-data-view.md +0 -14
- package/patternfly-docs/content/extensions/data-view/examples/Components/Components.md +0 -31
- package/patternfly-docs/content/extensions/data-view/examples/Components/DataViewToolbarExample.tsx +0 -20
- package/patternfly-docs/content/extensions/data-view/examples/Functionality/Functionality.md +0 -77
- package/patternfly-docs/content/extensions/data-view/examples/Functionality/PaginationExample.tsx +0 -65
- package/patternfly-docs/content/extensions/data-view/examples/Functionality/SelectionExample.tsx +0 -88
- package/patternfly-docs/content/extensions/data-view/examples/Layout/Layout.md +0 -39
- package/patternfly-docs/content/extensions/data-view/examples/Layout/PredefinedLayoutExample.tsx +0 -120
- /package/patternfly-docs/content/extensions/data-view/examples/{Layout → DataView}/AbstractLayoutExample.tsx +0 -0
package/src/Hooks/pagination.ts
CHANGED
|
@@ -1,31 +1,88 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
2
|
|
|
3
3
|
export interface UseDataViewPaginationProps {
|
|
4
4
|
/** Initial page */
|
|
5
5
|
page?: number;
|
|
6
6
|
/** Items per page */
|
|
7
7
|
perPage: number;
|
|
8
|
+
/** Current search parameters as a string */
|
|
9
|
+
searchParams?: URLSearchParams;
|
|
10
|
+
/** Function to set search parameters */
|
|
11
|
+
setSearchParams?: (params: URLSearchParams) => void;
|
|
12
|
+
/** Custom URL parameter name for page */
|
|
13
|
+
pageParam?: string;
|
|
14
|
+
/** Custom URL parameter name for per page */
|
|
15
|
+
perPageParam?: string;
|
|
8
16
|
}
|
|
9
17
|
|
|
18
|
+
/** extends UseDataViewPaginationProps */
|
|
10
19
|
export interface DataViewPaginationProps extends UseDataViewPaginationProps {
|
|
11
20
|
/** Current page number */
|
|
12
21
|
page: number;
|
|
13
22
|
}
|
|
14
23
|
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
export enum PaginationParams {
|
|
25
|
+
PAGE = 'page',
|
|
26
|
+
PER_PAGE = 'perPage'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const useDataViewPagination = ({
|
|
30
|
+
page = 1,
|
|
31
|
+
perPage,
|
|
32
|
+
searchParams,
|
|
33
|
+
setSearchParams,
|
|
34
|
+
pageParam = PaginationParams.PAGE,
|
|
35
|
+
perPageParam = PaginationParams.PER_PAGE,
|
|
36
|
+
}: UseDataViewPaginationProps) => {
|
|
37
|
+
const [ state, setState ] = useState({
|
|
38
|
+
page: parseInt(searchParams?.get(pageParam) || `${page}`),
|
|
39
|
+
perPage: parseInt(searchParams?.get(perPageParam) || `${perPage}`),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const updateSearchParams = (page: number, perPage: number) => {
|
|
43
|
+
if (searchParams && setSearchParams) {
|
|
44
|
+
const params = new URLSearchParams(searchParams);
|
|
45
|
+
params.set(pageParam, `${page}`);
|
|
46
|
+
params.set(perPageParam, `${perPage}`);
|
|
47
|
+
setSearchParams(params);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
// Make sure search params are loaded or set if not present on mount
|
|
53
|
+
updateSearchParams(state.page, state.perPage);
|
|
54
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
|
+
}, []);
|
|
56
|
+
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
// Listen on URL params changes
|
|
59
|
+
const currentPage = parseInt(searchParams?.get(pageParam) || `${state.page}`);
|
|
60
|
+
const currentPerPage = parseInt(searchParams?.get(perPageParam) || `${state.perPage}`);
|
|
61
|
+
if (currentPage !== state.page || currentPerPage !== state.perPage) {
|
|
62
|
+
setState({ page: currentPage, perPage: currentPerPage });
|
|
63
|
+
}
|
|
64
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
65
|
+
}, [ searchParams?.toString() ]);
|
|
66
|
+
|
|
67
|
+
const onPerPageSelect = (
|
|
68
|
+
_event: React.MouseEvent | React.KeyboardEvent | MouseEvent | undefined,
|
|
69
|
+
newPerPage: number
|
|
70
|
+
) => {
|
|
71
|
+
updateSearchParams(1, newPerPage);
|
|
72
|
+
setState({ perPage: newPerPage, page: 1 });
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const onSetPage = (
|
|
76
|
+
_event: React.MouseEvent | React.KeyboardEvent | MouseEvent | undefined,
|
|
77
|
+
newPage: number
|
|
78
|
+
) => {
|
|
79
|
+
updateSearchParams(newPage, state.perPage);
|
|
23
80
|
setState(prev => ({ ...prev, page: newPage }));
|
|
24
81
|
}
|
|
25
82
|
|
|
26
83
|
return {
|
|
27
84
|
...state,
|
|
28
85
|
onPerPageSelect,
|
|
29
|
-
onSetPage
|
|
30
|
-
}
|
|
31
|
-
}
|
|
86
|
+
onSetPage,
|
|
87
|
+
};
|
|
88
|
+
};
|
|
@@ -4,7 +4,7 @@ import { useDataViewSelection } from './selection';
|
|
|
4
4
|
|
|
5
5
|
describe('useDataViewSelection', () => {
|
|
6
6
|
it('should get initial state correctly - no initialSelected', () => {
|
|
7
|
-
const { result } = renderHook(() => useDataViewSelection({}))
|
|
7
|
+
const { result } = renderHook(() => useDataViewSelection({ matchOption: (a, b) => a.id === b.id }))
|
|
8
8
|
expect(result.current).toEqual({
|
|
9
9
|
selected: [],
|
|
10
10
|
onSelect: expect.any(Function),
|
|
@@ -14,7 +14,7 @@ describe('useDataViewSelection', () => {
|
|
|
14
14
|
|
|
15
15
|
it('should get initial state correctly - with initialSelected', () => {
|
|
16
16
|
const initialSelected = [ { id: 1, name: 'test1' } ];
|
|
17
|
-
const { result } = renderHook(() => useDataViewSelection({ initialSelected }))
|
|
17
|
+
const { result } = renderHook(() => useDataViewSelection({ initialSelected, matchOption: (a, b) => a.id === b.id }))
|
|
18
18
|
expect(result.current).toEqual({
|
|
19
19
|
selected: initialSelected,
|
|
20
20
|
onSelect: expect.any(Function),
|
|
@@ -24,7 +24,7 @@ describe('useDataViewSelection', () => {
|
|
|
24
24
|
|
|
25
25
|
it('should select items correctly - objects', async () => {
|
|
26
26
|
const initialSelected = [ { id: 1, name: 'test1' } ];
|
|
27
|
-
const { result } = renderHook(() => useDataViewSelection({ initialSelected }))
|
|
27
|
+
const { result } = renderHook(() => useDataViewSelection({ initialSelected, matchOption: (a, b) => a.id === b.id }))
|
|
28
28
|
|
|
29
29
|
await act(async () => {
|
|
30
30
|
result.current.onSelect(true, { id: 2, name: 'test2' });
|
|
@@ -34,7 +34,7 @@ describe('useDataViewSelection', () => {
|
|
|
34
34
|
|
|
35
35
|
it('should deselect items correctly - strings', async () => {
|
|
36
36
|
const initialSelected = [ 'test1', 'test2' ];
|
|
37
|
-
const { result } = renderHook(() => useDataViewSelection({ initialSelected }))
|
|
37
|
+
const { result } = renderHook(() => useDataViewSelection({ initialSelected, matchOption: (a, b) => a === b }))
|
|
38
38
|
|
|
39
39
|
await act(async () => {
|
|
40
40
|
result.current.onSelect(false, 'test2');
|
|
@@ -44,7 +44,7 @@ describe('useDataViewSelection', () => {
|
|
|
44
44
|
|
|
45
45
|
it('should check if item is selected correctly - objects', () => {
|
|
46
46
|
const initialSelected = [ { id: 1, name: 'test1' }, { id: 2, name: 'test2' } ];
|
|
47
|
-
const { result } = renderHook(() => useDataViewSelection({ initialSelected, matchOption: (a,b) => a.id === b.id }))
|
|
47
|
+
const { result } = renderHook(() => useDataViewSelection({ initialSelected, matchOption: (a, b) => a.id === b.id }))
|
|
48
48
|
|
|
49
49
|
expect(result.current.isSelected({ id: 1, name: 'test1' })).toBe(true);
|
|
50
50
|
expect(result.current.isSelected({ id: 3, name: 'test2' })).toBe(false);
|
package/src/Hooks/selection.ts
CHANGED
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
|
|
4
4
|
export interface UseDataViewSelectionProps {
|
|
5
|
+
/** Function to compare items when checking if item is selected */
|
|
6
|
+
matchOption: (item: any, another: any) => boolean;
|
|
5
7
|
/** Array of initially selected entries */
|
|
6
8
|
initialSelected?: (any)[];
|
|
7
|
-
/** Function to compare items when checking if entry is selected */
|
|
8
|
-
matchOption?: (item: any, another: any) => boolean;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export const useDataViewSelection = (props
|
|
12
|
-
const [ selected, setSelected ] = useState<any[]>(props
|
|
13
|
-
const matchOption = props
|
|
11
|
+
export const useDataViewSelection = (props?: UseDataViewSelectionProps) => {
|
|
12
|
+
const [ selected, setSelected ] = useState<any[]>(props?.initialSelected ?? []);
|
|
13
|
+
const matchOption = props?.matchOption ? props.matchOption : (option, another) => (option === another);
|
|
14
14
|
|
|
15
15
|
const onSelect = (isSelecting: boolean, items?: any[] | any) => {
|
|
16
|
-
isSelecting ?
|
|
16
|
+
isSelecting && items ?
|
|
17
17
|
setSelected(prev => {
|
|
18
18
|
const newSelectedItems = [ ...prev ];
|
|
19
19
|
(Array.isArray(items) ? items : [ items ]).forEach(newItem => !prev.some(prevItem => matchOption(prevItem, newItem)) && newSelectedItems.push(newItem));
|
|
@@ -22,7 +22,7 @@ export const useDataViewSelection = (props: UseDataViewSelectionProps) => {
|
|
|
22
22
|
: setSelected(items ? prev => prev.filter(prevSelected => !(Array.isArray(items) ? items : [ items ]).some(item => matchOption(item, prevSelected))) : []);
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
-
const isSelected = (item: any): boolean =>
|
|
25
|
+
const isSelected = (item: any): boolean => Boolean(selected.find(selected => matchOption(selected, item)));
|
|
26
26
|
|
|
27
27
|
return {
|
|
28
28
|
selected,
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
2
|
+
import { renderHook, act } from '@testing-library/react';
|
|
3
|
+
import { useDataViewSort, UseDataViewSortProps, DataViewSortConfig, DataViewSortParams } from './sort';
|
|
4
|
+
|
|
5
|
+
describe('useDataViewSort', () => {
|
|
6
|
+
const initialSort: DataViewSortConfig = { sortBy: 'name', direction: 'asc' };
|
|
7
|
+
|
|
8
|
+
it('should initialize with provided initial sort config', () => {
|
|
9
|
+
const { result } = renderHook(() => useDataViewSort({ initialSort }));
|
|
10
|
+
expect(result.current).toEqual(expect.objectContaining(initialSort));
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should initialize with empty sort config if no initialSort is provided', () => {
|
|
14
|
+
const { result } = renderHook(() => useDataViewSort());
|
|
15
|
+
expect(result.current).toEqual(expect.objectContaining({ sortBy: undefined, direction: 'asc' }));
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should update sort state when onSort is called', () => {
|
|
19
|
+
const { result } = renderHook(() => useDataViewSort({ initialSort }));
|
|
20
|
+
act(() => {
|
|
21
|
+
result.current.onSort(undefined, 'age', 'desc');
|
|
22
|
+
});
|
|
23
|
+
expect(result.current).toEqual(expect.objectContaining({ sortBy: 'age', direction: 'desc' }));
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should sync with URL search params if isUrlSyncEnabled', () => {
|
|
27
|
+
const searchParams = new URLSearchParams();
|
|
28
|
+
const setSearchParams = jest.fn();
|
|
29
|
+
const props: UseDataViewSortProps = {
|
|
30
|
+
initialSort,
|
|
31
|
+
searchParams,
|
|
32
|
+
setSearchParams,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const { result } = renderHook(() => useDataViewSort(props));
|
|
36
|
+
|
|
37
|
+
expect(setSearchParams).toHaveBeenCalledTimes(1);
|
|
38
|
+
expect(result.current).toEqual(expect.objectContaining(initialSort));
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should validate direction and fallback to default direction if invalid direction is provided', () => {
|
|
42
|
+
const searchParams = new URLSearchParams();
|
|
43
|
+
searchParams.set(DataViewSortParams.SORT_BY, 'name');
|
|
44
|
+
searchParams.set(DataViewSortParams.DIRECTION, 'invalid-direction');
|
|
45
|
+
const { result } = renderHook(() => useDataViewSort({ searchParams, defaultDirection: 'desc' }));
|
|
46
|
+
|
|
47
|
+
expect(result.current).toEqual(expect.objectContaining({ sortBy: 'name', direction: 'desc' }));
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should update search params when URL sync is enabled and sort changes', () => {
|
|
51
|
+
const searchParams = new URLSearchParams();
|
|
52
|
+
const setSearchParams = jest.fn();
|
|
53
|
+
const props: UseDataViewSortProps = {
|
|
54
|
+
initialSort,
|
|
55
|
+
searchParams,
|
|
56
|
+
setSearchParams,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const { result } = renderHook(() => useDataViewSort(props));
|
|
60
|
+
act(() => {
|
|
61
|
+
expect(setSearchParams).toHaveBeenCalledTimes(1);
|
|
62
|
+
result.current.onSort(undefined, 'priority', 'desc');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
expect(setSearchParams).toHaveBeenCalledTimes(2);
|
|
66
|
+
expect(result.current).toEqual(expect.objectContaining({ sortBy: 'priority', direction: 'desc' }));
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should prioritize searchParams values', () => {
|
|
70
|
+
const searchParams = new URLSearchParams();
|
|
71
|
+
searchParams.set(DataViewSortParams.SORT_BY, 'category');
|
|
72
|
+
searchParams.set(DataViewSortParams.DIRECTION, 'desc');
|
|
73
|
+
|
|
74
|
+
const { result } = renderHook(
|
|
75
|
+
(props: UseDataViewSortProps) => useDataViewSort(props),
|
|
76
|
+
{ initialProps: { initialSort, searchParams } }
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
expect(result.current).toEqual(expect.objectContaining({
|
|
80
|
+
sortBy: 'category',
|
|
81
|
+
direction: 'desc',
|
|
82
|
+
}));
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ISortBy } from "@patternfly/react-table";
|
|
2
|
+
import { useState, useEffect, useMemo } from "react";
|
|
3
|
+
|
|
4
|
+
export enum DataViewSortParams {
|
|
5
|
+
SORT_BY = 'sortBy',
|
|
6
|
+
DIRECTION = 'direction'
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const validateDirection = (direction: string | null | undefined, defaultDirection: ISortBy['direction']): ISortBy['direction'] => (
|
|
10
|
+
direction === 'asc' || direction === 'desc' ? direction : defaultDirection
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
export interface DataViewSortConfig {
|
|
14
|
+
/** Attribute to sort the entries by */
|
|
15
|
+
sortBy: string | undefined;
|
|
16
|
+
/** Sort direction */
|
|
17
|
+
direction: ISortBy['direction'];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export interface UseDataViewSortProps {
|
|
21
|
+
/** Initial sort config */
|
|
22
|
+
initialSort?: DataViewSortConfig;
|
|
23
|
+
/** Current search parameters as a string */
|
|
24
|
+
searchParams?: URLSearchParams;
|
|
25
|
+
/** Function to set search parameters */
|
|
26
|
+
setSearchParams?: (params: URLSearchParams) => void;
|
|
27
|
+
/** Default direction */
|
|
28
|
+
defaultDirection?: ISortBy['direction'];
|
|
29
|
+
/** Sort by URL param name */
|
|
30
|
+
sortByParam?: string;
|
|
31
|
+
/** Direction URL param name */
|
|
32
|
+
directionParam?: string;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const useDataViewSort = (props?: UseDataViewSortProps) => {
|
|
36
|
+
const {
|
|
37
|
+
initialSort,
|
|
38
|
+
searchParams,
|
|
39
|
+
setSearchParams,
|
|
40
|
+
defaultDirection = 'asc',
|
|
41
|
+
sortByParam = DataViewSortParams.SORT_BY,
|
|
42
|
+
directionParam = DataViewSortParams.DIRECTION
|
|
43
|
+
} = props ?? {};
|
|
44
|
+
|
|
45
|
+
const isUrlSyncEnabled = useMemo(() => searchParams && !!setSearchParams, [ searchParams, setSearchParams ]);
|
|
46
|
+
|
|
47
|
+
const [ state, setState ] = useState<DataViewSortConfig>({
|
|
48
|
+
sortBy: searchParams?.get(sortByParam) ?? initialSort?.sortBy,
|
|
49
|
+
direction: validateDirection(searchParams?.get(directionParam) as ISortBy['direction'], initialSort?.direction),
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const updateSearchParams = (sortBy: string, direction: ISortBy['direction']) => {
|
|
53
|
+
if (isUrlSyncEnabled && sortBy) {
|
|
54
|
+
const params = new URLSearchParams(searchParams);
|
|
55
|
+
params.set(sortByParam, `${sortBy}`);
|
|
56
|
+
params.set(directionParam, `${direction}`);
|
|
57
|
+
setSearchParams?.(params);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
state.sortBy && state.direction && updateSearchParams(state.sortBy, state.direction);
|
|
63
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
64
|
+
}, []);
|
|
65
|
+
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
const currentSortBy = searchParams?.get(sortByParam) || state.sortBy;
|
|
68
|
+
const currentDirection = searchParams?.get(directionParam) as ISortBy['direction'] || state.direction;
|
|
69
|
+
const validDirection = validateDirection(currentDirection, defaultDirection);
|
|
70
|
+
currentSortBy !== state.sortBy || validDirection !== state.direction && setState({ sortBy: currentSortBy, direction: validDirection });
|
|
71
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
72
|
+
}, [ searchParams?.toString() ]);
|
|
73
|
+
|
|
74
|
+
const onSort = (
|
|
75
|
+
_event: React.MouseEvent | React.KeyboardEvent | MouseEvent | undefined,
|
|
76
|
+
newSortBy: string,
|
|
77
|
+
newSortDirection: ISortBy['direction']
|
|
78
|
+
) => {
|
|
79
|
+
setState({ sortBy: newSortBy, direction: newSortDirection });
|
|
80
|
+
updateSearchParams(newSortBy, newSortDirection);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
...state,
|
|
85
|
+
onSort
|
|
86
|
+
};
|
|
87
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, fireEvent } from '@testing-library/react';
|
|
3
|
+
import '@testing-library/jest-dom';
|
|
4
|
+
import { useInternalContext, DataViewSelection } from './InternalContext';
|
|
5
|
+
import { DataView } from '../DataView';
|
|
6
|
+
|
|
7
|
+
describe('InternalContext', () => {
|
|
8
|
+
const mockSelection: DataViewSelection = {
|
|
9
|
+
onSelect: jest.fn(),
|
|
10
|
+
isSelected: jest.fn(),
|
|
11
|
+
isSelectDisabled: jest.fn(),
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
test('should provide context value and allow consuming it', () => {
|
|
15
|
+
const TestComponent = () => {
|
|
16
|
+
const { selection } = useInternalContext();
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<div>
|
|
20
|
+
<button onClick={() => selection?.onSelect(true, [ 'item1' ])}>Select item</button>
|
|
21
|
+
<span>{selection?.isSelected('item1') ? 'Selected' : 'Not selected'}</span>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const { getByText } = render(
|
|
27
|
+
<DataView selection={mockSelection}>
|
|
28
|
+
<TestComponent />
|
|
29
|
+
</DataView>
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
fireEvent.click(getByText('Select item'));
|
|
33
|
+
expect(mockSelection.onSelect).toHaveBeenCalledWith(true, [ 'item1' ]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('should handle selection state correctly', () => {
|
|
37
|
+
const mockSelectionState = {
|
|
38
|
+
...mockSelection,
|
|
39
|
+
isSelected: jest.fn((item) => item === 'item1'),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const TestComponent = () => {
|
|
43
|
+
const { selection } = useInternalContext();
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div>
|
|
47
|
+
<span>{selection?.isSelected('item1') ? 'Item 1 is selected' : 'Item 1 is not selected'}</span>
|
|
48
|
+
<span>{selection?.isSelected('item2') ? 'Item 2 is selected' : 'Item 2 is not selected'}</span>
|
|
49
|
+
</div>
|
|
50
|
+
);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const { getByText } = render(
|
|
54
|
+
<DataView selection={mockSelectionState}>
|
|
55
|
+
<TestComponent />
|
|
56
|
+
</DataView>
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
expect(getByText('Item 1 is selected')).toBeInTheDocument();
|
|
60
|
+
expect(getByText('Item 2 is not selected')).toBeInTheDocument();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('should handle selection disabled correctly', () => {
|
|
64
|
+
const mockSelectionWithDisabled = {
|
|
65
|
+
...mockSelection,
|
|
66
|
+
isSelectDisabled: jest.fn((item) => item === 'item3'),
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const TestComponent = () => {
|
|
70
|
+
const { selection } = useInternalContext();
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<div>
|
|
74
|
+
<span>{selection?.isSelectDisabled?.('item3') ? 'Item 3 is disabled' : 'Item 3 is enabled'}</span>
|
|
75
|
+
<span>{selection?.isSelectDisabled?.('item1') ? 'Item 1 is disabled' : 'Item 1 is enabled'}</span>
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const { getByText } = render(
|
|
81
|
+
<DataView selection={mockSelectionWithDisabled}>
|
|
82
|
+
<TestComponent />
|
|
83
|
+
</DataView>
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
expect(getByText('Item 3 is disabled')).toBeInTheDocument();
|
|
87
|
+
expect(getByText('Item 1 is enabled')).toBeInTheDocument();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React, { createContext, PropsWithChildren, useContext, useMemo } from 'react';
|
|
2
|
+
import { DataViewState } from '../DataView';
|
|
3
|
+
|
|
4
|
+
export interface DataViewSelection {
|
|
5
|
+
/** Called when the selection of items changes */
|
|
6
|
+
onSelect: (isSelecting: boolean, items?: any[] | any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
7
|
+
/** Checks if a specific item is currently selected */
|
|
8
|
+
isSelected: (item: any) => boolean; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
9
|
+
/** Determines if selection is disabled for a given item */
|
|
10
|
+
isSelectDisabled?: (item: any) => boolean; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface InternalContextProps {
|
|
14
|
+
/** Data selection props */
|
|
15
|
+
selection?: DataViewSelection;
|
|
16
|
+
/** Currently active state */
|
|
17
|
+
activeState?: DataViewState | string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** extends InternalContextProps */
|
|
21
|
+
export interface InternalContextValue extends InternalContextProps {
|
|
22
|
+
/** Flag indicating if data view is selectable (auto-calculated) */
|
|
23
|
+
isSelectable: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const InternalContext = createContext<InternalContextValue>({
|
|
27
|
+
selection: undefined,
|
|
28
|
+
activeState: undefined,
|
|
29
|
+
isSelectable: false,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export type InternalProviderProps = PropsWithChildren<InternalContextProps>
|
|
33
|
+
|
|
34
|
+
export const InternalContextProvider: React.FC<InternalProviderProps> = ({
|
|
35
|
+
children,
|
|
36
|
+
selection,
|
|
37
|
+
activeState
|
|
38
|
+
}) => {
|
|
39
|
+
const isSelectable = useMemo(() => Boolean(selection?.onSelect && selection?.isSelected), [ selection?.onSelect, selection?.isSelected ]);
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<InternalContext.Provider
|
|
43
|
+
value={{ selection, activeState, isSelectable }}
|
|
44
|
+
>
|
|
45
|
+
{children}
|
|
46
|
+
</InternalContext.Provider>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const useInternalContext = () => useContext(InternalContext);
|
|
51
|
+
|
|
52
|
+
export default InternalContext;
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
// this file is autogenerated by generate-index.js, modifying it manually will have no effect
|
|
2
|
+
|
|
3
|
+
export { default as InternalContext } from './InternalContext';
|
|
4
|
+
export * from './InternalContext';
|
|
2
5
|
export * from './Hooks';
|
|
3
6
|
|
|
4
7
|
export { default as DataViewToolbar } from './DataViewToolbar';
|
|
5
8
|
export * from './DataViewToolbar';
|
|
6
9
|
|
|
10
|
+
export { default as DataViewTextFilter } from './DataViewTextFilter';
|
|
11
|
+
export * from './DataViewTextFilter';
|
|
12
|
+
|
|
13
|
+
export { default as DataViewTableTree } from './DataViewTableTree';
|
|
14
|
+
export * from './DataViewTableTree';
|
|
15
|
+
|
|
16
|
+
export { default as DataViewTableHead } from './DataViewTableHead';
|
|
17
|
+
export * from './DataViewTableHead';
|
|
18
|
+
|
|
19
|
+
export { default as DataViewTableBasic } from './DataViewTableBasic';
|
|
20
|
+
export * from './DataViewTableBasic';
|
|
21
|
+
|
|
22
|
+
export { default as DataViewTable } from './DataViewTable';
|
|
23
|
+
export * from './DataViewTable';
|
|
24
|
+
|
|
25
|
+
export { default as DataViewEventsContext } from './DataViewEventsContext';
|
|
26
|
+
export * from './DataViewEventsContext';
|
|
27
|
+
|
|
28
|
+
export { default as DataViewCheckboxFilter } from './DataViewCheckboxFilter';
|
|
29
|
+
export * from './DataViewCheckboxFilter';
|
|
30
|
+
|
|
7
31
|
export { default as DataView } from './DataView';
|
|
8
32
|
export * from './DataView';
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
section: extensions
|
|
3
|
-
subsection: Data view
|
|
4
|
-
id: About data view
|
|
5
|
-
sortValue: 1
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Data view lives in its own package [`@patternfly/react-data-view`](https://www.npmjs.com/package/@patternfly/react-data-view)
|
|
9
|
-
|
|
10
|
-
# Data view
|
|
11
|
-
|
|
12
|
-
The data view extension contains implementation of the data view component allowing to display record data in a configured layout.
|
|
13
|
-
|
|
14
|
-
If you notice a bug or have a suggestion for the data view, feel free to file an issue in our [GitHub repository](https://github.com/patternfly/react-data-view/issues)! Please make sure to check if there is already a pre-existing issue before creating a new issue.
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
# Sidenav top-level section
|
|
3
|
-
# should be the same for all markdown files
|
|
4
|
-
section: extensions
|
|
5
|
-
subsection: Data view
|
|
6
|
-
# Sidenav secondary level section
|
|
7
|
-
# should be the same for all markdown files
|
|
8
|
-
id: Components
|
|
9
|
-
# Tab (react | react-demos | html | html-demos | design-guidelines | accessibility)
|
|
10
|
-
source: react
|
|
11
|
-
# If you use typescript, the name of the interface to display props for
|
|
12
|
-
# These are found through the sourceProps function provided in patternfly-docs.source.js
|
|
13
|
-
sortValue: 4
|
|
14
|
-
propComponents: ['DataViewToolbar']
|
|
15
|
-
sourceLink: https://github.com/patternfly/react-data-view/blob/main/packages/module/patternfly-docs/content/extensions/data-view/examples/Components/Components.md
|
|
16
|
-
---
|
|
17
|
-
import { BulkSelect } from '@patternfly/react-component-groups';
|
|
18
|
-
import DataViewToolbar from '@patternfly/react-data-view/dist/dynamic/DataViewToolbar';
|
|
19
|
-
|
|
20
|
-
## Data view toolbar
|
|
21
|
-
|
|
22
|
-
The **data view toolbar** component renders a default opinionated data view toolbar above or below the data section.
|
|
23
|
-
|
|
24
|
-
Data view toolbar can contain a `pagination`, `bulkSelect` or any other children content passed. The preffered way of passing children toolbar items is using the [toolbar item](/components/toolbar#toolbar-items) component.
|
|
25
|
-
|
|
26
|
-
### Basic example
|
|
27
|
-
|
|
28
|
-
```js file="./DataViewToolbarExample.tsx"
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
|
package/patternfly-docs/content/extensions/data-view/examples/Components/DataViewToolbarExample.tsx
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Pagination } from '@patternfly/react-core';
|
|
3
|
-
import { BulkSelect } from '@patternfly/react-component-groups';
|
|
4
|
-
import DataViewToolbar from '@patternfly/react-data-view/dist/dynamic/DataViewToolbar';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export const BasicExample: React.FunctionComponent = () => (
|
|
8
|
-
<DataViewToolbar
|
|
9
|
-
pagination={
|
|
10
|
-
<Pagination page={1} perPage={10} />
|
|
11
|
-
}
|
|
12
|
-
bulkSelect={
|
|
13
|
-
<BulkSelect
|
|
14
|
-
selectedCount={0}
|
|
15
|
-
pageCount={5}
|
|
16
|
-
onSelect={() => null}
|
|
17
|
-
/>
|
|
18
|
-
}
|
|
19
|
-
/>
|
|
20
|
-
)
|
package/patternfly-docs/content/extensions/data-view/examples/Functionality/Functionality.md
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
# Sidenav top-level section
|
|
3
|
-
# should be the same for all markdown files
|
|
4
|
-
section: extensions
|
|
5
|
-
subsection: Data view
|
|
6
|
-
# Sidenav secondary level section
|
|
7
|
-
# should be the same for all markdown files
|
|
8
|
-
id: Functionality
|
|
9
|
-
# Tab (react | react-demos | html | html-demos | design-guidelines | accessibility)
|
|
10
|
-
source: react
|
|
11
|
-
# If you use typescript, the name of the interface to display props for
|
|
12
|
-
# These are found through the sourceProps function provided in patternfly-docs.source.js
|
|
13
|
-
sortValue: 3
|
|
14
|
-
sourceLink: https://github.com/patternfly/react-data-view/blob/main/packages/module/patternfly-docs/content/extensions/data-view/examples/Functionality/Functionality.md
|
|
15
|
-
---
|
|
16
|
-
import { useMemo } from 'react';
|
|
17
|
-
import { useDataViewPagination, useDataViewSelection } from '@patternfly/react-data-view/dist/dynamic/Hooks';
|
|
18
|
-
import { DataView } from '@patternfly/react-data-view/dist/dynamic/DataView';
|
|
19
|
-
import { BulkSelect, BulkSelectValue } from '@patternfly/react-component-groups/dist/dynamic/BulkSelect';
|
|
20
|
-
import { DataViewToolbar } from '@patternfly/react-data-view/dist/dynamic/DataViewToolbar';
|
|
21
|
-
|
|
22
|
-
This is a list of functionality you can use to manage data displayed in the **data view**.
|
|
23
|
-
|
|
24
|
-
# Pagination
|
|
25
|
-
Allows to display data records on multiple pages and display the pagination state.
|
|
26
|
-
|
|
27
|
-
### Toolbar usage
|
|
28
|
-
Data view toolbar can display a pagination using the `pagination` property accepting a React node. You can also pass a custom `ouiaId` for testing purposes.
|
|
29
|
-
|
|
30
|
-
### Pagination state
|
|
31
|
-
|
|
32
|
-
The `useDataViewPagination` hook manages the pagination state of the data view.
|
|
33
|
-
|
|
34
|
-
**Initial values:**
|
|
35
|
-
- `perPage` initial value
|
|
36
|
-
- (optional) `page` initial value
|
|
37
|
-
|
|
38
|
-
The retrieved values are named to match the PatternFly [pagination](/components/pagination) component props, so you can easily spread them.
|
|
39
|
-
|
|
40
|
-
**Return values:**
|
|
41
|
-
- current `page` number
|
|
42
|
-
- `onSetPage` to modify current page
|
|
43
|
-
- items `perPage` value
|
|
44
|
-
- `onPerPageSelect` to modify per page value
|
|
45
|
-
|
|
46
|
-
### Pagination example
|
|
47
|
-
```js file="./PaginationExample.tsx"
|
|
48
|
-
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
# Selection
|
|
52
|
-
Allows to select data records inside the data view and show the selection state.
|
|
53
|
-
|
|
54
|
-
### Toolbar usage
|
|
55
|
-
Data view toolbar can display a bulk selection component using the `bulkSelect` property accepting a React node. You can make use of a predefined [bulk select](/extensions/component-groups/bulk-select) from the [component groups](/extensions/component-groups/about-component-groups) extension.
|
|
56
|
-
|
|
57
|
-
### Selection state
|
|
58
|
-
|
|
59
|
-
The `useDataViewSelection` hook manages the selection state of the data view.
|
|
60
|
-
|
|
61
|
-
**Initial values:**
|
|
62
|
-
- (optional) `initialSelected` array of record's identifiers selected by default
|
|
63
|
-
- (optional) `matchOption` function to check if given record is selected
|
|
64
|
-
|
|
65
|
-
*When no `matchOption` is passed, the `Array.prototype.includes()` operation is performed on the `selected` array.*
|
|
66
|
-
|
|
67
|
-
**Return values:**
|
|
68
|
-
- `selected` array of currently selected records
|
|
69
|
-
- `isSelected` function returning the selection state for given record
|
|
70
|
-
- `onSelect` callback to modify the selection state and accepting `isSelecting` flag indicating if records are changing to selected or deselected and `items` containing affected records
|
|
71
|
-
|
|
72
|
-
### Selection example
|
|
73
|
-
|
|
74
|
-
```js file="./SelectionExample.tsx"
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
|