@wordpress/dataviews 14.1.1-next.v.202604091042.0 → 14.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 (179) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/build/components/dataform-controls/array.cjs +2 -2
  3. package/build/components/dataform-controls/array.cjs.map +2 -2
  4. package/build/components/dataform-controls/date.cjs +16 -5
  5. package/build/components/dataform-controls/date.cjs.map +3 -3
  6. package/build/components/dataform-controls/datetime.cjs +6 -2
  7. package/build/components/dataform-controls/datetime.cjs.map +3 -3
  8. package/build/components/dataform-controls/utils/use-disabled-date-matchers.cjs +48 -0
  9. package/build/components/dataform-controls/utils/use-disabled-date-matchers.cjs.map +7 -0
  10. package/build/components/dataform-layouts/card/index.cjs.map +2 -2
  11. package/build/components/dataform-layouts/panel/summary-button.cjs +0 -1
  12. package/build/components/dataform-layouts/panel/summary-button.cjs.map +2 -2
  13. package/build/components/dataviews-context/index.cjs.map +1 -1
  14. package/build/components/dataviews-filters/search-widget.cjs +2 -7
  15. package/build/components/dataviews-filters/search-widget.cjs.map +2 -2
  16. package/build/components/dataviews-layouts/activity/activity-item.cjs +2 -3
  17. package/build/components/dataviews-layouts/activity/activity-item.cjs.map +2 -2
  18. package/build/components/dataviews-layouts/grid/composite-grid.cjs +2 -2
  19. package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
  20. package/build/components/dataviews-layouts/list/index.cjs +2 -2
  21. package/build/components/dataviews-layouts/list/index.cjs.map +2 -2
  22. package/build/components/dataviews-layouts/picker-grid/index.cjs +3 -6
  23. package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
  24. package/build/components/dataviews-layouts/picker-table/index.cjs +15 -12
  25. package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
  26. package/build/components/dataviews-layouts/table/index.cjs +0 -1
  27. package/build/components/dataviews-layouts/table/index.cjs.map +2 -2
  28. package/build/dataviews/index.cjs +10 -8
  29. package/build/dataviews/index.cjs.map +2 -2
  30. package/build/dataviews-picker/index.cjs +16 -9
  31. package/build/dataviews-picker/index.cjs.map +2 -2
  32. package/build/field-types/date.cjs +4 -1
  33. package/build/field-types/date.cjs.map +2 -2
  34. package/build/field-types/datetime.cjs +4 -1
  35. package/build/field-types/datetime.cjs.map +2 -2
  36. package/build/field-types/utils/get-is-valid.cjs +29 -24
  37. package/build/field-types/utils/get-is-valid.cjs.map +2 -2
  38. package/build/field-types/utils/is-valid-date-boundary.cjs +64 -0
  39. package/build/field-types/utils/is-valid-date-boundary.cjs.map +7 -0
  40. package/build/types/dataviews.cjs.map +1 -1
  41. package/build/types/field-api.cjs.map +1 -1
  42. package/build-module/components/dataform-controls/array.mjs +2 -2
  43. package/build-module/components/dataform-controls/array.mjs.map +2 -2
  44. package/build-module/components/dataform-controls/date.mjs +16 -5
  45. package/build-module/components/dataform-controls/date.mjs.map +2 -2
  46. package/build-module/components/dataform-controls/datetime.mjs +6 -2
  47. package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
  48. package/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs +27 -0
  49. package/build-module/components/dataform-controls/utils/use-disabled-date-matchers.mjs.map +7 -0
  50. package/build-module/components/dataform-layouts/card/index.mjs.map +2 -2
  51. package/build-module/components/dataform-layouts/panel/summary-button.mjs +0 -1
  52. package/build-module/components/dataform-layouts/panel/summary-button.mjs.map +2 -2
  53. package/build-module/components/dataviews-context/index.mjs.map +1 -1
  54. package/build-module/components/dataviews-filters/search-widget.mjs +3 -13
  55. package/build-module/components/dataviews-filters/search-widget.mjs.map +2 -2
  56. package/build-module/components/dataviews-layouts/activity/activity-item.mjs +2 -3
  57. package/build-module/components/dataviews-layouts/activity/activity-item.mjs.map +2 -2
  58. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs +2 -2
  59. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
  60. package/build-module/components/dataviews-layouts/list/index.mjs +2 -3
  61. package/build-module/components/dataviews-layouts/list/index.mjs.map +2 -2
  62. package/build-module/components/dataviews-layouts/picker-grid/index.mjs +3 -6
  63. package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
  64. package/build-module/components/dataviews-layouts/picker-table/index.mjs +15 -12
  65. package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
  66. package/build-module/components/dataviews-layouts/table/index.mjs +0 -1
  67. package/build-module/components/dataviews-layouts/table/index.mjs.map +2 -2
  68. package/build-module/dataviews/index.mjs +10 -8
  69. package/build-module/dataviews/index.mjs.map +2 -2
  70. package/build-module/dataviews-picker/index.mjs +16 -9
  71. package/build-module/dataviews-picker/index.mjs.map +2 -2
  72. package/build-module/field-types/date.mjs +4 -1
  73. package/build-module/field-types/date.mjs.map +2 -2
  74. package/build-module/field-types/datetime.mjs +4 -1
  75. package/build-module/field-types/datetime.mjs.map +2 -2
  76. package/build-module/field-types/utils/get-is-valid.mjs +29 -24
  77. package/build-module/field-types/utils/get-is-valid.mjs.map +2 -2
  78. package/build-module/field-types/utils/is-valid-date-boundary.mjs +38 -0
  79. package/build-module/field-types/utils/is-valid-date-boundary.mjs.map +7 -0
  80. package/build-style/style-rtl.css +12 -13
  81. package/build-style/style.css +12 -13
  82. package/build-types/components/dataform-controls/array.d.ts.map +1 -1
  83. package/build-types/components/dataform-controls/date.d.ts.map +1 -1
  84. package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
  85. package/build-types/components/dataform-controls/utils/use-disabled-date-matchers.d.ts +16 -0
  86. package/build-types/components/dataform-controls/utils/use-disabled-date-matchers.d.ts.map +1 -0
  87. package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
  88. package/build-types/components/dataform-layouts/panel/summary-button.d.ts.map +1 -1
  89. package/build-types/components/dataviews-context/index.d.ts +2 -2
  90. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  91. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -1
  92. package/build-types/components/dataviews-layouts/activity/activity-item.d.ts.map +1 -1
  93. package/build-types/components/dataviews-layouts/list/index.d.ts.map +1 -1
  94. package/build-types/components/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  95. package/build-types/components/dataviews-layouts/picker-table/index.d.ts.map +1 -1
  96. package/build-types/components/dataviews-layouts/table/index.d.ts.map +1 -1
  97. package/build-types/dataform/stories/index.story.d.ts.map +1 -1
  98. package/build-types/dataform/stories/layout-regular.d.ts.map +1 -1
  99. package/build-types/dataform/stories/validation.d.ts.map +1 -1
  100. package/build-types/dataviews/index.d.ts +1 -1
  101. package/build-types/dataviews/index.d.ts.map +1 -1
  102. package/build-types/dataviews/stories/free-composition.d.ts.map +1 -1
  103. package/build-types/dataviews/stories/index.story.d.ts.map +1 -1
  104. package/build-types/dataviews/stories/layout-activity.d.ts.map +1 -1
  105. package/build-types/dataviews/stories/layout-grid.d.ts.map +1 -1
  106. package/build-types/dataviews/stories/layout-list.d.ts.map +1 -1
  107. package/build-types/dataviews/stories/layout-table.d.ts.map +1 -1
  108. package/build-types/dataviews/stories/with-card.d.ts.map +1 -1
  109. package/build-types/dataviews-picker/index.d.ts +3 -2
  110. package/build-types/dataviews-picker/index.d.ts.map +1 -1
  111. package/build-types/dataviews-picker/stories/index.story.d.ts.map +1 -1
  112. package/build-types/field-types/date.d.ts +3 -0
  113. package/build-types/field-types/date.d.ts.map +1 -1
  114. package/build-types/field-types/datetime.d.ts +3 -0
  115. package/build-types/field-types/datetime.d.ts.map +1 -1
  116. package/build-types/field-types/utils/get-is-valid.d.ts.map +1 -1
  117. package/build-types/field-types/utils/is-valid-date-boundary.d.ts +7 -0
  118. package/build-types/field-types/utils/is-valid-date-boundary.d.ts.map +1 -0
  119. package/build-types/types/dataviews.d.ts +8 -0
  120. package/build-types/types/dataviews.d.ts.map +1 -1
  121. package/build-types/types/field-api.d.ts +11 -9
  122. package/build-types/types/field-api.d.ts.map +1 -1
  123. package/build-wp/index.js +1173 -1017
  124. package/package.json +16 -16
  125. package/src/components/dataform-controls/array.tsx +3 -2
  126. package/src/components/dataform-controls/date.tsx +17 -2
  127. package/src/components/dataform-controls/datetime.tsx +15 -1
  128. package/src/components/dataform-controls/utils/use-disabled-date-matchers.ts +48 -0
  129. package/src/components/dataform-layouts/card/index.tsx +0 -3
  130. package/src/components/dataform-layouts/panel/style.scss +4 -5
  131. package/src/components/dataform-layouts/panel/summary-button.tsx +0 -1
  132. package/src/components/dataviews-context/index.ts +2 -2
  133. package/src/components/dataviews-filters/search-widget.tsx +4 -14
  134. package/src/components/dataviews-filters/style.scss +2 -2
  135. package/src/components/dataviews-layouts/activity/activity-item.tsx +2 -3
  136. package/src/components/dataviews-layouts/activity/style.scss +1 -1
  137. package/src/components/dataviews-layouts/grid/composite-grid.tsx +3 -3
  138. package/src/components/dataviews-layouts/grid/style.scss +1 -1
  139. package/src/components/dataviews-layouts/list/index.tsx +2 -3
  140. package/src/components/dataviews-layouts/list/style.scss +1 -1
  141. package/src/components/dataviews-layouts/picker-grid/index.tsx +5 -9
  142. package/src/components/dataviews-layouts/picker-grid/style.scss +1 -1
  143. package/src/components/dataviews-layouts/picker-table/index.tsx +9 -7
  144. package/src/components/dataviews-layouts/picker-table/style.scss +1 -1
  145. package/src/components/dataviews-layouts/table/index.tsx +0 -2
  146. package/src/dataform/stories/content.story.tsx +1 -1
  147. package/src/dataform/stories/data-adapter.tsx +6 -6
  148. package/src/dataform/stories/layout-card.tsx +8 -8
  149. package/src/dataform/stories/layout-details.tsx +5 -5
  150. package/src/dataform/stories/layout-panel.tsx +9 -9
  151. package/src/dataform/stories/layout-regular.tsx +16 -9
  152. package/src/dataform/stories/layout-row.tsx +9 -9
  153. package/src/dataform/stories/validation.tsx +25 -10
  154. package/src/dataviews/index.tsx +11 -7
  155. package/src/dataviews/stories/empty.tsx +6 -6
  156. package/src/dataviews/stories/fixtures.tsx +2 -2
  157. package/src/dataviews/stories/free-composition.tsx +10 -13
  158. package/src/dataviews/stories/infinite-scroll.tsx +4 -4
  159. package/src/dataviews/stories/layout-activity.tsx +7 -9
  160. package/src/dataviews/stories/layout-custom.tsx +1 -1
  161. package/src/dataviews/stories/layout-grid.tsx +5 -7
  162. package/src/dataviews/stories/layout-list.tsx +6 -8
  163. package/src/dataviews/stories/layout-table.tsx +5 -7
  164. package/src/dataviews/stories/minimal-ui.tsx +1 -1
  165. package/src/dataviews/stories/with-card.tsx +4 -7
  166. package/src/dataviews/style.scss +1 -1
  167. package/src/dataviews/test/dataviews.tsx +73 -6
  168. package/src/dataviews-picker/index.tsx +17 -7
  169. package/src/dataviews-picker/stories/index.story.tsx +1 -5
  170. package/src/dataviews-picker/test/dataviews-picker.tsx +79 -2
  171. package/src/field-types/date.tsx +3 -0
  172. package/src/field-types/datetime.tsx +3 -0
  173. package/src/field-types/stories/index.story.tsx +1 -1
  174. package/src/field-types/test/normalize-fields.ts +44 -0
  175. package/src/field-types/utils/get-is-valid.ts +44 -31
  176. package/src/field-types/utils/is-valid-date-boundary.ts +80 -0
  177. package/src/hooks/test/use-form-validity.ts +479 -0
  178. package/src/types/dataviews.ts +9 -0
  179. package/src/types/field-api.ts +11 -9
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/field-types/utils/get-is-valid.ts"],
4
- "sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { Field, NormalizedRules } from '../../types';\nimport type { FieldType } from '../../types/private';\n\nexport default function getIsValid< Item >(\n\tfield: Field< Item >,\n\tfieldType: FieldType< Item >\n): NormalizedRules< Item > {\n\tlet required;\n\tif (\n\t\tfield.isValid?.required === true &&\n\t\tfieldType.validate.required !== undefined\n\t) {\n\t\trequired = {\n\t\t\tconstraint: true,\n\t\t\tvalidate: fieldType.validate.required,\n\t\t};\n\t}\n\n\tlet elements;\n\tif (\n\t\t( field.isValid?.elements === true ||\n\t\t\t// elements is enabled unless the field opts-out\n\t\t\t( field.isValid?.elements === undefined &&\n\t\t\t\t( !! field.elements || !! field.getElements ) ) ) &&\n\t\tfieldType.validate.elements !== undefined\n\t) {\n\t\telements = {\n\t\t\tconstraint: true,\n\t\t\tvalidate: fieldType.validate.elements,\n\t\t};\n\t}\n\n\tlet min;\n\tif (\n\t\ttypeof field.isValid?.min === 'number' &&\n\t\tfieldType.validate.min !== undefined\n\t) {\n\t\tmin = {\n\t\t\tconstraint: field.isValid.min,\n\t\t\tvalidate: fieldType.validate.min,\n\t\t};\n\t}\n\n\tlet max;\n\tif (\n\t\ttypeof field.isValid?.max === 'number' &&\n\t\tfieldType.validate.max !== undefined\n\t) {\n\t\tmax = {\n\t\t\tconstraint: field.isValid.max,\n\t\t\tvalidate: fieldType.validate.max,\n\t\t};\n\t}\n\n\tlet minLength;\n\tif (\n\t\ttypeof field.isValid?.minLength === 'number' &&\n\t\tfieldType.validate.minLength !== undefined\n\t) {\n\t\tminLength = {\n\t\t\tconstraint: field.isValid.minLength,\n\t\t\tvalidate: fieldType.validate.minLength,\n\t\t};\n\t}\n\n\tlet maxLength;\n\tif (\n\t\ttypeof field.isValid?.maxLength === 'number' &&\n\t\tfieldType.validate.maxLength !== undefined\n\t) {\n\t\tmaxLength = {\n\t\t\tconstraint: field.isValid.maxLength,\n\t\t\tvalidate: fieldType.validate.maxLength,\n\t\t};\n\t}\n\n\tlet pattern;\n\tif (\n\t\tfield.isValid?.pattern !== undefined &&\n\t\tfieldType.validate.pattern !== undefined\n\t) {\n\t\tpattern = {\n\t\t\tconstraint: field.isValid?.pattern,\n\t\t\tvalidate: fieldType.validate.pattern,\n\t\t};\n\t}\n\n\tconst custom = field.isValid?.custom ?? fieldType.validate.custom;\n\n\treturn {\n\t\trequired,\n\t\telements,\n\t\tmin,\n\t\tmax,\n\t\tminLength,\n\t\tmaxLength,\n\t\tpattern,\n\t\tcustom,\n\t};\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMe,SAAR,WACN,OACA,WAC0B;AAC1B,MAAI;AACJ,MACC,MAAM,SAAS,aAAa,QAC5B,UAAU,SAAS,aAAa,QAC/B;AACD,eAAW;AAAA,MACV,YAAY;AAAA,MACZ,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,MAAI;AACJ,OACG,MAAM,SAAS,aAAa;AAAA,EAE3B,MAAM,SAAS,aAAa,WAC3B,CAAC,CAAE,MAAM,YAAY,CAAC,CAAE,MAAM,iBAClC,UAAU,SAAS,aAAa,QAC/B;AACD,eAAW;AAAA,MACV,YAAY;AAAA,MACZ,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,MAAI;AACJ,MACC,OAAO,MAAM,SAAS,QAAQ,YAC9B,UAAU,SAAS,QAAQ,QAC1B;AACD,UAAM;AAAA,MACL,YAAY,MAAM,QAAQ;AAAA,MAC1B,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,MAAI;AACJ,MACC,OAAO,MAAM,SAAS,QAAQ,YAC9B,UAAU,SAAS,QAAQ,QAC1B;AACD,UAAM;AAAA,MACL,YAAY,MAAM,QAAQ;AAAA,MAC1B,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,MAAI;AACJ,MACC,OAAO,MAAM,SAAS,cAAc,YACpC,UAAU,SAAS,cAAc,QAChC;AACD,gBAAY;AAAA,MACX,YAAY,MAAM,QAAQ;AAAA,MAC1B,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,MAAI;AACJ,MACC,OAAO,MAAM,SAAS,cAAc,YACpC,UAAU,SAAS,cAAc,QAChC;AACD,gBAAY;AAAA,MACX,YAAY,MAAM,QAAQ;AAAA,MAC1B,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,MAAI;AACJ,MACC,MAAM,SAAS,YAAY,UAC3B,UAAU,SAAS,YAAY,QAC9B;AACD,cAAU;AAAA,MACT,YAAY,MAAM,SAAS;AAAA,MAC3B,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,QAAM,SAAS,MAAM,SAAS,UAAU,UAAU,SAAS;AAE3D,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { Field, NormalizedRules } from '../../types';\nimport type { FieldType } from '../../types/private';\n\nfunction supportsNumericRangeConstraint( type?: string ) {\n\treturn type === 'integer' || type === 'number';\n}\n\nfunction supportsDateRangeConstraint( type?: string ) {\n\treturn type === 'date' || type === 'datetime';\n}\n\nfunction normalizeRangeRule< Item >(\n\tvalue: number | string | undefined,\n\tfieldType: FieldType< Item >,\n\tkey: 'min' | 'max'\n): NormalizedRules< Item >[ 'min' ] {\n\tconst validator = fieldType.validate[ key ];\n\tif (\n\t\tvalidator &&\n\t\t( ( typeof value === 'number' &&\n\t\t\tsupportsNumericRangeConstraint( fieldType.type ) ) ||\n\t\t\t( typeof value === 'string' &&\n\t\t\t\tsupportsDateRangeConstraint( fieldType.type ) ) )\n\t) {\n\t\treturn { constraint: value, validate: validator } as NonNullable<\n\t\t\tNormalizedRules< Item >[ typeof key ]\n\t\t>;\n\t}\n\treturn undefined;\n}\n\nexport default function getIsValid< Item >(\n\tfield: Field< Item >,\n\tfieldType: FieldType< Item >\n): NormalizedRules< Item > {\n\tconst rules = field.isValid;\n\tlet required;\n\tif (\n\t\trules?.required === true &&\n\t\tfieldType.validate.required !== undefined\n\t) {\n\t\trequired = {\n\t\t\tconstraint: true,\n\t\t\tvalidate: fieldType.validate.required,\n\t\t};\n\t}\n\n\tlet elements;\n\tif (\n\t\t( rules?.elements === true ||\n\t\t\t// elements is enabled unless the field opts-out\n\t\t\t( rules?.elements === undefined &&\n\t\t\t\t( !! field.elements || !! field.getElements ) ) ) &&\n\t\tfieldType.validate.elements !== undefined\n\t) {\n\t\telements = {\n\t\t\tconstraint: true,\n\t\t\tvalidate: fieldType.validate.elements,\n\t\t};\n\t}\n\n\tconst min = normalizeRangeRule( rules?.min, fieldType, 'min' );\n\tconst max = normalizeRangeRule( rules?.max, fieldType, 'max' );\n\n\tconst minLengthValue = rules?.minLength;\n\tlet minLength;\n\tif (\n\t\ttypeof minLengthValue === 'number' &&\n\t\tfieldType.validate.minLength !== undefined\n\t) {\n\t\tminLength = {\n\t\t\tconstraint: minLengthValue,\n\t\t\tvalidate: fieldType.validate.minLength,\n\t\t};\n\t}\n\n\tconst maxLengthValue = rules?.maxLength;\n\tlet maxLength;\n\tif (\n\t\ttypeof maxLengthValue === 'number' &&\n\t\tfieldType.validate.maxLength !== undefined\n\t) {\n\t\tmaxLength = {\n\t\t\tconstraint: maxLengthValue,\n\t\t\tvalidate: fieldType.validate.maxLength,\n\t\t};\n\t}\n\n\tconst patternValue = rules?.pattern;\n\tlet pattern;\n\tif (\n\t\tpatternValue !== undefined &&\n\t\tfieldType.validate.pattern !== undefined\n\t) {\n\t\tpattern = {\n\t\t\tconstraint: patternValue,\n\t\t\tvalidate: fieldType.validate.pattern,\n\t\t};\n\t}\n\n\tconst custom = rules?.custom ?? fieldType.validate.custom;\n\n\treturn {\n\t\trequired,\n\t\telements,\n\t\tmin,\n\t\tmax,\n\t\tminLength,\n\t\tmaxLength,\n\t\tpattern,\n\t\tcustom,\n\t};\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,+BAAgC,MAAgB;AACxD,SAAO,SAAS,aAAa,SAAS;AACvC;AAEA,SAAS,4BAA6B,MAAgB;AACrD,SAAO,SAAS,UAAU,SAAS;AACpC;AAEA,SAAS,mBACR,OACA,WACA,KACmC;AACnC,QAAM,YAAY,UAAU,SAAU,GAAI;AAC1C,MACC,cACI,OAAO,UAAU,YACpB,+BAAgC,UAAU,IAAK,KAC7C,OAAO,UAAU,YAClB,4BAA6B,UAAU,IAAK,IAC7C;AACD,WAAO,EAAE,YAAY,OAAO,UAAU,UAAU;AAAA,EAGjD;AACA,SAAO;AACR;AAEe,SAAR,WACN,OACA,WAC0B;AAC1B,QAAM,QAAQ,MAAM;AACpB,MAAI;AACJ,MACC,OAAO,aAAa,QACpB,UAAU,SAAS,aAAa,QAC/B;AACD,eAAW;AAAA,MACV,YAAY;AAAA,MACZ,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,MAAI;AACJ,OACG,OAAO,aAAa;AAAA,EAEnB,OAAO,aAAa,WACnB,CAAC,CAAE,MAAM,YAAY,CAAC,CAAE,MAAM,iBAClC,UAAU,SAAS,aAAa,QAC/B;AACD,eAAW;AAAA,MACV,YAAY;AAAA,MACZ,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,QAAM,MAAM,mBAAoB,OAAO,KAAK,WAAW,KAAM;AAC7D,QAAM,MAAM,mBAAoB,OAAO,KAAK,WAAW,KAAM;AAE7D,QAAM,iBAAiB,OAAO;AAC9B,MAAI;AACJ,MACC,OAAO,mBAAmB,YAC1B,UAAU,SAAS,cAAc,QAChC;AACD,gBAAY;AAAA,MACX,YAAY;AAAA,MACZ,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,QAAM,iBAAiB,OAAO;AAC9B,MAAI;AACJ,MACC,OAAO,mBAAmB,YAC1B,UAAU,SAAS,cAAc,QAChC;AACD,gBAAY;AAAA,MACX,YAAY;AAAA,MACZ,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,QAAM,eAAe,OAAO;AAC5B,MAAI;AACJ,MACC,iBAAiB,UACjB,UAAU,SAAS,YAAY,QAC9B;AACD,cAAU;AAAA,MACT,YAAY;AAAA,MACZ,UAAU,UAAU,SAAS;AAAA,IAC9B;AAAA,EACD;AAEA,QAAM,SAAS,OAAO,UAAU,UAAU,SAAS;AAEnD,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // packages/dataviews/src/field-types/utils/is-valid-date-boundary.ts
21
+ var is_valid_date_boundary_exports = {};
22
+ __export(is_valid_date_boundary_exports, {
23
+ isValidMaxDate: () => isValidMaxDate,
24
+ isValidMinDate: () => isValidMinDate
25
+ });
26
+ module.exports = __toCommonJS(is_valid_date_boundary_exports);
27
+ var import_date_fns = require("date-fns");
28
+ var import_date = require("@wordpress/date");
29
+ function parseDateLike(value) {
30
+ if (!value) {
31
+ return null;
32
+ }
33
+ if (!(0, import_date_fns.isValid)(new Date(value))) {
34
+ return null;
35
+ }
36
+ const parsed = (0, import_date.getDate)(value);
37
+ return parsed && (0, import_date_fns.isValid)(parsed) ? parsed : null;
38
+ }
39
+ function validateDateLikeBoundary(item, field, boundary) {
40
+ const constraint = field.isValid[boundary]?.constraint;
41
+ if (typeof constraint !== "string") {
42
+ return false;
43
+ }
44
+ const value = field.getValue({ item });
45
+ const boundaryValue = Array.isArray(value) ? value[boundary === "min" ? 0 : value.length - 1] : value;
46
+ if (boundaryValue === void 0 || boundaryValue === null || boundaryValue === "") {
47
+ return true;
48
+ }
49
+ const parsedConstraint = parseDateLike(constraint);
50
+ const parsedValue = parseDateLike(String(boundaryValue));
51
+ return !!parsedConstraint && !!parsedValue && (boundary === "min" ? parsedValue.getTime() >= parsedConstraint.getTime() : parsedValue.getTime() <= parsedConstraint.getTime());
52
+ }
53
+ function isValidMinDate(item, field) {
54
+ return validateDateLikeBoundary(item, field, "min");
55
+ }
56
+ function isValidMaxDate(item, field) {
57
+ return validateDateLikeBoundary(item, field, "max");
58
+ }
59
+ // Annotate the CommonJS export names for ESM import in node:
60
+ 0 && (module.exports = {
61
+ isValidMaxDate,
62
+ isValidMinDate
63
+ });
64
+ //# sourceMappingURL=is-valid-date-boundary.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/field-types/utils/is-valid-date-boundary.ts"],
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport { isValid as isValidDate } from 'date-fns';\n\n/**\n * WordPress dependencies\n */\nimport { getDate } from '@wordpress/date';\n\n/**\n * Internal dependencies\n */\nimport type { NormalizedField } from '../../types';\n\ntype Boundary = 'min' | 'max';\n\nfunction parseDateLike( value?: string ) {\n\tif ( ! value ) {\n\t\treturn null;\n\t}\n\n\t// Pre-check to avoid passing unparseable strings to getDate,\n\t// which uses moment.js and emits deprecation warnings.\n\tif ( ! isValidDate( new Date( value ) ) ) {\n\t\treturn null;\n\t}\n\n\tconst parsed = getDate( value );\n\treturn parsed && isValidDate( parsed ) ? parsed : null;\n}\n\nfunction validateDateLikeBoundary< Item >(\n\titem: Item,\n\tfield: NormalizedField< Item >,\n\tboundary: Boundary\n): boolean {\n\tconst constraint = field.isValid[ boundary ]?.constraint;\n\tif ( typeof constraint !== 'string' ) {\n\t\treturn false;\n\t}\n\n\tconst value = field.getValue( { item } );\n\tconst boundaryValue = Array.isArray( value )\n\t\t? value[ boundary === 'min' ? 0 : value.length - 1 ]\n\t\t: value;\n\n\tif (\n\t\tboundaryValue === undefined ||\n\t\tboundaryValue === null ||\n\t\tboundaryValue === ''\n\t) {\n\t\treturn true;\n\t}\n\n\tconst parsedConstraint = parseDateLike( constraint );\n\tconst parsedValue = parseDateLike( String( boundaryValue ) );\n\n\treturn (\n\t\t!! parsedConstraint &&\n\t\t!! parsedValue &&\n\t\t( boundary === 'min'\n\t\t\t? parsedValue.getTime() >= parsedConstraint.getTime()\n\t\t\t: parsedValue.getTime() <= parsedConstraint.getTime() )\n\t);\n}\n\nexport function isValidMinDate< Item >(\n\titem: Item,\n\tfield: NormalizedField< Item >\n): boolean {\n\treturn validateDateLikeBoundary( item, field, 'min' );\n}\n\nexport function isValidMaxDate< Item >(\n\titem: Item,\n\tfield: NormalizedField< Item >\n): boolean {\n\treturn validateDateLikeBoundary( item, field, 'max' );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,sBAAuC;AAKvC,kBAAwB;AASxB,SAAS,cAAe,OAAiB;AACxC,MAAK,CAAE,OAAQ;AACd,WAAO;AAAA,EACR;AAIA,MAAK,KAAE,gBAAAA,SAAa,IAAI,KAAM,KAAM,CAAE,GAAI;AACzC,WAAO;AAAA,EACR;AAEA,QAAM,aAAS,qBAAS,KAAM;AAC9B,SAAO,cAAU,gBAAAA,SAAa,MAAO,IAAI,SAAS;AACnD;AAEA,SAAS,yBACR,MACA,OACA,UACU;AACV,QAAM,aAAa,MAAM,QAAS,QAAS,GAAG;AAC9C,MAAK,OAAO,eAAe,UAAW;AACrC,WAAO;AAAA,EACR;AAEA,QAAM,QAAQ,MAAM,SAAU,EAAE,KAAK,CAAE;AACvC,QAAM,gBAAgB,MAAM,QAAS,KAAM,IACxC,MAAO,aAAa,QAAQ,IAAI,MAAM,SAAS,CAAE,IACjD;AAEH,MACC,kBAAkB,UAClB,kBAAkB,QAClB,kBAAkB,IACjB;AACD,WAAO;AAAA,EACR;AAEA,QAAM,mBAAmB,cAAe,UAAW;AACnD,QAAM,cAAc,cAAe,OAAQ,aAAc,CAAE;AAE3D,SACC,CAAC,CAAE,oBACH,CAAC,CAAE,gBACD,aAAa,QACZ,YAAY,QAAQ,KAAK,iBAAiB,QAAQ,IAClD,YAAY,QAAQ,KAAK,iBAAiB,QAAQ;AAEvD;AAEO,SAAS,eACf,MACA,OACU;AACV,SAAO,yBAA0B,MAAM,OAAO,KAAM;AACrD;AAEO,SAAS,eACf,MACA,OACU;AACV,SAAO,yBAA0B,MAAM,OAAO,KAAM;AACrD;",
6
+ "names": ["isValidDate"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/dataviews.ts"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport type { ReactElement, ReactNode, ComponentProps } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport type { useFocusOnMount } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport type {\n\tNormalizedField,\n\tOperator,\n\tOption,\n\tSortDirection,\n} from './field-api';\nimport type { SetSelection } from './private';\n\n/**\n * The filters applied to the dataset.\n */\nexport interface Filter {\n\t/**\n\t * The field to filter by.\n\t */\n\tfield: string;\n\n\t/**\n\t * The operator to use.\n\t */\n\toperator: Operator;\n\n\t/**\n\t * The value to filter by.\n\t */\n\tvalue: any;\n\n\t/**\n\t * Whether the filter can be edited by the user.\n\t */\n\tisLocked?: boolean;\n}\n\nexport interface NormalizedFilter {\n\t/**\n\t * The field to filter by.\n\t */\n\tfield: string;\n\n\t/**\n\t * The field name.\n\t */\n\tname: string;\n\n\t/**\n\t * The list of options to pick from when using the field as a filter.\n\t */\n\telements?: Option[];\n\n\t/**\n\t * Retrieval function to get the elements.\n\t */\n\tgetElements?: () => Promise< Option[] >;\n\n\t/**\n\t * Whether the filter has elements.\n\t */\n\thasElements: boolean;\n\n\t/**\n\t * Is a single selection filter.\n\t */\n\tsingleSelection: boolean;\n\n\t/**\n\t * The list of operators supported by the field.\n\t */\n\toperators: Operator[];\n\n\t/**\n\t * Whether the filter is visible.\n\t */\n\tisVisible: boolean;\n\n\t/**\n\t * Whether it is a primary filter.\n\t */\n\tisPrimary: boolean;\n\n\t/**\n\t * Whether the filter can be edited by the user.\n\t */\n\tisLocked: boolean;\n}\n\ninterface ViewBase {\n\t/**\n\t * The layout of the view.\n\t */\n\ttype: string;\n\n\t/**\n\t * The global search term.\n\t */\n\tsearch?: string;\n\n\t/**\n\t * The filters to apply.\n\t */\n\tfilters?: Filter[];\n\n\t/**\n\t * The sorting configuration.\n\t */\n\tsort?: {\n\t\t/**\n\t\t * The field to sort by.\n\t\t */\n\t\tfield: string;\n\n\t\t/**\n\t\t * The direction to sort by.\n\t\t */\n\t\tdirection: SortDirection;\n\t};\n\n\t/**\n\t * The active page\n\t */\n\tpage?: number;\n\n\t/**\n\t * The number of items per page.\n\t * Also used as the batch size when infinite scroll is enabled.\n\t */\n\tperPage?: number;\n\n\t/**\n\t * The fields to render\n\t */\n\tfields?: string[];\n\n\t/**\n\t * Title field\n\t */\n\ttitleField?: string;\n\n\t/**\n\t * Media field\n\t */\n\tmediaField?: string;\n\n\t/**\n\t * Description field\n\t */\n\tdescriptionField?: string;\n\n\t/**\n\t * Whether to show the title\n\t */\n\tshowTitle?: boolean;\n\n\t/**\n\t * Whether to show the media\n\t */\n\tshowMedia?: boolean;\n\n\t/**\n\t * Whether to show the description\n\t */\n\tshowDescription?: boolean;\n\n\t/**\n\t * Whether to show the hierarchical levels.\n\t */\n\tshowLevels?: boolean;\n\n\t/**\n\t * The grouping configuration.\n\t */\n\tgroupBy?: {\n\t\t/**\n\t\t * The field to group by.\n\t\t */\n\t\tfield: string;\n\n\t\t/**\n\t\t * The direction to sort by.\n\t\t */\n\t\tdirection: SortDirection;\n\n\t\t/**\n\t\t * Whether to show the field label in the group header.\n\t\t *\n\t\t * @default true\n\t\t */\n\t\tshowLabel?: boolean;\n\t};\n\n\t/**\n\t * Whether infinite scroll is enabled.\n\t */\n\tinfiniteScrollEnabled?: boolean;\n\n\t/**\n\t * The start position for infinite scroll (1-indexed).\n\t * Used when infiniteScrollEnabled is true.\n\t */\n\tstartPosition?: number;\n}\n\nexport interface ColumnStyle {\n\t/**\n\t * The width of the field column.\n\t */\n\twidth?: string | number;\n\n\t/**\n\t * The minimum width of the field column.\n\t */\n\tmaxWidth?: string | number;\n\n\t/**\n\t * The maximum width of the field column.\n\t */\n\tminWidth?: string | number;\n\n\t/**\n\t * The alignment of the field column, defaults to left.\n\t */\n\talign?: 'start' | 'center' | 'end';\n}\n\nexport type Density = 'compact' | 'balanced' | 'comfortable';\n\nexport interface ViewTable extends ViewBase {\n\ttype: 'table';\n\n\tlayout?: {\n\t\t/**\n\t\t * The styles for the columns.\n\t\t */\n\t\tstyles?: Record< string, ColumnStyle >;\n\n\t\t/**\n\t\t * The density of the view.\n\t\t */\n\t\tdensity?: Density;\n\n\t\t/**\n\t\t * Whether the view allows column moving.\n\t\t */\n\t\tenableMoving?: boolean;\n\t};\n}\n\nexport interface ViewList extends ViewBase {\n\ttype: 'list';\n\n\tlayout?: {\n\t\t/**\n\t\t * The density of the view.\n\t\t */\n\t\tdensity?: Density;\n\t};\n}\n\nexport interface ViewActivity extends ViewBase {\n\ttype: 'activity';\n\n\tlayout?: {\n\t\t/**\n\t\t * The density of the view.\n\t\t */\n\t\tdensity?: Density;\n\t};\n}\n\nexport interface ViewGrid extends ViewBase {\n\ttype: 'grid';\n\n\tlayout?: {\n\t\t/**\n\t\t * The fields to use as badge fields.\n\t\t */\n\t\tbadgeFields?: string[];\n\n\t\t/**\n\t\t * The preview size of the grid.\n\t\t */\n\t\tpreviewSize?: number;\n\n\t\t/**\n\t\t * The density of the grid layout.\n\t\t */\n\t\tdensity?: Density;\n\t};\n}\n\nexport interface ViewPickerGrid extends ViewBase {\n\ttype: 'pickerGrid';\n\n\tlayout?: {\n\t\t/**\n\t\t * The fields to use as badge fields.\n\t\t */\n\t\tbadgeFields?: string[];\n\n\t\t/**\n\t\t * The preview size of the grid.\n\t\t */\n\t\tpreviewSize?: number;\n\n\t\t/**\n\t\t * The density of the grid layout.\n\t\t */\n\t\tdensity?: Density;\n\t};\n}\n\nexport interface ViewPickerTable extends ViewBase {\n\ttype: 'pickerTable';\n\n\tlayout?: {\n\t\t/**\n\t\t * The styles for the columns.\n\t\t */\n\t\tstyles?: Record< string, ColumnStyle >;\n\n\t\t/**\n\t\t * The density of the view.\n\t\t */\n\t\tdensity?: Density;\n\n\t\t/**\n\t\t * Whether the view allows column moving.\n\t\t */\n\t\tenableMoving?: boolean;\n\t};\n}\n\nexport type View =\n\t| ViewList\n\t| ViewGrid\n\t| ViewTable\n\t| ViewPickerGrid\n\t| ViewPickerTable\n\t| ViewActivity;\n\ninterface ActionBase< Item > {\n\t/**\n\t * The unique identifier of the action.\n\t */\n\tid: string;\n\n\t/**\n\t * The label of the action.\n\t * In case we want to adjust the label based on the selected items,\n\t * a function can be provided.\n\t */\n\tlabel: string | ( ( items: Item[] ) => string );\n\n\t/**\n\t * The icon of the action. (Either a string or an SVG element)\n\t * This should be IconType from the components package\n\t * but that import is breaking typescript build for the moment.\n\t */\n\ticon?: any;\n\n\t/**\n\t * Whether the action is disabled.\n\t */\n\tdisabled?: boolean;\n\n\t/**\n\t * Whether the action is a primary action.\n\t */\n\tisPrimary?: boolean;\n\n\t/**\n\t * Whether the item passed as an argument supports the current action.\n\t */\n\tisEligible?: ( item: Item ) => boolean;\n\n\t/**\n\t * Whether the action can be used as a bulk action.\n\t */\n\tsupportsBulk?: boolean;\n\n\t/**\n\t * The context in which the action is visible.\n\t * This is only a \"meta\" information for now.\n\t */\n\tcontext?: 'list' | 'single';\n}\n\nexport interface RenderModalProps< Item > {\n\titems: Item[];\n\tcloseModal?: () => void;\n\tonActionPerformed?: ( items: Item[] ) => void;\n}\n\nexport interface ActionModal< Item > extends ActionBase< Item > {\n\t/**\n\t * Modal to render when the action is triggered.\n\t */\n\tRenderModal: ( {\n\t\titems,\n\t\tcloseModal,\n\t\tonActionPerformed,\n\t}: RenderModalProps< Item > ) => ReactElement;\n\n\t/**\n\t * Whether to hide the modal header.\n\t */\n\thideModalHeader?: boolean;\n\n\t/**\n\t * The header of the modal.\n\t */\n\tmodalHeader?: string | ( ( items: Item[] ) => string );\n\n\t/**\n\t * The size of the modal.\n\t *\n\t * @default 'medium'\n\t */\n\tmodalSize?: 'small' | 'medium' | 'large' | 'fill';\n\n\t/**\n\t * The focus on mount property of the modal.\n\t */\n\tmodalFocusOnMount?:\n\t\t| Parameters< typeof useFocusOnMount >[ 0 ]\n\t\t| 'firstContentElement';\n}\n\nexport interface ActionButton< Item > extends ActionBase< Item > {\n\t/**\n\t * The callback to execute when the action is triggered.\n\t */\n\tcallback: (\n\t\titems: Item[],\n\t\tcontext: {\n\t\t\tregistry: any;\n\t\t\tonActionPerformed?: ( items: Item[] ) => void;\n\t\t}\n\t) => void;\n}\n\nexport type Action< Item > = ActionModal< Item > | ActionButton< Item >;\n\nexport interface ViewBaseProps< Item > {\n\tclassName?: string;\n\tactions: Action< Item >[];\n\tdata: Item[];\n\tfields: NormalizedField< Item >[];\n\tgetItemId: ( item: Item ) => string;\n\tgetItemLevel?: ( item: Item ) => number;\n\tisLoading?: boolean;\n\tonChangeView: ( view: View ) => void;\n\tonChangeSelection: SetSelection;\n\tselection: string[];\n\tsetOpenedFilter: ( fieldId: string ) => void;\n\tonClickItem?: ( item: Item ) => void;\n\trenderItemLink?: (\n\t\tprops: {\n\t\t\titem: Item;\n\t\t} & ComponentProps< 'a' >\n\t) => ReactElement;\n\tisItemClickable: ( item: Item ) => boolean;\n\tview: View;\n\tempty: ReactNode;\n}\n\nexport type ViewPickerBaseProps< Item > = Omit<\n\tViewBaseProps< Item >,\n\t| 'view'\n\t| 'onChangeView'\n\t// The following props are not supported for pickers.\n\t| 'isItemClickable'\n\t| 'onClickItem'\n\t| 'renderItemLink'\n\t| 'getItemLevel'\n> & {\n\tview: View;\n\tonChangeView: ( view: View ) => void;\n};\n\nexport interface ViewTableProps< Item > extends ViewBaseProps< Item > {\n\tview: ViewTable;\n}\n\nexport interface ViewListProps< Item > extends ViewBaseProps< Item > {\n\tview: ViewList;\n}\n\nexport interface ViewActivityProps< Item > extends ViewBaseProps< Item > {\n\tview: ViewActivity;\n}\n\nexport interface ViewGridProps< Item > extends ViewBaseProps< Item > {\n\tview: ViewGrid;\n}\n\nexport interface ViewPickerGridProps< Item >\n\textends Omit< ViewPickerBaseProps< Item >, 'view' > {\n\tview: ViewPickerGrid;\n}\n\nexport interface ViewPickerTableProps< Item >\n\textends Omit< ViewPickerBaseProps< Item >, 'view' > {\n\tview: ViewPickerTable;\n}\n\nexport type ViewProps< Item > =\n\t| ViewTableProps< Item >\n\t| ViewGridProps< Item >\n\t| ViewListProps< Item >\n\t| ViewActivityProps< Item >;\n\nexport type ViewPickerProps< Item > =\n\t| ViewPickerGridProps< Item >\n\t| ViewPickerTableProps< Item >;\n\nexport interface SupportedLayouts {\n\tlist?: Omit< ViewList, 'type' >;\n\tgrid?: Omit< ViewGrid, 'type' >;\n\ttable?: Omit< ViewTable, 'type' >;\n\tactivity?: Omit< ViewActivity, 'type' >;\n\tpickerGrid?: Omit< ViewPickerGrid, 'type' >;\n\tpickerTable?: Omit< ViewPickerTable, 'type' >;\n}\n"],
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport type { ReactElement, ReactNode, ComponentProps } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport type { useFocusOnMount } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport type {\n\tNormalizedField,\n\tOperator,\n\tOption,\n\tSortDirection,\n} from './field-api';\nimport type { SetSelection } from './private';\n\n/**\n * The filters applied to the dataset.\n */\nexport interface Filter {\n\t/**\n\t * The field to filter by.\n\t */\n\tfield: string;\n\n\t/**\n\t * The operator to use.\n\t */\n\toperator: Operator;\n\n\t/**\n\t * The value to filter by.\n\t */\n\tvalue: any;\n\n\t/**\n\t * Whether the filter can be edited by the user.\n\t */\n\tisLocked?: boolean;\n}\n\nexport interface NormalizedFilter {\n\t/**\n\t * The field to filter by.\n\t */\n\tfield: string;\n\n\t/**\n\t * The field name.\n\t */\n\tname: string;\n\n\t/**\n\t * The list of options to pick from when using the field as a filter.\n\t */\n\telements?: Option[];\n\n\t/**\n\t * Retrieval function to get the elements.\n\t */\n\tgetElements?: () => Promise< Option[] >;\n\n\t/**\n\t * Whether the filter has elements.\n\t */\n\thasElements: boolean;\n\n\t/**\n\t * Is a single selection filter.\n\t */\n\tsingleSelection: boolean;\n\n\t/**\n\t * The list of operators supported by the field.\n\t */\n\toperators: Operator[];\n\n\t/**\n\t * Whether the filter is visible.\n\t */\n\tisVisible: boolean;\n\n\t/**\n\t * Whether it is a primary filter.\n\t */\n\tisPrimary: boolean;\n\n\t/**\n\t * Whether the filter can be edited by the user.\n\t */\n\tisLocked: boolean;\n}\n\ninterface ViewBase {\n\t/**\n\t * The layout of the view.\n\t */\n\ttype: string;\n\n\t/**\n\t * The global search term.\n\t */\n\tsearch?: string;\n\n\t/**\n\t * The filters to apply.\n\t */\n\tfilters?: Filter[];\n\n\t/**\n\t * The sorting configuration.\n\t */\n\tsort?: {\n\t\t/**\n\t\t * The field to sort by.\n\t\t */\n\t\tfield: string;\n\n\t\t/**\n\t\t * The direction to sort by.\n\t\t */\n\t\tdirection: SortDirection;\n\t};\n\n\t/**\n\t * The active page\n\t */\n\tpage?: number;\n\n\t/**\n\t * The number of items per page.\n\t * Also used as the batch size when infinite scroll is enabled.\n\t */\n\tperPage?: number;\n\n\t/**\n\t * The fields to render\n\t */\n\tfields?: string[];\n\n\t/**\n\t * Title field\n\t */\n\ttitleField?: string;\n\n\t/**\n\t * Media field\n\t */\n\tmediaField?: string;\n\n\t/**\n\t * Description field\n\t */\n\tdescriptionField?: string;\n\n\t/**\n\t * Whether to show the title\n\t */\n\tshowTitle?: boolean;\n\n\t/**\n\t * Whether to show the media\n\t */\n\tshowMedia?: boolean;\n\n\t/**\n\t * Whether to show the description\n\t */\n\tshowDescription?: boolean;\n\n\t/**\n\t * Whether to show the hierarchical levels.\n\t */\n\tshowLevels?: boolean;\n\n\t/**\n\t * The grouping configuration.\n\t */\n\tgroupBy?: {\n\t\t/**\n\t\t * The field to group by.\n\t\t */\n\t\tfield: string;\n\n\t\t/**\n\t\t * The direction to sort by.\n\t\t */\n\t\tdirection: SortDirection;\n\n\t\t/**\n\t\t * Whether to show the field label in the group header.\n\t\t *\n\t\t * @default true\n\t\t */\n\t\tshowLabel?: boolean;\n\t};\n\n\t/**\n\t * Whether infinite scroll is enabled.\n\t */\n\tinfiniteScrollEnabled?: boolean;\n\n\t/**\n\t * The start position for infinite scroll (1-indexed).\n\t * Used when infiniteScrollEnabled is true.\n\t */\n\tstartPosition?: number;\n}\n\nexport interface ColumnStyle {\n\t/**\n\t * The width of the field column.\n\t */\n\twidth?: string | number;\n\n\t/**\n\t * The minimum width of the field column.\n\t */\n\tmaxWidth?: string | number;\n\n\t/**\n\t * The maximum width of the field column.\n\t */\n\tminWidth?: string | number;\n\n\t/**\n\t * The alignment of the field column, defaults to left.\n\t */\n\talign?: 'start' | 'center' | 'end';\n}\n\nexport type Density = 'compact' | 'balanced' | 'comfortable';\n\nexport interface ViewTable extends ViewBase {\n\ttype: 'table';\n\n\tlayout?: {\n\t\t/**\n\t\t * The styles for the columns.\n\t\t */\n\t\tstyles?: Record< string, ColumnStyle >;\n\n\t\t/**\n\t\t * The density of the view.\n\t\t */\n\t\tdensity?: Density;\n\n\t\t/**\n\t\t * Whether the view allows column moving.\n\t\t */\n\t\tenableMoving?: boolean;\n\t};\n}\n\nexport interface ViewList extends ViewBase {\n\ttype: 'list';\n\n\tlayout?: {\n\t\t/**\n\t\t * The density of the view.\n\t\t */\n\t\tdensity?: Density;\n\t};\n}\n\nexport interface ViewActivity extends ViewBase {\n\ttype: 'activity';\n\n\tlayout?: {\n\t\t/**\n\t\t * The density of the view.\n\t\t */\n\t\tdensity?: Density;\n\t};\n}\n\nexport interface ViewGrid extends ViewBase {\n\ttype: 'grid';\n\n\tlayout?: {\n\t\t/**\n\t\t * The fields to use as badge fields.\n\t\t */\n\t\tbadgeFields?: string[];\n\n\t\t/**\n\t\t * The preview size of the grid.\n\t\t */\n\t\tpreviewSize?: number;\n\n\t\t/**\n\t\t * The density of the grid layout.\n\t\t */\n\t\tdensity?: Density;\n\t};\n}\n\nexport interface ViewPickerGrid extends ViewBase {\n\ttype: 'pickerGrid';\n\n\tlayout?: {\n\t\t/**\n\t\t * The fields to use as badge fields.\n\t\t */\n\t\tbadgeFields?: string[];\n\n\t\t/**\n\t\t * The preview size of the grid.\n\t\t */\n\t\tpreviewSize?: number;\n\n\t\t/**\n\t\t * The density of the grid layout.\n\t\t */\n\t\tdensity?: Density;\n\t};\n}\n\nexport interface ViewPickerTable extends ViewBase {\n\ttype: 'pickerTable';\n\n\tlayout?: {\n\t\t/**\n\t\t * The styles for the columns.\n\t\t */\n\t\tstyles?: Record< string, ColumnStyle >;\n\n\t\t/**\n\t\t * The density of the view.\n\t\t */\n\t\tdensity?: Density;\n\n\t\t/**\n\t\t * Whether the view allows column moving.\n\t\t */\n\t\tenableMoving?: boolean;\n\t};\n}\n\nexport type View =\n\t| ViewList\n\t| ViewGrid\n\t| ViewTable\n\t| ViewPickerGrid\n\t| ViewPickerTable\n\t| ViewActivity;\n\ninterface ActionBase< Item > {\n\t/**\n\t * The unique identifier of the action.\n\t */\n\tid: string;\n\n\t/**\n\t * The label of the action.\n\t * In case we want to adjust the label based on the selected items,\n\t * a function can be provided.\n\t */\n\tlabel: string | ( ( items: Item[] ) => string );\n\n\t/**\n\t * The icon of the action. (Either a string or an SVG element)\n\t * This should be IconType from the components package\n\t * but that import is breaking typescript build for the moment.\n\t */\n\ticon?: any;\n\n\t/**\n\t * Whether the action is disabled.\n\t */\n\tdisabled?: boolean;\n\n\t/**\n\t * Whether the action is a primary action.\n\t */\n\tisPrimary?: boolean;\n\n\t/**\n\t * Whether the item passed as an argument supports the current action.\n\t */\n\tisEligible?: ( item: Item ) => boolean;\n\n\t/**\n\t * Whether the action can be used as a bulk action.\n\t */\n\tsupportsBulk?: boolean;\n\n\t/**\n\t * The context in which the action is visible.\n\t * This is only a \"meta\" information for now.\n\t */\n\tcontext?: 'list' | 'single';\n}\n\nexport interface RenderModalProps< Item > {\n\titems: Item[];\n\tcloseModal?: () => void;\n\tonActionPerformed?: ( items: Item[] ) => void;\n}\n\nexport interface ActionModal< Item > extends ActionBase< Item > {\n\t/**\n\t * Modal to render when the action is triggered.\n\t */\n\tRenderModal: ( {\n\t\titems,\n\t\tcloseModal,\n\t\tonActionPerformed,\n\t}: RenderModalProps< Item > ) => ReactElement;\n\n\t/**\n\t * Whether to hide the modal header.\n\t */\n\thideModalHeader?: boolean;\n\n\t/**\n\t * The header of the modal.\n\t */\n\tmodalHeader?: string | ( ( items: Item[] ) => string );\n\n\t/**\n\t * The size of the modal.\n\t *\n\t * @default 'medium'\n\t */\n\tmodalSize?: 'small' | 'medium' | 'large' | 'fill';\n\n\t/**\n\t * The focus on mount property of the modal.\n\t */\n\tmodalFocusOnMount?:\n\t\t| Parameters< typeof useFocusOnMount >[ 0 ]\n\t\t| 'firstContentElement';\n}\n\nexport interface ActionButton< Item > extends ActionBase< Item > {\n\t/**\n\t * The callback to execute when the action is triggered.\n\t */\n\tcallback: (\n\t\titems: Item[],\n\t\tcontext: {\n\t\t\tregistry: any;\n\t\t\tonActionPerformed?: ( items: Item[] ) => void;\n\t\t}\n\t) => void;\n}\n\nexport type Action< Item > = ActionModal< Item > | ActionButton< Item >;\n\nexport interface ViewBaseProps< Item > {\n\tclassName?: string;\n\tactions: Action< Item >[];\n\tdata: Item[];\n\tfields: NormalizedField< Item >[];\n\tgetItemId: ( item: Item ) => string;\n\tgetItemLevel?: ( item: Item ) => number;\n\tisLoading?: boolean;\n\tonChangeView: ( view: View ) => void;\n\tonChangeSelection: SetSelection;\n\tselection: string[];\n\tsetOpenedFilter: ( fieldId: string ) => void;\n\tonClickItem?: ( item: Item ) => void;\n\trenderItemLink?: (\n\t\tprops: {\n\t\t\titem: Item;\n\t\t} & ComponentProps< 'a' >\n\t) => ReactElement;\n\tisItemClickable: ( item: Item ) => boolean;\n\tview: View;\n\tempty: ReactNode;\n}\n\nexport type ViewPickerBaseProps< Item > = Omit<\n\tViewBaseProps< Item >,\n\t| 'view'\n\t| 'onChangeView'\n\t// The following props are not supported for pickers.\n\t| 'isItemClickable'\n\t| 'onClickItem'\n\t| 'renderItemLink'\n\t| 'getItemLevel'\n> & {\n\tview: View;\n\tonChangeView: ( view: View ) => void;\n};\n\nexport interface ViewTableProps< Item > extends ViewBaseProps< Item > {\n\tview: ViewTable;\n}\n\nexport interface ViewListProps< Item > extends ViewBaseProps< Item > {\n\tview: ViewList;\n}\n\nexport interface ViewActivityProps< Item > extends ViewBaseProps< Item > {\n\tview: ViewActivity;\n}\n\nexport interface ViewGridProps< Item > extends ViewBaseProps< Item > {\n\tview: ViewGrid;\n}\n\nexport interface ViewPickerGridProps< Item >\n\textends Omit< ViewPickerBaseProps< Item >, 'view' > {\n\tview: ViewPickerGrid;\n}\n\nexport interface ViewPickerTableProps< Item >\n\textends Omit< ViewPickerBaseProps< Item >, 'view' > {\n\tview: ViewPickerTable;\n}\n\nexport type ViewProps< Item > =\n\t| ViewTableProps< Item >\n\t| ViewGridProps< Item >\n\t| ViewListProps< Item >\n\t| ViewActivityProps< Item >;\n\nexport type ViewPickerProps< Item > =\n\t| ViewPickerGridProps< Item >\n\t| ViewPickerTableProps< Item >;\n\nexport interface SupportedLayouts {\n\tlist?: Omit< ViewList, 'type' > | true;\n\tgrid?: Omit< ViewGrid, 'type' > | true;\n\ttable?: Omit< ViewTable, 'type' > | true;\n\tactivity?: Omit< ViewActivity, 'type' > | true;\n\tpickerGrid?: Omit< ViewPickerGrid, 'type' > | true;\n\tpickerTable?: Omit< ViewPickerTable, 'type' > | true;\n}\n\nexport interface NormalizedSupportedLayouts {\n\tlist?: Omit< ViewList, 'type' >;\n\tgrid?: Omit< ViewGrid, 'type' >;\n\ttable?: Omit< ViewTable, 'type' >;\n\tactivity?: Omit< ViewActivity, 'type' >;\n\tpickerGrid?: Omit< ViewPickerGrid, 'type' >;\n\tpickerTable?: Omit< ViewPickerTable, 'type' >;\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/field-api.ts"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport type { ReactElement, ComponentType } from 'react';\n\n/**\n * Utility type that makes all properties of T optional recursively.\n * Used by field setValue functions to allow partial item updates.\n */\nexport type DeepPartial< T > = {\n\t[ P in keyof T ]?: T[ P ] extends object ? DeepPartial< T[ P ] > : T[ P ];\n};\n\nexport type SortDirection = 'asc' | 'desc';\n\n/**\n * Generic option type.\n */\nexport interface Option< Value extends any = any > {\n\tvalue: Value;\n\tlabel: string;\n\tdescription?: string;\n}\n\nexport interface FilterByConfig {\n\t/**\n\t * The list of operators supported by the field.\n\t */\n\toperators?: Operator[];\n\n\t/**\n\t * Whether it is a primary filter.\n\t *\n\t * A primary filter is always visible and is not listed in the \"Add filter\" component,\n\t * except for the list layout where it behaves like a secondary filter.\n\t */\n\tisPrimary?: boolean;\n}\n\nexport type Operator =\n\t| 'is'\n\t| 'isNot'\n\t| 'isAny'\n\t| 'isNone'\n\t| 'isAll'\n\t| 'isNotAll'\n\t| 'lessThan'\n\t| 'greaterThan'\n\t| 'lessThanOrEqual'\n\t| 'greaterThanOrEqual'\n\t| 'before'\n\t| 'after'\n\t| 'beforeInc'\n\t| 'afterInc'\n\t| 'contains'\n\t| 'notContains'\n\t| 'startsWith'\n\t| 'between'\n\t| 'on'\n\t| 'notOn'\n\t| 'inThePast'\n\t| 'over';\n\nexport type FieldTypeName =\n\t| 'text'\n\t| 'integer'\n\t| 'number'\n\t| 'datetime'\n\t| 'date'\n\t| 'media'\n\t| 'boolean'\n\t| 'email'\n\t| 'password'\n\t| 'telephone'\n\t| 'color'\n\t| 'url'\n\t| 'array';\n\nexport type Rules< Item > = {\n\trequired?: boolean;\n\telements?: boolean;\n\tpattern?: string;\n\tminLength?: number;\n\tmaxLength?: number;\n\tmin?: number;\n\tmax?: number;\n\tcustom?:\n\t\t| ( ( item: Item, field: NormalizedField< Item > ) => null | string )\n\t\t| ( (\n\t\t\t\titem: Item,\n\t\t\t\tfield: NormalizedField< Item >\n\t\t ) => Promise< null | string > );\n};\n\nexport type Validator< Item > = (\n\titem: Item,\n\tfield: NormalizedField< Item >\n) => boolean;\n\nexport type CustomValidator< Item > =\n\t| ( ( item: Item, field: NormalizedField< Item > ) => null | string )\n\t| ( (\n\t\t\titem: Item,\n\t\t\tfield: NormalizedField< Item >\n\t ) => Promise< null | string > );\n\nexport type FilterOperator< Item > = (\n\titem: Item,\n\tfield: NormalizedField< Item >,\n\tfilterValue: any\n) => boolean;\n\nexport type FilterOperatorMap< Item > = Partial<\n\tRecord< Operator, FilterOperator< Item > >\n>;\n\ntype NormalizedRule< Item, ConstraintType > = {\n\tconstraint: ConstraintType;\n\tvalidate: Validator< Item >;\n};\n\nexport type NormalizedRules< Item > = {\n\trequired?: NormalizedRule< Item, boolean >;\n\telements?: NormalizedRule< Item, boolean >;\n\tpattern?: NormalizedRule< Item, string >;\n\tminLength?: NormalizedRule< Item, number >;\n\tmaxLength?: NormalizedRule< Item, number >;\n\tmin?: NormalizedRule< Item, number >;\n\tmax?: NormalizedRule< Item, number >;\n\tcustom?: CustomValidator< Item >;\n};\n\n/**\n * Edit configuration for textarea controls.\n */\nexport type EditConfigTextarea = {\n\tcontrol: 'textarea';\n\t/**\n\t * Number of rows for the textarea.\n\t */\n\trows?: number;\n};\n\n/**\n * Edit configuration for text controls.\n */\nexport type EditConfigText = {\n\tcontrol: 'text';\n\t/**\n\t * Prefix component to display before the input.\n\t */\n\tprefix?: React.ComponentType;\n\t/**\n\t * Suffix component to display after the input.\n\t */\n\tsuffix?: React.ComponentType;\n};\n\n/**\n * Edit configuration for datetime controls.\n */\nexport type EditConfigDatetime = {\n\tcontrol: 'datetime';\n\t/**\n\t * Whether to render a compact version without the calendar widget.\n\t */\n\tcompact?: boolean;\n};\n\n/**\n * Edit configuration for other control types (excluding 'text', 'textarea', and 'datetime').\n */\nexport type EditConfigGeneric = {\n\tcontrol: Exclude< FieldTypeName, 'text' | 'textarea' | 'datetime' >;\n};\n\n/**\n * Edit configuration object with type-safe control options.\n * Each control type has its own specific configuration properties.\n */\nexport type EditConfig =\n\t| EditConfigTextarea\n\t| EditConfigText\n\t| EditConfigDatetime\n\t| EditConfigGeneric;\n\n/**\n * A dataview field for a specific property of a data type.\n */\nexport type Field< Item > = {\n\t/**\n\t * Type of the fields.\n\t */\n\ttype?: FieldTypeName;\n\n\t/**\n\t * The unique identifier of the field.\n\t */\n\tid: string;\n\n\t/**\n\t * The label of the field. Defaults to the id.\n\t */\n\tlabel?: string;\n\n\t/**\n\t * The header of the field. Defaults to the label.\n\t * It allows the usage of a React Element to render the field labels.\n\t */\n\theader?: string | ReactElement;\n\n\t/**\n\t * A description of the field.\n\t */\n\tdescription?: string | ReactElement;\n\n\t/**\n\t * Placeholder for the field.\n\t */\n\tplaceholder?: string;\n\n\t/**\n\t * Callback used to render the field. Defaults to `field.getValue`.\n\t */\n\trender?: ComponentType< DataViewRenderFieldProps< Item > >;\n\n\t/**\n\t * Callback used to render an edit control for the field.\n\t */\n\tEdit?: ComponentType< DataFormControlProps< Item > > | string | EditConfig;\n\n\t/**\n\t * Callback used to sort the field.\n\t */\n\tsort?: ( a: Item, b: Item, direction: SortDirection ) => number;\n\n\t/**\n\t * Callback used to validate the field.\n\t */\n\tisValid?: Rules< Item >;\n\n\t/**\n\t * Callback used to decide if a field should be displayed.\n\t */\n\tisVisible?: ( item: Item ) => boolean;\n\n\t/**\n\t * Whether a field should be disabled.\n\t * Can be a boolean or a callback receiving the current item and field.\n\t * Defaults to false.\n\t */\n\tisDisabled?:\n\t\t| boolean\n\t\t| ( ( args: {\n\t\t\t\titem: Item;\n\t\t\t\tfield: NormalizedField< Item >;\n\t\t } ) => boolean );\n\n\t/**\n\t * Whether the field is sortable.\n\t */\n\tenableSorting?: boolean;\n\n\t/**\n\t * Whether the field is searchable.\n\t */\n\tenableGlobalSearch?: boolean;\n\n\t/**\n\t * Whether the field can be hidden in the UI.\n\t */\n\tenableHiding?: boolean;\n\n\t/**\n\t * The list of options to pick from when using the field as a filter.\n\t */\n\telements?: Option[];\n\n\t/**\n\t * Retrieval function for elements.\n\t */\n\tgetElements?: () => Promise< Option[] >;\n\n\t/**\n\t * Filter config for the field.\n\t */\n\tfilterBy?: FilterByConfig | false;\n\n\t/**\n\t * Whether the field is readOnly.\n\t * If `true`, the value will be rendered using the `render` callback.\n\t */\n\treadOnly?: boolean;\n\n\t/**\n\t * Callback used to retrieve the value of the field from the item.\n\t * Defaults to `item[ field.id ]`.\n\t */\n\tgetValue?: ( args: { item: Item } ) => any;\n\n\t/**\n\t * Callback used to set the value of the field on the item.\n\t * Used for editing operations to update field values.\n\t */\n\tsetValue?: ( args: { item: Item; value: any } ) => DeepPartial< Item >;\n\n\t/**\n\t * Display format configuration for fields.\n\t */\n\tformat?: FormatDatetime | FormatDate | FormatNumber | FormatInteger;\n\n\t/**\n\t * Callback used to format the value of the field for display.\n\t */\n\tgetValueFormatted?: ( {\n\t\titem,\n\t\tfield,\n\t}: {\n\t\titem: Item;\n\t\tfield: NormalizedField< Item >;\n\t} ) => string;\n};\n\n/**\n * Format for datetime fields:\n *\n * - datetime: the format string (e.g., \"M j, Y g:i a\" for \"Jan 1, 2021 2:30 pm\").\n * - weekStartsOn: to specify the first day of the week (0 for 'sunday', 1 for 'monday', etc.).\n *\n * If not provided, defaults to WordPress date format settings.\n */\nexport type FormatDatetime = {\n\tdatetime?: string;\n\tweekStartsOn?: DayNumber;\n};\n\n/**\n * Format for date fields:\n *\n * - date: the format string (e.g., 'F j, Y' for 'March 10, 2023')\n * - weekStartsOn: to specify the first day of the week (0 for 'sunday', 1 for 'monday', etc.).\n *\n * If not provided, defaults to WordPress date format settings.\n */\nexport type FormatDate = {\n\tdate?: string;\n\tweekStartsOn?: DayNumber;\n};\nexport type DayNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n/**\n * Format for number fields:\n *\n * - separatorThousand: character to use for thousand separators (e.g., ',')\n * - separatorDecimal: character to use for decimal point (e.g., '.')\n * - decimals: number of decimal places to display (e.g., 2)\n *\n * If not provided, defaults to ',' for thousands, '.' for decimal, 2 decimals.\n */\nexport type FormatNumber = {\n\tseparatorThousand?: string;\n\tseparatorDecimal?: string;\n\tdecimals?: number;\n};\n\n/**\n * Format for integer fields:\n *\n * - separatorThousand: character to use for thousand separators (e.g., ',')\n *\n * If not provided, defaults to ',' for thousands.\n */\nexport type FormatInteger = {\n\tseparatorThousand?: string;\n};\n\nexport type NormalizedField< Item > = Omit<\n\tField< Item >,\n\t'Edit' | 'isValid'\n> & {\n\tlabel: string;\n\theader: string | ReactElement;\n\tgetValue: ( args: { item: Item } ) => any;\n\tsetValue: ( args: { item: Item; value: any } ) => DeepPartial< Item >;\n\trender: ComponentType< DataViewRenderFieldProps< Item > >;\n\tEdit: ComponentType< DataFormControlProps< Item > > | null;\n\thasElements: boolean;\n\tsort: ( a: Item, b: Item, direction: SortDirection ) => number;\n\tisValid: NormalizedRules< Item >;\n\tenableHiding: boolean;\n\tenableSorting: boolean;\n\tfilterBy: Required< FilterByConfig > | false;\n\tfilter: FilterOperatorMap< Item >;\n\treadOnly: boolean;\n\tisDisabled: ( args: {\n\t\titem: Item;\n\t\tfield: NormalizedField< Item >;\n\t} ) => boolean;\n\tformat:\n\t\t| {}\n\t\t| Required< FormatDate >\n\t\t| Required< FormatInteger >\n\t\t| Required< FormatNumber >;\n\tgetValueFormatted: ( {\n\t\titem,\n\t\tfield,\n\t}: {\n\t\titem: Item;\n\t\tfield: NormalizedField< Item >;\n\t} ) => string;\n};\n\n/**\n * A collection of dataview fields for a data type.\n */\nexport type Fields< Item > = Field< Item >[];\n\nexport type FieldValidity = {\n\trequired?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage?: string;\n\t};\n\tpattern?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmin?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmax?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tminLength?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmaxLength?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\telements?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tcustom?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tchildren?: Record< string, FieldValidity >;\n};\n\nexport type DataFormControlProps< Item > = {\n\tdata: Item;\n\tfield: NormalizedField< Item >;\n\tonChange: ( value: DeepPartial< Item > ) => void;\n\thideLabelFromVision?: boolean;\n\t/**\n\t * Label the control as \"optional\" when _not_ required, instead of showing \"required\".\n\t */\n\tmarkWhenOptional?: boolean;\n\t/**\n\t * The currently selected filter operator for this field.\n\t *\n\t * Used by DataViews filters to determine which control to render based on the operator type.\n\t */\n\toperator?: Operator;\n\t/**\n\t * Validity information for the field, if any.\n\t */\n\tvalidity?: FieldValidity;\n\t/**\n\t * Configuration object for the control.\n\t */\n\tconfig?: {\n\t\tprefix?: React.ComponentType;\n\t\tsuffix?: React.ComponentType;\n\t\trows?: number;\n\t\tcompact?: boolean;\n\t};\n};\n\nexport type DataViewRenderFieldProps< Item > = {\n\titem: Item;\n\tfield: NormalizedField< Item >;\n\tconfig?: {\n\t\tsizes: string;\n\t};\n};\n"],
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport type { ReactElement, ComponentType } from 'react';\n\n/**\n * Utility type that makes all properties of T optional recursively.\n * Used by field setValue functions to allow partial item updates.\n */\nexport type DeepPartial< T > = {\n\t[ P in keyof T ]?: T[ P ] extends object ? DeepPartial< T[ P ] > : T[ P ];\n};\n\nexport type SortDirection = 'asc' | 'desc';\n\n/**\n * Generic option type.\n */\nexport interface Option< Value extends any = any > {\n\tvalue: Value;\n\tlabel: string;\n\tdescription?: string;\n}\n\nexport interface FilterByConfig {\n\t/**\n\t * The list of operators supported by the field.\n\t */\n\toperators?: Operator[];\n\n\t/**\n\t * Whether it is a primary filter.\n\t *\n\t * A primary filter is always visible and is not listed in the \"Add filter\" component,\n\t * except for the list layout where it behaves like a secondary filter.\n\t */\n\tisPrimary?: boolean;\n}\n\nexport type Operator =\n\t| 'is'\n\t| 'isNot'\n\t| 'isAny'\n\t| 'isNone'\n\t| 'isAll'\n\t| 'isNotAll'\n\t| 'lessThan'\n\t| 'greaterThan'\n\t| 'lessThanOrEqual'\n\t| 'greaterThanOrEqual'\n\t| 'before'\n\t| 'after'\n\t| 'beforeInc'\n\t| 'afterInc'\n\t| 'contains'\n\t| 'notContains'\n\t| 'startsWith'\n\t| 'between'\n\t| 'on'\n\t| 'notOn'\n\t| 'inThePast'\n\t| 'over';\n\nexport type FieldTypeName =\n\t| 'text'\n\t| 'integer'\n\t| 'number'\n\t| 'datetime'\n\t| 'date'\n\t| 'media'\n\t| 'boolean'\n\t| 'email'\n\t| 'password'\n\t| 'telephone'\n\t| 'color'\n\t| 'url'\n\t| 'array';\n\nexport type Rules< Item > = {\n\trequired?: boolean;\n\telements?: boolean;\n\tpattern?: string;\n\tminLength?: number;\n\tmaxLength?: number;\n\tmin?: number | string;\n\tmax?: number | string;\n\tcustom?:\n\t\t| ( ( item: Item, field: NormalizedField< Item > ) => null | string )\n\t\t| ( (\n\t\t\t\titem: Item,\n\t\t\t\tfield: NormalizedField< Item >\n\t\t ) => Promise< null | string > );\n};\n\nexport type Validator< Item > = (\n\titem: Item,\n\tfield: NormalizedField< Item >\n) => boolean;\n\nexport type CustomValidator< Item > =\n\t| ( ( item: Item, field: NormalizedField< Item > ) => null | string )\n\t| ( (\n\t\t\titem: Item,\n\t\t\tfield: NormalizedField< Item >\n\t ) => Promise< null | string > );\n\nexport type FilterOperator< Item > = (\n\titem: Item,\n\tfield: NormalizedField< Item >,\n\tfilterValue: any\n) => boolean;\n\nexport type FilterOperatorMap< Item > = Partial<\n\tRecord< Operator, FilterOperator< Item > >\n>;\n\ntype NormalizedRule< Item, ConstraintType > = {\n\tconstraint: ConstraintType;\n\tvalidate: Validator< Item >;\n};\n\nexport type NormalizedRules< Item > = {\n\trequired?: NormalizedRule< Item, boolean >;\n\telements?: NormalizedRule< Item, boolean >;\n\tpattern?: NormalizedRule< Item, string >;\n\tminLength?: NormalizedRule< Item, number >;\n\tmaxLength?: NormalizedRule< Item, number >;\n\tmin?: NormalizedRule< Item, number > | NormalizedRule< Item, string >;\n\tmax?: NormalizedRule< Item, number > | NormalizedRule< Item, string >;\n\tcustom?: CustomValidator< Item >;\n};\n\n/**\n * Edit configuration for textarea controls.\n */\nexport type EditConfigTextarea = {\n\tcontrol: 'textarea';\n\t/**\n\t * Number of rows for the textarea.\n\t */\n\trows?: number;\n};\n\n/**\n * Edit configuration for text controls.\n */\nexport type EditConfigText = {\n\tcontrol: 'text';\n\t/**\n\t * Prefix component to display before the input.\n\t */\n\tprefix?: React.ComponentType;\n\t/**\n\t * Suffix component to display after the input.\n\t */\n\tsuffix?: React.ComponentType;\n};\n\n/**\n * Edit configuration for datetime controls.\n */\nexport type EditConfigDatetime = {\n\tcontrol: 'datetime';\n\t/**\n\t * Whether to render a compact version without the calendar widget.\n\t */\n\tcompact?: boolean;\n};\n\n/**\n * Edit configuration for other control types (excluding 'text', 'textarea', and 'datetime').\n */\nexport type EditConfigGeneric = {\n\tcontrol: Exclude< FieldTypeName, 'text' | 'textarea' | 'datetime' >;\n};\n\n/**\n * Edit configuration object with type-safe control options.\n * Each control type has its own specific configuration properties.\n */\nexport type EditConfig =\n\t| EditConfigTextarea\n\t| EditConfigText\n\t| EditConfigDatetime\n\t| EditConfigGeneric;\n\nexport type Field< Item > = {\n\t/**\n\t * Type of the field.\n\t */\n\ttype?: FieldTypeName;\n\n\t/**\n\t * The unique identifier of the field.\n\t */\n\tid: string;\n\n\t/**\n\t * The label of the field. Defaults to the id.\n\t */\n\tlabel?: string;\n\n\t/**\n\t * The header of the field. Defaults to the label.\n\t * It allows the usage of a React Element to render the field labels.\n\t */\n\theader?: string | ReactElement;\n\n\t/**\n\t * A description of the field.\n\t */\n\tdescription?: string | ReactElement;\n\n\t/**\n\t * Placeholder for the field.\n\t */\n\tplaceholder?: string;\n\n\t/**\n\t * Callback used to render the field. Defaults to `field.getValue`.\n\t */\n\trender?: ComponentType< DataViewRenderFieldProps< Item > >;\n\n\t/**\n\t * Callback used to render an edit control for the field.\n\t */\n\tEdit?: ComponentType< DataFormControlProps< Item > > | string | EditConfig;\n\n\t/**\n\t * Callback used to sort the field.\n\t */\n\tsort?: ( a: Item, b: Item, direction: SortDirection ) => number;\n\n\t/**\n\t * Validation config for the field.\n\t *\n\t * Range rules are normalized according to `type`:\n\t * - `'integer' | 'number'`: `min`/`max` accept `number`\n\t * - `'date' | 'datetime'`: `min`/`max` accept `string`\n\t * - all other field types ignore `min`/`max`\n\t */\n\tisValid?: Rules< Item >;\n\n\t/**\n\t * Callback used to decide if a field should be displayed.\n\t */\n\tisVisible?: ( item: Item ) => boolean;\n\n\t/**\n\t * Whether a field should be disabled.\n\t * Can be a boolean or a callback receiving the current item and field.\n\t * Defaults to false.\n\t */\n\tisDisabled?:\n\t\t| boolean\n\t\t| ( ( args: {\n\t\t\t\titem: Item;\n\t\t\t\tfield: NormalizedField< Item >;\n\t\t } ) => boolean );\n\n\t/**\n\t * Whether the field is sortable.\n\t */\n\tenableSorting?: boolean;\n\n\t/**\n\t * Whether the field is searchable.\n\t */\n\tenableGlobalSearch?: boolean;\n\n\t/**\n\t * Whether the field can be hidden in the UI.\n\t */\n\tenableHiding?: boolean;\n\n\t/**\n\t * The list of options to pick from when using the field as a filter.\n\t */\n\telements?: Option[];\n\n\t/**\n\t * Retrieval function for elements.\n\t */\n\tgetElements?: () => Promise< Option[] >;\n\n\t/**\n\t * Filter config for the field.\n\t */\n\tfilterBy?: FilterByConfig | false;\n\n\t/**\n\t * Whether the field is readOnly.\n\t * If `true`, the value will be rendered using the `render` callback.\n\t */\n\treadOnly?: boolean;\n\n\t/**\n\t * Callback used to retrieve the value of the field from the item.\n\t * Defaults to `item[ field.id ]`.\n\t */\n\tgetValue?: ( args: { item: Item } ) => any;\n\n\t/**\n\t * Callback used to set the value of the field on the item.\n\t * Used for editing operations to update field values.\n\t */\n\tsetValue?: ( args: { item: Item; value: any } ) => DeepPartial< Item >;\n\n\t/**\n\t * Display format configuration for fields.\n\t */\n\tformat?: FormatDatetime | FormatDate | FormatNumber | FormatInteger;\n\n\t/**\n\t * Callback used to format the value of the field for display.\n\t */\n\tgetValueFormatted?: ( {\n\t\titem,\n\t\tfield,\n\t}: {\n\t\titem: Item;\n\t\tfield: NormalizedField< Item >;\n\t} ) => string;\n};\n\n/**\n * Format for datetime fields:\n *\n * - datetime: the format string (e.g., \"M j, Y g:i a\" for \"Jan 1, 2021 2:30 pm\").\n * - weekStartsOn: to specify the first day of the week (0 for 'sunday', 1 for 'monday', etc.).\n *\n * If not provided, defaults to WordPress date format settings.\n */\nexport type FormatDatetime = {\n\tdatetime?: string;\n\tweekStartsOn?: DayNumber;\n};\n\n/**\n * Format for date fields:\n *\n * - date: the format string (e.g., 'F j, Y' for 'March 10, 2023')\n * - weekStartsOn: to specify the first day of the week (0 for 'sunday', 1 for 'monday', etc.).\n *\n * If not provided, defaults to WordPress date format settings.\n */\nexport type FormatDate = {\n\tdate?: string;\n\tweekStartsOn?: DayNumber;\n};\nexport type DayNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\n/**\n * Format for number fields:\n *\n * - separatorThousand: character to use for thousand separators (e.g., ',')\n * - separatorDecimal: character to use for decimal point (e.g., '.')\n * - decimals: number of decimal places to display (e.g., 2)\n *\n * If not provided, defaults to ',' for thousands, '.' for decimal, 2 decimals.\n */\nexport type FormatNumber = {\n\tseparatorThousand?: string;\n\tseparatorDecimal?: string;\n\tdecimals?: number;\n};\n\n/**\n * Format for integer fields:\n *\n * - separatorThousand: character to use for thousand separators (e.g., ',')\n *\n * If not provided, defaults to ',' for thousands.\n */\nexport type FormatInteger = {\n\tseparatorThousand?: string;\n};\n\nexport type NormalizedField< Item > = Omit<\n\tField< Item >,\n\t'Edit' | 'isValid'\n> & {\n\tlabel: string;\n\theader: string | ReactElement;\n\tgetValue: ( args: { item: Item } ) => any;\n\tsetValue: ( args: { item: Item; value: any } ) => DeepPartial< Item >;\n\trender: ComponentType< DataViewRenderFieldProps< Item > >;\n\tEdit: ComponentType< DataFormControlProps< Item > > | null;\n\thasElements: boolean;\n\tsort: ( a: Item, b: Item, direction: SortDirection ) => number;\n\tisValid: NormalizedRules< Item >;\n\tenableHiding: boolean;\n\tenableSorting: boolean;\n\tfilterBy: Required< FilterByConfig > | false;\n\tfilter: FilterOperatorMap< Item >;\n\treadOnly: boolean;\n\tisDisabled: ( args: {\n\t\titem: Item;\n\t\tfield: NormalizedField< Item >;\n\t} ) => boolean;\n\tformat:\n\t\t| {}\n\t\t| Required< FormatDate >\n\t\t| Required< FormatInteger >\n\t\t| Required< FormatNumber >;\n\tgetValueFormatted: ( {\n\t\titem,\n\t\tfield,\n\t}: {\n\t\titem: Item;\n\t\tfield: NormalizedField< Item >;\n\t} ) => string;\n};\n\n/**\n * A collection of dataview fields for a data type.\n */\nexport type Fields< Item > = Field< Item >[];\n\nexport type FieldValidity = {\n\trequired?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage?: string;\n\t};\n\tpattern?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmin?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmax?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tminLength?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tmaxLength?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\telements?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tcustom?: {\n\t\ttype: 'valid' | 'invalid' | 'validating';\n\t\tmessage: string;\n\t};\n\tchildren?: Record< string, FieldValidity >;\n};\n\nexport type DataFormControlProps< Item > = {\n\tdata: Item;\n\tfield: NormalizedField< Item >;\n\tonChange: ( value: DeepPartial< Item > ) => void;\n\thideLabelFromVision?: boolean;\n\t/**\n\t * Label the control as \"optional\" when _not_ required, instead of showing \"required\".\n\t */\n\tmarkWhenOptional?: boolean;\n\t/**\n\t * The currently selected filter operator for this field.\n\t *\n\t * Used by DataViews filters to determine which control to render based on the operator type.\n\t */\n\toperator?: Operator;\n\t/**\n\t * Validity information for the field, if any.\n\t */\n\tvalidity?: FieldValidity;\n\t/**\n\t * Configuration object for the control.\n\t */\n\tconfig?: {\n\t\tprefix?: React.ComponentType;\n\t\tsuffix?: React.ComponentType;\n\t\trows?: number;\n\t\tcompact?: boolean;\n\t};\n};\n\nexport type DataViewRenderFieldProps< Item > = {\n\titem: Item;\n\tfield: NormalizedField< Item >;\n\tconfig?: {\n\t\tsizes: string;\n\t};\n};\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -14,7 +14,7 @@ function ArrayControl({
14
14
  markWhenOptional,
15
15
  validity
16
16
  }) {
17
- const { label, placeholder, getValue, setValue, isValid } = field;
17
+ const { label, placeholder, description, getValue, setValue, isValid } = field;
18
18
  const value = getValue({ item: data });
19
19
  const disabled = field.isDisabled({ item: data, field });
20
20
  const { elements, isLoading } = useElements({
@@ -66,7 +66,7 @@ function ArrayControl({
66
66
  return true;
67
67
  },
68
68
  __experimentalExpandOnFocus: elements && elements.length > 0,
69
- __experimentalShowHowTo: !field.isValid?.elements,
69
+ help: description ?? (field.isValid?.elements ? "" : void 0),
70
70
  displayTransform: (token) => {
71
71
  if (typeof token === "object" && "label" in token) {
72
72
  return token.label;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/dataform-controls/array.tsx"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { privateApis, Spinner } from '@wordpress/components';\nimport { useCallback, useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport type { DataFormControlProps } from '../../types';\nimport { unlock } from '../../lock-unlock';\nimport getCustomValidity from './utils/get-custom-validity';\nimport useElements from '../../hooks/use-elements';\n\nconst { ValidatedFormTokenField } = unlock( privateApis );\n\nexport default function ArrayControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tconst { label, placeholder, getValue, setValue, isValid } = field;\n\tconst value = getValue( { item: data } );\n\tconst disabled = field.isDisabled( { item: data, field } );\n\n\tconst { elements, isLoading } = useElements( {\n\t\telements: field.elements,\n\t\tgetElements: field.getElements,\n\t} );\n\n\t// Convert stored values to element objects for the token field\n\tconst arrayValueAsElements = useMemo(\n\t\t() =>\n\t\t\tArray.isArray( value )\n\t\t\t\t? value.map( ( token ) => {\n\t\t\t\t\t\tconst element = elements?.find(\n\t\t\t\t\t\t\t( suggestion ) => suggestion.value === token\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn element || { value: token, label: token };\n\t\t\t\t } )\n\t\t\t\t: [],\n\t\t[ value, elements ]\n\t);\n\n\tconst onChangeControl = useCallback(\n\t\t( tokens: ( string | { value: string; label?: string } )[] ) => {\n\t\t\tconst valueTokens = tokens.map( ( token ) => {\n\t\t\t\tif ( typeof token === 'object' && 'value' in token ) {\n\t\t\t\t\treturn token.value;\n\t\t\t\t}\n\t\t\t\t// If it's a string, it's either a new suggestion value or user input\n\t\t\t\treturn token;\n\t\t\t} );\n\n\t\t\tonChange( setValue( { item: data, value: valueTokens } ) );\n\t\t},\n\t\t[ onChange, setValue, data ]\n\t);\n\n\tif ( isLoading ) {\n\t\treturn <Spinner />;\n\t}\n\n\treturn (\n\t\t<ValidatedFormTokenField\n\t\t\trequired={ !! isValid?.required }\n\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\tcustomValidity={ getCustomValidity( isValid, validity ) }\n\t\t\tlabel={ hideLabelFromVision ? undefined : label }\n\t\t\tvalue={ arrayValueAsElements }\n\t\t\tonChange={ onChangeControl }\n\t\t\tplaceholder={ placeholder }\n\t\t\tsuggestions={ elements?.map( ( element ) => element.value ) }\n\t\t\tdisabled={ disabled }\n\t\t\t__experimentalValidateInput={ ( token: string ) => {\n\t\t\t\t// If elements validation is required, check if token is valid\n\t\t\t\tif ( field.isValid?.elements && elements ) {\n\t\t\t\t\treturn elements.some(\n\t\t\t\t\t\t( element ) =>\n\t\t\t\t\t\t\telement.value === token || element.label === token\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// For non-elements validation, allow all tokens\n\t\t\t\treturn true;\n\t\t\t} }\n\t\t\t__experimentalExpandOnFocus={ elements && elements.length > 0 }\n\t\t\t__experimentalShowHowTo={ ! field.isValid?.elements }\n\t\t\tdisplayTransform={ ( token: any ) => {\n\t\t\t\t// For existing tokens (element objects), display their label\n\t\t\t\tif ( typeof token === 'object' && 'label' in token ) {\n\t\t\t\t\treturn token.label;\n\t\t\t\t}\n\t\t\t\t// For suggestions (value strings), find the corresponding element and show its label\n\t\t\t\tif ( typeof token === 'string' && elements ) {\n\t\t\t\t\tconst element = elements.find(\n\t\t\t\t\t\t( el ) => el.value === token\n\t\t\t\t\t);\n\t\t\t\t\treturn element?.label || token;\n\t\t\t\t}\n\t\t\t\treturn token;\n\t\t\t} }\n\t\t\t__experimentalRenderItem={ ( { item }: { item: any } ) => {\n\t\t\t\t// Custom rendering for suggestion items (item is a value string)\n\t\t\t\tif ( typeof item === 'string' && elements ) {\n\t\t\t\t\tconst element = elements.find(\n\t\t\t\t\t\t( el ) => el.value === item\n\t\t\t\t\t);\n\t\t\t\t\treturn <span>{ element?.label || item }</span>;\n\t\t\t\t}\n\t\t\t\treturn <span>{ item }</span>;\n\t\t\t} }\n\t\t/>\n\t);\n}\n"],
5
- "mappings": ";AAGA,SAAS,aAAa,eAAe;AACrC,SAAS,aAAa,eAAe;AAMrC,SAAS,cAAc;AACvB,OAAO,uBAAuB;AAC9B,OAAO,iBAAiB;AAmDf;AAjDT,IAAM,EAAE,wBAAwB,IAAI,OAAQ,WAAY;AAEzC,SAAR,aAAuC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,QAAM,EAAE,OAAO,aAAa,UAAU,UAAU,QAAQ,IAAI;AAC5D,QAAM,QAAQ,SAAU,EAAE,MAAM,KAAK,CAAE;AACvC,QAAM,WAAW,MAAM,WAAY,EAAE,MAAM,MAAM,MAAM,CAAE;AAEzD,QAAM,EAAE,UAAU,UAAU,IAAI,YAAa;AAAA,IAC5C,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,EACpB,CAAE;AAGF,QAAM,uBAAuB;AAAA,IAC5B,MACC,MAAM,QAAS,KAAM,IAClB,MAAM,IAAK,CAAE,UAAW;AACxB,YAAM,UAAU,UAAU;AAAA,QACzB,CAAE,eAAgB,WAAW,UAAU;AAAA,MACxC;AACA,aAAO,WAAW,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,IAC/C,CAAE,IACF,CAAC;AAAA,IACL,CAAE,OAAO,QAAS;AAAA,EACnB;AAEA,QAAM,kBAAkB;AAAA,IACvB,CAAE,WAA8D;AAC/D,YAAM,cAAc,OAAO,IAAK,CAAE,UAAW;AAC5C,YAAK,OAAO,UAAU,YAAY,WAAW,OAAQ;AACpD,iBAAO,MAAM;AAAA,QACd;AAEA,eAAO;AAAA,MACR,CAAE;AAEF,eAAU,SAAU,EAAE,MAAM,MAAM,OAAO,YAAY,CAAE,CAAE;AAAA,IAC1D;AAAA,IACA,CAAE,UAAU,UAAU,IAAK;AAAA,EAC5B;AAEA,MAAK,WAAY;AAChB,WAAO,oBAAC,WAAQ;AAAA,EACjB;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA,UAAW,CAAC,CAAE,SAAS;AAAA,MACvB;AAAA,MACA,gBAAiB,kBAAmB,SAAS,QAAS;AAAA,MACtD,OAAQ,sBAAsB,SAAY;AAAA,MAC1C,OAAQ;AAAA,MACR,UAAW;AAAA,MACX;AAAA,MACA,aAAc,UAAU,IAAK,CAAE,YAAa,QAAQ,KAAM;AAAA,MAC1D;AAAA,MACA,6BAA8B,CAAE,UAAmB;AAElD,YAAK,MAAM,SAAS,YAAY,UAAW;AAC1C,iBAAO,SAAS;AAAA,YACf,CAAE,YACD,QAAQ,UAAU,SAAS,QAAQ,UAAU;AAAA,UAC/C;AAAA,QACD;AAGA,eAAO;AAAA,MACR;AAAA,MACA,6BAA8B,YAAY,SAAS,SAAS;AAAA,MAC5D,yBAA0B,CAAE,MAAM,SAAS;AAAA,MAC3C,kBAAmB,CAAE,UAAgB;AAEpC,YAAK,OAAO,UAAU,YAAY,WAAW,OAAQ;AACpD,iBAAO,MAAM;AAAA,QACd;AAEA,YAAK,OAAO,UAAU,YAAY,UAAW;AAC5C,gBAAM,UAAU,SAAS;AAAA,YACxB,CAAE,OAAQ,GAAG,UAAU;AAAA,UACxB;AACA,iBAAO,SAAS,SAAS;AAAA,QAC1B;AACA,eAAO;AAAA,MACR;AAAA,MACA,0BAA2B,CAAE,EAAE,KAAK,MAAsB;AAEzD,YAAK,OAAO,SAAS,YAAY,UAAW;AAC3C,gBAAM,UAAU,SAAS;AAAA,YACxB,CAAE,OAAQ,GAAG,UAAU;AAAA,UACxB;AACA,iBAAO,oBAAC,UAAO,mBAAS,SAAS,MAAM;AAAA,QACxC;AACA,eAAO,oBAAC,UAAO,gBAAM;AAAA,MACtB;AAAA;AAAA,EACD;AAEF;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { privateApis, Spinner } from '@wordpress/components';\nimport { useCallback, useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport type { DataFormControlProps } from '../../types';\nimport { unlock } from '../../lock-unlock';\nimport getCustomValidity from './utils/get-custom-validity';\nimport useElements from '../../hooks/use-elements';\n\nconst { ValidatedFormTokenField } = unlock( privateApis );\n\nexport default function ArrayControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tconst { label, placeholder, description, getValue, setValue, isValid } =\n\t\tfield;\n\tconst value = getValue( { item: data } );\n\tconst disabled = field.isDisabled( { item: data, field } );\n\n\tconst { elements, isLoading } = useElements( {\n\t\telements: field.elements,\n\t\tgetElements: field.getElements,\n\t} );\n\n\t// Convert stored values to element objects for the token field\n\tconst arrayValueAsElements = useMemo(\n\t\t() =>\n\t\t\tArray.isArray( value )\n\t\t\t\t? value.map( ( token ) => {\n\t\t\t\t\t\tconst element = elements?.find(\n\t\t\t\t\t\t\t( suggestion ) => suggestion.value === token\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn element || { value: token, label: token };\n\t\t\t\t } )\n\t\t\t\t: [],\n\t\t[ value, elements ]\n\t);\n\n\tconst onChangeControl = useCallback(\n\t\t( tokens: ( string | { value: string; label?: string } )[] ) => {\n\t\t\tconst valueTokens = tokens.map( ( token ) => {\n\t\t\t\tif ( typeof token === 'object' && 'value' in token ) {\n\t\t\t\t\treturn token.value;\n\t\t\t\t}\n\t\t\t\t// If it's a string, it's either a new suggestion value or user input\n\t\t\t\treturn token;\n\t\t\t} );\n\n\t\t\tonChange( setValue( { item: data, value: valueTokens } ) );\n\t\t},\n\t\t[ onChange, setValue, data ]\n\t);\n\n\tif ( isLoading ) {\n\t\treturn <Spinner />;\n\t}\n\n\treturn (\n\t\t<ValidatedFormTokenField\n\t\t\trequired={ !! isValid?.required }\n\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\tcustomValidity={ getCustomValidity( isValid, validity ) }\n\t\t\tlabel={ hideLabelFromVision ? undefined : label }\n\t\t\tvalue={ arrayValueAsElements }\n\t\t\tonChange={ onChangeControl }\n\t\t\tplaceholder={ placeholder }\n\t\t\tsuggestions={ elements?.map( ( element ) => element.value ) }\n\t\t\tdisabled={ disabled }\n\t\t\t__experimentalValidateInput={ ( token: string ) => {\n\t\t\t\t// If elements validation is required, check if token is valid\n\t\t\t\tif ( field.isValid?.elements && elements ) {\n\t\t\t\t\treturn elements.some(\n\t\t\t\t\t\t( element ) =>\n\t\t\t\t\t\t\telement.value === token || element.label === token\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// For non-elements validation, allow all tokens\n\t\t\t\treturn true;\n\t\t\t} }\n\t\t\t__experimentalExpandOnFocus={ elements && elements.length > 0 }\n\t\t\thelp={ description ?? ( field.isValid?.elements ? '' : undefined ) }\n\t\t\tdisplayTransform={ ( token: any ) => {\n\t\t\t\t// For existing tokens (element objects), display their label\n\t\t\t\tif ( typeof token === 'object' && 'label' in token ) {\n\t\t\t\t\treturn token.label;\n\t\t\t\t}\n\t\t\t\t// For suggestions (value strings), find the corresponding element and show its label\n\t\t\t\tif ( typeof token === 'string' && elements ) {\n\t\t\t\t\tconst element = elements.find(\n\t\t\t\t\t\t( el ) => el.value === token\n\t\t\t\t\t);\n\t\t\t\t\treturn element?.label || token;\n\t\t\t\t}\n\t\t\t\treturn token;\n\t\t\t} }\n\t\t\t__experimentalRenderItem={ ( { item }: { item: any } ) => {\n\t\t\t\t// Custom rendering for suggestion items (item is a value string)\n\t\t\t\tif ( typeof item === 'string' && elements ) {\n\t\t\t\t\tconst element = elements.find(\n\t\t\t\t\t\t( el ) => el.value === item\n\t\t\t\t\t);\n\t\t\t\t\treturn <span>{ element?.label || item }</span>;\n\t\t\t\t}\n\t\t\t\treturn <span>{ item }</span>;\n\t\t\t} }\n\t\t/>\n\t);\n}\n"],
5
+ "mappings": ";AAGA,SAAS,aAAa,eAAe;AACrC,SAAS,aAAa,eAAe;AAMrC,SAAS,cAAc;AACvB,OAAO,uBAAuB;AAC9B,OAAO,iBAAiB;AAoDf;AAlDT,IAAM,EAAE,wBAAwB,IAAI,OAAQ,WAAY;AAEzC,SAAR,aAAuC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,QAAM,EAAE,OAAO,aAAa,aAAa,UAAU,UAAU,QAAQ,IACpE;AACD,QAAM,QAAQ,SAAU,EAAE,MAAM,KAAK,CAAE;AACvC,QAAM,WAAW,MAAM,WAAY,EAAE,MAAM,MAAM,MAAM,CAAE;AAEzD,QAAM,EAAE,UAAU,UAAU,IAAI,YAAa;AAAA,IAC5C,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,EACpB,CAAE;AAGF,QAAM,uBAAuB;AAAA,IAC5B,MACC,MAAM,QAAS,KAAM,IAClB,MAAM,IAAK,CAAE,UAAW;AACxB,YAAM,UAAU,UAAU;AAAA,QACzB,CAAE,eAAgB,WAAW,UAAU;AAAA,MACxC;AACA,aAAO,WAAW,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,IAC/C,CAAE,IACF,CAAC;AAAA,IACL,CAAE,OAAO,QAAS;AAAA,EACnB;AAEA,QAAM,kBAAkB;AAAA,IACvB,CAAE,WAA8D;AAC/D,YAAM,cAAc,OAAO,IAAK,CAAE,UAAW;AAC5C,YAAK,OAAO,UAAU,YAAY,WAAW,OAAQ;AACpD,iBAAO,MAAM;AAAA,QACd;AAEA,eAAO;AAAA,MACR,CAAE;AAEF,eAAU,SAAU,EAAE,MAAM,MAAM,OAAO,YAAY,CAAE,CAAE;AAAA,IAC1D;AAAA,IACA,CAAE,UAAU,UAAU,IAAK;AAAA,EAC5B;AAEA,MAAK,WAAY;AAChB,WAAO,oBAAC,WAAQ;AAAA,EACjB;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA,UAAW,CAAC,CAAE,SAAS;AAAA,MACvB;AAAA,MACA,gBAAiB,kBAAmB,SAAS,QAAS;AAAA,MACtD,OAAQ,sBAAsB,SAAY;AAAA,MAC1C,OAAQ;AAAA,MACR,UAAW;AAAA,MACX;AAAA,MACA,aAAc,UAAU,IAAK,CAAE,YAAa,QAAQ,KAAM;AAAA,MAC1D;AAAA,MACA,6BAA8B,CAAE,UAAmB;AAElD,YAAK,MAAM,SAAS,YAAY,UAAW;AAC1C,iBAAO,SAAS;AAAA,YACf,CAAE,YACD,QAAQ,UAAU,SAAS,QAAQ,UAAU;AAAA,UAC/C;AAAA,QACD;AAGA,eAAO;AAAA,MACR;AAAA,MACA,6BAA8B,YAAY,SAAS,SAAS;AAAA,MAC5D,MAAO,gBAAiB,MAAM,SAAS,WAAW,KAAK;AAAA,MACvD,kBAAmB,CAAE,UAAgB;AAEpC,YAAK,OAAO,UAAU,YAAY,WAAW,OAAQ;AACpD,iBAAO,MAAM;AAAA,QACd;AAEA,YAAK,OAAO,UAAU,YAAY,UAAW;AAC5C,gBAAM,UAAU,SAAS;AAAA,YACxB,CAAE,OAAQ,GAAG,UAAU;AAAA,UACxB;AACA,iBAAO,SAAS,SAAS;AAAA,QAC1B;AACA,eAAO;AAAA,MACR;AAAA,MACA,0BAA2B,CAAE,EAAE,KAAK,MAAsB;AAEzD,YAAK,OAAO,SAAS,YAAY,UAAW;AAC3C,gBAAM,UAAU,SAAS;AAAA,YACxB,CAAE,OAAQ,GAAG,UAAU;AAAA,UACxB;AACA,iBAAO,oBAAC,UAAO,mBAAS,SAAS,MAAM;AAAA,QACxC;AACA,eAAO,oBAAC,UAAO,gBAAM;AAAA,MACtB;AAAA;AAAA,EACD;AAEF;",
6
6
  "names": []
7
7
  }
@@ -28,6 +28,7 @@ import { getDate, getSettings } from "@wordpress/date";
28
28
  import { error as errorIcon } from "@wordpress/icons";
29
29
  import { Stack } from "@wordpress/ui";
30
30
  import RelativeDateControl from "./utils/relative-date-control.mjs";
31
+ import useDisabledDateMatchers from "./utils/use-disabled-date-matchers.mjs";
31
32
  import {
32
33
  OPERATOR_IN_THE_PAST,
33
34
  OPERATOR_OVER,
@@ -248,6 +249,7 @@ function CalendarDateControl({
248
249
  });
249
250
  const [isTouched, setIsTouched] = useState(false);
250
251
  const validityTargetRef = useRef(null);
252
+ const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid, parseDate);
251
253
  const onChangeCallback = useCallback(
252
254
  (newValue) => onChange(setValue({ item: data, value: newValue })),
253
255
  [data, onChange, setValue]
@@ -363,7 +365,9 @@ function CalendarDateControl({
363
365
  value,
364
366
  onChange: handleManualDateChange,
365
367
  required: !!field.isValid?.required,
366
- disabled
368
+ disabled,
369
+ min: minConstraint,
370
+ max: maxConstraint
367
371
  }
368
372
  ),
369
373
  /* @__PURE__ */ jsx(
@@ -376,7 +380,8 @@ function CalendarDateControl({
376
380
  onMonthChange: setCalendarMonth,
377
381
  timeZone: timezoneString || void 0,
378
382
  weekStartsOn,
379
- disabled
383
+ disabled: disabled || disabledMatchers,
384
+ disableNavigation: disabled
380
385
  }
381
386
  )
382
387
  ] })
@@ -399,6 +404,7 @@ function CalendarDateRangeControl({
399
404
  description,
400
405
  getValue,
401
406
  setValue,
407
+ isValid,
402
408
  format: fieldFormat
403
409
  } = field;
404
410
  const disabled = field.isDisabled({ item: data, field });
@@ -408,6 +414,7 @@ function CalendarDateRangeControl({
408
414
  value = fieldValue;
409
415
  }
410
416
  const weekStartsOn = fieldFormat.weekStartsOn ?? getSettings().l10n.startOfWeek;
417
+ const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid, parseDate);
411
418
  const onChangeCallback = useCallback(
412
419
  (newValue) => {
413
420
  onChange(
@@ -572,7 +579,9 @@ function CalendarDateRangeControl({
572
579
  value: value?.[0],
573
580
  onChange: (newValue) => handleManualDateChange("from", newValue),
574
581
  required: !!field.isValid?.required,
575
- disabled
582
+ disabled,
583
+ min: minConstraint,
584
+ max: maxConstraint
576
585
  }
577
586
  ),
578
587
  /* @__PURE__ */ jsx(
@@ -586,7 +595,9 @@ function CalendarDateRangeControl({
586
595
  value: value?.[1],
587
596
  onChange: (newValue) => handleManualDateChange("to", newValue),
588
597
  required: !!field.isValid?.required,
589
- disabled
598
+ disabled,
599
+ min: minConstraint,
600
+ max: maxConstraint
590
601
  }
591
602
  )
592
603
  ]
@@ -602,7 +613,7 @@ function CalendarDateRangeControl({
602
613
  onMonthChange: setCalendarMonth,
603
614
  timeZone: timezone.string || void 0,
604
615
  weekStartsOn,
605
- disabled
616
+ disabled: disabled || disabledMatchers
606
617
  }
607
618
  )
608
619
  ] })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/dataform-controls/date.tsx"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\nimport {\n\tformat,\n\tisValid as isValidDate,\n\tsubMonths,\n\tsubDays,\n\tsubYears,\n\tstartOfMonth,\n\tstartOfYear,\n} from 'date-fns';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tBaseControl,\n\tButton,\n\tIcon,\n\tprivateApis as componentsPrivateApis,\n\t__experimentalInputControl as InputControl,\n} from '@wordpress/components';\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { getDate, getSettings } from '@wordpress/date';\nimport { error as errorIcon } from '@wordpress/icons';\nimport { Stack } from '@wordpress/ui';\n\n/**\n * Internal dependencies\n */\nimport RelativeDateControl from './utils/relative-date-control';\nimport {\n\tOPERATOR_IN_THE_PAST,\n\tOPERATOR_OVER,\n\tOPERATOR_BETWEEN,\n} from '../../constants';\nimport { unlock } from '../../lock-unlock';\nimport type {\n\tDataFormControlProps,\n\tFieldValidity,\n\tFormatDate,\n\tNormalizedField,\n} from '../../types';\nimport getCustomValidity from './utils/get-custom-validity';\n\nconst { DateCalendar, DateRangeCalendar } = unlock( componentsPrivateApis );\n\ntype DateRange = [ string, string ] | undefined;\n\nconst DATE_PRESETS: {\n\tid: string;\n\tlabel: string;\n\tgetValue: () => Date;\n}[] = [\n\t{\n\t\tid: 'today',\n\t\tlabel: __( 'Today' ),\n\t\tgetValue: () => getDate( null ),\n\t},\n\t{\n\t\tid: 'yesterday',\n\t\tlabel: __( 'Yesterday' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn subDays( today, 1 );\n\t\t},\n\t},\n\t{\n\t\tid: 'past-week',\n\t\tlabel: __( 'Past week' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn subDays( today, 7 );\n\t\t},\n\t},\n\t{\n\t\tid: 'past-month',\n\t\tlabel: __( 'Past month' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn subMonths( today, 1 );\n\t\t},\n\t},\n];\n\nconst DATE_RANGE_PRESETS = [\n\t{\n\t\tid: 'last-7-days',\n\t\tlabel: __( 'Last 7 days' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ subDays( today, 7 ), today ];\n\t\t},\n\t},\n\t{\n\t\tid: 'last-30-days',\n\t\tlabel: __( 'Last 30 days' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ subDays( today, 30 ), today ];\n\t\t},\n\t},\n\t{\n\t\tid: 'month-to-date',\n\t\tlabel: __( 'Month to date' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ startOfMonth( today ), today ];\n\t\t},\n\t},\n\t{\n\t\tid: 'last-year',\n\t\tlabel: __( 'Last year' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ subYears( today, 1 ), today ];\n\t\t},\n\t},\n\t{\n\t\tid: 'year-to-date',\n\t\tlabel: __( 'Year to date' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ startOfYear( today ), today ];\n\t\t},\n\t},\n];\n\nconst parseDate = ( dateString?: string ): Date | null => {\n\tif ( ! dateString ) {\n\t\treturn null;\n\t}\n\tconst parsed = getDate( dateString );\n\treturn parsed && isValidDate( parsed ) ? parsed : null;\n};\n\nconst formatDate = ( date?: Date | string ): string => {\n\tif ( ! date ) {\n\t\treturn '';\n\t}\n\treturn typeof date === 'string' ? date : format( date, 'yyyy-MM-dd' );\n};\n\nfunction ValidatedDateControl< Item >( {\n\tfield,\n\tvalidity,\n\tinputRefs,\n\tisTouched,\n\tsetIsTouched,\n\tchildren,\n}: {\n\tfield: NormalizedField< Item >;\n\tvalidity?: FieldValidity;\n\tinputRefs:\n\t\t| React.RefObject< HTMLInputElement | null >\n\t\t| React.RefObject< HTMLInputElement | null >[];\n\tisTouched: boolean;\n\tsetIsTouched: ( touched: boolean ) => void;\n\tchildren: React.ReactNode;\n} ) {\n\tconst { isValid } = field;\n\tconst [ customValidity, setCustomValidity ] = useState<\n\t\t| { type: 'valid' | 'validating' | 'invalid'; message?: string }\n\t\t| undefined\n\t>( undefined );\n\n\tconst validateRefs = useCallback( () => {\n\t\t// Check HTML5 validity on all refs\n\t\tconst refs = Array.isArray( inputRefs ) ? inputRefs : [ inputRefs ];\n\t\tfor ( const ref of refs ) {\n\t\t\tconst input = ref.current;\n\t\t\tif ( input && ! input.validity.valid ) {\n\t\t\t\tsetCustomValidity( {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: input.validationMessage,\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// No errors\n\t\tsetCustomValidity( undefined );\n\t}, [ inputRefs ] );\n\n\t// Sync React-level validation to native inputs.\n\tuseEffect( () => {\n\t\tconst refs = Array.isArray( inputRefs ) ? inputRefs : [ inputRefs ];\n\t\tconst result = validity\n\t\t\t? getCustomValidity( isValid, validity )\n\t\t\t: undefined;\n\t\tfor ( const ref of refs ) {\n\t\t\tconst input = ref.current;\n\t\t\tif ( input ) {\n\t\t\t\tinput.setCustomValidity(\n\t\t\t\t\tresult?.type === 'invalid' && result.message\n\t\t\t\t\t\t? result.message\n\t\t\t\t\t\t: ''\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}, [ inputRefs, isValid, validity ] );\n\n\t// Listen for 'invalid' events (e.g., from reportValidity() on card re-expand).\n\tuseEffect( () => {\n\t\tconst refs = Array.isArray( inputRefs ) ? inputRefs : [ inputRefs ];\n\t\tconst handleInvalid = ( event: Event ) => {\n\t\t\tevent.preventDefault();\n\t\t\tsetIsTouched( true );\n\t\t};\n\t\tfor ( const ref of refs ) {\n\t\t\tref.current?.addEventListener( 'invalid', handleInvalid );\n\t\t}\n\t\treturn () => {\n\t\t\tfor ( const ref of refs ) {\n\t\t\t\tref.current?.removeEventListener( 'invalid', handleInvalid );\n\t\t\t}\n\t\t};\n\t}, [ inputRefs, setIsTouched ] );\n\n\tuseEffect( () => {\n\t\tif ( ! isTouched ) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = validity\n\t\t\t? getCustomValidity( isValid, validity )\n\t\t\t: undefined;\n\t\tif ( result ) {\n\t\t\tsetCustomValidity( result );\n\t\t} else {\n\t\t\tvalidateRefs();\n\t\t}\n\t}, [ isTouched, isValid, validity, validateRefs ] );\n\n\tconst onBlur = ( event: React.FocusEvent< HTMLDivElement > ) => {\n\t\tif ( isTouched ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Only consider \"blurred from the component\" if focus has fully left the wrapping div.\n\t\t// This prevents unnecessary blurs from components with multiple focusable elements.\n\t\tif (\n\t\t\t! event.relatedTarget ||\n\t\t\t! event.currentTarget.contains( event.relatedTarget )\n\t\t) {\n\t\t\tsetIsTouched( true );\n\t\t}\n\t};\n\n\treturn (\n\t\t<div onBlur={ onBlur }>\n\t\t\t{ children }\n\t\t\t<div aria-live=\"polite\">\n\t\t\t\t{ customValidity && (\n\t\t\t\t\t<p\n\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\t'components-validated-control__indicator',\n\t\t\t\t\t\t\tcustomValidity.type === 'invalid'\n\t\t\t\t\t\t\t\t? 'is-invalid'\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t) }\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName=\"components-validated-control__indicator-icon\"\n\t\t\t\t\t\t\ticon={ errorIcon }\n\t\t\t\t\t\t\tsize={ 16 }\n\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ customValidity.message }\n\t\t\t\t\t</p>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction CalendarDateControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tconst {\n\t\tid,\n\t\tlabel,\n\t\tdescription,\n\t\tsetValue,\n\t\tgetValue,\n\t\tisValid,\n\t\tformat: fieldFormat,\n\t} = field;\n\tconst disabled = field.isDisabled( { item: data, field } );\n\tconst [ selectedPresetId, setSelectedPresetId ] = useState< string | null >(\n\t\tnull\n\t);\n\n\tconst weekStartsOn =\n\t\t( fieldFormat as FormatDate ).weekStartsOn ??\n\t\tgetSettings().l10n.startOfWeek;\n\n\tconst fieldValue = getValue( { item: data } );\n\tconst value = typeof fieldValue === 'string' ? fieldValue : undefined;\n\tconst [ calendarMonth, setCalendarMonth ] = useState< Date >( () => {\n\t\tconst parsedDate = parseDate( value );\n\t\treturn parsedDate || new Date(); // Default to current month\n\t} );\n\n\tconst [ isTouched, setIsTouched ] = useState( false );\n\tconst validityTargetRef = useRef< HTMLInputElement >( null );\n\n\tconst onChangeCallback = useCallback(\n\t\t( newValue: string | undefined ) =>\n\t\t\tonChange( setValue( { item: data, value: newValue } ) ),\n\t\t[ data, onChange, setValue ]\n\t);\n\n\tconst onSelectDate = useCallback(\n\t\t( newDate: Date | undefined | null ) => {\n\t\t\tconst dateValue = newDate\n\t\t\t\t? format( newDate, 'yyyy-MM-dd' )\n\t\t\t\t: undefined;\n\t\t\tonChangeCallback( dateValue );\n\t\t\tsetSelectedPresetId( null );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst handlePresetClick = useCallback(\n\t\t( preset: ( typeof DATE_PRESETS )[ 0 ] ) => {\n\t\t\tconst presetDate = preset.getValue();\n\t\t\tconst dateValue = formatDate( presetDate );\n\n\t\t\tsetCalendarMonth( presetDate );\n\t\t\tonChangeCallback( dateValue );\n\t\t\tsetSelectedPresetId( preset.id );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst handleManualDateChange = useCallback(\n\t\t( newValue?: string ) => {\n\t\t\tonChangeCallback( newValue );\n\t\t\tif ( newValue ) {\n\t\t\t\tconst parsedDate = parseDate( newValue );\n\t\t\t\tif ( parsedDate ) {\n\t\t\t\t\tsetCalendarMonth( parsedDate );\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetSelectedPresetId( null );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst {\n\t\ttimezone: { string: timezoneString },\n\t} = getSettings();\n\n\tlet displayLabel = label;\n\tif ( isValid?.required && ! markWhenOptional ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Required' ) })`;\n\t} else if ( ! isValid?.required && markWhenOptional ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Optional' ) })`;\n\t}\n\n\treturn (\n\t\t<ValidatedDateControl\n\t\t\tfield={ field }\n\t\t\tvalidity={ validity }\n\t\t\tinputRefs={ validityTargetRef }\n\t\t\tisTouched={ isTouched }\n\t\t\tsetIsTouched={ setIsTouched }\n\t\t>\n\t\t\t<BaseControl\n\t\t\t\tid={ id }\n\t\t\t\tclassName=\"dataviews-controls__date\"\n\t\t\t\tlabel={ displayLabel }\n\t\t\t\thelp={ description }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\t>\n\t\t\t\t<Stack direction=\"column\" gap=\"lg\">\n\t\t\t\t\t{ /* Preset buttons */ }\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\twrap=\"wrap\"\n\t\t\t\t\t\tjustify=\"flex-start\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ DATE_PRESETS.map( ( preset ) => {\n\t\t\t\t\t\t\tconst isSelected = selectedPresetId === preset.id;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"dataviews-controls__date-preset\"\n\t\t\t\t\t\t\t\t\tkey={ preset.id }\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\tisPressed={ isSelected }\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\thandlePresetClick( preset )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ preset.label }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tclassName=\"dataviews-controls__date-preset\"\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tisPressed={ ! selectedPresetId }\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tdisabled={ !! selectedPresetId || disabled }\n\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Custom' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\n\t\t\t\t\t{ /* Manual date input */ }\n\t\t\t\t\t<InputControl\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tref={ validityTargetRef }\n\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\tlabel={ __( 'Date' ) }\n\t\t\t\t\t\thideLabelFromVision\n\t\t\t\t\t\tvalue={ value }\n\t\t\t\t\t\tonChange={ handleManualDateChange }\n\t\t\t\t\t\trequired={ !! field.isValid?.required }\n\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t/>\n\n\t\t\t\t\t{ /* Calendar widget */ }\n\t\t\t\t\t<DateCalendar\n\t\t\t\t\t\tstyle={ { width: '100%' } }\n\t\t\t\t\t\tselected={\n\t\t\t\t\t\t\tvalue ? parseDate( value ) || undefined : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonSelect={ onSelectDate }\n\t\t\t\t\t\tmonth={ calendarMonth }\n\t\t\t\t\t\tonMonthChange={ setCalendarMonth }\n\t\t\t\t\t\ttimeZone={ timezoneString || undefined }\n\t\t\t\t\t\tweekStartsOn={ weekStartsOn }\n\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t</BaseControl>\n\t\t</ValidatedDateControl>\n\t);\n}\n\nfunction CalendarDateRangeControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tconst {\n\t\tid,\n\t\tlabel,\n\t\tdescription,\n\t\tgetValue,\n\t\tsetValue,\n\t\tformat: fieldFormat,\n\t} = field;\n\tconst disabled = field.isDisabled( { item: data, field } );\n\tlet value: DateRange;\n\tconst fieldValue = getValue( { item: data } );\n\tif (\n\t\tArray.isArray( fieldValue ) &&\n\t\tfieldValue.length === 2 &&\n\t\tfieldValue.every( ( date ) => typeof date === 'string' )\n\t) {\n\t\tvalue = fieldValue as DateRange;\n\t}\n\n\tconst weekStartsOn =\n\t\t( fieldFormat as FormatDate ).weekStartsOn ??\n\t\tgetSettings().l10n.startOfWeek;\n\n\tconst onChangeCallback = useCallback(\n\t\t( newValue: DateRange ) => {\n\t\t\tonChange(\n\t\t\t\tsetValue( {\n\t\t\t\t\titem: data,\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\t[ data, onChange, setValue ]\n\t);\n\n\tconst [ selectedPresetId, setSelectedPresetId ] = useState< string | null >(\n\t\tnull\n\t);\n\n\tconst selectedRange = useMemo( () => {\n\t\tif ( ! value ) {\n\t\t\treturn { from: undefined, to: undefined };\n\t\t}\n\n\t\tconst [ from, to ] = value;\n\t\treturn {\n\t\t\tfrom: parseDate( from ) || undefined,\n\t\t\tto: parseDate( to ) || undefined,\n\t\t};\n\t}, [ value ] );\n\n\tconst [ calendarMonth, setCalendarMonth ] = useState< Date >( () => {\n\t\treturn selectedRange.from || new Date();\n\t} );\n\n\tconst [ isTouched, setIsTouched ] = useState( false );\n\tconst fromInputRef = useRef< HTMLInputElement >( null );\n\tconst toInputRef = useRef< HTMLInputElement >( null );\n\n\tconst updateDateRange = useCallback(\n\t\t( fromDate?: Date | string, toDate?: Date | string ) => {\n\t\t\tif ( fromDate && toDate ) {\n\t\t\t\tonChangeCallback( [\n\t\t\t\t\tformatDate( fromDate ),\n\t\t\t\t\tformatDate( toDate ),\n\t\t\t\t] );\n\t\t\t} else if ( ! fromDate && ! toDate ) {\n\t\t\t\tonChangeCallback( undefined );\n\t\t\t}\n\t\t\t// Do nothing if only one date is set - wait for both\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst onSelectCalendarRange = useCallback(\n\t\t(\n\t\t\tnewRange:\n\t\t\t\t| { from: Date | undefined; to?: Date | undefined }\n\t\t\t\t| undefined\n\t\t) => {\n\t\t\tupdateDateRange( newRange?.from, newRange?.to );\n\t\t\tsetSelectedPresetId( null );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ updateDateRange ]\n\t);\n\n\tconst handlePresetClick = useCallback(\n\t\t( preset: ( typeof DATE_RANGE_PRESETS )[ 0 ] ) => {\n\t\t\tconst [ startDate, endDate ] = preset.getValue();\n\t\t\tsetCalendarMonth( startDate );\n\t\t\tupdateDateRange( startDate, endDate );\n\t\t\tsetSelectedPresetId( preset.id );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ updateDateRange ]\n\t);\n\n\tconst handleManualDateChange = useCallback(\n\t\t( fromOrTo: 'from' | 'to', newValue?: string ) => {\n\t\t\tconst [ currentFrom, currentTo ] = value || [\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t];\n\t\t\tconst updatedFrom = fromOrTo === 'from' ? newValue : currentFrom;\n\t\t\tconst updatedTo = fromOrTo === 'to' ? newValue : currentTo;\n\n\t\t\tupdateDateRange( updatedFrom, updatedTo );\n\n\t\t\tif ( newValue ) {\n\t\t\t\tconst parsedDate = parseDate( newValue );\n\t\t\t\tif ( parsedDate ) {\n\t\t\t\t\tsetCalendarMonth( parsedDate );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetSelectedPresetId( null );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ value, updateDateRange ]\n\t);\n\n\tconst { timezone } = getSettings();\n\n\tlet displayLabel = label;\n\tif ( field.isValid?.required && ! markWhenOptional ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Required' ) })`;\n\t} else if ( ! field.isValid?.required && markWhenOptional ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Optional' ) })`;\n\t}\n\n\treturn (\n\t\t<ValidatedDateControl\n\t\t\tfield={ field }\n\t\t\tvalidity={ validity }\n\t\t\tinputRefs={ [ fromInputRef, toInputRef ] }\n\t\t\tisTouched={ isTouched }\n\t\t\tsetIsTouched={ setIsTouched }\n\t\t>\n\t\t\t<BaseControl\n\t\t\t\tid={ id }\n\t\t\t\tclassName=\"dataviews-controls__date\"\n\t\t\t\tlabel={ displayLabel }\n\t\t\t\thelp={ description }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\t>\n\t\t\t\t<Stack direction=\"column\" gap=\"lg\">\n\t\t\t\t\t{ /* Preset buttons */ }\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\twrap=\"wrap\"\n\t\t\t\t\t\tjustify=\"flex-start\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ DATE_RANGE_PRESETS.map( ( preset ) => {\n\t\t\t\t\t\t\tconst isSelected = selectedPresetId === preset.id;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"dataviews-controls__date-preset\"\n\t\t\t\t\t\t\t\t\tkey={ preset.id }\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\tisPressed={ isSelected }\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\thandlePresetClick( preset )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ preset.label }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tclassName=\"dataviews-controls__date-preset\"\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tisPressed={ ! selectedPresetId }\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\tdisabled={ !! selectedPresetId || disabled }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Custom' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\n\t\t\t\t\t{ /* Manual date range inputs */ }\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\tjustify=\"space-between\"\n\t\t\t\t\t\tclassName=\"dataviews-controls__date-range-inputs\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<InputControl\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tref={ fromInputRef }\n\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\tlabel={ __( 'From' ) }\n\t\t\t\t\t\t\thideLabelFromVision\n\t\t\t\t\t\t\tvalue={ value?.[ 0 ] }\n\t\t\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\t\t\thandleManualDateChange( 'from', newValue )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trequired={ !! field.isValid?.required }\n\t\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<InputControl\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tref={ toInputRef }\n\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\tlabel={ __( 'To' ) }\n\t\t\t\t\t\t\thideLabelFromVision\n\t\t\t\t\t\t\tvalue={ value?.[ 1 ] }\n\t\t\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\t\t\thandleManualDateChange( 'to', newValue )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trequired={ !! field.isValid?.required }\n\t\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Stack>\n\n\t\t\t\t\t<DateRangeCalendar\n\t\t\t\t\t\tstyle={ { width: '100%' } }\n\t\t\t\t\t\tselected={ selectedRange }\n\t\t\t\t\t\tonSelect={ onSelectCalendarRange }\n\t\t\t\t\t\tmonth={ calendarMonth }\n\t\t\t\t\t\tonMonthChange={ setCalendarMonth }\n\t\t\t\t\t\ttimeZone={ timezone.string || undefined }\n\t\t\t\t\t\tweekStartsOn={ weekStartsOn }\n\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t</BaseControl>\n\t\t</ValidatedDateControl>\n\t);\n}\n\nexport default function DateControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\toperator,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tif ( operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER ) {\n\t\treturn (\n\t\t\t<RelativeDateControl\n\t\t\t\tclassName=\"dataviews-controls__date\"\n\t\t\t\tdata={ data }\n\t\t\t\tfield={ field }\n\t\t\t\tonChange={ onChange }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\t\toperator={ operator }\n\t\t\t/>\n\t\t);\n\t}\n\n\tif ( operator === OPERATOR_BETWEEN ) {\n\t\treturn (\n\t\t\t<CalendarDateRangeControl\n\t\t\t\tdata={ data }\n\t\t\t\tfield={ field }\n\t\t\t\tonChange={ onChange }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\t\tvalidity={ validity }\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<CalendarDateControl\n\t\t\tdata={ data }\n\t\t\tfield={ field }\n\t\t\tonChange={ onChange }\n\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\tvalidity={ validity }\n\t\t/>\n\t);\n}\n"],
5
- "mappings": ";AAGA,OAAO,UAAU;AACjB;AAAA,EACC;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAKP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,8BAA8B;AAAA,OACxB;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,UAAU;AACnB,SAAS,SAAS,mBAAmB;AACrC,SAAS,SAAS,iBAAiB;AACnC,SAAS,aAAa;AAKtB,OAAO,yBAAyB;AAChC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,cAAc;AAOvB,OAAO,uBAAuB;AAkNzB,SAQC,KARD;AAhNL,IAAM,EAAE,cAAc,kBAAkB,IAAI,OAAQ,qBAAsB;AAI1E,IAAM,eAIA;AAAA,EACL;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,OAAQ;AAAA,IACnB,UAAU,MAAM,QAAS,IAAK;AAAA,EAC/B;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,WAAY;AAAA,IACvB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,QAAS,OAAO,CAAE;AAAA,IAC1B;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,WAAY;AAAA,IACvB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,QAAS,OAAO,CAAE;AAAA,IAC1B;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,YAAa;AAAA,IACxB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,UAAW,OAAO,CAAE;AAAA,IAC5B;AAAA,EACD;AACD;AAEA,IAAM,qBAAqB;AAAA,EAC1B;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,aAAc;AAAA,IACzB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,QAAS,OAAO,CAAE,GAAG,KAAM;AAAA,IACrC;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,cAAe;AAAA,IAC1B,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,QAAS,OAAO,EAAG,GAAG,KAAM;AAAA,IACtC;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,eAAgB;AAAA,IAC3B,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,aAAc,KAAM,GAAG,KAAM;AAAA,IACvC;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,WAAY;AAAA,IACvB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,SAAU,OAAO,CAAE,GAAG,KAAM;AAAA,IACtC;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,cAAe;AAAA,IAC1B,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,YAAa,KAAM,GAAG,KAAM;AAAA,IACtC;AAAA,EACD;AACD;AAEA,IAAM,YAAY,CAAE,eAAsC;AACzD,MAAK,CAAE,YAAa;AACnB,WAAO;AAAA,EACR;AACA,QAAM,SAAS,QAAS,UAAW;AACnC,SAAO,UAAU,YAAa,MAAO,IAAI,SAAS;AACnD;AAEA,IAAM,aAAa,CAAE,SAAkC;AACtD,MAAK,CAAE,MAAO;AACb,WAAO;AAAA,EACR;AACA,SAAO,OAAO,SAAS,WAAW,OAAO,OAAQ,MAAM,YAAa;AACrE;AAEA,SAAS,qBAA8B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GASI;AACH,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,CAAE,gBAAgB,iBAAkB,IAAI,SAG3C,MAAU;AAEb,QAAM,eAAe,YAAa,MAAM;AAEvC,UAAM,OAAO,MAAM,QAAS,SAAU,IAAI,YAAY,CAAE,SAAU;AAClE,eAAY,OAAO,MAAO;AACzB,YAAM,QAAQ,IAAI;AAClB,UAAK,SAAS,CAAE,MAAM,SAAS,OAAQ;AACtC,0BAAmB;AAAA,UAClB,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,QAChB,CAAE;AACF;AAAA,MACD;AAAA,IACD;AAGA,sBAAmB,MAAU;AAAA,EAC9B,GAAG,CAAE,SAAU,CAAE;AAGjB,YAAW,MAAM;AAChB,UAAM,OAAO,MAAM,QAAS,SAAU,IAAI,YAAY,CAAE,SAAU;AAClE,UAAM,SAAS,WACZ,kBAAmB,SAAS,QAAS,IACrC;AACH,eAAY,OAAO,MAAO;AACzB,YAAM,QAAQ,IAAI;AAClB,UAAK,OAAQ;AACZ,cAAM;AAAA,UACL,QAAQ,SAAS,aAAa,OAAO,UAClC,OAAO,UACP;AAAA,QACJ;AAAA,MACD;AAAA,IACD;AAAA,EACD,GAAG,CAAE,WAAW,SAAS,QAAS,CAAE;AAGpC,YAAW,MAAM;AAChB,UAAM,OAAO,MAAM,QAAS,SAAU,IAAI,YAAY,CAAE,SAAU;AAClE,UAAM,gBAAgB,CAAE,UAAkB;AACzC,YAAM,eAAe;AACrB,mBAAc,IAAK;AAAA,IACpB;AACA,eAAY,OAAO,MAAO;AACzB,UAAI,SAAS,iBAAkB,WAAW,aAAc;AAAA,IACzD;AACA,WAAO,MAAM;AACZ,iBAAY,OAAO,MAAO;AACzB,YAAI,SAAS,oBAAqB,WAAW,aAAc;AAAA,MAC5D;AAAA,IACD;AAAA,EACD,GAAG,CAAE,WAAW,YAAa,CAAE;AAE/B,YAAW,MAAM;AAChB,QAAK,CAAE,WAAY;AAClB;AAAA,IACD;AACA,UAAM,SAAS,WACZ,kBAAmB,SAAS,QAAS,IACrC;AACH,QAAK,QAAS;AACb,wBAAmB,MAAO;AAAA,IAC3B,OAAO;AACN,mBAAa;AAAA,IACd;AAAA,EACD,GAAG,CAAE,WAAW,SAAS,UAAU,YAAa,CAAE;AAElD,QAAM,SAAS,CAAE,UAA+C;AAC/D,QAAK,WAAY;AAChB;AAAA,IACD;AAIA,QACC,CAAE,MAAM,iBACR,CAAE,MAAM,cAAc,SAAU,MAAM,aAAc,GACnD;AACD,mBAAc,IAAK;AAAA,IACpB;AAAA,EACD;AAEA,SACC,qBAAC,SAAI,QACF;AAAA;AAAA,IACF,oBAAC,SAAI,aAAU,UACZ,4BACD;AAAA,MAAC;AAAA;AAAA,QACA,WAAY;AAAA,UACX;AAAA,UACA,eAAe,SAAS,YACrB,eACA;AAAA,QACJ;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,WAAU;AAAA,cACV,MAAO;AAAA,cACP,MAAO;AAAA,cACP,MAAK;AAAA;AAAA,UACN;AAAA,UACE,eAAe;AAAA;AAAA;AAAA,IAClB,GAEF;AAAA,KACD;AAEF;AAEA,SAAS,oBAA6B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACT,IAAI;AACJ,QAAM,WAAW,MAAM,WAAY,EAAE,MAAM,MAAM,MAAM,CAAE;AACzD,QAAM,CAAE,kBAAkB,mBAAoB,IAAI;AAAA,IACjD;AAAA,EACD;AAEA,QAAM,eACH,YAA4B,gBAC9B,YAAY,EAAE,KAAK;AAEpB,QAAM,aAAa,SAAU,EAAE,MAAM,KAAK,CAAE;AAC5C,QAAM,QAAQ,OAAO,eAAe,WAAW,aAAa;AAC5D,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAkB,MAAM;AACnE,UAAM,aAAa,UAAW,KAAM;AACpC,WAAO,cAAc,oBAAI,KAAK;AAAA,EAC/B,CAAE;AAEF,QAAM,CAAE,WAAW,YAAa,IAAI,SAAU,KAAM;AACpD,QAAM,oBAAoB,OAA4B,IAAK;AAE3D,QAAM,mBAAmB;AAAA,IACxB,CAAE,aACD,SAAU,SAAU,EAAE,MAAM,MAAM,OAAO,SAAS,CAAE,CAAE;AAAA,IACvD,CAAE,MAAM,UAAU,QAAS;AAAA,EAC5B;AAEA,QAAM,eAAe;AAAA,IACpB,CAAE,YAAsC;AACvC,YAAM,YAAY,UACf,OAAQ,SAAS,YAAa,IAC9B;AACH,uBAAkB,SAAU;AAC5B,0BAAqB,IAAK;AAC1B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM,oBAAoB;AAAA,IACzB,CAAE,WAA0C;AAC3C,YAAM,aAAa,OAAO,SAAS;AACnC,YAAM,YAAY,WAAY,UAAW;AAEzC,uBAAkB,UAAW;AAC7B,uBAAkB,SAAU;AAC5B,0BAAqB,OAAO,EAAG;AAC/B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM,yBAAyB;AAAA,IAC9B,CAAE,aAAuB;AACxB,uBAAkB,QAAS;AAC3B,UAAK,UAAW;AACf,cAAM,aAAa,UAAW,QAAS;AACvC,YAAK,YAAa;AACjB,2BAAkB,UAAW;AAAA,QAC9B;AAAA,MACD;AACA,0BAAqB,IAAK;AAC1B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM;AAAA,IACL,UAAU,EAAE,QAAQ,eAAe;AAAA,EACpC,IAAI,YAAY;AAEhB,MAAI,eAAe;AACnB,MAAK,SAAS,YAAY,CAAE,kBAAmB;AAC9C,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD,WAAY,CAAE,SAAS,YAAY,kBAAmB;AACrD,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAY;AAAA,MACZ;AAAA,MACA;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,WAAU;AAAA,UACV,OAAQ;AAAA,UACR,MAAO;AAAA,UACP;AAAA,UAEA,+BAAC,SAAM,WAAU,UAAS,KAAI,MAE7B;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,WAAU;AAAA,gBACV,KAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,SAAQ;AAAA,gBAEN;AAAA,+BAAa,IAAK,CAAE,WAAY;AACjC,0BAAM,aAAa,qBAAqB,OAAO;AAC/C,2BACC;AAAA,sBAAC;AAAA;AAAA,wBACA,WAAU;AAAA,wBAEV,SAAQ;AAAA,wBACR,WAAY;AAAA,wBACZ,MAAK;AAAA,wBACL;AAAA,wBACA,wBAAsB;AAAA,wBACtB,SAAU,MACT,kBAAmB,MAAO;AAAA,wBAGzB,iBAAO;AAAA;AAAA,sBAVH,OAAO;AAAA,oBAWd;AAAA,kBAEF,CAAE;AAAA,kBACF;AAAA,oBAAC;AAAA;AAAA,sBACA,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,WAAY,CAAE;AAAA,sBACd,MAAK;AAAA,sBACL,UAAW,CAAC,CAAE,oBAAoB;AAAA,sBAClC,wBAAsB;AAAA,sBAEpB,aAAI,QAAS;AAAA;AAAA,kBAChB;AAAA;AAAA;AAAA,YACD;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACA,uBAAqB;AAAA,gBACrB,KAAM;AAAA,gBACN,MAAK;AAAA,gBACL,OAAQ,GAAI,MAAO;AAAA,gBACnB,qBAAmB;AAAA,gBACnB;AAAA,gBACA,UAAW;AAAA,gBACX,UAAW,CAAC,CAAE,MAAM,SAAS;AAAA,gBAC7B;AAAA;AAAA,YACD;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACA,OAAQ,EAAE,OAAO,OAAO;AAAA,gBACxB,UACC,QAAQ,UAAW,KAAM,KAAK,SAAY;AAAA,gBAE3C,UAAW;AAAA,gBACX,OAAQ;AAAA,gBACR,eAAgB;AAAA,gBAChB,UAAW,kBAAkB;AAAA,gBAC7B;AAAA,gBACA;AAAA;AAAA,YACD;AAAA,aACD;AAAA;AAAA,MACD;AAAA;AAAA,EACD;AAEF;AAEA,SAAS,yBAAkC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACT,IAAI;AACJ,QAAM,WAAW,MAAM,WAAY,EAAE,MAAM,MAAM,MAAM,CAAE;AACzD,MAAI;AACJ,QAAM,aAAa,SAAU,EAAE,MAAM,KAAK,CAAE;AAC5C,MACC,MAAM,QAAS,UAAW,KAC1B,WAAW,WAAW,KACtB,WAAW,MAAO,CAAE,SAAU,OAAO,SAAS,QAAS,GACtD;AACD,YAAQ;AAAA,EACT;AAEA,QAAM,eACH,YAA4B,gBAC9B,YAAY,EAAE,KAAK;AAEpB,QAAM,mBAAmB;AAAA,IACxB,CAAE,aAAyB;AAC1B;AAAA,QACC,SAAU;AAAA,UACT,MAAM;AAAA,UACN,OAAO;AAAA,QACR,CAAE;AAAA,MACH;AAAA,IACD;AAAA,IACA,CAAE,MAAM,UAAU,QAAS;AAAA,EAC5B;AAEA,QAAM,CAAE,kBAAkB,mBAAoB,IAAI;AAAA,IACjD;AAAA,EACD;AAEA,QAAM,gBAAgB,QAAS,MAAM;AACpC,QAAK,CAAE,OAAQ;AACd,aAAO,EAAE,MAAM,QAAW,IAAI,OAAU;AAAA,IACzC;AAEA,UAAM,CAAE,MAAM,EAAG,IAAI;AACrB,WAAO;AAAA,MACN,MAAM,UAAW,IAAK,KAAK;AAAA,MAC3B,IAAI,UAAW,EAAG,KAAK;AAAA,IACxB;AAAA,EACD,GAAG,CAAE,KAAM,CAAE;AAEb,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAkB,MAAM;AACnE,WAAO,cAAc,QAAQ,oBAAI,KAAK;AAAA,EACvC,CAAE;AAEF,QAAM,CAAE,WAAW,YAAa,IAAI,SAAU,KAAM;AACpD,QAAM,eAAe,OAA4B,IAAK;AACtD,QAAM,aAAa,OAA4B,IAAK;AAEpD,QAAM,kBAAkB;AAAA,IACvB,CAAE,UAA0B,WAA4B;AACvD,UAAK,YAAY,QAAS;AACzB,yBAAkB;AAAA,UACjB,WAAY,QAAS;AAAA,UACrB,WAAY,MAAO;AAAA,QACpB,CAAE;AAAA,MACH,WAAY,CAAE,YAAY,CAAE,QAAS;AACpC,yBAAkB,MAAU;AAAA,MAC7B;AAAA,IAED;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM,wBAAwB;AAAA,IAC7B,CACC,aAGI;AACJ,sBAAiB,UAAU,MAAM,UAAU,EAAG;AAC9C,0BAAqB,IAAK;AAC1B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,eAAgB;AAAA,EACnB;AAEA,QAAM,oBAAoB;AAAA,IACzB,CAAE,WAAgD;AACjD,YAAM,CAAE,WAAW,OAAQ,IAAI,OAAO,SAAS;AAC/C,uBAAkB,SAAU;AAC5B,sBAAiB,WAAW,OAAQ;AACpC,0BAAqB,OAAO,EAAG;AAC/B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,eAAgB;AAAA,EACnB;AAEA,QAAM,yBAAyB;AAAA,IAC9B,CAAE,UAAyB,aAAuB;AACjD,YAAM,CAAE,aAAa,SAAU,IAAI,SAAS;AAAA,QAC3C;AAAA,QACA;AAAA,MACD;AACA,YAAM,cAAc,aAAa,SAAS,WAAW;AACrD,YAAM,YAAY,aAAa,OAAO,WAAW;AAEjD,sBAAiB,aAAa,SAAU;AAExC,UAAK,UAAW;AACf,cAAM,aAAa,UAAW,QAAS;AACvC,YAAK,YAAa;AACjB,2BAAkB,UAAW;AAAA,QAC9B;AAAA,MACD;AAEA,0BAAqB,IAAK;AAC1B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,OAAO,eAAgB;AAAA,EAC1B;AAEA,QAAM,EAAE,SAAS,IAAI,YAAY;AAEjC,MAAI,eAAe;AACnB,MAAK,MAAM,SAAS,YAAY,CAAE,kBAAmB;AACpD,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD,WAAY,CAAE,MAAM,SAAS,YAAY,kBAAmB;AAC3D,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAY,CAAE,cAAc,UAAW;AAAA,MACvC;AAAA,MACA;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,WAAU;AAAA,UACV,OAAQ;AAAA,UACR,MAAO;AAAA,UACP;AAAA,UAEA,+BAAC,SAAM,WAAU,UAAS,KAAI,MAE7B;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,WAAU;AAAA,gBACV,KAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,SAAQ;AAAA,gBAEN;AAAA,qCAAmB,IAAK,CAAE,WAAY;AACvC,0BAAM,aAAa,qBAAqB,OAAO;AAC/C,2BACC;AAAA,sBAAC;AAAA;AAAA,wBACA,WAAU;AAAA,wBAEV,SAAQ;AAAA,wBACR,WAAY;AAAA,wBACZ,MAAK;AAAA,wBACL;AAAA,wBACA,wBAAsB;AAAA,wBACtB,SAAU,MACT,kBAAmB,MAAO;AAAA,wBAGzB,iBAAO;AAAA;AAAA,sBAVH,OAAO;AAAA,oBAWd;AAAA,kBAEF,CAAE;AAAA,kBACF;AAAA,oBAAC;AAAA;AAAA,sBACA,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,WAAY,CAAE;AAAA,sBACd,MAAK;AAAA,sBACL,wBAAsB;AAAA,sBACtB,UAAW,CAAC,CAAE,oBAAoB;AAAA,sBAEhC,aAAI,QAAS;AAAA;AAAA,kBAChB;AAAA;AAAA;AAAA,YACD;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACA,WAAU;AAAA,gBACV,KAAI;AAAA,gBACJ,SAAQ;AAAA,gBACR,WAAU;AAAA,gBAEV;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACA,uBAAqB;AAAA,sBACrB,KAAM;AAAA,sBACN,MAAK;AAAA,sBACL,OAAQ,GAAI,MAAO;AAAA,sBACnB,qBAAmB;AAAA,sBACnB,OAAQ,QAAS,CAAE;AAAA,sBACnB,UAAW,CAAE,aACZ,uBAAwB,QAAQ,QAAS;AAAA,sBAE1C,UAAW,CAAC,CAAE,MAAM,SAAS;AAAA,sBAC7B;AAAA;AAAA,kBACD;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACA,uBAAqB;AAAA,sBACrB,KAAM;AAAA,sBACN,MAAK;AAAA,sBACL,OAAQ,GAAI,IAAK;AAAA,sBACjB,qBAAmB;AAAA,sBACnB,OAAQ,QAAS,CAAE;AAAA,sBACnB,UAAW,CAAE,aACZ,uBAAwB,MAAM,QAAS;AAAA,sBAExC,UAAW,CAAC,CAAE,MAAM,SAAS;AAAA,sBAC7B;AAAA;AAAA,kBACD;AAAA;AAAA;AAAA,YACD;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACA,OAAQ,EAAE,OAAO,OAAO;AAAA,gBACxB,UAAW;AAAA,gBACX,UAAW;AAAA,gBACX,OAAQ;AAAA,gBACR,eAAgB;AAAA,gBAChB,UAAW,SAAS,UAAU;AAAA,gBAC9B;AAAA,gBACA;AAAA;AAAA,YACD;AAAA,aACD;AAAA;AAAA,MACD;AAAA;AAAA,EACD;AAEF;AAEe,SAAR,YAAsC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,MAAK,aAAa,wBAAwB,aAAa,eAAgB;AACtE,WACC;AAAA,MAAC;AAAA;AAAA,QACA,WAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACD;AAAA,EAEF;AAEA,MAAK,aAAa,kBAAmB;AACpC,WACC;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACD;AAAA,EAEF;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACD;AAEF;",
4
+ "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\nimport {\n\tformat,\n\tisValid as isValidDate,\n\tsubMonths,\n\tsubDays,\n\tsubYears,\n\tstartOfMonth,\n\tstartOfYear,\n} from 'date-fns';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tBaseControl,\n\tButton,\n\tIcon,\n\tprivateApis as componentsPrivateApis,\n\t__experimentalInputControl as InputControl,\n} from '@wordpress/components';\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { getDate, getSettings } from '@wordpress/date';\nimport { error as errorIcon } from '@wordpress/icons';\nimport { Stack } from '@wordpress/ui';\n\n/**\n * Internal dependencies\n */\nimport RelativeDateControl from './utils/relative-date-control';\nimport useDisabledDateMatchers from './utils/use-disabled-date-matchers';\nimport {\n\tOPERATOR_IN_THE_PAST,\n\tOPERATOR_OVER,\n\tOPERATOR_BETWEEN,\n} from '../../constants';\nimport { unlock } from '../../lock-unlock';\nimport type {\n\tDataFormControlProps,\n\tFieldValidity,\n\tFormatDate,\n\tNormalizedField,\n} from '../../types';\nimport getCustomValidity from './utils/get-custom-validity';\n\nconst { DateCalendar, DateRangeCalendar } = unlock( componentsPrivateApis );\n\ntype DateRange = [ string, string ] | undefined;\n\nconst DATE_PRESETS: {\n\tid: string;\n\tlabel: string;\n\tgetValue: () => Date;\n}[] = [\n\t{\n\t\tid: 'today',\n\t\tlabel: __( 'Today' ),\n\t\tgetValue: () => getDate( null ),\n\t},\n\t{\n\t\tid: 'yesterday',\n\t\tlabel: __( 'Yesterday' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn subDays( today, 1 );\n\t\t},\n\t},\n\t{\n\t\tid: 'past-week',\n\t\tlabel: __( 'Past week' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn subDays( today, 7 );\n\t\t},\n\t},\n\t{\n\t\tid: 'past-month',\n\t\tlabel: __( 'Past month' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn subMonths( today, 1 );\n\t\t},\n\t},\n];\n\nconst DATE_RANGE_PRESETS = [\n\t{\n\t\tid: 'last-7-days',\n\t\tlabel: __( 'Last 7 days' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ subDays( today, 7 ), today ];\n\t\t},\n\t},\n\t{\n\t\tid: 'last-30-days',\n\t\tlabel: __( 'Last 30 days' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ subDays( today, 30 ), today ];\n\t\t},\n\t},\n\t{\n\t\tid: 'month-to-date',\n\t\tlabel: __( 'Month to date' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ startOfMonth( today ), today ];\n\t\t},\n\t},\n\t{\n\t\tid: 'last-year',\n\t\tlabel: __( 'Last year' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ subYears( today, 1 ), today ];\n\t\t},\n\t},\n\t{\n\t\tid: 'year-to-date',\n\t\tlabel: __( 'Year to date' ),\n\t\tgetValue: () => {\n\t\t\tconst today = getDate( null );\n\t\t\treturn [ startOfYear( today ), today ];\n\t\t},\n\t},\n];\n\nconst parseDate = ( dateString?: string ): Date | null => {\n\tif ( ! dateString ) {\n\t\treturn null;\n\t}\n\tconst parsed = getDate( dateString );\n\treturn parsed && isValidDate( parsed ) ? parsed : null;\n};\n\nconst formatDate = ( date?: Date | string ): string => {\n\tif ( ! date ) {\n\t\treturn '';\n\t}\n\treturn typeof date === 'string' ? date : format( date, 'yyyy-MM-dd' );\n};\n\nfunction ValidatedDateControl< Item >( {\n\tfield,\n\tvalidity,\n\tinputRefs,\n\tisTouched,\n\tsetIsTouched,\n\tchildren,\n}: {\n\tfield: NormalizedField< Item >;\n\tvalidity?: FieldValidity;\n\tinputRefs:\n\t\t| React.RefObject< HTMLInputElement | null >\n\t\t| React.RefObject< HTMLInputElement | null >[];\n\tisTouched: boolean;\n\tsetIsTouched: ( touched: boolean ) => void;\n\tchildren: React.ReactNode;\n} ) {\n\tconst { isValid } = field;\n\tconst [ customValidity, setCustomValidity ] = useState<\n\t\t| { type: 'valid' | 'validating' | 'invalid'; message?: string }\n\t\t| undefined\n\t>( undefined );\n\n\tconst validateRefs = useCallback( () => {\n\t\t// Check HTML5 validity on all refs\n\t\tconst refs = Array.isArray( inputRefs ) ? inputRefs : [ inputRefs ];\n\t\tfor ( const ref of refs ) {\n\t\t\tconst input = ref.current;\n\t\t\tif ( input && ! input.validity.valid ) {\n\t\t\t\tsetCustomValidity( {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: input.validationMessage,\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// No errors\n\t\tsetCustomValidity( undefined );\n\t}, [ inputRefs ] );\n\n\t// Sync React-level validation to native inputs.\n\tuseEffect( () => {\n\t\tconst refs = Array.isArray( inputRefs ) ? inputRefs : [ inputRefs ];\n\t\tconst result = validity\n\t\t\t? getCustomValidity( isValid, validity )\n\t\t\t: undefined;\n\t\tfor ( const ref of refs ) {\n\t\t\tconst input = ref.current;\n\t\t\tif ( input ) {\n\t\t\t\tinput.setCustomValidity(\n\t\t\t\t\tresult?.type === 'invalid' && result.message\n\t\t\t\t\t\t? result.message\n\t\t\t\t\t\t: ''\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}, [ inputRefs, isValid, validity ] );\n\n\t// Listen for 'invalid' events (e.g., from reportValidity() on card re-expand).\n\tuseEffect( () => {\n\t\tconst refs = Array.isArray( inputRefs ) ? inputRefs : [ inputRefs ];\n\t\tconst handleInvalid = ( event: Event ) => {\n\t\t\tevent.preventDefault();\n\t\t\tsetIsTouched( true );\n\t\t};\n\t\tfor ( const ref of refs ) {\n\t\t\tref.current?.addEventListener( 'invalid', handleInvalid );\n\t\t}\n\t\treturn () => {\n\t\t\tfor ( const ref of refs ) {\n\t\t\t\tref.current?.removeEventListener( 'invalid', handleInvalid );\n\t\t\t}\n\t\t};\n\t}, [ inputRefs, setIsTouched ] );\n\n\tuseEffect( () => {\n\t\tif ( ! isTouched ) {\n\t\t\treturn;\n\t\t}\n\t\tconst result = validity\n\t\t\t? getCustomValidity( isValid, validity )\n\t\t\t: undefined;\n\t\tif ( result ) {\n\t\t\tsetCustomValidity( result );\n\t\t} else {\n\t\t\tvalidateRefs();\n\t\t}\n\t}, [ isTouched, isValid, validity, validateRefs ] );\n\n\tconst onBlur = ( event: React.FocusEvent< HTMLDivElement > ) => {\n\t\tif ( isTouched ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Only consider \"blurred from the component\" if focus has fully left the wrapping div.\n\t\t// This prevents unnecessary blurs from components with multiple focusable elements.\n\t\tif (\n\t\t\t! event.relatedTarget ||\n\t\t\t! event.currentTarget.contains( event.relatedTarget )\n\t\t) {\n\t\t\tsetIsTouched( true );\n\t\t}\n\t};\n\n\treturn (\n\t\t<div onBlur={ onBlur }>\n\t\t\t{ children }\n\t\t\t<div aria-live=\"polite\">\n\t\t\t\t{ customValidity && (\n\t\t\t\t\t<p\n\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\t'components-validated-control__indicator',\n\t\t\t\t\t\t\tcustomValidity.type === 'invalid'\n\t\t\t\t\t\t\t\t? 'is-invalid'\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t) }\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName=\"components-validated-control__indicator-icon\"\n\t\t\t\t\t\t\ticon={ errorIcon }\n\t\t\t\t\t\t\tsize={ 16 }\n\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ customValidity.message }\n\t\t\t\t\t</p>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction CalendarDateControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tconst {\n\t\tid,\n\t\tlabel,\n\t\tdescription,\n\t\tsetValue,\n\t\tgetValue,\n\t\tisValid,\n\t\tformat: fieldFormat,\n\t} = field;\n\tconst disabled = field.isDisabled( { item: data, field } );\n\tconst [ selectedPresetId, setSelectedPresetId ] = useState< string | null >(\n\t\tnull\n\t);\n\n\tconst weekStartsOn =\n\t\t( fieldFormat as FormatDate ).weekStartsOn ??\n\t\tgetSettings().l10n.startOfWeek;\n\n\tconst fieldValue = getValue( { item: data } );\n\tconst value = typeof fieldValue === 'string' ? fieldValue : undefined;\n\tconst [ calendarMonth, setCalendarMonth ] = useState< Date >( () => {\n\t\tconst parsedDate = parseDate( value );\n\t\treturn parsedDate || new Date(); // Default to current month\n\t} );\n\n\tconst [ isTouched, setIsTouched ] = useState( false );\n\tconst validityTargetRef = useRef< HTMLInputElement >( null );\n\n\tconst { minConstraint, maxConstraint, disabledMatchers } =\n\t\tuseDisabledDateMatchers( isValid, parseDate );\n\n\tconst onChangeCallback = useCallback(\n\t\t( newValue: string | undefined ) =>\n\t\t\tonChange( setValue( { item: data, value: newValue } ) ),\n\t\t[ data, onChange, setValue ]\n\t);\n\n\tconst onSelectDate = useCallback(\n\t\t( newDate: Date | undefined | null ) => {\n\t\t\tconst dateValue = newDate\n\t\t\t\t? format( newDate, 'yyyy-MM-dd' )\n\t\t\t\t: undefined;\n\t\t\tonChangeCallback( dateValue );\n\t\t\tsetSelectedPresetId( null );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst handlePresetClick = useCallback(\n\t\t( preset: ( typeof DATE_PRESETS )[ 0 ] ) => {\n\t\t\tconst presetDate = preset.getValue();\n\t\t\tconst dateValue = formatDate( presetDate );\n\n\t\t\tsetCalendarMonth( presetDate );\n\t\t\tonChangeCallback( dateValue );\n\t\t\tsetSelectedPresetId( preset.id );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst handleManualDateChange = useCallback(\n\t\t( newValue?: string ) => {\n\t\t\tonChangeCallback( newValue );\n\t\t\tif ( newValue ) {\n\t\t\t\tconst parsedDate = parseDate( newValue );\n\t\t\t\tif ( parsedDate ) {\n\t\t\t\t\tsetCalendarMonth( parsedDate );\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetSelectedPresetId( null );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst {\n\t\ttimezone: { string: timezoneString },\n\t} = getSettings();\n\n\tlet displayLabel = label;\n\tif ( isValid?.required && ! markWhenOptional ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Required' ) })`;\n\t} else if ( ! isValid?.required && markWhenOptional ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Optional' ) })`;\n\t}\n\n\treturn (\n\t\t<ValidatedDateControl\n\t\t\tfield={ field }\n\t\t\tvalidity={ validity }\n\t\t\tinputRefs={ validityTargetRef }\n\t\t\tisTouched={ isTouched }\n\t\t\tsetIsTouched={ setIsTouched }\n\t\t>\n\t\t\t<BaseControl\n\t\t\t\tid={ id }\n\t\t\t\tclassName=\"dataviews-controls__date\"\n\t\t\t\tlabel={ displayLabel }\n\t\t\t\thelp={ description }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\t>\n\t\t\t\t<Stack direction=\"column\" gap=\"lg\">\n\t\t\t\t\t{ /* Preset buttons */ }\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\twrap=\"wrap\"\n\t\t\t\t\t\tjustify=\"flex-start\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ DATE_PRESETS.map( ( preset ) => {\n\t\t\t\t\t\t\tconst isSelected = selectedPresetId === preset.id;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"dataviews-controls__date-preset\"\n\t\t\t\t\t\t\t\t\tkey={ preset.id }\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\tisPressed={ isSelected }\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\thandlePresetClick( preset )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ preset.label }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tclassName=\"dataviews-controls__date-preset\"\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tisPressed={ ! selectedPresetId }\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tdisabled={ !! selectedPresetId || disabled }\n\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Custom' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\n\t\t\t\t\t{ /* Manual date input */ }\n\t\t\t\t\t<InputControl\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tref={ validityTargetRef }\n\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\tlabel={ __( 'Date' ) }\n\t\t\t\t\t\thideLabelFromVision\n\t\t\t\t\t\tvalue={ value }\n\t\t\t\t\t\tonChange={ handleManualDateChange }\n\t\t\t\t\t\trequired={ !! field.isValid?.required }\n\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\tmin={ minConstraint }\n\t\t\t\t\t\tmax={ maxConstraint }\n\t\t\t\t\t/>\n\n\t\t\t\t\t{ /* Calendar widget */ }\n\t\t\t\t\t<DateCalendar\n\t\t\t\t\t\tstyle={ { width: '100%' } }\n\t\t\t\t\t\tselected={\n\t\t\t\t\t\t\tvalue ? parseDate( value ) || undefined : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonSelect={ onSelectDate }\n\t\t\t\t\t\tmonth={ calendarMonth }\n\t\t\t\t\t\tonMonthChange={ setCalendarMonth }\n\t\t\t\t\t\ttimeZone={ timezoneString || undefined }\n\t\t\t\t\t\tweekStartsOn={ weekStartsOn }\n\t\t\t\t\t\tdisabled={ disabled || disabledMatchers }\n\t\t\t\t\t\tdisableNavigation={ disabled }\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t</BaseControl>\n\t\t</ValidatedDateControl>\n\t);\n}\n\nfunction CalendarDateRangeControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tconst {\n\t\tid,\n\t\tlabel,\n\t\tdescription,\n\t\tgetValue,\n\t\tsetValue,\n\t\tisValid,\n\t\tformat: fieldFormat,\n\t} = field;\n\tconst disabled = field.isDisabled( { item: data, field } );\n\tlet value: DateRange;\n\tconst fieldValue = getValue( { item: data } );\n\tif (\n\t\tArray.isArray( fieldValue ) &&\n\t\tfieldValue.length === 2 &&\n\t\tfieldValue.every( ( date ) => typeof date === 'string' )\n\t) {\n\t\tvalue = fieldValue as DateRange;\n\t}\n\n\tconst weekStartsOn =\n\t\t( fieldFormat as FormatDate ).weekStartsOn ??\n\t\tgetSettings().l10n.startOfWeek;\n\n\tconst { minConstraint, maxConstraint, disabledMatchers } =\n\t\tuseDisabledDateMatchers( isValid, parseDate );\n\n\tconst onChangeCallback = useCallback(\n\t\t( newValue: DateRange ) => {\n\t\t\tonChange(\n\t\t\t\tsetValue( {\n\t\t\t\t\titem: data,\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\t[ data, onChange, setValue ]\n\t);\n\n\tconst [ selectedPresetId, setSelectedPresetId ] = useState< string | null >(\n\t\tnull\n\t);\n\n\tconst selectedRange = useMemo( () => {\n\t\tif ( ! value ) {\n\t\t\treturn { from: undefined, to: undefined };\n\t\t}\n\n\t\tconst [ from, to ] = value;\n\t\treturn {\n\t\t\tfrom: parseDate( from ) || undefined,\n\t\t\tto: parseDate( to ) || undefined,\n\t\t};\n\t}, [ value ] );\n\n\tconst [ calendarMonth, setCalendarMonth ] = useState< Date >( () => {\n\t\treturn selectedRange.from || new Date();\n\t} );\n\n\tconst [ isTouched, setIsTouched ] = useState( false );\n\tconst fromInputRef = useRef< HTMLInputElement >( null );\n\tconst toInputRef = useRef< HTMLInputElement >( null );\n\n\tconst updateDateRange = useCallback(\n\t\t( fromDate?: Date | string, toDate?: Date | string ) => {\n\t\t\tif ( fromDate && toDate ) {\n\t\t\t\tonChangeCallback( [\n\t\t\t\t\tformatDate( fromDate ),\n\t\t\t\t\tformatDate( toDate ),\n\t\t\t\t] );\n\t\t\t} else if ( ! fromDate && ! toDate ) {\n\t\t\t\tonChangeCallback( undefined );\n\t\t\t}\n\t\t\t// Do nothing if only one date is set - wait for both\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst onSelectCalendarRange = useCallback(\n\t\t(\n\t\t\tnewRange:\n\t\t\t\t| { from: Date | undefined; to?: Date | undefined }\n\t\t\t\t| undefined\n\t\t) => {\n\t\t\tupdateDateRange( newRange?.from, newRange?.to );\n\t\t\tsetSelectedPresetId( null );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ updateDateRange ]\n\t);\n\n\tconst handlePresetClick = useCallback(\n\t\t( preset: ( typeof DATE_RANGE_PRESETS )[ 0 ] ) => {\n\t\t\tconst [ startDate, endDate ] = preset.getValue();\n\t\t\tsetCalendarMonth( startDate );\n\t\t\tupdateDateRange( startDate, endDate );\n\t\t\tsetSelectedPresetId( preset.id );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ updateDateRange ]\n\t);\n\n\tconst handleManualDateChange = useCallback(\n\t\t( fromOrTo: 'from' | 'to', newValue?: string ) => {\n\t\t\tconst [ currentFrom, currentTo ] = value || [\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t];\n\t\t\tconst updatedFrom = fromOrTo === 'from' ? newValue : currentFrom;\n\t\t\tconst updatedTo = fromOrTo === 'to' ? newValue : currentTo;\n\n\t\t\tupdateDateRange( updatedFrom, updatedTo );\n\n\t\t\tif ( newValue ) {\n\t\t\t\tconst parsedDate = parseDate( newValue );\n\t\t\t\tif ( parsedDate ) {\n\t\t\t\t\tsetCalendarMonth( parsedDate );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetSelectedPresetId( null );\n\t\t\tsetIsTouched( true );\n\t\t},\n\t\t[ value, updateDateRange ]\n\t);\n\n\tconst { timezone } = getSettings();\n\n\tlet displayLabel = label;\n\tif ( field.isValid?.required && ! markWhenOptional ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Required' ) })`;\n\t} else if ( ! field.isValid?.required && markWhenOptional ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Optional' ) })`;\n\t}\n\n\treturn (\n\t\t<ValidatedDateControl\n\t\t\tfield={ field }\n\t\t\tvalidity={ validity }\n\t\t\tinputRefs={ [ fromInputRef, toInputRef ] }\n\t\t\tisTouched={ isTouched }\n\t\t\tsetIsTouched={ setIsTouched }\n\t\t>\n\t\t\t<BaseControl\n\t\t\t\tid={ id }\n\t\t\t\tclassName=\"dataviews-controls__date\"\n\t\t\t\tlabel={ displayLabel }\n\t\t\t\thelp={ description }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\t>\n\t\t\t\t<Stack direction=\"column\" gap=\"lg\">\n\t\t\t\t\t{ /* Preset buttons */ }\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\twrap=\"wrap\"\n\t\t\t\t\t\tjustify=\"flex-start\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ DATE_RANGE_PRESETS.map( ( preset ) => {\n\t\t\t\t\t\t\tconst isSelected = selectedPresetId === preset.id;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"dataviews-controls__date-preset\"\n\t\t\t\t\t\t\t\t\tkey={ preset.id }\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\tisPressed={ isSelected }\n\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\thandlePresetClick( preset )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ preset.label }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tclassName=\"dataviews-controls__date-preset\"\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tisPressed={ ! selectedPresetId }\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\taccessibleWhenDisabled\n\t\t\t\t\t\t\tdisabled={ !! selectedPresetId || disabled }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Custom' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\n\t\t\t\t\t{ /* Manual date range inputs */ }\n\t\t\t\t\t<Stack\n\t\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\t\tjustify=\"space-between\"\n\t\t\t\t\t\tclassName=\"dataviews-controls__date-range-inputs\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<InputControl\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tref={ fromInputRef }\n\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\tlabel={ __( 'From' ) }\n\t\t\t\t\t\t\thideLabelFromVision\n\t\t\t\t\t\t\tvalue={ value?.[ 0 ] }\n\t\t\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\t\t\thandleManualDateChange( 'from', newValue )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trequired={ !! field.isValid?.required }\n\t\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\t\tmin={ minConstraint }\n\t\t\t\t\t\t\tmax={ maxConstraint }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<InputControl\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tref={ toInputRef }\n\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\tlabel={ __( 'To' ) }\n\t\t\t\t\t\t\thideLabelFromVision\n\t\t\t\t\t\t\tvalue={ value?.[ 1 ] }\n\t\t\t\t\t\t\tonChange={ ( newValue ) =>\n\t\t\t\t\t\t\t\thandleManualDateChange( 'to', newValue )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trequired={ !! field.isValid?.required }\n\t\t\t\t\t\t\tdisabled={ disabled }\n\t\t\t\t\t\t\tmin={ minConstraint }\n\t\t\t\t\t\t\tmax={ maxConstraint }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Stack>\n\n\t\t\t\t\t<DateRangeCalendar\n\t\t\t\t\t\tstyle={ { width: '100%' } }\n\t\t\t\t\t\tselected={ selectedRange }\n\t\t\t\t\t\tonSelect={ onSelectCalendarRange }\n\t\t\t\t\t\tmonth={ calendarMonth }\n\t\t\t\t\t\tonMonthChange={ setCalendarMonth }\n\t\t\t\t\t\ttimeZone={ timezone.string || undefined }\n\t\t\t\t\t\tweekStartsOn={ weekStartsOn }\n\t\t\t\t\t\tdisabled={ disabled || disabledMatchers }\n\t\t\t\t\t/>\n\t\t\t\t</Stack>\n\t\t\t</BaseControl>\n\t\t</ValidatedDateControl>\n\t);\n}\n\nexport default function DateControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\toperator,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tif ( operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER ) {\n\t\treturn (\n\t\t\t<RelativeDateControl\n\t\t\t\tclassName=\"dataviews-controls__date\"\n\t\t\t\tdata={ data }\n\t\t\t\tfield={ field }\n\t\t\t\tonChange={ onChange }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\t\toperator={ operator }\n\t\t\t/>\n\t\t);\n\t}\n\n\tif ( operator === OPERATOR_BETWEEN ) {\n\t\treturn (\n\t\t\t<CalendarDateRangeControl\n\t\t\t\tdata={ data }\n\t\t\t\tfield={ field }\n\t\t\t\tonChange={ onChange }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\t\tvalidity={ validity }\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<CalendarDateControl\n\t\t\tdata={ data }\n\t\t\tfield={ field }\n\t\t\tonChange={ onChange }\n\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\tvalidity={ validity }\n\t\t/>\n\t);\n}\n"],
5
+ "mappings": ";AAGA,OAAO,UAAU;AACjB;AAAA,EACC;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAKP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,8BAA8B;AAAA,OACxB;AACP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,UAAU;AACnB,SAAS,SAAS,mBAAmB;AACrC,SAAS,SAAS,iBAAiB;AACnC,SAAS,aAAa;AAKtB,OAAO,yBAAyB;AAChC,OAAO,6BAA6B;AACpC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,cAAc;AAOvB,OAAO,uBAAuB;AAkNzB,SAQC,KARD;AAhNL,IAAM,EAAE,cAAc,kBAAkB,IAAI,OAAQ,qBAAsB;AAI1E,IAAM,eAIA;AAAA,EACL;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,OAAQ;AAAA,IACnB,UAAU,MAAM,QAAS,IAAK;AAAA,EAC/B;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,WAAY;AAAA,IACvB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,QAAS,OAAO,CAAE;AAAA,IAC1B;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,WAAY;AAAA,IACvB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,QAAS,OAAO,CAAE;AAAA,IAC1B;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,YAAa;AAAA,IACxB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,UAAW,OAAO,CAAE;AAAA,IAC5B;AAAA,EACD;AACD;AAEA,IAAM,qBAAqB;AAAA,EAC1B;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,aAAc;AAAA,IACzB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,QAAS,OAAO,CAAE,GAAG,KAAM;AAAA,IACrC;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,cAAe;AAAA,IAC1B,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,QAAS,OAAO,EAAG,GAAG,KAAM;AAAA,IACtC;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,eAAgB;AAAA,IAC3B,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,aAAc,KAAM,GAAG,KAAM;AAAA,IACvC;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,WAAY;AAAA,IACvB,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,SAAU,OAAO,CAAE,GAAG,KAAM;AAAA,IACtC;AAAA,EACD;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO,GAAI,cAAe;AAAA,IAC1B,UAAU,MAAM;AACf,YAAM,QAAQ,QAAS,IAAK;AAC5B,aAAO,CAAE,YAAa,KAAM,GAAG,KAAM;AAAA,IACtC;AAAA,EACD;AACD;AAEA,IAAM,YAAY,CAAE,eAAsC;AACzD,MAAK,CAAE,YAAa;AACnB,WAAO;AAAA,EACR;AACA,QAAM,SAAS,QAAS,UAAW;AACnC,SAAO,UAAU,YAAa,MAAO,IAAI,SAAS;AACnD;AAEA,IAAM,aAAa,CAAE,SAAkC;AACtD,MAAK,CAAE,MAAO;AACb,WAAO;AAAA,EACR;AACA,SAAO,OAAO,SAAS,WAAW,OAAO,OAAQ,MAAM,YAAa;AACrE;AAEA,SAAS,qBAA8B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GASI;AACH,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,CAAE,gBAAgB,iBAAkB,IAAI,SAG3C,MAAU;AAEb,QAAM,eAAe,YAAa,MAAM;AAEvC,UAAM,OAAO,MAAM,QAAS,SAAU,IAAI,YAAY,CAAE,SAAU;AAClE,eAAY,OAAO,MAAO;AACzB,YAAM,QAAQ,IAAI;AAClB,UAAK,SAAS,CAAE,MAAM,SAAS,OAAQ;AACtC,0BAAmB;AAAA,UAClB,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,QAChB,CAAE;AACF;AAAA,MACD;AAAA,IACD;AAGA,sBAAmB,MAAU;AAAA,EAC9B,GAAG,CAAE,SAAU,CAAE;AAGjB,YAAW,MAAM;AAChB,UAAM,OAAO,MAAM,QAAS,SAAU,IAAI,YAAY,CAAE,SAAU;AAClE,UAAM,SAAS,WACZ,kBAAmB,SAAS,QAAS,IACrC;AACH,eAAY,OAAO,MAAO;AACzB,YAAM,QAAQ,IAAI;AAClB,UAAK,OAAQ;AACZ,cAAM;AAAA,UACL,QAAQ,SAAS,aAAa,OAAO,UAClC,OAAO,UACP;AAAA,QACJ;AAAA,MACD;AAAA,IACD;AAAA,EACD,GAAG,CAAE,WAAW,SAAS,QAAS,CAAE;AAGpC,YAAW,MAAM;AAChB,UAAM,OAAO,MAAM,QAAS,SAAU,IAAI,YAAY,CAAE,SAAU;AAClE,UAAM,gBAAgB,CAAE,UAAkB;AACzC,YAAM,eAAe;AACrB,mBAAc,IAAK;AAAA,IACpB;AACA,eAAY,OAAO,MAAO;AACzB,UAAI,SAAS,iBAAkB,WAAW,aAAc;AAAA,IACzD;AACA,WAAO,MAAM;AACZ,iBAAY,OAAO,MAAO;AACzB,YAAI,SAAS,oBAAqB,WAAW,aAAc;AAAA,MAC5D;AAAA,IACD;AAAA,EACD,GAAG,CAAE,WAAW,YAAa,CAAE;AAE/B,YAAW,MAAM;AAChB,QAAK,CAAE,WAAY;AAClB;AAAA,IACD;AACA,UAAM,SAAS,WACZ,kBAAmB,SAAS,QAAS,IACrC;AACH,QAAK,QAAS;AACb,wBAAmB,MAAO;AAAA,IAC3B,OAAO;AACN,mBAAa;AAAA,IACd;AAAA,EACD,GAAG,CAAE,WAAW,SAAS,UAAU,YAAa,CAAE;AAElD,QAAM,SAAS,CAAE,UAA+C;AAC/D,QAAK,WAAY;AAChB;AAAA,IACD;AAIA,QACC,CAAE,MAAM,iBACR,CAAE,MAAM,cAAc,SAAU,MAAM,aAAc,GACnD;AACD,mBAAc,IAAK;AAAA,IACpB;AAAA,EACD;AAEA,SACC,qBAAC,SAAI,QACF;AAAA;AAAA,IACF,oBAAC,SAAI,aAAU,UACZ,4BACD;AAAA,MAAC;AAAA;AAAA,QACA,WAAY;AAAA,UACX;AAAA,UACA,eAAe,SAAS,YACrB,eACA;AAAA,QACJ;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,WAAU;AAAA,cACV,MAAO;AAAA,cACP,MAAO;AAAA,cACP,MAAK;AAAA;AAAA,UACN;AAAA,UACE,eAAe;AAAA;AAAA;AAAA,IAClB,GAEF;AAAA,KACD;AAEF;AAEA,SAAS,oBAA6B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACT,IAAI;AACJ,QAAM,WAAW,MAAM,WAAY,EAAE,MAAM,MAAM,MAAM,CAAE;AACzD,QAAM,CAAE,kBAAkB,mBAAoB,IAAI;AAAA,IACjD;AAAA,EACD;AAEA,QAAM,eACH,YAA4B,gBAC9B,YAAY,EAAE,KAAK;AAEpB,QAAM,aAAa,SAAU,EAAE,MAAM,KAAK,CAAE;AAC5C,QAAM,QAAQ,OAAO,eAAe,WAAW,aAAa;AAC5D,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAkB,MAAM;AACnE,UAAM,aAAa,UAAW,KAAM;AACpC,WAAO,cAAc,oBAAI,KAAK;AAAA,EAC/B,CAAE;AAEF,QAAM,CAAE,WAAW,YAAa,IAAI,SAAU,KAAM;AACpD,QAAM,oBAAoB,OAA4B,IAAK;AAE3D,QAAM,EAAE,eAAe,eAAe,iBAAiB,IACtD,wBAAyB,SAAS,SAAU;AAE7C,QAAM,mBAAmB;AAAA,IACxB,CAAE,aACD,SAAU,SAAU,EAAE,MAAM,MAAM,OAAO,SAAS,CAAE,CAAE;AAAA,IACvD,CAAE,MAAM,UAAU,QAAS;AAAA,EAC5B;AAEA,QAAM,eAAe;AAAA,IACpB,CAAE,YAAsC;AACvC,YAAM,YAAY,UACf,OAAQ,SAAS,YAAa,IAC9B;AACH,uBAAkB,SAAU;AAC5B,0BAAqB,IAAK;AAC1B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM,oBAAoB;AAAA,IACzB,CAAE,WAA0C;AAC3C,YAAM,aAAa,OAAO,SAAS;AACnC,YAAM,YAAY,WAAY,UAAW;AAEzC,uBAAkB,UAAW;AAC7B,uBAAkB,SAAU;AAC5B,0BAAqB,OAAO,EAAG;AAC/B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM,yBAAyB;AAAA,IAC9B,CAAE,aAAuB;AACxB,uBAAkB,QAAS;AAC3B,UAAK,UAAW;AACf,cAAM,aAAa,UAAW,QAAS;AACvC,YAAK,YAAa;AACjB,2BAAkB,UAAW;AAAA,QAC9B;AAAA,MACD;AACA,0BAAqB,IAAK;AAC1B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM;AAAA,IACL,UAAU,EAAE,QAAQ,eAAe;AAAA,EACpC,IAAI,YAAY;AAEhB,MAAI,eAAe;AACnB,MAAK,SAAS,YAAY,CAAE,kBAAmB;AAC9C,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD,WAAY,CAAE,SAAS,YAAY,kBAAmB;AACrD,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAY;AAAA,MACZ;AAAA,MACA;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,WAAU;AAAA,UACV,OAAQ;AAAA,UACR,MAAO;AAAA,UACP;AAAA,UAEA,+BAAC,SAAM,WAAU,UAAS,KAAI,MAE7B;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,WAAU;AAAA,gBACV,KAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,SAAQ;AAAA,gBAEN;AAAA,+BAAa,IAAK,CAAE,WAAY;AACjC,0BAAM,aAAa,qBAAqB,OAAO;AAC/C,2BACC;AAAA,sBAAC;AAAA;AAAA,wBACA,WAAU;AAAA,wBAEV,SAAQ;AAAA,wBACR,WAAY;AAAA,wBACZ,MAAK;AAAA,wBACL;AAAA,wBACA,wBAAsB;AAAA,wBACtB,SAAU,MACT,kBAAmB,MAAO;AAAA,wBAGzB,iBAAO;AAAA;AAAA,sBAVH,OAAO;AAAA,oBAWd;AAAA,kBAEF,CAAE;AAAA,kBACF;AAAA,oBAAC;AAAA;AAAA,sBACA,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,WAAY,CAAE;AAAA,sBACd,MAAK;AAAA,sBACL,UAAW,CAAC,CAAE,oBAAoB;AAAA,sBAClC,wBAAsB;AAAA,sBAEpB,aAAI,QAAS;AAAA;AAAA,kBAChB;AAAA;AAAA;AAAA,YACD;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACA,uBAAqB;AAAA,gBACrB,KAAM;AAAA,gBACN,MAAK;AAAA,gBACL,OAAQ,GAAI,MAAO;AAAA,gBACnB,qBAAmB;AAAA,gBACnB;AAAA,gBACA,UAAW;AAAA,gBACX,UAAW,CAAC,CAAE,MAAM,SAAS;AAAA,gBAC7B;AAAA,gBACA,KAAM;AAAA,gBACN,KAAM;AAAA;AAAA,YACP;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACA,OAAQ,EAAE,OAAO,OAAO;AAAA,gBACxB,UACC,QAAQ,UAAW,KAAM,KAAK,SAAY;AAAA,gBAE3C,UAAW;AAAA,gBACX,OAAQ;AAAA,gBACR,eAAgB;AAAA,gBAChB,UAAW,kBAAkB;AAAA,gBAC7B;AAAA,gBACA,UAAW,YAAY;AAAA,gBACvB,mBAAoB;AAAA;AAAA,YACrB;AAAA,aACD;AAAA;AAAA,MACD;AAAA;AAAA,EACD;AAEF;AAEA,SAAS,yBAAkC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACT,IAAI;AACJ,QAAM,WAAW,MAAM,WAAY,EAAE,MAAM,MAAM,MAAM,CAAE;AACzD,MAAI;AACJ,QAAM,aAAa,SAAU,EAAE,MAAM,KAAK,CAAE;AAC5C,MACC,MAAM,QAAS,UAAW,KAC1B,WAAW,WAAW,KACtB,WAAW,MAAO,CAAE,SAAU,OAAO,SAAS,QAAS,GACtD;AACD,YAAQ;AAAA,EACT;AAEA,QAAM,eACH,YAA4B,gBAC9B,YAAY,EAAE,KAAK;AAEpB,QAAM,EAAE,eAAe,eAAe,iBAAiB,IACtD,wBAAyB,SAAS,SAAU;AAE7C,QAAM,mBAAmB;AAAA,IACxB,CAAE,aAAyB;AAC1B;AAAA,QACC,SAAU;AAAA,UACT,MAAM;AAAA,UACN,OAAO;AAAA,QACR,CAAE;AAAA,MACH;AAAA,IACD;AAAA,IACA,CAAE,MAAM,UAAU,QAAS;AAAA,EAC5B;AAEA,QAAM,CAAE,kBAAkB,mBAAoB,IAAI;AAAA,IACjD;AAAA,EACD;AAEA,QAAM,gBAAgB,QAAS,MAAM;AACpC,QAAK,CAAE,OAAQ;AACd,aAAO,EAAE,MAAM,QAAW,IAAI,OAAU;AAAA,IACzC;AAEA,UAAM,CAAE,MAAM,EAAG,IAAI;AACrB,WAAO;AAAA,MACN,MAAM,UAAW,IAAK,KAAK;AAAA,MAC3B,IAAI,UAAW,EAAG,KAAK;AAAA,IACxB;AAAA,EACD,GAAG,CAAE,KAAM,CAAE;AAEb,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAkB,MAAM;AACnE,WAAO,cAAc,QAAQ,oBAAI,KAAK;AAAA,EACvC,CAAE;AAEF,QAAM,CAAE,WAAW,YAAa,IAAI,SAAU,KAAM;AACpD,QAAM,eAAe,OAA4B,IAAK;AACtD,QAAM,aAAa,OAA4B,IAAK;AAEpD,QAAM,kBAAkB;AAAA,IACvB,CAAE,UAA0B,WAA4B;AACvD,UAAK,YAAY,QAAS;AACzB,yBAAkB;AAAA,UACjB,WAAY,QAAS;AAAA,UACrB,WAAY,MAAO;AAAA,QACpB,CAAE;AAAA,MACH,WAAY,CAAE,YAAY,CAAE,QAAS;AACpC,yBAAkB,MAAU;AAAA,MAC7B;AAAA,IAED;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM,wBAAwB;AAAA,IAC7B,CACC,aAGI;AACJ,sBAAiB,UAAU,MAAM,UAAU,EAAG;AAC9C,0BAAqB,IAAK;AAC1B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,eAAgB;AAAA,EACnB;AAEA,QAAM,oBAAoB;AAAA,IACzB,CAAE,WAAgD;AACjD,YAAM,CAAE,WAAW,OAAQ,IAAI,OAAO,SAAS;AAC/C,uBAAkB,SAAU;AAC5B,sBAAiB,WAAW,OAAQ;AACpC,0BAAqB,OAAO,EAAG;AAC/B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,eAAgB;AAAA,EACnB;AAEA,QAAM,yBAAyB;AAAA,IAC9B,CAAE,UAAyB,aAAuB;AACjD,YAAM,CAAE,aAAa,SAAU,IAAI,SAAS;AAAA,QAC3C;AAAA,QACA;AAAA,MACD;AACA,YAAM,cAAc,aAAa,SAAS,WAAW;AACrD,YAAM,YAAY,aAAa,OAAO,WAAW;AAEjD,sBAAiB,aAAa,SAAU;AAExC,UAAK,UAAW;AACf,cAAM,aAAa,UAAW,QAAS;AACvC,YAAK,YAAa;AACjB,2BAAkB,UAAW;AAAA,QAC9B;AAAA,MACD;AAEA,0BAAqB,IAAK;AAC1B,mBAAc,IAAK;AAAA,IACpB;AAAA,IACA,CAAE,OAAO,eAAgB;AAAA,EAC1B;AAEA,QAAM,EAAE,SAAS,IAAI,YAAY;AAEjC,MAAI,eAAe;AACnB,MAAK,MAAM,SAAS,YAAY,CAAE,kBAAmB;AACpD,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD,WAAY,CAAE,MAAM,SAAS,YAAY,kBAAmB;AAC3D,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAY,CAAE,cAAc,UAAW;AAAA,MACvC;AAAA,MACA;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,WAAU;AAAA,UACV,OAAQ;AAAA,UACR,MAAO;AAAA,UACP;AAAA,UAEA,+BAAC,SAAM,WAAU,UAAS,KAAI,MAE7B;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,WAAU;AAAA,gBACV,KAAI;AAAA,gBACJ,MAAK;AAAA,gBACL,SAAQ;AAAA,gBAEN;AAAA,qCAAmB,IAAK,CAAE,WAAY;AACvC,0BAAM,aAAa,qBAAqB,OAAO;AAC/C,2BACC;AAAA,sBAAC;AAAA;AAAA,wBACA,WAAU;AAAA,wBAEV,SAAQ;AAAA,wBACR,WAAY;AAAA,wBACZ,MAAK;AAAA,wBACL;AAAA,wBACA,wBAAsB;AAAA,wBACtB,SAAU,MACT,kBAAmB,MAAO;AAAA,wBAGzB,iBAAO;AAAA;AAAA,sBAVH,OAAO;AAAA,oBAWd;AAAA,kBAEF,CAAE;AAAA,kBACF;AAAA,oBAAC;AAAA;AAAA,sBACA,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,WAAY,CAAE;AAAA,sBACd,MAAK;AAAA,sBACL,wBAAsB;AAAA,sBACtB,UAAW,CAAC,CAAE,oBAAoB;AAAA,sBAEhC,aAAI,QAAS;AAAA;AAAA,kBAChB;AAAA;AAAA;AAAA,YACD;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACA,WAAU;AAAA,gBACV,KAAI;AAAA,gBACJ,SAAQ;AAAA,gBACR,WAAU;AAAA,gBAEV;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACA,uBAAqB;AAAA,sBACrB,KAAM;AAAA,sBACN,MAAK;AAAA,sBACL,OAAQ,GAAI,MAAO;AAAA,sBACnB,qBAAmB;AAAA,sBACnB,OAAQ,QAAS,CAAE;AAAA,sBACnB,UAAW,CAAE,aACZ,uBAAwB,QAAQ,QAAS;AAAA,sBAE1C,UAAW,CAAC,CAAE,MAAM,SAAS;AAAA,sBAC7B;AAAA,sBACA,KAAM;AAAA,sBACN,KAAM;AAAA;AAAA,kBACP;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACA,uBAAqB;AAAA,sBACrB,KAAM;AAAA,sBACN,MAAK;AAAA,sBACL,OAAQ,GAAI,IAAK;AAAA,sBACjB,qBAAmB;AAAA,sBACnB,OAAQ,QAAS,CAAE;AAAA,sBACnB,UAAW,CAAE,aACZ,uBAAwB,MAAM,QAAS;AAAA,sBAExC,UAAW,CAAC,CAAE,MAAM,SAAS;AAAA,sBAC7B;AAAA,sBACA,KAAM;AAAA,sBACN,KAAM;AAAA;AAAA,kBACP;AAAA;AAAA;AAAA,YACD;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACA,OAAQ,EAAE,OAAO,OAAO;AAAA,gBACxB,UAAW;AAAA,gBACX,UAAW;AAAA,gBACX,OAAQ;AAAA,gBACR,eAAgB;AAAA,gBAChB,UAAW,SAAS,UAAU;AAAA,gBAC9B;AAAA,gBACA,UAAW,YAAY;AAAA;AAAA,YACxB;AAAA,aACD;AAAA;AAAA,MACD;AAAA;AAAA,EACD;AAEF;AAEe,SAAR,YAAsC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,MAAK,aAAa,wBAAwB,aAAa,eAAgB;AACtE,WACC;AAAA,MAAC;AAAA;AAAA,QACA,WAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACD;AAAA,EAEF;AAEA,MAAK,aAAa,kBAAmB;AACpC,WACC;AAAA,MAAC;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACD;AAAA,EAEF;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACD;AAEF;",
6
6
  "names": []
7
7
  }
@@ -9,6 +9,7 @@ import { dateI18n, getDate, getSettings } from "@wordpress/date";
9
9
  import { Stack } from "@wordpress/ui";
10
10
  import { OPERATOR_IN_THE_PAST, OPERATOR_OVER } from "../../constants.mjs";
11
11
  import RelativeDateControl from "./utils/relative-date-control.mjs";
12
+ import useDisabledDateMatchers from "./utils/use-disabled-date-matchers.mjs";
12
13
  import getCustomValidity from "./utils/get-custom-validity.mjs";
13
14
  import parseDateTime from "../../field-types/utils/parse-date-time.mjs";
14
15
  import { unlock } from "../../lock-unlock.mjs";
@@ -41,6 +42,7 @@ function CalendarDateTimeControl({
41
42
  const inputControlRef = useRef(null);
42
43
  const validationTimeoutRef = useRef(void 0);
43
44
  const previousFocusRef = useRef(null);
45
+ const { minConstraint, maxConstraint, disabledMatchers } = useDisabledDateMatchers(isValid, parseDateTime);
44
46
  const onChangeCallback = useCallback(
45
47
  (newValue) => onChange(setValue({ item: data, value: newValue })),
46
48
  [data, onChange, setValue]
@@ -132,7 +134,9 @@ function CalendarDateTimeControl({
132
134
  hideLabelFromVision: true,
133
135
  value: formatDateTime(value),
134
136
  onChange: handleManualDateTimeChange,
135
- disabled
137
+ disabled,
138
+ min: minConstraint ? formatDateTime(minConstraint) : void 0,
139
+ max: maxConstraint ? formatDateTime(maxConstraint) : void 0
136
140
  }
137
141
  ),
138
142
  !compact && /* @__PURE__ */ jsx(
@@ -145,7 +149,7 @@ function CalendarDateTimeControl({
145
149
  onMonthChange: setCalendarMonth,
146
150
  timeZone: timezoneString || void 0,
147
151
  weekStartsOn,
148
- disabled
152
+ disabled: disabled || disabledMatchers
149
153
  }
150
154
  )
151
155
  ] })