@wordpress/dataviews 16.0.1 → 17.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 +27 -0
- package/README.md +2 -2
- package/build/components/dataform-layouts/panel/dropdown.cjs +2 -2
- package/build/components/dataform-layouts/panel/dropdown.cjs.map +2 -2
- package/build/components/dataform-layouts/panel/modal.cjs +1 -1
- package/build/components/dataform-layouts/panel/modal.cjs.map +2 -2
- package/build/components/dataform-layouts/panel/summary-button.cjs +7 -6
- package/build/components/dataform-layouts/panel/summary-button.cjs.map +2 -2
- package/build/components/dataform-layouts/panel/utils/get-label-content.cjs.map +2 -2
- package/build/components/dataviews-filters/filter.cjs.map +2 -2
- package/build/components/dataviews-layouts/grid/composite-grid.cjs.map +2 -2
- package/build/components/dataviews-layouts/list/index.cjs.map +1 -1
- package/build/components/dataviews-layouts/table/column-primary.cjs +2 -2
- package/build/components/dataviews-layouts/table/column-primary.cjs.map +2 -2
- package/build/components/dataviews-pagination/index.cjs.map +1 -1
- package/build/components/dataviews-picker-footer/index.cjs +72 -33
- package/build/components/dataviews-picker-footer/index.cjs.map +2 -2
- package/build/constants.cjs +1 -1
- package/build/constants.cjs.map +2 -2
- package/build/dataviews-picker/index.cjs +2 -1
- package/build/dataviews-picker/index.cjs.map +2 -2
- package/build/field-types/password.cjs +1 -1
- package/build/field-types/password.cjs.map +2 -2
- package/build/hooks/use-form-validity.cjs +2 -2
- package/build/hooks/use-form-validity.cjs.map +2 -2
- package/build-module/components/dataform-layouts/panel/dropdown.mjs +2 -2
- package/build-module/components/dataform-layouts/panel/dropdown.mjs.map +2 -2
- package/build-module/components/dataform-layouts/panel/modal.mjs +1 -1
- package/build-module/components/dataform-layouts/panel/modal.mjs.map +2 -2
- package/build-module/components/dataform-layouts/panel/summary-button.mjs +7 -6
- package/build-module/components/dataform-layouts/panel/summary-button.mjs.map +2 -2
- package/build-module/components/dataform-layouts/panel/utils/get-label-content.mjs.map +2 -2
- package/build-module/components/dataviews-filters/filter.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/grid/composite-grid.mjs.map +2 -2
- package/build-module/components/dataviews-layouts/list/index.mjs.map +1 -1
- package/build-module/components/dataviews-layouts/table/column-primary.mjs +2 -2
- package/build-module/components/dataviews-layouts/table/column-primary.mjs.map +2 -2
- package/build-module/components/dataviews-pagination/index.mjs.map +1 -1
- package/build-module/components/dataviews-picker-footer/index.mjs +71 -33
- package/build-module/components/dataviews-picker-footer/index.mjs.map +2 -2
- package/build-module/constants.mjs +1 -1
- package/build-module/constants.mjs.map +2 -2
- package/build-module/dataviews-picker/index.mjs +6 -2
- package/build-module/dataviews-picker/index.mjs.map +2 -2
- package/build-module/field-types/password.mjs +1 -1
- package/build-module/field-types/password.mjs.map +2 -2
- package/build-module/hooks/use-form-validity.mjs +2 -2
- package/build-module/hooks/use-form-validity.mjs.map +2 -2
- package/build-style/style-rtl.css +192 -207
- package/build-style/style.css +192 -207
- package/build-types/components/dataform-layouts/panel/summary-button.d.ts +2 -2
- package/build-types/components/dataform-layouts/panel/summary-button.d.ts.map +1 -1
- package/build-types/components/dataform-layouts/panel/utils/get-label-content.d.ts.map +1 -1
- package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
- package/build-types/components/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
- package/build-types/components/dataviews-picker-footer/index.d.ts +3 -2
- package/build-types/components/dataviews-picker-footer/index.d.ts.map +1 -1
- package/build-types/dataviews-picker/index.d.ts +3 -2
- package/build-types/dataviews-picker/index.d.ts.map +1 -1
- package/build-wp/index.js +712 -668
- package/package.json +26 -21
- package/src/components/dataform-controls/style.scss +1 -1
- package/src/components/dataform-layouts/card/style.scss +1 -1
- package/src/components/dataform-layouts/details/style.scss +1 -1
- package/src/components/dataform-layouts/panel/dropdown.tsx +1 -1
- package/src/components/dataform-layouts/panel/modal.tsx +1 -1
- package/src/components/dataform-layouts/panel/style.scss +18 -34
- package/src/components/dataform-layouts/panel/summary-button.tsx +17 -8
- package/src/components/dataform-layouts/panel/utils/get-label-content.tsx +0 -1
- package/src/components/dataform-layouts/regular/style.scss +4 -4
- package/src/components/dataviews-bulk-actions/style.scss +2 -2
- package/src/components/dataviews-filters/filter.tsx +0 -1
- package/src/components/dataviews-filters/style.scss +45 -46
- package/src/components/dataviews-layouts/activity/style.scss +19 -19
- package/src/components/dataviews-layouts/grid/composite-grid.tsx +0 -1
- package/src/components/dataviews-layouts/grid/style.scss +19 -13
- package/src/components/dataviews-layouts/list/style.scss +35 -27
- package/src/components/dataviews-layouts/picker-activity/style.scss +18 -18
- package/src/components/dataviews-layouts/picker-grid/style.scss +18 -12
- package/src/components/dataviews-layouts/picker-table/style.scss +7 -5
- package/src/components/dataviews-layouts/table/style.scss +17 -17
- package/src/components/dataviews-picker-footer/index.tsx +94 -31
- package/src/components/dataviews-picker-footer/style.scss +1 -1
- package/src/components/dataviews-view-config/style.scss +1 -1
- package/src/dataviews/style.scss +9 -9
- package/src/dataviews-picker/index.tsx +9 -3
|
@@ -18,7 +18,10 @@ import {
|
|
|
18
18
|
FiltersToggle
|
|
19
19
|
} from "../components/dataviews-filters/index.mjs";
|
|
20
20
|
import DataViewsLayout from "../components/dataviews-layout/index.mjs";
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
DataViewsPickerFooter,
|
|
23
|
+
DataViewsPickerBulkActionToolbar
|
|
24
|
+
} from "../components/dataviews-picker-footer/index.mjs";
|
|
22
25
|
import DataViewsSearch from "../components/dataviews-search/index.mjs";
|
|
23
26
|
import { DataViewsPagination } from "../components/dataviews-pagination/index.mjs";
|
|
24
27
|
import DataViewsViewConfig, {
|
|
@@ -199,7 +202,8 @@ function DataViewsPicker({
|
|
|
199
202
|
);
|
|
200
203
|
}
|
|
201
204
|
var DataViewsPickerSubComponents = DataViewsPicker;
|
|
202
|
-
DataViewsPickerSubComponents.BulkActionToolbar =
|
|
205
|
+
DataViewsPickerSubComponents.BulkActionToolbar = DataViewsPickerBulkActionToolbar;
|
|
206
|
+
DataViewsPickerSubComponents.Footer = DataViewsPickerFooter;
|
|
203
207
|
DataViewsPickerSubComponents.Filters = Filters;
|
|
204
208
|
DataViewsPickerSubComponents.FiltersToggled = FiltersToggled;
|
|
205
209
|
DataViewsPickerSubComponents.FiltersToggle = FiltersToggle;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/dataviews-picker/index.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport type { ReactNode } from 'react';\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\nimport { useResizeObserver } from '@wordpress/compose';\nimport { Stack } from '@wordpress/ui';\n\n/**\n * Internal dependencies\n */\nimport DataViewsContext from '../components/dataviews-context';\nimport { VIEW_LAYOUTS } from '../components/dataviews-layouts';\nimport {\n\tFilters,\n\tFiltersToggled,\n\tuseFilters,\n\tFiltersToggle,\n} from '../components/dataviews-filters';\nimport DataViewsLayout from '../components/dataviews-layout';\nimport {
|
|
5
|
-
"mappings": ";AAIA,OAAO,UAAU;AAKjB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,yBAAyB;AAClC,SAAS,aAAa;AAKtB,OAAO,sBAAsB;AAC7B,SAAS,oBAAoB;AAC7B;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,OAAO,qBAAqB;AAC5B,
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport type { ReactNode } from 'react';\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\nimport { useResizeObserver } from '@wordpress/compose';\nimport { Stack } from '@wordpress/ui';\n\n/**\n * Internal dependencies\n */\nimport DataViewsContext from '../components/dataviews-context';\nimport { VIEW_LAYOUTS } from '../components/dataviews-layouts';\nimport {\n\tFilters,\n\tFiltersToggled,\n\tuseFilters,\n\tFiltersToggle,\n} from '../components/dataviews-filters';\nimport DataViewsLayout from '../components/dataviews-layout';\nimport {\n\tDataViewsPickerFooter,\n\tDataViewsPickerBulkActionToolbar,\n} from '../components/dataviews-picker-footer';\nimport DataViewsSearch from '../components/dataviews-search';\nimport { DataViewsPagination } from '../components/dataviews-pagination';\nimport DataViewsViewConfig, {\n\tDataviewsViewConfigDropdown,\n\tViewTypeMenu,\n} from '../components/dataviews-view-config';\nimport normalizeFields from '../field-types';\nimport useData from '../hooks/use-data';\nimport { useInfiniteScroll } from '../hooks/use-infinite-scroll';\nimport type { ActionButton, Field, View, SupportedLayouts } from '../types';\nimport type { SelectionOrUpdater } from '../types/private';\ntype ItemWithId = { id: string };\n\nconst isItemClickable = () => false;\n\nconst dataViewsPickerLayouts = VIEW_LAYOUTS.filter(\n\t( viewLayout ) => viewLayout.isPicker\n);\n\ntype DataViewsPickerProps< Item > = {\n\tview: View;\n\tonChangeView: ( view: View ) => void;\n\tfields: Field< Item >[];\n\tactions?: ActionButton< Item >[];\n\tsearch?: boolean;\n\tsearchLabel?: string;\n\tdata: Item[];\n\tisLoading?: boolean;\n\tpaginationInfo: {\n\t\ttotalItems: number;\n\t\ttotalPages: number;\n\t};\n\tdefaultLayouts?: SupportedLayouts;\n\tselection: string[];\n\tonChangeSelection: ( items: string[] ) => void;\n\tchildren?: ReactNode;\n\tconfig?: {\n\t\tperPageSizes: number[];\n\t};\n\titemListLabel?: string;\n\tempty?: ReactNode;\n\tonReset?: ( () => void ) | false;\n} & ( Item extends ItemWithId\n\t? { getItemId?: ( item: Item ) => string }\n\t: { getItemId: ( item: Item ) => string } );\n\nconst defaultGetItemId = ( item: ItemWithId ) => item.id;\nconst EMPTY_ARRAY: any[] = [];\nconst DEFAULT_PICKER_LAYOUTS: SupportedLayouts = {\n\tpickerGrid: true,\n\tpickerTable: true,\n};\n\ntype DefaultUIProps = Pick<\n\tDataViewsPickerProps< any >,\n\t'search' | 'searchLabel'\n>;\n\nfunction DefaultUI( {\n\tsearch = true,\n\tsearchLabel = undefined,\n}: DefaultUIProps ) {\n\tconst { view } = useContext( DataViewsContext );\n\tconst isInfiniteScroll = view.infiniteScrollEnabled;\n\treturn (\n\t\t<>\n\t\t\t<Stack\n\t\t\t\tdirection=\"row\"\n\t\t\t\talign=\"top\"\n\t\t\t\tjustify=\"space-between\"\n\t\t\t\tclassName={ clsx( 'dataviews__view-actions', {\n\t\t\t\t\t'dataviews__view-actions--infinite-scroll':\n\t\t\t\t\t\tisInfiniteScroll,\n\t\t\t\t} ) }\n\t\t\t\tgap=\"xs\"\n\t\t\t>\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\tgap=\"sm\"\n\t\t\t\t\tjustify=\"start\"\n\t\t\t\t\tclassName=\"dataviews__search\"\n\t\t\t\t>\n\t\t\t\t\t{ search && <DataViewsSearch label={ searchLabel } /> }\n\t\t\t\t\t<FiltersToggle />\n\t\t\t\t</Stack>\n\t\t\t\t<Stack direction=\"row\" gap=\"xs\" style={ { flexShrink: 0 } }>\n\t\t\t\t\t<DataViewsViewConfig />\n\t\t\t\t</Stack>\n\t\t\t</Stack>\n\t\t\t<FiltersToggled className=\"dataviews-filters__container\" />\n\t\t\t<DataViewsLayout />\n\t\t\t<DataViewsPickerFooter />\n\t\t</>\n\t);\n}\n\nfunction DataViewsPicker< Item >( {\n\tview,\n\tonChangeView,\n\tfields,\n\tsearch = true,\n\tsearchLabel = undefined,\n\tactions = EMPTY_ARRAY,\n\tdata,\n\tgetItemId = defaultGetItemId,\n\tisLoading = false,\n\tpaginationInfo,\n\tdefaultLayouts: defaultLayoutsProperty = DEFAULT_PICKER_LAYOUTS,\n\tselection,\n\tonChangeSelection,\n\tchildren,\n\tconfig = { perPageSizes: [ 10, 20, 50, 100 ] },\n\titemListLabel,\n\tempty,\n\tonReset,\n}: DataViewsPickerProps< Item > ) {\n\t// useData ensures data loading is correct whether infinite scroll is enabled or pagination is used.\n\tconst { data: displayData, setVisibleEntries } = useData( {\n\t\tview,\n\t\tdata: data as any,\n\t\tgetItemId: getItemId as any,\n\t\tselection,\n\t\tpaginationInfo,\n\t} ) as {\n\t\tdata: ( Item & { position?: number } )[];\n\t\tsetVisibleEntries?: React.Dispatch< React.SetStateAction< number[] > >;\n\t};\n\tconst containerRef = useRef< HTMLDivElement >( null );\n\tconst [ containerWidth, setContainerWidth ] = useState( 0 );\n\tconst resizeObserverRef = useResizeObserver(\n\t\t( resizeObserverEntries: any ) => {\n\t\t\tsetContainerWidth(\n\t\t\t\tresizeObserverEntries[ 0 ].borderBoxSize[ 0 ].inlineSize\n\t\t\t);\n\t\t},\n\t\t{ box: 'border-box' }\n\t);\n\tconst [ openedFilter, setOpenedFilter ] = useState< string | null >( null );\n\tfunction setSelectionWithChange( value: SelectionOrUpdater ) {\n\t\tconst newValue =\n\t\t\ttypeof value === 'function' ? value( selection ) : value;\n\t\tif ( onChangeSelection ) {\n\t\t\tonChangeSelection( newValue );\n\t\t}\n\t}\n\tconst _fields = useMemo( () => normalizeFields( fields ), [ fields ] );\n\tconst filters = useFilters( _fields, view );\n\n\tconst hasPrimaryOrLockedFilters = useMemo(\n\t\t() =>\n\t\t\t( filters || [] ).some(\n\t\t\t\t( filter ) => filter.isPrimary || filter.isLocked\n\t\t\t),\n\t\t[ filters ]\n\t);\n\tconst [ isShowingFilter, setIsShowingFilter ] = useState< boolean >(\n\t\thasPrimaryOrLockedFilters\n\t);\n\n\tconst { intersectionObserver } = useInfiniteScroll( {\n\t\tview,\n\t\tonChangeView,\n\t\tisLoading,\n\t\tpaginationInfo,\n\t\tcontainerRef,\n\t\tsetVisibleEntries,\n\t} );\n\n\tuseEffect( () => {\n\t\tif ( hasPrimaryOrLockedFilters && ! isShowingFilter ) {\n\t\t\tsetIsShowingFilter( true );\n\t\t}\n\t}, [ hasPrimaryOrLockedFilters, isShowingFilter ] );\n\n\t// Filter out non-picker layouts and normalize `true` to `{}`.\n\tconst defaultLayouts = useMemo(\n\t\t() =>\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries( defaultLayoutsProperty )\n\t\t\t\t\t.filter( ( [ layoutType ] ) => {\n\t\t\t\t\t\treturn dataViewsPickerLayouts.some(\n\t\t\t\t\t\t\t( viewLayout ) => viewLayout.type === layoutType\n\t\t\t\t\t\t);\n\t\t\t\t\t} )\n\t\t\t\t\t.map( ( [ key, value ] ) => [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tvalue === true ? {} : value,\n\t\t\t\t\t] )\n\t\t\t),\n\t\t[ defaultLayoutsProperty ]\n\t);\n\n\tif ( ! defaultLayouts[ view.type ] ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<DataViewsContext.Provider\n\t\t\tvalue={ {\n\t\t\t\tview,\n\t\t\t\tonChangeView,\n\t\t\t\tfields: _fields,\n\t\t\t\tactions,\n\t\t\t\tdata: displayData,\n\t\t\t\tisLoading,\n\t\t\t\tpaginationInfo,\n\t\t\t\tisItemClickable,\n\t\t\t\tselection,\n\t\t\t\tonChangeSelection: setSelectionWithChange,\n\t\t\t\topenedFilter,\n\t\t\t\tsetOpenedFilter,\n\t\t\t\tgetItemId,\n\t\t\t\tcontainerWidth,\n\t\t\t\tcontainerRef,\n\t\t\t\tresizeObserverRef,\n\t\t\t\tdefaultLayouts,\n\t\t\t\tfilters,\n\t\t\t\tisShowingFilter,\n\t\t\t\tsetIsShowingFilter,\n\t\t\t\tconfig,\n\t\t\t\titemListLabel,\n\t\t\t\tempty,\n\t\t\t\tonReset,\n\t\t\t\thasInitiallyLoaded: true,\n\t\t\t\tintersectionObserver,\n\t\t\t} }\n\t\t>\n\t\t\t<div className=\"dataviews-picker-wrapper\">\n\t\t\t\t{ children ?? (\n\t\t\t\t\t<DefaultUI search={ search } searchLabel={ searchLabel } />\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</DataViewsContext.Provider>\n\t);\n}\n\n// Populate the DataViews sub components\nconst DataViewsPickerSubComponents =\n\tDataViewsPicker as typeof DataViewsPicker & {\n\t\tBulkActionToolbar: typeof DataViewsPickerBulkActionToolbar;\n\t\tFooter: typeof DataViewsPickerFooter;\n\t\tFilters: typeof Filters;\n\t\tFiltersToggled: typeof FiltersToggled;\n\t\tFiltersToggle: typeof FiltersToggle;\n\t\tLayout: typeof DataViewsLayout;\n\t\tLayoutSwitcher: typeof ViewTypeMenu;\n\t\tPagination: typeof DataViewsPagination;\n\t\tSearch: typeof DataViewsSearch;\n\t\tViewConfig: typeof DataviewsViewConfigDropdown;\n\t};\n\nDataViewsPickerSubComponents.BulkActionToolbar =\n\tDataViewsPickerBulkActionToolbar;\nDataViewsPickerSubComponents.Footer = DataViewsPickerFooter;\nDataViewsPickerSubComponents.Filters = Filters;\nDataViewsPickerSubComponents.FiltersToggled = FiltersToggled;\nDataViewsPickerSubComponents.FiltersToggle = FiltersToggle;\nDataViewsPickerSubComponents.Layout = DataViewsLayout;\nDataViewsPickerSubComponents.LayoutSwitcher = ViewTypeMenu;\nDataViewsPickerSubComponents.Pagination = DataViewsPagination;\nDataViewsPickerSubComponents.Search = DataViewsSearch;\nDataViewsPickerSubComponents.ViewConfig = DataviewsViewConfigDropdown;\n\nexport default DataViewsPickerSubComponents;\n"],
|
|
5
|
+
"mappings": ";AAIA,OAAO,UAAU;AAKjB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,yBAAyB;AAClC,SAAS,aAAa;AAKtB,OAAO,sBAAsB;AAC7B,SAAS,oBAAoB;AAC7B;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,OAAO,qBAAqB;AAC5B;AAAA,EACC;AAAA,EACA;AAAA,OACM;AACP,OAAO,qBAAqB;AAC5B,SAAS,2BAA2B;AACpC,OAAO;AAAA,EACN;AAAA,EACA;AAAA,OACM;AACP,OAAO,qBAAqB;AAC5B,OAAO,aAAa;AACpB,SAAS,yBAAyB;AAyDhC,mBAiBe,KANb,YAXF;AApDF,IAAM,kBAAkB,MAAM;AAE9B,IAAM,yBAAyB,aAAa;AAAA,EAC3C,CAAE,eAAgB,WAAW;AAC9B;AA6BA,IAAM,mBAAmB,CAAE,SAAsB,KAAK;AACtD,IAAM,cAAqB,CAAC;AAC5B,IAAM,yBAA2C;AAAA,EAChD,YAAY;AAAA,EACZ,aAAa;AACd;AAOA,SAAS,UAAW;AAAA,EACnB,SAAS;AAAA,EACT,cAAc;AACf,GAAoB;AACnB,QAAM,EAAE,KAAK,IAAI,WAAY,gBAAiB;AAC9C,QAAM,mBAAmB,KAAK;AAC9B,SACC,iCACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,WAAU;AAAA,QACV,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,WAAY,KAAM,2BAA2B;AAAA,UAC5C,4CACC;AAAA,QACF,CAAE;AAAA,QACF,KAAI;AAAA,QAEJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACA,WAAU;AAAA,cACV,KAAI;AAAA,cACJ,SAAQ;AAAA,cACR,WAAU;AAAA,cAER;AAAA,0BAAU,oBAAC,mBAAgB,OAAQ,aAAc;AAAA,gBACnD,oBAAC,iBAAc;AAAA;AAAA;AAAA,UAChB;AAAA,UACA,oBAAC,SAAM,WAAU,OAAM,KAAI,MAAK,OAAQ,EAAE,YAAY,EAAE,GACvD,8BAAC,uBAAoB,GACtB;AAAA;AAAA;AAAA,IACD;AAAA,IACA,oBAAC,kBAAe,WAAU,gCAA+B;AAAA,IACzD,oBAAC,mBAAgB;AAAA,IACjB,oBAAC,yBAAsB;AAAA,KACxB;AAEF;AAEA,SAAS,gBAAyB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AAAA,EACA,gBAAgB,yBAAyB;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,EAAE,cAAc,CAAE,IAAI,IAAI,IAAI,GAAI,EAAE;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACD,GAAkC;AAEjC,QAAM,EAAE,MAAM,aAAa,kBAAkB,IAAI,QAAS;AAAA,IACzD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAE;AAIF,QAAM,eAAe,OAA0B,IAAK;AACpD,QAAM,CAAE,gBAAgB,iBAAkB,IAAI,SAAU,CAAE;AAC1D,QAAM,oBAAoB;AAAA,IACzB,CAAE,0BAAgC;AACjC;AAAA,QACC,sBAAuB,CAAE,EAAE,cAAe,CAAE,EAAE;AAAA,MAC/C;AAAA,IACD;AAAA,IACA,EAAE,KAAK,aAAa;AAAA,EACrB;AACA,QAAM,CAAE,cAAc,eAAgB,IAAI,SAA2B,IAAK;AAC1E,WAAS,uBAAwB,OAA4B;AAC5D,UAAM,WACL,OAAO,UAAU,aAAa,MAAO,SAAU,IAAI;AACpD,QAAK,mBAAoB;AACxB,wBAAmB,QAAS;AAAA,IAC7B;AAAA,EACD;AACA,QAAM,UAAU,QAAS,MAAM,gBAAiB,MAAO,GAAG,CAAE,MAAO,CAAE;AACrE,QAAM,UAAU,WAAY,SAAS,IAAK;AAE1C,QAAM,4BAA4B;AAAA,IACjC,OACG,WAAW,CAAC,GAAI;AAAA,MACjB,CAAE,WAAY,OAAO,aAAa,OAAO;AAAA,IAC1C;AAAA,IACD,CAAE,OAAQ;AAAA,EACX;AACA,QAAM,CAAE,iBAAiB,kBAAmB,IAAI;AAAA,IAC/C;AAAA,EACD;AAEA,QAAM,EAAE,qBAAqB,IAAI,kBAAmB;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAE;AAEF,YAAW,MAAM;AAChB,QAAK,6BAA6B,CAAE,iBAAkB;AACrD,yBAAoB,IAAK;AAAA,IAC1B;AAAA,EACD,GAAG,CAAE,2BAA2B,eAAgB,CAAE;AAGlD,QAAM,iBAAiB;AAAA,IACtB,MACC,OAAO;AAAA,MACN,OAAO,QAAS,sBAAuB,EACrC,OAAQ,CAAE,CAAE,UAAW,MAAO;AAC9B,eAAO,uBAAuB;AAAA,UAC7B,CAAE,eAAgB,WAAW,SAAS;AAAA,QACvC;AAAA,MACD,CAAE,EACD,IAAK,CAAE,CAAE,KAAK,KAAM,MAAO;AAAA,QAC3B;AAAA,QACA,UAAU,OAAO,CAAC,IAAI;AAAA,MACvB,CAAE;AAAA,IACJ;AAAA,IACD,CAAE,sBAAuB;AAAA,EAC1B;AAEA,MAAK,CAAE,eAAgB,KAAK,IAAK,GAAI;AACpC,WAAO;AAAA,EACR;AAEA,SACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACA,OAAQ;AAAA,QACP;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBAAmB;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,MACD;AAAA,MAEA,8BAAC,SAAI,WAAU,4BACZ,sBACD,oBAAC,aAAU,QAAkB,aAA4B,GAE3D;AAAA;AAAA,EACD;AAEF;AAGA,IAAM,+BACL;AAaD,6BAA6B,oBAC5B;AACD,6BAA6B,SAAS;AACtC,6BAA6B,UAAU;AACvC,6BAA6B,iBAAiB;AAC9C,6BAA6B,gBAAgB;AAC7C,6BAA6B,SAAS;AACtC,6BAA6B,iBAAiB;AAC9C,6BAA6B,aAAa;AAC1C,6BAA6B,SAAS;AACtC,6BAA6B,aAAa;AAE1C,IAAO,2BAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/field-types/password.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { NormalizedField } from '../types';\nimport type { FieldType } from '../types/private';\nimport isValidRequired from './utils/is-valid-required';\nimport isValidMinLength from './utils/is-valid-min-length';\nimport isValidMaxLength from './utils/is-valid-max-length';\nimport isValidPattern from './utils/is-valid-pattern';\nimport isValidElements from './utils/is-valid-elements';\nimport render from './utils/render-default';\n\nfunction getValueFormatted< Item >( {\n\titem,\n\tfield,\n}: {\n\titem: Item;\n\tfield: NormalizedField< Item >;\n} ): string {\n\treturn field.getValue( { item } ) ? '
|
|
5
|
-
"mappings": ";AAKA,OAAO,qBAAqB;AAC5B,OAAO,sBAAsB;AAC7B,OAAO,sBAAsB;AAC7B,OAAO,oBAAoB;AAC3B,OAAO,qBAAqB;AAC5B,OAAO,YAAY;AAEnB,SAAS,kBAA2B;AAAA,EACnC;AAAA,EACA;AACD,GAGY;AACX,SAAO,MAAM,SAAU,EAAE,KAAK,CAAE,IAAI,
|
|
4
|
+
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { NormalizedField } from '../types';\nimport type { FieldType } from '../types/private';\nimport isValidRequired from './utils/is-valid-required';\nimport isValidMinLength from './utils/is-valid-min-length';\nimport isValidMaxLength from './utils/is-valid-max-length';\nimport isValidPattern from './utils/is-valid-pattern';\nimport isValidElements from './utils/is-valid-elements';\nimport render from './utils/render-default';\n\nfunction getValueFormatted< Item >( {\n\titem,\n\tfield,\n}: {\n\titem: Item;\n\tfield: NormalizedField< Item >;\n} ): string {\n\treturn field.getValue( { item } ) ? '••••••••' : '';\n}\n\nexport default {\n\ttype: 'password',\n\trender,\n\tEdit: 'password',\n\tsort: () => 0, // Passwords should not be sortable for security reasons\n\tenableSorting: false,\n\tenableGlobalSearch: false,\n\tdefaultOperators: [],\n\tvalidOperators: [],\n\tformat: {},\n\tgetValueFormatted,\n\tvalidate: {\n\t\trequired: isValidRequired,\n\t\tpattern: isValidPattern,\n\t\tminLength: isValidMinLength,\n\t\tmaxLength: isValidMaxLength,\n\t\telements: isValidElements,\n\t},\n} satisfies FieldType< any >;\n"],
|
|
5
|
+
"mappings": ";AAKA,OAAO,qBAAqB;AAC5B,OAAO,sBAAsB;AAC7B,OAAO,sBAAsB;AAC7B,OAAO,oBAAoB;AAC3B,OAAO,qBAAqB;AAC5B,OAAO,YAAY;AAEnB,SAAS,kBAA2B;AAAA,EACnC;AAAA,EACA;AACD,GAGY;AACX,SAAO,MAAM,SAAU,EAAE,KAAK,CAAE,IAAI,aAAa;AAClD;AAEA,IAAO,mBAAQ;AAAA,EACd,MAAM;AAAA,EACN;AAAA,EACA,MAAM;AAAA,EACN,MAAM,MAAM;AAAA;AAAA,EACZ,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,kBAAkB,CAAC;AAAA,EACnB,gBAAgB,CAAC;AAAA,EACjB,QAAQ,CAAC;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,EACX;AACD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -372,14 +372,14 @@ function validateFormField(item, formField, promiseHandler) {
|
|
|
372
372
|
);
|
|
373
373
|
fieldValidity.elements = {
|
|
374
374
|
type: "validating",
|
|
375
|
-
message: __("Validating
|
|
375
|
+
message: __("Validating…")
|
|
376
376
|
};
|
|
377
377
|
}
|
|
378
378
|
if (customError instanceof Promise) {
|
|
379
379
|
handleCustomValidationAsync(customError, formField, promiseHandler);
|
|
380
380
|
fieldValidity.custom = {
|
|
381
381
|
type: "validating",
|
|
382
|
-
message: __("Validating
|
|
382
|
+
message: __("Validating…")
|
|
383
383
|
};
|
|
384
384
|
}
|
|
385
385
|
if (Object.keys(fieldValidity).length > 0) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/use-form-validity.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport deepMerge from 'deepmerge';\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * WordPress dependencies\n */\nimport { useCallback, useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport normalizeFields from '../field-types';\nimport normalizeForm from '../components/dataform-layouts/normalize-form';\nimport type {\n\tField,\n\tFieldValidity,\n\tForm,\n\tFormValidity,\n\tNormalizedField,\n\tNormalizedFormField,\n} from '../types';\n\nfunction isFormValid( formValidity: FormValidity | undefined ): boolean {\n\tif ( ! formValidity ) {\n\t\treturn true;\n\t}\n\n\treturn Object.values( formValidity ).every( ( fieldValidation ) => {\n\t\treturn Object.entries( fieldValidation ).every(\n\t\t\t( [ key, validation ] ) => {\n\t\t\t\tif (\n\t\t\t\t\tkey === 'children' &&\n\t\t\t\t\tvalidation &&\n\t\t\t\t\ttypeof validation === 'object'\n\t\t\t\t) {\n\t\t\t\t\t// Recursively check children validations\n\t\t\t\t\treturn isFormValid( validation as FormValidity );\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\tvalidation.type !== 'invalid' &&\n\t\t\t\t\tvalidation.type !== 'validating'\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\t} );\n}\n\ntype FormFieldToValidate< Item > = {\n\tid: string;\n\tchildren: FormFieldToValidate< Item >[];\n\tfield?: NormalizedField< Item >;\n};\n\nfunction getFormFieldsToValidate< Item >(\n\tform: Form,\n\tfields: Field< Item >[]\n): FormFieldToValidate< Item >[] {\n\tconst normalizedForm = normalizeForm( form );\n\tif ( normalizedForm.fields.length === 0 ) {\n\t\treturn [];\n\t}\n\n\t// Create a map of field IDs to Field definitions for fast lookup\n\tconst fieldsMap = new Map< string, Field< Item > >();\n\tfields.forEach( ( field ) => {\n\t\tfieldsMap.set( field.id, field );\n\t} );\n\n\t// Recursive function to process form fields and their children\n\tfunction processFormField(\n\t\tformField: NormalizedFormField\n\t): FormFieldToValidate< Item > | null {\n\t\t// Handle combined fields (fields with children)\n\t\tif ( 'children' in formField && Array.isArray( formField.children ) ) {\n\t\t\tconst processedChildren = formField.children\n\t\t\t\t.map( processFormField )\n\t\t\t\t.filter( ( child ) => child !== null );\n\n\t\t\tif ( processedChildren.length === 0 ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst fieldDef = fieldsMap.get( formField.id );\n\t\t\tif ( fieldDef ) {\n\t\t\t\tconst [ normalizedField ] = normalizeFields< Item >( [\n\t\t\t\t\tfieldDef,\n\t\t\t\t] );\n\n\t\t\t\treturn {\n\t\t\t\t\tid: formField.id,\n\t\t\t\t\tchildren: processedChildren,\n\t\t\t\t\tfield: normalizedField,\n\t\t\t\t} satisfies FormFieldToValidate< Item >;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: formField.id,\n\t\t\t\tchildren: processedChildren,\n\t\t\t} satisfies FormFieldToValidate< Item >;\n\t\t}\n\n\t\t// Handle leaf fields (fields without children)\n\t\tconst fieldDef = fieldsMap.get( formField.id );\n\t\tif ( ! fieldDef ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst [ normalizedField ] = normalizeFields< Item >( [ fieldDef ] );\n\t\treturn {\n\t\t\tid: formField.id,\n\t\t\tchildren: [],\n\t\t\tfield: normalizedField,\n\t\t} as FormFieldToValidate< Item >;\n\t}\n\n\tconst toValidate = normalizedForm.fields\n\t\t.map( processFormField )\n\t\t.filter( ( field ) => field !== null );\n\n\treturn toValidate;\n}\n\nfunction setValidityAtPath(\n\tformValidity: FormValidity | undefined,\n\tfieldValidity: FieldValidity,\n\tpath: string[]\n): FormValidity {\n\t// Handle empty validity or empty path\n\tif ( ! formValidity ) {\n\t\tformValidity = {};\n\t}\n\n\tif ( path.length === 0 ) {\n\t\treturn formValidity;\n\t}\n\n\t// Clone the root to avoid mutations\n\tconst result = { ...formValidity };\n\n\t// Navigate through the result tree,\n\t// setting up empty paths if they don't exist.\n\tlet current: any = result;\n\tfor ( let i = 0; i < path.length - 1; i++ ) {\n\t\tconst segment = path[ i ];\n\t\tif ( ! current[ segment ] ) {\n\t\t\tcurrent[ segment ] = {};\n\t\t}\n\n\t\tcurrent[ segment ] = { ...current[ segment ] };\n\t\tcurrent = current[ segment ];\n\t}\n\n\t// At the final destination, merge the new validity with the existing.\n\tconst finalKey = path[ path.length - 1 ];\n\tcurrent[ finalKey ] = {\n\t\t...( current[ finalKey ] || {} ),\n\t\t...fieldValidity,\n\t};\n\n\treturn result;\n}\n\nfunction removeValidationProperty(\n\tformValidity: FormValidity | undefined,\n\tpath: string[],\n\tproperty: keyof FieldValidity\n): FormValidity | undefined {\n\tif ( ! formValidity || path.length === 0 ) {\n\t\treturn formValidity;\n\t}\n\tconst result = { ...formValidity };\n\t// Navigate to parent of target.\n\tlet current: any = result;\n\tfor ( let i = 0; i < path.length - 1; i++ ) {\n\t\tconst segment = path[ i ];\n\t\tif ( ! current[ segment ] ) {\n\t\t\treturn formValidity; // Path doesn't exist\n\t\t}\n\t\tcurrent[ segment ] = { ...current[ segment ] };\n\t\tcurrent = current[ segment ];\n\t}\n\tconst finalKey = path[ path.length - 1 ];\n\tif ( ! current[ finalKey ] ) {\n\t\treturn formValidity;\n\t}\n\tconst fieldValidity = { ...current[ finalKey ] };\n\tdelete fieldValidity[ property ];\n\t// If field has no more validations, remove it entirely.\n\tif ( Object.keys( fieldValidity ).length === 0 ) {\n\t\tdelete current[ finalKey ];\n\t} else {\n\t\t// Keep the field if it has other validations (including children).\n\t\tcurrent[ finalKey ] = fieldValidity;\n\t}\n\t// If root is empty, return undefined\n\tif ( Object.keys( result ).length === 0 ) {\n\t\treturn undefined;\n\t}\n\treturn result;\n}\n\nfunction handleElementsValidationAsync< Item >(\n\tpromise: Promise< any >,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n) {\n\tconst { elementsCounterRef, setFormValidity, path, item } = promiseHandler;\n\tconst currentToken =\n\t\t( elementsCounterRef.current[ formField.id ] || 0 ) + 1;\n\telementsCounterRef.current[ formField.id ] = currentToken;\n\n\tpromise\n\t\t.then( ( result ) => {\n\t\t\tif ( currentToken !== elementsCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! Array.isArray( result ) ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __( 'Could not validate elements.' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tformField.field?.isValid.elements &&\n\t\t\t\t! formField.field.isValid.elements.validate( item, {\n\t\t\t\t\t...formField.field,\n\t\t\t\t\telements: result,\n\t\t\t\t} )\n\t\t\t) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __(\n\t\t\t\t\t\t\t\t\t'Value must be one of the elements.'\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t// Validation passed so we need to remove `elements` from validity.\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\treturn removeValidationProperty(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t[ ...path, formField.id ],\n\t\t\t\t\t\t'elements'\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\t} )\n\t\t.catch( ( error ) => {\n\t\t\tif ( currentToken !== elementsCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'Unknown error when running elements validation asynchronously.'\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} );\n}\n\nfunction handleCustomValidationAsync< Item >(\n\tpromise: Promise< any >,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n) {\n\tconst { customCounterRef, setFormValidity, path } = promiseHandler;\n\tconst currentToken = ( customCounterRef.current[ formField.id ] || 0 ) + 1;\n\tcustomCounterRef.current[ formField.id ] = currentToken;\n\n\tpromise\n\t\t.then( ( result ) => {\n\t\t\tif ( currentToken !== customCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( result === null ) {\n\t\t\t\t// Validation passed so we need to remove `custom` from validity.\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\treturn removeValidationProperty(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t[ ...path, formField.id ],\n\t\t\t\t\t\t'custom'\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( typeof result === 'string' ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: result,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: __( 'Validation could not be processed.' ),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} )\n\t\t.catch( ( error ) => {\n\t\t\tif ( currentToken !== customCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'Unknown error when running custom validation asynchronously.'\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} );\n}\n\ntype PromiseHandler< Item > = {\n\tcustomCounterRef: React.MutableRefObject< Record< string, number > >;\n\telementsCounterRef: React.MutableRefObject< Record< string, number > >;\n\tsetFormValidity: React.Dispatch< React.SetStateAction< FormValidity > >;\n\tpath: string[];\n\titem: Item;\n};\n\nfunction validateFormField< Item >(\n\titem: Item,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n): FieldValidity | undefined {\n\t// Validate the field: isValid.required\n\tif (\n\t\tformField.field?.isValid.required &&\n\t\t! formField.field.isValid.required.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\trequired: { type: 'invalid' },\n\t\t};\n\t}\n\n\t// Validate the field: isValid.pattern\n\tif (\n\t\tformField.field?.isValid.pattern &&\n\t\t! formField.field.isValid.pattern.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tpattern: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value does not match the required pattern.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.min\n\tif (\n\t\tformField.field?.isValid.min &&\n\t\t! formField.field.isValid.min.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmin: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is below the minimum.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.max\n\tif (\n\t\tformField.field?.isValid.max &&\n\t\t! formField.field.isValid.max.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmax: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is above the maximum.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.minLength\n\tif (\n\t\tformField.field?.isValid.minLength &&\n\t\t! formField.field.isValid.minLength.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tminLength: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is too short.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.maxLength\n\tif (\n\t\tformField.field?.isValid.maxLength &&\n\t\t! formField.field.isValid.maxLength.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmaxLength: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is too long.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.elements (static)\n\tif (\n\t\tformField.field?.isValid.elements &&\n\t\tformField.field.hasElements &&\n\t\t! formField.field.getElements &&\n\t\tArray.isArray( formField.field.elements ) &&\n\t\t! formField.field.isValid.elements.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\telements: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value must be one of the elements.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.custom (sync)\n\tlet customError;\n\tif ( !! formField.field && formField.field.isValid.custom ) {\n\t\ttry {\n\t\t\tconst value = formField.field.getValue( { item } );\n\t\t\tcustomError = formField.field.isValid.custom(\n\t\t\t\tdeepMerge(\n\t\t\t\t\titem,\n\t\t\t\t\tformField.field.setValue( {\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t} ) as Partial< Item >\n\t\t\t\t),\n\t\t\t\tformField.field\n\t\t\t);\n\t\t} catch ( error ) {\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__( 'Unknown error when running custom validation.' );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcustom: {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tif ( typeof customError === 'string' ) {\n\t\treturn {\n\t\t\tcustom: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: customError,\n\t\t\t},\n\t\t};\n\t}\n\n\t// Aggregate async validations (`elements` and `custom`).\n\tconst fieldValidity: FieldValidity = {};\n\t// Validate the field: isValid.elements (async)\n\tif (\n\t\t!! formField.field &&\n\t\tformField.field.isValid.elements &&\n\t\tformField.field.hasElements &&\n\t\ttypeof formField.field.getElements === 'function'\n\t) {\n\t\thandleElementsValidationAsync(\n\t\t\tformField.field.getElements(),\n\t\t\tformField,\n\t\t\tpromiseHandler\n\t\t);\n\t\tfieldValidity.elements = {\n\t\t\ttype: 'validating',\n\t\t\tmessage: __( 'Validating\u2026' ),\n\t\t};\n\t}\n\n\t// Validate the field: isValid.custom (async)\n\tif ( customError instanceof Promise ) {\n\t\thandleCustomValidationAsync( customError, formField, promiseHandler );\n\n\t\tfieldValidity.custom = {\n\t\t\ttype: 'validating',\n\t\t\tmessage: __( 'Validating\u2026' ),\n\t\t};\n\t}\n\n\t// Return aggregated validations if any exist\n\tif ( Object.keys( fieldValidity ).length > 0 ) {\n\t\treturn fieldValidity;\n\t}\n\n\t// Validate its children.\n\tif ( formField.children.length > 0 ) {\n\t\tconst result: Record< string, FieldValidity | undefined > = {};\n\t\tformField.children.forEach( ( child ) => {\n\t\t\tresult[ child.id ] = validateFormField( item, child, {\n\t\t\t\t...promiseHandler,\n\t\t\t\tpath: [ ...promiseHandler.path, formField.id, 'children' ],\n\t\t\t} );\n\t\t} );\n\n\t\tconst filteredResult: Record< string, FieldValidity > = {};\n\t\tObject.entries( result ).forEach( ( [ key, value ] ) => {\n\t\t\tif ( value !== undefined ) {\n\t\t\t\tfilteredResult[ key ] = value;\n\t\t\t}\n\t\t} );\n\n\t\tif ( Object.keys( filteredResult ).length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tchildren: filteredResult,\n\t\t};\n\t}\n\n\t// No errors for this field or its children.\n\treturn undefined;\n}\n\nfunction getFormFieldValue< Item >(\n\tformField: FormFieldToValidate< Item >,\n\titem: Item\n): any {\n\tconst fieldValue = formField?.field?.getValue( { item } );\n\tif ( formField.children.length === 0 ) {\n\t\treturn fieldValue;\n\t}\n\n\tconst childrenValues = formField.children.map( ( child ) =>\n\t\tgetFormFieldValue( child, item )\n\t);\n\tif ( ! childrenValues ) {\n\t\treturn fieldValue;\n\t}\n\n\treturn {\n\t\tvalue: fieldValue,\n\t\tchildren: childrenValues,\n\t};\n}\n\n/**\n * Hook that validates a form item and returns an object with error messages for each field.\n *\n * @param item The item to validate.\n * @param fields Fields config.\n * @param form Form config.\n *\n * @return Record of field IDs to error messages (undefined means no error).\n */\nexport function useFormValidity< Item >(\n\titem: Item,\n\tfields: Field< Item >[],\n\tform: Form\n): { validity: FormValidity; isValid: boolean } {\n\tconst [ formValidity, setFormValidity ] = useState< FormValidity >();\n\tconst customCounterRef = useRef< Record< string, number > >( {} );\n\tconst elementsCounterRef = useRef< Record< string, number > >( {} );\n\tconst previousValuesRef = useRef< Record< string, any > >( {} );\n\n\tconst validate = useCallback( () => {\n\t\tconst promiseHandler = {\n\t\t\tcustomCounterRef,\n\t\t\telementsCounterRef,\n\t\t\tsetFormValidity,\n\t\t\tpath: [],\n\t\t\titem,\n\t\t};\n\n\t\tconst formFieldsToValidate = getFormFieldsToValidate( form, fields );\n\t\tif ( formFieldsToValidate.length === 0 ) {\n\t\t\tsetFormValidity( undefined );\n\t\t\treturn;\n\t\t}\n\n\t\tconst newFormValidity: FormValidity = {};\n\t\tconst untouchedFields: string[] = [];\n\t\tformFieldsToValidate.forEach( ( formField ) => {\n\t\t\t// Skip fields that did not change.\n\t\t\tconst value = getFormFieldValue< Item >( formField, item );\n\t\t\tif (\n\t\t\t\tpreviousValuesRef.current.hasOwnProperty( formField.id ) &&\n\t\t\t\tfastDeepEqual(\n\t\t\t\t\tpreviousValuesRef.current[ formField.id ],\n\t\t\t\t\tvalue\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tuntouchedFields.push( formField.id );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreviousValuesRef.current[ formField.id ] = value;\n\n\t\t\t// Calculate validity for those fields that changed.\n\t\t\tconst fieldValidity = validateFormField(\n\t\t\t\titem,\n\t\t\t\tformField,\n\t\t\t\tpromiseHandler\n\t\t\t);\n\t\t\tif ( fieldValidity !== undefined ) {\n\t\t\t\tnewFormValidity[ formField.id ] = fieldValidity;\n\t\t\t}\n\t\t} );\n\n\t\tsetFormValidity( ( existingFormValidity ) => {\n\t\t\tlet validity: FormValidity = {\n\t\t\t\t...existingFormValidity,\n\t\t\t\t...newFormValidity,\n\t\t\t};\n\n\t\t\tconst fieldsToKeep = [\n\t\t\t\t...untouchedFields,\n\t\t\t\t...Object.keys( newFormValidity ),\n\t\t\t];\n\t\t\tObject.keys( validity ).forEach( ( key ) => {\n\t\t\t\tif ( validity && ! fieldsToKeep.includes( key ) ) {\n\t\t\t\t\tdelete validity[ key ];\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( Object.keys( validity ).length === 0 ) {\n\t\t\t\tvalidity = undefined;\n\t\t\t}\n\n\t\t\tconst areEqual = fastDeepEqual( existingFormValidity, validity );\n\t\t\tif ( areEqual ) {\n\t\t\t\treturn existingFormValidity;\n\t\t\t}\n\n\t\t\treturn validity;\n\t\t} );\n\t}, [ item, fields, form ] );\n\n\tuseEffect( () => {\n\t\tvalidate();\n\t}, [ validate ] );\n\n\treturn {\n\t\tvalidity: formValidity,\n\t\tisValid: isFormValid( formValidity ),\n\t};\n}\n\nexport default useFormValidity;\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport deepMerge from 'deepmerge';\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * WordPress dependencies\n */\nimport { useCallback, useEffect, useRef, useState } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport normalizeFields from '../field-types';\nimport normalizeForm from '../components/dataform-layouts/normalize-form';\nimport type {\n\tField,\n\tFieldValidity,\n\tForm,\n\tFormValidity,\n\tNormalizedField,\n\tNormalizedFormField,\n} from '../types';\n\nfunction isFormValid( formValidity: FormValidity | undefined ): boolean {\n\tif ( ! formValidity ) {\n\t\treturn true;\n\t}\n\n\treturn Object.values( formValidity ).every( ( fieldValidation ) => {\n\t\treturn Object.entries( fieldValidation ).every(\n\t\t\t( [ key, validation ] ) => {\n\t\t\t\tif (\n\t\t\t\t\tkey === 'children' &&\n\t\t\t\t\tvalidation &&\n\t\t\t\t\ttypeof validation === 'object'\n\t\t\t\t) {\n\t\t\t\t\t// Recursively check children validations\n\t\t\t\t\treturn isFormValid( validation as FormValidity );\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\tvalidation.type !== 'invalid' &&\n\t\t\t\t\tvalidation.type !== 'validating'\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\t} );\n}\n\ntype FormFieldToValidate< Item > = {\n\tid: string;\n\tchildren: FormFieldToValidate< Item >[];\n\tfield?: NormalizedField< Item >;\n};\n\nfunction getFormFieldsToValidate< Item >(\n\tform: Form,\n\tfields: Field< Item >[]\n): FormFieldToValidate< Item >[] {\n\tconst normalizedForm = normalizeForm( form );\n\tif ( normalizedForm.fields.length === 0 ) {\n\t\treturn [];\n\t}\n\n\t// Create a map of field IDs to Field definitions for fast lookup\n\tconst fieldsMap = new Map< string, Field< Item > >();\n\tfields.forEach( ( field ) => {\n\t\tfieldsMap.set( field.id, field );\n\t} );\n\n\t// Recursive function to process form fields and their children\n\tfunction processFormField(\n\t\tformField: NormalizedFormField\n\t): FormFieldToValidate< Item > | null {\n\t\t// Handle combined fields (fields with children)\n\t\tif ( 'children' in formField && Array.isArray( formField.children ) ) {\n\t\t\tconst processedChildren = formField.children\n\t\t\t\t.map( processFormField )\n\t\t\t\t.filter( ( child ) => child !== null );\n\n\t\t\tif ( processedChildren.length === 0 ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst fieldDef = fieldsMap.get( formField.id );\n\t\t\tif ( fieldDef ) {\n\t\t\t\tconst [ normalizedField ] = normalizeFields< Item >( [\n\t\t\t\t\tfieldDef,\n\t\t\t\t] );\n\n\t\t\t\treturn {\n\t\t\t\t\tid: formField.id,\n\t\t\t\t\tchildren: processedChildren,\n\t\t\t\t\tfield: normalizedField,\n\t\t\t\t} satisfies FormFieldToValidate< Item >;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: formField.id,\n\t\t\t\tchildren: processedChildren,\n\t\t\t} satisfies FormFieldToValidate< Item >;\n\t\t}\n\n\t\t// Handle leaf fields (fields without children)\n\t\tconst fieldDef = fieldsMap.get( formField.id );\n\t\tif ( ! fieldDef ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst [ normalizedField ] = normalizeFields< Item >( [ fieldDef ] );\n\t\treturn {\n\t\t\tid: formField.id,\n\t\t\tchildren: [],\n\t\t\tfield: normalizedField,\n\t\t} as FormFieldToValidate< Item >;\n\t}\n\n\tconst toValidate = normalizedForm.fields\n\t\t.map( processFormField )\n\t\t.filter( ( field ) => field !== null );\n\n\treturn toValidate;\n}\n\nfunction setValidityAtPath(\n\tformValidity: FormValidity | undefined,\n\tfieldValidity: FieldValidity,\n\tpath: string[]\n): FormValidity {\n\t// Handle empty validity or empty path\n\tif ( ! formValidity ) {\n\t\tformValidity = {};\n\t}\n\n\tif ( path.length === 0 ) {\n\t\treturn formValidity;\n\t}\n\n\t// Clone the root to avoid mutations\n\tconst result = { ...formValidity };\n\n\t// Navigate through the result tree,\n\t// setting up empty paths if they don't exist.\n\tlet current: any = result;\n\tfor ( let i = 0; i < path.length - 1; i++ ) {\n\t\tconst segment = path[ i ];\n\t\tif ( ! current[ segment ] ) {\n\t\t\tcurrent[ segment ] = {};\n\t\t}\n\n\t\tcurrent[ segment ] = { ...current[ segment ] };\n\t\tcurrent = current[ segment ];\n\t}\n\n\t// At the final destination, merge the new validity with the existing.\n\tconst finalKey = path[ path.length - 1 ];\n\tcurrent[ finalKey ] = {\n\t\t...( current[ finalKey ] || {} ),\n\t\t...fieldValidity,\n\t};\n\n\treturn result;\n}\n\nfunction removeValidationProperty(\n\tformValidity: FormValidity | undefined,\n\tpath: string[],\n\tproperty: keyof FieldValidity\n): FormValidity | undefined {\n\tif ( ! formValidity || path.length === 0 ) {\n\t\treturn formValidity;\n\t}\n\tconst result = { ...formValidity };\n\t// Navigate to parent of target.\n\tlet current: any = result;\n\tfor ( let i = 0; i < path.length - 1; i++ ) {\n\t\tconst segment = path[ i ];\n\t\tif ( ! current[ segment ] ) {\n\t\t\treturn formValidity; // Path doesn't exist\n\t\t}\n\t\tcurrent[ segment ] = { ...current[ segment ] };\n\t\tcurrent = current[ segment ];\n\t}\n\tconst finalKey = path[ path.length - 1 ];\n\tif ( ! current[ finalKey ] ) {\n\t\treturn formValidity;\n\t}\n\tconst fieldValidity = { ...current[ finalKey ] };\n\tdelete fieldValidity[ property ];\n\t// If field has no more validations, remove it entirely.\n\tif ( Object.keys( fieldValidity ).length === 0 ) {\n\t\tdelete current[ finalKey ];\n\t} else {\n\t\t// Keep the field if it has other validations (including children).\n\t\tcurrent[ finalKey ] = fieldValidity;\n\t}\n\t// If root is empty, return undefined\n\tif ( Object.keys( result ).length === 0 ) {\n\t\treturn undefined;\n\t}\n\treturn result;\n}\n\nfunction handleElementsValidationAsync< Item >(\n\tpromise: Promise< any >,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n) {\n\tconst { elementsCounterRef, setFormValidity, path, item } = promiseHandler;\n\tconst currentToken =\n\t\t( elementsCounterRef.current[ formField.id ] || 0 ) + 1;\n\telementsCounterRef.current[ formField.id ] = currentToken;\n\n\tpromise\n\t\t.then( ( result ) => {\n\t\t\tif ( currentToken !== elementsCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! Array.isArray( result ) ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __( 'Could not validate elements.' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tformField.field?.isValid.elements &&\n\t\t\t\t! formField.field.isValid.elements.validate( item, {\n\t\t\t\t\t...formField.field,\n\t\t\t\t\telements: result,\n\t\t\t\t} )\n\t\t\t) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: __(\n\t\t\t\t\t\t\t\t\t'Value must be one of the elements.'\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t// Validation passed so we need to remove `elements` from validity.\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\treturn removeValidationProperty(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t[ ...path, formField.id ],\n\t\t\t\t\t\t'elements'\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\t\t} )\n\t\t.catch( ( error ) => {\n\t\t\tif ( currentToken !== elementsCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'Unknown error when running elements validation asynchronously.'\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\telements: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} );\n}\n\nfunction handleCustomValidationAsync< Item >(\n\tpromise: Promise< any >,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n) {\n\tconst { customCounterRef, setFormValidity, path } = promiseHandler;\n\tconst currentToken = ( customCounterRef.current[ formField.id ] || 0 ) + 1;\n\tcustomCounterRef.current[ formField.id ] = currentToken;\n\n\tpromise\n\t\t.then( ( result ) => {\n\t\t\tif ( currentToken !== customCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( result === null ) {\n\t\t\t\t// Validation passed so we need to remove `custom` from validity.\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\treturn removeValidationProperty(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t[ ...path, formField.id ],\n\t\t\t\t\t\t'custom'\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( typeof result === 'string' ) {\n\t\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\t\tprev,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\t\tmessage: result,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t\t);\n\t\t\t\t\treturn newFormValidity;\n\t\t\t\t} );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: __( 'Validation could not be processed.' ),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} )\n\t\t.catch( ( error ) => {\n\t\t\tif ( currentToken !== customCounterRef.current[ formField.id ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__(\n\t\t\t\t\t\t'Unknown error when running custom validation asynchronously.'\n\t\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetFormValidity( ( prev ) => {\n\t\t\t\tconst newFormValidity = setValidityAtPath(\n\t\t\t\t\tprev,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustom: {\n\t\t\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t[ ...path, formField.id ]\n\t\t\t\t);\n\t\t\t\treturn newFormValidity;\n\t\t\t} );\n\t\t} );\n}\n\ntype PromiseHandler< Item > = {\n\tcustomCounterRef: React.MutableRefObject< Record< string, number > >;\n\telementsCounterRef: React.MutableRefObject< Record< string, number > >;\n\tsetFormValidity: React.Dispatch< React.SetStateAction< FormValidity > >;\n\tpath: string[];\n\titem: Item;\n};\n\nfunction validateFormField< Item >(\n\titem: Item,\n\tformField: FormFieldToValidate< Item >,\n\tpromiseHandler: PromiseHandler< Item >\n): FieldValidity | undefined {\n\t// Validate the field: isValid.required\n\tif (\n\t\tformField.field?.isValid.required &&\n\t\t! formField.field.isValid.required.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\trequired: { type: 'invalid' },\n\t\t};\n\t}\n\n\t// Validate the field: isValid.pattern\n\tif (\n\t\tformField.field?.isValid.pattern &&\n\t\t! formField.field.isValid.pattern.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tpattern: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value does not match the required pattern.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.min\n\tif (\n\t\tformField.field?.isValid.min &&\n\t\t! formField.field.isValid.min.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmin: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is below the minimum.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.max\n\tif (\n\t\tformField.field?.isValid.max &&\n\t\t! formField.field.isValid.max.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmax: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is above the maximum.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.minLength\n\tif (\n\t\tformField.field?.isValid.minLength &&\n\t\t! formField.field.isValid.minLength.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tminLength: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is too short.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.maxLength\n\tif (\n\t\tformField.field?.isValid.maxLength &&\n\t\t! formField.field.isValid.maxLength.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\tmaxLength: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value is too long.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.elements (static)\n\tif (\n\t\tformField.field?.isValid.elements &&\n\t\tformField.field.hasElements &&\n\t\t! formField.field.getElements &&\n\t\tArray.isArray( formField.field.elements ) &&\n\t\t! formField.field.isValid.elements.validate( item, formField.field )\n\t) {\n\t\treturn {\n\t\t\telements: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: __( 'Value must be one of the elements.' ),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Validate the field: isValid.custom (sync)\n\tlet customError;\n\tif ( !! formField.field && formField.field.isValid.custom ) {\n\t\ttry {\n\t\t\tconst value = formField.field.getValue( { item } );\n\t\t\tcustomError = formField.field.isValid.custom(\n\t\t\t\tdeepMerge(\n\t\t\t\t\titem,\n\t\t\t\t\tformField.field.setValue( {\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t} ) as Partial< Item >\n\t\t\t\t),\n\t\t\t\tformField.field\n\t\t\t);\n\t\t} catch ( error ) {\n\t\t\tlet errorMessage;\n\t\t\tif ( error instanceof Error ) {\n\t\t\t\terrorMessage = error.message;\n\t\t\t} else {\n\t\t\t\terrorMessage =\n\t\t\t\t\tString( error ) ||\n\t\t\t\t\t__( 'Unknown error when running custom validation.' );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcustom: {\n\t\t\t\t\ttype: 'invalid',\n\t\t\t\t\tmessage: errorMessage,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tif ( typeof customError === 'string' ) {\n\t\treturn {\n\t\t\tcustom: {\n\t\t\t\ttype: 'invalid',\n\t\t\t\tmessage: customError,\n\t\t\t},\n\t\t};\n\t}\n\n\t// Aggregate async validations (`elements` and `custom`).\n\tconst fieldValidity: FieldValidity = {};\n\t// Validate the field: isValid.elements (async)\n\tif (\n\t\t!! formField.field &&\n\t\tformField.field.isValid.elements &&\n\t\tformField.field.hasElements &&\n\t\ttypeof formField.field.getElements === 'function'\n\t) {\n\t\thandleElementsValidationAsync(\n\t\t\tformField.field.getElements(),\n\t\t\tformField,\n\t\t\tpromiseHandler\n\t\t);\n\t\tfieldValidity.elements = {\n\t\t\ttype: 'validating',\n\t\t\tmessage: __( 'Validating…' ),\n\t\t};\n\t}\n\n\t// Validate the field: isValid.custom (async)\n\tif ( customError instanceof Promise ) {\n\t\thandleCustomValidationAsync( customError, formField, promiseHandler );\n\n\t\tfieldValidity.custom = {\n\t\t\ttype: 'validating',\n\t\t\tmessage: __( 'Validating…' ),\n\t\t};\n\t}\n\n\t// Return aggregated validations if any exist\n\tif ( Object.keys( fieldValidity ).length > 0 ) {\n\t\treturn fieldValidity;\n\t}\n\n\t// Validate its children.\n\tif ( formField.children.length > 0 ) {\n\t\tconst result: Record< string, FieldValidity | undefined > = {};\n\t\tformField.children.forEach( ( child ) => {\n\t\t\tresult[ child.id ] = validateFormField( item, child, {\n\t\t\t\t...promiseHandler,\n\t\t\t\tpath: [ ...promiseHandler.path, formField.id, 'children' ],\n\t\t\t} );\n\t\t} );\n\n\t\tconst filteredResult: Record< string, FieldValidity > = {};\n\t\tObject.entries( result ).forEach( ( [ key, value ] ) => {\n\t\t\tif ( value !== undefined ) {\n\t\t\t\tfilteredResult[ key ] = value;\n\t\t\t}\n\t\t} );\n\n\t\tif ( Object.keys( filteredResult ).length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tchildren: filteredResult,\n\t\t};\n\t}\n\n\t// No errors for this field or its children.\n\treturn undefined;\n}\n\nfunction getFormFieldValue< Item >(\n\tformField: FormFieldToValidate< Item >,\n\titem: Item\n): any {\n\tconst fieldValue = formField?.field?.getValue( { item } );\n\tif ( formField.children.length === 0 ) {\n\t\treturn fieldValue;\n\t}\n\n\tconst childrenValues = formField.children.map( ( child ) =>\n\t\tgetFormFieldValue( child, item )\n\t);\n\tif ( ! childrenValues ) {\n\t\treturn fieldValue;\n\t}\n\n\treturn {\n\t\tvalue: fieldValue,\n\t\tchildren: childrenValues,\n\t};\n}\n\n/**\n * Hook that validates a form item and returns an object with error messages for each field.\n *\n * @param item The item to validate.\n * @param fields Fields config.\n * @param form Form config.\n *\n * @return Record of field IDs to error messages (undefined means no error).\n */\nexport function useFormValidity< Item >(\n\titem: Item,\n\tfields: Field< Item >[],\n\tform: Form\n): { validity: FormValidity; isValid: boolean } {\n\tconst [ formValidity, setFormValidity ] = useState< FormValidity >();\n\tconst customCounterRef = useRef< Record< string, number > >( {} );\n\tconst elementsCounterRef = useRef< Record< string, number > >( {} );\n\tconst previousValuesRef = useRef< Record< string, any > >( {} );\n\n\tconst validate = useCallback( () => {\n\t\tconst promiseHandler = {\n\t\t\tcustomCounterRef,\n\t\t\telementsCounterRef,\n\t\t\tsetFormValidity,\n\t\t\tpath: [],\n\t\t\titem,\n\t\t};\n\n\t\tconst formFieldsToValidate = getFormFieldsToValidate( form, fields );\n\t\tif ( formFieldsToValidate.length === 0 ) {\n\t\t\tsetFormValidity( undefined );\n\t\t\treturn;\n\t\t}\n\n\t\tconst newFormValidity: FormValidity = {};\n\t\tconst untouchedFields: string[] = [];\n\t\tformFieldsToValidate.forEach( ( formField ) => {\n\t\t\t// Skip fields that did not change.\n\t\t\tconst value = getFormFieldValue< Item >( formField, item );\n\t\t\tif (\n\t\t\t\tpreviousValuesRef.current.hasOwnProperty( formField.id ) &&\n\t\t\t\tfastDeepEqual(\n\t\t\t\t\tpreviousValuesRef.current[ formField.id ],\n\t\t\t\t\tvalue\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tuntouchedFields.push( formField.id );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreviousValuesRef.current[ formField.id ] = value;\n\n\t\t\t// Calculate validity for those fields that changed.\n\t\t\tconst fieldValidity = validateFormField(\n\t\t\t\titem,\n\t\t\t\tformField,\n\t\t\t\tpromiseHandler\n\t\t\t);\n\t\t\tif ( fieldValidity !== undefined ) {\n\t\t\t\tnewFormValidity[ formField.id ] = fieldValidity;\n\t\t\t}\n\t\t} );\n\n\t\tsetFormValidity( ( existingFormValidity ) => {\n\t\t\tlet validity: FormValidity = {\n\t\t\t\t...existingFormValidity,\n\t\t\t\t...newFormValidity,\n\t\t\t};\n\n\t\t\tconst fieldsToKeep = [\n\t\t\t\t...untouchedFields,\n\t\t\t\t...Object.keys( newFormValidity ),\n\t\t\t];\n\t\t\tObject.keys( validity ).forEach( ( key ) => {\n\t\t\t\tif ( validity && ! fieldsToKeep.includes( key ) ) {\n\t\t\t\t\tdelete validity[ key ];\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( Object.keys( validity ).length === 0 ) {\n\t\t\t\tvalidity = undefined;\n\t\t\t}\n\n\t\t\tconst areEqual = fastDeepEqual( existingFormValidity, validity );\n\t\t\tif ( areEqual ) {\n\t\t\t\treturn existingFormValidity;\n\t\t\t}\n\n\t\t\treturn validity;\n\t\t} );\n\t}, [ item, fields, form ] );\n\n\tuseEffect( () => {\n\t\tvalidate();\n\t}, [ validate ] );\n\n\treturn {\n\t\tvalidity: formValidity,\n\t\tisValid: isFormValid( formValidity ),\n\t};\n}\n\nexport default useFormValidity;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fieldDef", "normalizedField"]
|
|
7
7
|
}
|