@payloadcms/ui 3.0.0-alpha.44 → 3.0.0-alpha.46
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/dist/elements/DocumentDrawer/DrawerContent.d.ts.map +1 -1
- package/dist/elements/DocumentDrawer/DrawerContent.js +6 -3
- package/dist/elements/DocumentDrawer/DrawerContent.js.map +1 -1
- package/dist/elements/TableColumns/buildColumns.d.ts.map +1 -1
- package/dist/elements/TableColumns/buildColumns.js +7 -6
- package/dist/elements/TableColumns/buildColumns.js.map +1 -1
- package/dist/elements/TableColumns/columnReducer.d.ts.map +1 -1
- package/dist/elements/TableColumns/columnReducer.js +26 -4
- package/dist/elements/TableColumns/columnReducer.js.map +1 -1
- package/dist/elements/TableColumns/index.js +1 -1
- package/dist/elements/TableColumns/index.js.map +1 -1
- package/dist/forms/Form/index.d.ts.map +1 -1
- package/dist/forms/Form/index.js +15 -15
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/forms/Form/types.d.ts +4 -2
- package/dist/forms/Form/types.d.ts.map +1 -1
- package/dist/forms/Form/types.js.map +1 -1
- package/dist/forms/fields/Array/index.d.ts.map +1 -1
- package/dist/forms/fields/Array/index.js +13 -11
- package/dist/forms/fields/Array/index.js.map +1 -1
- package/dist/forms/fields/Blocks/BlockRow.d.ts.map +1 -1
- package/dist/forms/fields/Blocks/BlockRow.js +1 -1
- package/dist/forms/fields/Blocks/BlockRow.js.map +1 -1
- package/dist/forms/fields/Blocks/index.d.ts.map +1 -1
- package/dist/forms/fields/Blocks/index.js +15 -11
- package/dist/forms/fields/Blocks/index.js.map +1 -1
- package/dist/forms/fields/Relationship/AddNew/index.d.ts.map +1 -1
- package/dist/forms/fields/Relationship/AddNew/index.js +4 -8
- package/dist/forms/fields/Relationship/AddNew/index.js.map +1 -1
- package/dist/prod/styles.css +1 -1
- package/dist/providers/Auth/index.d.ts.map +1 -1
- package/dist/providers/Auth/index.js +1 -1
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/templates/Default/index.scss +4 -2
- package/dist/templates/Minimal/index.scss +2 -0
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js +7 -1
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrawerContent.d.ts","sourceRoot":"","sources":["../../../src/elements/DocumentDrawer/DrawerContent.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAGvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"DrawerContent.d.ts","sourceRoot":"","sources":["../../../src/elements/DocumentDrawer/DrawerContent.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAGvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAqKrD,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAwB/D,CAAA"}
|
|
@@ -8,6 +8,7 @@ import { FieldPathProvider, useFieldPath } from '../../forms/FieldPathProvider/i
|
|
|
8
8
|
import { useRelatedCollections } from '../../forms/fields/Relationship/AddNew/useRelatedCollections.js';
|
|
9
9
|
import usePayloadAPI from '../../hooks/usePayloadAPI.js';
|
|
10
10
|
import { X } from '../../icons/X/index.js';
|
|
11
|
+
import { useAuth } from '../../index.js';
|
|
11
12
|
import { useComponentMap } from '../../providers/ComponentMapProvider/index.js';
|
|
12
13
|
import { useConfig } from '../../providers/Config/index.js';
|
|
13
14
|
import { DocumentInfoProvider } from '../../providers/DocumentInfo/index.js';
|
|
@@ -32,7 +33,7 @@ const Content = ({ id, Header, collectionSlug, drawerSlug, onSave })=>{
|
|
|
32
33
|
const [collectionConfig] = useRelatedCollections(collectionSlug);
|
|
33
34
|
const { formQueryParams } = useFormQueryParams();
|
|
34
35
|
const formattedQueryParams = queryString.stringify(formQueryParams);
|
|
35
|
-
const {
|
|
36
|
+
const { permissions } = useAuth();
|
|
36
37
|
const { schemaPath } = useFieldPath();
|
|
37
38
|
const { componentMap } = useComponentMap();
|
|
38
39
|
const { Edit } = componentMap[`${collectionSlug ? 'collections' : 'globals'}`][collectionSlug];
|
|
@@ -103,6 +104,7 @@ const Content = ({ id, Header, collectionSlug, drawerSlug, onSave })=>{
|
|
|
103
104
|
if (!initialState || isLoadingDocument) {
|
|
104
105
|
return /*#__PURE__*/ React.createElement(LoadingOverlay, null);
|
|
105
106
|
}
|
|
107
|
+
const docPermissions = permissions?.collections[collectionSlug];
|
|
106
108
|
return /*#__PURE__*/ React.createElement(DocumentInfoProvider, {
|
|
107
109
|
BeforeDocument: /*#__PURE__*/ React.createElement(Gutter, {
|
|
108
110
|
className: `${baseClass}__header`
|
|
@@ -125,11 +127,12 @@ const Content = ({ id, Header, collectionSlug, drawerSlug, onSave })=>{
|
|
|
125
127
|
collectionSlug: collectionConfig.slug,
|
|
126
128
|
disableActions: true,
|
|
127
129
|
disableLeaveWithoutSaving: true,
|
|
130
|
+
docPermissions: docPermissions,
|
|
131
|
+
hasSavePermission: docPermissions?.update?.permission,
|
|
128
132
|
// isLoading,
|
|
129
133
|
id: id,
|
|
130
134
|
initialData: data,
|
|
131
135
|
initialState: initialState,
|
|
132
|
-
// hasSavePermission={hasSavePermission}
|
|
133
136
|
isEditing: isEditing,
|
|
134
137
|
// me: true,
|
|
135
138
|
onSave: onSave
|
|
@@ -143,7 +146,7 @@ export const DocumentDrawerContent = (props)=>{
|
|
|
143
146
|
const { id: idFromProps, collectionSlug, onSave: onSaveFromProps } = props;
|
|
144
147
|
const [collectionConfig] = useRelatedCollections(collectionSlug);
|
|
145
148
|
const [id, setId] = useState(idFromProps);
|
|
146
|
-
const onSave = useCallback(
|
|
149
|
+
const onSave = useCallback((args)=>{
|
|
147
150
|
setId(args.doc.id);
|
|
148
151
|
if (typeof onSaveFromProps === 'function') {
|
|
149
152
|
void onSaveFromProps({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/DocumentDrawer/DrawerContent.tsx"],"sourcesContent":["'use client'\n\nimport type { FormState } from 'payload/types'\n\nimport * as facelessUIImport from '@faceless-ui/modal'\nimport { getTranslation } from '@payloadcms/translations'\nimport queryString from 'qs'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { toast } from 'react-toastify'\n\nimport type { DocumentDrawerProps } from './types.js'\n\nimport { FieldPathProvider, useFieldPath } from '../../forms/FieldPathProvider/index.js'\nimport { useRelatedCollections } from '../../forms/fields/Relationship/AddNew/useRelatedCollections.js'\nimport usePayloadAPI from '../../hooks/usePayloadAPI.js'\nimport { X } from '../../icons/X/index.js'\nimport { useComponentMap } from '../../providers/ComponentMapProvider/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { DocumentInfoProvider } from '../../providers/DocumentInfo/index.js'\nimport { useFormQueryParams } from '../../providers/FormQueryParams/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { getFormState } from '../../utilities/getFormState.js'\nimport { Gutter } from '../Gutter/index.js'\nimport IDLabel from '../IDLabel/index.js'\nimport { LoadingOverlay } from '../Loading/index.js'\nimport { baseClass } from './index.js'\n\nconst Content: React.FC<DocumentDrawerProps> = ({\n id,\n Header,\n collectionSlug,\n drawerSlug,\n onSave,\n}) => {\n const { useModal } = facelessUIImport\n\n const config = useConfig()\n\n const {\n routes: { api: apiRoute },\n serverURL,\n } = config\n\n const { closeModal, modalState, toggleModal } = useModal()\n const locale = useLocale()\n const [initialState, setInitialState] = useState<FormState>()\n const { i18n, t } = useTranslation()\n const hasInitializedState = useRef(false)\n const [isOpen, setIsOpen] = useState(false)\n const [collectionConfig] = useRelatedCollections(collectionSlug)\n const { formQueryParams } = useFormQueryParams()\n const formattedQueryParams = queryString.stringify(formQueryParams)\n\n const { fields: fieldsFromConfig } = collectionConfig\n\n const { schemaPath } = useFieldPath()\n\n const { componentMap } = useComponentMap()\n\n const { Edit } = componentMap[`${collectionSlug ? 'collections' : 'globals'}`][collectionSlug]\n\n // no need to an additional requests when creating new documents\n const initialID = useRef(id)\n\n const [{ data, isError, isLoading: isLoadingDocument }] = usePayloadAPI(\n initialID.current ? `${serverURL}${apiRoute}/${collectionSlug}/${initialID.current}` : null,\n { initialParams: { depth: 0, draft: 'true', 'fallback-locale': 'null' } },\n )\n\n useEffect(() => {\n setIsOpen(Boolean(modalState[drawerSlug]?.isOpen))\n }, [modalState, drawerSlug])\n\n useEffect(() => {\n if (isOpen && !isLoadingDocument && isError) {\n closeModal(drawerSlug)\n toast.error(data.errors?.[0].message || t('error:unspecific'))\n }\n }, [isError, t, isOpen, data, drawerSlug, closeModal, isLoadingDocument])\n\n const isEditing = Boolean(id)\n\n const apiURL = id ? `${serverURL}${apiRoute}/${collectionSlug}/${id}?locale=${locale.code}` : null\n\n const action = `${serverURL}${apiRoute}/${collectionSlug}${\n isEditing ? `/${id}` : ''\n }?${formattedQueryParams}`\n\n // const hasSavePermission =\n // (isEditing && docPermissions?.update?.permission) ||\n // (!isEditing && (docPermissions as CollectionPermission)?.create?.permission)\n\n useEffect(() => {\n if (!hasInitializedState.current && (!initialID.current || (initialID.current && data))) {\n const getInitialState = async () => {\n const result = await getFormState({\n apiRoute,\n body: {\n id,\n collectionSlug,\n data: data || {},\n operation: isEditing ? 'update' : 'create',\n schemaPath,\n },\n serverURL,\n })\n\n setInitialState(result)\n hasInitializedState.current = true\n }\n\n void getInitialState()\n }\n }, [apiRoute, data, id, isEditing, schemaPath, serverURL, collectionSlug])\n\n if (isError) return null\n\n if (!initialState || isLoadingDocument) {\n return <LoadingOverlay />\n }\n\n return (\n <DocumentInfoProvider\n BeforeDocument={\n <Gutter className={`${baseClass}__header`}>\n <div className={`${baseClass}__header-content`}>\n <h2 className={`${baseClass}__header-text`}>\n {Header ||\n t(!id ? 'fields:addNewLabel' : 'general:editLabel', {\n label: getTranslation(collectionConfig.labels.singular, i18n),\n })}\n </h2>\n {/* TODO: the `button` HTML element breaks CSS transitions on the drawer for some reason...\n i.e. changing to a `div` element will fix the animation issue but will break accessibility\n */}\n <button\n aria-label={t('general:close')}\n className={`${baseClass}__header-close`}\n onClick={() => toggleModal(drawerSlug)}\n type=\"button\"\n >\n <X />\n </button>\n </div>\n {id && <IDLabel id={id.toString()} />}\n </Gutter>\n }\n action={action}\n apiURL={apiURL}\n collectionSlug={collectionConfig.slug}\n disableActions\n disableLeaveWithoutSaving\n // isLoading,\n id={id}\n initialData={data}\n initialState={initialState}\n // hasSavePermission={hasSavePermission}\n isEditing={isEditing}\n // me: true,\n onSave={onSave}\n >\n {Edit}\n </DocumentInfoProvider>\n )\n}\n\n// First provide the document context using `DocumentInfoProvider`\n// this is so we can utilize the `useDocumentInfo` hook in the `Content` component\n// this drawer is used for both creating and editing documents\n// this means that the `id` may be unknown until the document is created\nexport const DocumentDrawerContent: React.FC<DocumentDrawerProps> = (props) => {\n const { id: idFromProps, collectionSlug, onSave: onSaveFromProps } = props\n const [collectionConfig] = useRelatedCollections(collectionSlug)\n const [id, setId] = useState<null | number | string>(idFromProps)\n\n const onSave = useCallback<DocumentDrawerProps['onSave']>(\n async (args) => {\n setId(args.doc.id)\n\n if (typeof onSaveFromProps === 'function') {\n void onSaveFromProps({\n ...args,\n collectionConfig,\n })\n }\n },\n [onSaveFromProps, collectionConfig],\n )\n\n return (\n <FieldPathProvider path=\"\" schemaPath={collectionSlug}>\n <Content {...props} id={id} onSave={onSave} />\n </FieldPathProvider>\n )\n}\n"],"names":["facelessUIImport","getTranslation","queryString","React","useCallback","useEffect","useRef","useState","toast","FieldPathProvider","useFieldPath","useRelatedCollections","usePayloadAPI","X","useComponentMap","useConfig","DocumentInfoProvider","useFormQueryParams","useLocale","useTranslation","getFormState","Gutter","IDLabel","LoadingOverlay","baseClass","Content","id","Header","collectionSlug","drawerSlug","onSave","useModal","config","routes","api","apiRoute","serverURL","closeModal","modalState","toggleModal","locale","initialState","setInitialState","i18n","t","hasInitializedState","isOpen","setIsOpen","collectionConfig","formQueryParams","formattedQueryParams","stringify","fields","fieldsFromConfig","schemaPath","componentMap","Edit","initialID","data","isError","isLoading","isLoadingDocument","current","initialParams","depth","draft","Boolean","error","errors","message","isEditing","apiURL","code","action","getInitialState","result","body","operation","BeforeDocument","className","div","h2","label","labels","singular","button","aria-label","onClick","type","toString","slug","disableActions","disableLeaveWithoutSaving","initialData","DocumentDrawerContent","props","idFromProps","onSaveFromProps","setId","args","doc","path"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/DocumentDrawer/DrawerContent.tsx"],"sourcesContent":["'use client'\n\nimport type { FormState } from 'payload/types'\n\nimport * as facelessUIImport from '@faceless-ui/modal'\nimport { getTranslation } from '@payloadcms/translations'\nimport queryString from 'qs'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { toast } from 'react-toastify'\n\nimport type { DocumentDrawerProps } from './types.js'\n\nimport { FieldPathProvider, useFieldPath } from '../../forms/FieldPathProvider/index.js'\nimport { useRelatedCollections } from '../../forms/fields/Relationship/AddNew/useRelatedCollections.js'\nimport usePayloadAPI from '../../hooks/usePayloadAPI.js'\nimport { X } from '../../icons/X/index.js'\nimport { useAuth } from '../../index.js'\nimport { useComponentMap } from '../../providers/ComponentMapProvider/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { DocumentInfoProvider } from '../../providers/DocumentInfo/index.js'\nimport { useFormQueryParams } from '../../providers/FormQueryParams/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { getFormState } from '../../utilities/getFormState.js'\nimport { Gutter } from '../Gutter/index.js'\nimport IDLabel from '../IDLabel/index.js'\nimport { LoadingOverlay } from '../Loading/index.js'\nimport { baseClass } from './index.js'\n\nconst Content: React.FC<DocumentDrawerProps> = ({\n id,\n Header,\n collectionSlug,\n drawerSlug,\n onSave,\n}) => {\n const { useModal } = facelessUIImport\n\n const config = useConfig()\n\n const {\n routes: { api: apiRoute },\n serverURL,\n } = config\n\n const { closeModal, modalState, toggleModal } = useModal()\n const locale = useLocale()\n const [initialState, setInitialState] = useState<FormState>()\n const { i18n, t } = useTranslation()\n const hasInitializedState = useRef(false)\n const [isOpen, setIsOpen] = useState(false)\n const [collectionConfig] = useRelatedCollections(collectionSlug)\n const { formQueryParams } = useFormQueryParams()\n const formattedQueryParams = queryString.stringify(formQueryParams)\n\n const { permissions } = useAuth()\n\n const { schemaPath } = useFieldPath()\n\n const { componentMap } = useComponentMap()\n\n const { Edit } = componentMap[`${collectionSlug ? 'collections' : 'globals'}`][collectionSlug]\n\n // no need to an additional requests when creating new documents\n const initialID = useRef(id)\n\n const [{ data, isError, isLoading: isLoadingDocument }] = usePayloadAPI(\n initialID.current ? `${serverURL}${apiRoute}/${collectionSlug}/${initialID.current}` : null,\n { initialParams: { depth: 0, draft: 'true', 'fallback-locale': 'null' } },\n )\n\n useEffect(() => {\n setIsOpen(Boolean(modalState[drawerSlug]?.isOpen))\n }, [modalState, drawerSlug])\n\n useEffect(() => {\n if (isOpen && !isLoadingDocument && isError) {\n closeModal(drawerSlug)\n toast.error(data.errors?.[0].message || t('error:unspecific'))\n }\n }, [isError, t, isOpen, data, drawerSlug, closeModal, isLoadingDocument])\n\n const isEditing = Boolean(id)\n\n const apiURL = id ? `${serverURL}${apiRoute}/${collectionSlug}/${id}?locale=${locale.code}` : null\n\n const action = `${serverURL}${apiRoute}/${collectionSlug}${\n isEditing ? `/${id}` : ''\n }?${formattedQueryParams}`\n\n // const hasSavePermission =\n // (isEditing && docPermissions?.update?.permission) ||\n // (!isEditing && (docPermissions as CollectionPermission)?.create?.permission)\n\n useEffect(() => {\n if (!hasInitializedState.current && (!initialID.current || (initialID.current && data))) {\n const getInitialState = async () => {\n const result = await getFormState({\n apiRoute,\n body: {\n id,\n collectionSlug,\n data: data || {},\n operation: isEditing ? 'update' : 'create',\n schemaPath,\n },\n serverURL,\n })\n\n setInitialState(result)\n hasInitializedState.current = true\n }\n\n void getInitialState()\n }\n }, [apiRoute, data, id, isEditing, schemaPath, serverURL, collectionSlug])\n\n if (isError) return null\n\n if (!initialState || isLoadingDocument) {\n return <LoadingOverlay />\n }\n\n const docPermissions = permissions?.collections[collectionSlug]\n\n return (\n <DocumentInfoProvider\n BeforeDocument={\n <Gutter className={`${baseClass}__header`}>\n <div className={`${baseClass}__header-content`}>\n <h2 className={`${baseClass}__header-text`}>\n {Header ||\n t(!id ? 'fields:addNewLabel' : 'general:editLabel', {\n label: getTranslation(collectionConfig.labels.singular, i18n),\n })}\n </h2>\n {/* TODO: the `button` HTML element breaks CSS transitions on the drawer for some reason...\n i.e. changing to a `div` element will fix the animation issue but will break accessibility\n */}\n <button\n aria-label={t('general:close')}\n className={`${baseClass}__header-close`}\n onClick={() => toggleModal(drawerSlug)}\n type=\"button\"\n >\n <X />\n </button>\n </div>\n {id && <IDLabel id={id.toString()} />}\n </Gutter>\n }\n action={action}\n apiURL={apiURL}\n collectionSlug={collectionConfig.slug}\n disableActions\n disableLeaveWithoutSaving\n docPermissions={docPermissions}\n hasSavePermission={docPermissions?.update?.permission}\n // isLoading,\n id={id}\n initialData={data}\n initialState={initialState}\n isEditing={isEditing}\n // me: true,\n onSave={onSave}\n >\n {Edit}\n </DocumentInfoProvider>\n )\n}\n\n// First provide the document context using `DocumentInfoProvider`\n// this is so we can utilize the `useDocumentInfo` hook in the `Content` component\n// this drawer is used for both creating and editing documents\n// this means that the `id` may be unknown until the document is created\nexport const DocumentDrawerContent: React.FC<DocumentDrawerProps> = (props) => {\n const { id: idFromProps, collectionSlug, onSave: onSaveFromProps } = props\n const [collectionConfig] = useRelatedCollections(collectionSlug)\n const [id, setId] = useState<null | number | string>(idFromProps)\n\n const onSave = useCallback<DocumentDrawerProps['onSave']>(\n (args) => {\n setId(args.doc.id)\n\n if (typeof onSaveFromProps === 'function') {\n void onSaveFromProps({\n ...args,\n collectionConfig,\n })\n }\n },\n [onSaveFromProps, collectionConfig],\n )\n\n return (\n <FieldPathProvider path=\"\" schemaPath={collectionSlug}>\n <Content {...props} id={id} onSave={onSave} />\n </FieldPathProvider>\n )\n}\n"],"names":["facelessUIImport","getTranslation","queryString","React","useCallback","useEffect","useRef","useState","toast","FieldPathProvider","useFieldPath","useRelatedCollections","usePayloadAPI","X","useAuth","useComponentMap","useConfig","DocumentInfoProvider","useFormQueryParams","useLocale","useTranslation","getFormState","Gutter","IDLabel","LoadingOverlay","baseClass","Content","id","Header","collectionSlug","drawerSlug","onSave","useModal","config","routes","api","apiRoute","serverURL","closeModal","modalState","toggleModal","locale","initialState","setInitialState","i18n","t","hasInitializedState","isOpen","setIsOpen","collectionConfig","formQueryParams","formattedQueryParams","stringify","permissions","schemaPath","componentMap","Edit","initialID","data","isError","isLoading","isLoadingDocument","current","initialParams","depth","draft","Boolean","error","errors","message","isEditing","apiURL","code","action","getInitialState","result","body","operation","docPermissions","collections","BeforeDocument","className","div","h2","label","labels","singular","button","aria-label","onClick","type","toString","slug","disableActions","disableLeaveWithoutSaving","hasSavePermission","update","permission","initialData","DocumentDrawerContent","props","idFromProps","onSaveFromProps","setId","args","doc","path"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildColumns.d.ts","sourceRoot":"","sources":["../../../src/elements/TableColumns/buildColumns.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAIzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK/C,eAAO,MAAM,YAAY,SAAU;IACjC,SAAS,EAAE,QAAQ,SAAS,CAAC,EAAE,CAAA;IAC/B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAA;CAC7D,KAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"buildColumns.d.ts","sourceRoot":"","sources":["../../../src/elements/TableColumns/buildColumns.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAIzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAK/C,eAAO,MAAM,YAAY,SAAU;IACjC,SAAS,EAAE,QAAQ,SAAS,CAAC,EAAE,CAAA;IAC/B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAA;CAC7D,KAAG,MAAM,EA+ET,CAAA"}
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { SelectAll } from '../SelectAll/index.js';
|
|
3
3
|
import { SelectRow } from '../SelectRow/index.js';
|
|
4
4
|
export const buildColumns = (args)=>{
|
|
5
|
-
const { cellProps, columnPreferences, defaultColumns, enableRowSelections, fieldMap
|
|
5
|
+
const { cellProps, columnPreferences, defaultColumns, enableRowSelections, fieldMap } = args;
|
|
6
6
|
let sortedFieldMap = fieldMap;
|
|
7
7
|
const sortTo = defaultColumns || columnPreferences;
|
|
8
8
|
if (sortTo) {
|
|
@@ -17,7 +17,7 @@ export const buildColumns = (args)=>{
|
|
|
17
17
|
return aIndex - bIndex;
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
const activeColumnsIndices = [];
|
|
21
21
|
const sorted = sortedFieldMap.reduce((acc, field, index)=>{
|
|
22
22
|
const columnPreference = columnPreferences?.find((preference)=>preference.accessor === field.name);
|
|
23
23
|
let active = false;
|
|
@@ -25,12 +25,13 @@ export const buildColumns = (args)=>{
|
|
|
25
25
|
active = columnPreference.active;
|
|
26
26
|
} else if (defaultColumns && Array.isArray(defaultColumns) && defaultColumns.length > 0) {
|
|
27
27
|
active = defaultColumns.includes(field.name);
|
|
28
|
-
} else if (
|
|
28
|
+
} else if (activeColumnsIndices.length < 4) {
|
|
29
29
|
active = true;
|
|
30
30
|
}
|
|
31
|
-
if (active) {
|
|
32
|
-
|
|
31
|
+
if (active && !activeColumnsIndices.includes(index)) {
|
|
32
|
+
activeColumnsIndices.push(index);
|
|
33
33
|
}
|
|
34
|
+
const isFirstActiveColumn = activeColumnsIndices[0] === index;
|
|
34
35
|
if (field) {
|
|
35
36
|
const column = {
|
|
36
37
|
name: field.name,
|
|
@@ -38,7 +39,7 @@ export const buildColumns = (args)=>{
|
|
|
38
39
|
active,
|
|
39
40
|
cellProps: {
|
|
40
41
|
...cellProps?.[index],
|
|
41
|
-
link:
|
|
42
|
+
link: isFirstActiveColumn
|
|
42
43
|
},
|
|
43
44
|
components: {
|
|
44
45
|
Cell: field.Cell,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/TableColumns/buildColumns.tsx"],"sourcesContent":["import type { CellProps, SanitizedCollectionConfig } from 'payload/types'\n\nimport React from 'react'\n\nimport type { ColumnPreferences } from '../../providers/ListInfo/types.js'\nimport type { FieldMap } from '../../utilities/buildComponentMap/types.js'\nimport type { Column } from '../Table/types.js'\n\nimport { SelectAll } from '../SelectAll/index.js'\nimport { SelectRow } from '../SelectRow/index.js'\n\nexport const buildColumns = (args: {\n cellProps: Partial<CellProps>[]\n columnPreferences: ColumnPreferences\n defaultColumns?: string[]\n enableRowSelections: boolean\n fieldMap: FieldMap\n useAsTitle: SanitizedCollectionConfig['admin']['useAsTitle']\n}): Column[] => {\n const {
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/TableColumns/buildColumns.tsx"],"sourcesContent":["import type { CellProps, SanitizedCollectionConfig } from 'payload/types'\n\nimport React from 'react'\n\nimport type { ColumnPreferences } from '../../providers/ListInfo/types.js'\nimport type { FieldMap } from '../../utilities/buildComponentMap/types.js'\nimport type { Column } from '../Table/types.js'\n\nimport { SelectAll } from '../SelectAll/index.js'\nimport { SelectRow } from '../SelectRow/index.js'\n\nexport const buildColumns = (args: {\n cellProps: Partial<CellProps>[]\n columnPreferences: ColumnPreferences\n defaultColumns?: string[]\n enableRowSelections: boolean\n fieldMap: FieldMap\n useAsTitle: SanitizedCollectionConfig['admin']['useAsTitle']\n}): Column[] => {\n const { cellProps, columnPreferences, defaultColumns, enableRowSelections, fieldMap } = args\n\n let sortedFieldMap = fieldMap\n\n const sortTo = defaultColumns || columnPreferences\n\n if (sortTo) {\n // sort the fields to the order of `defaultColumns` or `columnPreferences`\n // TODO: flatten top level field, i.e. `flattenTopLevelField()` from `payload` but that is typed for `Field`, not `fieldMap`\n sortedFieldMap = fieldMap.sort((a, b) => {\n const aIndex = sortTo.findIndex((column) => column.accessor === a.name)\n const bIndex = sortTo.findIndex((column) => column.accessor === b.name)\n if (aIndex === -1 && bIndex === -1) return 0\n if (aIndex === -1) return 1\n if (bIndex === -1) return -1\n return aIndex - bIndex\n })\n }\n\n const activeColumnsIndices = []\n\n const sorted = sortedFieldMap.reduce((acc, field, index) => {\n const columnPreference = columnPreferences?.find(\n (preference) => preference.accessor === field.name,\n )\n\n let active = false\n\n if (columnPreference) {\n active = columnPreference.active\n } else if (defaultColumns && Array.isArray(defaultColumns) && defaultColumns.length > 0) {\n active = defaultColumns.includes(field.name)\n } else if (activeColumnsIndices.length < 4) {\n active = true\n }\n\n if (active && !activeColumnsIndices.includes(index)) {\n activeColumnsIndices.push(index)\n }\n\n const isFirstActiveColumn = activeColumnsIndices[0] === index\n\n if (field) {\n const column: Column = {\n name: field.name,\n accessor: field.name,\n active,\n cellProps: {\n ...cellProps?.[index],\n link: isFirstActiveColumn,\n },\n components: {\n Cell: field.Cell,\n Heading: field.Heading,\n },\n label: field.label,\n }\n\n acc.push(column)\n }\n\n return acc\n }, [])\n\n if (enableRowSelections) {\n sorted.unshift({\n name: '',\n accessor: '_select',\n active: true,\n components: {\n Cell: <SelectRow />,\n Heading: <SelectAll />,\n },\n label: null,\n })\n }\n\n return sorted\n}\n"],"names":["React","SelectAll","SelectRow","buildColumns","args","cellProps","columnPreferences","defaultColumns","enableRowSelections","fieldMap","sortedFieldMap","sortTo","sort","a","b","aIndex","findIndex","column","accessor","name","bIndex","activeColumnsIndices","sorted","reduce","acc","field","index","columnPreference","find","preference","active","Array","isArray","length","includes","push","isFirstActiveColumn","link","components","Cell","Heading","label","unshift"],"mappings":"AAEA,OAAOA,WAAW,QAAO;AAMzB,SAASC,SAAS,QAAQ,wBAAuB;AACjD,SAASC,SAAS,QAAQ,wBAAuB;AAEjD,OAAO,MAAMC,eAAe,CAACC;IAQ3B,MAAM,EAAEC,SAAS,EAAEC,iBAAiB,EAAEC,cAAc,EAAEC,mBAAmB,EAAEC,QAAQ,EAAE,GAAGL;IAExF,IAAIM,iBAAiBD;IAErB,MAAME,SAASJ,kBAAkBD;IAEjC,IAAIK,QAAQ;QACV,0EAA0E;QAC1E,4HAA4H;QAC5HD,iBAAiBD,SAASG,IAAI,CAAC,CAACC,GAAGC;YACjC,MAAMC,SAASJ,OAAOK,SAAS,CAAC,CAACC,SAAWA,OAAOC,QAAQ,KAAKL,EAAEM,IAAI;YACtE,MAAMC,SAAST,OAAOK,SAAS,CAAC,CAACC,SAAWA,OAAOC,QAAQ,KAAKJ,EAAEK,IAAI;YACtE,IAAIJ,WAAW,CAAC,KAAKK,WAAW,CAAC,GAAG,OAAO;YAC3C,IAAIL,WAAW,CAAC,GAAG,OAAO;YAC1B,IAAIK,WAAW,CAAC,GAAG,OAAO,CAAC;YAC3B,OAAOL,SAASK;QAClB;IACF;IAEA,MAAMC,uBAAuB,EAAE;IAE/B,MAAMC,SAASZ,eAAea,MAAM,CAAC,CAACC,KAAKC,OAAOC;QAChD,MAAMC,mBAAmBrB,mBAAmBsB,KAC1C,CAACC,aAAeA,WAAWX,QAAQ,KAAKO,MAAMN,IAAI;QAGpD,IAAIW,SAAS;QAEb,IAAIH,kBAAkB;YACpBG,SAASH,iBAAiBG,MAAM;QAClC,OAAO,IAAIvB,kBAAkBwB,MAAMC,OAAO,CAACzB,mBAAmBA,eAAe0B,MAAM,GAAG,GAAG;YACvFH,SAASvB,eAAe2B,QAAQ,CAACT,MAAMN,IAAI;QAC7C,OAAO,IAAIE,qBAAqBY,MAAM,GAAG,GAAG;YAC1CH,SAAS;QACX;QAEA,IAAIA,UAAU,CAACT,qBAAqBa,QAAQ,CAACR,QAAQ;YACnDL,qBAAqBc,IAAI,CAACT;QAC5B;QAEA,MAAMU,sBAAsBf,oBAAoB,CAAC,EAAE,KAAKK;QAExD,IAAID,OAAO;YACT,MAAMR,SAAiB;gBACrBE,MAAMM,MAAMN,IAAI;gBAChBD,UAAUO,MAAMN,IAAI;gBACpBW;gBACAzB,WAAW;oBACT,GAAGA,WAAW,CAACqB,MAAM;oBACrBW,MAAMD;gBACR;gBACAE,YAAY;oBACVC,MAAMd,MAAMc,IAAI;oBAChBC,SAASf,MAAMe,OAAO;gBACxB;gBACAC,OAAOhB,MAAMgB,KAAK;YACpB;YAEAjB,IAAIW,IAAI,CAAClB;QACX;QAEA,OAAOO;IACT,GAAG,EAAE;IAEL,IAAIhB,qBAAqB;QACvBc,OAAOoB,OAAO,CAAC;YACbvB,MAAM;YACND,UAAU;YACVY,QAAQ;YACRQ,YAAY;gBACVC,oBAAM,oBAACrC;gBACPsC,uBAAS,oBAACvC;YACZ;YACAwC,OAAO;QACT;IACF;IAEA,OAAOnB;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnReducer.d.ts","sourceRoot":"","sources":["../../../src/elements/TableColumns/columnReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,KAAK,GAAG,GAAG;IACT,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,EAAE,CAAA;KAClB,CAAA;IACD,IAAI,EAAE,KAAK,CAAA;CACZ,CAAA;AAED,KAAK,IAAI,GAAG;IACV,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,MAAM,CAAA;AAExC,eAAO,MAAM,aAAa,UAAW,MAAM,EAAE,UAAU,MAAM,KAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"columnReducer.d.ts","sourceRoot":"","sources":["../../../src/elements/TableColumns/columnReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,KAAK,GAAG,GAAG;IACT,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,EAAE,CAAA;KAClB,CAAA;IACD,IAAI,EAAE,KAAK,CAAA;CACZ,CAAA;AAED,KAAK,IAAI,GAAG;IACV,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,MAAM,CAAA;AAExC,eAAO,MAAM,aAAa,UAAW,MAAM,EAAE,UAAU,MAAM,KAAG,MAAM,EAyDrE,CAAA"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export const columnReducer = (state, action)=>{
|
|
2
|
+
let newState = [
|
|
3
|
+
...state
|
|
4
|
+
];
|
|
2
5
|
switch(action.type){
|
|
3
6
|
case 'toggle':
|
|
4
7
|
{
|
|
@@ -12,7 +15,8 @@ export const columnReducer = (state, action)=>{
|
|
|
12
15
|
}
|
|
13
16
|
return col;
|
|
14
17
|
});
|
|
15
|
-
|
|
18
|
+
newState = withToggledColumn;
|
|
19
|
+
break;
|
|
16
20
|
}
|
|
17
21
|
case 'move':
|
|
18
22
|
{
|
|
@@ -22,16 +26,34 @@ export const columnReducer = (state, action)=>{
|
|
|
22
26
|
];
|
|
23
27
|
const [columnToMove] = withMovedColumn.splice(fromIndex, 1);
|
|
24
28
|
withMovedColumn.splice(toIndex, 0, columnToMove);
|
|
25
|
-
|
|
29
|
+
newState = withMovedColumn;
|
|
30
|
+
break;
|
|
26
31
|
}
|
|
27
32
|
case 'set':
|
|
28
33
|
{
|
|
29
34
|
const { columns } = action.payload;
|
|
30
|
-
|
|
35
|
+
newState = columns;
|
|
36
|
+
break;
|
|
31
37
|
}
|
|
32
38
|
default:
|
|
33
|
-
|
|
39
|
+
break;
|
|
34
40
|
}
|
|
41
|
+
const firstActiveColumnIndex = newState.findIndex((column, index)=>{
|
|
42
|
+
if (column.active && column.accessor !== '_select') {
|
|
43
|
+
return index;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
const withFirstLink = newState.map((column, index)=>{
|
|
47
|
+
const isFirstActiveColumn = column.active && firstActiveColumnIndex === index;
|
|
48
|
+
return {
|
|
49
|
+
...column,
|
|
50
|
+
cellProps: {
|
|
51
|
+
...column.cellProps,
|
|
52
|
+
link: isFirstActiveColumn
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}, []);
|
|
56
|
+
return withFirstLink;
|
|
35
57
|
};
|
|
36
58
|
|
|
37
59
|
//# sourceMappingURL=columnReducer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/TableColumns/columnReducer.ts"],"sourcesContent":["import type { Column } from '../Table/types.js'\n\ntype TOGGLE = {\n payload: {\n column: string\n }\n type: 'toggle'\n}\n\ntype SET = {\n payload: {\n columns: Column[]\n }\n type: 'set'\n}\n\ntype MOVE = {\n payload: {\n fromIndex: number\n toIndex: number\n }\n type: 'move'\n}\n\nexport type Action = MOVE | SET | TOGGLE\n\nexport const columnReducer = (state: Column[], action: Action): Column[] => {\n switch (action.type) {\n case 'toggle': {\n const { column } = action.payload\n\n const withToggledColumn = state.map((col) => {\n if (col?.name === column) {\n return {\n ...col,\n active: !col.active,\n }\n }\n\n return col\n })\n\n
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/TableColumns/columnReducer.ts"],"sourcesContent":["import type { Column } from '../Table/types.js'\n\ntype TOGGLE = {\n payload: {\n column: string\n }\n type: 'toggle'\n}\n\ntype SET = {\n payload: {\n columns: Column[]\n }\n type: 'set'\n}\n\ntype MOVE = {\n payload: {\n fromIndex: number\n toIndex: number\n }\n type: 'move'\n}\n\nexport type Action = MOVE | SET | TOGGLE\n\nexport const columnReducer = (state: Column[], action: Action): Column[] => {\n let newState = [...state]\n\n switch (action.type) {\n case 'toggle': {\n const { column } = action.payload\n\n const withToggledColumn = state.map((col) => {\n if (col?.name === column) {\n return {\n ...col,\n active: !col.active,\n }\n }\n\n return col\n })\n\n newState = withToggledColumn\n break\n }\n case 'move': {\n const { fromIndex, toIndex } = action.payload\n const withMovedColumn = [...state]\n const [columnToMove] = withMovedColumn.splice(fromIndex, 1)\n withMovedColumn.splice(toIndex, 0, columnToMove)\n newState = withMovedColumn\n break\n }\n case 'set': {\n const { columns } = action.payload\n newState = columns\n break\n }\n default:\n break\n }\n\n const firstActiveColumnIndex = newState.findIndex((column, index) => {\n if (column.active && column.accessor !== '_select') {\n return index\n }\n })\n\n const withFirstLink = newState.map((column, index) => {\n const isFirstActiveColumn = column.active && firstActiveColumnIndex === index\n\n return {\n ...column,\n cellProps: {\n ...column.cellProps,\n link: isFirstActiveColumn,\n },\n }\n }, [])\n\n return withFirstLink\n}\n"],"names":["columnReducer","state","action","newState","type","column","payload","withToggledColumn","map","col","name","active","fromIndex","toIndex","withMovedColumn","columnToMove","splice","columns","firstActiveColumnIndex","findIndex","index","accessor","withFirstLink","isFirstActiveColumn","cellProps","link"],"mappings":"AA0BA,OAAO,MAAMA,gBAAgB,CAACC,OAAiBC;IAC7C,IAAIC,WAAW;WAAIF;KAAM;IAEzB,OAAQC,OAAOE,IAAI;QACjB,KAAK;YAAU;gBACb,MAAM,EAAEC,MAAM,EAAE,GAAGH,OAAOI,OAAO;gBAEjC,MAAMC,oBAAoBN,MAAMO,GAAG,CAAC,CAACC;oBACnC,IAAIA,KAAKC,SAASL,QAAQ;wBACxB,OAAO;4BACL,GAAGI,GAAG;4BACNE,QAAQ,CAACF,IAAIE,MAAM;wBACrB;oBACF;oBAEA,OAAOF;gBACT;gBAEAN,WAAWI;gBACX;YACF;QACA,KAAK;YAAQ;gBACX,MAAM,EAAEK,SAAS,EAAEC,OAAO,EAAE,GAAGX,OAAOI,OAAO;gBAC7C,MAAMQ,kBAAkB;uBAAIb;iBAAM;gBAClC,MAAM,CAACc,aAAa,GAAGD,gBAAgBE,MAAM,CAACJ,WAAW;gBACzDE,gBAAgBE,MAAM,CAACH,SAAS,GAAGE;gBACnCZ,WAAWW;gBACX;YACF;QACA,KAAK;YAAO;gBACV,MAAM,EAAEG,OAAO,EAAE,GAAGf,OAAOI,OAAO;gBAClCH,WAAWc;gBACX;YACF;QACA;YACE;IACJ;IAEA,MAAMC,yBAAyBf,SAASgB,SAAS,CAAC,CAACd,QAAQe;QACzD,IAAIf,OAAOM,MAAM,IAAIN,OAAOgB,QAAQ,KAAK,WAAW;YAClD,OAAOD;QACT;IACF;IAEA,MAAME,gBAAgBnB,SAASK,GAAG,CAAC,CAACH,QAAQe;QAC1C,MAAMG,sBAAsBlB,OAAOM,MAAM,IAAIO,2BAA2BE;QAExE,OAAO;YACL,GAAGf,MAAM;YACTmB,WAAW;gBACT,GAAGnB,OAAOmB,SAAS;gBACnBC,MAAMF;YACR;QACF;IACF,GAAG,EAAE;IAEL,OAAOD;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/TableColumns/index.tsx"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig } from 'payload/types'\nimport type { CellProps } from 'payload/types'\n\nimport React, { createContext, useCallback, useContext, useEffect, useReducer, useRef } from 'react'\n\nimport type { ColumnPreferences } from '../../providers/ListInfo/types.js'\nimport type { Column } from '../Table/types.js'\nimport type { Action } from './columnReducer.js'\n\nimport { useComponentMap } from '../../providers/ComponentMapProvider/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { buildColumns } from './buildColumns.js'\nimport { columnReducer } from './columnReducer.js'\n\nexport interface ITableColumns {\n columns: Column[]\n dispatchTableColumns: React.Dispatch<Action>\n moveColumn: (args: { fromIndex: number; toIndex: number }) => void\n setActiveColumns: (columns: string[]) => void\n toggleColumn: (column: string) => void\n}\n\nexport const TableColumnContext = createContext<ITableColumns>({} as ITableColumns)\n\nexport const useTableColumns = (): ITableColumns => useContext(TableColumnContext)\n\nexport type ListPreferences = {\n columns: ColumnPreferences\n}\n\nexport const TableColumnsProvider: React.FC<{\n cellProps?: Partial<CellProps>[]\n children: React.ReactNode\n collectionSlug: string\n enableRowSelections?: boolean\n listPreferences: ListPreferences\n}> = ({ cellProps, children, collectionSlug, enableRowSelections = false, listPreferences }) => {\n const config = useConfig()\n\n const { componentMap } = useComponentMap()\n\n const { fieldMap } = componentMap.collections[collectionSlug]\n\n const collectionConfig = config.collections.find(\n (collectionConfig) => collectionConfig.slug === collectionSlug,\n )\n\n const {\n admin: { defaultColumns, useAsTitle },\n } = collectionConfig\n\n const preferenceKey = `${collectionSlug}-list`\n const prevCollection = useRef<SanitizedCollectionConfig['slug']>(collectionSlug)\n const hasInitialized = useRef(false)\n const { getPreference, setPreference } = usePreferences()\n\n const [tableColumns, dispatchTableColumns] = useReducer(columnReducer, {}, () => {\n return buildColumns({\n cellProps,\n columnPreferences: listPreferences?.columns,\n defaultColumns,\n enableRowSelections,\n fieldMap,\n useAsTitle,\n })\n })\n\n // /////////////////////////////////////\n // Get preferences on collection change\n // /////////////////////////////////////\n\n useEffect(() => {\n const sync = async () => {\n const collectionHasChanged = prevCollection.current !== collectionSlug\n\n if (collectionHasChanged) {\n const currentPreferences = await getPreference<{\n columns: ColumnPreferences\n }>(preferenceKey)\n prevCollection.current = collectionSlug\n\n if (currentPreferences.columns) {\n dispatchTableColumns({\n type: 'set',\n payload: {\n columns: buildColumns({\n cellProps,\n columnPreferences: currentPreferences?.columns,\n defaultColumns,\n enableRowSelections: true,\n fieldMap,\n useAsTitle,\n }),\n },\n })\n }\n }\n }\n\n sync()\n }, [\n preferenceKey,\n getPreference,\n collectionSlug,\n fieldMap,\n cellProps,\n defaultColumns,\n useAsTitle,\n ])\n\n // /////////////////////////////////////\n // Set preferences on column change\n // /////////////////////////////////////\n\n useEffect(() => {\n if (!hasInitialized.current) {\n hasInitialized.current = true\n return\n }\n\n const columns = tableColumns.map((c) => ({\n accessor: c?.accessor,\n active: c?.active,\n }))\n\n void setPreference(preferenceKey, { columns }, true)\n }, [tableColumns, preferenceKey, setPreference])\n\n const setActiveColumns = useCallback(\n (columns: string[]) => {\n // dispatchTableColumns({\n // type: 'set',\n // payload: {\n // // onSelect,\n // cellProps,\n // collection: { ...collectionConfig, fields: formatFields(collectionConfig) },\n // columns: columns.map((column) => ({\n // accessor: column,\n // active: true,\n // })),\n // i18n,\n // },\n // })\n },\n [collectionConfig, cellProps],\n )\n\n const moveColumn = useCallback(\n (args: { fromIndex: number; toIndex: number }) => {\n const { fromIndex, toIndex } = args\n\n dispatchTableColumns({\n type: 'move',\n payload: {\n fromIndex,\n toIndex,\n },\n })\n },\n [dispatchTableColumns],\n )\n\n const toggleColumn = useCallback(\n (column: string) => {\n dispatchTableColumns({\n type: 'toggle',\n payload: {\n column,\n },\n })\n },\n [dispatchTableColumns],\n )\n\n return (\n <TableColumnContext.Provider\n value={{\n columns: tableColumns,\n dispatchTableColumns,\n moveColumn,\n setActiveColumns,\n toggleColumn,\n }}\n >\n {children}\n </TableColumnContext.Provider>\n )\n}\n"],"names":["React","createContext","useCallback","useContext","useEffect","useReducer","useRef","useComponentMap","useConfig","usePreferences","buildColumns","columnReducer","TableColumnContext","useTableColumns","TableColumnsProvider","cellProps","children","collectionSlug","enableRowSelections","listPreferences","config","componentMap","fieldMap","collections","collectionConfig","find","slug","admin","defaultColumns","useAsTitle","preferenceKey","prevCollection","hasInitialized","getPreference","setPreference","tableColumns","dispatchTableColumns","columnPreferences","columns","sync","collectionHasChanged","current","currentPreferences","type","payload","map","c","accessor","active","setActiveColumns","moveColumn","args","fromIndex","toIndex","toggleColumn","column","Provider","value"],"mappings":"AAAA;AAIA,OAAOA,SAASC,aAAa,EAAEC,WAAW,EAAEC,UAAU,EAAEC,SAAS,EAAEC,UAAU,EAAEC,MAAM,QAAQ,QAAO;AAMpG,SAASC,eAAe,QAAQ,gDAA+C;AAC/E,SAASC,SAAS,QAAQ,kCAAiC;AAC3D,SAASC,cAAc,QAAQ,uCAAsC;AACrE,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,aAAa,QAAQ,qBAAoB;AAUlD,OAAO,MAAMC,mCAAqBX,cAA6B,CAAC,GAAmB;AAEnF,OAAO,MAAMY,kBAAkB,IAAqBV,WAAWS,oBAAmB;AAMlF,OAAO,MAAME,uBAMR,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,cAAc,EAAEC,sBAAsB,KAAK,EAAEC,eAAe,EAAE;IACzF,MAAMC,SAASZ;IAEf,MAAM,EAAEa,YAAY,EAAE,GAAGd;IAEzB,MAAM,EAAEe,QAAQ,EAAE,GAAGD,aAAaE,WAAW,CAACN,eAAe;IAE7D,MAAMO,mBAAmBJ,OAAOG,WAAW,CAACE,IAAI,CAC9C,CAACD,mBAAqBA,iBAAiBE,IAAI,KAAKT;IAGlD,MAAM,EACJU,OAAO,EAAEC,cAAc,EAAEC,UAAU,EAAE,EACtC,GAAGL;IAEJ,MAAMM,gBAAgB,CAAC,EAAEb,eAAe,KAAK,CAAC;IAC9C,MAAMc,iBAAiBzB,OAA0CW;IACjE,MAAMe,iBAAiB1B,OAAO;IAC9B,MAAM,EAAE2B,aAAa,EAAEC,aAAa,EAAE,GAAGzB;IAEzC,MAAM,CAAC0B,cAAcC,qBAAqB,GAAG/B,WAAWM,eAAe,CAAC,GAAG;QACzE,OAAOD,aAAa;YAClBK;YACAsB,mBAAmBlB,iBAAiBmB;YACpCV;YACAV;YACAI;YACAO;QACF;IACF;IAEA,wCAAwC;IACxC,uCAAuC;IACvC,wCAAwC;IAExCzB,UAAU;QACR,MAAMmC,OAAO;YACX,MAAMC,uBAAuBT,eAAeU,OAAO,KAAKxB;YAExD,IAAIuB,sBAAsB;gBACxB,MAAME,qBAAqB,MAAMT,cAE9BH;gBACHC,eAAeU,OAAO,GAAGxB;gBAEzB,IAAIyB,mBAAmBJ,OAAO,EAAE;oBAC9BF,qBAAqB;wBACnBO,MAAM;wBACNC,SAAS;4BACPN,SAAS5B,aAAa;gCACpBK;gCACAsB,mBAAmBK,oBAAoBJ;gCACvCV;gCACAV,qBAAqB;gCACrBI;gCACAO;4BACF;wBACF;oBACF;gBACF;YACF;QACF;
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/TableColumns/index.tsx"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig } from 'payload/types'\nimport type { CellProps } from 'payload/types'\n\nimport React, { createContext, useCallback, useContext, useEffect, useReducer, useRef } from 'react'\n\nimport type { ColumnPreferences } from '../../providers/ListInfo/types.js'\nimport type { Column } from '../Table/types.js'\nimport type { Action } from './columnReducer.js'\n\nimport { useComponentMap } from '../../providers/ComponentMapProvider/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { buildColumns } from './buildColumns.js'\nimport { columnReducer } from './columnReducer.js'\n\nexport interface ITableColumns {\n columns: Column[]\n dispatchTableColumns: React.Dispatch<Action>\n moveColumn: (args: { fromIndex: number; toIndex: number }) => void\n setActiveColumns: (columns: string[]) => void\n toggleColumn: (column: string) => void\n}\n\nexport const TableColumnContext = createContext<ITableColumns>({} as ITableColumns)\n\nexport const useTableColumns = (): ITableColumns => useContext(TableColumnContext)\n\nexport type ListPreferences = {\n columns: ColumnPreferences\n}\n\nexport const TableColumnsProvider: React.FC<{\n cellProps?: Partial<CellProps>[]\n children: React.ReactNode\n collectionSlug: string\n enableRowSelections?: boolean\n listPreferences: ListPreferences\n}> = ({ cellProps, children, collectionSlug, enableRowSelections = false, listPreferences }) => {\n const config = useConfig()\n\n const { componentMap } = useComponentMap()\n\n const { fieldMap } = componentMap.collections[collectionSlug]\n\n const collectionConfig = config.collections.find(\n (collectionConfig) => collectionConfig.slug === collectionSlug,\n )\n\n const {\n admin: { defaultColumns, useAsTitle },\n } = collectionConfig\n\n const preferenceKey = `${collectionSlug}-list`\n const prevCollection = useRef<SanitizedCollectionConfig['slug']>(collectionSlug)\n const hasInitialized = useRef(false)\n const { getPreference, setPreference } = usePreferences()\n\n const [tableColumns, dispatchTableColumns] = useReducer(columnReducer, {}, () => {\n return buildColumns({\n cellProps,\n columnPreferences: listPreferences?.columns,\n defaultColumns,\n enableRowSelections,\n fieldMap,\n useAsTitle,\n })\n })\n\n // /////////////////////////////////////\n // Get preferences on collection change\n // /////////////////////////////////////\n\n useEffect(() => {\n const sync = async () => {\n const collectionHasChanged = prevCollection.current !== collectionSlug\n\n if (collectionHasChanged) {\n const currentPreferences = await getPreference<{\n columns: ColumnPreferences\n }>(preferenceKey)\n prevCollection.current = collectionSlug\n\n if (currentPreferences.columns) {\n dispatchTableColumns({\n type: 'set',\n payload: {\n columns: buildColumns({\n cellProps,\n columnPreferences: currentPreferences?.columns,\n defaultColumns,\n enableRowSelections: true,\n fieldMap,\n useAsTitle,\n }),\n },\n })\n }\n }\n }\n\n void sync()\n }, [\n preferenceKey,\n getPreference,\n collectionSlug,\n fieldMap,\n cellProps,\n defaultColumns,\n useAsTitle,\n ])\n\n // /////////////////////////////////////\n // Set preferences on column change\n // /////////////////////////////////////\n\n useEffect(() => {\n if (!hasInitialized.current) {\n hasInitialized.current = true\n return\n }\n\n const columns = tableColumns.map((c) => ({\n accessor: c?.accessor,\n active: c?.active,\n }))\n\n void setPreference(preferenceKey, { columns }, true)\n }, [tableColumns, preferenceKey, setPreference])\n\n const setActiveColumns = useCallback(\n (columns: string[]) => {\n // dispatchTableColumns({\n // type: 'set',\n // payload: {\n // // onSelect,\n // cellProps,\n // collection: { ...collectionConfig, fields: formatFields(collectionConfig) },\n // columns: columns.map((column) => ({\n // accessor: column,\n // active: true,\n // })),\n // i18n,\n // },\n // })\n },\n [collectionConfig, cellProps],\n )\n\n const moveColumn = useCallback(\n (args: { fromIndex: number; toIndex: number }) => {\n const { fromIndex, toIndex } = args\n\n dispatchTableColumns({\n type: 'move',\n payload: {\n fromIndex,\n toIndex,\n },\n })\n },\n [dispatchTableColumns],\n )\n\n const toggleColumn = useCallback(\n (column: string) => {\n dispatchTableColumns({\n type: 'toggle',\n payload: {\n column,\n },\n })\n },\n [dispatchTableColumns],\n )\n\n return (\n <TableColumnContext.Provider\n value={{\n columns: tableColumns,\n dispatchTableColumns,\n moveColumn,\n setActiveColumns,\n toggleColumn,\n }}\n >\n {children}\n </TableColumnContext.Provider>\n )\n}\n"],"names":["React","createContext","useCallback","useContext","useEffect","useReducer","useRef","useComponentMap","useConfig","usePreferences","buildColumns","columnReducer","TableColumnContext","useTableColumns","TableColumnsProvider","cellProps","children","collectionSlug","enableRowSelections","listPreferences","config","componentMap","fieldMap","collections","collectionConfig","find","slug","admin","defaultColumns","useAsTitle","preferenceKey","prevCollection","hasInitialized","getPreference","setPreference","tableColumns","dispatchTableColumns","columnPreferences","columns","sync","collectionHasChanged","current","currentPreferences","type","payload","map","c","accessor","active","setActiveColumns","moveColumn","args","fromIndex","toIndex","toggleColumn","column","Provider","value"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/Form/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAA+D,MAAM,OAAO,CAAA;AAGnF,OAAO,KAAK,EAA6C,KAAK,EAAiB,MAAM,YAAY,CAAA;AA+BjG,QAAA,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/Form/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAA+D,MAAM,OAAO,CAAA;AAGnF,OAAO,KAAK,EAA6C,KAAK,EAAiB,MAAM,YAAY,CAAA;AA+BjG,QAAA,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAgiBzB,CAAA;AAGD,eAAe,IAAI,CAAA"}
|
package/dist/forms/Form/index.js
CHANGED
|
@@ -27,10 +27,10 @@ import { mergeServerFormState } from './mergeServerFormState.js';
|
|
|
27
27
|
import reduceFieldsToValues from './reduceFieldsToValues.js';
|
|
28
28
|
const baseClass = 'form';
|
|
29
29
|
const Form = (props)=>{
|
|
30
|
-
const { id, collectionSlug,
|
|
30
|
+
const { id, collectionSlug, globalSlug } = useDocumentInfo();
|
|
31
31
|
const { action, children, className, disableSuccessStatus, disabled, // fields: fieldsFromProps = collection?.fields || global?.fields,
|
|
32
32
|
beforeSubmit, handleResponse, initialState, onChange, onSubmit, onSuccess, redirect, submitted: submittedFromProps, uuid, waitForAutocomplete } = props;
|
|
33
|
-
const method = 'method' in props ? props
|
|
33
|
+
const method = 'method' in props ? props?.method : undefined;
|
|
34
34
|
const router = useRouter();
|
|
35
35
|
const { code: locale } = useLocale();
|
|
36
36
|
const { i18n, t } = useTranslation();
|
|
@@ -174,6 +174,7 @@ const Form = (props)=>{
|
|
|
174
174
|
setProcessing(false);
|
|
175
175
|
const contentType = res.headers.get('content-type');
|
|
176
176
|
const isJSON = contentType && contentType.indexOf('application/json') !== -1;
|
|
177
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
177
178
|
let json = {};
|
|
178
179
|
if (isJSON) json = await res.json();
|
|
179
180
|
if (res.status < 400) {
|
|
@@ -269,6 +270,7 @@ const Form = (props)=>{
|
|
|
269
270
|
const getData = useCallback(()=>reduceFieldsToValues(contextRef.current.fields, true), []);
|
|
270
271
|
const getSiblingData = useCallback((path)=>getSiblingDataFunc(contextRef.current.fields, path), []);
|
|
271
272
|
const getDataByPath = useCallback((path)=>getDataByPathFunc(contextRef.current.fields, path), []);
|
|
273
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
272
274
|
const createFormData = useCallback((overrides = {})=>{
|
|
273
275
|
const data = reduceFieldsToValues(contextRef.current.fields, true);
|
|
274
276
|
const file = data?.file;
|
|
@@ -332,17 +334,14 @@ const Form = (props)=>{
|
|
|
332
334
|
}, [
|
|
333
335
|
dispatchFields
|
|
334
336
|
]);
|
|
335
|
-
const
|
|
337
|
+
const getFieldStateBySchemaPath = useCallback(async ({ data, schemaPath })=>{
|
|
336
338
|
const fieldSchema = await getFormState({
|
|
337
339
|
apiRoute,
|
|
338
340
|
body: {
|
|
339
341
|
collectionSlug,
|
|
340
342
|
data,
|
|
341
343
|
globalSlug,
|
|
342
|
-
|
|
343
|
-
Turns: 'arrayField.0.group123field.arrayField.0.textField'
|
|
344
|
-
Into: 'arrayField.group123field.arrayField.textField'
|
|
345
|
-
*/ schemaPath: `${collectionSlug || globalSlug}.${path}`.replace(/\.\d+\./g, '.')
|
|
344
|
+
schemaPath
|
|
346
345
|
},
|
|
347
346
|
serverURL
|
|
348
347
|
});
|
|
@@ -353,10 +352,10 @@ const Form = (props)=>{
|
|
|
353
352
|
globalSlug,
|
|
354
353
|
serverURL
|
|
355
354
|
]);
|
|
356
|
-
const addFieldRow = useCallback(async ({ data, path, rowIndex })=>{
|
|
357
|
-
const subFieldState = await
|
|
355
|
+
const addFieldRow = useCallback(async ({ data, path, rowIndex, schemaPath })=>{
|
|
356
|
+
const subFieldState = await getFieldStateBySchemaPath({
|
|
358
357
|
data,
|
|
359
|
-
|
|
358
|
+
schemaPath
|
|
360
359
|
});
|
|
361
360
|
dispatchFields({
|
|
362
361
|
type: 'ADD_ROW',
|
|
@@ -366,7 +365,7 @@ const Form = (props)=>{
|
|
|
366
365
|
subFieldState
|
|
367
366
|
});
|
|
368
367
|
}, [
|
|
369
|
-
|
|
368
|
+
getFieldStateBySchemaPath,
|
|
370
369
|
dispatchFields
|
|
371
370
|
]);
|
|
372
371
|
const removeFieldRow = useCallback(({ path, rowIndex })=>{
|
|
@@ -378,10 +377,10 @@ const Form = (props)=>{
|
|
|
378
377
|
}, [
|
|
379
378
|
dispatchFields
|
|
380
379
|
]);
|
|
381
|
-
const replaceFieldRow = useCallback(async ({ data, path, rowIndex })=>{
|
|
382
|
-
const subFieldState = await
|
|
380
|
+
const replaceFieldRow = useCallback(async ({ data, path, rowIndex, schemaPath })=>{
|
|
381
|
+
const subFieldState = await getFieldStateBySchemaPath({
|
|
383
382
|
data,
|
|
384
|
-
|
|
383
|
+
schemaPath
|
|
385
384
|
});
|
|
386
385
|
dispatchFields({
|
|
387
386
|
type: 'REPLACE_ROW',
|
|
@@ -391,7 +390,7 @@ const Form = (props)=>{
|
|
|
391
390
|
subFieldState
|
|
392
391
|
});
|
|
393
392
|
}, [
|
|
394
|
-
|
|
393
|
+
getFieldStateBySchemaPath,
|
|
395
394
|
dispatchFields
|
|
396
395
|
]);
|
|
397
396
|
contextRef.current.submit = submit;
|
|
@@ -506,6 +505,7 @@ const Form = (props)=>{
|
|
|
506
505
|
value: fieldsReducer
|
|
507
506
|
}, children)))))));
|
|
508
507
|
};
|
|
508
|
+
// eslint-disable-next-line no-restricted-exports
|
|
509
509
|
export default Form;
|
|
510
510
|
|
|
511
511
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/forms/Form/index.tsx"],"sourcesContent":["'use client'\nimport type { Field, FormState } from 'payload/types'\n\n/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\nimport isDeepEqual from 'deep-equal'\nimport { useRouter } from 'next/navigation.js'\nimport { serialize } from 'object-to-formdata'\nimport { wait } from 'payload/utilities'\nimport QueryString from 'qs'\nimport React, { useCallback, useEffect, useReducer, useRef, useState } from 'react'\nimport { toast } from 'react-toastify'\n\nimport type { Context as FormContextType, GetDataByPath, Props, SubmitOptions } from './types.js'\n\nimport { useDebouncedEffect } from '../../hooks/useDebouncedEffect.js'\nimport useThrottledEffect from '../../hooks/useThrottledEffect.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useFormQueryParams } from '../../providers/FormQueryParams/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useOperation } from '../../providers/OperationProvider/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { getFormState } from '../../utilities/getFormState.js'\nimport {\n FormContext,\n FormFieldsContext,\n FormWatchContext,\n ModifiedContext,\n ProcessingContext,\n SubmittedContext,\n} from './context.js'\nimport errorMessages from './errorMessages.js'\nimport { fieldReducer } from './fieldReducer.js'\nimport getDataByPathFunc from './getDataByPath.js'\nimport getSiblingDataFunc from './getSiblingData.js'\nimport initContextState from './initContextState.js'\nimport { mergeServerFormState } from './mergeServerFormState.js'\nimport reduceFieldsToValues from './reduceFieldsToValues.js'\n\nconst baseClass = 'form'\n\nconst Form: React.FC<Props> = (props) => {\n const { id, collectionSlug, getDocPreferences, globalSlug } = useDocumentInfo()\n\n const {\n action,\n children,\n className,\n disableSuccessStatus,\n disabled,\n // fields: fieldsFromProps = collection?.fields || global?.fields,\n beforeSubmit,\n handleResponse,\n initialState, // fully formed initial field state\n onChange,\n onSubmit,\n onSuccess,\n redirect,\n submitted: submittedFromProps,\n uuid,\n waitForAutocomplete,\n } = props\n\n const method = 'method' in props ? props.method : undefined\n\n const router = useRouter()\n\n const { code: locale } = useLocale()\n const { i18n, t } = useTranslation()\n const { refreshCookie, user } = useAuth()\n const operation = useOperation()\n const { formQueryParams } = useFormQueryParams()\n\n const config = useConfig()\n const {\n routes: { api: apiRoute },\n serverURL,\n } = config\n\n const [modified, setModified] = useState(false)\n const [processing, setProcessing] = useState(false)\n const [submitted, setSubmitted] = useState(false)\n const formRef = useRef<HTMLFormElement>(null)\n const contextRef = useRef({} as FormContextType)\n\n const fieldsReducer = useReducer(fieldReducer, {}, () => initialState)\n /**\n * `fields` is the current, up-to-date state/data of all fields in the form. It can be modified by using dispatchFields,\n * which calls the fieldReducer, which then updates the state.\n */\n const [fields, dispatchFields] = fieldsReducer\n\n contextRef.current.fields = fields\n\n const validateForm = useCallback(async () => {\n const validatedFieldState = {}\n let isValid = true\n\n const dataFromContext = contextRef.current.getData()\n const data = dataFromContext\n\n const validationPromises = Object.entries(contextRef.current.fields).map(\n async ([path, field]) => {\n const validatedField = {\n ...field,\n valid: true,\n }\n\n if (field.passesCondition !== false) {\n let validationResult: boolean | string = true\n\n if (typeof field.validate === 'function') {\n let valueToValidate = field.value\n\n if (field?.rows && Array.isArray(field.rows)) {\n valueToValidate = contextRef.current.getDataByPath(path)\n }\n\n validationResult = await field.validate(valueToValidate, {\n id,\n config,\n data,\n operation,\n siblingData: contextRef.current.getSiblingData(path),\n t,\n user,\n })\n }\n\n if (typeof validationResult === 'string') {\n validatedField.errorMessage = validationResult\n validatedField.valid = false\n isValid = false\n }\n }\n\n validatedFieldState[path] = validatedField\n },\n )\n\n await Promise.all(validationPromises)\n\n if (!isDeepEqual(contextRef.current.fields, validatedFieldState)) {\n dispatchFields({ type: 'REPLACE_STATE', state: validatedFieldState })\n }\n\n return isValid\n }, [id, user, operation, t, dispatchFields, config])\n\n const submit = useCallback(\n async (options: SubmitOptions = {}, e): Promise<void> => {\n const {\n action: actionArg,\n method: methodToUse = method,\n overrides = {},\n skipValidation,\n } = options\n\n if (disabled) {\n if (e) {\n e.preventDefault()\n }\n return\n }\n\n if (e) {\n e.stopPropagation()\n e.preventDefault()\n }\n\n setProcessing(true)\n setSubmitted(true)\n\n if (waitForAutocomplete) await wait(100)\n\n // Execute server side validations\n if (Array.isArray(beforeSubmit)) {\n let revalidatedFormState: FormState\n\n await beforeSubmit.reduce(async (priorOnChange, beforeSubmitFn) => {\n await priorOnChange\n\n const result = await beforeSubmitFn({\n formState: fields,\n })\n\n revalidatedFormState = result\n }, Promise.resolve())\n\n const isValid = Object.entries(revalidatedFormState).every(([, field]) => field.valid)\n\n if (!isValid) {\n setProcessing(false)\n return dispatchFields({ type: 'REPLACE_STATE', state: revalidatedFormState })\n }\n }\n\n const isValid = skipValidation ? true : await contextRef.current.validateForm()\n\n // If not valid, prevent submission\n if (!isValid) {\n toast.error(t('error:correctInvalidFields'))\n setProcessing(false)\n\n return\n }\n\n // If submit handler comes through via props, run that\n if (onSubmit) {\n const data = {\n ...reduceFieldsToValues(fields, true),\n ...overrides,\n }\n\n onSubmit(fields, data)\n }\n\n const formData = contextRef.current.createFormData(overrides)\n\n try {\n let res\n const actionEndpoint =\n actionArg ||\n (typeof action === 'string'\n ? `${action}${QueryString.stringify(formQueryParams, { addQueryPrefix: true })}`\n : null)\n\n if (actionEndpoint) {\n res = await requests[methodToUse.toLowerCase()](actionEndpoint, {\n body: formData,\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n } else if (typeof action === 'function') {\n res = await action(formData)\n }\n\n setModified(false)\n\n if (typeof handleResponse === 'function') {\n handleResponse(res)\n return\n }\n\n setProcessing(false)\n\n const contentType = res.headers.get('content-type')\n const isJSON = contentType && contentType.indexOf('application/json') !== -1\n\n let json: Record<string, any> = {}\n\n if (isJSON) json = await res.json()\n\n if (res.status < 400) {\n setSubmitted(false)\n\n if (typeof onSuccess === 'function') onSuccess(json)\n\n if (redirect) {\n router.push(redirect)\n } else if (!disableSuccessStatus) {\n toast.success(json.message || t('general:submissionSuccessful'), { autoClose: 3000 })\n }\n } else {\n contextRef.current = { ...contextRef.current } // triggers rerender of all components that subscribe to form\n if (json.message) {\n toast.error(json.message)\n\n return\n }\n\n if (Array.isArray(json.errors)) {\n const [fieldErrors, nonFieldErrors] = json.errors.reduce(\n ([fieldErrs, nonFieldErrs], err) => {\n const newFieldErrs = []\n const newNonFieldErrs = []\n\n if (err?.message) {\n newNonFieldErrs.push(err)\n }\n\n if (Array.isArray(err?.data)) {\n err.data.forEach((dataError) => {\n if (dataError?.field) {\n newFieldErrs.push(dataError)\n } else {\n newNonFieldErrs.push(dataError)\n }\n })\n }\n\n return [\n [...fieldErrs, ...newFieldErrs],\n [...nonFieldErrs, ...newNonFieldErrs],\n ]\n },\n [[], []],\n )\n\n fieldErrors.forEach((err) => {\n dispatchFields({\n type: 'UPDATE',\n ...(contextRef.current?.fields?.[err.field] || {}),\n errorMessage: err.message,\n path: err.field,\n valid: false,\n })\n })\n\n nonFieldErrors.forEach((err) => {\n toast.error(err.message || t('error:unknown'))\n })\n\n return\n }\n\n const message = errorMessages?.[res.status] || res?.statusText || t('error:unknown')\n\n toast.error(message)\n }\n } catch (err) {\n setProcessing(false)\n\n toast.error(err)\n }\n },\n [\n action,\n disableSuccessStatus,\n disabled,\n dispatchFields,\n fields,\n handleResponse,\n method,\n onSubmit,\n onSuccess,\n redirect,\n router,\n t,\n i18n,\n waitForAutocomplete,\n beforeSubmit,\n formQueryParams,\n ],\n )\n\n const getFields = useCallback(() => contextRef.current.fields, [])\n\n const getField = useCallback((path: string) => contextRef.current.fields[path], [])\n\n const getData = useCallback(() => reduceFieldsToValues(contextRef.current.fields, true), [])\n\n const getSiblingData = useCallback(\n (path: string) => getSiblingDataFunc(contextRef.current.fields, path),\n [],\n )\n const getDataByPath = useCallback<GetDataByPath>(\n (path: string) => getDataByPathFunc(contextRef.current.fields, path),\n [],\n )\n\n const createFormData = useCallback((overrides: any = {}) => {\n const data = reduceFieldsToValues(contextRef.current.fields, true)\n\n const file = data?.file\n\n if (file) {\n delete data.file\n }\n\n const dataWithOverrides = {\n ...data,\n ...overrides,\n }\n\n const dataToSerialize = {\n _payload: JSON.stringify(dataWithOverrides),\n file,\n }\n\n // nullAsUndefineds is important to allow uploads and relationship fields to clear themselves\n const formData = serialize(dataToSerialize, { indices: true, nullsAsUndefineds: false })\n\n return formData\n }, [])\n\n const reset = useCallback(\n async (data: unknown) => {\n const newState = await getFormState({\n apiRoute,\n body: {\n id,\n collectionSlug,\n data,\n globalSlug,\n operation,\n schemaPath: collectionSlug || globalSlug,\n },\n serverURL,\n })\n\n contextRef.current = { ...initContextState } as FormContextType\n setModified(false)\n dispatchFields({ type: 'REPLACE_STATE', state: newState })\n },\n [apiRoute, collectionSlug, dispatchFields, globalSlug, id, operation, serverURL],\n )\n\n const replaceState = useCallback(\n (state: FormState) => {\n contextRef.current = { ...initContextState } as FormContextType\n setModified(false)\n dispatchFields({ type: 'REPLACE_STATE', state })\n },\n [dispatchFields],\n )\n\n const getFieldStateByPath = useCallback(\n async ({ data, path }) => {\n const fieldSchema = await getFormState({\n apiRoute,\n body: {\n collectionSlug,\n data,\n globalSlug,\n /**\n Turns: 'arrayField.0.group123field.arrayField.0.textField'\n Into: 'arrayField.group123field.arrayField.textField'\n */\n schemaPath: `${collectionSlug || globalSlug}.${path}`.replace(/\\.\\d+\\./g, '.'),\n },\n serverURL,\n })\n return fieldSchema\n },\n [apiRoute, collectionSlug, globalSlug, serverURL],\n )\n\n const addFieldRow: FormContextType['addFieldRow'] = useCallback(\n async ({ data, path, rowIndex }) => {\n const subFieldState = await getFieldStateByPath({ data, path })\n\n dispatchFields({\n type: 'ADD_ROW',\n blockType: data?.blockType,\n path,\n rowIndex,\n subFieldState,\n })\n },\n [getFieldStateByPath, dispatchFields],\n )\n\n const removeFieldRow: FormContextType['removeFieldRow'] = useCallback(\n ({ path, rowIndex }) => {\n dispatchFields({ type: 'REMOVE_ROW', path, rowIndex })\n },\n [dispatchFields],\n )\n\n const replaceFieldRow: FormContextType['replaceFieldRow'] = useCallback(\n async ({ data, path, rowIndex }) => {\n const subFieldState = await getFieldStateByPath({ data, path })\n\n dispatchFields({\n type: 'REPLACE_ROW',\n blockType: data?.blockType,\n path,\n rowIndex,\n subFieldState,\n })\n },\n [getFieldStateByPath, dispatchFields],\n )\n\n contextRef.current.submit = submit\n contextRef.current.getFields = getFields\n contextRef.current.getField = getField\n contextRef.current.getData = getData\n contextRef.current.getSiblingData = getSiblingData\n contextRef.current.getDataByPath = getDataByPath\n contextRef.current.validateForm = validateForm\n contextRef.current.createFormData = createFormData\n contextRef.current.setModified = setModified\n contextRef.current.setProcessing = setProcessing\n contextRef.current.setSubmitted = setSubmitted\n contextRef.current.disabled = disabled\n contextRef.current.formRef = formRef\n contextRef.current.reset = reset\n contextRef.current.replaceState = replaceState\n contextRef.current.dispatchFields = dispatchFields\n contextRef.current.addFieldRow = addFieldRow\n contextRef.current.removeFieldRow = removeFieldRow\n contextRef.current.replaceFieldRow = replaceFieldRow\n contextRef.current.uuid = uuid\n\n useEffect(() => {\n if (typeof submittedFromProps === 'boolean') setSubmitted(submittedFromProps)\n }, [submittedFromProps])\n\n useEffect(() => {\n if (initialState) {\n contextRef.current = { ...initContextState } as FormContextType\n dispatchFields({ type: 'REPLACE_STATE', state: initialState })\n }\n }, [initialState, dispatchFields])\n\n useThrottledEffect(\n () => {\n refreshCookie()\n },\n 15000,\n [fields],\n )\n\n useEffect(() => {\n contextRef.current = { ...contextRef.current } // triggers rerender of all components that subscribe to form\n setModified(false)\n }, [locale])\n\n const classes = [className, baseClass].filter(Boolean).join(' ')\n\n useDebouncedEffect(\n () => {\n const executeOnChange = async () => {\n if (Array.isArray(onChange)) {\n let revalidatedFormState: FormState\n\n await onChange.reduce(async (priorOnChange, onChangeFn) => {\n await priorOnChange\n\n const result = await onChangeFn({\n formState: fields,\n })\n\n revalidatedFormState = result\n }, Promise.resolve())\n\n const { changed, newState } = mergeServerFormState(fields, revalidatedFormState)\n\n if (changed) {\n dispatchFields({ type: 'REPLACE_STATE', optimize: false, state: newState })\n }\n }\n }\n\n void executeOnChange() // eslint-disable-line @typescript-eslint/no-floating-promises\n },\n 150,\n [fields, dispatchFields, onChange],\n )\n\n const actionString =\n typeof action === 'string'\n ? `${action}${QueryString.stringify(formQueryParams, { addQueryPrefix: true })}`\n : ''\n\n return (\n <form\n action={method ? actionString : action}\n className={classes}\n method={method}\n noValidate\n onSubmit={(e) => contextRef.current.submit({}, e)}\n ref={formRef}\n >\n <FormContext.Provider value={contextRef.current}>\n <FormWatchContext.Provider\n value={{\n fields,\n ...contextRef.current,\n }}\n >\n <SubmittedContext.Provider value={submitted}>\n <ProcessingContext.Provider value={processing}>\n <ModifiedContext.Provider value={modified}>\n <FormFieldsContext.Provider value={fieldsReducer}>\n {children}\n </FormFieldsContext.Provider>\n </ModifiedContext.Provider>\n </ProcessingContext.Provider>\n </SubmittedContext.Provider>\n </FormWatchContext.Provider>\n </FormContext.Provider>\n </form>\n )\n}\n\nexport default Form\n"],"names":["isDeepEqual","useRouter","serialize","wait","QueryString","React","useCallback","useEffect","useReducer","useRef","useState","toast","useDebouncedEffect","useThrottledEffect","useAuth","useConfig","useDocumentInfo","useFormQueryParams","useLocale","useOperation","useTranslation","requests","getFormState","FormContext","FormFieldsContext","FormWatchContext","ModifiedContext","ProcessingContext","SubmittedContext","errorMessages","fieldReducer","getDataByPathFunc","getSiblingDataFunc","initContextState","mergeServerFormState","reduceFieldsToValues","baseClass","Form","props","id","collectionSlug","getDocPreferences","globalSlug","action","children","className","disableSuccessStatus","disabled","beforeSubmit","handleResponse","initialState","onChange","onSubmit","onSuccess","redirect","submitted","submittedFromProps","uuid","waitForAutocomplete","method","undefined","router","code","locale","i18n","t","refreshCookie","user","operation","formQueryParams","config","routes","api","apiRoute","serverURL","modified","setModified","processing","setProcessing","setSubmitted","formRef","contextRef","fieldsReducer","fields","dispatchFields","current","validateForm","validatedFieldState","isValid","dataFromContext","getData","data","validationPromises","Object","entries","map","path","field","validatedField","valid","passesCondition","validationResult","validate","valueToValidate","value","rows","Array","isArray","getDataByPath","siblingData","getSiblingData","errorMessage","Promise","all","type","state","submit","options","e","actionArg","methodToUse","overrides","skipValidation","preventDefault","stopPropagation","revalidatedFormState","reduce","priorOnChange","beforeSubmitFn","result","formState","resolve","every","error","formData","createFormData","res","actionEndpoint","stringify","addQueryPrefix","toLowerCase","body","headers","language","contentType","get","isJSON","indexOf","json","status","push","success","message","autoClose","errors","fieldErrors","nonFieldErrors","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","forEach","dataError","statusText","getFields","getField","file","dataWithOverrides","dataToSerialize","_payload","JSON","indices","nullsAsUndefineds","reset","newState","schemaPath","replaceState","getFieldStateByPath","fieldSchema","replace","addFieldRow","rowIndex","subFieldState","blockType","removeFieldRow","replaceFieldRow","classes","filter","Boolean","join","executeOnChange","onChangeFn","changed","optimize","actionString","form","noValidate","ref","Provider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/forms/Form/index.tsx"],"sourcesContent":["'use client'\nimport type { FormState } from 'payload/types'\n\n/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\nimport isDeepEqual from 'deep-equal'\nimport { useRouter } from 'next/navigation.js'\nimport { serialize } from 'object-to-formdata'\nimport { wait } from 'payload/utilities'\nimport QueryString from 'qs'\nimport React, { useCallback, useEffect, useReducer, useRef, useState } from 'react'\nimport { toast } from 'react-toastify'\n\nimport type { Context as FormContextType, GetDataByPath, Props, SubmitOptions } from './types.js'\n\nimport { useDebouncedEffect } from '../../hooks/useDebouncedEffect.js'\nimport useThrottledEffect from '../../hooks/useThrottledEffect.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useFormQueryParams } from '../../providers/FormQueryParams/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useOperation } from '../../providers/OperationProvider/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { requests } from '../../utilities/api.js'\nimport { getFormState } from '../../utilities/getFormState.js'\nimport {\n FormContext,\n FormFieldsContext,\n FormWatchContext,\n ModifiedContext,\n ProcessingContext,\n SubmittedContext,\n} from './context.js'\nimport errorMessages from './errorMessages.js'\nimport { fieldReducer } from './fieldReducer.js'\nimport getDataByPathFunc from './getDataByPath.js'\nimport getSiblingDataFunc from './getSiblingData.js'\nimport initContextState from './initContextState.js'\nimport { mergeServerFormState } from './mergeServerFormState.js'\nimport reduceFieldsToValues from './reduceFieldsToValues.js'\n\nconst baseClass = 'form'\n\nconst Form: React.FC<Props> = (props) => {\n const { id, collectionSlug, globalSlug } = useDocumentInfo()\n\n const {\n action,\n children,\n className,\n disableSuccessStatus,\n disabled,\n // fields: fieldsFromProps = collection?.fields || global?.fields,\n beforeSubmit,\n handleResponse,\n initialState, // fully formed initial field state\n onChange,\n onSubmit,\n onSuccess,\n redirect,\n submitted: submittedFromProps,\n uuid,\n waitForAutocomplete,\n } = props\n\n const method = 'method' in props ? props?.method : undefined\n\n const router = useRouter()\n\n const { code: locale } = useLocale()\n const { i18n, t } = useTranslation()\n const { refreshCookie, user } = useAuth()\n const operation = useOperation()\n const { formQueryParams } = useFormQueryParams()\n\n const config = useConfig()\n const {\n routes: { api: apiRoute },\n serverURL,\n } = config\n\n const [modified, setModified] = useState(false)\n const [processing, setProcessing] = useState(false)\n const [submitted, setSubmitted] = useState(false)\n const formRef = useRef<HTMLFormElement>(null)\n const contextRef = useRef({} as FormContextType)\n\n const fieldsReducer = useReducer(fieldReducer, {}, () => initialState)\n /**\n * `fields` is the current, up-to-date state/data of all fields in the form. It can be modified by using dispatchFields,\n * which calls the fieldReducer, which then updates the state.\n */\n const [fields, dispatchFields] = fieldsReducer\n\n contextRef.current.fields = fields\n\n const validateForm = useCallback(async () => {\n const validatedFieldState = {}\n let isValid = true\n\n const dataFromContext = contextRef.current.getData()\n const data = dataFromContext\n\n const validationPromises = Object.entries(contextRef.current.fields).map(\n async ([path, field]) => {\n const validatedField = {\n ...field,\n valid: true,\n }\n\n if (field.passesCondition !== false) {\n let validationResult: boolean | string = true\n\n if (typeof field.validate === 'function') {\n let valueToValidate = field.value\n\n if (field?.rows && Array.isArray(field.rows)) {\n valueToValidate = contextRef.current.getDataByPath(path)\n }\n\n validationResult = await field.validate(valueToValidate, {\n id,\n config,\n data,\n operation,\n siblingData: contextRef.current.getSiblingData(path),\n t,\n user,\n })\n }\n\n if (typeof validationResult === 'string') {\n validatedField.errorMessage = validationResult\n validatedField.valid = false\n isValid = false\n }\n }\n\n validatedFieldState[path] = validatedField\n },\n )\n\n await Promise.all(validationPromises)\n\n if (!isDeepEqual(contextRef.current.fields, validatedFieldState)) {\n dispatchFields({ type: 'REPLACE_STATE', state: validatedFieldState })\n }\n\n return isValid\n }, [id, user, operation, t, dispatchFields, config])\n\n const submit = useCallback(\n async (options: SubmitOptions = {}, e): Promise<void> => {\n const {\n action: actionArg,\n method: methodToUse = method,\n overrides = {},\n skipValidation,\n } = options\n\n if (disabled) {\n if (e) {\n e.preventDefault()\n }\n return\n }\n\n if (e) {\n e.stopPropagation()\n e.preventDefault()\n }\n\n setProcessing(true)\n setSubmitted(true)\n\n if (waitForAutocomplete) await wait(100)\n\n // Execute server side validations\n if (Array.isArray(beforeSubmit)) {\n let revalidatedFormState: FormState\n\n await beforeSubmit.reduce(async (priorOnChange, beforeSubmitFn) => {\n await priorOnChange\n\n const result = await beforeSubmitFn({\n formState: fields,\n })\n\n revalidatedFormState = result\n }, Promise.resolve())\n\n const isValid = Object.entries(revalidatedFormState).every(([, field]) => field.valid)\n\n if (!isValid) {\n setProcessing(false)\n return dispatchFields({ type: 'REPLACE_STATE', state: revalidatedFormState })\n }\n }\n\n const isValid = skipValidation ? true : await contextRef.current.validateForm()\n\n // If not valid, prevent submission\n if (!isValid) {\n toast.error(t('error:correctInvalidFields'))\n setProcessing(false)\n\n return\n }\n\n // If submit handler comes through via props, run that\n if (onSubmit) {\n const data = {\n ...reduceFieldsToValues(fields, true),\n ...overrides,\n }\n\n onSubmit(fields, data)\n }\n\n const formData = contextRef.current.createFormData(overrides)\n\n try {\n let res\n const actionEndpoint =\n actionArg ||\n (typeof action === 'string'\n ? `${action}${QueryString.stringify(formQueryParams, { addQueryPrefix: true })}`\n : null)\n\n if (actionEndpoint) {\n res = await requests[methodToUse.toLowerCase()](actionEndpoint, {\n body: formData,\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n } else if (typeof action === 'function') {\n res = await action(formData)\n }\n\n setModified(false)\n\n if (typeof handleResponse === 'function') {\n handleResponse(res)\n return\n }\n\n setProcessing(false)\n\n const contentType = res.headers.get('content-type')\n const isJSON = contentType && contentType.indexOf('application/json') !== -1\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let json: Record<string, any> = {}\n\n if (isJSON) json = await res.json()\n\n if (res.status < 400) {\n setSubmitted(false)\n\n if (typeof onSuccess === 'function') onSuccess(json)\n\n if (redirect) {\n router.push(redirect)\n } else if (!disableSuccessStatus) {\n toast.success(json.message || t('general:submissionSuccessful'), { autoClose: 3000 })\n }\n } else {\n contextRef.current = { ...contextRef.current } // triggers rerender of all components that subscribe to form\n if (json.message) {\n toast.error(json.message)\n\n return\n }\n\n if (Array.isArray(json.errors)) {\n const [fieldErrors, nonFieldErrors] = json.errors.reduce(\n ([fieldErrs, nonFieldErrs], err) => {\n const newFieldErrs = []\n const newNonFieldErrs = []\n\n if (err?.message) {\n newNonFieldErrs.push(err)\n }\n\n if (Array.isArray(err?.data)) {\n err.data.forEach((dataError) => {\n if (dataError?.field) {\n newFieldErrs.push(dataError)\n } else {\n newNonFieldErrs.push(dataError)\n }\n })\n }\n\n return [\n [...fieldErrs, ...newFieldErrs],\n [...nonFieldErrs, ...newNonFieldErrs],\n ]\n },\n [[], []],\n )\n\n fieldErrors.forEach((err) => {\n dispatchFields({\n type: 'UPDATE',\n ...(contextRef.current?.fields?.[err.field] || {}),\n errorMessage: err.message,\n path: err.field,\n valid: false,\n })\n })\n\n nonFieldErrors.forEach((err) => {\n toast.error(err.message || t('error:unknown'))\n })\n\n return\n }\n\n const message = errorMessages?.[res.status] || res?.statusText || t('error:unknown')\n\n toast.error(message)\n }\n } catch (err) {\n setProcessing(false)\n\n toast.error(err)\n }\n },\n [\n action,\n disableSuccessStatus,\n disabled,\n dispatchFields,\n fields,\n handleResponse,\n method,\n onSubmit,\n onSuccess,\n redirect,\n router,\n t,\n i18n,\n waitForAutocomplete,\n beforeSubmit,\n formQueryParams,\n ],\n )\n\n const getFields = useCallback(() => contextRef.current.fields, [])\n\n const getField = useCallback((path: string) => contextRef.current.fields[path], [])\n\n const getData = useCallback(() => reduceFieldsToValues(contextRef.current.fields, true), [])\n\n const getSiblingData = useCallback(\n (path: string) => getSiblingDataFunc(contextRef.current.fields, path),\n [],\n )\n const getDataByPath = useCallback<GetDataByPath>(\n (path: string) => getDataByPathFunc(contextRef.current.fields, path),\n [],\n )\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const createFormData = useCallback((overrides: any = {}) => {\n const data = reduceFieldsToValues(contextRef.current.fields, true)\n\n const file = data?.file\n\n if (file) {\n delete data.file\n }\n\n const dataWithOverrides = {\n ...data,\n ...overrides,\n }\n\n const dataToSerialize = {\n _payload: JSON.stringify(dataWithOverrides),\n file,\n }\n\n // nullAsUndefineds is important to allow uploads and relationship fields to clear themselves\n const formData = serialize(dataToSerialize, { indices: true, nullsAsUndefineds: false })\n\n return formData\n }, [])\n\n const reset = useCallback(\n async (data: unknown) => {\n const newState = await getFormState({\n apiRoute,\n body: {\n id,\n collectionSlug,\n data,\n globalSlug,\n operation,\n schemaPath: collectionSlug || globalSlug,\n },\n serverURL,\n })\n\n contextRef.current = { ...initContextState } as FormContextType\n setModified(false)\n dispatchFields({ type: 'REPLACE_STATE', state: newState })\n },\n [apiRoute, collectionSlug, dispatchFields, globalSlug, id, operation, serverURL],\n )\n\n const replaceState = useCallback(\n (state: FormState) => {\n contextRef.current = { ...initContextState } as FormContextType\n setModified(false)\n dispatchFields({ type: 'REPLACE_STATE', state })\n },\n [dispatchFields],\n )\n\n const getFieldStateBySchemaPath = useCallback(\n async ({ data, schemaPath }) => {\n const fieldSchema = await getFormState({\n apiRoute,\n body: {\n collectionSlug,\n data,\n globalSlug,\n schemaPath,\n },\n serverURL,\n })\n return fieldSchema\n },\n [apiRoute, collectionSlug, globalSlug, serverURL],\n )\n\n const addFieldRow: FormContextType['addFieldRow'] = useCallback(\n async ({ data, path, rowIndex, schemaPath }) => {\n const subFieldState = await getFieldStateBySchemaPath({ data, schemaPath })\n\n dispatchFields({\n type: 'ADD_ROW',\n blockType: data?.blockType,\n path,\n rowIndex,\n subFieldState,\n })\n },\n [getFieldStateBySchemaPath, dispatchFields],\n )\n\n const removeFieldRow: FormContextType['removeFieldRow'] = useCallback(\n ({ path, rowIndex }) => {\n dispatchFields({ type: 'REMOVE_ROW', path, rowIndex })\n },\n [dispatchFields],\n )\n\n const replaceFieldRow: FormContextType['replaceFieldRow'] = useCallback(\n async ({ data, path, rowIndex, schemaPath }) => {\n const subFieldState = await getFieldStateBySchemaPath({ data, schemaPath })\n\n dispatchFields({\n type: 'REPLACE_ROW',\n blockType: data?.blockType,\n path,\n rowIndex,\n subFieldState,\n })\n },\n [getFieldStateBySchemaPath, dispatchFields],\n )\n\n contextRef.current.submit = submit\n contextRef.current.getFields = getFields\n contextRef.current.getField = getField\n contextRef.current.getData = getData\n contextRef.current.getSiblingData = getSiblingData\n contextRef.current.getDataByPath = getDataByPath\n contextRef.current.validateForm = validateForm\n contextRef.current.createFormData = createFormData\n contextRef.current.setModified = setModified\n contextRef.current.setProcessing = setProcessing\n contextRef.current.setSubmitted = setSubmitted\n contextRef.current.disabled = disabled\n contextRef.current.formRef = formRef\n contextRef.current.reset = reset\n contextRef.current.replaceState = replaceState\n contextRef.current.dispatchFields = dispatchFields\n contextRef.current.addFieldRow = addFieldRow\n contextRef.current.removeFieldRow = removeFieldRow\n contextRef.current.replaceFieldRow = replaceFieldRow\n contextRef.current.uuid = uuid\n\n useEffect(() => {\n if (typeof submittedFromProps === 'boolean') setSubmitted(submittedFromProps)\n }, [submittedFromProps])\n\n useEffect(() => {\n if (initialState) {\n contextRef.current = { ...initContextState } as FormContextType\n dispatchFields({ type: 'REPLACE_STATE', state: initialState })\n }\n }, [initialState, dispatchFields])\n\n useThrottledEffect(\n () => {\n refreshCookie()\n },\n 15000,\n [fields],\n )\n\n useEffect(() => {\n contextRef.current = { ...contextRef.current } // triggers rerender of all components that subscribe to form\n setModified(false)\n }, [locale])\n\n const classes = [className, baseClass].filter(Boolean).join(' ')\n\n useDebouncedEffect(\n () => {\n const executeOnChange = async () => {\n if (Array.isArray(onChange)) {\n let revalidatedFormState: FormState\n\n await onChange.reduce(async (priorOnChange, onChangeFn) => {\n await priorOnChange\n\n const result = await onChangeFn({\n formState: fields,\n })\n\n revalidatedFormState = result\n }, Promise.resolve())\n\n const { changed, newState } = mergeServerFormState(fields, revalidatedFormState)\n\n if (changed) {\n dispatchFields({ type: 'REPLACE_STATE', optimize: false, state: newState })\n }\n }\n }\n\n void executeOnChange() // eslint-disable-line @typescript-eslint/no-floating-promises\n },\n 150,\n [fields, dispatchFields, onChange],\n )\n\n const actionString =\n typeof action === 'string'\n ? `${action}${QueryString.stringify(formQueryParams, { addQueryPrefix: true })}`\n : ''\n\n return (\n <form\n action={method ? actionString : action}\n className={classes}\n method={method}\n noValidate\n onSubmit={(e) => contextRef.current.submit({}, e)}\n ref={formRef}\n >\n <FormContext.Provider value={contextRef.current}>\n <FormWatchContext.Provider\n value={{\n fields,\n ...contextRef.current,\n }}\n >\n <SubmittedContext.Provider value={submitted}>\n <ProcessingContext.Provider value={processing}>\n <ModifiedContext.Provider value={modified}>\n <FormFieldsContext.Provider value={fieldsReducer}>\n {children}\n </FormFieldsContext.Provider>\n </ModifiedContext.Provider>\n </ProcessingContext.Provider>\n </SubmittedContext.Provider>\n </FormWatchContext.Provider>\n </FormContext.Provider>\n </form>\n )\n}\n\n// eslint-disable-next-line no-restricted-exports\nexport default Form\n"],"names":["isDeepEqual","useRouter","serialize","wait","QueryString","React","useCallback","useEffect","useReducer","useRef","useState","toast","useDebouncedEffect","useThrottledEffect","useAuth","useConfig","useDocumentInfo","useFormQueryParams","useLocale","useOperation","useTranslation","requests","getFormState","FormContext","FormFieldsContext","FormWatchContext","ModifiedContext","ProcessingContext","SubmittedContext","errorMessages","fieldReducer","getDataByPathFunc","getSiblingDataFunc","initContextState","mergeServerFormState","reduceFieldsToValues","baseClass","Form","props","id","collectionSlug","globalSlug","action","children","className","disableSuccessStatus","disabled","beforeSubmit","handleResponse","initialState","onChange","onSubmit","onSuccess","redirect","submitted","submittedFromProps","uuid","waitForAutocomplete","method","undefined","router","code","locale","i18n","t","refreshCookie","user","operation","formQueryParams","config","routes","api","apiRoute","serverURL","modified","setModified","processing","setProcessing","setSubmitted","formRef","contextRef","fieldsReducer","fields","dispatchFields","current","validateForm","validatedFieldState","isValid","dataFromContext","getData","data","validationPromises","Object","entries","map","path","field","validatedField","valid","passesCondition","validationResult","validate","valueToValidate","value","rows","Array","isArray","getDataByPath","siblingData","getSiblingData","errorMessage","Promise","all","type","state","submit","options","e","actionArg","methodToUse","overrides","skipValidation","preventDefault","stopPropagation","revalidatedFormState","reduce","priorOnChange","beforeSubmitFn","result","formState","resolve","every","error","formData","createFormData","res","actionEndpoint","stringify","addQueryPrefix","toLowerCase","body","headers","language","contentType","get","isJSON","indexOf","json","status","push","success","message","autoClose","errors","fieldErrors","nonFieldErrors","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","forEach","dataError","statusText","getFields","getField","file","dataWithOverrides","dataToSerialize","_payload","JSON","indices","nullsAsUndefineds","reset","newState","schemaPath","replaceState","getFieldStateBySchemaPath","fieldSchema","addFieldRow","rowIndex","subFieldState","blockType","removeFieldRow","replaceFieldRow","classes","filter","Boolean","join","executeOnChange","onChangeFn","changed","optimize","actionString","form","noValidate","ref","Provider"],"mappings":"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"}
|