@payloadcms/ui 3.64.0-internal.deef021 → 3.64.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/Autosave/index.js +2 -2
- package/dist/elements/Autosave/index.js.map +1 -1
- package/dist/elements/DeleteMany/index.d.ts.map +1 -1
- package/dist/elements/DeleteMany/index.js +1 -0
- package/dist/elements/DeleteMany/index.js.map +1 -1
- package/dist/elements/EditMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/EditMany/DrawerContent.js +1 -0
- package/dist/elements/EditMany/DrawerContent.js.map +1 -1
- package/dist/elements/PublishMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/PublishMany/DrawerContent.js +1 -0
- package/dist/elements/PublishMany/DrawerContent.js.map +1 -1
- package/dist/elements/RestoreMany/index.d.ts.map +1 -1
- package/dist/elements/RestoreMany/index.js +1 -0
- package/dist/elements/RestoreMany/index.js.map +1 -1
- package/dist/elements/UnpublishMany/DrawerContent.d.ts.map +1 -1
- package/dist/elements/UnpublishMany/DrawerContent.js +1 -0
- package/dist/elements/UnpublishMany/DrawerContent.js.map +1 -1
- package/dist/exports/client/index.js +12 -12
- package/dist/exports/client/index.js.map +4 -4
- package/dist/fields/Upload/Input.d.ts.map +1 -1
- package/dist/fields/Upload/Input.js +54 -25
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/forms/Form/index.d.ts.map +1 -1
- package/dist/forms/Form/index.js +7 -3
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/providers/Auth/index.d.ts +34 -0
- package/dist/providers/Auth/index.d.ts.map +1 -1
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/providers/Locale/index.d.ts.map +1 -1
- package/dist/providers/Locale/index.js +14 -19
- package/dist/providers/Locale/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.d.ts.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js +19 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
- package/dist/utilities/normalizeRelationshipValue.d.ts +29 -0
- package/dist/utilities/normalizeRelationshipValue.d.ts.map +1 -0
- package/dist/utilities/normalizeRelationshipValue.js +59 -0
- package/dist/utilities/normalizeRelationshipValue.js.map +1 -0
- package/dist/utilities/normalizeRelationshipValue.spec.js +373 -0
- package/dist/utilities/normalizeRelationshipValue.spec.js.map +1 -0
- package/dist/views/Edit/Auth/index.d.ts.map +1 -1
- package/dist/views/Edit/Auth/index.js +2 -7
- package/dist/views/Edit/Auth/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderCell.js","names":["MissingEditorProp","formatAdminURL","RenderCustomComponent","RenderServerComponent","DefaultCell","RenderDefaultCell","hasOptionLabelJSXElement","findValueFromPath","renderCell","clientField","collectionSlug","columnIndex","customCellProps","doc","enableRowSelections","i18n","isLinkedColumn","payload","req","rowIndex","serverField","viewType","baseCellClientProps","cellData","undefined","field","rowData","accessor","name","shouldLink","customLinkURL","collectionConfig","collections","config","formatDocURL","admin","adminRoute","routes","defaultURL","path","encodeURIComponent","String","id","customURL","cellClientProps","link","linkURL","cellServerProps","className","onClick","CustomCell","type","editor","Error","components","clientProps","Component","CellComponent","importMap","serverProps","CustomCellComponent","Cell","_jsx","CustomComponent","Fallback"],"sources":["../../../../src/providers/TableColumns/buildColumnState/renderCell.tsx"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type {\n ClientField,\n DefaultCellComponentProps,\n DefaultServerCellComponentProps,\n Document,\n Field,\n Payload,\n PayloadRequest,\n ViewTypes,\n} from 'payload'\n\nimport { MissingEditorProp } from 'payload'\nimport { formatAdminURL } from 'payload/shared'\n\nimport { RenderCustomComponent } from '../../../elements/RenderCustomComponent/index.js'\nimport { RenderServerComponent } from '../../../elements/RenderServerComponent/index.js'\nimport {\n DefaultCell,\n RenderDefaultCell,\n // eslint-disable-next-line payload/no-imports-from-exports-dir -- MUST reference the exports dir: https://github.com/payloadcms/payload/issues/12002#issuecomment-2791493587\n} from '../../../exports/client/index.js'\nimport { hasOptionLabelJSXElement } from '../../../utilities/hasOptionLabelJSXElement.js'\nimport { findValueFromPath } from './findValueFromPath.js'\n\ntype RenderCellArgs = {\n readonly clientField: ClientField\n readonly collectionSlug: string\n readonly columnIndex: number\n readonly customCellProps: DefaultCellComponentProps['customCellProps']\n readonly doc: Document\n readonly enableRowSelections: boolean\n readonly i18n: I18nClient\n readonly isLinkedColumn: boolean\n readonly payload: Payload\n readonly req?: PayloadRequest\n readonly rowIndex: number\n readonly serverField: Field\n readonly viewType?: ViewTypes\n}\nexport function renderCell({\n clientField,\n collectionSlug,\n columnIndex,\n customCellProps,\n doc,\n enableRowSelections,\n i18n,\n isLinkedColumn,\n payload,\n req,\n rowIndex,\n serverField,\n viewType,\n}: RenderCellArgs) {\n const baseCellClientProps: DefaultCellComponentProps = {\n cellData: undefined,\n collectionSlug,\n customCellProps,\n field: clientField,\n rowData: undefined,\n viewType,\n }\n\n const accessor: string | undefined =\n ('accessor' in clientField ? (clientField.accessor as string) : undefined) ??\n ('name' in clientField ? clientField.name : undefined)\n\n // Check if there's a custom formatDocURL function for this linked column\n let shouldLink = isLinkedColumn\n let customLinkURL: string | undefined\n\n if (isLinkedColumn && req) {\n const collectionConfig = payload.collections[collectionSlug]?.config\n const formatDocURL = collectionConfig?.admin?.formatDocURL\n\n if (typeof formatDocURL === 'function') {\n // Generate the default URL that would normally be used\n const adminRoute = req.payload.config.routes?.admin || '/admin'\n const defaultURL = formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}${viewType === 'trash' ? '/trash' : ''}/${encodeURIComponent(String(doc.id))}`,\n })\n\n const customURL = formatDocURL({\n collectionSlug,\n defaultURL,\n doc,\n req,\n viewType,\n })\n\n if (customURL === null) {\n // formatDocURL returned null = disable linking entirely\n shouldLink = false\n } else if (typeof customURL === 'string') {\n // formatDocURL returned a string = use custom URL\n shouldLink = true\n customLinkURL = customURL\n } else {\n // formatDocURL returned unexpected type = disable linking for safety\n shouldLink = false\n }\n }\n }\n\n const cellClientProps: DefaultCellComponentProps = {\n ...baseCellClientProps,\n cellData: 'name' in clientField ? findValueFromPath(doc, accessor) : undefined,\n link: shouldLink,\n linkURL: customLinkURL,\n rowData: doc,\n }\n\n const cellServerProps: DefaultServerCellComponentProps = {\n cellData: cellClientProps.cellData,\n className: baseCellClientProps.className,\n collectionConfig: payload.collections[collectionSlug].config,\n collectionSlug,\n columnIndex,\n customCellProps: baseCellClientProps.customCellProps,\n field: serverField,\n i18n,\n link: shouldLink,\n linkURL: customLinkURL,\n onClick: baseCellClientProps.onClick,\n payload,\n rowData: doc,\n }\n\n let CustomCell = null\n\n if (serverField?.type === 'richText') {\n if (!serverField?.editor) {\n throw new MissingEditorProp(serverField) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof serverField?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n if (!serverField.admin) {\n serverField.admin = {}\n }\n\n if (!serverField.admin.components) {\n serverField.admin.components = {}\n }\n\n CustomCell = RenderServerComponent({\n clientProps: cellClientProps,\n Component: serverField.editor.CellComponent,\n importMap: payload.importMap,\n serverProps: cellServerProps,\n })\n } else {\n const CustomCellComponent = serverField?.admin?.components?.Cell\n\n if (CustomCellComponent) {\n CustomCell = RenderServerComponent({\n clientProps: cellClientProps,\n Component: CustomCellComponent,\n importMap: payload.importMap,\n serverProps: cellServerProps,\n })\n } else if (\n cellClientProps.cellData &&\n cellClientProps.field &&\n hasOptionLabelJSXElement(cellClientProps)\n ) {\n CustomCell = RenderServerComponent({\n clientProps: cellClientProps,\n Component: DefaultCell,\n importMap: payload.importMap,\n })\n } else {\n const CustomCellComponent = serverField?.admin?.components?.Cell\n\n if (CustomCellComponent) {\n CustomCell = RenderServerComponent({\n clientProps: cellClientProps,\n Component: CustomCellComponent,\n importMap: payload.importMap,\n serverProps: cellServerProps,\n })\n } else {\n CustomCell = undefined\n }\n }\n }\n\n return (\n <RenderCustomComponent\n CustomComponent={CustomCell}\n Fallback={\n <RenderDefaultCell\n clientProps={cellClientProps}\n columnIndex={columnIndex}\n enableRowSelections={enableRowSelections}\n isLinkedColumn={isLinkedColumn}\n />\n }\n key={`${rowIndex}-${columnIndex}`}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"renderCell.js","names":["MissingEditorProp","formatAdminURL","RenderCustomComponent","RenderServerComponent","DefaultCell","RenderDefaultCell","hasOptionLabelJSXElement","findValueFromPath","renderCell","clientField","collectionSlug","columnIndex","customCellProps","doc","enableRowSelections","i18n","isLinkedColumn","payload","req","rowIndex","serverField","viewType","baseCellClientProps","cellData","undefined","field","rowData","accessor","name","shouldLink","customLinkURL","collectionConfig","collections","config","formatDocURL","admin","adminRoute","routes","defaultURL","path","encodeURIComponent","String","id","customURL","_displayStatus","enrichedClientField","type","hasChangedOption","options","some","opt","value","label","t","cellClientProps","link","linkURL","cellServerProps","className","onClick","CustomCell","editor","Error","components","clientProps","Component","CellComponent","importMap","serverProps","CustomCellComponent","Cell","_jsx","CustomComponent","Fallback"],"sources":["../../../../src/providers/TableColumns/buildColumnState/renderCell.tsx"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type {\n ClientField,\n DefaultCellComponentProps,\n DefaultServerCellComponentProps,\n Document,\n Field,\n Payload,\n PayloadRequest,\n ViewTypes,\n} from 'payload'\n\nimport { MissingEditorProp } from 'payload'\nimport { formatAdminURL } from 'payload/shared'\n\nimport { RenderCustomComponent } from '../../../elements/RenderCustomComponent/index.js'\nimport { RenderServerComponent } from '../../../elements/RenderServerComponent/index.js'\nimport {\n DefaultCell,\n RenderDefaultCell,\n // eslint-disable-next-line payload/no-imports-from-exports-dir -- MUST reference the exports dir: https://github.com/payloadcms/payload/issues/12002#issuecomment-2791493587\n} from '../../../exports/client/index.js'\nimport { hasOptionLabelJSXElement } from '../../../utilities/hasOptionLabelJSXElement.js'\nimport { findValueFromPath } from './findValueFromPath.js'\n\ntype RenderCellArgs = {\n readonly clientField: ClientField\n readonly collectionSlug: string\n readonly columnIndex: number\n readonly customCellProps: DefaultCellComponentProps['customCellProps']\n readonly doc: Document\n readonly enableRowSelections: boolean\n readonly i18n: I18nClient\n readonly isLinkedColumn: boolean\n readonly payload: Payload\n readonly req?: PayloadRequest\n readonly rowIndex: number\n readonly serverField: Field\n readonly viewType?: ViewTypes\n}\nexport function renderCell({\n clientField,\n collectionSlug,\n columnIndex,\n customCellProps,\n doc,\n enableRowSelections,\n i18n,\n isLinkedColumn,\n payload,\n req,\n rowIndex,\n serverField,\n viewType,\n}: RenderCellArgs) {\n const baseCellClientProps: DefaultCellComponentProps = {\n cellData: undefined,\n collectionSlug,\n customCellProps,\n field: clientField,\n rowData: undefined,\n viewType,\n }\n\n const accessor: string | undefined =\n ('accessor' in clientField ? (clientField.accessor as string) : undefined) ??\n ('name' in clientField ? clientField.name : undefined)\n\n // Check if there's a custom formatDocURL function for this linked column\n let shouldLink = isLinkedColumn\n let customLinkURL: string | undefined\n\n if (isLinkedColumn && req) {\n const collectionConfig = payload.collections[collectionSlug]?.config\n const formatDocURL = collectionConfig?.admin?.formatDocURL\n\n if (typeof formatDocURL === 'function') {\n // Generate the default URL that would normally be used\n const adminRoute = req.payload.config.routes?.admin || '/admin'\n const defaultURL = formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}${viewType === 'trash' ? '/trash' : ''}/${encodeURIComponent(String(doc.id))}`,\n })\n\n const customURL = formatDocURL({\n collectionSlug,\n defaultURL,\n doc,\n req,\n viewType,\n })\n\n if (customURL === null) {\n // formatDocURL returned null = disable linking entirely\n shouldLink = false\n } else if (typeof customURL === 'string') {\n // formatDocURL returned a string = use custom URL\n shouldLink = true\n customLinkURL = customURL\n } else {\n // formatDocURL returned unexpected type = disable linking for safety\n shouldLink = false\n }\n }\n }\n\n // For _status field, use _displayStatus if available (for showing \"changed\" status in list view)\n const cellData =\n 'name' in clientField && accessor === '_status' && '_displayStatus' in doc\n ? doc._displayStatus\n : 'name' in clientField\n ? findValueFromPath(doc, accessor)\n : undefined\n\n // For _status field, add 'changed' option for display purposes\n // The 'changed' status is computed at runtime\n let enrichedClientField = clientField\n if ('name' in clientField && accessor === '_status' && clientField.type === 'select') {\n const hasChangedOption = clientField.options?.some(\n (opt) => (typeof opt === 'object' ? opt.value : opt) === 'changed',\n )\n if (!hasChangedOption) {\n enrichedClientField = {\n ...clientField,\n options: [\n ...(clientField.options || []),\n {\n label: i18n.t('version:draftHasPublishedVersion'),\n value: 'changed',\n },\n ],\n }\n }\n }\n\n const cellClientProps: DefaultCellComponentProps = {\n ...baseCellClientProps,\n cellData,\n field: enrichedClientField,\n link: shouldLink,\n linkURL: customLinkURL,\n rowData: doc,\n }\n\n const cellServerProps: DefaultServerCellComponentProps = {\n cellData: cellClientProps.cellData,\n className: baseCellClientProps.className,\n collectionConfig: payload.collections[collectionSlug].config,\n collectionSlug,\n columnIndex,\n customCellProps: baseCellClientProps.customCellProps,\n field: serverField,\n i18n,\n link: shouldLink,\n linkURL: customLinkURL,\n onClick: baseCellClientProps.onClick,\n payload,\n rowData: doc,\n }\n\n let CustomCell = null\n\n if (serverField?.type === 'richText') {\n if (!serverField?.editor) {\n throw new MissingEditorProp(serverField) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof serverField?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n if (!serverField.admin) {\n serverField.admin = {}\n }\n\n if (!serverField.admin.components) {\n serverField.admin.components = {}\n }\n\n CustomCell = RenderServerComponent({\n clientProps: cellClientProps,\n Component: serverField.editor.CellComponent,\n importMap: payload.importMap,\n serverProps: cellServerProps,\n })\n } else {\n const CustomCellComponent = serverField?.admin?.components?.Cell\n\n if (CustomCellComponent) {\n CustomCell = RenderServerComponent({\n clientProps: cellClientProps,\n Component: CustomCellComponent,\n importMap: payload.importMap,\n serverProps: cellServerProps,\n })\n } else if (\n cellClientProps.cellData &&\n cellClientProps.field &&\n hasOptionLabelJSXElement(cellClientProps)\n ) {\n CustomCell = RenderServerComponent({\n clientProps: cellClientProps,\n Component: DefaultCell,\n importMap: payload.importMap,\n })\n } else {\n const CustomCellComponent = serverField?.admin?.components?.Cell\n\n if (CustomCellComponent) {\n CustomCell = RenderServerComponent({\n clientProps: cellClientProps,\n Component: CustomCellComponent,\n importMap: payload.importMap,\n serverProps: cellServerProps,\n })\n } else {\n CustomCell = undefined\n }\n }\n }\n\n return (\n <RenderCustomComponent\n CustomComponent={CustomCell}\n Fallback={\n <RenderDefaultCell\n clientProps={cellClientProps}\n columnIndex={columnIndex}\n enableRowSelections={enableRowSelections}\n isLinkedColumn={isLinkedColumn}\n />\n }\n key={`${rowIndex}-${columnIndex}`}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes relationship/upload field values by extracting IDs from nested objects
|
|
3
|
+
* and returning them in the appropriate format based on whether the field is polymorphic.
|
|
4
|
+
*
|
|
5
|
+
* @param value - The value to normalize (can be a simple ID, or an object with relationTo and value)
|
|
6
|
+
* @param relationTo - The relationTo config (string for monomorphic, array for polymorphic)
|
|
7
|
+
* @returns The normalized value (simple ID for monomorphic, {relationTo, value} for polymorphic)
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Monomorphic field - returns simple ID
|
|
11
|
+
* normalizeRelationshipValue('123', 'users') // '123'
|
|
12
|
+
* normalizeRelationshipValue({ relationTo: 'users', value: '123' }, 'users') // '123'
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Polymorphic field - returns {relationTo, value}
|
|
16
|
+
* normalizeRelationshipValue('123', ['users', 'posts']) // '123' (kept as-is, no relationTo to infer)
|
|
17
|
+
* normalizeRelationshipValue({ relationTo: 'users', value: '123' }, ['users', 'posts'])
|
|
18
|
+
* // { relationTo: 'users', value: '123' }
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Handles nested value objects (populated documents)
|
|
22
|
+
* normalizeRelationshipValue(
|
|
23
|
+
* { relationTo: 'users', value: { id: '123', name: 'John' } },
|
|
24
|
+
* ['users', 'posts']
|
|
25
|
+
* )
|
|
26
|
+
* // { relationTo: 'users', value: '123' }
|
|
27
|
+
*/
|
|
28
|
+
export declare function normalizeRelationshipValue(value: any, relationTo: string | string[]): any;
|
|
29
|
+
//# sourceMappingURL=normalizeRelationshipValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeRelationshipValue.d.ts","sourceRoot":"","sources":["../../src/utilities/normalizeRelationshipValue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,CAkCzF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes relationship/upload field values by extracting IDs from nested objects
|
|
3
|
+
* and returning them in the appropriate format based on whether the field is polymorphic.
|
|
4
|
+
*
|
|
5
|
+
* @param value - The value to normalize (can be a simple ID, or an object with relationTo and value)
|
|
6
|
+
* @param relationTo - The relationTo config (string for monomorphic, array for polymorphic)
|
|
7
|
+
* @returns The normalized value (simple ID for monomorphic, {relationTo, value} for polymorphic)
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Monomorphic field - returns simple ID
|
|
11
|
+
* normalizeRelationshipValue('123', 'users') // '123'
|
|
12
|
+
* normalizeRelationshipValue({ relationTo: 'users', value: '123' }, 'users') // '123'
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Polymorphic field - returns {relationTo, value}
|
|
16
|
+
* normalizeRelationshipValue('123', ['users', 'posts']) // '123' (kept as-is, no relationTo to infer)
|
|
17
|
+
* normalizeRelationshipValue({ relationTo: 'users', value: '123' }, ['users', 'posts'])
|
|
18
|
+
* // { relationTo: 'users', value: '123' }
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Handles nested value objects (populated documents)
|
|
22
|
+
* normalizeRelationshipValue(
|
|
23
|
+
* { relationTo: 'users', value: { id: '123', name: 'John' } },
|
|
24
|
+
* ['users', 'posts']
|
|
25
|
+
* )
|
|
26
|
+
* // { relationTo: 'users', value: '123' }
|
|
27
|
+
*/export function normalizeRelationshipValue(value, relationTo) {
|
|
28
|
+
const isPoly = Array.isArray(relationTo);
|
|
29
|
+
// If it's already a simple ID (string or number), return as-is for non-poly or wrap for poly
|
|
30
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
// If it's an object with relationTo and value
|
|
34
|
+
if (value && typeof value === 'object' && 'relationTo' in value && 'value' in value) {
|
|
35
|
+
// Extract the actual ID value, handling nested objects
|
|
36
|
+
let idValue = value.value;
|
|
37
|
+
while (idValue && typeof idValue === 'object' && idValue !== null && 'value' in idValue) {
|
|
38
|
+
idValue = idValue.value;
|
|
39
|
+
}
|
|
40
|
+
// If the nested value is a populated document with an ID, extract it
|
|
41
|
+
if (idValue && typeof idValue === 'object' && idValue !== null && 'id' in idValue) {
|
|
42
|
+
idValue = idValue.id;
|
|
43
|
+
}
|
|
44
|
+
// Return the normalized structure
|
|
45
|
+
if (isPoly) {
|
|
46
|
+
return {
|
|
47
|
+
relationTo: value.relationTo,
|
|
48
|
+
value: idValue
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return idValue;
|
|
52
|
+
}
|
|
53
|
+
// If it's a populated document object (has id but no relationTo/value structure)
|
|
54
|
+
if (value && typeof value === 'object' && 'id' in value) {
|
|
55
|
+
return value.id;
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=normalizeRelationshipValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeRelationshipValue.js","names":["normalizeRelationshipValue","value","relationTo","isPoly","Array","isArray","idValue","id"],"sources":["../../src/utilities/normalizeRelationshipValue.ts"],"sourcesContent":["/**\n * Normalizes relationship/upload field values by extracting IDs from nested objects\n * and returning them in the appropriate format based on whether the field is polymorphic.\n *\n * @param value - The value to normalize (can be a simple ID, or an object with relationTo and value)\n * @param relationTo - The relationTo config (string for monomorphic, array for polymorphic)\n * @returns The normalized value (simple ID for monomorphic, {relationTo, value} for polymorphic)\n *\n * @example\n * // Monomorphic field - returns simple ID\n * normalizeRelationshipValue('123', 'users') // '123'\n * normalizeRelationshipValue({ relationTo: 'users', value: '123' }, 'users') // '123'\n *\n * @example\n * // Polymorphic field - returns {relationTo, value}\n * normalizeRelationshipValue('123', ['users', 'posts']) // '123' (kept as-is, no relationTo to infer)\n * normalizeRelationshipValue({ relationTo: 'users', value: '123' }, ['users', 'posts'])\n * // { relationTo: 'users', value: '123' }\n *\n * @example\n * // Handles nested value objects (populated documents)\n * normalizeRelationshipValue(\n * { relationTo: 'users', value: { id: '123', name: 'John' } },\n * ['users', 'posts']\n * )\n * // { relationTo: 'users', value: '123' }\n */\nexport function normalizeRelationshipValue(value: any, relationTo: string | string[]): any {\n const isPoly = Array.isArray(relationTo)\n\n // If it's already a simple ID (string or number), return as-is for non-poly or wrap for poly\n if (typeof value === 'string' || typeof value === 'number') {\n return value\n }\n\n // If it's an object with relationTo and value\n if (value && typeof value === 'object' && 'relationTo' in value && 'value' in value) {\n // Extract the actual ID value, handling nested objects\n let idValue: any = value.value\n while (idValue && typeof idValue === 'object' && idValue !== null && 'value' in idValue) {\n idValue = idValue.value\n }\n\n // If the nested value is a populated document with an ID, extract it\n if (idValue && typeof idValue === 'object' && idValue !== null && 'id' in idValue) {\n idValue = idValue.id\n }\n\n // Return the normalized structure\n if (isPoly) {\n return { relationTo: value.relationTo, value: idValue }\n }\n return idValue\n }\n\n // If it's a populated document object (has id but no relationTo/value structure)\n if (value && typeof value === 'object' && 'id' in value) {\n return value.id\n }\n\n return value\n}\n"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BA,OAAO,SAASA,2BAA2BC,KAAU,EAAEC,UAA6B;EAClF,MAAMC,MAAA,GAASC,KAAA,CAAMC,OAAO,CAACH,UAAA;EAE7B;EACA,IAAI,OAAOD,KAAA,KAAU,YAAY,OAAOA,KAAA,KAAU,UAAU;IAC1D,OAAOA,KAAA;EACT;EAEA;EACA,IAAIA,KAAA,IAAS,OAAOA,KAAA,KAAU,YAAY,gBAAgBA,KAAA,IAAS,WAAWA,KAAA,EAAO;IACnF;IACA,IAAIK,OAAA,GAAeL,KAAA,CAAMA,KAAK;IAC9B,OAAOK,OAAA,IAAW,OAAOA,OAAA,KAAY,YAAYA,OAAA,KAAY,QAAQ,WAAWA,OAAA,EAAS;MACvFA,OAAA,GAAUA,OAAA,CAAQL,KAAK;IACzB;IAEA;IACA,IAAIK,OAAA,IAAW,OAAOA,OAAA,KAAY,YAAYA,OAAA,KAAY,QAAQ,QAAQA,OAAA,EAAS;MACjFA,OAAA,GAAUA,OAAA,CAAQC,EAAE;IACtB;IAEA;IACA,IAAIJ,MAAA,EAAQ;MACV,OAAO;QAAED,UAAA,EAAYD,KAAA,CAAMC,UAAU;QAAED,KAAA,EAAOK;MAAQ;IACxD;IACA,OAAOA,OAAA;EACT;EAEA;EACA,IAAIL,KAAA,IAAS,OAAOA,KAAA,KAAU,YAAY,QAAQA,KAAA,EAAO;IACvD,OAAOA,KAAA,CAAMM,EAAE;EACjB;EAEA,OAAON,KAAA;AACT","ignoreList":[]}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { describe, expect, it } from '@jest/globals';
|
|
2
|
+
import { normalizeRelationshipValue } from './normalizeRelationshipValue.js';
|
|
3
|
+
describe('normalizeRelationshipValue', () => {
|
|
4
|
+
describe('Monomorphic relationships (string relationTo)', () => {
|
|
5
|
+
const relationTo = 'users';
|
|
6
|
+
it('should return simple string ID as-is', () => {
|
|
7
|
+
const result = normalizeRelationshipValue('user123', relationTo);
|
|
8
|
+
expect(result).toBe('user123');
|
|
9
|
+
});
|
|
10
|
+
it('should return simple number ID as-is', () => {
|
|
11
|
+
const result = normalizeRelationshipValue(123, relationTo);
|
|
12
|
+
expect(result).toBe(123);
|
|
13
|
+
});
|
|
14
|
+
it('should extract ID from object with relationTo and value', () => {
|
|
15
|
+
const value = {
|
|
16
|
+
relationTo: 'users',
|
|
17
|
+
value: 'user456'
|
|
18
|
+
};
|
|
19
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
20
|
+
expect(result).toBe('user456');
|
|
21
|
+
});
|
|
22
|
+
it('should extract ID from nested value structure', () => {
|
|
23
|
+
const value = {
|
|
24
|
+
relationTo: 'users',
|
|
25
|
+
value: {
|
|
26
|
+
value: 'user789'
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
30
|
+
expect(result).toBe('user789');
|
|
31
|
+
});
|
|
32
|
+
it('should extract ID from deeply nested value structure', () => {
|
|
33
|
+
const value = {
|
|
34
|
+
relationTo: 'users',
|
|
35
|
+
value: {
|
|
36
|
+
value: {
|
|
37
|
+
value: 'user999'
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
42
|
+
expect(result).toBe('user999');
|
|
43
|
+
});
|
|
44
|
+
it('should extract ID from populated document', () => {
|
|
45
|
+
const value = {
|
|
46
|
+
relationTo: 'users',
|
|
47
|
+
value: {
|
|
48
|
+
id: 'user111',
|
|
49
|
+
name: 'John Doe',
|
|
50
|
+
email: 'john@example.com'
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
54
|
+
expect(result).toBe('user111');
|
|
55
|
+
});
|
|
56
|
+
it('should extract ID from populated document without relationTo wrapper', () => {
|
|
57
|
+
const value = {
|
|
58
|
+
id: 'user222',
|
|
59
|
+
name: 'Jane Doe',
|
|
60
|
+
email: 'jane@example.com'
|
|
61
|
+
};
|
|
62
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
63
|
+
expect(result).toBe('user222');
|
|
64
|
+
});
|
|
65
|
+
it('should handle null values', () => {
|
|
66
|
+
const result = normalizeRelationshipValue(null, relationTo);
|
|
67
|
+
expect(result).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
it('should handle undefined values', () => {
|
|
70
|
+
const result = normalizeRelationshipValue(undefined, relationTo);
|
|
71
|
+
expect(result).toBeUndefined();
|
|
72
|
+
});
|
|
73
|
+
it('should handle empty object', () => {
|
|
74
|
+
const result = normalizeRelationshipValue({}, relationTo);
|
|
75
|
+
expect(result).toEqual({});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('Polymorphic relationships (array relationTo)', () => {
|
|
79
|
+
const relationTo = ['users', 'posts', 'pages'];
|
|
80
|
+
it('should return simple string ID as-is', () => {
|
|
81
|
+
const result = normalizeRelationshipValue('user123', relationTo);
|
|
82
|
+
expect(result).toBe('user123');
|
|
83
|
+
});
|
|
84
|
+
it('should return simple number ID as-is', () => {
|
|
85
|
+
const result = normalizeRelationshipValue(456, relationTo);
|
|
86
|
+
expect(result).toBe(456);
|
|
87
|
+
});
|
|
88
|
+
it('should preserve relationTo structure with string value', () => {
|
|
89
|
+
const value = {
|
|
90
|
+
relationTo: 'users',
|
|
91
|
+
value: 'user789'
|
|
92
|
+
};
|
|
93
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
94
|
+
expect(result).toEqual({
|
|
95
|
+
relationTo: 'users',
|
|
96
|
+
value: 'user789'
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
it('should preserve relationTo structure with number value', () => {
|
|
100
|
+
const value = {
|
|
101
|
+
relationTo: 'posts',
|
|
102
|
+
value: 123
|
|
103
|
+
};
|
|
104
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
105
|
+
expect(result).toEqual({
|
|
106
|
+
relationTo: 'posts',
|
|
107
|
+
value: 123
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it('should extract ID from nested value structure', () => {
|
|
111
|
+
const value = {
|
|
112
|
+
relationTo: 'posts',
|
|
113
|
+
value: {
|
|
114
|
+
value: 'post456'
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
118
|
+
expect(result).toEqual({
|
|
119
|
+
relationTo: 'posts',
|
|
120
|
+
value: 'post456'
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
it('should extract ID from deeply nested value structure', () => {
|
|
124
|
+
const value = {
|
|
125
|
+
relationTo: 'pages',
|
|
126
|
+
value: {
|
|
127
|
+
value: {
|
|
128
|
+
value: 'page789'
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
133
|
+
expect(result).toEqual({
|
|
134
|
+
relationTo: 'pages',
|
|
135
|
+
value: 'page789'
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
it('should extract ID from populated document', () => {
|
|
139
|
+
const value = {
|
|
140
|
+
relationTo: 'users',
|
|
141
|
+
value: {
|
|
142
|
+
id: 'user999',
|
|
143
|
+
name: 'John Smith',
|
|
144
|
+
email: 'john.smith@example.com'
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
148
|
+
expect(result).toEqual({
|
|
149
|
+
relationTo: 'users',
|
|
150
|
+
value: 'user999'
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
it('should extract ID from complex populated document', () => {
|
|
154
|
+
const value = {
|
|
155
|
+
relationTo: 'posts',
|
|
156
|
+
value: {
|
|
157
|
+
id: 'post123',
|
|
158
|
+
title: 'My Post',
|
|
159
|
+
author: {
|
|
160
|
+
id: 'author456',
|
|
161
|
+
name: 'Author Name'
|
|
162
|
+
},
|
|
163
|
+
createdAt: '2023-01-01T00:00:00.000Z'
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
167
|
+
expect(result).toEqual({
|
|
168
|
+
relationTo: 'posts',
|
|
169
|
+
value: 'post123'
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
it('should handle different relationTo values', () => {
|
|
173
|
+
const values = [{
|
|
174
|
+
relationTo: 'users',
|
|
175
|
+
value: 'user1'
|
|
176
|
+
}, {
|
|
177
|
+
relationTo: 'posts',
|
|
178
|
+
value: 'post2'
|
|
179
|
+
}, {
|
|
180
|
+
relationTo: 'pages',
|
|
181
|
+
value: 'page3'
|
|
182
|
+
}];
|
|
183
|
+
const results = values.map(v => normalizeRelationshipValue(v, relationTo));
|
|
184
|
+
expect(results).toEqual([{
|
|
185
|
+
relationTo: 'users',
|
|
186
|
+
value: 'user1'
|
|
187
|
+
}, {
|
|
188
|
+
relationTo: 'posts',
|
|
189
|
+
value: 'post2'
|
|
190
|
+
}, {
|
|
191
|
+
relationTo: 'pages',
|
|
192
|
+
value: 'page3'
|
|
193
|
+
}]);
|
|
194
|
+
});
|
|
195
|
+
it('should handle null values', () => {
|
|
196
|
+
const result = normalizeRelationshipValue(null, relationTo);
|
|
197
|
+
expect(result).toBeNull();
|
|
198
|
+
});
|
|
199
|
+
it('should handle undefined values', () => {
|
|
200
|
+
const result = normalizeRelationshipValue(undefined, relationTo);
|
|
201
|
+
expect(result).toBeUndefined();
|
|
202
|
+
});
|
|
203
|
+
it('should extract ID from populated document without relationTo wrapper', () => {
|
|
204
|
+
const value = {
|
|
205
|
+
id: 'doc123',
|
|
206
|
+
title: 'Document Title'
|
|
207
|
+
};
|
|
208
|
+
const result = normalizeRelationshipValue(value, relationTo);
|
|
209
|
+
expect(result).toBe('doc123');
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('Edge cases', () => {
|
|
213
|
+
it('should handle object with only value property (no relationTo)', () => {
|
|
214
|
+
const value = {
|
|
215
|
+
value: 'someValue'
|
|
216
|
+
};
|
|
217
|
+
const result = normalizeRelationshipValue(value, 'users');
|
|
218
|
+
// Since there's no 'id' field and no relationTo, it should return the value as-is
|
|
219
|
+
expect(result).toEqual({
|
|
220
|
+
value: 'someValue'
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
it('should handle object with relationTo but no value', () => {
|
|
224
|
+
const value = {
|
|
225
|
+
relationTo: 'users'
|
|
226
|
+
};
|
|
227
|
+
const result = normalizeRelationshipValue(value, ['users', 'posts']);
|
|
228
|
+
expect(result).toEqual({
|
|
229
|
+
relationTo: 'users'
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
it('should handle empty array relationTo', () => {
|
|
233
|
+
const result = normalizeRelationshipValue('user123', []);
|
|
234
|
+
expect(result).toBe('user123');
|
|
235
|
+
});
|
|
236
|
+
it('should handle single-item array relationTo as polymorphic', () => {
|
|
237
|
+
const value = {
|
|
238
|
+
relationTo: 'users',
|
|
239
|
+
value: 'user123'
|
|
240
|
+
};
|
|
241
|
+
const result = normalizeRelationshipValue(value, ['users']);
|
|
242
|
+
expect(result).toEqual({
|
|
243
|
+
relationTo: 'users',
|
|
244
|
+
value: 'user123'
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
it('should handle numeric IDs in populated documents', () => {
|
|
248
|
+
const value = {
|
|
249
|
+
relationTo: 'users',
|
|
250
|
+
value: {
|
|
251
|
+
id: 12345,
|
|
252
|
+
name: 'User with numeric ID'
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
const result = normalizeRelationshipValue(value, ['users', 'posts']);
|
|
256
|
+
expect(result).toEqual({
|
|
257
|
+
relationTo: 'users',
|
|
258
|
+
value: 12345
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
it('should handle nested null values', () => {
|
|
262
|
+
const value = {
|
|
263
|
+
relationTo: 'users',
|
|
264
|
+
value: null
|
|
265
|
+
};
|
|
266
|
+
const result = normalizeRelationshipValue(value, 'users');
|
|
267
|
+
expect(result).toBeNull();
|
|
268
|
+
});
|
|
269
|
+
it('should handle zero as a valid ID', () => {
|
|
270
|
+
const result = normalizeRelationshipValue(0, 'users');
|
|
271
|
+
expect(result).toBe(0);
|
|
272
|
+
});
|
|
273
|
+
it('should handle empty string as a valid ID', () => {
|
|
274
|
+
const result = normalizeRelationshipValue('', 'users');
|
|
275
|
+
expect(result).toBe('');
|
|
276
|
+
});
|
|
277
|
+
it('should handle false as a value', () => {
|
|
278
|
+
const result = normalizeRelationshipValue(false, 'users');
|
|
279
|
+
expect(result).toBe(false);
|
|
280
|
+
});
|
|
281
|
+
it('should handle array values (return as-is)', () => {
|
|
282
|
+
const result = normalizeRelationshipValue(['user1', 'user2'], 'users');
|
|
283
|
+
expect(result).toEqual(['user1', 'user2']);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe('Real-world scenarios', () => {
|
|
287
|
+
it('should normalize upload field value for monomorphic upload', () => {
|
|
288
|
+
// Upload field with populated media document
|
|
289
|
+
const value = {
|
|
290
|
+
id: 'media123',
|
|
291
|
+
filename: 'image.jpg',
|
|
292
|
+
mimeType: 'image/jpeg',
|
|
293
|
+
filesize: 12345,
|
|
294
|
+
url: '/media/image.jpg'
|
|
295
|
+
};
|
|
296
|
+
const result = normalizeRelationshipValue(value, 'media');
|
|
297
|
+
expect(result).toBe('media123');
|
|
298
|
+
});
|
|
299
|
+
it('should normalize upload field value for polymorphic upload', () => {
|
|
300
|
+
// Upload field with relationTo structure
|
|
301
|
+
const value = {
|
|
302
|
+
relationTo: 'images',
|
|
303
|
+
value: {
|
|
304
|
+
id: 'image456',
|
|
305
|
+
filename: 'photo.png',
|
|
306
|
+
url: '/media/photo.png'
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
const result = normalizeRelationshipValue(value, ['images', 'videos']);
|
|
310
|
+
expect(result).toEqual({
|
|
311
|
+
relationTo: 'images',
|
|
312
|
+
value: 'image456'
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
it('should normalize form submission data', () => {
|
|
316
|
+
// Data coming from form with populated relationship
|
|
317
|
+
const value = {
|
|
318
|
+
relationTo: 'posts',
|
|
319
|
+
value: {
|
|
320
|
+
id: 'post789',
|
|
321
|
+
title: 'Blog Post Title',
|
|
322
|
+
author: {
|
|
323
|
+
id: 'author123',
|
|
324
|
+
name: 'Author'
|
|
325
|
+
},
|
|
326
|
+
publishedDate: '2023-12-01'
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
const result = normalizeRelationshipValue(value, ['posts', 'pages']);
|
|
330
|
+
expect(result).toEqual({
|
|
331
|
+
relationTo: 'posts',
|
|
332
|
+
value: 'post789'
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
it('should normalize API response with nested relationships', () => {
|
|
336
|
+
// Complex nested structure from API
|
|
337
|
+
const value = {
|
|
338
|
+
relationTo: 'categories',
|
|
339
|
+
value: {
|
|
340
|
+
value: {
|
|
341
|
+
id: 'cat123',
|
|
342
|
+
name: 'Category Name'
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
const result = normalizeRelationshipValue(value, ['categories', 'tags']);
|
|
347
|
+
expect(result).toEqual({
|
|
348
|
+
relationTo: 'categories',
|
|
349
|
+
value: 'cat123'
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
it('should handle table cell data normalization', () => {
|
|
353
|
+
// Cell data from table that might be just an ID
|
|
354
|
+
const simpleValue = 'user123';
|
|
355
|
+
const result = normalizeRelationshipValue(simpleValue, 'users');
|
|
356
|
+
expect(result).toBe('user123');
|
|
357
|
+
// Cell data with full structure
|
|
358
|
+
const complexValue = {
|
|
359
|
+
relationTo: 'users',
|
|
360
|
+
value: {
|
|
361
|
+
id: 'user456',
|
|
362
|
+
name: 'John Doe'
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
const result2 = normalizeRelationshipValue(complexValue, ['users', 'admins']);
|
|
366
|
+
expect(result2).toEqual({
|
|
367
|
+
relationTo: 'users',
|
|
368
|
+
value: 'user456'
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
//# sourceMappingURL=normalizeRelationshipValue.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeRelationshipValue.spec.js","names":["describe","expect","it","normalizeRelationshipValue","relationTo","result","toBe","value","id","name","email","toBeNull","undefined","toBeUndefined","toEqual","title","author","createdAt","values","results","map","v","filename","mimeType","filesize","url","publishedDate","simpleValue","complexValue","result2"],"sources":["../../src/utilities/normalizeRelationshipValue.spec.ts"],"sourcesContent":["import { describe, expect, it } from '@jest/globals'\n\nimport { normalizeRelationshipValue } from './normalizeRelationshipValue.js'\n\ndescribe('normalizeRelationshipValue', () => {\n describe('Monomorphic relationships (string relationTo)', () => {\n const relationTo = 'users'\n\n it('should return simple string ID as-is', () => {\n const result = normalizeRelationshipValue('user123', relationTo)\n expect(result).toBe('user123')\n })\n\n it('should return simple number ID as-is', () => {\n const result = normalizeRelationshipValue(123, relationTo)\n expect(result).toBe(123)\n })\n\n it('should extract ID from object with relationTo and value', () => {\n const value = { relationTo: 'users', value: 'user456' }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toBe('user456')\n })\n\n it('should extract ID from nested value structure', () => {\n const value = {\n relationTo: 'users',\n value: {\n value: 'user789',\n },\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toBe('user789')\n })\n\n it('should extract ID from deeply nested value structure', () => {\n const value = {\n relationTo: 'users',\n value: {\n value: {\n value: 'user999',\n },\n },\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toBe('user999')\n })\n\n it('should extract ID from populated document', () => {\n const value = {\n relationTo: 'users',\n value: {\n id: 'user111',\n name: 'John Doe',\n email: 'john@example.com',\n },\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toBe('user111')\n })\n\n it('should extract ID from populated document without relationTo wrapper', () => {\n const value = {\n id: 'user222',\n name: 'Jane Doe',\n email: 'jane@example.com',\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toBe('user222')\n })\n\n it('should handle null values', () => {\n const result = normalizeRelationshipValue(null, relationTo)\n expect(result).toBeNull()\n })\n\n it('should handle undefined values', () => {\n const result = normalizeRelationshipValue(undefined, relationTo)\n expect(result).toBeUndefined()\n })\n\n it('should handle empty object', () => {\n const result = normalizeRelationshipValue({}, relationTo)\n expect(result).toEqual({})\n })\n })\n\n describe('Polymorphic relationships (array relationTo)', () => {\n const relationTo = ['users', 'posts', 'pages']\n\n it('should return simple string ID as-is', () => {\n const result = normalizeRelationshipValue('user123', relationTo)\n expect(result).toBe('user123')\n })\n\n it('should return simple number ID as-is', () => {\n const result = normalizeRelationshipValue(456, relationTo)\n expect(result).toBe(456)\n })\n\n it('should preserve relationTo structure with string value', () => {\n const value = { relationTo: 'users', value: 'user789' }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toEqual({ relationTo: 'users', value: 'user789' })\n })\n\n it('should preserve relationTo structure with number value', () => {\n const value = { relationTo: 'posts', value: 123 }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toEqual({ relationTo: 'posts', value: 123 })\n })\n\n it('should extract ID from nested value structure', () => {\n const value = {\n relationTo: 'posts',\n value: {\n value: 'post456',\n },\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toEqual({ relationTo: 'posts', value: 'post456' })\n })\n\n it('should extract ID from deeply nested value structure', () => {\n const value = {\n relationTo: 'pages',\n value: {\n value: {\n value: 'page789',\n },\n },\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toEqual({ relationTo: 'pages', value: 'page789' })\n })\n\n it('should extract ID from populated document', () => {\n const value = {\n relationTo: 'users',\n value: {\n id: 'user999',\n name: 'John Smith',\n email: 'john.smith@example.com',\n },\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toEqual({ relationTo: 'users', value: 'user999' })\n })\n\n it('should extract ID from complex populated document', () => {\n const value = {\n relationTo: 'posts',\n value: {\n id: 'post123',\n title: 'My Post',\n author: {\n id: 'author456',\n name: 'Author Name',\n },\n createdAt: '2023-01-01T00:00:00.000Z',\n },\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toEqual({ relationTo: 'posts', value: 'post123' })\n })\n\n it('should handle different relationTo values', () => {\n const values = [\n { relationTo: 'users', value: 'user1' },\n { relationTo: 'posts', value: 'post2' },\n { relationTo: 'pages', value: 'page3' },\n ]\n\n const results = values.map((v) => normalizeRelationshipValue(v, relationTo))\n\n expect(results).toEqual([\n { relationTo: 'users', value: 'user1' },\n { relationTo: 'posts', value: 'post2' },\n { relationTo: 'pages', value: 'page3' },\n ])\n })\n\n it('should handle null values', () => {\n const result = normalizeRelationshipValue(null, relationTo)\n expect(result).toBeNull()\n })\n\n it('should handle undefined values', () => {\n const result = normalizeRelationshipValue(undefined, relationTo)\n expect(result).toBeUndefined()\n })\n\n it('should extract ID from populated document without relationTo wrapper', () => {\n const value = {\n id: 'doc123',\n title: 'Document Title',\n }\n const result = normalizeRelationshipValue(value, relationTo)\n expect(result).toBe('doc123')\n })\n })\n\n describe('Edge cases', () => {\n it('should handle object with only value property (no relationTo)', () => {\n const value = { value: 'someValue' }\n const result = normalizeRelationshipValue(value, 'users')\n // Since there's no 'id' field and no relationTo, it should return the value as-is\n expect(result).toEqual({ value: 'someValue' })\n })\n\n it('should handle object with relationTo but no value', () => {\n const value = { relationTo: 'users' }\n const result = normalizeRelationshipValue(value, ['users', 'posts'])\n expect(result).toEqual({ relationTo: 'users' })\n })\n\n it('should handle empty array relationTo', () => {\n const result = normalizeRelationshipValue('user123', [])\n expect(result).toBe('user123')\n })\n\n it('should handle single-item array relationTo as polymorphic', () => {\n const value = { relationTo: 'users', value: 'user123' }\n const result = normalizeRelationshipValue(value, ['users'])\n expect(result).toEqual({ relationTo: 'users', value: 'user123' })\n })\n\n it('should handle numeric IDs in populated documents', () => {\n const value = {\n relationTo: 'users',\n value: {\n id: 12345,\n name: 'User with numeric ID',\n },\n }\n const result = normalizeRelationshipValue(value, ['users', 'posts'])\n expect(result).toEqual({ relationTo: 'users', value: 12345 })\n })\n\n it('should handle nested null values', () => {\n const value = {\n relationTo: 'users',\n value: null,\n }\n const result = normalizeRelationshipValue(value, 'users')\n expect(result).toBeNull()\n })\n\n it('should handle zero as a valid ID', () => {\n const result = normalizeRelationshipValue(0, 'users')\n expect(result).toBe(0)\n })\n\n it('should handle empty string as a valid ID', () => {\n const result = normalizeRelationshipValue('', 'users')\n expect(result).toBe('')\n })\n\n it('should handle false as a value', () => {\n const result = normalizeRelationshipValue(false, 'users')\n expect(result).toBe(false)\n })\n\n it('should handle array values (return as-is)', () => {\n const result = normalizeRelationshipValue(['user1', 'user2'], 'users')\n expect(result).toEqual(['user1', 'user2'])\n })\n })\n\n describe('Real-world scenarios', () => {\n it('should normalize upload field value for monomorphic upload', () => {\n // Upload field with populated media document\n const value = {\n id: 'media123',\n filename: 'image.jpg',\n mimeType: 'image/jpeg',\n filesize: 12345,\n url: '/media/image.jpg',\n }\n const result = normalizeRelationshipValue(value, 'media')\n expect(result).toBe('media123')\n })\n\n it('should normalize upload field value for polymorphic upload', () => {\n // Upload field with relationTo structure\n const value = {\n relationTo: 'images',\n value: {\n id: 'image456',\n filename: 'photo.png',\n url: '/media/photo.png',\n },\n }\n const result = normalizeRelationshipValue(value, ['images', 'videos'])\n expect(result).toEqual({ relationTo: 'images', value: 'image456' })\n })\n\n it('should normalize form submission data', () => {\n // Data coming from form with populated relationship\n const value = {\n relationTo: 'posts',\n value: {\n id: 'post789',\n title: 'Blog Post Title',\n author: { id: 'author123', name: 'Author' },\n publishedDate: '2023-12-01',\n },\n }\n const result = normalizeRelationshipValue(value, ['posts', 'pages'])\n expect(result).toEqual({ relationTo: 'posts', value: 'post789' })\n })\n\n it('should normalize API response with nested relationships', () => {\n // Complex nested structure from API\n const value = {\n relationTo: 'categories',\n value: {\n value: {\n id: 'cat123',\n name: 'Category Name',\n },\n },\n }\n const result = normalizeRelationshipValue(value, ['categories', 'tags'])\n expect(result).toEqual({ relationTo: 'categories', value: 'cat123' })\n })\n\n it('should handle table cell data normalization', () => {\n // Cell data from table that might be just an ID\n const simpleValue = 'user123'\n const result = normalizeRelationshipValue(simpleValue, 'users')\n expect(result).toBe('user123')\n\n // Cell data with full structure\n const complexValue = {\n relationTo: 'users',\n value: {\n id: 'user456',\n name: 'John Doe',\n },\n }\n const result2 = normalizeRelationshipValue(complexValue, ['users', 'admins'])\n expect(result2).toEqual({ relationTo: 'users', value: 'user456' })\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Edit/Auth/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA8D,MAAM,OAAO,CAAA;AAGlF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Edit/Auth/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA8D,MAAM,OAAO,CAAA;AAGlF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAWvC,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAqRhC,CAAA"}
|
|
@@ -11,7 +11,6 @@ import { CheckboxField } from '../../../fields/Checkbox/index.js';
|
|
|
11
11
|
import { ConfirmPasswordField } from '../../../fields/ConfirmPassword/index.js';
|
|
12
12
|
import { PasswordField } from '../../../fields/Password/index.js';
|
|
13
13
|
import { useFormFields, useFormModified } from '../../../forms/Form/context.js';
|
|
14
|
-
import { useAuth } from '../../../providers/Auth/index.js';
|
|
15
14
|
import { useConfig } from '../../../providers/Config/index.js';
|
|
16
15
|
import { useDocumentInfo } from '../../../providers/DocumentInfo/index.js';
|
|
17
16
|
import { useTranslation } from '../../../providers/Translation/index.js';
|
|
@@ -34,9 +33,6 @@ export const Auth = props => {
|
|
|
34
33
|
username,
|
|
35
34
|
verify
|
|
36
35
|
} = props;
|
|
37
|
-
const {
|
|
38
|
-
permissions
|
|
39
|
-
} = useAuth();
|
|
40
36
|
const [changingPassword, setChangingPassword] = useState(requirePassword);
|
|
41
37
|
const enableAPIKey = useFormFields(_temp);
|
|
42
38
|
const dispatchFields = useFormFields(_temp2);
|
|
@@ -141,9 +137,8 @@ export const Auth = props => {
|
|
|
141
137
|
const canReadApiKey = apiKeyPermissions === true || apiKeyPermissions?.read;
|
|
142
138
|
let t2;
|
|
143
139
|
bb0: {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
t2 = Boolean("unlock" in collection ? collection.unlock : undefined);
|
|
140
|
+
if (docPermissions) {
|
|
141
|
+
t2 = Boolean("unlock" in docPermissions ? docPermissions.unlock : undefined);
|
|
147
142
|
break bb0;
|
|
148
143
|
}
|
|
149
144
|
t2 = false;
|