@wordpress/dataviews 0.9.0 → 1.0.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 (71) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +0 -8
  3. package/build/add-filter.js.map +1 -1
  4. package/build/bulk-actions.js.map +1 -1
  5. package/build/constants.js.map +1 -1
  6. package/build/dataviews.js +1 -5
  7. package/build/dataviews.js.map +1 -1
  8. package/build/dropdown-menu-helper.js.map +1 -1
  9. package/build/filter-and-sort-data-view.js.map +1 -1
  10. package/build/filter-summary.js +4 -2
  11. package/build/filter-summary.js.map +1 -1
  12. package/build/filters.js.map +1 -1
  13. package/build/index.js.map +1 -1
  14. package/build/item-actions.js.map +1 -1
  15. package/build/lock-unlock.js.map +1 -1
  16. package/build/normalize-fields.js.map +1 -1
  17. package/build/pagination.js.map +1 -1
  18. package/build/reset-filters.js.map +1 -1
  19. package/build/search-widget.js +5 -4
  20. package/build/search-widget.js.map +1 -1
  21. package/build/search.js.map +1 -1
  22. package/build/single-selection-checkbox.js +1 -1
  23. package/build/single-selection-checkbox.js.map +1 -1
  24. package/build/utils.js.map +1 -1
  25. package/build/view-actions.js.map +1 -1
  26. package/build/view-grid.js +43 -15
  27. package/build/view-grid.js.map +1 -1
  28. package/build/view-list.js +4 -22
  29. package/build/view-list.js.map +1 -1
  30. package/build/view-table.js +5 -11
  31. package/build/view-table.js.map +1 -1
  32. package/build-module/add-filter.js.map +1 -1
  33. package/build-module/bulk-actions.js.map +1 -1
  34. package/build-module/constants.js.map +1 -1
  35. package/build-module/dataviews.js +1 -5
  36. package/build-module/dataviews.js.map +1 -1
  37. package/build-module/dropdown-menu-helper.js.map +1 -1
  38. package/build-module/filter-and-sort-data-view.js.map +1 -1
  39. package/build-module/filter-summary.js +3 -2
  40. package/build-module/filter-summary.js.map +1 -1
  41. package/build-module/filters.js.map +1 -1
  42. package/build-module/index.js.map +1 -1
  43. package/build-module/item-actions.js.map +1 -1
  44. package/build-module/lock-unlock.js.map +1 -1
  45. package/build-module/normalize-fields.js.map +1 -1
  46. package/build-module/pagination.js.map +1 -1
  47. package/build-module/reset-filters.js.map +1 -1
  48. package/build-module/search-widget.js +4 -3
  49. package/build-module/search-widget.js.map +1 -1
  50. package/build-module/search.js.map +1 -1
  51. package/build-module/single-selection-checkbox.js +1 -1
  52. package/build-module/single-selection-checkbox.js.map +1 -1
  53. package/build-module/utils.js.map +1 -1
  54. package/build-module/view-actions.js.map +1 -1
  55. package/build-module/view-grid.js +43 -15
  56. package/build-module/view-grid.js.map +1 -1
  57. package/build-module/view-list.js +6 -24
  58. package/build-module/view-list.js.map +1 -1
  59. package/build-module/view-table.js +5 -11
  60. package/build-module/view-table.js.map +1 -1
  61. package/build-style/style-rtl.css +43 -31
  62. package/build-style/style.css +43 -31
  63. package/package.json +11 -11
  64. package/src/dataviews.js +0 -4
  65. package/src/filter-summary.js +4 -4
  66. package/src/search-widget.js +4 -3
  67. package/src/single-selection-checkbox.js +1 -1
  68. package/src/style.scss +45 -38
  69. package/src/view-grid.js +91 -52
  70. package/src/view-list.js +4 -24
  71. package/src/view-table.js +7 -11
package/src/view-grid.js CHANGED
@@ -15,7 +15,6 @@ import {
15
15
  FlexItem,
16
16
  } from '@wordpress/components';
17
17
  import { __ } from '@wordpress/i18n';
18
- import { useAsyncList } from '@wordpress/compose';
19
18
 
20
19
  /**
21
20
  * Internal dependencies
@@ -35,7 +34,8 @@ function GridItem( {
35
34
  mediaField,
36
35
  primaryField,
37
36
  visibleFields,
38
- displayAsColumnFields,
37
+ badgeFields,
38
+ columnFields,
39
39
  } ) {
40
40
  const hasBulkAction = useHasAPossibleBulkAction( actions, item );
41
41
  const id = getItemId( item );
@@ -100,46 +100,76 @@ function GridItem( {
100
100
  </HStack>
101
101
  <ItemActions item={ item } actions={ actions } isCompact />
102
102
  </HStack>
103
- <VStack className="dataviews-view-grid__fields" spacing={ 3 }>
104
- { visibleFields.map( ( field ) => {
105
- const renderedValue = field.render( {
106
- item,
107
- } );
108
- if ( ! renderedValue ) {
109
- return null;
110
- }
111
- return (
112
- <Flex
113
- className={ classnames(
114
- 'dataviews-view-grid__field',
115
- displayAsColumnFields?.includes( field.id )
116
- ? 'is-column'
117
- : 'is-row'
118
- ) }
119
- key={ field.id }
120
- gap={ 1 }
121
- justify="flex-start"
122
- expanded
123
- style={ { height: 'auto' } }
124
- direction={
125
- displayAsColumnFields?.includes( field.id )
126
- ? 'column'
127
- : 'row'
128
- }
129
- >
130
- <FlexItem className="dataviews-view-grid__field-name">
131
- { field.header }
132
- </FlexItem>
103
+ { !! badgeFields?.length && (
104
+ <HStack
105
+ className="dataviews-view-grid__badge-fields"
106
+ spacing={ 2 }
107
+ wrap
108
+ align="top"
109
+ justify="flex-start"
110
+ >
111
+ { badgeFields.map( ( field ) => {
112
+ const renderedValue = field.render( {
113
+ item,
114
+ } );
115
+ if ( ! renderedValue ) {
116
+ return null;
117
+ }
118
+ return (
133
119
  <FlexItem
134
- className="dataviews-view-grid__field-value"
135
- style={ { maxHeight: 'none' } }
120
+ key={ field.id }
121
+ className={ 'dataviews-view-grid__field-value' }
136
122
  >
137
123
  { renderedValue }
138
124
  </FlexItem>
139
- </Flex>
140
- );
141
- } ) }
142
- </VStack>
125
+ );
126
+ } ) }
127
+ </HStack>
128
+ ) }
129
+ { !! visibleFields?.length && (
130
+ <VStack className="dataviews-view-grid__fields" spacing={ 3 }>
131
+ { visibleFields.map( ( field ) => {
132
+ const renderedValue = field.render( {
133
+ item,
134
+ } );
135
+ if ( ! renderedValue ) {
136
+ return null;
137
+ }
138
+ return (
139
+ <Flex
140
+ className={ classnames(
141
+ 'dataviews-view-grid__field',
142
+ columnFields?.includes( field.id )
143
+ ? 'is-column'
144
+ : 'is-row'
145
+ ) }
146
+ key={ field.id }
147
+ gap={ 1 }
148
+ justify="flex-start"
149
+ expanded
150
+ style={ { height: 'auto' } }
151
+ direction={
152
+ columnFields?.includes( field.id )
153
+ ? 'column'
154
+ : 'row'
155
+ }
156
+ >
157
+ <>
158
+ <FlexItem className="dataviews-view-grid__field-name">
159
+ { field.header }
160
+ </FlexItem>
161
+ <FlexItem
162
+ className="dataviews-view-grid__field-value"
163
+ style={ { maxHeight: 'none' } }
164
+ >
165
+ { renderedValue }
166
+ </FlexItem>
167
+ </>
168
+ </Flex>
169
+ );
170
+ } ) }
171
+ </VStack>
172
+ ) }
143
173
  </VStack>
144
174
  );
145
175
  }
@@ -151,7 +181,6 @@ export default function ViewGrid( {
151
181
  actions,
152
182
  isLoading,
153
183
  getItemId,
154
- deferredRendering,
155
184
  selection,
156
185
  onSelectionChange,
157
186
  } ) {
@@ -161,16 +190,27 @@ export default function ViewGrid( {
161
190
  const primaryField = fields.find(
162
191
  ( field ) => field.id === view.layout.primaryField
163
192
  );
164
- const visibleFields = fields.filter(
165
- ( field ) =>
166
- ! view.hiddenFields.includes( field.id ) &&
167
- ! [ view.layout.mediaField, view.layout.primaryField ].includes(
168
- field.id
169
- )
193
+ const { visibleFields, badgeFields } = fields.reduce(
194
+ ( accumulator, field ) => {
195
+ if (
196
+ view.hiddenFields.includes( field.id ) ||
197
+ [ view.layout.mediaField, view.layout.primaryField ].includes(
198
+ field.id
199
+ )
200
+ ) {
201
+ return accumulator;
202
+ }
203
+ // If the field is a badge field, add it to the badgeFields array
204
+ // otherwise add it to the rest visibleFields array.
205
+ const key = view.layout.badgeFields?.includes( field.id )
206
+ ? 'badgeFields'
207
+ : 'visibleFields';
208
+ accumulator[ key ].push( field );
209
+ return accumulator;
210
+ },
211
+ { visibleFields: [], badgeFields: [] }
170
212
  );
171
- const shownData = useAsyncList( data, { step: 3 } );
172
- const usedData = deferredRendering ? shownData : data;
173
- const hasData = !! usedData?.length;
213
+ const hasData = !! data?.length;
174
214
  return (
175
215
  <>
176
216
  { hasData && (
@@ -181,7 +221,7 @@ export default function ViewGrid( {
181
221
  className="dataviews-view-grid"
182
222
  aria-busy={ isLoading }
183
223
  >
184
- { usedData.map( ( item ) => {
224
+ { data.map( ( item ) => {
185
225
  return (
186
226
  <GridItem
187
227
  key={ getItemId( item ) }
@@ -194,9 +234,8 @@ export default function ViewGrid( {
194
234
  mediaField={ mediaField }
195
235
  primaryField={ primaryField }
196
236
  visibleFields={ visibleFields }
197
- displayAsColumnFields={
198
- view.layout.displayAsColumnFields
199
- }
237
+ badgeFields={ badgeFields }
238
+ columnFields={ view.layout.columnFields }
200
239
  />
201
240
  );
202
241
  } ) }
package/src/view-list.js CHANGED
@@ -6,17 +6,15 @@ import classNames from 'classnames';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { useAsyncList, useInstanceId } from '@wordpress/compose';
9
+ import { useInstanceId } from '@wordpress/compose';
10
10
  import {
11
11
  __experimentalHStack as HStack,
12
12
  __experimentalVStack as VStack,
13
13
  privateApis as componentsPrivateApis,
14
- Button,
15
14
  Spinner,
16
15
  VisuallyHidden,
17
16
  } from '@wordpress/components';
18
17
  import { useCallback, useEffect, useRef } from '@wordpress/element';
19
- import { info } from '@wordpress/icons';
20
18
  import { __ } from '@wordpress/i18n';
21
19
 
22
20
  /**
@@ -36,7 +34,6 @@ function ListItem( {
36
34
  item,
37
35
  isSelected,
38
36
  onSelect,
39
- onDetailsChange,
40
37
  mediaField,
41
38
  primaryField,
42
39
  visibleFields,
@@ -118,18 +115,6 @@ function ListItem( {
118
115
  </HStack>
119
116
  </CompositeItem>
120
117
  </div>
121
- { onDetailsChange && (
122
- <div role="gridcell">
123
- <CompositeItem
124
- render={ <Button /> }
125
- className="dataviews-view-list__details-button"
126
- onClick={ () => onDetailsChange( [ item ] ) }
127
- icon={ info }
128
- label={ __( 'View details' ) }
129
- size="compact"
130
- />
131
- </div>
132
- ) }
133
118
  </HStack>
134
119
  </CompositeRow>
135
120
  );
@@ -142,15 +127,11 @@ export default function ViewList( {
142
127
  isLoading,
143
128
  getItemId,
144
129
  onSelectionChange,
145
- onDetailsChange,
146
130
  selection,
147
- deferredRendering,
148
131
  id: preferredId,
149
132
  } ) {
150
133
  const baseId = useInstanceId( ViewList, 'view-list', preferredId );
151
- const shownData = useAsyncList( data, { step: 3 } );
152
- const usedData = deferredRendering ? shownData : data;
153
- const selectedItem = usedData?.findLast( ( item ) =>
134
+ const selectedItem = data?.findLast( ( item ) =>
154
135
  selection.includes( item.id )
155
136
  );
156
137
 
@@ -182,7 +163,7 @@ export default function ViewList( {
182
163
  defaultActiveId: getItemDomId( selectedItem ),
183
164
  } );
184
165
 
185
- const hasData = usedData?.length;
166
+ const hasData = data?.length;
186
167
  if ( ! hasData ) {
187
168
  return (
188
169
  <div
@@ -206,7 +187,7 @@ export default function ViewList( {
206
187
  role="grid"
207
188
  store={ store }
208
189
  >
209
- { usedData.map( ( item ) => {
190
+ { data.map( ( item ) => {
210
191
  const id = getItemDomId( item );
211
192
  return (
212
193
  <ListItem
@@ -215,7 +196,6 @@ export default function ViewList( {
215
196
  item={ item }
216
197
  isSelected={ item === selectedItem }
217
198
  onSelect={ onSelect }
218
- onDetailsChange={ onDetailsChange }
219
199
  mediaField={ mediaField }
220
200
  primaryField={ primaryField }
221
201
  visibleFields={ visibleFields }
package/src/view-table.js CHANGED
@@ -7,7 +7,6 @@ import classnames from 'classnames';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { __ } from '@wordpress/i18n';
10
- import { useAsyncList } from '@wordpress/compose';
11
10
  import { unseen, funnel } from '@wordpress/icons';
12
11
  import {
13
12
  Button,
@@ -219,7 +218,9 @@ function BulkSelectionCheckbox( {
219
218
  onSelectionChange( selectableItems );
220
219
  }
221
220
  } }
222
- label={ areAllSelected ? __( 'Deselect all' ) : __( 'Select all' ) }
221
+ aria-label={
222
+ areAllSelected ? __( 'Deselect all' ) : __( 'Select all' )
223
+ }
223
224
  />
224
225
  );
225
226
  }
@@ -299,8 +300,7 @@ function TableRow( {
299
300
  <td
300
301
  className="dataviews-view-table__checkbox-column"
301
302
  style={ {
302
- width: 20,
303
- minWidth: 20,
303
+ width: '1%',
304
304
  } }
305
305
  >
306
306
  <div className="dataviews-view-table__cell-content-wrapper">
@@ -369,7 +369,6 @@ function ViewTable( {
369
369
  data,
370
370
  getItemId,
371
371
  isLoading = false,
372
- deferredRendering,
373
372
  selection,
374
373
  onSelectionChange,
375
374
  setOpenedFilter,
@@ -386,7 +385,6 @@ function ViewTable( {
386
385
  }
387
386
  } );
388
387
 
389
- const asyncData = useAsyncList( data );
390
388
  const tableNoticeId = useId();
391
389
 
392
390
  if ( nextHeaderMenuToFocus ) {
@@ -409,8 +407,7 @@ function ViewTable( {
409
407
  ! view.hiddenFields.includes( field.id ) &&
410
408
  ! [ view.layout.mediaField ].includes( field.id )
411
409
  );
412
- const usedData = deferredRendering ? asyncData : data;
413
- const hasData = !! usedData?.length;
410
+ const hasData = !! data?.length;
414
411
  const sortValues = { asc: 'ascending', desc: 'descending' };
415
412
 
416
413
  const primaryField = fields.find(
@@ -430,8 +427,7 @@ function ViewTable( {
430
427
  <th
431
428
  className="dataviews-view-table__checkbox-column"
432
429
  style={ {
433
- width: 20,
434
- minWidth: 20,
430
+ width: '1%',
435
431
  } }
436
432
  data-field-id="selection"
437
433
  scope="col"
@@ -502,7 +498,7 @@ function ViewTable( {
502
498
  </thead>
503
499
  <tbody>
504
500
  { hasData &&
505
- usedData.map( ( item, index ) => (
501
+ data.map( ( item, index ) => (
506
502
  <TableRow
507
503
  key={ getItemId( item ) }
508
504
  item={ item }