@wordpress/dataviews 4.6.0 → 4.8.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.
Files changed (147) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +596 -89
  3. package/build/components/dataform-combined-edit/index.js +12 -6
  4. package/build/components/dataform-combined-edit/index.js.map +1 -1
  5. package/build/components/dataviews/index.js +8 -1
  6. package/build/components/dataviews/index.js.map +1 -1
  7. package/build/components/dataviews-bulk-actions/index.js +6 -6
  8. package/build/components/dataviews-bulk-actions/index.js.map +1 -1
  9. package/build/components/dataviews-context/index.js +2 -0
  10. package/build/components/dataviews-context/index.js.map +1 -1
  11. package/build/components/dataviews-filters/add-filter.js +7 -7
  12. package/build/components/dataviews-filters/add-filter.js.map +1 -1
  13. package/build/components/dataviews-filters/index.js +2 -2
  14. package/build/components/dataviews-filters/index.js.map +1 -1
  15. package/build/components/dataviews-item-actions/index.js +11 -11
  16. package/build/components/dataviews-item-actions/index.js.map +1 -1
  17. package/build/components/dataviews-layout/index.js +5 -1
  18. package/build/components/dataviews-layout/index.js.map +1 -1
  19. package/build/components/dataviews-selection-checkbox/index.js +1 -2
  20. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  21. package/build/components/dataviews-view-config/index.js +6 -6
  22. package/build/components/dataviews-view-config/index.js.map +1 -1
  23. package/build/components/form-field-visibility/index.js +32 -0
  24. package/build/components/form-field-visibility/index.js.map +1 -0
  25. package/build/dataforms-layouts/panel/index.js +9 -3
  26. package/build/dataforms-layouts/panel/index.js.map +1 -1
  27. package/build/dataforms-layouts/regular/index.js +8 -2
  28. package/build/dataforms-layouts/regular/index.js.map +1 -1
  29. package/build/dataviews-layouts/grid/index.js +14 -3
  30. package/build/dataviews-layouts/grid/index.js.map +1 -1
  31. package/build/dataviews-layouts/list/index.js +10 -12
  32. package/build/dataviews-layouts/list/index.js.map +1 -1
  33. package/build/dataviews-layouts/table/column-header-menu.js +18 -18
  34. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  35. package/build/dataviews-layouts/table/index.js +22 -5
  36. package/build/dataviews-layouts/table/index.js.map +1 -1
  37. package/build/dataviews-layouts/utils/get-clickable-item-props.js +25 -0
  38. package/build/dataviews-layouts/utils/get-clickable-item-props.js.map +1 -0
  39. package/build/normalize-fields.js +16 -3
  40. package/build/normalize-fields.js.map +1 -1
  41. package/build/types.js.map +1 -1
  42. package/build/validation.js +9 -0
  43. package/build/validation.js.map +1 -1
  44. package/build-module/components/dataform-combined-edit/index.js +12 -6
  45. package/build-module/components/dataform-combined-edit/index.js.map +1 -1
  46. package/build-module/components/dataviews/index.js +8 -1
  47. package/build-module/components/dataviews/index.js.map +1 -1
  48. package/build-module/components/dataviews-bulk-actions/index.js +6 -6
  49. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
  50. package/build-module/components/dataviews-context/index.js +2 -0
  51. package/build-module/components/dataviews-context/index.js.map +1 -1
  52. package/build-module/components/dataviews-filters/add-filter.js +6 -6
  53. package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
  54. package/build-module/components/dataviews-filters/index.js +4 -4
  55. package/build-module/components/dataviews-filters/index.js.map +1 -1
  56. package/build-module/components/dataviews-item-actions/index.js +10 -10
  57. package/build-module/components/dataviews-item-actions/index.js.map +1 -1
  58. package/build-module/components/dataviews-layout/index.js +5 -1
  59. package/build-module/components/dataviews-layout/index.js.map +1 -1
  60. package/build-module/components/dataviews-selection-checkbox/index.js +1 -2
  61. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  62. package/build-module/components/dataviews-view-config/index.js +6 -6
  63. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  64. package/build-module/components/form-field-visibility/index.js +26 -0
  65. package/build-module/components/form-field-visibility/index.js.map +1 -0
  66. package/build-module/dataforms-layouts/panel/index.js +9 -4
  67. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  68. package/build-module/dataforms-layouts/regular/index.js +7 -2
  69. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  70. package/build-module/dataviews-layouts/grid/index.js +14 -3
  71. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  72. package/build-module/dataviews-layouts/list/index.js +11 -13
  73. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  74. package/build-module/dataviews-layouts/table/column-header-menu.js +18 -18
  75. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  76. package/build-module/dataviews-layouts/table/index.js +22 -5
  77. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  78. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js +19 -0
  79. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js.map +1 -0
  80. package/build-module/normalize-fields.js +15 -3
  81. package/build-module/normalize-fields.js.map +1 -1
  82. package/build-module/types.js.map +1 -1
  83. package/build-module/validation.js +9 -0
  84. package/build-module/validation.js.map +1 -1
  85. package/build-style/style-rtl.css +15 -6
  86. package/build-style/style.css +15 -6
  87. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  88. package/build-types/components/dataform-combined-edit/index.d.ts.map +1 -1
  89. package/build-types/components/dataviews/index.d.ts +3 -1
  90. package/build-types/components/dataviews/index.d.ts.map +1 -1
  91. package/build-types/components/dataviews-context/index.d.ts +2 -0
  92. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  93. package/build-types/components/dataviews-filters/add-filter.d.ts +1 -1
  94. package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -1
  95. package/build-types/components/dataviews-item-actions/index.d.ts +2 -2
  96. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  97. package/build-types/components/dataviews-layout/index.d.ts.map +1 -1
  98. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  99. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  100. package/build-types/components/form-field-visibility/index.d.ts +11 -0
  101. package/build-types/components/form-field-visibility/index.d.ts.map +1 -0
  102. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  103. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  104. package/build-types/dataviews-layouts/grid/index.d.ts +1 -1
  105. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  106. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  107. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  108. package/build-types/dataviews-layouts/table/index.d.ts +1 -1
  109. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  110. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts +14 -0
  111. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts.map +1 -0
  112. package/build-types/lock-unlock.d.ts +1 -1
  113. package/build-types/lock-unlock.d.ts.map +1 -1
  114. package/build-types/normalize-fields.d.ts.map +1 -1
  115. package/build-types/types.d.ts +11 -6
  116. package/build-types/types.d.ts.map +1 -1
  117. package/build-types/validation.d.ts +9 -0
  118. package/build-types/validation.d.ts.map +1 -1
  119. package/package.json +12 -11
  120. package/src/components/dataform/stories/index.story.tsx +19 -3
  121. package/src/components/dataform-combined-edit/index.tsx +10 -7
  122. package/src/components/dataform-combined-edit/style.scss +4 -0
  123. package/src/components/dataviews/index.tsx +10 -1
  124. package/src/components/dataviews/style.scss +9 -3
  125. package/src/components/dataviews-bulk-actions/index.tsx +6 -6
  126. package/src/components/dataviews-context/index.ts +4 -0
  127. package/src/components/dataviews-filters/add-filter.tsx +8 -10
  128. package/src/components/dataviews-filters/index.tsx +4 -4
  129. package/src/components/dataviews-item-actions/index.tsx +15 -15
  130. package/src/components/dataviews-layout/index.tsx +4 -0
  131. package/src/components/dataviews-selection-checkbox/index.tsx +3 -2
  132. package/src/components/dataviews-view-config/index.tsx +8 -10
  133. package/src/components/form-field-visibility/index.tsx +32 -0
  134. package/src/dataforms-layouts/panel/index.tsx +11 -5
  135. package/src/dataforms-layouts/regular/index.tsx +9 -3
  136. package/src/dataviews-layouts/grid/index.tsx +29 -5
  137. package/src/dataviews-layouts/grid/style.scss +5 -0
  138. package/src/dataviews-layouts/list/index.tsx +10 -12
  139. package/src/dataviews-layouts/list/style.scss +1 -7
  140. package/src/dataviews-layouts/table/column-header-menu.tsx +31 -35
  141. package/src/dataviews-layouts/table/index.tsx +34 -3
  142. package/src/dataviews-layouts/utils/get-clickable-item-props.ts +22 -0
  143. package/src/normalize-fields.ts +17 -2
  144. package/src/test/normalize-fields.ts +45 -0
  145. package/src/types.ts +13 -2
  146. package/src/validation.ts +9 -0
  147. package/tsconfig.tsbuildinfo +1 -1
@@ -35,11 +35,14 @@ import type {
35
35
  import type { SetSelection } from '../../private-types';
36
36
  import ColumnHeaderMenu from './column-header-menu';
37
37
  import { getVisibleFieldIds } from '../index';
38
+ import getClickableItemProps from '../utils/get-clickable-item-props';
38
39
 
39
40
  interface TableColumnFieldProps< Item > {
40
41
  primaryField?: NormalizedField< Item >;
41
42
  field: NormalizedField< Item >;
42
43
  item: Item;
44
+ isItemClickable: ( item: Item ) => boolean;
45
+ onClickItem: ( item: Item ) => void;
43
46
  }
44
47
 
45
48
  interface TableColumnCombinedProps< Item > {
@@ -48,6 +51,8 @@ interface TableColumnCombinedProps< Item > {
48
51
  field: CombinedField;
49
52
  item: Item;
50
53
  view: ViewTableType;
54
+ isItemClickable: ( item: Item ) => boolean;
55
+ onClickItem: ( item: Item ) => void;
51
56
  }
52
57
 
53
58
  interface TableColumnProps< Item > {
@@ -56,6 +61,8 @@ interface TableColumnProps< Item > {
56
61
  item: Item;
57
62
  column: string;
58
63
  view: ViewTableType;
64
+ isItemClickable: ( item: Item ) => boolean;
65
+ onClickItem: ( item: Item ) => void;
59
66
  }
60
67
 
61
68
  interface TableRowProps< Item > {
@@ -69,6 +76,8 @@ interface TableRowProps< Item > {
69
76
  selection: string[];
70
77
  getItemId: ( item: Item ) => string;
71
78
  onChangeSelection: SetSelection;
79
+ isItemClickable: ( item: Item ) => boolean;
80
+ onClickItem: ( item: Item ) => void;
72
81
  }
73
82
 
74
83
  function TableColumn< Item >( {
@@ -102,15 +111,29 @@ function TableColumnField< Item >( {
102
111
  primaryField,
103
112
  item,
104
113
  field,
114
+ isItemClickable,
115
+ onClickItem,
105
116
  }: TableColumnFieldProps< Item > ) {
117
+ const isPrimaryField = primaryField?.id === field.id;
118
+ const isItemClickableField = ( i: Item ) =>
119
+ isItemClickable( i ) && isPrimaryField;
120
+
121
+ const clickableProps = getClickableItemProps(
122
+ item,
123
+ isItemClickableField,
124
+ onClickItem,
125
+ 'dataviews-view-table__cell-content'
126
+ );
127
+
106
128
  return (
107
129
  <div
108
130
  className={ clsx( 'dataviews-view-table__cell-content-wrapper', {
109
- 'dataviews-view-table__primary-field':
110
- primaryField?.id === field.id,
131
+ 'dataviews-view-table__primary-field': isPrimaryField,
111
132
  } ) }
112
133
  >
113
- <field.render { ...{ item } } />
134
+ <div { ...clickableProps }>
135
+ <field.render { ...{ item } } />
136
+ </div>
114
137
  </div>
115
138
  );
116
139
  }
@@ -139,6 +162,8 @@ function TableRow< Item >( {
139
162
  primaryField,
140
163
  selection,
141
164
  getItemId,
165
+ isItemClickable,
166
+ onClickItem,
142
167
  onChangeSelection,
143
168
  }: TableRowProps< Item > ) {
144
169
  const hasPossibleBulkAction = useHasAPossibleBulkAction( actions, item );
@@ -214,6 +239,8 @@ function TableRow< Item >( {
214
239
  <td key={ column } style={ { width, maxWidth, minWidth } }>
215
240
  <TableColumn
216
241
  primaryField={ primaryField }
242
+ isItemClickable={ isItemClickable }
243
+ onClickItem={ onClickItem }
217
244
  fields={ fields }
218
245
  item={ item }
219
246
  column={ column }
@@ -252,6 +279,8 @@ function ViewTable< Item >( {
252
279
  onChangeSelection,
253
280
  selection,
254
281
  setOpenedFilter,
282
+ onClickItem,
283
+ isItemClickable,
255
284
  view,
256
285
  }: ViewTableProps< Item > ) {
257
286
  const headerMenuRefs = useRef<
@@ -392,6 +421,8 @@ function ViewTable< Item >( {
392
421
  selection={ selection }
393
422
  getItemId={ getItemId }
394
423
  onChangeSelection={ onChangeSelection }
424
+ onClickItem={ onClickItem }
425
+ isItemClickable={ isItemClickable }
395
426
  />
396
427
  ) ) }
397
428
  </tbody>
@@ -0,0 +1,22 @@
1
+ export default function getClickableItemProps< Item >(
2
+ item: Item,
3
+ isItemClickable: ( item: Item ) => boolean,
4
+ onClickItem: ( item: Item ) => void,
5
+ className: string
6
+ ) {
7
+ if ( ! isItemClickable( item ) ) {
8
+ return { className };
9
+ }
10
+
11
+ return {
12
+ className: `${ className } ${ className }--clickable`,
13
+ role: 'button',
14
+ tabIndex: 0,
15
+ onClick: () => onClickItem( item ),
16
+ onKeyDown: ( event: React.KeyboardEvent ) => {
17
+ if ( event.key === 'Enter' || event.key === '' ) {
18
+ onClickItem( item );
19
+ }
20
+ },
21
+ };
22
+ }
@@ -11,6 +11,22 @@ import type {
11
11
  import { getControl } from './dataform-controls';
12
12
  import DataFormCombinedEdit from './components/dataform-combined-edit';
13
13
 
14
+ const getValueFromId =
15
+ ( id: string ) =>
16
+ ( { item }: { item: any } ) => {
17
+ const path = id.split( '.' );
18
+ let value = item;
19
+ for ( const segment of path ) {
20
+ if ( value.hasOwnProperty( segment ) ) {
21
+ value = value[ segment ];
22
+ } else {
23
+ value = undefined;
24
+ }
25
+ }
26
+
27
+ return value;
28
+ };
29
+
14
30
  /**
15
31
  * Apply default values and normalize the fields config.
16
32
  *
@@ -23,8 +39,7 @@ export function normalizeFields< Item >(
23
39
  return fields.map( ( field ) => {
24
40
  const fieldTypeDefinition = getFieldTypeDefinition( field.type );
25
41
 
26
- const getValue =
27
- field.getValue || ( ( { item } ) => ( item as any )[ field.id ] );
42
+ const getValue = field.getValue || getValueFromId( field.id );
28
43
 
29
44
  const sort =
30
45
  field.sort ??
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { normalizeFields } from '../normalize-fields';
5
+ import type { Field } from '../types';
6
+
7
+ describe( 'normalizeFields: default getValue', () => {
8
+ describe( 'getValue from ID', () => {
9
+ it( 'user', () => {
10
+ const item = { user: 'value' };
11
+ const fields: Field< {} >[] = [
12
+ {
13
+ id: 'user',
14
+ },
15
+ ];
16
+ const normalizedFields = normalizeFields( fields );
17
+ const result = normalizedFields[ 0 ].getValue( { item } );
18
+ expect( result ).toBe( 'value' );
19
+ } );
20
+
21
+ it( 'user.name', () => {
22
+ const item = { user: { name: 'value' } };
23
+ const fields: Field< {} >[] = [
24
+ {
25
+ id: 'user.name',
26
+ },
27
+ ];
28
+ const normalizedFields = normalizeFields( fields );
29
+ const result = normalizedFields[ 0 ].getValue( { item } );
30
+ expect( result ).toBe( 'value' );
31
+ } );
32
+
33
+ it( 'user.name.first', () => {
34
+ const item = { user: { name: { first: 'value' } } };
35
+ const fields: Field< {} >[] = [
36
+ {
37
+ id: 'user.name.first',
38
+ },
39
+ ];
40
+ const normalizedFields = normalizeFields( fields );
41
+ const result = normalizedFields[ 0 ].getValue( { item } );
42
+ expect( result ).toBe( 'value' );
43
+ } );
44
+ } );
45
+ } );
package/src/types.ts CHANGED
@@ -106,7 +106,7 @@ export type Field< Item > = {
106
106
  /**
107
107
  * Callback used to render the field. Defaults to `field.getValue`.
108
108
  */
109
- render?: ComponentType< { item: Item } >;
109
+ render?: ComponentType< DataViewRenderFieldProps< Item > >;
110
110
 
111
111
  /**
112
112
  * Callback used to render an edit control for the field.
@@ -123,6 +123,11 @@ export type Field< Item > = {
123
123
  */
124
124
  isValid?: ( item: Item, context?: ValidationContext ) => boolean;
125
125
 
126
+ /**
127
+ * Callback used to decide if a field should be displayed.
128
+ */
129
+ isVisible?: ( item: Item ) => boolean;
130
+
126
131
  /**
127
132
  * Whether the field is sortable.
128
133
  */
@@ -159,7 +164,7 @@ export type NormalizedField< Item > = Field< Item > & {
159
164
  label: string;
160
165
  header: string | ReactElement;
161
166
  getValue: ( args: { item: Item } ) => any;
162
- render: ComponentType< { item: Item } >;
167
+ render: ComponentType< DataViewRenderFieldProps< Item > >;
163
168
  Edit: ComponentType< DataFormControlProps< Item > >;
164
169
  sort: ( a: Item, b: Item, direction: SortDirection ) => number;
165
170
  isValid: ( item: Item, context?: ValidationContext ) => boolean;
@@ -181,6 +186,10 @@ export type DataFormControlProps< Item > = {
181
186
  hideLabelFromVision?: boolean;
182
187
  };
183
188
 
189
+ export type DataViewRenderFieldProps< Item > = {
190
+ item: Item;
191
+ };
192
+
184
193
  /**
185
194
  * The filters applied to the dataset.
186
195
  */
@@ -489,6 +498,8 @@ export interface ViewBaseProps< Item > {
489
498
  onChangeSelection: SetSelection;
490
499
  selection: string[];
491
500
  setOpenedFilter: ( fieldId: string ) => void;
501
+ onClickItem: ( item: Item ) => void;
502
+ isItemClickable: ( item: Item ) => boolean;
492
503
  view: View;
493
504
  density: number;
494
505
  }
package/src/validation.ts CHANGED
@@ -4,6 +4,15 @@
4
4
  import { normalizeFields } from './normalize-fields';
5
5
  import type { Field, Form } from './types';
6
6
 
7
+ /**
8
+ * Whether or not the given item's value is valid according to the fields and form config.
9
+ *
10
+ * @param item The item to validate.
11
+ * @param fields Fields config.
12
+ * @param form Form config.
13
+ *
14
+ * @return A boolean indicating if the item is valid (true) or not (false).
15
+ */
7
16
  export function isItemValid< Item >(
8
17
  item: Item,
9
18
  fields: Field< Item >[],