@wordpress/dataviews 13.1.1-next.v.202603161435.0 → 14.0.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 (183) hide show
  1. package/CHANGELOG.md +15 -6
  2. package/README.md +17 -2
  3. package/build/components/dataform-controls/datetime.cjs +8 -4
  4. package/build/components/dataform-controls/datetime.cjs.map +2 -2
  5. package/build/components/dataform-layouts/card/index.cjs +132 -128
  6. package/build/components/dataform-layouts/card/index.cjs.map +3 -3
  7. package/build/components/dataviews-bulk-actions/index.cjs +28 -5
  8. package/build/components/dataviews-bulk-actions/index.cjs.map +2 -2
  9. package/build/components/dataviews-context/index.cjs +2 -2
  10. package/build/components/dataviews-context/index.cjs.map +2 -2
  11. package/build/components/dataviews-footer/index.cjs +2 -3
  12. package/build/components/dataviews-footer/index.cjs.map +2 -2
  13. package/build/components/dataviews-layouts/grid/composite-grid.cjs +378 -249
  14. package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
  15. package/build/components/dataviews-layouts/picker-grid/index.cjs +63 -30
  16. package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
  17. package/build/components/dataviews-layouts/picker-table/index.cjs +34 -22
  18. package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
  19. package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs +62 -0
  20. package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs.map +7 -0
  21. package/build/components/dataviews-picker-footer/index.cjs +23 -4
  22. package/build/components/dataviews-picker-footer/index.cjs.map +2 -2
  23. package/build/components/dataviews-search/index.cjs +2 -1
  24. package/build/components/dataviews-search/index.cjs.map +2 -2
  25. package/build/components/dataviews-selection-checkbox/index.cjs +3 -2
  26. package/build/components/dataviews-selection-checkbox/index.cjs.map +2 -2
  27. package/build/components/dataviews-view-config/index.cjs +0 -2
  28. package/build/components/dataviews-view-config/index.cjs.map +3 -3
  29. package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs +0 -3
  30. package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs.map +2 -2
  31. package/build/dataviews/index.cjs +37 -37
  32. package/build/dataviews/index.cjs.map +3 -3
  33. package/build/dataviews-picker/index.cjs +25 -24
  34. package/build/dataviews-picker/index.cjs.map +3 -3
  35. package/build/hooks/index.cjs +11 -2
  36. package/build/hooks/index.cjs.map +2 -2
  37. package/build/hooks/use-data.cjs +146 -9
  38. package/build/hooks/use-data.cjs.map +2 -2
  39. package/build/hooks/use-infinite-scroll.cjs +208 -0
  40. package/build/hooks/use-infinite-scroll.cjs.map +7 -0
  41. package/build/hooks/use-selected-items.cjs +57 -0
  42. package/build/hooks/use-selected-items.cjs.map +7 -0
  43. package/build/types/dataviews.cjs.map +1 -1
  44. package/build/types/field-api.cjs.map +1 -1
  45. package/build/utils/filter-sort-and-paginate.cjs +5 -1
  46. package/build/utils/filter-sort-and-paginate.cjs.map +2 -2
  47. package/build/utils/get-footer-message.cjs +8 -8
  48. package/build/utils/get-footer-message.cjs.map +2 -2
  49. package/build-module/components/dataform-controls/datetime.mjs +8 -4
  50. package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
  51. package/build-module/components/dataform-layouts/card/index.mjs +132 -133
  52. package/build-module/components/dataform-layouts/card/index.mjs.map +2 -2
  53. package/build-module/components/dataviews-bulk-actions/index.mjs +28 -5
  54. package/build-module/components/dataviews-bulk-actions/index.mjs.map +2 -2
  55. package/build-module/components/dataviews-context/index.mjs +2 -2
  56. package/build-module/components/dataviews-context/index.mjs.map +2 -2
  57. package/build-module/components/dataviews-footer/index.mjs +2 -3
  58. package/build-module/components/dataviews-footer/index.mjs.map +2 -2
  59. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs +387 -250
  60. package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
  61. package/build-module/components/dataviews-layouts/picker-grid/index.mjs +67 -31
  62. package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
  63. package/build-module/components/dataviews-layouts/picker-table/index.mjs +34 -22
  64. package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
  65. package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs +26 -0
  66. package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs.map +7 -0
  67. package/build-module/components/dataviews-picker-footer/index.mjs +23 -4
  68. package/build-module/components/dataviews-picker-footer/index.mjs.map +2 -2
  69. package/build-module/components/dataviews-search/index.mjs +2 -1
  70. package/build-module/components/dataviews-search/index.mjs.map +2 -2
  71. package/build-module/components/dataviews-selection-checkbox/index.mjs +3 -2
  72. package/build-module/components/dataviews-selection-checkbox/index.mjs.map +2 -2
  73. package/build-module/components/dataviews-view-config/index.mjs +0 -2
  74. package/build-module/components/dataviews-view-config/index.mjs.map +2 -2
  75. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs +0 -3
  76. package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs.map +2 -2
  77. package/build-module/dataviews/index.mjs +45 -39
  78. package/build-module/dataviews/index.mjs.map +2 -2
  79. package/build-module/dataviews-picker/index.mjs +33 -26
  80. package/build-module/dataviews-picker/index.mjs.map +2 -2
  81. package/build-module/hooks/index.mjs +7 -1
  82. package/build-module/hooks/index.mjs.map +2 -2
  83. package/build-module/hooks/use-data.mjs +147 -10
  84. package/build-module/hooks/use-data.mjs.map +2 -2
  85. package/build-module/hooks/use-infinite-scroll.mjs +188 -0
  86. package/build-module/hooks/use-infinite-scroll.mjs.map +7 -0
  87. package/build-module/hooks/use-selected-items.mjs +36 -0
  88. package/build-module/hooks/use-selected-items.mjs.map +7 -0
  89. package/build-module/utils/filter-sort-and-paginate.mjs +5 -1
  90. package/build-module/utils/filter-sort-and-paginate.mjs.map +2 -2
  91. package/build-module/utils/get-footer-message.mjs +8 -8
  92. package/build-module/utils/get-footer-message.mjs.map +2 -2
  93. package/build-style/style-rtl.css +61 -37
  94. package/build-style/style.css +61 -37
  95. package/build-types/components/dataform-controls/datetime.d.ts +1 -1
  96. package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
  97. package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
  98. package/build-types/components/dataviews-bulk-actions/index.d.ts +2 -1
  99. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
  100. package/build-types/components/dataviews-context/index.d.ts +1 -1
  101. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  102. package/build-types/components/dataviews-footer/index.d.ts.map +1 -1
  103. package/build-types/components/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
  104. package/build-types/components/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  105. package/build-types/components/dataviews-layouts/picker-table/index.d.ts.map +1 -1
  106. package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts +22 -0
  107. package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts.map +1 -0
  108. package/build-types/components/dataviews-picker-footer/index.d.ts.map +1 -1
  109. package/build-types/components/dataviews-search/index.d.ts.map +1 -1
  110. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  111. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  112. package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts +1 -1
  113. package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts.map +1 -1
  114. package/build-types/dataviews/index.d.ts +0 -1
  115. package/build-types/dataviews/index.d.ts.map +1 -1
  116. package/build-types/dataviews/stories/fixtures.d.ts.map +1 -1
  117. package/build-types/dataviews/stories/free-composition.d.ts.map +1 -1
  118. package/build-types/dataviews/stories/index.story.d.ts +11 -0
  119. package/build-types/dataviews/stories/index.story.d.ts.map +1 -1
  120. package/build-types/dataviews/stories/infinite-scroll.d.ts.map +1 -1
  121. package/build-types/dataviews/stories/with-card.d.ts.map +1 -1
  122. package/build-types/dataviews-picker/index.d.ts +0 -1
  123. package/build-types/dataviews-picker/index.d.ts.map +1 -1
  124. package/build-types/dataviews-picker/stories/fixtures.d.ts.map +1 -1
  125. package/build-types/dataviews-picker/stories/index.story.d.ts.map +1 -1
  126. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  127. package/build-types/hooks/index.d.ts +3 -0
  128. package/build-types/hooks/index.d.ts.map +1 -1
  129. package/build-types/hooks/test/use-data.d.ts +2 -0
  130. package/build-types/hooks/test/use-data.d.ts.map +1 -0
  131. package/build-types/hooks/use-data.d.ts +41 -3
  132. package/build-types/hooks/use-data.d.ts.map +1 -1
  133. package/build-types/hooks/use-infinite-scroll.d.ts +21 -0
  134. package/build-types/hooks/use-infinite-scroll.d.ts.map +1 -0
  135. package/build-types/hooks/use-selected-items.d.ts +19 -0
  136. package/build-types/hooks/use-selected-items.d.ts.map +1 -0
  137. package/build-types/types/dataviews.d.ts +7 -1
  138. package/build-types/types/dataviews.d.ts.map +1 -1
  139. package/build-types/types/field-api.d.ts +15 -4
  140. package/build-types/types/field-api.d.ts.map +1 -1
  141. package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -1
  142. package/build-types/utils/get-footer-message.d.ts +3 -2
  143. package/build-types/utils/get-footer-message.d.ts.map +1 -1
  144. package/build-wp/index.js +3013 -2613
  145. package/package.json +19 -19
  146. package/src/components/dataform-controls/datetime.tsx +19 -11
  147. package/src/components/dataform-layouts/card/index.tsx +171 -146
  148. package/src/components/dataform-layouts/card/style.scss +8 -5
  149. package/src/components/dataviews-bulk-actions/index.tsx +28 -1
  150. package/src/components/dataviews-context/index.ts +2 -2
  151. package/src/components/dataviews-footer/index.tsx +1 -6
  152. package/src/components/dataviews-layouts/grid/composite-grid.tsx +433 -284
  153. package/src/components/dataviews-layouts/grid/style.scss +4 -0
  154. package/src/components/dataviews-layouts/picker-grid/index.tsx +53 -15
  155. package/src/components/dataviews-layouts/picker-table/index.tsx +42 -22
  156. package/src/components/dataviews-layouts/utils/use-infinite-scroll.ts +64 -0
  157. package/src/components/dataviews-picker-footer/index.tsx +21 -1
  158. package/src/components/dataviews-search/index.tsx +2 -1
  159. package/src/components/dataviews-selection-checkbox/index.tsx +4 -2
  160. package/src/components/dataviews-view-config/index.tsx +0 -2
  161. package/src/components/dataviews-view-config/infinite-scroll-toggle.tsx +0 -5
  162. package/src/dataviews/index.tsx +57 -52
  163. package/src/dataviews/stories/fixtures.tsx +288 -0
  164. package/src/dataviews/stories/free-composition.tsx +12 -11
  165. package/src/dataviews/stories/index.story.tsx +19 -2
  166. package/src/dataviews/stories/infinite-scroll.tsx +12 -92
  167. package/src/dataviews/stories/with-card.tsx +30 -23
  168. package/src/dataviews/style.scss +5 -7
  169. package/src/dataviews/test/dataviews.tsx +21 -9
  170. package/src/dataviews-picker/index.tsx +40 -34
  171. package/src/dataviews-picker/stories/fixtures.tsx +270 -0
  172. package/src/dataviews-picker/stories/index.story.tsx +62 -129
  173. package/src/field-types/stories/index.story.tsx +12 -0
  174. package/src/hooks/index.ts +3 -0
  175. package/src/hooks/test/use-data.ts +791 -0
  176. package/src/hooks/use-data.ts +288 -21
  177. package/src/hooks/use-infinite-scroll.ts +304 -0
  178. package/src/hooks/use-selected-items.ts +72 -0
  179. package/src/types/dataviews.ts +8 -1
  180. package/src/types/field-api.ts +16 -3
  181. package/src/utils/filter-sort-and-paginate.ts +13 -1
  182. package/src/utils/get-footer-message.ts +12 -9
  183. package/src/utils/test/filter-sort-and-paginate.js +78 -54
@@ -26,8 +26,10 @@ function CalendarDateTimeControl({
26
26
  onChange,
27
27
  hideLabelFromVision,
28
28
  markWhenOptional,
29
- validity
29
+ validity,
30
+ config
30
31
  }) {
32
+ const { compact } = config || {};
31
33
  const { id, label, description, setValue, getValue, isValid } = field;
32
34
  const fieldValue = getValue({ item: data });
33
35
  const value = typeof fieldValue === "string" ? fieldValue : void 0;
@@ -131,7 +133,7 @@ function CalendarDateTimeControl({
131
133
  onChange: handleManualDateTimeChange
132
134
  }
133
135
  ),
134
- /* @__PURE__ */ jsx(
136
+ !compact && /* @__PURE__ */ jsx(
135
137
  DateCalendar,
136
138
  {
137
139
  style: { width: "100%" },
@@ -154,7 +156,8 @@ function DateTime({
154
156
  hideLabelFromVision,
155
157
  markWhenOptional,
156
158
  operator,
157
- validity
159
+ validity,
160
+ config
158
161
  }) {
159
162
  if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) {
160
163
  return /* @__PURE__ */ jsx(
@@ -177,7 +180,8 @@ function DateTime({
177
180
  onChange,
178
181
  hideLabelFromVision,
179
182
  markWhenOptional,
180
- validity
183
+ validity,
184
+ config
181
185
  }
182
186
  );
183
187
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/dataform-controls/datetime.tsx"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tBaseControl,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useCallback, useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { dateI18n, getDate, getSettings } from '@wordpress/date';\nimport { Stack } from '@wordpress/ui';\n\n/**\n * Internal dependencies\n */\nimport type { DataFormControlProps, FormatDatetime } from '../../types';\nimport { OPERATOR_IN_THE_PAST, OPERATOR_OVER } from '../../constants';\nimport RelativeDateControl from './utils/relative-date-control';\nimport getCustomValidity from './utils/get-custom-validity';\nimport parseDateTime from '../../field-types/utils/parse-date-time';\nimport { unlock } from '../../lock-unlock';\n\nconst { DateCalendar, ValidatedInputControl } = unlock( componentsPrivateApis );\n\nconst formatDateTime = ( value?: string ): string => {\n\tif ( ! value ) {\n\t\treturn '';\n\t}\n\t// Format in WordPress timezone for datetime-local input: YYYY-MM-DDTHH:mm\n\treturn dateI18n( 'Y-m-d\\\\TH:i', getDate( value ) );\n};\n\nfunction CalendarDateTimeControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: DataFormControlProps< Item > ) {\n\tconst { id, label, description, setValue, getValue, isValid } = field;\n\tconst fieldValue = getValue( { item: data } );\n\tconst value = typeof fieldValue === 'string' ? fieldValue : undefined;\n\n\tconst [ calendarMonth, setCalendarMonth ] = useState< Date >( () => {\n\t\tconst parsedDate = parseDateTime( value );\n\t\treturn parsedDate || new Date(); // Default to current month\n\t} );\n\n\tconst inputControlRef = useRef< HTMLInputElement >( null );\n\tconst validationTimeoutRef =\n\t\tuseRef< ReturnType< typeof setTimeout > >( undefined );\n\tconst previousFocusRef = useRef< Element | null >( 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\t// Cleanup timeout on unmount\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tif ( validationTimeoutRef.current ) {\n\t\t\t\tclearTimeout( validationTimeoutRef.current );\n\t\t\t}\n\t\t};\n\t}, [] );\n\n\tconst onSelectDate = useCallback(\n\t\t( newDate: Date | undefined | null ) => {\n\t\t\tlet dateTimeValue: string | undefined;\n\t\t\tif ( newDate ) {\n\t\t\t\t// Extract the date part in WP timezone from the calendar selection\n\t\t\t\tconst wpDate = dateI18n( 'Y-m-d', newDate );\n\n\t\t\t\t// Preserve time if it exists in current value, otherwise use current time\n\t\t\t\tlet wpTime: string;\n\t\t\t\tif ( value ) {\n\t\t\t\t\twpTime = dateI18n( 'H:i', getDate( value ) );\n\t\t\t\t} else {\n\t\t\t\t\twpTime = dateI18n( 'H:i', newDate );\n\t\t\t\t}\n\n\t\t\t\t// Combine date and time in WP timezone and convert to ISO\n\t\t\t\tconst finalDateTime = getDate( `${ wpDate }T${ wpTime }` );\n\t\t\t\tdateTimeValue = finalDateTime.toISOString();\n\t\t\t\tonChangeCallback( dateTimeValue );\n\n\t\t\t\t// Clear any existing timeout\n\t\t\t\tif ( validationTimeoutRef.current ) {\n\t\t\t\t\tclearTimeout( validationTimeoutRef.current );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tonChangeCallback( undefined );\n\t\t\t}\n\t\t\t// Save the currently focused element\n\t\t\tpreviousFocusRef.current =\n\t\t\t\tinputControlRef.current &&\n\t\t\t\tinputControlRef.current.ownerDocument.activeElement;\n\n\t\t\t// Trigger validation display by simulating focus, blur, and changes.\n\t\t\t// Use a timeout to ensure it runs after the value update.\n\t\t\tvalidationTimeoutRef.current = setTimeout( () => {\n\t\t\t\tif ( inputControlRef.current ) {\n\t\t\t\t\tinputControlRef.current.focus();\n\t\t\t\t\tinputControlRef.current.blur();\n\t\t\t\t\tonChangeCallback( dateTimeValue );\n\n\t\t\t\t\t// Restore focus to the previously focused element\n\t\t\t\t\tif (\n\t\t\t\t\t\tpreviousFocusRef.current &&\n\t\t\t\t\t\tpreviousFocusRef.current instanceof HTMLElement\n\t\t\t\t\t) {\n\t\t\t\t\t\tpreviousFocusRef.current.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t},\n\t\t[ onChangeCallback, value ]\n\t);\n\n\tconst handleManualDateTimeChange = useCallback(\n\t\t( newValue?: string ) => {\n\t\t\tif ( newValue ) {\n\t\t\t\t// Interpret the datetime-local value in WordPress timezone\n\t\t\t\tconst dateTime = getDate( newValue );\n\t\t\t\tonChangeCallback( dateTime.toISOString() );\n\n\t\t\t\t// Update calendar month to match\n\t\t\t\tconst parsedDate = parseDateTime( dateTime.toISOString() );\n\t\t\t\tif ( parsedDate ) {\n\t\t\t\t\tsetCalendarMonth( parsedDate );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tonChangeCallback( undefined );\n\t\t\t}\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst { format: fieldFormat } = field;\n\tconst weekStartsOn =\n\t\t( fieldFormat as FormatDatetime ).weekStartsOn ??\n\t\tgetSettings().l10n.startOfWeek;\n\tconst {\n\t\ttimezone: { string: timezoneString },\n\t} = getSettings();\n\n\tlet displayLabel = label;\n\tif ( isValid?.required && ! markWhenOptional && ! hideLabelFromVision ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Required' ) })`;\n\t} else if (\n\t\t! isValid?.required &&\n\t\tmarkWhenOptional &&\n\t\t! hideLabelFromVision\n\t) {\n\t\tdisplayLabel = `${ label } (${ __( 'Optional' ) })`;\n\t}\n\n\treturn (\n\t\t<BaseControl\n\t\t\tid={ id }\n\t\t\tlabel={ displayLabel }\n\t\t\thelp={ description }\n\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t>\n\t\t\t<Stack direction=\"column\" gap=\"lg\">\n\t\t\t\t{ /* Manual datetime input */ }\n\t\t\t\t<ValidatedInputControl\n\t\t\t\t\tref={ inputControlRef }\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\trequired={ !! isValid?.required }\n\t\t\t\t\tcustomValidity={ getCustomValidity( isValid, validity ) }\n\t\t\t\t\ttype=\"datetime-local\"\n\t\t\t\t\tlabel={ __( 'Date time' ) }\n\t\t\t\t\thideLabelFromVision\n\t\t\t\t\tvalue={ formatDateTime( value ) }\n\t\t\t\t\tonChange={ handleManualDateTimeChange }\n\t\t\t\t/>\n\t\t\t\t{ /* Calendar widget */ }\n\t\t\t\t<DateCalendar\n\t\t\t\t\tstyle={ { width: '100%' } }\n\t\t\t\t\tselected={\n\t\t\t\t\t\tvalue ? parseDateTime( value ) || undefined : undefined\n\t\t\t\t\t}\n\t\t\t\t\tonSelect={ onSelectDate }\n\t\t\t\t\tmonth={ calendarMonth }\n\t\t\t\t\tonMonthChange={ setCalendarMonth }\n\t\t\t\t\ttimeZone={ timezoneString || undefined }\n\t\t\t\t\tweekStartsOn={ weekStartsOn }\n\t\t\t\t/>\n\t\t\t</Stack>\n\t\t</BaseControl>\n\t);\n}\n\nexport default function DateTime< 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__datetime\"\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\treturn (\n\t\t<CalendarDateTimeControl\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;AAAA,EACC;AAAA,EACA,eAAe;AAAA,OACT;AACP,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AACzD,SAAS,UAAU;AACnB,SAAS,UAAU,SAAS,mBAAmB;AAC/C,SAAS,aAAa;AAMtB,SAAS,sBAAsB,qBAAqB;AACpD,OAAO,yBAAyB;AAChC,OAAO,uBAAuB;AAC9B,OAAO,mBAAmB;AAC1B,SAAS,cAAc;AAmJpB,SAEC,KAFD;AAjJH,IAAM,EAAE,cAAc,sBAAsB,IAAI,OAAQ,qBAAsB;AAE9E,IAAM,iBAAiB,CAAE,UAA4B;AACpD,MAAK,CAAE,OAAQ;AACd,WAAO;AAAA,EACR;AAEA,SAAO,SAAU,eAAe,QAAS,KAAM,CAAE;AAClD;AAEA,SAAS,wBAAiC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AACjC,QAAM,EAAE,IAAI,OAAO,aAAa,UAAU,UAAU,QAAQ,IAAI;AAChE,QAAM,aAAa,SAAU,EAAE,MAAM,KAAK,CAAE;AAC5C,QAAM,QAAQ,OAAO,eAAe,WAAW,aAAa;AAE5D,QAAM,CAAE,eAAe,gBAAiB,IAAI,SAAkB,MAAM;AACnE,UAAM,aAAa,cAAe,KAAM;AACxC,WAAO,cAAc,oBAAI,KAAK;AAAA,EAC/B,CAAE;AAEF,QAAM,kBAAkB,OAA4B,IAAK;AACzD,QAAM,uBACL,OAA2C,MAAU;AACtD,QAAM,mBAAmB,OAA0B,IAAK;AAExD,QAAM,mBAAmB;AAAA,IACxB,CAAE,aACD,SAAU,SAAU,EAAE,MAAM,MAAM,OAAO,SAAS,CAAE,CAAE;AAAA,IACvD,CAAE,MAAM,UAAU,QAAS;AAAA,EAC5B;AAGA,YAAW,MAAM;AAChB,WAAO,MAAM;AACZ,UAAK,qBAAqB,SAAU;AACnC,qBAAc,qBAAqB,OAAQ;AAAA,MAC5C;AAAA,IACD;AAAA,EACD,GAAG,CAAC,CAAE;AAEN,QAAM,eAAe;AAAA,IACpB,CAAE,YAAsC;AACvC,UAAI;AACJ,UAAK,SAAU;AAEd,cAAM,SAAS,SAAU,SAAS,OAAQ;AAG1C,YAAI;AACJ,YAAK,OAAQ;AACZ,mBAAS,SAAU,OAAO,QAAS,KAAM,CAAE;AAAA,QAC5C,OAAO;AACN,mBAAS,SAAU,OAAO,OAAQ;AAAA,QACnC;AAGA,cAAM,gBAAgB,QAAS,GAAI,MAAO,IAAK,MAAO,EAAG;AACzD,wBAAgB,cAAc,YAAY;AAC1C,yBAAkB,aAAc;AAGhC,YAAK,qBAAqB,SAAU;AACnC,uBAAc,qBAAqB,OAAQ;AAAA,QAC5C;AAAA,MACD,OAAO;AACN,yBAAkB,MAAU;AAAA,MAC7B;AAEA,uBAAiB,UAChB,gBAAgB,WAChB,gBAAgB,QAAQ,cAAc;AAIvC,2BAAqB,UAAU,WAAY,MAAM;AAChD,YAAK,gBAAgB,SAAU;AAC9B,0BAAgB,QAAQ,MAAM;AAC9B,0BAAgB,QAAQ,KAAK;AAC7B,2BAAkB,aAAc;AAGhC,cACC,iBAAiB,WACjB,iBAAiB,mBAAmB,aACnC;AACD,6BAAiB,QAAQ,MAAM;AAAA,UAChC;AAAA,QACD;AAAA,MACD,GAAG,CAAE;AAAA,IACN;AAAA,IACA,CAAE,kBAAkB,KAAM;AAAA,EAC3B;AAEA,QAAM,6BAA6B;AAAA,IAClC,CAAE,aAAuB;AACxB,UAAK,UAAW;AAEf,cAAM,WAAW,QAAS,QAAS;AACnC,yBAAkB,SAAS,YAAY,CAAE;AAGzC,cAAM,aAAa,cAAe,SAAS,YAAY,CAAE;AACzD,YAAK,YAAa;AACjB,2BAAkB,UAAW;AAAA,QAC9B;AAAA,MACD,OAAO;AACN,yBAAkB,MAAU;AAAA,MAC7B;AAAA,IACD;AAAA,IACA,CAAE,gBAAiB;AAAA,EACpB;AAEA,QAAM,EAAE,QAAQ,YAAY,IAAI;AAChC,QAAM,eACH,YAAgC,gBAClC,YAAY,EAAE,KAAK;AACpB,QAAM;AAAA,IACL,UAAU,EAAE,QAAQ,eAAe;AAAA,EACpC,IAAI,YAAY;AAEhB,MAAI,eAAe;AACnB,MAAK,SAAS,YAAY,CAAE,oBAAoB,CAAE,qBAAsB;AACvE,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD,WACC,CAAE,SAAS,YACX,oBACA,CAAE,qBACD;AACD,mBAAe,GAAI,KAAM,KAAM,GAAI,UAAW,CAAE;AAAA,EACjD;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA,OAAQ;AAAA,MACR,MAAO;AAAA,MACP;AAAA,MAEA,+BAAC,SAAM,WAAU,UAAS,KAAI,MAE7B;AAAA;AAAA,UAAC;AAAA;AAAA,YACA,KAAM;AAAA,YACN,uBAAqB;AAAA,YACrB,UAAW,CAAC,CAAE,SAAS;AAAA,YACvB,gBAAiB,kBAAmB,SAAS,QAAS;AAAA,YACtD,MAAK;AAAA,YACL,OAAQ,GAAI,WAAY;AAAA,YACxB,qBAAmB;AAAA,YACnB,OAAQ,eAAgB,KAAM;AAAA,YAC9B,UAAW;AAAA;AAAA,QACZ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACA,OAAQ,EAAE,OAAO,OAAO;AAAA,YACxB,UACC,QAAQ,cAAe,KAAM,KAAK,SAAY;AAAA,YAE/C,UAAW;AAAA,YACX,OAAQ;AAAA,YACR,eAAgB;AAAA,YAChB,UAAW,kBAAkB;AAAA,YAC7B;AAAA;AAAA,QACD;AAAA,SACD;AAAA;AAAA,EACD;AAEF;AAEe,SAAR,SAAmC;AAAA,EACzC;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,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACD;AAEF;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tBaseControl,\n\tprivateApis as componentsPrivateApis,\n} from '@wordpress/components';\nimport { useCallback, useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { dateI18n, getDate, getSettings } from '@wordpress/date';\nimport { Stack } from '@wordpress/ui';\n\n/**\n * Internal dependencies\n */\nimport type { DataFormControlProps, FormatDatetime } from '../../types';\nimport { OPERATOR_IN_THE_PAST, OPERATOR_OVER } from '../../constants';\nimport RelativeDateControl from './utils/relative-date-control';\nimport getCustomValidity from './utils/get-custom-validity';\nimport parseDateTime from '../../field-types/utils/parse-date-time';\nimport { unlock } from '../../lock-unlock';\n\nconst { DateCalendar, ValidatedInputControl } = unlock( componentsPrivateApis );\n\nconst formatDateTime = ( value?: string ): string => {\n\tif ( ! value ) {\n\t\treturn '';\n\t}\n\t// Format in WordPress timezone for datetime-local input: YYYY-MM-DDTHH:mm\n\treturn dateI18n( 'Y-m-d\\\\TH:i', getDate( value ) );\n};\n\nfunction CalendarDateTimeControl< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n\tconfig,\n}: DataFormControlProps< Item > ) {\n\tconst { compact } = config || {};\n\tconst { id, label, description, setValue, getValue, isValid } = field;\n\tconst fieldValue = getValue( { item: data } );\n\tconst value = typeof fieldValue === 'string' ? fieldValue : undefined;\n\n\tconst [ calendarMonth, setCalendarMonth ] = useState< Date >( () => {\n\t\tconst parsedDate = parseDateTime( value );\n\t\treturn parsedDate || new Date(); // Default to current month\n\t} );\n\n\tconst inputControlRef = useRef< HTMLInputElement >( null );\n\tconst validationTimeoutRef =\n\t\tuseRef< ReturnType< typeof setTimeout > >( undefined );\n\tconst previousFocusRef = useRef< Element | null >( 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\t// Cleanup timeout on unmount\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tif ( validationTimeoutRef.current ) {\n\t\t\t\tclearTimeout( validationTimeoutRef.current );\n\t\t\t}\n\t\t};\n\t}, [] );\n\n\tconst onSelectDate = useCallback(\n\t\t( newDate: Date | undefined | null ) => {\n\t\t\tlet dateTimeValue: string | undefined;\n\t\t\tif ( newDate ) {\n\t\t\t\t// Extract the date part in WP timezone from the calendar selection\n\t\t\t\tconst wpDate = dateI18n( 'Y-m-d', newDate );\n\n\t\t\t\t// Preserve time if it exists in current value, otherwise use current time\n\t\t\t\tlet wpTime: string;\n\t\t\t\tif ( value ) {\n\t\t\t\t\twpTime = dateI18n( 'H:i', getDate( value ) );\n\t\t\t\t} else {\n\t\t\t\t\twpTime = dateI18n( 'H:i', newDate );\n\t\t\t\t}\n\n\t\t\t\t// Combine date and time in WP timezone and convert to ISO\n\t\t\t\tconst finalDateTime = getDate( `${ wpDate }T${ wpTime }` );\n\t\t\t\tdateTimeValue = finalDateTime.toISOString();\n\t\t\t\tonChangeCallback( dateTimeValue );\n\n\t\t\t\t// Clear any existing timeout\n\t\t\t\tif ( validationTimeoutRef.current ) {\n\t\t\t\t\tclearTimeout( validationTimeoutRef.current );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tonChangeCallback( undefined );\n\t\t\t}\n\t\t\t// Save the currently focused element\n\t\t\tpreviousFocusRef.current =\n\t\t\t\tinputControlRef.current &&\n\t\t\t\tinputControlRef.current.ownerDocument.activeElement;\n\n\t\t\t// Trigger validation display by simulating focus, blur, and changes.\n\t\t\t// Use a timeout to ensure it runs after the value update.\n\t\t\tvalidationTimeoutRef.current = setTimeout( () => {\n\t\t\t\tif ( inputControlRef.current ) {\n\t\t\t\t\tinputControlRef.current.focus();\n\t\t\t\t\tinputControlRef.current.blur();\n\t\t\t\t\tonChangeCallback( dateTimeValue );\n\n\t\t\t\t\t// Restore focus to the previously focused element\n\t\t\t\t\tif (\n\t\t\t\t\t\tpreviousFocusRef.current &&\n\t\t\t\t\t\tpreviousFocusRef.current instanceof HTMLElement\n\t\t\t\t\t) {\n\t\t\t\t\t\tpreviousFocusRef.current.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t},\n\t\t[ onChangeCallback, value ]\n\t);\n\n\tconst handleManualDateTimeChange = useCallback(\n\t\t( newValue?: string ) => {\n\t\t\tif ( newValue ) {\n\t\t\t\t// Interpret the datetime-local value in WordPress timezone\n\t\t\t\tconst dateTime = getDate( newValue );\n\t\t\t\tonChangeCallback( dateTime.toISOString() );\n\n\t\t\t\t// Update calendar month to match\n\t\t\t\tconst parsedDate = parseDateTime( dateTime.toISOString() );\n\t\t\t\tif ( parsedDate ) {\n\t\t\t\t\tsetCalendarMonth( parsedDate );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tonChangeCallback( undefined );\n\t\t\t}\n\t\t},\n\t\t[ onChangeCallback ]\n\t);\n\n\tconst { format: fieldFormat } = field;\n\tconst weekStartsOn =\n\t\t( fieldFormat as FormatDatetime ).weekStartsOn ??\n\t\tgetSettings().l10n.startOfWeek;\n\tconst {\n\t\ttimezone: { string: timezoneString },\n\t} = getSettings();\n\n\tlet displayLabel = label;\n\tif ( isValid?.required && ! markWhenOptional && ! hideLabelFromVision ) {\n\t\tdisplayLabel = `${ label } (${ __( 'Required' ) })`;\n\t} else if (\n\t\t! isValid?.required &&\n\t\tmarkWhenOptional &&\n\t\t! hideLabelFromVision\n\t) {\n\t\tdisplayLabel = `${ label } (${ __( 'Optional' ) })`;\n\t}\n\n\treturn (\n\t\t<BaseControl\n\t\t\tid={ id }\n\t\t\tlabel={ displayLabel }\n\t\t\thelp={ description }\n\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t>\n\t\t\t<Stack direction=\"column\" gap=\"lg\">\n\t\t\t\t{ /* Manual datetime input */ }\n\t\t\t\t<ValidatedInputControl\n\t\t\t\t\tref={ inputControlRef }\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\trequired={ !! isValid?.required }\n\t\t\t\t\tcustomValidity={ getCustomValidity( isValid, validity ) }\n\t\t\t\t\ttype=\"datetime-local\"\n\t\t\t\t\tlabel={ __( 'Date time' ) }\n\t\t\t\t\thideLabelFromVision\n\t\t\t\t\tvalue={ formatDateTime( value ) }\n\t\t\t\t\tonChange={ handleManualDateTimeChange }\n\t\t\t\t/>\n\t\t\t\t{ /* Calendar widget */ }\n\t\t\t\t{ ! compact && (\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\n\t\t\t\t\t\t\t\t? parseDateTime( value ) || undefined\n\t\t\t\t\t\t\t\t: 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/>\n\t\t\t\t) }\n\t\t\t</Stack>\n\t\t</BaseControl>\n\t);\n}\n\nexport default function DateTime< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\toperator,\n\tvalidity,\n\tconfig,\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__datetime\"\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\treturn (\n\t\t<CalendarDateTimeControl\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\tconfig={ config }\n\t\t/>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,11 +1,4 @@
1
1
  // packages/dataviews/src/components/dataform-layouts/card/index.tsx
2
- import {
3
- Button,
4
- Card,
5
- CardBody,
6
- CardHeader as OriginalCardHeader
7
- } from "@wordpress/components";
8
- import { useInstanceId } from "@wordpress/compose";
9
2
  import {
10
3
  useCallback,
11
4
  useContext,
@@ -14,7 +7,7 @@ import {
14
7
  useRef,
15
8
  useState
16
9
  } from "@wordpress/element";
17
- import { chevronDown, chevronUp } from "@wordpress/icons";
10
+ import { Card, CollapsibleCard, Stack } from "@wordpress/ui";
18
11
  import { getFormFieldLayout } from "../index.mjs";
19
12
  import DataFormContext from "../../dataform-context/index.mjs";
20
13
  import { DataFormLayout } from "../data-form-layout.mjs";
@@ -48,6 +41,84 @@ function isSummaryFieldVisible(summaryField, summaryConfig, isOpen) {
48
41
  }
49
42
  return true;
50
43
  }
44
+ function HeaderContent({
45
+ data,
46
+ fields,
47
+ label,
48
+ layout,
49
+ isOpen,
50
+ touched,
51
+ validity
52
+ }) {
53
+ const summaryFields = getSummaryFields(layout.summary, fields);
54
+ const visibleSummaryFields = summaryFields.filter(
55
+ (summaryField) => isSummaryFieldVisible(summaryField, layout.summary, isOpen)
56
+ );
57
+ const hasBadge = touched && layout.isCollapsible;
58
+ const hasSummary = visibleSummaryFields.length > 0 && layout.withHeader;
59
+ return /* @__PURE__ */ jsxs(
60
+ Stack,
61
+ {
62
+ align: "center",
63
+ justify: "space-between",
64
+ className: "dataforms-layouts-card__field-header-content",
65
+ children: [
66
+ /* @__PURE__ */ jsx(Card.Title, { children: label }),
67
+ (hasBadge || hasSummary) && /* @__PURE__ */ jsxs(CollapsibleCard.HeaderDescription, { className: "dataforms-layouts-card__field-header-content-description", children: [
68
+ hasBadge && /* @__PURE__ */ jsx(ValidationBadge, { validity }),
69
+ hasSummary && /* @__PURE__ */ jsx("div", { className: "dataforms-layouts-card__field-summary", children: visibleSummaryFields.map((summaryField) => /* @__PURE__ */ jsx(
70
+ summaryField.render,
71
+ {
72
+ item: data,
73
+ field: summaryField
74
+ },
75
+ summaryField.id
76
+ )) })
77
+ ] })
78
+ ]
79
+ }
80
+ );
81
+ }
82
+ function BodyContent({
83
+ data,
84
+ field,
85
+ form,
86
+ onChange,
87
+ hideLabelFromVision,
88
+ markWhenOptional,
89
+ validity,
90
+ withHeader
91
+ }) {
92
+ if (field.children) {
93
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
94
+ field.description && /* @__PURE__ */ jsx("div", { className: "dataforms-layouts-card__field-description", children: field.description }),
95
+ /* @__PURE__ */ jsx(
96
+ DataFormLayout,
97
+ {
98
+ data,
99
+ form,
100
+ onChange,
101
+ validity: validity?.children
102
+ }
103
+ )
104
+ ] });
105
+ }
106
+ const SingleFieldLayout = getFormFieldLayout("regular")?.component;
107
+ if (!SingleFieldLayout) {
108
+ return null;
109
+ }
110
+ return /* @__PURE__ */ jsx(
111
+ SingleFieldLayout,
112
+ {
113
+ data,
114
+ field,
115
+ onChange,
116
+ hideLabelFromVision: hideLabelFromVision || withHeader,
117
+ markWhenOptional,
118
+ validity
119
+ }
120
+ );
121
+ }
51
122
  function FormCardField({
52
123
  data,
53
124
  field,
@@ -58,10 +129,7 @@ function FormCardField({
58
129
  }) {
59
130
  const { fields } = useContext(DataFormContext);
60
131
  const layout = field.layout;
61
- const cardBodyRef = useRef(null);
62
- const instanceId = useInstanceId(FormCardField);
63
- const bodyId = `dataforms-layouts-card-card-body-${instanceId}`;
64
- const titleId = `dataforms-layouts-card-card-title-${instanceId}`;
132
+ const contentRef = useRef(null);
65
133
  const form = useMemo(
66
134
  () => ({
67
135
  layout: DEFAULT_LAYOUT,
@@ -70,52 +138,28 @@ function FormCardField({
70
138
  [field]
71
139
  );
72
140
  const { isOpened, isCollapsible } = layout;
73
- const [internalIsOpen, setIsOpen] = useState(isOpened);
141
+ const [isOpen, setIsOpen] = useState(isOpened);
74
142
  const [touched, setTouched] = useState(false);
75
143
  useEffect(() => {
76
144
  setIsOpen(isOpened);
77
145
  }, [isOpened]);
78
- const toggle = useCallback(() => {
79
- setIsOpen((prev) => {
80
- if (prev) {
81
- setTouched(true);
82
- }
83
- return !prev;
84
- });
146
+ const handleOpenChange = useCallback((open) => {
147
+ if (!open) {
148
+ setTouched(true);
149
+ }
150
+ setIsOpen(open);
85
151
  }, []);
86
- const isOpen = isCollapsible ? internalIsOpen : true;
87
152
  const handleBlur = useCallback(() => {
88
153
  setTouched(true);
89
- }, [setTouched]);
90
- useReportValidity(cardBodyRef, isOpen && touched);
91
- const summaryFields = getSummaryFields(layout.summary, fields);
92
- const visibleSummaryFields = summaryFields.filter(
93
- (summaryField) => isSummaryFieldVisible(summaryField, layout.summary, isOpen)
154
+ }, []);
155
+ useReportValidity(
156
+ contentRef,
157
+ (isCollapsible ? isOpen : true) && touched
94
158
  );
95
- const validationBadge = touched && layout.isCollapsible ? /* @__PURE__ */ jsx(ValidationBadge, { validity }) : null;
96
- const sizeCard = {
97
- blockStart: "medium",
98
- blockEnd: "medium",
99
- inlineStart: "medium",
100
- inlineEnd: "medium"
101
- };
102
159
  let label = field.label;
103
160
  let withHeader;
104
- let bodyContent;
105
161
  if (field.children) {
106
162
  withHeader = !!label && layout.withHeader;
107
- bodyContent = /* @__PURE__ */ jsxs(Fragment, { children: [
108
- field.description && /* @__PURE__ */ jsx("div", { className: "dataforms-layouts-card__field-description", children: field.description }),
109
- /* @__PURE__ */ jsx(
110
- DataFormLayout,
111
- {
112
- data,
113
- form,
114
- onChange,
115
- validity: validity?.children
116
- }
117
- )
118
- ] });
119
163
  } else {
120
164
  const fieldDefinition = fields.find(
121
165
  (fieldDef) => fieldDef.id === field.id
@@ -123,103 +167,58 @@ function FormCardField({
123
167
  if (!fieldDefinition || !fieldDefinition.Edit) {
124
168
  return null;
125
169
  }
126
- const SingleFieldLayout = getFormFieldLayout("regular")?.component;
127
- if (!SingleFieldLayout) {
128
- return null;
129
- }
130
170
  label = fieldDefinition.label;
131
171
  withHeader = !!label && layout.withHeader;
132
- bodyContent = /* @__PURE__ */ jsx(
133
- SingleFieldLayout,
134
- {
135
- data,
136
- field,
137
- onChange,
138
- hideLabelFromVision: hideLabelFromVision || withHeader,
139
- markWhenOptional,
140
- validity
141
- }
142
- );
143
172
  }
144
- const sizeCardBody = {
145
- blockStart: withHeader ? "none" : "medium",
146
- blockEnd: "medium",
147
- inlineStart: "medium",
148
- inlineEnd: "medium"
149
- };
150
- return /* @__PURE__ */ jsxs(Card, { className: "dataforms-layouts-card__field", size: sizeCard, children: [
151
- withHeader && /* @__PURE__ */ jsxs(
152
- OriginalCardHeader,
173
+ const bodyContent = /* @__PURE__ */ jsx(
174
+ BodyContent,
175
+ {
176
+ data,
177
+ field,
178
+ form,
179
+ onChange,
180
+ hideLabelFromVision,
181
+ markWhenOptional,
182
+ validity,
183
+ withHeader
184
+ }
185
+ );
186
+ const headerContent = /* @__PURE__ */ jsx(
187
+ HeaderContent,
188
+ {
189
+ data,
190
+ fields,
191
+ label,
192
+ layout,
193
+ isOpen: isCollapsible ? !!isOpen : true,
194
+ touched,
195
+ validity
196
+ }
197
+ );
198
+ if (withHeader && isCollapsible) {
199
+ return /* @__PURE__ */ jsxs(
200
+ CollapsibleCard.Root,
153
201
  {
154
- className: "dataforms-layouts-card__field-header",
155
- onClick: isCollapsible ? toggle : void 0,
156
- style: {
157
- cursor: isCollapsible ? "pointer" : void 0
158
- },
159
- isBorderless: true,
202
+ className: "dataforms-layouts-card__field",
203
+ open: isOpen,
204
+ onOpenChange: handleOpenChange,
160
205
  children: [
161
- /* @__PURE__ */ jsxs(
162
- "div",
163
- {
164
- style: {
165
- // Match the expand/collapse button's height to avoid layout
166
- // differences when that button is not displayed.
167
- height: isCollapsible ? void 0 : "40px",
168
- width: "100%",
169
- display: "flex",
170
- justifyContent: "space-between",
171
- alignItems: "center"
172
- },
173
- children: [
174
- /* @__PURE__ */ jsx(
175
- "span",
176
- {
177
- id: titleId,
178
- className: "dataforms-layouts-card__field-header-label",
179
- children: label
180
- }
181
- ),
182
- validationBadge,
183
- visibleSummaryFields.length > 0 && layout.withHeader && /* @__PURE__ */ jsx("div", { className: "dataforms-layouts-card__field-summary", children: visibleSummaryFields.map(
184
- (summaryField) => /* @__PURE__ */ jsx(
185
- summaryField.render,
186
- {
187
- item: data,
188
- field: summaryField
189
- },
190
- summaryField.id
191
- )
192
- ) })
193
- ]
194
- }
195
- ),
196
- isCollapsible && /* @__PURE__ */ jsx(
197
- Button,
206
+ /* @__PURE__ */ jsx(CollapsibleCard.Header, { children: headerContent }),
207
+ /* @__PURE__ */ jsx(
208
+ CollapsibleCard.Content,
198
209
  {
199
- __next40pxDefaultSize: true,
200
- variant: "tertiary",
201
- icon: isOpen ? chevronUp : chevronDown,
202
- "aria-expanded": isOpen,
203
- "aria-controls": bodyId,
204
- "aria-labelledby": titleId
210
+ ref: contentRef,
211
+ onBlur: handleBlur,
212
+ children: bodyContent
205
213
  }
206
214
  )
207
215
  ]
208
216
  }
209
- ),
210
- (isOpen || !withHeader) && // If it doesn't have a header, keep it open.
211
- // Otherwise, the card will not be visible.
212
- /* @__PURE__ */ jsx(
213
- CardBody,
214
- {
215
- id: bodyId,
216
- size: sizeCardBody,
217
- className: "dataforms-layouts-card__field-control",
218
- ref: cardBodyRef,
219
- onBlur: handleBlur,
220
- children: bodyContent
221
- }
222
- )
217
+ );
218
+ }
219
+ return /* @__PURE__ */ jsxs(Card.Root, { className: "dataforms-layouts-card__field", children: [
220
+ withHeader && /* @__PURE__ */ jsx(Card.Header, { children: headerContent }),
221
+ /* @__PURE__ */ jsx(Card.Content, { ref: contentRef, onBlur: handleBlur, children: bodyContent })
223
222
  ] });
224
223
  }
225
224
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/dataform-layouts/card/index.tsx"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tButton,\n\tCard,\n\tCardBody,\n\tCardHeader as OriginalCardHeader,\n} from '@wordpress/components';\nimport { useInstanceId } from '@wordpress/compose';\nimport {\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\nimport { chevronDown, chevronUp } from '@wordpress/icons';\n\n/**\n * Internal dependencies\n */\nimport { getFormFieldLayout } from '..';\nimport DataFormContext from '../../dataform-context';\nimport type {\n\tFieldLayoutProps,\n\tNormalizedCardLayout,\n\tNormalizedField,\n\tNormalizedForm,\n\tNormalizedLayout,\n} from '../../../types';\nimport { DataFormLayout } from '../data-form-layout';\nimport { DEFAULT_LAYOUT } from '../normalize-form';\nimport { getSummaryFields } from '../get-summary-fields';\nimport useReportValidity from '../../../hooks/use-report-validity';\nimport ValidationBadge from '../validation-badge';\n\nfunction isSummaryFieldVisible< Item >(\n\tsummaryField: NormalizedField< Item >,\n\tsummaryConfig: NormalizedCardLayout[ 'summary' ],\n\tisOpen: boolean\n) {\n\t// If no summary config, dont't show any fields\n\tif (\n\t\t! summaryConfig ||\n\t\t( Array.isArray( summaryConfig ) && summaryConfig.length === 0 )\n\t) {\n\t\treturn false;\n\t}\n\n\t// Convert to array for consistent handling\n\tconst summaryConfigArray = Array.isArray( summaryConfig )\n\t\t? summaryConfig\n\t\t: [ summaryConfig ];\n\n\t// Find the config for this specific field\n\tconst fieldConfig = summaryConfigArray.find( ( config ) => {\n\t\tif ( typeof config === 'string' ) {\n\t\t\treturn config === summaryField.id;\n\t\t}\n\t\tif ( typeof config === 'object' && 'id' in config ) {\n\t\t\treturn config.id === summaryField.id;\n\t\t}\n\t\treturn false;\n\t} );\n\n\t// If field is not in summary config, don't show it\n\tif ( ! fieldConfig ) {\n\t\treturn false;\n\t}\n\n\t// If it's a string, always show it\n\tif ( typeof fieldConfig === 'string' ) {\n\t\treturn true;\n\t}\n\n\t// If it has visibility rules, respect them\n\tif ( typeof fieldConfig === 'object' && 'visibility' in fieldConfig ) {\n\t\treturn (\n\t\t\tfieldConfig.visibility === 'always' ||\n\t\t\t( fieldConfig.visibility === 'when-collapsed' && ! isOpen )\n\t\t);\n\t}\n\n\t// Default to always show\n\treturn true;\n}\n\nexport default function FormCardField< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: FieldLayoutProps< Item > ) {\n\tconst { fields } = useContext( DataFormContext );\n\tconst layout = field.layout as NormalizedCardLayout;\n\tconst cardBodyRef = useRef< HTMLDivElement >( null );\n\tconst instanceId = useInstanceId( FormCardField );\n\tconst bodyId = `dataforms-layouts-card-card-body-${ instanceId }`;\n\tconst titleId = `dataforms-layouts-card-card-title-${ instanceId }`;\n\n\tconst form: NormalizedForm = useMemo(\n\t\t() => ( {\n\t\t\tlayout: DEFAULT_LAYOUT as NormalizedLayout,\n\t\t\tfields: field.children ?? [],\n\t\t} ),\n\t\t[ field ]\n\t);\n\n\tconst { isOpened, isCollapsible } = layout;\n\tconst [ internalIsOpen, setIsOpen ] = useState( isOpened );\n\tconst [ touched, setTouched ] = useState( false );\n\n\t// Sync internal state when the isOpened prop changes.\n\t// This is unlikely to happen in production, but it helps with storybook controls.\n\tuseEffect( () => {\n\t\tsetIsOpen( isOpened );\n\t}, [ isOpened ] );\n\n\tconst toggle = useCallback( () => {\n\t\tsetIsOpen( ( prev ) => {\n\t\t\t// Mark as touched when collapsing (going from open to closed)\n\t\t\tif ( prev ) {\n\t\t\t\tsetTouched( true );\n\t\t\t}\n\t\t\treturn ! prev;\n\t\t} );\n\t}, [] );\n\n\tconst isOpen = isCollapsible ? internalIsOpen : true;\n\n\t// Mark the card as touched when any field inside it is blurred.\n\t// This aligns with how validated controls show errors on blur.\n\tconst handleBlur = useCallback( () => {\n\t\tsetTouched( true );\n\t}, [ setTouched ] );\n\n\t// When the card is expanded after being touched (collapsed with errors),\n\t// trigger reportValidity to show field-level errors.\n\tuseReportValidity( cardBodyRef, isOpen && touched );\n\n\tconst summaryFields = getSummaryFields< Item >( layout.summary, fields );\n\n\tconst visibleSummaryFields = summaryFields.filter( ( summaryField ) =>\n\t\tisSummaryFieldVisible( summaryField, layout.summary, isOpen )\n\t);\n\n\tconst validationBadge =\n\t\ttouched && layout.isCollapsible ? (\n\t\t\t<ValidationBadge validity={ validity } />\n\t\t) : null;\n\n\tconst sizeCard = {\n\t\tblockStart: 'medium' as const,\n\t\tblockEnd: 'medium' as const,\n\t\tinlineStart: 'medium' as const,\n\t\tinlineEnd: 'medium' as const,\n\t};\n\n\tlet label = field.label;\n\tlet withHeader: boolean;\n\tlet bodyContent: React.ReactNode;\n\n\tif ( field.children ) {\n\t\twithHeader = !! label && layout.withHeader;\n\t\tbodyContent = (\n\t\t\t<>\n\t\t\t\t{ field.description && (\n\t\t\t\t\t<div className=\"dataforms-layouts-card__field-description\">\n\t\t\t\t\t\t{ field.description }\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\t\t\t\t<DataFormLayout\n\t\t\t\t\tdata={ data }\n\t\t\t\t\tform={ form }\n\t\t\t\t\tonChange={ onChange }\n\t\t\t\t\tvalidity={ validity?.children }\n\t\t\t\t/>\n\t\t\t</>\n\t\t);\n\t} else {\n\t\tconst fieldDefinition = fields.find(\n\t\t\t( fieldDef ) => fieldDef.id === field.id\n\t\t);\n\n\t\tif ( ! fieldDefinition || ! fieldDefinition.Edit ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst SingleFieldLayout = getFormFieldLayout( 'regular' )?.component;\n\t\tif ( ! SingleFieldLayout ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlabel = fieldDefinition.label;\n\t\twithHeader = !! label && layout.withHeader;\n\t\tbodyContent = (\n\t\t\t<SingleFieldLayout\n\t\t\t\tdata={ data }\n\t\t\t\tfield={ field }\n\t\t\t\tonChange={ onChange }\n\t\t\t\thideLabelFromVision={ hideLabelFromVision || withHeader }\n\t\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\t\tvalidity={ validity }\n\t\t\t/>\n\t\t);\n\t}\n\n\tconst sizeCardBody = {\n\t\tblockStart: withHeader ? ( 'none' as const ) : ( 'medium' as const ),\n\t\tblockEnd: 'medium' as const,\n\t\tinlineStart: 'medium' as const,\n\t\tinlineEnd: 'medium' as const,\n\t};\n\n\treturn (\n\t\t<Card className=\"dataforms-layouts-card__field\" size={ sizeCard }>\n\t\t\t{ withHeader && (\n\t\t\t\t<OriginalCardHeader\n\t\t\t\t\tclassName=\"dataforms-layouts-card__field-header\"\n\t\t\t\t\tonClick={ isCollapsible ? toggle : undefined }\n\t\t\t\t\tstyle={ {\n\t\t\t\t\t\tcursor: isCollapsible ? 'pointer' : undefined,\n\t\t\t\t\t} }\n\t\t\t\t\tisBorderless\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t// Match the expand/collapse button's height to avoid layout\n\t\t\t\t\t\t\t// differences when that button is not displayed.\n\t\t\t\t\t\t\theight: isCollapsible ? undefined : '40px',\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tid={ titleId }\n\t\t\t\t\t\t\tclassName=\"dataforms-layouts-card__field-header-label\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ label }\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{ validationBadge }\n\t\t\t\t\t\t{ visibleSummaryFields.length > 0 &&\n\t\t\t\t\t\t\tlayout.withHeader && (\n\t\t\t\t\t\t\t\t<div className=\"dataforms-layouts-card__field-summary\">\n\t\t\t\t\t\t\t\t\t{ visibleSummaryFields.map(\n\t\t\t\t\t\t\t\t\t\t( summaryField ) => (\n\t\t\t\t\t\t\t\t\t\t\t<summaryField.render\n\t\t\t\t\t\t\t\t\t\t\t\tkey={ summaryField.id }\n\t\t\t\t\t\t\t\t\t\t\t\titem={ data }\n\t\t\t\t\t\t\t\t\t\t\t\tfield={ summaryField }\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t</div>\n\t\t\t\t\t{ isCollapsible && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\ticon={ isOpen ? chevronUp : chevronDown }\n\t\t\t\t\t\t\taria-expanded={ isOpen }\n\t\t\t\t\t\t\taria-controls={ bodyId }\n\t\t\t\t\t\t\taria-labelledby={ titleId }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</OriginalCardHeader>\n\t\t\t) }\n\t\t\t{ ( isOpen || ! withHeader ) && (\n\t\t\t\t// If it doesn't have a header, keep it open.\n\t\t\t\t// Otherwise, the card will not be visible.\n\t\t\t\t<CardBody\n\t\t\t\t\tid={ bodyId }\n\t\t\t\t\tsize={ sizeCardBody }\n\t\t\t\t\tclassName=\"dataforms-layouts-card__field-control\"\n\t\t\t\t\tref={ cardBodyRef }\n\t\t\t\t\tonBlur={ handleBlur }\n\t\t\t\t>\n\t\t\t\t\t{ bodyContent }\n\t\t\t\t</CardBody>\n\t\t\t) }\n\t\t</Card>\n\t);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport {\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\n// TODO: enable in the ESlint rule once we complete\n// https://github.com/WordPress/gutenberg/issues/76135.\n// eslint-disable-next-line @wordpress/use-recommended-components\nimport { Card, CollapsibleCard, Stack } from '@wordpress/ui';\n\n/**\n * Internal dependencies\n */\nimport { getFormFieldLayout } from '..';\nimport DataFormContext from '../../dataform-context';\nimport type {\n\tFieldLayoutProps,\n\tNormalizedCardLayout,\n\tNormalizedField,\n\tNormalizedForm,\n\tNormalizedLayout,\n} from '../../../types';\nimport { DataFormLayout } from '../data-form-layout';\nimport { DEFAULT_LAYOUT } from '../normalize-form';\nimport { getSummaryFields } from '../get-summary-fields';\nimport useReportValidity from '../../../hooks/use-report-validity';\nimport ValidationBadge from '../validation-badge';\n\nfunction isSummaryFieldVisible< Item >(\n\tsummaryField: NormalizedField< Item >,\n\tsummaryConfig: NormalizedCardLayout[ 'summary' ],\n\tisOpen: boolean\n) {\n\t// If no summary config, dont't show any fields\n\tif (\n\t\t! summaryConfig ||\n\t\t( Array.isArray( summaryConfig ) && summaryConfig.length === 0 )\n\t) {\n\t\treturn false;\n\t}\n\n\t// Convert to array for consistent handling\n\tconst summaryConfigArray = Array.isArray( summaryConfig )\n\t\t? summaryConfig\n\t\t: [ summaryConfig ];\n\n\t// Find the config for this specific field\n\tconst fieldConfig = summaryConfigArray.find( ( config ) => {\n\t\tif ( typeof config === 'string' ) {\n\t\t\treturn config === summaryField.id;\n\t\t}\n\t\tif ( typeof config === 'object' && 'id' in config ) {\n\t\t\treturn config.id === summaryField.id;\n\t\t}\n\t\treturn false;\n\t} );\n\n\t// If field is not in summary config, don't show it\n\tif ( ! fieldConfig ) {\n\t\treturn false;\n\t}\n\n\t// If it's a string, always show it\n\tif ( typeof fieldConfig === 'string' ) {\n\t\treturn true;\n\t}\n\n\t// If it has visibility rules, respect them\n\tif ( typeof fieldConfig === 'object' && 'visibility' in fieldConfig ) {\n\t\treturn (\n\t\t\tfieldConfig.visibility === 'always' ||\n\t\t\t( fieldConfig.visibility === 'when-collapsed' && ! isOpen )\n\t\t);\n\t}\n\n\t// Default to always show\n\treturn true;\n}\n\nfunction HeaderContent< Item >( {\n\tdata,\n\tfields,\n\tlabel,\n\tlayout,\n\tisOpen,\n\ttouched,\n\tvalidity,\n}: {\n\tdata: Item;\n\tfields: NormalizedField< Item >[];\n\tlabel: string | undefined;\n\tlayout: NormalizedCardLayout;\n\tisOpen: boolean;\n\ttouched: boolean;\n\tvalidity: FieldLayoutProps< Item >[ 'validity' ];\n} ) {\n\tconst summaryFields = getSummaryFields< Item >( layout.summary, fields );\n\n\tconst visibleSummaryFields = summaryFields.filter( ( summaryField ) =>\n\t\tisSummaryFieldVisible( summaryField, layout.summary, isOpen )\n\t);\n\n\tconst hasBadge = touched && layout.isCollapsible;\n\tconst hasSummary = visibleSummaryFields.length > 0 && layout.withHeader;\n\n\treturn (\n\t\t<Stack\n\t\t\talign=\"center\"\n\t\t\tjustify=\"space-between\"\n\t\t\tclassName=\"dataforms-layouts-card__field-header-content\"\n\t\t>\n\t\t\t<Card.Title>{ label }</Card.Title>\n\t\t\t{ ( hasBadge || hasSummary ) && (\n\t\t\t\t<CollapsibleCard.HeaderDescription className=\"dataforms-layouts-card__field-header-content-description\">\n\t\t\t\t\t{ hasBadge && <ValidationBadge validity={ validity } /> }\n\t\t\t\t\t{ hasSummary && (\n\t\t\t\t\t\t<div className=\"dataforms-layouts-card__field-summary\">\n\t\t\t\t\t\t\t{ visibleSummaryFields.map( ( summaryField ) => (\n\t\t\t\t\t\t\t\t<summaryField.render\n\t\t\t\t\t\t\t\t\tkey={ summaryField.id }\n\t\t\t\t\t\t\t\t\titem={ data }\n\t\t\t\t\t\t\t\t\tfield={ summaryField }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) }\n\t\t\t\t</CollapsibleCard.HeaderDescription>\n\t\t\t) }\n\t\t</Stack>\n\t);\n}\n\nfunction BodyContent< Item >( {\n\tdata,\n\tfield,\n\tform,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n\twithHeader,\n}: {\n\tdata: Item;\n\tfield: FieldLayoutProps< Item >[ 'field' ];\n\tform: NormalizedForm;\n\tonChange: FieldLayoutProps< Item >[ 'onChange' ];\n\thideLabelFromVision?: boolean;\n\tmarkWhenOptional?: boolean;\n\tvalidity: FieldLayoutProps< Item >[ 'validity' ];\n\twithHeader: boolean;\n} ) {\n\tif ( field.children ) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{ field.description && (\n\t\t\t\t\t<div className=\"dataforms-layouts-card__field-description\">\n\t\t\t\t\t\t{ field.description }\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\t\t\t\t<DataFormLayout\n\t\t\t\t\tdata={ data }\n\t\t\t\t\tform={ form }\n\t\t\t\t\tonChange={ onChange }\n\t\t\t\t\tvalidity={ validity?.children }\n\t\t\t\t/>\n\t\t\t</>\n\t\t);\n\t}\n\n\tconst SingleFieldLayout = getFormFieldLayout( 'regular' )?.component;\n\tif ( ! SingleFieldLayout ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<SingleFieldLayout\n\t\t\tdata={ data }\n\t\t\tfield={ field }\n\t\t\tonChange={ onChange }\n\t\t\thideLabelFromVision={ hideLabelFromVision || withHeader }\n\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\tvalidity={ validity }\n\t\t/>\n\t);\n}\n\nexport default function FormCardField< Item >( {\n\tdata,\n\tfield,\n\tonChange,\n\thideLabelFromVision,\n\tmarkWhenOptional,\n\tvalidity,\n}: FieldLayoutProps< Item > ) {\n\tconst { fields } = useContext( DataFormContext );\n\tconst layout = field.layout as NormalizedCardLayout;\n\tconst contentRef = useRef< HTMLDivElement >( null );\n\n\tconst form: NormalizedForm = useMemo(\n\t\t() => ( {\n\t\t\tlayout: DEFAULT_LAYOUT as NormalizedLayout,\n\t\t\tfields: field.children ?? [],\n\t\t} ),\n\t\t[ field ]\n\t);\n\n\tconst { isOpened, isCollapsible } = layout;\n\tconst [ isOpen, setIsOpen ] = useState( isOpened );\n\tconst [ touched, setTouched ] = useState( false );\n\n\t// Sync internal state when the isOpened prop changes.\n\t// This is unlikely to happen in production, but it helps with storybook controls.\n\tuseEffect( () => {\n\t\tsetIsOpen( isOpened );\n\t}, [ isOpened ] );\n\n\tconst handleOpenChange = useCallback( ( open: boolean ) => {\n\t\t// Mark as touched when collapsing (going from open to closed)\n\t\tif ( ! open ) {\n\t\t\tsetTouched( true );\n\t\t}\n\t\tsetIsOpen( open );\n\t}, [] );\n\n\t// Mark the card as touched when any field inside it is blurred.\n\t// This aligns with how validated controls show errors on blur.\n\tconst handleBlur = useCallback( () => {\n\t\tsetTouched( true );\n\t}, [] );\n\n\t// When the card is expanded after being touched (collapsed with errors),\n\t// trigger reportValidity to show field-level errors.\n\tuseReportValidity(\n\t\tcontentRef,\n\t\t( isCollapsible ? isOpen : true ) && touched\n\t);\n\n\tlet label = field.label;\n\tlet withHeader: boolean;\n\n\tif ( field.children ) {\n\t\twithHeader = !! label && layout.withHeader;\n\t} else {\n\t\tconst fieldDefinition = fields.find(\n\t\t\t( fieldDef ) => fieldDef.id === field.id\n\t\t);\n\n\t\tif ( ! fieldDefinition || ! fieldDefinition.Edit ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlabel = fieldDefinition.label;\n\t\twithHeader = !! label && layout.withHeader;\n\t}\n\n\tconst bodyContent = (\n\t\t<BodyContent\n\t\t\tdata={ data }\n\t\t\tfield={ field }\n\t\t\tform={ form }\n\t\t\tonChange={ onChange }\n\t\t\thideLabelFromVision={ hideLabelFromVision }\n\t\t\tmarkWhenOptional={ markWhenOptional }\n\t\t\tvalidity={ validity }\n\t\t\twithHeader={ withHeader }\n\t\t/>\n\t);\n\n\tconst headerContent = (\n\t\t<HeaderContent\n\t\t\tdata={ data }\n\t\t\tfields={ fields }\n\t\t\tlabel={ label }\n\t\t\tlayout={ layout }\n\t\t\tisOpen={ isCollapsible ? !! isOpen : true }\n\t\t\ttouched={ touched }\n\t\t\tvalidity={ validity }\n\t\t/>\n\t);\n\n\tif ( withHeader && isCollapsible ) {\n\t\treturn (\n\t\t\t<CollapsibleCard.Root\n\t\t\t\tclassName=\"dataforms-layouts-card__field\"\n\t\t\t\topen={ isOpen }\n\t\t\t\tonOpenChange={ handleOpenChange }\n\t\t\t>\n\t\t\t\t<CollapsibleCard.Header>\n\t\t\t\t\t{ headerContent }\n\t\t\t\t</CollapsibleCard.Header>\n\t\t\t\t<CollapsibleCard.Content\n\t\t\t\t\tref={ contentRef }\n\t\t\t\t\tonBlur={ handleBlur }\n\t\t\t\t>\n\t\t\t\t\t{ bodyContent }\n\t\t\t\t</CollapsibleCard.Content>\n\t\t\t</CollapsibleCard.Root>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Card.Root className=\"dataforms-layouts-card__field\">\n\t\t\t{ withHeader && <Card.Header>{ headerContent }</Card.Header> }\n\t\t\t<Card.Content ref={ contentRef } onBlur={ handleBlur }>\n\t\t\t\t{ bodyContent }\n\t\t\t</Card.Content>\n\t\t</Card.Root>\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -56,7 +56,8 @@ function BulkSelectionCheckbox({
56
56
  onChangeSelection,
57
57
  data,
58
58
  actions,
59
- getItemId
59
+ getItemId,
60
+ disableSelectAll = false
60
61
  }) {
61
62
  const selectableItems = useMemo(() => {
62
63
  return data.filter((item) => {
@@ -68,7 +69,22 @@ function BulkSelectionCheckbox({
68
69
  const selectedItems = data.filter(
69
70
  (item) => selection.includes(getItemId(item)) && selectableItems.includes(item)
70
71
  );
72
+ const hasSelection = selection.length > 0;
71
73
  const areAllSelected = selectedItems.length === selectableItems.length;
74
+ if (disableSelectAll) {
75
+ return /* @__PURE__ */ jsx(
76
+ CheckboxControl,
77
+ {
78
+ className: "dataviews-view-table-selection-checkbox",
79
+ checked: hasSelection,
80
+ disabled: !hasSelection,
81
+ onChange: () => {
82
+ onChangeSelection([]);
83
+ },
84
+ "aria-label": __("Deselect all")
85
+ }
86
+ );
87
+ }
72
88
  return /* @__PURE__ */ jsx(
73
89
  CheckboxControl,
74
90
  {
@@ -163,11 +179,12 @@ function ActionButton({
163
179
  action.id
164
180
  );
165
181
  }
166
- function renderFooterContent(data, actions, getItemId, selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection, paginationInfo) {
182
+ function renderFooterContent(data, actions, getItemId, isInfiniteScroll, selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection, paginationInfo) {
167
183
  const message = getFooterMessage(
168
184
  selection.length,
169
185
  data.length,
170
- paginationInfo.totalItems
186
+ paginationInfo.totalItems,
187
+ isInfiniteScroll
171
188
  );
172
189
  return /* @__PURE__ */ jsxs(
173
190
  Stack,
@@ -184,7 +201,8 @@ function renderFooterContent(data, actions, getItemId, selection, actionsToShow,
184
201
  onChangeSelection,
185
202
  data,
186
203
  actions,
187
- getItemId
204
+ getItemId,
205
+ disableSelectAll: isInfiniteScroll
188
206
  }
189
207
  ),
190
208
  /* @__PURE__ */ jsx("span", { className: "dataviews-bulk-actions-footer__item-count", children: message }),
@@ -235,6 +253,7 @@ function FooterContent({
235
253
  onChangeSelection,
236
254
  data,
237
255
  getItemId,
256
+ isInfiniteScroll,
238
257
  paginationInfo
239
258
  }) {
240
259
  const [actionInProgress, setActionInProgress] = useState(
@@ -274,6 +293,7 @@ function FooterContent({
274
293
  data,
275
294
  actions,
276
295
  getItemId,
296
+ isInfiniteScroll,
277
297
  selection,
278
298
  actionsToShow,
279
299
  selectedItems,
@@ -287,6 +307,7 @@ function FooterContent({
287
307
  data,
288
308
  actions,
289
309
  getItemId,
310
+ isInfiniteScroll,
290
311
  selection,
291
312
  actionsToShow,
292
313
  selectedItems,
@@ -305,7 +326,8 @@ function BulkActionsFooter() {
305
326
  actions = EMPTY_ARRAY,
306
327
  onChangeSelection,
307
328
  getItemId,
308
- paginationInfo
329
+ paginationInfo,
330
+ view
309
331
  } = useContext(DataViewsContext);
310
332
  return /* @__PURE__ */ jsx(
311
333
  FooterContent,
@@ -315,6 +337,7 @@ function BulkActionsFooter() {
315
337
  data,
316
338
  actions,
317
339
  getItemId,
340
+ isInfiniteScroll: !!view.infiniteScrollEnabled,
318
341
  paginationInfo
319
342
  }
320
343
  );