@wordpress/dataviews 0.6.0 → 0.7.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 (63) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/add-filter.js +0 -2
  3. package/build/add-filter.js.map +1 -1
  4. package/build/bulk-actions.js +41 -3
  5. package/build/bulk-actions.js.map +1 -1
  6. package/build/dataviews.js +23 -16
  7. package/build/dataviews.js.map +1 -1
  8. package/build/filters.js +8 -1
  9. package/build/filters.js.map +1 -1
  10. package/build/pagination.js +2 -1
  11. package/build/pagination.js.map +1 -1
  12. package/build/reset-filters.js +2 -1
  13. package/build/reset-filters.js.map +1 -1
  14. package/build/search-widget.js +89 -4
  15. package/build/search-widget.js.map +1 -1
  16. package/build/single-selection-checkbox.js +7 -2
  17. package/build/single-selection-checkbox.js.map +1 -1
  18. package/build/view-actions.js.map +1 -1
  19. package/build/view-grid.js +10 -14
  20. package/build/view-grid.js.map +1 -1
  21. package/build/view-list.js +1 -1
  22. package/build/view-list.js.map +1 -1
  23. package/build/view-table.js +78 -45
  24. package/build/view-table.js.map +1 -1
  25. package/build-module/add-filter.js +0 -2
  26. package/build-module/add-filter.js.map +1 -1
  27. package/build-module/bulk-actions.js +40 -4
  28. package/build-module/bulk-actions.js.map +1 -1
  29. package/build-module/dataviews.js +24 -17
  30. package/build-module/dataviews.js.map +1 -1
  31. package/build-module/filters.js +8 -1
  32. package/build-module/filters.js.map +1 -1
  33. package/build-module/pagination.js +2 -1
  34. package/build-module/pagination.js.map +1 -1
  35. package/build-module/reset-filters.js +2 -1
  36. package/build-module/reset-filters.js.map +1 -1
  37. package/build-module/search-widget.js +91 -6
  38. package/build-module/search-widget.js.map +1 -1
  39. package/build-module/single-selection-checkbox.js +7 -2
  40. package/build-module/single-selection-checkbox.js.map +1 -1
  41. package/build-module/view-actions.js.map +1 -1
  42. package/build-module/view-grid.js +11 -15
  43. package/build-module/view-grid.js.map +1 -1
  44. package/build-module/view-list.js +2 -2
  45. package/build-module/view-list.js.map +1 -1
  46. package/build-module/view-table.js +80 -47
  47. package/build-module/view-table.js.map +1 -1
  48. package/build-style/style-rtl.css +67 -43
  49. package/build-style/style.css +67 -43
  50. package/package.json +11 -11
  51. package/src/add-filter.js +0 -2
  52. package/src/bulk-actions.js +54 -4
  53. package/src/dataviews.js +55 -44
  54. package/src/filters.js +6 -1
  55. package/src/pagination.js +6 -1
  56. package/src/reset-filters.js +2 -1
  57. package/src/search-widget.js +131 -6
  58. package/src/single-selection-checkbox.js +7 -1
  59. package/src/style.scss +99 -70
  60. package/src/view-actions.js +1 -1
  61. package/src/view-grid.js +11 -13
  62. package/src/view-list.js +2 -1
  63. package/src/view-table.js +113 -78
package/src/view-table.js CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  Icon,
15
15
  privateApis as componentsPrivateApis,
16
16
  CheckboxControl,
17
+ Spinner,
17
18
  } from '@wordpress/components';
18
19
  import {
19
20
  forwardRef,
@@ -23,6 +24,7 @@ import {
23
24
  useState,
24
25
  Children,
25
26
  Fragment,
27
+ useMemo,
26
28
  } from '@wordpress/element';
27
29
 
28
30
  /**
@@ -33,6 +35,10 @@ import { unlock } from './lock-unlock';
33
35
  import ItemActions from './item-actions';
34
36
  import { sanitizeOperators } from './utils';
35
37
  import { ENUMERATION_TYPE, SORTING_DIRECTIONS } from './constants';
38
+ import {
39
+ useSomeItemHasAPossibleBulkAction,
40
+ useHasAPossibleBulkAction,
41
+ } from './bulk-actions';
36
42
 
37
43
  const {
38
44
  DropdownMenuV2: DropdownMenu,
@@ -186,8 +192,20 @@ const HeaderMenu = forwardRef( function HeaderMenu(
186
192
  );
187
193
  } );
188
194
 
189
- function BulkSelectionCheckbox( { selection, onSelectionChange, data } ) {
190
- const areAllSelected = selection.length === data.length;
195
+ function BulkSelectionCheckbox( {
196
+ selection,
197
+ onSelectionChange,
198
+ data,
199
+ actions,
200
+ } ) {
201
+ const selectableItems = useMemo( () => {
202
+ return data.filter( ( item ) => {
203
+ return actions.some(
204
+ ( action ) => action.supportsBulk && action.isEligible( item )
205
+ );
206
+ } );
207
+ }, [ data, actions ] );
208
+ const areAllSelected = selection.length === selectableItems.length;
191
209
  return (
192
210
  <CheckboxControl
193
211
  className="dataviews-view-table-selection-checkbox"
@@ -198,7 +216,7 @@ function BulkSelectionCheckbox( { selection, onSelectionChange, data } ) {
198
216
  if ( areAllSelected ) {
199
217
  onSelectionChange( [] );
200
218
  } else {
201
- onSelectionChange( data );
219
+ onSelectionChange( selectableItems );
202
220
  }
203
221
  } }
204
222
  label={ areAllSelected ? __( 'Deselect all' ) : __( 'Select all' ) }
@@ -206,6 +224,81 @@ function BulkSelectionCheckbox( { selection, onSelectionChange, data } ) {
206
224
  );
207
225
  }
208
226
 
227
+ function TableRow( {
228
+ hasBulkActions,
229
+ item,
230
+ actions,
231
+ id,
232
+ visibleFields,
233
+ primaryField,
234
+ selection,
235
+ getItemId,
236
+ onSelectionChange,
237
+ data,
238
+ } ) {
239
+ const hasPossibleBulkAction = useHasAPossibleBulkAction( actions, item );
240
+ return (
241
+ <tr
242
+ className={ classnames( 'dataviews-view-table__row', {
243
+ 'is-selected':
244
+ hasPossibleBulkAction && selection.includes( id ),
245
+ } ) }
246
+ >
247
+ { hasBulkActions && (
248
+ <td
249
+ className="dataviews-view-table__checkbox-column"
250
+ style={ {
251
+ width: 20,
252
+ minWidth: 20,
253
+ } }
254
+ >
255
+ <div className="dataviews-view-table__cell-content-wrapper">
256
+ <SingleSelectionCheckbox
257
+ id={ id }
258
+ item={ item }
259
+ selection={ selection }
260
+ onSelectionChange={ onSelectionChange }
261
+ getItemId={ getItemId }
262
+ data={ data }
263
+ primaryField={ primaryField }
264
+ disabled={ ! hasPossibleBulkAction }
265
+ />
266
+ </div>
267
+ </td>
268
+ ) }
269
+ { visibleFields.map( ( field ) => (
270
+ <td
271
+ key={ field.id }
272
+ style={ {
273
+ width: field.width || undefined,
274
+ minWidth: field.minWidth || undefined,
275
+ maxWidth: field.maxWidth || undefined,
276
+ } }
277
+ >
278
+ <div
279
+ className={ classnames(
280
+ 'dataviews-view-table__cell-content-wrapper',
281
+ {
282
+ 'dataviews-view-table__primary-field':
283
+ primaryField?.id === field.id,
284
+ }
285
+ ) }
286
+ >
287
+ { field.render( {
288
+ item,
289
+ } ) }
290
+ </div>
291
+ </td>
292
+ ) ) }
293
+ { !! actions?.length && (
294
+ <td className="dataviews-view-table__actions-column">
295
+ <ItemActions item={ item } actions={ actions } />
296
+ </td>
297
+ ) }
298
+ </tr>
299
+ );
300
+ }
301
+
209
302
  function ViewTable( {
210
303
  view,
211
304
  onChangeView,
@@ -219,10 +312,10 @@ function ViewTable( {
219
312
  onSelectionChange,
220
313
  setOpenedFilter,
221
314
  } ) {
222
- const hasBulkActions = actions?.some( ( action ) => action.supportsBulk );
223
315
  const headerMenuRefs = useRef( new Map() );
224
316
  const headerMenuToFocusRef = useRef();
225
317
  const [ nextHeaderMenuToFocus, setNextHeaderMenuToFocus ] = useState();
318
+ const hasBulkActions = useSomeItemHasAPossibleBulkAction( actions, data );
226
319
 
227
320
  useEffect( () => {
228
321
  if ( headerMenuToFocusRef.current ) {
@@ -263,7 +356,7 @@ function ViewTable( {
263
356
  );
264
357
 
265
358
  return (
266
- <div className="dataviews-view-table-wrapper">
359
+ <>
267
360
  <table
268
361
  className="dataviews-view-table"
269
362
  aria-busy={ isLoading }
@@ -285,6 +378,7 @@ function ViewTable( {
285
378
  selection={ selection }
286
379
  onSelectionChange={ onSelectionChange }
287
380
  data={ data }
381
+ actions={ actions }
288
382
  />
289
383
  </th>
290
384
  ) }
@@ -347,78 +441,19 @@ function ViewTable( {
347
441
  <tbody>
348
442
  { hasData &&
349
443
  usedData.map( ( item, index ) => (
350
- <tr
444
+ <TableRow
351
445
  key={ getItemId( item ) }
352
- className={ classnames(
353
- 'dataviews-view-table__row',
354
- {
355
- 'is-selected': selection.includes(
356
- getItemId( item ) || index
357
- ),
358
- }
359
- ) }
360
- >
361
- { hasBulkActions && (
362
- <td
363
- className="dataviews-view-table__checkbox-column"
364
- style={ {
365
- width: 20,
366
- minWidth: 20,
367
- } }
368
- >
369
- <div className="dataviews-view-table__cell-content-wrapper">
370
- <SingleSelectionCheckbox
371
- id={
372
- getItemId( item ) || index
373
- }
374
- item={ item }
375
- selection={ selection }
376
- onSelectionChange={
377
- onSelectionChange
378
- }
379
- getItemId={ getItemId }
380
- data={ data }
381
- primaryField={ primaryField }
382
- />
383
- </div>
384
- </td>
385
- ) }
386
- { visibleFields.map( ( field ) => (
387
- <td
388
- key={ field.id }
389
- style={ {
390
- width: field.width || undefined,
391
- minWidth:
392
- field.minWidth || undefined,
393
- maxWidth:
394
- field.maxWidth || undefined,
395
- } }
396
- >
397
- <div
398
- className={ classnames(
399
- 'dataviews-view-table__cell-content-wrapper',
400
- {
401
- 'dataviews-view-table__primary-field':
402
- primaryField?.id ===
403
- field.id,
404
- }
405
- ) }
406
- >
407
- { field.render( {
408
- item,
409
- } ) }
410
- </div>
411
- </td>
412
- ) ) }
413
- { !! actions?.length && (
414
- <td className="dataviews-view-table__actions-column">
415
- <ItemActions
416
- item={ item }
417
- actions={ actions }
418
- />
419
- </td>
420
- ) }
421
- </tr>
446
+ item={ item }
447
+ hasBulkActions={ hasBulkActions }
448
+ actions={ actions }
449
+ id={ getItemId( item ) || index }
450
+ visibleFields={ visibleFields }
451
+ primaryField={ primaryField }
452
+ selection={ selection }
453
+ getItemId={ getItemId }
454
+ onSelectionChange={ onSelectionChange }
455
+ data={ data }
456
+ />
422
457
  ) ) }
423
458
  </tbody>
424
459
  </table>
@@ -430,10 +465,10 @@ function ViewTable( {
430
465
  id={ tableNoticeId }
431
466
  >
432
467
  { ! hasData && (
433
- <p>{ isLoading ? __( 'Loading…' ) : __( 'No results' ) }</p>
468
+ <p>{ isLoading ? <Spinner /> : __( 'No results' ) }</p>
434
469
  ) }
435
470
  </div>
436
- </div>
471
+ </>
437
472
  );
438
473
  }
439
474