@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.
- package/CHANGELOG.md +15 -6
- package/README.md +17 -2
- package/build/components/dataform-controls/datetime.cjs +8 -4
- package/build/components/dataform-controls/datetime.cjs.map +2 -2
- package/build/components/dataform-layouts/card/index.cjs +132 -128
- package/build/components/dataform-layouts/card/index.cjs.map +3 -3
- package/build/components/dataviews-bulk-actions/index.cjs +28 -5
- package/build/components/dataviews-bulk-actions/index.cjs.map +2 -2
- package/build/components/dataviews-context/index.cjs +2 -2
- package/build/components/dataviews-context/index.cjs.map +2 -2
- package/build/components/dataviews-footer/index.cjs +2 -3
- package/build/components/dataviews-footer/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/grid/composite-grid.cjs +378 -249
- package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
- package/build/components/dataviews-layouts/picker-grid/index.cjs +63 -30
- package/build/components/dataviews-layouts/picker-grid/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/picker-table/index.cjs +34 -22
- package/build/components/dataviews-layouts/picker-table/index.cjs.map +2 -2
- package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs +62 -0
- package/build/components/dataviews-layouts/utils/use-infinite-scroll.cjs.map +7 -0
- package/build/components/dataviews-picker-footer/index.cjs +23 -4
- package/build/components/dataviews-picker-footer/index.cjs.map +2 -2
- package/build/components/dataviews-search/index.cjs +2 -1
- package/build/components/dataviews-search/index.cjs.map +2 -2
- package/build/components/dataviews-selection-checkbox/index.cjs +3 -2
- package/build/components/dataviews-selection-checkbox/index.cjs.map +2 -2
- package/build/components/dataviews-view-config/index.cjs +0 -2
- package/build/components/dataviews-view-config/index.cjs.map +3 -3
- package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs +0 -3
- package/build/components/dataviews-view-config/infinite-scroll-toggle.cjs.map +2 -2
- package/build/dataviews/index.cjs +37 -37
- package/build/dataviews/index.cjs.map +3 -3
- package/build/dataviews-picker/index.cjs +25 -24
- package/build/dataviews-picker/index.cjs.map +3 -3
- package/build/hooks/index.cjs +11 -2
- package/build/hooks/index.cjs.map +2 -2
- package/build/hooks/use-data.cjs +146 -9
- package/build/hooks/use-data.cjs.map +2 -2
- package/build/hooks/use-infinite-scroll.cjs +208 -0
- package/build/hooks/use-infinite-scroll.cjs.map +7 -0
- package/build/hooks/use-selected-items.cjs +57 -0
- package/build/hooks/use-selected-items.cjs.map +7 -0
- package/build/types/dataviews.cjs.map +1 -1
- package/build/types/field-api.cjs.map +1 -1
- package/build/utils/filter-sort-and-paginate.cjs +5 -1
- package/build/utils/filter-sort-and-paginate.cjs.map +2 -2
- package/build/utils/get-footer-message.cjs +8 -8
- package/build/utils/get-footer-message.cjs.map +2 -2
- package/build-module/components/dataform-controls/datetime.mjs +8 -4
- package/build-module/components/dataform-controls/datetime.mjs.map +2 -2
- package/build-module/components/dataform-layouts/card/index.mjs +132 -133
- package/build-module/components/dataform-layouts/card/index.mjs.map +2 -2
- package/build-module/components/dataviews-bulk-actions/index.mjs +28 -5
- package/build-module/components/dataviews-bulk-actions/index.mjs.map +2 -2
- package/build-module/components/dataviews-context/index.mjs +2 -2
- package/build-module/components/dataviews-context/index.mjs.map +2 -2
- package/build-module/components/dataviews-footer/index.mjs +2 -3
- package/build-module/components/dataviews-footer/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/grid/composite-grid.mjs +387 -250
- package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/picker-grid/index.mjs +67 -31
- package/build-module/components/dataviews-layouts/picker-grid/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/picker-table/index.mjs +34 -22
- package/build-module/components/dataviews-layouts/picker-table/index.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs +26 -0
- package/build-module/components/dataviews-layouts/utils/use-infinite-scroll.mjs.map +7 -0
- package/build-module/components/dataviews-picker-footer/index.mjs +23 -4
- package/build-module/components/dataviews-picker-footer/index.mjs.map +2 -2
- package/build-module/components/dataviews-search/index.mjs +2 -1
- package/build-module/components/dataviews-search/index.mjs.map +2 -2
- package/build-module/components/dataviews-selection-checkbox/index.mjs +3 -2
- package/build-module/components/dataviews-selection-checkbox/index.mjs.map +2 -2
- package/build-module/components/dataviews-view-config/index.mjs +0 -2
- package/build-module/components/dataviews-view-config/index.mjs.map +2 -2
- package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs +0 -3
- package/build-module/components/dataviews-view-config/infinite-scroll-toggle.mjs.map +2 -2
- package/build-module/dataviews/index.mjs +45 -39
- package/build-module/dataviews/index.mjs.map +2 -2
- package/build-module/dataviews-picker/index.mjs +33 -26
- package/build-module/dataviews-picker/index.mjs.map +2 -2
- package/build-module/hooks/index.mjs +7 -1
- package/build-module/hooks/index.mjs.map +2 -2
- package/build-module/hooks/use-data.mjs +147 -10
- package/build-module/hooks/use-data.mjs.map +2 -2
- package/build-module/hooks/use-infinite-scroll.mjs +188 -0
- package/build-module/hooks/use-infinite-scroll.mjs.map +7 -0
- package/build-module/hooks/use-selected-items.mjs +36 -0
- package/build-module/hooks/use-selected-items.mjs.map +7 -0
- package/build-module/utils/filter-sort-and-paginate.mjs +5 -1
- package/build-module/utils/filter-sort-and-paginate.mjs.map +2 -2
- package/build-module/utils/get-footer-message.mjs +8 -8
- package/build-module/utils/get-footer-message.mjs.map +2 -2
- package/build-style/style-rtl.css +61 -37
- package/build-style/style.css +61 -37
- package/build-types/components/dataform-controls/datetime.d.ts +1 -1
- package/build-types/components/dataform-controls/datetime.d.ts.map +1 -1
- package/build-types/components/dataform-layouts/card/index.d.ts.map +1 -1
- package/build-types/components/dataviews-bulk-actions/index.d.ts +2 -1
- package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -1
- package/build-types/components/dataviews-context/index.d.ts +1 -1
- package/build-types/components/dataviews-context/index.d.ts.map +1 -1
- package/build-types/components/dataviews-footer/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/picker-table/index.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts +22 -0
- package/build-types/components/dataviews-layouts/utils/use-infinite-scroll.d.ts.map +1 -0
- package/build-types/components/dataviews-picker-footer/index.d.ts.map +1 -1
- package/build-types/components/dataviews-search/index.d.ts.map +1 -1
- package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
- package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
- package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts +1 -1
- package/build-types/components/dataviews-view-config/infinite-scroll-toggle.d.ts.map +1 -1
- package/build-types/dataviews/index.d.ts +0 -1
- package/build-types/dataviews/index.d.ts.map +1 -1
- package/build-types/dataviews/stories/fixtures.d.ts.map +1 -1
- package/build-types/dataviews/stories/free-composition.d.ts.map +1 -1
- package/build-types/dataviews/stories/index.story.d.ts +11 -0
- package/build-types/dataviews/stories/index.story.d.ts.map +1 -1
- package/build-types/dataviews/stories/infinite-scroll.d.ts.map +1 -1
- package/build-types/dataviews/stories/with-card.d.ts.map +1 -1
- package/build-types/dataviews-picker/index.d.ts +0 -1
- package/build-types/dataviews-picker/index.d.ts.map +1 -1
- package/build-types/dataviews-picker/stories/fixtures.d.ts.map +1 -1
- package/build-types/dataviews-picker/stories/index.story.d.ts.map +1 -1
- package/build-types/field-types/stories/index.story.d.ts.map +1 -1
- package/build-types/hooks/index.d.ts +3 -0
- package/build-types/hooks/index.d.ts.map +1 -1
- package/build-types/hooks/test/use-data.d.ts +2 -0
- package/build-types/hooks/test/use-data.d.ts.map +1 -0
- package/build-types/hooks/use-data.d.ts +41 -3
- package/build-types/hooks/use-data.d.ts.map +1 -1
- package/build-types/hooks/use-infinite-scroll.d.ts +21 -0
- package/build-types/hooks/use-infinite-scroll.d.ts.map +1 -0
- package/build-types/hooks/use-selected-items.d.ts +19 -0
- package/build-types/hooks/use-selected-items.d.ts.map +1 -0
- package/build-types/types/dataviews.d.ts +7 -1
- package/build-types/types/dataviews.d.ts.map +1 -1
- package/build-types/types/field-api.d.ts +15 -4
- package/build-types/types/field-api.d.ts.map +1 -1
- package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -1
- package/build-types/utils/get-footer-message.d.ts +3 -2
- package/build-types/utils/get-footer-message.d.ts.map +1 -1
- package/build-wp/index.js +3013 -2613
- package/package.json +19 -19
- package/src/components/dataform-controls/datetime.tsx +19 -11
- package/src/components/dataform-layouts/card/index.tsx +171 -146
- package/src/components/dataform-layouts/card/style.scss +8 -5
- package/src/components/dataviews-bulk-actions/index.tsx +28 -1
- package/src/components/dataviews-context/index.ts +2 -2
- package/src/components/dataviews-footer/index.tsx +1 -6
- package/src/components/dataviews-layouts/grid/composite-grid.tsx +433 -284
- package/src/components/dataviews-layouts/grid/style.scss +4 -0
- package/src/components/dataviews-layouts/picker-grid/index.tsx +53 -15
- package/src/components/dataviews-layouts/picker-table/index.tsx +42 -22
- package/src/components/dataviews-layouts/utils/use-infinite-scroll.ts +64 -0
- package/src/components/dataviews-picker-footer/index.tsx +21 -1
- package/src/components/dataviews-search/index.tsx +2 -1
- package/src/components/dataviews-selection-checkbox/index.tsx +4 -2
- package/src/components/dataviews-view-config/index.tsx +0 -2
- package/src/components/dataviews-view-config/infinite-scroll-toggle.tsx +0 -5
- package/src/dataviews/index.tsx +57 -52
- package/src/dataviews/stories/fixtures.tsx +288 -0
- package/src/dataviews/stories/free-composition.tsx +12 -11
- package/src/dataviews/stories/index.story.tsx +19 -2
- package/src/dataviews/stories/infinite-scroll.tsx +12 -92
- package/src/dataviews/stories/with-card.tsx +30 -23
- package/src/dataviews/style.scss +5 -7
- package/src/dataviews/test/dataviews.tsx +21 -9
- package/src/dataviews-picker/index.tsx +40 -34
- package/src/dataviews-picker/stories/fixtures.tsx +270 -0
- package/src/dataviews-picker/stories/index.story.tsx +62 -129
- package/src/field-types/stories/index.story.tsx +12 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/test/use-data.ts +791 -0
- package/src/hooks/use-data.ts +288 -21
- package/src/hooks/use-infinite-scroll.ts +304 -0
- package/src/hooks/use-selected-items.ts +72 -0
- package/src/types/dataviews.ts +8 -1
- package/src/types/field-api.ts +16 -3
- package/src/utils/filter-sort-and-paginate.ts +13 -1
- package/src/utils/get-footer-message.ts +12 -9
- 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
|
|
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;
|
|
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 {
|
|
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
|
|
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 [
|
|
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
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
}, [
|
|
90
|
-
useReportValidity(
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
|
155
|
-
|
|
156
|
-
|
|
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__ */
|
|
162
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
/* @__PURE__ */ jsx(
|
|
213
|
-
|
|
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\
|
|
5
|
-
"mappings": ";AAGA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA
|
|
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
|
);
|