@patternfly/react-data-view 5.1.0 → 5.1.2

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 (129) hide show
  1. package/dist/cjs/DataView/DataView.d.ts +4 -0
  2. package/dist/cjs/DataView/DataView.js +7 -1
  3. package/dist/cjs/DataViewEventsContext/DataViewEventsContext.d.ts +16 -0
  4. package/dist/cjs/DataViewEventsContext/DataViewEventsContext.js +62 -0
  5. package/dist/cjs/DataViewEventsContext/DataViewEventsContext.test.d.ts +1 -0
  6. package/dist/cjs/DataViewEventsContext/DataViewEventsContext.test.js +72 -0
  7. package/dist/cjs/DataViewEventsContext/index.d.ts +2 -0
  8. package/dist/cjs/DataViewEventsContext/index.js +23 -0
  9. package/dist/cjs/DataViewTable/DataViewTable.d.ts +41 -0
  10. package/dist/cjs/DataViewTable/DataViewTable.js +18 -0
  11. package/dist/cjs/DataViewTable/DataViewTable.test.d.ts +1 -0
  12. package/dist/cjs/DataViewTable/DataViewTable.test.js +57 -0
  13. package/dist/cjs/DataViewTable/index.d.ts +2 -0
  14. package/dist/cjs/DataViewTable/index.js +23 -0
  15. package/dist/cjs/DataViewTableBasic/DataViewTableBasic.d.ts +13 -0
  16. package/dist/cjs/DataViewTableBasic/DataViewTableBasic.js +49 -0
  17. package/dist/cjs/DataViewTableBasic/DataViewTableBasic.test.d.ts +1 -0
  18. package/dist/cjs/DataViewTableBasic/DataViewTableBasic.test.js +27 -0
  19. package/dist/cjs/DataViewTableBasic/index.d.ts +2 -0
  20. package/dist/cjs/DataViewTableBasic/index.js +23 -0
  21. package/dist/cjs/DataViewTableHeader/DataViewTableHeader.d.ts +13 -0
  22. package/dist/cjs/DataViewTableHeader/DataViewTableHeader.js +57 -0
  23. package/dist/cjs/DataViewTableHeader/DataViewTableHeader.test.d.ts +1 -0
  24. package/dist/cjs/DataViewTableHeader/DataViewTableHeader.test.js +36 -0
  25. package/dist/cjs/DataViewTableHeader/index.d.ts +2 -0
  26. package/dist/cjs/DataViewTableHeader/index.js +23 -0
  27. package/dist/cjs/DataViewTableTree/DataViewTableTree.d.ts +19 -0
  28. package/dist/cjs/DataViewTableTree/DataViewTableTree.js +120 -0
  29. package/dist/cjs/DataViewTableTree/DataViewTableTree.test.d.ts +1 -0
  30. package/dist/cjs/DataViewTableTree/DataViewTableTree.test.js +75 -0
  31. package/dist/cjs/DataViewTableTree/index.d.ts +2 -0
  32. package/dist/cjs/DataViewTableTree/index.js +23 -0
  33. package/dist/cjs/Hooks/selection.d.ts +3 -3
  34. package/dist/cjs/Hooks/selection.js +4 -6
  35. package/dist/cjs/Hooks/selection.test.js +4 -4
  36. package/dist/cjs/InternalContext/InternalContext.d.ts +17 -0
  37. package/dist/cjs/InternalContext/InternalContext.js +35 -0
  38. package/dist/cjs/InternalContext/InternalContext.test.d.ts +1 -0
  39. package/dist/cjs/InternalContext/InternalContext.test.js +56 -0
  40. package/dist/cjs/InternalContext/index.d.ts +2 -0
  41. package/dist/cjs/InternalContext/index.js +23 -0
  42. package/dist/cjs/index.d.ts +12 -0
  43. package/dist/cjs/index.js +20 -2
  44. package/dist/dynamic/DataViewEventsContext/package.json +1 -0
  45. package/dist/dynamic/DataViewTable/package.json +1 -0
  46. package/dist/dynamic/DataViewTableBasic/package.json +1 -0
  47. package/dist/dynamic/DataViewTableHeader/package.json +1 -0
  48. package/dist/dynamic/DataViewTableTree/package.json +1 -0
  49. package/dist/dynamic/InternalContext/package.json +1 -0
  50. package/dist/esm/DataView/DataView.d.ts +4 -0
  51. package/dist/esm/DataView/DataView.js +7 -1
  52. package/dist/esm/DataViewEventsContext/DataViewEventsContext.d.ts +16 -0
  53. package/dist/esm/DataViewEventsContext/DataViewEventsContext.js +34 -0
  54. package/dist/esm/DataViewEventsContext/DataViewEventsContext.test.d.ts +1 -0
  55. package/dist/esm/DataViewEventsContext/DataViewEventsContext.test.js +67 -0
  56. package/dist/esm/DataViewEventsContext/index.d.ts +2 -0
  57. package/dist/esm/DataViewEventsContext/index.js +2 -0
  58. package/dist/esm/DataViewTable/DataViewTable.d.ts +41 -0
  59. package/dist/esm/DataViewTable/DataViewTable.js +8 -0
  60. package/dist/esm/DataViewTable/DataViewTable.test.d.ts +1 -0
  61. package/dist/esm/DataViewTable/DataViewTable.test.js +52 -0
  62. package/dist/esm/DataViewTable/index.d.ts +2 -0
  63. package/dist/esm/DataViewTable/index.js +2 -0
  64. package/dist/esm/DataViewTableBasic/DataViewTableBasic.d.ts +13 -0
  65. package/dist/esm/DataViewTableBasic/DataViewTableBasic.js +42 -0
  66. package/dist/esm/DataViewTableBasic/DataViewTableBasic.test.d.ts +1 -0
  67. package/dist/esm/DataViewTableBasic/DataViewTableBasic.test.js +22 -0
  68. package/dist/esm/DataViewTableBasic/index.d.ts +2 -0
  69. package/dist/esm/DataViewTableBasic/index.js +2 -0
  70. package/dist/esm/DataViewTableHeader/DataViewTableHeader.d.ts +13 -0
  71. package/dist/esm/DataViewTableHeader/DataViewTableHeader.js +30 -0
  72. package/dist/esm/DataViewTableHeader/DataViewTableHeader.test.d.ts +1 -0
  73. package/dist/esm/DataViewTableHeader/DataViewTableHeader.test.js +31 -0
  74. package/dist/esm/DataViewTableHeader/index.d.ts +2 -0
  75. package/dist/esm/DataViewTableHeader/index.js +2 -0
  76. package/dist/esm/DataViewTableTree/DataViewTableTree.d.ts +19 -0
  77. package/dist/esm/DataViewTableTree/DataViewTableTree.js +93 -0
  78. package/dist/esm/DataViewTableTree/DataViewTableTree.test.d.ts +1 -0
  79. package/dist/esm/DataViewTableTree/DataViewTableTree.test.js +70 -0
  80. package/dist/esm/DataViewTableTree/index.d.ts +2 -0
  81. package/dist/esm/DataViewTableTree/index.js +2 -0
  82. package/dist/esm/Hooks/selection.d.ts +3 -3
  83. package/dist/esm/Hooks/selection.js +4 -6
  84. package/dist/esm/Hooks/selection.test.js +4 -4
  85. package/dist/esm/InternalContext/InternalContext.d.ts +17 -0
  86. package/dist/esm/InternalContext/InternalContext.js +7 -0
  87. package/dist/esm/InternalContext/InternalContext.test.d.ts +1 -0
  88. package/dist/esm/InternalContext/InternalContext.test.js +51 -0
  89. package/dist/esm/InternalContext/index.d.ts +2 -0
  90. package/dist/esm/InternalContext/index.js +2 -0
  91. package/dist/esm/index.d.ts +12 -0
  92. package/dist/esm/index.js +12 -0
  93. package/package.json +1 -1
  94. package/patternfly-docs/content/extensions/data-view/examples/Components/Components.md +45 -3
  95. package/patternfly-docs/content/extensions/data-view/examples/Components/DataViewTableExample.tsx +47 -0
  96. package/patternfly-docs/content/extensions/data-view/examples/Components/DataViewTableTreeExample.tsx +69 -0
  97. package/patternfly-docs/content/extensions/data-view/examples/EventsContext/EventsContext.md +32 -0
  98. package/patternfly-docs/content/extensions/data-view/examples/EventsContext/EventsExample.tsx +108 -0
  99. package/patternfly-docs/content/extensions/data-view/examples/Functionality/Functionality.md +6 -5
  100. package/patternfly-docs/content/extensions/data-view/examples/Functionality/PaginationExample.tsx +15 -32
  101. package/patternfly-docs/content/extensions/data-view/examples/Functionality/SelectionExample.tsx +15 -46
  102. package/patternfly-docs/content/extensions/data-view/examples/Layout/Layout.md +1 -0
  103. package/patternfly-docs/content/extensions/data-view/examples/Layout/PredefinedLayoutExample.tsx +20 -51
  104. package/src/DataView/DataView.tsx +14 -2
  105. package/src/DataViewEventsContext/DataViewEventsContext.test.tsx +105 -0
  106. package/src/DataViewEventsContext/DataViewEventsContext.tsx +70 -0
  107. package/src/DataViewEventsContext/index.ts +2 -0
  108. package/src/DataViewTable/DataViewTable.test.tsx +80 -0
  109. package/src/DataViewTable/DataViewTable.tsx +37 -0
  110. package/src/DataViewTable/__snapshots__/DataViewTable.test.tsx.snap +1010 -0
  111. package/src/DataViewTable/index.ts +2 -0
  112. package/src/DataViewTableBasic/DataViewTableBasic.test.tsx +37 -0
  113. package/src/DataViewTableBasic/DataViewTableBasic.tsx +71 -0
  114. package/src/DataViewTableBasic/__snapshots__/DataViewTableBasic.test.tsx.snap +324 -0
  115. package/src/DataViewTableBasic/index.ts +2 -0
  116. package/src/DataViewTableHeader/DataViewTableHeader.test.tsx +52 -0
  117. package/src/DataViewTableHeader/DataViewTableHeader.tsx +53 -0
  118. package/src/DataViewTableHeader/__snapshots__/DataViewTableHeader.test.tsx.snap +227 -0
  119. package/src/DataViewTableHeader/index.ts +2 -0
  120. package/src/DataViewTableTree/DataViewTableTree.test.tsx +85 -0
  121. package/src/DataViewTableTree/DataViewTableTree.tsx +144 -0
  122. package/src/DataViewTableTree/__snapshots__/DataViewTableTree.test.tsx.snap +937 -0
  123. package/src/DataViewTableTree/index.ts +2 -0
  124. package/src/Hooks/selection.test.tsx +5 -5
  125. package/src/Hooks/selection.ts +6 -7
  126. package/src/InternalContext/InternalContext.test.tsx +89 -0
  127. package/src/InternalContext/InternalContext.tsx +35 -0
  128. package/src/InternalContext/index.ts +2 -0
  129. package/src/index.ts +18 -0
@@ -0,0 +1,2 @@
1
+ export { default } from './DataViewTableTree';
2
+ export * from './DataViewTableTree';
@@ -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);
@@ -2,18 +2,17 @@
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: UseDataViewSelectionProps) => {
12
- const [ selected, setSelected ] = useState<any[]>(props.initialSelected ?? []);
13
- const matchOption = props.matchOption ? props.matchOption : (option, another) => (option === another);
11
+ export const useDataViewSelection = ({ matchOption, initialSelected = [] }: UseDataViewSelectionProps) => {
12
+ const [ selected, setSelected ] = useState<any[]>(initialSelected);
14
13
 
15
14
  const onSelect = (isSelecting: boolean, items?: any[] | any) => {
16
- isSelecting ?
15
+ isSelecting && items ?
17
16
  setSelected(prev => {
18
17
  const newSelectedItems = [ ...prev ];
19
18
  (Array.isArray(items) ? items : [ items ]).forEach(newItem => !prev.some(prevItem => matchOption(prevItem, newItem)) && newSelectedItems.push(newItem));
@@ -22,7 +21,7 @@ export const useDataViewSelection = (props: UseDataViewSelectionProps) => {
22
21
  : setSelected(items ? prev => prev.filter(prevSelected => !(Array.isArray(items) ? items : [ items ]).some(item => matchOption(item, prevSelected))) : []);
23
22
  };
24
23
 
25
- const isSelected = (item: any): boolean => props?.matchOption ? Boolean(selected.find(selected => matchOption(selected, item))) : selected.includes(item);
24
+ const isSelected = (item: any): boolean => Boolean(selected.find(selected => matchOption(selected, item)));
26
25
 
27
26
  return {
28
27
  selected,
@@ -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,35 @@
1
+ import React, { createContext, PropsWithChildren, useContext } from 'react';
2
+
3
+ export interface DataViewSelection {
4
+ /** Called when the selection of items changes */
5
+ onSelect: (isSelecting: boolean, items?: any[] | any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any
6
+ /** Checks if a specific item is currently selected */
7
+ isSelected: (item: any) => boolean; // eslint-disable-line @typescript-eslint/no-explicit-any
8
+ /** Determines if selection is disabled for a given item */
9
+ isSelectDisabled?: (item: any) => boolean; // eslint-disable-line @typescript-eslint/no-explicit-any
10
+ }
11
+
12
+ export interface InternalContextValue {
13
+ selection?: DataViewSelection;
14
+ }
15
+
16
+ export const InternalContext = createContext<InternalContextValue>({
17
+ selection: undefined
18
+ });
19
+
20
+ export type InternalProviderProps = PropsWithChildren<InternalContextValue>
21
+
22
+ export const InternalContextProvider: React.FC<InternalProviderProps> = ({
23
+ children,
24
+ selection
25
+ }) => (
26
+ <InternalContext.Provider
27
+ value={{ selection }}
28
+ >
29
+ {children}
30
+ </InternalContext.Provider>
31
+ );
32
+
33
+ export const useInternalContext = () => useContext(InternalContext);
34
+
35
+ export default InternalContext;
@@ -0,0 +1,2 @@
1
+ export { default } from './InternalContext';
2
+ export * from './InternalContext';
package/src/index.ts CHANGED
@@ -1,8 +1,26 @@
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 DataViewTableTree } from './DataViewTableTree';
11
+ export * from './DataViewTableTree';
12
+
13
+ export { default as DataViewTableHeader } from './DataViewTableHeader';
14
+ export * from './DataViewTableHeader';
15
+
16
+ export { default as DataViewTableBasic } from './DataViewTableBasic';
17
+ export * from './DataViewTableBasic';
18
+
19
+ export { default as DataViewTable } from './DataViewTable';
20
+ export * from './DataViewTable';
21
+
22
+ export { default as DataViewEventsContext } from './DataViewEventsContext';
23
+ export * from './DataViewEventsContext';
24
+
7
25
  export { default as DataView } from './DataView';
8
26
  export * from './DataView';