@wordpress/dataviews 4.2.0 → 4.3.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 +2 -0
- package/README.md +47 -7
- package/build/components/dataviews/index.js +3 -5
- package/build/components/dataviews/index.js.map +1 -1
- package/build/components/dataviews-bulk-actions/index.js +145 -141
- package/build/components/dataviews-bulk-actions/index.js.map +1 -1
- package/build/components/dataviews-filters/add-filter.js +4 -6
- package/build/components/dataviews-filters/add-filter.js.map +1 -1
- package/build/components/dataviews-filters/search-widget.js +28 -18
- package/build/components/dataviews-filters/search-widget.js.map +1 -1
- package/build/components/dataviews-footer/index.js +45 -0
- package/build/components/dataviews-footer/index.js.map +1 -0
- package/build/components/dataviews-item-actions/index.js +5 -8
- package/build/components/dataviews-item-actions/index.js.map +1 -1
- package/build/components/dataviews-pagination/index.js +4 -4
- package/build/components/dataviews-pagination/index.js.map +1 -1
- package/build/components/dataviews-view-config/index.js +171 -32
- package/build/components/dataviews-view-config/index.js.map +1 -1
- package/build/dataforms-layouts/panel/index.js +4 -1
- package/build/dataforms-layouts/panel/index.js.map +1 -1
- package/build/dataviews-layouts/index.js +48 -2
- package/build/dataviews-layouts/index.js.map +1 -1
- package/build/dataviews-layouts/list/index.js +124 -84
- package/build/dataviews-layouts/list/index.js.map +1 -1
- package/build/dataviews-layouts/table/column-header-menu.js +52 -54
- package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
- package/build/dataviews-layouts/table/index.js +7 -35
- package/build/dataviews-layouts/table/index.js.map +1 -1
- package/build/normalize-fields.js +4 -2
- package/build/normalize-fields.js.map +1 -1
- package/build/types.js.map +1 -1
- package/build-module/components/dataviews/index.js +3 -5
- package/build-module/components/dataviews/index.js.map +1 -1
- package/build-module/components/dataviews-bulk-actions/index.js +145 -143
- package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
- package/build-module/components/dataviews-filters/add-filter.js +4 -6
- package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
- package/build-module/components/dataviews-filters/search-widget.js +28 -18
- package/build-module/components/dataviews-filters/search-widget.js.map +1 -1
- package/build-module/components/dataviews-footer/index.js +38 -0
- package/build-module/components/dataviews-footer/index.js.map +1 -0
- package/build-module/components/dataviews-item-actions/index.js +5 -8
- package/build-module/components/dataviews-item-actions/index.js.map +1 -1
- package/build-module/components/dataviews-pagination/index.js +5 -5
- package/build-module/components/dataviews-pagination/index.js.map +1 -1
- package/build-module/components/dataviews-view-config/index.js +177 -38
- package/build-module/components/dataviews-view-config/index.js.map +1 -1
- package/build-module/dataforms-layouts/panel/index.js +4 -1
- package/build-module/dataforms-layouts/panel/index.js.map +1 -1
- package/build-module/dataviews-layouts/index.js +45 -1
- package/build-module/dataviews-layouts/index.js.map +1 -1
- package/build-module/dataviews-layouts/list/index.js +125 -83
- package/build-module/dataviews-layouts/list/index.js.map +1 -1
- package/build-module/dataviews-layouts/table/column-header-menu.js +52 -54
- package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
- package/build-module/dataviews-layouts/table/index.js +9 -37
- package/build-module/dataviews-layouts/table/index.js.map +1 -1
- package/build-module/normalize-fields.js +4 -2
- package/build-module/normalize-fields.js.map +1 -1
- package/build-module/types.js.map +1 -1
- package/build-style/style-rtl.css +79 -63
- package/build-style/style.css +79 -63
- package/build-types/components/dataviews/index.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/fixtures.d.ts +27 -131
- package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
- package/build-types/components/dataviews/stories/index.story.d.ts +12 -53
- package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
- package/build-types/components/dataviews-bulk-actions/index.d.ts +11 -1
- package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
- package/build-types/components/dataviews-footer/index.d.ts +2 -0
- package/build-types/components/dataviews-footer/index.d.ts.map +1 -0
- package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
- package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
- package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/index.d.ts +4 -2
- package/build-types/dataviews-layouts/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
- package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
- package/build-types/normalize-fields.d.ts.map +1 -1
- package/build-types/types.d.ts +2 -0
- package/build-types/types.d.ts.map +1 -1
- package/package.json +11 -11
- package/src/components/dataviews/index.tsx +2 -6
- package/src/components/dataviews/stories/fixtures.tsx +690 -0
- package/src/components/dataviews/stories/index.story.tsx +164 -0
- package/src/components/dataviews/style.scss +2 -0
- package/src/components/dataviews-bulk-actions/index.tsx +264 -213
- package/src/components/dataviews-bulk-actions/style.scss +9 -4
- package/src/components/dataviews-filters/add-filter.tsx +7 -11
- package/src/components/dataviews-filters/search-widget.tsx +45 -17
- package/src/components/dataviews-filters/style.scss +12 -2
- package/src/components/dataviews-footer/index.tsx +50 -0
- package/src/components/dataviews-footer/style.scss +40 -0
- package/src/components/dataviews-item-actions/index.tsx +8 -14
- package/src/components/dataviews-pagination/index.tsx +5 -5
- package/src/components/dataviews-pagination/style.scss +0 -19
- package/src/components/dataviews-view-config/index.tsx +252 -53
- package/src/components/dataviews-view-config/style.scss +25 -0
- package/src/dataforms-layouts/panel/index.tsx +2 -0
- package/src/dataviews-layouts/grid/style.scss +1 -1
- package/src/dataviews-layouts/index.ts +63 -2
- package/src/dataviews-layouts/list/index.tsx +199 -127
- package/src/dataviews-layouts/list/style.scss +10 -4
- package/src/dataviews-layouts/table/column-header-menu.tsx +85 -87
- package/src/dataviews-layouts/table/index.tsx +8 -65
- package/src/dataviews-layouts/table/style.scss +0 -5
- package/src/normalize-fields.ts +2 -0
- package/src/style.scss +1 -1
- package/src/types.ts +2 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/build/components/dataviews-bulk-actions-toolbar/index.js +0 -207
- package/build/components/dataviews-bulk-actions-toolbar/index.js.map +0 -1
- package/build-module/components/dataviews-bulk-actions-toolbar/index.js +0 -201
- package/build-module/components/dataviews-bulk-actions-toolbar/index.js.map +0 -1
- package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts +0 -2
- package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts.map +0 -1
- package/src/components/dataviews/stories/fixtures.js +0 -250
- package/src/components/dataviews/stories/index.story.js +0 -71
- package/src/components/dataviews-bulk-actions-toolbar/index.tsx +0 -288
- package/src/components/dataviews-bulk-actions-toolbar/style.scss +0 -45
|
@@ -25,16 +25,11 @@ import type {
|
|
|
25
25
|
NormalizedField,
|
|
26
26
|
SortDirection,
|
|
27
27
|
ViewTable as ViewTableType,
|
|
28
|
+
Operator,
|
|
28
29
|
} from '../../types';
|
|
30
|
+
import { getVisibleFieldIds } from '../index';
|
|
29
31
|
|
|
30
|
-
const {
|
|
31
|
-
DropdownMenuV2: DropdownMenu,
|
|
32
|
-
DropdownMenuGroupV2: DropdownMenuGroup,
|
|
33
|
-
DropdownMenuItemV2: DropdownMenuItem,
|
|
34
|
-
DropdownMenuRadioItemV2: DropdownMenuRadioItem,
|
|
35
|
-
DropdownMenuItemLabelV2: DropdownMenuItemLabel,
|
|
36
|
-
DropdownMenuSeparatorV2: DropdownMenuSeparator,
|
|
37
|
-
} = unlock( componentsPrivateApis );
|
|
32
|
+
const { DropdownMenuV2 } = unlock( componentsPrivateApis );
|
|
38
33
|
|
|
39
34
|
interface HeaderMenuProps< Item > {
|
|
40
35
|
fieldId: string;
|
|
@@ -50,7 +45,7 @@ function WithDropDownMenuSeparators( { children }: { children: ReactNode } ) {
|
|
|
50
45
|
.filter( Boolean )
|
|
51
46
|
.map( ( child, i ) => (
|
|
52
47
|
<Fragment key={ i }>
|
|
53
|
-
{ i > 0 && <
|
|
48
|
+
{ i > 0 && <DropdownMenuV2.Separator /> }
|
|
54
49
|
{ child }
|
|
55
50
|
</Fragment>
|
|
56
51
|
) );
|
|
@@ -67,33 +62,46 @@ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
|
|
|
67
62
|
}: HeaderMenuProps< Item >,
|
|
68
63
|
ref: Ref< HTMLButtonElement >
|
|
69
64
|
) {
|
|
65
|
+
const visibleFieldIds = getVisibleFieldIds( view, fields );
|
|
66
|
+
const index = visibleFieldIds?.indexOf( fieldId ) as number;
|
|
67
|
+
const isSorted = view.sort?.field === fieldId;
|
|
68
|
+
let isHidable = false;
|
|
69
|
+
let isSortable = false;
|
|
70
|
+
let canAddFilter = false;
|
|
71
|
+
let header;
|
|
72
|
+
let operators: Operator[] = [];
|
|
73
|
+
|
|
70
74
|
const combinedField = view.layout?.combinedFields?.find(
|
|
71
75
|
( f ) => f.id === fieldId
|
|
72
76
|
);
|
|
73
|
-
const index = view.fields?.indexOf( fieldId ) as number;
|
|
74
|
-
if ( !! combinedField ) {
|
|
75
|
-
return combinedField.header || combinedField.label;
|
|
76
|
-
}
|
|
77
77
|
const field = fields.find( ( f ) => f.id === fieldId );
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
|
|
79
|
+
if ( ! combinedField ) {
|
|
80
|
+
if ( ! field ) {
|
|
81
|
+
// No combined or regular field found.
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
isHidable = field.enableHiding !== false;
|
|
86
|
+
isSortable = field.enableSorting !== false;
|
|
87
|
+
header = field.header;
|
|
88
|
+
|
|
89
|
+
operators = sanitizeOperators( field );
|
|
90
|
+
// Filter can be added:
|
|
91
|
+
// 1. If the field is not already part of a view's filters.
|
|
92
|
+
// 2. If the field meets the type and operator requirements.
|
|
93
|
+
// 3. If it's not primary. If it is, it should be already visible.
|
|
94
|
+
canAddFilter =
|
|
95
|
+
! view.filters?.some( ( _filter ) => fieldId === _filter.field ) &&
|
|
96
|
+
!! field.elements?.length &&
|
|
97
|
+
!! operators.length &&
|
|
98
|
+
! field.filterBy?.isPrimary;
|
|
99
|
+
} else {
|
|
100
|
+
header = combinedField.header || combinedField.label;
|
|
80
101
|
}
|
|
81
|
-
const isHidable = field.enableHiding !== false;
|
|
82
|
-
const isSortable = field.enableSorting !== false;
|
|
83
|
-
const isSorted = view.sort?.field === field.id;
|
|
84
|
-
const operators = sanitizeOperators( field );
|
|
85
|
-
// Filter can be added:
|
|
86
|
-
// 1. If the field is not already part of a view's filters.
|
|
87
|
-
// 2. If the field meets the type and operator requirements.
|
|
88
|
-
// 3. If it's not primary. If it is, it should be already visible.
|
|
89
|
-
const canAddFilter =
|
|
90
|
-
! view.filters?.some( ( _filter ) => field.id === _filter.field ) &&
|
|
91
|
-
!! field.elements?.length &&
|
|
92
|
-
!! operators.length &&
|
|
93
|
-
! field.filterBy?.isPrimary;
|
|
94
102
|
|
|
95
103
|
return (
|
|
96
|
-
<
|
|
104
|
+
<DropdownMenuV2
|
|
97
105
|
align="start"
|
|
98
106
|
trigger={
|
|
99
107
|
<Button
|
|
@@ -102,7 +110,7 @@ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
|
|
|
102
110
|
ref={ ref }
|
|
103
111
|
variant="tertiary"
|
|
104
112
|
>
|
|
105
|
-
{
|
|
113
|
+
{ header }
|
|
106
114
|
{ view.sort && isSorted && (
|
|
107
115
|
<span aria-hidden="true">
|
|
108
116
|
{ sortArrows[ view.sort.direction ] }
|
|
@@ -114,7 +122,7 @@ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
|
|
|
114
122
|
>
|
|
115
123
|
<WithDropDownMenuSeparators>
|
|
116
124
|
{ isSortable && (
|
|
117
|
-
<
|
|
125
|
+
<DropdownMenuV2.Group>
|
|
118
126
|
{ SORTING_DIRECTIONS.map(
|
|
119
127
|
( direction: SortDirection ) => {
|
|
120
128
|
const isChecked =
|
|
@@ -122,10 +130,10 @@ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
|
|
|
122
130
|
isSorted &&
|
|
123
131
|
view.sort.direction === direction;
|
|
124
132
|
|
|
125
|
-
const value = `${
|
|
133
|
+
const value = `${ fieldId }-${ direction }`;
|
|
126
134
|
|
|
127
135
|
return (
|
|
128
|
-
<
|
|
136
|
+
<DropdownMenuV2.RadioItem
|
|
129
137
|
key={ value }
|
|
130
138
|
// All sorting radio items share the same name, so that
|
|
131
139
|
// selecting a sorting option automatically deselects the
|
|
@@ -139,34 +147,34 @@ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
|
|
|
139
147
|
onChangeView( {
|
|
140
148
|
...view,
|
|
141
149
|
sort: {
|
|
142
|
-
field:
|
|
150
|
+
field: fieldId,
|
|
143
151
|
direction,
|
|
144
152
|
},
|
|
145
153
|
} );
|
|
146
154
|
} }
|
|
147
155
|
>
|
|
148
|
-
<
|
|
156
|
+
<DropdownMenuV2.ItemLabel>
|
|
149
157
|
{ sortLabels[ direction ] }
|
|
150
|
-
</
|
|
151
|
-
</
|
|
158
|
+
</DropdownMenuV2.ItemLabel>
|
|
159
|
+
</DropdownMenuV2.RadioItem>
|
|
152
160
|
);
|
|
153
161
|
}
|
|
154
162
|
) }
|
|
155
|
-
</
|
|
163
|
+
</DropdownMenuV2.Group>
|
|
156
164
|
) }
|
|
157
165
|
{ canAddFilter && (
|
|
158
|
-
<
|
|
159
|
-
<
|
|
166
|
+
<DropdownMenuV2.Group>
|
|
167
|
+
<DropdownMenuV2.Item
|
|
160
168
|
prefix={ <Icon icon={ funnel } /> }
|
|
161
169
|
onClick={ () => {
|
|
162
|
-
setOpenedFilter(
|
|
170
|
+
setOpenedFilter( fieldId );
|
|
163
171
|
onChangeView( {
|
|
164
172
|
...view,
|
|
165
173
|
page: 1,
|
|
166
174
|
filters: [
|
|
167
175
|
...( view.filters || [] ),
|
|
168
176
|
{
|
|
169
|
-
field:
|
|
177
|
+
field: fieldId,
|
|
170
178
|
value: undefined,
|
|
171
179
|
operator: operators[ 0 ],
|
|
172
180
|
},
|
|
@@ -174,86 +182,76 @@ const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
|
|
|
174
182
|
} );
|
|
175
183
|
} }
|
|
176
184
|
>
|
|
177
|
-
<
|
|
185
|
+
<DropdownMenuV2.ItemLabel>
|
|
178
186
|
{ __( 'Add filter' ) }
|
|
179
|
-
</
|
|
180
|
-
</
|
|
181
|
-
</
|
|
187
|
+
</DropdownMenuV2.ItemLabel>
|
|
188
|
+
</DropdownMenuV2.Item>
|
|
189
|
+
</DropdownMenuV2.Group>
|
|
182
190
|
) }
|
|
183
|
-
<
|
|
184
|
-
<
|
|
191
|
+
<DropdownMenuV2.Group>
|
|
192
|
+
<DropdownMenuV2.Item
|
|
185
193
|
prefix={ <Icon icon={ arrowLeft } /> }
|
|
186
194
|
disabled={ index < 1 }
|
|
187
195
|
onClick={ () => {
|
|
188
|
-
if ( ! view.fields || index < 1 ) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
196
|
onChangeView( {
|
|
192
197
|
...view,
|
|
193
198
|
fields: [
|
|
194
|
-
...(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
+
...( visibleFieldIds.slice(
|
|
200
|
+
0,
|
|
201
|
+
index - 1
|
|
202
|
+
) ?? [] ),
|
|
203
|
+
fieldId,
|
|
204
|
+
visibleFieldIds[ index - 1 ],
|
|
205
|
+
...visibleFieldIds.slice( index + 1 ),
|
|
199
206
|
],
|
|
200
207
|
} );
|
|
201
208
|
} }
|
|
202
209
|
>
|
|
203
|
-
<
|
|
210
|
+
<DropdownMenuV2.ItemLabel>
|
|
204
211
|
{ __( 'Move left' ) }
|
|
205
|
-
</
|
|
206
|
-
</
|
|
207
|
-
<
|
|
212
|
+
</DropdownMenuV2.ItemLabel>
|
|
213
|
+
</DropdownMenuV2.Item>
|
|
214
|
+
<DropdownMenuV2.Item
|
|
208
215
|
prefix={ <Icon icon={ arrowRight } /> }
|
|
209
|
-
disabled={
|
|
210
|
-
! view.fields || index >= view.fields.length - 1
|
|
211
|
-
}
|
|
216
|
+
disabled={ index >= visibleFieldIds.length - 1 }
|
|
212
217
|
onClick={ () => {
|
|
213
|
-
if (
|
|
214
|
-
! view.fields ||
|
|
215
|
-
index >= view.fields.length - 1
|
|
216
|
-
) {
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
218
|
onChangeView( {
|
|
220
219
|
...view,
|
|
221
220
|
fields: [
|
|
222
|
-
...(
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
221
|
+
...( visibleFieldIds.slice( 0, index ) ??
|
|
222
|
+
[] ),
|
|
223
|
+
visibleFieldIds[ index + 1 ],
|
|
224
|
+
fieldId,
|
|
225
|
+
...visibleFieldIds.slice( index + 2 ),
|
|
226
226
|
],
|
|
227
227
|
} );
|
|
228
228
|
} }
|
|
229
229
|
>
|
|
230
|
-
<
|
|
230
|
+
<DropdownMenuV2.ItemLabel>
|
|
231
231
|
{ __( 'Move right' ) }
|
|
232
|
-
</
|
|
233
|
-
</
|
|
234
|
-
{ isHidable && (
|
|
235
|
-
<
|
|
232
|
+
</DropdownMenuV2.ItemLabel>
|
|
233
|
+
</DropdownMenuV2.Item>
|
|
234
|
+
{ isHidable && field && (
|
|
235
|
+
<DropdownMenuV2.Item
|
|
236
236
|
prefix={ <Icon icon={ unseen } /> }
|
|
237
237
|
onClick={ () => {
|
|
238
|
-
const viewFields =
|
|
239
|
-
view.fields || fields.map( ( f ) => f.id );
|
|
240
238
|
onHide( field );
|
|
241
239
|
onChangeView( {
|
|
242
240
|
...view,
|
|
243
|
-
fields:
|
|
244
|
-
( id ) => id !==
|
|
241
|
+
fields: visibleFieldIds.filter(
|
|
242
|
+
( id ) => id !== fieldId
|
|
245
243
|
),
|
|
246
244
|
} );
|
|
247
245
|
} }
|
|
248
246
|
>
|
|
249
|
-
<
|
|
247
|
+
<DropdownMenuV2.ItemLabel>
|
|
250
248
|
{ __( 'Hide column' ) }
|
|
251
|
-
</
|
|
252
|
-
</
|
|
249
|
+
</DropdownMenuV2.ItemLabel>
|
|
250
|
+
</DropdownMenuV2.Item>
|
|
253
251
|
) }
|
|
254
|
-
</
|
|
252
|
+
</DropdownMenuV2.Group>
|
|
255
253
|
</WithDropDownMenuSeparators>
|
|
256
|
-
</
|
|
254
|
+
</DropdownMenuV2>
|
|
257
255
|
);
|
|
258
256
|
} );
|
|
259
257
|
|
|
@@ -8,18 +8,11 @@ import clsx from 'clsx';
|
|
|
8
8
|
*/
|
|
9
9
|
import { __ } from '@wordpress/i18n';
|
|
10
10
|
import {
|
|
11
|
-
CheckboxControl,
|
|
12
11
|
Spinner,
|
|
13
12
|
__experimentalHStack as HStack,
|
|
14
13
|
__experimentalVStack as VStack,
|
|
15
14
|
} from '@wordpress/components';
|
|
16
|
-
import {
|
|
17
|
-
useEffect,
|
|
18
|
-
useId,
|
|
19
|
-
useRef,
|
|
20
|
-
useState,
|
|
21
|
-
useMemo,
|
|
22
|
-
} from '@wordpress/element';
|
|
15
|
+
import { useEffect, useId, useRef, useState } from '@wordpress/element';
|
|
23
16
|
|
|
24
17
|
/**
|
|
25
18
|
* Internal dependencies
|
|
@@ -30,6 +23,7 @@ import { sortValues } from '../../constants';
|
|
|
30
23
|
import {
|
|
31
24
|
useSomeItemHasAPossibleBulkAction,
|
|
32
25
|
useHasAPossibleBulkAction,
|
|
26
|
+
BulkSelectionCheckbox,
|
|
33
27
|
} from '../../components/dataviews-bulk-actions';
|
|
34
28
|
import type {
|
|
35
29
|
Action,
|
|
@@ -40,14 +34,7 @@ import type {
|
|
|
40
34
|
} from '../../types';
|
|
41
35
|
import type { SetSelection } from '../../private-types';
|
|
42
36
|
import ColumnHeaderMenu from './column-header-menu';
|
|
43
|
-
|
|
44
|
-
interface BulkSelectionCheckboxProps< Item > {
|
|
45
|
-
selection: string[];
|
|
46
|
-
onChangeSelection: SetSelection;
|
|
47
|
-
data: Item[];
|
|
48
|
-
actions: Action< Item >[];
|
|
49
|
-
getItemId: ( item: Item ) => string;
|
|
50
|
-
}
|
|
37
|
+
import { getVisibleFieldIds } from '../index';
|
|
51
38
|
|
|
52
39
|
interface TableColumnFieldProps< Item > {
|
|
53
40
|
primaryField?: NormalizedField< Item >;
|
|
@@ -84,50 +71,6 @@ interface TableRowProps< Item > {
|
|
|
84
71
|
onChangeSelection: SetSelection;
|
|
85
72
|
}
|
|
86
73
|
|
|
87
|
-
function BulkSelectionCheckbox< Item >( {
|
|
88
|
-
selection,
|
|
89
|
-
onChangeSelection,
|
|
90
|
-
data,
|
|
91
|
-
actions,
|
|
92
|
-
getItemId,
|
|
93
|
-
}: BulkSelectionCheckboxProps< Item > ) {
|
|
94
|
-
const selectableItems = useMemo( () => {
|
|
95
|
-
return data.filter( ( item ) => {
|
|
96
|
-
return actions.some(
|
|
97
|
-
( action ) =>
|
|
98
|
-
action.supportsBulk &&
|
|
99
|
-
( ! action.isEligible || action.isEligible( item ) )
|
|
100
|
-
);
|
|
101
|
-
} );
|
|
102
|
-
}, [ data, actions ] );
|
|
103
|
-
const selectedItems = data.filter(
|
|
104
|
-
( item ) =>
|
|
105
|
-
selection.includes( getItemId( item ) ) &&
|
|
106
|
-
selectableItems.includes( item )
|
|
107
|
-
);
|
|
108
|
-
const areAllSelected = selectedItems.length === selectableItems.length;
|
|
109
|
-
return (
|
|
110
|
-
<CheckboxControl
|
|
111
|
-
className="dataviews-view-table-selection-checkbox"
|
|
112
|
-
__nextHasNoMarginBottom
|
|
113
|
-
checked={ areAllSelected }
|
|
114
|
-
indeterminate={ ! areAllSelected && !! selectedItems.length }
|
|
115
|
-
onChange={ () => {
|
|
116
|
-
if ( areAllSelected ) {
|
|
117
|
-
onChangeSelection( [] );
|
|
118
|
-
} else {
|
|
119
|
-
onChangeSelection(
|
|
120
|
-
selectableItems.map( ( item ) => getItemId( item ) )
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
} }
|
|
124
|
-
aria-label={
|
|
125
|
-
areAllSelected ? __( 'Deselect all' ) : __( 'Select all' )
|
|
126
|
-
}
|
|
127
|
-
/>
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
74
|
function TableColumn< Item >( {
|
|
132
75
|
column,
|
|
133
76
|
fields,
|
|
@@ -212,8 +155,8 @@ function TableRow< Item >( {
|
|
|
212
155
|
// Will be set to true if `onTouchStart` fires. This happens before
|
|
213
156
|
// `onClick` and can be used to exclude touchscreen devices from certain
|
|
214
157
|
// behaviours.
|
|
215
|
-
const
|
|
216
|
-
const columns = view
|
|
158
|
+
const isTouchDeviceRef = useRef( false );
|
|
159
|
+
const columns = getVisibleFieldIds( view, fields );
|
|
217
160
|
|
|
218
161
|
return (
|
|
219
162
|
<tr
|
|
@@ -225,14 +168,14 @@ function TableRow< Item >( {
|
|
|
225
168
|
onMouseEnter={ handleMouseEnter }
|
|
226
169
|
onMouseLeave={ handleMouseLeave }
|
|
227
170
|
onTouchStart={ () => {
|
|
228
|
-
|
|
171
|
+
isTouchDeviceRef.current = true;
|
|
229
172
|
} }
|
|
230
173
|
onClick={ () => {
|
|
231
174
|
if ( ! hasPossibleBulkAction ) {
|
|
232
175
|
return;
|
|
233
176
|
}
|
|
234
177
|
if (
|
|
235
|
-
!
|
|
178
|
+
! isTouchDeviceRef.current &&
|
|
236
179
|
document.getSelection()?.type !== 'Range'
|
|
237
180
|
) {
|
|
238
181
|
onChangeSelection(
|
|
@@ -346,7 +289,7 @@ function ViewTable< Item >( {
|
|
|
346
289
|
setNextHeaderMenuToFocus( fallback?.node );
|
|
347
290
|
};
|
|
348
291
|
|
|
349
|
-
const columns = view
|
|
292
|
+
const columns = getVisibleFieldIds( view, fields );
|
|
350
293
|
const hasData = !! data?.length;
|
|
351
294
|
|
|
352
295
|
const primaryField = fields.find(
|
package/src/normalize-fields.ts
CHANGED
package/src/style.scss
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
@import "./components/dataviews/style.scss";
|
|
2
2
|
@import "./components/dataviews-bulk-actions/style.scss";
|
|
3
|
-
@import "./components/dataviews-bulk-actions-toolbar/style.scss";
|
|
4
3
|
@import "./components/dataviews-filters/style.scss";
|
|
4
|
+
@import "./components/dataviews-footer/style.scss";
|
|
5
5
|
@import "./components/dataviews-pagination/style.scss";
|
|
6
6
|
@import "./components/dataviews-item-actions/style.scss";
|
|
7
7
|
@import "./components/dataviews-selection-checkbox/style.scss";
|
package/src/types.ts
CHANGED
|
@@ -163,6 +163,8 @@ export type NormalizedField< Item > = Field< Item > & {
|
|
|
163
163
|
Edit: ComponentType< DataFormControlProps< Item > >;
|
|
164
164
|
sort: ( a: Item, b: Item, direction: SortDirection ) => number;
|
|
165
165
|
isValid: ( item: Item, context?: ValidationContext ) => boolean;
|
|
166
|
+
enableHiding: boolean;
|
|
167
|
+
enableSorting: boolean;
|
|
166
168
|
};
|
|
167
169
|
|
|
168
170
|
/**
|