@wordpress/dataviews 0.4.1 → 0.5.1

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 (77) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +1 -0
  3. package/build/add-filter.js +25 -108
  4. package/build/add-filter.js.map +1 -1
  5. package/build/constants.js +9 -18
  6. package/build/constants.js.map +1 -1
  7. package/build/dataviews.js +22 -16
  8. package/build/dataviews.js.map +1 -1
  9. package/build/dropdown-menu-helper.js +1 -2
  10. package/build/dropdown-menu-helper.js.map +1 -1
  11. package/build/filter-summary.js +146 -78
  12. package/build/filter-summary.js.map +1 -1
  13. package/build/filters.js +32 -18
  14. package/build/filters.js.map +1 -1
  15. package/build/pagination.js +1 -2
  16. package/build/pagination.js.map +1 -1
  17. package/build/reset-filters.js +4 -1
  18. package/build/reset-filters.js.map +1 -1
  19. package/build/search-widget.js +111 -0
  20. package/build/search-widget.js.map +1 -0
  21. package/build/search.js +2 -3
  22. package/build/search.js.map +1 -1
  23. package/build/single-selection-checkbox.js +54 -0
  24. package/build/single-selection-checkbox.js.map +1 -0
  25. package/build/utils.js +14 -1
  26. package/build/utils.js.map +1 -1
  27. package/build/view-actions.js +2 -3
  28. package/build/view-actions.js.map +1 -1
  29. package/build/view-grid.js +92 -22
  30. package/build/view-grid.js.map +1 -1
  31. package/build/view-list.js +2 -1
  32. package/build/view-list.js.map +1 -1
  33. package/build/view-table.js +43 -132
  34. package/build/view-table.js.map +1 -1
  35. package/build-module/add-filter.js +28 -111
  36. package/build-module/add-filter.js.map +1 -1
  37. package/build-module/dataviews.js +23 -17
  38. package/build-module/dataviews.js.map +1 -1
  39. package/build-module/filter-summary.js +147 -80
  40. package/build-module/filter-summary.js.map +1 -1
  41. package/build-module/filters.js +32 -17
  42. package/build-module/filters.js.map +1 -1
  43. package/build-module/reset-filters.js +4 -1
  44. package/build-module/reset-filters.js.map +1 -1
  45. package/build-module/search-widget.js +101 -0
  46. package/build-module/search-widget.js.map +1 -0
  47. package/build-module/search.js +1 -1
  48. package/build-module/search.js.map +1 -1
  49. package/build-module/single-selection-checkbox.js +47 -0
  50. package/build-module/single-selection-checkbox.js.map +1 -0
  51. package/build-module/utils.js +12 -0
  52. package/build-module/utils.js.map +1 -1
  53. package/build-module/view-actions.js +1 -1
  54. package/build-module/view-actions.js.map +1 -1
  55. package/build-module/view-grid.js +92 -22
  56. package/build-module/view-grid.js.map +1 -1
  57. package/build-module/view-list.js +2 -1
  58. package/build-module/view-list.js.map +1 -1
  59. package/build-module/view-table.js +43 -131
  60. package/build-module/view-table.js.map +1 -1
  61. package/build-style/style-rtl.css +248 -44
  62. package/build-style/style.css +248 -44
  63. package/package.json +12 -11
  64. package/src/add-filter.js +39 -230
  65. package/src/dataviews.js +31 -20
  66. package/src/filter-summary.js +190 -136
  67. package/src/filters.js +42 -29
  68. package/src/reset-filters.js +12 -2
  69. package/src/search-widget.js +128 -0
  70. package/src/search.js +1 -1
  71. package/src/single-selection-checkbox.js +59 -0
  72. package/src/style.scss +254 -44
  73. package/src/utils.js +15 -0
  74. package/src/view-actions.js +1 -2
  75. package/src/view-grid.js +127 -53
  76. package/src/view-list.js +5 -1
  77. package/src/view-table.js +57 -230
@@ -0,0 +1,59 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __, sprintf } from '@wordpress/i18n';
5
+ import { CheckboxControl } from '@wordpress/components';
6
+
7
+ export default function SingleSelectionCheckbox( {
8
+ selection,
9
+ onSelectionChange,
10
+ item,
11
+ data,
12
+ getItemId,
13
+ primaryField,
14
+ } ) {
15
+ const id = getItemId( item );
16
+ const isSelected = selection.includes( id );
17
+ let selectionLabel;
18
+ if ( primaryField?.getValue && item ) {
19
+ // eslint-disable-next-line @wordpress/valid-sprintf
20
+ selectionLabel = sprintf(
21
+ /* translators: %s: item title. */
22
+ isSelected ? __( 'Deselect item: %s' ) : __( 'Select item: %s' ),
23
+ primaryField.getValue( { item } )
24
+ );
25
+ } else {
26
+ selectionLabel = isSelected
27
+ ? __( 'Select a new item' )
28
+ : __( 'Deselect item' );
29
+ }
30
+ return (
31
+ <CheckboxControl
32
+ className="dataviews-view-table-selection-checkbox"
33
+ __nextHasNoMarginBottom
34
+ checked={ isSelected }
35
+ label={ selectionLabel }
36
+ onChange={ () => {
37
+ if ( ! isSelected ) {
38
+ onSelectionChange(
39
+ data.filter( ( _item ) => {
40
+ const itemId = getItemId?.( _item );
41
+ return (
42
+ itemId === id || selection.includes( itemId )
43
+ );
44
+ } )
45
+ );
46
+ } else {
47
+ onSelectionChange(
48
+ data.filter( ( _item ) => {
49
+ const itemId = getItemId?.( _item );
50
+ return (
51
+ itemId !== id && selection.includes( itemId )
52
+ );
53
+ } )
54
+ );
55
+ }
56
+ } }
57
+ />
58
+ );
59
+ }
package/src/style.scss CHANGED
@@ -11,13 +11,20 @@
11
11
  }
12
12
 
13
13
  .dataviews-filters__view-actions {
14
- padding: $grid-unit-15 $grid-unit-40;
14
+ padding: $grid-unit-15 $grid-unit-40 0;
15
15
  .components-search-control {
16
16
  flex-grow: 1;
17
- max-width: 240px;
17
+
18
+ .components-base-control__field {
19
+ max-width: 240px;
20
+ }
18
21
  }
19
22
  }
20
23
 
24
+ .dataviews-filters__container {
25
+ padding: 0 $grid-unit-40;
26
+ }
27
+
21
28
  .dataviews-filters__view-actions.components-h-stack {
22
29
  align-items: center;
23
30
  }
@@ -26,24 +33,6 @@
26
33
  position: relative;
27
34
  }
28
35
 
29
- .dataviews-filters-count {
30
- position: absolute;
31
- top: 0;
32
- right: 0;
33
- height: $grid-unit-20;
34
- color: var(--wp-components-color-accent-inverted, $white);
35
- background-color: var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
36
- border-radius: $grid-unit-10;
37
- min-width: $grid-unit-20;
38
- padding: 0 $grid-unit-05;
39
- transform: translateX(40%) translateY(-40%);
40
- display: flex;
41
- align-items: center;
42
- justify-content: center;
43
- font-size: 11px;
44
- font-weight: 300;
45
- }
46
-
47
36
  .dataviews-pagination {
48
37
  margin-top: auto;
49
38
  position: sticky;
@@ -87,10 +76,6 @@
87
76
  padding: $grid-unit-15;
88
77
  white-space: nowrap;
89
78
 
90
- @include break-huge() {
91
- min-width: 200px;
92
- }
93
-
94
79
  &[data-field-id="actions"] {
95
80
  text-align: right;
96
81
  }
@@ -278,12 +263,20 @@
278
263
  justify-content: flex-start;
279
264
 
280
265
  .dataviews-view-grid__title-actions {
281
- padding: 0 $grid-unit-05;
266
+ padding: $grid-unit-05 $grid-unit $grid-unit-05 $grid-unit-05;
282
267
  }
283
268
 
284
269
  .dataviews-view-grid__primary-field {
285
270
  min-height: $grid-unit-50;
286
271
  }
272
+ &.is-selected {
273
+ border-color: var(--wp-admin-theme-color);
274
+ background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
275
+
276
+ .dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value {
277
+ color: $gray-900;
278
+ }
279
+ }
287
280
  }
288
281
 
289
282
  .dataviews-view-grid__media {
@@ -301,10 +294,6 @@
301
294
  }
302
295
  }
303
296
 
304
- .dataviews-view-grid__primary-field {
305
- padding: $grid-unit-10;
306
- }
307
-
308
297
  .dataviews-view-grid__fields {
309
298
  position: relative;
310
299
  font-size: 12px;
@@ -391,16 +380,14 @@
391
380
  border-radius: $grid-unit-05;
392
381
  }
393
382
  }
394
- h3 {
395
- overflow: hidden;
396
- text-overflow: ellipsis;
397
- white-space: nowrap;
383
+ .dataviews-view-list__primary-field {
384
+ min-height: $grid-unit-05 * 5;
398
385
  }
399
386
  }
400
387
 
401
388
  .dataviews-view-list__media-wrapper {
402
- width: $grid-unit-40;
403
- height: $grid-unit-40;
389
+ width: $grid-unit-50;
390
+ height: $grid-unit-50;
404
391
  border-radius: $grid-unit-05;
405
392
  overflow: hidden;
406
393
  position: relative;
@@ -433,17 +420,13 @@
433
420
 
434
421
  .dataviews-view-list__fields {
435
422
  color: $gray-700;
436
- overflow: hidden;
437
- text-overflow: ellipsis;
438
- white-space: nowrap;
423
+ display: flex;
424
+ gap: $grid-unit-10;
425
+ flex-wrap: wrap;
426
+ font-size: 12px;
427
+ line-height: $grid-unit-20;
439
428
 
440
429
  .dataviews-view-list__field {
441
- margin-right: $grid-unit-15;
442
-
443
- &:last-child {
444
- margin-right: 0;
445
- }
446
-
447
430
  &:empty {
448
431
  display: none;
449
432
  }
@@ -505,3 +488,230 @@
505
488
  .dataviews-bulk-edit-button.components-button {
506
489
  flex-shrink: 0;
507
490
  }
491
+
492
+ .dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox {
493
+ margin-left: $grid-unit-10;
494
+ }
495
+
496
+ .dataviews-view-grid__card.has-no-pointer-events * {
497
+ pointer-events: none;
498
+ }
499
+ .dataviews-filter-summary__popover {
500
+ .components-popover__content {
501
+ width: 230px;
502
+ padding: 0;
503
+ border-radius: $grid-unit-05;
504
+ }
505
+ }
506
+
507
+ .dataviews-search-widget-filter-combobox-list {
508
+ max-height: $grid-unit * 23;
509
+ padding: $grid-unit-05;
510
+ overflow: auto;
511
+ border-top: 1px solid $gray-200;
512
+
513
+ .dataviews-search-widget-filter-combobox-item {
514
+ display: flex;
515
+ align-items: center;
516
+ gap: $grid-unit-10;
517
+ border-radius: $radius-block-ui;
518
+ box-sizing: border-box;
519
+ padding: $grid-unit-10 $grid-unit-15;
520
+ cursor: default;
521
+ margin-block-end: 2px;
522
+
523
+ &:last-child {
524
+ margin-block-end: 0;
525
+ }
526
+
527
+ &:hover,
528
+ &[data-active-item],
529
+ &:focus {
530
+ background-color: var(--wp-components-color-accent, var(--wp-admin-theme-color, #3858e9));
531
+ color: $white;
532
+
533
+ .dataviews-search-widget-filter-combobox-item-check {
534
+ fill: $white;
535
+ }
536
+
537
+ .dataviews-search-widget-filter-combobox-item-description {
538
+ color: $white;
539
+ }
540
+ }
541
+
542
+ .dataviews-search-widget-filter-combobox-item-check {
543
+ width: 24px;
544
+ height: 24px;
545
+ flex-shrink: 0;
546
+ }
547
+
548
+ .dataviews-search-widget-filter-combobox-item-value {
549
+ [data-user-value] {
550
+ font-weight: 600;
551
+ }
552
+ }
553
+
554
+ .dataviews-search-widget-filter-combobox-item-description {
555
+ display: block;
556
+ overflow: hidden;
557
+ text-overflow: ellipsis;
558
+ font-size: $helptext-font-size;
559
+ line-height: 16px;
560
+ color: $gray-700;
561
+ }
562
+ }
563
+ }
564
+
565
+ .dataviews-search-widget-filter-combobox__wrapper {
566
+ position: relative;
567
+ padding: $grid-unit-10;
568
+
569
+ .dataviews-search-widget-filter-combobox__input {
570
+ @include input-control;
571
+ display: block;
572
+ padding: 0 $grid-unit-40 0 $grid-unit-10;
573
+ background: $gray-100;
574
+ border: none;
575
+ width: 100%;
576
+ height: $grid-unit-40;
577
+
578
+ // Unset inherited values.
579
+ margin-left: 0;
580
+ margin-right: 0;
581
+
582
+ /* Fonts smaller than 16px causes mobile safari to zoom. */
583
+ font-size: $mobile-text-min-font-size;
584
+ @include break-small {
585
+ font-size: $default-font-size;
586
+ }
587
+
588
+ &:focus {
589
+ background: $white;
590
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
591
+ }
592
+
593
+ &::placeholder {
594
+ color: $gray-700;
595
+ }
596
+
597
+ &::-webkit-search-decoration,
598
+ &::-webkit-search-cancel-button,
599
+ &::-webkit-search-results-button,
600
+ &::-webkit-search-results-decoration {
601
+ -webkit-appearance: none;
602
+ }
603
+ }
604
+
605
+ .dataviews-search-widget-filter-combobox__icon {
606
+ position: absolute;
607
+ right: $grid-unit-15;
608
+ top: 50%;
609
+ transform: translateY(-50%);
610
+ display: flex;
611
+ align-items: center;
612
+ justify-content: center;
613
+ width: $icon-size;
614
+ }
615
+ }
616
+
617
+ .dataviews-filter-summary__operators-container {
618
+ padding: $grid-unit-10 $grid-unit-10 $grid-unit-05;
619
+ padding-bottom: 0;
620
+
621
+ &:empty {
622
+ display: none;
623
+ }
624
+
625
+ .dataviews-filter-summary__operators-filter-name {
626
+ color: $gray-700;
627
+ }
628
+ }
629
+
630
+ .dataviews-filter-summary__chip-container {
631
+ position: relative;
632
+ white-space: pre-wrap;
633
+
634
+ .dataviews-filter-summary__chip {
635
+ border-radius: $grid-unit-20;
636
+ border: 1px solid transparent;
637
+ cursor: pointer;
638
+ padding: 0 $grid-unit-15;
639
+ height: $grid-unit-40;
640
+ background: $gray-100;
641
+ color: $gray-700;
642
+ position: relative;
643
+ display: flex;
644
+ align-items: center;
645
+
646
+ &.has-reset {
647
+ padding-inline-end: $button-size-small + $grid-unit-05;
648
+ }
649
+
650
+ &:hover,
651
+ &:focus-visible {
652
+ background: $gray-200;
653
+ color: $gray-900;
654
+ }
655
+
656
+ &.has-values {
657
+ color: var(--wp-admin-theme-color);
658
+ background: rgba(var(--wp-admin-theme-color--rgb), 0.04);
659
+
660
+ &:hover {
661
+ background: rgba(var(--wp-admin-theme-color--rgb), 0.08);
662
+ }
663
+ }
664
+
665
+ &:focus-visible {
666
+ outline: none;
667
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
668
+ }
669
+
670
+ .dataviews-filter-summary__filter-text-name {
671
+ font-weight: 500;
672
+ }
673
+ }
674
+
675
+ .dataviews-filter-summary__chip-remove {
676
+ width: $icon-size;
677
+ height: $icon-size;
678
+ border-radius: 50%;
679
+ border: 0;
680
+ padding: 0;
681
+ position: absolute;
682
+ right: $grid-unit-05;
683
+ top: 50%;
684
+ transform: translateY(-50%);
685
+ display: flex;
686
+ align-items: center;
687
+ justify-content: center;
688
+ background: transparent;
689
+ cursor: pointer;
690
+
691
+ svg {
692
+ fill: $gray-700;
693
+ }
694
+
695
+ &:hover,
696
+ &:focus {
697
+ background: $gray-200;
698
+ svg {
699
+ fill: $gray-900;
700
+ }
701
+ }
702
+
703
+ &.has-values {
704
+ svg {
705
+ fill: var(--wp-admin-theme-color);
706
+ }
707
+ &:hover {
708
+ background: rgba(var(--wp-admin-theme-color--rgb), 0.08);
709
+ }
710
+ }
711
+
712
+ &:focus-visible {
713
+ outline: none;
714
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
715
+ }
716
+ }
717
+ }
package/src/utils.js CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { OPERATORS } from './constants';
5
+
1
6
  /**
2
7
  * Helper util to sort data by text fields, when sorting is done client side.
3
8
  *
@@ -49,3 +54,13 @@ export function getPaginationResults( { data, view } ) {
49
54
  },
50
55
  };
51
56
  }
57
+
58
+ export const sanitizeOperators = ( field ) => {
59
+ let operators = field.filterBy?.operators;
60
+ if ( ! operators || ! Array.isArray( operators ) ) {
61
+ operators = Object.keys( OPERATORS );
62
+ }
63
+ return operators.filter( ( operator ) =>
64
+ Object.keys( OPERATORS ).includes( operator )
65
+ );
66
+ };
@@ -83,8 +83,7 @@ function PageSizeMenu( { view, onChangeView } ) {
83
83
  suffix={ <span aria-hidden="true">{ view.perPage }</span> }
84
84
  >
85
85
  <DropdownMenuItemLabel>
86
- { /* TODO: probably label per view type. */ }
87
- { __( 'Rows per page' ) }
86
+ { __( 'Items per page' ) }
88
87
  </DropdownMenuItemLabel>
89
88
  </DropdownMenuItem>
90
89
  }
package/src/view-grid.js CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import classnames from 'classnames';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -8,11 +13,115 @@ import {
8
13
  Tooltip,
9
14
  } from '@wordpress/components';
10
15
  import { useAsyncList } from '@wordpress/compose';
16
+ import { useState } from '@wordpress/element';
11
17
 
12
18
  /**
13
19
  * Internal dependencies
14
20
  */
15
21
  import ItemActions from './item-actions';
22
+ import SingleSelectionCheckbox from './single-selection-checkbox';
23
+
24
+ function GridItem( {
25
+ selection,
26
+ data,
27
+ onSelectionChange,
28
+ getItemId,
29
+ item,
30
+ actions,
31
+ mediaField,
32
+ primaryField,
33
+ visibleFields,
34
+ } ) {
35
+ const [ hasNoPointerEvents, setHasNoPointerEvents ] = useState( false );
36
+ const id = getItemId( item );
37
+ const isSelected = selection.includes( id );
38
+ return (
39
+ <VStack
40
+ spacing={ 0 }
41
+ key={ id }
42
+ className={ classnames( 'dataviews-view-grid__card', {
43
+ 'is-selected': isSelected,
44
+ 'has-no-pointer-events': hasNoPointerEvents,
45
+ } ) }
46
+ onMouseDown={ ( event ) => {
47
+ if ( event.ctrlKey || event.metaKey ) {
48
+ setHasNoPointerEvents( true );
49
+ if ( ! isSelected ) {
50
+ onSelectionChange(
51
+ data.filter( ( _item ) => {
52
+ const itemId = getItemId?.( _item );
53
+ return (
54
+ itemId === id ||
55
+ selection.includes( itemId )
56
+ );
57
+ } )
58
+ );
59
+ } else {
60
+ onSelectionChange(
61
+ data.filter( ( _item ) => {
62
+ const itemId = getItemId?.( _item );
63
+ return (
64
+ itemId !== id &&
65
+ selection.includes( itemId )
66
+ );
67
+ } )
68
+ );
69
+ }
70
+ }
71
+ } }
72
+ onClick={ () => {
73
+ if ( hasNoPointerEvents ) {
74
+ setHasNoPointerEvents( false );
75
+ }
76
+ } }
77
+ >
78
+ <div className="dataviews-view-grid__media">
79
+ { mediaField?.render( { item } ) }
80
+ </div>
81
+ <HStack
82
+ justify="space-between"
83
+ className="dataviews-view-grid__title-actions"
84
+ >
85
+ <SingleSelectionCheckbox
86
+ id={ id }
87
+ item={ item }
88
+ selection={ selection }
89
+ onSelectionChange={ onSelectionChange }
90
+ getItemId={ getItemId }
91
+ data={ data }
92
+ primaryField={ primaryField }
93
+ />
94
+ <HStack className="dataviews-view-grid__primary-field">
95
+ { primaryField?.render( { item } ) }
96
+ </HStack>
97
+ <ItemActions item={ item } actions={ actions } isCompact />
98
+ </HStack>
99
+ <VStack className="dataviews-view-grid__fields" spacing={ 3 }>
100
+ { visibleFields.map( ( field ) => {
101
+ const renderedValue = field.render( {
102
+ item,
103
+ } );
104
+ if ( ! renderedValue ) {
105
+ return null;
106
+ }
107
+ return (
108
+ <VStack
109
+ className="dataviews-view-grid__field"
110
+ key={ field.id }
111
+ spacing={ 1 }
112
+ >
113
+ <Tooltip text={ field.header } placement="left">
114
+ <div className="dataviews-view-grid__field-value">
115
+ { renderedValue }
116
+ </div>
117
+ </Tooltip>
118
+ </VStack>
119
+ );
120
+ } ) }
121
+ </VStack>
122
+ </VStack>
123
+ );
124
+ }
16
125
 
17
126
  export default function ViewGrid( {
18
127
  data,
@@ -21,6 +130,8 @@ export default function ViewGrid( {
21
130
  actions,
22
131
  getItemId,
23
132
  deferredRendering,
133
+ selection,
134
+ onSelectionChange,
24
135
  } ) {
25
136
  const mediaField = fields.find(
26
137
  ( field ) => field.id === view.layout.mediaField
@@ -44,59 +155,22 @@ export default function ViewGrid( {
44
155
  alignment="top"
45
156
  className="dataviews-view-grid"
46
157
  >
47
- { usedData.map( ( item ) => (
48
- <VStack
49
- spacing={ 0 }
50
- key={ getItemId( item ) }
51
- className="dataviews-view-grid__card"
52
- >
53
- <div className="dataviews-view-grid__media">
54
- { mediaField?.render( { item } ) }
55
- </div>
56
- <HStack
57
- justify="space-between"
58
- className="dataviews-view-grid__title-actions"
59
- >
60
- <HStack className="dataviews-view-grid__primary-field">
61
- { primaryField?.render( { item } ) }
62
- </HStack>
63
- <ItemActions
64
- item={ item }
65
- actions={ actions }
66
- isCompact
67
- />
68
- </HStack>
69
- <VStack
70
- className="dataviews-view-grid__fields"
71
- spacing={ 3 }
72
- >
73
- { visibleFields.map( ( field ) => {
74
- const renderedValue = field.render( {
75
- item,
76
- } );
77
- if ( ! renderedValue ) {
78
- return null;
79
- }
80
- return (
81
- <VStack
82
- className="dataviews-view-grid__field"
83
- key={ field.id }
84
- spacing={ 1 }
85
- >
86
- <Tooltip
87
- text={ field.header }
88
- placement="left"
89
- >
90
- <div className="dataviews-view-grid__field-value">
91
- { renderedValue }
92
- </div>
93
- </Tooltip>
94
- </VStack>
95
- );
96
- } ) }
97
- </VStack>
98
- </VStack>
99
- ) ) }
158
+ { usedData.map( ( item ) => {
159
+ return (
160
+ <GridItem
161
+ key={ getItemId( item ) }
162
+ selection={ selection }
163
+ data={ data }
164
+ onSelectionChange={ onSelectionChange }
165
+ getItemId={ getItemId }
166
+ item={ item }
167
+ actions={ actions }
168
+ mediaField={ mediaField }
169
+ primaryField={ primaryField }
170
+ visibleFields={ visibleFields }
171
+ />
172
+ );
173
+ } ) }
100
174
  </Grid>
101
175
  );
102
176
  }
package/src/view-list.js CHANGED
@@ -85,7 +85,11 @@ export default function ViewList( {
85
85
  className="dataviews-view-list__item"
86
86
  onClick={ () => onSelectionChange( [ item ] ) }
87
87
  >
88
- <HStack spacing={ 3 } justify="start">
88
+ <HStack
89
+ spacing={ 3 }
90
+ justify="start"
91
+ alignment="flex-start"
92
+ >
89
93
  <div className="dataviews-view-list__media-wrapper">
90
94
  { mediaField?.render( { item } ) || (
91
95
  <div className="dataviews-view-list__media-placeholder"></div>