@multiplatform.one/backoffice 7.21.0 → 7.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/dist/cjs/chrome/BackofficeAwesomebar.native.js +1 -1
  2. package/dist/cjs/chrome/BackofficeAwesomebar.native.js.map +1 -1
  3. package/dist/cjs/chrome/CommandPalette.native.js +1 -1
  4. package/dist/cjs/chrome/CommandPalette.native.js.map +1 -1
  5. package/dist/cjs/chrome/HelpMenu.native.js +1 -1
  6. package/dist/cjs/chrome/HelpMenu.native.js.map +1 -1
  7. package/dist/cjs/chrome/NotificationsButton.native.js +1 -1
  8. package/dist/cjs/chrome/NotificationsButton.native.js.map +1 -1
  9. package/dist/cjs/chrome/UserMenu.native.js +1 -1
  10. package/dist/cjs/chrome/UserMenu.native.js.map +1 -1
  11. package/dist/cjs/chrome/awesomebar-data.native.js.map +1 -1
  12. package/dist/cjs/chrome/command-palette-model.native.js +1 -1
  13. package/dist/cjs/chrome/command-palette-model.native.js.map +1 -1
  14. package/dist/cjs/chrome/help-about-dialog.native.js +1 -1
  15. package/dist/cjs/chrome/help-about-dialog.native.js.map +1 -1
  16. package/dist/cjs/chrome/help-shortcuts-dialog.native.js +1 -1
  17. package/dist/cjs/chrome/help-shortcuts-dialog.native.js.map +1 -1
  18. package/dist/cjs/chrome/notifications-data.native.js.map +1 -1
  19. package/dist/cjs/chrome/notifications-panel.native.js +1 -1
  20. package/dist/cjs/chrome/notifications-panel.native.js.map +1 -1
  21. package/dist/cjs/chrome/notifications-utils.native.js.map +1 -1
  22. package/dist/cjs/chrome/shortcuts.native.js.map +1 -1
  23. package/dist/cjs/chrome/user-session.native.js.map +1 -1
  24. package/dist/cjs/config/BackofficeProvider.native.js +1 -1
  25. package/dist/cjs/config/BackofficeProvider.native.js.map +1 -1
  26. package/dist/cjs/config/capabilities.native.js.map +1 -1
  27. package/dist/cjs/config/events.native.js.map +1 -1
  28. package/dist/cjs/config/slots.native.js.map +1 -1
  29. package/dist/cjs/desk/Desk.native.js.map +1 -1
  30. package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
  31. package/dist/cjs/desk/resolveDeskPath.native.js.map +1 -1
  32. package/dist/cjs/desk/scope.native.js.map +1 -1
  33. package/dist/cjs/desk/target.native.js.map +1 -1
  34. package/dist/cjs/form/DocFormScreen.native.js +1 -1
  35. package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
  36. package/dist/cjs/form/FormConnections.native.js +1 -1
  37. package/dist/cjs/form/FormConnections.native.js.map +1 -1
  38. package/dist/cjs/form/FormDialogs.native.js +1 -1
  39. package/dist/cjs/form/FormDialogs.native.js.map +1 -1
  40. package/dist/cjs/form/FormErrorBoundary.native.js +1 -1
  41. package/dist/cjs/form/FormErrorBoundary.native.js.map +1 -1
  42. package/dist/cjs/form/FormHeaderCluster.native.js +1 -1
  43. package/dist/cjs/form/FormHeaderCluster.native.js.map +1 -1
  44. package/dist/cjs/form/FormSidebarPanel.native.js +1 -1
  45. package/dist/cjs/form/FormSidebarPanel.native.js.map +1 -1
  46. package/dist/cjs/form/FormTimeline.native.js +1 -1
  47. package/dist/cjs/form/FormTimeline.native.js.map +1 -1
  48. package/dist/cjs/form/FormToolbar.native.js +1 -1
  49. package/dist/cjs/form/FormToolbar.native.js.map +1 -1
  50. package/dist/cjs/form/connections-data.native.js.map +1 -1
  51. package/dist/cjs/form/createPrefill.native.js.map +1 -1
  52. package/dist/cjs/form/dependsOn.native.js.map +1 -1
  53. package/dist/cjs/form/dirtyTracking.native.js.map +1 -1
  54. package/dist/cjs/form/docinfo.native.js.map +1 -1
  55. package/dist/cjs/form/fetchFrom.native.js.map +1 -1
  56. package/dist/cjs/form/fieldPermissions.native.js.map +1 -1
  57. package/dist/cjs/form/formActions.native.js.map +1 -1
  58. package/dist/cjs/form/formLayout.native.js.map +1 -1
  59. package/dist/cjs/form/platformHooks.native.js.map +1 -1
  60. package/dist/cjs/form/sidebar-attachments.native.js +1 -1
  61. package/dist/cjs/form/sidebar-attachments.native.js.map +1 -1
  62. package/dist/cjs/form/sidebar-dialogs.native.js +1 -1
  63. package/dist/cjs/form/sidebar-dialogs.native.js.map +1 -1
  64. package/dist/cjs/form/sidebar-people.native.js +1 -1
  65. package/dist/cjs/form/sidebar-people.native.js.map +1 -1
  66. package/dist/cjs/form/sidebar-rpc.native.js.map +1 -1
  67. package/dist/cjs/form/sidebar-utils.native.js.map +1 -1
  68. package/dist/cjs/form/timeline-entries.native.js.map +1 -1
  69. package/dist/cjs/form/timeline-utils.native.js.map +1 -1
  70. package/dist/cjs/form/useFormEngine.native.js.map +1 -1
  71. package/dist/cjs/i18n/en.native.js.map +1 -1
  72. package/dist/cjs/i18n/index.native.js.map +1 -1
  73. package/dist/cjs/index.native.js +1 -1
  74. package/dist/cjs/index.native.js.map +1 -1
  75. package/dist/cjs/list/AddTagsDialog.native.js +1 -1
  76. package/dist/cjs/list/AddTagsDialog.native.js.map +1 -1
  77. package/dist/cjs/list/AssignToDialog.native.js +1 -1
  78. package/dist/cjs/list/AssignToDialog.native.js.map +1 -1
  79. package/dist/cjs/list/DoctypeListScreen.cjs +3 -20
  80. package/dist/cjs/list/DoctypeListScreen.native.js +5 -20
  81. package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
  82. package/dist/cjs/list/ListBulkActionsBar.native.js +1 -1
  83. package/dist/cjs/list/ListBulkActionsBar.native.js.map +1 -1
  84. package/dist/cjs/list/ListFilterBar.native.js +1 -1
  85. package/dist/cjs/list/ListFilterBar.native.js.map +1 -1
  86. package/dist/cjs/list/ListSidebar.native.js +1 -1
  87. package/dist/cjs/list/ListSidebar.native.js.map +1 -1
  88. package/dist/cjs/list/bulk-edit-dialog.native.js +1 -1
  89. package/dist/cjs/list/bulk-edit-dialog.native.js.map +1 -1
  90. package/dist/cjs/list/bulk-export.native.js.map +1 -1
  91. package/dist/cjs/list/bulk-submit-cancel.native.js.map +1 -1
  92. package/dist/cjs/list/bulkActions.native.js.map +1 -1
  93. package/dist/cjs/list/filter-chips.cjs +3 -3
  94. package/dist/cjs/list/filter-chips.native.js +4 -4
  95. package/dist/cjs/list/filter-chips.native.js.map +1 -1
  96. package/dist/cjs/list/filter-editor.cjs +10 -11
  97. package/dist/cjs/list/filter-editor.native.js +11 -12
  98. package/dist/cjs/list/filter-editor.native.js.map +1 -1
  99. package/dist/cjs/list/filter-fields.cjs +15 -267
  100. package/dist/cjs/list/filter-fields.native.js +15 -337
  101. package/dist/cjs/list/filter-fields.native.js.map +1 -1
  102. package/dist/cjs/list/filter-saved.native.js +1 -1
  103. package/dist/cjs/list/filter-saved.native.js.map +1 -1
  104. package/dist/cjs/list/filter-sort.native.js +1 -1
  105. package/dist/cjs/list/filter-sort.native.js.map +1 -1
  106. package/dist/cjs/list/filter-standard.cjs +5 -6
  107. package/dist/cjs/list/filter-standard.native.js +5 -6
  108. package/dist/cjs/list/filter-standard.native.js.map +1 -1
  109. package/dist/cjs/list/filterConversion.native.js.map +1 -1
  110. package/dist/cjs/list/list-tools-sheet.cjs +2 -2
  111. package/dist/cjs/list/list-tools-sheet.native.js +3 -3
  112. package/dist/cjs/list/list-tools-sheet.native.js.map +1 -1
  113. package/dist/cjs/list/listColumns.cjs +2 -371
  114. package/dist/cjs/list/listColumns.native.js +2 -418
  115. package/dist/cjs/list/listColumns.native.js.map +1 -1
  116. package/dist/cjs/list/listFields.cjs +4 -24
  117. package/dist/cjs/list/listFields.native.js +4 -50
  118. package/dist/cjs/list/listFields.native.js.map +1 -1
  119. package/dist/cjs/list/listFormat.cjs +7 -42
  120. package/dist/cjs/list/listFormat.native.js +7 -45
  121. package/dist/cjs/list/listFormat.native.js.map +1 -1
  122. package/dist/cjs/list/listUrlState.native.js.map +1 -1
  123. package/dist/cjs/list/sidebar-section.native.js +1 -1
  124. package/dist/cjs/list/sidebar-section.native.js.map +1 -1
  125. package/dist/cjs/list/sidebar-stats.native.js.map +1 -1
  126. package/dist/cjs/list/statusColors.cjs +2 -76
  127. package/dist/cjs/list/statusColors.native.js +2 -80
  128. package/dist/cjs/list/statusColors.native.js.map +1 -1
  129. package/dist/cjs/navigation/navigator.native.js.map +1 -1
  130. package/dist/cjs/navigation/paths.native.js.map +1 -1
  131. package/dist/cjs/oneAdapter/index.native.js.map +1 -1
  132. package/dist/cjs/quickEntry/QuickEntryDialog.native.js +1 -1
  133. package/dist/cjs/quickEntry/QuickEntryDialog.native.js.map +1 -1
  134. package/dist/cjs/quickEntry/quickEntryPlan.native.js.map +1 -1
  135. package/dist/cjs/report/DoctypeReportView.native.js +1 -1
  136. package/dist/cjs/report/DoctypeReportView.native.js.map +1 -1
  137. package/dist/cjs/report/QueryReportScreen.native.js +1 -1
  138. package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
  139. package/dist/cjs/report/queryReportColumns.cjs +2 -2
  140. package/dist/cjs/report/queryReportColumns.native.js +2 -2
  141. package/dist/cjs/report/queryReportColumns.native.js.map +1 -1
  142. package/dist/cjs/report/queryReportFilterBar.cjs +5 -6
  143. package/dist/cjs/report/queryReportFilterBar.native.js +6 -7
  144. package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
  145. package/dist/cjs/report/queryReportUrlState.native.js.map +1 -1
  146. package/dist/cjs/report/report-grid.cjs +2 -2
  147. package/dist/cjs/report/report-grid.native.js +3 -3
  148. package/dist/cjs/report/report-grid.native.js.map +1 -1
  149. package/dist/cjs/report/report-toolbar.cjs +2 -2
  150. package/dist/cjs/report/report-toolbar.native.js +3 -3
  151. package/dist/cjs/report/report-toolbar.native.js.map +1 -1
  152. package/dist/cjs/report/reportShapes.native.js.map +1 -1
  153. package/dist/cjs/report/reportViewModel.cjs +3 -3
  154. package/dist/cjs/report/reportViewModel.native.js +3 -3
  155. package/dist/cjs/report/reportViewModel.native.js.map +1 -1
  156. package/dist/cjs/report/savedReports.native.js.map +1 -1
  157. package/dist/cjs/report/useQueryReport.native.js.map +1 -1
  158. package/dist/cjs/shared/deskLinks.native.js.map +1 -1
  159. package/dist/cjs/shared/listNavContext.native.js.map +1 -1
  160. package/dist/cjs/shared/types.native.js.map +1 -1
  161. package/dist/cjs/shared/useDocinfo.native.js.map +1 -1
  162. package/dist/cjs/shared/useDoctypeMeta.native.js.map +1 -1
  163. package/dist/cjs/shared/useFrappeApp.cjs +7 -3
  164. package/dist/cjs/shared/useFrappeApp.native.js +8 -4
  165. package/dist/cjs/shared/useFrappeApp.native.js.map +1 -1
  166. package/dist/cjs/shared/useRecentVisit.native.js.map +1 -1
  167. package/dist/cjs/shared/useSessionUserId.native.js.map +1 -1
  168. package/dist/cjs/shared/useSlugTarget.native.js.map +1 -1
  169. package/dist/cjs/shared/useUserRoles.native.js.map +1 -1
  170. package/dist/cjs/shell/BackofficeShell.native.js +1 -1
  171. package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
  172. package/dist/cjs/shell/HomeRedirect.native.js +1 -1
  173. package/dist/cjs/shell/HomeRedirect.native.js.map +1 -1
  174. package/dist/cjs/shell/NotFoundScreen.native.js +1 -1
  175. package/dist/cjs/shell/NotFoundScreen.native.js.map +1 -1
  176. package/dist/cjs/shell/SlugScreen.native.js +1 -1
  177. package/dist/cjs/shell/SlugScreen.native.js.map +1 -1
  178. package/dist/cjs/shell/WorkspaceSidebar.native.js +1 -1
  179. package/dist/cjs/shell/WorkspaceSidebar.native.js.map +1 -1
  180. package/dist/cjs/shell/useWorkspaces.native.js.map +1 -1
  181. package/dist/cjs/shell/workspaceIcons.native.js.map +1 -1
  182. package/dist/cjs/views/CalendarView.native.js +1 -1
  183. package/dist/cjs/views/CalendarView.native.js.map +1 -1
  184. package/dist/cjs/views/DashboardView.native.js +1 -1
  185. package/dist/cjs/views/DashboardView.native.js.map +1 -1
  186. package/dist/cjs/views/DoctypeViewScreen.native.js.map +1 -1
  187. package/dist/cjs/views/ImageView.native.js +1 -1
  188. package/dist/cjs/views/ImageView.native.js.map +1 -1
  189. package/dist/cjs/views/KanbanView.native.js +1 -1
  190. package/dist/cjs/views/KanbanView.native.js.map +1 -1
  191. package/dist/cjs/views/ReportView.native.js +1 -1
  192. package/dist/cjs/views/ReportView.native.js.map +1 -1
  193. package/dist/cjs/views/TreeView.native.js +1 -1
  194. package/dist/cjs/views/TreeView.native.js.map +1 -1
  195. package/dist/cjs/views/ViewHeader.native.js +1 -1
  196. package/dist/cjs/views/ViewHeader.native.js.map +1 -1
  197. package/dist/cjs/views/ViewStates.native.js +1 -1
  198. package/dist/cjs/views/ViewStates.native.js.map +1 -1
  199. package/dist/cjs/views/ViewSwitcherMenu.native.js +1 -1
  200. package/dist/cjs/views/ViewSwitcherMenu.native.js.map +1 -1
  201. package/dist/cjs/views/calendar-field-selector.native.js +1 -1
  202. package/dist/cjs/views/calendar-field-selector.native.js.map +1 -1
  203. package/dist/cjs/views/connection.native.js.map +1 -1
  204. package/dist/cjs/views/dashboard-data.native.js.map +1 -1
  205. package/dist/cjs/views/deskViewConfigs.native.js.map +1 -1
  206. package/dist/cjs/views/kanban-board-controls.native.js +1 -1
  207. package/dist/cjs/views/kanban-board-controls.native.js.map +1 -1
  208. package/dist/cjs/views/kanban-field-picker.native.js +1 -1
  209. package/dist/cjs/views/kanban-field-picker.native.js.map +1 -1
  210. package/dist/cjs/views/kanbanBoardOps.native.js.map +1 -1
  211. package/dist/cjs/views/report-controls.native.js +1 -1
  212. package/dist/cjs/views/report-controls.native.js.map +1 -1
  213. package/dist/cjs/views/viewAvailability.native.js.map +1 -1
  214. package/dist/cjs/views/viewMeta.native.js.map +1 -1
  215. package/dist/cjs/workspace/WorkspaceChartBlock.native.js +1 -1
  216. package/dist/cjs/workspace/WorkspaceChartBlock.native.js.map +1 -1
  217. package/dist/cjs/workspace/WorkspaceGrid.native.js.map +1 -1
  218. package/dist/cjs/workspace/WorkspaceLinkCard.native.js +1 -1
  219. package/dist/cjs/workspace/WorkspaceLinkCard.native.js.map +1 -1
  220. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js +1 -1
  221. package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  222. package/dist/cjs/workspace/WorkspaceNumberCard.native.js +1 -1
  223. package/dist/cjs/workspace/WorkspaceNumberCard.native.js.map +1 -1
  224. package/dist/cjs/workspace/WorkspaceQuickList.native.js +1 -1
  225. package/dist/cjs/workspace/WorkspaceQuickList.native.js.map +1 -1
  226. package/dist/cjs/workspace/WorkspaceRecents.native.js +1 -1
  227. package/dist/cjs/workspace/WorkspaceRecents.native.js.map +1 -1
  228. package/dist/cjs/workspace/WorkspaceScreen.native.js +1 -1
  229. package/dist/cjs/workspace/WorkspaceScreen.native.js.map +1 -1
  230. package/dist/cjs/workspace/WorkspaceShortcut.native.js +1 -1
  231. package/dist/cjs/workspace/WorkspaceShortcut.native.js.map +1 -1
  232. package/dist/cjs/workspace/parseContent.native.js.map +1 -1
  233. package/dist/cjs/workspace/types.native.js.map +1 -1
  234. package/dist/cjs/workspace/useDashboardChart.native.js.map +1 -1
  235. package/dist/cjs/workspace/useWorkspaceDoc.native.js.map +1 -1
  236. package/dist/esm/chrome/BackofficeAwesomebar.native.js.map +1 -1
  237. package/dist/esm/chrome/CommandPalette.native.js.map +1 -1
  238. package/dist/esm/chrome/HelpMenu.native.js.map +1 -1
  239. package/dist/esm/chrome/NotificationsButton.native.js.map +1 -1
  240. package/dist/esm/chrome/UserMenu.native.js.map +1 -1
  241. package/dist/esm/chrome/awesomebar-data.native.js.map +1 -1
  242. package/dist/esm/chrome/command-palette-model.native.js.map +1 -1
  243. package/dist/esm/chrome/help-about-dialog.native.js.map +1 -1
  244. package/dist/esm/chrome/help-shortcuts-dialog.native.js.map +1 -1
  245. package/dist/esm/chrome/notifications-data.native.js.map +1 -1
  246. package/dist/esm/chrome/notifications-panel.native.js.map +1 -1
  247. package/dist/esm/chrome/notifications-utils.native.js.map +1 -1
  248. package/dist/esm/chrome/shortcuts.native.js.map +1 -1
  249. package/dist/esm/chrome/user-session.native.js.map +1 -1
  250. package/dist/esm/config/BackofficeProvider.native.js.map +1 -1
  251. package/dist/esm/config/capabilities.native.js.map +1 -1
  252. package/dist/esm/config/events.native.js.map +1 -1
  253. package/dist/esm/config/slots.native.js.map +1 -1
  254. package/dist/esm/desk/Desk.native.js.map +1 -1
  255. package/dist/esm/desk/DeskSurface.native.js.map +1 -1
  256. package/dist/esm/desk/resolveDeskPath.native.js.map +1 -1
  257. package/dist/esm/desk/scope.native.js.map +1 -1
  258. package/dist/esm/desk/target.native.js.map +1 -1
  259. package/dist/esm/form/DocFormScreen.native.js.map +1 -1
  260. package/dist/esm/form/FormConnections.native.js.map +1 -1
  261. package/dist/esm/form/FormDialogs.native.js.map +1 -1
  262. package/dist/esm/form/FormErrorBoundary.native.js.map +1 -1
  263. package/dist/esm/form/FormHeaderCluster.native.js.map +1 -1
  264. package/dist/esm/form/FormSidebarPanel.native.js.map +1 -1
  265. package/dist/esm/form/FormTimeline.native.js.map +1 -1
  266. package/dist/esm/form/FormToolbar.native.js.map +1 -1
  267. package/dist/esm/form/connections-data.native.js.map +1 -1
  268. package/dist/esm/form/createPrefill.native.js.map +1 -1
  269. package/dist/esm/form/dependsOn.native.js.map +1 -1
  270. package/dist/esm/form/dirtyTracking.native.js.map +1 -1
  271. package/dist/esm/form/docinfo.native.js.map +1 -1
  272. package/dist/esm/form/fetchFrom.native.js.map +1 -1
  273. package/dist/esm/form/fieldPermissions.native.js.map +1 -1
  274. package/dist/esm/form/formActions.native.js.map +1 -1
  275. package/dist/esm/form/formLayout.native.js.map +1 -1
  276. package/dist/esm/form/platformHooks.native.js.map +1 -1
  277. package/dist/esm/form/sidebar-attachments.native.js.map +1 -1
  278. package/dist/esm/form/sidebar-dialogs.native.js.map +1 -1
  279. package/dist/esm/form/sidebar-people.native.js.map +1 -1
  280. package/dist/esm/form/sidebar-rpc.native.js.map +1 -1
  281. package/dist/esm/form/sidebar-utils.native.js.map +1 -1
  282. package/dist/esm/form/timeline-entries.native.js.map +1 -1
  283. package/dist/esm/form/timeline-utils.native.js.map +1 -1
  284. package/dist/esm/form/useFormEngine.native.js.map +1 -1
  285. package/dist/esm/i18n/en.native.js.map +1 -1
  286. package/dist/esm/i18n/index.native.js.map +1 -1
  287. package/dist/esm/index.native.js.map +1 -1
  288. package/dist/esm/list/AddTagsDialog.native.js.map +1 -1
  289. package/dist/esm/list/AssignToDialog.native.js.map +1 -1
  290. package/dist/esm/list/DoctypeListScreen.mjs +2 -19
  291. package/dist/esm/list/DoctypeListScreen.mjs.map +1 -1
  292. package/dist/esm/list/DoctypeListScreen.native.js +3 -18
  293. package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
  294. package/dist/esm/list/ListBulkActionsBar.native.js.map +1 -1
  295. package/dist/esm/list/ListFilterBar.native.js.map +1 -1
  296. package/dist/esm/list/ListSidebar.native.js.map +1 -1
  297. package/dist/esm/list/bulk-edit-dialog.native.js.map +1 -1
  298. package/dist/esm/list/bulk-export.native.js.map +1 -1
  299. package/dist/esm/list/bulk-submit-cancel.native.js.map +1 -1
  300. package/dist/esm/list/bulkActions.native.js.map +1 -1
  301. package/dist/esm/list/filter-chips.mjs +1 -1
  302. package/dist/esm/list/filter-chips.native.js +1 -1
  303. package/dist/esm/list/filter-chips.native.js.map +1 -1
  304. package/dist/esm/list/filter-editor.mjs +1 -2
  305. package/dist/esm/list/filter-editor.mjs.map +1 -1
  306. package/dist/esm/list/filter-editor.native.js +1 -2
  307. package/dist/esm/list/filter-editor.native.js.map +1 -1
  308. package/dist/esm/list/filter-fields.mjs +1 -253
  309. package/dist/esm/list/filter-fields.mjs.map +1 -1
  310. package/dist/esm/list/filter-fields.native.js +1 -323
  311. package/dist/esm/list/filter-fields.native.js.map +1 -1
  312. package/dist/esm/list/filter-saved.native.js.map +1 -1
  313. package/dist/esm/list/filter-sort.native.js.map +1 -1
  314. package/dist/esm/list/filter-standard.mjs +1 -2
  315. package/dist/esm/list/filter-standard.mjs.map +1 -1
  316. package/dist/esm/list/filter-standard.native.js +1 -2
  317. package/dist/esm/list/filter-standard.native.js.map +1 -1
  318. package/dist/esm/list/filterConversion.native.js.map +1 -1
  319. package/dist/esm/list/list-tools-sheet.mjs +1 -1
  320. package/dist/esm/list/list-tools-sheet.native.js +1 -1
  321. package/dist/esm/list/list-tools-sheet.native.js.map +1 -1
  322. package/dist/esm/list/listColumns.mjs +1 -370
  323. package/dist/esm/list/listColumns.mjs.map +1 -1
  324. package/dist/esm/list/listColumns.native.js +1 -417
  325. package/dist/esm/list/listColumns.native.js.map +1 -1
  326. package/dist/esm/list/listFields.mjs +1 -21
  327. package/dist/esm/list/listFields.mjs.map +1 -1
  328. package/dist/esm/list/listFields.native.js +1 -47
  329. package/dist/esm/list/listFields.native.js.map +1 -1
  330. package/dist/esm/list/listFormat.mjs +1 -36
  331. package/dist/esm/list/listFormat.mjs.map +1 -1
  332. package/dist/esm/list/listFormat.native.js +1 -39
  333. package/dist/esm/list/listFormat.native.js.map +1 -1
  334. package/dist/esm/list/listUrlState.native.js.map +1 -1
  335. package/dist/esm/list/sidebar-section.native.js.map +1 -1
  336. package/dist/esm/list/sidebar-stats.native.js.map +1 -1
  337. package/dist/esm/list/statusColors.mjs +1 -75
  338. package/dist/esm/list/statusColors.mjs.map +1 -1
  339. package/dist/esm/list/statusColors.native.js +1 -79
  340. package/dist/esm/list/statusColors.native.js.map +1 -1
  341. package/dist/esm/navigation/navigator.native.js.map +1 -1
  342. package/dist/esm/navigation/paths.native.js.map +1 -1
  343. package/dist/esm/oneAdapter/index.native.js.map +1 -1
  344. package/dist/esm/quickEntry/QuickEntryDialog.native.js.map +1 -1
  345. package/dist/esm/quickEntry/quickEntryPlan.native.js.map +1 -1
  346. package/dist/esm/report/DoctypeReportView.native.js.map +1 -1
  347. package/dist/esm/report/QueryReportScreen.native.js.map +1 -1
  348. package/dist/esm/report/queryReportColumns.mjs +1 -1
  349. package/dist/esm/report/queryReportColumns.native.js +1 -1
  350. package/dist/esm/report/queryReportColumns.native.js.map +1 -1
  351. package/dist/esm/report/queryReportFilterBar.mjs +1 -2
  352. package/dist/esm/report/queryReportFilterBar.mjs.map +1 -1
  353. package/dist/esm/report/queryReportFilterBar.native.js +1 -2
  354. package/dist/esm/report/queryReportFilterBar.native.js.map +1 -1
  355. package/dist/esm/report/queryReportUrlState.native.js.map +1 -1
  356. package/dist/esm/report/report-grid.mjs +1 -1
  357. package/dist/esm/report/report-grid.native.js +1 -1
  358. package/dist/esm/report/report-grid.native.js.map +1 -1
  359. package/dist/esm/report/report-toolbar.mjs +1 -1
  360. package/dist/esm/report/report-toolbar.native.js +1 -1
  361. package/dist/esm/report/report-toolbar.native.js.map +1 -1
  362. package/dist/esm/report/reportShapes.native.js.map +1 -1
  363. package/dist/esm/report/reportViewModel.mjs +1 -1
  364. package/dist/esm/report/reportViewModel.mjs.map +1 -1
  365. package/dist/esm/report/reportViewModel.native.js +1 -1
  366. package/dist/esm/report/reportViewModel.native.js.map +1 -1
  367. package/dist/esm/report/savedReports.native.js.map +1 -1
  368. package/dist/esm/report/useQueryReport.native.js.map +1 -1
  369. package/dist/esm/shared/deskLinks.native.js.map +1 -1
  370. package/dist/esm/shared/listNavContext.native.js.map +1 -1
  371. package/dist/esm/shared/types.native.js.map +1 -1
  372. package/dist/esm/shared/useDocinfo.native.js.map +1 -1
  373. package/dist/esm/shared/useDoctypeMeta.native.js.map +1 -1
  374. package/dist/esm/shared/useFrappeApp.mjs +7 -3
  375. package/dist/esm/shared/useFrappeApp.mjs.map +1 -1
  376. package/dist/esm/shared/useFrappeApp.native.js +8 -4
  377. package/dist/esm/shared/useFrappeApp.native.js.map +1 -1
  378. package/dist/esm/shared/useRecentVisit.native.js.map +1 -1
  379. package/dist/esm/shared/useSessionUserId.native.js.map +1 -1
  380. package/dist/esm/shared/useSlugTarget.native.js.map +1 -1
  381. package/dist/esm/shared/useUserRoles.native.js.map +1 -1
  382. package/dist/esm/shell/BackofficeShell.native.js.map +1 -1
  383. package/dist/esm/shell/HomeRedirect.native.js.map +1 -1
  384. package/dist/esm/shell/NotFoundScreen.native.js.map +1 -1
  385. package/dist/esm/shell/SlugScreen.native.js.map +1 -1
  386. package/dist/esm/shell/WorkspaceSidebar.native.js.map +1 -1
  387. package/dist/esm/shell/useWorkspaces.native.js.map +1 -1
  388. package/dist/esm/shell/workspaceIcons.native.js.map +1 -1
  389. package/dist/esm/views/CalendarView.native.js.map +1 -1
  390. package/dist/esm/views/DashboardView.native.js.map +1 -1
  391. package/dist/esm/views/DoctypeViewScreen.native.js.map +1 -1
  392. package/dist/esm/views/ImageView.native.js.map +1 -1
  393. package/dist/esm/views/KanbanView.native.js.map +1 -1
  394. package/dist/esm/views/ReportView.native.js.map +1 -1
  395. package/dist/esm/views/TreeView.native.js.map +1 -1
  396. package/dist/esm/views/ViewHeader.native.js.map +1 -1
  397. package/dist/esm/views/ViewStates.native.js.map +1 -1
  398. package/dist/esm/views/ViewSwitcherMenu.native.js.map +1 -1
  399. package/dist/esm/views/calendar-field-selector.native.js.map +1 -1
  400. package/dist/esm/views/connection.native.js.map +1 -1
  401. package/dist/esm/views/dashboard-data.native.js.map +1 -1
  402. package/dist/esm/views/deskViewConfigs.native.js.map +1 -1
  403. package/dist/esm/views/kanban-board-controls.native.js.map +1 -1
  404. package/dist/esm/views/kanban-field-picker.native.js.map +1 -1
  405. package/dist/esm/views/kanbanBoardOps.native.js.map +1 -1
  406. package/dist/esm/views/report-controls.native.js.map +1 -1
  407. package/dist/esm/views/viewAvailability.native.js.map +1 -1
  408. package/dist/esm/views/viewMeta.native.js.map +1 -1
  409. package/dist/esm/workspace/WorkspaceChartBlock.native.js.map +1 -1
  410. package/dist/esm/workspace/WorkspaceGrid.native.js.map +1 -1
  411. package/dist/esm/workspace/WorkspaceLinkCard.native.js.map +1 -1
  412. package/dist/esm/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
  413. package/dist/esm/workspace/WorkspaceNumberCard.native.js.map +1 -1
  414. package/dist/esm/workspace/WorkspaceQuickList.native.js.map +1 -1
  415. package/dist/esm/workspace/WorkspaceRecents.native.js.map +1 -1
  416. package/dist/esm/workspace/WorkspaceScreen.native.js.map +1 -1
  417. package/dist/esm/workspace/WorkspaceShortcut.native.js.map +1 -1
  418. package/dist/esm/workspace/parseContent.native.js.map +1 -1
  419. package/dist/esm/workspace/types.native.js.map +1 -1
  420. package/dist/esm/workspace/useDashboardChart.native.js.map +1 -1
  421. package/dist/esm/workspace/useWorkspaceDoc.native.js.map +1 -1
  422. package/dist/jsx/list/DoctypeListScreen.mjs +2 -19
  423. package/dist/jsx/list/DoctypeListScreen.mjs.map +1 -1
  424. package/dist/jsx/list/DoctypeListScreen.native.js +4 -19
  425. package/dist/jsx/list/DoctypeListScreen.native.js.map +1 -1
  426. package/dist/jsx/list/filter-chips.mjs +1 -1
  427. package/dist/jsx/list/filter-chips.native.js +3 -3
  428. package/dist/jsx/list/filter-editor.mjs +1 -2
  429. package/dist/jsx/list/filter-editor.mjs.map +1 -1
  430. package/dist/jsx/list/filter-editor.native.js +10 -11
  431. package/dist/jsx/list/filter-editor.native.js.map +1 -1
  432. package/dist/jsx/list/filter-fields.mjs +1 -253
  433. package/dist/jsx/list/filter-fields.mjs.map +1 -1
  434. package/dist/jsx/list/filter-fields.native.js +15 -337
  435. package/dist/jsx/list/filter-fields.native.js.map +1 -1
  436. package/dist/jsx/list/filter-standard.mjs +1 -2
  437. package/dist/jsx/list/filter-standard.mjs.map +1 -1
  438. package/dist/jsx/list/filter-standard.native.js +5 -6
  439. package/dist/jsx/list/filter-standard.native.js.map +1 -1
  440. package/dist/jsx/list/list-tools-sheet.mjs +1 -1
  441. package/dist/jsx/list/list-tools-sheet.native.js +2 -2
  442. package/dist/jsx/list/list-tools-sheet.native.js.map +1 -1
  443. package/dist/jsx/list/listColumns.mjs +1 -370
  444. package/dist/jsx/list/listColumns.mjs.map +1 -1
  445. package/dist/jsx/list/listColumns.native.js +2 -418
  446. package/dist/jsx/list/listColumns.native.js.map +1 -1
  447. package/dist/jsx/list/listFields.mjs +1 -21
  448. package/dist/jsx/list/listFields.mjs.map +1 -1
  449. package/dist/jsx/list/listFields.native.js +4 -50
  450. package/dist/jsx/list/listFields.native.js.map +1 -1
  451. package/dist/jsx/list/listFormat.mjs +1 -36
  452. package/dist/jsx/list/listFormat.mjs.map +1 -1
  453. package/dist/jsx/list/listFormat.native.js +7 -45
  454. package/dist/jsx/list/listFormat.native.js.map +1 -1
  455. package/dist/jsx/list/statusColors.mjs +1 -75
  456. package/dist/jsx/list/statusColors.mjs.map +1 -1
  457. package/dist/jsx/list/statusColors.native.js +2 -80
  458. package/dist/jsx/list/statusColors.native.js.map +1 -1
  459. package/dist/jsx/report/queryReportColumns.mjs +1 -1
  460. package/dist/jsx/report/queryReportColumns.native.js +2 -2
  461. package/dist/jsx/report/queryReportColumns.native.js.map +1 -1
  462. package/dist/jsx/report/queryReportFilterBar.mjs +1 -2
  463. package/dist/jsx/report/queryReportFilterBar.mjs.map +1 -1
  464. package/dist/jsx/report/queryReportFilterBar.native.js +5 -6
  465. package/dist/jsx/report/queryReportFilterBar.native.js.map +1 -1
  466. package/dist/jsx/report/report-grid.mjs +1 -1
  467. package/dist/jsx/report/report-grid.native.js +2 -2
  468. package/dist/jsx/report/report-grid.native.js.map +1 -1
  469. package/dist/jsx/report/report-toolbar.mjs +1 -1
  470. package/dist/jsx/report/report-toolbar.native.js +2 -2
  471. package/dist/jsx/report/report-toolbar.native.js.map +1 -1
  472. package/dist/jsx/report/reportViewModel.mjs +1 -1
  473. package/dist/jsx/report/reportViewModel.mjs.map +1 -1
  474. package/dist/jsx/report/reportViewModel.native.js +3 -3
  475. package/dist/jsx/report/reportViewModel.native.js.map +1 -1
  476. package/dist/jsx/shared/useFrappeApp.mjs +7 -3
  477. package/dist/jsx/shared/useFrappeApp.mjs.map +1 -1
  478. package/dist/jsx/shared/useFrappeApp.native.js +8 -4
  479. package/dist/jsx/shared/useFrappeApp.native.js.map +1 -1
  480. package/package.json +12 -12
  481. package/src/backofficeScreens.designLaw.spec.ts +1 -3
  482. package/src/list/DoctypeListScreen.tsx +13 -19
  483. package/src/list/filter-chips.tsx +1 -1
  484. package/src/list/filter-editor.tsx +2 -2
  485. package/src/list/filter-fields.tsx +29 -356
  486. package/src/list/filter-standard.tsx +2 -2
  487. package/src/list/list-tools-sheet.tsx +1 -1
  488. package/src/list/listColumns.tsx +11 -488
  489. package/src/list/listFields.ts +9 -66
  490. package/src/list/listFormat.ts +12 -77
  491. package/src/list/listShim.spec.ts +101 -0
  492. package/src/list/statusColors.ts +7 -92
  493. package/src/report/queryReportColumns.tsx +1 -1
  494. package/src/report/queryReportFilterBar.tsx +7 -2
  495. package/src/report/report-grid.tsx +1 -1
  496. package/src/report/report-toolbar.tsx +1 -1
  497. package/src/report/reportViewModel.ts +5 -1
  498. package/src/shared/useFrappeApp.spec.tsx +28 -0
  499. package/src/shared/useFrappeApp.ts +4 -2
  500. package/types/list/DoctypeListScreen.d.ts +1 -1
  501. package/types/list/DoctypeListScreen.d.ts.map +1 -1
  502. package/types/list/filter-editor.d.ts.map +1 -1
  503. package/types/list/filter-fields.d.ts +10 -78
  504. package/types/list/filter-fields.d.ts.map +1 -1
  505. package/types/list/filter-standard.d.ts.map +1 -1
  506. package/types/list/listColumns.d.ts +10 -40
  507. package/types/list/listColumns.d.ts.map +1 -1
  508. package/types/list/listFields.d.ts +5 -13
  509. package/types/list/listFields.d.ts.map +1 -1
  510. package/types/list/listFormat.d.ts +5 -27
  511. package/types/list/listFormat.d.ts.map +1 -1
  512. package/types/list/statusColors.d.ts +6 -11
  513. package/types/list/statusColors.d.ts.map +1 -1
  514. package/types/report/queryReportFilterBar.d.ts.map +1 -1
  515. package/types/report/reportViewModel.d.ts +1 -1
  516. package/types/report/reportViewModel.d.ts.map +1 -1
  517. package/types/shared/useFrappeApp.d.ts.map +1 -1
  518. package/src/list/filter-fields.spec.ts +0 -29
  519. package/src/list/listFields.spec.ts +0 -148
  520. package/src/list/listFormat.spec.ts +0 -151
  521. package/src/list/statusColors.spec.ts +0 -100
@@ -1,488 +1,11 @@
1
- // Meta-driven column builder for the doctype list view (desk ListView
2
- // parity): subject-led document rows, not a report grid.
3
- //
4
- // Desk row anatomy (list_view.js):
5
- // checkbox | subject <a> | indicator pills (filterable) | remaining
6
- // in_list_view values (filterable) | activity cluster
7
- // (assignee avatars · relative time · comment count · like)
8
- // Title is a real permalink (middle-click / ⌘-click). Pills and values
9
- // click-to-filter (data-filter) instead of navigating. Like is a sibling
10
- // of the subject link (LC-74). Extra ID / Last Updated columns stay out —
11
- // the timestamp lives in the activity cluster.
12
- import type { ReactNode } from "react";
13
- import { Avatar, Anchor, Chip, Text, XStack, type ChipColor } from "@multiplatform.one/components";
14
- // House control for the like toggle — the icon rides the Button icon slot
15
- // (LC-53 GLYPH-SLOT) and the sub-44 circular size resolves the press floor
16
- // through the house channel (LC-54: 44px box + hitSlop).
17
- import { Button } from "@multiplatform.one/forms";
18
- import { ChatCircleIcon, HeartIcon } from "@phosphor-icons/react";
19
- import type { DataTableColumn } from "@multiplatform.one/table";
20
- import { formatAbsoluteDateTime } from "@multiplatform.one/theme";
21
- import type { PermLevelMatrix } from "../form/fieldPermissions";
22
- import type { DocFieldMeta, DoctypeMeta } from "../shared/useDoctypeMeta";
23
- // Field selection + permlevel pruning live in the pure listFields module
24
- // (node-safe, unit-tested in listFields.spec.ts).
25
- import { listViewFields } from "./listFields";
26
- import { formatDateCell, formatTimeAgo, parseUserListField, stripHtmlPreview } from "./listFormat";
27
- import { statusPillColors } from "./statusColors";
28
-
29
- /** Minimal row shape for a doctype list (loose — server owns the schema). */
30
- export interface ListDoc {
31
- name: string;
32
- doctype: string;
33
- [key: string]: unknown;
34
- }
35
-
36
- export type ListRow = Partial<ListDoc>;
37
-
38
- type Translate = (key: string, fallback: string) => string;
39
-
40
- export interface BuildListColumnsArgs {
41
- meta?: DoctypeMeta;
42
- t: Translate;
43
- /** Session user — hearts fill when `_liked_by` contains them. */
44
- sessionUser?: string;
45
- /** Toggle like for a document (omit to render hearts read-only). */
46
- onToggleLike?: (name: string, nextLiked: boolean) => void;
47
- /** Optimistic like overrides keyed by document name. */
48
- likeOverrides?: Record<string, boolean>;
49
- /**
50
- * Permlevel role matrix (session roles × meta.permissions, built with
51
- * `buildPermLevelMatrix`). Columns for fields the roles cannot READ at
52
- * their permlevel are pruned — desk parity with base_list.js
53
- * `get_fields_in_list_view` (`frappe.perm.has_perm(doctype, df.permlevel,
54
- * "read")`). Undefined (fixtures / roles unavailable) prunes nothing —
55
- * the server strips no-read values either way.
56
- */
57
- permMatrix?: PermLevelMatrix;
58
- /** Document form href — subject renders as a real `<a>` when set (C1). */
59
- getDocHref?: (name: string) => string;
60
- /**
61
- * Desk cell click-to-filter (C2). Status/priority pills, dates, and
62
- * remaining values add (or toggle off) a tuple instead of opening the doc.
63
- */
64
- onFilterClick?: (fieldname: string, value: string) => void;
65
- }
66
-
67
- const NUMERIC_FIELDTYPES = new Set(["Currency", "Float", "Int", "Percent", "Duration"]);
68
-
69
- // Fieldtypes whose stored value is markup — list cells render a stripped
70
- // one-line plain-text preview (desk strip_html parity), never raw HTML.
71
- const RICH_TEXT_FIELDTYPES = new Set([
72
- "Text Editor",
73
- "HTML Editor",
74
- "HTML",
75
- "Markdown Editor",
76
- "Long Text",
77
- "Text",
78
- "Small Text",
79
- ]);
80
-
81
- /** Cell-safe one-line preview: rich fieldtypes stripped, newlines collapsed. */
82
- function cellPreview(value: string, fieldtype?: string): string {
83
- const text = fieldtype && RICH_TEXT_FIELDTYPES.has(fieldtype) ? stripHtmlPreview(value) : value;
84
- return text.replace(/\s+/g, " ").trim();
85
- }
86
-
87
- function isStatusField(field: DocFieldMeta, meta?: DoctypeMeta): boolean {
88
- if (field.fieldname === "status") return true;
89
- if (field.fieldtype !== "Select") return false;
90
- const stateTitles = new Set(
91
- (meta?.states ?? []).map((state) => (state.title ?? "").trim().toLowerCase()),
92
- );
93
- if (stateTitles.size === 0) return false;
94
- const options = (field.options ?? "").split("\n").map((option) => option.trim().toLowerCase());
95
- return options.some((option) => option && stateTitles.has(option));
96
- }
97
-
98
- /** Desk indicator cells: every Select in the list, plus User.enabled. */
99
- function isIndicatorField(field: DocFieldMeta, meta?: DoctypeMeta): boolean {
100
- if (field.fieldtype === "Select") return true;
101
- if (field.fieldtype === "Check" && field.fieldname === "enabled") return true;
102
- return isStatusField(field, meta);
103
- }
104
-
105
- function stopRowPress(event?: { stopPropagation?: () => void }) {
106
- event?.stopPropagation?.();
107
- }
108
-
109
- function chipColorFromStatus(value: string, meta?: DoctypeMeta): ChipColor {
110
- const ramp = statusPillColors(value, meta).background.replace(/^\$/, "").replace(/\d+$/, "");
111
- if (ramp === "pink") return "purple";
112
- if (
113
- ramp === "red" ||
114
- ramp === "green" ||
115
- ramp === "blue" ||
116
- ramp === "yellow" ||
117
- ramp === "orange" ||
118
- ramp === "purple" ||
119
- ramp === "gray"
120
- ) {
121
- return ramp;
122
- }
123
- return "gray";
124
- }
125
-
126
- function IndicatorPill({
127
- value,
128
- meta,
129
- fieldname,
130
- filterValue,
131
- onFilterClick,
132
- }: {
133
- value: string;
134
- meta?: DoctypeMeta;
135
- fieldname: string;
136
- /** Wire value when it differs from the label (Check enabled → 1/0). */
137
- filterValue?: string;
138
- onFilterClick?: (fieldname: string, value: string) => void;
139
- }) {
140
- const chipColor = chipColorFromStatus(value, meta);
141
- const applied = filterValue ?? value;
142
- return (
143
- <XStack
144
- alignSelf="flex-start"
145
- {...(onFilterClick
146
- ? {
147
- "data-filter": `${fieldname},=,${applied}`,
148
- onPress: (event?: { stopPropagation?: () => void }) => stopRowPress(event),
149
- }
150
- : {})}
151
- >
152
- <Chip
153
- size="$2"
154
- variant="subtle"
155
- color={chipColor}
156
- onPress={onFilterClick ? () => onFilterClick(fieldname, applied) : undefined}
157
- >
158
- {value}
159
- </Chip>
160
- </XStack>
161
- );
162
- }
163
-
164
- function FilterableText({
165
- fieldname,
166
- value,
167
- children,
168
- onFilterClick,
169
- }: {
170
- fieldname: string;
171
- value: string;
172
- children: ReactNode;
173
- onFilterClick?: (fieldname: string, value: string) => void;
174
- }) {
175
- if (!onFilterClick) return <>{children}</>;
176
- return (
177
- <XStack
178
- role="button"
179
- cursor="pointer"
180
- minWidth={0}
181
- flexShrink={1}
182
- onPress={(event) => {
183
- stopRowPress(event);
184
- onFilterClick(fieldname, value);
185
- }}
186
- hoverStyle={{ opacity: 0.8 }}
187
- {...{ "data-filter": `${fieldname},=,${value}` }}
188
- >
189
- {children}
190
- </XStack>
191
- );
192
- }
193
-
194
- function commentCount(doc: ListRow): number {
195
- const raw = doc._comment_count;
196
- if (typeof raw === "number" && Number.isFinite(raw)) return raw;
197
- if (typeof raw === "string" && raw.trim()) {
198
- const parsed = Number(raw);
199
- if (Number.isFinite(parsed)) return parsed;
200
- }
201
- const comments = doc._comments;
202
- if (typeof comments === "string" && comments.trim()) {
203
- try {
204
- const parsed = JSON.parse(comments) as unknown;
205
- if (Array.isArray(parsed)) return parsed.length;
206
- } catch {
207
- return 0;
208
- }
209
- }
210
- return 0;
211
- }
212
-
213
- function LikeControl({
214
- doc,
215
- t,
216
- sessionUser,
217
- onToggleLike,
218
- likeOverrides,
219
- }: {
220
- doc: ListRow;
221
- t: Translate;
222
- sessionUser?: string;
223
- onToggleLike?: (name: string, nextLiked: boolean) => void;
224
- likeOverrides?: Record<string, boolean>;
225
- }) {
226
- const name = doc.name ?? "";
227
- const likedBy = parseUserListField(doc._liked_by);
228
- const liked = likeOverrides?.[name] ?? (sessionUser ? likedBy.includes(sessionUser) : false);
229
- const likeLabel = liked ? t("list.unlike", "Remove from liked") : t("list.like", "Add to liked");
230
- if (!onToggleLike || !name) {
231
- return (
232
- <Text fontSize="$4" color={liked ? "$red10" : "$color8"} role="img" aria-label={likeLabel}>
233
- {liked ? "♥" : "♡"}
234
- </Text>
235
- );
236
- }
237
- return (
238
- <Button
239
- circular
240
- chromeless
241
- size="$2"
242
- col={(liked ? "$red10" : "$color8") as never}
243
- icon={<HeartIcon size={16} weight={liked ? "fill" : "regular"} />}
244
- aria-label={likeLabel}
245
- aria-pressed={liked}
246
- onPress={(event) => {
247
- stopRowPress(event);
248
- onToggleLike(name, !liked);
249
- }}
250
- />
251
- );
252
- }
253
-
254
- function ActivityCluster({
255
- doc,
256
- t,
257
- sessionUser,
258
- onToggleLike,
259
- likeOverrides,
260
- }: {
261
- doc: ListRow;
262
- t: Translate;
263
- sessionUser?: string;
264
- onToggleLike?: (name: string, nextLiked: boolean) => void;
265
- likeOverrides?: Record<string, boolean>;
266
- }) {
267
- const assignees = parseUserListField(doc._assign);
268
- const comments = commentCount(doc);
269
- const modified = doc.modified ? String(doc.modified) : "";
270
- const absolute = modified ? formatAbsoluteDateTime(modified) : "";
271
- return (
272
- <XStack
273
- alignItems="center"
274
- justifyContent="flex-end"
275
- gap="$2"
276
- minWidth={0}
277
- testID="list-activity"
278
- >
279
- {assignees.slice(0, 3).map((user) => (
280
- <Avatar key={user} name={user} size={20} circular aria-label={user} />
281
- ))}
282
- {modified ? (
283
- <Text
284
- fontSize="$2"
285
- color="$color9"
286
- {...({ title: absolute || undefined } as Record<string, unknown>)}
287
- >
288
- {formatTimeAgo(modified)}
289
- </Text>
290
- ) : null}
291
- <XStack
292
- alignItems="center"
293
- gap="$1"
294
- {...({ "aria-label": t("list.comments", "Comments") } as Record<string, unknown>)}
295
- >
296
- <ChatCircleIcon size={14} />
297
- <Text fontSize="$2" color="$color9">
298
- {comments}
299
- </Text>
300
- </XStack>
301
- <LikeControl
302
- doc={doc}
303
- t={t}
304
- sessionUser={sessionUser}
305
- onToggleLike={onToggleLike}
306
- likeOverrides={likeOverrides}
307
- />
308
- </XStack>
309
- );
310
- }
311
-
312
- function fieldCell(
313
- field: DocFieldMeta,
314
- meta: DoctypeMeta | undefined,
315
- onFilterClick?: (fieldname: string, value: string) => void,
316
- ) {
317
- return ({ getValue }: { getValue: () => unknown }) => {
318
- const raw = getValue();
319
- if (raw === null || raw === undefined || raw === "")
320
- return (
321
- <Text fontSize="$3" color="$color8">
322
- —
323
- </Text>
324
- );
325
- if (field.fieldtype === "Check" && field.fieldname === "enabled") {
326
- const on = raw === true || raw === 1 || raw === "1";
327
- return (
328
- <IndicatorPill
329
- value={on ? "Active" : "Disabled"}
330
- meta={meta}
331
- fieldname={field.fieldname}
332
- filterValue={on ? "1" : "0"}
333
- onFilterClick={onFilterClick}
334
- />
335
- );
336
- }
337
- const value = String(raw);
338
- if (isIndicatorField(field, meta)) {
339
- return (
340
- <IndicatorPill
341
- value={value}
342
- meta={meta}
343
- fieldname={field.fieldname}
344
- onFilterClick={onFilterClick}
345
- />
346
- );
347
- }
348
- switch (field.fieldtype) {
349
- case "Check":
350
- return (
351
- <Text fontSize="$3" color={raw ? "$green11" : "$color8"}>
352
- {raw ? "✓" : "—"}
353
- </Text>
354
- );
355
- case "Date":
356
- case "Datetime": {
357
- const display = formatDateCell(value);
358
- return (
359
- <FilterableText fieldname={field.fieldname} value={value} onFilterClick={onFilterClick}>
360
- <Text fontSize="$3" color="$color11">
361
- {display}
362
- </Text>
363
- </FilterableText>
364
- );
365
- }
366
- case "Currency":
367
- case "Float":
368
- case "Int":
369
- case "Percent":
370
- return (
371
- <Text fontSize="$3" color="$color12" textAlign="right">
372
- {value}
373
- </Text>
374
- );
375
- case "Link":
376
- return (
377
- <FilterableText fieldname={field.fieldname} value={value} onFilterClick={onFilterClick}>
378
- <Text fontSize="$3" color="$color11" numberOfLines={1} flexShrink={1} minWidth={0}>
379
- {value}
380
- </Text>
381
- </FilterableText>
382
- );
383
- default:
384
- return (
385
- <Text fontSize="$3" color="$color11" numberOfLines={1} flexShrink={1} minWidth={0}>
386
- {cellPreview(value, field.fieldtype)}
387
- </Text>
388
- );
389
- }
390
- };
391
- }
392
-
393
- /** Build the DataTable columns for a doctype list from its meta. */
394
- export function buildListColumns({
395
- meta,
396
- t,
397
- sessionUser,
398
- onToggleLike,
399
- likeOverrides,
400
- permMatrix,
401
- getDocHref,
402
- onFilterClick,
403
- }: BuildListColumnsArgs): DataTableColumn<ListRow>[] {
404
- const titleField = meta?.title_field || "name";
405
- const columns: DataTableColumn<ListRow>[] = [];
406
-
407
- const titleMeta = meta?.fields?.find((field) => field.fieldname === titleField);
408
- columns.push({
409
- id: titleField,
410
- header:
411
- titleField === "name"
412
- ? t("list.idColumn", "ID")
413
- : titleMeta?.label || t("list.titleColumn", "Title"),
414
- accessorKey: titleField,
415
- minWidth: 180,
416
- meta: { role: "title" },
417
- cell: ({ row, getValue }) => {
418
- const raw = getValue();
419
- const name = row.original.name ?? "";
420
- const value = raw === null || raw === undefined || raw === "" ? name : String(raw);
421
- const href = name && getDocHref ? getDocHref(name) : undefined;
422
- const label = cellPreview(value, titleMeta?.fieldtype);
423
- const subject = (
424
- <Text
425
- fontSize="$3"
426
- fontWeight="400"
427
- color="$color12"
428
- numberOfLines={1}
429
- flexShrink={1}
430
- minWidth={0}
431
- >
432
- {label}
433
- </Text>
434
- );
435
- if (!href) return subject;
436
- return (
437
- <Anchor
438
- href={href}
439
- textDecorationLine="none"
440
- minWidth={0}
441
- flexShrink={1}
442
- onPress={stopRowPress}
443
- >
444
- {subject}
445
- </Anchor>
446
- );
447
- },
448
- });
449
-
450
- for (const field of listViewFields(meta, titleField, permMatrix)) {
451
- columns.push({
452
- id: field.fieldname,
453
- header: field.label || field.fieldname,
454
- accessorKey: field.fieldname,
455
- ...(NUMERIC_FIELDTYPES.has(field.fieldtype) ? { align: "right" as const } : {}),
456
- cell: fieldCell(field, meta, onFilterClick),
457
- });
458
- }
459
-
460
- columns.push({
461
- id: "_activity",
462
- header: t("list.activity", "Activity"),
463
- meta: { role: "actions", label: t("list.activity", "Activity") },
464
- sortable: false,
465
- filterable: false,
466
- cell: ({ row }) => (
467
- <ActivityCluster
468
- doc={row.original}
469
- t={t}
470
- sessionUser={sessionUser}
471
- onToggleLike={onToggleLike}
472
- likeOverrides={likeOverrides}
473
- />
474
- ),
475
- });
476
-
477
- // Hidden sort key — desk default is Last Updated On. The timestamp paints
478
- // in the activity cluster; the column exists so TanStack can sort on it
479
- // without a second visible "Last Updated" slot.
480
- columns.push({
481
- id: "modified",
482
- accessorKey: "modified",
483
- header: t("list.lastUpdated", "Last Updated On"),
484
- enableHiding: true,
485
- });
486
-
487
- return columns;
488
- }
1
+ /**
2
+ * Desk list column builder — moved to
3
+ * `@multiplatform.one/frappe-ui/src/list/listColumns` (MPO-15), where
4
+ * FrappeTable derives its default columns from it. Re-exported here so the
5
+ * barrel and the `@multiplatform.one/backoffice/src/list/listColumns` deep
6
+ * import keep resolving (the GNOME shim deep-imports this path). New code
7
+ * imports from `@multiplatform.one/frappe-ui`.
8
+ */
9
+
10
+ export { buildListColumns } from "@multiplatform.one/frappe-ui";
11
+ export type { BuildListColumnsArgs, ListDoc, ListRow } from "@multiplatform.one/frappe-ui";
@@ -1,69 +1,12 @@
1
- // Pure (node-safe, no UI imports) field selection for the doctype list:
2
- // which fields to fetch and which in_list_view fields render as columns.
3
- // Kept out of listColumns.tsx so the pruning logic is unit-testable under
4
- // the features vitest node environment (specs here never import the
5
- // components barrel — see vitest.config.mjs).
6
- //
7
- // Permlevel pruning reuses the form workstream's UI-free role-matrix module
8
- // (desk perm.js parity) rather than forking it (schema conformance §10
9
- // handoff).
10
- import { canReadLevel, type PermLevelMatrix } from "../form/fieldPermissions";
11
- import type { DocFieldMeta, DoctypeMeta } from "../shared/useDoctypeMeta";
12
-
13
- /** Read access for a field's permlevel (level 0 / no matrix always read). */
14
- function fieldLevelReadable(field: DocFieldMeta, permMatrix?: PermLevelMatrix): boolean {
15
- return canReadLevel(permMatrix, Number(field.permlevel ?? 0) || 0);
16
- }
17
-
18
- /** Fields the list view fetches for a doctype (columns + niceties). */
19
- export function listFieldsToFetch(meta?: DoctypeMeta, permMatrix?: PermLevelMatrix): string[] {
20
- const fields = new Set<string>([
21
- "name",
22
- "modified",
23
- "owner",
24
- "_liked_by",
25
- "_assign",
26
- "_user_tags",
27
- "_comments",
28
- ]);
29
- if (meta?.title_field) fields.add(meta.title_field);
30
- for (const field of meta?.fields ?? []) {
31
- if (field.in_list_view && field.fieldname && fieldLevelReadable(field, permMatrix)) {
32
- fields.add(field.fieldname);
33
- }
34
- }
35
- return [...fields];
36
- }
37
-
38
1
  /**
39
- * The in_list_view fields to render as columns (title field excluded).
40
- * Desk parity: fields above the session's read permlevel never render as
41
- * list columns (base_list.js `get_fields_in_list_view` →
42
- * `frappe.perm.has_perm(doctype, df.permlevel, "read")`). An undefined
43
- * matrix (fixtures / roles unavailable) prunes nothing — the server strips
44
- * no-read values either way.
2
+ * List field selection — moved to
3
+ * `@multiplatform.one/frappe-ui/src/list/listFields` (MPO-15) with the
4
+ * column builder that consumes it. Re-exported here so existing imports
5
+ * keep resolving (the GNOME shim deep-imports this path).
45
6
  */
46
- export function listViewFields(
47
- meta: DoctypeMeta | undefined,
48
- titleField: string,
49
- permMatrix?: PermLevelMatrix,
50
- ): DocFieldMeta[] {
51
- return (meta?.fields ?? []).filter(
52
- (field) =>
53
- Boolean(field.in_list_view) &&
54
- field.fieldname !== titleField &&
55
- field.fieldtype !== "Image" &&
56
- field.fieldtype !== "Attach Image" &&
57
- fieldLevelReadable(field, permMatrix),
58
- );
59
- }
60
7
 
61
- /** Column ids the list view paints, in order: title, in_list_view, activity. */
62
- export function listDocumentColumnIds(meta?: DoctypeMeta, permMatrix?: PermLevelMatrix): string[] {
63
- const titleField = meta?.title_field || "name";
64
- return [
65
- titleField,
66
- ...listViewFields(meta, titleField, permMatrix).map((field) => field.fieldname),
67
- "_activity",
68
- ];
69
- }
8
+ export {
9
+ listDocumentColumnIds,
10
+ listFieldsToFetch,
11
+ listViewFields,
12
+ } from "@multiplatform.one/frappe-ui";
@@ -1,80 +1,15 @@
1
- // Cross-platform display helpers for list cells — frappe datetimes like
2
- // "2026-08-12 08:50:24.691936". Formatting routes through the house date
3
- // channel (LC-12 DATA-REGISTER-CHANNEL): one formatter owns each register,
4
- // this module only parses the frappe wire format and picks the register.
5
- import { formatAbsoluteDate, formatRelativeTimestamp } from "@multiplatform.one/theme";
6
-
7
- /** Parse a frappe date/datetime string into a Date (undefined when invalid). */
8
- export function parseFrappeDate(value: string): Date | undefined {
9
- // "YYYY-MM-DD HH:mm:ss.SSSSSS" → ISO-ish so JSC/Hermes parse it too.
10
- const isoish = value.includes(" ") ? value.replace(" ", "T") : value;
11
- const date = new Date(isoish);
12
- return Number.isNaN(date.getTime()) ? undefined : date;
13
- }
14
-
15
- /**
16
- * Table date cell — the house compact-absolute display register
17
- * ("Aug 12" / "Jul 1, 2025", current year elided). Raw ISO wire format
18
- * never reaches the cell (LC-12); unparseable input passes through.
19
- * The STRING (not a parsed Date) rides into the channel so its date-only
20
- * UTC branch engages — a parsed "YYYY-MM-DD" would shift a day in
21
- * negative-offset timezones.
22
- */
23
- export function formatDateCell(value: string, now?: Date): string {
24
- if (!parseFrappeDate(value)) return value;
25
- const isoish = value.includes(" ") ? value.replace(" ", "T") : value;
26
- return formatAbsoluteDate(isoish, now ? { now } : undefined);
27
- }
28
-
29
1
  /**
30
- * Recency column ("Last Updated On") — the house relative register
31
- * ("just now", "5m ago", "2h ago", "2mo ago"). One voice, unambiguous
32
- * units (LC-12); unparseable input passes through.
2
+ * List cell formatting — moved to
3
+ * `@multiplatform.one/frappe-ui/src/list/listFormat` (MPO-15) with the
4
+ * column builder that consumes it. Re-exported here so existing imports
5
+ * keep resolving (the GNOME shim deep-imports this path).
33
6
  */
34
- export function formatTimeAgo(value: string, now: Date = new Date()): string {
35
- const date = parseFrappeDate(value);
36
- if (!date) return value;
37
- return formatRelativeTimestamp(date, now.getTime());
38
- }
39
-
40
- /**
41
- * Plain-text preview of rich/HTML field content for list cells (desk
42
- * `strip_html` parity): tags dropped, entities collapsed, whitespace
43
- * normalized. A Text Editor value like `<div class="ql-editor"><p>Call the
44
- * vendor</p></div>` renders as "Call the vendor" — markup never paints in
45
- * a one-line cell (LC-06/LC-10 containment; cell-containment rule candidate).
46
- */
47
- export function stripHtmlPreview(value: string): string {
48
- if (!value.includes("<") && !value.includes("&")) return value;
49
- return value
50
- .replace(/<[^>]*>/g, " ")
51
- .replace(/&nbsp;/gi, " ")
52
- .replace(/&amp;/gi, "&")
53
- .replace(/&lt;/gi, "<")
54
- .replace(/&gt;/gi, ">")
55
- .replace(/&#39;|&apos;/gi, "'")
56
- .replace(/&quot;/gi, '"')
57
- .replace(/\s+/g, " ")
58
- .trim();
59
- }
60
-
61
- /** Parse frappe's `_assign` / `_liked_by` JSON-array-string columns. */
62
- export function parseUserListField(value: unknown): string[] {
63
- if (Array.isArray(value)) return value.map(String);
64
- if (typeof value !== "string" || !value) return [];
65
- try {
66
- const parsed = JSON.parse(value);
67
- return Array.isArray(parsed) ? parsed.map(String) : [];
68
- } catch {
69
- return [];
70
- }
71
- }
72
7
 
73
- /** Parse frappe's `_user_tags` comma-joined column (",a,b" → ["a","b"]). */
74
- export function parseTagsField(value: unknown): string[] {
75
- if (typeof value !== "string") return [];
76
- return value
77
- .split(",")
78
- .map((tag) => tag.trim())
79
- .filter(Boolean);
80
- }
8
+ export {
9
+ formatDateCell,
10
+ formatTimeAgo,
11
+ parseFrappeDate,
12
+ parseTagsField,
13
+ parseUserListField,
14
+ stripHtmlPreview,
15
+ } from "@multiplatform.one/frappe-ui";