@payloadcms/ui 3.47.0-internal.b17506e → 3.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/ArrayAction/index.d.ts +2 -0
- package/dist/elements/ArrayAction/index.d.ts.map +1 -1
- package/dist/elements/ArrayAction/index.js +37 -13
- package/dist/elements/ArrayAction/index.js.map +1 -1
- package/dist/elements/ClipboardAction/ClipboardActionLabel.d.ts +5 -0
- package/dist/elements/ClipboardAction/ClipboardActionLabel.d.ts.map +1 -0
- package/dist/elements/ClipboardAction/ClipboardActionLabel.js +44 -0
- package/dist/elements/ClipboardAction/ClipboardActionLabel.js.map +1 -0
- package/dist/elements/ClipboardAction/clipboardUtilities.d.ts +10 -0
- package/dist/elements/ClipboardAction/clipboardUtilities.d.ts.map +1 -0
- package/dist/elements/ClipboardAction/clipboardUtilities.js +53 -0
- package/dist/elements/ClipboardAction/clipboardUtilities.js.map +1 -0
- package/dist/elements/ClipboardAction/index.d.ts +21 -0
- package/dist/elements/ClipboardAction/index.d.ts.map +1 -0
- package/dist/elements/ClipboardAction/index.js +197 -0
- package/dist/elements/ClipboardAction/index.js.map +1 -0
- package/dist/elements/ClipboardAction/isClipboardDataValid.d.ts +10 -0
- package/dist/elements/ClipboardAction/isClipboardDataValid.d.ts.map +1 -0
- package/dist/elements/ClipboardAction/isClipboardDataValid.js +86 -0
- package/dist/elements/ClipboardAction/isClipboardDataValid.js.map +1 -0
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts +14 -0
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -0
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +100 -0
- package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -0
- package/dist/elements/ClipboardAction/types.d.ts +45 -0
- package/dist/elements/ClipboardAction/types.d.ts.map +1 -0
- package/dist/elements/ClipboardAction/types.js +2 -0
- package/dist/elements/ClipboardAction/types.js.map +1 -0
- package/dist/elements/DatePicker/index.scss +18 -0
- package/dist/elements/PublishButton/ScheduleDrawer/index.d.ts.map +1 -1
- package/dist/elements/PublishButton/ScheduleDrawer/index.js +10 -1
- package/dist/elements/PublishButton/ScheduleDrawer/index.js.map +1 -1
- package/dist/elements/ReactSelect/ClearIndicator/index.scss +1 -0
- package/dist/elements/ReactSelect/DropdownIndicator/index.scss +1 -0
- package/dist/exports/client/index.js +22 -22
- package/dist/exports/client/index.js.map +4 -4
- package/dist/exports/shared/index.js +2 -2
- package/dist/exports/shared/index.js.map +4 -4
- package/dist/fields/Array/ArrayRow.d.ts +2 -0
- package/dist/fields/Array/ArrayRow.d.ts.map +1 -1
- package/dist/fields/Array/ArrayRow.js +49 -43
- package/dist/fields/Array/ArrayRow.js.map +1 -1
- package/dist/fields/Array/index.d.ts.map +1 -1
- package/dist/fields/Array/index.js +176 -43
- package/dist/fields/Array/index.js.map +1 -1
- package/dist/fields/Array/index.scss +17 -3
- package/dist/fields/Blocks/BlockRow.d.ts +2 -0
- package/dist/fields/Blocks/BlockRow.d.ts.map +1 -1
- package/dist/fields/Blocks/BlockRow.js +41 -35
- package/dist/fields/Blocks/BlockRow.js.map +1 -1
- package/dist/fields/Blocks/RowActions.d.ts +2 -0
- package/dist/fields/Blocks/RowActions.d.ts.map +1 -1
- package/dist/fields/Blocks/RowActions.js +32 -26
- package/dist/fields/Blocks/RowActions.js.map +1 -1
- package/dist/fields/Blocks/index.d.ts.map +1 -1
- package/dist/fields/Blocks/index.js +295 -348
- package/dist/fields/Blocks/index.js.map +1 -1
- package/dist/fields/Hidden/index.js +19 -17
- package/dist/fields/Hidden/index.js.map +1 -1
- package/dist/forms/useField/index.d.ts.map +1 -1
- package/dist/forms/useField/index.js +1 -2
- package/dist/forms/useField/index.js.map +1 -1
- package/dist/providers/LivePreview/index.d.ts +1 -1
- package/dist/providers/LivePreview/index.d.ts.map +1 -1
- package/dist/providers/LivePreview/index.js +1 -2
- package/dist/providers/LivePreview/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utilities/buildFormState.js +1 -1
- package/dist/utilities/buildFormState.js.map +1 -1
- package/dist/utilities/buildTableState.js +1 -0
- package/dist/utilities/buildTableState.js.map +1 -1
- package/dist/utilities/formatDocTitle/formatRelationshipTitle.d.ts +2 -0
- package/dist/utilities/formatDocTitle/formatRelationshipTitle.d.ts.map +1 -0
- package/dist/utilities/formatDocTitle/formatRelationshipTitle.js +15 -0
- package/dist/utilities/formatDocTitle/formatRelationshipTitle.js.map +1 -0
- package/dist/utilities/formatDocTitle/index.d.ts.map +1 -1
- package/dist/utilities/formatDocTitle/index.js +6 -0
- package/dist/utilities/formatDocTitle/index.js.map +1 -1
- package/dist/views/Edit/Auth/APIKey.d.ts.map +1 -1
- package/dist/views/Edit/Auth/APIKey.js +27 -10
- package/dist/views/Edit/Auth/APIKey.js.map +1 -1
- package/dist/views/Edit/Auth/index.scss +31 -5
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildFormState.js","names":["formatErrors","getSelectMode","reduceFieldsToValues","fieldSchemasToFormState","renderField","getClientConfig","getClientSchemaMap","getSchemaMap","handleFormStateLocking","buildFormStateHandler","args","req","incomingUserSlug","user","collection","adminUserSlug","payload","config","admin","adminAccessFunction","collections","access","canAccessAdmin","Error","hasUsers","find","depth","limit","pagination","docs","length","res","buildFormState","err","logger","error","msg","message","id","idFromArgs","collectionSlug","data","incomingData","docPermissions","docPreferences","documentFormState","formState","globalSlug","initialBlockData","initialBlockFormState","mockRSCs","operation","renderAllFields","i18n","returnLockStatus","schemaPath","select","skipValidation","updateLastEdited","selectMode","undefined","schemaMap","clientSchemaMap","importMap","fieldOrEntityConfig","get","fields","type","documentData","blockData","Array","isArray","formStateResult","clientFieldSchemaMap","fieldSchemaMap","permissions","preferences","previousFormState","renderFieldFn","upload","file","lockedStateResult","lockedState","state"],"sources":["../../src/utilities/buildFormState.ts"],"sourcesContent":["import type {\n BuildFormStateArgs,\n ClientConfig,\n ClientUser,\n ErrorResult,\n FormState,\n ServerFunction,\n} from 'payload'\n\nimport { formatErrors } from 'payload'\nimport { getSelectMode, reduceFieldsToValues } from 'payload/shared'\n\nimport { fieldSchemasToFormState } from '../forms/fieldSchemasToFormState/index.js'\nimport { renderField } from '../forms/fieldSchemasToFormState/renderField.js'\nimport { getClientConfig } from './getClientConfig.js'\nimport { getClientSchemaMap } from './getClientSchemaMap.js'\nimport { getSchemaMap } from './getSchemaMap.js'\nimport { handleFormStateLocking } from './handleFormStateLocking.js'\n\nexport type LockedState = {\n isLocked: boolean\n lastEditedAt: string\n user: ClientUser | number | string\n}\n\ntype BuildFormStateSuccessResult = {\n clientConfig?: ClientConfig\n errors?: never\n indexPath?: string\n lockedState?: LockedState\n state: FormState\n}\n\ntype BuildFormStateErrorResult = {\n lockedState?: never\n state?: never\n} & (\n | {\n message: string\n }\n | ErrorResult\n)\n\nexport type BuildFormStateResult = BuildFormStateErrorResult | BuildFormStateSuccessResult\n\nexport const buildFormStateHandler: ServerFunction<\n BuildFormStateArgs,\n Promise<BuildFormStateResult>\n> = async (args) => {\n const { req } = args\n\n const incomingUserSlug = req.user?.collection\n const adminUserSlug = req.payload.config.admin.user\n\n try {\n // If we have a user slug, test it against the functions\n if (incomingUserSlug) {\n const adminAccessFunction = req.payload.collections[incomingUserSlug].config.access?.admin\n\n // Run the admin access function from the config if it exists\n if (adminAccessFunction) {\n const canAccessAdmin = await adminAccessFunction({ req })\n\n if (!canAccessAdmin) {\n throw new Error('Unauthorized')\n }\n // Match the user collection to the global admin config\n } else if (adminUserSlug !== incomingUserSlug) {\n throw new Error('Unauthorized')\n }\n } else {\n const hasUsers = await req.payload.find({\n collection: adminUserSlug,\n depth: 0,\n limit: 1,\n pagination: false,\n })\n\n // If there are users, we should not allow access because of /create-first-user\n if (hasUsers.docs.length) {\n throw new Error('Unauthorized')\n }\n }\n\n const res = await buildFormState(args)\n return res\n } catch (err) {\n req.payload.logger.error({ err, msg: `There was an error building form state` })\n\n if (err.message === 'Could not find field schema for given path') {\n return {\n message: err.message,\n }\n }\n\n if (err.message === 'Unauthorized') {\n return null\n }\n\n return formatErrors(err)\n }\n}\n\nexport const buildFormState = async (\n args: BuildFormStateArgs,\n): Promise<BuildFormStateSuccessResult> => {\n const {\n id: idFromArgs,\n collectionSlug,\n data: incomingData,\n docPermissions,\n docPreferences,\n documentFormState,\n formState,\n globalSlug,\n initialBlockData,\n initialBlockFormState,\n mockRSCs,\n operation,\n renderAllFields,\n req,\n req: {\n i18n,\n payload,\n payload: { config },\n },\n returnLockStatus,\n schemaPath = collectionSlug || globalSlug,\n select,\n skipValidation,\n updateLastEdited,\n } = args\n\n const selectMode = select ? getSelectMode(select) : undefined\n\n let data = incomingData\n\n if (!collectionSlug && !globalSlug) {\n throw new Error('Either collectionSlug or globalSlug must be provided')\n }\n\n const schemaMap = getSchemaMap({\n collectionSlug,\n config,\n globalSlug,\n i18n,\n })\n\n const clientSchemaMap = getClientSchemaMap({\n collectionSlug,\n config: getClientConfig({ config, i18n, importMap: req.payload.importMap }),\n globalSlug,\n i18n,\n payload,\n schemaMap,\n })\n\n const id = collectionSlug ? idFromArgs : undefined\n const fieldOrEntityConfig = schemaMap.get(schemaPath)\n\n if (!fieldOrEntityConfig) {\n throw new Error(`Could not find \"${schemaPath}\" in the fieldSchemaMap`)\n }\n\n if (\n (!('fields' in fieldOrEntityConfig) ||\n !fieldOrEntityConfig.fields ||\n !fieldOrEntityConfig.fields.length) &&\n 'type' in fieldOrEntityConfig &&\n fieldOrEntityConfig.type !== 'blocks'\n ) {\n throw new Error(\n `The field found in fieldSchemaMap for \"${schemaPath}\" does not contain any subfields.`,\n )\n }\n\n // If there is a form state,\n // then we can deduce data from that form state\n if (formState) {\n data = reduceFieldsToValues(formState, true)\n }\n\n let documentData = undefined\n if (documentFormState) {\n documentData = reduceFieldsToValues(documentFormState, true)\n }\n\n let blockData = initialBlockData\n if (initialBlockFormState) {\n blockData = reduceFieldsToValues(initialBlockFormState, true)\n }\n\n /**\n * When building state for sub schemas we need to adjust:\n * - `fields`\n * - `parentSchemaPath`\n * - `parentPath`\n *\n * Type assertion is fine because we wrap sub schemas in an array\n * so we can safely map over them within `fieldSchemasToFormState`\n */\n const fields = Array.isArray(fieldOrEntityConfig)\n ? fieldOrEntityConfig\n : 'fields' in fieldOrEntityConfig\n ? fieldOrEntityConfig.fields\n : [fieldOrEntityConfig]\n\n const formStateResult = await fieldSchemasToFormState({\n id,\n clientFieldSchemaMap: clientSchemaMap,\n collectionSlug,\n data,\n documentData,\n fields,\n fieldSchemaMap: schemaMap,\n initialBlockData: blockData,\n mockRSCs,\n operation,\n permissions: docPermissions?.fields || {},\n preferences: docPreferences || { fields: {} },\n previousFormState: formState,\n renderAllFields,\n renderFieldFn: renderField,\n req,\n schemaPath,\n select,\n selectMode,\n skipValidation,\n })\n\n // Maintain form state of auth / upload fields\n if (collectionSlug && formState) {\n if (payload.collections[collectionSlug]?.config?.upload && formState.file) {\n formStateResult.file = formState.file\n }\n }\n\n let lockedStateResult\n\n if (returnLockStatus) {\n lockedStateResult = await handleFormStateLocking({\n id,\n collectionSlug,\n globalSlug,\n req,\n updateLastEdited,\n })\n }\n\n return {\n lockedState: lockedStateResult,\n state: formStateResult,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"buildFormState.js","names":["formatErrors","getSelectMode","reduceFieldsToValues","fieldSchemasToFormState","renderField","getClientConfig","getClientSchemaMap","getSchemaMap","handleFormStateLocking","buildFormStateHandler","args","req","incomingUserSlug","user","collection","adminUserSlug","payload","config","admin","adminAccessFunction","collections","access","canAccessAdmin","Error","hasUsers","find","depth","limit","pagination","docs","length","res","buildFormState","err","logger","error","msg","message","id","idFromArgs","collectionSlug","data","incomingData","docPermissions","docPreferences","documentFormState","formState","globalSlug","initialBlockData","initialBlockFormState","mockRSCs","operation","renderAllFields","i18n","returnLockStatus","schemaPath","select","skipValidation","updateLastEdited","selectMode","undefined","schemaMap","clientSchemaMap","importMap","fieldOrEntityConfig","get","fields","type","documentData","blockData","Array","isArray","formStateResult","clientFieldSchemaMap","fieldSchemaMap","permissions","preferences","previousFormState","renderFieldFn","upload","file","lockedStateResult","lockedState","state"],"sources":["../../src/utilities/buildFormState.ts"],"sourcesContent":["import type {\n BuildFormStateArgs,\n ClientConfig,\n ClientUser,\n ErrorResult,\n FormState,\n ServerFunction,\n} from 'payload'\n\nimport { formatErrors } from 'payload'\nimport { getSelectMode, reduceFieldsToValues } from 'payload/shared'\n\nimport { fieldSchemasToFormState } from '../forms/fieldSchemasToFormState/index.js'\nimport { renderField } from '../forms/fieldSchemasToFormState/renderField.js'\nimport { getClientConfig } from './getClientConfig.js'\nimport { getClientSchemaMap } from './getClientSchemaMap.js'\nimport { getSchemaMap } from './getSchemaMap.js'\nimport { handleFormStateLocking } from './handleFormStateLocking.js'\n\nexport type LockedState = {\n isLocked: boolean\n lastEditedAt: string\n user: ClientUser | number | string\n}\n\ntype BuildFormStateSuccessResult = {\n clientConfig?: ClientConfig\n errors?: never\n indexPath?: string\n lockedState?: LockedState\n state: FormState\n}\n\ntype BuildFormStateErrorResult = {\n lockedState?: never\n state?: never\n} & (\n | {\n message: string\n }\n | ErrorResult\n)\n\nexport type BuildFormStateResult = BuildFormStateErrorResult | BuildFormStateSuccessResult\n\nexport const buildFormStateHandler: ServerFunction<\n BuildFormStateArgs,\n Promise<BuildFormStateResult>\n> = async (args) => {\n const { req } = args\n\n const incomingUserSlug = req.user?.collection\n const adminUserSlug = req.payload.config.admin.user\n\n try {\n // If we have a user slug, test it against the functions\n if (incomingUserSlug) {\n const adminAccessFunction = req.payload.collections[incomingUserSlug].config.access?.admin\n\n // Run the admin access function from the config if it exists\n if (adminAccessFunction) {\n const canAccessAdmin = await adminAccessFunction({ req })\n\n if (!canAccessAdmin) {\n throw new Error('Unauthorized')\n }\n // Match the user collection to the global admin config\n } else if (adminUserSlug !== incomingUserSlug) {\n throw new Error('Unauthorized')\n }\n } else {\n const hasUsers = await req.payload.find({\n collection: adminUserSlug,\n depth: 0,\n limit: 1,\n pagination: false,\n })\n\n // If there are users, we should not allow access because of /create-first-user\n if (hasUsers.docs.length) {\n throw new Error('Unauthorized')\n }\n }\n\n const res = await buildFormState(args)\n return res\n } catch (err) {\n req.payload.logger.error({ err, msg: `There was an error building form state` })\n\n if (err.message === 'Could not find field schema for given path') {\n return {\n message: err.message,\n }\n }\n\n if (err.message === 'Unauthorized') {\n throw new Error('Unauthorized')\n }\n\n return formatErrors(err)\n }\n}\n\nexport const buildFormState = async (\n args: BuildFormStateArgs,\n): Promise<BuildFormStateSuccessResult> => {\n const {\n id: idFromArgs,\n collectionSlug,\n data: incomingData,\n docPermissions,\n docPreferences,\n documentFormState,\n formState,\n globalSlug,\n initialBlockData,\n initialBlockFormState,\n mockRSCs,\n operation,\n renderAllFields,\n req,\n req: {\n i18n,\n payload,\n payload: { config },\n },\n returnLockStatus,\n schemaPath = collectionSlug || globalSlug,\n select,\n skipValidation,\n updateLastEdited,\n } = args\n\n const selectMode = select ? getSelectMode(select) : undefined\n\n let data = incomingData\n\n if (!collectionSlug && !globalSlug) {\n throw new Error('Either collectionSlug or globalSlug must be provided')\n }\n\n const schemaMap = getSchemaMap({\n collectionSlug,\n config,\n globalSlug,\n i18n,\n })\n\n const clientSchemaMap = getClientSchemaMap({\n collectionSlug,\n config: getClientConfig({ config, i18n, importMap: req.payload.importMap }),\n globalSlug,\n i18n,\n payload,\n schemaMap,\n })\n\n const id = collectionSlug ? idFromArgs : undefined\n const fieldOrEntityConfig = schemaMap.get(schemaPath)\n\n if (!fieldOrEntityConfig) {\n throw new Error(`Could not find \"${schemaPath}\" in the fieldSchemaMap`)\n }\n\n if (\n (!('fields' in fieldOrEntityConfig) ||\n !fieldOrEntityConfig.fields ||\n !fieldOrEntityConfig.fields.length) &&\n 'type' in fieldOrEntityConfig &&\n fieldOrEntityConfig.type !== 'blocks'\n ) {\n throw new Error(\n `The field found in fieldSchemaMap for \"${schemaPath}\" does not contain any subfields.`,\n )\n }\n\n // If there is a form state,\n // then we can deduce data from that form state\n if (formState) {\n data = reduceFieldsToValues(formState, true)\n }\n\n let documentData = undefined\n if (documentFormState) {\n documentData = reduceFieldsToValues(documentFormState, true)\n }\n\n let blockData = initialBlockData\n if (initialBlockFormState) {\n blockData = reduceFieldsToValues(initialBlockFormState, true)\n }\n\n /**\n * When building state for sub schemas we need to adjust:\n * - `fields`\n * - `parentSchemaPath`\n * - `parentPath`\n *\n * Type assertion is fine because we wrap sub schemas in an array\n * so we can safely map over them within `fieldSchemasToFormState`\n */\n const fields = Array.isArray(fieldOrEntityConfig)\n ? fieldOrEntityConfig\n : 'fields' in fieldOrEntityConfig\n ? fieldOrEntityConfig.fields\n : [fieldOrEntityConfig]\n\n const formStateResult = await fieldSchemasToFormState({\n id,\n clientFieldSchemaMap: clientSchemaMap,\n collectionSlug,\n data,\n documentData,\n fields,\n fieldSchemaMap: schemaMap,\n initialBlockData: blockData,\n mockRSCs,\n operation,\n permissions: docPermissions?.fields || {},\n preferences: docPreferences || { fields: {} },\n previousFormState: formState,\n renderAllFields,\n renderFieldFn: renderField,\n req,\n schemaPath,\n select,\n selectMode,\n skipValidation,\n })\n\n // Maintain form state of auth / upload fields\n if (collectionSlug && formState) {\n if (payload.collections[collectionSlug]?.config?.upload && formState.file) {\n formStateResult.file = formState.file\n }\n }\n\n let lockedStateResult\n\n if (returnLockStatus) {\n lockedStateResult = await handleFormStateLocking({\n id,\n collectionSlug,\n globalSlug,\n req,\n updateLastEdited,\n })\n }\n\n return {\n lockedState: lockedStateResult,\n state: formStateResult,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildTableState.js","names":["APIError","formatErrors","isNumber","getClientConfig","renderFilters","renderTable","upsertPreferences","buildTableStateHandler","args","req","res","buildTableState","err","payload","logger","error","msg","message","collectionSlug","columns","docs","docsFromArgs","enableRowSelections","orderableFieldName","parent","query","renderRowTypes","i18n","config","user","tableAppearance","incomingUserSlug","collection","adminUserSlug","admin","adminAccessFunction","collections","access","canAccessAdmin","Error","hasUsers","find","depth","limit","pagination","length","clientConfig","importMap","collectionConfig","clientCollectionConfig","Array","isArray","slug","collectionPreferences","key","joinPath","value","Number","undefined","sort","data","select","currentSelectRef","segments","split","i","joinQuery","where","isNaN","page","parentDoc","findByID","id","joins","overrideAccess","parseInt","locale","columnState","Table","columnPreferences","useAsTitle","renderedFilters","fields","preferences","state"],"sources":["../../src/utilities/buildTableState.ts"],"sourcesContent":["import type {\n BuildTableStateArgs,\n ClientCollectionConfig,\n ClientConfig,\n CollectionPreferences,\n Column,\n ErrorResult,\n PaginatedDocs,\n SanitizedCollectionConfig,\n ServerFunction,\n Where,\n} from 'payload'\n\nimport { APIError, formatErrors } from 'payload'\nimport { isNumber } from 'payload/shared'\n\nimport { getClientConfig } from './getClientConfig.js'\nimport { renderFilters, renderTable } from './renderTable.js'\nimport { upsertPreferences } from './upsertPreferences.js'\n\ntype BuildTableStateSuccessResult = {\n clientConfig?: ClientConfig\n data: PaginatedDocs\n errors?: never\n preferences: CollectionPreferences\n renderedFilters: Map<string, React.ReactNode>\n state: Column[]\n Table: React.ReactNode\n}\n\ntype BuildTableStateErrorResult = {\n data?: any\n renderedFilters?: never\n state?: never\n Table?: never\n} & (\n | {\n message: string\n }\n | ErrorResult\n)\n\nexport type BuildTableStateResult = BuildTableStateErrorResult | BuildTableStateSuccessResult\n\nexport const buildTableStateHandler: ServerFunction<\n BuildTableStateArgs,\n Promise<BuildTableStateResult>\n> = async (args) => {\n const { req } = args\n\n try {\n const res = await buildTableState(args)\n return res\n } catch (err) {\n req.payload.logger.error({ err, msg: `There was an error building form state` })\n\n if (err.message === 'Could not find field schema for given path') {\n return {\n message: err.message,\n }\n }\n\n if (err.message === 'Unauthorized') {\n return null\n }\n\n return formatErrors(err)\n }\n}\n\nconst buildTableState = async (\n args: BuildTableStateArgs,\n): Promise<BuildTableStateSuccessResult> => {\n const {\n collectionSlug,\n columns,\n docs: docsFromArgs,\n enableRowSelections,\n orderableFieldName,\n parent,\n query,\n renderRowTypes,\n req,\n req: {\n i18n,\n payload,\n payload: { config },\n user,\n },\n tableAppearance,\n } = args\n\n const incomingUserSlug = user?.collection\n\n const adminUserSlug = config.admin.user\n\n // If we have a user slug, test it against the functions\n if (incomingUserSlug) {\n const adminAccessFunction = payload.collections[incomingUserSlug].config.access?.admin\n\n // Run the admin access function from the config if it exists\n if (adminAccessFunction) {\n const canAccessAdmin = await adminAccessFunction({ req })\n\n if (!canAccessAdmin) {\n throw new Error('Unauthorized')\n }\n\n // Match the user collection to the global admin config\n } else if (adminUserSlug !== incomingUserSlug) {\n throw new Error('Unauthorized')\n }\n } else {\n const hasUsers = await payload.find({\n collection: adminUserSlug,\n depth: 0,\n limit: 1,\n pagination: false,\n })\n\n // If there are users, we should not allow access because of /create-first-user\n if (hasUsers.docs.length) {\n throw new Error('Unauthorized')\n }\n }\n\n const clientConfig = getClientConfig({\n config,\n i18n,\n importMap: payload.importMap,\n })\n\n let collectionConfig: SanitizedCollectionConfig\n let clientCollectionConfig: ClientCollectionConfig\n\n if (!Array.isArray(collectionSlug)) {\n if (req.payload.collections[collectionSlug]) {\n collectionConfig = req.payload.collections[collectionSlug].config\n clientCollectionConfig = clientConfig.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n }\n }\n\n const collectionPreferences = await upsertPreferences<CollectionPreferences>({\n key: Array.isArray(collectionSlug)\n ? `${parent.collectionSlug}-${parent.joinPath}`\n : `collection-${collectionSlug}`,\n req,\n value: {\n columns,\n limit: isNumber(query?.limit) ? Number(query.limit) : undefined,\n sort: query?.sort as string,\n },\n })\n\n let docs = docsFromArgs\n let data: PaginatedDocs\n\n // lookup docs, if desired, i.e. within `join` field which initialize with `depth: 0`\n\n if (!docs || query) {\n if (Array.isArray(collectionSlug)) {\n if (!parent) {\n throw new APIError('Unexpected array of collectionSlug, parent must be provided')\n }\n\n const select = {}\n let currentSelectRef = select\n\n const segments = parent.joinPath.split('.')\n\n for (let i = 0; i < segments.length; i++) {\n currentSelectRef[segments[i]] = i === segments.length - 1 ? true : {}\n currentSelectRef = currentSelectRef[segments[i]]\n }\n\n const joinQuery: { limit?: number; page?: number; sort?: string; where?: Where } = {\n sort: query?.sort as string,\n where: query?.where,\n }\n\n if (query) {\n if (!Number.isNaN(Number(query.limit))) {\n joinQuery.limit = Number(query.limit)\n }\n\n if (!Number.isNaN(Number(query.page))) {\n joinQuery.limit = Number(query.limit)\n }\n }\n\n let parentDoc = await payload.findByID({\n id: parent.id,\n collection: parent.collectionSlug,\n depth: 1,\n joins: {\n [parent.joinPath]: joinQuery,\n },\n overrideAccess: false,\n select,\n user: req.user,\n })\n\n for (let i = 0; i < segments.length; i++) {\n if (i === segments.length - 1) {\n data = parentDoc[segments[i]]\n docs = data.docs\n } else {\n parentDoc = parentDoc[segments[i]]\n }\n }\n } else {\n data = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: query?.limit ? parseInt(query.limit, 10) : undefined,\n locale: req.locale,\n overrideAccess: false,\n page: query?.page ? parseInt(query.page, 10) : undefined,\n sort: query?.sort,\n user: req.user,\n where: query?.where,\n })\n docs = data.docs\n }\n }\n\n const { columnState, Table } = renderTable({\n clientCollectionConfig,\n clientConfig,\n collectionConfig,\n collections: Array.isArray(collectionSlug) ? collectionSlug : undefined,\n columnPreferences: Array.isArray(collectionSlug) ? collectionPreferences?.columns : undefined, // TODO, might not be neededcolumns,\n columns,\n docs,\n enableRowSelections,\n i18n: req.i18n,\n orderableFieldName,\n payload,\n renderRowTypes,\n tableAppearance,\n useAsTitle: Array.isArray(collectionSlug)\n ? payload.collections[collectionSlug[0]]?.config?.admin?.useAsTitle\n : collectionConfig?.admin?.useAsTitle,\n })\n\n let renderedFilters\n\n if (collectionConfig) {\n renderedFilters = renderFilters(collectionConfig.fields, req.payload.importMap)\n }\n\n return {\n data,\n preferences: collectionPreferences,\n renderedFilters,\n state: columnState,\n Table,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"buildTableState.js","names":["APIError","formatErrors","isNumber","getClientConfig","renderFilters","renderTable","upsertPreferences","buildTableStateHandler","args","req","res","buildTableState","err","payload","logger","error","msg","message","collectionSlug","columns","docs","docsFromArgs","enableRowSelections","orderableFieldName","parent","query","renderRowTypes","i18n","config","user","tableAppearance","incomingUserSlug","collection","adminUserSlug","admin","adminAccessFunction","collections","access","canAccessAdmin","Error","hasUsers","find","depth","limit","pagination","length","clientConfig","importMap","collectionConfig","clientCollectionConfig","Array","isArray","slug","collectionPreferences","key","joinPath","value","Number","undefined","sort","data","select","currentSelectRef","segments","split","i","joinQuery","where","isNaN","page","parentDoc","findByID","id","joins","overrideAccess","draft","parseInt","locale","columnState","Table","columnPreferences","useAsTitle","renderedFilters","fields","preferences","state"],"sources":["../../src/utilities/buildTableState.ts"],"sourcesContent":["import type {\n BuildTableStateArgs,\n ClientCollectionConfig,\n ClientConfig,\n CollectionPreferences,\n Column,\n ErrorResult,\n PaginatedDocs,\n SanitizedCollectionConfig,\n ServerFunction,\n Where,\n} from 'payload'\n\nimport { APIError, formatErrors } from 'payload'\nimport { isNumber } from 'payload/shared'\n\nimport { getClientConfig } from './getClientConfig.js'\nimport { renderFilters, renderTable } from './renderTable.js'\nimport { upsertPreferences } from './upsertPreferences.js'\n\ntype BuildTableStateSuccessResult = {\n clientConfig?: ClientConfig\n data: PaginatedDocs\n errors?: never\n preferences: CollectionPreferences\n renderedFilters: Map<string, React.ReactNode>\n state: Column[]\n Table: React.ReactNode\n}\n\ntype BuildTableStateErrorResult = {\n data?: any\n renderedFilters?: never\n state?: never\n Table?: never\n} & (\n | {\n message: string\n }\n | ErrorResult\n)\n\nexport type BuildTableStateResult = BuildTableStateErrorResult | BuildTableStateSuccessResult\n\nexport const buildTableStateHandler: ServerFunction<\n BuildTableStateArgs,\n Promise<BuildTableStateResult>\n> = async (args) => {\n const { req } = args\n\n try {\n const res = await buildTableState(args)\n return res\n } catch (err) {\n req.payload.logger.error({ err, msg: `There was an error building form state` })\n\n if (err.message === 'Could not find field schema for given path') {\n return {\n message: err.message,\n }\n }\n\n if (err.message === 'Unauthorized') {\n return null\n }\n\n return formatErrors(err)\n }\n}\n\nconst buildTableState = async (\n args: BuildTableStateArgs,\n): Promise<BuildTableStateSuccessResult> => {\n const {\n collectionSlug,\n columns,\n docs: docsFromArgs,\n enableRowSelections,\n orderableFieldName,\n parent,\n query,\n renderRowTypes,\n req,\n req: {\n i18n,\n payload,\n payload: { config },\n user,\n },\n tableAppearance,\n } = args\n\n const incomingUserSlug = user?.collection\n\n const adminUserSlug = config.admin.user\n\n // If we have a user slug, test it against the functions\n if (incomingUserSlug) {\n const adminAccessFunction = payload.collections[incomingUserSlug].config.access?.admin\n\n // Run the admin access function from the config if it exists\n if (adminAccessFunction) {\n const canAccessAdmin = await adminAccessFunction({ req })\n\n if (!canAccessAdmin) {\n throw new Error('Unauthorized')\n }\n\n // Match the user collection to the global admin config\n } else if (adminUserSlug !== incomingUserSlug) {\n throw new Error('Unauthorized')\n }\n } else {\n const hasUsers = await payload.find({\n collection: adminUserSlug,\n depth: 0,\n limit: 1,\n pagination: false,\n })\n\n // If there are users, we should not allow access because of /create-first-user\n if (hasUsers.docs.length) {\n throw new Error('Unauthorized')\n }\n }\n\n const clientConfig = getClientConfig({\n config,\n i18n,\n importMap: payload.importMap,\n })\n\n let collectionConfig: SanitizedCollectionConfig\n let clientCollectionConfig: ClientCollectionConfig\n\n if (!Array.isArray(collectionSlug)) {\n if (req.payload.collections[collectionSlug]) {\n collectionConfig = req.payload.collections[collectionSlug].config\n clientCollectionConfig = clientConfig.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n }\n }\n\n const collectionPreferences = await upsertPreferences<CollectionPreferences>({\n key: Array.isArray(collectionSlug)\n ? `${parent.collectionSlug}-${parent.joinPath}`\n : `collection-${collectionSlug}`,\n req,\n value: {\n columns,\n limit: isNumber(query?.limit) ? Number(query.limit) : undefined,\n sort: query?.sort as string,\n },\n })\n\n let docs = docsFromArgs\n let data: PaginatedDocs\n\n // lookup docs, if desired, i.e. within `join` field which initialize with `depth: 0`\n\n if (!docs || query) {\n if (Array.isArray(collectionSlug)) {\n if (!parent) {\n throw new APIError('Unexpected array of collectionSlug, parent must be provided')\n }\n\n const select = {}\n let currentSelectRef = select\n\n const segments = parent.joinPath.split('.')\n\n for (let i = 0; i < segments.length; i++) {\n currentSelectRef[segments[i]] = i === segments.length - 1 ? true : {}\n currentSelectRef = currentSelectRef[segments[i]]\n }\n\n const joinQuery: { limit?: number; page?: number; sort?: string; where?: Where } = {\n sort: query?.sort as string,\n where: query?.where,\n }\n\n if (query) {\n if (!Number.isNaN(Number(query.limit))) {\n joinQuery.limit = Number(query.limit)\n }\n\n if (!Number.isNaN(Number(query.page))) {\n joinQuery.limit = Number(query.limit)\n }\n }\n\n let parentDoc = await payload.findByID({\n id: parent.id,\n collection: parent.collectionSlug,\n depth: 1,\n joins: {\n [parent.joinPath]: joinQuery,\n },\n overrideAccess: false,\n select,\n user: req.user,\n })\n\n for (let i = 0; i < segments.length; i++) {\n if (i === segments.length - 1) {\n data = parentDoc[segments[i]]\n docs = data.docs\n } else {\n parentDoc = parentDoc[segments[i]]\n }\n }\n } else {\n data = await payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: true,\n limit: query?.limit ? parseInt(query.limit, 10) : undefined,\n locale: req.locale,\n overrideAccess: false,\n page: query?.page ? parseInt(query.page, 10) : undefined,\n sort: query?.sort,\n user: req.user,\n where: query?.where,\n })\n docs = data.docs\n }\n }\n\n const { columnState, Table } = renderTable({\n clientCollectionConfig,\n clientConfig,\n collectionConfig,\n collections: Array.isArray(collectionSlug) ? collectionSlug : undefined,\n columnPreferences: Array.isArray(collectionSlug) ? collectionPreferences?.columns : undefined, // TODO, might not be neededcolumns,\n columns,\n docs,\n enableRowSelections,\n i18n: req.i18n,\n orderableFieldName,\n payload,\n renderRowTypes,\n tableAppearance,\n useAsTitle: Array.isArray(collectionSlug)\n ? payload.collections[collectionSlug[0]]?.config?.admin?.useAsTitle\n : collectionConfig?.admin?.useAsTitle,\n })\n\n let renderedFilters\n\n if (collectionConfig) {\n renderedFilters = renderFilters(collectionConfig.fields, req.payload.importMap)\n }\n\n return {\n data,\n preferences: collectionPreferences,\n renderedFilters,\n state: columnState,\n Table,\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatRelationshipTitle.d.ts","sourceRoot":"","sources":["../../../src/utilities/formatDocTitle/formatRelationshipTitle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,iBAAW,MAkB9C,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const formatRelationshipTitle = data => {
|
|
2
|
+
if (Array.isArray(data)) {
|
|
3
|
+
return data.map(item => {
|
|
4
|
+
if (typeof item === 'object' && item !== null) {
|
|
5
|
+
return item.id;
|
|
6
|
+
}
|
|
7
|
+
return String(item);
|
|
8
|
+
}).filter(Boolean).join(', ');
|
|
9
|
+
}
|
|
10
|
+
if (typeof data === 'object' && data !== null) {
|
|
11
|
+
return data.id || '';
|
|
12
|
+
}
|
|
13
|
+
return String(data);
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=formatRelationshipTitle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatRelationshipTitle.js","names":["formatRelationshipTitle","data","Array","isArray","map","item","id","String","filter","Boolean","join"],"sources":["../../../src/utilities/formatDocTitle/formatRelationshipTitle.ts"],"sourcesContent":["export const formatRelationshipTitle = (data): string => {\n if (Array.isArray(data)) {\n return data\n .map((item) => {\n if (typeof item === 'object' && item !== null) {\n return item.id\n }\n return String(item)\n })\n .filter(Boolean)\n .join(', ')\n }\n\n if (typeof data === 'object' && data !== null) {\n return data.id || ''\n }\n\n return String(data)\n}\n"],"mappings":"AAAA,OAAO,MAAMA,uBAAA,GAA2BC,IAAA;EACtC,IAAIC,KAAA,CAAMC,OAAO,CAACF,IAAA,GAAO;IACvB,OAAOA,IAAA,CACJG,GAAG,CAAEC,IAAA;MACJ,IAAI,OAAOA,IAAA,KAAS,YAAYA,IAAA,KAAS,MAAM;QAC7C,OAAOA,IAAA,CAAKC,EAAE;MAChB;MACA,OAAOC,MAAA,CAAOF,IAAA;IAChB,GACCG,MAAM,CAACC,OAAA,EACPC,IAAI,CAAC;EACV;EAEA,IAAI,OAAOT,IAAA,KAAS,YAAYA,IAAA,KAAS,MAAM;IAC7C,OAAOA,IAAA,CAAKK,EAAE,IAAI;EACpB;EAEA,OAAOC,MAAA,CAAON,IAAA;AAChB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/formatDocTitle/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACX,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/formatDocTitle/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACX,MAAM,SAAS,CAAA;AAQhB,eAAO,MAAM,cAAc,gGAOxB;IACD,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IACzC,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAA;IAClD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;CACrB,KAAG,MAmDH,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getTranslation } from '@payloadcms/translations';
|
|
2
2
|
import { formatDate } from './formatDateTitle.js';
|
|
3
3
|
import { formatLexicalDocTitle, isSerializedLexicalEditor } from './formatLexicalDocTitle.js';
|
|
4
|
+
import { formatRelationshipTitle } from './formatRelationshipTitle.js';
|
|
4
5
|
export const formatDocTitle = ({
|
|
5
6
|
collectionConfig,
|
|
6
7
|
data,
|
|
@@ -17,6 +18,7 @@ export const formatDocTitle = ({
|
|
|
17
18
|
if (title) {
|
|
18
19
|
const fieldConfig = collectionConfig.fields.find(f => 'name' in f && f.name === useAsTitle);
|
|
19
20
|
const isDate = fieldConfig?.type === 'date';
|
|
21
|
+
const isRelationship = fieldConfig?.type === 'relationship';
|
|
20
22
|
if (isDate) {
|
|
21
23
|
const dateFormat = 'date' in fieldConfig.admin && fieldConfig?.admin?.date?.displayFormat || dateFormatFromConfig;
|
|
22
24
|
title = formatDate({
|
|
@@ -25,6 +27,10 @@ export const formatDocTitle = ({
|
|
|
25
27
|
pattern: dateFormat
|
|
26
28
|
}) || title;
|
|
27
29
|
}
|
|
30
|
+
if (isRelationship) {
|
|
31
|
+
const formattedRelationshipTitle = formatRelationshipTitle(data[useAsTitle]);
|
|
32
|
+
title = formattedRelationshipTitle;
|
|
33
|
+
}
|
|
28
34
|
}
|
|
29
35
|
}
|
|
30
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["getTranslation","formatDate","formatLexicalDocTitle","isSerializedLexicalEditor","formatDocTitle","collectionConfig","data","dateFormat","dateFormatFromConfig","fallback","globalConfig","i18n","title","useAsTitle","admin","fieldConfig","fields","find","f","name","isDate","type","date","displayFormat","pattern","label","slug","root","children","t"],"sources":["../../../src/utilities/formatDocTitle/index.ts"],"sourcesContent":["import type { I18n } from '@payloadcms/translations'\nimport type {\n ClientCollectionConfig,\n ClientGlobalConfig,\n SanitizedConfig,\n TypeWithID,\n} from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport { formatDate } from './formatDateTitle.js'\nimport { formatLexicalDocTitle, isSerializedLexicalEditor } from './formatLexicalDocTitle.js'\n\nexport const formatDocTitle = ({\n collectionConfig,\n data,\n dateFormat: dateFormatFromConfig,\n fallback,\n globalConfig,\n i18n,\n}: {\n collectionConfig?: ClientCollectionConfig\n data: TypeWithID\n dateFormat: SanitizedConfig['admin']['dateFormat']\n fallback?: object | string\n globalConfig?: ClientGlobalConfig\n i18n: I18n<any, any>\n}): string => {\n let title: string\n\n if (collectionConfig) {\n const useAsTitle = collectionConfig?.admin?.useAsTitle\n\n if (useAsTitle) {\n title = data?.[useAsTitle] as string\n\n if (title) {\n const fieldConfig = collectionConfig.fields.find(\n (f) => 'name' in f && f.name === useAsTitle,\n )\n\n const isDate = fieldConfig?.type === 'date'\n\n if (isDate) {\n const dateFormat =\n ('date' in fieldConfig.admin && fieldConfig?.admin?.date?.displayFormat) ||\n dateFormatFromConfig\n\n title = formatDate({ date: title, i18n, pattern: dateFormat }) || title\n }\n }\n }\n }\n\n if (globalConfig) {\n title = getTranslation(globalConfig?.label, i18n) || globalConfig?.slug\n }\n\n // richtext lexical case. We convert the first child of root to plain text\n if (title && isSerializedLexicalEditor(title)) {\n title = formatLexicalDocTitle(title.root.children?.[0]?.children || [], '')\n }\n\n if (!title && isSerializedLexicalEditor(fallback)) {\n title = formatLexicalDocTitle(fallback.root.children?.[0]?.children || [], '')\n }\n\n if (!title) {\n title = typeof fallback === 'string' ? fallback : `[${i18n.t('general:untitled')}]`\n }\n\n return title\n}\n"],"mappings":"AAQA,SAASA,cAAc,QAAQ;AAE/B,SAASC,UAAU,QAAQ;AAC3B,SAASC,qBAAqB,EAAEC,yBAAyB,QAAQ;
|
|
1
|
+
{"version":3,"file":"index.js","names":["getTranslation","formatDate","formatLexicalDocTitle","isSerializedLexicalEditor","formatRelationshipTitle","formatDocTitle","collectionConfig","data","dateFormat","dateFormatFromConfig","fallback","globalConfig","i18n","title","useAsTitle","admin","fieldConfig","fields","find","f","name","isDate","type","isRelationship","date","displayFormat","pattern","formattedRelationshipTitle","label","slug","root","children","t"],"sources":["../../../src/utilities/formatDocTitle/index.ts"],"sourcesContent":["import type { I18n } from '@payloadcms/translations'\nimport type {\n ClientCollectionConfig,\n ClientGlobalConfig,\n SanitizedConfig,\n TypeWithID,\n} from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport { formatDate } from './formatDateTitle.js'\nimport { formatLexicalDocTitle, isSerializedLexicalEditor } from './formatLexicalDocTitle.js'\nimport { formatRelationshipTitle } from './formatRelationshipTitle.js'\n\nexport const formatDocTitle = ({\n collectionConfig,\n data,\n dateFormat: dateFormatFromConfig,\n fallback,\n globalConfig,\n i18n,\n}: {\n collectionConfig?: ClientCollectionConfig\n data: TypeWithID\n dateFormat: SanitizedConfig['admin']['dateFormat']\n fallback?: object | string\n globalConfig?: ClientGlobalConfig\n i18n: I18n<any, any>\n}): string => {\n let title: string\n\n if (collectionConfig) {\n const useAsTitle = collectionConfig?.admin?.useAsTitle\n\n if (useAsTitle) {\n title = data?.[useAsTitle] as string\n\n if (title) {\n const fieldConfig = collectionConfig.fields.find(\n (f) => 'name' in f && f.name === useAsTitle,\n )\n\n const isDate = fieldConfig?.type === 'date'\n const isRelationship = fieldConfig?.type === 'relationship'\n\n if (isDate) {\n const dateFormat =\n ('date' in fieldConfig.admin && fieldConfig?.admin?.date?.displayFormat) ||\n dateFormatFromConfig\n\n title = formatDate({ date: title, i18n, pattern: dateFormat }) || title\n }\n\n if (isRelationship) {\n const formattedRelationshipTitle = formatRelationshipTitle(data[useAsTitle])\n title = formattedRelationshipTitle\n }\n }\n }\n }\n\n if (globalConfig) {\n title = getTranslation(globalConfig?.label, i18n) || globalConfig?.slug\n }\n\n // richtext lexical case. We convert the first child of root to plain text\n if (title && isSerializedLexicalEditor(title)) {\n title = formatLexicalDocTitle(title.root.children?.[0]?.children || [], '')\n }\n\n if (!title && isSerializedLexicalEditor(fallback)) {\n title = formatLexicalDocTitle(fallback.root.children?.[0]?.children || [], '')\n }\n\n if (!title) {\n title = typeof fallback === 'string' ? fallback : `[${i18n.t('general:untitled')}]`\n }\n\n return title\n}\n"],"mappings":"AAQA,SAASA,cAAc,QAAQ;AAE/B,SAASC,UAAU,QAAQ;AAC3B,SAASC,qBAAqB,EAAEC,yBAAyB,QAAQ;AACjE,SAASC,uBAAuB,QAAQ;AAExC,OAAO,MAAMC,cAAA,GAAiBA,CAAC;EAC7BC,gBAAgB;EAChBC,IAAI;EACJC,UAAA,EAAYC,oBAAoB;EAChCC,QAAQ;EACRC,YAAY;EACZC;AAAI,CAQL;EACC,IAAIC,KAAA;EAEJ,IAAIP,gBAAA,EAAkB;IACpB,MAAMQ,UAAA,GAAaR,gBAAA,EAAkBS,KAAA,EAAOD,UAAA;IAE5C,IAAIA,UAAA,EAAY;MACdD,KAAA,GAAQN,IAAA,GAAOO,UAAA,CAAW;MAE1B,IAAID,KAAA,EAAO;QACT,MAAMG,WAAA,GAAcV,gBAAA,CAAiBW,MAAM,CAACC,IAAI,CAC7CC,CAAA,IAAM,UAAUA,CAAA,IAAKA,CAAA,CAAEC,IAAI,KAAKN,UAAA;QAGnC,MAAMO,MAAA,GAASL,WAAA,EAAaM,IAAA,KAAS;QACrC,MAAMC,cAAA,GAAiBP,WAAA,EAAaM,IAAA,KAAS;QAE7C,IAAID,MAAA,EAAQ;UACV,MAAMb,UAAA,GACJ,MAAC,IAAUQ,WAAA,CAAYD,KAAK,IAAIC,WAAA,EAAaD,KAAA,EAAOS,IAAA,EAAMC,aAAA,IAC1DhB,oBAAA;UAEFI,KAAA,GAAQZ,UAAA,CAAW;YAAEuB,IAAA,EAAMX,KAAA;YAAOD,IAAA;YAAMc,OAAA,EAASlB;UAAW,MAAMK,KAAA;QACpE;QAEA,IAAIU,cAAA,EAAgB;UAClB,MAAMI,0BAAA,GAA6BvB,uBAAA,CAAwBG,IAAI,CAACO,UAAA,CAAW;UAC3ED,KAAA,GAAQc,0BAAA;QACV;MACF;IACF;EACF;EAEA,IAAIhB,YAAA,EAAc;IAChBE,KAAA,GAAQb,cAAA,CAAeW,YAAA,EAAciB,KAAA,EAAOhB,IAAA,KAASD,YAAA,EAAckB,IAAA;EACrE;EAEA;EACA,IAAIhB,KAAA,IAASV,yBAAA,CAA0BU,KAAA,GAAQ;IAC7CA,KAAA,GAAQX,qBAAA,CAAsBW,KAAA,CAAMiB,IAAI,CAACC,QAAQ,GAAG,EAAE,EAAEA,QAAA,IAAY,EAAE,EAAE;EAC1E;EAEA,IAAI,CAAClB,KAAA,IAASV,yBAAA,CAA0BO,QAAA,GAAW;IACjDG,KAAA,GAAQX,qBAAA,CAAsBQ,QAAA,CAASoB,IAAI,CAACC,QAAQ,GAAG,EAAE,EAAEA,QAAA,IAAY,EAAE,EAAE;EAC7E;EAEA,IAAI,CAAClB,KAAA,EAAO;IACVA,KAAA,GAAQ,OAAOH,QAAA,KAAa,WAAWA,QAAA,GAAW,IAAIE,IAAA,CAAKoB,CAAC,CAAC,sBAAsB;EACrF;EAEA,OAAOnB,KAAA;AACT","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"APIKey.d.ts","sourceRoot":"","sources":["../../../../src/views/Edit/Auth/APIKey.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAuC,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"APIKey.d.ts","sourceRoot":"","sources":["../../../../src/views/Edit/Auth/APIKey.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAuC,MAAM,OAAO,CAAA;AAiB3D,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CA6HvF,CAAA"}
|
|
@@ -5,10 +5,12 @@ import { getTranslation } from '@payloadcms/translations';
|
|
|
5
5
|
import { text } from 'payload/shared';
|
|
6
6
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
7
7
|
import { v4 as uuidv4 } from 'uuid';
|
|
8
|
+
import { Button } from '../../../elements/Button/index.js';
|
|
8
9
|
import { CopyToClipboard } from '../../../elements/CopyToClipboard/index.js';
|
|
9
10
|
import { GenerateConfirmation } from '../../../elements/GenerateConfirmation/index.js';
|
|
10
11
|
import { useFormFields } from '../../../forms/Form/context.js';
|
|
11
12
|
import { useField } from '../../../forms/useField/index.js';
|
|
13
|
+
import { EyeIcon } from '../../../icons/Eye/index.js';
|
|
12
14
|
import { useConfig } from '../../../providers/Config/index.js';
|
|
13
15
|
import { useDocumentInfo } from '../../../providers/DocumentInfo/index.js';
|
|
14
16
|
import { useTranslation } from '../../../providers/Translation/index.js';
|
|
@@ -21,6 +23,7 @@ export const APIKey = ({
|
|
|
21
23
|
}) => {
|
|
22
24
|
const [initialAPIKey] = useState(uuidv4());
|
|
23
25
|
const [highlightedField, setHighlightedField] = useState(false);
|
|
26
|
+
const [showKey, setShowKey] = useState(false);
|
|
24
27
|
const {
|
|
25
28
|
i18n,
|
|
26
29
|
t
|
|
@@ -64,8 +67,9 @@ export const APIKey = ({
|
|
|
64
67
|
}
|
|
65
68
|
return getTranslation(label, i18n);
|
|
66
69
|
}, [apiKeyField, i18n]);
|
|
67
|
-
const APIKeyLabel = useMemo(() => /*#__PURE__*/_jsxs("
|
|
68
|
-
className: `${baseClass}__label`,
|
|
70
|
+
const APIKeyLabel = useMemo(() => /*#__PURE__*/_jsxs("label", {
|
|
71
|
+
className: `${baseClass}__label field-label`,
|
|
72
|
+
htmlFor: "apiKey",
|
|
69
73
|
children: [/*#__PURE__*/_jsx("span", {
|
|
70
74
|
children: apiKeyLabel
|
|
71
75
|
}), /*#__PURE__*/_jsx(CopyToClipboard, {
|
|
@@ -109,14 +113,27 @@ export const APIKey = ({
|
|
|
109
113
|
return /*#__PURE__*/_jsxs(React.Fragment, {
|
|
110
114
|
children: [/*#__PURE__*/_jsxs("div", {
|
|
111
115
|
className: [fieldBaseClass, 'api-key', 'read-only'].filter(Boolean).join(' '),
|
|
112
|
-
children: [APIKeyLabel, /*#__PURE__*/
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
children: [APIKeyLabel, /*#__PURE__*/_jsxs("div", {
|
|
117
|
+
className: `${baseClass}__input-wrap`,
|
|
118
|
+
children: [/*#__PURE__*/_jsx("input", {
|
|
119
|
+
"aria-label": apiKeyLabel,
|
|
120
|
+
className: highlightedField ? 'highlight' : undefined,
|
|
121
|
+
disabled: true,
|
|
122
|
+
id: "apiKey",
|
|
123
|
+
name: "apiKey",
|
|
124
|
+
type: showKey ? 'text' : 'password',
|
|
125
|
+
value: value || ''
|
|
126
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
127
|
+
className: `${baseClass}__toggle-button-wrap`,
|
|
128
|
+
children: /*#__PURE__*/_jsx(Button, {
|
|
129
|
+
buttonStyle: "none",
|
|
130
|
+
className: `${baseClass}__toggle-button`,
|
|
131
|
+
icon: /*#__PURE__*/_jsx(EyeIcon, {
|
|
132
|
+
active: showKey
|
|
133
|
+
}),
|
|
134
|
+
onClick: () => setShowKey(prev => !prev)
|
|
135
|
+
})
|
|
136
|
+
})]
|
|
120
137
|
})]
|
|
121
138
|
}), !readOnly && /*#__PURE__*/_jsx(GenerateConfirmation, {
|
|
122
139
|
highlightField: highlightField,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"APIKey.js","names":["getTranslation","text","React","useEffect","useMemo","useState","v4","uuidv4","CopyToClipboard","GenerateConfirmation","useFormFields","useField","useConfig","useDocumentInfo","useTranslation","path","baseClass","fieldBaseClass","APIKey","enabled","readOnly","initialAPIKey","highlightedField","setHighlightedField","i18n","t","config","getEntityConfig","collectionSlug","apiKey","fields","apiKeyField","find","field","name","validate","val","type","blockData","data","event","maxLength","minLength","preferences","req","payload","siblingData","apiKeyValue","value","apiKeyLabel","label","APIKeyLabel","_jsxs","className","_jsx","fieldType","highlightField","setTimeout","setValue","Fragment","filter","Boolean","join","undefined","disabled","id","setKey"],"sources":["../../../../src/views/Edit/Auth/APIKey.tsx"],"sourcesContent":["'use client'\nimport type { PayloadRequest, TextFieldClient } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { text } from 'payload/shared'\nimport React, { useEffect, useMemo, useState } from 'react'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { CopyToClipboard } from '../../../elements/CopyToClipboard/index.js'\nimport { GenerateConfirmation } from '../../../elements/GenerateConfirmation/index.js'\nimport { useFormFields } from '../../../forms/Form/context.js'\nimport { useField } from '../../../forms/useField/index.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../../providers/DocumentInfo/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\n\nconst path = 'apiKey'\nconst baseClass = 'api-key'\nconst fieldBaseClass = 'field-type'\n\nexport const APIKey: React.FC<{ readonly enabled: boolean; readonly readOnly?: boolean }> = ({\n enabled,\n readOnly,\n}) => {\n const [initialAPIKey] = useState(uuidv4())\n const [highlightedField, setHighlightedField] = useState(false)\n const { i18n, t } = useTranslation()\n const { config, getEntityConfig } = useConfig()\n const { collectionSlug } = useDocumentInfo()\n\n const apiKey = useFormFields(([fields]) => (fields && fields[path]) || null)\n\n const apiKeyField: TextFieldClient = getEntityConfig({ collectionSlug })?.fields?.find(\n (field) => 'name' in field && field.name === 'apiKey',\n ) as TextFieldClient\n\n const validate = (val) =>\n text(val, {\n name: 'apiKey',\n type: 'text',\n blockData: {},\n data: {},\n event: 'onChange',\n maxLength: 48,\n minLength: 24,\n path: ['apiKey'],\n preferences: { fields: {} },\n req: {\n payload: {\n config,\n },\n t,\n } as unknown as PayloadRequest,\n siblingData: {},\n })\n\n const apiKeyValue = apiKey?.value\n\n const apiKeyLabel = useMemo(() => {\n let label: Record<string, string> | string = 'API Key'\n\n if (apiKeyField?.label) {\n label = apiKeyField.label\n }\n\n return getTranslation(label, i18n)\n }, [apiKeyField, i18n])\n\n const APIKeyLabel = useMemo(\n () => (\n <
|
|
1
|
+
{"version":3,"file":"APIKey.js","names":["getTranslation","text","React","useEffect","useMemo","useState","v4","uuidv4","Button","CopyToClipboard","GenerateConfirmation","useFormFields","useField","EyeIcon","useConfig","useDocumentInfo","useTranslation","path","baseClass","fieldBaseClass","APIKey","enabled","readOnly","initialAPIKey","highlightedField","setHighlightedField","showKey","setShowKey","i18n","t","config","getEntityConfig","collectionSlug","apiKey","fields","apiKeyField","find","field","name","validate","val","type","blockData","data","event","maxLength","minLength","preferences","req","payload","siblingData","apiKeyValue","value","apiKeyLabel","label","APIKeyLabel","_jsxs","className","htmlFor","_jsx","fieldType","highlightField","setTimeout","setValue","Fragment","filter","Boolean","join","undefined","disabled","id","buttonStyle","icon","active","onClick","prev","setKey"],"sources":["../../../../src/views/Edit/Auth/APIKey.tsx"],"sourcesContent":["'use client'\nimport type { PayloadRequest, TextFieldClient } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { text } from 'payload/shared'\nimport React, { useEffect, useMemo, useState } from 'react'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { Button } from '../../../elements/Button/index.js'\nimport { CopyToClipboard } from '../../../elements/CopyToClipboard/index.js'\nimport { GenerateConfirmation } from '../../../elements/GenerateConfirmation/index.js'\nimport { useFormFields } from '../../../forms/Form/context.js'\nimport { useField } from '../../../forms/useField/index.js'\nimport { EyeIcon } from '../../../icons/Eye/index.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../../providers/DocumentInfo/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\n\nconst path = 'apiKey'\nconst baseClass = 'api-key'\nconst fieldBaseClass = 'field-type'\n\nexport const APIKey: React.FC<{ readonly enabled: boolean; readonly readOnly?: boolean }> = ({\n enabled,\n readOnly,\n}) => {\n const [initialAPIKey] = useState(uuidv4())\n const [highlightedField, setHighlightedField] = useState(false)\n const [showKey, setShowKey] = useState(false)\n const { i18n, t } = useTranslation()\n const { config, getEntityConfig } = useConfig()\n const { collectionSlug } = useDocumentInfo()\n\n const apiKey = useFormFields(([fields]) => (fields && fields[path]) || null)\n\n const apiKeyField: TextFieldClient = getEntityConfig({ collectionSlug })?.fields?.find(\n (field) => 'name' in field && field.name === 'apiKey',\n ) as TextFieldClient\n\n const validate = (val) =>\n text(val, {\n name: 'apiKey',\n type: 'text',\n blockData: {},\n data: {},\n event: 'onChange',\n maxLength: 48,\n minLength: 24,\n path: ['apiKey'],\n preferences: { fields: {} },\n req: {\n payload: {\n config,\n },\n t,\n } as unknown as PayloadRequest,\n siblingData: {},\n })\n\n const apiKeyValue = apiKey?.value\n\n const apiKeyLabel = useMemo(() => {\n let label: Record<string, string> | string = 'API Key'\n\n if (apiKeyField?.label) {\n label = apiKeyField.label\n }\n\n return getTranslation(label, i18n)\n }, [apiKeyField, i18n])\n\n const APIKeyLabel = useMemo(\n () => (\n <label className={`${baseClass}__label field-label`} htmlFor=\"apiKey\">\n <span>{apiKeyLabel}</span>\n <CopyToClipboard value={apiKeyValue as string} />\n </label>\n ),\n [apiKeyLabel, apiKeyValue],\n )\n\n const fieldType = useField({\n path: 'apiKey',\n validate,\n })\n\n const highlightField = () => {\n if (highlightedField) {\n setHighlightedField(false)\n }\n setTimeout(() => {\n setHighlightedField(true)\n }, 1)\n }\n\n const { setValue, value } = fieldType\n\n useEffect(() => {\n if (!apiKeyValue && enabled) {\n setValue(initialAPIKey)\n }\n if (!enabled && apiKeyValue) {\n setValue(null)\n }\n }, [apiKeyValue, enabled, setValue, initialAPIKey])\n\n useEffect(() => {\n if (highlightedField) {\n setTimeout(() => {\n setHighlightedField(false)\n }, 10000)\n }\n }, [highlightedField])\n\n if (!enabled) {\n return null\n }\n\n return (\n <React.Fragment>\n <div className={[fieldBaseClass, 'api-key', 'read-only'].filter(Boolean).join(' ')}>\n {APIKeyLabel}\n <div className={`${baseClass}__input-wrap`}>\n <input\n aria-label={apiKeyLabel}\n className={highlightedField ? 'highlight' : undefined}\n disabled\n id=\"apiKey\"\n name=\"apiKey\"\n type={showKey ? 'text' : 'password'}\n value={(value as string) || ''}\n />\n <div className={`${baseClass}__toggle-button-wrap`}>\n <Button\n buttonStyle=\"none\"\n className={`${baseClass}__toggle-button`}\n icon={<EyeIcon active={showKey} />}\n onClick={() => setShowKey((prev) => !prev)}\n />\n </div>\n </div>\n </div>\n {!readOnly && (\n <GenerateConfirmation highlightField={highlightField} setKey={() => setValue(uuidv4())} />\n )}\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -37,13 +37,39 @@
|
|
|
37
37
|
gap: calc(var(--base) / 2);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
}
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
.field-type.api-key {
|
|
42
|
+
margin-bottom: var(--base);
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
input {
|
|
45
|
+
@include formInput;
|
|
46
|
+
width: 100%;
|
|
47
|
+
border-top-right-radius: 0;
|
|
48
|
+
border-bottom-right-radius: 0;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.api-key {
|
|
53
|
+
&__input-wrap {
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: center;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
&__toggle-button-wrap {
|
|
59
|
+
display: flex;
|
|
60
|
+
align-self: stretch;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
&__toggle-button {
|
|
64
|
+
@include formInput;
|
|
65
|
+
background: var(--theme-elevation-100);
|
|
66
|
+
border-top-left-radius: 0;
|
|
67
|
+
border-bottom-left-radius: 0;
|
|
68
|
+
margin: 0 0 0 -1px;
|
|
69
|
+
padding: 0 calc(var(--base) / 2);
|
|
70
|
+
box-shadow: none;
|
|
71
|
+
--btn-icon-size: var(--base);
|
|
72
|
+
}
|
|
47
73
|
}
|
|
48
74
|
}
|
|
49
75
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/ui",
|
|
3
|
-
"version": "3.47.0
|
|
3
|
+
"version": "3.47.0",
|
|
4
4
|
"homepage": "https://payloadcms.com",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
"ts-essentials": "10.0.3",
|
|
137
137
|
"use-context-selector": "2.0.0",
|
|
138
138
|
"uuid": "10.0.0",
|
|
139
|
-
"@payloadcms/translations": "3.47.0
|
|
139
|
+
"@payloadcms/translations": "3.47.0"
|
|
140
140
|
},
|
|
141
141
|
"devDependencies": {
|
|
142
142
|
"@babel/cli": "7.27.2",
|
|
@@ -152,13 +152,13 @@
|
|
|
152
152
|
"esbuild": "0.25.5",
|
|
153
153
|
"esbuild-sass-plugin": "3.3.1",
|
|
154
154
|
"@payloadcms/eslint-config": "3.28.0",
|
|
155
|
-
"payload": "3.47.0
|
|
155
|
+
"payload": "3.47.0"
|
|
156
156
|
},
|
|
157
157
|
"peerDependencies": {
|
|
158
158
|
"next": "^15.2.3",
|
|
159
159
|
"react": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020",
|
|
160
160
|
"react-dom": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020",
|
|
161
|
-
"payload": "3.47.0
|
|
161
|
+
"payload": "3.47.0"
|
|
162
162
|
},
|
|
163
163
|
"engines": {
|
|
164
164
|
"node": "^18.20.2 || >=20.9.0"
|