@payloadcms/ui 4.0.0-beta.1 → 4.0.0-beta.3
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/css/preflight.css +21 -2
- package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.js +1 -34
- package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
- package/dist/elements/CloseModalOnRouteChange/index.d.ts.map +1 -1
- package/dist/elements/CloseModalOnRouteChange/index.js +27 -19
- package/dist/elements/CloseModalOnRouteChange/index.js.map +1 -1
- package/dist/elements/DatePicker/DatePicker.js +6 -2
- package/dist/elements/DatePicker/DatePicker.js.map +1 -1
- package/dist/elements/DatePicker/index.css +35 -25
- package/dist/elements/DocumentControls/index.js.map +1 -1
- package/dist/elements/DocumentFields/index.css +2 -2
- package/dist/elements/DocumentHeader/Tabs/tabs/index.js.map +1 -1
- package/dist/elements/FieldSelect/reduceFieldOptions.js.map +1 -1
- package/dist/elements/ListDrawer/Provider.d.ts.map +1 -1
- package/dist/elements/ListDrawer/Provider.js.map +1 -1
- package/dist/elements/LivePreview/Window/index.css +7 -1
- package/dist/elements/Nav/SidebarTabs/index.client.js +1 -1
- package/dist/elements/Nav/SidebarTabs/index.client.js.map +1 -1
- package/dist/elements/PublishButton/index.js.map +1 -1
- package/dist/elements/SchedulePublishButton/index.js.map +1 -1
- package/dist/elements/SegmentedControl/index.css +50 -7
- package/dist/elements/Table/DefaultCell/fields/File/index.d.ts.map +1 -1
- package/dist/elements/Table/DefaultCell/fields/File/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/index.d.ts.map +1 -1
- package/dist/elements/Table/DefaultCell/index.js +6 -1
- package/dist/elements/Table/DefaultCell/index.js.map +1 -1
- package/dist/elements/Table/index.js.map +1 -1
- package/dist/exports/client/{CodeEditor-S7MOGZSR.js → CodeEditor-I6PL55BF.js} +2 -2
- package/dist/exports/client/{DatePicker-POZJVQP4.js → DatePicker-RFCB5VGD.js} +2 -2
- package/dist/exports/client/{chunk-2AY67NFV.js → chunk-O2RR6XEH.js} +2 -2
- package/dist/exports/client/chunk-O2RR6XEH.js.map +7 -0
- package/dist/exports/client/{chunk-Z42OBP5U.js → chunk-R7M6BG75.js} +1 -1
- package/dist/exports/client/{chunk-Z42OBP5U.js.map → chunk-R7M6BG75.js.map} +1 -1
- package/dist/exports/client/index.js +15 -15
- package/dist/exports/client/index.js.map +4 -4
- package/dist/exports/shared/index.js +2 -2
- package/dist/exports/shared/index.js.map +3 -3
- package/dist/fields/Upload/Input.d.ts.map +1 -1
- package/dist/fields/Upload/Input.js +3 -1
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/forms/Form/reduceToSerializableFields.d.ts +9 -4
- package/dist/forms/Form/reduceToSerializableFields.d.ts.map +1 -1
- package/dist/forms/Form/reduceToSerializableFields.js +34 -7
- package/dist/forms/Form/reduceToSerializableFields.js.map +1 -1
- package/dist/icons/Table/index.css +5 -1
- package/dist/layouts/Root/index.d.ts +1 -1
- package/dist/layouts/Root/index.d.ts.map +1 -1
- package/dist/layouts/Root/index.js +4 -15
- package/dist/layouts/Root/index.js.map +1 -1
- package/dist/providers/RouteCache/index.d.ts.map +1 -1
- package/dist/providers/RouteCache/index.js +37 -25
- package/dist/providers/RouteCache/index.js.map +1 -1
- package/dist/providers/ServerFunctions/index.d.ts.map +1 -1
- package/dist/providers/ServerFunctions/index.js +34 -23
- package/dist/providers/ServerFunctions/index.js.map +1 -1
- package/dist/styles.css +22 -3
- package/dist/templates/Default/index.css +0 -1
- package/dist/utilities/buildClientFieldSchemaMap/traverseFields.d.ts.map +1 -1
- package/dist/utilities/buildClientFieldSchemaMap/traverseFields.js +32 -6
- package/dist/utilities/buildClientFieldSchemaMap/traverseFields.js.map +1 -1
- package/dist/utilities/getDisplayedFieldValue.d.ts +8 -2
- package/dist/utilities/getDisplayedFieldValue.d.ts.map +1 -1
- package/dist/utilities/getDisplayedFieldValue.js +11 -1
- package/dist/utilities/getDisplayedFieldValue.js.map +1 -1
- package/dist/utilities/getHasScheduledPublish.js.map +1 -1
- package/dist/utilities/handleLivePreview.js.map +1 -1
- package/dist/utilities/handleServerFunctions.d.ts +2 -10
- package/dist/utilities/handleServerFunctions.d.ts.map +1 -1
- package/dist/utilities/handleServerFunctions.js +3 -7
- package/dist/utilities/handleServerFunctions.js.map +1 -1
- package/dist/utilities/hasSavePermission.js.map +1 -1
- package/dist/utilities/schedulePublishHandler.js.map +1 -1
- package/dist/utilities/serverFunctionRegistry.d.ts +2 -7
- package/dist/utilities/serverFunctionRegistry.d.ts.map +1 -1
- package/dist/utilities/serverFunctionRegistry.js +2 -7
- package/dist/utilities/serverFunctionRegistry.js.map +1 -1
- package/dist/views/Edit/index.js.map +1 -1
- package/dist/widgets/RecentlyViewed/getDocuments.d.ts.map +1 -1
- package/dist/widgets/RecentlyViewed/getDocuments.js +4 -1
- package/dist/widgets/RecentlyViewed/getDocuments.js.map +1 -1
- package/dist/widgets/RecentlyViewed/index.client.d.ts.map +1 -1
- package/dist/widgets/RecentlyViewed/index.client.js +7 -2
- package/dist/widgets/RecentlyViewed/index.client.js.map +1 -1
- package/package.json +16 -16
- package/dist/exports/client/chunk-2AY67NFV.js.map +0 -7
- /package/dist/exports/client/{CodeEditor-S7MOGZSR.js.map → CodeEditor-I6PL55BF.js.map} +0 -0
- /package/dist/exports/client/{DatePicker-POZJVQP4.js.map → DatePicker-RFCB5VGD.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["formatAdminURL","hasAutosaveEnabled","React","useCallback","useEffect","useMemo","useRef","useState","toast","DocumentControls","DocumentDrawerHeader","useDocumentDrawerContext","DocumentFields","DocumentLocked","DocumentStaleData","DocumentTakeOver","FileManager","LeaveWithoutSaving","LivePreviewWindow","Form","useAuth","useConfig","useDocumentEvents","useDocumentInfo","useEditDepth","useLivePreviewContext","usePreviewURL","OperationProvider","useRouteCache","useRouter","useSearchParams","useRouteTransition","useServerFunctions","UploadControlsProvider","useUploadEdits","abortAndIgnore","handleAbortRef","handleBackToDashboard","handleGoBack","handleTakeOver","Auth","SetDocumentStepNav","SetDocumentTitle","baseClass","PENDING_SUCCESS_TOAST_KEY","DefaultEditView","BeforeDocumentControls","BeforeDocumentMeta","Description","EditMenuItems","LivePreview","CustomLivePreview","PreviewButton","PublishButton","SaveButton","SaveDraftButton","Status","UnpublishButton","Upload","CustomUpload","UploadControls","UploadFilePreview","id","action","AfterDocument","AfterFields","apiURL","BeforeFields","collectionSlug","currentEditor","data","disableActions","disableCreate","disableLeaveWithoutSaving","docPermissions","documentIsLocked","documentLockState","getDocPermissions","getDocPreferences","globalSlug","hasPublishPermission","hasSavePermission","incrementVersionCount","initialState","isEditing","isInitializing","isLocked","isTrashed","lastUpdateTime","redirectAfterCreate","redirectAfterDelete","redirectAfterDuplicate","redirectAfterRestore","setCurrentEditor","setData","setDocumentIsLocked","setLastUpdateTime","unlockDocument","updateDocumentEditor","clearDoc","drawerSlug","onDelete","onDuplicate","onRestore","onSave","onSaveFromContext","isInDrawer","Boolean","refreshCookieAsync","user","config","admin","userSlug","routes","adminRoute","serverURL","getEntityConfig","collectionConfig","globalConfig","depth","router","params","reportUpdate","resetUploadEdits","getFormState","startRouteTransition","clearRouteCache","isLivePreviewEnabled","isLivePreviewing","isPopupOpen","setURL","setLivePreviewURL","typeofLivePreviewURL","url","livePreviewURL","isPreviewEnabled","setPreviewURL","abortOnChangeRef","abortOnSaveRef","locale","get","entitySlug","slug","operation","auth","undefined","upload","docConfig","lockDocumentsProp","lockDocuments","isLockingEnabled","lockDurationDefault","lockDuration","duration","lockDurationInMilliseconds","autosaveEnabled","isReadOnlyForIncomingUser","setIsReadOnlyForIncomingUser","showTakeOverModal","setShowTakeOverModal","showStaleDataModal","setShowStaleDataModal","editSessionStartTime","setEditSessionStartTime","Date","now","hasCheckedForStaleDataRef","originalUpdatedAtRef","updatedAt","saveCounterRef","isSavingRef","lockExpiryTime","isLockExpired","preventLeaveWithoutSaving","schemaPathSegments","validateBeforeSubmit","setValidateBeforeSubmit","disableLocalStrategy","nextHrefRef","handleDocumentLocking","lockedState","previousOwnerID","current","lockedUserID","hasShownLockedModal","lastEditedAt","getTime","handleStaleDataReload","refresh","handlePrevent","nextHref","handleLeaveConfirm","lockUser","isLockOwnedByCurrentUser","nextPath","URL","pathname","isInternalView","some","path","includes","err","console","error","json","ctx","context","formState","controller","document","doc","result","toISOString","message","window","sessionStorage","setItem","redirectRoute","push","docPreferences","previewURL","state","renderAllFields","returnLivePreviewURL","returnLockStatus","returnPreviewURL","schemaPath","join","signal","skipValidation","file","onChange","prevFormState","submitted","saveCounterAtStart","isSavingAtStart","currentTime","timeSinceLastUpdate","updateLastEdited","checkForStaleData","originalUpdatedAt","readOnly","staleDataState","isStale","abortOnChange","abortOnSave","pendingMessage","getItem","removeItem","success","shouldShowDocumentLockedModal","isFolderCollection","hierarchy","allowHasMany","documentControlsProps","customComponents","onDrawerCreateNew","onTakeOver","documentLockStateRef","isWithinDoc","permissions","readOnlyForIncomingUser","renderAuth","_jsx","className","email","loginWithUsername","requirePassword","useAPIKey","username","verify","shouldRenderUploadPanel","hideFileInputOnCreate","shouldScrollFieldsOnly","constrainWidth","filter","_jsxs","disabled","disableSuccessStatus","disableValidationOnSubmit","isDocumentForm","method","onSubmit","onSuccess","actions","variant","AfterHeader","renderTitleAsLink","isActive","onReadOnly","onReload","modalSlug","onConfirm","onPrevent","pluralLabel","labels","plural","useAsTitle","fallback","toString","_Fragment","fields","forceSidebarWrap","uploadConfig"],"sources":["../../../src/views/Edit/index.tsx"],"sourcesContent":["'use client'\n\nimport type { DocumentViewClientProps, User } from 'payload'\n\nimport { formatAdminURL, hasAutosaveEnabled } from 'payload/shared'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport type { FormProps } from '../../forms/Form/index.js'\nimport type { FormOnSuccess } from '../../forms/Form/types.js'\nimport type { LockedState } from '../../utilities/buildFormState.js'\n\nimport { DocumentControls } from '../../elements/DocumentControls/index.js'\nimport { DocumentDrawerHeader } from '../../elements/DocumentDrawer/DrawerHeader/index.js'\nimport { useDocumentDrawerContext } from '../../elements/DocumentDrawer/Provider.js'\nimport { DocumentFields } from '../../elements/DocumentFields/index.js'\nimport { DocumentLocked } from '../../elements/DocumentLocked/index.js'\nimport { DocumentStaleData } from '../../elements/DocumentStaleData/index.js'\nimport { DocumentTakeOver } from '../../elements/DocumentTakeOver/index.js'\nimport { FileManager } from '../../elements/FileManager/index.js'\nimport { LeaveWithoutSaving } from '../../elements/LeaveWithoutSaving/index.js'\nimport { LivePreviewWindow } from '../../elements/LivePreview/Window/index.js'\nimport { Form } from '../../forms/Form/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentEvents } from '../../providers/DocumentEvents/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useEditDepth } from '../../providers/EditDepth/index.js'\nimport { useLivePreviewContext, usePreviewURL } from '../../providers/LivePreview/context.js'\nimport { OperationProvider } from '../../providers/Operation/index.js'\nimport { useRouteCache } from '../../providers/RouteCache/index.js'\nimport { useRouter, useSearchParams } from '../../providers/RouterAdapter/index.js'\nimport { useRouteTransition } from '../../providers/RouteTransition/index.js'\nimport { useServerFunctions } from '../../providers/ServerFunctions/index.js'\nimport { UploadControlsProvider } from '../../providers/UploadControls/index.js'\nimport { useUploadEdits } from '../../providers/UploadEdits/index.js'\nimport { abortAndIgnore, handleAbortRef } from '../../utilities/abortAndIgnore.js'\nimport { handleBackToDashboard } from '../../utilities/handleBackToDashboard.js'\nimport { handleGoBack } from '../../utilities/handleGoBack.js'\nimport { handleTakeOver } from '../../utilities/handleTakeOver.js'\nimport { Auth } from './Auth/index.js'\nimport { SetDocumentStepNav } from './SetDocumentStepNav/index.js'\nimport { SetDocumentTitle } from './SetDocumentTitle/index.js'\nimport './index.css'\n\nconst baseClass = 'collection-edit'\nconst PENDING_SUCCESS_TOAST_KEY = 'payload-pending-success-toast'\n\nexport type OnSaveContext = {\n getDocPermissions?: boolean\n incrementVersionCount?: boolean\n}\n\n// This component receives props only on _pages_\n// When rendered within a drawer, props are empty\n// This is solely to support custom edit views which get server-rendered\nexport function DefaultEditView({\n BeforeDocumentControls,\n BeforeDocumentMeta,\n Description,\n EditMenuItems,\n LivePreview: CustomLivePreview,\n PreviewButton,\n PublishButton,\n SaveButton,\n SaveDraftButton,\n Status,\n UnpublishButton,\n Upload: CustomUpload,\n UploadControls,\n UploadFilePreview,\n}: DocumentViewClientProps) {\n const {\n id,\n action,\n AfterDocument,\n AfterFields,\n apiURL,\n BeforeFields,\n collectionSlug,\n currentEditor,\n data,\n disableActions,\n disableCreate,\n disableLeaveWithoutSaving,\n docPermissions,\n documentIsLocked,\n documentLockState,\n getDocPermissions,\n getDocPreferences,\n globalSlug,\n hasPublishPermission,\n hasSavePermission,\n incrementVersionCount,\n initialState,\n isEditing,\n isInitializing,\n isLocked,\n isTrashed,\n lastUpdateTime,\n redirectAfterCreate,\n redirectAfterDelete,\n redirectAfterDuplicate,\n redirectAfterRestore,\n setCurrentEditor,\n setData,\n setDocumentIsLocked,\n setLastUpdateTime,\n unlockDocument,\n updateDocumentEditor,\n } = useDocumentInfo()\n\n const {\n clearDoc,\n drawerSlug,\n onDelete,\n onDuplicate,\n onRestore,\n onSave: onSaveFromContext,\n } = useDocumentDrawerContext()\n\n const isInDrawer = Boolean(drawerSlug)\n\n const { refreshCookieAsync, user } = useAuth()\n\n const {\n config,\n config: {\n admin: { user: userSlug },\n routes: { admin: adminRoute },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const globalConfig = getEntityConfig({ globalSlug })\n\n const depth = useEditDepth()\n\n const router = useRouter()\n const params = useSearchParams()\n const { reportUpdate } = useDocumentEvents()\n const { resetUploadEdits } = useUploadEdits()\n const { getFormState } = useServerFunctions()\n const { startRouteTransition } = useRouteTransition()\n const { clearRouteCache } = useRouteCache()\n const {\n isLivePreviewEnabled,\n isLivePreviewing,\n isPopupOpen,\n setURL: setLivePreviewURL,\n typeofLivePreviewURL,\n url: livePreviewURL,\n } = useLivePreviewContext()\n const { isPreviewEnabled, setPreviewURL } = usePreviewURL()\n\n const abortOnChangeRef = useRef<AbortController>(null)\n const abortOnSaveRef = useRef<AbortController>(null)\n\n const locale = params.get('locale')\n\n const entitySlug = collectionConfig?.slug || globalConfig?.slug\n\n const operation = collectionSlug && !id ? 'create' : 'update'\n\n const auth = collectionConfig ? collectionConfig.auth : undefined\n const upload = collectionConfig ? collectionConfig.upload : undefined\n\n const docConfig = collectionConfig || globalConfig\n\n const lockDocumentsProp = docConfig?.lockDocuments !== undefined ? docConfig?.lockDocuments : true\n const isLockingEnabled = lockDocumentsProp !== false\n\n const lockDurationDefault = 300 // Default 5 minutes in seconds\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n const lockDurationInMilliseconds = lockDuration * 1000\n\n const autosaveEnabled = hasAutosaveEnabled(docConfig)\n\n const [isReadOnlyForIncomingUser, setIsReadOnlyForIncomingUser] = useState(false)\n const [showTakeOverModal, setShowTakeOverModal] = useState(false)\n const [showStaleDataModal, setShowStaleDataModal] = useState(false)\n\n const [editSessionStartTime, setEditSessionStartTime] = useState(Date.now())\n\n const hasCheckedForStaleDataRef = useRef(false)\n const originalUpdatedAtRef = useRef(data?.updatedAt)\n const saveCounterRef = useRef(0)\n const isSavingRef = useRef(false)\n\n const lockExpiryTime = lastUpdateTime + lockDurationInMilliseconds\n const isLockExpired = Date.now() > lockExpiryTime\n\n const preventLeaveWithoutSaving =\n !isReadOnlyForIncomingUser &&\n (typeof disableLeaveWithoutSaving !== 'undefined'\n ? !disableLeaveWithoutSaving\n : !autosaveEnabled)\n\n const schemaPathSegments = useMemo(() => [entitySlug], [entitySlug])\n\n const [validateBeforeSubmit, setValidateBeforeSubmit] = useState(() => {\n if (operation === 'create' && auth && !auth.disableLocalStrategy) {\n return true\n }\n\n return false\n })\n\n const nextHrefRef = React.useRef<null | string>(null)\n\n const handleDocumentLocking = useCallback(\n (lockedState: LockedState) => {\n setDocumentIsLocked(true)\n const previousOwnerID =\n typeof documentLockState.current?.user === 'object'\n ? documentLockState.current?.user?.id\n : documentLockState.current?.user\n\n if (lockedState && lockedState.user) {\n const lockedUserID =\n typeof lockedState.user === 'string' || typeof lockedState.user === 'number'\n ? lockedState.user\n : lockedState.user.id\n\n if (!documentLockState.current || lockedUserID !== previousOwnerID) {\n if (previousOwnerID === user.id && lockedUserID !== user.id) {\n setShowTakeOverModal(true)\n documentLockState.current.hasShownLockedModal = true\n }\n\n documentLockState.current = {\n hasShownLockedModal: documentLockState.current?.hasShownLockedModal || false,\n isLocked: true,\n user: lockedState.user as User,\n }\n setCurrentEditor(lockedState.user as User)\n }\n\n // Update lastUpdateTime when lock state changes\n if (lockedState.lastEditedAt) {\n setLastUpdateTime(new Date(lockedState.lastEditedAt).getTime())\n }\n }\n },\n [documentLockState, setCurrentEditor, setDocumentIsLocked, setLastUpdateTime, user?.id],\n )\n\n const handleStaleDataReload = useCallback(() => {\n // Reset modal state so it can appear again if needed\n setShowStaleDataModal(false)\n\n // Refresh to get the latest data\n router.refresh()\n }, [router])\n\n const handlePrevent = useCallback((nextHref: null | string) => {\n nextHrefRef.current = nextHref\n }, [])\n\n const handleLeaveConfirm = useCallback(async () => {\n const lockUser = documentLockState.current?.user\n\n const isLockOwnedByCurrentUser =\n typeof lockUser === 'object' ? lockUser?.id === user?.id : lockUser === user?.id\n\n if (isLockingEnabled && documentIsLocked && (id || globalSlug)) {\n // Check where user is trying to go\n const nextPath = nextHrefRef.current ? new URL(nextHrefRef.current).pathname : ''\n const isInternalView = ['/preview', '/api', '/versions'].some((path) =>\n nextPath.includes(path),\n )\n\n // Remove the lock if the user is navigating away from the document view they have locked\n if (isLockOwnedByCurrentUser && !isInternalView) {\n try {\n await unlockDocument(id, collectionSlug ?? globalSlug)\n setDocumentIsLocked(false)\n setCurrentEditor(null)\n } catch (err) {\n console.error('Failed to unlock before leave', err) // eslint-disable-line no-console\n }\n }\n }\n }, [\n collectionSlug,\n documentIsLocked,\n documentLockState,\n globalSlug,\n id,\n isLockingEnabled,\n setCurrentEditor,\n setDocumentIsLocked,\n unlockDocument,\n user?.id,\n ])\n\n const onSave: FormOnSuccess<any, OnSaveContext> = useCallback(\n async (json, ctx) => {\n const { context, formState } = ctx || {}\n\n const controller = handleAbortRef(abortOnSaveRef)\n\n const document = json?.doc || json?.result\n\n const updatedAt = document?.updatedAt || new Date().toISOString()\n\n // If we're editing the doc of the logged-in user,\n // Refresh the cookie to get new permissions\n if (user && collectionSlug === userSlug && id === user.id) {\n void refreshCookieAsync()\n }\n\n setLastUpdateTime(new Date(updatedAt).getTime())\n\n // Update stale data check refs after successful save\n // This allows detecting if another user modifies the document after this save\n originalUpdatedAtRef.current = updatedAt\n hasCheckedForStaleDataRef.current = false\n isSavingRef.current = false\n\n if (context?.incrementVersionCount !== false) {\n incrementVersionCount()\n }\n\n if (typeof setData === 'function') {\n void setData(document || {})\n }\n\n if (typeof onSaveFromContext === 'function') {\n const operation = id ? 'update' : 'create'\n\n void onSaveFromContext({\n ...(json as Record<string, unknown>),\n context,\n operation,\n // @ts-expect-error todo: this is not right, should be under `doc`?\n updatedAt:\n operation === 'update'\n ? new Date().toISOString()\n : document?.updatedAt || new Date().toISOString(),\n })\n }\n\n if (!isEditing && depth < 2 && redirectAfterCreate !== false) {\n // Store success message to show after redirect\n if (json.message && typeof window !== 'undefined') {\n window.sessionStorage.setItem(PENDING_SUCCESS_TOAST_KEY, json.message)\n }\n\n // Redirect to the same locale if it's been set\n const redirectRoute = formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}/${document?.id}${locale ? `?locale=${locale}` : ''}`,\n })\n\n startRouteTransition(() => router.push(redirectRoute))\n } else {\n resetUploadEdits()\n }\n\n if (context?.getDocPermissions !== false) {\n await getDocPermissions(json)\n }\n\n if (id || globalSlug) {\n const docPreferences = await getDocPreferences()\n\n const { livePreviewURL, previewURL, state } = await getFormState({\n id,\n collectionSlug,\n data: document,\n docPermissions,\n docPreferences,\n formState,\n globalSlug,\n operation,\n renderAllFields: false,\n returnLivePreviewURL: isLivePreviewEnabled && typeofLivePreviewURL === 'function',\n returnLockStatus: false,\n returnPreviewURL: isPreviewEnabled,\n schemaPath: schemaPathSegments.join('.'),\n signal: controller.signal,\n skipValidation: true,\n })\n\n // For upload collections, clear the file field from the returned state\n // to prevent the File object from persisting in form state after save\n if (upload && state) {\n delete state.file\n }\n\n // Unlock the document after save\n if (isLockingEnabled) {\n setDocumentIsLocked(false)\n }\n\n if (isLivePreviewEnabled && typeofLivePreviewURL === 'function') {\n setLivePreviewURL(livePreviewURL)\n }\n\n if (isPreviewEnabled) {\n setPreviewURL(previewURL)\n }\n\n reportUpdate({\n id,\n doc: document,\n drawerSlug,\n entitySlug,\n operation: 'update',\n updatedAt,\n })\n\n abortOnSaveRef.current = null\n\n return state\n } else {\n reportUpdate({\n id,\n doc: document,\n drawerSlug,\n entitySlug,\n operation: 'create',\n updatedAt,\n })\n }\n },\n [\n user,\n collectionSlug,\n userSlug,\n id,\n setLastUpdateTime,\n setData,\n onSaveFromContext,\n isEditing,\n depth,\n redirectAfterCreate,\n globalSlug,\n refreshCookieAsync,\n incrementVersionCount,\n adminRoute,\n locale,\n startRouteTransition,\n router,\n resetUploadEdits,\n getDocPermissions,\n getDocPreferences,\n getFormState,\n docPermissions,\n operation,\n isLivePreviewEnabled,\n typeofLivePreviewURL,\n isPreviewEnabled,\n schemaPathSegments,\n upload,\n isLockingEnabled,\n reportUpdate,\n drawerSlug,\n entitySlug,\n setDocumentIsLocked,\n setLivePreviewURL,\n setPreviewURL,\n ],\n )\n\n const onChange: FormProps['onChange'][0] = useCallback(\n async ({ formState: prevFormState, submitted }) => {\n const controller = handleAbortRef(abortOnChangeRef)\n\n // Capture save state before the async form-state request so we can detect\n // if a save was triggered while this request was in-flight\n const saveCounterAtStart = saveCounterRef.current\n const isSavingAtStart = isSavingRef.current\n\n // Sync originalUpdatedAt with current data if it's NEWER (e.g., after router.refresh())\n if (data?.updatedAt && data.updatedAt > originalUpdatedAtRef.current) {\n originalUpdatedAtRef.current = data.updatedAt\n // Reset check flag so we can detect new stale data\n hasCheckedForStaleDataRef.current = false\n }\n\n const currentTime = Date.now()\n const timeSinceLastUpdate = currentTime - editSessionStartTime\n\n const updateLastEdited = isLockingEnabled && timeSinceLastUpdate >= 10000 // 10 seconds\n\n if (updateLastEdited) {\n setEditSessionStartTime(currentTime)\n }\n\n // Check for stale data on first edit only\n // Skip this check entirely for autosave-enabled collections/globals to prevent\n // false positives from the user's own autosaves\n const checkForStaleData =\n !hasCheckedForStaleDataRef.current &&\n originalUpdatedAtRef.current &&\n operation === 'update' &&\n !isTrashed &&\n !autosaveEnabled\n\n if (checkForStaleData) {\n hasCheckedForStaleDataRef.current = true\n }\n\n const docPreferences = await getDocPreferences()\n\n const result = await getFormState({\n id,\n checkForStaleData,\n collectionSlug,\n docPermissions,\n docPreferences,\n formState: prevFormState,\n globalSlug,\n operation,\n originalUpdatedAt: checkForStaleData ? originalUpdatedAtRef.current : undefined,\n readOnly: isTrashed || isReadOnlyForIncomingUser,\n renderAllFields: false,\n returnLockStatus: isLockingEnabled,\n schemaPath: schemaPathSegments.join('.'),\n signal: controller.signal,\n skipValidation: !submitted,\n updateLastEdited,\n })\n\n if (!result) {\n return\n }\n\n const { lockedState, staleDataState, state } = result\n\n if (isLockingEnabled) {\n handleDocumentLocking(lockedState)\n }\n\n // Handle stale data detection.\n // Skip if a save was in-flight when this request started, or if the save counter\n // has advanced — either way the newer updatedAt is from our OWN save.\n if (\n staleDataState?.isStale &&\n !isSavingAtStart &&\n saveCounterRef.current === saveCounterAtStart\n ) {\n setShowStaleDataModal(true)\n }\n\n abortOnChangeRef.current = null\n\n return state\n },\n [\n data?.updatedAt,\n editSessionStartTime,\n isLockingEnabled,\n getDocPreferences,\n getFormState,\n id,\n collectionSlug,\n docPermissions,\n globalSlug,\n operation,\n schemaPathSegments,\n handleDocumentLocking,\n autosaveEnabled,\n isTrashed,\n isReadOnlyForIncomingUser,\n ],\n )\n\n // Clean up when the component unmounts or when the document is unlocked\n useEffect(() => {\n return () => {\n setShowTakeOverModal(false)\n }\n }, [])\n\n useEffect(() => {\n const abortOnChange = abortOnChangeRef.current\n const abortOnSave = abortOnSaveRef.current\n\n return () => {\n abortAndIgnore(abortOnChange)\n abortAndIgnore(abortOnSave)\n }\n }, [])\n\n // Show pending success toast after redirect from create\n useEffect(() => {\n if (!isInitializing && typeof window !== 'undefined') {\n const pendingMessage = window.sessionStorage.getItem(PENDING_SUCCESS_TOAST_KEY)\n\n if (pendingMessage) {\n window.sessionStorage.removeItem(PENDING_SUCCESS_TOAST_KEY)\n toast.success(pendingMessage)\n }\n }\n }, [isInitializing])\n\n const shouldShowDocumentLockedModal =\n documentIsLocked &&\n currentEditor &&\n (typeof currentEditor === 'object'\n ? currentEditor.id !== user?.id\n : currentEditor !== user?.id) &&\n !isReadOnlyForIncomingUser &&\n !showTakeOverModal &&\n !documentLockState.current?.hasShownLockedModal &&\n !isLockExpired\n\n const isFolderCollection = Boolean(\n collectionConfig?.hierarchy &&\n typeof collectionConfig.hierarchy === 'object' &&\n collectionConfig.hierarchy.allowHasMany === false,\n )\n\n const documentControlsProps: Omit<React.ComponentProps<typeof DocumentControls>, 'variant'> = {\n id,\n slug: collectionConfig?.slug || globalConfig?.slug,\n apiURL,\n BeforeDocumentControls,\n BeforeDocumentMeta,\n customComponents: {\n PreviewButton,\n PublishButton,\n SaveButton,\n SaveDraftButton,\n Status,\n UnpublishButton,\n },\n data,\n disableActions: disableActions || isTrashed,\n disableCreate,\n EditMenuItems,\n hasPublishPermission,\n hasSavePermission,\n isEditing,\n isInDrawer,\n isTrashed,\n onDelete,\n onDrawerCreateNew: clearDoc,\n onDuplicate,\n onRestore,\n onSave,\n onTakeOver: () => {\n void handleTakeOver({\n id,\n clearRouteCache,\n collectionSlug,\n documentLockStateRef: documentLockState,\n globalSlug,\n isLockingEnabled,\n isWithinDoc: true,\n setCurrentEditor,\n setIsReadOnlyForIncomingUser,\n updateDocumentEditor,\n user,\n })\n },\n permissions: docPermissions,\n readOnlyForIncomingUser: isReadOnlyForIncomingUser,\n redirectAfterDelete,\n redirectAfterDuplicate,\n redirectAfterRestore,\n user: currentEditor,\n }\n\n const renderAuth = auth ? (\n <Auth\n className={`${baseClass}__auth`}\n collectionSlug={collectionConfig.slug}\n disableLocalStrategy={collectionConfig.auth?.disableLocalStrategy}\n email={data?.email}\n loginWithUsername={auth?.loginWithUsername}\n operation={operation}\n readOnly={!hasSavePermission}\n requirePassword={!id}\n setValidateBeforeSubmit={setValidateBeforeSubmit}\n // eslint-disable-next-line react-compiler/react-compiler\n useAPIKey={auth.useAPIKey}\n username={data?.username}\n verify={auth.verify}\n />\n ) : undefined\n\n const shouldRenderUploadPanel =\n Boolean(upload) && !(operation === 'create' && upload.hideFileInputOnCreate)\n const shouldScrollFieldsOnly = shouldRenderUploadPanel\n\n return (\n <main\n className={[\n baseClass,\n config.admin.constrainWidth && `${baseClass}--constrain-document-width`,\n (id || globalSlug) && `${baseClass}--is-editing`,\n globalSlug && `global-edit--${globalSlug}`,\n collectionSlug && `collection-edit--${collectionSlug}`,\n isLivePreviewing && `${baseClass}--is-live-previewing`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <OperationProvider operation={operation}>\n <Form\n action={action}\n className={`${baseClass}__form`}\n disabled={isReadOnlyForIncomingUser || isInitializing || !hasSavePermission || isTrashed}\n disableSuccessStatus={!isEditing && depth < 2 && redirectAfterCreate !== false}\n disableValidationOnSubmit={!validateBeforeSubmit}\n initialState={!isInitializing && initialState}\n isDocumentForm={true}\n isInitializing={isInitializing}\n key={`${isLocked}`}\n method={id ? 'PATCH' : 'POST'}\n onChange={[onChange]}\n onSubmit={() => {\n saveCounterRef.current += 1\n isSavingRef.current = true\n }}\n onSuccess={onSave}\n >\n {isInDrawer && (\n <DocumentDrawerHeader\n actions={\n <DocumentControls {...documentControlsProps} variant=\"drawerHeaderActions\" />\n }\n AfterHeader={Description}\n BeforeDocumentMeta={BeforeDocumentMeta}\n drawerSlug={drawerSlug}\n readOnlyForIncomingUser={isReadOnlyForIncomingUser}\n renderTitleAsLink={!isFolderCollection}\n Status={Status}\n user={currentEditor}\n />\n )}\n {isLockingEnabled && shouldShowDocumentLockedModal && (\n <DocumentLocked\n handleGoBack={() => handleGoBack({ adminRoute, collectionSlug, router, serverURL })}\n isActive={shouldShowDocumentLockedModal}\n onReadOnly={() => {\n setIsReadOnlyForIncomingUser(true)\n setShowTakeOverModal(false)\n }}\n onTakeOver={() =>\n handleTakeOver({\n id,\n clearRouteCache,\n collectionSlug,\n documentLockStateRef: documentLockState,\n globalSlug,\n isLockingEnabled,\n isWithinDoc: false,\n setCurrentEditor,\n updateDocumentEditor,\n user,\n })\n }\n updatedAt={lastUpdateTime}\n user={currentEditor}\n />\n )}\n {isLockingEnabled && showTakeOverModal && (\n <DocumentTakeOver\n handleBackToDashboard={() => handleBackToDashboard({ adminRoute, router, serverURL })}\n isActive={showTakeOverModal}\n onReadOnly={() => {\n setIsReadOnlyForIncomingUser(true)\n setShowTakeOverModal(false)\n }}\n />\n )}\n {showStaleDataModal && (\n <DocumentStaleData isActive={showStaleDataModal} onReload={handleStaleDataReload} />\n )}\n {preventLeaveWithoutSaving && (\n <LeaveWithoutSaving\n modalSlug={drawerSlug ? `leave-without-saving-${drawerSlug}` : undefined}\n onConfirm={handleLeaveConfirm}\n onPrevent={handlePrevent}\n />\n )}\n {!isInDrawer && (\n <SetDocumentStepNav\n collectionSlug={collectionConfig?.slug}\n globalSlug={globalConfig?.slug}\n id={id}\n isTrashed={isTrashed}\n pluralLabel={collectionConfig?.labels?.plural}\n useAsTitle={collectionConfig?.admin?.useAsTitle}\n />\n )}\n <SetDocumentTitle\n collectionConfig={collectionConfig}\n config={config}\n fallback={depth <= 1 ? id?.toString() : undefined}\n globalConfig={globalConfig}\n />\n {!isInDrawer && <DocumentControls {...documentControlsProps} variant=\"default\" />}\n <div\n className={[\n `${baseClass}__main-wrapper`,\n shouldRenderUploadPanel && `${baseClass}__main-wrapper--has-upload-panel`,\n shouldScrollFieldsOnly && `${baseClass}__main-wrapper--scroll-fields-only`,\n isPopupOpen && `${baseClass}--detached`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div\n className={[`${baseClass}__main`, isPopupOpen && `${baseClass}__main--popup-open`]\n .filter(Boolean)\n .join(' ')}\n >\n <DocumentFields\n AfterFields={AfterFields}\n BeforeFields={\n renderAuth || BeforeFields ? (\n <>\n {renderAuth}\n {BeforeFields}\n </>\n ) : null\n }\n Description={Description}\n docPermissions={docPermissions}\n fields={docConfig.fields}\n forceSidebarWrap={shouldRenderUploadPanel || isLivePreviewing}\n isTrashed={isTrashed}\n readOnly={isReadOnlyForIncomingUser || !hasSavePermission || isTrashed}\n schemaPathSegments={schemaPathSegments}\n />\n {AfterDocument}\n </div>\n {shouldRenderUploadPanel && (\n <UploadControlsProvider>\n {CustomUpload || (\n <FileManager\n collectionSlug={collectionConfig.slug}\n initialState={initialState}\n uploadConfig={upload}\n UploadControls={UploadControls}\n UploadFilePreview={UploadFilePreview}\n />\n )}\n </UploadControlsProvider>\n )}\n {isLivePreviewEnabled && !isInDrawer && livePreviewURL && (\n <>\n {CustomLivePreview || (\n <LivePreviewWindow collectionSlug={collectionSlug} globalSlug={globalSlug} />\n )}\n </>\n )}\n </div>\n </Form>\n </OperationProvider>\n </main>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["formatAdminURL","hasAutosaveEnabled","React","useCallback","useEffect","useMemo","useRef","useState","toast","DocumentControls","DocumentDrawerHeader","useDocumentDrawerContext","DocumentFields","DocumentLocked","DocumentStaleData","DocumentTakeOver","FileManager","LeaveWithoutSaving","LivePreviewWindow","Form","useAuth","useConfig","useDocumentEvents","useDocumentInfo","useEditDepth","useLivePreviewContext","usePreviewURL","OperationProvider","useRouteCache","useRouter","useSearchParams","useRouteTransition","useServerFunctions","UploadControlsProvider","useUploadEdits","abortAndIgnore","handleAbortRef","handleBackToDashboard","handleGoBack","handleTakeOver","Auth","SetDocumentStepNav","SetDocumentTitle","baseClass","PENDING_SUCCESS_TOAST_KEY","DefaultEditView","BeforeDocumentControls","BeforeDocumentMeta","Description","EditMenuItems","LivePreview","CustomLivePreview","PreviewButton","PublishButton","SaveButton","SaveDraftButton","Status","UnpublishButton","Upload","CustomUpload","UploadControls","UploadFilePreview","id","action","AfterDocument","AfterFields","apiURL","BeforeFields","collectionSlug","currentEditor","data","disableActions","disableCreate","disableLeaveWithoutSaving","docPermissions","documentIsLocked","documentLockState","getDocPermissions","getDocPreferences","globalSlug","hasPublishPermission","hasSavePermission","incrementVersionCount","initialState","isEditing","isInitializing","isLocked","isTrashed","lastUpdateTime","redirectAfterCreate","redirectAfterDelete","redirectAfterDuplicate","redirectAfterRestore","setCurrentEditor","setData","setDocumentIsLocked","setLastUpdateTime","unlockDocument","updateDocumentEditor","clearDoc","drawerSlug","onDelete","onDuplicate","onRestore","onSave","onSaveFromContext","isInDrawer","Boolean","refreshCookieAsync","user","config","admin","userSlug","routes","adminRoute","serverURL","getEntityConfig","collectionConfig","globalConfig","depth","router","params","reportUpdate","resetUploadEdits","getFormState","startRouteTransition","clearRouteCache","isLivePreviewEnabled","isLivePreviewing","isPopupOpen","setURL","setLivePreviewURL","typeofLivePreviewURL","url","livePreviewURL","isPreviewEnabled","setPreviewURL","abortOnChangeRef","abortOnSaveRef","locale","get","entitySlug","slug","operation","auth","undefined","upload","docConfig","lockDocumentsProp","lockDocuments","isLockingEnabled","lockDurationDefault","lockDuration","duration","lockDurationInMilliseconds","autosaveEnabled","isReadOnlyForIncomingUser","setIsReadOnlyForIncomingUser","showTakeOverModal","setShowTakeOverModal","showStaleDataModal","setShowStaleDataModal","editSessionStartTime","setEditSessionStartTime","Date","now","hasCheckedForStaleDataRef","originalUpdatedAtRef","updatedAt","saveCounterRef","isSavingRef","lockExpiryTime","isLockExpired","preventLeaveWithoutSaving","schemaPathSegments","validateBeforeSubmit","setValidateBeforeSubmit","disableLocalStrategy","nextHrefRef","handleDocumentLocking","lockedState","previousOwnerID","current","lockedUserID","hasShownLockedModal","lastEditedAt","getTime","handleStaleDataReload","refresh","handlePrevent","nextHref","handleLeaveConfirm","lockUser","isLockOwnedByCurrentUser","nextPath","URL","pathname","isInternalView","some","path","includes","err","console","error","json","ctx","context","formState","controller","document","doc","result","toISOString","message","window","sessionStorage","setItem","redirectRoute","push","docPreferences","previewURL","state","renderAllFields","returnLivePreviewURL","returnLockStatus","returnPreviewURL","schemaPath","join","signal","skipValidation","file","onChange","prevFormState","submitted","saveCounterAtStart","isSavingAtStart","currentTime","timeSinceLastUpdate","updateLastEdited","checkForStaleData","originalUpdatedAt","readOnly","staleDataState","isStale","abortOnChange","abortOnSave","pendingMessage","getItem","removeItem","success","shouldShowDocumentLockedModal","isFolderCollection","hierarchy","allowHasMany","documentControlsProps","customComponents","onDrawerCreateNew","onTakeOver","documentLockStateRef","isWithinDoc","permissions","readOnlyForIncomingUser","renderAuth","_jsx","className","email","loginWithUsername","requirePassword","useAPIKey","username","verify","shouldRenderUploadPanel","hideFileInputOnCreate","shouldScrollFieldsOnly","constrainWidth","filter","_jsxs","disabled","disableSuccessStatus","disableValidationOnSubmit","isDocumentForm","method","onSubmit","onSuccess","actions","variant","AfterHeader","renderTitleAsLink","isActive","onReadOnly","onReload","modalSlug","onConfirm","onPrevent","pluralLabel","labels","plural","useAsTitle","fallback","toString","_Fragment","fields","forceSidebarWrap","uploadConfig"],"sources":["../../../src/views/Edit/index.tsx"],"sourcesContent":["'use client'\n\nimport type { DocumentViewClientProps, User } from 'payload'\n\nimport { formatAdminURL, hasAutosaveEnabled } from 'payload/shared'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport type { FormProps } from '../../forms/Form/index.js'\nimport type { FormOnSuccess } from '../../forms/Form/types.js'\nimport type { LockedState } from '../../utilities/buildFormState.js'\n\nimport { DocumentControls } from '../../elements/DocumentControls/index.js'\nimport { DocumentDrawerHeader } from '../../elements/DocumentDrawer/DrawerHeader/index.js'\nimport { useDocumentDrawerContext } from '../../elements/DocumentDrawer/Provider.js'\nimport { DocumentFields } from '../../elements/DocumentFields/index.js'\nimport { DocumentLocked } from '../../elements/DocumentLocked/index.js'\nimport { DocumentStaleData } from '../../elements/DocumentStaleData/index.js'\nimport { DocumentTakeOver } from '../../elements/DocumentTakeOver/index.js'\nimport { FileManager } from '../../elements/FileManager/index.js'\nimport { LeaveWithoutSaving } from '../../elements/LeaveWithoutSaving/index.js'\nimport { LivePreviewWindow } from '../../elements/LivePreview/Window/index.js'\nimport { Form } from '../../forms/Form/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentEvents } from '../../providers/DocumentEvents/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useEditDepth } from '../../providers/EditDepth/index.js'\nimport { useLivePreviewContext, usePreviewURL } from '../../providers/LivePreview/context.js'\nimport { OperationProvider } from '../../providers/Operation/index.js'\nimport { useRouteCache } from '../../providers/RouteCache/index.js'\nimport { useRouter, useSearchParams } from '../../providers/RouterAdapter/index.js'\nimport { useRouteTransition } from '../../providers/RouteTransition/index.js'\nimport { useServerFunctions } from '../../providers/ServerFunctions/index.js'\nimport { UploadControlsProvider } from '../../providers/UploadControls/index.js'\nimport { useUploadEdits } from '../../providers/UploadEdits/index.js'\nimport { abortAndIgnore, handleAbortRef } from '../../utilities/abortAndIgnore.js'\nimport { handleBackToDashboard } from '../../utilities/handleBackToDashboard.js'\nimport { handleGoBack } from '../../utilities/handleGoBack.js'\nimport { handleTakeOver } from '../../utilities/handleTakeOver.js'\nimport { Auth } from './Auth/index.js'\nimport { SetDocumentStepNav } from './SetDocumentStepNav/index.js'\nimport { SetDocumentTitle } from './SetDocumentTitle/index.js'\nimport './index.css'\n\nconst baseClass = 'collection-edit'\nconst PENDING_SUCCESS_TOAST_KEY = 'payload-pending-success-toast'\n\nexport type OnSaveContext = {\n getDocPermissions?: boolean\n incrementVersionCount?: boolean\n}\n\n// This component receives props only on _pages_\n// When rendered within a drawer, props are empty\n// This is solely to support custom edit views which get server-rendered\nexport function DefaultEditView({\n BeforeDocumentControls,\n BeforeDocumentMeta,\n Description,\n EditMenuItems,\n LivePreview: CustomLivePreview,\n PreviewButton,\n PublishButton,\n SaveButton,\n SaveDraftButton,\n Status,\n UnpublishButton,\n Upload: CustomUpload,\n UploadControls,\n UploadFilePreview,\n}: DocumentViewClientProps) {\n const {\n id,\n action,\n AfterDocument,\n AfterFields,\n apiURL,\n BeforeFields,\n collectionSlug,\n currentEditor,\n data,\n disableActions,\n disableCreate,\n disableLeaveWithoutSaving,\n docPermissions,\n documentIsLocked,\n documentLockState,\n getDocPermissions,\n getDocPreferences,\n globalSlug,\n hasPublishPermission,\n hasSavePermission,\n incrementVersionCount,\n initialState,\n isEditing,\n isInitializing,\n isLocked,\n isTrashed,\n lastUpdateTime,\n redirectAfterCreate,\n redirectAfterDelete,\n redirectAfterDuplicate,\n redirectAfterRestore,\n setCurrentEditor,\n setData,\n setDocumentIsLocked,\n setLastUpdateTime,\n unlockDocument,\n updateDocumentEditor,\n } = useDocumentInfo()\n\n const {\n clearDoc,\n drawerSlug,\n onDelete,\n onDuplicate,\n onRestore,\n onSave: onSaveFromContext,\n } = useDocumentDrawerContext()\n\n const isInDrawer = Boolean(drawerSlug)\n\n const { refreshCookieAsync, user } = useAuth()\n\n const {\n config,\n config: {\n admin: { user: userSlug },\n routes: { admin: adminRoute },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const globalConfig = getEntityConfig({ globalSlug })\n\n const depth = useEditDepth()\n\n const router = useRouter()\n const params = useSearchParams()\n const { reportUpdate } = useDocumentEvents()\n const { resetUploadEdits } = useUploadEdits()\n const { getFormState } = useServerFunctions()\n const { startRouteTransition } = useRouteTransition()\n const { clearRouteCache } = useRouteCache()\n const {\n isLivePreviewEnabled,\n isLivePreviewing,\n isPopupOpen,\n setURL: setLivePreviewURL,\n typeofLivePreviewURL,\n url: livePreviewURL,\n } = useLivePreviewContext()\n const { isPreviewEnabled, setPreviewURL } = usePreviewURL()\n\n const abortOnChangeRef = useRef<AbortController>(null)\n const abortOnSaveRef = useRef<AbortController>(null)\n\n const locale = params.get('locale')\n\n const entitySlug = collectionConfig?.slug || globalConfig?.slug\n\n const operation = collectionSlug && !id ? 'create' : 'update'\n\n const auth = collectionConfig ? collectionConfig.auth : undefined\n const upload = collectionConfig ? collectionConfig.upload : undefined\n\n const docConfig = collectionConfig || globalConfig\n\n const lockDocumentsProp = docConfig?.lockDocuments !== undefined ? docConfig?.lockDocuments : true\n const isLockingEnabled = lockDocumentsProp !== false\n\n const lockDurationDefault = 300 // Default 5 minutes in seconds\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n const lockDurationInMilliseconds = lockDuration * 1000\n\n const autosaveEnabled = hasAutosaveEnabled(docConfig)\n\n const [isReadOnlyForIncomingUser, setIsReadOnlyForIncomingUser] = useState(false)\n const [showTakeOverModal, setShowTakeOverModal] = useState(false)\n const [showStaleDataModal, setShowStaleDataModal] = useState(false)\n\n const [editSessionStartTime, setEditSessionStartTime] = useState(Date.now())\n\n const hasCheckedForStaleDataRef = useRef(false)\n const originalUpdatedAtRef = useRef(data?.updatedAt)\n const saveCounterRef = useRef(0)\n const isSavingRef = useRef(false)\n\n const lockExpiryTime = lastUpdateTime + lockDurationInMilliseconds\n const isLockExpired = Date.now() > lockExpiryTime\n\n const preventLeaveWithoutSaving =\n !isReadOnlyForIncomingUser &&\n (typeof disableLeaveWithoutSaving !== 'undefined'\n ? !disableLeaveWithoutSaving\n : !autosaveEnabled)\n\n const schemaPathSegments = useMemo(() => [entitySlug], [entitySlug])\n\n const [validateBeforeSubmit, setValidateBeforeSubmit] = useState(() => {\n if (operation === 'create' && auth && !auth.disableLocalStrategy) {\n return true\n }\n\n return false\n })\n\n const nextHrefRef = React.useRef<null | string>(null)\n\n const handleDocumentLocking = useCallback(\n (lockedState: LockedState) => {\n setDocumentIsLocked(true)\n const previousOwnerID =\n typeof documentLockState.current?.user === 'object'\n ? documentLockState.current?.user?.id\n : documentLockState.current?.user\n\n if (lockedState && lockedState.user) {\n const lockedUserID =\n typeof lockedState.user === 'string' || typeof lockedState.user === 'number'\n ? lockedState.user\n : lockedState.user.id\n\n if (!documentLockState.current || lockedUserID !== previousOwnerID) {\n if (previousOwnerID === user.id && lockedUserID !== user.id) {\n setShowTakeOverModal(true)\n documentLockState.current.hasShownLockedModal = true\n }\n\n documentLockState.current = {\n hasShownLockedModal: documentLockState.current?.hasShownLockedModal || false,\n isLocked: true,\n user: lockedState.user as User,\n }\n setCurrentEditor(lockedState.user as User)\n }\n\n // Update lastUpdateTime when lock state changes\n if (lockedState.lastEditedAt) {\n setLastUpdateTime(new Date(lockedState.lastEditedAt).getTime())\n }\n }\n },\n [documentLockState, setCurrentEditor, setDocumentIsLocked, setLastUpdateTime, user?.id],\n )\n\n const handleStaleDataReload = useCallback(() => {\n // Reset modal state so it can appear again if needed\n setShowStaleDataModal(false)\n\n // Refresh to get the latest data\n router.refresh()\n }, [router])\n\n const handlePrevent = useCallback((nextHref: null | string) => {\n nextHrefRef.current = nextHref\n }, [])\n\n const handleLeaveConfirm = useCallback(async () => {\n const lockUser = documentLockState.current?.user\n\n const isLockOwnedByCurrentUser =\n typeof lockUser === 'object' ? lockUser?.id === user?.id : lockUser === user?.id\n\n if (isLockingEnabled && documentIsLocked && (id || globalSlug)) {\n // Check where user is trying to go\n const nextPath = nextHrefRef.current ? new URL(nextHrefRef.current).pathname : ''\n const isInternalView = ['/preview', '/api', '/versions'].some((path) =>\n nextPath.includes(path),\n )\n\n // Remove the lock if the user is navigating away from the document view they have locked\n if (isLockOwnedByCurrentUser && !isInternalView) {\n try {\n await unlockDocument(id, collectionSlug ?? globalSlug)\n setDocumentIsLocked(false)\n setCurrentEditor(null)\n } catch (err) {\n console.error('Failed to unlock before leave', err) // eslint-disable-line no-console\n }\n }\n }\n }, [\n collectionSlug,\n documentIsLocked,\n documentLockState,\n globalSlug,\n id,\n isLockingEnabled,\n setCurrentEditor,\n setDocumentIsLocked,\n unlockDocument,\n user?.id,\n ])\n\n const onSave: FormOnSuccess<any, OnSaveContext> = useCallback(\n async (json, ctx) => {\n const { context, formState } = ctx || {}\n\n const controller = handleAbortRef(abortOnSaveRef)\n\n const document = json?.doc || json?.result\n\n const updatedAt = document?.updatedAt || new Date().toISOString()\n\n // If we're editing the doc of the logged-in user,\n // Refresh the cookie to get new permissions\n if (user && collectionSlug === userSlug && id === user.id) {\n void refreshCookieAsync()\n }\n\n setLastUpdateTime(new Date(updatedAt).getTime())\n\n // Update stale data check refs after successful save\n // This allows detecting if another user modifies the document after this save\n originalUpdatedAtRef.current = updatedAt\n hasCheckedForStaleDataRef.current = false\n isSavingRef.current = false\n\n if (context?.incrementVersionCount !== false) {\n incrementVersionCount()\n }\n\n if (typeof setData === 'function') {\n void setData(document || {})\n }\n\n if (typeof onSaveFromContext === 'function') {\n const operation = id ? 'update' : 'create'\n\n void onSaveFromContext({\n ...(json as Record<string, unknown>),\n context,\n operation,\n // @ts-expect-error todo: this is not right, should be under `doc`?\n updatedAt:\n operation === 'update'\n ? new Date().toISOString()\n : document?.updatedAt || new Date().toISOString(),\n })\n }\n\n if (!isEditing && depth < 2 && redirectAfterCreate !== false) {\n // Store success message to show after redirect\n if (json.message && typeof window !== 'undefined') {\n window.sessionStorage.setItem(PENDING_SUCCESS_TOAST_KEY, json.message)\n }\n\n // Redirect to the same locale if it's been set\n const redirectRoute = formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}/${document?.id}${locale ? `?locale=${locale}` : ''}`,\n })\n\n startRouteTransition(() => router.push(redirectRoute))\n } else {\n resetUploadEdits()\n }\n\n if (context?.getDocPermissions !== false) {\n await getDocPermissions(json)\n }\n\n if (id || globalSlug) {\n const docPreferences = await getDocPreferences()\n\n const { livePreviewURL, previewURL, state } = await getFormState({\n id,\n collectionSlug,\n data: document,\n docPermissions,\n docPreferences,\n formState,\n globalSlug,\n operation,\n renderAllFields: false,\n returnLivePreviewURL: isLivePreviewEnabled && typeofLivePreviewURL === 'function',\n returnLockStatus: false,\n returnPreviewURL: isPreviewEnabled,\n schemaPath: schemaPathSegments.join('.'),\n signal: controller.signal,\n skipValidation: true,\n })\n\n // For upload collections, clear the file field from the returned state\n // to prevent the File object from persisting in form state after save\n if (upload && state) {\n delete state.file\n }\n\n // Unlock the document after save\n if (isLockingEnabled) {\n setDocumentIsLocked(false)\n }\n\n if (isLivePreviewEnabled && typeofLivePreviewURL === 'function') {\n setLivePreviewURL(livePreviewURL)\n }\n\n if (isPreviewEnabled) {\n setPreviewURL(previewURL)\n }\n\n reportUpdate({\n id,\n doc: document,\n drawerSlug,\n entitySlug,\n operation: 'update',\n updatedAt,\n })\n\n abortOnSaveRef.current = null\n\n return state\n } else {\n reportUpdate({\n id,\n doc: document,\n drawerSlug,\n entitySlug,\n operation: 'create',\n updatedAt,\n })\n }\n },\n [\n user,\n collectionSlug,\n userSlug,\n id,\n setLastUpdateTime,\n setData,\n onSaveFromContext,\n isEditing,\n depth,\n redirectAfterCreate,\n globalSlug,\n refreshCookieAsync,\n incrementVersionCount,\n adminRoute,\n locale,\n startRouteTransition,\n router,\n resetUploadEdits,\n getDocPermissions,\n getDocPreferences,\n getFormState,\n docPermissions,\n operation,\n isLivePreviewEnabled,\n typeofLivePreviewURL,\n isPreviewEnabled,\n schemaPathSegments,\n upload,\n isLockingEnabled,\n reportUpdate,\n drawerSlug,\n entitySlug,\n setDocumentIsLocked,\n setLivePreviewURL,\n setPreviewURL,\n ],\n )\n\n const onChange: FormProps['onChange'][0] = useCallback(\n async ({ formState: prevFormState, submitted }) => {\n const controller = handleAbortRef(abortOnChangeRef)\n\n // Capture save state before the async form-state request so we can detect\n // if a save was triggered while this request was in-flight\n const saveCounterAtStart = saveCounterRef.current\n const isSavingAtStart = isSavingRef.current\n\n // Sync originalUpdatedAt with current data if it's NEWER (e.g., after router.refresh())\n if (data?.updatedAt && data.updatedAt > originalUpdatedAtRef.current) {\n originalUpdatedAtRef.current = data.updatedAt\n // Reset check flag so we can detect new stale data\n hasCheckedForStaleDataRef.current = false\n }\n\n const currentTime = Date.now()\n const timeSinceLastUpdate = currentTime - editSessionStartTime\n\n const updateLastEdited = isLockingEnabled && timeSinceLastUpdate >= 10000 // 10 seconds\n\n if (updateLastEdited) {\n setEditSessionStartTime(currentTime)\n }\n\n // Check for stale data on first edit only\n // Skip this check entirely for autosave-enabled collections/globals to prevent\n // false positives from the user's own autosaves\n const checkForStaleData =\n !hasCheckedForStaleDataRef.current &&\n originalUpdatedAtRef.current &&\n operation === 'update' &&\n !isTrashed &&\n !autosaveEnabled\n\n if (checkForStaleData) {\n hasCheckedForStaleDataRef.current = true\n }\n\n const docPreferences = await getDocPreferences()\n\n const result = await getFormState({\n id,\n checkForStaleData,\n collectionSlug,\n docPermissions,\n docPreferences,\n formState: prevFormState,\n globalSlug,\n operation,\n originalUpdatedAt: checkForStaleData ? originalUpdatedAtRef.current : undefined,\n readOnly: isTrashed || isReadOnlyForIncomingUser,\n renderAllFields: false,\n returnLockStatus: isLockingEnabled,\n schemaPath: schemaPathSegments.join('.'),\n signal: controller.signal,\n skipValidation: !submitted,\n updateLastEdited,\n })\n\n if (!result) {\n return\n }\n\n const { lockedState, staleDataState, state } = result\n\n if (isLockingEnabled) {\n handleDocumentLocking(lockedState)\n }\n\n // Handle stale data detection.\n // Skip if a save was in-flight when this request started, or if the save counter\n // has advanced — either way the newer updatedAt is from our OWN save.\n if (\n staleDataState?.isStale &&\n !isSavingAtStart &&\n saveCounterRef.current === saveCounterAtStart\n ) {\n setShowStaleDataModal(true)\n }\n\n abortOnChangeRef.current = null\n\n return state\n },\n [\n data?.updatedAt,\n editSessionStartTime,\n isLockingEnabled,\n getDocPreferences,\n getFormState,\n id,\n collectionSlug,\n docPermissions,\n globalSlug,\n operation,\n schemaPathSegments,\n handleDocumentLocking,\n autosaveEnabled,\n isTrashed,\n isReadOnlyForIncomingUser,\n ],\n )\n\n // Clean up when the component unmounts or when the document is unlocked\n useEffect(() => {\n return () => {\n setShowTakeOverModal(false)\n }\n }, [])\n\n useEffect(() => {\n const abortOnChange = abortOnChangeRef.current\n const abortOnSave = abortOnSaveRef.current\n\n return () => {\n abortAndIgnore(abortOnChange)\n abortAndIgnore(abortOnSave)\n }\n }, [])\n\n // Show pending success toast after redirect from create\n useEffect(() => {\n if (!isInitializing && typeof window !== 'undefined') {\n const pendingMessage = window.sessionStorage.getItem(PENDING_SUCCESS_TOAST_KEY)\n\n if (pendingMessage) {\n window.sessionStorage.removeItem(PENDING_SUCCESS_TOAST_KEY)\n toast.success(pendingMessage)\n }\n }\n }, [isInitializing])\n\n const shouldShowDocumentLockedModal =\n documentIsLocked &&\n currentEditor &&\n (typeof currentEditor === 'object'\n ? currentEditor.id !== user?.id\n : currentEditor !== user?.id) &&\n !isReadOnlyForIncomingUser &&\n !showTakeOverModal &&\n !documentLockState.current?.hasShownLockedModal &&\n !isLockExpired\n\n const isFolderCollection = Boolean(\n collectionConfig?.hierarchy &&\n typeof collectionConfig.hierarchy === 'object' &&\n collectionConfig.hierarchy.allowHasMany === false,\n )\n\n const documentControlsProps: Omit<React.ComponentProps<typeof DocumentControls>, 'variant'> = {\n id,\n slug: collectionConfig?.slug || globalConfig?.slug,\n apiURL,\n BeforeDocumentControls,\n BeforeDocumentMeta,\n customComponents: {\n PreviewButton,\n PublishButton,\n SaveButton,\n SaveDraftButton,\n Status,\n UnpublishButton,\n },\n data,\n disableActions: disableActions || isTrashed,\n disableCreate,\n EditMenuItems,\n hasPublishPermission,\n hasSavePermission,\n isEditing,\n isInDrawer,\n isTrashed,\n onDelete,\n onDrawerCreateNew: clearDoc,\n onDuplicate,\n onRestore,\n onSave,\n onTakeOver: () => {\n void handleTakeOver({\n id,\n clearRouteCache,\n collectionSlug,\n documentLockStateRef: documentLockState,\n globalSlug,\n isLockingEnabled,\n isWithinDoc: true,\n setCurrentEditor,\n setIsReadOnlyForIncomingUser,\n updateDocumentEditor,\n user,\n })\n },\n permissions: docPermissions,\n readOnlyForIncomingUser: isReadOnlyForIncomingUser,\n redirectAfterDelete,\n redirectAfterDuplicate,\n redirectAfterRestore,\n user: currentEditor,\n }\n\n const renderAuth = auth ? (\n <Auth\n className={`${baseClass}__auth`}\n collectionSlug={collectionConfig.slug}\n disableLocalStrategy={collectionConfig.auth?.disableLocalStrategy}\n email={data?.email}\n loginWithUsername={auth?.loginWithUsername}\n operation={operation}\n readOnly={!hasSavePermission}\n requirePassword={!id}\n setValidateBeforeSubmit={setValidateBeforeSubmit}\n // eslint-disable-next-line react-compiler/react-compiler\n useAPIKey={auth.useAPIKey}\n username={data?.username}\n verify={auth.verify}\n />\n ) : undefined\n\n const shouldRenderUploadPanel =\n Boolean(upload) && !(operation === 'create' && upload.hideFileInputOnCreate)\n const shouldScrollFieldsOnly = shouldRenderUploadPanel\n\n return (\n <main\n className={[\n baseClass,\n config.admin.constrainWidth && `${baseClass}--constrain-document-width`,\n (id || globalSlug) && `${baseClass}--is-editing`,\n globalSlug && `global-edit--${globalSlug}`,\n collectionSlug && `collection-edit--${collectionSlug}`,\n isLivePreviewing && `${baseClass}--is-live-previewing`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <OperationProvider operation={operation}>\n <Form\n action={action}\n className={`${baseClass}__form`}\n disabled={isReadOnlyForIncomingUser || isInitializing || !hasSavePermission || isTrashed}\n disableSuccessStatus={!isEditing && depth < 2 && redirectAfterCreate !== false}\n disableValidationOnSubmit={!validateBeforeSubmit}\n initialState={!isInitializing && initialState}\n isDocumentForm={true}\n isInitializing={isInitializing}\n key={`${isLocked}`}\n method={id ? 'PATCH' : 'POST'}\n onChange={[onChange]}\n onSubmit={() => {\n saveCounterRef.current += 1\n isSavingRef.current = true\n }}\n onSuccess={onSave}\n >\n {isInDrawer && (\n <DocumentDrawerHeader\n actions={\n <DocumentControls {...documentControlsProps} variant=\"drawerHeaderActions\" />\n }\n AfterHeader={Description}\n BeforeDocumentMeta={BeforeDocumentMeta}\n drawerSlug={drawerSlug}\n readOnlyForIncomingUser={isReadOnlyForIncomingUser}\n renderTitleAsLink={!isFolderCollection}\n Status={Status}\n user={currentEditor}\n />\n )}\n {isLockingEnabled && shouldShowDocumentLockedModal && (\n <DocumentLocked\n handleGoBack={() => handleGoBack({ adminRoute, collectionSlug, router, serverURL })}\n isActive={shouldShowDocumentLockedModal}\n onReadOnly={() => {\n setIsReadOnlyForIncomingUser(true)\n setShowTakeOverModal(false)\n }}\n onTakeOver={() =>\n handleTakeOver({\n id,\n clearRouteCache,\n collectionSlug,\n documentLockStateRef: documentLockState,\n globalSlug,\n isLockingEnabled,\n isWithinDoc: false,\n setCurrentEditor,\n updateDocumentEditor,\n user,\n })\n }\n updatedAt={lastUpdateTime}\n user={currentEditor}\n />\n )}\n {isLockingEnabled && showTakeOverModal && (\n <DocumentTakeOver\n handleBackToDashboard={() => handleBackToDashboard({ adminRoute, router, serverURL })}\n isActive={showTakeOverModal}\n onReadOnly={() => {\n setIsReadOnlyForIncomingUser(true)\n setShowTakeOverModal(false)\n }}\n />\n )}\n {showStaleDataModal && (\n <DocumentStaleData isActive={showStaleDataModal} onReload={handleStaleDataReload} />\n )}\n {preventLeaveWithoutSaving && (\n <LeaveWithoutSaving\n modalSlug={drawerSlug ? `leave-without-saving-${drawerSlug}` : undefined}\n onConfirm={handleLeaveConfirm}\n onPrevent={handlePrevent}\n />\n )}\n {!isInDrawer && (\n <SetDocumentStepNav\n collectionSlug={collectionConfig?.slug}\n globalSlug={globalConfig?.slug}\n id={id}\n isTrashed={isTrashed}\n pluralLabel={collectionConfig?.labels?.plural}\n useAsTitle={collectionConfig?.admin?.useAsTitle}\n />\n )}\n <SetDocumentTitle\n collectionConfig={collectionConfig}\n config={config}\n fallback={depth <= 1 ? id?.toString() : undefined}\n globalConfig={globalConfig}\n />\n {!isInDrawer && <DocumentControls {...documentControlsProps} variant=\"default\" />}\n <div\n className={[\n `${baseClass}__main-wrapper`,\n shouldRenderUploadPanel && `${baseClass}__main-wrapper--has-upload-panel`,\n shouldScrollFieldsOnly && `${baseClass}__main-wrapper--scroll-fields-only`,\n isPopupOpen && `${baseClass}--detached`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <div\n className={[`${baseClass}__main`, isPopupOpen && `${baseClass}__main--popup-open`]\n .filter(Boolean)\n .join(' ')}\n >\n <DocumentFields\n AfterFields={AfterFields}\n BeforeFields={\n renderAuth || BeforeFields ? (\n <>\n {renderAuth}\n {BeforeFields}\n </>\n ) : null\n }\n Description={Description}\n docPermissions={docPermissions}\n fields={docConfig.fields}\n forceSidebarWrap={shouldRenderUploadPanel || isLivePreviewing}\n isTrashed={isTrashed}\n readOnly={isReadOnlyForIncomingUser || !hasSavePermission || isTrashed}\n schemaPathSegments={schemaPathSegments}\n />\n {AfterDocument}\n </div>\n {shouldRenderUploadPanel && (\n <UploadControlsProvider>\n {CustomUpload || (\n <FileManager\n collectionSlug={collectionConfig.slug}\n initialState={initialState}\n uploadConfig={upload}\n UploadControls={UploadControls}\n UploadFilePreview={UploadFilePreview}\n />\n )}\n </UploadControlsProvider>\n )}\n {isLivePreviewEnabled && !isInDrawer && livePreviewURL && (\n <>\n {CustomLivePreview || (\n <LivePreviewWindow collectionSlug={collectionSlug} globalSlug={globalSlug} />\n )}\n </>\n )}\n </div>\n </Form>\n </OperationProvider>\n </main>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDocuments.d.ts","sourceRoot":"","sources":["../../../src/widgets/RecentlyViewed/getDocuments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAMpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAWvD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC/C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,GAAG,EAAE,YAAY,CAAA;CAClB,CAAA;AACD,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAKD,eAAO,MAAM,4BAA4B,EAAE,cAAc,CACvD,iBAAiB,EACjB,OAAO,CAAC,aAAa,CAAC,CACC,CAAA;AAEzB,wBAAsB,qBAAqB,CAAC,EAC1C,mBAAwB,EACxB,KAAK,EACL,IAAI,EACJ,GAAG,EACH,2BAAmC,EACnC,GAAG,GACJ,EAAE;IAAE,GAAG,EAAE,cAAc,CAAA;CAAE,GAAG,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"getDocuments.d.ts","sourceRoot":"","sources":["../../../src/widgets/RecentlyViewed/getDocuments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAMpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAWvD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC/C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,GAAG,EAAE,YAAY,CAAA;CAClB,CAAA;AACD,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAKD,eAAO,MAAM,4BAA4B,EAAE,cAAc,CACvD,iBAAiB,EACjB,OAAO,CAAC,aAAa,CAAC,CACC,CAAA;AAEzB,wBAAsB,qBAAqB,CAAC,EAC1C,mBAAwB,EACxB,KAAK,EACL,IAAI,EACJ,GAAG,EACH,2BAAmC,EACnC,GAAG,GACJ,EAAE;IAAE,GAAG,EAAE,cAAc,CAAA;CAAE,GAAG,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAsEtE"}
|
|
@@ -49,7 +49,10 @@ export async function getDashboardDocuments({
|
|
|
49
49
|
value: preference.docs[0]?.value
|
|
50
50
|
}).filter(({
|
|
51
51
|
collectionSlug
|
|
52
|
-
}) =>
|
|
52
|
+
}) => {
|
|
53
|
+
const collection = req.payload.collections[collectionSlug];
|
|
54
|
+
return !excluded.has(collectionSlug) && collection && collection.config.admin.group !== false;
|
|
55
|
+
});
|
|
53
56
|
const availableReferences = await getAvailableReferences({
|
|
54
57
|
references: storedReferences,
|
|
55
58
|
req
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDocuments.js","names":["getTranslation","UnauthorizedError","formatAdminURL","PREFERENCE_KEYS","formatRelativeDate","getRelativeTimeFormat","getDocumentThumbnail","getDocumentThumbnailPopulate","getDocumentThumbnailSelect","enrichDocsWithVersionStatus","getPinnedItems","documentKey","getValueByPath","getDashboardDocumentsHandler","getDashboardDocuments","excludedCollections","limit","page","req","shouldIncludePinPlaceholder","tab","user","t","Number","isSafeInteger","Error","key","PINNED_DOCUMENTS","RECENTLY_VIEWED","preference","payload","find","collection","depth","overrideAccess","where","and","ownerWhere","equals","excluded","Set","storedReferences","value","docs","filter","collectionSlug","has","collections","availableReferences","getAvailableReferences","references","totalDocs","length","lastPage","Math","max","ceil","min","slice","documents","loadDocuments","items","map","reference","document","get","viewedAt","dateLabel","relativeTimeFormat","i18n","language","undefined","dateTime","item","Boolean","available","Promise","all","groupReferenceIDs","entries","ids","result","disableErrors","draft","pagination","select","id","sort","in","doc","add","idsByCollection","Map","push","set","config","collectionConfig","admin","useAsTitle","split","_status","updatedAt","useAsThumbnail","upload","width","populate","enriched","data","enrichDocument","rawTitle","object","path","status","_displayStatus","href","adminRoute","routes","encodeURIComponent","String","isChanged","isDraft","statusLabel","thumbnailURL","title","typeLabel","labels","plural"],"sources":["../../../src/widgets/RecentlyViewed/getDocuments.ts"],"sourcesContent":["import type { PayloadRequest, ServerFunction, Where } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { UnauthorizedError } from 'payload'\nimport { formatAdminURL, PREFERENCE_KEYS } from 'payload/shared'\n\nimport type { RecentDocument } from './index.client.js'\nimport type { PinnedItem } from './recents.js'\n\nimport { formatRelativeDate, getRelativeTimeFormat } from '../../utilities/formatRelativeDate.js'\nimport { getDocumentThumbnail } from '../../utilities/getDocumentThumbnail.js'\nimport { getDocumentThumbnailPopulate } from '../../utilities/getDocumentThumbnailPopulate.js'\nimport { getDocumentThumbnailSelect } from '../../utilities/getDocumentThumbnailSelect.js'\nimport { enrichDocsWithVersionStatus } from '../../views/List/enrichDocsWithVersionStatus.js'\nimport { getPinnedItems } from './pinnedPreferences.js'\nimport { documentKey, getValueByPath } from './recents.js'\n\nexport type DocumentsTab = 'pinned' | 'recents'\nexport type DocumentsPageArgs = {\n excludedCollections?: string[]\n limit: number\n page: number\n shouldIncludePinPlaceholder?: boolean\n tab: DocumentsTab\n}\nexport type DocumentsPage = {\n items: RecentDocument[]\n page: number\n totalDocs: number\n}\n\ntype Reference = { viewedAt?: string } & PinnedItem\ntype QueryDoc = { id: number | string; updatedAt?: string } & Record<string, unknown>\n\nexport const getDashboardDocumentsHandler: ServerFunction<\n DocumentsPageArgs,\n Promise<DocumentsPage>\n> = getDashboardDocuments\n\nexport async function getDashboardDocuments({\n excludedCollections = [],\n limit,\n page,\n req,\n shouldIncludePinPlaceholder = false,\n tab,\n}: { req: PayloadRequest } & DocumentsPageArgs): Promise<DocumentsPage> {\n if (!req.user) {\n throw new UnauthorizedError(req.t)\n }\n if (\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 100 ||\n !Number.isSafeInteger(page) ||\n page < 1\n ) {\n throw new Error('Invalid dashboard page')\n }\n if (tab !== 'pinned' && tab !== 'recents') {\n throw new Error('Invalid dashboard tab')\n }\n\n const key = tab === 'pinned' ? PREFERENCE_KEYS.PINNED_DOCUMENTS : PREFERENCE_KEYS.RECENTLY_VIEWED\n const preference = await req.payload.find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n overrideAccess: false,\n req,\n user: req.user,\n where: { and: [ownerWhere({ req }), { key: { equals: key } }] },\n })\n const excluded = new Set(tab === 'recents' ? excludedCollections : [])\n const storedReferences = getPinnedItems({ value: preference.docs[0]?.value }).filter(\n ({ collectionSlug }) =>\n !excluded.has(collectionSlug) && req.payload.collections[collectionSlug],\n )\n const availableReferences = await getAvailableReferences({ references: storedReferences, req })\n const totalDocs = availableReferences.length\n const lastPage = Math.max(\n 1,\n Math.ceil((totalDocs + Number(tab === 'pinned' && shouldIncludePinPlaceholder)) / limit),\n )\n\n page = Math.min(page, lastPage)\n const references = availableReferences.slice((page - 1) * limit, page * limit)\n\n const documents = await loadDocuments({ references, req })\n const items = references\n .map((reference): RecentDocument | undefined => {\n const document = documents.get(documentKey(reference))\n if (!document || tab !== 'recents') {\n return document\n }\n\n const viewedAt = reference.viewedAt\n\n return {\n ...document,\n dateLabel: viewedAt\n ? formatRelativeDate({\n relativeTimeFormat: getRelativeTimeFormat(req.i18n.language),\n value: viewedAt,\n })\n : undefined,\n dateTime: viewedAt,\n viewedAt,\n }\n })\n .filter((item): item is RecentDocument => Boolean(item))\n\n return { items, page, totalDocs }\n}\n\n/** Check identities without populating documents, so deleted or forbidden references do not create empty pages. */\nasync function getAvailableReferences({\n references,\n req,\n}: {\n references: Reference[]\n req: PayloadRequest\n}): Promise<Reference[]> {\n const available = new Set<string>()\n\n await Promise.all(\n [...groupReferenceIDs({ references }).entries()].map(async ([collectionSlug, ids]) => {\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n disableErrors: true,\n draft: true,\n limit: ids.length,\n overrideAccess: false,\n pagination: false,\n req,\n select: { id: true },\n sort: 'id',\n user: req.user,\n where: { id: { in: ids } },\n })\n\n for (const doc of result.docs) {\n available.add(documentKey({ id: doc.id, collectionSlug }))\n }\n }),\n )\n\n return references.filter((reference) => available.has(documentKey(reference)))\n}\n\nfunction groupReferenceIDs({\n references,\n}: {\n references: Reference[]\n}): Map<string, Array<number | string>> {\n const idsByCollection = new Map<string, Array<number | string>>()\n\n for (const reference of references) {\n const ids = idsByCollection.get(reference.collectionSlug) ?? []\n\n ids.push(reference.id)\n idsByCollection.set(reference.collectionSlug, ids)\n }\n\n return idsByCollection\n}\n\nasync function loadDocuments({\n references,\n req,\n}: {\n references: Reference[]\n req: PayloadRequest\n}): Promise<Map<string, RecentDocument>> {\n const documents = new Map<string, RecentDocument>()\n await Promise.all(\n [...groupReferenceIDs({ references }).entries()].map(async ([collectionSlug, ids]) => {\n const config = req.payload.collections[collectionSlug].config\n const select = getDocumentThumbnailSelect({\n collectionConfig: config,\n select: {\n id: true,\n [(config.admin.useAsTitle || 'id').split('.')[0]]: true,\n _status: true,\n updatedAt: true,\n ...(config.admin.useAsThumbnail ? { [config.admin.useAsThumbnail]: true } : {}),\n ...(config.upload ? { width: true } : {}),\n },\n })\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 1,\n disableErrors: true,\n draft: true,\n limit: ids.length,\n overrideAccess: false,\n populate: getDocumentThumbnailPopulate({\n collectionConfig: config,\n collections: req.payload.config.collections,\n }),\n req,\n select,\n sort: 'id',\n user: req.user,\n where: { id: { in: ids } },\n })\n const enriched = await enrichDocsWithVersionStatus({\n collectionConfig: config,\n data: result,\n req,\n })\n\n for (const doc of enriched.docs as QueryDoc[]) {\n const item = enrichDocument({ collectionSlug, doc, req })\n documents.set(documentKey(item), item)\n }\n }),\n )\n return documents\n}\n\nfunction ownerWhere({ req }: { req: PayloadRequest }): Where {\n return {\n and: [\n { 'user.relationTo': { equals: req.user.collection } },\n { 'user.value': { equals: req.user.id } },\n ],\n }\n}\n\nfunction enrichDocument({\n collectionSlug,\n doc,\n req,\n}: {\n collectionSlug: string\n doc: QueryDoc\n req: PayloadRequest\n}): RecentDocument {\n const { i18n, payload } = req\n const config = payload.collections[collectionSlug].config\n const rawTitle = getValueByPath({ object: doc, path: config.admin?.useAsTitle || 'id' })\n const status = doc._displayStatus || doc._status\n return {\n id: doc.id,\n collectionSlug,\n dateLabel: doc.updatedAt\n ? formatRelativeDate({\n relativeTimeFormat: getRelativeTimeFormat(i18n.language),\n value: doc.updatedAt,\n })\n : undefined,\n dateTime: doc.updatedAt,\n href: formatAdminURL({\n adminRoute: payload.config.routes.admin,\n path: `/collections/${collectionSlug}/${encodeURIComponent(String(doc.id))}`,\n }),\n isChanged: status === 'changed',\n isDraft: status === 'draft',\n statusLabel:\n status === 'draft'\n ? i18n.t('version:draft')\n : status === 'changed'\n ? i18n.t('version:changed')\n : status === 'published'\n ? i18n.t('version:published')\n : undefined,\n thumbnailURL: getDocumentThumbnail({\n doc,\n useAsThumbnail: config.admin?.useAsThumbnail,\n }),\n title: typeof rawTitle === 'string' && rawTitle ? rawTitle : String(doc.id),\n typeLabel: getTranslation(config.labels.plural, i18n),\n updatedAt: doc.updatedAt,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"getDocuments.js","names":["getTranslation","UnauthorizedError","formatAdminURL","PREFERENCE_KEYS","formatRelativeDate","getRelativeTimeFormat","getDocumentThumbnail","getDocumentThumbnailPopulate","getDocumentThumbnailSelect","enrichDocsWithVersionStatus","getPinnedItems","documentKey","getValueByPath","getDashboardDocumentsHandler","getDashboardDocuments","excludedCollections","limit","page","req","shouldIncludePinPlaceholder","tab","user","t","Number","isSafeInteger","Error","key","PINNED_DOCUMENTS","RECENTLY_VIEWED","preference","payload","find","collection","depth","overrideAccess","where","and","ownerWhere","equals","excluded","Set","storedReferences","value","docs","filter","collectionSlug","collections","has","config","admin","group","availableReferences","getAvailableReferences","references","totalDocs","length","lastPage","Math","max","ceil","min","slice","documents","loadDocuments","items","map","reference","document","get","viewedAt","dateLabel","relativeTimeFormat","i18n","language","undefined","dateTime","item","Boolean","available","Promise","all","groupReferenceIDs","entries","ids","result","disableErrors","draft","pagination","select","id","sort","in","doc","add","idsByCollection","Map","push","set","collectionConfig","useAsTitle","split","_status","updatedAt","useAsThumbnail","upload","width","populate","enriched","data","enrichDocument","rawTitle","object","path","status","_displayStatus","href","adminRoute","routes","encodeURIComponent","String","isChanged","isDraft","statusLabel","thumbnailURL","title","typeLabel","labels","plural"],"sources":["../../../src/widgets/RecentlyViewed/getDocuments.ts"],"sourcesContent":["import type { PayloadRequest, ServerFunction, Where } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { UnauthorizedError } from 'payload'\nimport { formatAdminURL, PREFERENCE_KEYS } from 'payload/shared'\n\nimport type { RecentDocument } from './index.client.js'\nimport type { PinnedItem } from './recents.js'\n\nimport { formatRelativeDate, getRelativeTimeFormat } from '../../utilities/formatRelativeDate.js'\nimport { getDocumentThumbnail } from '../../utilities/getDocumentThumbnail.js'\nimport { getDocumentThumbnailPopulate } from '../../utilities/getDocumentThumbnailPopulate.js'\nimport { getDocumentThumbnailSelect } from '../../utilities/getDocumentThumbnailSelect.js'\nimport { enrichDocsWithVersionStatus } from '../../views/List/enrichDocsWithVersionStatus.js'\nimport { getPinnedItems } from './pinnedPreferences.js'\nimport { documentKey, getValueByPath } from './recents.js'\n\nexport type DocumentsTab = 'pinned' | 'recents'\nexport type DocumentsPageArgs = {\n excludedCollections?: string[]\n limit: number\n page: number\n shouldIncludePinPlaceholder?: boolean\n tab: DocumentsTab\n}\nexport type DocumentsPage = {\n items: RecentDocument[]\n page: number\n totalDocs: number\n}\n\ntype Reference = { viewedAt?: string } & PinnedItem\ntype QueryDoc = { id: number | string; updatedAt?: string } & Record<string, unknown>\n\nexport const getDashboardDocumentsHandler: ServerFunction<\n DocumentsPageArgs,\n Promise<DocumentsPage>\n> = getDashboardDocuments\n\nexport async function getDashboardDocuments({\n excludedCollections = [],\n limit,\n page,\n req,\n shouldIncludePinPlaceholder = false,\n tab,\n}: { req: PayloadRequest } & DocumentsPageArgs): Promise<DocumentsPage> {\n if (!req.user) {\n throw new UnauthorizedError(req.t)\n }\n if (\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 100 ||\n !Number.isSafeInteger(page) ||\n page < 1\n ) {\n throw new Error('Invalid dashboard page')\n }\n if (tab !== 'pinned' && tab !== 'recents') {\n throw new Error('Invalid dashboard tab')\n }\n\n const key = tab === 'pinned' ? PREFERENCE_KEYS.PINNED_DOCUMENTS : PREFERENCE_KEYS.RECENTLY_VIEWED\n const preference = await req.payload.find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n overrideAccess: false,\n req,\n user: req.user,\n where: { and: [ownerWhere({ req }), { key: { equals: key } }] },\n })\n const excluded = new Set(tab === 'recents' ? excludedCollections : [])\n const storedReferences = getPinnedItems({ value: preference.docs[0]?.value }).filter(\n ({ collectionSlug }) => {\n const collection = req.payload.collections[collectionSlug]\n\n return !excluded.has(collectionSlug) && collection && collection.config.admin.group !== false\n },\n )\n const availableReferences = await getAvailableReferences({ references: storedReferences, req })\n const totalDocs = availableReferences.length\n const lastPage = Math.max(\n 1,\n Math.ceil((totalDocs + Number(tab === 'pinned' && shouldIncludePinPlaceholder)) / limit),\n )\n\n page = Math.min(page, lastPage)\n const references = availableReferences.slice((page - 1) * limit, page * limit)\n\n const documents = await loadDocuments({ references, req })\n const items = references\n .map((reference): RecentDocument | undefined => {\n const document = documents.get(documentKey(reference))\n if (!document || tab !== 'recents') {\n return document\n }\n\n const viewedAt = reference.viewedAt\n\n return {\n ...document,\n dateLabel: viewedAt\n ? formatRelativeDate({\n relativeTimeFormat: getRelativeTimeFormat(req.i18n.language),\n value: viewedAt,\n })\n : undefined,\n dateTime: viewedAt,\n viewedAt,\n }\n })\n .filter((item): item is RecentDocument => Boolean(item))\n\n return { items, page, totalDocs }\n}\n\n/** Check identities without populating documents, so deleted or forbidden references do not create empty pages. */\nasync function getAvailableReferences({\n references,\n req,\n}: {\n references: Reference[]\n req: PayloadRequest\n}): Promise<Reference[]> {\n const available = new Set<string>()\n\n await Promise.all(\n [...groupReferenceIDs({ references }).entries()].map(async ([collectionSlug, ids]) => {\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n disableErrors: true,\n draft: true,\n limit: ids.length,\n overrideAccess: false,\n pagination: false,\n req,\n select: { id: true },\n sort: 'id',\n user: req.user,\n where: { id: { in: ids } },\n })\n\n for (const doc of result.docs) {\n available.add(documentKey({ id: doc.id, collectionSlug }))\n }\n }),\n )\n\n return references.filter((reference) => available.has(documentKey(reference)))\n}\n\nfunction groupReferenceIDs({\n references,\n}: {\n references: Reference[]\n}): Map<string, Array<number | string>> {\n const idsByCollection = new Map<string, Array<number | string>>()\n\n for (const reference of references) {\n const ids = idsByCollection.get(reference.collectionSlug) ?? []\n\n ids.push(reference.id)\n idsByCollection.set(reference.collectionSlug, ids)\n }\n\n return idsByCollection\n}\n\nasync function loadDocuments({\n references,\n req,\n}: {\n references: Reference[]\n req: PayloadRequest\n}): Promise<Map<string, RecentDocument>> {\n const documents = new Map<string, RecentDocument>()\n await Promise.all(\n [...groupReferenceIDs({ references }).entries()].map(async ([collectionSlug, ids]) => {\n const config = req.payload.collections[collectionSlug].config\n const select = getDocumentThumbnailSelect({\n collectionConfig: config,\n select: {\n id: true,\n [(config.admin.useAsTitle || 'id').split('.')[0]]: true,\n _status: true,\n updatedAt: true,\n ...(config.admin.useAsThumbnail ? { [config.admin.useAsThumbnail]: true } : {}),\n ...(config.upload ? { width: true } : {}),\n },\n })\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 1,\n disableErrors: true,\n draft: true,\n limit: ids.length,\n overrideAccess: false,\n populate: getDocumentThumbnailPopulate({\n collectionConfig: config,\n collections: req.payload.config.collections,\n }),\n req,\n select,\n sort: 'id',\n user: req.user,\n where: { id: { in: ids } },\n })\n const enriched = await enrichDocsWithVersionStatus({\n collectionConfig: config,\n data: result,\n req,\n })\n\n for (const doc of enriched.docs as QueryDoc[]) {\n const item = enrichDocument({ collectionSlug, doc, req })\n documents.set(documentKey(item), item)\n }\n }),\n )\n return documents\n}\n\nfunction ownerWhere({ req }: { req: PayloadRequest }): Where {\n return {\n and: [\n { 'user.relationTo': { equals: req.user.collection } },\n { 'user.value': { equals: req.user.id } },\n ],\n }\n}\n\nfunction enrichDocument({\n collectionSlug,\n doc,\n req,\n}: {\n collectionSlug: string\n doc: QueryDoc\n req: PayloadRequest\n}): RecentDocument {\n const { i18n, payload } = req\n const config = payload.collections[collectionSlug].config\n const rawTitle = getValueByPath({ object: doc, path: config.admin?.useAsTitle || 'id' })\n const status = doc._displayStatus || doc._status\n return {\n id: doc.id,\n collectionSlug,\n dateLabel: doc.updatedAt\n ? formatRelativeDate({\n relativeTimeFormat: getRelativeTimeFormat(i18n.language),\n value: doc.updatedAt,\n })\n : undefined,\n dateTime: doc.updatedAt,\n href: formatAdminURL({\n adminRoute: payload.config.routes.admin,\n path: `/collections/${collectionSlug}/${encodeURIComponent(String(doc.id))}`,\n }),\n isChanged: status === 'changed',\n isDraft: status === 'draft',\n statusLabel:\n status === 'draft'\n ? i18n.t('version:draft')\n : status === 'changed'\n ? i18n.t('version:changed')\n : status === 'published'\n ? i18n.t('version:published')\n : undefined,\n thumbnailURL: getDocumentThumbnail({\n doc,\n useAsThumbnail: config.admin?.useAsThumbnail,\n }),\n title: typeof rawTitle === 'string' && rawTitle ? rawTitle : String(doc.id),\n typeLabel: getTranslation(config.labels.plural, i18n),\n updatedAt: doc.updatedAt,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/widgets/RecentlyViewed/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsD,MAAM,OAAO,CAAA;AAG1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/widgets/RecentlyViewed/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsD,MAAM,OAAO,CAAA;AAG1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAmB9C,OAAO,aAAa,CAAA;AAEpB,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,UAAU,CAAA;AAEd,KAAK,MAAM,GAAG;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,wBAAgB,sBAAsB,CAAC,EACrC,mBAAmB,EACnB,MAAM,EACN,OAAO,GACR,EAAE;IACD,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,qBAqYA"}
|
|
@@ -14,6 +14,7 @@ import { useConfig } from '../../providers/Config/index.js';
|
|
|
14
14
|
import { useEntityVisibility } from '../../providers/EntityVisibility/index.js';
|
|
15
15
|
import { useServerFunctions } from '../../providers/ServerFunctions/index.js';
|
|
16
16
|
import { useTranslation } from '../../providers/Translation/index.js';
|
|
17
|
+
import { isNavEntityVisible } from '../../utilities/isNavEntityVisible.js';
|
|
17
18
|
import { WidgetCard } from '../WidgetCard/index.js';
|
|
18
19
|
import { PinDocumentPicker } from './PinDocumentPicker/index.js';
|
|
19
20
|
import { updatePinnedPreferences } from './pinnedPreferences.js';
|
|
@@ -41,10 +42,14 @@ export function RecentsAndPinnedClient({
|
|
|
41
42
|
serverFunction
|
|
42
43
|
} = useServerFunctions();
|
|
43
44
|
const pinnableCollections = useMemo(() => config.collections.filter(({
|
|
44
|
-
slug
|
|
45
|
+
slug,
|
|
46
|
+
admin
|
|
45
47
|
}) => isEntityVisible({
|
|
46
48
|
collectionSlug: slug
|
|
47
|
-
}) &&
|
|
49
|
+
}) && isNavEntityVisible({
|
|
50
|
+
adminGroup: admin.group,
|
|
51
|
+
entityPermissions: permissions?.collections?.[slug]
|
|
52
|
+
})).map(({
|
|
48
53
|
slug: slug_0
|
|
49
54
|
}) => slug_0), [config.collections, isEntityVisible, permissions]);
|
|
50
55
|
const canAddPin = Boolean(user) && pinnableCollections.length > 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.client.js","names":["React","useEffect","useId","useMemo","useRef","useState","Button","CardGrid","DocumentCard","ChevronIcon","ClockIcon","DocumentIcon","PinIcon","useAuth","useConfig","useEntityVisibility","useServerFunctions","useTranslation","WidgetCard","PinDocumentPicker","updatePinnedPreferences","documentKey","RecentsAndPinnedClient","excludedCollections","labels","pinsURL","permissions","user","t","config","isEntityVisible","serverFunction","pinnableCollections","collections","filter","slug","collectionSlug","read","map","canAddPin","Boolean","length","contentRef","listID","page","setPage","pageSize","setPageSize","pinnedTabRef","recentsTabRef","previousPageRef","nextPageRef","paginationFocusRef","activeTab","setActiveTab","pageResult","setPageResult","items","totalDocs","isLoading","setIsLoading","shouldShowLoading","setShouldShowLoading","isSaving","setIsSaving","saveError","setSaveError","loadError","setLoadError","refresh","setRefresh","shouldIncludePinPlaceholder","totalPages","Math","max","ceil","Number","currentPage","hasAddPinCard","isCurrent","loadingTimeout","setTimeout","name","args","limit","tab","then","result","current","lastPage","requestAnimationFrame","activeTabRef","focus","catch","finally","clearTimeout","element","observedPageSize","observer","ResizeObserver","styles","getComputedStyle","columns","gridTemplateColumns","split","rows","getPropertyValue","nextPageSize","style","setProperty","String","observe","disconnect","emptyMessage","recentsEmpty","pinnedEmpty","emptyDescription","recentsEmptyDescription","pinnedEmptyDescription","removePinnedDocument","item","previous","entry","document","shouldPin","url","value","pinnedSaveError","addSelectedPin","pinDocumentPicker","_jsx","collectionSlugs","isDisabled","isEmpty","onError","onSelect","_jsxs","className","title","role","onClick","ref","type","recents","pinned","pagination","disabled","direction","next","buttonStyle","margin","size","retry","id","ariaLabel","getItemClassName","getKey","renderItem","href","placeholder","thumbnail","thumbnailURL","alt","src","undefined","typeLabel","dateTime","dateLabel","_Fragment","statusLabel","isDraft","isChanged","removePin","isFilled","loading"],"sources":["../../../src/widgets/RecentlyViewed/index.client.tsx"],"sourcesContent":["'use client'\n\nimport React, { useEffect, useId, useMemo, useRef, useState } from 'react'\n\nimport type { DocumentsPage, DocumentsTab } from './getDocuments.js'\nimport type { PinnedItem } from './recents.js'\n\nimport { Button } from '../../elements/Button/index.js'\nimport { CardGrid } from '../../elements/CardGrid/index.js'\nimport { DocumentCard } from '../../elements/DocumentCard/index.js'\nimport { ChevronIcon } from '../../icons/Chevron/index.js'\nimport { ClockIcon } from '../../icons/Clock/index.js'\nimport { DocumentIcon } from '../../icons/Document/index.js'\nimport { PinIcon } from '../../icons/Pin/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useEntityVisibility } from '../../providers/EntityVisibility/index.js'\nimport { useServerFunctions } from '../../providers/ServerFunctions/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { WidgetCard } from '../WidgetCard/index.js'\nimport { PinDocumentPicker } from './PinDocumentPicker/index.js'\nimport { updatePinnedPreferences } from './pinnedPreferences.js'\nimport { documentKey } from './recents.js'\nimport './index.css'\n\nexport type RecentDocument = {\n dateLabel?: string\n dateTime?: string\n href: string\n isChanged?: boolean\n isDraft?: boolean\n statusLabel?: string\n thumbnailURL?: string\n title: string\n typeLabel: string\n updatedAt?: string\n viewedAt?: string\n} & PinnedItem\n\ntype Labels = {\n addPin: string\n loadError: string\n loading: string\n next: string\n pagination: string\n pinned: string\n pinnedEmpty: string\n pinnedEmptyDescription: string\n pinnedSaveError: string\n previous: string\n recents: string\n recentsEmpty: string\n recentsEmptyDescription: string\n removePin: string\n retry: string\n title: string\n}\n\nexport function RecentsAndPinnedClient({\n excludedCollections,\n labels,\n pinsURL,\n}: {\n excludedCollections?: string[]\n labels: Labels\n pinsURL: string\n}) {\n const { permissions, user } = useAuth()\n const { t } = useTranslation()\n const { config } = useConfig()\n const { isEntityVisible } = useEntityVisibility()\n const { serverFunction } = useServerFunctions()\n const pinnableCollections = useMemo(\n () =>\n config.collections\n .filter(\n ({ slug }) =>\n isEntityVisible({ collectionSlug: slug }) && permissions?.collections?.[slug]?.read,\n )\n .map(({ slug }) => slug),\n [config.collections, isEntityVisible, permissions],\n )\n const canAddPin = Boolean(user) && pinnableCollections.length > 0\n const contentRef = useRef<HTMLDivElement>(null)\n const listID = useId()\n const [page, setPage] = useState(1)\n const [pageSize, setPageSize] = useState(0)\n const pinnedTabRef = useRef<HTMLButtonElement>(null)\n const recentsTabRef = useRef<HTMLButtonElement>(null)\n const previousPageRef = useRef<HTMLButtonElement>(null)\n const nextPageRef = useRef<HTMLButtonElement>(null)\n const paginationFocusRef = useRef(false)\n const [activeTab, setActiveTab] = useState<DocumentsTab>('pinned')\n const [pageResult, setPageResult] = useState<DocumentsPage>({ items: [], page: 1, totalDocs: 0 })\n const [isLoading, setIsLoading] = useState(true)\n const [shouldShowLoading, setShouldShowLoading] = useState(false)\n const [isSaving, setIsSaving] = useState(false)\n const [saveError, setSaveError] = useState('')\n const [loadError, setLoadError] = useState('')\n const [refresh, setRefresh] = useState(0)\n const shouldIncludePinPlaceholder = activeTab === 'pinned' && canAddPin\n const totalPages = Math.max(\n 1,\n Math.ceil((pageResult.totalDocs + Number(shouldIncludePinPlaceholder)) / (pageSize || 1)),\n )\n const currentPage = pageResult.page\n const items = pageResult.items\n const hasAddPinCard =\n shouldIncludePinPlaceholder && pageResult.page === totalPages && items.length < pageSize\n\n useEffect(() => {\n if (!pageSize) {\n return\n }\n let isCurrent = true\n setIsLoading(true)\n setShouldShowLoading(false)\n setLoadError('')\n const loadingTimeout = setTimeout(() => setShouldShowLoading(true), 180)\n void (\n serverFunction({\n name: 'get-dashboard-documents',\n args: {\n excludedCollections,\n limit: pageSize,\n page,\n shouldIncludePinPlaceholder,\n tab: activeTab,\n },\n }) as Promise<DocumentsPage>\n )\n .then((result: DocumentsPage) => {\n if (!isCurrent) {\n return\n }\n setPageResult(result)\n setPage(result.page)\n setIsLoading(false)\n if (paginationFocusRef.current) {\n paginationFocusRef.current = false\n const lastPage = Math.max(\n 1,\n Math.ceil((result.totalDocs + Number(shouldIncludePinPlaceholder)) / pageSize),\n )\n requestAnimationFrame(() => {\n if (lastPage === 1) {\n const activeTabRef = activeTab === 'pinned' ? pinnedTabRef : recentsTabRef\n\n activeTabRef.current?.focus()\n } else if (result.page === 1) {\n nextPageRef.current?.focus()\n } else if (result.page === lastPage) {\n previousPageRef.current?.focus()\n }\n })\n }\n })\n .catch(() => {\n if (isCurrent) {\n setIsLoading(false)\n paginationFocusRef.current = false\n setLoadError(labels.loadError)\n }\n })\n .finally(() => clearTimeout(loadingTimeout))\n return () => {\n isCurrent = false\n clearTimeout(loadingTimeout)\n }\n }, [\n activeTab,\n excludedCollections,\n shouldIncludePinPlaceholder,\n labels.loadError,\n page,\n pageSize,\n refresh,\n serverFunction,\n ])\n\n useEffect(() => {\n const element = contentRef.current\n\n if (!element) {\n return\n }\n\n let observedPageSize = 0\n const observer = new ResizeObserver(() => {\n const styles = getComputedStyle(element)\n const columns = styles.gridTemplateColumns.split(' ').length\n const rows = Number(styles.getPropertyValue('--recents-rows'))\n const nextPageSize = columns * rows\n\n element.style.setProperty('--recents-columns', String(columns))\n\n if (nextPageSize !== observedPageSize) {\n observedPageSize = nextPageSize\n setPageSize(nextPageSize)\n setPage(1)\n }\n })\n observer.observe(element)\n\n return () => observer.disconnect()\n }, [])\n\n const emptyMessage = activeTab === 'recents' ? labels.recentsEmpty : labels.pinnedEmpty\n const emptyDescription =\n activeTab === 'recents' ? labels.recentsEmptyDescription : labels.pinnedEmptyDescription\n\n const removePinnedDocument = async ({ item }: { item: RecentDocument }) => {\n if (isSaving || activeTab !== 'pinned') {\n return\n }\n\n const previous = pageResult\n\n setPageResult((current) => ({\n ...current,\n items: current.items.filter((entry) => documentKey(entry) !== documentKey(item)),\n }))\n requestAnimationFrame(() => pinnedTabRef.current?.focus())\n setIsSaving(true)\n setSaveError('')\n\n try {\n await updatePinnedPreferences({ document: item, shouldPin: false, url: pinsURL })\n setRefresh((value) => value + 1)\n } catch {\n setPageResult(previous)\n setSaveError(labels.pinnedSaveError)\n } finally {\n setIsSaving(false)\n }\n }\n\n const addSelectedPin = async ({ document }: { document: PinnedItem }) => {\n if (isSaving) {\n return\n }\n setIsSaving(true)\n setSaveError('')\n\n try {\n await updatePinnedPreferences({ document, shouldPin: true, url: pinsURL })\n setPage(1)\n setRefresh((value) => value + 1)\n } catch {\n setSaveError(labels.pinnedSaveError)\n } finally {\n setIsSaving(false)\n requestAnimationFrame(() => pinnedTabRef.current?.focus())\n }\n }\n\n const pinDocumentPicker = canAddPin ? (\n <PinDocumentPicker\n collectionSlugs={pinnableCollections}\n isDisabled={isLoading || isSaving}\n isEmpty={pageResult.totalDocs === 0}\n labels={labels}\n onError={() => setSaveError(labels.pinnedSaveError)}\n onSelect={(args) => void addSelectedPin(args)}\n pinsURL={pinsURL}\n />\n ) : null\n\n return (\n <WidgetCard className=\"recently-viewed-widget recents-widget\" title={labels.title}>\n <div className=\"recents-widget__toolbar\">\n <div aria-label={labels.title} className=\"recents-widget__tabs\" role=\"group\">\n {(['pinned', 'recents'] as const).map((tab) => (\n <button\n aria-pressed={activeTab === tab}\n className=\"recents-widget__tab\"\n key={tab}\n onClick={() => {\n if (isSaving) {\n return\n }\n if (activeTab === tab && page === 1) {\n if (loadError) {\n setRefresh((value) => value + 1)\n }\n return\n }\n setPageResult({ items: [], page: 1, totalDocs: 0 })\n setIsLoading(true)\n setActiveTab(tab)\n setPage(1)\n }}\n ref={tab === 'pinned' ? pinnedTabRef : recentsTabRef}\n type=\"button\"\n >\n {tab === 'recents' ? labels.recents : labels.pinned}\n </button>\n ))}\n </div>\n {totalPages > 1 ? (\n <div aria-label={labels.pagination} className=\"recents-widget__pagination\" role=\"group\">\n <button\n aria-controls={listID}\n aria-disabled={isLoading || isSaving}\n aria-label={labels.previous}\n className=\"recents-widget__previous\"\n disabled={currentPage === 1}\n onClick={() => {\n if (isLoading || isSaving) {\n return\n }\n paginationFocusRef.current = true\n setPage(currentPage - 1)\n }}\n ref={previousPageRef}\n type=\"button\"\n >\n <span aria-hidden=\"true\">\n <ChevronIcon direction=\"left\" />\n </span>\n </button>\n <span aria-atomic=\"true\" aria-live=\"polite\" className=\"recents-widget__page-status\">\n {t('dashboard:widgetPageCount', { currentPage, totalPages })}\n </span>\n <button\n aria-controls={listID}\n aria-disabled={isLoading || isSaving}\n aria-label={labels.next}\n className=\"recents-widget__next\"\n disabled={currentPage === totalPages}\n onClick={() => {\n if (isLoading || isSaving) {\n return\n }\n paginationFocusRef.current = true\n setPage(currentPage + 1)\n }}\n ref={nextPageRef}\n type=\"button\"\n >\n <span aria-hidden=\"true\">\n <ChevronIcon direction=\"right\" />\n </span>\n </button>\n </div>\n ) : null}\n </div>\n <div aria-busy={isLoading} className=\"recents-widget__viewport\" ref={contentRef}>\n {loadError ? (\n <div className=\"recents-widget__error\">\n <span>{loadError}</span>\n <Button\n buttonStyle=\"secondary\"\n margin={false}\n onClick={() => {\n const activeTabRef = activeTab === 'pinned' ? pinnedTabRef : recentsTabRef\n\n activeTabRef.current?.focus()\n setRefresh((value) => value + 1)\n }}\n size=\"medium\"\n type=\"button\"\n >\n {labels.retry}\n </Button>\n </div>\n ) : items.length || (hasAddPinCard && !isLoading) ? (\n <div className=\"recents-widget__content\" id={listID}>\n <CardGrid<null | RecentDocument>\n ariaLabel={activeTab === 'pinned' ? labels.pinned : labels.recents}\n className=\"recents-widget__items recents-widget__items--grid\"\n getItemClassName={(item) =>\n item\n ? 'recents-widget__item'\n : `recents-widget__item recents-widget__item--add-pin${pageResult.totalDocs === 0 ? ' recents-widget__item--empty' : ''}`\n }\n getKey={(item) => (item ? documentKey(item) : 'add-pin')}\n items={hasAddPinCard ? [...items, null] : items}\n renderItem={(item) =>\n item ? (\n <DocumentCard\n href={item.href}\n placeholder={<DocumentIcon />}\n thumbnail={item.thumbnailURL ? { alt: '', src: item.thumbnailURL } : undefined}\n title={item.title}\n >\n <div className=\"recents-widget__meta\">\n {item.typeLabel}\n {item.dateTime && item.dateLabel ? (\n <>\n {' · '}\n <time dateTime={item.dateTime}>{item.dateLabel}</time>\n </>\n ) : null}\n </div>\n {item.statusLabel ? (\n <span\n className={`recents-widget__status-pill${item.isDraft ? ' recents-widget__status-pill--draft' : item.isChanged ? ' recents-widget__status-pill--changed' : ''}`}\n >\n {item.statusLabel}\n </span>\n ) : null}\n {activeTab === 'pinned' ? (\n <button\n aria-label={`${labels.removePin}: ${item.title}`}\n aria-pressed={true}\n className=\"recents-widget__pin\"\n disabled={isSaving || isLoading}\n onClick={() => void removePinnedDocument({ item })}\n type=\"button\"\n >\n <span aria-hidden=\"true\" className=\"recents-widget__pin-icon\">\n <PinIcon isFilled />\n </span>\n </button>\n ) : null}\n </DocumentCard>\n ) : (\n pinDocumentPicker\n )\n }\n />\n </div>\n ) : isLoading ? null : (\n <div aria-live=\"polite\" className=\"recents-widget__empty\">\n <span\n aria-hidden=\"true\"\n className={`recents-widget__empty-icon recents-widget__empty-icon--${activeTab}`}\n >\n {activeTab === 'pinned' ? <PinIcon /> : <ClockIcon />}\n </span>\n <span className=\"recents-widget__empty-text\">\n <span className=\"recents-widget__empty-title\">{emptyMessage}</span>\n <span className=\"recents-widget__empty-description\">{emptyDescription}</span>\n </span>\n </div>\n )}\n {saveError && !loadError ? (\n <span aria-hidden=\"true\" className=\"recents-widget__save-error\">\n {saveError}\n </span>\n ) : null}\n <span aria-hidden=\"true\" className=\"recents-widget__loading\">\n {isLoading && shouldShowLoading ? <span>{labels.loading}</span> : null}\n </span>\n </div>\n <span aria-live=\"polite\" className=\"recents-widget__status sr-only\">\n {saveError || loadError || (isLoading && shouldShowLoading ? labels.loading : '')}\n </span>\n </WidgetCard>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.client.js","names":["React","useEffect","useId","useMemo","useRef","useState","Button","CardGrid","DocumentCard","ChevronIcon","ClockIcon","DocumentIcon","PinIcon","useAuth","useConfig","useEntityVisibility","useServerFunctions","useTranslation","isNavEntityVisible","WidgetCard","PinDocumentPicker","updatePinnedPreferences","documentKey","RecentsAndPinnedClient","excludedCollections","labels","pinsURL","permissions","user","t","config","isEntityVisible","serverFunction","pinnableCollections","collections","filter","slug","admin","collectionSlug","adminGroup","group","entityPermissions","map","canAddPin","Boolean","length","contentRef","listID","page","setPage","pageSize","setPageSize","pinnedTabRef","recentsTabRef","previousPageRef","nextPageRef","paginationFocusRef","activeTab","setActiveTab","pageResult","setPageResult","items","totalDocs","isLoading","setIsLoading","shouldShowLoading","setShouldShowLoading","isSaving","setIsSaving","saveError","setSaveError","loadError","setLoadError","refresh","setRefresh","shouldIncludePinPlaceholder","totalPages","Math","max","ceil","Number","currentPage","hasAddPinCard","isCurrent","loadingTimeout","setTimeout","name","args","limit","tab","then","result","current","lastPage","requestAnimationFrame","activeTabRef","focus","catch","finally","clearTimeout","element","observedPageSize","observer","ResizeObserver","styles","getComputedStyle","columns","gridTemplateColumns","split","rows","getPropertyValue","nextPageSize","style","setProperty","String","observe","disconnect","emptyMessage","recentsEmpty","pinnedEmpty","emptyDescription","recentsEmptyDescription","pinnedEmptyDescription","removePinnedDocument","item","previous","entry","document","shouldPin","url","value","pinnedSaveError","addSelectedPin","pinDocumentPicker","_jsx","collectionSlugs","isDisabled","isEmpty","onError","onSelect","_jsxs","className","title","role","onClick","ref","type","recents","pinned","pagination","disabled","direction","next","buttonStyle","margin","size","retry","id","ariaLabel","getItemClassName","getKey","renderItem","href","placeholder","thumbnail","thumbnailURL","alt","src","undefined","typeLabel","dateTime","dateLabel","_Fragment","statusLabel","isDraft","isChanged","removePin","isFilled","loading"],"sources":["../../../src/widgets/RecentlyViewed/index.client.tsx"],"sourcesContent":["'use client'\n\nimport React, { useEffect, useId, useMemo, useRef, useState } from 'react'\n\nimport type { DocumentsPage, DocumentsTab } from './getDocuments.js'\nimport type { PinnedItem } from './recents.js'\n\nimport { Button } from '../../elements/Button/index.js'\nimport { CardGrid } from '../../elements/CardGrid/index.js'\nimport { DocumentCard } from '../../elements/DocumentCard/index.js'\nimport { ChevronIcon } from '../../icons/Chevron/index.js'\nimport { ClockIcon } from '../../icons/Clock/index.js'\nimport { DocumentIcon } from '../../icons/Document/index.js'\nimport { PinIcon } from '../../icons/Pin/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useEntityVisibility } from '../../providers/EntityVisibility/index.js'\nimport { useServerFunctions } from '../../providers/ServerFunctions/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { isNavEntityVisible } from '../../utilities/isNavEntityVisible.js'\nimport { WidgetCard } from '../WidgetCard/index.js'\nimport { PinDocumentPicker } from './PinDocumentPicker/index.js'\nimport { updatePinnedPreferences } from './pinnedPreferences.js'\nimport { documentKey } from './recents.js'\nimport './index.css'\n\nexport type RecentDocument = {\n dateLabel?: string\n dateTime?: string\n href: string\n isChanged?: boolean\n isDraft?: boolean\n statusLabel?: string\n thumbnailURL?: string\n title: string\n typeLabel: string\n updatedAt?: string\n viewedAt?: string\n} & PinnedItem\n\ntype Labels = {\n addPin: string\n loadError: string\n loading: string\n next: string\n pagination: string\n pinned: string\n pinnedEmpty: string\n pinnedEmptyDescription: string\n pinnedSaveError: string\n previous: string\n recents: string\n recentsEmpty: string\n recentsEmptyDescription: string\n removePin: string\n retry: string\n title: string\n}\n\nexport function RecentsAndPinnedClient({\n excludedCollections,\n labels,\n pinsURL,\n}: {\n excludedCollections?: string[]\n labels: Labels\n pinsURL: string\n}) {\n const { permissions, user } = useAuth()\n const { t } = useTranslation()\n const { config } = useConfig()\n const { isEntityVisible } = useEntityVisibility()\n const { serverFunction } = useServerFunctions()\n const pinnableCollections = useMemo(\n () =>\n config.collections\n .filter(\n ({ slug, admin }) =>\n isEntityVisible({ collectionSlug: slug }) &&\n isNavEntityVisible({\n adminGroup: admin.group,\n entityPermissions: permissions?.collections?.[slug],\n }),\n )\n .map(({ slug }) => slug),\n [config.collections, isEntityVisible, permissions],\n )\n const canAddPin = Boolean(user) && pinnableCollections.length > 0\n const contentRef = useRef<HTMLDivElement>(null)\n const listID = useId()\n const [page, setPage] = useState(1)\n const [pageSize, setPageSize] = useState(0)\n const pinnedTabRef = useRef<HTMLButtonElement>(null)\n const recentsTabRef = useRef<HTMLButtonElement>(null)\n const previousPageRef = useRef<HTMLButtonElement>(null)\n const nextPageRef = useRef<HTMLButtonElement>(null)\n const paginationFocusRef = useRef(false)\n const [activeTab, setActiveTab] = useState<DocumentsTab>('pinned')\n const [pageResult, setPageResult] = useState<DocumentsPage>({ items: [], page: 1, totalDocs: 0 })\n const [isLoading, setIsLoading] = useState(true)\n const [shouldShowLoading, setShouldShowLoading] = useState(false)\n const [isSaving, setIsSaving] = useState(false)\n const [saveError, setSaveError] = useState('')\n const [loadError, setLoadError] = useState('')\n const [refresh, setRefresh] = useState(0)\n const shouldIncludePinPlaceholder = activeTab === 'pinned' && canAddPin\n const totalPages = Math.max(\n 1,\n Math.ceil((pageResult.totalDocs + Number(shouldIncludePinPlaceholder)) / (pageSize || 1)),\n )\n const currentPage = pageResult.page\n const items = pageResult.items\n const hasAddPinCard =\n shouldIncludePinPlaceholder && pageResult.page === totalPages && items.length < pageSize\n\n useEffect(() => {\n if (!pageSize) {\n return\n }\n let isCurrent = true\n setIsLoading(true)\n setShouldShowLoading(false)\n setLoadError('')\n const loadingTimeout = setTimeout(() => setShouldShowLoading(true), 180)\n void (\n serverFunction({\n name: 'get-dashboard-documents',\n args: {\n excludedCollections,\n limit: pageSize,\n page,\n shouldIncludePinPlaceholder,\n tab: activeTab,\n },\n }) as Promise<DocumentsPage>\n )\n .then((result: DocumentsPage) => {\n if (!isCurrent) {\n return\n }\n setPageResult(result)\n setPage(result.page)\n setIsLoading(false)\n if (paginationFocusRef.current) {\n paginationFocusRef.current = false\n const lastPage = Math.max(\n 1,\n Math.ceil((result.totalDocs + Number(shouldIncludePinPlaceholder)) / pageSize),\n )\n requestAnimationFrame(() => {\n if (lastPage === 1) {\n const activeTabRef = activeTab === 'pinned' ? pinnedTabRef : recentsTabRef\n\n activeTabRef.current?.focus()\n } else if (result.page === 1) {\n nextPageRef.current?.focus()\n } else if (result.page === lastPage) {\n previousPageRef.current?.focus()\n }\n })\n }\n })\n .catch(() => {\n if (isCurrent) {\n setIsLoading(false)\n paginationFocusRef.current = false\n setLoadError(labels.loadError)\n }\n })\n .finally(() => clearTimeout(loadingTimeout))\n return () => {\n isCurrent = false\n clearTimeout(loadingTimeout)\n }\n }, [\n activeTab,\n excludedCollections,\n shouldIncludePinPlaceholder,\n labels.loadError,\n page,\n pageSize,\n refresh,\n serverFunction,\n ])\n\n useEffect(() => {\n const element = contentRef.current\n\n if (!element) {\n return\n }\n\n let observedPageSize = 0\n const observer = new ResizeObserver(() => {\n const styles = getComputedStyle(element)\n const columns = styles.gridTemplateColumns.split(' ').length\n const rows = Number(styles.getPropertyValue('--recents-rows'))\n const nextPageSize = columns * rows\n\n element.style.setProperty('--recents-columns', String(columns))\n\n if (nextPageSize !== observedPageSize) {\n observedPageSize = nextPageSize\n setPageSize(nextPageSize)\n setPage(1)\n }\n })\n observer.observe(element)\n\n return () => observer.disconnect()\n }, [])\n\n const emptyMessage = activeTab === 'recents' ? labels.recentsEmpty : labels.pinnedEmpty\n const emptyDescription =\n activeTab === 'recents' ? labels.recentsEmptyDescription : labels.pinnedEmptyDescription\n\n const removePinnedDocument = async ({ item }: { item: RecentDocument }) => {\n if (isSaving || activeTab !== 'pinned') {\n return\n }\n\n const previous = pageResult\n\n setPageResult((current) => ({\n ...current,\n items: current.items.filter((entry) => documentKey(entry) !== documentKey(item)),\n }))\n requestAnimationFrame(() => pinnedTabRef.current?.focus())\n setIsSaving(true)\n setSaveError('')\n\n try {\n await updatePinnedPreferences({ document: item, shouldPin: false, url: pinsURL })\n setRefresh((value) => value + 1)\n } catch {\n setPageResult(previous)\n setSaveError(labels.pinnedSaveError)\n } finally {\n setIsSaving(false)\n }\n }\n\n const addSelectedPin = async ({ document }: { document: PinnedItem }) => {\n if (isSaving) {\n return\n }\n setIsSaving(true)\n setSaveError('')\n\n try {\n await updatePinnedPreferences({ document, shouldPin: true, url: pinsURL })\n setPage(1)\n setRefresh((value) => value + 1)\n } catch {\n setSaveError(labels.pinnedSaveError)\n } finally {\n setIsSaving(false)\n requestAnimationFrame(() => pinnedTabRef.current?.focus())\n }\n }\n\n const pinDocumentPicker = canAddPin ? (\n <PinDocumentPicker\n collectionSlugs={pinnableCollections}\n isDisabled={isLoading || isSaving}\n isEmpty={pageResult.totalDocs === 0}\n labels={labels}\n onError={() => setSaveError(labels.pinnedSaveError)}\n onSelect={(args) => void addSelectedPin(args)}\n pinsURL={pinsURL}\n />\n ) : null\n\n return (\n <WidgetCard className=\"recently-viewed-widget recents-widget\" title={labels.title}>\n <div className=\"recents-widget__toolbar\">\n <div aria-label={labels.title} className=\"recents-widget__tabs\" role=\"group\">\n {(['pinned', 'recents'] as const).map((tab) => (\n <button\n aria-pressed={activeTab === tab}\n className=\"recents-widget__tab\"\n key={tab}\n onClick={() => {\n if (isSaving) {\n return\n }\n if (activeTab === tab && page === 1) {\n if (loadError) {\n setRefresh((value) => value + 1)\n }\n return\n }\n setPageResult({ items: [], page: 1, totalDocs: 0 })\n setIsLoading(true)\n setActiveTab(tab)\n setPage(1)\n }}\n ref={tab === 'pinned' ? pinnedTabRef : recentsTabRef}\n type=\"button\"\n >\n {tab === 'recents' ? labels.recents : labels.pinned}\n </button>\n ))}\n </div>\n {totalPages > 1 ? (\n <div aria-label={labels.pagination} className=\"recents-widget__pagination\" role=\"group\">\n <button\n aria-controls={listID}\n aria-disabled={isLoading || isSaving}\n aria-label={labels.previous}\n className=\"recents-widget__previous\"\n disabled={currentPage === 1}\n onClick={() => {\n if (isLoading || isSaving) {\n return\n }\n paginationFocusRef.current = true\n setPage(currentPage - 1)\n }}\n ref={previousPageRef}\n type=\"button\"\n >\n <span aria-hidden=\"true\">\n <ChevronIcon direction=\"left\" />\n </span>\n </button>\n <span aria-atomic=\"true\" aria-live=\"polite\" className=\"recents-widget__page-status\">\n {t('dashboard:widgetPageCount', { currentPage, totalPages })}\n </span>\n <button\n aria-controls={listID}\n aria-disabled={isLoading || isSaving}\n aria-label={labels.next}\n className=\"recents-widget__next\"\n disabled={currentPage === totalPages}\n onClick={() => {\n if (isLoading || isSaving) {\n return\n }\n paginationFocusRef.current = true\n setPage(currentPage + 1)\n }}\n ref={nextPageRef}\n type=\"button\"\n >\n <span aria-hidden=\"true\">\n <ChevronIcon direction=\"right\" />\n </span>\n </button>\n </div>\n ) : null}\n </div>\n <div aria-busy={isLoading} className=\"recents-widget__viewport\" ref={contentRef}>\n {loadError ? (\n <div className=\"recents-widget__error\">\n <span>{loadError}</span>\n <Button\n buttonStyle=\"secondary\"\n margin={false}\n onClick={() => {\n const activeTabRef = activeTab === 'pinned' ? pinnedTabRef : recentsTabRef\n\n activeTabRef.current?.focus()\n setRefresh((value) => value + 1)\n }}\n size=\"medium\"\n type=\"button\"\n >\n {labels.retry}\n </Button>\n </div>\n ) : items.length || (hasAddPinCard && !isLoading) ? (\n <div className=\"recents-widget__content\" id={listID}>\n <CardGrid<null | RecentDocument>\n ariaLabel={activeTab === 'pinned' ? labels.pinned : labels.recents}\n className=\"recents-widget__items recents-widget__items--grid\"\n getItemClassName={(item) =>\n item\n ? 'recents-widget__item'\n : `recents-widget__item recents-widget__item--add-pin${pageResult.totalDocs === 0 ? ' recents-widget__item--empty' : ''}`\n }\n getKey={(item) => (item ? documentKey(item) : 'add-pin')}\n items={hasAddPinCard ? [...items, null] : items}\n renderItem={(item) =>\n item ? (\n <DocumentCard\n href={item.href}\n placeholder={<DocumentIcon />}\n thumbnail={item.thumbnailURL ? { alt: '', src: item.thumbnailURL } : undefined}\n title={item.title}\n >\n <div className=\"recents-widget__meta\">\n {item.typeLabel}\n {item.dateTime && item.dateLabel ? (\n <>\n {' · '}\n <time dateTime={item.dateTime}>{item.dateLabel}</time>\n </>\n ) : null}\n </div>\n {item.statusLabel ? (\n <span\n className={`recents-widget__status-pill${item.isDraft ? ' recents-widget__status-pill--draft' : item.isChanged ? ' recents-widget__status-pill--changed' : ''}`}\n >\n {item.statusLabel}\n </span>\n ) : null}\n {activeTab === 'pinned' ? (\n <button\n aria-label={`${labels.removePin}: ${item.title}`}\n aria-pressed={true}\n className=\"recents-widget__pin\"\n disabled={isSaving || isLoading}\n onClick={() => void removePinnedDocument({ item })}\n type=\"button\"\n >\n <span aria-hidden=\"true\" className=\"recents-widget__pin-icon\">\n <PinIcon isFilled />\n </span>\n </button>\n ) : null}\n </DocumentCard>\n ) : (\n pinDocumentPicker\n )\n }\n />\n </div>\n ) : isLoading ? null : (\n <div aria-live=\"polite\" className=\"recents-widget__empty\">\n <span\n aria-hidden=\"true\"\n className={`recents-widget__empty-icon recents-widget__empty-icon--${activeTab}`}\n >\n {activeTab === 'pinned' ? <PinIcon /> : <ClockIcon />}\n </span>\n <span className=\"recents-widget__empty-text\">\n <span className=\"recents-widget__empty-title\">{emptyMessage}</span>\n <span className=\"recents-widget__empty-description\">{emptyDescription}</span>\n </span>\n </div>\n )}\n {saveError && !loadError ? (\n <span aria-hidden=\"true\" className=\"recents-widget__save-error\">\n {saveError}\n </span>\n ) : null}\n <span aria-hidden=\"true\" className=\"recents-widget__loading\">\n {isLoading && shouldShowLoading ? <span>{labels.loading}</span> : null}\n </span>\n </div>\n <span aria-live=\"polite\" className=\"recents-widget__status sr-only\">\n {saveError || loadError || (isLoading && shouldShowLoading ? labels.loading : '')}\n </span>\n </WidgetCard>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|