@wordpress/dataviews 10.3.1-next.2f1c7c01b.0 → 10.4.1-next.dc3f6d3c1.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 (149) hide show
  1. package/CHANGELOG.md +23 -5
  2. package/README.md +413 -148
  3. package/build/components/dataviews-filters/filter.js +11 -1
  4. package/build/components/dataviews-filters/filter.js.map +2 -2
  5. package/build/components/dataviews-view-config/index.js +11 -396
  6. package/build/components/dataviews-view-config/index.js.map +3 -3
  7. package/build/components/dataviews-view-config/properties-section.js +177 -0
  8. package/build/components/dataviews-view-config/properties-section.js.map +7 -0
  9. package/build/constants.js +3 -0
  10. package/build/constants.js.map +2 -2
  11. package/build/dataform-controls/date.js +23 -7
  12. package/build/dataform-controls/date.js.map +2 -2
  13. package/build/dataform-controls/email.js +1 -1
  14. package/build/dataform-controls/email.js.map +1 -1
  15. package/build/dataform-layouts/details/index.js +78 -0
  16. package/build/dataform-layouts/details/index.js.map +7 -0
  17. package/build/dataform-layouts/index.js +5 -0
  18. package/build/dataform-layouts/index.js.map +3 -3
  19. package/build/dataform-layouts/normalize-form.js +5 -0
  20. package/build/dataform-layouts/normalize-form.js.map +2 -2
  21. package/build/dataviews-layouts/index.js +9 -0
  22. package/build/dataviews-layouts/index.js.map +3 -3
  23. package/build/dataviews-layouts/picker-table/index.js +422 -0
  24. package/build/dataviews-layouts/picker-table/index.js.map +7 -0
  25. package/build/dataviews-layouts/table/column-header-menu.js.map +2 -2
  26. package/build/dataviews-layouts/table/column-primary.js +1 -6
  27. package/build/dataviews-layouts/table/column-primary.js.map +2 -2
  28. package/build/dataviews-layouts/table/index.js +47 -2
  29. package/build/dataviews-layouts/table/index.js.map +2 -2
  30. package/build/field-types/date.js +4 -2
  31. package/build/field-types/date.js.map +2 -2
  32. package/build/types/dataform.js.map +1 -1
  33. package/build/types/dataviews.js.map +1 -1
  34. package/build/types/field-api.js.map +1 -1
  35. package/build/utils/normalize-fields.js +23 -3
  36. package/build/utils/normalize-fields.js.map +2 -2
  37. package/build/utils/week-starts-on.js +59 -0
  38. package/build/utils/week-starts-on.js.map +7 -0
  39. package/build-module/components/dataviews-filters/filter.js +11 -1
  40. package/build-module/components/dataviews-filters/filter.js.map +2 -2
  41. package/build-module/components/dataviews-view-config/index.js +15 -412
  42. package/build-module/components/dataviews-view-config/index.js.map +2 -2
  43. package/build-module/components/dataviews-view-config/properties-section.js +149 -0
  44. package/build-module/components/dataviews-view-config/properties-section.js.map +7 -0
  45. package/build-module/constants.js +2 -0
  46. package/build-module/constants.js.map +2 -2
  47. package/build-module/dataform-controls/date.js +23 -7
  48. package/build-module/dataform-controls/date.js.map +2 -2
  49. package/build-module/dataform-controls/email.js +2 -2
  50. package/build-module/dataform-controls/email.js.map +1 -1
  51. package/build-module/dataform-layouts/details/index.js +47 -0
  52. package/build-module/dataform-layouts/details/index.js.map +7 -0
  53. package/build-module/dataform-layouts/index.js +5 -0
  54. package/build-module/dataform-layouts/index.js.map +2 -2
  55. package/build-module/dataform-layouts/normalize-form.js +5 -0
  56. package/build-module/dataform-layouts/normalize-form.js.map +2 -2
  57. package/build-module/dataviews-layouts/index.js +11 -1
  58. package/build-module/dataviews-layouts/index.js.map +2 -2
  59. package/build-module/dataviews-layouts/picker-table/index.js +397 -0
  60. package/build-module/dataviews-layouts/picker-table/index.js.map +7 -0
  61. package/build-module/dataviews-layouts/table/column-header-menu.js.map +2 -2
  62. package/build-module/dataviews-layouts/table/column-primary.js +1 -6
  63. package/build-module/dataviews-layouts/table/column-primary.js.map +2 -2
  64. package/build-module/dataviews-layouts/table/index.js +48 -3
  65. package/build-module/dataviews-layouts/table/index.js.map +2 -2
  66. package/build-module/field-types/date.js +5 -3
  67. package/build-module/field-types/date.js.map +2 -2
  68. package/build-module/utils/normalize-fields.js +23 -3
  69. package/build-module/utils/normalize-fields.js.map +2 -2
  70. package/build-module/utils/week-starts-on.js +32 -0
  71. package/build-module/utils/week-starts-on.js.map +7 -0
  72. package/build-style/style-rtl.css +58 -54
  73. package/build-style/style.css +58 -54
  74. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  75. package/build-types/components/dataviews-filters/utils.d.ts.map +1 -1
  76. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  77. package/build-types/components/dataviews-view-config/properties-section.d.ts +4 -0
  78. package/build-types/components/dataviews-view-config/properties-section.d.ts.map +1 -0
  79. package/build-types/constants.d.ts +1 -0
  80. package/build-types/constants.d.ts.map +1 -1
  81. package/build-types/dataform-controls/date.d.ts.map +1 -1
  82. package/build-types/dataform-layouts/details/index.d.ts +6 -0
  83. package/build-types/dataform-layouts/details/index.d.ts.map +1 -0
  84. package/build-types/dataform-layouts/get-summary-fields.d.ts.map +1 -1
  85. package/build-types/dataform-layouts/index.d.ts +5 -0
  86. package/build-types/dataform-layouts/index.d.ts.map +1 -1
  87. package/build-types/dataform-layouts/normalize-form.d.ts.map +1 -1
  88. package/build-types/dataviews-layouts/index.d.ts +8 -0
  89. package/build-types/dataviews-layouts/index.d.ts.map +1 -1
  90. package/build-types/dataviews-layouts/picker-table/index.d.ts +4 -0
  91. package/build-types/dataviews-layouts/picker-table/index.d.ts.map +1 -0
  92. package/build-types/dataviews-layouts/table/column-header-menu.d.ts +3 -3
  93. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  94. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -1
  95. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  96. package/build-types/field-types/date.d.ts.map +1 -1
  97. package/build-types/stories/dataform.story.d.ts +3 -0
  98. package/build-types/stories/dataform.story.d.ts.map +1 -1
  99. package/build-types/stories/dataviews-picker.story.d.ts +2 -0
  100. package/build-types/stories/dataviews-picker.story.d.ts.map +1 -1
  101. package/build-types/stories/dataviews.story.d.ts +7 -1
  102. package/build-types/stories/dataviews.story.d.ts.map +1 -1
  103. package/build-types/stories/field-types.story.d.ts +27 -1
  104. package/build-types/stories/field-types.story.d.ts.map +1 -1
  105. package/build-types/types/dataform.d.ts +11 -3
  106. package/build-types/types/dataform.d.ts.map +1 -1
  107. package/build-types/types/dataviews.d.ts +23 -2
  108. package/build-types/types/dataviews.d.ts.map +1 -1
  109. package/build-types/types/field-api.d.ts +28 -1
  110. package/build-types/types/field-api.d.ts.map +1 -1
  111. package/build-types/utils/normalize-fields.d.ts.map +1 -1
  112. package/build-types/utils/week-starts-on.d.ts +20 -0
  113. package/build-types/utils/week-starts-on.d.ts.map +1 -0
  114. package/build-wp/index.js +1497 -1188
  115. package/package.json +15 -15
  116. package/src/components/dataviews/style.scss +2 -0
  117. package/src/components/dataviews-filters/filter.tsx +11 -1
  118. package/src/components/dataviews-footer/style.scss +1 -1
  119. package/src/components/dataviews-view-config/index.tsx +8 -504
  120. package/src/components/dataviews-view-config/properties-section.tsx +201 -0
  121. package/src/components/dataviews-view-config/style.scss +2 -39
  122. package/src/constants.ts +1 -0
  123. package/src/dataform-controls/date.tsx +24 -6
  124. package/src/dataform-controls/email.tsx +2 -2
  125. package/src/dataform-layouts/details/index.tsx +71 -0
  126. package/src/dataform-layouts/details/style.scss +5 -0
  127. package/src/dataform-layouts/index.tsx +5 -0
  128. package/src/dataform-layouts/normalize-form.ts +6 -0
  129. package/src/dataviews-layouts/index.ts +10 -0
  130. package/src/dataviews-layouts/list/style.scss +1 -0
  131. package/src/dataviews-layouts/picker-table/index.tsx +487 -0
  132. package/src/dataviews-layouts/picker-table/style.scss +47 -0
  133. package/src/dataviews-layouts/table/column-header-menu.tsx +3 -2
  134. package/src/dataviews-layouts/table/column-primary.tsx +4 -7
  135. package/src/dataviews-layouts/table/index.tsx +55 -2
  136. package/src/dataviews-layouts/table/style.scss +36 -19
  137. package/src/field-types/date.tsx +11 -5
  138. package/src/stories/dataform.story.tsx +84 -0
  139. package/src/stories/dataviews-picker.story.tsx +11 -6
  140. package/src/stories/dataviews.story.tsx +10 -2
  141. package/src/stories/field-types.story.tsx +67 -2
  142. package/src/style.scss +2 -0
  143. package/src/test/normalize-fields.ts +53 -0
  144. package/src/types/dataform.ts +18 -3
  145. package/src/types/dataviews.ts +36 -2
  146. package/src/types/field-api.ts +42 -1
  147. package/src/utils/normalize-fields.ts +51 -2
  148. package/src/utils/week-starts-on.ts +46 -0
  149. package/tsconfig.tsbuildinfo +1 -1
@@ -308,9 +308,36 @@ export type Field< Item > = {
308
308
  * Used for editing operations to update field values.
309
309
  */
310
310
  setValue?: ( args: { item: Item; value: any } ) => DeepPartial< Item >;
311
+
312
+ /**
313
+ * Display format configuration for fields.
314
+ */
315
+ format?: FormatDate;
311
316
  };
312
317
 
313
- export type NormalizedField< Item > = Omit< Field< Item >, 'Edit' > & {
318
+ /**
319
+ * Format for date fields:
320
+ *
321
+ * - date: the format string (e.g., 'F j, Y' for WordPress default format like 'March 10, 2023')
322
+ * - weekStartsOn: to specify the first day of the week ('sunday', 'monday', etc.).
323
+ *
324
+ * If not provided, defaults to WordPress date format settings.
325
+ */
326
+ type FormatDate = {
327
+ date?: string;
328
+ weekStartsOn?: DayString;
329
+ };
330
+ export type DayNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6;
331
+ export type DayString =
332
+ | 'sunday'
333
+ | 'monday'
334
+ | 'tuesday'
335
+ | 'wednesday'
336
+ | 'thursday'
337
+ | 'friday'
338
+ | 'saturday';
339
+
340
+ type NormalizedFieldBase< Item > = Omit< Field< Item >, 'Edit' > & {
314
341
  label: string;
315
342
  header: string | ReactElement;
316
343
  getValue: ( args: { item: Item } ) => any;
@@ -326,6 +353,20 @@ export type NormalizedField< Item > = Omit< Field< Item >, 'Edit' > & {
326
353
  readOnly: boolean;
327
354
  };
328
355
 
356
+ type NormalizedFieldDate< Item > = NormalizedFieldBase< Item > & {
357
+ type: 'date';
358
+ format: Required< FormatDate >;
359
+ };
360
+
361
+ type NormalizedFieldGeneric< Item > = NormalizedFieldBase< Item > & {
362
+ type?: Exclude< FieldType, 'date' >;
363
+ format: {};
364
+ };
365
+
366
+ export type NormalizedField< Item > =
367
+ | NormalizedFieldGeneric< Item >
368
+ | NormalizedFieldDate< Item >;
369
+
329
370
  /**
330
371
  * A collection of dataview fields for a data type.
331
372
  */
@@ -3,11 +3,17 @@
3
3
  */
4
4
  import type { FunctionComponent } from 'react';
5
5
 
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { getSettings } from '@wordpress/date';
10
+
6
11
  /**
7
12
  * Internal dependencies
8
13
  */
9
14
  import getFieldTypeDefinition from '../field-types';
10
15
  import type {
16
+ DayString,
11
17
  DataViewRenderFieldProps,
12
18
  Field,
13
19
  FieldTypeDefinition,
@@ -21,6 +27,7 @@ import {
21
27
  SINGLE_SELECTION_OPERATORS,
22
28
  } from '../constants';
23
29
  import hasElements from './has-elements';
30
+ import { numberToWeekStartsOn, DAYS_OF_WEEK } from './week-starts-on';
24
31
 
25
32
  const getValueFromId =
26
33
  ( id: string ) =>
@@ -182,8 +189,22 @@ export default function normalizeFields< Item >(
182
189
 
183
190
  const filterBy = getFilterBy( field, fieldTypeDefinition );
184
191
 
185
- return {
186
- ...field,
192
+ /**
193
+ * NormalizedField is a discriminated union type: the shape of the format property
194
+ * depends on the type property. For example, for the 'date' type, the format
195
+ * contains date or weekStartsOn — which are not valid for other types.
196
+ *
197
+ * Being type and format interdependent, we need to write the code
198
+ * in a way that TypeScript is able to statically infer the types.
199
+ * That's why we have a return branch for every item in the union type.
200
+ *
201
+ * See a longer explanation with examples at
202
+ * https://github.com/WordPress/gutenberg/pull/72999#discussion_r2523145453
203
+ */
204
+ const { type, ...fieldWithoutType } = field;
205
+
206
+ const baseField = {
207
+ ...fieldWithoutType,
187
208
  label: field.label || field.id,
188
209
  header: field.header || field.label || field.id,
189
210
  getValue,
@@ -200,6 +221,34 @@ export default function normalizeFields< Item >(
200
221
  true,
201
222
  filterBy,
202
223
  readOnly: field.readOnly ?? fieldTypeDefinition.readOnly ?? false,
224
+ format: {},
203
225
  };
226
+
227
+ if ( field.type === 'date' ) {
228
+ const format = {
229
+ date:
230
+ field.format?.date !== undefined &&
231
+ typeof field.format.date === 'string'
232
+ ? field.format.date
233
+ : getSettings().formats.date,
234
+ weekStartsOn:
235
+ field.format?.weekStartsOn !== undefined &&
236
+ DAYS_OF_WEEK.includes(
237
+ field.format?.weekStartsOn as DayString
238
+ )
239
+ ? field.format.weekStartsOn
240
+ : numberToWeekStartsOn(
241
+ getSettings().l10n.startOfWeek
242
+ ),
243
+ };
244
+
245
+ return {
246
+ ...baseField,
247
+ type: 'date',
248
+ format,
249
+ };
250
+ }
251
+
252
+ return { ...baseField, type: field.type, format: {} };
204
253
  } );
205
254
  }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import type { DayNumber, DayString } from '../types/field-api';
5
+
6
+ export const DAYS_OF_WEEK: DayString[] = [
7
+ 'sunday',
8
+ 'monday',
9
+ 'tuesday',
10
+ 'wednesday',
11
+ 'thursday',
12
+ 'friday',
13
+ 'saturday',
14
+ ];
15
+ const DEFAULT_DAY_STRING = 'sunday';
16
+ const DEFAULT_DAY_NUMBER = 0;
17
+
18
+ /**
19
+ * Converts a weekStartsOn string to a number (0-6).
20
+ *
21
+ * @param day - The day name ('sunday', 'monday', etc.)
22
+ * @return The corresponding number (0 for Sunday, 1 for Monday, etc.)
23
+ */
24
+ export function weekStartsOnToNumber( day: DayString ): DayNumber {
25
+ const index = DAYS_OF_WEEK.indexOf( day );
26
+ if ( index === -1 ) {
27
+ return DEFAULT_DAY_NUMBER;
28
+ }
29
+
30
+ return index as DayNumber;
31
+ }
32
+
33
+ /**
34
+ * Converts a weekStartsOn number (0-6) to a string.
35
+ *
36
+ * @param day - The day number (0 for Sunday, 1 for Monday, etc.)
37
+ * @return The corresponding day name ('sunday', 'monday', etc.)
38
+ */
39
+ export function numberToWeekStartsOn( day: DayNumber ): DayString {
40
+ const result = DAYS_OF_WEEK[ day ];
41
+ if ( result === undefined ) {
42
+ return DEFAULT_DAY_STRING;
43
+ }
44
+
45
+ return result;
46
+ }