@wordpress/dataviews 0.9.0 → 1.1.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.
- package/CHANGELOG.md +8 -0
- package/README.md +0 -8
- package/build/add-filter.js.map +1 -1
- package/build/bulk-actions.js.map +1 -1
- package/build/constants.js +1 -26
- package/build/constants.js.map +1 -1
- package/build/dataviews.js +3 -6
- package/build/dataviews.js.map +1 -1
- package/build/dropdown-menu-helper.js.map +1 -1
- package/build/filter-and-sort-data-view.js +72 -65
- package/build/filter-and-sort-data-view.js.map +1 -1
- package/build/filter-summary.js +4 -2
- package/build/filter-summary.js.map +1 -1
- package/build/filters.js.map +1 -1
- package/build/index.js +2 -2
- package/build/index.js.map +1 -1
- package/build/item-actions.js.map +1 -1
- package/build/layouts.js +38 -0
- package/build/layouts.js.map +1 -0
- package/build/lock-unlock.js.map +1 -1
- package/build/normalize-fields.js +7 -2
- package/build/normalize-fields.js.map +1 -1
- package/build/pagination.js.map +1 -1
- package/build/reset-filters.js.map +1 -1
- package/build/search-widget.js +5 -4
- package/build/search-widget.js.map +1 -1
- package/build/search.js.map +1 -1
- package/build/single-selection-checkbox.js +1 -1
- package/build/single-selection-checkbox.js.map +1 -1
- package/build/types.js +6 -0
- package/build/types.js.map +1 -0
- package/build/utils.js.map +1 -1
- package/build/view-actions.js +2 -1
- package/build/view-actions.js.map +1 -1
- package/build/view-grid.js +43 -15
- package/build/view-grid.js.map +1 -1
- package/build/view-list.js +4 -22
- package/build/view-list.js.map +1 -1
- package/build/view-table.js +5 -11
- package/build/view-table.js.map +1 -1
- package/build-module/add-filter.js.map +1 -1
- package/build-module/bulk-actions.js.map +1 -1
- package/build-module/constants.js +1 -25
- package/build-module/constants.js.map +1 -1
- package/build-module/dataviews.js +3 -6
- package/build-module/dataviews.js.map +1 -1
- package/build-module/dropdown-menu-helper.js.map +1 -1
- package/build-module/filter-and-sort-data-view.js +72 -65
- package/build-module/filter-and-sort-data-view.js.map +1 -1
- package/build-module/filter-summary.js +3 -2
- package/build-module/filter-summary.js.map +1 -1
- package/build-module/filters.js.map +1 -1
- package/build-module/index.js +1 -1
- package/build-module/index.js.map +1 -1
- package/build-module/item-actions.js.map +1 -1
- package/build-module/layouts.js +30 -0
- package/build-module/layouts.js.map +1 -0
- package/build-module/lock-unlock.js.map +1 -1
- package/build-module/normalize-fields.js +7 -2
- package/build-module/normalize-fields.js.map +1 -1
- package/build-module/pagination.js.map +1 -1
- package/build-module/reset-filters.js.map +1 -1
- package/build-module/search-widget.js +4 -3
- package/build-module/search-widget.js.map +1 -1
- package/build-module/search.js.map +1 -1
- package/build-module/single-selection-checkbox.js +1 -1
- package/build-module/single-selection-checkbox.js.map +1 -1
- package/build-module/types.js +2 -0
- package/build-module/types.js.map +1 -0
- package/build-module/utils.js.map +1 -1
- package/build-module/view-actions.js +2 -1
- package/build-module/view-actions.js.map +1 -1
- package/build-module/view-grid.js +43 -15
- package/build-module/view-grid.js.map +1 -1
- package/build-module/view-list.js +6 -24
- package/build-module/view-list.js.map +1 -1
- package/build-module/view-table.js +5 -11
- package/build-module/view-table.js.map +1 -1
- package/build-style/style-rtl.css +60 -45
- package/build-style/style.css +60 -45
- package/build-types/constants.d.ts +45 -0
- package/build-types/constants.d.ts.map +1 -0
- package/build-types/filter-and-sort-data-view.d.ts +18 -0
- package/build-types/filter-and-sort-data-view.d.ts.map +1 -0
- package/build-types/normalize-fields.d.ts +12 -0
- package/build-types/normalize-fields.d.ts.map +1 -0
- package/build-types/types.d.ts +122 -0
- package/build-types/types.d.ts.map +1 -0
- package/package.json +11 -11
- package/src/{constants.js → constants.ts} +1 -35
- package/src/dataviews.js +2 -5
- package/src/filter-and-sort-data-view.ts +164 -0
- package/src/filter-summary.js +4 -4
- package/src/index.js +1 -1
- package/src/layouts.js +39 -0
- package/src/normalize-fields.ts +23 -0
- package/src/search-widget.js +4 -3
- package/src/single-selection-checkbox.js +1 -1
- package/src/stories/fixtures.js +0 -2
- package/src/style.scss +65 -51
- package/src/types.ts +144 -0
- package/src/view-actions.js +2 -1
- package/src/view-grid.js +91 -52
- package/src/view-list.js +4 -24
- package/src/view-table.js +7 -11
- package/tsconfig.json +20 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/src/filter-and-sort-data-view.js +0 -154
- package/src/normalize-fields.js +0 -17
package/src/style.scss
CHANGED
|
@@ -92,10 +92,6 @@
|
|
|
92
92
|
&.dataviews-view-table__checkbox-column {
|
|
93
93
|
padding-right: 0;
|
|
94
94
|
}
|
|
95
|
-
|
|
96
|
-
.components-checkbox-control__input-container {
|
|
97
|
-
margin: $grid-unit-05;
|
|
98
|
-
}
|
|
99
95
|
}
|
|
100
96
|
tr {
|
|
101
97
|
border-bottom: 1px solid $gray-100;
|
|
@@ -150,6 +146,14 @@
|
|
|
150
146
|
}
|
|
151
147
|
}
|
|
152
148
|
|
|
149
|
+
@media (hover: none) {
|
|
150
|
+
// Show checkboxes and quick-actions on devices that do not support hover.
|
|
151
|
+
.components-checkbox-control__input.components-checkbox-control__input,
|
|
152
|
+
.dataviews-item-actions .components-button:not(.dataviews-all-actions-button) {
|
|
153
|
+
opacity: 1;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
153
157
|
&.is-selected {
|
|
154
158
|
background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
|
|
155
159
|
color: $gray-700;
|
|
@@ -237,7 +241,7 @@
|
|
|
237
241
|
.dataviews-view-table__primary-field {
|
|
238
242
|
font-size: $default-font-size;
|
|
239
243
|
font-weight: 500;
|
|
240
|
-
color: $gray-
|
|
244
|
+
color: $gray-700;
|
|
241
245
|
text-overflow: ellipsis;
|
|
242
246
|
white-space: nowrap;
|
|
243
247
|
display: block;
|
|
@@ -245,12 +249,12 @@
|
|
|
245
249
|
|
|
246
250
|
a {
|
|
247
251
|
text-decoration: none;
|
|
248
|
-
color: inherit;
|
|
249
252
|
text-overflow: ellipsis;
|
|
250
253
|
white-space: nowrap;
|
|
251
254
|
overflow: hidden;
|
|
252
255
|
display: block;
|
|
253
256
|
flex-grow: 0;
|
|
257
|
+
color: $gray-900;
|
|
254
258
|
|
|
255
259
|
&:hover {
|
|
256
260
|
color: var(--wp-admin-theme-color);
|
|
@@ -260,13 +264,16 @@
|
|
|
260
264
|
|
|
261
265
|
button.components-button.is-link {
|
|
262
266
|
text-decoration: none;
|
|
263
|
-
color: inherit;
|
|
264
267
|
font-weight: inherit;
|
|
265
268
|
text-overflow: ellipsis;
|
|
266
269
|
white-space: nowrap;
|
|
267
270
|
overflow: hidden;
|
|
268
271
|
display: block;
|
|
269
272
|
width: 100%;
|
|
273
|
+
color: $gray-900;
|
|
274
|
+
&:hover {
|
|
275
|
+
color: var(--wp-admin-theme-color);
|
|
276
|
+
}
|
|
270
277
|
}
|
|
271
278
|
}
|
|
272
279
|
|
|
@@ -285,25 +292,26 @@
|
|
|
285
292
|
}
|
|
286
293
|
|
|
287
294
|
.dataviews-view-grid__card {
|
|
288
|
-
border-radius: $radius-block-ui * 2;
|
|
289
|
-
border: 1px solid $gray-200;
|
|
290
295
|
height: 100%;
|
|
291
296
|
justify-content: flex-start;
|
|
292
297
|
|
|
293
298
|
.dataviews-view-grid__title-actions {
|
|
294
|
-
padding: $grid-unit-
|
|
299
|
+
padding: $grid-unit-10 0 $grid-unit-05;
|
|
295
300
|
}
|
|
296
301
|
|
|
297
302
|
.dataviews-view-grid__primary-field {
|
|
298
|
-
min-height: $grid-unit-
|
|
303
|
+
min-height: $grid-unit-40; // Preserve layout when there is no ellipsis button
|
|
299
304
|
}
|
|
300
|
-
&.is-selected {
|
|
301
|
-
border-color: var(--wp-admin-theme-color);
|
|
302
|
-
background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
|
|
303
305
|
|
|
306
|
+
&.is-selected {
|
|
304
307
|
.dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value {
|
|
305
308
|
color: $gray-900;
|
|
306
309
|
}
|
|
310
|
+
|
|
311
|
+
.page-pages-preview-field__button::after {
|
|
312
|
+
box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
|
|
313
|
+
background: rgba(var(--wp-admin-theme-color--rgb), 0.04);
|
|
314
|
+
}
|
|
307
315
|
}
|
|
308
316
|
}
|
|
309
317
|
|
|
@@ -311,15 +319,27 @@
|
|
|
311
319
|
width: 100%;
|
|
312
320
|
min-height: 200px;
|
|
313
321
|
aspect-ratio: 1/1;
|
|
314
|
-
border-bottom: 1px solid $gray-200;
|
|
315
322
|
background-color: $gray-100;
|
|
316
|
-
border-radius:
|
|
323
|
+
border-radius: $grid-unit-05;
|
|
324
|
+
overflow: hidden;
|
|
325
|
+
position: relative;
|
|
317
326
|
|
|
318
327
|
img {
|
|
319
328
|
object-fit: cover;
|
|
320
329
|
width: 100%;
|
|
321
330
|
height: 100%;
|
|
322
331
|
}
|
|
332
|
+
|
|
333
|
+
&::after {
|
|
334
|
+
content: "";
|
|
335
|
+
position: absolute;
|
|
336
|
+
top: 0;
|
|
337
|
+
left: 0;
|
|
338
|
+
width: 100%;
|
|
339
|
+
height: 100%;
|
|
340
|
+
box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.1);
|
|
341
|
+
border-radius: $grid-unit-05;
|
|
342
|
+
}
|
|
323
343
|
}
|
|
324
344
|
|
|
325
345
|
.dataviews-view-grid__fields {
|
|
@@ -328,7 +348,7 @@
|
|
|
328
348
|
line-height: 16px;
|
|
329
349
|
|
|
330
350
|
&:not(:empty) {
|
|
331
|
-
padding: $grid-unit-15;
|
|
351
|
+
padding: $grid-unit-15 0;
|
|
332
352
|
padding-top: 0;
|
|
333
353
|
}
|
|
334
354
|
|
|
@@ -355,6 +375,23 @@
|
|
|
355
375
|
}
|
|
356
376
|
}
|
|
357
377
|
}
|
|
378
|
+
|
|
379
|
+
.dataviews-view-grid__badge-fields {
|
|
380
|
+
&:not(:empty) {
|
|
381
|
+
padding-bottom: $grid-unit-15;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
.dataviews-view-grid__field-value {
|
|
385
|
+
width: fit-content;
|
|
386
|
+
background: $gray-100;
|
|
387
|
+
padding: 0 $grid-unit-10;
|
|
388
|
+
min-height: $grid-unit-30;
|
|
389
|
+
border-radius: $radius-block-ui;
|
|
390
|
+
display: flex;
|
|
391
|
+
align-items: center;
|
|
392
|
+
font-size: 12px;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
358
395
|
}
|
|
359
396
|
|
|
360
397
|
.dataviews-view-list {
|
|
@@ -386,6 +423,9 @@
|
|
|
386
423
|
}
|
|
387
424
|
|
|
388
425
|
&:not(.is-selected) {
|
|
426
|
+
.dataviews-view-list__primary-field {
|
|
427
|
+
color: $gray-900;
|
|
428
|
+
}
|
|
389
429
|
&:hover,
|
|
390
430
|
&:focus-within {
|
|
391
431
|
color: var(--wp-admin-theme-color);
|
|
@@ -492,26 +532,6 @@
|
|
|
492
532
|
justify-content: space-between;
|
|
493
533
|
}
|
|
494
534
|
|
|
495
|
-
.dataviews-view-list__details-button {
|
|
496
|
-
align-self: center;
|
|
497
|
-
opacity: 0;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
li.is-selected,
|
|
501
|
-
li:hover,
|
|
502
|
-
li:focus-within {
|
|
503
|
-
.dataviews-view-list__details-button {
|
|
504
|
-
opacity: 1;
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
li.is-selected {
|
|
509
|
-
.dataviews-view-list__details-button {
|
|
510
|
-
&:focus {
|
|
511
|
-
box-shadow: 0 0 0 var(--wp-admin-border-width-focus) currentColor;
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
535
|
}
|
|
516
536
|
|
|
517
537
|
.dataviews-action-modal {
|
|
@@ -527,16 +547,14 @@
|
|
|
527
547
|
justify-content: center;
|
|
528
548
|
}
|
|
529
549
|
|
|
530
|
-
.dataviews-view-table-selection-checkbox
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
white-space: nowrap;
|
|
539
|
-
border: 0;
|
|
550
|
+
.dataviews-view-table-selection-checkbox {
|
|
551
|
+
// Experimental override for CheckboxControl size (fragile)
|
|
552
|
+
--checkbox-input-size: 24px;
|
|
553
|
+
@include break-small() {
|
|
554
|
+
--checkbox-input-size: 16px;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
line-height: 0;
|
|
540
558
|
}
|
|
541
559
|
|
|
542
560
|
.dataviews-filters__custom-menu-radio-item-prefix {
|
|
@@ -548,10 +566,6 @@
|
|
|
548
566
|
flex-shrink: 0;
|
|
549
567
|
}
|
|
550
568
|
|
|
551
|
-
.dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox {
|
|
552
|
-
margin-left: $grid-unit-10;
|
|
553
|
-
}
|
|
554
|
-
|
|
555
569
|
.dataviews-filter-summary__popover {
|
|
556
570
|
.components-popover__content {
|
|
557
571
|
width: 230px;
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import type { ReactNode } from 'react';
|
|
5
|
+
|
|
6
|
+
type Item = Record< string, any >;
|
|
7
|
+
|
|
8
|
+
interface Option {
|
|
9
|
+
value: any;
|
|
10
|
+
label: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface filterByConfig {
|
|
14
|
+
operators?: Operator[];
|
|
15
|
+
isPrimary?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
type Operator = 'is' | 'isNot' | 'isAny' | 'isNone' | 'isAll' | 'isNotAll';
|
|
19
|
+
|
|
20
|
+
export interface Field {
|
|
21
|
+
/**
|
|
22
|
+
* The unique identifier of the field.
|
|
23
|
+
*/
|
|
24
|
+
id: string;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The label of the field. Defaults to the id.
|
|
28
|
+
*/
|
|
29
|
+
header?: string;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Callback used to retrieve the value of the field from the item.
|
|
33
|
+
* Defaults to `item[ field.id ]`.
|
|
34
|
+
*/
|
|
35
|
+
getValue?: ( { item }: { item: Item } ) => any;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Callback used to render the field. Defaults to `field.getValue`.
|
|
39
|
+
*/
|
|
40
|
+
render?: ( { item }: { item: Item } ) => ReactNode;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The width of the field column.
|
|
44
|
+
*/
|
|
45
|
+
width: string | number | undefined;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The minimum width of the field column.
|
|
49
|
+
*/
|
|
50
|
+
maxWidth: string | number | undefined;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The maximum width of the field column.
|
|
54
|
+
*/
|
|
55
|
+
minWidth: string | number | undefined;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Whether the field is sortable.
|
|
59
|
+
*/
|
|
60
|
+
enableSorting: boolean | undefined;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Whether the field is searchable.
|
|
64
|
+
*/
|
|
65
|
+
enableGlobalSearch: boolean | undefined;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Whether the field is filterable.
|
|
69
|
+
*/
|
|
70
|
+
enableHiding: boolean | undefined;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The list of options to pick from when using the field as a filter.
|
|
74
|
+
*/
|
|
75
|
+
elements: Option[] | undefined;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Filter config for the field.
|
|
79
|
+
*/
|
|
80
|
+
filterBy: filterByConfig | undefined;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export type NormalizedField = Required< Field >;
|
|
84
|
+
|
|
85
|
+
export type Data = Item[];
|
|
86
|
+
|
|
87
|
+
export interface Filter {
|
|
88
|
+
/**
|
|
89
|
+
* The field to filter by.
|
|
90
|
+
*/
|
|
91
|
+
field: string;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The operator to use.
|
|
95
|
+
*/
|
|
96
|
+
operator: Operator;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The value to filter by.
|
|
100
|
+
*/
|
|
101
|
+
value: any;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface View {
|
|
105
|
+
/**
|
|
106
|
+
* The layout of the view.
|
|
107
|
+
*/
|
|
108
|
+
type: string;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The global search term.
|
|
112
|
+
*/
|
|
113
|
+
search?: string;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* The filters to apply.
|
|
117
|
+
*/
|
|
118
|
+
filters: Filter[];
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The sorting configuration.
|
|
122
|
+
*/
|
|
123
|
+
sort?: {
|
|
124
|
+
/**
|
|
125
|
+
* The field to sort by.
|
|
126
|
+
*/
|
|
127
|
+
field: string;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The direction to sort by.
|
|
131
|
+
*/
|
|
132
|
+
direction: string;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The active page
|
|
137
|
+
*/
|
|
138
|
+
page?: number;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The number of items per page
|
|
142
|
+
*/
|
|
143
|
+
perPage?: number;
|
|
144
|
+
}
|
package/src/view-actions.js
CHANGED
|
@@ -13,7 +13,8 @@ import { settings } from '@wordpress/icons';
|
|
|
13
13
|
* Internal dependencies
|
|
14
14
|
*/
|
|
15
15
|
import { unlock } from './lock-unlock';
|
|
16
|
-
import {
|
|
16
|
+
import { SORTING_DIRECTIONS } from './constants';
|
|
17
|
+
import { VIEW_LAYOUTS } from './layouts';
|
|
17
18
|
|
|
18
19
|
const {
|
|
19
20
|
DropdownMenuV2: DropdownMenu,
|
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
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
135
|
-
|
|
120
|
+
key={ field.id }
|
|
121
|
+
className={ 'dataviews-view-grid__field-value' }
|
|
136
122
|
>
|
|
137
123
|
{ renderedValue }
|
|
138
124
|
</FlexItem>
|
|
139
|
-
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
|
|
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.
|
|
165
|
-
( field ) =>
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
|
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
|
-
{
|
|
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
|
-
|
|
198
|
-
|
|
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 {
|
|
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
|
|
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 =
|
|
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
|
-
{
|
|
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 }
|