@payloadcms/ui 3.68.0-internal-debug.2eb12b9 → 3.68.0-internal-debug.185cc5f
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/AnimateHeight/usePatchAnimateHeight.js +2 -2
- package/dist/elements/AnimateHeight/usePatchAnimateHeight.js.map +1 -1
- package/dist/elements/Autosave/index.js +1 -0
- package/dist/elements/Autosave/index.js.map +1 -1
- package/dist/elements/BulkUpload/EditMany/index.js +2 -2
- package/dist/elements/BulkUpload/EditMany/index.js.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.js +8 -8
- package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
- package/dist/elements/BulkUpload/index.js +12 -1
- package/dist/elements/BulkUpload/index.js.map +1 -1
- package/dist/elements/Button/index.js +2 -2
- package/dist/elements/Button/index.js.map +1 -1
- package/dist/elements/Button/types.js +13 -1
- package/dist/elements/Button/types.js.map +1 -1
- package/dist/elements/Card/index.js +5 -1
- package/dist/elements/Card/index.js.map +1 -1
- package/dist/elements/CodeEditor/CodeEditor.js +2 -2
- package/dist/elements/CodeEditor/CodeEditor.js.map +1 -1
- package/dist/elements/CodeEditor/types.js +3 -1
- package/dist/elements/CodeEditor/types.js.map +1 -1
- package/dist/elements/Collapsible/index.js +8 -1
- package/dist/elements/Collapsible/index.js.map +1 -1
- package/dist/elements/Combobox/index.js +6 -0
- package/dist/elements/Combobox/index.js.map +1 -1
- package/dist/elements/DatePicker/DatePicker.js +1 -0
- package/dist/elements/DatePicker/DatePicker.js.map +1 -1
- package/dist/elements/DatePicker/getFormattedLocale.js +1 -0
- package/dist/elements/DatePicker/getFormattedLocale.js.map +1 -1
- package/dist/elements/DeleteMany/index.js +25 -1
- package/dist/elements/DeleteMany/index.js.map +1 -1
- package/dist/elements/DocumentControls/index.js +1 -1
- package/dist/elements/DocumentControls/index.js.map +1 -1
- package/dist/elements/DocumentDrawer/Provider.js +5 -1
- package/dist/elements/DocumentDrawer/Provider.js.map +1 -1
- package/dist/elements/DocumentDrawer/types.js +11 -1
- package/dist/elements/DocumentDrawer/types.js.map +1 -1
- package/dist/elements/DraggableSortable/useDraggableSortable/index.js +1 -0
- package/dist/elements/DraggableSortable/useDraggableSortable/index.js.map +1 -1
- package/dist/elements/Drawer/index.js +3 -1
- package/dist/elements/Drawer/index.js.map +1 -1
- package/dist/elements/EditMany/DrawerContent.js +15 -1
- package/dist/elements/EditMany/DrawerContent.js.map +1 -1
- package/dist/elements/EditMany/index.js +3 -1
- package/dist/elements/EditMany/index.js.map +1 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.js +8 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.js.map +1 -1
- package/dist/elements/FolderView/FolderFileCard/index.js +1 -0
- package/dist/elements/FolderView/FolderFileCard/index.js.map +1 -1
- package/dist/elements/FolderView/MoveDocToFolder/index.js +2 -3
- package/dist/elements/FolderView/MoveDocToFolder/index.js.map +1 -1
- package/dist/elements/HTMLDiff/diff/index.js +24 -3
- package/dist/elements/HTMLDiff/diff/index.js.map +1 -1
- package/dist/elements/HydrateAuthProvider/index.js +6 -1
- package/dist/elements/HydrateAuthProvider/index.js.map +1 -1
- package/dist/elements/LeaveWithoutSaving/usePreventLeave.js +3 -1
- package/dist/elements/LeaveWithoutSaving/usePreventLeave.js.map +1 -1
- package/dist/elements/Link/index.js +5 -1
- package/dist/elements/Link/index.js.map +1 -1
- package/dist/elements/ListControls/types.js +7 -1
- package/dist/elements/ListControls/types.js.map +1 -1
- package/dist/elements/ListDrawer/DrawerContent.js +2 -2
- package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
- package/dist/elements/ListDrawer/Provider.js +8 -1
- package/dist/elements/ListDrawer/Provider.js.map +1 -1
- package/dist/elements/ListDrawer/index.js +2 -1
- package/dist/elements/ListDrawer/index.js.map +1 -1
- package/dist/elements/ListDrawer/types.js +5 -1
- package/dist/elements/ListDrawer/types.js.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js +5 -1
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js.map +1 -1
- package/dist/elements/ListSelection/index.js +11 -1
- package/dist/elements/ListSelection/index.js.map +1 -1
- package/dist/elements/LivePreview/Toolbar/Controls/index.js +1 -1
- package/dist/elements/LivePreview/Toolbar/Controls/index.js.map +1 -1
- package/dist/elements/Logout/index.js +5 -1
- package/dist/elements/Logout/index.js.map +1 -1
- package/dist/elements/Pill/index.js +5 -2
- package/dist/elements/Pill/index.js.map +1 -1
- package/dist/elements/PublishMany/index.js +3 -1
- package/dist/elements/PublishMany/index.js.map +1 -1
- package/dist/elements/QueryPresets/QueryPresetBar/index.js +1 -2
- package/dist/elements/QueryPresets/QueryPresetBar/index.js.map +1 -1
- package/dist/elements/ReactSelect/index.js +2 -2
- package/dist/elements/ReactSelect/index.js.map +1 -1
- package/dist/elements/ReactSelect/types.js +8 -1
- package/dist/elements/ReactSelect/types.js.map +1 -1
- package/dist/elements/RelationshipTable/index.js +2 -2
- package/dist/elements/RelationshipTable/index.js.map +1 -1
- package/dist/elements/RestoreMany/index.js +1 -0
- package/dist/elements/RestoreMany/index.js.map +1 -1
- package/dist/elements/SaveButton/index.js +1 -2
- package/dist/elements/SaveButton/index.js.map +1 -1
- package/dist/elements/SaveDraftButton/index.js +1 -2
- package/dist/elements/SaveDraftButton/index.js.map +1 -1
- package/dist/elements/SearchFilter/types.js +19 -1
- package/dist/elements/SearchFilter/types.js.map +1 -1
- package/dist/elements/Status/index.js +2 -2
- package/dist/elements/Status/index.js.map +1 -1
- package/dist/elements/StepNav/index.js +5 -1
- package/dist/elements/StepNav/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/fields/Select/index.js +4 -4
- package/dist/elements/Table/DefaultCell/fields/Select/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/index.js +2 -1
- package/dist/elements/Table/DefaultCell/index.js.map +1 -1
- package/dist/elements/Table/RelationshipProvider/index.js +3 -0
- package/dist/elements/Table/RelationshipProvider/index.js.map +1 -1
- package/dist/elements/Thumbnail/createThumbnail.js +12 -12
- package/dist/elements/Thumbnail/createThumbnail.js.map +1 -1
- package/dist/elements/Tooltip/index.js +3 -1
- package/dist/elements/Tooltip/index.js.map +1 -1
- package/dist/elements/UnpublishMany/index.js +3 -1
- package/dist/elements/UnpublishMany/index.js.map +1 -1
- package/dist/elements/Upload/index.js +8 -8
- package/dist/elements/Upload/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Number/index.js +1 -0
- package/dist/elements/WhereBuilder/Condition/Number/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js +5 -6
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Text/index.js +1 -0
- package/dist/elements/WhereBuilder/Condition/Text/index.js.map +1 -1
- package/dist/elements/WhereBuilder/index.js +2 -2
- package/dist/elements/WhereBuilder/index.js.map +1 -1
- package/dist/exports/client/index.js +26 -2
- package/dist/exports/client/index.js.map +1 -1
- package/dist/exports/shared/index.js +2 -1
- package/dist/exports/shared/index.js.map +1 -1
- package/dist/fields/Blocks/BlockSelector/index.js +3 -1
- package/dist/fields/Blocks/BlockSelector/index.js.map +1 -1
- package/dist/fields/Email/index.js +1 -1
- package/dist/fields/Email/index.js.map +1 -1
- package/dist/fields/Group/index.js +1 -1
- package/dist/fields/Group/index.js.map +1 -1
- package/dist/fields/Number/index.js +5 -3
- package/dist/fields/Number/index.js.map +1 -1
- package/dist/fields/Password/types.js +11 -1
- package/dist/fields/Password/types.js.map +1 -1
- package/dist/fields/Point/index.js +2 -2
- package/dist/fields/Point/index.js.map +1 -1
- package/dist/fields/Relationship/select-components/MultiValueLabel/index.js +4 -1
- package/dist/fields/Relationship/select-components/MultiValueLabel/index.js.map +1 -1
- package/dist/fields/Relationship/select-components/SingleValue/index.js +4 -1
- package/dist/fields/Relationship/select-components/SingleValue/index.js.map +1 -1
- package/dist/fields/Text/index.js +3 -2
- package/dist/fields/Text/index.js.map +1 -1
- package/dist/fields/Upload/Input.js +3 -1
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/fields/Upload/types.js +1 -0
- package/dist/fields/Upload/types.js.map +1 -1
- package/dist/fields/shared/index.js +2 -3
- package/dist/fields/shared/index.js.map +1 -1
- package/dist/forms/Form/fieldReducer.js +2 -1
- package/dist/forms/Form/fieldReducer.js.map +1 -1
- package/dist/forms/Form/index.js +12 -9
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/forms/Form/mergeServerFormState.js +11 -3
- package/dist/forms/Form/mergeServerFormState.js.map +1 -1
- package/dist/forms/Form/reduceToSerializableFields.js +2 -2
- package/dist/forms/Form/reduceToSerializableFields.js.map +1 -1
- package/dist/forms/Form/types.js +52 -1
- package/dist/forms/Form/types.js.map +1 -1
- package/dist/forms/NullifyField/index.js +2 -1
- package/dist/forms/NullifyField/index.js.map +1 -1
- package/dist/forms/WatchChildErrors/index.js +6 -1
- package/dist/forms/WatchChildErrors/index.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +20 -0
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/index.js +33 -1
- package/dist/forms/fieldSchemasToFormState/index.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js +2 -2
- package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/iterateFields.js +16 -0
- package/dist/forms/fieldSchemasToFormState/iterateFields.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/renderField.js +2 -2
- package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js +22 -1
- package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/types.js +5 -1
- package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
- package/dist/forms/useField/index.js +1 -0
- package/dist/forms/useField/index.js.map +1 -1
- package/dist/forms/useField/types.js +19 -1
- package/dist/forms/useField/types.js.map +1 -1
- package/dist/hooks/useControllableState.js +9 -1
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useDelayedRender.js +3 -1
- package/dist/hooks/useDelayedRender.js.map +1 -1
- package/dist/hooks/useHotkey.js +2 -2
- package/dist/hooks/useHotkey.js.map +1 -1
- package/dist/hooks/usePayloadAPI.js +3 -4
- package/dist/hooks/usePayloadAPI.js.map +1 -1
- package/dist/hooks/usePopupWindow.js +2 -2
- package/dist/hooks/usePopupWindow.js.map +1 -1
- package/dist/hooks/useQueue.js +15 -7
- package/dist/hooks/useQueue.js.map +1 -1
- package/dist/hooks/useResize.js +4 -3
- package/dist/hooks/useResize.js.map +1 -1
- package/dist/providers/Auth/index.js +35 -3
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/providers/Config/index.js +10 -1
- package/dist/providers/Config/index.js.map +1 -1
- package/dist/providers/DocumentInfo/index.js +6 -7
- package/dist/providers/DocumentInfo/index.js.map +1 -1
- package/dist/providers/DocumentInfo/types.js +25 -1
- package/dist/providers/DocumentInfo/types.js.map +1 -1
- package/dist/providers/Folders/index.js +44 -2
- package/dist/providers/Folders/index.js.map +1 -1
- package/dist/providers/ListQuery/types.js +5 -1
- package/dist/providers/ListQuery/types.js.map +1 -1
- package/dist/providers/LivePreview/context.js +11 -1
- package/dist/providers/LivePreview/context.js.map +1 -1
- package/dist/providers/LivePreview/index.js +7 -4
- package/dist/providers/LivePreview/index.js.map +1 -1
- package/dist/providers/Preferences/index.js +7 -2
- package/dist/providers/Preferences/index.js.map +1 -1
- package/dist/providers/RouteTransition/index.js +9 -9
- package/dist/providers/RouteTransition/index.js.map +1 -1
- package/dist/providers/Selection/index.js +7 -2
- package/dist/providers/Selection/index.js.map +1 -1
- package/dist/providers/ServerFunctions/index.js +25 -22
- package/dist/providers/ServerFunctions/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/index.js +10 -9
- package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js +4 -3
- package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
- package/dist/providers/TableColumns/types.js +17 -1
- package/dist/providers/TableColumns/types.js.map +1 -1
- package/dist/utilities/abortAndIgnore.js +4 -6
- package/dist/utilities/abortAndIgnore.js.map +1 -1
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js +2 -2
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js.map +1 -1
- package/dist/utilities/copyDataFromLocale.js +6 -2
- package/dist/utilities/copyDataFromLocale.js.map +1 -1
- package/dist/utilities/getDisplayedFieldValue.js +8 -8
- package/dist/utilities/getDisplayedFieldValue.js.map +1 -1
- package/dist/utilities/getFolderResultsComponentAndData.js +2 -1
- package/dist/utilities/getFolderResultsComponentAndData.js.map +1 -1
- package/dist/utilities/handleFormStateLocking.js +2 -2
- package/dist/utilities/handleFormStateLocking.js.map +1 -1
- package/dist/utilities/hasSavePermission.js +5 -1
- package/dist/utilities/hasSavePermission.js.map +1 -1
- package/dist/utilities/isURLAllowed.js +6 -6
- package/dist/utilities/isURLAllowed.js.map +1 -1
- package/dist/utilities/renderTable.js +2 -1
- package/dist/utilities/renderTable.js.map +1 -1
- package/dist/utilities/schedulePublishHandler.js +3 -1
- package/dist/utilities/schedulePublishHandler.js.map +1 -1
- package/dist/utilities/upsertPreferences.js +1 -0
- package/dist/utilities/upsertPreferences.js.map +1 -1
- package/dist/views/Edit/index.js +7 -7
- package/dist/views/Edit/index.js.map +1 -1
- package/dist/views/List/ListHeader/index.js +6 -1
- package/dist/views/List/ListHeader/index.js.map +1 -1
- package/package.json +6 -5
|
@@ -33,8 +33,8 @@ export const usePatchAnimateHeight = ({ containerRef, contentRef, duration, open
|
|
|
33
33
|
setContainerHeight(open ? '0px' : `${content.scrollHeight}px`);
|
|
34
34
|
}
|
|
35
35
|
// Trigger reflow
|
|
36
|
-
container.offsetHeight
|
|
37
|
-
|
|
36
|
+
container.offsetHeight;
|
|
37
|
+
// eslint-disable-line @typescript-eslint/no-unused-expressions
|
|
38
38
|
setIsAnimating(true);
|
|
39
39
|
container.style.transition = `height ${duration}ms ease`;
|
|
40
40
|
setContainerHeight(open ? `${content.scrollHeight}px` : '0px');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/AnimateHeight/usePatchAnimateHeight.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react'\n\nexport const usePatchAnimateHeight = ({\n containerRef,\n contentRef,\n duration,\n open,\n}: {\n containerRef: React.RefObject<HTMLDivElement>\n contentRef: React.RefObject<HTMLDivElement>\n duration: number\n open: boolean\n}): { browserSupportsKeywordAnimation: boolean } => {\n const browserSupportsKeywordAnimation = useMemo(\n () =>\n typeof CSS !== 'undefined' && CSS && CSS.supports\n ? CSS.supports('interpolate-size', 'allow-keywords')\n : false,\n [],\n )\n\n const hasInitialized = useRef(false)\n const previousOpenState = useRef(open)\n const [isAnimating, setIsAnimating] = useState(false)\n const resizeObserverRef = useRef<null | ResizeObserver>(null)\n\n useEffect(() => {\n const container = containerRef.current\n const content = contentRef.current\n\n if (!container || !content || browserSupportsKeywordAnimation) {\n return\n }\n\n const setContainerHeight = (height: string) => {\n container.style.height = height\n }\n\n const handleTransitionEnd = () => {\n if (container) {\n container.style.transition = ''\n container.style.height = open ? 'auto' : '0px'\n setIsAnimating(false)\n }\n }\n\n const animate = () => {\n if (!hasInitialized.current && open) {\n // Skip animation on first render\n setContainerHeight('auto')\n setIsAnimating(false)\n return\n }\n\n hasInitialized.current = true\n\n if (previousOpenState.current !== open) {\n setContainerHeight(open ? '0px' : `${content.scrollHeight}px`)\n }\n\n // Trigger reflow\n container.offsetHeight // eslint-disable-line @typescript-eslint/no-unused-expressions\n\n setIsAnimating(true)\n container.style.transition = `height ${duration}ms ease`\n setContainerHeight(open ? `${content.scrollHeight}px` : '0px')\n\n const onTransitionEnd = () => {\n handleTransitionEnd()\n container.removeEventListener('transitionend', onTransitionEnd)\n }\n\n container.addEventListener('transitionend', onTransitionEnd)\n }\n\n animate()\n previousOpenState.current = open\n\n // Setup ResizeObserver\n resizeObserverRef.current = new ResizeObserver(() => {\n if (isAnimating) {\n container.style.height = open ? `${content.scrollHeight}px` : '0px'\n }\n })\n resizeObserverRef.current.observe(content)\n\n return () => {\n if (container) {\n container.style.transition = ''\n container.style.height = ''\n }\n resizeObserverRef.current?.disconnect()\n }\n }, [open, duration, containerRef, contentRef, browserSupportsKeywordAnimation])\n\n return { browserSupportsKeywordAnimation }\n}\n"],"names":["useEffect","useMemo","useRef","useState","usePatchAnimateHeight","containerRef","contentRef","duration","open","browserSupportsKeywordAnimation","CSS","supports","hasInitialized","previousOpenState","isAnimating","setIsAnimating","resizeObserverRef","container","current","content","setContainerHeight","height","style","handleTransitionEnd","transition","animate","scrollHeight","offsetHeight","onTransitionEnd","removeEventListener","addEventListener","ResizeObserver","observe","disconnect"],"mappings":"AAAA,SAASA,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAE5D,OAAO,MAAMC,wBAAwB,CAAC,EACpCC,YAAY,EACZC,UAAU,EACVC,QAAQ,EACRC,IAAI,EAML;IACC,MAAMC,kCAAkCR,QACtC,IACE,OAAOS,QAAQ,eAAeA,OAAOA,IAAIC,QAAQ,GAC7CD,IAAIC,QAAQ,CAAC,oBAAoB,oBACjC,OACN,EAAE;IAGJ,MAAMC,iBAAiBV,OAAO;IAC9B,MAAMW,oBAAoBX,OAAOM;IACjC,MAAM,CAACM,aAAaC,eAAe,GAAGZ,SAAS;IAC/C,MAAMa,oBAAoBd,OAA8B;IAExDF,UAAU;QACR,MAAMiB,YAAYZ,aAAaa,OAAO;QACtC,MAAMC,UAAUb,WAAWY,OAAO;QAElC,IAAI,CAACD,aAAa,CAACE,WAAWV,iCAAiC;YAC7D;QACF;QAEA,MAAMW,qBAAqB,CAACC;YAC1BJ,UAAUK,KAAK,CAACD,MAAM,GAAGA;QAC3B;QAEA,MAAME,sBAAsB;YAC1B,IAAIN,WAAW;gBACbA,UAAUK,KAAK,CAACE,UAAU,GAAG;gBAC7BP,UAAUK,KAAK,CAACD,MAAM,GAAGb,OAAO,SAAS;gBACzCO,eAAe;YACjB;QACF;QAEA,MAAMU,UAAU;YACd,IAAI,CAACb,eAAeM,OAAO,IAAIV,MAAM;gBACnC,iCAAiC;gBACjCY,mBAAmB;gBACnBL,eAAe;gBACf;YACF;YAEAH,eAAeM,OAAO,GAAG;YAEzB,IAAIL,kBAAkBK,OAAO,KAAKV,MAAM;gBACtCY,mBAAmBZ,OAAO,QAAQ,GAAGW,QAAQO,YAAY,CAAC,EAAE,CAAC;YAC/D;YAEA,iBAAiB;YACjBT,UAAUU,YAAY
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/AnimateHeight/usePatchAnimateHeight.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react'\n\nexport const usePatchAnimateHeight = ({\n containerRef,\n contentRef,\n duration,\n open,\n}: {\n containerRef: React.RefObject<HTMLDivElement>\n contentRef: React.RefObject<HTMLDivElement>\n duration: number\n open: boolean\n}): { browserSupportsKeywordAnimation: boolean } => {\n const browserSupportsKeywordAnimation = useMemo(\n () =>\n typeof CSS !== 'undefined' && CSS && CSS.supports\n ? CSS.supports('interpolate-size', 'allow-keywords')\n : false,\n [],\n )\n\n const hasInitialized = useRef(false)\n const previousOpenState = useRef(open)\n const [isAnimating, setIsAnimating] = useState(false)\n const resizeObserverRef = useRef<null | ResizeObserver>(null)\n\n useEffect(() => {\n const container = containerRef.current\n const content = contentRef.current\n\n if (!container || !content || browserSupportsKeywordAnimation) {\n return\n }\n\n const setContainerHeight = (height: string) => {\n container.style.height = height\n }\n\n const handleTransitionEnd = () => {\n if (container) {\n container.style.transition = ''\n container.style.height = open ? 'auto' : '0px'\n setIsAnimating(false)\n }\n }\n\n const animate = () => {\n if (!hasInitialized.current && open) {\n // Skip animation on first render\n setContainerHeight('auto')\n setIsAnimating(false)\n return\n }\n\n hasInitialized.current = true\n\n if (previousOpenState.current !== open) {\n setContainerHeight(open ? '0px' : `${content.scrollHeight}px`)\n }\n\n // Trigger reflow\n container.offsetHeight // eslint-disable-line @typescript-eslint/no-unused-expressions\n\n setIsAnimating(true)\n container.style.transition = `height ${duration}ms ease`\n setContainerHeight(open ? `${content.scrollHeight}px` : '0px')\n\n const onTransitionEnd = () => {\n handleTransitionEnd()\n container.removeEventListener('transitionend', onTransitionEnd)\n }\n\n container.addEventListener('transitionend', onTransitionEnd)\n }\n\n animate()\n previousOpenState.current = open\n\n // Setup ResizeObserver\n resizeObserverRef.current = new ResizeObserver(() => {\n if (isAnimating) {\n container.style.height = open ? `${content.scrollHeight}px` : '0px'\n }\n })\n resizeObserverRef.current.observe(content)\n\n return () => {\n if (container) {\n container.style.transition = ''\n container.style.height = ''\n }\n resizeObserverRef.current?.disconnect()\n }\n }, [open, duration, containerRef, contentRef, browserSupportsKeywordAnimation])\n\n return { browserSupportsKeywordAnimation }\n}\n"],"names":["useEffect","useMemo","useRef","useState","usePatchAnimateHeight","containerRef","contentRef","duration","open","browserSupportsKeywordAnimation","CSS","supports","hasInitialized","previousOpenState","isAnimating","setIsAnimating","resizeObserverRef","container","current","content","setContainerHeight","height","style","handleTransitionEnd","transition","animate","scrollHeight","offsetHeight","onTransitionEnd","removeEventListener","addEventListener","ResizeObserver","observe","disconnect"],"mappings":"AAAA,SAASA,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAE5D,OAAO,MAAMC,wBAAwB,CAAC,EACpCC,YAAY,EACZC,UAAU,EACVC,QAAQ,EACRC,IAAI,EAML;IACC,MAAMC,kCAAkCR,QACtC,IACE,OAAOS,QAAQ,eAAeA,OAAOA,IAAIC,QAAQ,GAC7CD,IAAIC,QAAQ,CAAC,oBAAoB,oBACjC,OACN,EAAE;IAGJ,MAAMC,iBAAiBV,OAAO;IAC9B,MAAMW,oBAAoBX,OAAOM;IACjC,MAAM,CAACM,aAAaC,eAAe,GAAGZ,SAAS;IAC/C,MAAMa,oBAAoBd,OAA8B;IAExDF,UAAU;QACR,MAAMiB,YAAYZ,aAAaa,OAAO;QACtC,MAAMC,UAAUb,WAAWY,OAAO;QAElC,IAAI,CAACD,aAAa,CAACE,WAAWV,iCAAiC;YAC7D;QACF;QAEA,MAAMW,qBAAqB,CAACC;YAC1BJ,UAAUK,KAAK,CAACD,MAAM,GAAGA;QAC3B;QAEA,MAAME,sBAAsB;YAC1B,IAAIN,WAAW;gBACbA,UAAUK,KAAK,CAACE,UAAU,GAAG;gBAC7BP,UAAUK,KAAK,CAACD,MAAM,GAAGb,OAAO,SAAS;gBACzCO,eAAe;YACjB;QACF;QAEA,MAAMU,UAAU;YACd,IAAI,CAACb,eAAeM,OAAO,IAAIV,MAAM;gBACnC,iCAAiC;gBACjCY,mBAAmB;gBACnBL,eAAe;gBACf;YACF;YAEAH,eAAeM,OAAO,GAAG;YAEzB,IAAIL,kBAAkBK,OAAO,KAAKV,MAAM;gBACtCY,mBAAmBZ,OAAO,QAAQ,GAAGW,QAAQO,YAAY,CAAC,EAAE,CAAC;YAC/D;YAEA,iBAAiB;YACjBT,UAAUU,YAAY;YAAC,+DAA+D;YAEtFZ,eAAe;YACfE,UAAUK,KAAK,CAACE,UAAU,GAAG,CAAC,OAAO,EAAEjB,SAAS,OAAO,CAAC;YACxDa,mBAAmBZ,OAAO,GAAGW,QAAQO,YAAY,CAAC,EAAE,CAAC,GAAG;YAExD,MAAME,kBAAkB;gBACtBL;gBACAN,UAAUY,mBAAmB,CAAC,iBAAiBD;YACjD;YAEAX,UAAUa,gBAAgB,CAAC,iBAAiBF;QAC9C;QAEAH;QACAZ,kBAAkBK,OAAO,GAAGV;QAE5B,uBAAuB;QACvBQ,kBAAkBE,OAAO,GAAG,IAAIa,eAAe;YAC7C,IAAIjB,aAAa;gBACfG,UAAUK,KAAK,CAACD,MAAM,GAAGb,OAAO,GAAGW,QAAQO,YAAY,CAAC,EAAE,CAAC,GAAG;YAChE;QACF;QACAV,kBAAkBE,OAAO,CAACc,OAAO,CAACb;QAElC,OAAO;YACL,IAAIF,WAAW;gBACbA,UAAUK,KAAK,CAACE,UAAU,GAAG;gBAC7BP,UAAUK,KAAK,CAACD,MAAM,GAAG;YAC3B;YACAL,kBAAkBE,OAAO,EAAEe;QAC7B;IACF,GAAG;QAACzB;QAAMD;QAAUF;QAAcC;QAAYG;KAAgC;IAE9E,OAAO;QAAEA;IAAgC;AAC3C,EAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
// TODO: abstract the `next/navigation` dependency out from this component
|
|
3
4
|
import { dequal } from 'dequal/lite';
|
|
4
5
|
import { getAutosaveInterval, hasDraftValidationEnabled, reduceFieldsToValues } from 'payload/shared';
|
|
5
6
|
import React, { useDeferredValue, useEffect, useRef, useState } from 'react';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/Autosave/index.tsx"],"sourcesContent":["'use client'\n// TODO: abstract the `next/navigation` dependency out from this component\nimport type { ClientCollectionConfig, ClientGlobalConfig } from 'payload'\n\nimport { dequal } from 'dequal/lite'\nimport {\n getAutosaveInterval,\n hasDraftValidationEnabled,\n reduceFieldsToValues,\n} from 'payload/shared'\nimport React, { useDeferredValue, useEffect, useRef, useState } from 'react'\n\nimport type { OnSaveContext } from '../../views/Edit/index.js'\n\nimport {\n useAllFormFields,\n useForm,\n useFormModified,\n useFormSubmitted,\n} from '../../forms/Form/context.js'\nimport { useDebounce } from '../../hooks/useDebounce.js'\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useQueue } from '../../hooks/useQueue.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { formatTimeToNow } from '../../utilities/formatDocTitle/formatDateTitle.js'\nimport { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js'\nimport { LeaveWithoutSaving } from '../LeaveWithoutSaving/index.js'\nimport './index.scss'\n\nconst baseClass = 'autosave'\n// The minimum time the saving state should be shown\nconst minimumAnimationTime = 1000\n\nexport type Props = {\n collection?: ClientCollectionConfig\n global?: ClientGlobalConfig\n id?: number | string\n publishedDocUpdatedAt: string\n}\n\nexport const Autosave: React.FC<Props> = ({ id, collection, global: globalDoc }) => {\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const {\n docConfig,\n lastUpdateTime,\n mostRecentVersionIsAutosaved,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n } = useDocumentInfo()\n\n const { isValid, setBackgroundProcessing, submit } = useForm()\n\n const [formState] = useAllFormFields()\n const modified = useFormModified()\n const submitted = useFormSubmitted()\n\n const { code: locale } = useLocale()\n const { i18n, t } = useTranslation()\n\n const interval = getAutosaveInterval(docConfig)\n const validateOnDraft = hasDraftValidationEnabled(docConfig)\n\n const [_saving, setSaving] = useState(false)\n\n const saving = useDeferredValue(_saving)\n\n const debouncedFormState = useDebounce(formState, interval)\n\n const { queueTask } = useQueue()\n\n const autosaveTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n\n const handleAutosave = useEffectEvent(() => {\n autosaveTimeoutRef.current = undefined\n // We need to log the time in order to figure out if we need to trigger the state off later\n let startTimestamp = undefined\n let endTimestamp = undefined\n\n const hideIndicator = () => {\n // If request was faster than minimum animation time, animate the difference\n if (endTimestamp - startTimestamp < minimumAnimationTime) {\n autosaveTimeoutRef.current = setTimeout(\n () => {\n setSaving(false)\n },\n minimumAnimationTime - (endTimestamp - startTimestamp),\n )\n } else {\n stopAutoSaveIndicator()\n }\n }\n\n queueTask(\n async () => {\n if (modified) {\n startTimestamp = new Date().getTime()\n\n setSaving(true)\n\n let url: string\n let method: string\n let entitySlug: string\n\n if (collection && id) {\n entitySlug = collection.slug\n url = `${serverURL}${api}/${entitySlug}/${id}?depth=0&draft=true&autosave=true&locale=${locale}&fallback-locale=null`\n method = 'PATCH'\n }\n\n if (globalDoc) {\n entitySlug = globalDoc.slug\n url = `${serverURL}${api}/globals/${entitySlug}?depth=0&draft=true&autosave=true&locale=${locale}&fallback-locale=null`\n method = 'POST'\n }\n\n const { valid } = reduceFieldsToValuesWithValidation(formState, true)\n\n const skipSubmission = submitted && !valid && validateOnDraft\n\n if (!skipSubmission && modified && url) {\n const result = await submit<any, OnSaveContext>({\n acceptValues: {\n overrideLocalChanges: false,\n },\n action: url,\n context: {\n getDocPermissions: false,\n incrementVersionCount: !mostRecentVersionIsAutosaved,\n },\n disableFormWhileProcessing: false,\n disableSuccessStatus: true,\n method,\n overrides: {\n _status: 'draft',\n },\n skipValidation: !validateOnDraft,\n })\n\n if (result && result?.res?.ok && !mostRecentVersionIsAutosaved) {\n setMostRecentVersionIsAutosaved(true)\n setUnpublishedVersionCount((prev) => prev + 1)\n }\n\n const newDate = new Date()\n\n // We need to log the time in order to figure out if we need to trigger the state off later\n endTimestamp = newDate.getTime()\n\n hideIndicator()\n }\n }\n },\n {\n afterProcess: () => {\n setBackgroundProcessing(false)\n },\n beforeProcess: () => {\n setBackgroundProcessing(true)\n },\n },\n )\n })\n\n const didMount = useRef(false)\n const previousDebouncedData = useRef(reduceFieldsToValues(debouncedFormState))\n\n // When debounced fields change, autosave\n useEffect(() => {\n /**\n * Ensure autosave doesn't run on mount\n */\n if (!didMount.current) {\n didMount.current = true\n return\n }\n\n /**\n * Ensure autosave only runs if the form data changes, not every time the entire form state changes\n * Remove `updatedAt` from comparison as it changes on every autosave interval.\n */\n const { updatedAt: _, ...formData } = reduceFieldsToValues(debouncedFormState)\n const { updatedAt: __, ...prevFormData } = previousDebouncedData.current\n\n if (dequal(formData, prevFormData)) {\n return\n }\n\n previousDebouncedData.current = formData\n\n handleAutosave()\n }, [debouncedFormState])\n\n /**\n * If component unmounts, clear the autosave timeout\n */\n useEffect(() => {\n return () => {\n stopAutoSaveIndicator()\n }\n }, [])\n\n const stopAutoSaveIndicator = useEffectEvent(() => {\n if (autosaveTimeoutRef.current) {\n clearTimeout(autosaveTimeoutRef.current)\n }\n\n setSaving(false)\n })\n\n return (\n <div className={baseClass}>\n {validateOnDraft && !isValid && <LeaveWithoutSaving />}\n {saving && t('general:saving')}\n {!saving && Boolean(lastUpdateTime) && (\n <React.Fragment>\n {t('version:lastSavedAgo', {\n distance: formatTimeToNow({ date: lastUpdateTime, i18n }),\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n"],"names":["dequal","getAutosaveInterval","hasDraftValidationEnabled","reduceFieldsToValues","React","useDeferredValue","useEffect","useRef","useState","useAllFormFields","useForm","useFormModified","useFormSubmitted","useDebounce","useEffectEvent","useQueue","useConfig","useDocumentInfo","useLocale","useTranslation","formatTimeToNow","reduceFieldsToValuesWithValidation","LeaveWithoutSaving","baseClass","minimumAnimationTime","Autosave","id","collection","global","globalDoc","config","routes","api","serverURL","docConfig","lastUpdateTime","mostRecentVersionIsAutosaved","setMostRecentVersionIsAutosaved","setUnpublishedVersionCount","isValid","setBackgroundProcessing","submit","formState","modified","submitted","code","locale","i18n","t","interval","validateOnDraft","_saving","setSaving","saving","debouncedFormState","queueTask","autosaveTimeoutRef","handleAutosave","current","undefined","startTimestamp","endTimestamp","hideIndicator","setTimeout","stopAutoSaveIndicator","Date","getTime","url","method","entitySlug","slug","valid","skipSubmission","result","acceptValues","overrideLocalChanges","action","context","getDocPermissions","incrementVersionCount","disableFormWhileProcessing","disableSuccessStatus","overrides","_status","skipValidation","res","ok","prev","newDate","afterProcess","beforeProcess","didMount","previousDebouncedData","updatedAt","_","formData","__","prevFormData","clearTimeout","div","className","Boolean","Fragment","distance","date"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/Autosave/index.tsx"],"sourcesContent":["'use client'\n// TODO: abstract the `next/navigation` dependency out from this component\nimport type { ClientCollectionConfig, ClientGlobalConfig } from 'payload'\n\nimport { dequal } from 'dequal/lite'\nimport {\n getAutosaveInterval,\n hasDraftValidationEnabled,\n reduceFieldsToValues,\n} from 'payload/shared'\nimport React, { useDeferredValue, useEffect, useRef, useState } from 'react'\n\nimport type { OnSaveContext } from '../../views/Edit/index.js'\n\nimport {\n useAllFormFields,\n useForm,\n useFormModified,\n useFormSubmitted,\n} from '../../forms/Form/context.js'\nimport { useDebounce } from '../../hooks/useDebounce.js'\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useQueue } from '../../hooks/useQueue.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { formatTimeToNow } from '../../utilities/formatDocTitle/formatDateTitle.js'\nimport { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js'\nimport { LeaveWithoutSaving } from '../LeaveWithoutSaving/index.js'\nimport './index.scss'\n\nconst baseClass = 'autosave'\n// The minimum time the saving state should be shown\nconst minimumAnimationTime = 1000\n\nexport type Props = {\n collection?: ClientCollectionConfig\n global?: ClientGlobalConfig\n id?: number | string\n publishedDocUpdatedAt: string\n}\n\nexport const Autosave: React.FC<Props> = ({ id, collection, global: globalDoc }) => {\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const {\n docConfig,\n lastUpdateTime,\n mostRecentVersionIsAutosaved,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n } = useDocumentInfo()\n\n const { isValid, setBackgroundProcessing, submit } = useForm()\n\n const [formState] = useAllFormFields()\n const modified = useFormModified()\n const submitted = useFormSubmitted()\n\n const { code: locale } = useLocale()\n const { i18n, t } = useTranslation()\n\n const interval = getAutosaveInterval(docConfig)\n const validateOnDraft = hasDraftValidationEnabled(docConfig)\n\n const [_saving, setSaving] = useState(false)\n\n const saving = useDeferredValue(_saving)\n\n const debouncedFormState = useDebounce(formState, interval)\n\n const { queueTask } = useQueue()\n\n const autosaveTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n\n const handleAutosave = useEffectEvent(() => {\n autosaveTimeoutRef.current = undefined\n // We need to log the time in order to figure out if we need to trigger the state off later\n let startTimestamp = undefined\n let endTimestamp = undefined\n\n const hideIndicator = () => {\n // If request was faster than minimum animation time, animate the difference\n if (endTimestamp - startTimestamp < minimumAnimationTime) {\n autosaveTimeoutRef.current = setTimeout(\n () => {\n setSaving(false)\n },\n minimumAnimationTime - (endTimestamp - startTimestamp),\n )\n } else {\n stopAutoSaveIndicator()\n }\n }\n\n queueTask(\n async () => {\n if (modified) {\n startTimestamp = new Date().getTime()\n\n setSaving(true)\n\n let url: string\n let method: string\n let entitySlug: string\n\n if (collection && id) {\n entitySlug = collection.slug\n url = `${serverURL}${api}/${entitySlug}/${id}?depth=0&draft=true&autosave=true&locale=${locale}&fallback-locale=null`\n method = 'PATCH'\n }\n\n if (globalDoc) {\n entitySlug = globalDoc.slug\n url = `${serverURL}${api}/globals/${entitySlug}?depth=0&draft=true&autosave=true&locale=${locale}&fallback-locale=null`\n method = 'POST'\n }\n\n const { valid } = reduceFieldsToValuesWithValidation(formState, true)\n\n const skipSubmission = submitted && !valid && validateOnDraft\n\n if (!skipSubmission && modified && url) {\n const result = await submit<any, OnSaveContext>({\n acceptValues: {\n overrideLocalChanges: false,\n },\n action: url,\n context: {\n getDocPermissions: false,\n incrementVersionCount: !mostRecentVersionIsAutosaved,\n },\n disableFormWhileProcessing: false,\n disableSuccessStatus: true,\n method,\n overrides: {\n _status: 'draft',\n },\n skipValidation: !validateOnDraft,\n })\n\n if (result && result?.res?.ok && !mostRecentVersionIsAutosaved) {\n setMostRecentVersionIsAutosaved(true)\n setUnpublishedVersionCount((prev) => prev + 1)\n }\n\n const newDate = new Date()\n\n // We need to log the time in order to figure out if we need to trigger the state off later\n endTimestamp = newDate.getTime()\n\n hideIndicator()\n }\n }\n },\n {\n afterProcess: () => {\n setBackgroundProcessing(false)\n },\n beforeProcess: () => {\n setBackgroundProcessing(true)\n },\n },\n )\n })\n\n const didMount = useRef(false)\n const previousDebouncedData = useRef(reduceFieldsToValues(debouncedFormState))\n\n // When debounced fields change, autosave\n useEffect(() => {\n /**\n * Ensure autosave doesn't run on mount\n */\n if (!didMount.current) {\n didMount.current = true\n return\n }\n\n /**\n * Ensure autosave only runs if the form data changes, not every time the entire form state changes\n * Remove `updatedAt` from comparison as it changes on every autosave interval.\n */\n const { updatedAt: _, ...formData } = reduceFieldsToValues(debouncedFormState)\n const { updatedAt: __, ...prevFormData } = previousDebouncedData.current\n\n if (dequal(formData, prevFormData)) {\n return\n }\n\n previousDebouncedData.current = formData\n\n handleAutosave()\n }, [debouncedFormState])\n\n /**\n * If component unmounts, clear the autosave timeout\n */\n useEffect(() => {\n return () => {\n stopAutoSaveIndicator()\n }\n }, [])\n\n const stopAutoSaveIndicator = useEffectEvent(() => {\n if (autosaveTimeoutRef.current) {\n clearTimeout(autosaveTimeoutRef.current)\n }\n\n setSaving(false)\n })\n\n return (\n <div className={baseClass}>\n {validateOnDraft && !isValid && <LeaveWithoutSaving />}\n {saving && t('general:saving')}\n {!saving && Boolean(lastUpdateTime) && (\n <React.Fragment>\n {t('version:lastSavedAgo', {\n distance: formatTimeToNow({ date: lastUpdateTime, i18n }),\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n"],"names":["dequal","getAutosaveInterval","hasDraftValidationEnabled","reduceFieldsToValues","React","useDeferredValue","useEffect","useRef","useState","useAllFormFields","useForm","useFormModified","useFormSubmitted","useDebounce","useEffectEvent","useQueue","useConfig","useDocumentInfo","useLocale","useTranslation","formatTimeToNow","reduceFieldsToValuesWithValidation","LeaveWithoutSaving","baseClass","minimumAnimationTime","Autosave","id","collection","global","globalDoc","config","routes","api","serverURL","docConfig","lastUpdateTime","mostRecentVersionIsAutosaved","setMostRecentVersionIsAutosaved","setUnpublishedVersionCount","isValid","setBackgroundProcessing","submit","formState","modified","submitted","code","locale","i18n","t","interval","validateOnDraft","_saving","setSaving","saving","debouncedFormState","queueTask","autosaveTimeoutRef","handleAutosave","current","undefined","startTimestamp","endTimestamp","hideIndicator","setTimeout","stopAutoSaveIndicator","Date","getTime","url","method","entitySlug","slug","valid","skipSubmission","result","acceptValues","overrideLocalChanges","action","context","getDocPermissions","incrementVersionCount","disableFormWhileProcessing","disableSuccessStatus","overrides","_status","skipValidation","res","ok","prev","newDate","afterProcess","beforeProcess","didMount","previousDebouncedData","updatedAt","_","formData","__","prevFormData","clearTimeout","div","className","Boolean","Fragment","distance","date"],"mappings":"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"}
|
|
@@ -13,8 +13,8 @@ export const EditManyBulkUploads = (props)=>{
|
|
|
13
13
|
const { collection: { slug } = {}, collection } = props;
|
|
14
14
|
const { permissions } = useAuth();
|
|
15
15
|
const { t } = useTranslation();
|
|
16
|
-
const { forms } = useFormsManager()
|
|
17
|
-
|
|
16
|
+
const { forms } = useFormsManager();
|
|
17
|
+
// Access forms managed in bulk uploads
|
|
18
18
|
const collectionPermissions = permissions?.collections?.[slug];
|
|
19
19
|
const hasUpdatePermission = collectionPermissions?.update;
|
|
20
20
|
const drawerSlug = `edit-${slug}-bulk-uploads`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/elements/BulkUpload/EditMany/index.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig } from 'payload'\n\nimport React from 'react'\n\nimport { useAuth } from '../../../providers/Auth/index.js'\nimport { EditDepthProvider } from '../../../providers/EditDepth/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { Drawer, DrawerToggler } from '../../Drawer/index.js'\nimport { useFormsManager } from '../FormsManager/index.js'\nimport { EditManyBulkUploadsDrawerContent } from './DrawerContent.js'\nimport './index.scss'\n\nexport const baseClass = 'edit-many-bulk-uploads'\n\nexport type EditManyBulkUploadsProps = {\n readonly collection: ClientCollectionConfig\n}\n\nexport const EditManyBulkUploads: React.FC<EditManyBulkUploadsProps> = (props) => {\n const { collection: { slug } = {}, collection } = props\n\n const { permissions } = useAuth()\n\n const { t } = useTranslation()\n const { forms } = useFormsManager() // Access forms managed in bulk uploads\n\n const collectionPermissions = permissions?.collections?.[slug]\n const hasUpdatePermission = collectionPermissions?.update\n\n const drawerSlug = `edit-${slug}-bulk-uploads`\n\n if (!hasUpdatePermission) {\n return null\n }\n\n return (\n <div className={baseClass}>\n <DrawerToggler\n aria-label={t('general:editAll')}\n className={`${baseClass}__toggle`}\n slug={drawerSlug}\n >\n {t('general:editAll')}\n </DrawerToggler>\n <EditDepthProvider>\n <Drawer Header={null} slug={drawerSlug}>\n <EditManyBulkUploadsDrawerContent\n collection={collection}\n drawerSlug={drawerSlug}\n forms={forms}\n />\n </Drawer>\n </EditDepthProvider>\n </div>\n )\n}\n"],"names":["React","useAuth","EditDepthProvider","useTranslation","Drawer","DrawerToggler","useFormsManager","EditManyBulkUploadsDrawerContent","baseClass","EditManyBulkUploads","props","collection","slug","permissions","t","forms","collectionPermissions","collections","hasUpdatePermission","update","drawerSlug","div","className","aria-label","Header"],"mappings":"AAAA;;AAIA,OAAOA,WAAW,QAAO;AAEzB,SAASC,OAAO,QAAQ,mCAAkC;AAC1D,SAASC,iBAAiB,QAAQ,wCAAuC;AACzE,SAASC,cAAc,QAAQ,0CAAyC;AACxE,SAASC,MAAM,EAAEC,aAAa,QAAQ,wBAAuB;AAC7D,SAASC,eAAe,QAAQ,2BAA0B;AAC1D,SAASC,gCAAgC,QAAQ,qBAAoB;AACrE,OAAO,eAAc;AAErB,OAAO,MAAMC,YAAY,yBAAwB;AAMjD,OAAO,MAAMC,sBAA0D,CAACC;IACtE,MAAM,EAAEC,YAAY,EAAEC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAED,UAAU,EAAE,GAAGD;IAElD,MAAM,EAAEG,WAAW,EAAE,GAAGZ;IAExB,MAAM,EAAEa,CAAC,EAAE,GAAGX;IACd,MAAM,EAAEY,KAAK,EAAE,GAAGT,
|
|
1
|
+
{"version":3,"sources":["../../../../src/elements/BulkUpload/EditMany/index.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig } from 'payload'\n\nimport React from 'react'\n\nimport { useAuth } from '../../../providers/Auth/index.js'\nimport { EditDepthProvider } from '../../../providers/EditDepth/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { Drawer, DrawerToggler } from '../../Drawer/index.js'\nimport { useFormsManager } from '../FormsManager/index.js'\nimport { EditManyBulkUploadsDrawerContent } from './DrawerContent.js'\nimport './index.scss'\n\nexport const baseClass = 'edit-many-bulk-uploads'\n\nexport type EditManyBulkUploadsProps = {\n readonly collection: ClientCollectionConfig\n}\n\nexport const EditManyBulkUploads: React.FC<EditManyBulkUploadsProps> = (props) => {\n const { collection: { slug } = {}, collection } = props\n\n const { permissions } = useAuth()\n\n const { t } = useTranslation()\n const { forms } = useFormsManager() // Access forms managed in bulk uploads\n\n const collectionPermissions = permissions?.collections?.[slug]\n const hasUpdatePermission = collectionPermissions?.update\n\n const drawerSlug = `edit-${slug}-bulk-uploads`\n\n if (!hasUpdatePermission) {\n return null\n }\n\n return (\n <div className={baseClass}>\n <DrawerToggler\n aria-label={t('general:editAll')}\n className={`${baseClass}__toggle`}\n slug={drawerSlug}\n >\n {t('general:editAll')}\n </DrawerToggler>\n <EditDepthProvider>\n <Drawer Header={null} slug={drawerSlug}>\n <EditManyBulkUploadsDrawerContent\n collection={collection}\n drawerSlug={drawerSlug}\n forms={forms}\n />\n </Drawer>\n </EditDepthProvider>\n </div>\n )\n}\n"],"names":["React","useAuth","EditDepthProvider","useTranslation","Drawer","DrawerToggler","useFormsManager","EditManyBulkUploadsDrawerContent","baseClass","EditManyBulkUploads","props","collection","slug","permissions","t","forms","collectionPermissions","collections","hasUpdatePermission","update","drawerSlug","div","className","aria-label","Header"],"mappings":"AAAA;;AAIA,OAAOA,WAAW,QAAO;AAEzB,SAASC,OAAO,QAAQ,mCAAkC;AAC1D,SAASC,iBAAiB,QAAQ,wCAAuC;AACzE,SAASC,cAAc,QAAQ,0CAAyC;AACxE,SAASC,MAAM,EAAEC,aAAa,QAAQ,wBAAuB;AAC7D,SAASC,eAAe,QAAQ,2BAA0B;AAC1D,SAASC,gCAAgC,QAAQ,qBAAoB;AACrE,OAAO,eAAc;AAErB,OAAO,MAAMC,YAAY,yBAAwB;AAMjD,OAAO,MAAMC,sBAA0D,CAACC;IACtE,MAAM,EAAEC,YAAY,EAAEC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAED,UAAU,EAAE,GAAGD;IAElD,MAAM,EAAEG,WAAW,EAAE,GAAGZ;IAExB,MAAM,EAAEa,CAAC,EAAE,GAAGX;IACd,MAAM,EAAEY,KAAK,EAAE,GAAGT;IAAkB,uCAAuC;IAE3E,MAAMU,wBAAwBH,aAAaI,aAAa,CAACL,KAAK;IAC9D,MAAMM,sBAAsBF,uBAAuBG;IAEnD,MAAMC,aAAa,CAAC,KAAK,EAAER,KAAK,aAAa,CAAC;IAE9C,IAAI,CAACM,qBAAqB;QACxB,OAAO;IACT;IAEA,qBACE,MAACG;QAAIC,WAAWd;;0BACd,KAACH;gBACCkB,cAAYT,EAAE;gBACdQ,WAAW,GAAGd,UAAU,QAAQ,CAAC;gBACjCI,MAAMQ;0BAELN,EAAE;;0BAEL,KAACZ;0BACC,cAAA,KAACE;oBAAOoB,QAAQ;oBAAMZ,MAAMQ;8BAC1B,cAAA,KAACb;wBACCI,YAAYA;wBACZS,YAAYA;wBACZL,OAAOA;;;;;;AAMnB,EAAC"}
|
|
@@ -136,10 +136,9 @@ export function FormsManagerProvider({ children }) {
|
|
|
136
136
|
});
|
|
137
137
|
initialStateRef.current = formStateWithoutFiles;
|
|
138
138
|
setHasInitializedState(true);
|
|
139
|
-
} catch (_err) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}, [
|
|
139
|
+
} catch (_err) {}
|
|
140
|
+
}, // swallow error
|
|
141
|
+
[
|
|
143
142
|
getDocumentSlots,
|
|
144
143
|
collectionSlug,
|
|
145
144
|
getFormState,
|
|
@@ -249,7 +248,9 @@ export function FormsManagerProvider({ children }) {
|
|
|
249
248
|
formState: currentFormsData,
|
|
250
249
|
uploadEdits: currentForms[activeIndex].uploadEdits
|
|
251
250
|
};
|
|
252
|
-
const newDocs =
|
|
251
|
+
const newDocs = /**
|
|
252
|
+
* ID of the form that created this document
|
|
253
|
+
*/ [];
|
|
253
254
|
setIsUploading(true);
|
|
254
255
|
for(let i = 0; i < currentForms.length; i++){
|
|
255
256
|
try {
|
|
@@ -334,10 +335,9 @@ export function FormsManagerProvider({ children }) {
|
|
|
334
335
|
};
|
|
335
336
|
toast.error(nonFieldErrors[0]?.message);
|
|
336
337
|
}
|
|
337
|
-
} catch (_) {
|
|
338
|
-
// swallow
|
|
339
|
-
}
|
|
338
|
+
} catch (_) {}
|
|
340
339
|
}
|
|
340
|
+
// swallow
|
|
341
341
|
setHasSubmitted(true);
|
|
342
342
|
setLoadingText('');
|
|
343
343
|
setIsUploading(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/elements/BulkUpload/FormsManager/index.tsx"],"sourcesContent":["'use client'\n\nimport type {\n CollectionSlug,\n Data,\n DocumentSlots,\n FormState,\n JsonObject,\n SanitizedDocumentPermissions,\n UploadEdits,\n} from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport * as qs from 'qs-esm'\nimport React from 'react'\nimport { toast } from 'sonner'\n\nimport type { State } from './reducer.js'\n\nimport { fieldReducer } from '../../../forms/Form/fieldReducer.js'\nimport { useEffectEvent } from '../../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useLocale } from '../../../providers/Locale/index.js'\nimport { useServerFunctions } from '../../../providers/ServerFunctions/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { useUploadHandlers } from '../../../providers/UploadHandlers/index.js'\nimport { hasSavePermission as getHasSavePermission } from '../../../utilities/hasSavePermission.js'\nimport { LoadingOverlay } from '../../Loading/index.js'\nimport { useLoadingOverlay } from '../../LoadingOverlay/index.js'\nimport { useBulkUpload } from '../index.js'\nimport { createFormData } from './createFormData.js'\nimport { formsManagementReducer } from './reducer.js'\n\ntype FormsManagerContext = {\n readonly activeIndex: State['activeIndex']\n readonly addFiles: (filelist: FileList) => Promise<void>\n readonly bulkUpdateForm: (\n updatedFields: Record<string, unknown>,\n afterStateUpdate?: () => void,\n ) => Promise<void>\n readonly collectionSlug: string\n readonly docPermissions?: SanitizedDocumentPermissions\n readonly documentSlots: DocumentSlots\n readonly forms: State['forms']\n getFormDataRef: React.RefObject<() => Data>\n readonly hasPublishPermission: boolean\n readonly hasSavePermission: boolean\n readonly hasSubmitted: boolean\n readonly isInitializing: boolean\n readonly removeFile: (index: number) => void\n readonly resetUploadEdits?: () => void\n readonly saveAllDocs: ({ overrides }?: { overrides?: Record<string, unknown> }) => Promise<void>\n readonly setActiveIndex: (index: number) => void\n readonly setFormTotalErrorCount: ({\n errorCount,\n index,\n }: {\n errorCount: number\n index: number\n }) => void\n readonly totalErrorCount?: number\n readonly updateUploadEdits: (args: UploadEdits) => void\n}\n\nconst Context = React.createContext<FormsManagerContext>({\n activeIndex: 0,\n addFiles: () => Promise.resolve(),\n bulkUpdateForm: () => null,\n collectionSlug: '',\n docPermissions: undefined,\n documentSlots: {},\n forms: [],\n getFormDataRef: { current: () => ({}) },\n hasPublishPermission: false,\n hasSavePermission: false,\n hasSubmitted: false,\n isInitializing: false,\n removeFile: () => {},\n saveAllDocs: () => Promise.resolve(),\n setActiveIndex: () => 0,\n setFormTotalErrorCount: () => {},\n totalErrorCount: 0,\n updateUploadEdits: () => {},\n})\n\nconst initialState: State = {\n activeIndex: 0,\n forms: [],\n totalErrorCount: 0,\n}\n\nexport type InitialForms = Array<{\n file: File\n formID?: string\n initialState?: FormState | null\n}>\n\ntype FormsManagerProps = {\n readonly children: React.ReactNode\n}\n\nexport function FormsManagerProvider({ children }: FormsManagerProps) {\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n const { code } = useLocale()\n const { i18n, t } = useTranslation()\n\n const { getDocumentSlots, getFormState } = useServerFunctions()\n const { getUploadHandler } = useUploadHandlers()\n\n const [documentSlots, setDocumentSlots] = React.useState<DocumentSlots>({})\n const [hasSubmitted, setHasSubmitted] = React.useState(false)\n const [docPermissions, setDocPermissions] = React.useState<SanitizedDocumentPermissions>()\n const [hasSavePermission, setHasSavePermission] = React.useState(false)\n const [hasPublishPermission, setHasPublishPermission] = React.useState(false)\n const [hasInitializedState, setHasInitializedState] = React.useState(false)\n const [hasInitializedDocPermissions, setHasInitializedDocPermissions] = React.useState(false)\n const [isInitializing, setIsInitializing] = React.useState(false)\n const [state, dispatch] = React.useReducer(formsManagementReducer, initialState)\n const { activeIndex, forms, totalErrorCount } = state\n\n const formsRef = React.useRef(forms)\n formsRef.current = forms\n\n const { toggleLoadingOverlay } = useLoadingOverlay()\n const { closeModal } = useModal()\n const {\n collectionSlug,\n drawerSlug,\n initialFiles,\n initialForms,\n onSuccess,\n setInitialFiles,\n setInitialForms,\n setSuccessfullyUploaded,\n } = useBulkUpload()\n\n const [isUploading, setIsUploading] = React.useState(false)\n const [loadingText, setLoadingText] = React.useState('')\n\n const hasInitializedWithFiles = React.useRef(false)\n const initialStateRef = React.useRef<FormState>(null)\n const getFormDataRef = React.useRef<() => Data>(() => ({}))\n\n const actionURL = `${serverURL}${api}/${collectionSlug}`\n\n const initializeSharedDocPermissions = React.useCallback(async () => {\n const params = {\n locale: code || undefined,\n }\n\n const docAccessURL = `/${collectionSlug}/access`\n const res = await fetch(`${serverURL}${api}${docAccessURL}?${qs.stringify(params)}`, {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'post',\n })\n\n const json: SanitizedDocumentPermissions = await res.json()\n const publishedAccessJSON = await fetch(\n `${serverURL}${api}${docAccessURL}?${qs.stringify(params)}`,\n {\n body: JSON.stringify({\n _status: 'published',\n }),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n ).then((res) => res.json())\n\n setDocPermissions(json)\n\n setHasSavePermission(\n getHasSavePermission({\n collectionSlug,\n docPermissions: json,\n isEditing: false,\n }),\n )\n\n setHasPublishPermission(publishedAccessJSON?.update)\n setHasInitializedDocPermissions(true)\n }, [api, code, collectionSlug, i18n.language, serverURL])\n\n const initializeSharedFormState = React.useCallback(\n async (abortController?: AbortController) => {\n if (abortController?.signal) {\n abortController.abort('aborting previous fetch for initial form state without files')\n }\n\n // FETCH AND SET THE DOCUMENT SLOTS HERE!\n const documentSlots = await getDocumentSlots({ collectionSlug })\n setDocumentSlots(documentSlots)\n\n try {\n const { state: formStateWithoutFiles } = await getFormState({\n collectionSlug,\n docPermissions,\n docPreferences: { fields: {} },\n locale: code,\n operation: 'create',\n renderAllFields: true,\n schemaPath: collectionSlug,\n skipValidation: true,\n })\n initialStateRef.current = formStateWithoutFiles\n setHasInitializedState(true)\n } catch (_err) {\n // swallow error\n }\n },\n [getDocumentSlots, collectionSlug, getFormState, docPermissions, code],\n )\n\n const setActiveIndex: FormsManagerContext['setActiveIndex'] = React.useCallback(\n (index: number) => {\n const currentFormsData = getFormDataRef.current()\n dispatch({\n type: 'REPLACE',\n state: {\n activeIndex: index,\n forms: forms.map((form, i) => {\n if (i === activeIndex) {\n return {\n errorCount: form.errorCount,\n formID: form.formID,\n formState: currentFormsData,\n uploadEdits: form.uploadEdits,\n }\n }\n return form\n }),\n },\n })\n },\n [forms, activeIndex],\n )\n\n const addFiles = React.useCallback(\n async (files: FileList) => {\n if (forms.length) {\n // save the state of the current form before adding new files\n dispatch({\n type: 'UPDATE_FORM',\n errorCount: forms[activeIndex].errorCount,\n formState: getFormDataRef.current(),\n index: activeIndex,\n })\n }\n\n toggleLoadingOverlay({ isLoading: true, key: 'addingDocs' })\n if (!hasInitializedState) {\n await initializeSharedFormState()\n }\n dispatch({\n type: 'ADD_FORMS',\n forms: Array.from(files).map((file) => ({\n file,\n initialState: initialStateRef.current,\n })),\n })\n toggleLoadingOverlay({ isLoading: false, key: 'addingDocs' })\n },\n [initializeSharedFormState, hasInitializedState, toggleLoadingOverlay, activeIndex, forms],\n )\n\n const addFilesEffectEvent = useEffectEvent(addFiles)\n\n const addInitialForms = useEffectEvent(async (initialForms: InitialForms) => {\n toggleLoadingOverlay({ isLoading: true, key: 'addingDocs' })\n\n if (!hasInitializedState) {\n await initializeSharedFormState()\n }\n\n dispatch({\n type: 'ADD_FORMS',\n forms: initialForms.map((form) => ({\n ...form,\n initialState: form?.initialState || initialStateRef.current,\n })),\n })\n\n toggleLoadingOverlay({ isLoading: false, key: 'addingDocs' })\n })\n\n const removeFile: FormsManagerContext['removeFile'] = React.useCallback((index) => {\n dispatch({ type: 'REMOVE_FORM', index })\n }, [])\n\n const setFormTotalErrorCount: FormsManagerContext['setFormTotalErrorCount'] = React.useCallback(\n ({ errorCount, index }) => {\n dispatch({\n type: 'UPDATE_ERROR_COUNT',\n count: errorCount,\n index,\n })\n },\n [],\n )\n\n const saveAllDocs: FormsManagerContext['saveAllDocs'] = React.useCallback(\n async ({ overrides } = {}) => {\n const currentFormsData = getFormDataRef.current()\n const currentForms = [...forms]\n currentForms[activeIndex] = {\n errorCount: currentForms[activeIndex].errorCount,\n formID: currentForms[activeIndex].formID,\n formState: currentFormsData,\n uploadEdits: currentForms[activeIndex].uploadEdits,\n }\n const newDocs: Array<{\n collectionSlug: CollectionSlug\n doc: JsonObject\n /**\n * ID of the form that created this document\n */\n formID: string\n }> = []\n\n setIsUploading(true)\n\n for (let i = 0; i < currentForms.length; i++) {\n try {\n const form = currentForms[i]\n const fileValue = form.formState?.file?.value\n\n // Skip upload if file is missing a filename\n if (\n fileValue &&\n typeof fileValue === 'object' &&\n 'name' in fileValue &&\n (!fileValue.name || fileValue.name === '')\n ) {\n currentForms[i] = {\n ...currentForms[i],\n errorCount: 1,\n }\n continue\n }\n\n setLoadingText(t('general:uploadingBulk', { current: i + 1, total: currentForms.length }))\n\n const actionURLWithParams = `${actionURL}${qs.stringify(\n {\n locale: code,\n uploadEdits: form?.uploadEdits || undefined,\n },\n {\n addQueryPrefix: true,\n },\n )}`\n\n const req = await fetch(actionURLWithParams, {\n body: await createFormData(\n form.formState,\n overrides,\n collectionSlug,\n getUploadHandler({ collectionSlug }),\n ),\n credentials: 'include',\n method: 'POST',\n })\n\n const json = await req.json()\n\n if (req.status === 201 && json?.doc) {\n newDocs.push({\n collectionSlug,\n doc: json.doc,\n formID: form.formID,\n })\n }\n\n // should expose some sort of helper for this\n const [fieldErrors, nonFieldErrors] = (json?.errors || []).reduce(\n ([fieldErrs, nonFieldErrs], err) => {\n const newFieldErrs: any[] = []\n const newNonFieldErrs: any[] = []\n\n if (err?.message) {\n newNonFieldErrs.push(err)\n }\n\n if (Array.isArray(err?.data?.errors)) {\n err.data?.errors.forEach((dataError) => {\n if (dataError?.path) {\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 currentForms[i] = {\n errorCount: fieldErrors.length,\n formID: currentForms[i].formID,\n formState: fieldReducer(currentForms[i].formState, {\n type: 'ADD_SERVER_ERRORS',\n errors: fieldErrors,\n }),\n }\n\n if (req.status === 413 || req.status === 400) {\n // file too large\n currentForms[i] = {\n ...currentForms[i],\n errorCount: currentForms[i].errorCount + 1,\n }\n\n toast.error(nonFieldErrors[0]?.message)\n }\n } catch (_) {\n // swallow\n }\n }\n\n setHasSubmitted(true)\n setLoadingText('')\n setIsUploading(false)\n\n const remainingForms = []\n\n currentForms.forEach(({ errorCount }, i) => {\n if (errorCount) {\n remainingForms.push(currentForms[i])\n }\n })\n\n const successCount = Math.max(0, currentForms.length - remainingForms.length)\n const errorCount = currentForms.length - successCount\n\n if (successCount) {\n toast.success(`Successfully saved ${successCount} files`)\n setSuccessfullyUploaded(true)\n\n if (typeof onSuccess === 'function') {\n onSuccess(newDocs, errorCount)\n }\n }\n\n if (errorCount) {\n toast.error(`Failed to save ${errorCount} files`)\n } else {\n closeModal(drawerSlug)\n }\n\n dispatch({\n type: 'REPLACE',\n state: {\n activeIndex: 0,\n forms: remainingForms,\n totalErrorCount: remainingForms.reduce((acc, { errorCount }) => acc + errorCount, 0),\n },\n })\n\n if (remainingForms.length === 0) {\n setInitialFiles(undefined)\n setInitialForms(undefined)\n }\n },\n [\n forms,\n activeIndex,\n t,\n actionURL,\n code,\n collectionSlug,\n getUploadHandler,\n onSuccess,\n closeModal,\n setSuccessfullyUploaded,\n drawerSlug,\n setInitialFiles,\n setInitialForms,\n ],\n )\n\n const bulkUpdateForm = React.useCallback(\n async (updatedFields: Record<string, unknown>, afterStateUpdate?: () => void) => {\n for (let i = 0; i < forms.length; i++) {\n Object.entries(updatedFields).forEach(([path, value]) => {\n if (forms[i].formState[path]) {\n forms[i].formState[path].value = value\n\n dispatch({\n type: 'UPDATE_FORM',\n errorCount: forms[i].errorCount,\n formState: forms[i].formState,\n index: i,\n })\n }\n })\n\n if (typeof afterStateUpdate === 'function') {\n afterStateUpdate()\n }\n\n if (hasSubmitted) {\n const { state } = await getFormState({\n collectionSlug,\n docPermissions,\n docPreferences: null,\n formState: forms[i].formState,\n operation: 'create',\n schemaPath: collectionSlug,\n })\n\n const newFormErrorCount = Object.values(state).reduce(\n (acc, value) => (value?.valid === false ? acc + 1 : acc),\n 0,\n )\n\n dispatch({\n type: 'UPDATE_FORM',\n errorCount: newFormErrorCount,\n formState: state,\n index: i,\n })\n }\n }\n },\n [collectionSlug, docPermissions, forms, getFormState, hasSubmitted],\n )\n\n const updateUploadEdits = React.useCallback<FormsManagerContext['updateUploadEdits']>(\n (uploadEdits) => {\n dispatch({\n type: 'UPDATE_FORM',\n errorCount: forms[activeIndex].errorCount,\n formState: forms[activeIndex].formState,\n index: activeIndex,\n uploadEdits,\n })\n },\n [activeIndex, forms],\n )\n\n const resetUploadEdits = React.useCallback<FormsManagerContext['resetUploadEdits']>(() => {\n dispatch({\n type: 'REPLACE',\n state: {\n forms: forms.map((form) => ({\n ...form,\n uploadEdits: {},\n })),\n },\n })\n }, [forms])\n\n React.useEffect(() => {\n if (!collectionSlug) {\n return\n }\n if (!hasInitializedState) {\n void initializeSharedFormState()\n }\n\n if (!hasInitializedDocPermissions) {\n void initializeSharedDocPermissions()\n }\n\n if (initialFiles || initialForms) {\n if (!hasInitializedState || !hasInitializedDocPermissions) {\n setIsInitializing(true)\n } else {\n setIsInitializing(false)\n }\n }\n\n if (\n hasInitializedState &&\n (initialForms?.length || initialFiles?.length) &&\n !hasInitializedWithFiles.current\n ) {\n if (initialForms?.length) {\n void addInitialForms(initialForms)\n }\n if (initialFiles?.length) {\n void addFilesEffectEvent(initialFiles)\n }\n hasInitializedWithFiles.current = true\n }\n return\n }, [\n initialFiles,\n initializeSharedFormState,\n initializeSharedDocPermissions,\n collectionSlug,\n hasInitializedState,\n hasInitializedDocPermissions,\n initialForms,\n ])\n\n return (\n <Context\n value={{\n activeIndex: state.activeIndex,\n addFiles,\n bulkUpdateForm,\n collectionSlug,\n docPermissions,\n documentSlots,\n forms,\n getFormDataRef,\n hasPublishPermission,\n hasSavePermission,\n hasSubmitted,\n isInitializing,\n removeFile,\n resetUploadEdits,\n saveAllDocs,\n setActiveIndex,\n setFormTotalErrorCount,\n totalErrorCount,\n updateUploadEdits,\n }}\n >\n {isUploading && (\n <LoadingOverlay\n animationDuration=\"250ms\"\n loadingText={loadingText}\n overlayType=\"fullscreen\"\n show\n />\n )}\n {children}\n </Context>\n )\n}\n\nexport function useFormsManager() {\n return React.use(Context)\n}\n"],"names":["useModal","qs","React","toast","fieldReducer","useEffectEvent","useConfig","useLocale","useServerFunctions","useTranslation","useUploadHandlers","hasSavePermission","getHasSavePermission","LoadingOverlay","useLoadingOverlay","useBulkUpload","createFormData","formsManagementReducer","Context","createContext","activeIndex","addFiles","Promise","resolve","bulkUpdateForm","collectionSlug","docPermissions","undefined","documentSlots","forms","getFormDataRef","current","hasPublishPermission","hasSubmitted","isInitializing","removeFile","saveAllDocs","setActiveIndex","setFormTotalErrorCount","totalErrorCount","updateUploadEdits","initialState","FormsManagerProvider","children","config","routes","api","serverURL","code","i18n","t","getDocumentSlots","getFormState","getUploadHandler","setDocumentSlots","useState","setHasSubmitted","setDocPermissions","setHasSavePermission","setHasPublishPermission","hasInitializedState","setHasInitializedState","hasInitializedDocPermissions","setHasInitializedDocPermissions","setIsInitializing","state","dispatch","useReducer","formsRef","useRef","toggleLoadingOverlay","closeModal","drawerSlug","initialFiles","initialForms","onSuccess","setInitialFiles","setInitialForms","setSuccessfullyUploaded","isUploading","setIsUploading","loadingText","setLoadingText","hasInitializedWithFiles","initialStateRef","actionURL","initializeSharedDocPermissions","useCallback","params","locale","docAccessURL","res","fetch","stringify","credentials","headers","language","method","json","publishedAccessJSON","body","JSON","_status","then","isEditing","update","initializeSharedFormState","abortController","signal","abort","formStateWithoutFiles","docPreferences","fields","operation","renderAllFields","schemaPath","skipValidation","_err","index","currentFormsData","type","map","form","i","errorCount","formID","formState","uploadEdits","files","length","isLoading","key","Array","from","file","addFilesEffectEvent","addInitialForms","count","overrides","currentForms","newDocs","fileValue","value","name","total","actionURLWithParams","addQueryPrefix","req","status","doc","push","fieldErrors","nonFieldErrors","errors","reduce","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","message","isArray","data","forEach","dataError","path","error","_","remainingForms","successCount","Math","max","success","acc","updatedFields","afterStateUpdate","Object","entries","newFormErrorCount","values","valid","resetUploadEdits","useEffect","animationDuration","overlayType","show","useFormsManager","use"],"mappings":"AAAA;;AAYA,SAASA,QAAQ,QAAQ,qBAAoB;AAC7C,YAAYC,QAAQ,SAAQ;AAC5B,OAAOC,WAAW,QAAO;AACzB,SAASC,KAAK,QAAQ,SAAQ;AAI9B,SAASC,YAAY,QAAQ,sCAAqC;AAClE,SAASC,cAAc,QAAQ,mCAAkC;AACjE,SAASC,SAAS,QAAQ,qCAAoC;AAC9D,SAASC,SAAS,QAAQ,qCAAoC;AAC9D,SAASC,kBAAkB,QAAQ,8CAA6C;AAChF,SAASC,cAAc,QAAQ,0CAAyC;AACxE,SAASC,iBAAiB,QAAQ,6CAA4C;AAC9E,SAASC,qBAAqBC,oBAAoB,QAAQ,0CAAyC;AACnG,SAASC,cAAc,QAAQ,yBAAwB;AACvD,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,SAASC,aAAa,QAAQ,cAAa;AAC3C,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,sBAAsB,QAAQ,eAAc;AAiCrD,MAAMC,wBAAUhB,MAAMiB,aAAa,CAAsB;IACvDC,aAAa;IACbC,UAAU,IAAMC,QAAQC,OAAO;IAC/BC,gBAAgB,IAAM;IACtBC,gBAAgB;IAChBC,gBAAgBC;IAChBC,eAAe,CAAC;IAChBC,OAAO,EAAE;IACTC,gBAAgB;QAAEC,SAAS,IAAO,CAAA,CAAC,CAAA;IAAG;IACtCC,sBAAsB;IACtBrB,mBAAmB;IACnBsB,cAAc;IACdC,gBAAgB;IAChBC,YAAY,KAAO;IACnBC,aAAa,IAAMd,QAAQC,OAAO;IAClCc,gBAAgB,IAAM;IACtBC,wBAAwB,KAAO;IAC/BC,iBAAiB;IACjBC,mBAAmB,KAAO;AAC5B;AAEA,MAAMC,eAAsB;IAC1BrB,aAAa;IACbS,OAAO,EAAE;IACTU,iBAAiB;AACnB;AAYA,OAAO,SAASG,qBAAqB,EAAEC,QAAQ,EAAqB;IAClE,MAAM,EAAEC,MAAM,EAAE,GAAGtC;IACnB,MAAM,EACJuC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IACJ,MAAM,EAAEI,IAAI,EAAE,GAAGzC;IACjB,MAAM,EAAE0C,IAAI,EAAEC,CAAC,EAAE,GAAGzC;IAEpB,MAAM,EAAE0C,gBAAgB,EAAEC,YAAY,EAAE,GAAG5C;IAC3C,MAAM,EAAE6C,gBAAgB,EAAE,GAAG3C;IAE7B,MAAM,CAACkB,eAAe0B,iBAAiB,GAAGpD,MAAMqD,QAAQ,CAAgB,CAAC;IACzE,MAAM,CAACtB,cAAcuB,gBAAgB,GAAGtD,MAAMqD,QAAQ,CAAC;IACvD,MAAM,CAAC7B,gBAAgB+B,kBAAkB,GAAGvD,MAAMqD,QAAQ;IAC1D,MAAM,CAAC5C,mBAAmB+C,qBAAqB,GAAGxD,MAAMqD,QAAQ,CAAC;IACjE,MAAM,CAACvB,sBAAsB2B,wBAAwB,GAAGzD,MAAMqD,QAAQ,CAAC;IACvE,MAAM,CAACK,qBAAqBC,uBAAuB,GAAG3D,MAAMqD,QAAQ,CAAC;IACrE,MAAM,CAACO,8BAA8BC,gCAAgC,GAAG7D,MAAMqD,QAAQ,CAAC;IACvF,MAAM,CAACrB,gBAAgB8B,kBAAkB,GAAG9D,MAAMqD,QAAQ,CAAC;IAC3D,MAAM,CAACU,OAAOC,SAAS,GAAGhE,MAAMiE,UAAU,CAAClD,wBAAwBwB;IACnE,MAAM,EAAErB,WAAW,EAAES,KAAK,EAAEU,eAAe,EAAE,GAAG0B;IAEhD,MAAMG,WAAWlE,MAAMmE,MAAM,CAACxC;IAC9BuC,SAASrC,OAAO,GAAGF;IAEnB,MAAM,EAAEyC,oBAAoB,EAAE,GAAGxD;IACjC,MAAM,EAAEyD,UAAU,EAAE,GAAGvE;IACvB,MAAM,EACJyB,cAAc,EACd+C,UAAU,EACVC,YAAY,EACZC,YAAY,EACZC,SAAS,EACTC,eAAe,EACfC,eAAe,EACfC,uBAAuB,EACxB,GAAG/D;IAEJ,MAAM,CAACgE,aAAaC,eAAe,GAAG9E,MAAMqD,QAAQ,CAAC;IACrD,MAAM,CAAC0B,aAAaC,eAAe,GAAGhF,MAAMqD,QAAQ,CAAC;IAErD,MAAM4B,0BAA0BjF,MAAMmE,MAAM,CAAC;IAC7C,MAAMe,kBAAkBlF,MAAMmE,MAAM,CAAY;IAChD,MAAMvC,iBAAiB5B,MAAMmE,MAAM,CAAa,IAAO,CAAA,CAAC,CAAA;IAExD,MAAMgB,YAAY,GAAGtC,YAAYD,IAAI,CAAC,EAAErB,gBAAgB;IAExD,MAAM6D,iCAAiCpF,MAAMqF,WAAW,CAAC;QACvD,MAAMC,SAAS;YACbC,QAAQzC,QAAQrB;QAClB;QAEA,MAAM+D,eAAe,CAAC,CAAC,EAAEjE,eAAe,OAAO,CAAC;QAChD,MAAMkE,MAAM,MAAMC,MAAM,GAAG7C,YAAYD,MAAM4C,aAAa,CAAC,EAAEzF,GAAG4F,SAAS,CAACL,SAAS,EAAE;YACnFM,aAAa;YACbC,SAAS;gBACP,mBAAmB9C,KAAK+C,QAAQ;gBAChC,gBAAgB;YAClB;YACAC,QAAQ;QACV;QAEA,MAAMC,OAAqC,MAAMP,IAAIO,IAAI;QACzD,MAAMC,sBAAsB,MAAMP,MAChC,GAAG7C,YAAYD,MAAM4C,aAAa,CAAC,EAAEzF,GAAG4F,SAAS,CAACL,SAAS,EAC3D;YACEY,MAAMC,KAAKR,SAAS,CAAC;gBACnBS,SAAS;YACX;YACAR,aAAa;YACbC,SAAS;gBACP,mBAAmB9C,KAAK+C,QAAQ;gBAChC,gBAAgB;YAClB;YACAC,QAAQ;QACV,GACAM,IAAI,CAAC,CAACZ,MAAQA,IAAIO,IAAI;QAExBzC,kBAAkByC;QAElBxC,qBACE9C,qBAAqB;YACnBa;YACAC,gBAAgBwE;YAChBM,WAAW;QACb;QAGF7C,wBAAwBwC,qBAAqBM;QAC7C1C,gCAAgC;IAClC,GAAG;QAACjB;QAAKE;QAAMvB;QAAgBwB,KAAK+C,QAAQ;QAAEjD;KAAU;IAExD,MAAM2D,4BAA4BxG,MAAMqF,WAAW,CACjD,OAAOoB;QACL,IAAIA,iBAAiBC,QAAQ;YAC3BD,gBAAgBE,KAAK,CAAC;QACxB;QAEA,yCAAyC;QACzC,MAAMjF,gBAAgB,MAAMuB,iBAAiB;YAAE1B;QAAe;QAC9D6B,iBAAiB1B;QAEjB,IAAI;YACF,MAAM,EAAEqC,OAAO6C,qBAAqB,EAAE,GAAG,MAAM1D,aAAa;gBAC1D3B;gBACAC;gBACAqF,gBAAgB;oBAAEC,QAAQ,CAAC;gBAAE;gBAC7BvB,QAAQzC;gBACRiE,WAAW;gBACXC,iBAAiB;gBACjBC,YAAY1F;gBACZ2F,gBAAgB;YAClB;YACAhC,gBAAgBrD,OAAO,GAAG+E;YAC1BjD,uBAAuB;QACzB,EAAE,OAAOwD,MAAM;QACb,gBAAgB;QAClB;IACF,GACA;QAAClE;QAAkB1B;QAAgB2B;QAAc1B;QAAgBsB;KAAK;IAGxE,MAAMX,iBAAwDnC,MAAMqF,WAAW,CAC7E,CAAC+B;QACC,MAAMC,mBAAmBzF,eAAeC,OAAO;QAC/CmC,SAAS;YACPsD,MAAM;YACNvD,OAAO;gBACL7C,aAAakG;gBACbzF,OAAOA,MAAM4F,GAAG,CAAC,CAACC,MAAMC;oBACtB,IAAIA,MAAMvG,aAAa;wBACrB,OAAO;4BACLwG,YAAYF,KAAKE,UAAU;4BAC3BC,QAAQH,KAAKG,MAAM;4BACnBC,WAAWP;4BACXQ,aAAaL,KAAKK,WAAW;wBAC/B;oBACF;oBACA,OAAOL;gBACT;YACF;QACF;IACF,GACA;QAAC7F;QAAOT;KAAY;IAGtB,MAAMC,WAAWnB,MAAMqF,WAAW,CAChC,OAAOyC;QACL,IAAInG,MAAMoG,MAAM,EAAE;YAChB,6DAA6D;YAC7D/D,SAAS;gBACPsD,MAAM;gBACNI,YAAY/F,KAAK,CAACT,YAAY,CAACwG,UAAU;gBACzCE,WAAWhG,eAAeC,OAAO;gBACjCuF,OAAOlG;YACT;QACF;QAEAkD,qBAAqB;YAAE4D,WAAW;YAAMC,KAAK;QAAa;QAC1D,IAAI,CAACvE,qBAAqB;YACxB,MAAM8C;QACR;QACAxC,SAAS;YACPsD,MAAM;YACN3F,OAAOuG,MAAMC,IAAI,CAACL,OAAOP,GAAG,CAAC,CAACa,OAAU,CAAA;oBACtCA;oBACA7F,cAAc2C,gBAAgBrD,OAAO;gBACvC,CAAA;QACF;QACAuC,qBAAqB;YAAE4D,WAAW;YAAOC,KAAK;QAAa;IAC7D,GACA;QAACzB;QAA2B9C;QAAqBU;QAAsBlD;QAAaS;KAAM;IAG5F,MAAM0G,sBAAsBlI,eAAegB;IAE3C,MAAMmH,kBAAkBnI,eAAe,OAAOqE;QAC5CJ,qBAAqB;YAAE4D,WAAW;YAAMC,KAAK;QAAa;QAE1D,IAAI,CAACvE,qBAAqB;YACxB,MAAM8C;QACR;QAEAxC,SAAS;YACPsD,MAAM;YACN3F,OAAO6C,aAAa+C,GAAG,CAAC,CAACC,OAAU,CAAA;oBACjC,GAAGA,IAAI;oBACPjF,cAAciF,MAAMjF,gBAAgB2C,gBAAgBrD,OAAO;gBAC7D,CAAA;QACF;QAEAuC,qBAAqB;YAAE4D,WAAW;YAAOC,KAAK;QAAa;IAC7D;IAEA,MAAMhG,aAAgDjC,MAAMqF,WAAW,CAAC,CAAC+B;QACvEpD,SAAS;YAAEsD,MAAM;YAAeF;QAAM;IACxC,GAAG,EAAE;IAEL,MAAMhF,yBAAwEpC,MAAMqF,WAAW,CAC7F,CAAC,EAAEqC,UAAU,EAAEN,KAAK,EAAE;QACpBpD,SAAS;YACPsD,MAAM;YACNiB,OAAOb;YACPN;QACF;IACF,GACA,EAAE;IAGJ,MAAMlF,cAAkDlC,MAAMqF,WAAW,CACvE,OAAO,EAAEmD,SAAS,EAAE,GAAG,CAAC,CAAC;QACvB,MAAMnB,mBAAmBzF,eAAeC,OAAO;QAC/C,MAAM4G,eAAe;eAAI9G;SAAM;QAC/B8G,YAAY,CAACvH,YAAY,GAAG;YAC1BwG,YAAYe,YAAY,CAACvH,YAAY,CAACwG,UAAU;YAChDC,QAAQc,YAAY,CAACvH,YAAY,CAACyG,MAAM;YACxCC,WAAWP;YACXQ,aAAaY,YAAY,CAACvH,YAAY,CAAC2G,WAAW;QACpD;QACA,MAAMa,UAOD,EAAE;QAEP5D,eAAe;QAEf,IAAK,IAAI2C,IAAI,GAAGA,IAAIgB,aAAaV,MAAM,EAAEN,IAAK;YAC5C,IAAI;gBACF,MAAMD,OAAOiB,YAAY,CAAChB,EAAE;gBAC5B,MAAMkB,YAAYnB,KAAKI,SAAS,EAAEQ,MAAMQ;gBAExC,4CAA4C;gBAC5C,IACED,aACA,OAAOA,cAAc,YACrB,UAAUA,aACT,CAAA,CAACA,UAAUE,IAAI,IAAIF,UAAUE,IAAI,KAAK,EAAC,GACxC;oBACAJ,YAAY,CAAChB,EAAE,GAAG;wBAChB,GAAGgB,YAAY,CAAChB,EAAE;wBAClBC,YAAY;oBACd;oBACA;gBACF;gBAEA1C,eAAehC,EAAE,yBAAyB;oBAAEnB,SAAS4F,IAAI;oBAAGqB,OAAOL,aAAaV,MAAM;gBAAC;gBAEvF,MAAMgB,sBAAsB,GAAG5D,YAAYpF,GAAG4F,SAAS,CACrD;oBACEJ,QAAQzC;oBACR+E,aAAaL,MAAMK,eAAepG;gBACpC,GACA;oBACEuH,gBAAgB;gBAClB,IACC;gBAEH,MAAMC,MAAM,MAAMvD,MAAMqD,qBAAqB;oBAC3C7C,MAAM,MAAMpF,eACV0G,KAAKI,SAAS,EACdY,WACAjH,gBACA4B,iBAAiB;wBAAE5B;oBAAe;oBAEpCqE,aAAa;oBACbG,QAAQ;gBACV;gBAEA,MAAMC,OAAO,MAAMiD,IAAIjD,IAAI;gBAE3B,IAAIiD,IAAIC,MAAM,KAAK,OAAOlD,MAAMmD,KAAK;oBACnCT,QAAQU,IAAI,CAAC;wBACX7H;wBACA4H,KAAKnD,KAAKmD,GAAG;wBACbxB,QAAQH,KAAKG,MAAM;oBACrB;gBACF;gBAEA,6CAA6C;gBAC7C,MAAM,CAAC0B,aAAaC,eAAe,GAAG,AAACtD,CAAAA,MAAMuD,UAAU,EAAE,AAAD,EAAGC,MAAM,CAC/D,CAAC,CAACC,WAAWC,aAAa,EAAEC;oBAC1B,MAAMC,eAAsB,EAAE;oBAC9B,MAAMC,kBAAyB,EAAE;oBAEjC,IAAIF,KAAKG,SAAS;wBAChBD,gBAAgBT,IAAI,CAACO;oBACvB;oBAEA,IAAIzB,MAAM6B,OAAO,CAACJ,KAAKK,MAAMT,SAAS;wBACpCI,IAAIK,IAAI,EAAET,OAAOU,QAAQ,CAACC;4BACxB,IAAIA,WAAWC,MAAM;gCACnBP,aAAaR,IAAI,CAACc;4BACpB,OAAO;gCACLL,gBAAgBT,IAAI,CAACc;4BACvB;wBACF;oBACF;oBAEA,OAAO;wBACL;+BAAIT;+BAAcG;yBAAa;wBAC/B;+BAAIF;+BAAiBG;yBAAgB;qBACtC;gBACH,GACA;oBAAC,EAAE;oBAAE,EAAE;iBAAC;gBAGVpB,YAAY,CAAChB,EAAE,GAAG;oBAChBC,YAAY2B,YAAYtB,MAAM;oBAC9BJ,QAAQc,YAAY,CAAChB,EAAE,CAACE,MAAM;oBAC9BC,WAAW1H,aAAauI,YAAY,CAAChB,EAAE,CAACG,SAAS,EAAE;wBACjDN,MAAM;wBACNiC,QAAQF;oBACV;gBACF;gBAEA,IAAIJ,IAAIC,MAAM,KAAK,OAAOD,IAAIC,MAAM,KAAK,KAAK;oBAC5C,iBAAiB;oBACjBT,YAAY,CAAChB,EAAE,GAAG;wBAChB,GAAGgB,YAAY,CAAChB,EAAE;wBAClBC,YAAYe,YAAY,CAAChB,EAAE,CAACC,UAAU,GAAG;oBAC3C;oBAEAzH,MAAMmK,KAAK,CAACd,cAAc,CAAC,EAAE,EAAEQ;gBACjC;YACF,EAAE,OAAOO,GAAG;YACV,UAAU;YACZ;QACF;QAEA/G,gBAAgB;QAChB0B,eAAe;QACfF,eAAe;QAEf,MAAMwF,iBAAiB,EAAE;QAEzB7B,aAAawB,OAAO,CAAC,CAAC,EAAEvC,UAAU,EAAE,EAAED;YACpC,IAAIC,YAAY;gBACd4C,eAAelB,IAAI,CAACX,YAAY,CAAChB,EAAE;YACrC;QACF;QAEA,MAAM8C,eAAeC,KAAKC,GAAG,CAAC,GAAGhC,aAAaV,MAAM,GAAGuC,eAAevC,MAAM;QAC5E,MAAML,aAAae,aAAaV,MAAM,GAAGwC;QAEzC,IAAIA,cAAc;YAChBtK,MAAMyK,OAAO,CAAC,CAAC,mBAAmB,EAAEH,aAAa,MAAM,CAAC;YACxD3F,wBAAwB;YAExB,IAAI,OAAOH,cAAc,YAAY;gBACnCA,UAAUiE,SAAShB;YACrB;QACF;QAEA,IAAIA,YAAY;YACdzH,MAAMmK,KAAK,CAAC,CAAC,eAAe,EAAE1C,WAAW,MAAM,CAAC;QAClD,OAAO;YACLrD,WAAWC;QACb;QAEAN,SAAS;YACPsD,MAAM;YACNvD,OAAO;gBACL7C,aAAa;gBACbS,OAAO2I;gBACPjI,iBAAiBiI,eAAed,MAAM,CAAC,CAACmB,KAAK,EAAEjD,UAAU,EAAE,GAAKiD,MAAMjD,YAAY;YACpF;QACF;QAEA,IAAI4C,eAAevC,MAAM,KAAK,GAAG;YAC/BrD,gBAAgBjD;YAChBkD,gBAAgBlD;QAClB;IACF,GACA;QACEE;QACAT;QACA8B;QACAmC;QACArC;QACAvB;QACA4B;QACAsB;QACAJ;QACAO;QACAN;QACAI;QACAC;KACD;IAGH,MAAMrD,iBAAiBtB,MAAMqF,WAAW,CACtC,OAAOuF,eAAwCC;QAC7C,IAAK,IAAIpD,IAAI,GAAGA,IAAI9F,MAAMoG,MAAM,EAAEN,IAAK;YACrCqD,OAAOC,OAAO,CAACH,eAAeX,OAAO,CAAC,CAAC,CAACE,MAAMvB,MAAM;gBAClD,IAAIjH,KAAK,CAAC8F,EAAE,CAACG,SAAS,CAACuC,KAAK,EAAE;oBAC5BxI,KAAK,CAAC8F,EAAE,CAACG,SAAS,CAACuC,KAAK,CAACvB,KAAK,GAAGA;oBAEjC5E,SAAS;wBACPsD,MAAM;wBACNI,YAAY/F,KAAK,CAAC8F,EAAE,CAACC,UAAU;wBAC/BE,WAAWjG,KAAK,CAAC8F,EAAE,CAACG,SAAS;wBAC7BR,OAAOK;oBACT;gBACF;YACF;YAEA,IAAI,OAAOoD,qBAAqB,YAAY;gBAC1CA;YACF;YAEA,IAAI9I,cAAc;gBAChB,MAAM,EAAEgC,KAAK,EAAE,GAAG,MAAMb,aAAa;oBACnC3B;oBACAC;oBACAqF,gBAAgB;oBAChBe,WAAWjG,KAAK,CAAC8F,EAAE,CAACG,SAAS;oBAC7Bb,WAAW;oBACXE,YAAY1F;gBACd;gBAEA,MAAMyJ,oBAAoBF,OAAOG,MAAM,CAAClH,OAAOyF,MAAM,CACnD,CAACmB,KAAK/B,QAAWA,OAAOsC,UAAU,QAAQP,MAAM,IAAIA,KACpD;gBAGF3G,SAAS;oBACPsD,MAAM;oBACNI,YAAYsD;oBACZpD,WAAW7D;oBACXqD,OAAOK;gBACT;YACF;QACF;IACF,GACA;QAAClG;QAAgBC;QAAgBG;QAAOuB;QAAcnB;KAAa;IAGrE,MAAMO,oBAAoBtC,MAAMqF,WAAW,CACzC,CAACwC;QACC7D,SAAS;YACPsD,MAAM;YACNI,YAAY/F,KAAK,CAACT,YAAY,CAACwG,UAAU;YACzCE,WAAWjG,KAAK,CAACT,YAAY,CAAC0G,SAAS;YACvCR,OAAOlG;YACP2G;QACF;IACF,GACA;QAAC3G;QAAaS;KAAM;IAGtB,MAAMwJ,mBAAmBnL,MAAMqF,WAAW,CAA0C;QAClFrB,SAAS;YACPsD,MAAM;YACNvD,OAAO;gBACLpC,OAAOA,MAAM4F,GAAG,CAAC,CAACC,OAAU,CAAA;wBAC1B,GAAGA,IAAI;wBACPK,aAAa,CAAC;oBAChB,CAAA;YACF;QACF;IACF,GAAG;QAAClG;KAAM;IAEV3B,MAAMoL,SAAS,CAAC;QACd,IAAI,CAAC7J,gBAAgB;YACnB;QACF;QACA,IAAI,CAACmC,qBAAqB;YACxB,KAAK8C;QACP;QAEA,IAAI,CAAC5C,8BAA8B;YACjC,KAAKwB;QACP;QAEA,IAAIb,gBAAgBC,cAAc;YAChC,IAAI,CAACd,uBAAuB,CAACE,8BAA8B;gBACzDE,kBAAkB;YACpB,OAAO;gBACLA,kBAAkB;YACpB;QACF;QAEA,IACEJ,uBACCc,CAAAA,cAAcuD,UAAUxD,cAAcwD,MAAK,KAC5C,CAAC9C,wBAAwBpD,OAAO,EAChC;YACA,IAAI2C,cAAcuD,QAAQ;gBACxB,KAAKO,gBAAgB9D;YACvB;YACA,IAAID,cAAcwD,QAAQ;gBACxB,KAAKM,oBAAoB9D;YAC3B;YACAU,wBAAwBpD,OAAO,GAAG;QACpC;QACA;IACF,GAAG;QACD0C;QACAiC;QACApB;QACA7D;QACAmC;QACAE;QACAY;KACD;IAED,qBACE,MAACxD;QACC4H,OAAO;YACL1H,aAAa6C,MAAM7C,WAAW;YAC9BC;YACAG;YACAC;YACAC;YACAE;YACAC;YACAC;YACAE;YACArB;YACAsB;YACAC;YACAC;YACAkJ;YACAjJ;YACAC;YACAC;YACAC;YACAC;QACF;;YAECuC,6BACC,KAAClE;gBACC0K,mBAAkB;gBAClBtG,aAAaA;gBACbuG,aAAY;gBACZC,IAAI;;YAGP9I;;;AAGP;AAEA,OAAO,SAAS+I;IACd,OAAOxL,MAAMyL,GAAG,CAACzK;AACnB"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/elements/BulkUpload/FormsManager/index.tsx"],"sourcesContent":["'use client'\n\nimport type {\n CollectionSlug,\n Data,\n DocumentSlots,\n FormState,\n JsonObject,\n SanitizedDocumentPermissions,\n UploadEdits,\n} from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport * as qs from 'qs-esm'\nimport React from 'react'\nimport { toast } from 'sonner'\n\nimport type { State } from './reducer.js'\n\nimport { fieldReducer } from '../../../forms/Form/fieldReducer.js'\nimport { useEffectEvent } from '../../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useLocale } from '../../../providers/Locale/index.js'\nimport { useServerFunctions } from '../../../providers/ServerFunctions/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { useUploadHandlers } from '../../../providers/UploadHandlers/index.js'\nimport { hasSavePermission as getHasSavePermission } from '../../../utilities/hasSavePermission.js'\nimport { LoadingOverlay } from '../../Loading/index.js'\nimport { useLoadingOverlay } from '../../LoadingOverlay/index.js'\nimport { useBulkUpload } from '../index.js'\nimport { createFormData } from './createFormData.js'\nimport { formsManagementReducer } from './reducer.js'\n\ntype FormsManagerContext = {\n readonly activeIndex: State['activeIndex']\n readonly addFiles: (filelist: FileList) => Promise<void>\n readonly bulkUpdateForm: (\n updatedFields: Record<string, unknown>,\n afterStateUpdate?: () => void,\n ) => Promise<void>\n readonly collectionSlug: string\n readonly docPermissions?: SanitizedDocumentPermissions\n readonly documentSlots: DocumentSlots\n readonly forms: State['forms']\n getFormDataRef: React.RefObject<() => Data>\n readonly hasPublishPermission: boolean\n readonly hasSavePermission: boolean\n readonly hasSubmitted: boolean\n readonly isInitializing: boolean\n readonly removeFile: (index: number) => void\n readonly resetUploadEdits?: () => void\n readonly saveAllDocs: ({ overrides }?: { overrides?: Record<string, unknown> }) => Promise<void>\n readonly setActiveIndex: (index: number) => void\n readonly setFormTotalErrorCount: ({\n errorCount,\n index,\n }: {\n errorCount: number\n index: number\n }) => void\n readonly totalErrorCount?: number\n readonly updateUploadEdits: (args: UploadEdits) => void\n}\n\nconst Context = React.createContext<FormsManagerContext>({\n activeIndex: 0,\n addFiles: () => Promise.resolve(),\n bulkUpdateForm: () => null,\n collectionSlug: '',\n docPermissions: undefined,\n documentSlots: {},\n forms: [],\n getFormDataRef: { current: () => ({}) },\n hasPublishPermission: false,\n hasSavePermission: false,\n hasSubmitted: false,\n isInitializing: false,\n removeFile: () => {},\n saveAllDocs: () => Promise.resolve(),\n setActiveIndex: () => 0,\n setFormTotalErrorCount: () => {},\n totalErrorCount: 0,\n updateUploadEdits: () => {},\n})\n\nconst initialState: State = {\n activeIndex: 0,\n forms: [],\n totalErrorCount: 0,\n}\n\nexport type InitialForms = Array<{\n file: File\n formID?: string\n initialState?: FormState | null\n}>\n\ntype FormsManagerProps = {\n readonly children: React.ReactNode\n}\n\nexport function FormsManagerProvider({ children }: FormsManagerProps) {\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n const { code } = useLocale()\n const { i18n, t } = useTranslation()\n\n const { getDocumentSlots, getFormState } = useServerFunctions()\n const { getUploadHandler } = useUploadHandlers()\n\n const [documentSlots, setDocumentSlots] = React.useState<DocumentSlots>({})\n const [hasSubmitted, setHasSubmitted] = React.useState(false)\n const [docPermissions, setDocPermissions] = React.useState<SanitizedDocumentPermissions>()\n const [hasSavePermission, setHasSavePermission] = React.useState(false)\n const [hasPublishPermission, setHasPublishPermission] = React.useState(false)\n const [hasInitializedState, setHasInitializedState] = React.useState(false)\n const [hasInitializedDocPermissions, setHasInitializedDocPermissions] = React.useState(false)\n const [isInitializing, setIsInitializing] = React.useState(false)\n const [state, dispatch] = React.useReducer(formsManagementReducer, initialState)\n const { activeIndex, forms, totalErrorCount } = state\n\n const formsRef = React.useRef(forms)\n formsRef.current = forms\n\n const { toggleLoadingOverlay } = useLoadingOverlay()\n const { closeModal } = useModal()\n const {\n collectionSlug,\n drawerSlug,\n initialFiles,\n initialForms,\n onSuccess,\n setInitialFiles,\n setInitialForms,\n setSuccessfullyUploaded,\n } = useBulkUpload()\n\n const [isUploading, setIsUploading] = React.useState(false)\n const [loadingText, setLoadingText] = React.useState('')\n\n const hasInitializedWithFiles = React.useRef(false)\n const initialStateRef = React.useRef<FormState>(null)\n const getFormDataRef = React.useRef<() => Data>(() => ({}))\n\n const actionURL = `${serverURL}${api}/${collectionSlug}`\n\n const initializeSharedDocPermissions = React.useCallback(async () => {\n const params = {\n locale: code || undefined,\n }\n\n const docAccessURL = `/${collectionSlug}/access`\n const res = await fetch(`${serverURL}${api}${docAccessURL}?${qs.stringify(params)}`, {\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'post',\n })\n\n const json: SanitizedDocumentPermissions = await res.json()\n const publishedAccessJSON = await fetch(\n `${serverURL}${api}${docAccessURL}?${qs.stringify(params)}`,\n {\n body: JSON.stringify({\n _status: 'published',\n }),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n ).then((res) => res.json())\n\n setDocPermissions(json)\n\n setHasSavePermission(\n getHasSavePermission({\n collectionSlug,\n docPermissions: json,\n isEditing: false,\n }),\n )\n\n setHasPublishPermission(publishedAccessJSON?.update)\n setHasInitializedDocPermissions(true)\n }, [api, code, collectionSlug, i18n.language, serverURL])\n\n const initializeSharedFormState = React.useCallback(\n async (abortController?: AbortController) => {\n if (abortController?.signal) {\n abortController.abort('aborting previous fetch for initial form state without files')\n }\n\n // FETCH AND SET THE DOCUMENT SLOTS HERE!\n const documentSlots = await getDocumentSlots({ collectionSlug })\n setDocumentSlots(documentSlots)\n\n try {\n const { state: formStateWithoutFiles } = await getFormState({\n collectionSlug,\n docPermissions,\n docPreferences: { fields: {} },\n locale: code,\n operation: 'create',\n renderAllFields: true,\n schemaPath: collectionSlug,\n skipValidation: true,\n })\n initialStateRef.current = formStateWithoutFiles\n setHasInitializedState(true)\n } catch (_err) {\n // swallow error\n }\n },\n [getDocumentSlots, collectionSlug, getFormState, docPermissions, code],\n )\n\n const setActiveIndex: FormsManagerContext['setActiveIndex'] = React.useCallback(\n (index: number) => {\n const currentFormsData = getFormDataRef.current()\n dispatch({\n type: 'REPLACE',\n state: {\n activeIndex: index,\n forms: forms.map((form, i) => {\n if (i === activeIndex) {\n return {\n errorCount: form.errorCount,\n formID: form.formID,\n formState: currentFormsData,\n uploadEdits: form.uploadEdits,\n }\n }\n return form\n }),\n },\n })\n },\n [forms, activeIndex],\n )\n\n const addFiles = React.useCallback(\n async (files: FileList) => {\n if (forms.length) {\n // save the state of the current form before adding new files\n dispatch({\n type: 'UPDATE_FORM',\n errorCount: forms[activeIndex].errorCount,\n formState: getFormDataRef.current(),\n index: activeIndex,\n })\n }\n\n toggleLoadingOverlay({ isLoading: true, key: 'addingDocs' })\n if (!hasInitializedState) {\n await initializeSharedFormState()\n }\n dispatch({\n type: 'ADD_FORMS',\n forms: Array.from(files).map((file) => ({\n file,\n initialState: initialStateRef.current,\n })),\n })\n toggleLoadingOverlay({ isLoading: false, key: 'addingDocs' })\n },\n [initializeSharedFormState, hasInitializedState, toggleLoadingOverlay, activeIndex, forms],\n )\n\n const addFilesEffectEvent = useEffectEvent(addFiles)\n\n const addInitialForms = useEffectEvent(async (initialForms: InitialForms) => {\n toggleLoadingOverlay({ isLoading: true, key: 'addingDocs' })\n\n if (!hasInitializedState) {\n await initializeSharedFormState()\n }\n\n dispatch({\n type: 'ADD_FORMS',\n forms: initialForms.map((form) => ({\n ...form,\n initialState: form?.initialState || initialStateRef.current,\n })),\n })\n\n toggleLoadingOverlay({ isLoading: false, key: 'addingDocs' })\n })\n\n const removeFile: FormsManagerContext['removeFile'] = React.useCallback((index) => {\n dispatch({ type: 'REMOVE_FORM', index })\n }, [])\n\n const setFormTotalErrorCount: FormsManagerContext['setFormTotalErrorCount'] = React.useCallback(\n ({ errorCount, index }) => {\n dispatch({\n type: 'UPDATE_ERROR_COUNT',\n count: errorCount,\n index,\n })\n },\n [],\n )\n\n const saveAllDocs: FormsManagerContext['saveAllDocs'] = React.useCallback(\n async ({ overrides } = {}) => {\n const currentFormsData = getFormDataRef.current()\n const currentForms = [...forms]\n currentForms[activeIndex] = {\n errorCount: currentForms[activeIndex].errorCount,\n formID: currentForms[activeIndex].formID,\n formState: currentFormsData,\n uploadEdits: currentForms[activeIndex].uploadEdits,\n }\n const newDocs: Array<{\n collectionSlug: CollectionSlug\n doc: JsonObject\n /**\n * ID of the form that created this document\n */\n formID: string\n }> = []\n\n setIsUploading(true)\n\n for (let i = 0; i < currentForms.length; i++) {\n try {\n const form = currentForms[i]\n const fileValue = form.formState?.file?.value\n\n // Skip upload if file is missing a filename\n if (\n fileValue &&\n typeof fileValue === 'object' &&\n 'name' in fileValue &&\n (!fileValue.name || fileValue.name === '')\n ) {\n currentForms[i] = {\n ...currentForms[i],\n errorCount: 1,\n }\n continue\n }\n\n setLoadingText(t('general:uploadingBulk', { current: i + 1, total: currentForms.length }))\n\n const actionURLWithParams = `${actionURL}${qs.stringify(\n {\n locale: code,\n uploadEdits: form?.uploadEdits || undefined,\n },\n {\n addQueryPrefix: true,\n },\n )}`\n\n const req = await fetch(actionURLWithParams, {\n body: await createFormData(\n form.formState,\n overrides,\n collectionSlug,\n getUploadHandler({ collectionSlug }),\n ),\n credentials: 'include',\n method: 'POST',\n })\n\n const json = await req.json()\n\n if (req.status === 201 && json?.doc) {\n newDocs.push({\n collectionSlug,\n doc: json.doc,\n formID: form.formID,\n })\n }\n\n // should expose some sort of helper for this\n const [fieldErrors, nonFieldErrors] = (json?.errors || []).reduce(\n ([fieldErrs, nonFieldErrs], err) => {\n const newFieldErrs: any[] = []\n const newNonFieldErrs: any[] = []\n\n if (err?.message) {\n newNonFieldErrs.push(err)\n }\n\n if (Array.isArray(err?.data?.errors)) {\n err.data?.errors.forEach((dataError) => {\n if (dataError?.path) {\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 currentForms[i] = {\n errorCount: fieldErrors.length,\n formID: currentForms[i].formID,\n formState: fieldReducer(currentForms[i].formState, {\n type: 'ADD_SERVER_ERRORS',\n errors: fieldErrors,\n }),\n }\n\n if (req.status === 413 || req.status === 400) {\n // file too large\n currentForms[i] = {\n ...currentForms[i],\n errorCount: currentForms[i].errorCount + 1,\n }\n\n toast.error(nonFieldErrors[0]?.message)\n }\n } catch (_) {\n // swallow\n }\n }\n\n setHasSubmitted(true)\n setLoadingText('')\n setIsUploading(false)\n\n const remainingForms = []\n\n currentForms.forEach(({ errorCount }, i) => {\n if (errorCount) {\n remainingForms.push(currentForms[i])\n }\n })\n\n const successCount = Math.max(0, currentForms.length - remainingForms.length)\n const errorCount = currentForms.length - successCount\n\n if (successCount) {\n toast.success(`Successfully saved ${successCount} files`)\n setSuccessfullyUploaded(true)\n\n if (typeof onSuccess === 'function') {\n onSuccess(newDocs, errorCount)\n }\n }\n\n if (errorCount) {\n toast.error(`Failed to save ${errorCount} files`)\n } else {\n closeModal(drawerSlug)\n }\n\n dispatch({\n type: 'REPLACE',\n state: {\n activeIndex: 0,\n forms: remainingForms,\n totalErrorCount: remainingForms.reduce((acc, { errorCount }) => acc + errorCount, 0),\n },\n })\n\n if (remainingForms.length === 0) {\n setInitialFiles(undefined)\n setInitialForms(undefined)\n }\n },\n [\n forms,\n activeIndex,\n t,\n actionURL,\n code,\n collectionSlug,\n getUploadHandler,\n onSuccess,\n closeModal,\n setSuccessfullyUploaded,\n drawerSlug,\n setInitialFiles,\n setInitialForms,\n ],\n )\n\n const bulkUpdateForm = React.useCallback(\n async (updatedFields: Record<string, unknown>, afterStateUpdate?: () => void) => {\n for (let i = 0; i < forms.length; i++) {\n Object.entries(updatedFields).forEach(([path, value]) => {\n if (forms[i].formState[path]) {\n forms[i].formState[path].value = value\n\n dispatch({\n type: 'UPDATE_FORM',\n errorCount: forms[i].errorCount,\n formState: forms[i].formState,\n index: i,\n })\n }\n })\n\n if (typeof afterStateUpdate === 'function') {\n afterStateUpdate()\n }\n\n if (hasSubmitted) {\n const { state } = await getFormState({\n collectionSlug,\n docPermissions,\n docPreferences: null,\n formState: forms[i].formState,\n operation: 'create',\n schemaPath: collectionSlug,\n })\n\n const newFormErrorCount = Object.values(state).reduce(\n (acc, value) => (value?.valid === false ? acc + 1 : acc),\n 0,\n )\n\n dispatch({\n type: 'UPDATE_FORM',\n errorCount: newFormErrorCount,\n formState: state,\n index: i,\n })\n }\n }\n },\n [collectionSlug, docPermissions, forms, getFormState, hasSubmitted],\n )\n\n const updateUploadEdits = React.useCallback<FormsManagerContext['updateUploadEdits']>(\n (uploadEdits) => {\n dispatch({\n type: 'UPDATE_FORM',\n errorCount: forms[activeIndex].errorCount,\n formState: forms[activeIndex].formState,\n index: activeIndex,\n uploadEdits,\n })\n },\n [activeIndex, forms],\n )\n\n const resetUploadEdits = React.useCallback<FormsManagerContext['resetUploadEdits']>(() => {\n dispatch({\n type: 'REPLACE',\n state: {\n forms: forms.map((form) => ({\n ...form,\n uploadEdits: {},\n })),\n },\n })\n }, [forms])\n\n React.useEffect(() => {\n if (!collectionSlug) {\n return\n }\n if (!hasInitializedState) {\n void initializeSharedFormState()\n }\n\n if (!hasInitializedDocPermissions) {\n void initializeSharedDocPermissions()\n }\n\n if (initialFiles || initialForms) {\n if (!hasInitializedState || !hasInitializedDocPermissions) {\n setIsInitializing(true)\n } else {\n setIsInitializing(false)\n }\n }\n\n if (\n hasInitializedState &&\n (initialForms?.length || initialFiles?.length) &&\n !hasInitializedWithFiles.current\n ) {\n if (initialForms?.length) {\n void addInitialForms(initialForms)\n }\n if (initialFiles?.length) {\n void addFilesEffectEvent(initialFiles)\n }\n hasInitializedWithFiles.current = true\n }\n return\n }, [\n initialFiles,\n initializeSharedFormState,\n initializeSharedDocPermissions,\n collectionSlug,\n hasInitializedState,\n hasInitializedDocPermissions,\n initialForms,\n ])\n\n return (\n <Context\n value={{\n activeIndex: state.activeIndex,\n addFiles,\n bulkUpdateForm,\n collectionSlug,\n docPermissions,\n documentSlots,\n forms,\n getFormDataRef,\n hasPublishPermission,\n hasSavePermission,\n hasSubmitted,\n isInitializing,\n removeFile,\n resetUploadEdits,\n saveAllDocs,\n setActiveIndex,\n setFormTotalErrorCount,\n totalErrorCount,\n updateUploadEdits,\n }}\n >\n {isUploading && (\n <LoadingOverlay\n animationDuration=\"250ms\"\n loadingText={loadingText}\n overlayType=\"fullscreen\"\n show\n />\n )}\n {children}\n </Context>\n )\n}\n\nexport function useFormsManager() {\n return React.use(Context)\n}\n"],"names":["useModal","qs","React","toast","fieldReducer","useEffectEvent","useConfig","useLocale","useServerFunctions","useTranslation","useUploadHandlers","hasSavePermission","getHasSavePermission","LoadingOverlay","useLoadingOverlay","useBulkUpload","createFormData","formsManagementReducer","Context","createContext","activeIndex","addFiles","Promise","resolve","bulkUpdateForm","collectionSlug","docPermissions","undefined","documentSlots","forms","getFormDataRef","current","hasPublishPermission","hasSubmitted","isInitializing","removeFile","saveAllDocs","setActiveIndex","setFormTotalErrorCount","totalErrorCount","updateUploadEdits","initialState","FormsManagerProvider","children","config","routes","api","serverURL","code","i18n","t","getDocumentSlots","getFormState","getUploadHandler","setDocumentSlots","useState","setHasSubmitted","setDocPermissions","setHasSavePermission","setHasPublishPermission","hasInitializedState","setHasInitializedState","hasInitializedDocPermissions","setHasInitializedDocPermissions","setIsInitializing","state","dispatch","useReducer","formsRef","useRef","toggleLoadingOverlay","closeModal","drawerSlug","initialFiles","initialForms","onSuccess","setInitialFiles","setInitialForms","setSuccessfullyUploaded","isUploading","setIsUploading","loadingText","setLoadingText","hasInitializedWithFiles","initialStateRef","actionURL","initializeSharedDocPermissions","useCallback","params","locale","docAccessURL","res","fetch","stringify","credentials","headers","language","method","json","publishedAccessJSON","body","JSON","_status","then","isEditing","update","initializeSharedFormState","abortController","signal","abort","formStateWithoutFiles","docPreferences","fields","operation","renderAllFields","schemaPath","skipValidation","_err","index","currentFormsData","type","map","form","i","errorCount","formID","formState","uploadEdits","files","length","isLoading","key","Array","from","file","addFilesEffectEvent","addInitialForms","count","overrides","currentForms","newDocs","fileValue","value","name","total","actionURLWithParams","addQueryPrefix","req","status","doc","push","fieldErrors","nonFieldErrors","errors","reduce","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","message","isArray","data","forEach","dataError","path","error","_","remainingForms","successCount","Math","max","success","acc","updatedFields","afterStateUpdate","Object","entries","newFormErrorCount","values","valid","resetUploadEdits","useEffect","animationDuration","overlayType","show","useFormsManager","use"],"mappings":"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"}
|
|
@@ -105,7 +105,18 @@ export function BulkUploadDrawer() {
|
|
|
105
105
|
})
|
|
106
106
|
});
|
|
107
107
|
}
|
|
108
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Like initialFiles, but allows manually providing initial form state or the form ID for each file
|
|
110
|
+
*/ /**
|
|
111
|
+
* ID of the form that created this document
|
|
112
|
+
*/ /**
|
|
113
|
+
* An array of collection slugs that can be selected in the collection dropdown (if applicable)
|
|
114
|
+
* @default null - collection cannot be selected
|
|
115
|
+
*/ /**
|
|
116
|
+
* Set the collections that can be selected in the collection dropdown (if applicable)
|
|
117
|
+
*
|
|
118
|
+
* @default null - collection cannot be selected
|
|
119
|
+
*/ const Context = /*#__PURE__*/ React.createContext({
|
|
109
120
|
collectionSlug: '',
|
|
110
121
|
drawerSlug: '',
|
|
111
122
|
initialFiles: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/BulkUpload/index.tsx"],"sourcesContent":["'use client'\n\nimport type { CollectionSlug, JsonObject } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { validateMimeType } from 'payload/shared'\nimport React, { useEffect } from 'react'\nimport { toast } from 'sonner'\n\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { EditDepthProvider } from '../../providers/EditDepth/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { UploadControlsProvider } from '../../providers/UploadControls/index.js'\nimport { Drawer, useDrawerDepth } from '../Drawer/index.js'\nimport { AddFilesView } from './AddFilesView/index.js'\nimport { AddingFilesView } from './AddingFilesView/index.js'\nimport { FormsManagerProvider, type InitialForms, useFormsManager } from './FormsManager/index.js'\n\nconst drawerSlug = 'bulk-upload-drawer-slug'\n\nfunction DrawerContent() {\n const { addFiles, forms, isInitializing } = useFormsManager()\n const { closeModal } = useModal()\n const { collectionSlug, drawerSlug } = useBulkUpload()\n const { getEntityConfig } = useConfig()\n const { t } = useTranslation()\n\n const uploadCollection = getEntityConfig({ collectionSlug })\n const uploadConfig = uploadCollection?.upload\n const uploadMimeTypes = uploadConfig?.mimeTypes\n\n const onDrop = React.useCallback(\n (acceptedFiles: FileList) => {\n const fileTransfer = new DataTransfer()\n for (const candidateFile of acceptedFiles) {\n if (\n uploadMimeTypes === undefined ||\n uploadMimeTypes.length === 0 ||\n validateMimeType(candidateFile.type, uploadMimeTypes)\n ) {\n fileTransfer.items.add(candidateFile)\n }\n }\n if (fileTransfer.files.length === 0) {\n toast.error(t('error:invalidFileType'))\n } else {\n void addFiles(fileTransfer.files)\n }\n },\n [addFiles, t, uploadMimeTypes],\n )\n\n if (!collectionSlug) {\n return null\n }\n\n if (!forms.length && !isInitializing) {\n return (\n <AddFilesView\n acceptMimeTypes={uploadMimeTypes?.join(', ')}\n onCancel={() => closeModal(drawerSlug)}\n onDrop={onDrop}\n />\n )\n } else {\n return <AddingFilesView />\n }\n}\n\nexport type BulkUploadProps = {\n readonly children: React.ReactNode\n}\n\nexport function BulkUploadDrawer() {\n const {\n drawerSlug,\n onCancel,\n setInitialFiles,\n setInitialForms,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n setSuccessfullyUploaded,\n successfullyUploaded,\n } = useBulkUpload()\n const { modalState } = useModal()\n const previousModalStateRef = React.useRef(modalState)\n\n /**\n * This is used to trigger onCancel when the drawer is closed (=> forms reset, as FormsManager is unmounted)\n */\n const onModalStateChanged = useEffectEvent((modalState) => {\n const previousModalState = previousModalStateRef.current[drawerSlug]\n const currentModalState = modalState[drawerSlug]\n\n if (typeof currentModalState === 'undefined' && typeof previousModalState === 'undefined') {\n return\n }\n\n if (previousModalState?.isOpen !== currentModalState?.isOpen) {\n if (!currentModalState?.isOpen) {\n if (!successfullyUploaded) {\n // It's only cancelled if successfullyUploaded is not set. Otherwise, this would simply be a modal close after success\n // => do not call cancel, just reset everything\n if (typeof onCancel === 'function') {\n onCancel()\n }\n }\n\n // Reset everything to defaults\n setInitialFiles(undefined)\n setInitialForms(undefined)\n setOnCancel(() => () => null)\n setOnSuccess(() => () => null)\n setSelectableCollections(null)\n setSuccessfullyUploaded(false)\n }\n }\n previousModalStateRef.current = modalState\n })\n\n useEffect(() => {\n onModalStateChanged(modalState)\n }, [modalState])\n\n return (\n <Drawer gutter={false} Header={null} slug={drawerSlug}>\n <FormsManagerProvider>\n <UploadControlsProvider>\n <EditDepthProvider>\n <DrawerContent />\n </EditDepthProvider>\n </UploadControlsProvider>\n </FormsManagerProvider>\n </Drawer>\n )\n}\n\nexport type BulkUploadContext = {\n collectionSlug: CollectionSlug\n drawerSlug: string\n initialFiles: FileList\n /**\n * Like initialFiles, but allows manually providing initial form state or the form ID for each file\n */\n initialForms: InitialForms\n maxFiles: number\n onCancel: () => void\n onSuccess: (\n uploadedForms: Array<{\n collectionSlug: CollectionSlug\n doc: JsonObject\n /**\n * ID of the form that created this document\n */\n formID: string\n }>,\n errorCount: number,\n ) => void\n /**\n * An array of collection slugs that can be selected in the collection dropdown (if applicable)\n * @default null - collection cannot be selected\n */\n selectableCollections?: null | string[]\n setCollectionSlug: (slug: string) => void\n setInitialFiles: (files: FileList) => void\n setInitialForms: (\n forms: ((forms: InitialForms | undefined) => InitialForms | undefined) | InitialForms,\n ) => void\n setMaxFiles: (maxFiles: number) => void\n setOnCancel: (onCancel: BulkUploadContext['onCancel']) => void\n setOnSuccess: (onSuccess: BulkUploadContext['onSuccess']) => void\n /**\n * Set the collections that can be selected in the collection dropdown (if applicable)\n *\n * @default null - collection cannot be selected\n */\n setSelectableCollections: (collections: null | string[]) => void\n setSuccessfullyUploaded: (successfullyUploaded: boolean) => void\n successfullyUploaded: boolean\n}\n\nconst Context = React.createContext<BulkUploadContext>({\n collectionSlug: '',\n drawerSlug: '',\n initialFiles: undefined,\n initialForms: [],\n maxFiles: undefined,\n onCancel: () => null,\n onSuccess: () => null,\n selectableCollections: null,\n setCollectionSlug: () => null,\n setInitialFiles: () => null,\n setInitialForms: () => null,\n setMaxFiles: () => null,\n setOnCancel: () => null,\n setOnSuccess: () => null,\n setSelectableCollections: () => null,\n setSuccessfullyUploaded: () => false,\n successfullyUploaded: false,\n})\nexport function BulkUploadProvider({\n children,\n drawerSlugPrefix,\n}: {\n readonly children: React.ReactNode\n readonly drawerSlugPrefix?: string\n}) {\n const [selectableCollections, setSelectableCollections] = React.useState<null | string[]>(null)\n const [collection, setCollection] = React.useState<string>()\n const [onSuccessFunction, setOnSuccessFunction] = React.useState<BulkUploadContext['onSuccess']>()\n const [onCancelFunction, setOnCancelFunction] = React.useState<BulkUploadContext['onCancel']>()\n const [initialFiles, setInitialFiles] = React.useState<FileList>(undefined)\n const [initialForms, setInitialForms] = React.useState<InitialForms>(undefined)\n const [maxFiles, setMaxFiles] = React.useState<number>(undefined)\n const [successfullyUploaded, setSuccessfullyUploaded] = React.useState<boolean>(false)\n\n const drawerSlug = `${drawerSlugPrefix ? `${drawerSlugPrefix}-` : ''}${useBulkUploadDrawerSlug()}`\n\n const setOnSuccess: BulkUploadContext['setOnSuccess'] = (onSuccess) => {\n setOnSuccessFunction(() => onSuccess)\n }\n const setOnCancel: BulkUploadContext['setOnCancel'] = (onCancel) => {\n setOnCancelFunction(() => onCancel)\n }\n\n return (\n <Context\n value={{\n collectionSlug: collection,\n drawerSlug,\n initialFiles,\n initialForms,\n maxFiles,\n onCancel: () => {\n if (typeof onCancelFunction === 'function') {\n onCancelFunction()\n }\n },\n onSuccess: (newDocs, errorCount) => {\n if (typeof onSuccessFunction === 'function') {\n onSuccessFunction(newDocs, errorCount)\n }\n },\n selectableCollections,\n setCollectionSlug: setCollection,\n setInitialFiles,\n setInitialForms,\n setMaxFiles,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n setSuccessfullyUploaded,\n successfullyUploaded,\n }}\n >\n <React.Fragment>\n {children}\n <BulkUploadDrawer />\n </React.Fragment>\n </Context>\n )\n}\n\nexport const useBulkUpload = () => React.use(Context)\n\nexport function useBulkUploadDrawerSlug() {\n const depth = useDrawerDepth()\n\n return `${drawerSlug}-${depth || 1}`\n}\n"],"names":["useModal","validateMimeType","React","useEffect","toast","useEffectEvent","useConfig","EditDepthProvider","useTranslation","UploadControlsProvider","Drawer","useDrawerDepth","AddFilesView","AddingFilesView","FormsManagerProvider","useFormsManager","drawerSlug","DrawerContent","addFiles","forms","isInitializing","closeModal","collectionSlug","useBulkUpload","getEntityConfig","t","uploadCollection","uploadConfig","upload","uploadMimeTypes","mimeTypes","onDrop","useCallback","acceptedFiles","fileTransfer","DataTransfer","candidateFile","undefined","length","type","items","add","files","error","acceptMimeTypes","join","onCancel","BulkUploadDrawer","setInitialFiles","setInitialForms","setOnCancel","setOnSuccess","setSelectableCollections","setSuccessfullyUploaded","successfullyUploaded","modalState","previousModalStateRef","useRef","onModalStateChanged","previousModalState","current","currentModalState","isOpen","gutter","Header","slug","Context","createContext","initialFiles","initialForms","maxFiles","onSuccess","selectableCollections","setCollectionSlug","setMaxFiles","BulkUploadProvider","children","drawerSlugPrefix","useState","collection","setCollection","onSuccessFunction","setOnSuccessFunction","onCancelFunction","setOnCancelFunction","useBulkUploadDrawerSlug","value","newDocs","errorCount","Fragment","use","depth"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/BulkUpload/index.tsx"],"sourcesContent":["'use client'\n\nimport type { CollectionSlug, JsonObject } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { validateMimeType } from 'payload/shared'\nimport React, { useEffect } from 'react'\nimport { toast } from 'sonner'\n\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { EditDepthProvider } from '../../providers/EditDepth/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { UploadControlsProvider } from '../../providers/UploadControls/index.js'\nimport { Drawer, useDrawerDepth } from '../Drawer/index.js'\nimport { AddFilesView } from './AddFilesView/index.js'\nimport { AddingFilesView } from './AddingFilesView/index.js'\nimport { FormsManagerProvider, type InitialForms, useFormsManager } from './FormsManager/index.js'\n\nconst drawerSlug = 'bulk-upload-drawer-slug'\n\nfunction DrawerContent() {\n const { addFiles, forms, isInitializing } = useFormsManager()\n const { closeModal } = useModal()\n const { collectionSlug, drawerSlug } = useBulkUpload()\n const { getEntityConfig } = useConfig()\n const { t } = useTranslation()\n\n const uploadCollection = getEntityConfig({ collectionSlug })\n const uploadConfig = uploadCollection?.upload\n const uploadMimeTypes = uploadConfig?.mimeTypes\n\n const onDrop = React.useCallback(\n (acceptedFiles: FileList) => {\n const fileTransfer = new DataTransfer()\n for (const candidateFile of acceptedFiles) {\n if (\n uploadMimeTypes === undefined ||\n uploadMimeTypes.length === 0 ||\n validateMimeType(candidateFile.type, uploadMimeTypes)\n ) {\n fileTransfer.items.add(candidateFile)\n }\n }\n if (fileTransfer.files.length === 0) {\n toast.error(t('error:invalidFileType'))\n } else {\n void addFiles(fileTransfer.files)\n }\n },\n [addFiles, t, uploadMimeTypes],\n )\n\n if (!collectionSlug) {\n return null\n }\n\n if (!forms.length && !isInitializing) {\n return (\n <AddFilesView\n acceptMimeTypes={uploadMimeTypes?.join(', ')}\n onCancel={() => closeModal(drawerSlug)}\n onDrop={onDrop}\n />\n )\n } else {\n return <AddingFilesView />\n }\n}\n\nexport type BulkUploadProps = {\n readonly children: React.ReactNode\n}\n\nexport function BulkUploadDrawer() {\n const {\n drawerSlug,\n onCancel,\n setInitialFiles,\n setInitialForms,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n setSuccessfullyUploaded,\n successfullyUploaded,\n } = useBulkUpload()\n const { modalState } = useModal()\n const previousModalStateRef = React.useRef(modalState)\n\n /**\n * This is used to trigger onCancel when the drawer is closed (=> forms reset, as FormsManager is unmounted)\n */\n const onModalStateChanged = useEffectEvent((modalState) => {\n const previousModalState = previousModalStateRef.current[drawerSlug]\n const currentModalState = modalState[drawerSlug]\n\n if (typeof currentModalState === 'undefined' && typeof previousModalState === 'undefined') {\n return\n }\n\n if (previousModalState?.isOpen !== currentModalState?.isOpen) {\n if (!currentModalState?.isOpen) {\n if (!successfullyUploaded) {\n // It's only cancelled if successfullyUploaded is not set. Otherwise, this would simply be a modal close after success\n // => do not call cancel, just reset everything\n if (typeof onCancel === 'function') {\n onCancel()\n }\n }\n\n // Reset everything to defaults\n setInitialFiles(undefined)\n setInitialForms(undefined)\n setOnCancel(() => () => null)\n setOnSuccess(() => () => null)\n setSelectableCollections(null)\n setSuccessfullyUploaded(false)\n }\n }\n previousModalStateRef.current = modalState\n })\n\n useEffect(() => {\n onModalStateChanged(modalState)\n }, [modalState])\n\n return (\n <Drawer gutter={false} Header={null} slug={drawerSlug}>\n <FormsManagerProvider>\n <UploadControlsProvider>\n <EditDepthProvider>\n <DrawerContent />\n </EditDepthProvider>\n </UploadControlsProvider>\n </FormsManagerProvider>\n </Drawer>\n )\n}\n\nexport type BulkUploadContext = {\n collectionSlug: CollectionSlug\n drawerSlug: string\n initialFiles: FileList\n /**\n * Like initialFiles, but allows manually providing initial form state or the form ID for each file\n */\n initialForms: InitialForms\n maxFiles: number\n onCancel: () => void\n onSuccess: (\n uploadedForms: Array<{\n collectionSlug: CollectionSlug\n doc: JsonObject\n /**\n * ID of the form that created this document\n */\n formID: string\n }>,\n errorCount: number,\n ) => void\n /**\n * An array of collection slugs that can be selected in the collection dropdown (if applicable)\n * @default null - collection cannot be selected\n */\n selectableCollections?: null | string[]\n setCollectionSlug: (slug: string) => void\n setInitialFiles: (files: FileList) => void\n setInitialForms: (\n forms: ((forms: InitialForms | undefined) => InitialForms | undefined) | InitialForms,\n ) => void\n setMaxFiles: (maxFiles: number) => void\n setOnCancel: (onCancel: BulkUploadContext['onCancel']) => void\n setOnSuccess: (onSuccess: BulkUploadContext['onSuccess']) => void\n /**\n * Set the collections that can be selected in the collection dropdown (if applicable)\n *\n * @default null - collection cannot be selected\n */\n setSelectableCollections: (collections: null | string[]) => void\n setSuccessfullyUploaded: (successfullyUploaded: boolean) => void\n successfullyUploaded: boolean\n}\n\nconst Context = React.createContext<BulkUploadContext>({\n collectionSlug: '',\n drawerSlug: '',\n initialFiles: undefined,\n initialForms: [],\n maxFiles: undefined,\n onCancel: () => null,\n onSuccess: () => null,\n selectableCollections: null,\n setCollectionSlug: () => null,\n setInitialFiles: () => null,\n setInitialForms: () => null,\n setMaxFiles: () => null,\n setOnCancel: () => null,\n setOnSuccess: () => null,\n setSelectableCollections: () => null,\n setSuccessfullyUploaded: () => false,\n successfullyUploaded: false,\n})\nexport function BulkUploadProvider({\n children,\n drawerSlugPrefix,\n}: {\n readonly children: React.ReactNode\n readonly drawerSlugPrefix?: string\n}) {\n const [selectableCollections, setSelectableCollections] = React.useState<null | string[]>(null)\n const [collection, setCollection] = React.useState<string>()\n const [onSuccessFunction, setOnSuccessFunction] = React.useState<BulkUploadContext['onSuccess']>()\n const [onCancelFunction, setOnCancelFunction] = React.useState<BulkUploadContext['onCancel']>()\n const [initialFiles, setInitialFiles] = React.useState<FileList>(undefined)\n const [initialForms, setInitialForms] = React.useState<InitialForms>(undefined)\n const [maxFiles, setMaxFiles] = React.useState<number>(undefined)\n const [successfullyUploaded, setSuccessfullyUploaded] = React.useState<boolean>(false)\n\n const drawerSlug = `${drawerSlugPrefix ? `${drawerSlugPrefix}-` : ''}${useBulkUploadDrawerSlug()}`\n\n const setOnSuccess: BulkUploadContext['setOnSuccess'] = (onSuccess) => {\n setOnSuccessFunction(() => onSuccess)\n }\n const setOnCancel: BulkUploadContext['setOnCancel'] = (onCancel) => {\n setOnCancelFunction(() => onCancel)\n }\n\n return (\n <Context\n value={{\n collectionSlug: collection,\n drawerSlug,\n initialFiles,\n initialForms,\n maxFiles,\n onCancel: () => {\n if (typeof onCancelFunction === 'function') {\n onCancelFunction()\n }\n },\n onSuccess: (newDocs, errorCount) => {\n if (typeof onSuccessFunction === 'function') {\n onSuccessFunction(newDocs, errorCount)\n }\n },\n selectableCollections,\n setCollectionSlug: setCollection,\n setInitialFiles,\n setInitialForms,\n setMaxFiles,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n setSuccessfullyUploaded,\n successfullyUploaded,\n }}\n >\n <React.Fragment>\n {children}\n <BulkUploadDrawer />\n </React.Fragment>\n </Context>\n )\n}\n\nexport const useBulkUpload = () => React.use(Context)\n\nexport function useBulkUploadDrawerSlug() {\n const depth = useDrawerDepth()\n\n return `${drawerSlug}-${depth || 1}`\n}\n"],"names":["useModal","validateMimeType","React","useEffect","toast","useEffectEvent","useConfig","EditDepthProvider","useTranslation","UploadControlsProvider","Drawer","useDrawerDepth","AddFilesView","AddingFilesView","FormsManagerProvider","useFormsManager","drawerSlug","DrawerContent","addFiles","forms","isInitializing","closeModal","collectionSlug","useBulkUpload","getEntityConfig","t","uploadCollection","uploadConfig","upload","uploadMimeTypes","mimeTypes","onDrop","useCallback","acceptedFiles","fileTransfer","DataTransfer","candidateFile","undefined","length","type","items","add","files","error","acceptMimeTypes","join","onCancel","BulkUploadDrawer","setInitialFiles","setInitialForms","setOnCancel","setOnSuccess","setSelectableCollections","setSuccessfullyUploaded","successfullyUploaded","modalState","previousModalStateRef","useRef","onModalStateChanged","previousModalState","current","currentModalState","isOpen","gutter","Header","slug","Context","createContext","initialFiles","initialForms","maxFiles","onSuccess","selectableCollections","setCollectionSlug","setMaxFiles","BulkUploadProvider","children","drawerSlugPrefix","useState","collection","setCollection","onSuccessFunction","setOnSuccessFunction","onCancelFunction","setOnCancelFunction","useBulkUploadDrawerSlug","value","newDocs","errorCount","Fragment","use","depth"],"mappings":"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"}
|
|
@@ -137,8 +137,8 @@ export const Button = (props)=>{
|
|
|
137
137
|
});
|
|
138
138
|
break;
|
|
139
139
|
default:
|
|
140
|
-
const Tag = el
|
|
141
|
-
|
|
140
|
+
const Tag = el;
|
|
141
|
+
// eslint-disable-line no-case-declarations
|
|
142
142
|
buttonElement = /*#__PURE__*/ _jsx(Tag, {
|
|
143
143
|
ref: ref,
|
|
144
144
|
...buttonProps,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/Button/index.tsx"],"sourcesContent":["'use client'\nimport React, { Fragment, isValidElement } from 'react'\n\nimport type { Props } from './types.js'\n\nimport { ChevronIcon } from '../../icons/Chevron/index.js'\nimport { EditIcon } from '../../icons/Edit/index.js'\nimport { LinkIcon } from '../../icons/Link/index.js'\nimport { PlusIcon } from '../../icons/Plus/index.js'\nimport { SwapIcon } from '../../icons/Swap/index.js'\nimport { XIcon } from '../../icons/X/index.js'\nimport { Link } from '../Link/index.js'\nimport { Popup } from '../Popup/index.js'\nimport './index.scss'\nimport { Tooltip } from '../Tooltip/index.js'\n\nconst icons = {\n chevron: ChevronIcon,\n edit: EditIcon,\n link: LinkIcon,\n plus: PlusIcon,\n swap: SwapIcon,\n x: XIcon,\n}\n\nconst baseClass = 'btn'\n\nexport const ButtonContents = ({ children, icon, showTooltip, tooltip }) => {\n const BuiltInIcon = icons[icon]\n\n return (\n <Fragment>\n {tooltip && (\n <Tooltip className={`${baseClass}__tooltip`} show={showTooltip}>\n {tooltip}\n </Tooltip>\n )}\n <span className={`${baseClass}__content`}>\n {children && <span className={`${baseClass}__label`}>{children}</span>}\n {icon && (\n <span className={`${baseClass}__icon`}>\n {isValidElement(icon) && icon}\n {BuiltInIcon && <BuiltInIcon />}\n </span>\n )}\n </span>\n </Fragment>\n )\n}\n\nexport const Button: React.FC<Props> = (props) => {\n const {\n id,\n type = 'button',\n 'aria-label': ariaLabel,\n buttonStyle = 'primary',\n children,\n className,\n disabled,\n el = 'button',\n enableSubMenu,\n extraButtonProps = {},\n icon,\n iconPosition = 'right',\n iconStyle = 'without-border',\n margin = true,\n newTab,\n onClick,\n onMouseDown,\n ref,\n round,\n size = 'medium',\n SubMenuPopupContent,\n to,\n tooltip,\n url,\n } = props\n\n const [showTooltip, setShowTooltip] = React.useState(false)\n\n const classes = [\n baseClass,\n className && className,\n icon && `${baseClass}--icon`,\n iconStyle && `${baseClass}--icon-style-${iconStyle}`,\n icon && !children && `${baseClass}--icon-only`,\n size && `${baseClass}--size-${size}`,\n icon && iconPosition && `${baseClass}--icon-position-${iconPosition}`,\n tooltip && `${baseClass}--has-tooltip`,\n !SubMenuPopupContent && `${baseClass}--withoutPopup`,\n !margin && `${baseClass}--no-margin`,\n ]\n .filter(Boolean)\n .join(' ')\n\n function handleClick(event) {\n setShowTooltip(false)\n if (type !== 'submit' && onClick) {\n event.preventDefault()\n }\n if (onClick) {\n onClick(event)\n }\n }\n\n const styleClasses = [\n buttonStyle && `${baseClass}--style-${buttonStyle}`,\n disabled && `${baseClass}--disabled`,\n round && `${baseClass}--round`,\n SubMenuPopupContent ? `${baseClass}--withPopup` : `${baseClass}--withoutPopup`,\n ]\n .filter(Boolean)\n .join(' ')\n\n const buttonProps = {\n id,\n type,\n 'aria-disabled': disabled,\n 'aria-label': ariaLabel,\n className: !SubMenuPopupContent ? [classes, styleClasses].join(' ') : classes,\n disabled,\n onClick: !disabled ? handleClick : undefined,\n onMouseDown: !disabled ? onMouseDown : undefined,\n onPointerEnter: tooltip ? () => setShowTooltip(true) : undefined,\n onPointerLeave: tooltip ? () => setShowTooltip(false) : undefined,\n rel: newTab ? 'noopener noreferrer' : undefined,\n target: newTab ? '_blank' : undefined,\n title: ariaLabel,\n ...extraButtonProps,\n }\n\n let buttonElement\n\n switch (el) {\n case 'anchor':\n buttonElement = (\n <a\n {...buttonProps}\n href={!disabled ? url : undefined}\n ref={ref as React.RefObject<HTMLAnchorElement>}\n >\n <ButtonContents icon={icon} showTooltip={showTooltip} tooltip={tooltip}>\n {children}\n </ButtonContents>\n </a>\n )\n break\n\n case 'link':\n if (disabled) {\n buttonElement = (\n <div {...buttonProps}>\n <ButtonContents icon={icon} showTooltip={showTooltip} tooltip={tooltip}>\n {children}\n </ButtonContents>\n </div>\n )\n }\n\n buttonElement = (\n <Link {...buttonProps} href={to || url} prefetch={false}>\n <ButtonContents icon={icon} showTooltip={showTooltip} tooltip={tooltip}>\n {children}\n </ButtonContents>\n </Link>\n )\n\n break\n\n default:\n const Tag = el // eslint-disable-line no-case-declarations\n\n buttonElement = (\n <Tag ref={ref} {...buttonProps}>\n <ButtonContents icon={icon} showTooltip={showTooltip} tooltip={tooltip}>\n {children}\n </ButtonContents>\n </Tag>\n )\n break\n }\n if (SubMenuPopupContent) {\n return (\n <div className={styleClasses}>\n {buttonElement}\n <Popup\n button={<ChevronIcon />}\n buttonSize={size}\n className={disabled && !enableSubMenu ? `${baseClass}--popup-disabled` : ''}\n disabled={disabled && !enableSubMenu}\n horizontalAlign=\"right\"\n id={`${id}-popup`}\n noBackground\n render={({ close }) => SubMenuPopupContent({ close: () => close() })}\n size=\"large\"\n verticalAlign=\"bottom\"\n />\n </div>\n )\n }\n\n return buttonElement\n}\n"],"names":["React","Fragment","isValidElement","ChevronIcon","EditIcon","LinkIcon","PlusIcon","SwapIcon","XIcon","Link","Popup","Tooltip","icons","chevron","edit","link","plus","swap","x","baseClass","ButtonContents","children","icon","showTooltip","tooltip","BuiltInIcon","className","show","span","Button","props","id","type","ariaLabel","buttonStyle","disabled","el","enableSubMenu","extraButtonProps","iconPosition","iconStyle","margin","newTab","onClick","onMouseDown","ref","round","size","SubMenuPopupContent","to","url","setShowTooltip","useState","classes","filter","Boolean","join","handleClick","event","preventDefault","styleClasses","buttonProps","undefined","onPointerEnter","onPointerLeave","rel","target","title","buttonElement","a","href","div","prefetch","Tag","button","buttonSize","horizontalAlign","noBackground","render","close","verticalAlign"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/Button/index.tsx"],"sourcesContent":["'use client'\nimport React, { Fragment, isValidElement } from 'react'\n\nimport type { Props } from './types.js'\n\nimport { ChevronIcon } from '../../icons/Chevron/index.js'\nimport { EditIcon } from '../../icons/Edit/index.js'\nimport { LinkIcon } from '../../icons/Link/index.js'\nimport { PlusIcon } from '../../icons/Plus/index.js'\nimport { SwapIcon } from '../../icons/Swap/index.js'\nimport { XIcon } from '../../icons/X/index.js'\nimport { Link } from '../Link/index.js'\nimport { Popup } from '../Popup/index.js'\nimport './index.scss'\nimport { Tooltip } from '../Tooltip/index.js'\n\nconst icons = {\n chevron: ChevronIcon,\n edit: EditIcon,\n link: LinkIcon,\n plus: PlusIcon,\n swap: SwapIcon,\n x: XIcon,\n}\n\nconst baseClass = 'btn'\n\nexport const ButtonContents = ({ children, icon, showTooltip, tooltip }) => {\n const BuiltInIcon = icons[icon]\n\n return (\n <Fragment>\n {tooltip && (\n <Tooltip className={`${baseClass}__tooltip`} show={showTooltip}>\n {tooltip}\n </Tooltip>\n )}\n <span className={`${baseClass}__content`}>\n {children && <span className={`${baseClass}__label`}>{children}</span>}\n {icon && (\n <span className={`${baseClass}__icon`}>\n {isValidElement(icon) && icon}\n {BuiltInIcon && <BuiltInIcon />}\n </span>\n )}\n </span>\n </Fragment>\n )\n}\n\nexport const Button: React.FC<Props> = (props) => {\n const {\n id,\n type = 'button',\n 'aria-label': ariaLabel,\n buttonStyle = 'primary',\n children,\n className,\n disabled,\n el = 'button',\n enableSubMenu,\n extraButtonProps = {},\n icon,\n iconPosition = 'right',\n iconStyle = 'without-border',\n margin = true,\n newTab,\n onClick,\n onMouseDown,\n ref,\n round,\n size = 'medium',\n SubMenuPopupContent,\n to,\n tooltip,\n url,\n } = props\n\n const [showTooltip, setShowTooltip] = React.useState(false)\n\n const classes = [\n baseClass,\n className && className,\n icon && `${baseClass}--icon`,\n iconStyle && `${baseClass}--icon-style-${iconStyle}`,\n icon && !children && `${baseClass}--icon-only`,\n size && `${baseClass}--size-${size}`,\n icon && iconPosition && `${baseClass}--icon-position-${iconPosition}`,\n tooltip && `${baseClass}--has-tooltip`,\n !SubMenuPopupContent && `${baseClass}--withoutPopup`,\n !margin && `${baseClass}--no-margin`,\n ]\n .filter(Boolean)\n .join(' ')\n\n function handleClick(event) {\n setShowTooltip(false)\n if (type !== 'submit' && onClick) {\n event.preventDefault()\n }\n if (onClick) {\n onClick(event)\n }\n }\n\n const styleClasses = [\n buttonStyle && `${baseClass}--style-${buttonStyle}`,\n disabled && `${baseClass}--disabled`,\n round && `${baseClass}--round`,\n SubMenuPopupContent ? `${baseClass}--withPopup` : `${baseClass}--withoutPopup`,\n ]\n .filter(Boolean)\n .join(' ')\n\n const buttonProps = {\n id,\n type,\n 'aria-disabled': disabled,\n 'aria-label': ariaLabel,\n className: !SubMenuPopupContent ? [classes, styleClasses].join(' ') : classes,\n disabled,\n onClick: !disabled ? handleClick : undefined,\n onMouseDown: !disabled ? onMouseDown : undefined,\n onPointerEnter: tooltip ? () => setShowTooltip(true) : undefined,\n onPointerLeave: tooltip ? () => setShowTooltip(false) : undefined,\n rel: newTab ? 'noopener noreferrer' : undefined,\n target: newTab ? '_blank' : undefined,\n title: ariaLabel,\n ...extraButtonProps,\n }\n\n let buttonElement\n\n switch (el) {\n case 'anchor':\n buttonElement = (\n <a\n {...buttonProps}\n href={!disabled ? url : undefined}\n ref={ref as React.RefObject<HTMLAnchorElement>}\n >\n <ButtonContents icon={icon} showTooltip={showTooltip} tooltip={tooltip}>\n {children}\n </ButtonContents>\n </a>\n )\n break\n\n case 'link':\n if (disabled) {\n buttonElement = (\n <div {...buttonProps}>\n <ButtonContents icon={icon} showTooltip={showTooltip} tooltip={tooltip}>\n {children}\n </ButtonContents>\n </div>\n )\n }\n\n buttonElement = (\n <Link {...buttonProps} href={to || url} prefetch={false}>\n <ButtonContents icon={icon} showTooltip={showTooltip} tooltip={tooltip}>\n {children}\n </ButtonContents>\n </Link>\n )\n\n break\n\n default:\n const Tag = el // eslint-disable-line no-case-declarations\n\n buttonElement = (\n <Tag ref={ref} {...buttonProps}>\n <ButtonContents icon={icon} showTooltip={showTooltip} tooltip={tooltip}>\n {children}\n </ButtonContents>\n </Tag>\n )\n break\n }\n if (SubMenuPopupContent) {\n return (\n <div className={styleClasses}>\n {buttonElement}\n <Popup\n button={<ChevronIcon />}\n buttonSize={size}\n className={disabled && !enableSubMenu ? `${baseClass}--popup-disabled` : ''}\n disabled={disabled && !enableSubMenu}\n horizontalAlign=\"right\"\n id={`${id}-popup`}\n noBackground\n render={({ close }) => SubMenuPopupContent({ close: () => close() })}\n size=\"large\"\n verticalAlign=\"bottom\"\n />\n </div>\n )\n }\n\n return buttonElement\n}\n"],"names":["React","Fragment","isValidElement","ChevronIcon","EditIcon","LinkIcon","PlusIcon","SwapIcon","XIcon","Link","Popup","Tooltip","icons","chevron","edit","link","plus","swap","x","baseClass","ButtonContents","children","icon","showTooltip","tooltip","BuiltInIcon","className","show","span","Button","props","id","type","ariaLabel","buttonStyle","disabled","el","enableSubMenu","extraButtonProps","iconPosition","iconStyle","margin","newTab","onClick","onMouseDown","ref","round","size","SubMenuPopupContent","to","url","setShowTooltip","useState","classes","filter","Boolean","join","handleClick","event","preventDefault","styleClasses","buttonProps","undefined","onPointerEnter","onPointerLeave","rel","target","title","buttonElement","a","href","div","prefetch","Tag","button","buttonSize","horizontalAlign","noBackground","render","close","verticalAlign"],"mappings":"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"}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
-
export { };
|
|
1
|
+
export { }; /**
|
|
2
|
+
* Setting to `true` will allow the submenu to be opened when the button is disabled
|
|
3
|
+
*/ /**
|
|
4
|
+
* @deprecated
|
|
5
|
+
* This prop is deprecated and will be removed in the next major version.
|
|
6
|
+
* Components now import their own `Link` directly from `next/link`.
|
|
7
|
+
*/ /**
|
|
8
|
+
* Enables form submission via an onClick handler. This is only needed if
|
|
9
|
+
* type="submit" does not trigger form submission, e.g. if the button DOM
|
|
10
|
+
* element is not a direct child of the form element.
|
|
11
|
+
*
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
2
14
|
|
|
3
15
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/Button/types.ts"],"sourcesContent":["import type { ElementType, MouseEvent } from 'react'\nimport type React from 'react'\n\ntype secondaryAction = {\n label: string\n onClick: (event: MouseEvent) => void\n}\n\nexport type Props = {\n 'aria-label'?: string\n buttonId?: string\n buttonStyle?:\n | 'error'\n | 'icon-label'\n | 'none'\n | 'pill'\n | 'primary'\n | 'secondary'\n | 'subtle'\n | 'tab'\n | 'transparent'\n children?: React.ReactNode\n className?: string\n disabled?: boolean\n el?: 'anchor' | 'link' | ElementType\n /**\n * Setting to `true` will allow the submenu to be opened when the button is disabled\n */\n enableSubMenu?: boolean\n extraButtonProps?: Record<string, any>\n icon?: ['chevron' | 'edit' | 'plus' | 'x'] | React.ReactNode\n iconPosition?: 'left' | 'right'\n iconStyle?: 'none' | 'with-border' | 'without-border'\n id?: string\n /**\n * @deprecated\n * This prop is deprecated and will be removed in the next major version.\n * Components now import their own `Link` directly from `next/link`.\n */\n Link?: React.ElementType\n margin?: boolean\n newTab?: boolean\n onClick?: (event: MouseEvent) => void\n onMouseDown?: (event: MouseEvent) => void\n /**\n * Enables form submission via an onClick handler. This is only needed if\n * type=\"submit\" does not trigger form submission, e.g. if the button DOM\n * element is not a direct child of the form element.\n *\n * @default false\n */\n programmaticSubmit?: boolean\n ref?: React.RefObject<HTMLAnchorElement | HTMLButtonElement | null>\n round?: boolean\n secondaryActions?: secondaryAction | secondaryAction[]\n size?: 'large' | 'medium' | 'small' | 'xsmall'\n SubMenuPopupContent?: (props: { close: () => void }) => React.ReactNode\n to?: string\n tooltip?: string\n type?: 'button' | 'submit'\n url?: string\n}\n"],"names":[],"mappings":"AAQA,WAqDC"}
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/Button/types.ts"],"sourcesContent":["import type { ElementType, MouseEvent } from 'react'\nimport type React from 'react'\n\ntype secondaryAction = {\n label: string\n onClick: (event: MouseEvent) => void\n}\n\nexport type Props = {\n 'aria-label'?: string\n buttonId?: string\n buttonStyle?:\n | 'error'\n | 'icon-label'\n | 'none'\n | 'pill'\n | 'primary'\n | 'secondary'\n | 'subtle'\n | 'tab'\n | 'transparent'\n children?: React.ReactNode\n className?: string\n disabled?: boolean\n el?: 'anchor' | 'link' | ElementType\n /**\n * Setting to `true` will allow the submenu to be opened when the button is disabled\n */\n enableSubMenu?: boolean\n extraButtonProps?: Record<string, any>\n icon?: ['chevron' | 'edit' | 'plus' | 'x'] | React.ReactNode\n iconPosition?: 'left' | 'right'\n iconStyle?: 'none' | 'with-border' | 'without-border'\n id?: string\n /**\n * @deprecated\n * This prop is deprecated and will be removed in the next major version.\n * Components now import their own `Link` directly from `next/link`.\n */\n Link?: React.ElementType\n margin?: boolean\n newTab?: boolean\n onClick?: (event: MouseEvent) => void\n onMouseDown?: (event: MouseEvent) => void\n /**\n * Enables form submission via an onClick handler. This is only needed if\n * type=\"submit\" does not trigger form submission, e.g. if the button DOM\n * element is not a direct child of the form element.\n *\n * @default false\n */\n programmaticSubmit?: boolean\n ref?: React.RefObject<HTMLAnchorElement | HTMLButtonElement | null>\n round?: boolean\n secondaryActions?: secondaryAction | secondaryAction[]\n size?: 'large' | 'medium' | 'small' | 'xsmall'\n SubMenuPopupContent?: (props: { close: () => void }) => React.ReactNode\n to?: string\n tooltip?: string\n type?: 'button' | 'submit'\n url?: string\n}\n"],"names":[],"mappings":"AAQA,WAqDC,CApCC;;GAEC,IAOD;;;;GAIC,IAMD;;;;;;GAMC"}
|
|
@@ -3,7 +3,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { Button } from '../Button/index.js';
|
|
5
5
|
import './index.scss';
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* @deprecated
|
|
8
|
+
* This prop is deprecated and will be removed in the next major version.
|
|
9
|
+
* Components now import their own `Link` directly from `next/link`.
|
|
10
|
+
*/ const baseClass = 'card';
|
|
7
11
|
export const Card = (props)=>{
|
|
8
12
|
const { id, actions, buttonAriaLabel, href, onClick, title, titleAs } = props;
|
|
9
13
|
const classes = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/Card/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport { Button } from '../Button/index.js'\nimport './index.scss'\n\nexport type Props = {\n actions?: React.ReactNode\n buttonAriaLabel?: string\n href?: string\n id?: string\n /**\n * @deprecated\n * This prop is deprecated and will be removed in the next major version.\n * Components now import their own `Link` directly from `next/link`.\n */\n Link?: React.ElementType\n onClick?: () => void\n title: string\n titleAs?: React.ElementType\n}\n\nconst baseClass = 'card'\n\nexport const Card: React.FC<Props> = (props) => {\n const { id, actions, buttonAriaLabel, href, onClick, title, titleAs } = props\n\n const classes = [baseClass, id, (onClick || href) && `${baseClass}--has-onclick`]\n .filter(Boolean)\n .join(' ')\n\n const Tag = titleAs ?? 'div'\n\n return (\n <div className={classes} id={id}>\n <Tag className={`${baseClass}__title`}>{title}</Tag>\n {actions && <div className={`${baseClass}__actions`}>{actions}</div>}\n {(onClick || href) && (\n <Button\n aria-label={buttonAriaLabel}\n buttonStyle=\"none\"\n className={`${baseClass}__click`}\n el=\"link\"\n onClick={onClick}\n to={href}\n />\n )}\n </div>\n )\n}\n"],"names":["React","Button","baseClass","Card","props","id","actions","buttonAriaLabel","href","onClick","title","titleAs","classes","filter","Boolean","join","Tag","div","className","aria-label","buttonStyle","el","to"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,SAASC,MAAM,QAAQ,qBAAoB;AAC3C,OAAO,eAAc;
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/Card/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport { Button } from '../Button/index.js'\nimport './index.scss'\n\nexport type Props = {\n actions?: React.ReactNode\n buttonAriaLabel?: string\n href?: string\n id?: string\n /**\n * @deprecated\n * This prop is deprecated and will be removed in the next major version.\n * Components now import their own `Link` directly from `next/link`.\n */\n Link?: React.ElementType\n onClick?: () => void\n title: string\n titleAs?: React.ElementType\n}\n\nconst baseClass = 'card'\n\nexport const Card: React.FC<Props> = (props) => {\n const { id, actions, buttonAriaLabel, href, onClick, title, titleAs } = props\n\n const classes = [baseClass, id, (onClick || href) && `${baseClass}--has-onclick`]\n .filter(Boolean)\n .join(' ')\n\n const Tag = titleAs ?? 'div'\n\n return (\n <div className={classes} id={id}>\n <Tag className={`${baseClass}__title`}>{title}</Tag>\n {actions && <div className={`${baseClass}__actions`}>{actions}</div>}\n {(onClick || href) && (\n <Button\n aria-label={buttonAriaLabel}\n buttonStyle=\"none\"\n className={`${baseClass}__click`}\n el=\"link\"\n onClick={onClick}\n to={href}\n />\n )}\n </div>\n )\n}\n"],"names":["React","Button","baseClass","Card","props","id","actions","buttonAriaLabel","href","onClick","title","titleAs","classes","filter","Boolean","join","Tag","div","className","aria-label","buttonStyle","el","to"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,SAASC,MAAM,QAAQ,qBAAoB;AAC3C,OAAO,eAAc;AAOnB;;;;GAIC,GAOH,MAAMC,YAAY;AAElB,OAAO,MAAMC,OAAwB,CAACC;IACpC,MAAM,EAAEC,EAAE,EAAEC,OAAO,EAAEC,eAAe,EAAEC,IAAI,EAAEC,OAAO,EAAEC,KAAK,EAAEC,OAAO,EAAE,GAAGP;IAExE,MAAMQ,UAAU;QAACV;QAAWG;QAAKI,CAAAA,WAAWD,IAAG,KAAM,GAAGN,UAAU,aAAa,CAAC;KAAC,CAC9EW,MAAM,CAACC,SACPC,IAAI,CAAC;IAER,MAAMC,MAAML,WAAW;IAEvB,qBACE,MAACM;QAAIC,WAAWN;QAASP,IAAIA;;0BAC3B,KAACW;gBAAIE,WAAW,GAAGhB,UAAU,OAAO,CAAC;0BAAGQ;;YACvCJ,yBAAW,KAACW;gBAAIC,WAAW,GAAGhB,UAAU,SAAS,CAAC;0BAAGI;;YACpDG,CAAAA,WAAWD,IAAG,mBACd,KAACP;gBACCkB,cAAYZ;gBACZa,aAAY;gBACZF,WAAW,GAAGhB,UAAU,OAAO,CAAC;gBAChCmB,IAAG;gBACHZ,SAASA;gBACTa,IAAId;;;;AAKd,EAAC"}
|
|
@@ -10,8 +10,8 @@ const Editor = 'default' in EditorImport ? EditorImport.default : EditorImport;
|
|
|
10
10
|
const baseClass = 'code-editor';
|
|
11
11
|
const CodeEditor = (props)=>{
|
|
12
12
|
const { className, maxHeight, minHeight, options, readOnly, recalculatedHeightAt, value, ...rest } = props;
|
|
13
|
-
const MIN_HEIGHT = minHeight ?? 56
|
|
14
|
-
|
|
13
|
+
const MIN_HEIGHT = minHeight ?? 56;
|
|
14
|
+
// equivalent to 3 lines
|
|
15
15
|
const prevCalculatedHeightAt = React.useRef(recalculatedHeightAt);
|
|
16
16
|
// Extract per-model settings to avoid global conflicts
|
|
17
17
|
const { insertSpaces, tabSize, trimAutoWhitespace, ...globalEditorOptions } = options || {};
|