@payloadcms/ui 3.68.0-internal-debug.2eb12b9 → 3.68.0-internal-debug.185cc5f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/AnimateHeight/usePatchAnimateHeight.js +2 -2
- package/dist/elements/AnimateHeight/usePatchAnimateHeight.js.map +1 -1
- package/dist/elements/Autosave/index.js +1 -0
- package/dist/elements/Autosave/index.js.map +1 -1
- package/dist/elements/BulkUpload/EditMany/index.js +2 -2
- package/dist/elements/BulkUpload/EditMany/index.js.map +1 -1
- package/dist/elements/BulkUpload/FormsManager/index.js +8 -8
- package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
- package/dist/elements/BulkUpload/index.js +12 -1
- package/dist/elements/BulkUpload/index.js.map +1 -1
- package/dist/elements/Button/index.js +2 -2
- package/dist/elements/Button/index.js.map +1 -1
- package/dist/elements/Button/types.js +13 -1
- package/dist/elements/Button/types.js.map +1 -1
- package/dist/elements/Card/index.js +5 -1
- package/dist/elements/Card/index.js.map +1 -1
- package/dist/elements/CodeEditor/CodeEditor.js +2 -2
- package/dist/elements/CodeEditor/CodeEditor.js.map +1 -1
- package/dist/elements/CodeEditor/types.js +3 -1
- package/dist/elements/CodeEditor/types.js.map +1 -1
- package/dist/elements/Collapsible/index.js +8 -1
- package/dist/elements/Collapsible/index.js.map +1 -1
- package/dist/elements/Combobox/index.js +6 -0
- package/dist/elements/Combobox/index.js.map +1 -1
- package/dist/elements/DatePicker/DatePicker.js +1 -0
- package/dist/elements/DatePicker/DatePicker.js.map +1 -1
- package/dist/elements/DatePicker/getFormattedLocale.js +1 -0
- package/dist/elements/DatePicker/getFormattedLocale.js.map +1 -1
- package/dist/elements/DeleteMany/index.js +25 -1
- package/dist/elements/DeleteMany/index.js.map +1 -1
- package/dist/elements/DocumentControls/index.js +1 -1
- package/dist/elements/DocumentControls/index.js.map +1 -1
- package/dist/elements/DocumentDrawer/Provider.js +5 -1
- package/dist/elements/DocumentDrawer/Provider.js.map +1 -1
- package/dist/elements/DocumentDrawer/types.js +11 -1
- package/dist/elements/DocumentDrawer/types.js.map +1 -1
- package/dist/elements/DraggableSortable/useDraggableSortable/index.js +1 -0
- package/dist/elements/DraggableSortable/useDraggableSortable/index.js.map +1 -1
- package/dist/elements/Drawer/index.js +3 -1
- package/dist/elements/Drawer/index.js.map +1 -1
- package/dist/elements/EditMany/DrawerContent.js +15 -1
- package/dist/elements/EditMany/DrawerContent.js.map +1 -1
- package/dist/elements/EditMany/index.js +3 -1
- package/dist/elements/EditMany/index.js.map +1 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.js +8 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.js.map +1 -1
- package/dist/elements/FolderView/FolderFileCard/index.js +1 -0
- package/dist/elements/FolderView/FolderFileCard/index.js.map +1 -1
- package/dist/elements/FolderView/MoveDocToFolder/index.js +2 -3
- package/dist/elements/FolderView/MoveDocToFolder/index.js.map +1 -1
- package/dist/elements/HTMLDiff/diff/index.js +24 -3
- package/dist/elements/HTMLDiff/diff/index.js.map +1 -1
- package/dist/elements/HydrateAuthProvider/index.js +6 -1
- package/dist/elements/HydrateAuthProvider/index.js.map +1 -1
- package/dist/elements/LeaveWithoutSaving/usePreventLeave.js +3 -1
- package/dist/elements/LeaveWithoutSaving/usePreventLeave.js.map +1 -1
- package/dist/elements/Link/index.js +5 -1
- package/dist/elements/Link/index.js.map +1 -1
- package/dist/elements/ListControls/types.js +7 -1
- package/dist/elements/ListControls/types.js.map +1 -1
- package/dist/elements/ListDrawer/DrawerContent.js +2 -2
- package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
- package/dist/elements/ListDrawer/Provider.js +8 -1
- package/dist/elements/ListDrawer/Provider.js.map +1 -1
- package/dist/elements/ListDrawer/index.js +2 -1
- package/dist/elements/ListDrawer/index.js.map +1 -1
- package/dist/elements/ListDrawer/types.js +5 -1
- package/dist/elements/ListDrawer/types.js.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js +5 -1
- package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js.map +1 -1
- package/dist/elements/ListSelection/index.js +11 -1
- package/dist/elements/ListSelection/index.js.map +1 -1
- package/dist/elements/LivePreview/Toolbar/Controls/index.js +1 -1
- package/dist/elements/LivePreview/Toolbar/Controls/index.js.map +1 -1
- package/dist/elements/Logout/index.js +5 -1
- package/dist/elements/Logout/index.js.map +1 -1
- package/dist/elements/Pill/index.js +5 -2
- package/dist/elements/Pill/index.js.map +1 -1
- package/dist/elements/PublishMany/index.js +3 -1
- package/dist/elements/PublishMany/index.js.map +1 -1
- package/dist/elements/QueryPresets/QueryPresetBar/index.js +1 -2
- package/dist/elements/QueryPresets/QueryPresetBar/index.js.map +1 -1
- package/dist/elements/ReactSelect/index.js +2 -2
- package/dist/elements/ReactSelect/index.js.map +1 -1
- package/dist/elements/ReactSelect/types.js +8 -1
- package/dist/elements/ReactSelect/types.js.map +1 -1
- package/dist/elements/RelationshipTable/index.js +2 -2
- package/dist/elements/RelationshipTable/index.js.map +1 -1
- package/dist/elements/RestoreMany/index.js +1 -0
- package/dist/elements/RestoreMany/index.js.map +1 -1
- package/dist/elements/SaveButton/index.js +1 -2
- package/dist/elements/SaveButton/index.js.map +1 -1
- package/dist/elements/SaveDraftButton/index.js +1 -2
- package/dist/elements/SaveDraftButton/index.js.map +1 -1
- package/dist/elements/SearchFilter/types.js +19 -1
- package/dist/elements/SearchFilter/types.js.map +1 -1
- package/dist/elements/Status/index.js +2 -2
- package/dist/elements/Status/index.js.map +1 -1
- package/dist/elements/StepNav/index.js +5 -1
- package/dist/elements/StepNav/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/fields/Select/index.js +4 -4
- package/dist/elements/Table/DefaultCell/fields/Select/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/index.js +2 -1
- package/dist/elements/Table/DefaultCell/index.js.map +1 -1
- package/dist/elements/Table/RelationshipProvider/index.js +3 -0
- package/dist/elements/Table/RelationshipProvider/index.js.map +1 -1
- package/dist/elements/Thumbnail/createThumbnail.js +12 -12
- package/dist/elements/Thumbnail/createThumbnail.js.map +1 -1
- package/dist/elements/Tooltip/index.js +3 -1
- package/dist/elements/Tooltip/index.js.map +1 -1
- package/dist/elements/UnpublishMany/index.js +3 -1
- package/dist/elements/UnpublishMany/index.js.map +1 -1
- package/dist/elements/Upload/index.js +8 -8
- package/dist/elements/Upload/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Number/index.js +1 -0
- package/dist/elements/WhereBuilder/Condition/Number/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js +5 -6
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
- package/dist/elements/WhereBuilder/Condition/Text/index.js +1 -0
- package/dist/elements/WhereBuilder/Condition/Text/index.js.map +1 -1
- package/dist/elements/WhereBuilder/index.js +2 -2
- package/dist/elements/WhereBuilder/index.js.map +1 -1
- package/dist/exports/client/index.js +26 -2
- package/dist/exports/client/index.js.map +1 -1
- package/dist/exports/shared/index.js +2 -1
- package/dist/exports/shared/index.js.map +1 -1
- package/dist/fields/Blocks/BlockSelector/index.js +3 -1
- package/dist/fields/Blocks/BlockSelector/index.js.map +1 -1
- package/dist/fields/Email/index.js +1 -1
- package/dist/fields/Email/index.js.map +1 -1
- package/dist/fields/Group/index.js +1 -1
- package/dist/fields/Group/index.js.map +1 -1
- package/dist/fields/Number/index.js +5 -3
- package/dist/fields/Number/index.js.map +1 -1
- package/dist/fields/Password/types.js +11 -1
- package/dist/fields/Password/types.js.map +1 -1
- package/dist/fields/Point/index.js +2 -2
- package/dist/fields/Point/index.js.map +1 -1
- package/dist/fields/Relationship/select-components/MultiValueLabel/index.js +4 -1
- package/dist/fields/Relationship/select-components/MultiValueLabel/index.js.map +1 -1
- package/dist/fields/Relationship/select-components/SingleValue/index.js +4 -1
- package/dist/fields/Relationship/select-components/SingleValue/index.js.map +1 -1
- package/dist/fields/Text/index.js +3 -2
- package/dist/fields/Text/index.js.map +1 -1
- package/dist/fields/Upload/Input.js +3 -1
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/fields/Upload/types.js +1 -0
- package/dist/fields/Upload/types.js.map +1 -1
- package/dist/fields/shared/index.js +2 -3
- package/dist/fields/shared/index.js.map +1 -1
- package/dist/forms/Form/fieldReducer.js +2 -1
- package/dist/forms/Form/fieldReducer.js.map +1 -1
- package/dist/forms/Form/index.js +12 -9
- package/dist/forms/Form/index.js.map +1 -1
- package/dist/forms/Form/mergeServerFormState.js +11 -3
- package/dist/forms/Form/mergeServerFormState.js.map +1 -1
- package/dist/forms/Form/reduceToSerializableFields.js +2 -2
- package/dist/forms/Form/reduceToSerializableFields.js.map +1 -1
- package/dist/forms/Form/types.js +52 -1
- package/dist/forms/Form/types.js.map +1 -1
- package/dist/forms/NullifyField/index.js +2 -1
- package/dist/forms/NullifyField/index.js.map +1 -1
- package/dist/forms/WatchChildErrors/index.js +6 -1
- package/dist/forms/WatchChildErrors/index.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +20 -0
- package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/index.js +33 -1
- package/dist/forms/fieldSchemasToFormState/index.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js +2 -2
- package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/iterateFields.js +16 -0
- package/dist/forms/fieldSchemasToFormState/iterateFields.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/renderField.js +2 -2
- package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js +22 -1
- package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js.map +1 -1
- package/dist/forms/fieldSchemasToFormState/types.js +5 -1
- package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
- package/dist/forms/useField/index.js +1 -0
- package/dist/forms/useField/index.js.map +1 -1
- package/dist/forms/useField/types.js +19 -1
- package/dist/forms/useField/types.js.map +1 -1
- package/dist/hooks/useControllableState.js +9 -1
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useDelayedRender.js +3 -1
- package/dist/hooks/useDelayedRender.js.map +1 -1
- package/dist/hooks/useHotkey.js +2 -2
- package/dist/hooks/useHotkey.js.map +1 -1
- package/dist/hooks/usePayloadAPI.js +3 -4
- package/dist/hooks/usePayloadAPI.js.map +1 -1
- package/dist/hooks/usePopupWindow.js +2 -2
- package/dist/hooks/usePopupWindow.js.map +1 -1
- package/dist/hooks/useQueue.js +15 -7
- package/dist/hooks/useQueue.js.map +1 -1
- package/dist/hooks/useResize.js +4 -3
- package/dist/hooks/useResize.js.map +1 -1
- package/dist/providers/Auth/index.js +35 -3
- package/dist/providers/Auth/index.js.map +1 -1
- package/dist/providers/Config/index.js +10 -1
- package/dist/providers/Config/index.js.map +1 -1
- package/dist/providers/DocumentInfo/index.js +6 -7
- package/dist/providers/DocumentInfo/index.js.map +1 -1
- package/dist/providers/DocumentInfo/types.js +25 -1
- package/dist/providers/DocumentInfo/types.js.map +1 -1
- package/dist/providers/Folders/index.js +44 -2
- package/dist/providers/Folders/index.js.map +1 -1
- package/dist/providers/ListQuery/types.js +5 -1
- package/dist/providers/ListQuery/types.js.map +1 -1
- package/dist/providers/LivePreview/context.js +11 -1
- package/dist/providers/LivePreview/context.js.map +1 -1
- package/dist/providers/LivePreview/index.js +7 -4
- package/dist/providers/LivePreview/index.js.map +1 -1
- package/dist/providers/Preferences/index.js +7 -2
- package/dist/providers/Preferences/index.js.map +1 -1
- package/dist/providers/RouteTransition/index.js +9 -9
- package/dist/providers/RouteTransition/index.js.map +1 -1
- package/dist/providers/Selection/index.js +7 -2
- package/dist/providers/Selection/index.js.map +1 -1
- package/dist/providers/ServerFunctions/index.js +25 -22
- package/dist/providers/ServerFunctions/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/index.js +10 -9
- package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js +4 -3
- package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
- package/dist/providers/TableColumns/types.js +17 -1
- package/dist/providers/TableColumns/types.js.map +1 -1
- package/dist/utilities/abortAndIgnore.js +4 -6
- package/dist/utilities/abortAndIgnore.js.map +1 -1
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js +2 -2
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js.map +1 -1
- package/dist/utilities/copyDataFromLocale.js +6 -2
- package/dist/utilities/copyDataFromLocale.js.map +1 -1
- package/dist/utilities/getDisplayedFieldValue.js +8 -8
- package/dist/utilities/getDisplayedFieldValue.js.map +1 -1
- package/dist/utilities/getFolderResultsComponentAndData.js +2 -1
- package/dist/utilities/getFolderResultsComponentAndData.js.map +1 -1
- package/dist/utilities/handleFormStateLocking.js +2 -2
- package/dist/utilities/handleFormStateLocking.js.map +1 -1
- package/dist/utilities/hasSavePermission.js +5 -1
- package/dist/utilities/hasSavePermission.js.map +1 -1
- package/dist/utilities/isURLAllowed.js +6 -6
- package/dist/utilities/isURLAllowed.js.map +1 -1
- package/dist/utilities/renderTable.js +2 -1
- package/dist/utilities/renderTable.js.map +1 -1
- package/dist/utilities/schedulePublishHandler.js +3 -1
- package/dist/utilities/schedulePublishHandler.js.map +1 -1
- package/dist/utilities/upsertPreferences.js +1 -0
- package/dist/utilities/upsertPreferences.js.map +1 -1
- package/dist/views/Edit/index.js +7 -7
- package/dist/views/Edit/index.js.map +1 -1
- package/dist/views/List/ListHeader/index.js +6 -1
- package/dist/views/List/ListHeader/index.js.map +1 -1
- package/package.json +6 -5
|
@@ -159,7 +159,8 @@ export const copyDataFromLocale = async (args)=>{
|
|
|
159
159
|
locale: fromLocale,
|
|
160
160
|
overrideAccess: false,
|
|
161
161
|
user
|
|
162
|
-
}) :
|
|
162
|
+
}) : // `select` would allow us to select only the fields we need in the future
|
|
163
|
+
payload.findByID({
|
|
163
164
|
id: docID,
|
|
164
165
|
collection: collectionSlug,
|
|
165
166
|
depth: 0,
|
|
@@ -168,13 +169,15 @@ export const copyDataFromLocale = async (args)=>{
|
|
|
168
169
|
overrideAccess: false,
|
|
169
170
|
user
|
|
170
171
|
}),
|
|
172
|
+
// `select` would allow us to select only the fields we need in the future
|
|
171
173
|
globalSlug ? payload.findGlobal({
|
|
172
174
|
slug: globalSlug,
|
|
173
175
|
depth: 0,
|
|
174
176
|
locale: toLocale,
|
|
175
177
|
overrideAccess: false,
|
|
176
178
|
user
|
|
177
|
-
}) :
|
|
179
|
+
}) : // `select` would allow us to select only the fields we need in the future
|
|
180
|
+
payload.findByID({
|
|
178
181
|
id: docID,
|
|
179
182
|
collection: collectionSlug,
|
|
180
183
|
depth: 0,
|
|
@@ -184,6 +187,7 @@ export const copyDataFromLocale = async (args)=>{
|
|
|
184
187
|
user
|
|
185
188
|
})
|
|
186
189
|
]);
|
|
190
|
+
// `select` would allow us to select only the fields we need in the future
|
|
187
191
|
if (fromLocaleData.status === 'rejected') {
|
|
188
192
|
throw new Error(`Error fetching data from locale "${fromLocale}"`);
|
|
189
193
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/copyDataFromLocale.ts"],"sourcesContent":["import ObjectIdImport from 'bson-objectid'\nimport {\n canAccessAdmin,\n type CollectionSlug,\n type Data,\n type Field,\n type FlattenedBlock,\n formatErrors,\n type PayloadRequest,\n type ServerFunction,\n traverseFields,\n} from 'payload'\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from 'payload/shared'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nexport type CopyDataFromLocaleArgs = {\n collectionSlug?: CollectionSlug\n docID?: number | string\n fromLocale: string\n globalSlug?: string\n overrideData?: boolean\n req: PayloadRequest\n toLocale: string\n}\n\nfunction iterateFields(\n fields: Field[],\n fromLocaleData: Data,\n toLocaleData: Data,\n req: PayloadRequest,\n parentIsLocalized: boolean,\n): void {\n fields.map((field) => {\n if (fieldAffectsData(field)) {\n switch (field.type) {\n case 'array':\n // if the field has no value, take the source value\n if (\n field.name in toLocaleData &&\n // only replace if the target value is null or undefined\n [null, undefined].includes(toLocaleData[field.name]) &&\n field.name in fromLocaleData\n ) {\n toLocaleData[field.name] = fromLocaleData[field.name]\n break\n }\n\n // if the field has a value - loop over the data from target\n if (field.name in toLocaleData) {\n toLocaleData[field.name].map((item: Data, index: number) => {\n if (fromLocaleData[field.name]?.[index]) {\n // Generate new IDs if the field is localized to prevent errors with relational DBs.\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n toLocaleData[field.name][index].id = new ObjectId().toHexString()\n }\n\n iterateFields(\n field.fields,\n fromLocaleData[field.name][index],\n item,\n req,\n parentIsLocalized || field.localized,\n )\n }\n })\n }\n break\n\n case 'blocks':\n // if the field has no value, take the source value\n if (\n field.name in toLocaleData &&\n // only replace if the target value is null, undefined, or empty array\n ([null, undefined].includes(toLocaleData[field.name]) ||\n (Array.isArray(toLocaleData[field.name]) && toLocaleData[field.name].length === 0)) &&\n field.name in fromLocaleData\n ) {\n toLocaleData[field.name] = fromLocaleData[field.name]\n break\n }\n\n // if the field has a value - loop over the data from target\n if (field.name in toLocaleData) {\n toLocaleData[field.name].map((blockData: Data, index: number) => {\n const block =\n req.payload.blocks[blockData.blockType] ??\n ((field.blockReferences ?? field.blocks).find(\n (block) => typeof block !== 'string' && block.slug === blockData.blockType,\n ) as FlattenedBlock | undefined)\n\n // Generate new IDs if the field is localized to prevent errors with relational DBs.\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n toLocaleData[field.name][index].id = new ObjectId().toHexString()\n }\n\n if (block?.fields?.length) {\n iterateFields(\n block?.fields,\n fromLocaleData[field.name][index],\n blockData,\n req,\n parentIsLocalized || field.localized,\n )\n }\n })\n }\n\n break\n\n case 'checkbox':\n case 'code':\n case 'date':\n case 'email':\n case 'json':\n case 'number':\n case 'point':\n case 'radio':\n case 'relationship':\n case 'richText':\n case 'select':\n case 'text':\n case 'textarea':\n case 'upload':\n if (\n field.name in toLocaleData &&\n // only replace if the target value is null or undefined\n [null, undefined].includes(toLocaleData[field.name]) &&\n field.name in fromLocaleData\n ) {\n toLocaleData[field.name] = fromLocaleData[field.name]\n }\n break\n\n case 'group': {\n if (\n fieldAffectsData(field) &&\n field.name in toLocaleData &&\n fromLocaleData?.[field.name] !== undefined\n ) {\n iterateFields(\n field.fields,\n fromLocaleData[field.name],\n toLocaleData[field.name],\n req,\n parentIsLocalized || field.localized,\n )\n } else {\n iterateFields(field.fields, fromLocaleData, toLocaleData, req, parentIsLocalized)\n }\n break\n }\n }\n } else {\n switch (field.type) {\n case 'collapsible':\n case 'row':\n iterateFields(field.fields, fromLocaleData, toLocaleData, req, parentIsLocalized)\n break\n\n case 'tabs':\n field.tabs.map((tab) => {\n if (tabHasName(tab)) {\n if (tab.name in toLocaleData && fromLocaleData?.[tab.name] !== undefined) {\n iterateFields(\n tab.fields,\n fromLocaleData[tab.name],\n toLocaleData[tab.name],\n req,\n parentIsLocalized,\n )\n }\n } else {\n iterateFields(tab.fields, fromLocaleData, toLocaleData, req, parentIsLocalized)\n }\n })\n break\n }\n }\n })\n}\n\nfunction mergeData(\n fromLocaleData: Data,\n toLocaleData: Data,\n fields: Field[],\n req: PayloadRequest,\n parentIsLocalized: boolean,\n): Data {\n iterateFields(fields, fromLocaleData, toLocaleData, req, parentIsLocalized)\n\n return toLocaleData\n}\n\n/**\n * We don't have to recursively remove all ids,\n * just the ones from the fields inside a localized array or block.\n */\nfunction removeIdIfParentIsLocalized(data: Data, fields: Field[]): Data {\n traverseFields({\n callback: ({ parentIsLocalized, ref }) => {\n if (parentIsLocalized) {\n delete (ref as { id: unknown }).id\n }\n },\n fields,\n fillEmpty: false,\n ref: data,\n })\n\n return data\n}\n\nexport const copyDataFromLocaleHandler: ServerFunction<CopyDataFromLocaleArgs> = async (args) => {\n const { req } = args\n\n try {\n return await copyDataFromLocale(args)\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `There was an error copying data from \"${args.fromLocale}\" to \"${args.toLocale}\"`,\n })\n\n if (err.message === 'Unauthorized') {\n return null\n }\n\n return formatErrors(err)\n }\n}\n\nexport const copyDataFromLocale = async (args: CopyDataFromLocaleArgs) => {\n const {\n collectionSlug,\n docID,\n fromLocale,\n globalSlug,\n overrideData = false,\n req: {\n payload,\n payload: { collections, globals },\n user,\n },\n req,\n toLocale,\n } = args\n\n await canAccessAdmin({ req })\n\n const [fromLocaleData, toLocaleData] = await Promise.allSettled([\n globalSlug\n ? payload.findGlobal({\n slug: globalSlug,\n depth: 0,\n locale: fromLocale,\n overrideAccess: false,\n user,\n // `select` would allow us to select only the fields we need in the future\n })\n : payload.findByID({\n id: docID,\n collection: collectionSlug,\n depth: 0,\n joins: false,\n locale: fromLocale,\n overrideAccess: false,\n user,\n // `select` would allow us to select only the fields we need in the future\n }),\n globalSlug\n ? payload.findGlobal({\n slug: globalSlug,\n depth: 0,\n locale: toLocale,\n overrideAccess: false,\n user,\n // `select` would allow us to select only the fields we need in the future\n })\n : payload.findByID({\n id: docID,\n collection: collectionSlug,\n depth: 0,\n joins: false,\n locale: toLocale,\n overrideAccess: false,\n user,\n // `select` would allow us to select only the fields we need in the future\n }),\n ])\n\n if (fromLocaleData.status === 'rejected') {\n throw new Error(`Error fetching data from locale \"${fromLocale}\"`)\n }\n\n if (toLocaleData.status === 'rejected') {\n throw new Error(`Error fetching data from locale \"${toLocale}\"`)\n }\n\n const fields = globalSlug\n ? globals[globalSlug].config.fields\n : collections[collectionSlug].config.fields\n\n const fromLocaleDataWithoutID = fromLocaleData.value\n const toLocaleDataWithoutID = toLocaleData.value\n\n const dataWithID = overrideData\n ? fromLocaleDataWithoutID\n : mergeData(fromLocaleDataWithoutID, toLocaleDataWithoutID, fields, req, false)\n\n const data = removeIdIfParentIsLocalized(dataWithID, fields)\n\n return globalSlug\n ? await payload.updateGlobal({\n slug: globalSlug,\n data,\n locale: toLocale,\n overrideAccess: false,\n req,\n user,\n })\n : await payload.update({\n id: docID,\n collection: collectionSlug,\n data,\n locale: toLocale,\n overrideAccess: false,\n req,\n user,\n })\n}\n"],"names":["ObjectIdImport","canAccessAdmin","formatErrors","traverseFields","fieldAffectsData","fieldShouldBeLocalized","tabHasName","ObjectId","default","iterateFields","fields","fromLocaleData","toLocaleData","req","parentIsLocalized","map","field","type","name","undefined","includes","item","index","id","toHexString","localized","Array","isArray","length","blockData","block","payload","blocks","blockType","blockReferences","find","slug","tabs","tab","mergeData","removeIdIfParentIsLocalized","data","callback","ref","fillEmpty","copyDataFromLocaleHandler","args","copyDataFromLocale","err","logger","error","msg","fromLocale","toLocale","message","collectionSlug","docID","globalSlug","overrideData","collections","globals","user","Promise","allSettled","findGlobal","depth","locale","overrideAccess","findByID","collection","joins","status","Error","config","fromLocaleDataWithoutID","value","toLocaleDataWithoutID","dataWithID","updateGlobal","update"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/copyDataFromLocale.ts"],"sourcesContent":["import ObjectIdImport from 'bson-objectid'\nimport {\n canAccessAdmin,\n type CollectionSlug,\n type Data,\n type Field,\n type FlattenedBlock,\n formatErrors,\n type PayloadRequest,\n type ServerFunction,\n traverseFields,\n} from 'payload'\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from 'payload/shared'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nexport type CopyDataFromLocaleArgs = {\n collectionSlug?: CollectionSlug\n docID?: number | string\n fromLocale: string\n globalSlug?: string\n overrideData?: boolean\n req: PayloadRequest\n toLocale: string\n}\n\nfunction iterateFields(\n fields: Field[],\n fromLocaleData: Data,\n toLocaleData: Data,\n req: PayloadRequest,\n parentIsLocalized: boolean,\n): void {\n fields.map((field) => {\n if (fieldAffectsData(field)) {\n switch (field.type) {\n case 'array':\n // if the field has no value, take the source value\n if (\n field.name in toLocaleData &&\n // only replace if the target value is null or undefined\n [null, undefined].includes(toLocaleData[field.name]) &&\n field.name in fromLocaleData\n ) {\n toLocaleData[field.name] = fromLocaleData[field.name]\n break\n }\n\n // if the field has a value - loop over the data from target\n if (field.name in toLocaleData) {\n toLocaleData[field.name].map((item: Data, index: number) => {\n if (fromLocaleData[field.name]?.[index]) {\n // Generate new IDs if the field is localized to prevent errors with relational DBs.\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n toLocaleData[field.name][index].id = new ObjectId().toHexString()\n }\n\n iterateFields(\n field.fields,\n fromLocaleData[field.name][index],\n item,\n req,\n parentIsLocalized || field.localized,\n )\n }\n })\n }\n break\n\n case 'blocks':\n // if the field has no value, take the source value\n if (\n field.name in toLocaleData &&\n // only replace if the target value is null, undefined, or empty array\n ([null, undefined].includes(toLocaleData[field.name]) ||\n (Array.isArray(toLocaleData[field.name]) && toLocaleData[field.name].length === 0)) &&\n field.name in fromLocaleData\n ) {\n toLocaleData[field.name] = fromLocaleData[field.name]\n break\n }\n\n // if the field has a value - loop over the data from target\n if (field.name in toLocaleData) {\n toLocaleData[field.name].map((blockData: Data, index: number) => {\n const block =\n req.payload.blocks[blockData.blockType] ??\n ((field.blockReferences ?? field.blocks).find(\n (block) => typeof block !== 'string' && block.slug === blockData.blockType,\n ) as FlattenedBlock | undefined)\n\n // Generate new IDs if the field is localized to prevent errors with relational DBs.\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n toLocaleData[field.name][index].id = new ObjectId().toHexString()\n }\n\n if (block?.fields?.length) {\n iterateFields(\n block?.fields,\n fromLocaleData[field.name][index],\n blockData,\n req,\n parentIsLocalized || field.localized,\n )\n }\n })\n }\n\n break\n\n case 'checkbox':\n case 'code':\n case 'date':\n case 'email':\n case 'json':\n case 'number':\n case 'point':\n case 'radio':\n case 'relationship':\n case 'richText':\n case 'select':\n case 'text':\n case 'textarea':\n case 'upload':\n if (\n field.name in toLocaleData &&\n // only replace if the target value is null or undefined\n [null, undefined].includes(toLocaleData[field.name]) &&\n field.name in fromLocaleData\n ) {\n toLocaleData[field.name] = fromLocaleData[field.name]\n }\n break\n\n case 'group': {\n if (\n fieldAffectsData(field) &&\n field.name in toLocaleData &&\n fromLocaleData?.[field.name] !== undefined\n ) {\n iterateFields(\n field.fields,\n fromLocaleData[field.name],\n toLocaleData[field.name],\n req,\n parentIsLocalized || field.localized,\n )\n } else {\n iterateFields(field.fields, fromLocaleData, toLocaleData, req, parentIsLocalized)\n }\n break\n }\n }\n } else {\n switch (field.type) {\n case 'collapsible':\n case 'row':\n iterateFields(field.fields, fromLocaleData, toLocaleData, req, parentIsLocalized)\n break\n\n case 'tabs':\n field.tabs.map((tab) => {\n if (tabHasName(tab)) {\n if (tab.name in toLocaleData && fromLocaleData?.[tab.name] !== undefined) {\n iterateFields(\n tab.fields,\n fromLocaleData[tab.name],\n toLocaleData[tab.name],\n req,\n parentIsLocalized,\n )\n }\n } else {\n iterateFields(tab.fields, fromLocaleData, toLocaleData, req, parentIsLocalized)\n }\n })\n break\n }\n }\n })\n}\n\nfunction mergeData(\n fromLocaleData: Data,\n toLocaleData: Data,\n fields: Field[],\n req: PayloadRequest,\n parentIsLocalized: boolean,\n): Data {\n iterateFields(fields, fromLocaleData, toLocaleData, req, parentIsLocalized)\n\n return toLocaleData\n}\n\n/**\n * We don't have to recursively remove all ids,\n * just the ones from the fields inside a localized array or block.\n */\nfunction removeIdIfParentIsLocalized(data: Data, fields: Field[]): Data {\n traverseFields({\n callback: ({ parentIsLocalized, ref }) => {\n if (parentIsLocalized) {\n delete (ref as { id: unknown }).id\n }\n },\n fields,\n fillEmpty: false,\n ref: data,\n })\n\n return data\n}\n\nexport const copyDataFromLocaleHandler: ServerFunction<CopyDataFromLocaleArgs> = async (args) => {\n const { req } = args\n\n try {\n return await copyDataFromLocale(args)\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `There was an error copying data from \"${args.fromLocale}\" to \"${args.toLocale}\"`,\n })\n\n if (err.message === 'Unauthorized') {\n return null\n }\n\n return formatErrors(err)\n }\n}\n\nexport const copyDataFromLocale = async (args: CopyDataFromLocaleArgs) => {\n const {\n collectionSlug,\n docID,\n fromLocale,\n globalSlug,\n overrideData = false,\n req: {\n payload,\n payload: { collections, globals },\n user,\n },\n req,\n toLocale,\n } = args\n\n await canAccessAdmin({ req })\n\n const [fromLocaleData, toLocaleData] = await Promise.allSettled([\n globalSlug\n ? payload.findGlobal({\n slug: globalSlug,\n depth: 0,\n locale: fromLocale,\n overrideAccess: false,\n user,\n // `select` would allow us to select only the fields we need in the future\n })\n : payload.findByID({\n id: docID,\n collection: collectionSlug,\n depth: 0,\n joins: false,\n locale: fromLocale,\n overrideAccess: false,\n user,\n // `select` would allow us to select only the fields we need in the future\n }),\n globalSlug\n ? payload.findGlobal({\n slug: globalSlug,\n depth: 0,\n locale: toLocale,\n overrideAccess: false,\n user,\n // `select` would allow us to select only the fields we need in the future\n })\n : payload.findByID({\n id: docID,\n collection: collectionSlug,\n depth: 0,\n joins: false,\n locale: toLocale,\n overrideAccess: false,\n user,\n // `select` would allow us to select only the fields we need in the future\n }),\n ])\n\n if (fromLocaleData.status === 'rejected') {\n throw new Error(`Error fetching data from locale \"${fromLocale}\"`)\n }\n\n if (toLocaleData.status === 'rejected') {\n throw new Error(`Error fetching data from locale \"${toLocale}\"`)\n }\n\n const fields = globalSlug\n ? globals[globalSlug].config.fields\n : collections[collectionSlug].config.fields\n\n const fromLocaleDataWithoutID = fromLocaleData.value\n const toLocaleDataWithoutID = toLocaleData.value\n\n const dataWithID = overrideData\n ? fromLocaleDataWithoutID\n : mergeData(fromLocaleDataWithoutID, toLocaleDataWithoutID, fields, req, false)\n\n const data = removeIdIfParentIsLocalized(dataWithID, fields)\n\n return globalSlug\n ? await payload.updateGlobal({\n slug: globalSlug,\n data,\n locale: toLocale,\n overrideAccess: false,\n req,\n user,\n })\n : await payload.update({\n id: docID,\n collection: collectionSlug,\n data,\n locale: toLocale,\n overrideAccess: false,\n req,\n user,\n })\n}\n"],"names":["ObjectIdImport","canAccessAdmin","formatErrors","traverseFields","fieldAffectsData","fieldShouldBeLocalized","tabHasName","ObjectId","default","iterateFields","fields","fromLocaleData","toLocaleData","req","parentIsLocalized","map","field","type","name","undefined","includes","item","index","id","toHexString","localized","Array","isArray","length","blockData","block","payload","blocks","blockType","blockReferences","find","slug","tabs","tab","mergeData","removeIdIfParentIsLocalized","data","callback","ref","fillEmpty","copyDataFromLocaleHandler","args","copyDataFromLocale","err","logger","error","msg","fromLocale","toLocale","message","collectionSlug","docID","globalSlug","overrideData","collections","globals","user","Promise","allSettled","findGlobal","depth","locale","overrideAccess","findByID","collection","joins","status","Error","config","fromLocaleDataWithoutID","value","toLocaleDataWithoutID","dataWithID","updateGlobal","update"],"mappings":"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"}
|
|
@@ -13,16 +13,16 @@ import { isValidReactElement } from './isValidReactElement.js';
|
|
|
13
13
|
const selectedOption = field.options.find((opt)=>typeof opt === 'object' ? opt.value === cellData : opt === cellData);
|
|
14
14
|
if (selectedOption) {
|
|
15
15
|
if (typeof selectedOption === 'object' && 'label' in selectedOption) {
|
|
16
|
-
return isValidReactElement(selectedOption.label) ? selectedOption.label // Return JSX directly
|
|
17
|
-
|
|
18
|
-
;
|
|
16
|
+
return isValidReactElement(selectedOption.label) ? selectedOption.label : // Return JSX directly
|
|
17
|
+
getTranslation(selectedOption.label, i18n) || selectedOption.value;
|
|
19
18
|
}
|
|
20
|
-
|
|
21
|
-
;
|
|
19
|
+
// Use translation or fallback to value
|
|
20
|
+
return selectedOption;
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
|
-
|
|
25
|
-
;
|
|
26
|
-
}
|
|
23
|
+
// If option is a string, return it directly
|
|
24
|
+
return cellData;
|
|
25
|
+
} // Default fallback if no match found
|
|
26
|
+
;
|
|
27
27
|
|
|
28
28
|
//# sourceMappingURL=getDisplayedFieldValue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getDisplayedFieldValue.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { ClientField } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport { isValidReactElement } from './isValidReactElement.js'\n\n/**\n * Returns the appropriate display value for a field.\n * - For select and radio fields:\n * - Returns JSX elements as-is.\n * - Translates localized label objects based on the current language.\n * - Returns string labels directly.\n * - Falls back to the option value if no valid label is found.\n * - For all other field types, returns `cellData` unchanged.\n */\nexport const getDisplayedFieldValue = (cellData: any, field: ClientField, i18n: I18nClient) => {\n if ((field?.type === 'select' || field?.type === 'radio') && Array.isArray(field.options)) {\n const selectedOption = field.options.find((opt) =>\n typeof opt === 'object' ? opt.value === cellData : opt === cellData,\n )\n\n if (selectedOption) {\n if (typeof selectedOption === 'object' && 'label' in selectedOption) {\n return isValidReactElement(selectedOption.label)\n ? selectedOption.label // Return JSX directly\n : getTranslation(selectedOption.label, i18n) || selectedOption.value // Use translation or fallback to value\n }\n return selectedOption // If option is a string, return it directly\n }\n }\n return cellData // Default fallback if no match found\n}\n"],"names":["getTranslation","isValidReactElement","getDisplayedFieldValue","cellData","field","i18n","type","Array","isArray","options","selectedOption","find","opt","value","label"],"mappings":"AAGA,SAASA,cAAc,QAAQ,2BAA0B;AAEzD,SAASC,mBAAmB,QAAQ,2BAA0B;AAE9D;;;;;;;;CAQC,GACD,OAAO,MAAMC,yBAAyB,CAACC,UAAeC,OAAoBC;IACxE,IAAI,AAACD,CAAAA,OAAOE,SAAS,YAAYF,OAAOE,SAAS,OAAM,KAAMC,MAAMC,OAAO,CAACJ,MAAMK,OAAO,GAAG;QACzF,MAAMC,iBAAiBN,MAAMK,OAAO,CAACE,IAAI,CAAC,CAACC,MACzC,OAAOA,QAAQ,WAAWA,IAAIC,KAAK,KAAKV,WAAWS,QAAQT;QAG7D,IAAIO,gBAAgB;YAClB,IAAI,OAAOA,mBAAmB,YAAY,WAAWA,gBAAgB;gBACnE,OAAOT,oBAAoBS,eAAeI,KAAK,IAC3CJ,eAAeI,KAAK,
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getDisplayedFieldValue.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { ClientField } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport { isValidReactElement } from './isValidReactElement.js'\n\n/**\n * Returns the appropriate display value for a field.\n * - For select and radio fields:\n * - Returns JSX elements as-is.\n * - Translates localized label objects based on the current language.\n * - Returns string labels directly.\n * - Falls back to the option value if no valid label is found.\n * - For all other field types, returns `cellData` unchanged.\n */\nexport const getDisplayedFieldValue = (cellData: any, field: ClientField, i18n: I18nClient) => {\n if ((field?.type === 'select' || field?.type === 'radio') && Array.isArray(field.options)) {\n const selectedOption = field.options.find((opt) =>\n typeof opt === 'object' ? opt.value === cellData : opt === cellData,\n )\n\n if (selectedOption) {\n if (typeof selectedOption === 'object' && 'label' in selectedOption) {\n return isValidReactElement(selectedOption.label)\n ? selectedOption.label // Return JSX directly\n : getTranslation(selectedOption.label, i18n) || selectedOption.value // Use translation or fallback to value\n }\n return selectedOption // If option is a string, return it directly\n }\n }\n return cellData // Default fallback if no match found\n}\n"],"names":["getTranslation","isValidReactElement","getDisplayedFieldValue","cellData","field","i18n","type","Array","isArray","options","selectedOption","find","opt","value","label"],"mappings":"AAGA,SAASA,cAAc,QAAQ,2BAA0B;AAEzD,SAASC,mBAAmB,QAAQ,2BAA0B;AAE9D;;;;;;;;CAQC,GACD,OAAO,MAAMC,yBAAyB,CAACC,UAAeC,OAAoBC;IACxE,IAAI,AAACD,CAAAA,OAAOE,SAAS,YAAYF,OAAOE,SAAS,OAAM,KAAMC,MAAMC,OAAO,CAACJ,MAAMK,OAAO,GAAG;QACzF,MAAMC,iBAAiBN,MAAMK,OAAO,CAACE,IAAI,CAAC,CAACC,MACzC,OAAOA,QAAQ,WAAWA,IAAIC,KAAK,KAAKV,WAAWS,QAAQT;QAG7D,IAAIO,gBAAgB;YAClB,IAAI,OAAOA,mBAAmB,YAAY,WAAWA,gBAAgB;gBACnE,OAAOT,oBAAoBS,eAAeI,KAAK,IAC3CJ,eAAeI,KAAK,GAAC,sBAAsB;gBAC3Cd,eAAeU,eAAeI,KAAK,EAAET,SAASK,eAAeG,KAAK;YACxE;YADyE,uCAAuC;YAEhH,OAAOH;QACT;IACF;IAF0B,4CAA4C;IAGtE,OAAOP;AACT,EADkB,qCAAqC;CACtD"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { APIError, formatErrors, getFolderData } from 'payload';
|
|
3
3
|
import { buildFolderWhereConstraints, combineWhereConstraints } from 'payload/shared';
|
|
4
|
-
import { FolderFileTable, ItemCardGrid } from
|
|
4
|
+
import { FolderFileTable, ItemCardGrid } from // eslint-disable-next-line payload/no-imports-from-exports-dir -- This component is returned via server functions, it must reference the exports dir
|
|
5
|
+
'../exports/client/index.js';
|
|
5
6
|
export const getFolderResultsComponentAndDataHandler = async (args)=>{
|
|
6
7
|
const { req } = args;
|
|
7
8
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getFolderResultsComponentAndData.tsx"],"sourcesContent":["import type {\n CollectionSlug,\n ErrorResult,\n GetFolderResultsComponentAndDataArgs,\n ServerFunction,\n Where,\n} from 'payload'\nimport type { FolderBreadcrumb, FolderOrDocument } from 'payload/shared'\n\nimport { APIError, formatErrors, getFolderData } from 'payload'\nimport { buildFolderWhereConstraints, combineWhereConstraints } from 'payload/shared'\n\nimport {\n FolderFileTable,\n ItemCardGrid,\n // eslint-disable-next-line payload/no-imports-from-exports-dir -- This component is returned via server functions, it must reference the exports dir\n} from '../exports/client/index.js'\n\ntype GetFolderResultsComponentAndDataResult = {\n breadcrumbs?: FolderBreadcrumb[]\n documents?: FolderOrDocument[]\n folderAssignedCollections?: CollectionSlug[]\n FolderResultsComponent: React.ReactNode\n subfolders?: FolderOrDocument[]\n}\n\ntype GetFolderResultsComponentAndDataErrorResult = {\n breadcrumbs?: never\n documents?: never\n FolderResultsComponent?: never\n subfolders?: never\n} & (\n | {\n message: string\n }\n | ErrorResult\n)\n\nexport const getFolderResultsComponentAndDataHandler: ServerFunction<\n GetFolderResultsComponentAndDataArgs,\n Promise<GetFolderResultsComponentAndDataErrorResult | GetFolderResultsComponentAndDataResult>\n> = async (args) => {\n const { req } = args\n\n try {\n const res = await getFolderResultsComponentAndData(args)\n return res\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `There was an error getting the folder results component and data`,\n })\n\n return formatErrors(err)\n }\n}\n\n/**\n * This function is responsible for fetching folder data, building the results component\n * and returns the data and component together.\n */\nexport const getFolderResultsComponentAndData = async ({\n browseByFolder = false,\n collectionsToDisplay: activeCollectionSlugs,\n displayAs,\n folderAssignedCollections,\n folderID = undefined,\n req,\n sort,\n}: GetFolderResultsComponentAndDataArgs): Promise<GetFolderResultsComponentAndDataResult> => {\n const { payload } = req\n\n if (!payload.config.folders) {\n throw new APIError('Folders are not enabled in the configuration.')\n }\n\n const emptyQuery = {\n id: {\n exists: false,\n },\n }\n\n let collectionSlug: CollectionSlug | undefined = undefined\n let documentWhere: undefined | Where =\n Array.isArray(activeCollectionSlugs) && !activeCollectionSlugs.length ? emptyQuery : undefined\n let folderWhere: undefined | Where =\n Array.isArray(activeCollectionSlugs) && !activeCollectionSlugs.length ? emptyQuery : undefined\n\n // todo(perf): - collect promises and resolve them in parallel\n for (const activeCollectionSlug of activeCollectionSlugs) {\n if (activeCollectionSlug === payload.config.folders.slug) {\n const folderCollectionConstraints = await buildFolderWhereConstraints({\n collectionConfig: payload.collections[activeCollectionSlug].config,\n folderID,\n localeCode: req?.locale,\n req,\n search: typeof req?.query?.search === 'string' ? req.query.search : undefined,\n sort,\n })\n\n if (folderCollectionConstraints) {\n folderWhere = folderCollectionConstraints\n }\n\n folderWhere = combineWhereConstraints([\n folderWhere,\n Array.isArray(folderAssignedCollections) &&\n folderAssignedCollections.length &&\n payload.config.folders.collectionSpecific\n ? {\n or: [\n {\n folderType: {\n in: folderAssignedCollections,\n },\n },\n // if the folderType is not set, it means it accepts all collections and should appear in the results\n {\n folderType: {\n exists: false,\n },\n },\n ],\n }\n : undefined,\n ])\n } else if ((browseByFolder && folderID) || !browseByFolder) {\n if (!browseByFolder) {\n collectionSlug = activeCollectionSlug\n }\n\n if (!documentWhere) {\n documentWhere = {\n or: [],\n }\n }\n\n const collectionConstraints = await buildFolderWhereConstraints({\n collectionConfig: payload.collections[activeCollectionSlug].config,\n folderID,\n localeCode: req?.locale,\n req,\n search: typeof req?.query?.search === 'string' ? req.query.search : undefined,\n sort,\n })\n\n if (collectionConstraints) {\n documentWhere.or.push(collectionConstraints)\n }\n }\n }\n\n const folderData = await getFolderData({\n collectionSlug,\n documentWhere,\n folderID,\n folderWhere,\n req,\n sort,\n })\n\n let FolderResultsComponent = null\n\n if (displayAs === 'grid') {\n FolderResultsComponent = (\n <div>\n {folderData.subfolders.length ? (\n <>\n <ItemCardGrid items={folderData.subfolders} title={'Folders'} type=\"folder\" />\n </>\n ) : null}\n\n {folderData.documents.length ? (\n <>\n <ItemCardGrid\n items={folderData.documents}\n subfolderCount={folderData.subfolders.length}\n title={'Documents'}\n type=\"file\"\n />\n </>\n ) : null}\n </div>\n )\n } else {\n FolderResultsComponent = <FolderFileTable showRelationCell={browseByFolder} />\n }\n\n return {\n breadcrumbs: folderData.breadcrumbs,\n documents: folderData.documents,\n folderAssignedCollections: folderData.folderAssignedCollections,\n FolderResultsComponent,\n subfolders: folderData.subfolders,\n }\n}\n"],"names":["APIError","formatErrors","getFolderData","buildFolderWhereConstraints","combineWhereConstraints","FolderFileTable","ItemCardGrid","getFolderResultsComponentAndDataHandler","args","req","res","getFolderResultsComponentAndData","err","payload","logger","error","msg","browseByFolder","collectionsToDisplay","activeCollectionSlugs","displayAs","folderAssignedCollections","folderID","undefined","sort","config","folders","emptyQuery","id","exists","collectionSlug","documentWhere","Array","isArray","length","folderWhere","activeCollectionSlug","slug","folderCollectionConstraints","collectionConfig","collections","localeCode","locale","search","query","collectionSpecific","or","folderType","in","collectionConstraints","push","folderData","FolderResultsComponent","div","subfolders","items","title","type","documents","subfolderCount","showRelationCell","breadcrumbs"],"mappings":";AASA,SAASA,QAAQ,EAAEC,YAAY,EAAEC,aAAa,QAAQ,UAAS;AAC/D,SAASC,2BAA2B,EAAEC,uBAAuB,QAAQ,iBAAgB;AAErF,SACEC,eAAe,EACfC,YAAY,
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getFolderResultsComponentAndData.tsx"],"sourcesContent":["import type {\n CollectionSlug,\n ErrorResult,\n GetFolderResultsComponentAndDataArgs,\n ServerFunction,\n Where,\n} from 'payload'\nimport type { FolderBreadcrumb, FolderOrDocument } from 'payload/shared'\n\nimport { APIError, formatErrors, getFolderData } from 'payload'\nimport { buildFolderWhereConstraints, combineWhereConstraints } from 'payload/shared'\n\nimport {\n FolderFileTable,\n ItemCardGrid,\n // eslint-disable-next-line payload/no-imports-from-exports-dir -- This component is returned via server functions, it must reference the exports dir\n} from '../exports/client/index.js'\n\ntype GetFolderResultsComponentAndDataResult = {\n breadcrumbs?: FolderBreadcrumb[]\n documents?: FolderOrDocument[]\n folderAssignedCollections?: CollectionSlug[]\n FolderResultsComponent: React.ReactNode\n subfolders?: FolderOrDocument[]\n}\n\ntype GetFolderResultsComponentAndDataErrorResult = {\n breadcrumbs?: never\n documents?: never\n FolderResultsComponent?: never\n subfolders?: never\n} & (\n | {\n message: string\n }\n | ErrorResult\n)\n\nexport const getFolderResultsComponentAndDataHandler: ServerFunction<\n GetFolderResultsComponentAndDataArgs,\n Promise<GetFolderResultsComponentAndDataErrorResult | GetFolderResultsComponentAndDataResult>\n> = async (args) => {\n const { req } = args\n\n try {\n const res = await getFolderResultsComponentAndData(args)\n return res\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `There was an error getting the folder results component and data`,\n })\n\n return formatErrors(err)\n }\n}\n\n/**\n * This function is responsible for fetching folder data, building the results component\n * and returns the data and component together.\n */\nexport const getFolderResultsComponentAndData = async ({\n browseByFolder = false,\n collectionsToDisplay: activeCollectionSlugs,\n displayAs,\n folderAssignedCollections,\n folderID = undefined,\n req,\n sort,\n}: GetFolderResultsComponentAndDataArgs): Promise<GetFolderResultsComponentAndDataResult> => {\n const { payload } = req\n\n if (!payload.config.folders) {\n throw new APIError('Folders are not enabled in the configuration.')\n }\n\n const emptyQuery = {\n id: {\n exists: false,\n },\n }\n\n let collectionSlug: CollectionSlug | undefined = undefined\n let documentWhere: undefined | Where =\n Array.isArray(activeCollectionSlugs) && !activeCollectionSlugs.length ? emptyQuery : undefined\n let folderWhere: undefined | Where =\n Array.isArray(activeCollectionSlugs) && !activeCollectionSlugs.length ? emptyQuery : undefined\n\n // todo(perf): - collect promises and resolve them in parallel\n for (const activeCollectionSlug of activeCollectionSlugs) {\n if (activeCollectionSlug === payload.config.folders.slug) {\n const folderCollectionConstraints = await buildFolderWhereConstraints({\n collectionConfig: payload.collections[activeCollectionSlug].config,\n folderID,\n localeCode: req?.locale,\n req,\n search: typeof req?.query?.search === 'string' ? req.query.search : undefined,\n sort,\n })\n\n if (folderCollectionConstraints) {\n folderWhere = folderCollectionConstraints\n }\n\n folderWhere = combineWhereConstraints([\n folderWhere,\n Array.isArray(folderAssignedCollections) &&\n folderAssignedCollections.length &&\n payload.config.folders.collectionSpecific\n ? {\n or: [\n {\n folderType: {\n in: folderAssignedCollections,\n },\n },\n // if the folderType is not set, it means it accepts all collections and should appear in the results\n {\n folderType: {\n exists: false,\n },\n },\n ],\n }\n : undefined,\n ])\n } else if ((browseByFolder && folderID) || !browseByFolder) {\n if (!browseByFolder) {\n collectionSlug = activeCollectionSlug\n }\n\n if (!documentWhere) {\n documentWhere = {\n or: [],\n }\n }\n\n const collectionConstraints = await buildFolderWhereConstraints({\n collectionConfig: payload.collections[activeCollectionSlug].config,\n folderID,\n localeCode: req?.locale,\n req,\n search: typeof req?.query?.search === 'string' ? req.query.search : undefined,\n sort,\n })\n\n if (collectionConstraints) {\n documentWhere.or.push(collectionConstraints)\n }\n }\n }\n\n const folderData = await getFolderData({\n collectionSlug,\n documentWhere,\n folderID,\n folderWhere,\n req,\n sort,\n })\n\n let FolderResultsComponent = null\n\n if (displayAs === 'grid') {\n FolderResultsComponent = (\n <div>\n {folderData.subfolders.length ? (\n <>\n <ItemCardGrid items={folderData.subfolders} title={'Folders'} type=\"folder\" />\n </>\n ) : null}\n\n {folderData.documents.length ? (\n <>\n <ItemCardGrid\n items={folderData.documents}\n subfolderCount={folderData.subfolders.length}\n title={'Documents'}\n type=\"file\"\n />\n </>\n ) : null}\n </div>\n )\n } else {\n FolderResultsComponent = <FolderFileTable showRelationCell={browseByFolder} />\n }\n\n return {\n breadcrumbs: folderData.breadcrumbs,\n documents: folderData.documents,\n folderAssignedCollections: folderData.folderAssignedCollections,\n FolderResultsComponent,\n subfolders: folderData.subfolders,\n }\n}\n"],"names":["APIError","formatErrors","getFolderData","buildFolderWhereConstraints","combineWhereConstraints","FolderFileTable","ItemCardGrid","getFolderResultsComponentAndDataHandler","args","req","res","getFolderResultsComponentAndData","err","payload","logger","error","msg","browseByFolder","collectionsToDisplay","activeCollectionSlugs","displayAs","folderAssignedCollections","folderID","undefined","sort","config","folders","emptyQuery","id","exists","collectionSlug","documentWhere","Array","isArray","length","folderWhere","activeCollectionSlug","slug","folderCollectionConstraints","collectionConfig","collections","localeCode","locale","search","query","collectionSpecific","or","folderType","in","collectionConstraints","push","folderData","FolderResultsComponent","div","subfolders","items","title","type","documents","subfolderCount","showRelationCell","breadcrumbs"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const lockDurationDefault = 300
|
|
2
|
-
|
|
1
|
+
const lockDurationDefault = 300;
|
|
2
|
+
// Default 5 minutes in seconds
|
|
3
3
|
export const handleFormStateLocking = async ({ id, collectionSlug, globalSlug, req, updateLastEdited })=>{
|
|
4
4
|
let result;
|
|
5
5
|
if (id || globalSlug) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/handleFormStateLocking.ts"],"sourcesContent":["import type { PayloadRequest, TypedUser } from 'payload'\n\ntype Args = {\n collectionSlug?: string\n globalSlug?: string\n id?: number | string\n req: PayloadRequest\n updateLastEdited?: boolean\n}\n\ntype Result = {\n isLocked: boolean\n lastEditedAt: string\n user: TypedUser\n}\n\nconst lockDurationDefault = 300 // Default 5 minutes in seconds\n\nexport const handleFormStateLocking = async ({\n id,\n collectionSlug,\n globalSlug,\n req,\n updateLastEdited,\n}: Args): Promise<Result> => {\n let result: Result\n\n if (id || globalSlug) {\n let lockedDocumentQuery\n\n if (collectionSlug) {\n lockedDocumentQuery = {\n and: [\n { 'document.relationTo': { equals: collectionSlug } },\n { 'document.value': { equals: id } },\n ],\n }\n } else if (globalSlug) {\n lockedDocumentQuery = {\n and: [{ globalSlug: { equals: globalSlug } }],\n }\n }\n\n const lockDocumentsProp = collectionSlug\n ? req.payload.collections?.[collectionSlug]?.config.lockDocuments\n : req.payload.config.globals.find((g) => g.slug === globalSlug)?.lockDocuments\n\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n const lockDurationInMilliseconds = lockDuration * 1000\n const now = new Date().getTime()\n\n if (lockedDocumentQuery) {\n // Query where the lock is newer than the current time minus the lock duration\n lockedDocumentQuery.and.push({\n updatedAt: {\n greater_than: new Date(now - lockDurationInMilliseconds).toISOString(),\n },\n })\n\n const lockedDocument = await req.payload.find({\n collection: 'payload-locked-documents',\n depth: 1,\n limit: 1,\n overrideAccess: false,\n pagination: false,\n user: req.user,\n where: lockedDocumentQuery,\n })\n\n if (lockedDocument.docs && lockedDocument.docs.length > 0) {\n result = {\n isLocked: true,\n lastEditedAt: lockedDocument.docs[0]?.updatedAt,\n user: lockedDocument.docs[0]?.user?.value,\n }\n\n const lockOwnerID =\n typeof lockedDocument.docs[0]?.user?.value === 'object'\n ? lockedDocument.docs[0]?.user?.value?.id\n : lockedDocument.docs[0]?.user?.value\n // Should only update doc if the incoming / current user is also the owner of the locked doc\n if (updateLastEdited && req.user && lockOwnerID === req.user.id) {\n await req.payload.db.updateOne({\n id: lockedDocument.docs[0].id,\n collection: 'payload-locked-documents',\n data: {},\n returning: false,\n })\n }\n } else {\n // If NO ACTIVE lock document exists, first delete any expired locks and then create a fresh lock\n // Where updatedAt is older than the duration that is specified in the config\n let deleteExpiredLocksQuery\n\n if (collectionSlug) {\n deleteExpiredLocksQuery = {\n and: [\n { 'document.relationTo': { equals: collectionSlug } },\n {\n updatedAt: {\n less_than: new Date(now - lockDurationInMilliseconds).toISOString(),\n },\n },\n ],\n }\n } else if (globalSlug) {\n deleteExpiredLocksQuery = {\n and: [\n { globalSlug: { equals: globalSlug } },\n {\n updatedAt: {\n less_than: new Date(now - lockDurationInMilliseconds).toISOString(),\n },\n },\n ],\n }\n }\n\n await req.payload.db.deleteMany({\n collection: 'payload-locked-documents',\n where: deleteExpiredLocksQuery,\n })\n\n await req.payload.db.create({\n collection: 'payload-locked-documents',\n data: {\n document: collectionSlug\n ? {\n relationTo: collectionSlug,\n value: id,\n }\n : undefined,\n globalSlug: globalSlug ? globalSlug : undefined,\n user: {\n relationTo: req.user.collection,\n value: req.user.id,\n },\n },\n returning: false,\n })\n\n result = {\n isLocked: true,\n lastEditedAt: new Date().toISOString(),\n user: req.user,\n }\n }\n }\n }\n\n return result\n}\n"],"names":["lockDurationDefault","handleFormStateLocking","id","collectionSlug","globalSlug","req","updateLastEdited","result","lockedDocumentQuery","and","equals","lockDocumentsProp","payload","collections","config","lockDocuments","globals","find","g","slug","lockDuration","duration","lockDurationInMilliseconds","now","Date","getTime","push","updatedAt","greater_than","toISOString","lockedDocument","collection","depth","limit","overrideAccess","pagination","user","where","docs","length","isLocked","lastEditedAt","value","lockOwnerID","db","updateOne","data","returning","deleteExpiredLocksQuery","less_than","deleteMany","create","document","relationTo","undefined"],"mappings":"AAgBA,MAAMA,sBAAsB
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/handleFormStateLocking.ts"],"sourcesContent":["import type { PayloadRequest, TypedUser } from 'payload'\n\ntype Args = {\n collectionSlug?: string\n globalSlug?: string\n id?: number | string\n req: PayloadRequest\n updateLastEdited?: boolean\n}\n\ntype Result = {\n isLocked: boolean\n lastEditedAt: string\n user: TypedUser\n}\n\nconst lockDurationDefault = 300 // Default 5 minutes in seconds\n\nexport const handleFormStateLocking = async ({\n id,\n collectionSlug,\n globalSlug,\n req,\n updateLastEdited,\n}: Args): Promise<Result> => {\n let result: Result\n\n if (id || globalSlug) {\n let lockedDocumentQuery\n\n if (collectionSlug) {\n lockedDocumentQuery = {\n and: [\n { 'document.relationTo': { equals: collectionSlug } },\n { 'document.value': { equals: id } },\n ],\n }\n } else if (globalSlug) {\n lockedDocumentQuery = {\n and: [{ globalSlug: { equals: globalSlug } }],\n }\n }\n\n const lockDocumentsProp = collectionSlug\n ? req.payload.collections?.[collectionSlug]?.config.lockDocuments\n : req.payload.config.globals.find((g) => g.slug === globalSlug)?.lockDocuments\n\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n const lockDurationInMilliseconds = lockDuration * 1000\n const now = new Date().getTime()\n\n if (lockedDocumentQuery) {\n // Query where the lock is newer than the current time minus the lock duration\n lockedDocumentQuery.and.push({\n updatedAt: {\n greater_than: new Date(now - lockDurationInMilliseconds).toISOString(),\n },\n })\n\n const lockedDocument = await req.payload.find({\n collection: 'payload-locked-documents',\n depth: 1,\n limit: 1,\n overrideAccess: false,\n pagination: false,\n user: req.user,\n where: lockedDocumentQuery,\n })\n\n if (lockedDocument.docs && lockedDocument.docs.length > 0) {\n result = {\n isLocked: true,\n lastEditedAt: lockedDocument.docs[0]?.updatedAt,\n user: lockedDocument.docs[0]?.user?.value,\n }\n\n const lockOwnerID =\n typeof lockedDocument.docs[0]?.user?.value === 'object'\n ? lockedDocument.docs[0]?.user?.value?.id\n : lockedDocument.docs[0]?.user?.value\n // Should only update doc if the incoming / current user is also the owner of the locked doc\n if (updateLastEdited && req.user && lockOwnerID === req.user.id) {\n await req.payload.db.updateOne({\n id: lockedDocument.docs[0].id,\n collection: 'payload-locked-documents',\n data: {},\n returning: false,\n })\n }\n } else {\n // If NO ACTIVE lock document exists, first delete any expired locks and then create a fresh lock\n // Where updatedAt is older than the duration that is specified in the config\n let deleteExpiredLocksQuery\n\n if (collectionSlug) {\n deleteExpiredLocksQuery = {\n and: [\n { 'document.relationTo': { equals: collectionSlug } },\n {\n updatedAt: {\n less_than: new Date(now - lockDurationInMilliseconds).toISOString(),\n },\n },\n ],\n }\n } else if (globalSlug) {\n deleteExpiredLocksQuery = {\n and: [\n { globalSlug: { equals: globalSlug } },\n {\n updatedAt: {\n less_than: new Date(now - lockDurationInMilliseconds).toISOString(),\n },\n },\n ],\n }\n }\n\n await req.payload.db.deleteMany({\n collection: 'payload-locked-documents',\n where: deleteExpiredLocksQuery,\n })\n\n await req.payload.db.create({\n collection: 'payload-locked-documents',\n data: {\n document: collectionSlug\n ? {\n relationTo: collectionSlug,\n value: id,\n }\n : undefined,\n globalSlug: globalSlug ? globalSlug : undefined,\n user: {\n relationTo: req.user.collection,\n value: req.user.id,\n },\n },\n returning: false,\n })\n\n result = {\n isLocked: true,\n lastEditedAt: new Date().toISOString(),\n user: req.user,\n }\n }\n }\n }\n\n return result\n}\n"],"names":["lockDurationDefault","handleFormStateLocking","id","collectionSlug","globalSlug","req","updateLastEdited","result","lockedDocumentQuery","and","equals","lockDocumentsProp","payload","collections","config","lockDocuments","globals","find","g","slug","lockDuration","duration","lockDurationInMilliseconds","now","Date","getTime","push","updatedAt","greater_than","toISOString","lockedDocument","collection","depth","limit","overrideAccess","pagination","user","where","docs","length","isLocked","lastEditedAt","value","lockOwnerID","db","updateOne","data","returning","deleteExpiredLocksQuery","less_than","deleteMany","create","document","relationTo","undefined"],"mappings":"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"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export const hasSavePermission = (args)
|
|
1
|
+
export const hasSavePermission = (args)=>/*
|
|
2
|
+
* Pass either `collectionSlug` or `globalSlug`
|
|
3
|
+
*/ /*
|
|
4
|
+
* Pass either `collectionSlug` or `globalSlug`
|
|
5
|
+
*/ {
|
|
2
6
|
const { collectionSlug, docPermissions, globalSlug, isEditing } = args;
|
|
3
7
|
if (collectionSlug) {
|
|
4
8
|
return Boolean(isEditing && docPermissions?.update || !isEditing && docPermissions?.create);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/hasSavePermission.ts"],"sourcesContent":["import type {\n SanitizedCollectionPermission,\n SanitizedDocumentPermissions,\n SanitizedGlobalPermission,\n} from 'payload'\n\nexport const hasSavePermission = (args: {\n /*\n * Pass either `collectionSlug` or `globalSlug`\n */\n collectionSlug?: string\n docPermissions: SanitizedDocumentPermissions\n /*\n * Pass either `collectionSlug` or `globalSlug`\n */\n globalSlug?: string\n isEditing: boolean\n}) => {\n const { collectionSlug, docPermissions, globalSlug, isEditing } = args\n\n if (collectionSlug) {\n return Boolean(\n (isEditing && docPermissions?.update) ||\n (!isEditing && (docPermissions as SanitizedCollectionPermission)?.create),\n )\n }\n\n if (globalSlug) {\n return Boolean((docPermissions as SanitizedGlobalPermission)?.update)\n }\n\n return false\n}\n"],"names":["hasSavePermission","args","collectionSlug","docPermissions","globalSlug","isEditing","Boolean","update","create"],"mappings":"AAMA,OAAO,MAAMA,oBAAoB,CAACC;
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/hasSavePermission.ts"],"sourcesContent":["import type {\n SanitizedCollectionPermission,\n SanitizedDocumentPermissions,\n SanitizedGlobalPermission,\n} from 'payload'\n\nexport const hasSavePermission = (args: {\n /*\n * Pass either `collectionSlug` or `globalSlug`\n */\n collectionSlug?: string\n docPermissions: SanitizedDocumentPermissions\n /*\n * Pass either `collectionSlug` or `globalSlug`\n */\n globalSlug?: string\n isEditing: boolean\n}) => {\n const { collectionSlug, docPermissions, globalSlug, isEditing } = args\n\n if (collectionSlug) {\n return Boolean(\n (isEditing && docPermissions?.update) ||\n (!isEditing && (docPermissions as SanitizedCollectionPermission)?.create),\n )\n }\n\n if (globalSlug) {\n return Boolean((docPermissions as SanitizedGlobalPermission)?.update)\n }\n\n return false\n}\n"],"names":["hasSavePermission","args","collectionSlug","docPermissions","globalSlug","isEditing","Boolean","update","create"],"mappings":"AAMA,OAAO,MAAMA,oBAAoB,CAACC,OAChC;;GAEC,GAGD;;GAEC;IAID,MAAM,EAAEC,cAAc,EAAEC,cAAc,EAAEC,UAAU,EAAEC,SAAS,EAAE,GAAGJ;IAElE,IAAIC,gBAAgB;QAClB,OAAOI,QACL,AAACD,aAAaF,gBAAgBI,UAC3B,CAACF,aAAcF,gBAAkDK;IAExE;IAEA,IAAIJ,YAAY;QACd,OAAOE,QAASH,gBAA8CI;IAChE;IAEA,OAAO;AACT,EAAC"}
|
|
@@ -13,9 +13,9 @@ export const isURLAllowed = (url, allowList)=>{
|
|
|
13
13
|
}
|
|
14
14
|
if (key === 'pathname') {
|
|
15
15
|
// Convert wildcards to a regex
|
|
16
|
-
const regexPattern = value.replace(/\*\*/g, '.*')
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
const regexPattern = value.replace(/\*\*/g, '.*').// Match any path
|
|
17
|
+
replace(/\*/g, '[^/]*');
|
|
18
|
+
// Match any part of a path segment
|
|
19
19
|
const regex = new RegExp(`^${regexPattern}$`);
|
|
20
20
|
return regex.test(parsedUrl.pathname);
|
|
21
21
|
}
|
|
@@ -24,9 +24,9 @@ export const isURLAllowed = (url, allowList)=>{
|
|
|
24
24
|
});
|
|
25
25
|
});
|
|
26
26
|
} catch {
|
|
27
|
-
return false
|
|
28
|
-
;
|
|
27
|
+
return false;
|
|
29
28
|
}
|
|
30
|
-
}
|
|
29
|
+
} // If the URL is invalid, deny by default
|
|
30
|
+
;
|
|
31
31
|
|
|
32
32
|
//# sourceMappingURL=isURLAllowed.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/isURLAllowed.ts"],"sourcesContent":["import type { AllowList } from 'payload'\n\nexport const isURLAllowed = (url: string, allowList: AllowList): boolean => {\n try {\n const parsedUrl = new URL(url)\n\n return allowList.some((allowItem) => {\n return Object.entries(allowItem).every(([key, value]) => {\n // Skip undefined or null values\n if (!value) {\n return true\n }\n // Compare protocol with colon\n if (key === 'protocol') {\n return typeof value === 'string' && parsedUrl.protocol === `${value}:`\n }\n\n if (key === 'pathname') {\n // Convert wildcards to a regex\n const regexPattern = value\n .replace(/\\*\\*/g, '.*') // Match any path\n .replace(/\\*/g, '[^/]*') // Match any part of a path segment\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(parsedUrl.pathname)\n }\n\n // Default comparison for all other properties (hostname, port, search)\n return parsedUrl[key as keyof URL] === value\n })\n })\n } catch {\n return false // If the URL is invalid, deny by default\n }\n}\n"],"names":["isURLAllowed","url","allowList","parsedUrl","URL","some","allowItem","Object","entries","every","key","value","protocol","regexPattern","replace","regex","RegExp","test","pathname"],"mappings":"AAEA,OAAO,MAAMA,eAAe,CAACC,KAAaC;IACxC,IAAI;QACF,MAAMC,YAAY,IAAIC,IAAIH;QAE1B,OAAOC,UAAUG,IAAI,CAAC,CAACC;YACrB,OAAOC,OAAOC,OAAO,CAACF,WAAWG,KAAK,CAAC,CAAC,CAACC,KAAKC,MAAM;gBAClD,gCAAgC;gBAChC,IAAI,CAACA,OAAO;oBACV,OAAO;gBACT;gBACA,8BAA8B;gBAC9B,IAAID,QAAQ,YAAY;oBACtB,OAAO,OAAOC,UAAU,YAAYR,UAAUS,QAAQ,KAAK,GAAGD,MAAM,CAAC,CAAC;gBACxE;gBAEA,IAAID,QAAQ,YAAY;oBACtB,+BAA+B;oBAC/B,MAAMG,eAAeF,MAClBG,OAAO,CAAC,SAAS,MAAM,iBAAiB;
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/isURLAllowed.ts"],"sourcesContent":["import type { AllowList } from 'payload'\n\nexport const isURLAllowed = (url: string, allowList: AllowList): boolean => {\n try {\n const parsedUrl = new URL(url)\n\n return allowList.some((allowItem) => {\n return Object.entries(allowItem).every(([key, value]) => {\n // Skip undefined or null values\n if (!value) {\n return true\n }\n // Compare protocol with colon\n if (key === 'protocol') {\n return typeof value === 'string' && parsedUrl.protocol === `${value}:`\n }\n\n if (key === 'pathname') {\n // Convert wildcards to a regex\n const regexPattern = value\n .replace(/\\*\\*/g, '.*') // Match any path\n .replace(/\\*/g, '[^/]*') // Match any part of a path segment\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(parsedUrl.pathname)\n }\n\n // Default comparison for all other properties (hostname, port, search)\n return parsedUrl[key as keyof URL] === value\n })\n })\n } catch {\n return false // If the URL is invalid, deny by default\n }\n}\n"],"names":["isURLAllowed","url","allowList","parsedUrl","URL","some","allowItem","Object","entries","every","key","value","protocol","regexPattern","replace","regex","RegExp","test","pathname"],"mappings":"AAEA,OAAO,MAAMA,eAAe,CAACC,KAAaC;IACxC,IAAI;QACF,MAAMC,YAAY,IAAIC,IAAIH;QAE1B,OAAOC,UAAUG,IAAI,CAAC,CAACC;YACrB,OAAOC,OAAOC,OAAO,CAACF,WAAWG,KAAK,CAAC,CAAC,CAACC,KAAKC,MAAM;gBAClD,gCAAgC;gBAChC,IAAI,CAACA,OAAO;oBACV,OAAO;gBACT;gBACA,8BAA8B;gBAC9B,IAAID,QAAQ,YAAY;oBACtB,OAAO,OAAOC,UAAU,YAAYR,UAAUS,QAAQ,KAAK,GAAGD,MAAM,CAAC,CAAC;gBACxE;gBAEA,IAAID,QAAQ,YAAY;oBACtB,+BAA+B;oBAC/B,MAAMG,eAAeF,MAClBG,OAAO,CAAC,SAAS,MAAM,iBAAiB;oBACxCA,OAAO,CAAC,OAAO;oBAAS,mCAAmC;oBAC9D,MAAMC,QAAQ,IAAIC,OAAO,CAAC,CAAC,EAAEH,aAAa,CAAC,CAAC;oBAC5C,OAAOE,MAAME,IAAI,CAACd,UAAUe,QAAQ;gBACtC;gBAEA,uEAAuE;gBACvE,OAAOf,SAAS,CAACO,IAAiB,KAAKC;YACzC;QACF;IACF,EAAE,OAAM;QACN,OAAO;IACT;AACF,EAFiB,yCAAyC;CAEzD"}
|
|
@@ -3,7 +3,8 @@ import { getTranslation } from '@payloadcms/translations';
|
|
|
3
3
|
import { fieldAffectsData, fieldIsHiddenOrDisabled } from 'payload/shared';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import { RenderServerComponent } from '../elements/RenderServerComponent/index.js';
|
|
6
|
-
import { GroupByHeader, GroupByPageControls, OrderableTable, Pill, SelectAll, SelectionProvider, SelectRow, SortHeader, SortRow, Table } from
|
|
6
|
+
import { GroupByHeader, GroupByPageControls, OrderableTable, Pill, SelectAll, SelectionProvider, SelectRow, SortHeader, SortRow, Table } from // eslint-disable-next-line payload/no-imports-from-exports-dir -- these MUST reference the exports dir: https://github.com/payloadcms/payload/issues/12002#issuecomment-2791493587
|
|
7
|
+
'../exports/client/index.js';
|
|
7
8
|
import { filterFieldsWithPermissions } from '../providers/TableColumns/buildColumnState/filterFieldsWithPermissions.js';
|
|
8
9
|
import { buildColumnState } from '../providers/TableColumns/buildColumnState/index.js';
|
|
9
10
|
export const renderFilters = (fields, importMap)=>fields.reduce((acc, field)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/renderTable.tsx"],"sourcesContent":["import type {\n ClientCollectionConfig,\n ClientConfig,\n ClientField,\n CollectionConfig,\n Column,\n ColumnPreference,\n Field,\n ImportMap,\n ListQuery,\n PaginatedDocs,\n Payload,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedFieldsPermissions,\n ViewTypes,\n} from 'payload'\n\nimport { getTranslation, type I18nClient } from '@payloadcms/translations'\nimport { fieldAffectsData, fieldIsHiddenOrDisabled } from 'payload/shared'\nimport React from 'react'\n\nimport type { BuildColumnStateArgs } from '../providers/TableColumns/buildColumnState/index.js'\n\nimport { RenderServerComponent } from '../elements/RenderServerComponent/index.js'\nimport {\n GroupByHeader,\n GroupByPageControls,\n OrderableTable,\n Pill,\n SelectAll,\n SelectionProvider,\n SelectRow,\n SortHeader,\n SortRow,\n Table,\n // eslint-disable-next-line payload/no-imports-from-exports-dir -- these MUST reference the exports dir: https://github.com/payloadcms/payload/issues/12002#issuecomment-2791493587\n} from '../exports/client/index.js'\nimport { filterFieldsWithPermissions } from '../providers/TableColumns/buildColumnState/filterFieldsWithPermissions.js'\nimport { buildColumnState } from '../providers/TableColumns/buildColumnState/index.js'\n\nexport const renderFilters = (\n fields: Field[],\n importMap: ImportMap,\n): Map<string, React.ReactNode> =>\n fields.reduce(\n (acc, field) => {\n if (fieldIsHiddenOrDisabled(field)) {\n return acc\n }\n\n if ('name' in field && field.admin?.components?.Filter) {\n acc.set(\n field.name,\n RenderServerComponent({\n Component: field.admin.components?.Filter,\n importMap,\n }),\n )\n }\n\n return acc\n },\n new Map() as Map<string, React.ReactNode>,\n )\n\nexport const renderTable = ({\n clientCollectionConfig,\n clientConfig,\n collectionConfig,\n collections,\n columns,\n customCellProps,\n data,\n enableRowSelections,\n fieldPermissions,\n groupByFieldPath,\n groupByValue,\n heading,\n i18n,\n key = 'table',\n orderableFieldName,\n payload,\n query,\n renderRowTypes,\n req,\n tableAppearance,\n useAsTitle,\n viewType,\n}: {\n clientCollectionConfig?: ClientCollectionConfig\n clientConfig?: ClientConfig\n collectionConfig?: SanitizedCollectionConfig\n collections?: string[]\n columns: ColumnPreference[]\n customCellProps?: Record<string, unknown>\n data?: PaginatedDocs | undefined\n drawerSlug?: string\n enableRowSelections: boolean\n fieldPermissions?: SanitizedFieldsPermissions\n groupByFieldPath?: string\n groupByValue?: string\n heading?: string\n i18n: I18nClient\n key?: string\n orderableFieldName: string\n payload: Payload\n query?: ListQuery\n renderRowTypes?: boolean\n req?: PayloadRequest\n tableAppearance?: 'condensed' | 'default'\n useAsTitle: CollectionConfig['admin']['useAsTitle']\n viewType?: ViewTypes\n}): {\n columnState: Column[]\n Table: React.ReactNode\n} => {\n // Ensure that columns passed as args comply with the field config, i.e. `hidden`, `disableListColumn`, etc.\n\n let columnState: Column[]\n let clientFields: ClientField[] = clientCollectionConfig?.fields || []\n let serverFields: Field[] = collectionConfig?.fields || []\n const isPolymorphic = collections\n\n const isGroupingBy = Boolean(collectionConfig?.admin?.groupBy && query?.groupBy)\n\n if (isPolymorphic) {\n clientFields = []\n serverFields = []\n\n for (const collection of collections) {\n const clientCollectionConfig = clientConfig.collections.find(\n (each) => each.slug === collection,\n )\n\n for (const field of filterFieldsWithPermissions({\n fieldPermissions,\n fields: clientCollectionConfig.fields,\n })) {\n if (fieldAffectsData(field)) {\n if (clientFields.some((each) => fieldAffectsData(each) && each.name === field.name)) {\n continue\n }\n }\n\n clientFields.push(field)\n }\n\n const serverCollectionConfig = payload.collections[collection].config\n\n for (const field of filterFieldsWithPermissions<Field>({\n fieldPermissions,\n fields: serverCollectionConfig.fields,\n })) {\n if (fieldAffectsData(field)) {\n if (serverFields.some((each) => fieldAffectsData(each) && each.name === field.name)) {\n continue\n }\n }\n\n serverFields.push(field)\n }\n }\n }\n\n const sharedArgs: Pick<\n BuildColumnStateArgs,\n | 'clientFields'\n | 'columns'\n | 'customCellProps'\n | 'enableRowSelections'\n | 'fieldPermissions'\n | 'i18n'\n | 'payload'\n | 'req'\n | 'serverFields'\n | 'useAsTitle'\n | 'viewType'\n > = {\n clientFields,\n columns,\n enableRowSelections,\n fieldPermissions,\n i18n,\n // sortColumnProps,\n customCellProps,\n payload,\n req,\n serverFields,\n useAsTitle,\n viewType,\n }\n\n if (isPolymorphic) {\n columnState = buildColumnState({\n ...sharedArgs,\n collectionSlug: undefined,\n dataType: 'polymorphic',\n docs: data?.docs || [],\n })\n } else {\n columnState = buildColumnState({\n ...sharedArgs,\n collectionSlug: clientCollectionConfig.slug,\n dataType: 'monomorphic',\n docs: data?.docs || [],\n })\n }\n\n const columnsToUse = [...columnState]\n\n if (renderRowTypes) {\n columnsToUse.unshift({\n accessor: 'collection',\n active: true,\n field: {\n admin: {\n disabled: true,\n },\n hidden: true,\n },\n Heading: i18n.t('version:type'),\n renderedCells: (data?.docs || []).map((doc, i) => (\n <Pill key={i} size=\"small\">\n {getTranslation(\n collections\n ? payload.collections[doc.relationTo].config.labels.singular\n : clientCollectionConfig.labels.singular,\n i18n,\n )}\n </Pill>\n )),\n } as Column)\n }\n\n if (enableRowSelections) {\n columnsToUse.unshift({\n accessor: '_select',\n active: true,\n field: {\n admin: {\n disabled: true,\n },\n hidden: true,\n },\n Heading: <SelectAll />,\n renderedCells: (data?.docs || []).map((_, i) => (\n <SelectRow key={i} rowData={data?.docs[i]} />\n )),\n } as Column)\n }\n\n if (isGroupingBy) {\n return {\n columnState,\n // key is required since Next.js 15.2.0 to prevent React key error\n Table: (\n <div\n className={['table-wrap', groupByValue !== undefined && `table-wrap--group-by`]\n .filter(Boolean)\n .join(' ')}\n key={key}\n >\n <SelectionProvider docs={data?.docs || []} totalDocs={data?.totalDocs || 0}>\n <GroupByHeader\n collectionConfig={clientCollectionConfig}\n groupByFieldPath={groupByFieldPath}\n groupByValue={groupByValue}\n heading={heading}\n />\n <Table appearance={tableAppearance} columns={columnsToUse} data={data?.docs || []} />\n <GroupByPageControls\n collectionConfig={clientCollectionConfig}\n data={data}\n groupByValue={groupByValue}\n />\n </SelectionProvider>\n </div>\n ),\n }\n }\n\n if (!orderableFieldName) {\n return {\n columnState,\n // key is required since Next.js 15.2.0 to prevent React key error\n Table: (\n <div className=\"table-wrap\" key={key}>\n <Table appearance={tableAppearance} columns={columnsToUse} data={data?.docs || []} />\n </div>\n ),\n }\n }\n\n columnsToUse.unshift({\n accessor: '_dragHandle',\n active: true,\n field: {\n admin: {\n disabled: true,\n },\n hidden: true,\n },\n Heading: <SortHeader />,\n renderedCells: (data?.docs || []).map((_, i) => <SortRow key={i} />),\n } as Column)\n\n return {\n columnState,\n // key is required since Next.js 15.2.0 to prevent React key error\n Table: (\n <div className=\"table-wrap\" key={key}>\n <OrderableTable\n appearance={tableAppearance}\n collection={clientCollectionConfig}\n columns={columnsToUse}\n data={data?.docs || []}\n />\n </div>\n ),\n }\n}\n"],"names":["getTranslation","fieldAffectsData","fieldIsHiddenOrDisabled","React","RenderServerComponent","GroupByHeader","GroupByPageControls","OrderableTable","Pill","SelectAll","SelectionProvider","SelectRow","SortHeader","SortRow","Table","filterFieldsWithPermissions","buildColumnState","renderFilters","fields","importMap","reduce","acc","field","admin","components","Filter","set","name","Component","Map","renderTable","clientCollectionConfig","clientConfig","collectionConfig","collections","columns","customCellProps","data","enableRowSelections","fieldPermissions","groupByFieldPath","groupByValue","heading","i18n","key","orderableFieldName","payload","query","renderRowTypes","req","tableAppearance","useAsTitle","viewType","columnState","clientFields","serverFields","isPolymorphic","isGroupingBy","Boolean","groupBy","collection","find","each","slug","some","push","serverCollectionConfig","config","sharedArgs","collectionSlug","undefined","dataType","docs","columnsToUse","unshift","accessor","active","disabled","hidden","Heading","t","renderedCells","map","doc","i","size","relationTo","labels","singular","_","rowData","div","className","filter","join","totalDocs","appearance"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/renderTable.tsx"],"sourcesContent":["import type {\n ClientCollectionConfig,\n ClientConfig,\n ClientField,\n CollectionConfig,\n Column,\n ColumnPreference,\n Field,\n ImportMap,\n ListQuery,\n PaginatedDocs,\n Payload,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedFieldsPermissions,\n ViewTypes,\n} from 'payload'\n\nimport { getTranslation, type I18nClient } from '@payloadcms/translations'\nimport { fieldAffectsData, fieldIsHiddenOrDisabled } from 'payload/shared'\nimport React from 'react'\n\nimport type { BuildColumnStateArgs } from '../providers/TableColumns/buildColumnState/index.js'\n\nimport { RenderServerComponent } from '../elements/RenderServerComponent/index.js'\nimport {\n GroupByHeader,\n GroupByPageControls,\n OrderableTable,\n Pill,\n SelectAll,\n SelectionProvider,\n SelectRow,\n SortHeader,\n SortRow,\n Table,\n // eslint-disable-next-line payload/no-imports-from-exports-dir -- these MUST reference the exports dir: https://github.com/payloadcms/payload/issues/12002#issuecomment-2791493587\n} from '../exports/client/index.js'\nimport { filterFieldsWithPermissions } from '../providers/TableColumns/buildColumnState/filterFieldsWithPermissions.js'\nimport { buildColumnState } from '../providers/TableColumns/buildColumnState/index.js'\n\nexport const renderFilters = (\n fields: Field[],\n importMap: ImportMap,\n): Map<string, React.ReactNode> =>\n fields.reduce(\n (acc, field) => {\n if (fieldIsHiddenOrDisabled(field)) {\n return acc\n }\n\n if ('name' in field && field.admin?.components?.Filter) {\n acc.set(\n field.name,\n RenderServerComponent({\n Component: field.admin.components?.Filter,\n importMap,\n }),\n )\n }\n\n return acc\n },\n new Map() as Map<string, React.ReactNode>,\n )\n\nexport const renderTable = ({\n clientCollectionConfig,\n clientConfig,\n collectionConfig,\n collections,\n columns,\n customCellProps,\n data,\n enableRowSelections,\n fieldPermissions,\n groupByFieldPath,\n groupByValue,\n heading,\n i18n,\n key = 'table',\n orderableFieldName,\n payload,\n query,\n renderRowTypes,\n req,\n tableAppearance,\n useAsTitle,\n viewType,\n}: {\n clientCollectionConfig?: ClientCollectionConfig\n clientConfig?: ClientConfig\n collectionConfig?: SanitizedCollectionConfig\n collections?: string[]\n columns: ColumnPreference[]\n customCellProps?: Record<string, unknown>\n data?: PaginatedDocs | undefined\n drawerSlug?: string\n enableRowSelections: boolean\n fieldPermissions?: SanitizedFieldsPermissions\n groupByFieldPath?: string\n groupByValue?: string\n heading?: string\n i18n: I18nClient\n key?: string\n orderableFieldName: string\n payload: Payload\n query?: ListQuery\n renderRowTypes?: boolean\n req?: PayloadRequest\n tableAppearance?: 'condensed' | 'default'\n useAsTitle: CollectionConfig['admin']['useAsTitle']\n viewType?: ViewTypes\n}): {\n columnState: Column[]\n Table: React.ReactNode\n} => {\n // Ensure that columns passed as args comply with the field config, i.e. `hidden`, `disableListColumn`, etc.\n\n let columnState: Column[]\n let clientFields: ClientField[] = clientCollectionConfig?.fields || []\n let serverFields: Field[] = collectionConfig?.fields || []\n const isPolymorphic = collections\n\n const isGroupingBy = Boolean(collectionConfig?.admin?.groupBy && query?.groupBy)\n\n if (isPolymorphic) {\n clientFields = []\n serverFields = []\n\n for (const collection of collections) {\n const clientCollectionConfig = clientConfig.collections.find(\n (each) => each.slug === collection,\n )\n\n for (const field of filterFieldsWithPermissions({\n fieldPermissions,\n fields: clientCollectionConfig.fields,\n })) {\n if (fieldAffectsData(field)) {\n if (clientFields.some((each) => fieldAffectsData(each) && each.name === field.name)) {\n continue\n }\n }\n\n clientFields.push(field)\n }\n\n const serverCollectionConfig = payload.collections[collection].config\n\n for (const field of filterFieldsWithPermissions<Field>({\n fieldPermissions,\n fields: serverCollectionConfig.fields,\n })) {\n if (fieldAffectsData(field)) {\n if (serverFields.some((each) => fieldAffectsData(each) && each.name === field.name)) {\n continue\n }\n }\n\n serverFields.push(field)\n }\n }\n }\n\n const sharedArgs: Pick<\n BuildColumnStateArgs,\n | 'clientFields'\n | 'columns'\n | 'customCellProps'\n | 'enableRowSelections'\n | 'fieldPermissions'\n | 'i18n'\n | 'payload'\n | 'req'\n | 'serverFields'\n | 'useAsTitle'\n | 'viewType'\n > = {\n clientFields,\n columns,\n enableRowSelections,\n fieldPermissions,\n i18n,\n // sortColumnProps,\n customCellProps,\n payload,\n req,\n serverFields,\n useAsTitle,\n viewType,\n }\n\n if (isPolymorphic) {\n columnState = buildColumnState({\n ...sharedArgs,\n collectionSlug: undefined,\n dataType: 'polymorphic',\n docs: data?.docs || [],\n })\n } else {\n columnState = buildColumnState({\n ...sharedArgs,\n collectionSlug: clientCollectionConfig.slug,\n dataType: 'monomorphic',\n docs: data?.docs || [],\n })\n }\n\n const columnsToUse = [...columnState]\n\n if (renderRowTypes) {\n columnsToUse.unshift({\n accessor: 'collection',\n active: true,\n field: {\n admin: {\n disabled: true,\n },\n hidden: true,\n },\n Heading: i18n.t('version:type'),\n renderedCells: (data?.docs || []).map((doc, i) => (\n <Pill key={i} size=\"small\">\n {getTranslation(\n collections\n ? payload.collections[doc.relationTo].config.labels.singular\n : clientCollectionConfig.labels.singular,\n i18n,\n )}\n </Pill>\n )),\n } as Column)\n }\n\n if (enableRowSelections) {\n columnsToUse.unshift({\n accessor: '_select',\n active: true,\n field: {\n admin: {\n disabled: true,\n },\n hidden: true,\n },\n Heading: <SelectAll />,\n renderedCells: (data?.docs || []).map((_, i) => (\n <SelectRow key={i} rowData={data?.docs[i]} />\n )),\n } as Column)\n }\n\n if (isGroupingBy) {\n return {\n columnState,\n // key is required since Next.js 15.2.0 to prevent React key error\n Table: (\n <div\n className={['table-wrap', groupByValue !== undefined && `table-wrap--group-by`]\n .filter(Boolean)\n .join(' ')}\n key={key}\n >\n <SelectionProvider docs={data?.docs || []} totalDocs={data?.totalDocs || 0}>\n <GroupByHeader\n collectionConfig={clientCollectionConfig}\n groupByFieldPath={groupByFieldPath}\n groupByValue={groupByValue}\n heading={heading}\n />\n <Table appearance={tableAppearance} columns={columnsToUse} data={data?.docs || []} />\n <GroupByPageControls\n collectionConfig={clientCollectionConfig}\n data={data}\n groupByValue={groupByValue}\n />\n </SelectionProvider>\n </div>\n ),\n }\n }\n\n if (!orderableFieldName) {\n return {\n columnState,\n // key is required since Next.js 15.2.0 to prevent React key error\n Table: (\n <div className=\"table-wrap\" key={key}>\n <Table appearance={tableAppearance} columns={columnsToUse} data={data?.docs || []} />\n </div>\n ),\n }\n }\n\n columnsToUse.unshift({\n accessor: '_dragHandle',\n active: true,\n field: {\n admin: {\n disabled: true,\n },\n hidden: true,\n },\n Heading: <SortHeader />,\n renderedCells: (data?.docs || []).map((_, i) => <SortRow key={i} />),\n } as Column)\n\n return {\n columnState,\n // key is required since Next.js 15.2.0 to prevent React key error\n Table: (\n <div className=\"table-wrap\" key={key}>\n <OrderableTable\n appearance={tableAppearance}\n collection={clientCollectionConfig}\n columns={columnsToUse}\n data={data?.docs || []}\n />\n </div>\n ),\n }\n}\n"],"names":["getTranslation","fieldAffectsData","fieldIsHiddenOrDisabled","React","RenderServerComponent","GroupByHeader","GroupByPageControls","OrderableTable","Pill","SelectAll","SelectionProvider","SelectRow","SortHeader","SortRow","Table","filterFieldsWithPermissions","buildColumnState","renderFilters","fields","importMap","reduce","acc","field","admin","components","Filter","set","name","Component","Map","renderTable","clientCollectionConfig","clientConfig","collectionConfig","collections","columns","customCellProps","data","enableRowSelections","fieldPermissions","groupByFieldPath","groupByValue","heading","i18n","key","orderableFieldName","payload","query","renderRowTypes","req","tableAppearance","useAsTitle","viewType","columnState","clientFields","serverFields","isPolymorphic","isGroupingBy","Boolean","groupBy","collection","find","each","slug","some","push","serverCollectionConfig","config","sharedArgs","collectionSlug","undefined","dataType","docs","columnsToUse","unshift","accessor","active","disabled","hidden","Heading","t","renderedCells","map","doc","i","size","relationTo","labels","singular","_","rowData","div","className","filter","join","totalDocs","appearance"],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { canAccessAdmin } from 'payload';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* The job id to delete to remove a scheduled publish event
|
|
4
|
+
*/ export const schedulePublishHandler = async ({ type, date, deleteID, doc, global, locale, req, timezone })=>{
|
|
3
5
|
const { i18n, payload, user } = req;
|
|
4
6
|
await canAccessAdmin({
|
|
5
7
|
req
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/schedulePublishHandler.ts"],"sourcesContent":["import { canAccessAdmin, type PayloadRequest, type SchedulePublishTaskInput } from 'payload'\n\nexport type SchedulePublishHandlerArgs = {\n date?: Date\n /**\n * The job id to delete to remove a scheduled publish event\n */\n deleteID?: number | string\n req: PayloadRequest\n timezone?: string\n} & SchedulePublishTaskInput\n\nexport const schedulePublishHandler = async ({\n type,\n date,\n deleteID,\n doc,\n global,\n locale,\n req,\n timezone,\n}: SchedulePublishHandlerArgs) => {\n const { i18n, payload, user } = req\n\n await canAccessAdmin({ req })\n\n try {\n if (deleteID) {\n await payload.delete({\n collection: 'payload-jobs',\n req,\n where: { id: { equals: deleteID } },\n })\n }\n\n await payload.jobs.queue({\n input: {\n type,\n doc,\n global,\n locale,\n timezone,\n user: user.id,\n },\n task: 'schedulePublish',\n waitUntil: date,\n })\n } catch (err) {\n let error\n\n if (deleteID) {\n error = `Error deleting scheduled publish event with ID ${deleteID}`\n } else {\n error = `Error scheduling ${type} for `\n if (doc) {\n error += `document with ID ${doc.value} in collection ${doc.relationTo}`\n }\n }\n\n payload.logger.error(error)\n payload.logger.error(err)\n\n return {\n error,\n }\n }\n\n return { message: i18n.t('general:success') }\n}\n"],"names":["canAccessAdmin","schedulePublishHandler","type","date","deleteID","doc","global","locale","req","timezone","i18n","payload","user","delete","collection","where","id","equals","jobs","queue","input","task","waitUntil","err","error","value","relationTo","logger","message","t"],"mappings":"AAAA,SAASA,cAAc,QAA4D,UAAS;
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/schedulePublishHandler.ts"],"sourcesContent":["import { canAccessAdmin, type PayloadRequest, type SchedulePublishTaskInput } from 'payload'\n\nexport type SchedulePublishHandlerArgs = {\n date?: Date\n /**\n * The job id to delete to remove a scheduled publish event\n */\n deleteID?: number | string\n req: PayloadRequest\n timezone?: string\n} & SchedulePublishTaskInput\n\nexport const schedulePublishHandler = async ({\n type,\n date,\n deleteID,\n doc,\n global,\n locale,\n req,\n timezone,\n}: SchedulePublishHandlerArgs) => {\n const { i18n, payload, user } = req\n\n await canAccessAdmin({ req })\n\n try {\n if (deleteID) {\n await payload.delete({\n collection: 'payload-jobs',\n req,\n where: { id: { equals: deleteID } },\n })\n }\n\n await payload.jobs.queue({\n input: {\n type,\n doc,\n global,\n locale,\n timezone,\n user: user.id,\n },\n task: 'schedulePublish',\n waitUntil: date,\n })\n } catch (err) {\n let error\n\n if (deleteID) {\n error = `Error deleting scheduled publish event with ID ${deleteID}`\n } else {\n error = `Error scheduling ${type} for `\n if (doc) {\n error += `document with ID ${doc.value} in collection ${doc.relationTo}`\n }\n }\n\n payload.logger.error(error)\n payload.logger.error(err)\n\n return {\n error,\n }\n }\n\n return { message: i18n.t('general:success') }\n}\n"],"names":["canAccessAdmin","schedulePublishHandler","type","date","deleteID","doc","global","locale","req","timezone","i18n","payload","user","delete","collection","where","id","equals","jobs","queue","input","task","waitUntil","err","error","value","relationTo","logger","message","t"],"mappings":"AAAA,SAASA,cAAc,QAA4D,UAAS;AAI1F;;GAEC,GAMH,OAAO,MAAMC,yBAAyB,OAAO,EAC3CC,IAAI,EACJC,IAAI,EACJC,QAAQ,EACRC,GAAG,EACHC,MAAM,EACNC,MAAM,EACNC,GAAG,EACHC,QAAQ,EACmB;IAC3B,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGJ;IAEhC,MAAMR,eAAe;QAAEQ;IAAI;IAE3B,IAAI;QACF,IAAIJ,UAAU;YACZ,MAAMO,QAAQE,MAAM,CAAC;gBACnBC,YAAY;gBACZN;gBACAO,OAAO;oBAAEC,IAAI;wBAAEC,QAAQb;oBAAS;gBAAE;YACpC;QACF;QAEA,MAAMO,QAAQO,IAAI,CAACC,KAAK,CAAC;YACvBC,OAAO;gBACLlB;gBACAG;gBACAC;gBACAC;gBACAE;gBACAG,MAAMA,KAAKI,EAAE;YACf;YACAK,MAAM;YACNC,WAAWnB;QACb;IACF,EAAE,OAAOoB,KAAK;QACZ,IAAIC;QAEJ,IAAIpB,UAAU;YACZoB,QAAQ,CAAC,+CAA+C,EAAEpB,UAAU;QACtE,OAAO;YACLoB,QAAQ,CAAC,iBAAiB,EAAEtB,KAAK,KAAK,CAAC;YACvC,IAAIG,KAAK;gBACPmB,SAAS,CAAC,iBAAiB,EAAEnB,IAAIoB,KAAK,CAAC,eAAe,EAAEpB,IAAIqB,UAAU,EAAE;YAC1E;QACF;QAEAf,QAAQgB,MAAM,CAACH,KAAK,CAACA;QACrBb,QAAQgB,MAAM,CAACH,KAAK,CAACD;QAErB,OAAO;YACLC;QACF;IACF;IAEA,OAAO;QAAEI,SAASlB,KAAKmB,CAAC,CAAC;IAAmB;AAC9C,EAAC"}
|
|
@@ -3,6 +3,7 @@ import { cache } from 'react';
|
|
|
3
3
|
import { removeUndefined } from './removeUndefined.js';
|
|
4
4
|
const defaultMerge = (existingValue, incomingValue)=>({
|
|
5
5
|
...typeof existingValue === 'object' ? existingValue : {},
|
|
6
|
+
// Shallow merge existing prefs to acquire any missing keys from incoming value
|
|
6
7
|
...removeUndefined(incomingValue || {})
|
|
7
8
|
});
|
|
8
9
|
export const getPreferences = cache(async (key, payload, userID, userSlug)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/upsertPreferences.ts"],"sourcesContent":["import type { DefaultDocumentIDType, Payload, PayloadRequest } from 'payload'\n\nimport { dequal } from 'dequal/lite'\nimport { cache } from 'react'\n\nimport { removeUndefined } from './removeUndefined.js'\n\ntype PreferenceDoc<T> = {\n id: DefaultDocumentIDType | undefined\n value?: T | undefined\n}\n\ntype DefaultMerge = <T>(existingValue: T, incomingValue: T | undefined) => T\n\nconst defaultMerge: DefaultMerge = <T>(existingValue: T, incomingValue: T | undefined) =>\n ({\n ...(typeof existingValue === 'object' ? existingValue : {}), // Shallow merge existing prefs to acquire any missing keys from incoming value\n ...removeUndefined(incomingValue || {}),\n }) as T\n\nexport const getPreferences = cache(\n async <T>(\n key: string,\n payload: Payload,\n userID: DefaultDocumentIDType,\n userSlug: string,\n ): Promise<PreferenceDoc<T>> => {\n const result = (await payload\n .find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n pagination: false,\n where: {\n and: [\n {\n key: {\n equals: key,\n },\n },\n {\n 'user.relationTo': {\n equals: userSlug,\n },\n },\n {\n 'user.value': {\n equals: userID,\n },\n },\n ],\n },\n })\n .then((res) => res.docs?.[0])) as { id: DefaultDocumentIDType; value: T }\n\n return result\n },\n)\n\n/**\n * Will update the given preferences by key, creating a new record if it doesn't already exist, or merging existing preferences with the new value.\n * This is not possible to do with the existing `db.upsert` operation because it stores on the `value` key and does not perform a deep merge beyond the first level.\n * I.e. if you have a preferences record with a `value` key, `db.upsert` will overwrite the existing value. In the future if this supported we should use that instead.\n * @param req - The PayloadRequest object\n * @param key - The key of the preferences to update\n * @param value - The new value to merge with the existing preferences\n */\nexport const upsertPreferences = async <T extends Record<string, unknown> | string>({\n customMerge,\n key,\n req,\n value: incomingValue,\n}: {\n customMerge?: (existingValue: T, incomingValue: T, defaultMerge: DefaultMerge) => T\n key: string\n req: PayloadRequest\n value: T\n}): Promise<T> => {\n const existingPrefs: PreferenceDoc<T> = req.user\n ? await getPreferences<T>(key, req.payload, req.user.id, req.user.collection)\n : ({} as PreferenceDoc<T>)\n\n let newPrefs = existingPrefs?.value\n\n if (!existingPrefs?.id) {\n await req.payload.create({\n collection: 'payload-preferences',\n data: {\n key,\n user: {\n collection: req.user.collection,\n value: req.user.id,\n },\n value: incomingValue,\n },\n depth: 0,\n disableTransaction: true,\n user: req.user,\n })\n } else {\n let mergedPrefs: T\n\n if (typeof customMerge === 'function') {\n mergedPrefs = customMerge(existingPrefs.value, incomingValue, defaultMerge)\n } else {\n // Strings are valid JSON, i.e. `locale` saved as a string to the locale preferences\n mergedPrefs =\n typeof incomingValue === 'object'\n ? defaultMerge<T>(existingPrefs.value, incomingValue)\n : incomingValue\n }\n\n if (!dequal(mergedPrefs, existingPrefs.value)) {\n newPrefs = await req.payload\n .update({\n id: existingPrefs.id,\n collection: 'payload-preferences',\n data: {\n key,\n user: {\n collection: req.user.collection,\n value: req.user.id,\n },\n value: mergedPrefs,\n },\n depth: 0,\n disableTransaction: true,\n user: req.user,\n })\n ?.then((res) => res.value)\n }\n }\n\n return newPrefs\n}\n"],"names":["dequal","cache","removeUndefined","defaultMerge","existingValue","incomingValue","getPreferences","key","payload","userID","userSlug","result","find","collection","depth","limit","pagination","where","and","equals","then","res","docs","upsertPreferences","customMerge","req","value","existingPrefs","user","id","newPrefs","create","data","disableTransaction","mergedPrefs","update"],"mappings":"AAEA,SAASA,MAAM,QAAQ,cAAa;AACpC,SAASC,KAAK,QAAQ,QAAO;AAE7B,SAASC,eAAe,QAAQ,uBAAsB;AAStD,MAAMC,eAA6B,CAAIC,eAAkBC,gBACtD,CAAA;QACC,GAAI,OAAOD,kBAAkB,WAAWA,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/upsertPreferences.ts"],"sourcesContent":["import type { DefaultDocumentIDType, Payload, PayloadRequest } from 'payload'\n\nimport { dequal } from 'dequal/lite'\nimport { cache } from 'react'\n\nimport { removeUndefined } from './removeUndefined.js'\n\ntype PreferenceDoc<T> = {\n id: DefaultDocumentIDType | undefined\n value?: T | undefined\n}\n\ntype DefaultMerge = <T>(existingValue: T, incomingValue: T | undefined) => T\n\nconst defaultMerge: DefaultMerge = <T>(existingValue: T, incomingValue: T | undefined) =>\n ({\n ...(typeof existingValue === 'object' ? existingValue : {}), // Shallow merge existing prefs to acquire any missing keys from incoming value\n ...removeUndefined(incomingValue || {}),\n }) as T\n\nexport const getPreferences = cache(\n async <T>(\n key: string,\n payload: Payload,\n userID: DefaultDocumentIDType,\n userSlug: string,\n ): Promise<PreferenceDoc<T>> => {\n const result = (await payload\n .find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n pagination: false,\n where: {\n and: [\n {\n key: {\n equals: key,\n },\n },\n {\n 'user.relationTo': {\n equals: userSlug,\n },\n },\n {\n 'user.value': {\n equals: userID,\n },\n },\n ],\n },\n })\n .then((res) => res.docs?.[0])) as { id: DefaultDocumentIDType; value: T }\n\n return result\n },\n)\n\n/**\n * Will update the given preferences by key, creating a new record if it doesn't already exist, or merging existing preferences with the new value.\n * This is not possible to do with the existing `db.upsert` operation because it stores on the `value` key and does not perform a deep merge beyond the first level.\n * I.e. if you have a preferences record with a `value` key, `db.upsert` will overwrite the existing value. In the future if this supported we should use that instead.\n * @param req - The PayloadRequest object\n * @param key - The key of the preferences to update\n * @param value - The new value to merge with the existing preferences\n */\nexport const upsertPreferences = async <T extends Record<string, unknown> | string>({\n customMerge,\n key,\n req,\n value: incomingValue,\n}: {\n customMerge?: (existingValue: T, incomingValue: T, defaultMerge: DefaultMerge) => T\n key: string\n req: PayloadRequest\n value: T\n}): Promise<T> => {\n const existingPrefs: PreferenceDoc<T> = req.user\n ? await getPreferences<T>(key, req.payload, req.user.id, req.user.collection)\n : ({} as PreferenceDoc<T>)\n\n let newPrefs = existingPrefs?.value\n\n if (!existingPrefs?.id) {\n await req.payload.create({\n collection: 'payload-preferences',\n data: {\n key,\n user: {\n collection: req.user.collection,\n value: req.user.id,\n },\n value: incomingValue,\n },\n depth: 0,\n disableTransaction: true,\n user: req.user,\n })\n } else {\n let mergedPrefs: T\n\n if (typeof customMerge === 'function') {\n mergedPrefs = customMerge(existingPrefs.value, incomingValue, defaultMerge)\n } else {\n // Strings are valid JSON, i.e. `locale` saved as a string to the locale preferences\n mergedPrefs =\n typeof incomingValue === 'object'\n ? defaultMerge<T>(existingPrefs.value, incomingValue)\n : incomingValue\n }\n\n if (!dequal(mergedPrefs, existingPrefs.value)) {\n newPrefs = await req.payload\n .update({\n id: existingPrefs.id,\n collection: 'payload-preferences',\n data: {\n key,\n user: {\n collection: req.user.collection,\n value: req.user.id,\n },\n value: mergedPrefs,\n },\n depth: 0,\n disableTransaction: true,\n user: req.user,\n })\n ?.then((res) => res.value)\n }\n }\n\n return newPrefs\n}\n"],"names":["dequal","cache","removeUndefined","defaultMerge","existingValue","incomingValue","getPreferences","key","payload","userID","userSlug","result","find","collection","depth","limit","pagination","where","and","equals","then","res","docs","upsertPreferences","customMerge","req","value","existingPrefs","user","id","newPrefs","create","data","disableTransaction","mergedPrefs","update"],"mappings":"AAEA,SAASA,MAAM,QAAQ,cAAa;AACpC,SAASC,KAAK,QAAQ,QAAO;AAE7B,SAASC,eAAe,QAAQ,uBAAsB;AAStD,MAAMC,eAA6B,CAAIC,eAAkBC,gBACtD,CAAA;QACC,GAAI,OAAOD,kBAAkB,WAAWA,gBAAgB,CAAC,CAAC;QAAG,+EAA+E;QAC5I,GAAGF,gBAAgBG,iBAAiB,CAAC,EAAE;IACzC,CAAA;AAEF,OAAO,MAAMC,iBAAiBL,MAC5B,OACEM,KACAC,SACAC,QACAC;IAEA,MAAMC,SAAU,MAAMH,QACnBI,IAAI,CAAC;QACJC,YAAY;QACZC,OAAO;QACPC,OAAO;QACPC,YAAY;QACZC,OAAO;YACLC,KAAK;gBACH;oBACEX,KAAK;wBACHY,QAAQZ;oBACV;gBACF;gBACA;oBACE,mBAAmB;wBACjBY,QAAQT;oBACV;gBACF;gBACA;oBACE,cAAc;wBACZS,QAAQV;oBACV;gBACF;aACD;QACH;IACF,GACCW,IAAI,CAAC,CAACC,MAAQA,IAAIC,IAAI,EAAE,CAAC,EAAE;IAE9B,OAAOX;AACT,GACD;AAED;;;;;;;CAOC,GACD,OAAO,MAAMY,oBAAoB,OAAmD,EAClFC,WAAW,EACXjB,GAAG,EACHkB,GAAG,EACHC,OAAOrB,aAAa,EAMrB;IACC,MAAMsB,gBAAkCF,IAAIG,IAAI,GAC5C,MAAMtB,eAAkBC,KAAKkB,IAAIjB,OAAO,EAAEiB,IAAIG,IAAI,CAACC,EAAE,EAAEJ,IAAIG,IAAI,CAACf,UAAU,IACzE,CAAC;IAEN,IAAIiB,WAAWH,eAAeD;IAE9B,IAAI,CAACC,eAAeE,IAAI;QACtB,MAAMJ,IAAIjB,OAAO,CAACuB,MAAM,CAAC;YACvBlB,YAAY;YACZmB,MAAM;gBACJzB;gBACAqB,MAAM;oBACJf,YAAYY,IAAIG,IAAI,CAACf,UAAU;oBAC/Ba,OAAOD,IAAIG,IAAI,CAACC,EAAE;gBACpB;gBACAH,OAAOrB;YACT;YACAS,OAAO;YACPmB,oBAAoB;YACpBL,MAAMH,IAAIG,IAAI;QAChB;IACF,OAAO;QACL,IAAIM;QAEJ,IAAI,OAAOV,gBAAgB,YAAY;YACrCU,cAAcV,YAAYG,cAAcD,KAAK,EAAErB,eAAeF;QAChE,OAAO;YACL,oFAAoF;YACpF+B,cACE,OAAO7B,kBAAkB,WACrBF,aAAgBwB,cAAcD,KAAK,EAAErB,iBACrCA;QACR;QAEA,IAAI,CAACL,OAAOkC,aAAaP,cAAcD,KAAK,GAAG;YAC7CI,WAAW,MAAML,IAAIjB,OAAO,CACzB2B,MAAM,CAAC;gBACNN,IAAIF,cAAcE,EAAE;gBACpBhB,YAAY;gBACZmB,MAAM;oBACJzB;oBACAqB,MAAM;wBACJf,YAAYY,IAAIG,IAAI,CAACf,UAAU;wBAC/Ba,OAAOD,IAAIG,IAAI,CAACC,EAAE;oBACpB;oBACAH,OAAOQ;gBACT;gBACApB,OAAO;gBACPmB,oBAAoB;gBACpBL,MAAMH,IAAIG,IAAI;YAChB,IACER,KAAK,CAACC,MAAQA,IAAIK,KAAK;QAC7B;IACF;IAEA,OAAOI;AACT,EAAC"}
|
package/dist/views/Edit/index.js
CHANGED
|
@@ -69,8 +69,8 @@ export function DefaultEditView({ BeforeDocumentControls, Description, EditMenuI
|
|
|
69
69
|
const docConfig = collectionConfig || globalConfig;
|
|
70
70
|
const lockDocumentsProp = docConfig?.lockDocuments !== undefined ? docConfig?.lockDocuments : true;
|
|
71
71
|
const isLockingEnabled = lockDocumentsProp !== false;
|
|
72
|
-
const lockDurationDefault = 300
|
|
73
|
-
|
|
72
|
+
const lockDurationDefault = 300;
|
|
73
|
+
// Default 5 minutes in seconds
|
|
74
74
|
const lockDuration = typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault;
|
|
75
75
|
const lockDurationInMilliseconds = lockDuration * 1000;
|
|
76
76
|
const autosaveEnabled = hasAutosaveEnabled(docConfig);
|
|
@@ -142,12 +142,12 @@ export function DefaultEditView({ BeforeDocumentControls, Description, EditMenuI
|
|
|
142
142
|
setDocumentIsLocked(false);
|
|
143
143
|
setCurrentEditor(null);
|
|
144
144
|
} catch (err) {
|
|
145
|
-
console.error('Failed to unlock before leave', err)
|
|
146
|
-
;
|
|
145
|
+
console.error('Failed to unlock before leave', err);
|
|
147
146
|
}
|
|
148
147
|
}
|
|
149
148
|
}
|
|
150
|
-
},
|
|
149
|
+
}, // eslint-disable-line no-console
|
|
150
|
+
[
|
|
151
151
|
collectionSlug,
|
|
152
152
|
documentIsLocked,
|
|
153
153
|
documentLockState,
|
|
@@ -288,8 +288,8 @@ export function DefaultEditView({ BeforeDocumentControls, Description, EditMenuI
|
|
|
288
288
|
const controller = handleAbortRef(abortOnChangeRef);
|
|
289
289
|
const currentTime = Date.now();
|
|
290
290
|
const timeSinceLastUpdate = currentTime - editSessionStartTime;
|
|
291
|
-
const updateLastEdited = isLockingEnabled && timeSinceLastUpdate >= 10000
|
|
292
|
-
|
|
291
|
+
const updateLastEdited = isLockingEnabled && timeSinceLastUpdate >= 10000;
|
|
292
|
+
// 10 seconds
|
|
293
293
|
if (updateLastEdited) {
|
|
294
294
|
setEditSessionStartTime(currentTime);
|
|
295
295
|
}
|