@payloadcms/ui 4.0.0-internal.f15737c → 4.0.0-internal.f2a04f7

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 (330) hide show
  1. package/dist/css/preflight.css +21 -2
  2. package/dist/elements/AppHeader/index.css +1 -1
  3. package/dist/elements/AppHeader/index.d.ts.map +1 -1
  4. package/dist/elements/AppHeader/index.js +5 -1
  5. package/dist/elements/AppHeader/index.js.map +1 -1
  6. package/dist/elements/Autosave/index.d.ts.map +1 -1
  7. package/dist/elements/Autosave/index.js +10 -3
  8. package/dist/elements/Autosave/index.js.map +1 -1
  9. package/dist/elements/Button/index.css +24 -0
  10. package/dist/elements/Button/types.d.ts +1 -1
  11. package/dist/elements/Button/types.d.ts.map +1 -1
  12. package/dist/elements/Button/types.js.map +1 -1
  13. package/dist/elements/CloseModalOnRouteChange/index.d.ts.map +1 -1
  14. package/dist/elements/CloseModalOnRouteChange/index.js +27 -19
  15. package/dist/elements/CloseModalOnRouteChange/index.js.map +1 -1
  16. package/dist/elements/CodeEditor/CodeEditor.d.ts.map +1 -1
  17. package/dist/elements/CodeEditor/CodeEditor.js +5 -0
  18. package/dist/elements/CodeEditor/CodeEditor.js.map +1 -1
  19. package/dist/elements/DatePicker/DatePicker.js +6 -2
  20. package/dist/elements/DatePicker/DatePicker.js.map +1 -1
  21. package/dist/elements/DatePicker/index.css +35 -25
  22. package/dist/elements/DocumentControls/index.css +13 -10
  23. package/dist/elements/DocumentControls/index.d.ts +4 -2
  24. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  25. package/dist/elements/DocumentControls/index.js.map +1 -1
  26. package/dist/elements/DocumentDrawer/types.d.ts +1 -5
  27. package/dist/elements/DocumentDrawer/types.d.ts.map +1 -1
  28. package/dist/elements/DocumentDrawer/types.js.map +1 -1
  29. package/dist/elements/DocumentFields/index.css +7 -7
  30. package/dist/elements/DocumentFields/index.d.ts.map +1 -1
  31. package/dist/elements/DocumentFields/index.js +1 -2
  32. package/dist/elements/DocumentFields/index.js.map +1 -1
  33. package/dist/elements/DocumentHeader/Tabs/tabs/index.js.map +1 -1
  34. package/dist/elements/Drawer/types.d.ts +2 -2
  35. package/dist/elements/Drawer/types.d.ts.map +1 -1
  36. package/dist/elements/Drawer/types.js.map +1 -1
  37. package/dist/elements/EditUpload/library.css +6 -13
  38. package/dist/elements/FieldSelect/reduceFieldOptions.js.map +1 -1
  39. package/dist/elements/FileManager/index.d.ts.map +1 -1
  40. package/dist/elements/FileManager/index.js +6 -1
  41. package/dist/elements/FileManager/index.js.map +1 -1
  42. package/dist/elements/Hierarchy/ActionsMenu/index.css +18 -0
  43. package/dist/elements/Hierarchy/ActionsMenu/index.d.ts +35 -0
  44. package/dist/elements/Hierarchy/ActionsMenu/index.d.ts.map +1 -0
  45. package/dist/elements/Hierarchy/ActionsMenu/index.js +99 -0
  46. package/dist/elements/Hierarchy/ActionsMenu/index.js.map +1 -0
  47. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.js +18 -16
  48. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.js.map +1 -1
  49. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts +2 -0
  50. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts.map +1 -1
  51. package/dist/elements/Hierarchy/ColumnBrowser/types.js.map +1 -1
  52. package/dist/elements/Hierarchy/DocHeaderButton/index.css +12 -0
  53. package/dist/elements/Hierarchy/DocHeaderButton/index.d.ts.map +1 -1
  54. package/dist/elements/Hierarchy/DocHeaderButton/index.js +61 -14
  55. package/dist/elements/Hierarchy/DocHeaderButton/index.js.map +1 -1
  56. package/dist/elements/Hierarchy/Modal/Footer/index.css +33 -0
  57. package/dist/elements/Hierarchy/Modal/Footer/index.d.ts +21 -0
  58. package/dist/elements/Hierarchy/Modal/Footer/index.d.ts.map +1 -0
  59. package/dist/elements/Hierarchy/Modal/Footer/index.js +122 -0
  60. package/dist/elements/Hierarchy/Modal/Footer/index.js.map +1 -0
  61. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.d.ts +8 -3
  62. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.d.ts.map +1 -1
  63. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.js +38 -12
  64. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.js.map +1 -1
  65. package/dist/elements/Hierarchy/Modal/index.css +0 -56
  66. package/dist/elements/Hierarchy/Modal/index.d.ts +5 -3
  67. package/dist/elements/Hierarchy/Modal/index.d.ts.map +1 -1
  68. package/dist/elements/Hierarchy/Modal/index.js +64 -65
  69. package/dist/elements/Hierarchy/Modal/index.js.map +1 -1
  70. package/dist/elements/Hierarchy/Modal/types.d.ts +2 -0
  71. package/dist/elements/Hierarchy/Modal/types.d.ts.map +1 -1
  72. package/dist/elements/Hierarchy/Modal/types.js.map +1 -1
  73. package/dist/elements/Hierarchy/MoveMany/index.d.ts +1 -3
  74. package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -1
  75. package/dist/elements/Hierarchy/MoveMany/index.js +62 -84
  76. package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -1
  77. package/dist/elements/ListControls/types.d.ts +0 -10
  78. package/dist/elements/ListControls/types.d.ts.map +1 -1
  79. package/dist/elements/ListControls/types.js.map +1 -1
  80. package/dist/elements/ListDrawer/DrawerContent.d.ts.map +1 -1
  81. package/dist/elements/ListDrawer/DrawerContent.js +1 -2
  82. package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
  83. package/dist/elements/ListDrawer/Provider.d.ts +0 -6
  84. package/dist/elements/ListDrawer/Provider.d.ts.map +1 -1
  85. package/dist/elements/ListDrawer/Provider.js.map +1 -1
  86. package/dist/elements/ListDrawer/index.d.ts.map +1 -1
  87. package/dist/elements/ListDrawer/index.js +1 -1
  88. package/dist/elements/ListDrawer/index.js.map +1 -1
  89. package/dist/elements/ListDrawer/types.d.ts +1 -0
  90. package/dist/elements/ListDrawer/types.d.ts.map +1 -1
  91. package/dist/elements/ListDrawer/types.js.map +1 -1
  92. package/dist/elements/ListHeader/DrawerRelationshipSelect/index.d.ts.map +1 -1
  93. package/dist/elements/ListHeader/DrawerRelationshipSelect/index.js +24 -20
  94. package/dist/elements/ListHeader/DrawerRelationshipSelect/index.js.map +1 -1
  95. package/dist/elements/LivePreview/Window/index.css +7 -1
  96. package/dist/elements/Nav/NavWrapper/index.d.ts.map +1 -1
  97. package/dist/elements/Nav/NavWrapper/index.js +19 -14
  98. package/dist/elements/Nav/NavWrapper/index.js.map +1 -1
  99. package/dist/elements/PublishButton/index.d.ts.map +1 -1
  100. package/dist/elements/PublishButton/index.js +71 -8
  101. package/dist/elements/PublishButton/index.js.map +1 -1
  102. package/dist/elements/PublishButton/validateAllLocales.d.ts +11 -0
  103. package/dist/elements/PublishButton/validateAllLocales.d.ts.map +1 -0
  104. package/dist/elements/PublishButton/validateAllLocales.js +263 -0
  105. package/dist/elements/PublishButton/validateAllLocales.js.map +1 -0
  106. package/dist/elements/RelationshipTable/AddNewButton.d.ts.map +1 -1
  107. package/dist/elements/RelationshipTable/AddNewButton.js +3 -0
  108. package/dist/elements/RelationshipTable/AddNewButton.js.map +1 -1
  109. package/dist/elements/SaveDraftButton/index.d.ts.map +1 -1
  110. package/dist/elements/SaveDraftButton/index.js +15 -2
  111. package/dist/elements/SaveDraftButton/index.js.map +1 -1
  112. package/dist/elements/SchedulePublishButton/index.js.map +1 -1
  113. package/dist/elements/SegmentedControl/index.css +50 -7
  114. package/dist/elements/Table/DefaultCell/fields/File/index.d.ts.map +1 -1
  115. package/dist/elements/Table/DefaultCell/fields/File/index.js.map +1 -1
  116. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.css +0 -9
  117. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.d.ts.map +1 -1
  118. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js +63 -40
  119. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js.map +1 -1
  120. package/dist/elements/Table/DefaultCell/index.d.ts.map +1 -1
  121. package/dist/elements/Table/DefaultCell/index.js +6 -1
  122. package/dist/elements/Table/DefaultCell/index.js.map +1 -1
  123. package/dist/elements/Table/index.js.map +1 -1
  124. package/dist/elements/Tabs/index.css +4 -3
  125. package/dist/elements/Upload/getEditorFileSrc.d.ts +11 -0
  126. package/dist/elements/Upload/getEditorFileSrc.d.ts.map +1 -0
  127. package/dist/elements/Upload/getEditorFileSrc.js +6 -0
  128. package/dist/elements/Upload/getEditorFileSrc.js.map +1 -0
  129. package/dist/elements/Upload/index.d.ts.map +1 -1
  130. package/dist/elements/Upload/index.js +6 -1
  131. package/dist/elements/Upload/index.js.map +1 -1
  132. package/dist/exports/client/{CodeEditor-UKD3EPUY.js → CodeEditor-I6PL55BF.js} +2 -2
  133. package/dist/exports/client/{DatePicker-POZJVQP4.js → DatePicker-XAKGIULG.js} +2 -2
  134. package/dist/exports/client/{chunk-2AY67NFV.js → chunk-36JJSMEB.js} +2 -2
  135. package/dist/exports/client/chunk-36JJSMEB.js.map +7 -0
  136. package/dist/exports/client/chunk-R7M6BG75.js +27 -0
  137. package/dist/exports/client/chunk-R7M6BG75.js.map +7 -0
  138. package/dist/exports/client/index.d.ts +3 -0
  139. package/dist/exports/client/index.d.ts.map +1 -1
  140. package/dist/exports/client/index.js +27 -27
  141. package/dist/exports/client/index.js.map +4 -4
  142. package/dist/exports/shared/index.js +2 -2
  143. package/dist/exports/shared/index.js.map +3 -3
  144. package/dist/fields/Group/index.css +3 -5
  145. package/dist/fields/Tabs/index.css +14 -14
  146. package/dist/fields/Upload/Input.d.ts.map +1 -1
  147. package/dist/fields/Upload/Input.js +3 -1
  148. package/dist/fields/Upload/Input.js.map +1 -1
  149. package/dist/forms/Form/fieldReducer.d.ts.map +1 -1
  150. package/dist/forms/Form/fieldReducer.js +6 -9
  151. package/dist/forms/Form/fieldReducer.js.map +1 -1
  152. package/dist/forms/Form/index.d.ts.map +1 -1
  153. package/dist/forms/Form/index.js +0 -1
  154. package/dist/forms/Form/index.js.map +1 -1
  155. package/dist/forms/Form/types.d.ts +0 -5
  156. package/dist/forms/Form/types.d.ts.map +1 -1
  157. package/dist/forms/Form/types.js.map +1 -1
  158. package/dist/forms/RenderFields/index.css +2 -2
  159. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.d.ts +2 -2
  160. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.d.ts.map +1 -1
  161. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
  162. package/dist/forms/fieldSchemasToFormState/index.d.ts +2 -2
  163. package/dist/forms/fieldSchemasToFormState/index.d.ts.map +1 -1
  164. package/dist/forms/fieldSchemasToFormState/index.js.map +1 -1
  165. package/dist/forms/fieldSchemasToFormState/iterateFields.d.ts +2 -2
  166. package/dist/forms/fieldSchemasToFormState/iterateFields.d.ts.map +1 -1
  167. package/dist/forms/fieldSchemasToFormState/iterateFields.js.map +1 -1
  168. package/dist/forms/fieldSchemasToFormState/types.d.ts +2 -2
  169. package/dist/forms/fieldSchemasToFormState/types.d.ts.map +1 -1
  170. package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
  171. package/dist/forms/useField/types.d.ts +0 -4
  172. package/dist/forms/useField/types.d.ts.map +1 -1
  173. package/dist/forms/useField/types.js.map +1 -1
  174. package/dist/icons/Arrow/index.d.ts +1 -1
  175. package/dist/icons/Arrow/index.d.ts.map +1 -1
  176. package/dist/icons/Arrow/index.js +7 -1
  177. package/dist/icons/Arrow/index.js.map +1 -1
  178. package/dist/icons/Clock/index.d.ts +6 -0
  179. package/dist/icons/Clock/index.d.ts.map +1 -0
  180. package/dist/icons/Clock/index.js +18 -0
  181. package/dist/icons/Clock/index.js.map +1 -0
  182. package/dist/icons/Pin/index.d.ts +7 -0
  183. package/dist/icons/Pin/index.d.ts.map +1 -0
  184. package/dist/icons/Pin/index.js +23 -0
  185. package/dist/icons/Pin/index.js.map +1 -0
  186. package/dist/icons/Sidebar/index.d.ts.map +1 -1
  187. package/dist/icons/Sidebar/index.js +2 -0
  188. package/dist/icons/Sidebar/index.js.map +1 -1
  189. package/dist/icons/Table/index.css +5 -1
  190. package/dist/layouts/Root/getRootLayoutData.d.ts +2 -2
  191. package/dist/layouts/Root/getRootLayoutData.d.ts.map +1 -1
  192. package/dist/layouts/Root/getRootLayoutData.js +8 -4
  193. package/dist/layouts/Root/getRootLayoutData.js.map +1 -1
  194. package/dist/layouts/Root/index.d.ts +1 -1
  195. package/dist/layouts/Root/index.d.ts.map +1 -1
  196. package/dist/layouts/Root/index.js +5 -20
  197. package/dist/layouts/Root/index.js.map +1 -1
  198. package/dist/providers/ListQuery/types.d.ts +0 -4
  199. package/dist/providers/ListQuery/types.d.ts.map +1 -1
  200. package/dist/providers/ListQuery/types.js.map +1 -1
  201. package/dist/providers/RouteCache/index.d.ts.map +1 -1
  202. package/dist/providers/RouteCache/index.js +37 -25
  203. package/dist/providers/RouteCache/index.js.map +1 -1
  204. package/dist/providers/TableColumns/RenderDefaultCell/index.d.ts.map +1 -1
  205. package/dist/providers/TableColumns/RenderDefaultCell/index.js +1 -2
  206. package/dist/providers/TableColumns/RenderDefaultCell/index.js.map +1 -1
  207. package/dist/providers/TableColumns/types.d.ts +1 -34
  208. package/dist/providers/TableColumns/types.d.ts.map +1 -1
  209. package/dist/providers/TableColumns/types.js.map +1 -1
  210. package/dist/styles.css +22 -3
  211. package/dist/templates/Default/index.css +0 -1
  212. package/dist/utilities/appendCacheTag.d.ts +1 -0
  213. package/dist/utilities/appendCacheTag.d.ts.map +1 -1
  214. package/dist/utilities/appendCacheTag.js +2 -1
  215. package/dist/utilities/appendCacheTag.js.map +1 -1
  216. package/dist/utilities/buildClientFieldSchemaMap/traverseFields.d.ts.map +1 -1
  217. package/dist/utilities/buildClientFieldSchemaMap/traverseFields.js +32 -6
  218. package/dist/utilities/buildClientFieldSchemaMap/traverseFields.js.map +1 -1
  219. package/dist/utilities/getDisplayedFieldValue.d.ts +8 -2
  220. package/dist/utilities/getDisplayedFieldValue.d.ts.map +1 -1
  221. package/dist/utilities/getDisplayedFieldValue.js +11 -1
  222. package/dist/utilities/getDisplayedFieldValue.js.map +1 -1
  223. package/dist/utilities/getDocumentThumbnail.d.ts +6 -0
  224. package/dist/utilities/getDocumentThumbnail.d.ts.map +1 -0
  225. package/dist/utilities/getDocumentThumbnail.js +27 -0
  226. package/dist/utilities/getDocumentThumbnail.js.map +1 -0
  227. package/dist/utilities/getDocumentThumbnailPopulate.d.ts +7 -0
  228. package/dist/utilities/getDocumentThumbnailPopulate.d.ts.map +1 -0
  229. package/dist/utilities/getDocumentThumbnailPopulate.js +23 -0
  230. package/dist/utilities/getDocumentThumbnailPopulate.js.map +1 -0
  231. package/dist/utilities/getDocumentThumbnailSelect.d.ts +7 -0
  232. package/dist/utilities/getDocumentThumbnailSelect.d.ts.map +1 -0
  233. package/dist/utilities/getDocumentThumbnailSelect.js +24 -0
  234. package/dist/utilities/getDocumentThumbnailSelect.js.map +1 -0
  235. package/dist/utilities/getHasScheduledPublish.js.map +1 -1
  236. package/dist/utilities/handleLivePreview.js.map +1 -1
  237. package/dist/utilities/hasSavePermission.js.map +1 -1
  238. package/dist/utilities/schedulePublishHandler.js.map +1 -1
  239. package/dist/utilities/serverFunctionRegistry.d.ts.map +1 -1
  240. package/dist/utilities/serverFunctionRegistry.js +2 -0
  241. package/dist/utilities/serverFunctionRegistry.js.map +1 -1
  242. package/dist/utilities/traverseForLocalizedFields.d.ts +7 -2
  243. package/dist/utilities/traverseForLocalizedFields.d.ts.map +1 -1
  244. package/dist/utilities/traverseForLocalizedFields.js +22 -8
  245. package/dist/utilities/traverseForLocalizedFields.js.map +1 -1
  246. package/dist/views/CreateFirstUser/index.d.ts.map +1 -1
  247. package/dist/views/CreateFirstUser/index.js +4 -2
  248. package/dist/views/CreateFirstUser/index.js.map +1 -1
  249. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.d.ts.map +1 -1
  250. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js +30 -21
  251. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js.map +1 -1
  252. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.d.ts +1 -1
  253. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.d.ts.map +1 -1
  254. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js +16 -4
  255. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js.map +1 -1
  256. package/dist/views/Edit/index.css +26 -0
  257. package/dist/views/Edit/index.d.ts.map +1 -1
  258. package/dist/views/Edit/index.js +1 -1
  259. package/dist/views/Edit/index.js.map +1 -1
  260. package/dist/views/HierarchyList/DocumentListSelection/index.d.ts.map +1 -1
  261. package/dist/views/HierarchyList/DocumentListSelection/index.js +0 -1
  262. package/dist/views/HierarchyList/DocumentListSelection/index.js.map +1 -1
  263. package/dist/views/List/DocumentGrid/index.d.ts.map +1 -1
  264. package/dist/views/List/DocumentGrid/index.js +2 -37
  265. package/dist/views/List/DocumentGrid/index.js.map +1 -1
  266. package/dist/views/List/enrichDocsWithVersionStatus.d.ts.map +1 -1
  267. package/dist/views/List/enrichDocsWithVersionStatus.js +3 -1
  268. package/dist/views/List/enrichDocsWithVersionStatus.js.map +1 -1
  269. package/dist/views/List/index.d.ts.map +1 -1
  270. package/dist/views/List/index.js +11 -24
  271. package/dist/views/List/index.js.map +1 -1
  272. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js +2 -12
  273. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js.map +1 -1
  274. package/dist/views/Version/RenderFieldsToDiff/fields/Checkbox/index.js +2 -2
  275. package/dist/views/Version/RenderFieldsToDiff/fields/Checkbox/index.js.map +1 -1
  276. package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js +2 -2
  277. package/dist/views/Version/RenderFieldsToDiff/fields/Collapsible/index.js.map +1 -1
  278. package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js +2 -2
  279. package/dist/views/Version/RenderFieldsToDiff/fields/Date/index.js.map +1 -1
  280. package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js +2 -2
  281. package/dist/views/Version/RenderFieldsToDiff/fields/Group/index.js.map +1 -1
  282. package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js +2 -2
  283. package/dist/views/Version/RenderFieldsToDiff/fields/Iterable/index.js.map +1 -1
  284. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js +2 -2
  285. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js.map +1 -1
  286. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.d.ts.map +1 -1
  287. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js +2 -2
  288. package/dist/views/Version/RenderFieldsToDiff/fields/Select/index.js.map +1 -1
  289. package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js +8 -8
  290. package/dist/views/Version/RenderFieldsToDiff/fields/Tabs/index.js.map +1 -1
  291. package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js +2 -2
  292. package/dist/views/Version/RenderFieldsToDiff/fields/Text/index.js.map +1 -1
  293. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.d.ts.map +1 -1
  294. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js +2 -2
  295. package/dist/views/Version/RenderFieldsToDiff/fields/Upload/index.js.map +1 -1
  296. package/dist/widgets/RecentlyViewed/CollectionsField/index.d.ts.map +1 -1
  297. package/dist/widgets/RecentlyViewed/CollectionsField/index.js +31 -5
  298. package/dist/widgets/RecentlyViewed/CollectionsField/index.js.map +1 -1
  299. package/dist/widgets/RecentlyViewed/PinDocumentPicker/index.css +41 -0
  300. package/dist/widgets/RecentlyViewed/PinDocumentPicker/index.d.ts +19 -0
  301. package/dist/widgets/RecentlyViewed/PinDocumentPicker/index.d.ts.map +1 -0
  302. package/dist/widgets/RecentlyViewed/PinDocumentPicker/index.js +121 -0
  303. package/dist/widgets/RecentlyViewed/PinDocumentPicker/index.js.map +1 -0
  304. package/dist/widgets/RecentlyViewed/getDocuments.d.ts +20 -0
  305. package/dist/widgets/RecentlyViewed/getDocuments.d.ts.map +1 -0
  306. package/dist/widgets/RecentlyViewed/getDocuments.js +254 -0
  307. package/dist/widgets/RecentlyViewed/getDocuments.js.map +1 -0
  308. package/dist/widgets/RecentlyViewed/index.client.d.ts +41 -0
  309. package/dist/widgets/RecentlyViewed/index.client.d.ts.map +1 -0
  310. package/dist/widgets/RecentlyViewed/index.client.js +409 -0
  311. package/dist/widgets/RecentlyViewed/index.client.js.map +1 -0
  312. package/dist/widgets/RecentlyViewed/index.css +352 -0
  313. package/dist/widgets/RecentlyViewed/index.d.ts +1 -1
  314. package/dist/widgets/RecentlyViewed/index.d.ts.map +1 -1
  315. package/dist/widgets/RecentlyViewed/index.js +33 -134
  316. package/dist/widgets/RecentlyViewed/index.js.map +1 -1
  317. package/dist/widgets/RecentlyViewed/pinnedPreferences.d.ts +18 -0
  318. package/dist/widgets/RecentlyViewed/pinnedPreferences.d.ts.map +1 -0
  319. package/dist/widgets/RecentlyViewed/pinnedPreferences.js +81 -0
  320. package/dist/widgets/RecentlyViewed/pinnedPreferences.js.map +1 -0
  321. package/dist/widgets/RecentlyViewed/recents.d.ts +8 -0
  322. package/dist/widgets/RecentlyViewed/recents.d.ts.map +1 -0
  323. package/dist/widgets/RecentlyViewed/recents.js +19 -0
  324. package/dist/widgets/RecentlyViewed/recents.js.map +1 -0
  325. package/package.json +16 -16
  326. package/dist/exports/client/chunk-2AY67NFV.js.map +0 -7
  327. package/dist/exports/client/chunk-6XCSN54Q.js +0 -27
  328. package/dist/exports/client/chunk-6XCSN54Q.js.map +0 -7
  329. /package/dist/exports/client/{CodeEditor-UKD3EPUY.js.map → CodeEditor-I6PL55BF.js.map} +0 -0
  330. /package/dist/exports/client/{DatePicker-POZJVQP4.js.map → DatePicker-XAKGIULG.js.map} +0 -0
@@ -0,0 +1,352 @@
1
+ @layer payload-default {
2
+ .recents-widget,
3
+ .recents-widget__pin-picker {
4
+ --recents-text-secondary: color-mix(
5
+ in srgb,
6
+ var(--color-text-secondary) 75%,
7
+ var(--color-text)
8
+ );
9
+ }
10
+
11
+ .card.widget-card.recents-widget {
12
+ container-type: inline-size;
13
+ gap: var(--spacer-3);
14
+ height: auto;
15
+ max-height: none;
16
+ padding: 0;
17
+ border: 0;
18
+ border-radius: 0;
19
+ background: var(--color-bg);
20
+ }
21
+
22
+ .recents-widget .widget-card__header {
23
+ position: absolute;
24
+ width: calc(var(--spacer-1) / 4);
25
+ height: calc(var(--spacer-1) / 4);
26
+ overflow: hidden;
27
+ clip-path: inset(50%);
28
+ white-space: nowrap;
29
+ }
30
+
31
+ .recents-widget__toolbar,
32
+ .recents-widget__tabs {
33
+ display: flex;
34
+ align-items: center;
35
+ }
36
+
37
+ .recents-widget__toolbar {
38
+ justify-content: space-between;
39
+ gap: var(--spacer-2);
40
+ flex-wrap: wrap;
41
+ align-content: flex-start;
42
+ /* Reserve the second toolbar row when pagination wraps on narrow widgets. */
43
+ min-block-size: calc(var(--spacer-4) * 2 + var(--spacer-2));
44
+ }
45
+
46
+ .recents-widget__tabs {
47
+ gap: var(--spacer-1);
48
+ flex-wrap: wrap;
49
+ }
50
+
51
+ .recents-widget__tab,
52
+ .recents-widget__pin {
53
+ border: 0;
54
+ background: transparent;
55
+ color: var(--recents-text-secondary);
56
+ cursor: pointer;
57
+ }
58
+
59
+ .recents-widget__tab {
60
+ min-height: var(--spacer-4);
61
+ padding-inline: var(--spacer-2);
62
+ border-radius: var(--radius-medium);
63
+ font-family: var(--text-body-medium-font-family);
64
+ font-size: var(--text-body-medium-font-size);
65
+ line-height: var(--text-body-medium-line-height);
66
+ white-space: nowrap;
67
+ }
68
+
69
+ .recents-widget__tab[aria-pressed='true'] {
70
+ background: var(--color-bg-secondary);
71
+ color: var(--color-text);
72
+ font-weight: var(--text-body-medium-strong-font-weight);
73
+ }
74
+
75
+ .card-grid.recents-widget__items {
76
+ display: grid;
77
+ gap: var(--spacer-3);
78
+ min-height: 0;
79
+ padding: 0;
80
+ margin: 0;
81
+ list-style: none;
82
+ }
83
+
84
+ .card-grid.recents-widget__items--grid {
85
+ grid-column: 1 / -1;
86
+ grid-template-columns: subgrid;
87
+ }
88
+
89
+ .recents-widget__viewport {
90
+ --recents-columns: 2;
91
+ --recents-rows: 2;
92
+ --recents-card-width: calc(
93
+ (100cqw - var(--spacer-3) * (var(--recents-columns) - 1)) / var(--recents-columns)
94
+ );
95
+
96
+ /* Match the thumbnail, two text lines, padding, metadata gap, and card border. */
97
+ --recents-row-height: max(
98
+ calc(var(--spacer-6) * 5),
99
+ calc(
100
+ var(--recents-thumbnail-height) +
101
+ (var(--text-body-medium-line-height) + var(--spacer-2-5)) * 2 + var(--spacer-1) +
102
+ var(--stroke-width-small) * 2
103
+ )
104
+ );
105
+ --recents-thumbnail-height: calc(var(--spacer-6) * 3.5 - var(--stroke-width-small) * 2);
106
+ --recents-content-height: calc(
107
+ var(--recents-row-height) * var(--recents-rows) + var(--spacer-3) * (var(--recents-rows) - 1)
108
+ );
109
+ display: grid;
110
+ grid-template-columns: repeat(2, minmax(0, 1fr));
111
+ gap: var(--spacer-3);
112
+ min-block-size: var(--recents-content-height);
113
+ position: relative;
114
+ }
115
+
116
+ .recents-widget__content {
117
+ display: grid;
118
+ grid-column: 1 / -1;
119
+ grid-template-columns: subgrid;
120
+ align-content: start;
121
+ }
122
+
123
+ .recents-widget__empty {
124
+ grid-column: 1 / -1;
125
+ }
126
+
127
+ .recents-widget .document-card {
128
+ min-block-size: var(--recents-row-height);
129
+ }
130
+
131
+ .recents-widget .document-card__thumbnail {
132
+ height: var(--recents-thumbnail-height);
133
+ min-height: 0;
134
+ aspect-ratio: auto;
135
+ }
136
+
137
+ .recents-widget__error {
138
+ position: absolute;
139
+ inset: 0;
140
+ display: flex;
141
+ flex-direction: column;
142
+ align-items: center;
143
+ justify-content: center;
144
+ gap: var(--spacer-3);
145
+ padding: var(--spacer-3);
146
+ text-align: center;
147
+ }
148
+
149
+ .recents-widget__save-error {
150
+ position: absolute;
151
+ inset-block-start: var(--spacer-3);
152
+ inset-inline: var(--spacer-3);
153
+ padding: var(--spacer-2);
154
+ border-radius: var(--radius-medium);
155
+ background: var(--color-bg);
156
+ }
157
+
158
+ .recents-widget__loading {
159
+ position: absolute;
160
+ inset: 0;
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: center;
164
+ pointer-events: none;
165
+ }
166
+
167
+ .recents-widget__loading > span {
168
+ padding: var(--spacer-2);
169
+ background: var(--color-bg);
170
+ }
171
+
172
+ .recents-widget__loading:empty {
173
+ display: none;
174
+ }
175
+
176
+ .recents-widget__item--empty {
177
+ grid-column: 1 / -1;
178
+ }
179
+
180
+ .recents-widget__status-pill {
181
+ position: absolute;
182
+ inset-block-start: var(--spacer-3);
183
+ inset-inline-start: var(--spacer-3);
184
+ padding-inline: var(--spacer-1);
185
+ border-radius: var(--radius-medium);
186
+ background: var(--color-bg-brand-secondary);
187
+ color: var(--color-text-onbrand);
188
+ font-family: var(--text-body-medium-font-family);
189
+ font-size: var(--text-body-medium-font-size);
190
+ line-height: var(--text-body-medium-line-height);
191
+ }
192
+
193
+ .recents-widget__status-pill--draft {
194
+ background: var(--color-bg-tertiary);
195
+ color: var(--color-text);
196
+ }
197
+
198
+ .recents-widget__status-pill--changed {
199
+ background: var(--color-bg-warning);
200
+ color: var(--color-text-onwarning);
201
+ }
202
+
203
+ .recents-widget__meta,
204
+ .recents-widget__empty-description {
205
+ color: var(--recents-text-secondary);
206
+ font-family: var(--text-body-medium-font-family);
207
+ font-size: var(--text-body-medium-font-size);
208
+ line-height: var(--text-body-medium-line-height);
209
+ }
210
+
211
+ .recents-widget__meta {
212
+ overflow: hidden;
213
+ text-overflow: ellipsis;
214
+ white-space: nowrap;
215
+ }
216
+
217
+ .recents-widget__pin {
218
+ position: absolute;
219
+ inset-block-start: var(--spacer-2-5);
220
+ inset-inline-end: var(--spacer-2-5);
221
+ display: inline-flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ width: var(--spacer-4);
225
+ height: var(--spacer-4);
226
+ padding: 0;
227
+ border-radius: var(--radius-medium);
228
+ background: var(--color-bg);
229
+ opacity: 0;
230
+ }
231
+
232
+ .recents-widget .document-card .document-card__metadata .recents-widget__pin {
233
+ position: absolute;
234
+ }
235
+
236
+ .recents-widget__item:hover .recents-widget__pin,
237
+ .recents-widget__item:focus-within .recents-widget__pin {
238
+ opacity: 1;
239
+ }
240
+
241
+ .recents-widget__pin-icon {
242
+ display: flex;
243
+ color: var(--color-icon-warning);
244
+ }
245
+
246
+ .recents-widget__pin:disabled {
247
+ cursor: progress;
248
+ }
249
+
250
+ .recents-widget__empty {
251
+ display: flex;
252
+ flex-direction: column;
253
+ align-items: center;
254
+ justify-content: center;
255
+ gap: var(--spacer-2);
256
+ min-block-size: var(--recents-content-height);
257
+ padding: var(--spacer-5) var(--spacer-3);
258
+ border: var(--stroke-width-small) dashed var(--color-border);
259
+ border-radius: var(--radius-large);
260
+ text-align: center;
261
+ }
262
+
263
+ .recents-widget__empty-icon {
264
+ width: var(--spacer-6);
265
+ height: var(--spacer-6);
266
+ border-radius: var(--radius-full);
267
+ background-color: var(--color-bg-brand-tertiary);
268
+ display: flex;
269
+ align-items: center;
270
+ justify-content: center;
271
+ color: var(--color-icon-brand);
272
+ }
273
+
274
+ .recents-widget__empty-text {
275
+ display: flex;
276
+ flex-direction: column;
277
+ gap: var(--spacer-1);
278
+ }
279
+
280
+ .recents-widget__empty-title {
281
+ color: var(--color-text);
282
+ font-family: var(--text-body-large-strong-font-family);
283
+ font-size: var(--text-body-large-strong-font-size);
284
+ font-weight: var(--text-body-large-strong-font-weight);
285
+ line-height: var(--text-body-large-strong-line-height);
286
+ }
287
+
288
+ .recents-widget__tab:focus-visible,
289
+ .recents-widget__pagination button:focus-visible,
290
+ .recents-widget__pin:focus-visible {
291
+ outline: var(--accessibility-outline);
292
+ outline-offset: var(--accessibility-outline-offset);
293
+ }
294
+
295
+ .recents-widget__pagination {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: var(--spacer-1);
299
+ font-family: var(--text-body-medium-font-family);
300
+ font-size: var(--text-body-medium-font-size);
301
+ line-height: var(--text-body-medium-line-height);
302
+ }
303
+
304
+ .recents-widget__pagination button {
305
+ display: flex;
306
+ align-items: center;
307
+ justify-content: center;
308
+ width: var(--spacer-4);
309
+ height: var(--spacer-4);
310
+ padding: 0;
311
+ border: 0;
312
+ border-radius: var(--radius-medium);
313
+ background: transparent;
314
+ color: var(--color-text);
315
+ cursor: pointer;
316
+ }
317
+
318
+ .recents-widget__pagination button:hover:not(:disabled) {
319
+ background: var(--color-bg-secondary);
320
+ }
321
+
322
+ [dir='rtl'] .recents-widget__pagination button > span {
323
+ transform: scaleX(-1);
324
+ }
325
+
326
+ .recents-widget__pagination button:disabled {
327
+ color: var(--color-text-disabled);
328
+ cursor: default;
329
+ }
330
+
331
+ @container (min-width: 400px) {
332
+ .recents-widget__toolbar {
333
+ min-block-size: var(--spacer-4);
334
+ }
335
+ }
336
+
337
+ @container (min-width: 600px) {
338
+ .recents-widget__viewport {
339
+ grid-template-columns: repeat(3, minmax(0, 1fr));
340
+ }
341
+ }
342
+
343
+ @container (min-width: 800px) {
344
+ .recents-widget__viewport {
345
+ --recents-rows: 1;
346
+ --recents-thumbnail-height: calc(
347
+ (var(--recents-card-width) - var(--stroke-width-small) * 2) * 3 / 4
348
+ );
349
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, calc(var(--spacer-6) * 4.5)), 1fr));
350
+ }
351
+ }
352
+ }
@@ -5,6 +5,6 @@ type RecentlyViewedWidgetData = {
5
5
  };
6
6
  export declare function RecentlyViewedWidget({ req, widgetData, }: WidgetServerProps<{
7
7
  data?: RecentlyViewedWidgetData;
8
- }>): Promise<React.JSX.Element>;
8
+ }>): React.JSX.Element;
9
9
  export {};
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/widgets/RecentlyViewed/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAI3E,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,KAAK,wBAAwB,GAAG;IAC9B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC/B,CAAA;AAmBD,wBAAsB,oBAAoB,CAAC,EACzC,GAAG,EACH,UAAU,GACX,EAAE,iBAAiB,CAAC;IAAE,IAAI,CAAC,EAAE,wBAAwB,CAAA;CAAE,CAAC,8BAgCxD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/widgets/RecentlyViewed/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAGhD,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,KAAK,wBAAwB,GAAG;IAC9B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC/B,CAAA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,GAAG,EACH,UAAU,GACX,EAAE,iBAAiB,CAAC;IAAE,IAAI,CAAC,EAAE,wBAAwB,CAAA;CAAE,CAAC,qBAiCxD"}
@@ -1,63 +1,9 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { getTranslation } from '@payloadcms/translations';
1
+ import { jsx as _jsx } from "react/jsx-runtime";
3
2
  import { formatAdminURL, PREFERENCE_KEYS } from 'payload/shared';
4
3
  import React from 'react';
5
- import { formatRelativeDate, getRelativeTimeFormat } from '../../utilities/formatRelativeDate.js';
6
- import { getPreferences } from '../../utilities/upsertPreferences.js';
7
- import { WidgetCard, WidgetList } from '../WidgetCard/index.js';
8
- const displayLimit = 10;
9
- export async function RecentlyViewedWidget({
10
- req,
11
- widgetData
12
- }) {
13
- const {
14
- i18n,
15
- user
16
- } = req;
17
- const title = i18n.t('dashboard:widgetRecentlyViewedTitle');
18
- const enrichedItems = user ? await getEnrichedItems({
19
- req,
20
- widgetData
21
- }) : [];
22
- const relativeTimeFormat = getRelativeTimeFormat(i18n.language);
23
- const items = enrichedItems.map(item => ({
24
- href: item.href,
25
- key: `${item.collectionSlug}:${item.id}`,
26
- main: /*#__PURE__*/_jsxs(_Fragment, {
27
- children: [item.thumbnailURL ? /*#__PURE__*/_jsx("img", {
28
- alt: "",
29
- className: "widget-card__thumbnail",
30
- src: item.thumbnailURL
31
- }) : /*#__PURE__*/_jsx("span", {
32
- className: "widget-card__type",
33
- children: item.typeLabel
34
- }), /*#__PURE__*/_jsx("span", {
35
- className: "widget-card__row-title",
36
- children: item.title
37
- })]
38
- }),
39
- meta: /*#__PURE__*/_jsx("time", {
40
- dateTime: item.viewedAt,
41
- children: formatRelativeDate({
42
- relativeTimeFormat,
43
- value: item.viewedAt
44
- })
45
- })
46
- }));
47
- return /*#__PURE__*/_jsx(WidgetCard, {
48
- className: "recently-viewed-widget",
49
- title: title,
50
- children: /*#__PURE__*/_jsx(WidgetList, {
51
- emptyMessage: i18n.t('dashboard:widgetRecentlyViewedEmpty'),
52
- items: items
53
- })
54
- });
55
- }
56
- /**
57
- * Loads the stored recently viewed identities and computes display fields from the live documents.
58
- * Documents are queried with access control, so deleted or now-forbidden docs are dropped.
59
- */
60
- async function getEnrichedItems({
4
+ // eslint-disable-next-line payload/no-imports-from-exports-dir -- Server component must reference exports dir for proper client boundary
5
+ import { RecentsAndPinnedClient } from '../../exports/client/index.js';
6
+ export function RecentlyViewedWidget({
61
7
  req,
62
8
  widgetData
63
9
  }) {
@@ -66,83 +12,36 @@ async function getEnrichedItems({
66
12
  payload,
67
13
  user
68
14
  } = req;
69
- const excludedCollections = new Set(widgetData?.excludedCollections ?? []);
70
- const preference = await getPreferences(PREFERENCE_KEYS.RECENTLY_VIEWED, payload, user.id, user.collection);
71
- const items = (preference?.value?.items ?? []).filter(item => !excludedCollections.has(item.collectionSlug) && Boolean(payload.collections[item.collectionSlug]));
72
- if (items.length === 0) {
73
- return [];
15
+ if (!user) {
16
+ return null;
74
17
  }
75
- const idsByCollection = new Map();
76
- for (const item of items) {
77
- const ids = idsByCollection.get(item.collectionSlug) ?? [];
78
- ids.push(item.id);
79
- idsByCollection.set(item.collectionSlug, ids);
80
- }
81
- const docsByKey = new Map();
82
- await Promise.all([...idsByCollection.entries()].map(async ([collectionSlug, ids]) => {
83
- try {
84
- const result = await payload.find({
85
- collection: collectionSlug,
86
- depth: 0,
87
- limit: ids.length,
88
- overrideAccess: false,
89
- pagination: false,
90
- user,
91
- where: {
92
- id: {
93
- in: ids
94
- }
95
- }
96
- });
97
- for (const doc of result.docs) {
98
- docsByKey.set(`${collectionSlug}:${doc.id}`, doc);
99
- }
100
- } catch (err) {
101
- payload.logger.error({
102
- err,
103
- msg: `RecentlyViewedWidget: failed to load collection "${collectionSlug}"`
104
- });
105
- }
106
- }));
107
- const enrichedItems = [];
108
- for (const item of items) {
109
- if (enrichedItems.length >= displayLimit) {
110
- break;
111
- }
112
- const doc = docsByKey.get(`${item.collectionSlug}:${item.id}`);
113
- if (!doc) {
114
- continue;
115
- }
116
- const collectionConfig = payload.collections[item.collectionSlug].config;
117
- const useAsTitle = collectionConfig.admin?.useAsTitle || 'id';
118
- const rawTitle = getValueByPath({
119
- object: doc,
120
- path: useAsTitle
121
- });
122
- enrichedItems.push({
123
- id: item.id,
124
- collectionSlug: item.collectionSlug,
125
- href: formatAdminURL({
126
- adminRoute: payload.config.routes.admin,
127
- path: `/collections/${item.collectionSlug}/${item.id}`
18
+ return /*#__PURE__*/_jsx(RecentsAndPinnedClient, {
19
+ excludedCollections: widgetData?.excludedCollections,
20
+ labels: {
21
+ addPin: i18n.t('general:selectLabel', {
22
+ label: i18n.t('general:documents')
128
23
  }),
129
- thumbnailURL: collectionConfig.upload && typeof doc.thumbnailURL === 'string' ? doc.thumbnailURL : undefined,
130
- title: typeof rawTitle === 'string' && rawTitle ? rawTitle : String(item.id),
131
- typeLabel: getTranslation(collectionConfig.labels.singular, i18n),
132
- viewedAt: item.viewedAt
133
- });
134
- }
135
- return enrichedItems;
136
- }
137
- function getValueByPath({
138
- object,
139
- path
140
- }) {
141
- return path.split('.').reduce((value, segment) => {
142
- if (!value || typeof value !== 'object') {
143
- return undefined;
144
- }
145
- return value[segment];
146
- }, object);
24
+ loadError: i18n.t('error:unknown'),
25
+ loading: i18n.t('general:loading'),
26
+ next: i18n.t('general:next'),
27
+ pagination: i18n.t('dashboard:widgetPagination'),
28
+ pinned: i18n.t('dashboard:widgetPinned'),
29
+ pinnedEmpty: i18n.t('dashboard:widgetPinnedEmpty'),
30
+ pinnedEmptyDescription: i18n.t('dashboard:widgetPinnedEmptyDescription'),
31
+ pinnedSaveError: i18n.t('dashboard:widgetPinnedSaveError'),
32
+ previous: i18n.t('general:previous'),
33
+ recents: i18n.t('dashboard:widgetRecentlyViewedTitle'),
34
+ recentsEmpty: i18n.t('dashboard:widgetRecentlyViewedEmpty'),
35
+ recentsEmptyDescription: i18n.t('dashboard:widgetRecentlyViewedEmptyDescription'),
36
+ removePin: i18n.t('dashboard:widgetRemovePin'),
37
+ retry: i18n.t('general:retry'),
38
+ title: i18n.t('dashboard:widgetRecentsAndPinned')
39
+ },
40
+ pinsURL: formatAdminURL({
41
+ apiRoute: payload.config.routes.api,
42
+ path: `/payload-preferences/${PREFERENCE_KEYS.PINNED_DOCUMENTS}`,
43
+ serverURL: payload.config.serverURL
44
+ })
45
+ });
147
46
  }
148
47
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getTranslation","formatAdminURL","PREFERENCE_KEYS","React","formatRelativeDate","getRelativeTimeFormat","getPreferences","WidgetCard","WidgetList","displayLimit","RecentlyViewedWidget","req","widgetData","i18n","user","title","t","enrichedItems","getEnrichedItems","relativeTimeFormat","language","items","map","item","href","key","collectionSlug","id","main","_jsxs","_Fragment","thumbnailURL","_jsx","alt","className","src","typeLabel","meta","dateTime","viewedAt","value","emptyMessage","payload","excludedCollections","Set","preference","RECENTLY_VIEWED","collection","filter","has","Boolean","collections","length","idsByCollection","Map","ids","get","push","set","docsByKey","Promise","all","entries","result","find","depth","limit","overrideAccess","pagination","where","in","doc","docs","err","logger","error","msg","collectionConfig","config","useAsTitle","admin","rawTitle","getValueByPath","object","path","adminRoute","routes","upload","undefined","String","labels","singular","split","reduce","segment"],"sources":["../../../src/widgets/RecentlyViewed/index.tsx"],"sourcesContent":["import type { RecentlyViewedPreferences, WidgetServerProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatAdminURL, PREFERENCE_KEYS } from 'payload/shared'\nimport React from 'react'\n\nimport type { WidgetListItem } from '../WidgetCard/index.js'\n\nimport { formatRelativeDate, getRelativeTimeFormat } from '../../utilities/formatRelativeDate.js'\nimport { getPreferences } from '../../utilities/upsertPreferences.js'\nimport { WidgetCard, WidgetList } from '../WidgetCard/index.js'\n\ntype RecentlyViewedWidgetData = {\n excludedCollections?: string[]\n}\n\ntype QueryDoc = {\n id: number | string\n thumbnailURL?: unknown\n} & Record<string, unknown>\n\ntype EnrichedItem = {\n collectionSlug: string\n href: string\n id: number | string\n thumbnailURL?: string\n title: string\n typeLabel: string\n viewedAt: string\n}\n\nconst displayLimit = 10\n\nexport async function RecentlyViewedWidget({\n req,\n widgetData,\n}: WidgetServerProps<{ data?: RecentlyViewedWidgetData }>) {\n const { i18n, user } = req\n const title = i18n.t('dashboard:widgetRecentlyViewedTitle')\n\n const enrichedItems = user ? await getEnrichedItems({ req, widgetData }) : []\n const relativeTimeFormat = getRelativeTimeFormat(i18n.language)\n\n const items: WidgetListItem[] = enrichedItems.map((item) => ({\n href: item.href,\n key: `${item.collectionSlug}:${item.id}`,\n main: (\n <>\n {item.thumbnailURL ? (\n <img alt=\"\" className=\"widget-card__thumbnail\" src={item.thumbnailURL} />\n ) : (\n <span className=\"widget-card__type\">{item.typeLabel}</span>\n )}\n <span className=\"widget-card__row-title\">{item.title}</span>\n </>\n ),\n meta: (\n <time dateTime={item.viewedAt}>\n {formatRelativeDate({ relativeTimeFormat, value: item.viewedAt })}\n </time>\n ),\n }))\n\n return (\n <WidgetCard className=\"recently-viewed-widget\" title={title}>\n <WidgetList emptyMessage={i18n.t('dashboard:widgetRecentlyViewedEmpty')} items={items} />\n </WidgetCard>\n )\n}\n\n/**\n * Loads the stored recently viewed identities and computes display fields from the live documents.\n * Documents are queried with access control, so deleted or now-forbidden docs are dropped.\n */\nasync function getEnrichedItems({\n req,\n widgetData,\n}: {\n req: WidgetServerProps['req']\n widgetData: RecentlyViewedWidgetData | undefined\n}): Promise<EnrichedItem[]> {\n const { i18n, payload, user } = req\n const excludedCollections = new Set(widgetData?.excludedCollections ?? [])\n\n const preference = await getPreferences<RecentlyViewedPreferences>(\n PREFERENCE_KEYS.RECENTLY_VIEWED,\n payload,\n user.id,\n user.collection,\n )\n\n const items = (preference?.value?.items ?? []).filter(\n (item) =>\n !excludedCollections.has(item.collectionSlug) &&\n Boolean(payload.collections[item.collectionSlug]),\n )\n\n if (items.length === 0) {\n return []\n }\n\n const idsByCollection = new Map<string, Array<number | string>>()\n for (const item of items) {\n const ids = idsByCollection.get(item.collectionSlug) ?? []\n ids.push(item.id)\n idsByCollection.set(item.collectionSlug, ids)\n }\n\n const docsByKey = new Map<string, QueryDoc>()\n await Promise.all(\n [...idsByCollection.entries()].map(async ([collectionSlug, ids]) => {\n try {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: ids.length,\n overrideAccess: false,\n pagination: false,\n user,\n where: { id: { in: ids } },\n })\n\n for (const doc of result.docs as QueryDoc[]) {\n docsByKey.set(`${collectionSlug}:${doc.id}`, doc)\n }\n } catch (err) {\n payload.logger.error({\n err,\n msg: `RecentlyViewedWidget: failed to load collection \"${collectionSlug}\"`,\n })\n }\n }),\n )\n\n const enrichedItems: EnrichedItem[] = []\n\n for (const item of items) {\n if (enrichedItems.length >= displayLimit) {\n break\n }\n\n const doc = docsByKey.get(`${item.collectionSlug}:${item.id}`)\n\n if (!doc) {\n continue\n }\n\n const collectionConfig = payload.collections[item.collectionSlug].config\n const useAsTitle = collectionConfig.admin?.useAsTitle || 'id'\n const rawTitle = getValueByPath({ object: doc, path: useAsTitle })\n\n enrichedItems.push({\n id: item.id,\n collectionSlug: item.collectionSlug,\n href: formatAdminURL({\n adminRoute: payload.config.routes.admin,\n path: `/collections/${item.collectionSlug}/${item.id}`,\n }),\n thumbnailURL:\n collectionConfig.upload && typeof doc.thumbnailURL === 'string'\n ? doc.thumbnailURL\n : undefined,\n title: typeof rawTitle === 'string' && rawTitle ? rawTitle : String(item.id),\n typeLabel: getTranslation(collectionConfig.labels.singular, i18n),\n viewedAt: item.viewedAt,\n })\n }\n\n return enrichedItems\n}\n\nfunction getValueByPath({ object, path }: { object: Record<string, unknown>; path: string }) {\n return path.split('.').reduce<unknown>((value, segment) => {\n if (!value || typeof value !== 'object') {\n return undefined\n }\n\n return (value as Record<string, unknown>)[segment]\n }, object)\n}\n"],"mappings":";AAEA,SAASA,cAAc,QAAQ;AAC/B,SAASC,cAAc,EAAEC,eAAe,QAAQ;AAChD,OAAOC,KAAA,MAAW;AAIlB,SAASC,kBAAkB,EAAEC,qBAAqB,QAAQ;AAC1D,SAASC,cAAc,QAAQ;AAC/B,SAASC,UAAU,EAAEC,UAAU,QAAQ;AAqBvC,MAAMC,YAAA,GAAe;AAErB,OAAO,eAAeC,qBAAqB;EACzCC,GAAG;EACHC;AAAU,CAC6C;EACvD,MAAM;IAAEC,IAAI;IAAEC;EAAI,CAAE,GAAGH,GAAA;EACvB,MAAMI,KAAA,GAAQF,IAAA,CAAKG,CAAC,CAAC;EAErB,MAAMC,aAAA,GAAgBH,IAAA,GAAO,MAAMI,gBAAA,CAAiB;IAAEP,GAAA;IAAKC;EAAW,KAAK,EAAE;EAC7E,MAAMO,kBAAA,GAAqBd,qBAAA,CAAsBQ,IAAA,CAAKO,QAAQ;EAE9D,MAAMC,KAAA,GAA0BJ,aAAA,CAAcK,GAAG,CAAEC,IAAA,KAAU;IAC3DC,IAAA,EAAMD,IAAA,CAAKC,IAAI;IACfC,GAAA,EAAK,GAAGF,IAAA,CAAKG,cAAc,IAAIH,IAAA,CAAKI,EAAE,EAAE;IACxCC,IAAA,eACEC,KAAA,CAAAC,SAAA;iBACGP,IAAA,CAAKQ,YAAY,gBAChBC,IAAA,CAAC;QAAIC,GAAA,EAAI;QAAGC,SAAA,EAAU;QAAyBC,GAAA,EAAKZ,IAAA,CAAKQ;wBAEzDC,IAAA,CAAC;QAAKE,SAAA,EAAU;kBAAqBX,IAAA,CAAKa;uBAE5CJ,IAAA,CAAC;QAAKE,SAAA,EAAU;kBAA0BX,IAAA,CAAKR;;;IAGnDsB,IAAA,eACEL,IAAA,CAAC;MAAKM,QAAA,EAAUf,IAAA,CAAKgB,QAAQ;gBAC1BnC,kBAAA,CAAmB;QAAEe,kBAAA;QAAoBqB,KAAA,EAAOjB,IAAA,CAAKgB;MAAS;;EAGrE;EAEA,oBACEP,IAAA,CAACzB,UAAA;IAAW2B,SAAA,EAAU;IAAyBnB,KAAA,EAAOA,KAAA;cACpD,aAAAiB,IAAA,CAACxB,UAAA;MAAWiC,YAAA,EAAc5B,IAAA,CAAKG,CAAC,CAAC;MAAwCK,KAAA,EAAOA;;;AAGtF;AAEA;;;;AAIA,eAAeH,iBAAiB;EAC9BP,GAAG;EACHC;AAAU,CAIX;EACC,MAAM;IAAEC,IAAI;IAAE6B,OAAO;IAAE5B;EAAI,CAAE,GAAGH,GAAA;EAChC,MAAMgC,mBAAA,GAAsB,IAAIC,GAAA,CAAIhC,UAAA,EAAY+B,mBAAA,IAAuB,EAAE;EAEzE,MAAME,UAAA,GAAa,MAAMvC,cAAA,CACvBJ,eAAA,CAAgB4C,eAAe,EAC/BJ,OAAA,EACA5B,IAAA,CAAKa,EAAE,EACPb,IAAA,CAAKiC,UAAU;EAGjB,MAAM1B,KAAA,GAAQ,CAACwB,UAAA,EAAYL,KAAA,EAAOnB,KAAA,IAAS,EAAE,EAAE2B,MAAM,CAClDzB,IAAA,IACC,CAACoB,mBAAA,CAAoBM,GAAG,CAAC1B,IAAA,CAAKG,cAAc,KAC5CwB,OAAA,CAAQR,OAAA,CAAQS,WAAW,CAAC5B,IAAA,CAAKG,cAAc,CAAC;EAGpD,IAAIL,KAAA,CAAM+B,MAAM,KAAK,GAAG;IACtB,OAAO,EAAE;EACX;EAEA,MAAMC,eAAA,GAAkB,IAAIC,GAAA;EAC5B,KAAK,MAAM/B,IAAA,IAAQF,KAAA,EAAO;IACxB,MAAMkC,GAAA,GAAMF,eAAA,CAAgBG,GAAG,CAACjC,IAAA,CAAKG,cAAc,KAAK,EAAE;IAC1D6B,GAAA,CAAIE,IAAI,CAAClC,IAAA,CAAKI,EAAE;IAChB0B,eAAA,CAAgBK,GAAG,CAACnC,IAAA,CAAKG,cAAc,EAAE6B,GAAA;EAC3C;EAEA,MAAMI,SAAA,GAAY,IAAIL,GAAA;EACtB,MAAMM,OAAA,CAAQC,GAAG,CACf,C,GAAIR,eAAA,CAAgBS,OAAO,GAAG,CAACxC,GAAG,CAAC,OAAO,CAACI,cAAA,EAAgB6B,GAAA,CAAI;IAC7D,IAAI;MACF,MAAMQ,MAAA,GAAS,MAAMrB,OAAA,CAAQsB,IAAI,CAAC;QAChCjB,UAAA,EAAYrB,cAAA;QACZuC,KAAA,EAAO;QACPC,KAAA,EAAOX,GAAA,CAAIH,MAAM;QACjBe,cAAA,EAAgB;QAChBC,UAAA,EAAY;QACZtD,IAAA;QACAuD,KAAA,EAAO;UAAE1C,EAAA,EAAI;YAAE2C,EAAA,EAAIf;UAAI;QAAE;MAC3B;MAEA,KAAK,MAAMgB,GAAA,IAAOR,MAAA,CAAOS,IAAI,EAAgB;QAC3Cb,SAAA,CAAUD,GAAG,CAAC,GAAGhC,cAAA,IAAkB6C,GAAA,CAAI5C,EAAE,EAAE,EAAE4C,GAAA;MAC/C;IACF,EAAE,OAAOE,GAAA,EAAK;MACZ/B,OAAA,CAAQgC,MAAM,CAACC,KAAK,CAAC;QACnBF,GAAA;QACAG,GAAA,EAAK,oDAAoDlD,cAAA;MAC3D;IACF;EACF;EAGF,MAAMT,aAAA,GAAgC,EAAE;EAExC,KAAK,MAAMM,IAAA,IAAQF,KAAA,EAAO;IACxB,IAAIJ,aAAA,CAAcmC,MAAM,IAAI3C,YAAA,EAAc;MACxC;IACF;IAEA,MAAM8D,GAAA,GAAMZ,SAAA,CAAUH,GAAG,CAAC,GAAGjC,IAAA,CAAKG,cAAc,IAAIH,IAAA,CAAKI,EAAE,EAAE;IAE7D,IAAI,CAAC4C,GAAA,EAAK;MACR;IACF;IAEA,MAAMM,gBAAA,GAAmBnC,OAAA,CAAQS,WAAW,CAAC5B,IAAA,CAAKG,cAAc,CAAC,CAACoD,MAAM;IACxE,MAAMC,UAAA,GAAaF,gBAAA,CAAiBG,KAAK,EAAED,UAAA,IAAc;IACzD,MAAME,QAAA,GAAWC,cAAA,CAAe;MAAEC,MAAA,EAAQZ,GAAA;MAAKa,IAAA,EAAML;IAAW;IAEhE9D,aAAA,CAAcwC,IAAI,CAAC;MACjB9B,EAAA,EAAIJ,IAAA,CAAKI,EAAE;MACXD,cAAA,EAAgBH,IAAA,CAAKG,cAAc;MACnCF,IAAA,EAAMvB,cAAA,CAAe;QACnBoF,UAAA,EAAY3C,OAAA,CAAQoC,MAAM,CAACQ,MAAM,CAACN,KAAK;QACvCI,IAAA,EAAM,gBAAgB7D,IAAA,CAAKG,cAAc,IAAIH,IAAA,CAAKI,EAAE;MACtD;MACAI,YAAA,EACE8C,gBAAA,CAAiBU,MAAM,IAAI,OAAOhB,GAAA,CAAIxC,YAAY,KAAK,WACnDwC,GAAA,CAAIxC,YAAY,GAChByD,SAAA;MACNzE,KAAA,EAAO,OAAOkE,QAAA,KAAa,YAAYA,QAAA,GAAWA,QAAA,GAAWQ,MAAA,CAAOlE,IAAA,CAAKI,EAAE;MAC3ES,SAAA,EAAWpC,cAAA,CAAe6E,gBAAA,CAAiBa,MAAM,CAACC,QAAQ,EAAE9E,IAAA;MAC5D0B,QAAA,EAAUhB,IAAA,CAAKgB;IACjB;EACF;EAEA,OAAOtB,aAAA;AACT;AAEA,SAASiE,eAAe;EAAEC,MAAM;EAAEC;AAAI,CAAqD;EACzF,OAAOA,IAAA,CAAKQ,KAAK,CAAC,KAAKC,MAAM,CAAU,CAACrD,KAAA,EAAOsD,OAAA;IAC7C,IAAI,CAACtD,KAAA,IAAS,OAAOA,KAAA,KAAU,UAAU;MACvC,OAAOgD,SAAA;IACT;IAEA,OAAOhD,KAAkC,CAACsD,OAAA,CAAQ;EACpD,GAAGX,MAAA;AACL","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["formatAdminURL","PREFERENCE_KEYS","React","RecentsAndPinnedClient","RecentlyViewedWidget","req","widgetData","i18n","payload","user","_jsx","excludedCollections","labels","addPin","t","label","loadError","loading","next","pagination","pinned","pinnedEmpty","pinnedEmptyDescription","pinnedSaveError","previous","recents","recentsEmpty","recentsEmptyDescription","removePin","retry","title","pinsURL","apiRoute","config","routes","api","path","PINNED_DOCUMENTS","serverURL"],"sources":["../../../src/widgets/RecentlyViewed/index.tsx"],"sourcesContent":["import type { WidgetServerProps } from 'payload'\n\nimport { formatAdminURL, PREFERENCE_KEYS } from 'payload/shared'\nimport React from 'react'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir -- Server component must reference exports dir for proper client boundary\nimport { RecentsAndPinnedClient } from '../../exports/client/index.js'\n\ntype RecentlyViewedWidgetData = {\n excludedCollections?: string[]\n}\n\nexport function RecentlyViewedWidget({\n req,\n widgetData,\n}: WidgetServerProps<{ data?: RecentlyViewedWidgetData }>) {\n const { i18n, payload, user } = req\n if (!user) {\n return null\n }\n return (\n <RecentsAndPinnedClient\n excludedCollections={widgetData?.excludedCollections}\n labels={{\n addPin: i18n.t('general:selectLabel', { label: i18n.t('general:documents') }),\n loadError: i18n.t('error:unknown'),\n loading: i18n.t('general:loading'),\n next: i18n.t('general:next'),\n pagination: i18n.t('dashboard:widgetPagination'),\n pinned: i18n.t('dashboard:widgetPinned'),\n pinnedEmpty: i18n.t('dashboard:widgetPinnedEmpty'),\n pinnedEmptyDescription: i18n.t('dashboard:widgetPinnedEmptyDescription'),\n pinnedSaveError: i18n.t('dashboard:widgetPinnedSaveError'),\n previous: i18n.t('general:previous'),\n recents: i18n.t('dashboard:widgetRecentlyViewedTitle'),\n recentsEmpty: i18n.t('dashboard:widgetRecentlyViewedEmpty'),\n recentsEmptyDescription: i18n.t('dashboard:widgetRecentlyViewedEmptyDescription'),\n removePin: i18n.t('dashboard:widgetRemovePin'),\n retry: i18n.t('general:retry'),\n title: i18n.t('dashboard:widgetRecentsAndPinned'),\n }}\n pinsURL={formatAdminURL({\n apiRoute: payload.config.routes.api,\n path: `/payload-preferences/${PREFERENCE_KEYS.PINNED_DOCUMENTS}`,\n serverURL: payload.config.serverURL,\n })}\n />\n )\n}\n"],"mappings":";AAEA,SAASA,cAAc,EAAEC,eAAe,QAAQ;AAChD,OAAOC,KAAA,MAAW;AAElB;AACA,SAASC,sBAAsB,QAAQ;AAMvC,OAAO,SAASC,qBAAqB;EACnCC,GAAG;EACHC;AAAU,CAC6C;EACvD,MAAM;IAAEC,IAAI;IAAEC,OAAO;IAAEC;EAAI,CAAE,GAAGJ,GAAA;EAChC,IAAI,CAACI,IAAA,EAAM;IACT,OAAO;EACT;EACA,oBACEC,IAAA,CAACP,sBAAA;IACCQ,mBAAA,EAAqBL,UAAA,EAAYK,mBAAA;IACjCC,MAAA,EAAQ;MACNC,MAAA,EAAQN,IAAA,CAAKO,CAAC,CAAC,uBAAuB;QAAEC,KAAA,EAAOR,IAAA,CAAKO,CAAC,CAAC;MAAqB;MAC3EE,SAAA,EAAWT,IAAA,CAAKO,CAAC,CAAC;MAClBG,OAAA,EAASV,IAAA,CAAKO,CAAC,CAAC;MAChBI,IAAA,EAAMX,IAAA,CAAKO,CAAC,CAAC;MACbK,UAAA,EAAYZ,IAAA,CAAKO,CAAC,CAAC;MACnBM,MAAA,EAAQb,IAAA,CAAKO,CAAC,CAAC;MACfO,WAAA,EAAad,IAAA,CAAKO,CAAC,CAAC;MACpBQ,sBAAA,EAAwBf,IAAA,CAAKO,CAAC,CAAC;MAC/BS,eAAA,EAAiBhB,IAAA,CAAKO,CAAC,CAAC;MACxBU,QAAA,EAAUjB,IAAA,CAAKO,CAAC,CAAC;MACjBW,OAAA,EAASlB,IAAA,CAAKO,CAAC,CAAC;MAChBY,YAAA,EAAcnB,IAAA,CAAKO,CAAC,CAAC;MACrBa,uBAAA,EAAyBpB,IAAA,CAAKO,CAAC,CAAC;MAChCc,SAAA,EAAWrB,IAAA,CAAKO,CAAC,CAAC;MAClBe,KAAA,EAAOtB,IAAA,CAAKO,CAAC,CAAC;MACdgB,KAAA,EAAOvB,IAAA,CAAKO,CAAC,CAAC;IAChB;IACAiB,OAAA,EAAS/B,cAAA,CAAe;MACtBgC,QAAA,EAAUxB,OAAA,CAAQyB,MAAM,CAACC,MAAM,CAACC,GAAG;MACnCC,IAAA,EAAM,wBAAwBnC,eAAA,CAAgBoC,gBAAgB,EAAE;MAChEC,SAAA,EAAW9B,OAAA,CAAQyB,MAAM,CAACK;IAC5B;;AAGN","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ import type { PinnedItem } from './recents.js';
2
+ export declare function getPinnedItems({ value }: {
3
+ value: unknown;
4
+ }): PinnedItem[];
5
+ export declare function readPinnedPreferences({ url }: {
6
+ url: string;
7
+ }): Promise<PinnedItem[]>;
8
+ /** Serialize the read/modify/write operation across same-origin admin tabs. */
9
+ export declare function updatePinnedPreferences({ document, shouldPin, url, }: {
10
+ document: PinnedItem;
11
+ shouldPin: boolean;
12
+ url: string;
13
+ }): Promise<void>;
14
+ export declare function savePinnedPreferences({ items, url, }: {
15
+ items: PinnedItem[];
16
+ url: string;
17
+ }): Promise<void>;
18
+ //# sourceMappingURL=pinnedPreferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinnedPreferences.d.ts","sourceRoot":"","sources":["../../../src/widgets/RecentlyViewed/pinnedPreferences.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAI9C,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,UAAU,EAAE,CAuB1E;AAED,wBAAsB,qBAAqB,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAS3F;AAED,+EAA+E;AAC/E,wBAAsB,uBAAuB,CAAC,EAC5C,QAAQ,EACR,SAAS,EACT,GAAG,GACJ,EAAE;IACD,QAAQ,EAAE,UAAU,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB;AAED,wBAAsB,qBAAqB,CAAC,EAC1C,KAAK,EACL,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhB"}
@@ -0,0 +1,81 @@
1
+ import { documentKey } from './recents.js';
2
+ export function getPinnedItems({
3
+ value
4
+ }) {
5
+ if (!value || typeof value !== 'object' || !('items' in value) || !Array.isArray(value.items)) {
6
+ return [];
7
+ }
8
+ const keys = new Set();
9
+ return value.items.filter(item => {
10
+ if (!item || typeof item !== 'object' || typeof item.collectionSlug !== 'string' || typeof item.id !== 'string' && typeof item.id !== 'number') {
11
+ return false;
12
+ }
13
+ const key = documentKey(item);
14
+ if (keys.has(key)) {
15
+ return false;
16
+ }
17
+ keys.add(key);
18
+ return true;
19
+ });
20
+ }
21
+ export async function readPinnedPreferences({
22
+ url
23
+ }) {
24
+ const response = await fetch(url, {
25
+ credentials: 'include'
26
+ });
27
+ if (!response.ok) {
28
+ throw new Error('Unable to read pins');
29
+ }
30
+ const preference = await response.json();
31
+ return getPinnedItems({
32
+ value: preference.value
33
+ });
34
+ }
35
+ /** Serialize the read/modify/write operation across same-origin admin tabs. */
36
+ export async function updatePinnedPreferences({
37
+ document,
38
+ shouldPin,
39
+ url
40
+ }) {
41
+ const update = async () => {
42
+ const existing = await readPinnedPreferences({
43
+ url
44
+ });
45
+ if (shouldPin && existing.some(item => documentKey(item) === documentKey(document))) {
46
+ return;
47
+ }
48
+ const remaining = existing.filter(item => documentKey(item) !== documentKey(document));
49
+ const items = shouldPin ? [document, ...remaining] : remaining;
50
+ await savePinnedPreferences({
51
+ items,
52
+ url
53
+ });
54
+ };
55
+ if (typeof navigator !== 'undefined' && navigator.locks) {
56
+ await navigator.locks.request(`payload:pinned-documents:${url}`, update);
57
+ } else {
58
+ await update();
59
+ }
60
+ }
61
+ export async function savePinnedPreferences({
62
+ items,
63
+ url
64
+ }) {
65
+ const response = await fetch(url, {
66
+ body: JSON.stringify({
67
+ value: {
68
+ items
69
+ }
70
+ }),
71
+ credentials: 'include',
72
+ headers: {
73
+ 'Content-Type': 'application/json'
74
+ },
75
+ method: 'POST'
76
+ });
77
+ if (!response.ok) {
78
+ throw new Error('Unable to save pins');
79
+ }
80
+ }
81
+ //# sourceMappingURL=pinnedPreferences.js.map