@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.
Files changed (253) hide show
  1. package/dist/elements/AnimateHeight/usePatchAnimateHeight.js +2 -2
  2. package/dist/elements/AnimateHeight/usePatchAnimateHeight.js.map +1 -1
  3. package/dist/elements/Autosave/index.js +1 -0
  4. package/dist/elements/Autosave/index.js.map +1 -1
  5. package/dist/elements/BulkUpload/EditMany/index.js +2 -2
  6. package/dist/elements/BulkUpload/EditMany/index.js.map +1 -1
  7. package/dist/elements/BulkUpload/FormsManager/index.js +8 -8
  8. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  9. package/dist/elements/BulkUpload/index.js +12 -1
  10. package/dist/elements/BulkUpload/index.js.map +1 -1
  11. package/dist/elements/Button/index.js +2 -2
  12. package/dist/elements/Button/index.js.map +1 -1
  13. package/dist/elements/Button/types.js +13 -1
  14. package/dist/elements/Button/types.js.map +1 -1
  15. package/dist/elements/Card/index.js +5 -1
  16. package/dist/elements/Card/index.js.map +1 -1
  17. package/dist/elements/CodeEditor/CodeEditor.js +2 -2
  18. package/dist/elements/CodeEditor/CodeEditor.js.map +1 -1
  19. package/dist/elements/CodeEditor/types.js +3 -1
  20. package/dist/elements/CodeEditor/types.js.map +1 -1
  21. package/dist/elements/Collapsible/index.js +8 -1
  22. package/dist/elements/Collapsible/index.js.map +1 -1
  23. package/dist/elements/Combobox/index.js +6 -0
  24. package/dist/elements/Combobox/index.js.map +1 -1
  25. package/dist/elements/DatePicker/DatePicker.js +1 -0
  26. package/dist/elements/DatePicker/DatePicker.js.map +1 -1
  27. package/dist/elements/DatePicker/getFormattedLocale.js +1 -0
  28. package/dist/elements/DatePicker/getFormattedLocale.js.map +1 -1
  29. package/dist/elements/DeleteMany/index.js +25 -1
  30. package/dist/elements/DeleteMany/index.js.map +1 -1
  31. package/dist/elements/DocumentControls/index.js +1 -1
  32. package/dist/elements/DocumentControls/index.js.map +1 -1
  33. package/dist/elements/DocumentDrawer/Provider.js +5 -1
  34. package/dist/elements/DocumentDrawer/Provider.js.map +1 -1
  35. package/dist/elements/DocumentDrawer/types.js +11 -1
  36. package/dist/elements/DocumentDrawer/types.js.map +1 -1
  37. package/dist/elements/DraggableSortable/useDraggableSortable/index.js +1 -0
  38. package/dist/elements/DraggableSortable/useDraggableSortable/index.js.map +1 -1
  39. package/dist/elements/Drawer/index.js +3 -1
  40. package/dist/elements/Drawer/index.js.map +1 -1
  41. package/dist/elements/EditMany/DrawerContent.js +15 -1
  42. package/dist/elements/EditMany/DrawerContent.js.map +1 -1
  43. package/dist/elements/EditMany/index.js +3 -1
  44. package/dist/elements/EditMany/index.js.map +1 -1
  45. package/dist/elements/FolderView/Drawers/MoveToFolder/index.js +8 -1
  46. package/dist/elements/FolderView/Drawers/MoveToFolder/index.js.map +1 -1
  47. package/dist/elements/FolderView/FolderFileCard/index.js +1 -0
  48. package/dist/elements/FolderView/FolderFileCard/index.js.map +1 -1
  49. package/dist/elements/FolderView/MoveDocToFolder/index.js +2 -3
  50. package/dist/elements/FolderView/MoveDocToFolder/index.js.map +1 -1
  51. package/dist/elements/HTMLDiff/diff/index.js +24 -3
  52. package/dist/elements/HTMLDiff/diff/index.js.map +1 -1
  53. package/dist/elements/HydrateAuthProvider/index.js +6 -1
  54. package/dist/elements/HydrateAuthProvider/index.js.map +1 -1
  55. package/dist/elements/LeaveWithoutSaving/usePreventLeave.js +3 -1
  56. package/dist/elements/LeaveWithoutSaving/usePreventLeave.js.map +1 -1
  57. package/dist/elements/Link/index.js +5 -1
  58. package/dist/elements/Link/index.js.map +1 -1
  59. package/dist/elements/ListControls/types.js +7 -1
  60. package/dist/elements/ListControls/types.js.map +1 -1
  61. package/dist/elements/ListDrawer/DrawerContent.js +2 -2
  62. package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
  63. package/dist/elements/ListDrawer/Provider.js +8 -1
  64. package/dist/elements/ListDrawer/Provider.js.map +1 -1
  65. package/dist/elements/ListDrawer/index.js +2 -1
  66. package/dist/elements/ListDrawer/index.js.map +1 -1
  67. package/dist/elements/ListDrawer/types.js +5 -1
  68. package/dist/elements/ListDrawer/types.js.map +1 -1
  69. package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js +5 -1
  70. package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js.map +1 -1
  71. package/dist/elements/ListSelection/index.js +11 -1
  72. package/dist/elements/ListSelection/index.js.map +1 -1
  73. package/dist/elements/LivePreview/Toolbar/Controls/index.js +1 -1
  74. package/dist/elements/LivePreview/Toolbar/Controls/index.js.map +1 -1
  75. package/dist/elements/Logout/index.js +5 -1
  76. package/dist/elements/Logout/index.js.map +1 -1
  77. package/dist/elements/Pill/index.js +5 -2
  78. package/dist/elements/Pill/index.js.map +1 -1
  79. package/dist/elements/PublishMany/index.js +3 -1
  80. package/dist/elements/PublishMany/index.js.map +1 -1
  81. package/dist/elements/QueryPresets/QueryPresetBar/index.js +1 -2
  82. package/dist/elements/QueryPresets/QueryPresetBar/index.js.map +1 -1
  83. package/dist/elements/ReactSelect/index.js +2 -2
  84. package/dist/elements/ReactSelect/index.js.map +1 -1
  85. package/dist/elements/ReactSelect/types.js +8 -1
  86. package/dist/elements/ReactSelect/types.js.map +1 -1
  87. package/dist/elements/RelationshipTable/index.js +2 -2
  88. package/dist/elements/RelationshipTable/index.js.map +1 -1
  89. package/dist/elements/RestoreMany/index.js +1 -0
  90. package/dist/elements/RestoreMany/index.js.map +1 -1
  91. package/dist/elements/SaveButton/index.js +1 -2
  92. package/dist/elements/SaveButton/index.js.map +1 -1
  93. package/dist/elements/SaveDraftButton/index.js +1 -2
  94. package/dist/elements/SaveDraftButton/index.js.map +1 -1
  95. package/dist/elements/SearchFilter/types.js +19 -1
  96. package/dist/elements/SearchFilter/types.js.map +1 -1
  97. package/dist/elements/Status/index.js +2 -2
  98. package/dist/elements/Status/index.js.map +1 -1
  99. package/dist/elements/StepNav/index.js +5 -1
  100. package/dist/elements/StepNav/index.js.map +1 -1
  101. package/dist/elements/Table/DefaultCell/fields/Select/index.js +4 -4
  102. package/dist/elements/Table/DefaultCell/fields/Select/index.js.map +1 -1
  103. package/dist/elements/Table/DefaultCell/index.js +2 -1
  104. package/dist/elements/Table/DefaultCell/index.js.map +1 -1
  105. package/dist/elements/Table/RelationshipProvider/index.js +3 -0
  106. package/dist/elements/Table/RelationshipProvider/index.js.map +1 -1
  107. package/dist/elements/Thumbnail/createThumbnail.js +12 -12
  108. package/dist/elements/Thumbnail/createThumbnail.js.map +1 -1
  109. package/dist/elements/Tooltip/index.js +3 -1
  110. package/dist/elements/Tooltip/index.js.map +1 -1
  111. package/dist/elements/UnpublishMany/index.js +3 -1
  112. package/dist/elements/UnpublishMany/index.js.map +1 -1
  113. package/dist/elements/Upload/index.js +8 -8
  114. package/dist/elements/Upload/index.js.map +1 -1
  115. package/dist/elements/WhereBuilder/Condition/Number/index.js +1 -0
  116. package/dist/elements/WhereBuilder/Condition/Number/index.js.map +1 -1
  117. package/dist/elements/WhereBuilder/Condition/Relationship/index.js +5 -6
  118. package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
  119. package/dist/elements/WhereBuilder/Condition/Text/index.js +1 -0
  120. package/dist/elements/WhereBuilder/Condition/Text/index.js.map +1 -1
  121. package/dist/elements/WhereBuilder/index.js +2 -2
  122. package/dist/elements/WhereBuilder/index.js.map +1 -1
  123. package/dist/exports/client/index.js +26 -2
  124. package/dist/exports/client/index.js.map +1 -1
  125. package/dist/exports/shared/index.js +2 -1
  126. package/dist/exports/shared/index.js.map +1 -1
  127. package/dist/fields/Blocks/BlockSelector/index.js +3 -1
  128. package/dist/fields/Blocks/BlockSelector/index.js.map +1 -1
  129. package/dist/fields/Email/index.js +1 -1
  130. package/dist/fields/Email/index.js.map +1 -1
  131. package/dist/fields/Group/index.js +1 -1
  132. package/dist/fields/Group/index.js.map +1 -1
  133. package/dist/fields/Number/index.js +5 -3
  134. package/dist/fields/Number/index.js.map +1 -1
  135. package/dist/fields/Password/types.js +11 -1
  136. package/dist/fields/Password/types.js.map +1 -1
  137. package/dist/fields/Point/index.js +2 -2
  138. package/dist/fields/Point/index.js.map +1 -1
  139. package/dist/fields/Relationship/select-components/MultiValueLabel/index.js +4 -1
  140. package/dist/fields/Relationship/select-components/MultiValueLabel/index.js.map +1 -1
  141. package/dist/fields/Relationship/select-components/SingleValue/index.js +4 -1
  142. package/dist/fields/Relationship/select-components/SingleValue/index.js.map +1 -1
  143. package/dist/fields/Text/index.js +3 -2
  144. package/dist/fields/Text/index.js.map +1 -1
  145. package/dist/fields/Upload/Input.js +3 -1
  146. package/dist/fields/Upload/Input.js.map +1 -1
  147. package/dist/fields/Upload/types.js +1 -0
  148. package/dist/fields/Upload/types.js.map +1 -1
  149. package/dist/fields/shared/index.js +2 -3
  150. package/dist/fields/shared/index.js.map +1 -1
  151. package/dist/forms/Form/fieldReducer.js +2 -1
  152. package/dist/forms/Form/fieldReducer.js.map +1 -1
  153. package/dist/forms/Form/index.js +12 -9
  154. package/dist/forms/Form/index.js.map +1 -1
  155. package/dist/forms/Form/mergeServerFormState.js +11 -3
  156. package/dist/forms/Form/mergeServerFormState.js.map +1 -1
  157. package/dist/forms/Form/reduceToSerializableFields.js +2 -2
  158. package/dist/forms/Form/reduceToSerializableFields.js.map +1 -1
  159. package/dist/forms/Form/types.js +52 -1
  160. package/dist/forms/Form/types.js.map +1 -1
  161. package/dist/forms/NullifyField/index.js +2 -1
  162. package/dist/forms/NullifyField/index.js.map +1 -1
  163. package/dist/forms/WatchChildErrors/index.js +6 -1
  164. package/dist/forms/WatchChildErrors/index.js.map +1 -1
  165. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +20 -0
  166. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
  167. package/dist/forms/fieldSchemasToFormState/index.js +33 -1
  168. package/dist/forms/fieldSchemasToFormState/index.js.map +1 -1
  169. package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js +2 -2
  170. package/dist/forms/fieldSchemasToFormState/isRowCollapsed.js.map +1 -1
  171. package/dist/forms/fieldSchemasToFormState/iterateFields.js +16 -0
  172. package/dist/forms/fieldSchemasToFormState/iterateFields.js.map +1 -1
  173. package/dist/forms/fieldSchemasToFormState/renderField.js +2 -2
  174. package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
  175. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js +22 -1
  176. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js.map +1 -1
  177. package/dist/forms/fieldSchemasToFormState/types.js +5 -1
  178. package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
  179. package/dist/forms/useField/index.js +1 -0
  180. package/dist/forms/useField/index.js.map +1 -1
  181. package/dist/forms/useField/types.js +19 -1
  182. package/dist/forms/useField/types.js.map +1 -1
  183. package/dist/hooks/useControllableState.js +9 -1
  184. package/dist/hooks/useControllableState.js.map +1 -1
  185. package/dist/hooks/useDelayedRender.js +3 -1
  186. package/dist/hooks/useDelayedRender.js.map +1 -1
  187. package/dist/hooks/useHotkey.js +2 -2
  188. package/dist/hooks/useHotkey.js.map +1 -1
  189. package/dist/hooks/usePayloadAPI.js +3 -4
  190. package/dist/hooks/usePayloadAPI.js.map +1 -1
  191. package/dist/hooks/usePopupWindow.js +2 -2
  192. package/dist/hooks/usePopupWindow.js.map +1 -1
  193. package/dist/hooks/useQueue.js +15 -7
  194. package/dist/hooks/useQueue.js.map +1 -1
  195. package/dist/hooks/useResize.js +4 -3
  196. package/dist/hooks/useResize.js.map +1 -1
  197. package/dist/providers/Auth/index.js +35 -3
  198. package/dist/providers/Auth/index.js.map +1 -1
  199. package/dist/providers/Config/index.js +10 -1
  200. package/dist/providers/Config/index.js.map +1 -1
  201. package/dist/providers/DocumentInfo/index.js +6 -7
  202. package/dist/providers/DocumentInfo/index.js.map +1 -1
  203. package/dist/providers/DocumentInfo/types.js +25 -1
  204. package/dist/providers/DocumentInfo/types.js.map +1 -1
  205. package/dist/providers/Folders/index.js +44 -2
  206. package/dist/providers/Folders/index.js.map +1 -1
  207. package/dist/providers/ListQuery/types.js +5 -1
  208. package/dist/providers/ListQuery/types.js.map +1 -1
  209. package/dist/providers/LivePreview/context.js +11 -1
  210. package/dist/providers/LivePreview/context.js.map +1 -1
  211. package/dist/providers/LivePreview/index.js +7 -4
  212. package/dist/providers/LivePreview/index.js.map +1 -1
  213. package/dist/providers/Preferences/index.js +7 -2
  214. package/dist/providers/Preferences/index.js.map +1 -1
  215. package/dist/providers/RouteTransition/index.js +9 -9
  216. package/dist/providers/RouteTransition/index.js.map +1 -1
  217. package/dist/providers/Selection/index.js +7 -2
  218. package/dist/providers/Selection/index.js.map +1 -1
  219. package/dist/providers/ServerFunctions/index.js +25 -22
  220. package/dist/providers/ServerFunctions/index.js.map +1 -1
  221. package/dist/providers/TableColumns/buildColumnState/index.js +10 -9
  222. package/dist/providers/TableColumns/buildColumnState/index.js.map +1 -1
  223. package/dist/providers/TableColumns/buildColumnState/renderCell.js +4 -3
  224. package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
  225. package/dist/providers/TableColumns/types.js +17 -1
  226. package/dist/providers/TableColumns/types.js.map +1 -1
  227. package/dist/utilities/abortAndIgnore.js +4 -6
  228. package/dist/utilities/abortAndIgnore.js.map +1 -1
  229. package/dist/utilities/buildFieldSchemaMap/traverseFields.js +2 -2
  230. package/dist/utilities/buildFieldSchemaMap/traverseFields.js.map +1 -1
  231. package/dist/utilities/copyDataFromLocale.js +6 -2
  232. package/dist/utilities/copyDataFromLocale.js.map +1 -1
  233. package/dist/utilities/getDisplayedFieldValue.js +8 -8
  234. package/dist/utilities/getDisplayedFieldValue.js.map +1 -1
  235. package/dist/utilities/getFolderResultsComponentAndData.js +2 -1
  236. package/dist/utilities/getFolderResultsComponentAndData.js.map +1 -1
  237. package/dist/utilities/handleFormStateLocking.js +2 -2
  238. package/dist/utilities/handleFormStateLocking.js.map +1 -1
  239. package/dist/utilities/hasSavePermission.js +5 -1
  240. package/dist/utilities/hasSavePermission.js.map +1 -1
  241. package/dist/utilities/isURLAllowed.js +6 -6
  242. package/dist/utilities/isURLAllowed.js.map +1 -1
  243. package/dist/utilities/renderTable.js +2 -1
  244. package/dist/utilities/renderTable.js.map +1 -1
  245. package/dist/utilities/schedulePublishHandler.js +3 -1
  246. package/dist/utilities/schedulePublishHandler.js.map +1 -1
  247. package/dist/utilities/upsertPreferences.js +1 -0
  248. package/dist/utilities/upsertPreferences.js.map +1 -1
  249. package/dist/views/Edit/index.js +7 -7
  250. package/dist/views/Edit/index.js.map +1 -1
  251. package/dist/views/List/ListHeader/index.js +6 -1
  252. package/dist/views/List/ListHeader/index.js.map +1 -1
  253. 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
- }) : payload.findByID({
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
- }) : payload.findByID({
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":"AAAA,OAAOA,oBAAoB,gBAAe;AAC1C,SACEC,cAAc,EAKdC,YAAY,EAGZC,cAAc,QACT,UAAS;AAChB,SAASC,gBAAgB,EAAEC,sBAAsB,EAAEC,UAAU,QAAQ,iBAAgB;AAErF,MAAMC,WAAW,aAAaP,iBAAiBA,eAAeQ,OAAO,GAAGR;AAYxE,SAASS,cACPC,MAAe,EACfC,cAAoB,EACpBC,YAAkB,EAClBC,GAAmB,EACnBC,iBAA0B;IAE1BJ,OAAOK,GAAG,CAAC,CAACC;QACV,IAAIZ,iBAAiBY,QAAQ;YAC3B,OAAQA,MAAMC,IAAI;gBAChB,KAAK;oBACH,mDAAmD;oBACnD,IACED,MAAME,IAAI,IAAIN,gBACd,wDAAwD;oBACxD;wBAAC;wBAAMO;qBAAU,CAACC,QAAQ,CAACR,YAAY,CAACI,MAAME,IAAI,CAAC,KACnDF,MAAME,IAAI,IAAIP,gBACd;wBACAC,YAAY,CAACI,MAAME,IAAI,CAAC,GAAGP,cAAc,CAACK,MAAME,IAAI,CAAC;wBACrD;oBACF;oBAEA,4DAA4D;oBAC5D,IAAIF,MAAME,IAAI,IAAIN,cAAc;wBAC9BA,YAAY,CAACI,MAAME,IAAI,CAAC,CAACH,GAAG,CAAC,CAACM,MAAYC;4BACxC,IAAIX,cAAc,CAACK,MAAME,IAAI,CAAC,EAAE,CAACI,MAAM,EAAE;gCACvC,oFAAoF;gCACpF,IAAIjB,uBAAuB;oCAAEW;oCAAOF;gCAAkB,IAAI;oCACxDF,YAAY,CAACI,MAAME,IAAI,CAAC,CAACI,MAAM,CAACC,EAAE,GAAG,IAAIhB,WAAWiB,WAAW;gCACjE;gCAEAf,cACEO,MAAMN,MAAM,EACZC,cAAc,CAACK,MAAME,IAAI,CAAC,CAACI,MAAM,EACjCD,MACAR,KACAC,qBAAqBE,MAAMS,SAAS;4BAExC;wBACF;oBACF;oBACA;gBAEF,KAAK;oBACH,mDAAmD;oBACnD,IACET,MAAME,IAAI,IAAIN,gBACd,sEAAsE;oBACrE,CAAA;wBAAC;wBAAMO;qBAAU,CAACC,QAAQ,CAACR,YAAY,CAACI,MAAME,IAAI,CAAC,KACjDQ,MAAMC,OAAO,CAACf,YAAY,CAACI,MAAME,IAAI,CAAC,KAAKN,YAAY,CAACI,MAAME,IAAI,CAAC,CAACU,MAAM,KAAK,CAAC,KACnFZ,MAAME,IAAI,IAAIP,gBACd;wBACAC,YAAY,CAACI,MAAME,IAAI,CAAC,GAAGP,cAAc,CAACK,MAAME,IAAI,CAAC;wBACrD;oBACF;oBAEA,4DAA4D;oBAC5D,IAAIF,MAAME,IAAI,IAAIN,cAAc;wBAC9BA,YAAY,CAACI,MAAME,IAAI,CAAC,CAACH,GAAG,CAAC,CAACc,WAAiBP;4BAC7C,MAAMQ,QACJjB,IAAIkB,OAAO,CAACC,MAAM,CAACH,UAAUI,SAAS,CAAC,IACtC,AAACjB,CAAAA,MAAMkB,eAAe,IAAIlB,MAAMgB,MAAM,AAAD,EAAGG,IAAI,CAC3C,CAACL,QAAU,OAAOA,UAAU,YAAYA,MAAMM,IAAI,KAAKP,UAAUI,SAAS;4BAG9E,oFAAoF;4BACpF,IAAI5B,uBAAuB;gCAAEW;gCAAOF;4BAAkB,IAAI;gCACxDF,YAAY,CAACI,MAAME,IAAI,CAAC,CAACI,MAAM,CAACC,EAAE,GAAG,IAAIhB,WAAWiB,WAAW;4BACjE;4BAEA,IAAIM,OAAOpB,QAAQkB,QAAQ;gCACzBnB,cACEqB,OAAOpB,QACPC,cAAc,CAACK,MAAME,IAAI,CAAC,CAACI,MAAM,EACjCO,WACAhB,KACAC,qBAAqBE,MAAMS,SAAS;4BAExC;wBACF;oBACF;oBAEA;gBAEF,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,KAAK;oBACH,IACET,MAAME,IAAI,IAAIN,gBACd,wDAAwD;oBACxD;wBAAC;wBAAMO;qBAAU,CAACC,QAAQ,CAACR,YAAY,CAACI,MAAME,IAAI,CAAC,KACnDF,MAAME,IAAI,IAAIP,gBACd;wBACAC,YAAY,CAACI,MAAME,IAAI,CAAC,GAAGP,cAAc,CAACK,MAAME,IAAI,CAAC;oBACvD;oBACA;gBAEF,KAAK;oBAAS;wBACZ,IACEd,iBAAiBY,UACjBA,MAAME,IAAI,IAAIN,gBACdD,gBAAgB,CAACK,MAAME,IAAI,CAAC,KAAKC,WACjC;4BACAV,cACEO,MAAMN,MAAM,EACZC,cAAc,CAACK,MAAME,IAAI,CAAC,EAC1BN,YAAY,CAACI,MAAME,IAAI,CAAC,EACxBL,KACAC,qBAAqBE,MAAMS,SAAS;wBAExC,OAAO;4BACLhB,cAAcO,MAAMN,MAAM,EAAEC,gBAAgBC,cAAcC,KAAKC;wBACjE;wBACA;oBACF;YACF;QACF,OAAO;YACL,OAAQE,MAAMC,IAAI;gBAChB,KAAK;gBACL,KAAK;oBACHR,cAAcO,MAAMN,MAAM,EAAEC,gBAAgBC,cAAcC,KAAKC;oBAC/D;gBAEF,KAAK;oBACHE,MAAMqB,IAAI,CAACtB,GAAG,CAAC,CAACuB;wBACd,IAAIhC,WAAWgC,MAAM;4BACnB,IAAIA,IAAIpB,IAAI,IAAIN,gBAAgBD,gBAAgB,CAAC2B,IAAIpB,IAAI,CAAC,KAAKC,WAAW;gCACxEV,cACE6B,IAAI5B,MAAM,EACVC,cAAc,CAAC2B,IAAIpB,IAAI,CAAC,EACxBN,YAAY,CAAC0B,IAAIpB,IAAI,CAAC,EACtBL,KACAC;4BAEJ;wBACF,OAAO;4BACLL,cAAc6B,IAAI5B,MAAM,EAAEC,gBAAgBC,cAAcC,KAAKC;wBAC/D;oBACF;oBACA;YACJ;QACF;IACF;AACF;AAEA,SAASyB,UACP5B,cAAoB,EACpBC,YAAkB,EAClBF,MAAe,EACfG,GAAmB,EACnBC,iBAA0B;IAE1BL,cAAcC,QAAQC,gBAAgBC,cAAcC,KAAKC;IAEzD,OAAOF;AACT;AAEA;;;CAGC,GACD,SAAS4B,4BAA4BC,IAAU,EAAE/B,MAAe;IAC9DP,eAAe;QACbuC,UAAU,CAAC,EAAE5B,iBAAiB,EAAE6B,GAAG,EAAE;YACnC,IAAI7B,mBAAmB;gBACrB,OAAO,AAAC6B,IAAwBpB,EAAE;YACpC;QACF;QACAb;QACAkC,WAAW;QACXD,KAAKF;IACP;IAEA,OAAOA;AACT;AAEA,OAAO,MAAMI,4BAAoE,OAAOC;IACtF,MAAM,EAAEjC,GAAG,EAAE,GAAGiC;IAEhB,IAAI;QACF,OAAO,MAAMC,mBAAmBD;IAClC,EAAE,OAAOE,KAAK;QACZnC,IAAIkB,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;YACvBF;YACAG,KAAK,CAAC,sCAAsC,EAAEL,KAAKM,UAAU,CAAC,MAAM,EAAEN,KAAKO,QAAQ,CAAC,CAAC,CAAC;QACxF;QAEA,IAAIL,IAAIM,OAAO,KAAK,gBAAgB;YAClC,OAAO;QACT;QAEA,OAAOpD,aAAa8C;IACtB;AACF,EAAC;AAED,OAAO,MAAMD,qBAAqB,OAAOD;IACvC,MAAM,EACJS,cAAc,EACdC,KAAK,EACLJ,UAAU,EACVK,UAAU,EACVC,eAAe,KAAK,EACpB7C,KAAK,EACHkB,OAAO,EACPA,SAAS,EAAE4B,WAAW,EAAEC,OAAO,EAAE,EACjCC,IAAI,EACL,EACDhD,GAAG,EACHwC,QAAQ,EACT,GAAGP;IAEJ,MAAM7C,eAAe;QAAEY;IAAI;IAE3B,MAAM,CAACF,gBAAgBC,aAAa,GAAG,MAAMkD,QAAQC,UAAU,CAAC;QAC9DN,aACI1B,QAAQiC,UAAU,CAAC;YACjB5B,MAAMqB;YACNQ,OAAO;YACPC,QAAQd;YACRe,gBAAgB;YAChBN;QAEF,KACA9B,QAAQqC,QAAQ,CAAC;YACf7C,IAAIiC;YACJa,YAAYd;YACZU,OAAO;YACPK,OAAO;YACPJ,QAAQd;YACRe,gBAAgB;YAChBN;QAEF;QACJJ,aACI1B,QAAQiC,UAAU,CAAC;YACjB5B,MAAMqB;YACNQ,OAAO;YACPC,QAAQb;YACRc,gBAAgB;YAChBN;QAEF,KACA9B,QAAQqC,QAAQ,CAAC;YACf7C,IAAIiC;YACJa,YAAYd;YACZU,OAAO;YACPK,OAAO;YACPJ,QAAQb;YACRc,gBAAgB;YAChBN;QAEF;KACL;IAED,IAAIlD,eAAe4D,MAAM,KAAK,YAAY;QACxC,MAAM,IAAIC,MAAM,CAAC,iCAAiC,EAAEpB,WAAW,CAAC,CAAC;IACnE;IAEA,IAAIxC,aAAa2D,MAAM,KAAK,YAAY;QACtC,MAAM,IAAIC,MAAM,CAAC,iCAAiC,EAAEnB,SAAS,CAAC,CAAC;IACjE;IAEA,MAAM3C,SAAS+C,aACXG,OAAO,CAACH,WAAW,CAACgB,MAAM,CAAC/D,MAAM,GACjCiD,WAAW,CAACJ,eAAe,CAACkB,MAAM,CAAC/D,MAAM;IAE7C,MAAMgE,0BAA0B/D,eAAegE,KAAK;IACpD,MAAMC,wBAAwBhE,aAAa+D,KAAK;IAEhD,MAAME,aAAanB,eACfgB,0BACAnC,UAAUmC,yBAAyBE,uBAAuBlE,QAAQG,KAAK;IAE3E,MAAM4B,OAAOD,4BAA4BqC,YAAYnE;IAErD,OAAO+C,aACH,MAAM1B,QAAQ+C,YAAY,CAAC;QACzB1C,MAAMqB;QACNhB;QACAyB,QAAQb;QACRc,gBAAgB;QAChBtD;QACAgD;IACF,KACA,MAAM9B,QAAQgD,MAAM,CAAC;QACnBxD,IAAIiC;QACJa,YAAYd;QACZd;QACAyB,QAAQb;QACRc,gBAAgB;QAChBtD;QACAgD;IACF;AACN,EAAC"}
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
- : getTranslation(selectedOption.label, i18n) || selectedOption.value // Use translation or fallback to value
18
- ;
16
+ return isValidReactElement(selectedOption.label) ? selectedOption.label : // Return JSX directly
17
+ getTranslation(selectedOption.label, i18n) || selectedOption.value;
19
18
  }
20
- return selectedOption // If option is a string, return it directly
21
- ;
19
+ // Use translation or fallback to value
20
+ return selectedOption;
22
21
  }
23
22
  }
24
- return cellData // Default fallback if no match found
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,CAAC,sBAAsB;mBAC3Cd,eAAeU,eAAeI,KAAK,EAAET,SAASK,eAAeG,KAAK,CAAC,uCAAuC;;YAChH;YACA,OAAOH,eAAe,4CAA4C;;QACpE;IACF;IACA,OAAOP,SAAS,qCAAqC;;AACvD,EAAC"}
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 '../exports/client/index.js';
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":"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"}
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 // Default 5 minutes in seconds
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":"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"}
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;IAYhC,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"}
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, '.*') // Match any path
17
- .replace(/\*/g, '[^/]*') // Match any part of a path segment
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 // If the URL is invalid, deny by default
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;qBACxCA,OAAO,CAAC,OAAO,SAAS,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,MAAM,yCAAyC;;IACxD;AACF,EAAC"}
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 '../exports/client/index.js';
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":";AAkBA,SAASA,cAAc,QAAyB,2BAA0B;AAC1E,SAASC,gBAAgB,EAAEC,uBAAuB,QAAQ,iBAAgB;AAC1E,OAAOC,WAAW,QAAO;AAIzB,SAASC,qBAAqB,QAAQ,6CAA4C;AAClF,SACEC,aAAa,EACbC,mBAAmB,EACnBC,cAAc,EACdC,IAAI,EACJC,SAAS,EACTC,iBAAiB,EACjBC,SAAS,EACTC,UAAU,EACVC,OAAO,EACPC,KAAK,QAEA,6BAA4B;AACnC,SAASC,2BAA2B,QAAQ,4EAA2E;AACvH,SAASC,gBAAgB,QAAQ,sDAAqD;AAEtF,OAAO,MAAMC,gBAAgB,CAC3BC,QACAC,YAEAD,OAAOE,MAAM,CACX,CAACC,KAAKC;QACJ,IAAIpB,wBAAwBoB,QAAQ;YAClC,OAAOD;QACT;QAEA,IAAI,UAAUC,SAASA,MAAMC,KAAK,EAAEC,YAAYC,QAAQ;YACtDJ,IAAIK,GAAG,CACLJ,MAAMK,IAAI,EACVvB,sBAAsB;gBACpBwB,WAAWN,MAAMC,KAAK,CAACC,UAAU,EAAEC;gBACnCN;YACF;QAEJ;QAEA,OAAOE;IACT,GACA,IAAIQ,OACL;AAEH,OAAO,MAAMC,cAAc,CAAC,EAC1BC,sBAAsB,EACtBC,YAAY,EACZC,gBAAgB,EAChBC,WAAW,EACXC,OAAO,EACPC,eAAe,EACfC,IAAI,EACJC,mBAAmB,EACnBC,gBAAgB,EAChBC,gBAAgB,EAChBC,YAAY,EACZC,OAAO,EACPC,IAAI,EACJC,MAAM,OAAO,EACbC,kBAAkB,EAClBC,OAAO,EACPC,KAAK,EACLC,cAAc,EACdC,GAAG,EACHC,eAAe,EACfC,UAAU,EACVC,QAAQ,EAyBT;IAIC,4GAA4G;IAE5G,IAAIC;IACJ,IAAIC,eAA8BvB,wBAAwBb,UAAU,EAAE;IACtE,IAAIqC,eAAwBtB,kBAAkBf,UAAU,EAAE;IAC1D,MAAMsC,gBAAgBtB;IAEtB,MAAMuB,eAAeC,QAAQzB,kBAAkBV,OAAOoC,WAAWZ,OAAOY;IAExE,IAAIH,eAAe;QACjBF,eAAe,EAAE;QACjBC,eAAe,EAAE;QAEjB,KAAK,MAAMK,cAAc1B,YAAa;YACpC,MAAMH,yBAAyBC,aAAaE,WAAW,CAAC2B,IAAI,CAC1D,CAACC,OAASA,KAAKC,IAAI,KAAKH;YAG1B,KAAK,MAAMtC,SAASP,4BAA4B;gBAC9CwB;gBACArB,QAAQa,uBAAuBb,MAAM;YACvC,GAAI;gBACF,IAAIjB,iBAAiBqB,QAAQ;oBAC3B,IAAIgC,aAAaU,IAAI,CAAC,CAACF,OAAS7D,iBAAiB6D,SAASA,KAAKnC,IAAI,KAAKL,MAAMK,IAAI,GAAG;wBACnF;oBACF;gBACF;gBAEA2B,aAAaW,IAAI,CAAC3C;YACpB;YAEA,MAAM4C,yBAAyBpB,QAAQZ,WAAW,CAAC0B,WAAW,CAACO,MAAM;YAErE,KAAK,MAAM7C,SAASP,4BAAmC;gBACrDwB;gBACArB,QAAQgD,uBAAuBhD,MAAM;YACvC,GAAI;gBACF,IAAIjB,iBAAiBqB,QAAQ;oBAC3B,IAAIiC,aAAaS,IAAI,CAAC,CAACF,OAAS7D,iBAAiB6D,SAASA,KAAKnC,IAAI,KAAKL,MAAMK,IAAI,GAAG;wBACnF;oBACF;gBACF;gBAEA4B,aAAaU,IAAI,CAAC3C;YACpB;QACF;IACF;IAEA,MAAM8C,aAaF;QACFd;QACAnB;QACAG;QACAC;QACAI;QACA,mBAAmB;QACnBP;QACAU;QACAG;QACAM;QACAJ;QACAC;IACF;IAEA,IAAII,eAAe;QACjBH,cAAcrC,iBAAiB;YAC7B,GAAGoD,UAAU;YACbC,gBAAgBC;YAChBC,UAAU;YACVC,MAAMnC,MAAMmC,QAAQ,EAAE;QACxB;IACF,OAAO;QACLnB,cAAcrC,iBAAiB;YAC7B,GAAGoD,UAAU;YACbC,gBAAgBtC,uBAAuBgC,IAAI;YAC3CQ,UAAU;YACVC,MAAMnC,MAAMmC,QAAQ,EAAE;QACxB;IACF;IAEA,MAAMC,eAAe;WAAIpB;KAAY;IAErC,IAAIL,gBAAgB;QAClByB,aAAaC,OAAO,CAAC;YACnBC,UAAU;YACVC,QAAQ;YACRtD,OAAO;gBACLC,OAAO;oBACLsD,UAAU;gBACZ;gBACAC,QAAQ;YACV;YACAC,SAASpC,KAAKqC,CAAC,CAAC;YAChBC,eAAe,AAAC5C,CAAAA,MAAMmC,QAAQ,EAAE,AAAD,EAAGU,GAAG,CAAC,CAACC,KAAKC,kBAC1C,KAAC5E;oBAAa6E,MAAK;8BAChBrF,eACCkC,cACIY,QAAQZ,WAAW,CAACiD,IAAIG,UAAU,CAAC,CAACnB,MAAM,CAACoB,MAAM,CAACC,QAAQ,GAC1DzD,uBAAuBwD,MAAM,CAACC,QAAQ,EAC1C7C;mBALOyC;QASf;IACF;IAEA,IAAI9C,qBAAqB;QACvBmC,aAAaC,OAAO,CAAC;YACnBC,UAAU;YACVC,QAAQ;YACRtD,OAAO;gBACLC,OAAO;oBACLsD,UAAU;gBACZ;gBACAC,QAAQ;YACV;YACAC,uBAAS,KAACtE;YACVwE,eAAe,AAAC5C,CAAAA,MAAMmC,QAAQ,EAAE,AAAD,EAAGU,GAAG,CAAC,CAACO,GAAGL,kBACxC,KAACzE;oBAAkB+E,SAASrD,MAAMmC,IAAI,CAACY,EAAE;mBAAzBA;QAEpB;IACF;IAEA,IAAI3B,cAAc;QAChB,OAAO;YACLJ;YACA,kEAAkE;YAClEvC,qBACE,KAAC6E;gBACCC,WAAW;oBAAC;oBAAcnD,iBAAiB6B,aAAa,CAAC,oBAAoB,CAAC;iBAAC,CAC5EuB,MAAM,CAACnC,SACPoC,IAAI,CAAC;0BAGR,cAAA,MAACpF;oBAAkB8D,MAAMnC,MAAMmC,QAAQ,EAAE;oBAAEuB,WAAW1D,MAAM0D,aAAa;;sCACvE,KAAC1F;4BACC4B,kBAAkBF;4BAClBS,kBAAkBA;4BAClBC,cAAcA;4BACdC,SAASA;;sCAEX,KAAC5B;4BAAMkF,YAAY9C;4BAAiBf,SAASsC;4BAAcpC,MAAMA,MAAMmC,QAAQ,EAAE;;sCACjF,KAAClE;4BACC2B,kBAAkBF;4BAClBM,MAAMA;4BACNI,cAAcA;;;;eAbbG;QAkBX;IACF;IAEA,IAAI,CAACC,oBAAoB;QACvB,OAAO;YACLQ;YACA,kEAAkE;YAClEvC,qBACE,KAAC6E;gBAAIC,WAAU;0BACb,cAAA,KAAC9E;oBAAMkF,YAAY9C;oBAAiBf,SAASsC;oBAAcpC,MAAMA,MAAMmC,QAAQ,EAAE;;eADlD5B;QAIrC;IACF;IAEA6B,aAAaC,OAAO,CAAC;QACnBC,UAAU;QACVC,QAAQ;QACRtD,OAAO;YACLC,OAAO;gBACLsD,UAAU;YACZ;YACAC,QAAQ;QACV;QACAC,uBAAS,KAACnE;QACVqE,eAAe,AAAC5C,CAAAA,MAAMmC,QAAQ,EAAE,AAAD,EAAGU,GAAG,CAAC,CAACO,GAAGL,kBAAM,KAACvE,aAAauE;IAChE;IAEA,OAAO;QACL/B;QACA,kEAAkE;QAClEvC,qBACE,KAAC6E;YAAIC,WAAU;sBACb,cAAA,KAACrF;gBACCyF,YAAY9C;gBACZU,YAAY7B;gBACZI,SAASsC;gBACTpC,MAAMA,MAAMmC,QAAQ,EAAE;;WALO5B;IASrC;AACF,EAAC"}
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
- export const schedulePublishHandler = async ({ type, date, deleteID, doc, global, locale, req, timezone })=>{
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;AAY5F,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"}
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;QAC1D,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"}
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"}
@@ -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 // Default 5 minutes in seconds
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) // eslint-disable-line no-console
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 // 10 seconds
292
- ;
291
+ const updateLastEdited = isLockingEnabled && timeSinceLastUpdate >= 10000;
292
+ // 10 seconds
293
293
  if (updateLastEdited) {
294
294
  setEditSessionStartTime(currentTime);
295
295
  }