@wordpress/dataviews 1.0.0 → 1.2.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 +13 -5
- package/build/bulk-actions-toolbar.js +182 -0
- package/build/bulk-actions-toolbar.js.map +1 -0
- package/build/bulk-actions.js +8 -8
- 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 +13 -5
- package/build/dataviews.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 +3 -3
- package/build/filter-summary.js.map +1 -1
- package/build/index.js +2 -2
- package/build/index.js.map +1 -1
- package/build/item-actions.js +41 -22
- 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 +13 -7
- package/build/pagination.js.map +1 -1
- package/build/single-selection-checkbox.js +4 -0
- package/build/single-selection-checkbox.js.map +1 -1
- package/build/types.js +6 -0
- package/build/types.js.map +1 -0
- package/build/view-actions.js +2 -1
- package/build/view-actions.js.map +1 -1
- package/build/view-grid.js +9 -10
- package/build/view-grid.js.map +1 -1
- package/build/view-list.js +134 -21
- package/build/view-list.js.map +1 -1
- package/build/view-table.js +9 -9
- package/build/view-table.js.map +1 -1
- package/build-module/bulk-actions-toolbar.js +175 -0
- package/build-module/bulk-actions-toolbar.js.map +1 -0
- package/build-module/bulk-actions.js +8 -8
- 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 +13 -5
- package/build-module/dataviews.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 -3
- package/build-module/filter-summary.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 +40 -24
- 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 +14 -7
- package/build-module/pagination.js.map +1 -1
- package/build-module/single-selection-checkbox.js +5 -0
- 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/view-actions.js +2 -1
- package/build-module/view-actions.js.map +1 -1
- package/build-module/view-grid.js +9 -10
- package/build-module/view-grid.js.map +1 -1
- package/build-module/view-list.js +135 -23
- package/build-module/view-list.js.map +1 -1
- package/build-module/view-table.js +9 -9
- package/build-module/view-table.js.map +1 -1
- package/build-style/style-rtl.css +82 -44
- package/build-style/style.css +82 -44
- package/build-types/add-filter.d.ts +8 -0
- package/build-types/add-filter.d.ts.map +1 -0
- package/build-types/bulk-actions-toolbar.d.ts +8 -0
- package/build-types/bulk-actions-toolbar.d.ts.map +1 -0
- package/build-types/bulk-actions.d.ts +14 -0
- package/build-types/bulk-actions.d.ts.map +1 -0
- package/build-types/constants.d.ts +45 -0
- package/build-types/constants.d.ts.map +1 -0
- package/build-types/dataviews.d.ts +15 -0
- package/build-types/dataviews.d.ts.map +1 -0
- package/build-types/dropdown-menu-helper.d.ts +6 -0
- package/build-types/dropdown-menu-helper.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/filter-summary.d.ts +6 -0
- package/build-types/filter-summary.d.ts.map +1 -0
- package/build-types/filters.d.ts +3 -0
- package/build-types/filters.d.ts.map +1 -0
- package/build-types/index.d.ts +4 -0
- package/build-types/index.d.ts.map +1 -0
- package/build-types/item-actions.d.ts +37 -0
- package/build-types/item-actions.d.ts.map +1 -0
- package/build-types/layouts.d.ts +20 -0
- package/build-types/layouts.d.ts.map +1 -0
- package/build-types/lock-unlock.d.ts +2 -0
- package/build-types/lock-unlock.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/pagination.d.ts +16 -0
- package/build-types/pagination.d.ts.map +1 -0
- package/build-types/reset-filters.d.ts +6 -0
- package/build-types/reset-filters.d.ts.map +1 -0
- package/build-types/search-widget.d.ts +2 -0
- package/build-types/search-widget.d.ts.map +1 -0
- package/build-types/search.d.ts +3 -0
- package/build-types/search.d.ts.map +1 -0
- package/build-types/single-selection-checkbox.d.ts +17 -0
- package/build-types/single-selection-checkbox.d.ts.map +1 -0
- package/build-types/stories/fixtures.d.ts +114 -0
- package/build-types/stories/fixtures.d.ts.map +1 -0
- package/build-types/stories/index.story.d.ts +15 -0
- package/build-types/stories/index.story.d.ts.map +1 -0
- package/build-types/types.d.ts +254 -0
- package/build-types/types.d.ts.map +1 -0
- package/build-types/utils.d.ts +2 -0
- package/build-types/utils.d.ts.map +1 -0
- package/build-types/view-actions.d.ts +3 -0
- package/build-types/view-actions.d.ts.map +1 -0
- package/build-types/view-grid.d.ts +15 -0
- package/build-types/view-grid.d.ts.map +1 -0
- package/build-types/view-list.d.ts +16 -0
- package/build-types/view-list.d.ts.map +1 -0
- package/build-types/view-table.d.ts +14 -0
- package/build-types/view-table.d.ts.map +1 -0
- package/package.json +12 -12
- package/src/bulk-actions-toolbar.js +244 -0
- package/src/{bulk-actions.js → bulk-actions.tsx} +73 -17
- package/src/{constants.js → constants.ts} +1 -35
- package/src/dataviews.js +16 -4
- package/src/filter-and-sort-data-view.ts +169 -0
- package/src/filter-summary.js +3 -3
- package/src/index.js +1 -1
- package/src/{item-actions.js → item-actions.tsx} +112 -28
- package/src/layouts.js +39 -0
- package/src/normalize-fields.ts +25 -0
- package/src/{pagination.js → pagination.tsx} +28 -7
- package/src/{single-selection-checkbox.js → single-selection-checkbox.tsx} +17 -2
- package/src/stories/fixtures.js +0 -2
- package/src/style.scss +100 -44
- package/src/types.ts +314 -0
- package/src/view-actions.js +2 -1
- package/src/{view-grid.js → view-grid.tsx} +45 -16
- package/src/view-list.tsx +421 -0
- package/src/view-table.js +8 -8
- package/tsconfig.json +22 -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/view-list.js +0 -207
- /package/src/{lock-unlock.js → lock-unlock.ts} +0 -0
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import type { MouseEventHandler, ReactElement } from 'react';
|
|
5
|
+
|
|
1
6
|
/**
|
|
2
7
|
* WordPress dependencies
|
|
3
8
|
*/
|
|
@@ -15,6 +20,7 @@ import { moreVertical } from '@wordpress/icons';
|
|
|
15
20
|
* Internal dependencies
|
|
16
21
|
*/
|
|
17
22
|
import { unlock } from './lock-unlock';
|
|
23
|
+
import type { Action, ActionModal as ActionModalType, AnyItem } from './types';
|
|
18
24
|
|
|
19
25
|
const {
|
|
20
26
|
DropdownMenuV2: DropdownMenu,
|
|
@@ -24,7 +30,50 @@ const {
|
|
|
24
30
|
kebabCase,
|
|
25
31
|
} = unlock( componentsPrivateApis );
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
interface ButtonTriggerProps< Item extends AnyItem > {
|
|
34
|
+
action: Action< Item >;
|
|
35
|
+
onClick: MouseEventHandler;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface DropdownMenuItemTriggerProps< Item extends AnyItem > {
|
|
39
|
+
action: Action< Item >;
|
|
40
|
+
onClick: MouseEventHandler;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface ActionModalProps< Item extends AnyItem > {
|
|
44
|
+
action: ActionModalType< Item >;
|
|
45
|
+
items: Item[];
|
|
46
|
+
closeModal?: () => void;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface ActionWithModalProps< Item extends AnyItem >
|
|
50
|
+
extends ActionModalProps< Item > {
|
|
51
|
+
ActionTrigger: (
|
|
52
|
+
props: ButtonTriggerProps< Item > | DropdownMenuItemTriggerProps< Item >
|
|
53
|
+
) => ReactElement;
|
|
54
|
+
isBusy?: boolean;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface ActionsDropdownMenuGroupProps< Item extends AnyItem > {
|
|
58
|
+
actions: Action< Item >[];
|
|
59
|
+
item: Item;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface ItemActionsProps< Item extends AnyItem > {
|
|
63
|
+
item: Item;
|
|
64
|
+
actions: Action< Item >[];
|
|
65
|
+
isCompact: boolean;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
interface CompactItemActionsProps< Item extends AnyItem > {
|
|
69
|
+
item: Item;
|
|
70
|
+
actions: Action< Item >[];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function ButtonTrigger< Item extends AnyItem >( {
|
|
74
|
+
action,
|
|
75
|
+
onClick,
|
|
76
|
+
}: ButtonTriggerProps< Item > ) {
|
|
28
77
|
return (
|
|
29
78
|
<Button
|
|
30
79
|
label={ action.label }
|
|
@@ -36,58 +85,86 @@ function ButtonTrigger( { action, onClick } ) {
|
|
|
36
85
|
);
|
|
37
86
|
}
|
|
38
87
|
|
|
39
|
-
function DropdownMenuItemTrigger
|
|
88
|
+
function DropdownMenuItemTrigger< Item extends AnyItem >( {
|
|
89
|
+
action,
|
|
90
|
+
onClick,
|
|
91
|
+
}: DropdownMenuItemTriggerProps< Item > ) {
|
|
40
92
|
return (
|
|
41
93
|
<DropdownMenuItem
|
|
42
94
|
onClick={ onClick }
|
|
43
|
-
hideOnClick={ !
|
|
95
|
+
hideOnClick={ ! ( 'RenderModal' in action ) }
|
|
44
96
|
>
|
|
45
97
|
<DropdownMenuItemLabel>{ action.label }</DropdownMenuItemLabel>
|
|
46
98
|
</DropdownMenuItem>
|
|
47
99
|
);
|
|
48
100
|
}
|
|
49
101
|
|
|
50
|
-
function
|
|
102
|
+
export function ActionModal< Item extends AnyItem >( {
|
|
103
|
+
action,
|
|
104
|
+
items,
|
|
105
|
+
closeModal,
|
|
106
|
+
}: ActionModalProps< Item > ) {
|
|
107
|
+
return (
|
|
108
|
+
<Modal
|
|
109
|
+
title={ action.modalHeader || action.label }
|
|
110
|
+
__experimentalHideHeader={ !! action.hideModalHeader }
|
|
111
|
+
onRequestClose={ closeModal ?? ( () => {} ) }
|
|
112
|
+
overlayClassName={ `dataviews-action-modal dataviews-action-modal__${ kebabCase(
|
|
113
|
+
action.id
|
|
114
|
+
) }` }
|
|
115
|
+
>
|
|
116
|
+
<action.RenderModal
|
|
117
|
+
items={ items }
|
|
118
|
+
closeModal={ closeModal }
|
|
119
|
+
onActionStart={ action.onActionStart }
|
|
120
|
+
onActionPerformed={ action.onActionPerformed }
|
|
121
|
+
/>
|
|
122
|
+
</Modal>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function ActionWithModal< Item extends AnyItem >( {
|
|
127
|
+
action,
|
|
128
|
+
items,
|
|
129
|
+
ActionTrigger,
|
|
130
|
+
isBusy,
|
|
131
|
+
}: ActionWithModalProps< Item > ) {
|
|
51
132
|
const [ isModalOpen, setIsModalOpen ] = useState( false );
|
|
52
133
|
const actionTriggerProps = {
|
|
53
134
|
action,
|
|
54
|
-
onClick: () =>
|
|
135
|
+
onClick: () => {
|
|
136
|
+
setIsModalOpen( true );
|
|
137
|
+
},
|
|
138
|
+
items,
|
|
139
|
+
isBusy,
|
|
55
140
|
};
|
|
56
|
-
const { RenderModal, hideModalHeader } = action;
|
|
57
141
|
return (
|
|
58
142
|
<>
|
|
59
143
|
<ActionTrigger { ...actionTriggerProps } />
|
|
60
144
|
{ isModalOpen && (
|
|
61
|
-
<
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
} }
|
|
67
|
-
overlayClassName={ `dataviews-action-modal dataviews-action-modal__${ kebabCase(
|
|
68
|
-
action.id
|
|
69
|
-
) }` }
|
|
70
|
-
>
|
|
71
|
-
<RenderModal
|
|
72
|
-
items={ [ item ] }
|
|
73
|
-
closeModal={ () => setIsModalOpen( false ) }
|
|
74
|
-
/>
|
|
75
|
-
</Modal>
|
|
145
|
+
<ActionModal
|
|
146
|
+
action={ action }
|
|
147
|
+
items={ items }
|
|
148
|
+
closeModal={ () => setIsModalOpen( false ) }
|
|
149
|
+
/>
|
|
76
150
|
) }
|
|
77
151
|
</>
|
|
78
152
|
);
|
|
79
153
|
}
|
|
80
154
|
|
|
81
|
-
function ActionsDropdownMenuGroup
|
|
155
|
+
export function ActionsDropdownMenuGroup< Item extends AnyItem >( {
|
|
156
|
+
actions,
|
|
157
|
+
item,
|
|
158
|
+
}: ActionsDropdownMenuGroupProps< Item > ) {
|
|
82
159
|
return (
|
|
83
160
|
<DropdownMenuGroup>
|
|
84
161
|
{ actions.map( ( action ) => {
|
|
85
|
-
if (
|
|
162
|
+
if ( 'RenderModal' in action ) {
|
|
86
163
|
return (
|
|
87
164
|
<ActionWithModal
|
|
88
165
|
key={ action.id }
|
|
89
166
|
action={ action }
|
|
90
|
-
|
|
167
|
+
items={ [ item ] }
|
|
91
168
|
ActionTrigger={ DropdownMenuItemTrigger }
|
|
92
169
|
/>
|
|
93
170
|
);
|
|
@@ -104,7 +181,11 @@ function ActionsDropdownMenuGroup( { actions, item } ) {
|
|
|
104
181
|
);
|
|
105
182
|
}
|
|
106
183
|
|
|
107
|
-
export default function ItemActions
|
|
184
|
+
export default function ItemActions< Item extends AnyItem >( {
|
|
185
|
+
item,
|
|
186
|
+
actions,
|
|
187
|
+
isCompact,
|
|
188
|
+
}: ItemActionsProps< Item > ) {
|
|
108
189
|
const { primaryActions, eligibleActions } = useMemo( () => {
|
|
109
190
|
// If an action is eligible for all items, doesn't need
|
|
110
191
|
// to provide the `isEligible` function.
|
|
@@ -134,12 +215,12 @@ export default function ItemActions( { item, actions, isCompact } ) {
|
|
|
134
215
|
>
|
|
135
216
|
{ !! primaryActions.length &&
|
|
136
217
|
primaryActions.map( ( action ) => {
|
|
137
|
-
if (
|
|
218
|
+
if ( 'RenderModal' in action ) {
|
|
138
219
|
return (
|
|
139
220
|
<ActionWithModal
|
|
140
221
|
key={ action.id }
|
|
141
222
|
action={ action }
|
|
142
|
-
|
|
223
|
+
items={ [ item ] }
|
|
143
224
|
ActionTrigger={ ButtonTrigger }
|
|
144
225
|
/>
|
|
145
226
|
);
|
|
@@ -157,7 +238,10 @@ export default function ItemActions( { item, actions, isCompact } ) {
|
|
|
157
238
|
);
|
|
158
239
|
}
|
|
159
240
|
|
|
160
|
-
function CompactItemActions
|
|
241
|
+
function CompactItemActions< Item extends AnyItem >( {
|
|
242
|
+
item,
|
|
243
|
+
actions,
|
|
244
|
+
}: CompactItemActionsProps< Item > ) {
|
|
161
245
|
return (
|
|
162
246
|
<DropdownMenu
|
|
163
247
|
trigger={
|
package/src/layouts.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { __, isRTL } from '@wordpress/i18n';
|
|
5
|
+
import {
|
|
6
|
+
blockTable,
|
|
7
|
+
category,
|
|
8
|
+
formatListBullets,
|
|
9
|
+
formatListBulletsRTL,
|
|
10
|
+
} from '@wordpress/icons';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Internal dependencies
|
|
14
|
+
*/
|
|
15
|
+
import ViewTable from './view-table';
|
|
16
|
+
import ViewGrid from './view-grid';
|
|
17
|
+
import ViewList from './view-list';
|
|
18
|
+
import { LAYOUT_GRID, LAYOUT_LIST, LAYOUT_TABLE } from './constants';
|
|
19
|
+
|
|
20
|
+
export const VIEW_LAYOUTS = [
|
|
21
|
+
{
|
|
22
|
+
type: LAYOUT_TABLE,
|
|
23
|
+
label: __( 'Table' ),
|
|
24
|
+
component: ViewTable,
|
|
25
|
+
icon: blockTable,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
type: LAYOUT_GRID,
|
|
29
|
+
label: __( 'Grid' ),
|
|
30
|
+
component: ViewGrid,
|
|
31
|
+
icon: category,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
type: LAYOUT_LIST,
|
|
35
|
+
label: __( 'List' ),
|
|
36
|
+
component: ViewList,
|
|
37
|
+
icon: isRTL() ? formatListBulletsRTL : formatListBullets,
|
|
38
|
+
},
|
|
39
|
+
];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal dependencies
|
|
3
|
+
*/
|
|
4
|
+
import type { Field, AnyItem, NormalizedField } from './types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Apply default values and normalize the fields config.
|
|
8
|
+
*
|
|
9
|
+
* @param fields Fields config.
|
|
10
|
+
* @return Normalized fields config.
|
|
11
|
+
*/
|
|
12
|
+
export function normalizeFields< Item extends AnyItem >(
|
|
13
|
+
fields: Field< Item >[]
|
|
14
|
+
): NormalizedField< Item >[] {
|
|
15
|
+
return fields.map( ( field ) => {
|
|
16
|
+
const getValue = field.getValue || ( ( { item } ) => item[ field.id ] );
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
...field,
|
|
20
|
+
header: field.header || field.id,
|
|
21
|
+
getValue,
|
|
22
|
+
render: field.render || getValue,
|
|
23
|
+
};
|
|
24
|
+
} );
|
|
25
|
+
}
|
|
@@ -10,14 +10,29 @@ import { createInterpolateElement, memo } from '@wordpress/element';
|
|
|
10
10
|
import { sprintf, __, _x } from '@wordpress/i18n';
|
|
11
11
|
import { chevronRight, chevronLeft } from '@wordpress/icons';
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Internal dependencies
|
|
15
|
+
*/
|
|
16
|
+
import type { View } from './types';
|
|
17
|
+
|
|
18
|
+
interface PaginationProps {
|
|
19
|
+
view: View;
|
|
20
|
+
onChangeView: ( view: View ) => void;
|
|
21
|
+
paginationInfo: {
|
|
22
|
+
totalItems: number;
|
|
23
|
+
totalPages: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
13
27
|
const Pagination = memo( function Pagination( {
|
|
14
28
|
view,
|
|
15
29
|
onChangeView,
|
|
16
30
|
paginationInfo: { totalItems = 0, totalPages },
|
|
17
|
-
} ) {
|
|
31
|
+
}: PaginationProps ) {
|
|
18
32
|
if ( ! totalItems || ! totalPages ) {
|
|
19
33
|
return null;
|
|
20
34
|
}
|
|
35
|
+
const currentPage = view.page ?? 1;
|
|
21
36
|
return (
|
|
22
37
|
!! totalItems &&
|
|
23
38
|
totalPages !== 1 && (
|
|
@@ -43,12 +58,15 @@ const Pagination = memo( function Pagination( {
|
|
|
43
58
|
CurrentPageControl: (
|
|
44
59
|
<SelectControl
|
|
45
60
|
aria-label={ __( 'Current page' ) }
|
|
46
|
-
value={ view.page }
|
|
61
|
+
value={ view.page?.toString() }
|
|
47
62
|
options={ Array.from(
|
|
48
63
|
Array( totalPages )
|
|
49
64
|
).map( ( _, i ) => {
|
|
50
65
|
const page = i + 1;
|
|
51
|
-
return {
|
|
66
|
+
return {
|
|
67
|
+
value: page.toString(),
|
|
68
|
+
label: page.toString(),
|
|
69
|
+
};
|
|
52
70
|
} ) }
|
|
53
71
|
onChange={ ( newValue ) => {
|
|
54
72
|
onChangeView( {
|
|
@@ -66,9 +84,12 @@ const Pagination = memo( function Pagination( {
|
|
|
66
84
|
<HStack expanded={ false } spacing={ 1 }>
|
|
67
85
|
<Button
|
|
68
86
|
onClick={ () =>
|
|
69
|
-
onChangeView( {
|
|
87
|
+
onChangeView( {
|
|
88
|
+
...view,
|
|
89
|
+
page: currentPage - 1,
|
|
90
|
+
} )
|
|
70
91
|
}
|
|
71
|
-
disabled={
|
|
92
|
+
disabled={ currentPage === 1 }
|
|
72
93
|
__experimentalIsFocusable
|
|
73
94
|
label={ __( 'Previous page' ) }
|
|
74
95
|
icon={ chevronLeft }
|
|
@@ -78,9 +99,9 @@ const Pagination = memo( function Pagination( {
|
|
|
78
99
|
/>
|
|
79
100
|
<Button
|
|
80
101
|
onClick={ () =>
|
|
81
|
-
onChangeView( { ...view, page:
|
|
102
|
+
onChangeView( { ...view, page: currentPage + 1 } )
|
|
82
103
|
}
|
|
83
|
-
disabled={
|
|
104
|
+
disabled={ currentPage >= totalPages }
|
|
84
105
|
__experimentalIsFocusable
|
|
85
106
|
label={ __( 'Next page' ) }
|
|
86
107
|
icon={ chevronRight }
|
|
@@ -4,7 +4,22 @@
|
|
|
4
4
|
import { __, sprintf } from '@wordpress/i18n';
|
|
5
5
|
import { CheckboxControl } from '@wordpress/components';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Internal dependencies
|
|
9
|
+
*/
|
|
10
|
+
import type { Field, AnyItem } from './types';
|
|
11
|
+
|
|
12
|
+
interface SingleSelectionCheckboxProps< Item extends AnyItem > {
|
|
13
|
+
selection: string[];
|
|
14
|
+
onSelectionChange: ( selection: Item[] ) => void;
|
|
15
|
+
item: Item;
|
|
16
|
+
data: Item[];
|
|
17
|
+
getItemId: ( item: Item ) => string;
|
|
18
|
+
primaryField?: Field< Item >;
|
|
19
|
+
disabled: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default function SingleSelectionCheckbox< Item extends AnyItem >( {
|
|
8
23
|
selection,
|
|
9
24
|
onSelectionChange,
|
|
10
25
|
item,
|
|
@@ -12,7 +27,7 @@ export default function SingleSelectionCheckbox( {
|
|
|
12
27
|
getItemId,
|
|
13
28
|
primaryField,
|
|
14
29
|
disabled,
|
|
15
|
-
} ) {
|
|
30
|
+
}: SingleSelectionCheckboxProps< Item > ) {
|
|
16
31
|
const id = getItemId( item );
|
|
17
32
|
const isSelected = selection.includes( id );
|
|
18
33
|
let selectionLabel;
|
package/src/stories/fixtures.js
CHANGED
|
@@ -171,7 +171,6 @@ export const fields = [
|
|
|
171
171
|
id: 'type',
|
|
172
172
|
maxWidth: 400,
|
|
173
173
|
enableHiding: false,
|
|
174
|
-
type: 'enumeration',
|
|
175
174
|
elements: [
|
|
176
175
|
{ value: 'Not a planet', label: 'Not a planet' },
|
|
177
176
|
{ value: 'Ice giant', label: 'Ice giant' },
|
|
@@ -189,7 +188,6 @@ export const fields = [
|
|
|
189
188
|
{
|
|
190
189
|
header: 'Categories',
|
|
191
190
|
id: 'categories',
|
|
192
|
-
type: 'enumeration',
|
|
193
191
|
elements: [
|
|
194
192
|
{ value: 'Space', label: 'Space' },
|
|
195
193
|
{ value: 'NASA', label: 'NASA' },
|
package/src/style.scss
CHANGED
|
@@ -292,25 +292,26 @@
|
|
|
292
292
|
}
|
|
293
293
|
|
|
294
294
|
.dataviews-view-grid__card {
|
|
295
|
-
border-radius: $radius-block-ui * 2;
|
|
296
|
-
border: 1px solid $gray-200;
|
|
297
295
|
height: 100%;
|
|
298
296
|
justify-content: flex-start;
|
|
299
297
|
|
|
300
298
|
.dataviews-view-grid__title-actions {
|
|
301
|
-
padding: $grid-unit-
|
|
299
|
+
padding: $grid-unit-10 0 $grid-unit-05;
|
|
302
300
|
}
|
|
303
301
|
|
|
304
302
|
.dataviews-view-grid__primary-field {
|
|
305
|
-
min-height: $grid-unit-
|
|
303
|
+
min-height: $grid-unit-40; // Preserve layout when there is no ellipsis button
|
|
306
304
|
}
|
|
307
|
-
&.is-selected {
|
|
308
|
-
border-color: var(--wp-admin-theme-color);
|
|
309
|
-
background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
|
|
310
305
|
|
|
306
|
+
&.is-selected {
|
|
311
307
|
.dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value {
|
|
312
308
|
color: $gray-900;
|
|
313
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
|
+
}
|
|
314
315
|
}
|
|
315
316
|
}
|
|
316
317
|
|
|
@@ -318,15 +319,28 @@
|
|
|
318
319
|
width: 100%;
|
|
319
320
|
min-height: 200px;
|
|
320
321
|
aspect-ratio: 1/1;
|
|
321
|
-
border-bottom: 1px solid $gray-200;
|
|
322
322
|
background-color: $gray-100;
|
|
323
|
-
border-radius:
|
|
323
|
+
border-radius: $grid-unit-05;
|
|
324
|
+
overflow: hidden;
|
|
325
|
+
position: relative;
|
|
324
326
|
|
|
325
327
|
img {
|
|
326
328
|
object-fit: cover;
|
|
327
329
|
width: 100%;
|
|
328
330
|
height: 100%;
|
|
329
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
|
+
pointer-events: none;
|
|
343
|
+
}
|
|
330
344
|
}
|
|
331
345
|
|
|
332
346
|
.dataviews-view-grid__fields {
|
|
@@ -337,7 +351,6 @@
|
|
|
337
351
|
&:not(:empty) {
|
|
338
352
|
padding: $grid-unit-15 0;
|
|
339
353
|
padding-top: 0;
|
|
340
|
-
margin: 0 $grid-unit-15;
|
|
341
354
|
}
|
|
342
355
|
|
|
343
356
|
.dataviews-view-grid__field {
|
|
@@ -366,8 +379,7 @@
|
|
|
366
379
|
|
|
367
380
|
.dataviews-view-grid__badge-fields {
|
|
368
381
|
&:not(:empty) {
|
|
369
|
-
padding: $grid-unit-15;
|
|
370
|
-
padding-top: 0;
|
|
382
|
+
padding-bottom: $grid-unit-15;
|
|
371
383
|
}
|
|
372
384
|
|
|
373
385
|
.dataviews-view-grid__field-value {
|
|
@@ -385,32 +397,33 @@
|
|
|
385
397
|
|
|
386
398
|
.dataviews-view-list {
|
|
387
399
|
margin: 0;
|
|
388
|
-
padding: $grid-unit-10;
|
|
389
400
|
|
|
390
401
|
li {
|
|
391
402
|
margin: 0;
|
|
392
403
|
cursor: pointer;
|
|
404
|
+
border-top: 1px solid $gray-100;
|
|
393
405
|
|
|
394
406
|
.dataviews-view-list__item-wrapper {
|
|
395
407
|
position: relative;
|
|
396
|
-
padding-right: $grid-unit-30;
|
|
397
408
|
border-radius: $grid-unit-05;
|
|
398
409
|
|
|
399
|
-
&::after {
|
|
400
|
-
position: absolute;
|
|
401
|
-
content: "";
|
|
402
|
-
top: 100%;
|
|
403
|
-
left: $grid-unit-30;
|
|
404
|
-
right: $grid-unit-30;
|
|
405
|
-
background: $gray-100;
|
|
406
|
-
height: 1px;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
410
|
> * {
|
|
410
411
|
width: 100%;
|
|
411
412
|
}
|
|
412
413
|
}
|
|
413
414
|
|
|
415
|
+
.dataviews-view-list__item-actions .components-button {
|
|
416
|
+
opacity: 0;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
&.is-selected,
|
|
420
|
+
&.is-hovered,
|
|
421
|
+
&:focus-within {
|
|
422
|
+
.dataviews-view-list__item-actions .components-button {
|
|
423
|
+
opacity: 1;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
414
427
|
&:not(.is-selected) {
|
|
415
428
|
.dataviews-view-list__primary-field {
|
|
416
429
|
color: $gray-900;
|
|
@@ -418,6 +431,7 @@
|
|
|
418
431
|
&:hover,
|
|
419
432
|
&:focus-within {
|
|
420
433
|
color: var(--wp-admin-theme-color);
|
|
434
|
+
background-color: #f8f8f8;
|
|
421
435
|
|
|
422
436
|
.dataviews-view-list__primary-field,
|
|
423
437
|
.dataviews-view-list__fields {
|
|
@@ -425,28 +439,25 @@
|
|
|
425
439
|
}
|
|
426
440
|
}
|
|
427
441
|
}
|
|
442
|
+
|
|
428
443
|
}
|
|
429
444
|
|
|
430
445
|
li.is-selected,
|
|
431
446
|
li.is-selected:focus-within {
|
|
432
447
|
.dataviews-view-list__item-wrapper {
|
|
433
|
-
background-color: var(--wp-admin-theme-color);
|
|
434
|
-
color: $
|
|
448
|
+
background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
|
|
449
|
+
color: $gray-900;
|
|
435
450
|
|
|
436
451
|
.dataviews-view-list__primary-field,
|
|
437
452
|
.dataviews-view-list__fields,
|
|
438
453
|
.components-button {
|
|
439
|
-
color:
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
&::after {
|
|
443
|
-
background: transparent;
|
|
454
|
+
color: var(--wp-admin-theme-color);
|
|
444
455
|
}
|
|
445
456
|
}
|
|
446
457
|
}
|
|
447
458
|
|
|
448
459
|
.dataviews-view-list__item {
|
|
449
|
-
padding: $grid-unit-
|
|
460
|
+
padding: $grid-unit-20 0 $grid-unit-20 $grid-unit-40;
|
|
450
461
|
width: 100%;
|
|
451
462
|
scroll-margin: $grid-unit-10 0;
|
|
452
463
|
|
|
@@ -454,13 +465,12 @@
|
|
|
454
465
|
&::before {
|
|
455
466
|
position: absolute;
|
|
456
467
|
content: "";
|
|
457
|
-
top: -1px;
|
|
458
|
-
right: -
|
|
459
|
-
bottom: -
|
|
460
|
-
left: -
|
|
461
|
-
box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
|
|
462
|
-
|
|
463
|
-
border-radius: $grid-unit-05;
|
|
468
|
+
top: calc(var(--wp-admin-border-width-focus) + 1px);
|
|
469
|
+
right: var(--wp-admin-border-width-focus);
|
|
470
|
+
bottom: var(--wp-admin-border-width-focus);
|
|
471
|
+
left: var(--wp-admin-border-width-focus);
|
|
472
|
+
box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
|
|
473
|
+
border-radius: $radius-block-ui;
|
|
464
474
|
}
|
|
465
475
|
}
|
|
466
476
|
.dataviews-view-list__primary-field {
|
|
@@ -472,11 +482,11 @@
|
|
|
472
482
|
.dataviews-view-list__media-wrapper {
|
|
473
483
|
width: $grid-unit-50;
|
|
474
484
|
height: $grid-unit-50;
|
|
475
|
-
border-radius: $grid-unit-05;
|
|
476
485
|
overflow: hidden;
|
|
477
486
|
position: relative;
|
|
478
487
|
flex-shrink: 0;
|
|
479
488
|
background-color: $gray-100;
|
|
489
|
+
border-radius: $grid-unit-05;
|
|
480
490
|
|
|
481
491
|
img {
|
|
482
492
|
width: 100%;
|
|
@@ -517,6 +527,11 @@
|
|
|
517
527
|
}
|
|
518
528
|
}
|
|
519
529
|
|
|
530
|
+
.dataviews-view-list__item-actions {
|
|
531
|
+
padding-top: $grid-unit-20;
|
|
532
|
+
padding-right: $grid-unit-40;
|
|
533
|
+
}
|
|
534
|
+
|
|
520
535
|
& + .dataviews-pagination {
|
|
521
536
|
justify-content: space-between;
|
|
522
537
|
}
|
|
@@ -555,10 +570,6 @@
|
|
|
555
570
|
flex-shrink: 0;
|
|
556
571
|
}
|
|
557
572
|
|
|
558
|
-
.dataviews-view-grid__title-actions .dataviews-view-table-selection-checkbox {
|
|
559
|
-
margin-left: $grid-unit-10;
|
|
560
|
-
}
|
|
561
|
-
|
|
562
573
|
.dataviews-filter-summary__popover {
|
|
563
574
|
.components-popover__content {
|
|
564
575
|
width: 230px;
|
|
@@ -790,3 +801,48 @@
|
|
|
790
801
|
}
|
|
791
802
|
}
|
|
792
803
|
}
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
.dataviews-bulk-actions-toolbar-wrapper {
|
|
807
|
+
display: flex;
|
|
808
|
+
flex-grow: 1;
|
|
809
|
+
width: 100%;
|
|
810
|
+
|
|
811
|
+
.components-toolbar-group {
|
|
812
|
+
align-items: center;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
.components-button.is-busy {
|
|
816
|
+
max-height: $button-size;
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
.dataviews-bulk-actions {
|
|
821
|
+
position: absolute;
|
|
822
|
+
display: flex;
|
|
823
|
+
flex-direction: column;
|
|
824
|
+
align-content: center;
|
|
825
|
+
flex-wrap: wrap;
|
|
826
|
+
width: 100%;
|
|
827
|
+
bottom: $grid-unit-30;
|
|
828
|
+
z-index: z-index(".dataviews-bulk-actions");
|
|
829
|
+
|
|
830
|
+
.components-accessible-toolbar {
|
|
831
|
+
border-color: $gray-300;
|
|
832
|
+
box-shadow: $shadow-popover;
|
|
833
|
+
|
|
834
|
+
.components-toolbar-group {
|
|
835
|
+
border-color: $gray-200;
|
|
836
|
+
|
|
837
|
+
&:last-child {
|
|
838
|
+
border: 0;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
.dataviews-bulk-actions__selection-count {
|
|
844
|
+
display: flex;
|
|
845
|
+
align-items: center;
|
|
846
|
+
margin: 0 $grid-unit-10 0 $grid-unit-10;
|
|
847
|
+
}
|
|
848
|
+
}
|