@wordpress/dataviews 1.1.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.
Files changed (124) hide show
  1. package/CHANGELOG.md +11 -5
  2. package/build/bulk-actions-toolbar.js +182 -0
  3. package/build/bulk-actions-toolbar.js.map +1 -0
  4. package/build/bulk-actions.js +8 -8
  5. package/build/bulk-actions.js.map +1 -1
  6. package/build/dataviews.js +11 -4
  7. package/build/dataviews.js.map +1 -1
  8. package/build/filter-and-sort-data-view.js +2 -2
  9. package/build/filter-and-sort-data-view.js.map +1 -1
  10. package/build/filter-summary.js +3 -3
  11. package/build/filter-summary.js.map +1 -1
  12. package/build/item-actions.js +41 -22
  13. package/build/item-actions.js.map +1 -1
  14. package/build/lock-unlock.js.map +1 -1
  15. package/build/normalize-fields.js.map +1 -1
  16. package/build/pagination.js +13 -7
  17. package/build/pagination.js.map +1 -1
  18. package/build/single-selection-checkbox.js +4 -0
  19. package/build/single-selection-checkbox.js.map +1 -1
  20. package/build/types.js.map +1 -1
  21. package/build/view-grid.js +9 -10
  22. package/build/view-grid.js.map +1 -1
  23. package/build/view-list.js +134 -21
  24. package/build/view-list.js.map +1 -1
  25. package/build/view-table.js +9 -9
  26. package/build/view-table.js.map +1 -1
  27. package/build-module/bulk-actions-toolbar.js +175 -0
  28. package/build-module/bulk-actions-toolbar.js.map +1 -0
  29. package/build-module/bulk-actions.js +8 -8
  30. package/build-module/bulk-actions.js.map +1 -1
  31. package/build-module/dataviews.js +11 -4
  32. package/build-module/dataviews.js.map +1 -1
  33. package/build-module/filter-and-sort-data-view.js +2 -2
  34. package/build-module/filter-and-sort-data-view.js.map +1 -1
  35. package/build-module/filter-summary.js +3 -3
  36. package/build-module/filter-summary.js.map +1 -1
  37. package/build-module/item-actions.js +40 -24
  38. package/build-module/item-actions.js.map +1 -1
  39. package/build-module/lock-unlock.js.map +1 -1
  40. package/build-module/normalize-fields.js.map +1 -1
  41. package/build-module/pagination.js +14 -7
  42. package/build-module/pagination.js.map +1 -1
  43. package/build-module/single-selection-checkbox.js +5 -0
  44. package/build-module/single-selection-checkbox.js.map +1 -1
  45. package/build-module/types.js.map +1 -1
  46. package/build-module/view-grid.js +9 -10
  47. package/build-module/view-grid.js.map +1 -1
  48. package/build-module/view-list.js +135 -23
  49. package/build-module/view-list.js.map +1 -1
  50. package/build-module/view-table.js +9 -9
  51. package/build-module/view-table.js.map +1 -1
  52. package/build-style/style-rtl.css +62 -27
  53. package/build-style/style.css +62 -27
  54. package/build-types/add-filter.d.ts +8 -0
  55. package/build-types/add-filter.d.ts.map +1 -0
  56. package/build-types/bulk-actions-toolbar.d.ts +8 -0
  57. package/build-types/bulk-actions-toolbar.d.ts.map +1 -0
  58. package/build-types/bulk-actions.d.ts +14 -0
  59. package/build-types/bulk-actions.d.ts.map +1 -0
  60. package/build-types/dataviews.d.ts +15 -0
  61. package/build-types/dataviews.d.ts.map +1 -0
  62. package/build-types/dropdown-menu-helper.d.ts +6 -0
  63. package/build-types/dropdown-menu-helper.d.ts.map +1 -0
  64. package/build-types/filter-and-sort-data-view.d.ts +3 -3
  65. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  66. package/build-types/filter-summary.d.ts +6 -0
  67. package/build-types/filter-summary.d.ts.map +1 -0
  68. package/build-types/filters.d.ts +3 -0
  69. package/build-types/filters.d.ts.map +1 -0
  70. package/build-types/index.d.ts +4 -0
  71. package/build-types/index.d.ts.map +1 -0
  72. package/build-types/item-actions.d.ts +37 -0
  73. package/build-types/item-actions.d.ts.map +1 -0
  74. package/build-types/layouts.d.ts +20 -0
  75. package/build-types/layouts.d.ts.map +1 -0
  76. package/build-types/lock-unlock.d.ts +2 -0
  77. package/build-types/lock-unlock.d.ts.map +1 -0
  78. package/build-types/normalize-fields.d.ts +2 -2
  79. package/build-types/normalize-fields.d.ts.map +1 -1
  80. package/build-types/pagination.d.ts +16 -0
  81. package/build-types/pagination.d.ts.map +1 -0
  82. package/build-types/reset-filters.d.ts +6 -0
  83. package/build-types/reset-filters.d.ts.map +1 -0
  84. package/build-types/search-widget.d.ts +2 -0
  85. package/build-types/search-widget.d.ts.map +1 -0
  86. package/build-types/search.d.ts +3 -0
  87. package/build-types/search.d.ts.map +1 -0
  88. package/build-types/single-selection-checkbox.d.ts +17 -0
  89. package/build-types/single-selection-checkbox.d.ts.map +1 -0
  90. package/build-types/stories/fixtures.d.ts +114 -0
  91. package/build-types/stories/fixtures.d.ts.map +1 -0
  92. package/build-types/stories/index.story.d.ts +15 -0
  93. package/build-types/stories/index.story.d.ts.map +1 -0
  94. package/build-types/types.d.ts +152 -20
  95. package/build-types/types.d.ts.map +1 -1
  96. package/build-types/utils.d.ts +2 -0
  97. package/build-types/utils.d.ts.map +1 -0
  98. package/build-types/view-actions.d.ts +3 -0
  99. package/build-types/view-actions.d.ts.map +1 -0
  100. package/build-types/view-grid.d.ts +15 -0
  101. package/build-types/view-grid.d.ts.map +1 -0
  102. package/build-types/view-list.d.ts +16 -0
  103. package/build-types/view-list.d.ts.map +1 -0
  104. package/build-types/view-table.d.ts +14 -0
  105. package/build-types/view-table.d.ts.map +1 -0
  106. package/package.json +12 -12
  107. package/src/bulk-actions-toolbar.js +244 -0
  108. package/src/{bulk-actions.js → bulk-actions.tsx} +73 -17
  109. package/src/dataviews.js +14 -3
  110. package/src/filter-and-sort-data-view.ts +13 -8
  111. package/src/filter-summary.js +3 -3
  112. package/src/{item-actions.js → item-actions.tsx} +112 -28
  113. package/src/normalize-fields.ts +4 -2
  114. package/src/{pagination.js → pagination.tsx} +28 -7
  115. package/src/{single-selection-checkbox.js → single-selection-checkbox.tsx} +17 -2
  116. package/src/style.scss +77 -28
  117. package/src/types.ts +190 -20
  118. package/src/{view-grid.js → view-grid.tsx} +45 -16
  119. package/src/view-list.tsx +421 -0
  120. package/src/view-table.js +8 -8
  121. package/tsconfig.json +4 -2
  122. package/tsconfig.tsbuildinfo +1 -1
  123. package/src/view-list.js +0 -207
  124. /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
- function ButtonTrigger( { action, onClick } ) {
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( { action, onClick } ) {
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={ ! action.RenderModal }
95
+ hideOnClick={ ! ( 'RenderModal' in action ) }
44
96
  >
45
97
  <DropdownMenuItemLabel>{ action.label }</DropdownMenuItemLabel>
46
98
  </DropdownMenuItem>
47
99
  );
48
100
  }
49
101
 
50
- function ActionWithModal( { action, item, ActionTrigger } ) {
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: () => setIsModalOpen( true ),
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
- <Modal
62
- title={ action.modalHeader || action.label }
63
- __experimentalHideHeader={ !! hideModalHeader }
64
- onRequestClose={ () => {
65
- setIsModalOpen( false );
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( { actions, item } ) {
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 ( !! action.RenderModal ) {
162
+ if ( 'RenderModal' in action ) {
86
163
  return (
87
164
  <ActionWithModal
88
165
  key={ action.id }
89
166
  action={ action }
90
- item={ item }
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( { item, actions, isCompact } ) {
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 ( !! action.RenderModal ) {
218
+ if ( 'RenderModal' in action ) {
138
219
  return (
139
220
  <ActionWithModal
140
221
  key={ action.id }
141
222
  action={ action }
142
- item={ item }
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( { item, actions } ) {
241
+ function CompactItemActions< Item extends AnyItem >( {
242
+ item,
243
+ actions,
244
+ }: CompactItemActionsProps< Item > ) {
161
245
  return (
162
246
  <DropdownMenu
163
247
  trigger={
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Internal dependencies
3
3
  */
4
- import type { Field, NormalizedField } from './types';
4
+ import type { Field, AnyItem, NormalizedField } from './types';
5
5
 
6
6
  /**
7
7
  * Apply default values and normalize the fields config.
@@ -9,7 +9,9 @@ import type { Field, NormalizedField } from './types';
9
9
  * @param fields Fields config.
10
10
  * @return Normalized fields config.
11
11
  */
12
- export function normalizeFields( fields: Field[] ): NormalizedField[] {
12
+ export function normalizeFields< Item extends AnyItem >(
13
+ fields: Field< Item >[]
14
+ ): NormalizedField< Item >[] {
13
15
  return fields.map( ( field ) => {
14
16
  const getValue = field.getValue || ( ( { item } ) => item[ field.id ] );
15
17
 
@@ -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 { value: page, label: page };
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( { ...view, page: view.page - 1 } )
87
+ onChangeView( {
88
+ ...view,
89
+ page: currentPage - 1,
90
+ } )
70
91
  }
71
- disabled={ view.page === 1 }
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: view.page + 1 } )
102
+ onChangeView( { ...view, page: currentPage + 1 } )
82
103
  }
83
- disabled={ view.page >= totalPages }
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
- export default function SingleSelectionCheckbox( {
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/style.scss CHANGED
@@ -339,6 +339,7 @@
339
339
  height: 100%;
340
340
  box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.1);
341
341
  border-radius: $grid-unit-05;
342
+ pointer-events: none;
342
343
  }
343
344
  }
344
345
 
@@ -396,32 +397,33 @@
396
397
 
397
398
  .dataviews-view-list {
398
399
  margin: 0;
399
- padding: $grid-unit-10;
400
400
 
401
401
  li {
402
402
  margin: 0;
403
403
  cursor: pointer;
404
+ border-top: 1px solid $gray-100;
404
405
 
405
406
  .dataviews-view-list__item-wrapper {
406
407
  position: relative;
407
- padding-right: $grid-unit-30;
408
408
  border-radius: $grid-unit-05;
409
409
 
410
- &::after {
411
- position: absolute;
412
- content: "";
413
- top: 100%;
414
- left: $grid-unit-30;
415
- right: $grid-unit-30;
416
- background: $gray-100;
417
- height: 1px;
418
- }
419
-
420
410
  > * {
421
411
  width: 100%;
422
412
  }
423
413
  }
424
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
+
425
427
  &:not(.is-selected) {
426
428
  .dataviews-view-list__primary-field {
427
429
  color: $gray-900;
@@ -429,6 +431,7 @@
429
431
  &:hover,
430
432
  &:focus-within {
431
433
  color: var(--wp-admin-theme-color);
434
+ background-color: #f8f8f8;
432
435
 
433
436
  .dataviews-view-list__primary-field,
434
437
  .dataviews-view-list__fields {
@@ -436,28 +439,25 @@
436
439
  }
437
440
  }
438
441
  }
442
+
439
443
  }
440
444
 
441
445
  li.is-selected,
442
446
  li.is-selected:focus-within {
443
447
  .dataviews-view-list__item-wrapper {
444
- background-color: var(--wp-admin-theme-color);
445
- color: $white;
448
+ background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
449
+ color: $gray-900;
446
450
 
447
451
  .dataviews-view-list__primary-field,
448
452
  .dataviews-view-list__fields,
449
453
  .components-button {
450
- color: $white;
451
- }
452
-
453
- &::after {
454
- background: transparent;
454
+ color: var(--wp-admin-theme-color);
455
455
  }
456
456
  }
457
457
  }
458
458
 
459
459
  .dataviews-view-list__item {
460
- padding: $grid-unit-15 0 $grid-unit-15 $grid-unit-30;
460
+ padding: $grid-unit-20 0 $grid-unit-20 $grid-unit-40;
461
461
  width: 100%;
462
462
  scroll-margin: $grid-unit-10 0;
463
463
 
@@ -465,13 +465,12 @@
465
465
  &::before {
466
466
  position: absolute;
467
467
  content: "";
468
- top: -1px;
469
- right: -1px;
470
- bottom: -1px;
471
- left: -1px;
472
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
473
- z-index: -1;
474
- 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;
475
474
  }
476
475
  }
477
476
  .dataviews-view-list__primary-field {
@@ -483,11 +482,11 @@
483
482
  .dataviews-view-list__media-wrapper {
484
483
  width: $grid-unit-50;
485
484
  height: $grid-unit-50;
486
- border-radius: $grid-unit-05;
487
485
  overflow: hidden;
488
486
  position: relative;
489
487
  flex-shrink: 0;
490
488
  background-color: $gray-100;
489
+ border-radius: $grid-unit-05;
491
490
 
492
491
  img {
493
492
  width: 100%;
@@ -528,6 +527,11 @@
528
527
  }
529
528
  }
530
529
 
530
+ .dataviews-view-list__item-actions {
531
+ padding-top: $grid-unit-20;
532
+ padding-right: $grid-unit-40;
533
+ }
534
+
531
535
  & + .dataviews-pagination {
532
536
  justify-content: space-between;
533
537
  }
@@ -797,3 +801,48 @@
797
801
  }
798
802
  }
799
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
+ }