@payloadcms/ui 4.0.0-canary.38 → 4.0.0-canary.39
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/Autosave/index.d.ts.map +1 -1
- package/dist/elements/Autosave/index.js +10 -3
- package/dist/elements/Autosave/index.js.map +1 -1
- package/dist/elements/CodeEditor/CodeEditor.d.ts.map +1 -1
- package/dist/elements/CodeEditor/CodeEditor.js +5 -0
- package/dist/elements/CodeEditor/CodeEditor.js.map +1 -1
- package/dist/elements/DocumentDrawer/types.d.ts +1 -5
- package/dist/elements/DocumentDrawer/types.d.ts.map +1 -1
- package/dist/elements/DocumentDrawer/types.js.map +1 -1
- package/dist/elements/EditUpload/library.css +6 -13
- package/dist/elements/FileManager/index.d.ts.map +1 -1
- package/dist/elements/FileManager/index.js +6 -1
- package/dist/elements/FileManager/index.js.map +1 -1
- package/dist/elements/ListControls/types.d.ts +0 -10
- package/dist/elements/ListControls/types.d.ts.map +1 -1
- package/dist/elements/ListControls/types.js.map +1 -1
- package/dist/elements/ListDrawer/DrawerContent.d.ts.map +1 -1
- package/dist/elements/ListDrawer/DrawerContent.js +1 -2
- package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
- package/dist/elements/ListDrawer/Provider.d.ts +0 -6
- package/dist/elements/ListDrawer/Provider.d.ts.map +1 -1
- package/dist/elements/ListDrawer/Provider.js.map +1 -1
- package/dist/elements/PublishButton/index.d.ts.map +1 -1
- package/dist/elements/PublishButton/index.js +71 -8
- package/dist/elements/PublishButton/index.js.map +1 -1
- package/dist/elements/PublishButton/validateAllLocales.d.ts +11 -0
- package/dist/elements/PublishButton/validateAllLocales.d.ts.map +1 -0
- package/dist/elements/PublishButton/validateAllLocales.js +263 -0
- package/dist/elements/PublishButton/validateAllLocales.js.map +1 -0
- package/dist/elements/RelationshipTable/AddNewButton.d.ts.map +1 -1
- package/dist/elements/RelationshipTable/AddNewButton.js +3 -0
- package/dist/elements/RelationshipTable/AddNewButton.js.map +1 -1
- package/dist/elements/SaveDraftButton/index.d.ts.map +1 -1
- package/dist/elements/SaveDraftButton/index.js +15 -2
- package/dist/elements/SaveDraftButton/index.js.map +1 -1
- package/dist/elements/Upload/getEditorFileSrc.d.ts +11 -0
- package/dist/elements/Upload/getEditorFileSrc.d.ts.map +1 -0
- package/dist/elements/Upload/getEditorFileSrc.js +6 -0
- package/dist/elements/Upload/getEditorFileSrc.js.map +1 -0
- package/dist/elements/Upload/index.d.ts.map +1 -1
- package/dist/elements/Upload/index.js +6 -1
- package/dist/elements/Upload/index.js.map +1 -1
- package/dist/exports/client/{CodeEditor-UKD3EPUY.js → CodeEditor-S7MOGZSR.js} +2 -2
- package/dist/exports/client/chunk-Z42OBP5U.js +27 -0
- package/dist/exports/client/chunk-Z42OBP5U.js.map +7 -0
- package/dist/exports/client/index.js +27 -27
- package/dist/exports/client/index.js.map +4 -4
- package/dist/exports/shared/index.js +2 -2
- package/dist/exports/shared/index.js.map +3 -3
- package/dist/forms/Form/fieldReducer.d.ts.map +1 -1
- package/dist/forms/Form/fieldReducer.js +6 -9
- package/dist/forms/Form/fieldReducer.js.map +1 -1
- package/dist/forms/Form/index.d.ts.map +1 -1
- package/dist/forms/Form/index.js +0 -1
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/forms/Form/types.d.ts +0 -5
- package/dist/forms/Form/types.d.ts.map +1 -1
- package/dist/forms/Form/types.js.map +1 -1
- package/dist/forms/useField/types.d.ts +0 -4
- package/dist/forms/useField/types.d.ts.map +1 -1
- package/dist/forms/useField/types.js.map +1 -1
- package/dist/layouts/Root/getRootLayoutData.d.ts +2 -2
- package/dist/layouts/Root/getRootLayoutData.d.ts.map +1 -1
- package/dist/layouts/Root/getRootLayoutData.js +8 -4
- package/dist/layouts/Root/getRootLayoutData.js.map +1 -1
- package/dist/layouts/Root/index.js +1 -5
- package/dist/layouts/Root/index.js.map +1 -1
- package/dist/providers/ListQuery/types.d.ts +0 -4
- package/dist/providers/ListQuery/types.d.ts.map +1 -1
- package/dist/providers/ListQuery/types.js.map +1 -1
- package/dist/providers/TableColumns/RenderDefaultCell/index.d.ts.map +1 -1
- package/dist/providers/TableColumns/RenderDefaultCell/index.js +1 -2
- package/dist/providers/TableColumns/RenderDefaultCell/index.js.map +1 -1
- package/dist/providers/TableColumns/types.d.ts +1 -34
- package/dist/providers/TableColumns/types.d.ts.map +1 -1
- package/dist/providers/TableColumns/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utilities/appendCacheTag.d.ts +1 -0
- package/dist/utilities/appendCacheTag.d.ts.map +1 -1
- package/dist/utilities/appendCacheTag.js +2 -1
- package/dist/utilities/appendCacheTag.js.map +1 -1
- package/dist/utilities/traverseForLocalizedFields.d.ts +7 -2
- package/dist/utilities/traverseForLocalizedFields.d.ts.map +1 -1
- package/dist/utilities/traverseForLocalizedFields.js +22 -8
- package/dist/utilities/traverseForLocalizedFields.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js +2 -12
- package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Checkbox/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Checkbox/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.d.ts.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js +8 -8
- package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.d.ts.map +1 -1
- package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js +2 -2
- package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js.map +1 -1
- package/dist/widgets/RecentlyViewed/index.css +3 -2
- package/package.json +4 -4
- package/dist/exports/client/chunk-6XCSN54Q.js +0 -27
- package/dist/exports/client/chunk-6XCSN54Q.js.map +0 -7
- /package/dist/exports/client/{CodeEditor-UKD3EPUY.js.map → CodeEditor-S7MOGZSR.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrawerContent.js","names":["useModal","hoistQueryParamsToAnd","React","useCallback","useEffect","useState","useDocumentDrawer","useEffectEvent","useConfig","useServerFunctions","ListDrawerContextProvider","LoadingOverlay","ListDrawerContent","allowCreate","collectionSlugs","disableQueryPresets","drawerSlug","enableRowSelections","filterOptions","onBulkSelect","onSelect","overrideEntityVisibility","selectedCollection","collectionSlugFromProps","closeModal","isModalOpen","serverFunction","ListView","setListView","undefined","isLoading","setIsLoading","config","collections","getEntityConfig","isOpen","enabledCollections","filter","slug","includes","selectedOption","setSelectedOption","initialSelection","found","collectionSlug","label","labels","value","DocumentDrawer","DocumentDrawerToggler","documentDrawerSlug","updateSelectedOption","refresh","query","newQuery","where","filterOption","result","name","args","disableBulkDelete","disableBulkEdit","List","_err","console","error","onCreateNew","doc","docID","id","onQueryChange","setMySelectedOption","incomingSelection","refreshSelf","incomingCollectionSlug","_jsxs","createNewDrawerSlug","selected","_Fragment","_jsx","className","onSave","animationDuration","overlayType","show"],"sources":["../../../src/elements/ListDrawer/DrawerContent.tsx"],"sourcesContent":["'use client'\nimport type { CollectionSlug, ListQuery } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { hoistQueryParamsToAnd } from 'payload/shared'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { ListDrawerContextProps, ListDrawerContextType } from '../ListDrawer/Provider.js'\nimport type {\n ListDrawerProps,\n RenderListServerFnArgs,\n RenderListServerFnReturnType,\n} from './types.js'\n\nimport { useDocumentDrawer } from '../../elements/DocumentDrawer/index.js'\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useServerFunctions } from '../../providers/ServerFunctions/index.js'\nimport { ListDrawerContextProvider } from '../ListDrawer/Provider.js'\nimport { LoadingOverlay } from '../Loading/index.js'\nimport { type Option } from '../ReactSelect/index.js'\n\nexport const ListDrawerContent: React.FC<ListDrawerProps> = ({\n allowCreate = true,\n collectionSlugs,\n disableQueryPresets,\n drawerSlug,\n enableRowSelections,\n filterOptions,\n onBulkSelect,\n onSelect,\n overrideEntityVisibility = true,\n selectedCollection: collectionSlugFromProps,\n}) => {\n const { closeModal, isModalOpen } = useModal()\n\n const { serverFunction } = useServerFunctions()\n const [ListView, setListView] = useState<React.ReactNode>(undefined)\n const [isLoading, setIsLoading] = useState(true)\n\n const {\n config: { collections },\n getEntityConfig,\n } = useConfig()\n\n const isOpen = isModalOpen(drawerSlug)\n\n const enabledCollections = collections.filter(({ slug }) => {\n return collectionSlugs.includes(slug)\n })\n\n const [selectedOption, setSelectedOption] = useState<Option<string>>(() => {\n const initialSelection = collectionSlugFromProps || enabledCollections[0]?.slug\n const found = getEntityConfig({ collectionSlug: initialSelection })\n\n return found\n ? {\n label: found.labels,\n value: found.slug,\n }\n : undefined\n })\n\n const [DocumentDrawer, DocumentDrawerToggler, { drawerSlug: documentDrawerSlug }] =\n useDocumentDrawer({\n collectionSlug: selectedOption.value,\n })\n\n const updateSelectedOption = useEffectEvent((collectionSlug: CollectionSlug) => {\n if (collectionSlug && collectionSlug !== selectedOption?.value) {\n setSelectedOption({\n label: getEntityConfig({ collectionSlug })?.labels,\n value: collectionSlug,\n })\n }\n })\n\n useEffect(() => {\n updateSelectedOption(collectionSlugFromProps)\n }, [collectionSlugFromProps])\n\n /**\n * This performs a full server round trip to get the list view for the selected collection.\n * On the server, the data is freshly queried for the list view and all components are fully rendered.\n * This work includes building column state, rendering custom components, etc.\n */\n const refresh = useCallback(\n async ({ slug, query }: { query?: ListQuery; slug: string }) => {\n try {\n const newQuery: ListQuery = { ...(query || {}), where: { ...(query?.where || {}) } }\n\n const filterOption = filterOptions?.[slug]\n\n if (filterOptions && typeof filterOption !== 'boolean') {\n newQuery.where = hoistQueryParamsToAnd(newQuery.where, filterOption)\n }\n\n if (slug) {\n const result: RenderListServerFnReturnType = (await serverFunction({\n name: 'render-list',\n args: {\n collectionSlug: slug,\n disableBulkDelete: true,\n disableBulkEdit: true,\n disableQueryPresets,\n drawerSlug,\n enableRowSelections,\n overrideEntityVisibility,\n query: newQuery,\n } satisfies RenderListServerFnArgs,\n })) as RenderListServerFnReturnType\n\n setListView(result?.List || null)\n } else {\n setListView(null)\n }\n setIsLoading(false)\n } catch (_err) {\n console.error('Error rendering List View: ', _err) // eslint-disable-line no-console\n\n if (isOpen) {\n closeModal(drawerSlug)\n }\n }\n },\n [\n serverFunction,\n closeModal,\n drawerSlug,\n isOpen,\n enableRowSelections,\n filterOptions,\n overrideEntityVisibility,\n disableQueryPresets,\n ],\n )\n\n useEffect(() => {\n if (!ListView) {\n void refresh({ slug: selectedOption?.value })\n }\n }, [refresh, ListView, selectedOption.value])\n\n const onCreateNew = useCallback(\n ({ doc }) => {\n if (typeof onSelect === 'function') {\n onSelect({\n collectionSlug: selectedOption?.value,\n doc,\n docID: doc.id,\n })\n }\n\n closeModal(documentDrawerSlug)\n closeModal(drawerSlug)\n },\n [closeModal, documentDrawerSlug, drawerSlug, onSelect, selectedOption.value],\n )\n\n const onQueryChange: ListDrawerContextProps['onQueryChange'] = useCallback(\n (query) => {\n void refresh({ slug: selectedOption?.value, query })\n },\n [refresh, selectedOption.value],\n )\n\n const setMySelectedOption: ListDrawerContextProps['setSelectedOption'] = useCallback(\n (incomingSelection) => {\n setSelectedOption(incomingSelection)\n void refresh({ slug: incomingSelection?.value })\n },\n [refresh],\n )\n\n const refreshSelf: ListDrawerContextType['refresh'] = useCallback(\n async (incomingCollectionSlug) => {\n if (incomingCollectionSlug) {\n setSelectedOption({\n label: getEntityConfig({ collectionSlug: incomingCollectionSlug })?.labels,\n value: incomingCollectionSlug,\n })\n }\n\n await refresh({ slug: selectedOption.value || incomingCollectionSlug })\n },\n [getEntityConfig, refresh, selectedOption.value],\n )\n\n return (\n <ListDrawerContextProvider\n allowCreate={allowCreate}\n createNewDrawerSlug={documentDrawerSlug}\n DocumentDrawerToggler={DocumentDrawerToggler}\n drawerSlug={drawerSlug}\n enabledCollections={collectionSlugs}\n onBulkSelect={\n typeof onBulkSelect === 'function'\n ? (selected) => onBulkSelect(selected, selectedOption.value)\n : undefined\n }\n onQueryChange={onQueryChange}\n onSelect={onSelect}\n refresh={refreshSelf}\n selectedOption={selectedOption}\n setSelectedOption={setMySelectedOption}\n >\n {!isLoading && (\n <>\n <div className=\"drawer__fade-in\">{ListView}</div>\n <DocumentDrawer onSave={onCreateNew} />\n </>\n )}\n <LoadingOverlay animationDuration=\"200ms\" overlayType=\"drawer\" show={isLoading} />\n </ListDrawerContextProvider>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DrawerContent.js","names":["useModal","hoistQueryParamsToAnd","React","useCallback","useEffect","useState","useDocumentDrawer","useEffectEvent","useConfig","useServerFunctions","ListDrawerContextProvider","LoadingOverlay","ListDrawerContent","allowCreate","collectionSlugs","disableQueryPresets","drawerSlug","enableRowSelections","filterOptions","onBulkSelect","onSelect","overrideEntityVisibility","selectedCollection","collectionSlugFromProps","closeModal","isModalOpen","serverFunction","ListView","setListView","undefined","isLoading","setIsLoading","config","collections","getEntityConfig","isOpen","enabledCollections","filter","slug","includes","selectedOption","setSelectedOption","initialSelection","found","collectionSlug","label","labels","value","DocumentDrawer","DocumentDrawerToggler","documentDrawerSlug","updateSelectedOption","refresh","query","newQuery","where","filterOption","result","name","args","disableBulkDelete","disableBulkEdit","List","_err","console","error","onCreateNew","doc","onQueryChange","setMySelectedOption","incomingSelection","refreshSelf","incomingCollectionSlug","_jsxs","createNewDrawerSlug","selected","_Fragment","_jsx","className","onSave","animationDuration","overlayType","show"],"sources":["../../../src/elements/ListDrawer/DrawerContent.tsx"],"sourcesContent":["'use client'\nimport type { CollectionSlug, ListQuery } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { hoistQueryParamsToAnd } from 'payload/shared'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { ListDrawerContextProps, ListDrawerContextType } from '../ListDrawer/Provider.js'\nimport type {\n ListDrawerProps,\n RenderListServerFnArgs,\n RenderListServerFnReturnType,\n} from './types.js'\n\nimport { useDocumentDrawer } from '../../elements/DocumentDrawer/index.js'\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useServerFunctions } from '../../providers/ServerFunctions/index.js'\nimport { ListDrawerContextProvider } from '../ListDrawer/Provider.js'\nimport { LoadingOverlay } from '../Loading/index.js'\nimport { type Option } from '../ReactSelect/index.js'\n\nexport const ListDrawerContent: React.FC<ListDrawerProps> = ({\n allowCreate = true,\n collectionSlugs,\n disableQueryPresets,\n drawerSlug,\n enableRowSelections,\n filterOptions,\n onBulkSelect,\n onSelect,\n overrideEntityVisibility = true,\n selectedCollection: collectionSlugFromProps,\n}) => {\n const { closeModal, isModalOpen } = useModal()\n\n const { serverFunction } = useServerFunctions()\n const [ListView, setListView] = useState<React.ReactNode>(undefined)\n const [isLoading, setIsLoading] = useState(true)\n\n const {\n config: { collections },\n getEntityConfig,\n } = useConfig()\n\n const isOpen = isModalOpen(drawerSlug)\n\n const enabledCollections = collections.filter(({ slug }) => {\n return collectionSlugs.includes(slug)\n })\n\n const [selectedOption, setSelectedOption] = useState<Option<string>>(() => {\n const initialSelection = collectionSlugFromProps || enabledCollections[0]?.slug\n const found = getEntityConfig({ collectionSlug: initialSelection })\n\n return found\n ? {\n label: found.labels,\n value: found.slug,\n }\n : undefined\n })\n\n const [DocumentDrawer, DocumentDrawerToggler, { drawerSlug: documentDrawerSlug }] =\n useDocumentDrawer({\n collectionSlug: selectedOption.value,\n })\n\n const updateSelectedOption = useEffectEvent((collectionSlug: CollectionSlug) => {\n if (collectionSlug && collectionSlug !== selectedOption?.value) {\n setSelectedOption({\n label: getEntityConfig({ collectionSlug })?.labels,\n value: collectionSlug,\n })\n }\n })\n\n useEffect(() => {\n updateSelectedOption(collectionSlugFromProps)\n }, [collectionSlugFromProps])\n\n /**\n * This performs a full server round trip to get the list view for the selected collection.\n * On the server, the data is freshly queried for the list view and all components are fully rendered.\n * This work includes building column state, rendering custom components, etc.\n */\n const refresh = useCallback(\n async ({ slug, query }: { query?: ListQuery; slug: string }) => {\n try {\n const newQuery: ListQuery = { ...(query || {}), where: { ...(query?.where || {}) } }\n\n const filterOption = filterOptions?.[slug]\n\n if (filterOptions && typeof filterOption !== 'boolean') {\n newQuery.where = hoistQueryParamsToAnd(newQuery.where, filterOption)\n }\n\n if (slug) {\n const result: RenderListServerFnReturnType = (await serverFunction({\n name: 'render-list',\n args: {\n collectionSlug: slug,\n disableBulkDelete: true,\n disableBulkEdit: true,\n disableQueryPresets,\n drawerSlug,\n enableRowSelections,\n overrideEntityVisibility,\n query: newQuery,\n } satisfies RenderListServerFnArgs,\n })) as RenderListServerFnReturnType\n\n setListView(result?.List || null)\n } else {\n setListView(null)\n }\n setIsLoading(false)\n } catch (_err) {\n console.error('Error rendering List View: ', _err) // eslint-disable-line no-console\n\n if (isOpen) {\n closeModal(drawerSlug)\n }\n }\n },\n [\n serverFunction,\n closeModal,\n drawerSlug,\n isOpen,\n enableRowSelections,\n filterOptions,\n overrideEntityVisibility,\n disableQueryPresets,\n ],\n )\n\n useEffect(() => {\n if (!ListView) {\n void refresh({ slug: selectedOption?.value })\n }\n }, [refresh, ListView, selectedOption.value])\n\n const onCreateNew = useCallback(\n ({ doc }) => {\n if (typeof onSelect === 'function') {\n onSelect({\n collectionSlug: selectedOption?.value,\n doc,\n })\n }\n\n closeModal(documentDrawerSlug)\n closeModal(drawerSlug)\n },\n [closeModal, documentDrawerSlug, drawerSlug, onSelect, selectedOption.value],\n )\n\n const onQueryChange: ListDrawerContextProps['onQueryChange'] = useCallback(\n (query) => {\n void refresh({ slug: selectedOption?.value, query })\n },\n [refresh, selectedOption.value],\n )\n\n const setMySelectedOption: ListDrawerContextProps['setSelectedOption'] = useCallback(\n (incomingSelection) => {\n setSelectedOption(incomingSelection)\n void refresh({ slug: incomingSelection?.value })\n },\n [refresh],\n )\n\n const refreshSelf: ListDrawerContextType['refresh'] = useCallback(\n async (incomingCollectionSlug) => {\n if (incomingCollectionSlug) {\n setSelectedOption({\n label: getEntityConfig({ collectionSlug: incomingCollectionSlug })?.labels,\n value: incomingCollectionSlug,\n })\n }\n\n await refresh({ slug: selectedOption.value || incomingCollectionSlug })\n },\n [getEntityConfig, refresh, selectedOption.value],\n )\n\n return (\n <ListDrawerContextProvider\n allowCreate={allowCreate}\n createNewDrawerSlug={documentDrawerSlug}\n DocumentDrawerToggler={DocumentDrawerToggler}\n drawerSlug={drawerSlug}\n enabledCollections={collectionSlugs}\n onBulkSelect={\n typeof onBulkSelect === 'function'\n ? (selected) => onBulkSelect(selected, selectedOption.value)\n : undefined\n }\n onQueryChange={onQueryChange}\n onSelect={onSelect}\n refresh={refreshSelf}\n selectedOption={selectedOption}\n setSelectedOption={setMySelectedOption}\n >\n {!isLoading && (\n <>\n <div className=\"drawer__fade-in\">{ListView}</div>\n <DocumentDrawer onSave={onCreateNew} />\n </>\n )}\n <LoadingOverlay animationDuration=\"200ms\" overlayType=\"drawer\" show={isLoading} />\n </ListDrawerContextProvider>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -13,12 +13,6 @@ export type ListDrawerContextProps = {
|
|
|
13
13
|
readonly onSelect?: (args: {
|
|
14
14
|
collectionSlug: CollectionSlug;
|
|
15
15
|
doc: Data;
|
|
16
|
-
/**
|
|
17
|
-
* @deprecated
|
|
18
|
-
* The `docID` property is deprecated and will be removed in the next major version of Payload.
|
|
19
|
-
* Use `doc.id` instead.
|
|
20
|
-
*/
|
|
21
|
-
docID: string;
|
|
22
16
|
}) => void;
|
|
23
17
|
readonly selectedOption?: Option<CollectionSlug>;
|
|
24
18
|
readonly setSelectedOption?: (option: Option<CollectionSlug>) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../../src/elements/ListDrawer/Provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAI9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAErD,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,cAAc,EAAE,CAAA;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,cAAc,CAAC,EAAE,cAAc,KAC5B,IAAI,CAAA;IACT,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QACzB,cAAc,EAAE,cAAc,CAAA;QAC9B,GAAG,EAAE,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../../src/elements/ListDrawer/Provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAI9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAErD,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,cAAc,EAAE,CAAA;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,EACrD,cAAc,CAAC,EAAE,cAAc,KAC5B,IAAI,CAAA;IACT,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QACzB,cAAc,EAAE,cAAc,CAAA;QAC9B,GAAG,EAAE,IAAI,CAAA;KACV,KAAK,IAAI,CAAA;IACV,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;IAChD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,IAAI,CAAA;CACtE,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrE,GAAG,sBAAsB,CAAA;AAE1B,eAAO,MAAM,iBAAiB,gDAA6C,CAAA;AAE3E,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAC9C;IACE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,OAAO,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAA;CAC1C,GAAG,sBAAsB,CAO3B,CAAA;AAED,eAAO,MAAM,oBAAoB,QAAO,qBAQvC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Provider.js","names":["createContext","use","ListDrawerContext","ListDrawerContextProvider","children","rest","_jsx","value","isInDrawer","Boolean","drawerSlug","useListDrawerContext","context","Error"],"sources":["../../../src/elements/ListDrawer/Provider.tsx"],"sourcesContent":["import type { CollectionSlug, Data, ListQuery } from 'payload'\n\nimport { createContext, use } from 'react'\n\nimport type { useSelection } from '../../providers/Selection/index.js'\nimport type { UseDocumentDrawer } from '../DocumentDrawer/types.js'\nimport type { Option } from '../ReactSelect/index.js'\n\nexport type ListDrawerContextProps = {\n readonly allowCreate?: boolean\n readonly createNewDrawerSlug?: string\n readonly DocumentDrawerToggler?: ReturnType<UseDocumentDrawer>[1]\n readonly drawerSlug?: string\n readonly enabledCollections?: CollectionSlug[]\n readonly onBulkSelect?: (\n selected: ReturnType<typeof useSelection>['selected'],\n collectionSlug?: CollectionSlug,\n ) => void\n readonly onQueryChange?: (query: ListQuery) => void\n readonly onSelect?: (args: {\n collectionSlug: CollectionSlug\n doc: Data\n
|
|
1
|
+
{"version":3,"file":"Provider.js","names":["createContext","use","ListDrawerContext","ListDrawerContextProvider","children","rest","_jsx","value","isInDrawer","Boolean","drawerSlug","useListDrawerContext","context","Error"],"sources":["../../../src/elements/ListDrawer/Provider.tsx"],"sourcesContent":["import type { CollectionSlug, Data, ListQuery } from 'payload'\n\nimport { createContext, use } from 'react'\n\nimport type { useSelection } from '../../providers/Selection/index.js'\nimport type { UseDocumentDrawer } from '../DocumentDrawer/types.js'\nimport type { Option } from '../ReactSelect/index.js'\n\nexport type ListDrawerContextProps = {\n readonly allowCreate?: boolean\n readonly createNewDrawerSlug?: string\n readonly DocumentDrawerToggler?: ReturnType<UseDocumentDrawer>[1]\n readonly drawerSlug?: string\n readonly enabledCollections?: CollectionSlug[]\n readonly onBulkSelect?: (\n selected: ReturnType<typeof useSelection>['selected'],\n collectionSlug?: CollectionSlug,\n ) => void\n readonly onQueryChange?: (query: ListQuery) => void\n readonly onSelect?: (args: {\n collectionSlug: CollectionSlug\n doc: Data\n }) => void\n readonly selectedOption?: Option<CollectionSlug>\n readonly setSelectedOption?: (option: Option<CollectionSlug>) => void\n}\n\nexport type ListDrawerContextType = {\n readonly isInDrawer: boolean\n /**\n * When called, will either refresh the list view with its currently selected collection.\n * If an collection slug is provided, will use that instead of the currently selected one.\n */\n readonly refresh: (collectionSlug?: CollectionSlug) => Promise<void>\n} & ListDrawerContextProps\n\nexport const ListDrawerContext = createContext({} as ListDrawerContextType)\n\nexport const ListDrawerContextProvider: React.FC<\n {\n children: React.ReactNode\n refresh: ListDrawerContextType['refresh']\n } & ListDrawerContextProps\n> = ({ children, ...rest }) => {\n return (\n <ListDrawerContext value={{ isInDrawer: Boolean(rest.drawerSlug), ...rest }}>\n {children}\n </ListDrawerContext>\n )\n}\n\nexport const useListDrawerContext = (): ListDrawerContextType => {\n const context = use(ListDrawerContext)\n\n if (!context) {\n throw new Error('useListDrawerContext must be used within a ListDrawerContextProvider')\n }\n\n return context\n}\n"],"mappings":";AAEA,SAASA,aAAa,EAAEC,GAAG,QAAQ;AAkCnC,OAAO,MAAMC,iBAAA,gBAAoBF,aAAA,CAAc,CAAC;AAEhD,OAAO,MAAMG,yBAAA,GAKTA,CAAC;EAAEC,QAAQ;EAAE,GAAGC;AAAA,CAAM;EACxB,oBACEC,IAAA,CAACJ,iBAAA;IAAkBK,KAAA,EAAO;MAAEC,UAAA,EAAYC,OAAA,CAAQJ,IAAA,CAAKK,UAAU;MAAG,GAAGL;IAAK;cACvED;;AAGP;AAEA,OAAO,MAAMO,oBAAA,GAAuBA,CAAA;EAClC,MAAMC,OAAA,GAAUX,GAAA,CAAIC,iBAAA;EAEpB,IAAI,CAACU,OAAA,EAAS;IACZ,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,OAAOD,OAAA;AACT","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/PublishButton/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAKvD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/PublishButton/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAKvD,OAAO,KAAgC,MAAM,OAAO,CAAA;AAiBpD,OAAO,aAAa,CAAA;AAEpB,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EAAE,SAAS,GACjB,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,wBAA6B,qBAqUpD"}
|
|
@@ -4,7 +4,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
4
4
|
import { getTranslation } from '@payloadcms/translations';
|
|
5
5
|
import { formatAdminURL, hasAutosaveEnabled, hasLocalizeStatusEnabled } from 'payload/shared';
|
|
6
6
|
import * as qs from 'qs-esm';
|
|
7
|
-
import React, { useCallback } from 'react';
|
|
7
|
+
import React, { useCallback, useState } from 'react';
|
|
8
|
+
import { toast } from 'sonner';
|
|
8
9
|
import { useForm, useFormModified } from '../../forms/Form/context.js';
|
|
9
10
|
import { FormSubmit } from '../../forms/Submit/index.js';
|
|
10
11
|
import { useHotkey } from '../../hooks/useHotkey.js';
|
|
@@ -14,8 +15,11 @@ import { useEditDepth } from '../../providers/EditDepth/index.js';
|
|
|
14
15
|
import { useLocale } from '../../providers/Locale/index.js';
|
|
15
16
|
import { useOperation } from '../../providers/Operation/index.js';
|
|
16
17
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
18
|
+
import { useUploadEdits } from '../../providers/UploadEdits/index.js';
|
|
17
19
|
import { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js';
|
|
18
20
|
import { PopupList } from '../Popup/index.js';
|
|
21
|
+
import { FieldErrorsToast } from '../Toasts/fieldErrors.js';
|
|
22
|
+
import { validateDocumentLocales } from './validateAllLocales.js';
|
|
19
23
|
import './index.css';
|
|
20
24
|
export function PublishButton({
|
|
21
25
|
label: labelProp
|
|
@@ -37,13 +41,18 @@ export function PublishButton({
|
|
|
37
41
|
getEntityConfig
|
|
38
42
|
} = useConfig();
|
|
39
43
|
const {
|
|
44
|
+
getData,
|
|
40
45
|
submit
|
|
41
46
|
} = useForm();
|
|
47
|
+
const {
|
|
48
|
+
uploadEdits
|
|
49
|
+
} = useUploadEdits();
|
|
42
50
|
const modified = useFormModified();
|
|
43
51
|
const editDepth = useEditDepth();
|
|
44
52
|
const locale = useLocale();
|
|
45
53
|
const localeCode = locale?.code;
|
|
46
54
|
const {
|
|
55
|
+
blocksMap,
|
|
47
56
|
localization,
|
|
48
57
|
routes: {
|
|
49
58
|
api
|
|
@@ -69,7 +78,11 @@ export function PublishButton({
|
|
|
69
78
|
}, [collectionSlug, globalSlug, getEntityConfig]);
|
|
70
79
|
const hasNewerVersions = unpublishedVersionCount > 0;
|
|
71
80
|
const canPublish = hasPublishPermission && (modified || hasNewerVersions || !hasPublishedDoc) && uploadStatus !== 'uploading';
|
|
72
|
-
const
|
|
81
|
+
const [isValidatingLocales, setIsValidatingLocales] = useState(false);
|
|
82
|
+
const hasLocalizedFields = React.useMemo(() => Boolean(entityConfig?.fields && traverseForLocalizedFields({
|
|
83
|
+
blocksMap,
|
|
84
|
+
fields: entityConfig.fields
|
|
85
|
+
})), [blocksMap, entityConfig?.fields]);
|
|
73
86
|
const isSpecificLocalePublishEnabled = localization && hasLocalizedFields && hasPublishPermission;
|
|
74
87
|
const operation = useOperation();
|
|
75
88
|
const disabled = operation === 'update' && !modified;
|
|
@@ -83,7 +96,8 @@ export function PublishButton({
|
|
|
83
96
|
depth: 0,
|
|
84
97
|
draft: true,
|
|
85
98
|
'fallback-locale': 'null',
|
|
86
|
-
locale: localeCode
|
|
99
|
+
locale: localeCode,
|
|
100
|
+
uploadEdits: uploadEdits || undefined
|
|
87
101
|
}, {
|
|
88
102
|
addQueryPrefix: true
|
|
89
103
|
});
|
|
@@ -112,7 +126,7 @@ export function PublishButton({
|
|
|
112
126
|
},
|
|
113
127
|
skipValidation: true
|
|
114
128
|
});
|
|
115
|
-
}, [disabled, localeCode, collectionSlug, globalSlug, submit, api, id]);
|
|
129
|
+
}, [disabled, localeCode, collectionSlug, globalSlug, submit, api, id, uploadEdits]);
|
|
116
130
|
useHotkey({
|
|
117
131
|
cmdCtrlKey: true,
|
|
118
132
|
editDepth,
|
|
@@ -129,9 +143,56 @@ export function PublishButton({
|
|
|
129
143
|
if (uploadStatus === 'uploading') {
|
|
130
144
|
return;
|
|
131
145
|
}
|
|
146
|
+
if (localization && hasLocalizedFields) {
|
|
147
|
+
setIsValidatingLocales(true);
|
|
148
|
+
let validation;
|
|
149
|
+
try {
|
|
150
|
+
const encodedID = id === undefined ? '' : `/${encodeURIComponent(String(id))}`;
|
|
151
|
+
let validationPath;
|
|
152
|
+
if (globalSlug) {
|
|
153
|
+
validationPath = `/globals/${encodeURIComponent(globalSlug)}/validate`;
|
|
154
|
+
} else if (collectionSlug) {
|
|
155
|
+
validationPath = `/${encodeURIComponent(collectionSlug)}${encodedID}/validate`;
|
|
156
|
+
} else {
|
|
157
|
+
throw new Error('Document validation requires a collection or global slug.');
|
|
158
|
+
}
|
|
159
|
+
validation = await validateDocumentLocales({
|
|
160
|
+
activeLocale: localeCode,
|
|
161
|
+
blocksMap,
|
|
162
|
+
data: {
|
|
163
|
+
...getData(),
|
|
164
|
+
_status: 'published'
|
|
165
|
+
},
|
|
166
|
+
endpoint: formatAdminURL({
|
|
167
|
+
apiRoute: api,
|
|
168
|
+
path: validationPath
|
|
169
|
+
}),
|
|
170
|
+
fields: entityConfig?.fields ?? [],
|
|
171
|
+
locales: localization.locales.map(({
|
|
172
|
+
code
|
|
173
|
+
}) => code)
|
|
174
|
+
});
|
|
175
|
+
} catch {
|
|
176
|
+
toast.error(t('error:unknown'));
|
|
177
|
+
return;
|
|
178
|
+
} finally {
|
|
179
|
+
setIsValidatingLocales(false);
|
|
180
|
+
}
|
|
181
|
+
if (!validation.valid) {
|
|
182
|
+
const introMessage = t('error:followingFieldsInvalid', {
|
|
183
|
+
count: validation.errors.length
|
|
184
|
+
});
|
|
185
|
+
const fieldList = validation.errors.map(error => `${error.locale ? `[${error.locale}] ` : ''}${error.label ? getTranslation(error.label, i18n) : error.path}`).join(', ');
|
|
186
|
+
toast.error(/*#__PURE__*/_jsx(FieldErrorsToast, {
|
|
187
|
+
errorMessage: `${introMessage} ${fieldList}`
|
|
188
|
+
}));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
132
192
|
const params_0 = qs.stringify({
|
|
133
193
|
depth: 0,
|
|
134
194
|
locale: localeCode,
|
|
195
|
+
uploadEdits: uploadEdits || undefined,
|
|
135
196
|
...(localizeStatusEnabled && {
|
|
136
197
|
publishAllLocales: true
|
|
137
198
|
})
|
|
@@ -153,14 +214,15 @@ export function PublishButton({
|
|
|
153
214
|
setMostRecentVersionIsAutosaved(false);
|
|
154
215
|
setHasPublishedDoc(true);
|
|
155
216
|
}
|
|
156
|
-
}, [localeCode, localizeStatusEnabled, api, collectionSlug, globalSlug, id, setHasPublishedDoc, submit, setUnpublishedVersionCount, uploadStatus, setMostRecentVersionIsAutosaved]);
|
|
217
|
+
}, [localeCode, localizeStatusEnabled, api, blocksMap, collectionSlug, entityConfig?.fields, getData, globalSlug, hasLocalizedFields, id, localization, i18n, setHasPublishedDoc, submit, setUnpublishedVersionCount, t, uploadStatus, setMostRecentVersionIsAutosaved, uploadEdits]);
|
|
157
218
|
const publishLocale = useCallback(async locale_0 => {
|
|
158
219
|
if (uploadStatus === 'uploading') {
|
|
159
220
|
return;
|
|
160
221
|
}
|
|
161
222
|
const params_1 = qs.stringify({
|
|
162
223
|
depth: 0,
|
|
163
|
-
locale: locale_0
|
|
224
|
+
locale: locale_0,
|
|
225
|
+
uploadEdits: uploadEdits || undefined
|
|
164
226
|
}, {
|
|
165
227
|
addQueryPrefix: true
|
|
166
228
|
});
|
|
@@ -180,7 +242,7 @@ export function PublishButton({
|
|
|
180
242
|
setMostRecentVersionIsAutosaved(false);
|
|
181
243
|
setHasPublishedDoc(true);
|
|
182
244
|
}
|
|
183
|
-
}, [api, collectionSlug, globalSlug, id, setHasPublishedDoc, setMostRecentVersionIsAutosaved, setUnpublishedVersionCount, submit, uploadStatus]);
|
|
245
|
+
}, [api, collectionSlug, globalSlug, id, setHasPublishedDoc, setMostRecentVersionIsAutosaved, setUnpublishedVersionCount, submit, uploadStatus, uploadEdits]);
|
|
184
246
|
const activeLocale = localization && localization?.locales.find(locale_1 => typeof locale_1 === 'string' ? locale_1 === localeCode : locale_1.code === localeCode);
|
|
185
247
|
const activeLocaleLabel = activeLocale && getTranslation(activeLocale.label, i18n);
|
|
186
248
|
if (!hasPublishPermission) {
|
|
@@ -189,7 +251,8 @@ export function PublishButton({
|
|
|
189
251
|
return /*#__PURE__*/_jsx(React.Fragment, {
|
|
190
252
|
children: /*#__PURE__*/_jsx(FormSubmit, {
|
|
191
253
|
buttonId: "action-save",
|
|
192
|
-
disabled: !canPublish,
|
|
254
|
+
disabled: !canPublish || isValidatingLocales,
|
|
255
|
+
loading: isValidatingLocales,
|
|
193
256
|
onClick: isSpecificLocalePublishEnabled ? () => publishLocale(activeLocale.code) : publish,
|
|
194
257
|
size: "medium",
|
|
195
258
|
SubMenuPopupContent: isSpecificLocalePublishEnabled ? () => /*#__PURE__*/_jsx(PopupList.ButtonGroup, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["getTranslation","formatAdminURL","hasAutosaveEnabled","hasLocalizeStatusEnabled","qs","React","useCallback","useForm","useFormModified","FormSubmit","useHotkey","useConfig","useDocumentInfo","useEditDepth","useLocale","useOperation","useTranslation","traverseForLocalizedFields","PopupList","PublishButton","label","labelProp","id","collectionSlug","globalSlug","hasPublishedDoc","hasPublishPermission","setHasPublishedDoc","setMostRecentVersionIsAutosaved","setUnpublishedVersionCount","unpublishedVersionCount","uploadStatus","config","getEntityConfig","submit","modified","editDepth","locale","localeCode","code","localization","routes","api","i18n","t","shortLabel","entityConfig","useMemo","hasNewerVersions","canPublish","hasLocalizedFields","Boolean","fields","isSpecificLocalePublishEnabled","operation","disabled","hasAutosave","saveDraft","params","stringify","depth","draft","addQueryPrefix","action","method","apiRoute","path","overrides","_status","skipValidation","cmdCtrlKey","keyCodes","e","preventDefault","stopPropagation","localizeStatusEnabled","publish","publishAllLocales","result","publishLocale","pathSegment","activeLocale","locales","find","activeLocaleLabel","_jsx","Fragment","buttonId","onClick","size","SubMenuPopupContent","ButtonGroup","Button","undefined","type","_jsxs","className"],"sources":["../../../src/elements/PublishButton/index.tsx"],"sourcesContent":["'use client'\n\nimport type { PublishButtonClientProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatAdminURL, hasAutosaveEnabled, hasLocalizeStatusEnabled } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback } from 'react'\n\nimport { useForm, useFormModified } from '../../forms/Form/context.js'\nimport { FormSubmit } from '../../forms/Submit/index.js'\nimport { useHotkey } from '../../hooks/useHotkey.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useEditDepth } from '../../providers/EditDepth/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useOperation } from '../../providers/Operation/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js'\nimport { PopupList } from '../Popup/index.js'\nimport './index.css'\n\nexport function PublishButton({\n label: labelProp,\n}: { label?: string } & PublishButtonClientProps = {}) {\n const {\n id,\n collectionSlug,\n globalSlug,\n hasPublishedDoc,\n hasPublishPermission,\n setHasPublishedDoc,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n unpublishedVersionCount,\n uploadStatus,\n } = useDocumentInfo()\n\n const { config, getEntityConfig } = useConfig()\n const { submit } = useForm()\n const modified = useFormModified()\n const editDepth = useEditDepth()\n const locale = useLocale()\n const localeCode = locale?.code\n const {\n localization,\n routes: { api },\n } = config\n\n const { i18n, t } = useTranslation()\n const label = labelProp || t('version:publishChanges')\n const shortLabel = labelProp || t('version:publish')\n\n const entityConfig = React.useMemo(() => {\n if (collectionSlug) {\n return getEntityConfig({ collectionSlug })\n }\n\n if (globalSlug) {\n return getEntityConfig({ globalSlug })\n }\n }, [collectionSlug, globalSlug, getEntityConfig])\n\n const hasNewerVersions = unpublishedVersionCount > 0\n\n const canPublish =\n hasPublishPermission &&\n (modified || hasNewerVersions || !hasPublishedDoc) &&\n uploadStatus !== 'uploading'\n\n const hasLocalizedFields = React.useMemo(\n () => Boolean(entityConfig?.fields && traverseForLocalizedFields(entityConfig.fields)),\n [entityConfig?.fields],\n )\n\n const isSpecificLocalePublishEnabled = localization && hasLocalizedFields && hasPublishPermission\n\n const operation = useOperation()\n\n const disabled = operation === 'update' && !modified\n\n // If autosave is enabled the modified will always be true so only conditionally check on modified state\n const hasAutosave = hasAutosaveEnabled(entityConfig)\n\n const saveDraft = useCallback(async () => {\n if (disabled) {\n return\n }\n\n const params = qs.stringify(\n {\n depth: 0,\n draft: true,\n 'fallback-locale': 'null',\n locale: localeCode,\n },\n { addQueryPrefix: true },\n )\n\n let action\n let method = 'POST'\n\n if (collectionSlug) {\n action = formatAdminURL({\n apiRoute: api,\n path: `/${collectionSlug}${id ? `/${id}` : ''}${params}`,\n })\n if (id) {\n method = 'PATCH'\n }\n }\n\n if (globalSlug) {\n action = formatAdminURL({\n apiRoute: api,\n path: `/globals/${globalSlug}${params}`,\n })\n }\n\n await submit({\n action,\n method,\n overrides: {\n _status: 'draft',\n },\n skipValidation: true,\n })\n }, [disabled, localeCode, collectionSlug, globalSlug, submit, api, id])\n\n useHotkey({ cmdCtrlKey: true, editDepth, keyCodes: ['s'] }, (e) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (saveDraft && hasAutosave) {\n void saveDraft()\n }\n })\n\n const localizeStatusEnabled = hasLocalizeStatusEnabled(entityConfig)\n\n const publish = useCallback(async () => {\n if (uploadStatus === 'uploading') {\n return\n }\n\n const params = qs.stringify(\n {\n depth: 0,\n locale: localeCode,\n ...(localizeStatusEnabled && { publishAllLocales: true }),\n },\n { addQueryPrefix: true },\n )\n\n const action = formatAdminURL({\n apiRoute: api,\n path: `${\n globalSlug ? `/globals/${globalSlug}` : `/${collectionSlug}${id ? `/${id}` : ''}`\n }${params}` as `/${string}`,\n })\n\n const result = await submit({\n action,\n overrides: {\n _status: 'published',\n },\n })\n\n if (result) {\n setUnpublishedVersionCount(0)\n setMostRecentVersionIsAutosaved(false)\n setHasPublishedDoc(true)\n }\n }, [\n localeCode,\n localizeStatusEnabled,\n api,\n collectionSlug,\n globalSlug,\n id,\n setHasPublishedDoc,\n submit,\n setUnpublishedVersionCount,\n uploadStatus,\n setMostRecentVersionIsAutosaved,\n ])\n\n const publishLocale = useCallback(\n async (locale) => {\n if (uploadStatus === 'uploading') {\n return\n }\n\n const params = qs.stringify(\n {\n depth: 0,\n locale,\n },\n { addQueryPrefix: true },\n )\n\n const pathSegment = globalSlug\n ? `/globals/${globalSlug}`\n : `/${collectionSlug}${id ? `/${id}` : ''}`\n const action = formatAdminURL({\n apiRoute: api,\n path: `${pathSegment}${params}` as `/${string}`,\n })\n\n const result = await submit({\n action,\n overrides: {\n _status: 'published',\n },\n })\n\n if (result) {\n setUnpublishedVersionCount(0)\n setMostRecentVersionIsAutosaved(false)\n setHasPublishedDoc(true)\n }\n },\n [\n api,\n collectionSlug,\n globalSlug,\n id,\n setHasPublishedDoc,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n submit,\n uploadStatus,\n ],\n )\n\n const activeLocale =\n localization &&\n localization?.locales.find((locale) =>\n typeof locale === 'string' ? locale === localeCode : locale.code === localeCode,\n )\n\n const activeLocaleLabel = activeLocale && getTranslation(activeLocale.label, i18n)\n\n if (!hasPublishPermission) {\n return null\n }\n\n return (\n <React.Fragment>\n <FormSubmit\n buttonId=\"action-save\"\n disabled={!canPublish}\n onClick={isSpecificLocalePublishEnabled ? () => publishLocale(activeLocale.code) : publish}\n size=\"medium\"\n SubMenuPopupContent={\n isSpecificLocalePublishEnabled\n ? () => (\n <PopupList.ButtonGroup>\n <PopupList.Button id=\"publish-all-locales\" onClick={publish}>\n {t('version:publishAllLocales')}\n </PopupList.Button>\n </PopupList.ButtonGroup>\n )\n : undefined\n }\n type=\"button\"\n >\n {isSpecificLocalePublishEnabled ? (\n t('version:publishIn', { locale: activeLocaleLabel })\n ) : (\n <React.Fragment>\n <span className=\"publish-button__label--full\">{label}</span>\n <span className=\"publish-button__label--short\">{shortLabel}</span>\n </React.Fragment>\n )}\n </FormSubmit>\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["getTranslation","formatAdminURL","hasAutosaveEnabled","hasLocalizeStatusEnabled","qs","React","useCallback","useState","toast","useForm","useFormModified","FormSubmit","useHotkey","useConfig","useDocumentInfo","useEditDepth","useLocale","useOperation","useTranslation","useUploadEdits","traverseForLocalizedFields","PopupList","FieldErrorsToast","validateDocumentLocales","PublishButton","label","labelProp","id","collectionSlug","globalSlug","hasPublishedDoc","hasPublishPermission","setHasPublishedDoc","setMostRecentVersionIsAutosaved","setUnpublishedVersionCount","unpublishedVersionCount","uploadStatus","config","getEntityConfig","getData","submit","uploadEdits","modified","editDepth","locale","localeCode","code","blocksMap","localization","routes","api","i18n","t","shortLabel","entityConfig","useMemo","hasNewerVersions","canPublish","isValidatingLocales","setIsValidatingLocales","hasLocalizedFields","Boolean","fields","isSpecificLocalePublishEnabled","operation","disabled","hasAutosave","saveDraft","params","stringify","depth","draft","undefined","addQueryPrefix","action","method","apiRoute","path","overrides","_status","skipValidation","cmdCtrlKey","keyCodes","e","preventDefault","stopPropagation","localizeStatusEnabled","publish","validation","encodedID","encodeURIComponent","String","validationPath","Error","activeLocale","data","endpoint","locales","map","error","valid","introMessage","count","errors","length","fieldList","join","_jsx","errorMessage","publishAllLocales","result","publishLocale","pathSegment","find","activeLocaleLabel","Fragment","buttonId","loading","onClick","size","SubMenuPopupContent","ButtonGroup","Button","type","_jsxs","className"],"sources":["../../../src/elements/PublishButton/index.tsx"],"sourcesContent":["'use client'\n\nimport type { PublishButtonClientProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatAdminURL, hasAutosaveEnabled, hasLocalizeStatusEnabled } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React, { useCallback, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport { useForm, useFormModified } from '../../forms/Form/context.js'\nimport { FormSubmit } from '../../forms/Submit/index.js'\nimport { useHotkey } from '../../hooks/useHotkey.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useEditDepth } from '../../providers/EditDepth/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useOperation } from '../../providers/Operation/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { useUploadEdits } from '../../providers/UploadEdits/index.js'\nimport { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js'\nimport { PopupList } from '../Popup/index.js'\nimport { FieldErrorsToast } from '../Toasts/fieldErrors.js'\nimport { validateDocumentLocales } from './validateAllLocales.js'\nimport './index.css'\n\nexport function PublishButton({\n label: labelProp,\n}: { label?: string } & PublishButtonClientProps = {}) {\n const {\n id,\n collectionSlug,\n globalSlug,\n hasPublishedDoc,\n hasPublishPermission,\n setHasPublishedDoc,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n unpublishedVersionCount,\n uploadStatus,\n } = useDocumentInfo()\n\n const { config, getEntityConfig } = useConfig()\n const { getData, submit } = useForm()\n const { uploadEdits } = useUploadEdits()\n const modified = useFormModified()\n const editDepth = useEditDepth()\n const locale = useLocale()\n const localeCode = locale?.code\n const {\n blocksMap,\n localization,\n routes: { api },\n } = config\n\n const { i18n, t } = useTranslation()\n const label = labelProp || t('version:publishChanges')\n const shortLabel = labelProp || t('version:publish')\n\n const entityConfig = React.useMemo(() => {\n if (collectionSlug) {\n return getEntityConfig({ collectionSlug })\n }\n\n if (globalSlug) {\n return getEntityConfig({ globalSlug })\n }\n }, [collectionSlug, globalSlug, getEntityConfig])\n\n const hasNewerVersions = unpublishedVersionCount > 0\n\n const canPublish =\n hasPublishPermission &&\n (modified || hasNewerVersions || !hasPublishedDoc) &&\n uploadStatus !== 'uploading'\n\n const [isValidatingLocales, setIsValidatingLocales] = useState(false)\n\n const hasLocalizedFields = React.useMemo(\n () =>\n Boolean(\n entityConfig?.fields &&\n traverseForLocalizedFields({\n blocksMap,\n fields: entityConfig.fields,\n }),\n ),\n [blocksMap, entityConfig?.fields],\n )\n\n const isSpecificLocalePublishEnabled = localization && hasLocalizedFields && hasPublishPermission\n\n const operation = useOperation()\n\n const disabled = operation === 'update' && !modified\n\n // If autosave is enabled the modified will always be true so only conditionally check on modified state\n const hasAutosave = hasAutosaveEnabled(entityConfig)\n\n const saveDraft = useCallback(async () => {\n if (disabled) {\n return\n }\n\n const params = qs.stringify(\n {\n depth: 0,\n draft: true,\n 'fallback-locale': 'null',\n locale: localeCode,\n uploadEdits: uploadEdits || undefined,\n },\n { addQueryPrefix: true },\n )\n\n let action\n let method = 'POST'\n\n if (collectionSlug) {\n action = formatAdminURL({\n apiRoute: api,\n path: `/${collectionSlug}${id ? `/${id}` : ''}${params}`,\n })\n if (id) {\n method = 'PATCH'\n }\n }\n\n if (globalSlug) {\n action = formatAdminURL({\n apiRoute: api,\n path: `/globals/${globalSlug}${params}`,\n })\n }\n\n await submit({\n action,\n method,\n overrides: {\n _status: 'draft',\n },\n skipValidation: true,\n })\n }, [disabled, localeCode, collectionSlug, globalSlug, submit, api, id, uploadEdits])\n\n useHotkey({ cmdCtrlKey: true, editDepth, keyCodes: ['s'] }, (e) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (saveDraft && hasAutosave) {\n void saveDraft()\n }\n })\n\n const localizeStatusEnabled = hasLocalizeStatusEnabled(entityConfig)\n\n const publish = useCallback(async () => {\n if (uploadStatus === 'uploading') {\n return\n }\n\n if (localization && hasLocalizedFields) {\n setIsValidatingLocales(true)\n let validation\n\n try {\n const encodedID = id === undefined ? '' : `/${encodeURIComponent(String(id))}`\n let validationPath: `/${string}`\n\n if (globalSlug) {\n validationPath = `/globals/${encodeURIComponent(globalSlug)}/validate`\n } else if (collectionSlug) {\n validationPath = `/${encodeURIComponent(collectionSlug)}${encodedID}/validate`\n } else {\n throw new Error('Document validation requires a collection or global slug.')\n }\n\n validation = await validateDocumentLocales({\n activeLocale: localeCode,\n blocksMap,\n data: { ...getData(), _status: 'published' },\n endpoint: formatAdminURL({ apiRoute: api, path: validationPath }),\n fields: entityConfig?.fields ?? [],\n locales: localization.locales.map(({ code }) => code),\n })\n } catch {\n toast.error(t('error:unknown'))\n return\n } finally {\n setIsValidatingLocales(false)\n }\n\n if (!validation.valid) {\n const introMessage = t('error:followingFieldsInvalid', { count: validation.errors.length })\n const fieldList = validation.errors\n .map(\n (error) =>\n `${error.locale ? `[${error.locale}] ` : ''}${\n error.label ? getTranslation(error.label, i18n) : error.path\n }`,\n )\n .join(', ')\n\n toast.error(<FieldErrorsToast errorMessage={`${introMessage} ${fieldList}`} />)\n return\n }\n }\n\n const params = qs.stringify(\n {\n depth: 0,\n locale: localeCode,\n uploadEdits: uploadEdits || undefined,\n ...(localizeStatusEnabled && { publishAllLocales: true }),\n },\n { addQueryPrefix: true },\n )\n\n const action = formatAdminURL({\n apiRoute: api,\n path: `${\n globalSlug ? `/globals/${globalSlug}` : `/${collectionSlug}${id ? `/${id}` : ''}`\n }${params}` as `/${string}`,\n })\n\n const result = await submit({\n action,\n overrides: {\n _status: 'published',\n },\n })\n\n if (result) {\n setUnpublishedVersionCount(0)\n setMostRecentVersionIsAutosaved(false)\n setHasPublishedDoc(true)\n }\n }, [\n localeCode,\n localizeStatusEnabled,\n api,\n blocksMap,\n collectionSlug,\n entityConfig?.fields,\n getData,\n globalSlug,\n hasLocalizedFields,\n id,\n localization,\n i18n,\n setHasPublishedDoc,\n submit,\n setUnpublishedVersionCount,\n t,\n uploadStatus,\n setMostRecentVersionIsAutosaved,\n uploadEdits,\n ])\n\n const publishLocale = useCallback(\n async (locale) => {\n if (uploadStatus === 'uploading') {\n return\n }\n\n const params = qs.stringify(\n {\n depth: 0,\n locale,\n uploadEdits: uploadEdits || undefined,\n },\n { addQueryPrefix: true },\n )\n\n const pathSegment = globalSlug\n ? `/globals/${globalSlug}`\n : `/${collectionSlug}${id ? `/${id}` : ''}`\n const action = formatAdminURL({\n apiRoute: api,\n path: `${pathSegment}${params}` as `/${string}`,\n })\n\n const result = await submit({\n action,\n overrides: {\n _status: 'published',\n },\n })\n\n if (result) {\n setUnpublishedVersionCount(0)\n setMostRecentVersionIsAutosaved(false)\n setHasPublishedDoc(true)\n }\n },\n [\n api,\n collectionSlug,\n globalSlug,\n id,\n setHasPublishedDoc,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n submit,\n uploadStatus,\n uploadEdits,\n ],\n )\n\n const activeLocale =\n localization &&\n localization?.locales.find((locale) =>\n typeof locale === 'string' ? locale === localeCode : locale.code === localeCode,\n )\n\n const activeLocaleLabel = activeLocale && getTranslation(activeLocale.label, i18n)\n\n if (!hasPublishPermission) {\n return null\n }\n\n return (\n <React.Fragment>\n <FormSubmit\n buttonId=\"action-save\"\n disabled={!canPublish || isValidatingLocales}\n loading={isValidatingLocales}\n onClick={isSpecificLocalePublishEnabled ? () => publishLocale(activeLocale.code) : publish}\n size=\"medium\"\n SubMenuPopupContent={\n isSpecificLocalePublishEnabled\n ? () => (\n <PopupList.ButtonGroup>\n <PopupList.Button id=\"publish-all-locales\" onClick={publish}>\n {t('version:publishAllLocales')}\n </PopupList.Button>\n </PopupList.ButtonGroup>\n )\n : undefined\n }\n type=\"button\"\n >\n {isSpecificLocalePublishEnabled ? (\n t('version:publishIn', { locale: activeLocaleLabel })\n ) : (\n <React.Fragment>\n <span className=\"publish-button__label--full\">{label}</span>\n <span className=\"publish-button__label--short\">{shortLabel}</span>\n </React.Fragment>\n )}\n </FormSubmit>\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ClientBlock, ClientField, Data, ValidationResult } from 'payload';
|
|
2
|
+
export declare function validateDocumentLocales({ activeLocale, blocksMap, data, endpoint, fields, locales, signal, }: {
|
|
3
|
+
activeLocale: string;
|
|
4
|
+
blocksMap: Record<string, ClientBlock>;
|
|
5
|
+
data: Data;
|
|
6
|
+
endpoint: string;
|
|
7
|
+
fields: ClientField[];
|
|
8
|
+
locales: string[];
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
}): Promise<ValidationResult>;
|
|
11
|
+
//# sourceMappingURL=validateAllLocales.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateAllLocales.d.ts","sourceRoot":"","sources":["../../../src/elements/PublishButton/validateAllLocales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,IAAI,EAEJ,gBAAgB,EACjB,MAAM,SAAS,CAAA;AA6ChB,wBAAsB,uBAAuB,CAAC,EAC5C,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACtC,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0C5B"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { deepCopyObjectSimple, fieldAffectsData, fieldShouldBeLocalized, tabHasName } from 'payload/shared';
|
|
2
|
+
import * as qs from 'qs-esm';
|
|
3
|
+
import { requests } from '../../utilities/api.js';
|
|
4
|
+
function projectValidationDataForSiblingLocales({
|
|
5
|
+
blocksMap,
|
|
6
|
+
data,
|
|
7
|
+
fields
|
|
8
|
+
}) {
|
|
9
|
+
const projectedData = deepCopyObjectSimple(data);
|
|
10
|
+
const status = projectedData._status;
|
|
11
|
+
removeLocalizedFieldValues({
|
|
12
|
+
blocksMap,
|
|
13
|
+
data: projectedData,
|
|
14
|
+
fields,
|
|
15
|
+
parentIsLocalized: false
|
|
16
|
+
});
|
|
17
|
+
if (status !== undefined) {
|
|
18
|
+
projectedData._status = status;
|
|
19
|
+
}
|
|
20
|
+
return projectedData;
|
|
21
|
+
}
|
|
22
|
+
export async function validateDocumentLocales({
|
|
23
|
+
activeLocale,
|
|
24
|
+
blocksMap,
|
|
25
|
+
data,
|
|
26
|
+
endpoint,
|
|
27
|
+
fields,
|
|
28
|
+
locales,
|
|
29
|
+
signal
|
|
30
|
+
}) {
|
|
31
|
+
const selectedLocales = locales.filter((locale, index) => locales.indexOf(locale) === index);
|
|
32
|
+
const validationResults = [];
|
|
33
|
+
if (selectedLocales.length === 0) {
|
|
34
|
+
throw new Error('Document validation requires at least one locale.');
|
|
35
|
+
}
|
|
36
|
+
if (selectedLocales.includes(activeLocale)) {
|
|
37
|
+
validationResults.push(await requestDocumentValidation({
|
|
38
|
+
body: data,
|
|
39
|
+
endpoint,
|
|
40
|
+
locales: [activeLocale],
|
|
41
|
+
signal
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
const siblingLocales = selectedLocales.filter(locale => locale !== activeLocale);
|
|
45
|
+
if (siblingLocales.length > 0) {
|
|
46
|
+
validationResults.push(await requestDocumentValidation({
|
|
47
|
+
body: projectValidationDataForSiblingLocales({
|
|
48
|
+
blocksMap,
|
|
49
|
+
data,
|
|
50
|
+
fields
|
|
51
|
+
}),
|
|
52
|
+
endpoint,
|
|
53
|
+
locales: siblingLocales,
|
|
54
|
+
signal
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
const errors = validationResults.flatMap(({
|
|
58
|
+
errors
|
|
59
|
+
}) => errors);
|
|
60
|
+
return {
|
|
61
|
+
errors,
|
|
62
|
+
valid: validationResults.every(({
|
|
63
|
+
valid
|
|
64
|
+
}) => valid)
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async function requestDocumentValidation({
|
|
68
|
+
body,
|
|
69
|
+
endpoint,
|
|
70
|
+
locales,
|
|
71
|
+
signal
|
|
72
|
+
}) {
|
|
73
|
+
const query = qs.stringify({
|
|
74
|
+
locale: locales
|
|
75
|
+
}, {
|
|
76
|
+
addQueryPrefix: true,
|
|
77
|
+
arrayFormat: 'repeat'
|
|
78
|
+
});
|
|
79
|
+
const response = await requests.post(`${endpoint}${query}`, {
|
|
80
|
+
body: JSON.stringify(body),
|
|
81
|
+
headers: {
|
|
82
|
+
'Content-Type': 'application/json'
|
|
83
|
+
},
|
|
84
|
+
signal
|
|
85
|
+
});
|
|
86
|
+
const responseData = await response.json();
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
throw new Error(getResponseErrorMessage(responseData) || response.statusText);
|
|
89
|
+
}
|
|
90
|
+
const result = parseValidationResult(responseData);
|
|
91
|
+
if (result) {
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
throw new Error(getResponseErrorMessage(responseData) || response.statusText);
|
|
95
|
+
}
|
|
96
|
+
function parseValidationResult(responseData) {
|
|
97
|
+
if (!isObject(responseData)) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
if (typeof responseData.valid === 'boolean' && Array.isArray(responseData.errors)) {
|
|
101
|
+
return {
|
|
102
|
+
errors: responseData.errors.filter(isValidationFieldError),
|
|
103
|
+
valid: responseData.valid
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (Array.isArray(responseData.errors)) {
|
|
107
|
+
const errors = responseData.errors.flatMap(error => {
|
|
108
|
+
if (!isObject(error) || !isObject(error.data) || !Array.isArray(error.data.errors)) {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
return error.data.errors.filter(isValidationFieldError);
|
|
112
|
+
});
|
|
113
|
+
if (errors.length > 0) {
|
|
114
|
+
return {
|
|
115
|
+
errors,
|
|
116
|
+
valid: false
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
function getResponseErrorMessage(responseData) {
|
|
123
|
+
if (!isObject(responseData)) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
if (typeof responseData.message === 'string') {
|
|
127
|
+
return responseData.message;
|
|
128
|
+
}
|
|
129
|
+
if (Array.isArray(responseData.errors)) {
|
|
130
|
+
const errorWithMessage = responseData.errors.find(error => isObject(error) && typeof error.message === 'string');
|
|
131
|
+
if (isObject(errorWithMessage) && typeof errorWithMessage.message === 'string') {
|
|
132
|
+
return errorWithMessage.message;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
function isValidationFieldError(value) {
|
|
138
|
+
return isObject(value) && typeof value.message === 'string' && typeof value.path === 'string' && (value.locale === undefined || typeof value.locale === 'string');
|
|
139
|
+
}
|
|
140
|
+
function removeLocalizedFieldValues({
|
|
141
|
+
blocksMap,
|
|
142
|
+
data,
|
|
143
|
+
fields,
|
|
144
|
+
parentIsLocalized
|
|
145
|
+
}) {
|
|
146
|
+
for (const field of fields) {
|
|
147
|
+
if (fieldAffectsData(field)) {
|
|
148
|
+
if (parentIsLocalized || fieldShouldBeLocalized({
|
|
149
|
+
field,
|
|
150
|
+
parentIsLocalized
|
|
151
|
+
})) {
|
|
152
|
+
delete data[field.name];
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const fieldValue = data[field.name];
|
|
156
|
+
switch (field.type) {
|
|
157
|
+
case 'array':
|
|
158
|
+
{
|
|
159
|
+
if (Array.isArray(fieldValue)) {
|
|
160
|
+
for (const row of fieldValue) {
|
|
161
|
+
if (isObject(row)) {
|
|
162
|
+
removeLocalizedFieldValues({
|
|
163
|
+
blocksMap,
|
|
164
|
+
data: row,
|
|
165
|
+
fields: field.fields,
|
|
166
|
+
parentIsLocalized: false
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
case 'blocks':
|
|
174
|
+
{
|
|
175
|
+
if (Array.isArray(fieldValue)) {
|
|
176
|
+
for (const row of fieldValue) {
|
|
177
|
+
if (!isObject(row) || typeof row.blockType !== 'string') {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const blockOrSlug = field.blocks.find(block => {
|
|
181
|
+
return (typeof block === 'string' ? block : block.slug) === row.blockType;
|
|
182
|
+
});
|
|
183
|
+
const block = typeof blockOrSlug === 'string' ? blocksMap[blockOrSlug] : blockOrSlug;
|
|
184
|
+
if (block) {
|
|
185
|
+
removeLocalizedFieldValues({
|
|
186
|
+
blocksMap,
|
|
187
|
+
data: row,
|
|
188
|
+
fields: block.fields,
|
|
189
|
+
parentIsLocalized: false
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case 'group':
|
|
197
|
+
{
|
|
198
|
+
if (isObject(fieldValue)) {
|
|
199
|
+
removeLocalizedFieldValues({
|
|
200
|
+
blocksMap,
|
|
201
|
+
data: fieldValue,
|
|
202
|
+
fields: field.fields,
|
|
203
|
+
parentIsLocalized: false
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
} else {
|
|
210
|
+
switch (field.type) {
|
|
211
|
+
case 'collapsible':
|
|
212
|
+
case 'group':
|
|
213
|
+
case 'row':
|
|
214
|
+
{
|
|
215
|
+
const isLocalized = parentIsLocalized || fieldShouldBeLocalized({
|
|
216
|
+
field,
|
|
217
|
+
parentIsLocalized
|
|
218
|
+
});
|
|
219
|
+
removeLocalizedFieldValues({
|
|
220
|
+
blocksMap,
|
|
221
|
+
data,
|
|
222
|
+
fields: field.fields,
|
|
223
|
+
parentIsLocalized: isLocalized
|
|
224
|
+
});
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
case 'tabs':
|
|
228
|
+
{
|
|
229
|
+
for (const tab of field.tabs) {
|
|
230
|
+
const isLocalized = parentIsLocalized || fieldShouldBeLocalized({
|
|
231
|
+
field: tab,
|
|
232
|
+
parentIsLocalized
|
|
233
|
+
});
|
|
234
|
+
if (tabHasName(tab)) {
|
|
235
|
+
if (isLocalized) {
|
|
236
|
+
delete data[tab.name];
|
|
237
|
+
} else if (isObject(data[tab.name])) {
|
|
238
|
+
removeLocalizedFieldValues({
|
|
239
|
+
blocksMap,
|
|
240
|
+
data: data[tab.name],
|
|
241
|
+
fields: tab.fields,
|
|
242
|
+
parentIsLocalized: false
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
removeLocalizedFieldValues({
|
|
247
|
+
blocksMap,
|
|
248
|
+
data,
|
|
249
|
+
fields: tab.fields,
|
|
250
|
+
parentIsLocalized: isLocalized
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function isObject(value) {
|
|
261
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=validateAllLocales.js.map
|