@payloadcms/ui 4.0.0-internal.532221d → 4.0.0-internal.567a487

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 (501) hide show
  1. package/dist/elements/AppHeader/index.css +5 -0
  2. package/dist/elements/AppHeader/index.d.ts.map +1 -1
  3. package/dist/elements/AppHeader/index.js +3 -0
  4. package/dist/elements/AppHeader/index.js.map +1 -1
  5. package/dist/elements/ArrayAction/index.d.ts +1 -0
  6. package/dist/elements/ArrayAction/index.d.ts.map +1 -1
  7. package/dist/elements/ArrayAction/index.js +45 -32
  8. package/dist/elements/ArrayAction/index.js.map +1 -1
  9. package/dist/elements/Autosave/index.d.ts.map +1 -1
  10. package/dist/elements/Autosave/index.js +3 -0
  11. package/dist/elements/Autosave/index.js.map +1 -1
  12. package/dist/elements/BranchSelector/NewBranchModal/index.css +46 -0
  13. package/dist/elements/BranchSelector/NewBranchModal/index.d.ts +12 -0
  14. package/dist/elements/BranchSelector/NewBranchModal/index.d.ts.map +1 -0
  15. package/dist/elements/BranchSelector/NewBranchModal/index.js +174 -0
  16. package/dist/elements/BranchSelector/NewBranchModal/index.js.map +1 -0
  17. package/dist/elements/BranchSelector/index.css +172 -0
  18. package/dist/elements/BranchSelector/index.d.ts +13 -0
  19. package/dist/elements/BranchSelector/index.d.ts.map +1 -0
  20. package/dist/elements/BranchSelector/index.js +255 -0
  21. package/dist/elements/BranchSelector/index.js.map +1 -0
  22. package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
  23. package/dist/elements/BulkUpload/FormsManager/index.js +6 -2
  24. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  25. package/dist/elements/Button/index.css +2 -2
  26. package/dist/elements/ChangeSummary/index.css +18 -0
  27. package/dist/elements/ChangeSummary/index.d.ts +28 -0
  28. package/dist/elements/ChangeSummary/index.d.ts.map +1 -0
  29. package/dist/elements/ChangeSummary/index.js +147 -0
  30. package/dist/elements/ChangeSummary/index.js.map +1 -0
  31. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts +10 -0
  32. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -1
  33. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +55 -0
  34. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -1
  35. package/dist/elements/ColumnSelection/Popup.d.ts.map +1 -1
  36. package/dist/elements/ColumnSelection/Popup.js +3 -3
  37. package/dist/elements/ColumnSelection/Popup.js.map +1 -1
  38. package/dist/elements/Combobox/index.css +84 -23
  39. package/dist/elements/Combobox/index.d.ts +21 -0
  40. package/dist/elements/Combobox/index.d.ts.map +1 -1
  41. package/dist/elements/Combobox/index.js +66 -21
  42. package/dist/elements/Combobox/index.js.map +1 -1
  43. package/dist/elements/DeleteDocument/index.d.ts.map +1 -1
  44. package/dist/elements/DeleteDocument/index.js +9 -2
  45. package/dist/elements/DeleteDocument/index.js.map +1 -1
  46. package/dist/elements/DeleteMany/index.d.ts.map +1 -1
  47. package/dist/elements/DeleteMany/index.js +4 -1
  48. package/dist/elements/DeleteMany/index.js.map +1 -1
  49. package/dist/elements/DocumentHeader/Tabs/Tab/index.css +5 -3
  50. package/dist/elements/DocumentHeader/Tabs/tabs/BranchChangesPill/index.css +12 -0
  51. package/dist/elements/DocumentHeader/Tabs/tabs/BranchChangesPill/index.d.ts +12 -0
  52. package/dist/elements/DocumentHeader/Tabs/tabs/BranchChangesPill/index.d.ts.map +1 -0
  53. package/dist/elements/DocumentHeader/Tabs/tabs/BranchChangesPill/index.js +83 -0
  54. package/dist/elements/DocumentHeader/Tabs/tabs/BranchChangesPill/index.js.map +1 -0
  55. package/dist/elements/DocumentHeader/Tabs/tabs/BranchSettingsTab/index.d.ts +14 -0
  56. package/dist/elements/DocumentHeader/Tabs/tabs/BranchSettingsTab/index.d.ts.map +1 -0
  57. package/dist/elements/DocumentHeader/Tabs/tabs/BranchSettingsTab/index.js +28 -0
  58. package/dist/elements/DocumentHeader/Tabs/tabs/BranchSettingsTab/index.js.map +1 -0
  59. package/dist/elements/DocumentHeader/Tabs/tabs/index.d.ts.map +1 -1
  60. package/dist/elements/DocumentHeader/Tabs/tabs/index.js +32 -1
  61. package/dist/elements/DocumentHeader/Tabs/tabs/index.js.map +1 -1
  62. package/dist/elements/Drawer/index.css +10 -4
  63. package/dist/elements/DuplicateDocument/SelectLocalesDrawer/index.js +3 -2
  64. package/dist/elements/DuplicateDocument/SelectLocalesDrawer/index.js.map +1 -1
  65. package/dist/elements/DuplicateDocument/index.d.ts.map +1 -1
  66. package/dist/elements/DuplicateDocument/index.js +6 -1
  67. package/dist/elements/DuplicateDocument/index.js.map +1 -1
  68. package/dist/elements/EditMany/DrawerContent.d.ts.map +1 -1
  69. package/dist/elements/EditMany/DrawerContent.js +4 -1
  70. package/dist/elements/EditMany/DrawerContent.js.map +1 -1
  71. package/dist/elements/Hierarchy/ColumnBrowser/index.d.ts.map +1 -1
  72. package/dist/elements/Hierarchy/ColumnBrowser/index.js +4 -1
  73. package/dist/elements/Hierarchy/ColumnBrowser/index.js.map +1 -1
  74. package/dist/elements/Hierarchy/Field/SelectedHierarchies.d.ts.map +1 -1
  75. package/dist/elements/Hierarchy/Field/SelectedHierarchies.js +4 -1
  76. package/dist/elements/Hierarchy/Field/SelectedHierarchies.js.map +1 -1
  77. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.d.ts +2 -1
  78. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.d.ts.map +1 -1
  79. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.js +2 -0
  80. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.js.map +1 -1
  81. package/dist/elements/Hierarchy/Modal/index.d.ts.map +1 -1
  82. package/dist/elements/Hierarchy/Modal/index.js +3 -0
  83. package/dist/elements/Hierarchy/Modal/index.js.map +1 -1
  84. package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -1
  85. package/dist/elements/Hierarchy/MoveMany/index.js +4 -1
  86. package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -1
  87. package/dist/elements/Hierarchy/Search/useHierarchySearch.d.ts.map +1 -1
  88. package/dist/elements/Hierarchy/Search/useHierarchySearch.js +3 -0
  89. package/dist/elements/Hierarchy/Search/useHierarchySearch.js.map +1 -1
  90. package/dist/elements/Hierarchy/Tree/useChildren.d.ts.map +1 -1
  91. package/dist/elements/Hierarchy/Tree/useChildren.js +4 -1
  92. package/dist/elements/Hierarchy/Tree/useChildren.js.map +1 -1
  93. package/dist/elements/IDLabel/index.css +6 -0
  94. package/dist/elements/IDLabel/index.d.ts +1 -1
  95. package/dist/elements/IDLabel/index.d.ts.map +1 -1
  96. package/dist/elements/IDLabel/index.js +16 -21
  97. package/dist/elements/IDLabel/index.js.map +1 -1
  98. package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.d.ts +1 -7
  99. package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.d.ts.map +1 -1
  100. package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js +26 -32
  101. package/dist/elements/ListHeader/TitleActions/ListBulkUploadButton.js.map +1 -1
  102. package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.d.ts.map +1 -1
  103. package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.js +6 -2
  104. package/dist/elements/ListHeader/TitleActions/ListEmptyTrashButton.js.map +1 -1
  105. package/dist/elements/MergeBranch/context.d.ts +67 -0
  106. package/dist/elements/MergeBranch/context.d.ts.map +1 -0
  107. package/dist/elements/MergeBranch/context.js +47 -0
  108. package/dist/elements/MergeBranch/context.js.map +1 -0
  109. package/dist/elements/MergeBranch/index.css +136 -0
  110. package/dist/elements/MergeBranch/index.d.ts +15 -0
  111. package/dist/elements/MergeBranch/index.d.ts.map +1 -0
  112. package/dist/elements/MergeBranch/index.js +545 -0
  113. package/dist/elements/MergeBranch/index.js.map +1 -0
  114. package/dist/elements/MergeBranch/provider.d.ts +12 -0
  115. package/dist/elements/MergeBranch/provider.d.ts.map +1 -0
  116. package/dist/elements/MergeBranch/provider.js +19 -0
  117. package/dist/elements/MergeBranch/provider.js.map +1 -0
  118. package/dist/elements/MergeBranch/slug.d.ts +9 -0
  119. package/dist/elements/MergeBranch/slug.d.ts.map +1 -0
  120. package/dist/elements/MergeBranch/slug.js +8 -0
  121. package/dist/elements/MergeBranch/slug.js.map +1 -0
  122. package/dist/elements/Nav/context.js +2 -2
  123. package/dist/elements/Nav/context.js.map +1 -1
  124. package/dist/elements/Nav/getNavPrefs.d.ts +6 -0
  125. package/dist/elements/Nav/getNavPrefs.d.ts.map +1 -1
  126. package/dist/elements/Nav/getNavPrefs.js +14 -46
  127. package/dist/elements/Nav/getNavPrefs.js.map +1 -1
  128. package/dist/elements/NavGroup/index.js +1 -1
  129. package/dist/elements/NavGroup/index.js.map +1 -1
  130. package/dist/elements/PermanentlyDeleteButton/index.d.ts.map +1 -1
  131. package/dist/elements/PermanentlyDeleteButton/index.js +4 -1
  132. package/dist/elements/PermanentlyDeleteButton/index.js.map +1 -1
  133. package/dist/elements/Popup/PopupButtonList/index.css +1 -1
  134. package/dist/elements/Popup/index.js +1 -1
  135. package/dist/elements/Popup/index.js.map +1 -1
  136. package/dist/elements/PublishButton/ScheduleDrawer/index.js +1 -1
  137. package/dist/elements/PublishButton/ScheduleDrawer/index.js.map +1 -1
  138. package/dist/elements/PublishButton/index.d.ts.map +1 -1
  139. package/dist/elements/PublishButton/index.js +6 -2
  140. package/dist/elements/PublishButton/index.js.map +1 -1
  141. package/dist/elements/PublishMany/DrawerContent.d.ts.map +1 -1
  142. package/dist/elements/PublishMany/DrawerContent.js +4 -1
  143. package/dist/elements/PublishMany/DrawerContent.js.map +1 -1
  144. package/dist/elements/QueryPresets/QueryPresetBar/index.js +1 -3
  145. package/dist/elements/QueryPresets/QueryPresetBar/index.js.map +1 -1
  146. package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
  147. package/dist/elements/RelationshipTable/index.js +5 -2
  148. package/dist/elements/RelationshipTable/index.js.map +1 -1
  149. package/dist/elements/RestoreButton/index.d.ts.map +1 -1
  150. package/dist/elements/RestoreButton/index.js +4 -1
  151. package/dist/elements/RestoreButton/index.js.map +1 -1
  152. package/dist/elements/RestoreMany/index.d.ts.map +1 -1
  153. package/dist/elements/RestoreMany/index.js +3 -0
  154. package/dist/elements/RestoreMany/index.js.map +1 -1
  155. package/dist/elements/SaveDraftButton/index.d.ts.map +1 -1
  156. package/dist/elements/SaveDraftButton/index.js +15 -2
  157. package/dist/elements/SaveDraftButton/index.js.map +1 -1
  158. package/dist/elements/SchedulePublishButton/index.d.ts.map +1 -1
  159. package/dist/elements/SchedulePublishButton/index.js +7 -1
  160. package/dist/elements/SchedulePublishButton/index.js.map +1 -1
  161. package/dist/elements/SortHeader/index.d.ts.map +1 -1
  162. package/dist/elements/SortHeader/index.js +29 -26
  163. package/dist/elements/SortHeader/index.js.map +1 -1
  164. package/dist/elements/Status/index.d.ts.map +1 -1
  165. package/dist/elements/Status/index.js +16 -3
  166. package/dist/elements/Status/index.js.map +1 -1
  167. package/dist/elements/StepNav/index.css +71 -14
  168. package/dist/elements/StepNav/index.d.ts.map +1 -1
  169. package/dist/elements/StepNav/index.js +135 -69
  170. package/dist/elements/StepNav/index.js.map +1 -1
  171. package/dist/elements/Table/DefaultCell/fields/BranchStatus/index.css +34 -0
  172. package/dist/elements/Table/DefaultCell/fields/BranchStatus/index.d.ts +13 -0
  173. package/dist/elements/Table/DefaultCell/fields/BranchStatus/index.d.ts.map +1 -0
  174. package/dist/elements/Table/DefaultCell/fields/BranchStatus/index.js +51 -0
  175. package/dist/elements/Table/DefaultCell/fields/BranchStatus/index.js.map +1 -0
  176. package/dist/elements/Table/DefaultCell/index.d.ts.map +1 -1
  177. package/dist/elements/Table/DefaultCell/index.js +3 -11
  178. package/dist/elements/Table/DefaultCell/index.js.map +1 -1
  179. package/dist/elements/Table/OrderableTable.d.ts.map +1 -1
  180. package/dist/elements/Table/OrderableTable.js +3 -1
  181. package/dist/elements/Table/OrderableTable.js.map +1 -1
  182. package/dist/elements/Table/RelationshipProvider/index.d.ts.map +1 -1
  183. package/dist/elements/Table/RelationshipProvider/index.js +29 -23
  184. package/dist/elements/Table/RelationshipProvider/index.js.map +1 -1
  185. package/dist/elements/UnpublishButton/index.d.ts.map +1 -1
  186. package/dist/elements/UnpublishButton/index.js +4 -1
  187. package/dist/elements/UnpublishButton/index.js.map +1 -1
  188. package/dist/elements/UnpublishMany/DrawerContent.d.ts.map +1 -1
  189. package/dist/elements/UnpublishMany/DrawerContent.js +4 -1
  190. package/dist/elements/UnpublishMany/DrawerContent.js.map +1 -1
  191. package/dist/elements/WhereBuilder/Condition/Relationship/index.d.ts.map +1 -1
  192. package/dist/elements/WhereBuilder/Condition/Relationship/index.js +3 -0
  193. package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
  194. package/dist/exports/client/index.d.ts +19 -1
  195. package/dist/exports/client/index.d.ts.map +1 -1
  196. package/dist/exports/client/index.js +1 -1
  197. package/dist/exports/client/index.js.map +3 -3
  198. package/dist/fields/Array/ArrayRow.d.ts +1 -0
  199. package/dist/fields/Array/ArrayRow.d.ts.map +1 -1
  200. package/dist/fields/Array/ArrayRow.js +2 -0
  201. package/dist/fields/Array/ArrayRow.js.map +1 -1
  202. package/dist/fields/Array/index.d.ts.map +1 -1
  203. package/dist/fields/Array/index.js +38 -10
  204. package/dist/fields/Array/index.js.map +1 -1
  205. package/dist/fields/Blocks/BlockRow.d.ts +1 -0
  206. package/dist/fields/Blocks/BlockRow.d.ts.map +1 -1
  207. package/dist/fields/Blocks/BlockRow.js +2 -0
  208. package/dist/fields/Blocks/BlockRow.js.map +1 -1
  209. package/dist/fields/Blocks/RowActions.d.ts +1 -0
  210. package/dist/fields/Blocks/RowActions.d.ts.map +1 -1
  211. package/dist/fields/Blocks/RowActions.js +22 -19
  212. package/dist/fields/Blocks/RowActions.js.map +1 -1
  213. package/dist/fields/Blocks/index.d.ts.map +1 -1
  214. package/dist/fields/Blocks/index.js +35 -7
  215. package/dist/fields/Blocks/index.js.map +1 -1
  216. package/dist/fields/Relationship/Input.d.ts.map +1 -1
  217. package/dist/fields/Relationship/Input.js +5 -1
  218. package/dist/fields/Relationship/Input.js.map +1 -1
  219. package/dist/fields/Upload/Input.d.ts.map +1 -1
  220. package/dist/fields/Upload/Input.js +4 -1
  221. package/dist/fields/Upload/Input.js.map +1 -1
  222. package/dist/forms/Form/index.d.ts.map +1 -1
  223. package/dist/forms/Form/index.js +4 -1
  224. package/dist/forms/Form/index.js.map +1 -1
  225. package/dist/hooks/usePayloadAPI.d.ts.map +1 -1
  226. package/dist/hooks/usePayloadAPI.js +44 -40
  227. package/dist/hooks/usePayloadAPI.js.map +1 -1
  228. package/dist/icons/Branch/index.css +5 -0
  229. package/dist/icons/Branch/index.d.ts +7 -0
  230. package/dist/icons/Branch/index.d.ts.map +1 -0
  231. package/dist/icons/Branch/index.js +25 -0
  232. package/dist/icons/Branch/index.js.map +1 -0
  233. package/dist/icons/Edit/index.d.ts +0 -1
  234. package/dist/icons/Edit/index.d.ts.map +1 -1
  235. package/dist/icons/Edit/index.js +4 -4
  236. package/dist/icons/Edit/index.js.map +1 -1
  237. package/dist/providers/Actions/index.d.ts +1 -0
  238. package/dist/providers/Actions/index.d.ts.map +1 -1
  239. package/dist/providers/Actions/index.js +43 -11
  240. package/dist/providers/Actions/index.js.map +1 -1
  241. package/dist/providers/Auth/AuthSessionDebug/index.css +48 -0
  242. package/dist/providers/Auth/AuthSessionDebug/index.d.ts +13 -0
  243. package/dist/providers/Auth/AuthSessionDebug/index.d.ts.map +1 -0
  244. package/dist/providers/Auth/AuthSessionDebug/index.js +93 -0
  245. package/dist/providers/Auth/AuthSessionDebug/index.js.map +1 -0
  246. package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts +21 -0
  247. package/dist/providers/Auth/AuthSessionDebug/utilities.d.ts.map +1 -0
  248. package/dist/providers/Auth/AuthSessionDebug/utilities.js +53 -0
  249. package/dist/providers/Auth/AuthSessionDebug/utilities.js.map +1 -0
  250. package/dist/providers/Auth/authSessionRequests.d.ts +27 -0
  251. package/dist/providers/Auth/authSessionRequests.d.ts.map +1 -0
  252. package/dist/providers/Auth/authSessionRequests.js +119 -0
  253. package/dist/providers/Auth/authSessionRequests.js.map +1 -0
  254. package/dist/providers/Auth/authSessionRequests.spec.js +121 -0
  255. package/dist/providers/Auth/authSessionRequests.spec.js.map +1 -0
  256. package/dist/providers/Auth/index.d.ts +2 -56
  257. package/dist/providers/Auth/index.d.ts.map +1 -1
  258. package/dist/providers/Auth/index.js +283 -135
  259. package/dist/providers/Auth/index.js.map +1 -1
  260. package/dist/providers/Auth/sessionActivity.d.ts +23 -0
  261. package/dist/providers/Auth/sessionActivity.d.ts.map +1 -0
  262. package/dist/providers/Auth/sessionActivity.js +49 -0
  263. package/dist/providers/Auth/sessionActivity.js.map +1 -0
  264. package/dist/providers/Auth/sessionActivity.spec.js +44 -0
  265. package/dist/providers/Auth/sessionActivity.spec.js.map +1 -0
  266. package/dist/providers/Auth/sessionTiming.d.ts +11 -0
  267. package/dist/providers/Auth/sessionTiming.d.ts.map +1 -0
  268. package/dist/providers/Auth/sessionTiming.js +18 -0
  269. package/dist/providers/Auth/sessionTiming.js.map +1 -0
  270. package/dist/providers/Auth/tabSessionSync/index.d.ts +17 -0
  271. package/dist/providers/Auth/tabSessionSync/index.d.ts.map +1 -0
  272. package/dist/providers/Auth/tabSessionSync/index.js +263 -0
  273. package/dist/providers/Auth/tabSessionSync/index.js.map +1 -0
  274. package/dist/providers/Auth/tabSessionSync/index.spec.js +463 -0
  275. package/dist/providers/Auth/tabSessionSync/index.spec.js.map +1 -0
  276. package/dist/providers/Auth/tabSessionSync/types.d.ts +107 -0
  277. package/dist/providers/Auth/tabSessionSync/types.d.ts.map +1 -0
  278. package/dist/providers/Auth/tabSessionSync/types.js +6 -0
  279. package/dist/providers/Auth/tabSessionSync/types.js.map +1 -0
  280. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts +11 -0
  281. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.d.ts.map +1 -0
  282. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js +90 -0
  283. package/dist/providers/Auth/tabSessionSync/useTabSessionSync.js.map +1 -0
  284. package/dist/providers/Auth/tabSessionSync/utilities.d.ts +26 -0
  285. package/dist/providers/Auth/tabSessionSync/utilities.d.ts.map +1 -0
  286. package/dist/providers/Auth/tabSessionSync/utilities.js +159 -0
  287. package/dist/providers/Auth/tabSessionSync/utilities.js.map +1 -0
  288. package/dist/providers/Auth/types.d.ts +65 -0
  289. package/dist/providers/Auth/types.d.ts.map +1 -0
  290. package/dist/providers/Auth/types.js +2 -0
  291. package/dist/providers/Auth/types.js.map +1 -0
  292. package/dist/providers/Auth/useAuthSessionTimers.d.ts +26 -0
  293. package/dist/providers/Auth/useAuthSessionTimers.d.ts.map +1 -0
  294. package/dist/providers/Auth/useAuthSessionTimers.js +203 -0
  295. package/dist/providers/Auth/useAuthSessionTimers.js.map +1 -0
  296. package/dist/providers/Auth/useAuthSessionTimers.spec.js +311 -0
  297. package/dist/providers/Auth/useAuthSessionTimers.spec.js.map +1 -0
  298. package/dist/providers/Branch/index.d.ts +68 -0
  299. package/dist/providers/Branch/index.d.ts.map +1 -0
  300. package/dist/providers/Branch/index.js +193 -0
  301. package/dist/providers/Branch/index.js.map +1 -0
  302. package/dist/providers/Branch/index.server.d.ts +14 -0
  303. package/dist/providers/Branch/index.server.d.ts.map +1 -0
  304. package/dist/providers/Branch/index.server.js +125 -0
  305. package/dist/providers/Branch/index.server.js.map +1 -0
  306. package/dist/providers/DocumentInfo/index.d.ts.map +1 -1
  307. package/dist/providers/DocumentInfo/index.js +5 -1
  308. package/dist/providers/DocumentInfo/index.js.map +1 -1
  309. package/dist/providers/DocumentInfo/useGetDocPermissions.d.ts +2 -1
  310. package/dist/providers/DocumentInfo/useGetDocPermissions.d.ts.map +1 -1
  311. package/dist/providers/DocumentInfo/useGetDocPermissions.js +3 -1
  312. package/dist/providers/DocumentInfo/useGetDocPermissions.js.map +1 -1
  313. package/dist/providers/FormErrorHandler/index.d.ts +5 -1
  314. package/dist/providers/FormErrorHandler/index.d.ts.map +1 -1
  315. package/dist/providers/FormErrorHandler/index.js.map +1 -1
  316. package/dist/providers/Hierarchy/index.d.ts.map +1 -1
  317. package/dist/providers/Hierarchy/index.js +4 -1
  318. package/dist/providers/Hierarchy/index.js.map +1 -1
  319. package/dist/providers/Locale/index.d.ts.map +1 -1
  320. package/dist/providers/Locale/index.js +41 -36
  321. package/dist/providers/Locale/index.js.map +1 -1
  322. package/dist/providers/Preferences/index.d.ts +3 -1
  323. package/dist/providers/Preferences/index.d.ts.map +1 -1
  324. package/dist/providers/Preferences/index.js +9 -3
  325. package/dist/providers/Preferences/index.js.map +1 -1
  326. package/dist/providers/Root/index.js +4 -4
  327. package/dist/providers/Root/index.js.map +1 -1
  328. package/dist/providers/RouteTransition/ProgressBar/index.js +4 -1
  329. package/dist/providers/RouteTransition/ProgressBar/index.js.map +1 -1
  330. package/dist/providers/RouteTransition/ProgressBar/index.spec.js +44 -0
  331. package/dist/providers/RouteTransition/ProgressBar/index.spec.js.map +1 -0
  332. package/dist/providers/RouteTransition/index.d.ts +2 -0
  333. package/dist/providers/RouteTransition/index.d.ts.map +1 -1
  334. package/dist/providers/RouteTransition/index.js +42 -14
  335. package/dist/providers/RouteTransition/index.js.map +1 -1
  336. package/dist/styles.css +1 -1
  337. package/dist/templates/Default/index.d.ts +1 -0
  338. package/dist/templates/Default/index.d.ts.map +1 -1
  339. package/dist/templates/Default/index.js +44 -36
  340. package/dist/templates/Default/index.js.map +1 -1
  341. package/dist/utilities/getAdminPreferences.d.ts +14 -0
  342. package/dist/utilities/getAdminPreferences.d.ts.map +1 -0
  343. package/dist/utilities/getAdminPreferences.js +22 -0
  344. package/dist/utilities/getAdminPreferences.js.map +1 -0
  345. package/dist/utilities/getRequestBranch.d.ts +20 -0
  346. package/dist/utilities/getRequestBranch.d.ts.map +1 -0
  347. package/dist/utilities/getRequestBranch.js +35 -0
  348. package/dist/utilities/getRequestBranch.js.map +1 -0
  349. package/dist/utilities/getVersions.d.ts +6 -1
  350. package/dist/utilities/getVersions.d.ts.map +1 -1
  351. package/dist/utilities/getVersions.js +5 -0
  352. package/dist/utilities/getVersions.js.map +1 -1
  353. package/dist/utilities/initReq.d.ts.map +1 -1
  354. package/dist/utilities/initReq.js +8 -0
  355. package/dist/utilities/initReq.js.map +1 -1
  356. package/dist/utilities/matchesSearchQuery.d.ts +12 -0
  357. package/dist/utilities/matchesSearchQuery.d.ts.map +1 -0
  358. package/dist/utilities/matchesSearchQuery.js +23 -0
  359. package/dist/utilities/matchesSearchQuery.js.map +1 -0
  360. package/dist/{elements/ColumnSelection/matchesColumnSearch.spec.js → utilities/matchesSearchQuery.spec.js} +29 -29
  361. package/dist/utilities/matchesSearchQuery.spec.js.map +1 -0
  362. package/dist/utilities/scheduleMergeHandler.d.ts +33 -0
  363. package/dist/utilities/scheduleMergeHandler.d.ts.map +1 -0
  364. package/dist/utilities/scheduleMergeHandler.js +119 -0
  365. package/dist/utilities/scheduleMergeHandler.js.map +1 -0
  366. package/dist/utilities/schedulePublishHandler.d.ts.map +1 -1
  367. package/dist/utilities/schedulePublishHandler.js +10 -0
  368. package/dist/utilities/schedulePublishHandler.js.map +1 -1
  369. package/dist/utilities/serverFunctionRegistry.d.ts.map +1 -1
  370. package/dist/utilities/serverFunctionRegistry.js +6 -0
  371. package/dist/utilities/serverFunctionRegistry.js.map +1 -1
  372. package/dist/views/API/index.client.d.ts.map +1 -1
  373. package/dist/views/API/index.client.js +10 -2
  374. package/dist/views/API/index.client.js.map +1 -1
  375. package/dist/views/Branch/BranchChanges/index.d.ts +23 -0
  376. package/dist/views/Branch/BranchChanges/index.d.ts.map +1 -0
  377. package/dist/views/Branch/BranchChanges/index.js +150 -0
  378. package/dist/views/Branch/BranchChanges/index.js.map +1 -0
  379. package/dist/views/Branch/ChangedDocuments/index.css +118 -0
  380. package/dist/views/Branch/ChangedDocuments/index.d.ts +34 -0
  381. package/dist/views/Branch/ChangedDocuments/index.d.ts.map +1 -0
  382. package/dist/views/Branch/ChangedDocuments/index.js +233 -0
  383. package/dist/views/Branch/ChangedDocuments/index.js.map +1 -0
  384. package/dist/views/Branch/DiscardChangesButton/index.d.ts +16 -0
  385. package/dist/views/Branch/DiscardChangesButton/index.d.ts.map +1 -0
  386. package/dist/views/Branch/DiscardChangesButton/index.js +106 -0
  387. package/dist/views/Branch/DiscardChangesButton/index.js.map +1 -0
  388. package/dist/views/Branch/Manage/index.d.ts +11 -0
  389. package/dist/views/Branch/Manage/index.d.ts.map +1 -0
  390. package/dist/views/Branch/Manage/index.js +71 -0
  391. package/dist/views/Branch/Manage/index.js.map +1 -0
  392. package/dist/views/Branch/MergeChangesButton/index.d.ts +14 -0
  393. package/dist/views/Branch/MergeChangesButton/index.d.ts.map +1 -0
  394. package/dist/views/Branch/MergeChangesButton/index.js +55 -0
  395. package/dist/views/Branch/MergeChangesButton/index.js.map +1 -0
  396. package/dist/views/Branch/MergeLedger/index.css +137 -0
  397. package/dist/views/Branch/MergeLedger/index.d.ts +31 -0
  398. package/dist/views/Branch/MergeLedger/index.d.ts.map +1 -0
  399. package/dist/views/Branch/MergeLedger/index.js +211 -0
  400. package/dist/views/Branch/MergeLedger/index.js.map +1 -0
  401. package/dist/views/Branch/ScheduledMerges/index.css +83 -0
  402. package/dist/views/Branch/ScheduledMerges/index.d.ts +32 -0
  403. package/dist/views/Branch/ScheduledMerges/index.d.ts.map +1 -0
  404. package/dist/views/Branch/ScheduledMerges/index.js +183 -0
  405. package/dist/views/Branch/ScheduledMerges/index.js.map +1 -0
  406. package/dist/views/Branch/index.css +77 -0
  407. package/dist/views/Branch/index.d.ts +17 -0
  408. package/dist/views/Branch/index.d.ts.map +1 -0
  409. package/dist/views/Branch/index.js +188 -0
  410. package/dist/views/Branch/index.js.map +1 -0
  411. package/dist/views/Branch/renderBranchDiff.d.ts +29 -0
  412. package/dist/views/Branch/renderBranchDiff.d.ts.map +1 -0
  413. package/dist/views/Branch/renderBranchDiff.js +151 -0
  414. package/dist/views/Branch/renderBranchDiff.js.map +1 -0
  415. package/dist/views/Branch/renderMergeDiff.d.ts +24 -0
  416. package/dist/views/Branch/renderMergeDiff.d.ts.map +1 -0
  417. package/dist/views/Branch/renderMergeDiff.js +94 -0
  418. package/dist/views/Branch/renderMergeDiff.js.map +1 -0
  419. package/dist/views/Branches/index.d.ts +16 -0
  420. package/dist/views/Branches/index.d.ts.map +1 -0
  421. package/dist/views/Branches/index.js +54 -0
  422. package/dist/views/Branches/index.js.map +1 -0
  423. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.d.ts.map +1 -1
  424. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js +3 -2
  425. package/dist/views/Dashboard/Default/ModularDashboard/DashboardStepNav.js.map +1 -1
  426. package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.d.ts.map +1 -1
  427. package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.js +7 -7
  428. package/dist/views/Dashboard/Default/ModularDashboard/WidgetEditControl.js.map +1 -1
  429. package/dist/views/Dashboard/Default/ModularDashboard/index.client.d.ts.map +1 -1
  430. package/dist/views/Dashboard/Default/ModularDashboard/index.client.js +104 -66
  431. package/dist/views/Dashboard/Default/ModularDashboard/index.client.js.map +1 -1
  432. package/dist/views/Dashboard/Default/ModularDashboard/index.css +33 -140
  433. package/dist/views/Document/getDocumentView.d.ts.map +1 -1
  434. package/dist/views/Document/getDocumentView.js +21 -2
  435. package/dist/views/Document/getDocumentView.js.map +1 -1
  436. package/dist/views/Document/getMetaBySegment.d.ts.map +1 -1
  437. package/dist/views/Document/getMetaBySegment.js +9 -0
  438. package/dist/views/Document/getMetaBySegment.js.map +1 -1
  439. package/dist/views/Document/index.d.ts +3 -1
  440. package/dist/views/Document/index.d.ts.map +1 -1
  441. package/dist/views/Document/index.js +8 -1
  442. package/dist/views/Document/index.js.map +1 -1
  443. package/dist/views/HierarchyList/HierarchyTable/index.d.ts.map +1 -1
  444. package/dist/views/HierarchyList/HierarchyTable/index.js +6 -2
  445. package/dist/views/HierarchyList/HierarchyTable/index.js.map +1 -1
  446. package/dist/views/List/ListHeader/index.d.ts +1 -10
  447. package/dist/views/List/ListHeader/index.d.ts.map +1 -1
  448. package/dist/views/List/ListHeader/index.js +1 -3
  449. package/dist/views/List/ListHeader/index.js.map +1 -1
  450. package/dist/views/List/index.client.d.ts.map +1 -1
  451. package/dist/views/List/index.client.js +0 -14
  452. package/dist/views/List/index.client.js.map +1 -1
  453. package/dist/views/List/index.css +5 -0
  454. package/dist/views/Root/getCustomCollectionViewByRoute.d.ts.map +1 -1
  455. package/dist/views/Root/getCustomCollectionViewByRoute.js.map +1 -1
  456. package/dist/views/Root/getCustomGlobalViewByRoute.d.ts.map +1 -1
  457. package/dist/views/Root/getCustomGlobalViewByRoute.js.map +1 -1
  458. package/dist/views/Root/getCustomViewByKey.d.ts.map +1 -1
  459. package/dist/views/Root/getCustomViewByKey.js.map +1 -1
  460. package/dist/views/Root/getRouteData.d.ts.map +1 -1
  461. package/dist/views/Root/getRouteData.js +12 -4
  462. package/dist/views/Root/getRouteData.js.map +1 -1
  463. package/dist/views/Root/index.d.ts.map +1 -1
  464. package/dist/views/Root/index.js +1 -0
  465. package/dist/views/Root/index.js.map +1 -1
  466. package/dist/views/Version/Default/index.css +26 -2
  467. package/dist/views/Version/Default/index.d.ts.map +1 -1
  468. package/dist/views/Version/Default/index.js +18 -6
  469. package/dist/views/Version/Default/index.js.map +1 -1
  470. package/dist/views/Version/Default/types.d.ts +9 -0
  471. package/dist/views/Version/Default/types.d.ts.map +1 -1
  472. package/dist/views/Version/Default/types.js.map +1 -1
  473. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.d.ts.map +1 -1
  474. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js +8 -0
  475. package/dist/views/Version/RenderFieldsToDiff/buildVersionFields.js.map +1 -1
  476. package/dist/views/Version/Restore/index.d.ts.map +1 -1
  477. package/dist/views/Version/Restore/index.js +6 -3
  478. package/dist/views/Version/Restore/index.js.map +1 -1
  479. package/dist/views/Version/index.d.ts.map +1 -1
  480. package/dist/views/Version/index.js +4 -0
  481. package/dist/views/Version/index.js.map +1 -1
  482. package/dist/views/Versions/buildColumns.d.ts +2 -1
  483. package/dist/views/Versions/buildColumns.d.ts.map +1 -1
  484. package/dist/views/Versions/buildColumns.js +21 -1
  485. package/dist/views/Versions/buildColumns.js.map +1 -1
  486. package/dist/views/Versions/cells/Branch/index.d.ts +12 -0
  487. package/dist/views/Versions/cells/Branch/index.d.ts.map +1 -0
  488. package/dist/views/Versions/cells/Branch/index.js +27 -0
  489. package/dist/views/Versions/cells/Branch/index.js.map +1 -0
  490. package/dist/views/Versions/index.client.d.ts +0 -1
  491. package/dist/views/Versions/index.client.d.ts.map +1 -1
  492. package/dist/views/Versions/index.client.js.map +1 -1
  493. package/dist/views/Versions/index.d.ts.map +1 -1
  494. package/dist/views/Versions/index.js +2 -14
  495. package/dist/views/Versions/index.js.map +1 -1
  496. package/package.json +5 -5
  497. package/dist/elements/ColumnSelection/matchesColumnSearch.d.ts +0 -10
  498. package/dist/elements/ColumnSelection/matchesColumnSearch.d.ts.map +0 -1
  499. package/dist/elements/ColumnSelection/matchesColumnSearch.js +0 -21
  500. package/dist/elements/ColumnSelection/matchesColumnSearch.js.map +0 -1
  501. package/dist/elements/ColumnSelection/matchesColumnSearch.spec.js.map +0 -1
@@ -0,0 +1,211 @@
1
+ 'use client';
2
+
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { getTranslation } from '@payloadcms/translations';
5
+ import { formatAdminURL } from 'payload/shared';
6
+ import React, { useCallback, useRef, useState } from 'react';
7
+ import { Link } from '../../../elements/Link/index.js';
8
+ import { Pill } from '../../../elements/Pill/index.js';
9
+ import { ShimmerEffect } from '../../../elements/ShimmerEffect/index.js';
10
+ import { ChevronIcon } from '../../../icons/Chevron/index.js';
11
+ import { useConfig } from '../../../providers/Config/index.js';
12
+ import { useServerFunctions } from '../../../providers/ServerFunctions/index.js';
13
+ import { useTranslation } from '../../../providers/Translation/index.js';
14
+ import './index.css';
15
+ const baseClass = 'merge-ledger';
16
+ const operationPillStyle = {
17
+ create: 'success',
18
+ delete: 'error',
19
+ update: 'warning'
20
+ };
21
+ /**
22
+ * A branch's history: one section per merge event, newest first.
23
+ *
24
+ * Reconstructed from the ledger rather than from the branch's current state, which
25
+ * by then holds nothing — a merge consumes the change rows it applies and drops the
26
+ * shadow rows behind them. Titles are the ones the documents had when they merged.
27
+ *
28
+ * Rows expand to the diff of what that merge did, rendered from the snapshots taken
29
+ * either side of the write. Fetched per row, because a history can hold hundreds of
30
+ * documents and each diff is a full field-tree render.
31
+ */
32
+ export const MergeLedger = ({
33
+ events
34
+ }) => {
35
+ const {
36
+ config,
37
+ getEntityConfig
38
+ } = useConfig();
39
+ const {
40
+ i18n,
41
+ t
42
+ } = useTranslation();
43
+ const {
44
+ serverFunction
45
+ } = useServerFunctions();
46
+ const [expanded, setExpanded] = useState(() => new Set());
47
+ const [loaded, setLoaded] = useState({});
48
+ const loadedRef = useRef(loaded);
49
+ loadedRef.current = loaded;
50
+ const load = useCallback(async ({
51
+ changeIndex,
52
+ key,
53
+ mergeID
54
+ }) => {
55
+ if (loadedRef.current[key]) {
56
+ return;
57
+ }
58
+ setLoaded(prev => ({
59
+ ...prev,
60
+ [key]: {
61
+ status: 'loading'
62
+ }
63
+ }));
64
+ try {
65
+ const result = await serverFunction({
66
+ name: 'render-merge-diff',
67
+ args: {
68
+ changeIndex,
69
+ mergeID
70
+ }
71
+ });
72
+ setLoaded(prev_1 => ({
73
+ ...prev_1,
74
+ [key]: {
75
+ result,
76
+ status: 'ready'
77
+ }
78
+ }));
79
+ } catch (_err) {
80
+ setLoaded(prev_0 => ({
81
+ ...prev_0,
82
+ [key]: {
83
+ status: 'error'
84
+ }
85
+ }));
86
+ }
87
+ }, [serverFunction]);
88
+ const toggle = useCallback(({
89
+ changeIndex: changeIndex_0,
90
+ key: key_0,
91
+ mergeID: mergeID_0
92
+ }) => {
93
+ // The fetch is kicked off outside the updater. A state updater must be pure —
94
+ // React may run it during another component's render, and the `setLoaded` inside
95
+ // `load` then lands mid-render.
96
+ const willExpand = !expanded.has(key_0);
97
+ setExpanded(prev_2 => {
98
+ const next = new Set(prev_2);
99
+ if (next.has(key_0)) {
100
+ next.delete(key_0);
101
+ } else {
102
+ next.add(key_0);
103
+ }
104
+ return next;
105
+ });
106
+ if (willExpand) {
107
+ void load({
108
+ changeIndex: changeIndex_0,
109
+ key: key_0,
110
+ mergeID: mergeID_0
111
+ });
112
+ }
113
+ }, [expanded, load]);
114
+ if (!events.length) {
115
+ return null;
116
+ }
117
+ return /*#__PURE__*/_jsx("div", {
118
+ className: baseClass,
119
+ children: events.map(event => /*#__PURE__*/_jsxs("section", {
120
+ className: `${baseClass}__event`,
121
+ children: [/*#__PURE__*/_jsxs("header", {
122
+ className: `${baseClass}__header`,
123
+ children: [/*#__PURE__*/_jsx("h3", {
124
+ className: `${baseClass}__when`,
125
+ children: t('branching:mergedOn', {
126
+ date: new Date(event.mergedAt).toLocaleString(undefined, {
127
+ dateStyle: 'medium',
128
+ timeStyle: 'short'
129
+ })
130
+ })
131
+ }), /*#__PURE__*/_jsx("span", {
132
+ className: `${baseClass}__meta`,
133
+ children: event.mergedByLabel ? t('branching:mergedByCount', {
134
+ count: event.changes.length,
135
+ user: event.mergedByLabel
136
+ }) : t('branching:mergedCount', {
137
+ count: event.changes.length
138
+ })
139
+ })]
140
+ }), /*#__PURE__*/_jsx("ul", {
141
+ className: `${baseClass}__list`,
142
+ children: event.changes.map((change, changeIndex_1) => {
143
+ const collectionConfig = change.globalSlug ? undefined : getEntityConfig({
144
+ collectionSlug: change.collectionSlug
145
+ });
146
+ const globalConfig = change.globalSlug ? getEntityConfig({
147
+ globalSlug: change.globalSlug
148
+ }) : undefined;
149
+ const key_1 = `${event.id}-${changeIndex_1}`;
150
+ const isExpanded = expanded.has(key_1);
151
+ const state = loaded[key_1];
152
+ return /*#__PURE__*/_jsxs("li", {
153
+ className: `${baseClass}__row`,
154
+ children: [/*#__PURE__*/_jsxs("div", {
155
+ className: `${baseClass}__row-header`,
156
+ children: [/*#__PURE__*/_jsx("button", {
157
+ "aria-expanded": isExpanded,
158
+ className: `${baseClass}__toggle`,
159
+ onClick: () => toggle({
160
+ changeIndex: changeIndex_1,
161
+ key: key_1,
162
+ mergeID: event.id
163
+ }),
164
+ type: "button",
165
+ children: /*#__PURE__*/_jsx("span", {
166
+ children: change.docTitle
167
+ })
168
+ }), /*#__PURE__*/_jsxs("div", {
169
+ className: `${baseClass}__row-content`,
170
+ children: [/*#__PURE__*/_jsx(Pill, {
171
+ className: `${baseClass}__operation`,
172
+ pillStyle: operationPillStyle[change.operation],
173
+ size: "small",
174
+ children: t(`branching:operation_${change.operation}`)
175
+ }), /*#__PURE__*/_jsx(Pill, {
176
+ className: `${baseClass}__entity`,
177
+ pillStyle: "light-gray",
178
+ size: "small",
179
+ children: getTranslation(globalConfig ? globalConfig.label ?? change.globalSlug : collectionConfig?.labels?.singular ?? change.collectionSlug, i18n)
180
+ }), change.operation === 'delete' ? /*#__PURE__*/_jsx("span", {
181
+ className: `${baseClass}__title`,
182
+ children: change.docTitle
183
+ }) : /*#__PURE__*/_jsx(Link, {
184
+ className: `${baseClass}__title ${baseClass}__title--link`,
185
+ href: formatAdminURL({
186
+ adminRoute: config.routes.admin,
187
+ path: change.globalSlug ? `/globals/${change.globalSlug}` : `/collections/${change.collectionSlug}/${change.docID}`
188
+ }),
189
+ children: change.docTitle
190
+ }), /*#__PURE__*/_jsx(ChevronIcon, {
191
+ className: `${baseClass}__indicator`,
192
+ direction: isExpanded ? 'up' : 'down',
193
+ size: 16
194
+ })]
195
+ })]
196
+ }), isExpanded && /*#__PURE__*/_jsxs("div", {
197
+ className: `${baseClass}__diff`,
198
+ children: [state?.status === 'ready' ? state.result?.diff : null, state?.status === 'loading' || !state ? /*#__PURE__*/_jsx(ShimmerEffect, {
199
+ height: "3rem"
200
+ }) : null, state?.status === 'error' ? /*#__PURE__*/_jsx("p", {
201
+ className: `${baseClass}__error`,
202
+ children: t('error:unknown')
203
+ }) : null]
204
+ })]
205
+ }, key_1);
206
+ })
207
+ })]
208
+ }, event.id))
209
+ });
210
+ };
211
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["getTranslation","formatAdminURL","React","useCallback","useRef","useState","Link","Pill","ShimmerEffect","ChevronIcon","useConfig","useServerFunctions","useTranslation","baseClass","operationPillStyle","create","delete","update","MergeLedger","events","config","getEntityConfig","i18n","t","serverFunction","expanded","setExpanded","Set","loaded","setLoaded","loadedRef","current","load","changeIndex","key","mergeID","prev","status","result","name","args","_err","toggle","willExpand","has","next","add","length","_jsx","className","map","event","_jsxs","date","Date","mergedAt","toLocaleString","undefined","dateStyle","timeStyle","mergedByLabel","count","changes","user","change","collectionConfig","globalSlug","collectionSlug","globalConfig","id","isExpanded","state","onClick","type","docTitle","pillStyle","operation","size","label","labels","singular","href","adminRoute","routes","admin","path","docID","direction","diff","height"],"sources":["../../../../src/views/Branch/MergeLedger/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { useCallback, useRef, useState } from 'react'\n\nimport type { RenderMergeDiffResult } from '../renderMergeDiff.js'\n\nimport { Link } from '../../../elements/Link/index.js'\nimport { Pill } from '../../../elements/Pill/index.js'\nimport { ShimmerEffect } from '../../../elements/ShimmerEffect/index.js'\nimport { ChevronIcon } from '../../../icons/Chevron/index.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useServerFunctions } from '../../../providers/ServerFunctions/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport './index.css'\n\nconst baseClass = 'merge-ledger'\n\nexport type MergeEventChange = {\n collectionSlug: string\n docID: string\n docTitle: string\n /** Set instead of `collectionSlug`/`docID` when the merged change was a global. */\n globalSlug?: string\n operation: 'create' | 'delete' | 'update'\n}\n\nexport type MergeEvent = {\n changes: MergeEventChange[]\n id: string\n mergedAt: string\n mergedByLabel?: string\n}\n\ntype LoadState = {\n result?: RenderMergeDiffResult\n status: 'error' | 'loading' | 'ready'\n}\n\nconst operationPillStyle = {\n create: 'success',\n delete: 'error',\n update: 'warning',\n} as const\n\n/**\n * A branch's history: one section per merge event, newest first.\n *\n * Reconstructed from the ledger rather than from the branch's current state, which\n * by then holds nothing — a merge consumes the change rows it applies and drops the\n * shadow rows behind them. Titles are the ones the documents had when they merged.\n *\n * Rows expand to the diff of what that merge did, rendered from the snapshots taken\n * either side of the write. Fetched per row, because a history can hold hundreds of\n * documents and each diff is a full field-tree render.\n */\nexport const MergeLedger: React.FC<{ events: MergeEvent[] }> = ({ events }) => {\n const { config, getEntityConfig } = useConfig()\n const { i18n, t } = useTranslation()\n const { serverFunction } = useServerFunctions()\n\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set())\n const [loaded, setLoaded] = useState<Record<string, LoadState>>({})\n\n const loadedRef = useRef(loaded)\n loadedRef.current = loaded\n\n const load = useCallback(\n async ({\n changeIndex,\n key,\n mergeID,\n }: {\n changeIndex: number\n key: string\n mergeID: string\n }) => {\n if (loadedRef.current[key]) {\n return\n }\n\n setLoaded((prev) => ({ ...prev, [key]: { status: 'loading' } }))\n\n try {\n const result = (await serverFunction({\n name: 'render-merge-diff',\n args: { changeIndex, mergeID },\n })) as RenderMergeDiffResult\n\n setLoaded((prev) => ({ ...prev, [key]: { result, status: 'ready' } }))\n } catch (_err) {\n setLoaded((prev) => ({ ...prev, [key]: { status: 'error' } }))\n }\n },\n [serverFunction],\n )\n\n const toggle = useCallback(\n ({ changeIndex, key, mergeID }: { changeIndex: number; key: string; mergeID: string }) => {\n // The fetch is kicked off outside the updater. A state updater must be pure —\n // React may run it during another component's render, and the `setLoaded` inside\n // `load` then lands mid-render.\n const willExpand = !expanded.has(key)\n\n setExpanded((prev) => {\n const next = new Set(prev)\n\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n\n return next\n })\n\n if (willExpand) {\n void load({ changeIndex, key, mergeID })\n }\n },\n [expanded, load],\n )\n\n if (!events.length) {\n return null\n }\n\n return (\n <div className={baseClass}>\n {events.map((event) => (\n <section className={`${baseClass}__event`} key={event.id}>\n <header className={`${baseClass}__header`}>\n <h3 className={`${baseClass}__when`}>\n {t('branching:mergedOn', {\n date: new Date(event.mergedAt).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }),\n })}\n </h3>\n <span className={`${baseClass}__meta`}>\n {event.mergedByLabel\n ? t('branching:mergedByCount', {\n count: event.changes.length,\n user: event.mergedByLabel,\n })\n : t('branching:mergedCount', { count: event.changes.length })}\n </span>\n </header>\n\n <ul className={`${baseClass}__list`}>\n {event.changes.map((change, changeIndex) => {\n const collectionConfig = change.globalSlug\n ? undefined\n : getEntityConfig({ collectionSlug: change.collectionSlug })\n const globalConfig = change.globalSlug\n ? getEntityConfig({ globalSlug: change.globalSlug })\n : undefined\n const key = `${event.id}-${changeIndex}`\n const isExpanded = expanded.has(key)\n const state = loaded[key]\n\n return (\n <li className={`${baseClass}__row`} key={key}>\n {/* Following `Collapsible` and the review list: an overlay button\n takes the clicks so the whole header opens the row, and the\n content sits above it with pointer events off. */}\n <div className={`${baseClass}__row-header`}>\n <button\n aria-expanded={isExpanded}\n className={`${baseClass}__toggle`}\n onClick={() => toggle({ changeIndex, key, mergeID: event.id })}\n type=\"button\"\n >\n <span>{change.docTitle}</span>\n </button>\n <div className={`${baseClass}__row-content`}>\n <Pill\n className={`${baseClass}__operation`}\n pillStyle={operationPillStyle[change.operation]}\n size=\"small\"\n >\n {t(`branching:operation_${change.operation}` as Parameters<typeof t>[0])}\n </Pill>\n <Pill className={`${baseClass}__entity`} pillStyle=\"light-gray\" size=\"small\">\n {getTranslation(\n globalConfig\n ? (globalConfig.label ?? change.globalSlug)\n : (collectionConfig?.labels?.singular ?? change.collectionSlug),\n i18n,\n )}\n </Pill>\n {/* A merged delete has no document left to open. A global has\n somewhere to go instead: its own edit view. */}\n {change.operation === 'delete' ? (\n <span className={`${baseClass}__title`}>{change.docTitle}</span>\n ) : (\n <Link\n className={`${baseClass}__title ${baseClass}__title--link`}\n href={formatAdminURL({\n adminRoute: config.routes.admin,\n path: change.globalSlug\n ? `/globals/${change.globalSlug}`\n : `/collections/${change.collectionSlug}/${change.docID}`,\n })}\n >\n {change.docTitle}\n </Link>\n )}\n <ChevronIcon\n className={`${baseClass}__indicator`}\n direction={isExpanded ? 'up' : 'down'}\n size={16}\n />\n </div>\n </div>\n\n {isExpanded && (\n <div className={`${baseClass}__diff`}>\n {state?.status === 'ready' ? state.result?.diff : null}\n {state?.status === 'loading' || !state ? (\n <ShimmerEffect height=\"3rem\" />\n ) : null}\n {state?.status === 'error' ? (\n <p className={`${baseClass}__error`}>{t('error:unknown')}</p>\n ) : null}\n </div>\n )}\n </li>\n )\n })}\n </ul>\n </section>\n ))}\n </div>\n )\n}\n"],"mappings":"AAAA;;;AAEA,SAASA,cAAc,QAAQ;AAC/B,SAASC,cAAc,QAAQ;AAC/B,OAAOC,KAAA,IAASC,WAAW,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAIrD,SAASC,IAAI,QAAQ;AACrB,SAASC,IAAI,QAAQ;AACrB,SAASC,aAAa,QAAQ;AAC9B,SAASC,WAAW,QAAQ;AAC5B,SAASC,SAAS,QAAQ;AAC1B,SAASC,kBAAkB,QAAQ;AACnC,SAASC,cAAc,QAAQ;AAC/B,OAAO;AAEP,MAAMC,SAAA,GAAY;AAuBlB,MAAMC,kBAAA,GAAqB;EACzBC,MAAA,EAAQ;EACRC,MAAA,EAAQ;EACRC,MAAA,EAAQ;AACV;AAEA;;;;;;;;;;;AAWA,OAAO,MAAMC,WAAA,GAAkDA,CAAC;EAAEC;AAAM,CAAE;EACxE,MAAM;IAAEC,MAAM;IAAEC;EAAe,CAAE,GAAGX,SAAA;EACpC,MAAM;IAAEY,IAAI;IAAEC;EAAC,CAAE,GAAGX,cAAA;EACpB,MAAM;IAAEY;EAAc,CAAE,GAAGb,kBAAA;EAE3B,MAAM,CAACc,QAAA,EAAUC,WAAA,CAAY,GAAGrB,QAAA,CAAsB,MAAM,IAAIsB,GAAA;EAChE,MAAM,CAACC,MAAA,EAAQC,SAAA,CAAU,GAAGxB,QAAA,CAAoC,CAAC;EAEjE,MAAMyB,SAAA,GAAY1B,MAAA,CAAOwB,MAAA;EACzBE,SAAA,CAAUC,OAAO,GAAGH,MAAA;EAEpB,MAAMI,IAAA,GAAO7B,WAAA,CACX,OAAO;IACL8B,WAAW;IACXC,GAAG;IACHC;EAAO,CAKR;IACC,IAAIL,SAAA,CAAUC,OAAO,CAACG,GAAA,CAAI,EAAE;MAC1B;IACF;IAEAL,SAAA,CAAWO,IAAA,KAAU;MAAE,GAAGA,IAAI;MAAE,CAACF,GAAA,GAAM;QAAEG,MAAA,EAAQ;MAAU;IAAE;IAE7D,IAAI;MACF,MAAMC,MAAA,GAAU,MAAMd,cAAA,CAAe;QACnCe,IAAA,EAAM;QACNC,IAAA,EAAM;UAAEP,WAAA;UAAaE;QAAQ;MAC/B;MAEAN,SAAA,CAAWO,MAAA,KAAU;QAAE,GAAGA,MAAI;QAAE,CAACF,GAAA,GAAM;UAAEI,MAAA;UAAQD,MAAA,EAAQ;QAAQ;MAAE;IACrE,EAAE,OAAOI,IAAA,EAAM;MACbZ,SAAA,CAAWO,MAAA,KAAU;QAAE,GAAGA,MAAI;QAAE,CAACF,GAAA,GAAM;UAAEG,MAAA,EAAQ;QAAQ;MAAE;IAC7D;EACF,GACA,CAACb,cAAA,CAAe;EAGlB,MAAMkB,MAAA,GAASvC,WAAA,CACb,CAAC;IAAE8B,WAAW,EAAXA,aAAW;IAAEC,GAAG,EAAHA,KAAG;IAAEC,OAAO,EAAPA;EAAO,CAAyD;IACnF;IACA;IACA;IACA,MAAMQ,UAAA,GAAa,CAAClB,QAAA,CAASmB,GAAG,CAACV,KAAA;IAEjCR,WAAA,CAAaU,MAAA;MACX,MAAMS,IAAA,GAAO,IAAIlB,GAAA,CAAIS,MAAA;MAErB,IAAIS,IAAA,CAAKD,GAAG,CAACV,KAAA,GAAM;QACjBW,IAAA,CAAK7B,MAAM,CAACkB,KAAA;MACd,OAAO;QACLW,IAAA,CAAKC,GAAG,CAACZ,KAAA;MACX;MAEA,OAAOW,IAAA;IACT;IAEA,IAAIF,UAAA,EAAY;MACd,KAAKX,IAAA,CAAK;QAAEC,WAAA,EAAAA,aAAA;QAAaC,GAAA,EAAAA,KAAA;QAAKC,OAAA,EAAAA;MAAQ;IACxC;EACF,GACA,CAACV,QAAA,EAAUO,IAAA,CAAK;EAGlB,IAAI,CAACb,MAAA,CAAO4B,MAAM,EAAE;IAClB,OAAO;EACT;EAEA,oBACEC,IAAA,CAAC;IAAIC,SAAA,EAAWpC,SAAA;cACbM,MAAA,CAAO+B,GAAG,CAAEC,KAAA,iBACXC,KAAA,CAAC;MAAQH,SAAA,EAAW,GAAGpC,SAAA,SAAkB;8BACvCuC,KAAA,CAAC;QAAOH,SAAA,EAAW,GAAGpC,SAAA,UAAmB;gCACvCmC,IAAA,CAAC;UAAGC,SAAA,EAAW,GAAGpC,SAAA,QAAiB;oBAChCU,CAAA,CAAE,sBAAsB;YACvB8B,IAAA,EAAM,IAAIC,IAAA,CAAKH,KAAA,CAAMI,QAAQ,EAAEC,cAAc,CAACC,SAAA,EAAW;cACvDC,SAAA,EAAW;cACXC,SAAA,EAAW;YACb;UACF;yBAEFX,IAAA,CAAC;UAAKC,SAAA,EAAW,GAAGpC,SAAA,QAAiB;oBAClCsC,KAAA,CAAMS,aAAa,GAChBrC,CAAA,CAAE,2BAA2B;YAC3BsC,KAAA,EAAOV,KAAA,CAAMW,OAAO,CAACf,MAAM;YAC3BgB,IAAA,EAAMZ,KAAA,CAAMS;UACd,KACArC,CAAA,CAAE,yBAAyB;YAAEsC,KAAA,EAAOV,KAAA,CAAMW,OAAO,CAACf;UAAO;;uBAIjEC,IAAA,CAAC;QAAGC,SAAA,EAAW,GAAGpC,SAAA,QAAiB;kBAChCsC,KAAA,CAAMW,OAAO,CAACZ,GAAG,CAAC,CAACc,MAAA,EAAQ/B,aAAA;UAC1B,MAAMgC,gBAAA,GAAmBD,MAAA,CAAOE,UAAU,GACtCT,SAAA,GACApC,eAAA,CAAgB;YAAE8C,cAAA,EAAgBH,MAAA,CAAOG;UAAe;UAC5D,MAAMC,YAAA,GAAeJ,MAAA,CAAOE,UAAU,GAClC7C,eAAA,CAAgB;YAAE6C,UAAA,EAAYF,MAAA,CAAOE;UAAW,KAChDT,SAAA;UACJ,MAAMvB,KAAA,GAAM,GAAGiB,KAAA,CAAMkB,EAAE,IAAIpC,aAAA,EAAa;UACxC,MAAMqC,UAAA,GAAa7C,QAAA,CAASmB,GAAG,CAACV,KAAA;UAChC,MAAMqC,KAAA,GAAQ3C,MAAM,CAACM,KAAA,CAAI;UAEzB,oBACEkB,KAAA,CAAC;YAAGH,SAAA,EAAW,GAAGpC,SAAA,OAAgB;oCAIhCuC,KAAA,CAAC;cAAIH,SAAA,EAAW,GAAGpC,SAAA,cAAuB;sCACxCmC,IAAA,CAAC;gBACC,iBAAesB,UAAA;gBACfrB,SAAA,EAAW,GAAGpC,SAAA,UAAmB;gBACjC2D,OAAA,EAASA,CAAA,KAAM9B,MAAA,CAAO;kBAAET,WAAA,EAAAA,aAAA;kBAAaC,GAAA,EAAAA,KAAA;kBAAKC,OAAA,EAASgB,KAAA,CAAMkB;gBAAG;gBAC5DI,IAAA,EAAK;0BAEL,aAAAzB,IAAA,CAAC;4BAAMgB,MAAA,CAAOU;;+BAEhBtB,KAAA,CAAC;gBAAIH,SAAA,EAAW,GAAGpC,SAAA,eAAwB;wCACzCmC,IAAA,CAACzC,IAAA;kBACC0C,SAAA,EAAW,GAAGpC,SAAA,aAAsB;kBACpC8D,SAAA,EAAW7D,kBAAkB,CAACkD,MAAA,CAAOY,SAAS,CAAC;kBAC/CC,IAAA,EAAK;4BAEJtD,CAAA,CAAE,uBAAuByC,MAAA,CAAOY,SAAS,EAAE;iCAE9C5B,IAAA,CAACzC,IAAA;kBAAK0C,SAAA,EAAW,GAAGpC,SAAA,UAAmB;kBAAE8D,SAAA,EAAU;kBAAaE,IAAA,EAAK;4BAClE7E,cAAA,CACCoE,YAAA,GACKA,YAAA,CAAaU,KAAK,IAAId,MAAA,CAAOE,UAAU,GACvCD,gBAAA,EAAkBc,MAAA,EAAQC,QAAA,IAAYhB,MAAA,CAAOG,cAAc,EAChE7C,IAAA;oBAKH0C,MAAA,CAAOY,SAAS,KAAK,wBACpB5B,IAAA,CAAC;kBAAKC,SAAA,EAAW,GAAGpC,SAAA,SAAkB;4BAAGmD,MAAA,CAAOU;kCAEhD1B,IAAA,CAAC1C,IAAA;kBACC2C,SAAA,EAAW,GAAGpC,SAAA,WAAoBA,SAAA,eAAwB;kBAC1DoE,IAAA,EAAMhF,cAAA,CAAe;oBACnBiF,UAAA,EAAY9D,MAAA,CAAO+D,MAAM,CAACC,KAAK;oBAC/BC,IAAA,EAAMrB,MAAA,CAAOE,UAAU,GACnB,YAAYF,MAAA,CAAOE,UAAU,EAAE,GAC/B,gBAAgBF,MAAA,CAAOG,cAAc,IAAIH,MAAA,CAAOsB,KAAK;kBAC3D;4BAECtB,MAAA,CAAOU;iCAGZ1B,IAAA,CAACvC,WAAA;kBACCwC,SAAA,EAAW,GAAGpC,SAAA,aAAsB;kBACpC0E,SAAA,EAAWjB,UAAA,GAAa,OAAO;kBAC/BO,IAAA,EAAM;;;gBAKXP,UAAA,iBACClB,KAAA,CAAC;cAAIH,SAAA,EAAW,GAAGpC,SAAA,QAAiB;yBACjC0D,KAAA,EAAOlC,MAAA,KAAW,UAAUkC,KAAA,CAAMjC,MAAM,EAAEkD,IAAA,GAAO,MACjDjB,KAAA,EAAOlC,MAAA,KAAW,aAAa,CAACkC,KAAA,gBAC/BvB,IAAA,CAACxC,aAAA;gBAAciF,MAAA,EAAO;mBACpB,MACHlB,KAAA,EAAOlC,MAAA,KAAW,uBACjBW,IAAA,CAAC;gBAAEC,SAAA,EAAW,GAAGpC,SAAA,SAAkB;0BAAGU,CAAA,CAAE;mBACtC;;aA9D+BW,KAAA;QAmE7C;;OApG4CiB,KAAA,CAAMkB,EAAE;;AA0GhE","ignoreList":[]}
@@ -0,0 +1,83 @@
1
+ @layer payload-default {
2
+ /* One line, stated plainly, above everything it qualifies. */
3
+ .scheduled-merges__banner {
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: space-between;
7
+ gap: var(--spacer-3);
8
+ margin-block-end: var(--spacer-3);
9
+ padding: var(--spacer-2) var(--spacer-3);
10
+ border: var(--stroke-width-small) solid var(--color-border-success);
11
+ border-radius: var(--radius-medium);
12
+ background: var(--color-bg-success-tertiary);
13
+ }
14
+
15
+ .scheduled-merges__banner-text {
16
+ min-width: 0;
17
+ }
18
+
19
+ .scheduled-merges__banner-actions {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: var(--spacer-2);
23
+ flex-shrink: 0;
24
+ }
25
+
26
+ .scheduled-merges__list {
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: var(--spacer-4);
30
+ }
31
+
32
+ .scheduled-merges__schedule-header {
33
+ display: flex;
34
+ align-items: baseline;
35
+ justify-content: space-between;
36
+ gap: var(--spacer-3);
37
+ margin-block-end: var(--spacer-2);
38
+ }
39
+
40
+ .scheduled-merges__when,
41
+ .scheduled-merges__manage-when {
42
+ margin: 0;
43
+ font-family: var(--text-body-medium-strong-font-family);
44
+ font-size: var(--text-body-medium-font-size);
45
+ font-weight: var(--text-body-medium-strong-font-weight);
46
+ }
47
+
48
+ .scheduled-merges__meta,
49
+ .scheduled-merges__empty {
50
+ color: var(--color-text-secondary);
51
+ }
52
+
53
+ .scheduled-merges__manage-list {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: var(--spacer-2);
57
+ margin: 0;
58
+ padding: 0;
59
+ list-style: none;
60
+ }
61
+
62
+ .scheduled-merges__manage-row {
63
+ display: flex;
64
+ align-items: flex-start;
65
+ justify-content: space-between;
66
+ gap: var(--spacer-3);
67
+ padding-block-end: var(--spacer-3);
68
+ border-block-end: var(--stroke-width-small) solid var(--color-border);
69
+ }
70
+
71
+ /* Stacked, so the date leads and the ledger reads underneath it. */
72
+ .scheduled-merges__manage-details {
73
+ display: flex;
74
+ flex-direction: column;
75
+ gap: var(--spacer-1);
76
+ min-width: 0;
77
+ }
78
+
79
+ .scheduled-merges__manage-row:last-child {
80
+ padding-block-end: 0;
81
+ border-block-end: none;
82
+ }
83
+ }
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import type { BranchChange } from '../ChangedDocuments/index.js';
3
+ import './index.css';
4
+ export type ScheduledMerge = {
5
+ /** The documents this schedule will apply, resolved against what is pending now. */
6
+ changes: BranchChange[];
7
+ closeBranch: boolean;
8
+ /** `payload-jobs` row ID, which is also the handle for cancelling it. */
9
+ id: string;
10
+ /** True when the schedule named no selection, so it takes whatever is pending. */
11
+ isEverything: boolean;
12
+ waitUntil: string;
13
+ };
14
+ /**
15
+ * What a branch is about to merge, and when.
16
+ *
17
+ * A banner says it in one line, because it changes what everything below it means: the
18
+ * pending changes are no longer only a proposal, they are a proposal with a date on it.
19
+ * Below that each schedule lists the documents it will apply, expandable to the same
20
+ * diff the review list shows — the diff is against main either way, so it is the same
21
+ * question asked about a future moment.
22
+ *
23
+ * Several schedules can coexist: schedule a merge, keep working, schedule another. The
24
+ * banner names the soonest and the modal holds the rest, which is why actions live
25
+ * there rather than being repeated per row.
26
+ */
27
+ export declare const ScheduledMerges: React.FC<{
28
+ branchID: number | string;
29
+ branchSlug: string;
30
+ schedules: ScheduledMerge[];
31
+ }>;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Branch/ScheduledMerges/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAGpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAiBhE,OAAO,aAAa,CAAA;AAIpB,MAAM,MAAM,cAAc,GAAG;IAC3B,oFAAoF;IACpF,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,WAAW,EAAE,OAAO,CAAA;IACpB,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAA;IACV,kFAAkF;IAClF,YAAY,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAKD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,cAAc,EAAE,CAAA;CAC5B,CA2HA,CAAA"}
@@ -0,0 +1,183 @@
1
+ 'use client';
2
+
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import React, { useCallback, useState } from 'react';
5
+ import { toast } from 'sonner';
6
+ import { Button } from '../../../elements/Button/index.js';
7
+ import { ChangeSummary } from '../../../elements/ChangeSummary/index.js';
8
+ import { DialogBody, DialogFooter, DialogHeader, DialogModal } from '../../../elements/Dialog/index.js';
9
+ import { useModal } from '../../../elements/Modal/index.js';
10
+ import { Pill } from '../../../elements/Pill/index.js';
11
+ import { useRouter } from '../../../providers/RouterAdapter/index.js';
12
+ import { useRouteTransition } from '../../../providers/RouteTransition/index.js';
13
+ import { useServerFunctions } from '../../../providers/ServerFunctions/index.js';
14
+ import { useTranslation } from '../../../providers/Translation/index.js';
15
+ import { ChangedDocuments } from '../ChangedDocuments/index.js';
16
+ import './index.css';
17
+ const baseClass = 'scheduled-merges';
18
+ const formatWhen = value => new Date(value).toLocaleString(undefined, {
19
+ dateStyle: 'long',
20
+ timeStyle: 'short'
21
+ });
22
+ /**
23
+ * What a branch is about to merge, and when.
24
+ *
25
+ * A banner says it in one line, because it changes what everything below it means: the
26
+ * pending changes are no longer only a proposal, they are a proposal with a date on it.
27
+ * Below that each schedule lists the documents it will apply, expandable to the same
28
+ * diff the review list shows — the diff is against main either way, so it is the same
29
+ * question asked about a future moment.
30
+ *
31
+ * Several schedules can coexist: schedule a merge, keep working, schedule another. The
32
+ * banner names the soonest and the modal holds the rest, which is why actions live
33
+ * there rather than being repeated per row.
34
+ */
35
+ export const ScheduledMerges = ({
36
+ branchID,
37
+ branchSlug,
38
+ schedules
39
+ }) => {
40
+ const {
41
+ t
42
+ } = useTranslation();
43
+ const {
44
+ closeModal,
45
+ openModal
46
+ } = useModal();
47
+ const {
48
+ serverFunction
49
+ } = useServerFunctions();
50
+ const router = useRouter();
51
+ const {
52
+ startRouteTransition
53
+ } = useRouteTransition();
54
+ const [isWorking, setIsWorking] = useState(false);
55
+ const modalSlug = `scheduled-merges-${branchID}`;
56
+ const soonest = schedules[0];
57
+ const handleCancel = useCallback(async deleteID => {
58
+ setIsWorking(true);
59
+ try {
60
+ await serverFunction({
61
+ name: 'schedule-merge',
62
+ args: {
63
+ deleteID
64
+ }
65
+ });
66
+ toast.success(t('branching:scheduleCancelled'));
67
+ closeModal(modalSlug);
68
+ startRouteTransition(() => router.refresh());
69
+ } catch (_err) {
70
+ toast.error(t('error:unknown'));
71
+ } finally {
72
+ setIsWorking(false);
73
+ }
74
+ }, [closeModal, modalSlug, router, serverFunction, startRouteTransition, t]);
75
+ if (!soonest) {
76
+ return null;
77
+ }
78
+ return /*#__PURE__*/_jsxs(React.Fragment, {
79
+ children: [/*#__PURE__*/_jsxs("div", {
80
+ className: `${baseClass}__banner`,
81
+ children: [/*#__PURE__*/_jsx("span", {
82
+ className: `${baseClass}__banner-text`,
83
+ children: t('branching:scheduledToMergeOn', {
84
+ date: formatWhen(soonest.waitUntil)
85
+ })
86
+ }), /*#__PURE__*/_jsxs("span", {
87
+ className: `${baseClass}__banner-actions`,
88
+ children: [schedules.length > 1 && /*#__PURE__*/_jsx(Pill, {
89
+ pillStyle: "light-gray",
90
+ size: "small",
91
+ children: t('branching:scheduleCount', {
92
+ count: schedules.length
93
+ })
94
+ }), /*#__PURE__*/_jsx(Button, {
95
+ buttonStyle: "secondary",
96
+ onClick: () => openModal(modalSlug),
97
+ size: "medium",
98
+ children: t('branching:manage')
99
+ })]
100
+ })]
101
+ }), /*#__PURE__*/_jsx("div", {
102
+ className: `${baseClass}__list`,
103
+ children: schedules.map(schedule => /*#__PURE__*/_jsxs("section", {
104
+ className: `${baseClass}__schedule`,
105
+ children: [/*#__PURE__*/_jsxs("header", {
106
+ className: `${baseClass}__schedule-header`,
107
+ children: [/*#__PURE__*/_jsx("h4", {
108
+ className: `${baseClass}__when`,
109
+ children: formatWhen(schedule.waitUntil)
110
+ }), /*#__PURE__*/_jsxs("span", {
111
+ className: `${baseClass}__meta`,
112
+ children: [schedule.isEverything ? t('branching:scheduleWillApplyAll', {
113
+ count: schedule.changes.length
114
+ }) : t('branching:scheduleWillApplySelected', {
115
+ count: schedule.changes.length
116
+ }), schedule.closeBranch ? ` · ${t('branching:closeBranchAfterMerge')}` : '']
117
+ })]
118
+ }), schedule.changes.length > 0 ?
119
+ // Read-only: what merges is decided, and the checkboxes on the review
120
+ // list below are for a different, immediate decision.
121
+ /*#__PURE__*/
122
+ _jsx(ChangedDocuments, {
123
+ branch: branchSlug,
124
+ changes: schedule.changes,
125
+ selectable: false
126
+ }) :
127
+ // A selection whose changes were all discarded since. The job will still
128
+ // fire and find nothing, which is harmless but worth saying.
129
+ /*#__PURE__*/
130
+ _jsx("p", {
131
+ className: `${baseClass}__empty`,
132
+ children: t('branching:scheduleHasNothingLeft')
133
+ })]
134
+ }, schedule.id))
135
+ }), /*#__PURE__*/_jsxs(DialogModal, {
136
+ className: baseClass,
137
+ closeOnBlur: true,
138
+ slug: modalSlug,
139
+ children: [/*#__PURE__*/_jsx(DialogHeader, {
140
+ showClose: true,
141
+ title: t('branching:scheduledMerges')
142
+ }), /*#__PURE__*/_jsx(DialogBody, {
143
+ children: /*#__PURE__*/_jsx("ul", {
144
+ className: `${baseClass}__manage-list`,
145
+ children: schedules.map(schedule_0 => /*#__PURE__*/_jsxs("li", {
146
+ className: `${baseClass}__manage-row`,
147
+ children: [/*#__PURE__*/_jsxs("div", {
148
+ className: `${baseClass}__manage-details`,
149
+ children: [/*#__PURE__*/_jsx("span", {
150
+ className: `${baseClass}__manage-when`,
151
+ children: formatWhen(schedule_0.waitUntil)
152
+ }), /*#__PURE__*/_jsxs("span", {
153
+ className: `${baseClass}__meta`,
154
+ children: [schedule_0.isEverything ? t('branching:scheduleWillApplyAll', {
155
+ count: schedule_0.changes.length
156
+ }) : t('branching:scheduleWillApplySelected', {
157
+ count: schedule_0.changes.length
158
+ }), schedule_0.closeBranch ? ` · ${t('branching:closeBranchAfterMerge')}` : '']
159
+ }), /*#__PURE__*/_jsx(ChangeSummary, {
160
+ changes: schedule_0.changes,
161
+ showOperations: true
162
+ })]
163
+ }), /*#__PURE__*/_jsx(Button, {
164
+ buttonStyle: "destructive",
165
+ disabled: isWorking,
166
+ onClick: () => void handleCancel(schedule_0.id),
167
+ size: "medium",
168
+ children: t('branching:cancelSchedule')
169
+ })]
170
+ }, schedule_0.id))
171
+ })
172
+ }), /*#__PURE__*/_jsx(DialogFooter, {
173
+ children: /*#__PURE__*/_jsx(Button, {
174
+ buttonStyle: "secondary",
175
+ onClick: () => closeModal(modalSlug),
176
+ size: "medium",
177
+ children: t('general:close')
178
+ })
179
+ })]
180
+ })]
181
+ });
182
+ };
183
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["React","useCallback","useState","toast","Button","ChangeSummary","DialogBody","DialogFooter","DialogHeader","DialogModal","useModal","Pill","useRouter","useRouteTransition","useServerFunctions","useTranslation","ChangedDocuments","baseClass","formatWhen","value","Date","toLocaleString","undefined","dateStyle","timeStyle","ScheduledMerges","branchID","branchSlug","schedules","t","closeModal","openModal","serverFunction","router","startRouteTransition","isWorking","setIsWorking","modalSlug","soonest","handleCancel","deleteID","name","args","success","refresh","_err","error","_jsxs","Fragment","className","_jsx","date","waitUntil","length","pillStyle","size","count","buttonStyle","onClick","map","schedule","isEverything","changes","closeBranch","branch","selectable","id","closeOnBlur","slug","showClose","title","showOperations","disabled"],"sources":["../../../../src/views/Branch/ScheduledMerges/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { useCallback, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport type { BranchChange } from '../ChangedDocuments/index.js'\n\nimport { Button } from '../../../elements/Button/index.js'\nimport { ChangeSummary } from '../../../elements/ChangeSummary/index.js'\nimport {\n DialogBody,\n DialogFooter,\n DialogHeader,\n DialogModal,\n} from '../../../elements/Dialog/index.js'\nimport { useModal } from '../../../elements/Modal/index.js'\nimport { Pill } from '../../../elements/Pill/index.js'\nimport { useRouter } from '../../../providers/RouterAdapter/index.js'\nimport { useRouteTransition } from '../../../providers/RouteTransition/index.js'\nimport { useServerFunctions } from '../../../providers/ServerFunctions/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { ChangedDocuments } from '../ChangedDocuments/index.js'\nimport './index.css'\n\nconst baseClass = 'scheduled-merges'\n\nexport type ScheduledMerge = {\n /** The documents this schedule will apply, resolved against what is pending now. */\n changes: BranchChange[]\n closeBranch: boolean\n /** `payload-jobs` row ID, which is also the handle for cancelling it. */\n id: string\n /** True when the schedule named no selection, so it takes whatever is pending. */\n isEverything: boolean\n waitUntil: string\n}\n\nconst formatWhen = (value: string) =>\n new Date(value).toLocaleString(undefined, { dateStyle: 'long', timeStyle: 'short' })\n\n/**\n * What a branch is about to merge, and when.\n *\n * A banner says it in one line, because it changes what everything below it means: the\n * pending changes are no longer only a proposal, they are a proposal with a date on it.\n * Below that each schedule lists the documents it will apply, expandable to the same\n * diff the review list shows — the diff is against main either way, so it is the same\n * question asked about a future moment.\n *\n * Several schedules can coexist: schedule a merge, keep working, schedule another. The\n * banner names the soonest and the modal holds the rest, which is why actions live\n * there rather than being repeated per row.\n */\nexport const ScheduledMerges: React.FC<{\n branchID: number | string\n branchSlug: string\n schedules: ScheduledMerge[]\n}> = ({ branchID, branchSlug, schedules }) => {\n const { t } = useTranslation()\n const { closeModal, openModal } = useModal()\n const { serverFunction } = useServerFunctions()\n const router = useRouter()\n const { startRouteTransition } = useRouteTransition()\n\n const [isWorking, setIsWorking] = useState(false)\n\n const modalSlug = `scheduled-merges-${branchID}`\n const soonest = schedules[0]\n\n const handleCancel = useCallback(\n async (deleteID: string) => {\n setIsWorking(true)\n\n try {\n await serverFunction({ name: 'schedule-merge', args: { deleteID } })\n toast.success(t('branching:scheduleCancelled'))\n closeModal(modalSlug)\n startRouteTransition(() => router.refresh())\n } catch (_err) {\n toast.error(t('error:unknown'))\n } finally {\n setIsWorking(false)\n }\n },\n [closeModal, modalSlug, router, serverFunction, startRouteTransition, t],\n )\n\n if (!soonest) {\n return null\n }\n\n return (\n <React.Fragment>\n <div className={`${baseClass}__banner`}>\n <span className={`${baseClass}__banner-text`}>\n {t('branching:scheduledToMergeOn', { date: formatWhen(soonest.waitUntil) })}\n </span>\n <span className={`${baseClass}__banner-actions`}>\n {schedules.length > 1 && (\n <Pill pillStyle=\"light-gray\" size=\"small\">\n {t('branching:scheduleCount', { count: schedules.length })}\n </Pill>\n )}\n <Button buttonStyle=\"secondary\" onClick={() => openModal(modalSlug)} size=\"medium\">\n {t('branching:manage')}\n </Button>\n </span>\n </div>\n\n <div className={`${baseClass}__list`}>\n {schedules.map((schedule) => (\n <section className={`${baseClass}__schedule`} key={schedule.id}>\n <header className={`${baseClass}__schedule-header`}>\n <h4 className={`${baseClass}__when`}>{formatWhen(schedule.waitUntil)}</h4>\n <span className={`${baseClass}__meta`}>\n {schedule.isEverything\n ? t('branching:scheduleWillApplyAll', { count: schedule.changes.length })\n : t('branching:scheduleWillApplySelected', { count: schedule.changes.length })}\n {schedule.closeBranch ? ` · ${t('branching:closeBranchAfterMerge')}` : ''}\n </span>\n </header>\n\n {schedule.changes.length > 0 ? (\n // Read-only: what merges is decided, and the checkboxes on the review\n // list below are for a different, immediate decision.\n <ChangedDocuments branch={branchSlug} changes={schedule.changes} selectable={false} />\n ) : (\n // A selection whose changes were all discarded since. The job will still\n // fire and find nothing, which is harmless but worth saying.\n <p className={`${baseClass}__empty`}>{t('branching:scheduleHasNothingLeft')}</p>\n )}\n </section>\n ))}\n </div>\n\n {/* Cancelling is the only reason to open this, so it is the action on every row\n rather than a footer CTA — and it is destructive, so it says so. Scheduling\n another belongs to the merge modal, which is one click away on the banner. */}\n <DialogModal className={baseClass} closeOnBlur slug={modalSlug}>\n <DialogHeader showClose title={t('branching:scheduledMerges')} />\n <DialogBody>\n <ul className={`${baseClass}__manage-list`}>\n {schedules.map((schedule) => (\n <li className={`${baseClass}__manage-row`} key={schedule.id}>\n <div className={`${baseClass}__manage-details`}>\n <span className={`${baseClass}__manage-when`}>\n {formatWhen(schedule.waitUntil)}\n </span>\n <span className={`${baseClass}__meta`}>\n {schedule.isEverything\n ? t('branching:scheduleWillApplyAll', { count: schedule.changes.length })\n : t('branching:scheduleWillApplySelected', {\n count: schedule.changes.length,\n })}\n {schedule.closeBranch ? ` · ${t('branching:closeBranchAfterMerge')}` : ''}\n </span>\n {/* What is actually merging, which is the thing a date alone does not\n say — and the reason someone opened this to cancel. */}\n <ChangeSummary changes={schedule.changes} showOperations />\n </div>\n <Button\n buttonStyle=\"destructive\"\n disabled={isWorking}\n onClick={() => void handleCancel(schedule.id)}\n size=\"medium\"\n >\n {t('branching:cancelSchedule')}\n </Button>\n </li>\n ))}\n </ul>\n </DialogBody>\n <DialogFooter>\n <Button buttonStyle=\"secondary\" onClick={() => closeModal(modalSlug)} size=\"medium\">\n {t('general:close')}\n </Button>\n </DialogFooter>\n </DialogModal>\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,77 @@
1
+ @layer payload-default {
2
+ /* The header band supplies the separation the list used to get from a margin
3
+ on the heading it replaced. */
4
+ .branch-changes {
5
+ padding-block-start: var(--spacer-3);
6
+ }
7
+
8
+ /* Matches `doc-controls`, the bar directly above it, so the two read as one
9
+ stack of header bands rather than a band and a heading. */
10
+ .branch-changes__controls {
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: space-between;
14
+ gap: var(--spacer-2);
15
+ width: 100%;
16
+ padding: var(--spacer-2-5) var(--gutter-h);
17
+ border-bottom: var(--stroke-width-small) solid var(--color-border);
18
+ background-color: var(--color-bg);
19
+ }
20
+
21
+ .branch-changes__title {
22
+ margin: 0;
23
+ font-family: var(--text-heading-medium-font-family);
24
+ font-size: var(--text-heading-medium-font-size);
25
+ font-weight: var(--text-heading-medium-font-weight);
26
+ line-height: var(--text-heading-medium-line-height);
27
+ letter-spacing: var(--text-heading-medium-letter-spacing);
28
+ }
29
+
30
+ .branch-changes__actions {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: var(--spacer-2);
34
+ flex-shrink: 0;
35
+ }
36
+
37
+ /* Separated by space rather than a rule: the section headings already divide them,
38
+ and a border here would compete with the bordered rows inside each. */
39
+ .branch-changes__section + .branch-changes__section {
40
+ margin-block-start: var(--spacer-6);
41
+ }
42
+
43
+ .branch-changes__section-title {
44
+ margin-block: 0 var(--spacer-2);
45
+ font-family: var(--text-body-large-strong-font-family);
46
+ font-size: var(--text-body-large-font-size);
47
+ font-weight: var(--text-body-large-strong-font-weight);
48
+ }
49
+
50
+ .branch-changes__history-pages {
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ gap: var(--spacer-3);
55
+ margin-block-start: var(--spacer-4);
56
+ }
57
+
58
+ .branch-changes__history-page[aria-disabled='true'] {
59
+ pointer-events: none;
60
+ color: var(--color-text-disabled);
61
+ }
62
+
63
+ .branch-changes__history-position,
64
+ .branch-changes__since,
65
+ .branch-changes__empty,
66
+ .branch-changes__closed {
67
+ color: var(--color-text-secondary);
68
+ }
69
+
70
+ .branch-changes__since {
71
+ margin-block: 0 var(--spacer-2);
72
+ }
73
+
74
+ .branch-changes__closed {
75
+ margin-block: 0 var(--spacer-3);
76
+ }
77
+ }