@wordpress/dataviews 4.1.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.
Files changed (223) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +77 -29
  3. package/build/components/dataviews/index.js +10 -14
  4. package/build/components/dataviews/index.js.map +1 -1
  5. package/build/components/dataviews-bulk-actions/index.js +145 -141
  6. package/build/components/dataviews-bulk-actions/index.js.map +1 -1
  7. package/build/components/dataviews-filters/add-filter.js +4 -6
  8. package/build/components/dataviews-filters/add-filter.js.map +1 -1
  9. package/build/components/dataviews-filters/index.js +3 -0
  10. package/build/components/dataviews-filters/index.js.map +1 -1
  11. package/build/components/dataviews-filters/search-widget.js +30 -23
  12. package/build/components/dataviews-filters/search-widget.js.map +1 -1
  13. package/build/components/dataviews-footer/index.js +45 -0
  14. package/build/components/dataviews-footer/index.js.map +1 -0
  15. package/build/components/dataviews-item-actions/index.js +5 -8
  16. package/build/components/dataviews-item-actions/index.js.map +1 -1
  17. package/build/components/dataviews-pagination/index.js +27 -19
  18. package/build/components/dataviews-pagination/index.js.map +1 -1
  19. package/build/components/dataviews-view-config/index.js +197 -41
  20. package/build/components/dataviews-view-config/index.js.map +1 -1
  21. package/build/dataform-controls/datetime.js +49 -0
  22. package/build/dataform-controls/datetime.js.map +1 -0
  23. package/build/dataform-controls/index.js +50 -0
  24. package/build/dataform-controls/index.js.map +1 -0
  25. package/build/dataform-controls/integer.js +45 -0
  26. package/build/dataform-controls/integer.js.map +1 -0
  27. package/build/dataform-controls/radio.js +45 -0
  28. package/build/dataform-controls/radio.js.map +1 -0
  29. package/build/dataform-controls/select.js +58 -0
  30. package/build/dataform-controls/select.js.map +1 -0
  31. package/build/dataform-controls/text.js +45 -0
  32. package/build/dataform-controls/text.js.map +1 -0
  33. package/build/dataforms-layouts/panel/index.js +10 -4
  34. package/build/dataforms-layouts/panel/index.js.map +1 -1
  35. package/build/dataforms-layouts/regular/index.js +6 -3
  36. package/build/dataforms-layouts/regular/index.js.map +1 -1
  37. package/build/dataviews-layouts/grid/density-picker.js +23 -52
  38. package/build/dataviews-layouts/grid/density-picker.js.map +1 -1
  39. package/build/dataviews-layouts/grid/index.js +1 -1
  40. package/build/dataviews-layouts/grid/index.js.map +1 -1
  41. package/build/dataviews-layouts/index.js +48 -2
  42. package/build/dataviews-layouts/index.js.map +1 -1
  43. package/build/dataviews-layouts/list/index.js +124 -80
  44. package/build/dataviews-layouts/list/index.js.map +1 -1
  45. package/build/dataviews-layouts/table/column-header-menu.js +52 -57
  46. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  47. package/build/dataviews-layouts/table/index.js +7 -35
  48. package/build/dataviews-layouts/table/index.js.map +1 -1
  49. package/build/field-types/datetime.js +30 -0
  50. package/build/field-types/datetime.js.map +1 -0
  51. package/build/field-types/index.js +4 -0
  52. package/build/field-types/index.js.map +1 -1
  53. package/build/field-types/integer.js +1 -60
  54. package/build/field-types/integer.js.map +1 -1
  55. package/build/field-types/text.js +1 -60
  56. package/build/field-types/text.js.map +1 -1
  57. package/build/normalize-fields.js +10 -9
  58. package/build/normalize-fields.js.map +1 -1
  59. package/build/types.js.map +1 -1
  60. package/build-module/components/dataviews/index.js +10 -14
  61. package/build-module/components/dataviews/index.js.map +1 -1
  62. package/build-module/components/dataviews-bulk-actions/index.js +145 -143
  63. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -1
  64. package/build-module/components/dataviews-filters/add-filter.js +4 -6
  65. package/build-module/components/dataviews-filters/add-filter.js.map +1 -1
  66. package/build-module/components/dataviews-filters/index.js +3 -0
  67. package/build-module/components/dataviews-filters/index.js.map +1 -1
  68. package/build-module/components/dataviews-filters/search-widget.js +30 -23
  69. package/build-module/components/dataviews-filters/search-widget.js.map +1 -1
  70. package/build-module/components/dataviews-footer/index.js +38 -0
  71. package/build-module/components/dataviews-footer/index.js.map +1 -0
  72. package/build-module/components/dataviews-item-actions/index.js +5 -8
  73. package/build-module/components/dataviews-item-actions/index.js.map +1 -1
  74. package/build-module/components/dataviews-pagination/index.js +28 -20
  75. package/build-module/components/dataviews-pagination/index.js.map +1 -1
  76. package/build-module/components/dataviews-view-config/index.js +203 -47
  77. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  78. package/build-module/dataform-controls/datetime.js +43 -0
  79. package/build-module/dataform-controls/datetime.js.map +1 -0
  80. package/build-module/dataform-controls/index.js +42 -0
  81. package/build-module/dataform-controls/index.js.map +1 -0
  82. package/build-module/dataform-controls/integer.js +38 -0
  83. package/build-module/dataform-controls/integer.js.map +1 -0
  84. package/build-module/dataform-controls/radio.js +38 -0
  85. package/build-module/dataform-controls/radio.js.map +1 -0
  86. package/build-module/dataform-controls/select.js +51 -0
  87. package/build-module/dataform-controls/select.js.map +1 -0
  88. package/build-module/dataform-controls/text.js +38 -0
  89. package/build-module/dataform-controls/text.js.map +1 -0
  90. package/build-module/dataforms-layouts/panel/index.js +10 -4
  91. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  92. package/build-module/dataforms-layouts/regular/index.js +6 -3
  93. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  94. package/build-module/dataviews-layouts/grid/density-picker.js +25 -56
  95. package/build-module/dataviews-layouts/grid/density-picker.js.map +1 -1
  96. package/build-module/dataviews-layouts/grid/index.js +1 -1
  97. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  98. package/build-module/dataviews-layouts/index.js +45 -1
  99. package/build-module/dataviews-layouts/index.js.map +1 -1
  100. package/build-module/dataviews-layouts/list/index.js +125 -80
  101. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  102. package/build-module/dataviews-layouts/table/column-header-menu.js +52 -57
  103. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  104. package/build-module/dataviews-layouts/table/index.js +9 -37
  105. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  106. package/build-module/field-types/datetime.js +24 -0
  107. package/build-module/field-types/datetime.js.map +1 -0
  108. package/build-module/field-types/index.js +4 -0
  109. package/build-module/field-types/index.js.map +1 -1
  110. package/build-module/field-types/integer.js +2 -60
  111. package/build-module/field-types/integer.js.map +1 -1
  112. package/build-module/field-types/text.js +2 -60
  113. package/build-module/field-types/text.js.map +1 -1
  114. package/build-module/normalize-fields.js +11 -9
  115. package/build-module/normalize-fields.js.map +1 -1
  116. package/build-module/types.js.map +1 -1
  117. package/build-style/style-rtl.css +93 -80
  118. package/build-style/style.css +93 -80
  119. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  120. package/build-types/components/dataviews/index.d.ts.map +1 -1
  121. package/build-types/components/dataviews/stories/fixtures.d.ts +28 -113
  122. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  123. package/build-types/components/dataviews/stories/index.story.d.ts +12 -44
  124. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  125. package/build-types/components/dataviews-bulk-actions/index.d.ts +11 -1
  126. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
  127. package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -1
  128. package/build-types/components/dataviews-filters/index.d.ts +1 -1
  129. package/build-types/components/dataviews-filters/index.d.ts.map +1 -1
  130. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
  131. package/build-types/components/dataviews-footer/index.d.ts +2 -0
  132. package/build-types/components/dataviews-footer/index.d.ts.map +1 -0
  133. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  134. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -1
  135. package/build-types/components/dataviews-view-config/index.d.ts +4 -3
  136. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  137. package/build-types/dataform-controls/datetime.d.ts +6 -0
  138. package/build-types/dataform-controls/datetime.d.ts.map +1 -0
  139. package/build-types/dataform-controls/index.d.ts +11 -0
  140. package/build-types/dataform-controls/index.d.ts.map +1 -0
  141. package/build-types/dataform-controls/integer.d.ts +6 -0
  142. package/build-types/dataform-controls/integer.d.ts.map +1 -0
  143. package/build-types/dataform-controls/radio.d.ts +6 -0
  144. package/build-types/dataform-controls/radio.d.ts.map +1 -0
  145. package/build-types/dataform-controls/select.d.ts +6 -0
  146. package/build-types/dataform-controls/select.d.ts.map +1 -0
  147. package/build-types/dataform-controls/text.d.ts +6 -0
  148. package/build-types/dataform-controls/text.d.ts.map +1 -0
  149. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  150. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  151. package/build-types/dataviews-layouts/grid/density-picker.d.ts.map +1 -1
  152. package/build-types/dataviews-layouts/index.d.ts +4 -2
  153. package/build-types/dataviews-layouts/index.d.ts.map +1 -1
  154. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  155. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  156. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  157. package/build-types/field-types/datetime.d.ts +13 -0
  158. package/build-types/field-types/datetime.d.ts.map +1 -0
  159. package/build-types/field-types/index.d.ts +1 -1
  160. package/build-types/field-types/index.d.ts.map +1 -1
  161. package/build-types/field-types/integer.d.ts +2 -3
  162. package/build-types/field-types/integer.d.ts.map +1 -1
  163. package/build-types/field-types/text.d.ts +2 -3
  164. package/build-types/field-types/text.d.ts.map +1 -1
  165. package/build-types/normalize-fields.d.ts.map +1 -1
  166. package/build-types/types.d.ts +43 -21
  167. package/build-types/types.d.ts.map +1 -1
  168. package/package.json +12 -12
  169. package/src/components/dataform/stories/index.story.tsx +43 -2
  170. package/src/components/dataviews/index.tsx +14 -18
  171. package/src/components/dataviews/stories/fixtures.tsx +690 -0
  172. package/src/components/dataviews/stories/index.story.tsx +164 -0
  173. package/src/components/dataviews/style.scss +2 -12
  174. package/src/components/dataviews-bulk-actions/index.tsx +264 -213
  175. package/src/components/dataviews-bulk-actions/style.scss +9 -4
  176. package/src/components/dataviews-filters/add-filter.tsx +7 -11
  177. package/src/components/dataviews-filters/index.tsx +3 -0
  178. package/src/components/dataviews-filters/search-widget.tsx +46 -25
  179. package/src/components/dataviews-filters/style.scss +13 -3
  180. package/src/components/dataviews-footer/index.tsx +50 -0
  181. package/src/components/dataviews-footer/style.scss +40 -0
  182. package/src/components/dataviews-item-actions/index.tsx +8 -14
  183. package/src/components/dataviews-pagination/index.tsx +40 -21
  184. package/src/components/dataviews-pagination/style.scss +7 -21
  185. package/src/components/dataviews-view-config/index.tsx +297 -69
  186. package/src/components/dataviews-view-config/style.scss +25 -0
  187. package/src/dataform-controls/datetime.tsx +43 -0
  188. package/src/dataform-controls/index.tsx +61 -0
  189. package/src/dataform-controls/integer.tsx +38 -0
  190. package/src/dataform-controls/radio.tsx +42 -0
  191. package/src/dataform-controls/select.tsx +52 -0
  192. package/src/dataform-controls/style.scss +4 -0
  193. package/src/dataform-controls/text.tsx +40 -0
  194. package/src/dataforms-layouts/panel/index.tsx +8 -2
  195. package/src/dataforms-layouts/regular/index.tsx +6 -2
  196. package/src/dataviews-layouts/grid/density-picker.tsx +33 -67
  197. package/src/dataviews-layouts/grid/index.tsx +1 -1
  198. package/src/dataviews-layouts/grid/style.scss +1 -5
  199. package/src/dataviews-layouts/index.ts +63 -2
  200. package/src/dataviews-layouts/list/index.tsx +199 -123
  201. package/src/dataviews-layouts/list/style.scss +10 -4
  202. package/src/dataviews-layouts/table/column-header-menu.tsx +86 -90
  203. package/src/dataviews-layouts/table/index.tsx +8 -65
  204. package/src/dataviews-layouts/table/style.scss +0 -5
  205. package/src/field-types/datetime.tsx +28 -0
  206. package/src/field-types/index.tsx +5 -0
  207. package/src/field-types/integer.tsx +2 -71
  208. package/src/field-types/text.tsx +2 -70
  209. package/src/normalize-fields.ts +10 -10
  210. package/src/style.scss +2 -1
  211. package/src/test/filter-and-sort-data-view.js +28 -0
  212. package/src/types.ts +56 -32
  213. package/tsconfig.tsbuildinfo +1 -1
  214. package/build/components/dataviews-bulk-actions-toolbar/index.js +0 -207
  215. package/build/components/dataviews-bulk-actions-toolbar/index.js.map +0 -1
  216. package/build-module/components/dataviews-bulk-actions-toolbar/index.js +0 -201
  217. package/build-module/components/dataviews-bulk-actions-toolbar/index.js.map +0 -1
  218. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts +0 -2
  219. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts.map +0 -1
  220. package/src/components/dataviews/stories/fixtures.js +0 -222
  221. package/src/components/dataviews/stories/index.story.js +0 -65
  222. package/src/components/dataviews-bulk-actions-toolbar/index.tsx +0 -288
  223. package/src/components/dataviews-bulk-actions-toolbar/style.scss +0 -45
@@ -8,6 +8,7 @@ import removeAccents from 'remove-accents';
8
8
  /**
9
9
  * WordPress dependencies
10
10
  */
11
+ import { useInstanceId } from '@wordpress/compose';
11
12
  import { __, sprintf } from '@wordpress/i18n';
12
13
  import { useState, useMemo, useDeferredValue } from '@wordpress/element';
13
14
  import {
@@ -27,7 +28,8 @@ import type { Filter, NormalizedFilter, View } from '../../types';
27
28
  const {
28
29
  CompositeV2: Composite,
29
30
  CompositeItemV2: CompositeItem,
30
- useCompositeStoreV2: useCompositeStore,
31
+ CompositeHoverV2: CompositeHover,
32
+ CompositeTypeaheadV2: CompositeTypeahead,
31
33
  } = unlock( componentsPrivateApis );
32
34
 
33
35
  interface SearchWidgetProps {
@@ -84,22 +86,37 @@ const getNewValue = (
84
86
  return [ value ];
85
87
  };
86
88
 
89
+ function generateFilterElementCompositeItemId(
90
+ prefix: string,
91
+ filterElementValue: string
92
+ ) {
93
+ return `${ prefix }-${ filterElementValue }`;
94
+ }
95
+
87
96
  function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
88
- const compositeStore = useCompositeStore( {
89
- virtualFocus: true,
90
- focusLoop: true,
91
- // When we have no or just one operator, we can set the first item as active.
92
- // We do that by passing `undefined` to `defaultActiveId`. Otherwise, we set it to `null`,
93
- // so the first item is not selected, since the focus is on the operators control.
94
- defaultActiveId: filter.operators?.length === 1 ? undefined : null,
95
- } );
97
+ const baseId = useInstanceId( ListBox, 'dataviews-filter-list-box' );
98
+
99
+ const [ activeCompositeId, setActiveCompositeId ] = useState<
100
+ string | null | undefined
101
+ >(
102
+ // When there are one or less operators, the first item is set as active
103
+ // (by setting the initial `activeId` to `undefined`).
104
+ // With 2 or more operators, the focus is moved on the operators control
105
+ // (by setting the initial `activeId` to `null`), meaning that there won't
106
+ // be an active item initially. Focus is then managed via the
107
+ // `onFocusVisible` callback.
108
+ filter.operators?.length === 1 ? undefined : null
109
+ );
96
110
  const currentFilter = view.filters?.find(
97
111
  ( f ) => f.field === filter.field
98
112
  );
99
113
  const currentValue = getCurrentValue( filter, currentFilter );
100
114
  return (
101
115
  <Composite
102
- store={ compositeStore }
116
+ virtualFocus
117
+ focusLoop
118
+ activeId={ activeCompositeId }
119
+ setActiveId={ setActiveCompositeId }
103
120
  role="listbox"
104
121
  className="dataviews-filters__search-widget-listbox"
105
122
  aria-label={ sprintf(
@@ -108,18 +125,29 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
108
125
  filter.name
109
126
  ) }
110
127
  onFocusVisible={ () => {
111
- if ( ! compositeStore.getState().activeId ) {
112
- compositeStore.move( compositeStore.first() );
128
+ // `onFocusVisible` needs the `Composite` component to be focusable,
129
+ // which is implicitly achieved via the `virtualFocus: true` option
130
+ // in the `useCompositeStore` hook.
131
+ if ( ! activeCompositeId && filter.elements.length ) {
132
+ setActiveCompositeId(
133
+ generateFilterElementCompositeItemId(
134
+ baseId,
135
+ filter.elements[ 0 ].value
136
+ )
137
+ );
113
138
  }
114
139
  } }
115
- render={ <Ariakit.CompositeTypeahead store={ compositeStore } /> }
140
+ render={ <CompositeTypeahead /> }
116
141
  >
117
142
  { filter.elements.map( ( element ) => (
118
- <Ariakit.CompositeHover
119
- store={ compositeStore }
143
+ <CompositeHover
120
144
  key={ element.value }
121
145
  render={
122
146
  <CompositeItem
147
+ id={ generateFilterElementCompositeItemId(
148
+ baseId,
149
+ element.value
150
+ ) }
123
151
  render={
124
152
  <div
125
153
  aria-label={ element.label }
@@ -184,15 +212,8 @@ function ListBox( { view, filter, onChangeView }: SearchWidgetProps ) {
184
212
  <Icon icon={ check } />
185
213
  ) }
186
214
  </span>
187
- <span>
188
- { element.label }
189
- { !! element.description && (
190
- <span className="dataviews-filters__search-widget-listitem-description">
191
- { element.description }
192
- </span>
193
- ) }
194
- </span>
195
- </Ariakit.CompositeHover>
215
+ <span>{ element.label }</span>
216
+ </CompositeHover>
196
217
  ) ) }
197
218
  </Composite>
198
219
  );
@@ -213,7 +234,6 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
213
234
  }, [ filter.elements, deferredSearchValue ] );
214
235
  return (
215
236
  <Ariakit.ComboboxProvider
216
- resetValueOnSelect={ false }
217
237
  selectedValue={ currentValue }
218
238
  setSelectedValue={ ( value ) => {
219
239
  const newFilters = currentFilter
@@ -273,6 +293,7 @@ function ComboboxList( { view, filter, onChangeView }: SearchWidgetProps ) {
273
293
  { matches.map( ( element ) => {
274
294
  return (
275
295
  <Ariakit.ComboboxItem
296
+ resetValueOnSelect={ false }
276
297
  key={ element.value }
277
298
  value={ element.value }
278
299
  className="dataviews-filters__search-widget-listitem"
@@ -18,11 +18,19 @@
18
18
  }
19
19
 
20
20
  .dataviews-filters__summary-popover {
21
+ font-size: $default-font-size;
22
+ line-height: $default-line-height;
23
+
21
24
  .components-popover__content {
22
25
  width: 230px;
23
- padding: 0;
24
26
  border-radius: $grid-unit-05;
25
27
  }
28
+
29
+ &.components-dropdown__content {
30
+ .components-popover__content {
31
+ padding: 0;
32
+ }
33
+ }
26
34
  }
27
35
 
28
36
  .dataviews-filters__summary-operators-container {
@@ -48,7 +56,7 @@
48
56
 
49
57
  .dataviews-filters__summary-chip {
50
58
  border-radius: $grid-unit-20;
51
- border: 1px solid transparent;
59
+ border: $border-width solid transparent;
52
60
  cursor: pointer;
53
61
  padding: $grid-unit-05 $grid-unit-15;
54
62
  min-height: $grid-unit-40;
@@ -57,6 +65,7 @@
57
65
  position: relative;
58
66
  display: flex;
59
67
  align-items: center;
68
+ box-sizing: border-box;
60
69
 
61
70
  &.has-reset {
62
71
  padding-inline-end: $button-size-small + $grid-unit-05;
@@ -160,7 +169,7 @@
160
169
  display: flex;
161
170
  align-items: center;
162
171
  gap: $grid-unit-10;
163
- border-radius: $radius-block-ui;
172
+ border-radius: $radius-small;
164
173
  box-sizing: border-box;
165
174
  padding: $grid-unit-10 $grid-unit-15;
166
175
  cursor: default;
@@ -275,6 +284,7 @@
275
284
  font-size: 11px;
276
285
  outline: var(--wp-admin-border-width-focus) solid $white;
277
286
  color: $white;
287
+ box-sizing: border-box;
278
288
  }
279
289
 
280
290
  .dataviews-search {
@@ -0,0 +1,50 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __experimentalHStack as HStack } from '@wordpress/components';
5
+ import { useContext } from '@wordpress/element';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import DataViewsContext from '../dataviews-context';
11
+ import DataViewsPagination from '../dataviews-pagination';
12
+ import {
13
+ BulkActionsFooter,
14
+ useSomeItemHasAPossibleBulkAction,
15
+ } from '../dataviews-bulk-actions';
16
+ import { LAYOUT_GRID, LAYOUT_TABLE } from '../../constants';
17
+
18
+ const EMPTY_ARRAY: [] = [];
19
+
20
+ export default function DataViewsFooter() {
21
+ const {
22
+ view,
23
+ paginationInfo: { totalItems = 0, totalPages },
24
+ data,
25
+ actions = EMPTY_ARRAY,
26
+ } = useContext( DataViewsContext );
27
+ const hasBulkActions =
28
+ useSomeItemHasAPossibleBulkAction( actions, data ) &&
29
+ [ LAYOUT_TABLE, LAYOUT_GRID ].includes( view.type );
30
+
31
+ if (
32
+ ! totalItems ||
33
+ ! totalPages ||
34
+ ( totalPages <= 1 && ! hasBulkActions )
35
+ ) {
36
+ return null;
37
+ }
38
+ return (
39
+ !! totalItems && (
40
+ <HStack
41
+ expanded={ false }
42
+ justify="end"
43
+ className="dataviews-footer"
44
+ >
45
+ { hasBulkActions && <BulkActionsFooter /> }
46
+ <DataViewsPagination />
47
+ </HStack>
48
+ )
49
+ );
50
+ }
@@ -0,0 +1,40 @@
1
+ .dataviews-footer {
2
+ position: sticky;
3
+ bottom: 0;
4
+ left: 0;
5
+ background-color: $white;
6
+ padding: $grid-unit-15 $grid-unit-60;
7
+ border-top: $border-width solid $gray-100;
8
+ flex-shrink: 0;
9
+ transition: padding ease-out 0.1s;
10
+ @include reduce-motion("transition");
11
+ z-index: z-index(".dataviews-footer");
12
+ }
13
+
14
+
15
+ /* stylelint-disable-next-line scss/at-rule-no-unknown -- '@container' not globally permitted */
16
+ @container (max-width: 430px) {
17
+ .dataviews-footer {
18
+ padding: $grid-unit-15 $grid-unit-30;
19
+ }
20
+ }
21
+
22
+ /* stylelint-disable-next-line scss/at-rule-no-unknown -- '@container' not globally permitted */
23
+ @container (max-width: 560px) {
24
+ .dataviews-footer {
25
+ flex-direction: column !important;
26
+
27
+ .dataviews-bulk-actions-footer__container {
28
+ width: 100%;
29
+ }
30
+
31
+ .dataviews-bulk-actions-footer__item-count {
32
+ flex-grow: 1;
33
+ }
34
+
35
+ .dataviews-pagination {
36
+ width: 100%;
37
+ justify-content: space-between;
38
+ }
39
+ }
40
+ }
@@ -23,13 +23,7 @@ import { useRegistry } from '@wordpress/data';
23
23
  import { unlock } from '../../lock-unlock';
24
24
  import type { Action, ActionModal as ActionModalType } from '../../types';
25
25
 
26
- const {
27
- DropdownMenuV2: DropdownMenu,
28
- DropdownMenuGroupV2: DropdownMenuGroup,
29
- DropdownMenuItemV2: DropdownMenuItem,
30
- DropdownMenuItemLabelV2: DropdownMenuItemLabel,
31
- kebabCase,
32
- } = unlock( componentsPrivateApis );
26
+ const { DropdownMenuV2, kebabCase } = unlock( componentsPrivateApis );
33
27
 
34
28
  export interface ActionTriggerProps< Item > {
35
29
  action: Action< Item >;
@@ -91,12 +85,12 @@ function DropdownMenuItemTrigger< Item >( {
91
85
  const label =
92
86
  typeof action.label === 'string' ? action.label : action.label( items );
93
87
  return (
94
- <DropdownMenuItem
88
+ <DropdownMenuV2.Item
95
89
  onClick={ onClick }
96
90
  hideOnClick={ ! ( 'RenderModal' in action ) }
97
91
  >
98
- <DropdownMenuItemLabel>{ label }</DropdownMenuItemLabel>
99
- </DropdownMenuItem>
92
+ <DropdownMenuV2.ItemLabel>{ label }</DropdownMenuV2.ItemLabel>
93
+ </DropdownMenuV2.Item>
100
94
  );
101
95
  }
102
96
 
@@ -158,7 +152,7 @@ export function ActionsDropdownMenuGroup< Item >( {
158
152
  }: ActionsDropdownMenuGroupProps< Item > ) {
159
153
  const registry = useRegistry();
160
154
  return (
161
- <DropdownMenuGroup>
155
+ <DropdownMenuV2.Group>
162
156
  { actions.map( ( action ) => {
163
157
  if ( 'RenderModal' in action ) {
164
158
  return (
@@ -181,7 +175,7 @@ export function ActionsDropdownMenuGroup< Item >( {
181
175
  />
182
176
  );
183
177
  } ) }
184
- </DropdownMenuGroup>
178
+ </DropdownMenuV2.Group>
185
179
  );
186
180
  }
187
181
 
@@ -251,7 +245,7 @@ function CompactItemActions< Item >( {
251
245
  actions,
252
246
  }: CompactItemActionsProps< Item > ) {
253
247
  return (
254
- <DropdownMenu
248
+ <DropdownMenuV2
255
249
  trigger={
256
250
  <Button
257
251
  size="compact"
@@ -265,6 +259,6 @@ function CompactItemActions< Item >( {
265
259
  placement="bottom-end"
266
260
  >
267
261
  <ActionsDropdownMenuGroup actions={ actions } item={ item } />
268
- </DropdownMenu>
262
+ </DropdownMenuV2>
269
263
  );
270
264
  }
@@ -7,7 +7,7 @@ import {
7
7
  SelectControl,
8
8
  } from '@wordpress/components';
9
9
  import { createInterpolateElement, memo, useContext } from '@wordpress/element';
10
- import { sprintf, __, _x } from '@wordpress/i18n';
10
+ import { sprintf, __, _x, isRTL } from '@wordpress/i18n';
11
11
  import { next, previous } from '@wordpress/icons';
12
12
 
13
13
  /**
@@ -21,53 +21,72 @@ function DataViewsPagination() {
21
21
  onChangeView,
22
22
  paginationInfo: { totalItems = 0, totalPages },
23
23
  } = useContext( DataViewsContext );
24
+
24
25
  if ( ! totalItems || ! totalPages ) {
25
26
  return null;
26
27
  }
28
+
27
29
  const currentPage = view.page ?? 1;
30
+ const pageSelectOptions = Array.from( Array( totalPages ) ).map(
31
+ ( _, i ) => {
32
+ const page = i + 1;
33
+ return {
34
+ value: page.toString(),
35
+ label: page.toString(),
36
+ 'aria-label':
37
+ currentPage === page
38
+ ? sprintf(
39
+ // translators: Current page number in total number of pages
40
+ __( 'Page %1$s of %2$s' ),
41
+ currentPage,
42
+ totalPages
43
+ )
44
+ : page.toString(),
45
+ };
46
+ }
47
+ );
48
+
28
49
  return (
29
50
  !! totalItems &&
30
51
  totalPages !== 1 && (
31
52
  <HStack
32
53
  expanded={ false }
33
- spacing={ 6 }
34
- justify="end"
35
54
  className="dataviews-pagination"
55
+ justify="end"
56
+ spacing={ 6 }
36
57
  >
37
58
  <HStack
38
59
  justify="flex-start"
39
60
  expanded={ false }
40
- spacing={ 2 }
41
- className="dataviews-pagination__page-selection"
61
+ spacing={ 1 }
62
+ className="dataviews-pagination__page-select"
42
63
  >
43
64
  { createInterpolateElement(
44
65
  sprintf(
45
- // translators: %s: Total number of pages.
46
- _x( 'Page <CurrentPageControl /> of %s', 'paging' ),
66
+ // translators: 1: Current page number, 2: Total number of pages.
67
+ _x(
68
+ '<div>Page</div>%1$s<div>of %2$s</div>',
69
+ 'paging'
70
+ ),
71
+ '<CurrentPage />',
47
72
  totalPages
48
73
  ),
49
74
  {
50
- CurrentPageControl: (
75
+ div: <div aria-hidden />,
76
+ CurrentPage: (
51
77
  <SelectControl
52
78
  aria-label={ __( 'Current page' ) }
53
- value={ view.page?.toString() }
54
- options={ Array.from(
55
- Array( totalPages )
56
- ).map( ( _, i ) => {
57
- const page = i + 1;
58
- return {
59
- value: page.toString(),
60
- label: page.toString(),
61
- };
62
- } ) }
79
+ value={ currentPage.toString() }
80
+ options={ pageSelectOptions }
63
81
  onChange={ ( newValue ) => {
64
82
  onChangeView( {
65
83
  ...view,
66
84
  page: +newValue,
67
85
  } );
68
86
  } }
69
- size="compact"
87
+ size="small"
70
88
  __nextHasNoMarginBottom
89
+ variant="minimal"
71
90
  />
72
91
  ),
73
92
  }
@@ -84,7 +103,7 @@ function DataViewsPagination() {
84
103
  disabled={ currentPage === 1 }
85
104
  accessibleWhenDisabled
86
105
  label={ __( 'Previous page' ) }
87
- icon={ previous }
106
+ icon={ isRTL() ? next : previous }
88
107
  showTooltip
89
108
  size="compact"
90
109
  tooltipPosition="top"
@@ -96,7 +115,7 @@ function DataViewsPagination() {
96
115
  disabled={ currentPage >= totalPages }
97
116
  accessibleWhenDisabled
98
117
  label={ __( 'Next page' ) }
99
- icon={ next }
118
+ icon={ isRTL() ? previous : next }
100
119
  showTooltip
101
120
  size="compact"
102
121
  tooltipPosition="top"
@@ -1,26 +1,12 @@
1
- .dataviews-pagination {
2
- position: sticky;
3
- bottom: 0;
4
- left: 0;
5
- background-color: $white;
6
- padding: $grid-unit-15 $grid-unit-60;
7
- border-top: $border-width solid $gray-100;
8
- color: $gray-700;
9
- flex-shrink: 0;
10
- transition: padding ease-out 0.1s;
11
- @include reduce-motion("transition");
12
- }
13
-
14
- .dataviews-pagination__page-selection {
1
+ .dataviews-pagination__page-select {
15
2
  font-size: 11px;
16
- text-transform: uppercase;
17
3
  font-weight: 500;
18
- color: $gray-900;
19
- }
4
+ text-transform: uppercase;
20
5
 
21
- /* stylelint-disable-next-line scss/at-rule-no-unknown -- '@container' not globally permitted */
22
- @container (max-width: 430px) {
23
- .dataviews-pagination {
24
- padding: $grid-unit-15 $grid-unit-30;
6
+ @include break-small() {
7
+ .components-select-control__input {
8
+ font-size: 11px !important;
9
+ font-weight: 500;
10
+ }
25
11
  }
26
12
  }