@payloadcms/ui 3.80.0-internal.60d6f94 → 3.80.0-internal.bd498b0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/BulkUpload/FormsManager/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,IAAI,EACJ,aAAa,EACb,SAAS,EAET,4BAA4B,EAC5B,WAAW,EACZ,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAgBzC,KAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;IAC1C,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,QAAQ,CAAC,cAAc,EAAE,CACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,gBAAgB,CAAC,EAAE,MAAM,IAAI,KAC1B,OAAO,CAAC,IAAI,CAAC,CAAA;IAClB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,4BAA4B,CAAA;IACtD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,CAAA;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAA;IACtC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IACtC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,QAAQ,CAAC,sBAAsB,EAAE,CAAC,EAChC,UAAU,EACV,KAAK,GACN,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;KACd,KAAK,IAAI,CAAA;IACV,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;CACxD,CAAA;AA6BD,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAChC,CAAC,CAAA;AAEF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CACnC,CAAA;AAED,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBAyjBnE;AAED,wBAAgB,eAAe,wBAE9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/BulkUpload/FormsManager/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,IAAI,EACJ,aAAa,EACb,SAAS,EAET,4BAA4B,EAC5B,WAAW,EACZ,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAgBzC,KAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;IAC1C,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,QAAQ,CAAC,cAAc,EAAE,CACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,gBAAgB,CAAC,EAAE,MAAM,IAAI,KAC1B,OAAO,CAAC,IAAI,CAAC,CAAA;IAClB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,4BAA4B,CAAA;IACtD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,CAAA;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAA;IACtC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IACtC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,QAAQ,CAAC,sBAAsB,EAAE,CAAC,EAChC,UAAU,EACV,KAAK,GACN,EAAE;QACD,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;KACd,KAAK,IAAI,CAAA;IACV,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;CACxD,CAAA;AA6BD,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAChC,CAAC,CAAA;AAEF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CACnC,CAAA;AAED,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,qBA0kBnE;AAED,wBAAgB,eAAe,wBAE9B"}
@@ -329,7 +329,21 @@ export function FormsManagerProvider({
329
329
  const missingFilename = fileValue && typeof fileValue === 'object' && 'name' in fileValue && (!fileValue.name || fileValue.name === '');
330
330
  if (missingFile || exceedsLimit || missingFilename) {
331
331
  currentForms[i_0].formState.file.valid = false;
332
- // neeed to get the field state to extract count since field errors
332
+ // File/Blob objects cannot be serialized via the RSC flight protocol,
333
+ // so replace with a plain object before calling the server function.
334
+ const originalFileValue = currentForms[i_0].formState.file?.value;
335
+ const formStateForServer = {
336
+ ...currentForms[i_0].formState
337
+ };
338
+ if (originalFileValue instanceof File) {
339
+ formStateForServer.file = {
340
+ ...formStateForServer.file,
341
+ value: {
342
+ name: originalFileValue.name
343
+ }
344
+ };
345
+ }
346
+ // Need to get the field state to extract count since field errors
333
347
  // are not returned when file is missing or exceeds limit
334
348
  const {
335
349
  state: newState
@@ -337,15 +351,23 @@ export function FormsManagerProvider({
337
351
  collectionSlug,
338
352
  docPermissions,
339
353
  docPreferences: null,
340
- formState: currentForms[i_0].formState,
354
+ formState: formStateForServer,
341
355
  operation: 'update',
342
356
  schemaPath: collectionSlug
343
357
  });
344
- currentForms[i_0] = {
345
- errorCount: Object.values(newState).reduce((acc, value) => value?.valid === false ? acc + 1 : acc, 0),
346
- formID: currentForms[i_0].formID,
347
- formState: newState
348
- };
358
+ if (newState) {
359
+ if (originalFileValue instanceof File && newState.file) {
360
+ newState.file = {
361
+ ...newState.file,
362
+ value: originalFileValue
363
+ };
364
+ }
365
+ currentForms[i_0] = {
366
+ errorCount: Object.values(newState).reduce((acc, value) => value?.valid === false ? acc + 1 : acc, 0),
367
+ formID: currentForms[i_0].formID,
368
+ formState: newState
369
+ };
370
+ }
349
371
  toast.error(nonFieldErrors[0]?.message);
350
372
  } else {
351
373
  currentForms[i_0] = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useModal","formatAdminURL","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","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","baseAPIPath","apiRoute","path","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","activeFormID","newDocs","fileValue","value","total","actionURLWithParams","addQueryPrefix","req","status","doc","push","fieldErrors","nonFieldErrors","errors","reduce","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","message","isArray","data","forEach","dataError","missingFile","exceedsLimit","missingFilename","name","valid","newState","Object","values","acc","error","_","remainingForms","successCount","Math","max","success","updatedFields","afterStateUpdate","entries","newFormErrorCount","resetUploadEdits","useEffect","_jsxs","_jsx","animationDuration","overlayType","show","useFormsManager","use"],"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 { formatAdminURL } from 'payload/shared'\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 } = 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 baseAPIPath = formatAdminURL({\n apiRoute: api,\n path: '',\n })\n\n const actionURL = `${baseAPIPath}/${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(`${baseAPIPath}${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 `${baseAPIPath}${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 }, [baseAPIPath, code, collectionSlug, i18n.language])\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\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 activeFormID = currentForms[activeIndex]?.formID\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 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 const missingFile = !fileValue && req.status === 400\n const exceedsLimit = fileValue && req.status === 413\n const missingFilename =\n fileValue &&\n typeof fileValue === 'object' &&\n 'name' in fileValue &&\n (!fileValue.name || fileValue.name === '')\n\n if (missingFile || exceedsLimit || missingFilename) {\n currentForms[i].formState.file.valid = false\n\n // neeed to get the field state to extract count since field errors\n // are not returned when file is missing or exceeds limit\n const { state: newState } = await getFormState({\n collectionSlug,\n docPermissions,\n docPreferences: null,\n formState: currentForms[i].formState,\n operation: 'update',\n schemaPath: collectionSlug,\n })\n\n currentForms[i] = {\n errorCount: Object.values(newState).reduce(\n (acc, value) => (value?.valid === false ? acc + 1 : acc),\n 0,\n ),\n formID: currentForms[i].formID,\n formState: newState,\n }\n\n toast.error(nonFieldErrors[0]?.message)\n } else {\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 } 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: remainingForms.reduce((acc, { formID }, i) => {\n if (formID === activeFormID) {\n return i\n }\n return acc\n }, 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 getFormState,\n docPermissions,\n setSuccessfullyUploaded,\n onSuccess,\n closeModal,\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"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["useModal","formatAdminURL","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","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","baseAPIPath","apiRoute","path","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","activeFormID","newDocs","fileValue","value","total","actionURLWithParams","addQueryPrefix","req","status","doc","push","fieldErrors","nonFieldErrors","errors","reduce","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","message","isArray","data","forEach","dataError","missingFile","exceedsLimit","missingFilename","name","valid","originalFileValue","formStateForServer","File","newState","Object","values","acc","error","_","remainingForms","successCount","Math","max","success","updatedFields","afterStateUpdate","entries","newFormErrorCount","resetUploadEdits","useEffect","_jsxs","_jsx","animationDuration","overlayType","show","useFormsManager","use"],"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 { formatAdminURL } from 'payload/shared'\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 } = 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 baseAPIPath = formatAdminURL({\n apiRoute: api,\n path: '',\n })\n\n const actionURL = `${baseAPIPath}/${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(`${baseAPIPath}${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 `${baseAPIPath}${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 }, [baseAPIPath, code, collectionSlug, i18n.language])\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\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 activeFormID = currentForms[activeIndex]?.formID\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 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 const missingFile = !fileValue && req.status === 400\n const exceedsLimit = fileValue && req.status === 413\n const missingFilename =\n fileValue &&\n typeof fileValue === 'object' &&\n 'name' in fileValue &&\n (!fileValue.name || fileValue.name === '')\n\n if (missingFile || exceedsLimit || missingFilename) {\n currentForms[i].formState.file.valid = false\n\n // File/Blob objects cannot be serialized via the RSC flight protocol,\n // so replace with a plain object before calling the server function.\n const originalFileValue = currentForms[i].formState.file?.value\n const formStateForServer = { ...currentForms[i].formState }\n if (originalFileValue instanceof File) {\n formStateForServer.file = {\n ...formStateForServer.file,\n value: { name: originalFileValue.name },\n }\n }\n\n // Need to get the field state to extract count since field errors\n // are not returned when file is missing or exceeds limit\n const { state: newState } = await getFormState({\n collectionSlug,\n docPermissions,\n docPreferences: null,\n formState: formStateForServer,\n operation: 'update',\n schemaPath: collectionSlug,\n })\n\n if (newState) {\n if (originalFileValue instanceof File && newState.file) {\n newState.file = { ...newState.file, value: originalFileValue }\n }\n\n currentForms[i] = {\n errorCount: Object.values(newState).reduce(\n (acc, value) => (value?.valid === false ? acc + 1 : acc),\n 0,\n ),\n formID: currentForms[i].formID,\n formState: newState,\n }\n }\n\n toast.error(nonFieldErrors[0]?.message)\n } else {\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 } 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: remainingForms.reduce((acc, { formID }, i) => {\n if (formID === activeFormID) {\n return i\n }\n return acc\n }, 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 getFormState,\n docPermissions,\n setSuccessfullyUploaded,\n onSuccess,\n closeModal,\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"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"mergeFormStateFromClipboard.d.ts","sourceRoot":"","sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIpD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,8BAyBA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,iBAAiB,EAAE,aAAa,EAChC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,aAwIA"}
1
+ {"version":3,"file":"mergeFormStateFromClipboard.d.ts","sourceRoot":"","sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAIpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIpD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,8BAyBA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,iBAAiB,EAAE,aAAa,EAChC,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,aA0IA"}
@@ -86,8 +86,10 @@ export function mergeFormStateFromClipboard({
86
86
  // Map to track old IDs to new IDs for regenerating nested IDs
87
87
  const idReplacements = new Map();
88
88
  for (const clipboardPath in dataFromClipboard) {
89
- // Pasting a row id, skip overwriting
90
- if (!pasteIntoField && clipboardPath.endsWith('.id') || !clipboardPath.startsWith(pathToReplace)) {
89
+ // When pasting into a specific row, skip only the direct row ID to avoid overwriting
90
+ // the target row's identity. Nested IDs (array item IDs within the block) should
91
+ // still be processed so they get regenerated below, preventing server-side duplication.
92
+ if (!pasteIntoField && clipboardPath === `${pathToReplace}.id` || !clipboardPath.startsWith(pathToReplace)) {
91
93
  continue;
92
94
  }
93
95
  const newPath = clipboardPath.replace(pathToReplace, targetSegment);
@@ -1 +1 @@
1
- {"version":3,"file":"mergeFormStateFromClipboard.js","names":["ObjectIdImport","ObjectId","default","reduceFormStateByPath","formState","path","rowIndex","filteredState","prefix","key","startsWith","customComponents","_","validate","__","field","Array","isArray","rows","map","row","serializableRow","mergeFormStateFromClipboard","dataFromClipboard","clipboardData","type","typeFromClipboard","data","pathFromClipboard","rowIndexFromClipboard","copyFromField","pasteIntoField","fromRowToField","pathToReplace","targetSegment","lastRenderedPath","rowIDFromClipboard","value","hasRows","length","id","isLoading","initialValue","disableFormData","fieldPath","idReplacements","Map","clipboardPath","endsWith","newPath","replace","undefined","oldID","isValid","newID","toHexString","set","relativePath","segments","split","parseInt","parentFieldPath","slice","join","fullParentPath","parentRows","isNaN","targetParts","lastPart","rowIndexFromTarget"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"sourcesContent":["import type { FieldState, FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\n\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nexport function reduceFormStateByPath({\n formState,\n path,\n rowIndex,\n}: {\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const filteredState: Record<string, FieldState> = {}\n const prefix = typeof rowIndex !== 'number' ? path : `${path}.${rowIndex}`\n\n for (const key in formState) {\n if (!key.startsWith(prefix)) {\n continue\n }\n\n const { customComponents: _, validate: __, ...field } = formState[key]\n\n if (Array.isArray(field.rows)) {\n field.rows = field.rows.map((row) => {\n if (!row || typeof row !== 'object') {\n return row\n }\n const { customComponents: _, ...serializableRow } = row\n return serializableRow\n })\n }\n\n filteredState[key] = field\n }\n\n return filteredState\n}\n\nexport function mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path,\n rowIndex,\n}: {\n dataFromClipboard: ClipboardPasteData\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const {\n type: typeFromClipboard,\n data: dataFromClipboard,\n path: pathFromClipboard,\n rowIndex: rowIndexFromClipboard,\n } = clipboardData\n\n const copyFromField = typeof rowIndexFromClipboard !== 'number'\n const pasteIntoField = typeof rowIndex !== 'number'\n const fromRowToField = !copyFromField && pasteIntoField\n const isArray = typeFromClipboard === 'array'\n\n let pathToReplace: string\n if (copyFromField && pasteIntoField) {\n pathToReplace = pathFromClipboard\n } else if (copyFromField) {\n pathToReplace = `${pathFromClipboard}.${rowIndex}`\n } else {\n pathToReplace = `${pathFromClipboard}.${rowIndexFromClipboard}`\n }\n\n let targetSegment: string\n if (!pasteIntoField) {\n targetSegment = `${path}.${rowIndex}`\n } else if (fromRowToField) {\n targetSegment = `${path}.0`\n } else {\n targetSegment = path\n }\n\n if (fromRowToField) {\n const lastRenderedPath = `${path}.0`\n const rowIDFromClipboard = dataFromClipboard[`${pathToReplace}.id`]?.value as string\n const hasRows = formState[path].rows?.length\n\n formState[path].rows = [\n {\n ...(hasRows && isArray ? formState[path].rows[0] : {}),\n id: rowIDFromClipboard,\n isLoading: false,\n lastRenderedPath,\n },\n ]\n formState[path].value = 1\n formState[path].initialValue = 1\n formState[path].disableFormData = true\n\n for (const fieldPath in formState) {\n if (\n fieldPath !== path &&\n !fieldPath.startsWith(lastRenderedPath) &&\n fieldPath.startsWith(path)\n ) {\n delete formState[fieldPath]\n }\n }\n }\n\n // Map to track old IDs to new IDs for regenerating nested IDs\n const idReplacements: Map<string, string> = new Map()\n\n for (const clipboardPath in dataFromClipboard) {\n // Pasting a row id, skip overwriting\n if (\n (!pasteIntoField && clipboardPath.endsWith('.id')) ||\n !clipboardPath.startsWith(pathToReplace)\n ) {\n continue\n }\n\n const newPath = clipboardPath.replace(pathToReplace, targetSegment)\n\n const customComponents = isArray ? formState[newPath]?.customComponents : undefined\n const validate = isArray ? formState[newPath]?.validate : undefined\n\n // If this is an ID field, generate a new ID to prevent duplicates\n if (clipboardPath.endsWith('.id') && dataFromClipboard[clipboardPath]?.value) {\n const oldID = dataFromClipboard[clipboardPath].value as string\n if (typeof oldID === 'string' && ObjectId.isValid(oldID)) {\n const newID = new ObjectId().toHexString()\n idReplacements.set(clipboardPath, newID)\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n initialValue: newID,\n value: newID,\n }\n continue\n }\n }\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n }\n }\n\n // Update parent field rows with new IDs\n for (const [clipboardPath, newID] of idReplacements) {\n const relativePath = clipboardPath.replace(`${pathToReplace}.`, '')\n const segments = relativePath.split('.')\n\n if (segments.length >= 2) {\n const rowIndex = parseInt(segments[segments.length - 2], 10)\n const parentFieldPath = segments.slice(0, segments.length - 2).join('.')\n const fullParentPath = parentFieldPath ? `${targetSegment}.${parentFieldPath}` : targetSegment\n\n if (formState[fullParentPath] && Array.isArray(formState[fullParentPath].rows)) {\n const parentRows = formState[fullParentPath].rows\n if (!isNaN(rowIndex) && parentRows[rowIndex]) {\n parentRows[rowIndex].id = newID\n }\n }\n } else if (segments.length === 1 && segments[0] === 'id') {\n // Top-level block ID - extract field path and row index from targetSegment\n const targetParts = targetSegment.split('.')\n const lastPart = targetParts[targetParts.length - 1]\n const rowIndexFromTarget = !isNaN(parseInt(lastPart, 10)) ? parseInt(lastPart, 10) : 0\n const fieldPath = !isNaN(parseInt(lastPart, 10))\n ? targetParts.slice(0, -1).join('.')\n : targetSegment\n\n if (formState[fieldPath] && Array.isArray(formState[fieldPath].rows)) {\n const rows = formState[fieldPath].rows\n if (rows[rowIndexFromTarget]) {\n rows[rowIndexFromTarget].id = newID\n }\n }\n }\n }\n\n return formState\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mergeFormStateFromClipboard.js","names":["ObjectIdImport","ObjectId","default","reduceFormStateByPath","formState","path","rowIndex","filteredState","prefix","key","startsWith","customComponents","_","validate","__","field","Array","isArray","rows","map","row","serializableRow","mergeFormStateFromClipboard","dataFromClipboard","clipboardData","type","typeFromClipboard","data","pathFromClipboard","rowIndexFromClipboard","copyFromField","pasteIntoField","fromRowToField","pathToReplace","targetSegment","lastRenderedPath","rowIDFromClipboard","value","hasRows","length","id","isLoading","initialValue","disableFormData","fieldPath","idReplacements","Map","clipboardPath","newPath","replace","undefined","endsWith","oldID","isValid","newID","toHexString","set","relativePath","segments","split","parseInt","parentFieldPath","slice","join","fullParentPath","parentRows","isNaN","targetParts","lastPart","rowIndexFromTarget"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.ts"],"sourcesContent":["import type { FieldState, FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\n\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nexport function reduceFormStateByPath({\n formState,\n path,\n rowIndex,\n}: {\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const filteredState: Record<string, FieldState> = {}\n const prefix = typeof rowIndex !== 'number' ? path : `${path}.${rowIndex}`\n\n for (const key in formState) {\n if (!key.startsWith(prefix)) {\n continue\n }\n\n const { customComponents: _, validate: __, ...field } = formState[key]\n\n if (Array.isArray(field.rows)) {\n field.rows = field.rows.map((row) => {\n if (!row || typeof row !== 'object') {\n return row\n }\n const { customComponents: _, ...serializableRow } = row\n return serializableRow\n })\n }\n\n filteredState[key] = field\n }\n\n return filteredState\n}\n\nexport function mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path,\n rowIndex,\n}: {\n dataFromClipboard: ClipboardPasteData\n formState: FormState\n path: string\n rowIndex?: number\n}) {\n const {\n type: typeFromClipboard,\n data: dataFromClipboard,\n path: pathFromClipboard,\n rowIndex: rowIndexFromClipboard,\n } = clipboardData\n\n const copyFromField = typeof rowIndexFromClipboard !== 'number'\n const pasteIntoField = typeof rowIndex !== 'number'\n const fromRowToField = !copyFromField && pasteIntoField\n const isArray = typeFromClipboard === 'array'\n\n let pathToReplace: string\n if (copyFromField && pasteIntoField) {\n pathToReplace = pathFromClipboard\n } else if (copyFromField) {\n pathToReplace = `${pathFromClipboard}.${rowIndex}`\n } else {\n pathToReplace = `${pathFromClipboard}.${rowIndexFromClipboard}`\n }\n\n let targetSegment: string\n if (!pasteIntoField) {\n targetSegment = `${path}.${rowIndex}`\n } else if (fromRowToField) {\n targetSegment = `${path}.0`\n } else {\n targetSegment = path\n }\n\n if (fromRowToField) {\n const lastRenderedPath = `${path}.0`\n const rowIDFromClipboard = dataFromClipboard[`${pathToReplace}.id`]?.value as string\n const hasRows = formState[path].rows?.length\n\n formState[path].rows = [\n {\n ...(hasRows && isArray ? formState[path].rows[0] : {}),\n id: rowIDFromClipboard,\n isLoading: false,\n lastRenderedPath,\n },\n ]\n formState[path].value = 1\n formState[path].initialValue = 1\n formState[path].disableFormData = true\n\n for (const fieldPath in formState) {\n if (\n fieldPath !== path &&\n !fieldPath.startsWith(lastRenderedPath) &&\n fieldPath.startsWith(path)\n ) {\n delete formState[fieldPath]\n }\n }\n }\n\n // Map to track old IDs to new IDs for regenerating nested IDs\n const idReplacements: Map<string, string> = new Map()\n\n for (const clipboardPath in dataFromClipboard) {\n // When pasting into a specific row, skip only the direct row ID to avoid overwriting\n // the target row's identity. Nested IDs (array item IDs within the block) should\n // still be processed so they get regenerated below, preventing server-side duplication.\n if (\n (!pasteIntoField && clipboardPath === `${pathToReplace}.id`) ||\n !clipboardPath.startsWith(pathToReplace)\n ) {\n continue\n }\n\n const newPath = clipboardPath.replace(pathToReplace, targetSegment)\n\n const customComponents = isArray ? formState[newPath]?.customComponents : undefined\n const validate = isArray ? formState[newPath]?.validate : undefined\n\n // If this is an ID field, generate a new ID to prevent duplicates\n if (clipboardPath.endsWith('.id') && dataFromClipboard[clipboardPath]?.value) {\n const oldID = dataFromClipboard[clipboardPath].value as string\n if (typeof oldID === 'string' && ObjectId.isValid(oldID)) {\n const newID = new ObjectId().toHexString()\n idReplacements.set(clipboardPath, newID)\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n initialValue: newID,\n value: newID,\n }\n continue\n }\n }\n\n formState[newPath] = {\n customComponents,\n validate,\n ...dataFromClipboard[clipboardPath],\n }\n }\n\n // Update parent field rows with new IDs\n for (const [clipboardPath, newID] of idReplacements) {\n const relativePath = clipboardPath.replace(`${pathToReplace}.`, '')\n const segments = relativePath.split('.')\n\n if (segments.length >= 2) {\n const rowIndex = parseInt(segments[segments.length - 2], 10)\n const parentFieldPath = segments.slice(0, segments.length - 2).join('.')\n const fullParentPath = parentFieldPath ? `${targetSegment}.${parentFieldPath}` : targetSegment\n\n if (formState[fullParentPath] && Array.isArray(formState[fullParentPath].rows)) {\n const parentRows = formState[fullParentPath].rows\n if (!isNaN(rowIndex) && parentRows[rowIndex]) {\n parentRows[rowIndex].id = newID\n }\n }\n } else if (segments.length === 1 && segments[0] === 'id') {\n // Top-level block ID - extract field path and row index from targetSegment\n const targetParts = targetSegment.split('.')\n const lastPart = targetParts[targetParts.length - 1]\n const rowIndexFromTarget = !isNaN(parseInt(lastPart, 10)) ? parseInt(lastPart, 10) : 0\n const fieldPath = !isNaN(parseInt(lastPart, 10))\n ? targetParts.slice(0, -1).join('.')\n : targetSegment\n\n if (formState[fieldPath] && Array.isArray(formState[fieldPath].rows)) {\n const rows = formState[fieldPath].rows\n if (rows[rowIndexFromTarget]) {\n rows[rowIndexFromTarget].id = newID\n }\n }\n }\n }\n\n return formState\n}\n"],"mappings":"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","ignoreList":[]}
@@ -198,6 +198,163 @@ describe('mergeFormStateFromClipboard', () => {
198
198
  expect(result['duplicate.0.number'].value).toEqual(342);
199
199
  });
200
200
  });
201
+ describe('block row paste with nested array', () => {
202
+ it('should regenerate nested array item IDs when pasting a block row', () => {
203
+ const copiedBlockID = new ObjectId().toHexString();
204
+ const copiedArrayItemID1 = new ObjectId().toHexString();
205
+ const copiedArrayItemID2 = new ObjectId().toHexString();
206
+ const copiedArrayItemID3 = new ObjectId().toHexString();
207
+ const targetBlockID = new ObjectId().toHexString();
208
+ // Target form state: block at index 1 with empty buttons array
209
+ const formState = {
210
+ ctas: {
211
+ valid: true,
212
+ value: 2,
213
+ initialValue: 2,
214
+ rows: [{
215
+ id: copiedBlockID,
216
+ blockType: 'callToAction',
217
+ isLoading: false
218
+ }, {
219
+ id: targetBlockID,
220
+ blockType: 'callToAction',
221
+ isLoading: false
222
+ }]
223
+ },
224
+ 'ctas.0': {
225
+ value: 'callToAction',
226
+ valid: true
227
+ },
228
+ 'ctas.0.id': {
229
+ value: copiedBlockID,
230
+ valid: true
231
+ },
232
+ 'ctas.0.buttons': {
233
+ valid: true,
234
+ value: 3,
235
+ rows: [{
236
+ id: copiedArrayItemID1,
237
+ isLoading: false
238
+ }, {
239
+ id: copiedArrayItemID2,
240
+ isLoading: false
241
+ }, {
242
+ id: copiedArrayItemID3,
243
+ isLoading: false
244
+ }]
245
+ },
246
+ 'ctas.0.buttons.0.id': {
247
+ value: copiedArrayItemID1,
248
+ valid: true
249
+ },
250
+ 'ctas.0.buttons.1.id': {
251
+ value: copiedArrayItemID2,
252
+ valid: true
253
+ },
254
+ 'ctas.0.buttons.2.id': {
255
+ value: copiedArrayItemID3,
256
+ valid: true
257
+ },
258
+ 'ctas.1': {
259
+ value: 'callToAction',
260
+ valid: true
261
+ },
262
+ 'ctas.1.id': {
263
+ value: targetBlockID,
264
+ valid: true
265
+ },
266
+ 'ctas.1.buttons': {
267
+ valid: true,
268
+ value: 0,
269
+ rows: []
270
+ }
271
+ };
272
+ // Clipboard: block row 0 (source) with 3 buttons
273
+ const clipboardData = {
274
+ type: 'blocks',
275
+ path: 'ctas',
276
+ blocks: [],
277
+ rowIndex: 0,
278
+ data: {
279
+ 'ctas.0': {
280
+ value: 'callToAction',
281
+ valid: true
282
+ },
283
+ 'ctas.0.id': {
284
+ value: copiedBlockID,
285
+ valid: true
286
+ },
287
+ 'ctas.0.buttons': {
288
+ valid: true,
289
+ value: 3,
290
+ rows: [{
291
+ id: copiedArrayItemID1,
292
+ isLoading: false
293
+ }, {
294
+ id: copiedArrayItemID2,
295
+ isLoading: false
296
+ }, {
297
+ id: copiedArrayItemID3,
298
+ isLoading: false
299
+ }]
300
+ },
301
+ 'ctas.0.buttons.0.id': {
302
+ value: copiedArrayItemID1,
303
+ valid: true
304
+ },
305
+ 'ctas.0.buttons.0.label': {
306
+ value: 'Button 1',
307
+ valid: true
308
+ },
309
+ 'ctas.0.buttons.1.id': {
310
+ value: copiedArrayItemID2,
311
+ valid: true
312
+ },
313
+ 'ctas.0.buttons.1.label': {
314
+ value: 'Button 2',
315
+ valid: true
316
+ },
317
+ 'ctas.0.buttons.2.id': {
318
+ value: copiedArrayItemID3,
319
+ valid: true
320
+ },
321
+ 'ctas.0.buttons.2.label': {
322
+ value: 'Button 3',
323
+ valid: true
324
+ }
325
+ }
326
+ };
327
+ // Paste into block row 1 (target)
328
+ const result = mergeFormStateFromClipboard({
329
+ dataFromClipboard: clipboardData,
330
+ formState,
331
+ path: 'ctas',
332
+ rowIndex: 1
333
+ });
334
+ // Target block ID should NOT be overwritten
335
+ expect(result['ctas.1.id'].value).toEqual(targetBlockID);
336
+ // Nested array items should have NEW IDs (not the source IDs)
337
+ expect(result['ctas.1.buttons.0.id']).toBeDefined();
338
+ expect(result['ctas.1.buttons.0.id'].value).not.toEqual(copiedArrayItemID1);
339
+ expect(ObjectId.isValid(result['ctas.1.buttons.0.id'].value)).toBe(true);
340
+ expect(result['ctas.1.buttons.1.id']).toBeDefined();
341
+ expect(result['ctas.1.buttons.1.id'].value).not.toEqual(copiedArrayItemID2);
342
+ expect(result['ctas.1.buttons.2.id']).toBeDefined();
343
+ expect(result['ctas.1.buttons.2.id'].value).not.toEqual(copiedArrayItemID3);
344
+ // The rows metadata in ctas.1.buttons should have the new IDs
345
+ expect(result['ctas.1.buttons'].rows).toHaveLength(3);
346
+ expect(result['ctas.1.buttons'].rows[0].id).toEqual(result['ctas.1.buttons.0.id'].value);
347
+ expect(result['ctas.1.buttons'].rows[1].id).toEqual(result['ctas.1.buttons.1.id'].value);
348
+ expect(result['ctas.1.buttons'].rows[2].id).toEqual(result['ctas.1.buttons.2.id'].value);
349
+ // Field values should be copied
350
+ expect(result['ctas.1.buttons.0.label'].value).toEqual('Button 1');
351
+ expect(result['ctas.1.buttons.1.label'].value).toEqual('Button 2');
352
+ expect(result['ctas.1.buttons.2.label'].value).toEqual('Button 3');
353
+ // Source block should be untouched
354
+ expect(result['ctas.0.id'].value).toEqual(copiedBlockID);
355
+ expect(result['ctas.0.buttons'].rows).toHaveLength(3);
356
+ });
357
+ });
201
358
  describe('array ID regeneration', () => {
202
359
  it('should generate new IDs when pasting arrays to prevent duplicates', () => {
203
360
  const copiedArrayID = new ObjectId().toHexString();