@multiplatform.one/backoffice 6.7.0 → 7.0.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.
- package/dist/cjs/chrome/BackofficeAwesomebar.cjs +1 -0
- package/dist/cjs/chrome/BackofficeAwesomebar.native.js +1 -0
- package/dist/cjs/chrome/BackofficeAwesomebar.native.js.map +1 -1
- package/dist/cjs/chrome/CommandPalette.cjs +95 -18
- package/dist/cjs/chrome/CommandPalette.native.js +114 -31
- package/dist/cjs/chrome/CommandPalette.native.js.map +1 -1
- package/dist/cjs/chrome/HelpMenu.cjs +40 -55
- package/dist/cjs/chrome/HelpMenu.native.js +50 -66
- package/dist/cjs/chrome/HelpMenu.native.js.map +1 -1
- package/dist/cjs/chrome/awesomebar-data.cjs +51 -8
- package/dist/cjs/chrome/awesomebar-data.native.js +58 -10
- package/dist/cjs/chrome/awesomebar-data.native.js.map +1 -1
- package/dist/cjs/chrome/command-palette-model.cjs +1 -2
- package/dist/cjs/chrome/command-palette-model.native.js +1 -2
- package/dist/cjs/chrome/command-palette-model.native.js.map +1 -1
- package/dist/cjs/chrome/notifications-data.cjs +2 -0
- package/dist/cjs/chrome/notifications-data.native.js +2 -0
- package/dist/cjs/chrome/notifications-data.native.js.map +1 -1
- package/dist/cjs/chrome/notifications-panel.cjs +14 -4
- package/dist/cjs/chrome/notifications-panel.native.js +16 -4
- package/dist/cjs/chrome/notifications-panel.native.js.map +1 -1
- package/dist/cjs/chrome/shortcuts.native.js.map +1 -1
- package/dist/cjs/config/BackofficeProvider.cjs +2 -0
- package/dist/cjs/config/BackofficeProvider.native.js +2 -0
- package/dist/cjs/config/BackofficeProvider.native.js.map +1 -1
- package/dist/cjs/form/DocFormScreen.cjs +123 -14
- package/dist/cjs/form/DocFormScreen.native.js +147 -14
- package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
- package/dist/cjs/form/FormConnections.cjs +37 -5
- package/dist/cjs/form/FormConnections.native.js +36 -5
- package/dist/cjs/form/FormConnections.native.js.map +1 -1
- package/dist/cjs/form/FormDialogs.cjs +104 -0
- package/dist/cjs/form/FormDialogs.native.js +110 -0
- package/dist/cjs/form/FormDialogs.native.js.map +1 -1
- package/dist/cjs/form/FormErrorBoundary.cjs +26 -5
- package/dist/cjs/form/FormErrorBoundary.native.js +25 -5
- package/dist/cjs/form/FormErrorBoundary.native.js.map +1 -1
- package/dist/cjs/form/FormSidebarPanel.cjs +71 -22
- package/dist/cjs/form/FormSidebarPanel.native.js +70 -22
- package/dist/cjs/form/FormSidebarPanel.native.js.map +1 -1
- package/dist/cjs/form/FormTimeline.cjs +133 -22
- package/dist/cjs/form/FormTimeline.native.js +171 -24
- package/dist/cjs/form/FormTimeline.native.js.map +1 -1
- package/dist/cjs/form/FormToolbar.cjs +50 -4
- package/dist/cjs/form/FormToolbar.native.js +50 -4
- package/dist/cjs/form/FormToolbar.native.js.map +1 -1
- package/dist/cjs/form/formActions.native.js.map +1 -1
- package/dist/cjs/form/formLayout.cjs +3 -13
- package/dist/cjs/form/formLayout.native.js +7 -13
- package/dist/cjs/form/formLayout.native.js.map +1 -1
- package/dist/cjs/form/platformHooks.cjs +48 -0
- package/dist/cjs/form/platformHooks.native.js +52 -0
- package/dist/cjs/form/platformHooks.native.js.map +1 -1
- package/dist/cjs/form/timeline-entries.cjs +56 -13
- package/dist/cjs/form/timeline-entries.native.js +58 -16
- package/dist/cjs/form/timeline-entries.native.js.map +1 -1
- package/dist/cjs/i18n/en.cjs +31 -9
- package/dist/cjs/i18n/en.native.js +31 -9
- package/dist/cjs/i18n/en.native.js.map +1 -1
- package/dist/cjs/index.cjs +13 -1
- package/dist/cjs/index.native.js +13 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/list/AddTagsDialog.cjs +12 -7
- package/dist/cjs/list/AddTagsDialog.native.js +12 -7
- package/dist/cjs/list/AddTagsDialog.native.js.map +1 -1
- package/dist/cjs/list/AssignToDialog.cjs +7 -4
- package/dist/cjs/list/AssignToDialog.native.js +7 -4
- package/dist/cjs/list/AssignToDialog.native.js.map +1 -1
- package/dist/cjs/list/DoctypeListScreen.cjs +124 -153
- package/dist/cjs/list/DoctypeListScreen.native.js +152 -198
- package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/cjs/list/ListFilterBar.cjs +60 -41
- package/dist/cjs/list/ListFilterBar.native.js +62 -41
- package/dist/cjs/list/ListFilterBar.native.js.map +1 -1
- package/dist/cjs/list/ListSidebar.cjs +15 -13
- package/dist/cjs/list/ListSidebar.native.js +17 -17
- package/dist/cjs/list/ListSidebar.native.js.map +1 -1
- package/dist/cjs/list/bulk-edit-dialog.cjs +12 -7
- package/dist/cjs/list/bulk-edit-dialog.native.js +12 -7
- package/dist/cjs/list/bulk-edit-dialog.native.js.map +1 -1
- package/dist/cjs/list/filter-fields.cjs +23 -1
- package/dist/cjs/list/filter-fields.native.js +28 -1
- package/dist/cjs/list/filter-fields.native.js.map +1 -1
- package/dist/cjs/list/filter-saved.cjs +4 -4
- package/dist/cjs/list/filter-saved.native.js +4 -7
- package/dist/cjs/list/filter-saved.native.js.map +1 -1
- package/dist/cjs/list/filter-sort.cjs +2 -1
- package/dist/cjs/list/filter-sort.native.js +2 -1
- package/dist/cjs/list/filter-sort.native.js.map +1 -1
- package/dist/cjs/list/filter-standard.cjs +1 -1
- package/dist/cjs/list/filter-standard.native.js +1 -1
- package/dist/cjs/list/listColumns.cjs +258 -109
- package/dist/cjs/list/listColumns.native.js +263 -118
- package/dist/cjs/list/listColumns.native.js.map +1 -1
- package/dist/cjs/list/listFields.cjs +6 -1
- package/dist/cjs/list/listFields.native.js +8 -1
- package/dist/cjs/list/listFields.native.js.map +1 -1
- package/dist/cjs/list/sidebar-section.cjs +57 -19
- package/dist/cjs/list/sidebar-section.native.js +60 -19
- package/dist/cjs/list/sidebar-section.native.js.map +1 -1
- package/dist/cjs/oneAdapter/index.cjs +5 -1
- package/dist/cjs/oneAdapter/index.native.js +8 -1
- package/dist/cjs/oneAdapter/index.native.js.map +1 -1
- package/dist/cjs/quickEntry/quickEntryPlan.cjs +2 -6
- package/dist/cjs/quickEntry/quickEntryPlan.native.js +4 -6
- package/dist/cjs/quickEntry/quickEntryPlan.native.js.map +1 -1
- package/dist/cjs/report/QueryReportScreen.cjs +103 -94
- package/dist/cjs/report/QueryReportScreen.native.js +125 -143
- package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
- package/dist/cjs/report/queryReportColumns.cjs +10 -1
- package/dist/cjs/report/queryReportColumns.native.js +16 -1
- package/dist/cjs/report/queryReportColumns.native.js.map +1 -1
- package/dist/cjs/report/queryReportFilterBar.cjs +274 -0
- package/dist/cjs/report/queryReportFilterBar.native.js +339 -0
- package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -0
- package/dist/cjs/report/queryReportUrlState.cjs +55 -0
- package/dist/cjs/report/queryReportUrlState.native.js +108 -0
- package/dist/cjs/report/queryReportUrlState.native.js.map +1 -0
- package/dist/cjs/report/report-grid.cjs +155 -50
- package/dist/cjs/report/report-grid.native.js +174 -54
- package/dist/cjs/report/report-grid.native.js.map +1 -1
- package/dist/cjs/report/report-toolbar.cjs +1 -6
- package/dist/cjs/report/report-toolbar.native.js +6 -6
- package/dist/cjs/report/report-toolbar.native.js.map +1 -1
- package/dist/cjs/report/reportShapes.cjs +269 -11
- package/dist/cjs/report/reportShapes.native.js +333 -11
- package/dist/cjs/report/reportShapes.native.js.map +1 -1
- package/dist/cjs/report/reportViewModel.cjs +13 -5
- package/dist/cjs/report/reportViewModel.native.js +38 -5
- package/dist/cjs/report/reportViewModel.native.js.map +1 -1
- package/dist/cjs/report/useQueryReport.cjs +48 -17
- package/dist/cjs/report/useQueryReport.native.js +56 -37
- package/dist/cjs/report/useQueryReport.native.js.map +1 -1
- package/dist/cjs/shared/deskLinks.cjs +39 -0
- package/dist/cjs/shared/deskLinks.native.js +43 -0
- package/dist/cjs/shared/deskLinks.native.js.map +1 -0
- package/dist/cjs/shared/listNavContext.cjs +102 -0
- package/dist/cjs/shared/listNavContext.native.js +130 -0
- package/dist/cjs/shared/listNavContext.native.js.map +1 -0
- package/dist/cjs/shared/useDocinfo.cjs +42 -2
- package/dist/cjs/shared/useDocinfo.native.js +82 -2
- package/dist/cjs/shared/useDocinfo.native.js.map +1 -1
- package/dist/cjs/shared/useDoctypeMeta.native.js.map +1 -1
- package/dist/cjs/shared/useFrappeApp.cjs +10 -5
- package/dist/cjs/shared/useFrappeApp.native.js +10 -5
- package/dist/cjs/shared/useFrappeApp.native.js.map +1 -1
- package/dist/cjs/shell/BackofficeShell.cjs +83 -20
- package/dist/cjs/shell/BackofficeShell.native.js +89 -24
- package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
- package/dist/cjs/shell/WorkspaceSidebar.cjs +113 -4
- package/dist/cjs/shell/WorkspaceSidebar.native.js +120 -4
- package/dist/cjs/shell/WorkspaceSidebar.native.js.map +1 -1
- package/dist/cjs/shell/useWorkspaces.cjs +2 -0
- package/dist/cjs/shell/useWorkspaces.native.js +2 -0
- package/dist/cjs/shell/useWorkspaces.native.js.map +1 -1
- package/dist/cjs/shell/workspaceIcons.cjs +12 -2
- package/dist/cjs/shell/workspaceIcons.native.js +35 -2
- package/dist/cjs/shell/workspaceIcons.native.js.map +1 -1
- package/dist/cjs/views/CalendarView.cjs +1 -4
- package/dist/cjs/views/CalendarView.native.js +1 -6
- package/dist/cjs/views/CalendarView.native.js.map +1 -1
- package/dist/cjs/views/DoctypeViewScreen.cjs +7 -3
- package/dist/cjs/views/DoctypeViewScreen.native.js +7 -3
- package/dist/cjs/views/DoctypeViewScreen.native.js.map +1 -1
- package/dist/cjs/views/KanbanView.cjs +2 -0
- package/dist/cjs/views/KanbanView.native.js +2 -0
- package/dist/cjs/views/KanbanView.native.js.map +1 -1
- package/dist/cjs/views/ViewHeader.cjs +45 -74
- package/dist/cjs/views/ViewHeader.native.js +51 -78
- package/dist/cjs/views/ViewHeader.native.js.map +1 -1
- package/dist/cjs/views/ViewSwitcherMenu.cjs +95 -0
- package/dist/cjs/views/ViewSwitcherMenu.native.js +99 -0
- package/dist/cjs/views/ViewSwitcherMenu.native.js.map +1 -0
- package/dist/cjs/views/connection.cjs +5 -1
- package/dist/cjs/views/connection.native.js +5 -1
- package/dist/cjs/views/connection.native.js.map +1 -1
- package/dist/cjs/views/dashboard-data.cjs +1 -2
- package/dist/cjs/views/dashboard-data.native.js +1 -4
- package/dist/cjs/views/dashboard-data.native.js.map +1 -1
- package/dist/cjs/views/kanban-board-controls.cjs +4 -9
- package/dist/cjs/views/kanban-board-controls.native.js +9 -10
- package/dist/cjs/views/kanban-board-controls.native.js.map +1 -1
- package/dist/cjs/views/viewAvailability.cjs +59 -0
- package/dist/cjs/views/viewAvailability.native.js +63 -0
- package/dist/cjs/views/viewAvailability.native.js.map +1 -0
- package/dist/cjs/workspace/WorkspaceLinkCard.cjs +120 -25
- package/dist/cjs/workspace/WorkspaceLinkCard.native.js +126 -28
- package/dist/cjs/workspace/WorkspaceLinkCard.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceLinkDirectory.cjs +27 -21
- package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js +32 -23
- package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceNumberCard.cjs +1 -1
- package/dist/cjs/workspace/WorkspaceNumberCard.native.js +1 -1
- package/dist/cjs/workspace/WorkspaceNumberCard.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceQuickList.cjs +61 -29
- package/dist/cjs/workspace/WorkspaceQuickList.native.js +65 -32
- package/dist/cjs/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceRecents.cjs +8 -0
- package/dist/cjs/workspace/WorkspaceRecents.native.js +8 -0
- package/dist/cjs/workspace/WorkspaceRecents.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceShortcut.cjs +10 -0
- package/dist/cjs/workspace/WorkspaceShortcut.native.js +10 -0
- package/dist/cjs/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/dist/cjs/workspace/parseContent.cjs +22 -0
- package/dist/cjs/workspace/parseContent.native.js +24 -0
- package/dist/cjs/workspace/parseContent.native.js.map +1 -1
- package/dist/esm/chrome/BackofficeAwesomebar.mjs +1 -0
- package/dist/esm/chrome/BackofficeAwesomebar.mjs.map +1 -1
- package/dist/esm/chrome/BackofficeAwesomebar.native.js +1 -0
- package/dist/esm/chrome/BackofficeAwesomebar.native.js.map +1 -1
- package/dist/esm/chrome/CommandPalette.mjs +96 -19
- package/dist/esm/chrome/CommandPalette.mjs.map +1 -1
- package/dist/esm/chrome/CommandPalette.native.js +115 -32
- package/dist/esm/chrome/CommandPalette.native.js.map +1 -1
- package/dist/esm/chrome/HelpMenu.mjs +41 -56
- package/dist/esm/chrome/HelpMenu.mjs.map +1 -1
- package/dist/esm/chrome/HelpMenu.native.js +51 -67
- package/dist/esm/chrome/HelpMenu.native.js.map +1 -1
- package/dist/esm/chrome/awesomebar-data.mjs +51 -9
- package/dist/esm/chrome/awesomebar-data.mjs.map +1 -1
- package/dist/esm/chrome/awesomebar-data.native.js +58 -11
- package/dist/esm/chrome/awesomebar-data.native.js.map +1 -1
- package/dist/esm/chrome/command-palette-model.mjs +2 -3
- package/dist/esm/chrome/command-palette-model.mjs.map +1 -1
- package/dist/esm/chrome/command-palette-model.native.js +2 -3
- package/dist/esm/chrome/command-palette-model.native.js.map +1 -1
- package/dist/esm/chrome/notifications-data.mjs +2 -0
- package/dist/esm/chrome/notifications-data.mjs.map +1 -1
- package/dist/esm/chrome/notifications-data.native.js +2 -0
- package/dist/esm/chrome/notifications-data.native.js.map +1 -1
- package/dist/esm/chrome/notifications-panel.mjs +15 -5
- package/dist/esm/chrome/notifications-panel.mjs.map +1 -1
- package/dist/esm/chrome/notifications-panel.native.js +17 -5
- package/dist/esm/chrome/notifications-panel.native.js.map +1 -1
- package/dist/esm/chrome/shortcuts.mjs.map +1 -1
- package/dist/esm/chrome/shortcuts.native.js.map +1 -1
- package/dist/esm/config/BackofficeProvider.mjs +2 -0
- package/dist/esm/config/BackofficeProvider.mjs.map +1 -1
- package/dist/esm/config/BackofficeProvider.native.js +2 -0
- package/dist/esm/config/BackofficeProvider.native.js.map +1 -1
- package/dist/esm/form/DocFormScreen.mjs +126 -17
- package/dist/esm/form/DocFormScreen.mjs.map +1 -1
- package/dist/esm/form/DocFormScreen.native.js +150 -17
- package/dist/esm/form/DocFormScreen.native.js.map +1 -1
- package/dist/esm/form/FormConnections.mjs +38 -6
- package/dist/esm/form/FormConnections.mjs.map +1 -1
- package/dist/esm/form/FormConnections.native.js +37 -6
- package/dist/esm/form/FormConnections.native.js.map +1 -1
- package/dist/esm/form/FormDialogs.mjs +107 -4
- package/dist/esm/form/FormDialogs.mjs.map +1 -1
- package/dist/esm/form/FormDialogs.native.js +113 -4
- package/dist/esm/form/FormDialogs.native.js.map +1 -1
- package/dist/esm/form/FormErrorBoundary.mjs +28 -7
- package/dist/esm/form/FormErrorBoundary.mjs.map +1 -1
- package/dist/esm/form/FormErrorBoundary.native.js +27 -7
- package/dist/esm/form/FormErrorBoundary.native.js.map +1 -1
- package/dist/esm/form/FormSidebarPanel.mjs +71 -23
- package/dist/esm/form/FormSidebarPanel.mjs.map +1 -1
- package/dist/esm/form/FormSidebarPanel.native.js +70 -23
- package/dist/esm/form/FormSidebarPanel.native.js.map +1 -1
- package/dist/esm/form/FormTimeline.mjs +136 -25
- package/dist/esm/form/FormTimeline.mjs.map +1 -1
- package/dist/esm/form/FormTimeline.native.js +174 -27
- package/dist/esm/form/FormTimeline.native.js.map +1 -1
- package/dist/esm/form/FormToolbar.mjs +51 -5
- package/dist/esm/form/FormToolbar.mjs.map +1 -1
- package/dist/esm/form/FormToolbar.native.js +51 -5
- package/dist/esm/form/FormToolbar.native.js.map +1 -1
- package/dist/esm/form/formActions.mjs.map +1 -1
- package/dist/esm/form/formActions.native.js.map +1 -1
- package/dist/esm/form/formLayout.mjs +3 -13
- package/dist/esm/form/formLayout.mjs.map +1 -1
- package/dist/esm/form/formLayout.native.js +7 -13
- package/dist/esm/form/formLayout.native.js.map +1 -1
- package/dist/esm/form/platformHooks.mjs +47 -1
- package/dist/esm/form/platformHooks.mjs.map +1 -1
- package/dist/esm/form/platformHooks.native.js +51 -1
- package/dist/esm/form/platformHooks.native.js.map +1 -1
- package/dist/esm/form/timeline-entries.mjs +56 -13
- package/dist/esm/form/timeline-entries.mjs.map +1 -1
- package/dist/esm/form/timeline-entries.native.js +58 -16
- package/dist/esm/form/timeline-entries.native.js.map +1 -1
- package/dist/esm/i18n/en.mjs +31 -9
- package/dist/esm/i18n/en.mjs.map +1 -1
- package/dist/esm/i18n/en.native.js +31 -9
- package/dist/esm/i18n/en.native.js.map +1 -1
- package/dist/esm/index.mjs +6 -3
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +6 -3
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/list/AddTagsDialog.mjs +12 -7
- package/dist/esm/list/AddTagsDialog.mjs.map +1 -1
- package/dist/esm/list/AddTagsDialog.native.js +12 -7
- package/dist/esm/list/AddTagsDialog.native.js.map +1 -1
- package/dist/esm/list/AssignToDialog.mjs +7 -4
- package/dist/esm/list/AssignToDialog.mjs.map +1 -1
- package/dist/esm/list/AssignToDialog.native.js +7 -4
- package/dist/esm/list/AssignToDialog.native.js.map +1 -1
- package/dist/esm/list/DoctypeListScreen.mjs +127 -156
- package/dist/esm/list/DoctypeListScreen.mjs.map +1 -1
- package/dist/esm/list/DoctypeListScreen.native.js +155 -201
- package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/esm/list/ListFilterBar.mjs +60 -41
- package/dist/esm/list/ListFilterBar.mjs.map +1 -1
- package/dist/esm/list/ListFilterBar.native.js +62 -41
- package/dist/esm/list/ListFilterBar.native.js.map +1 -1
- package/dist/esm/list/ListSidebar.mjs +16 -14
- package/dist/esm/list/ListSidebar.mjs.map +1 -1
- package/dist/esm/list/ListSidebar.native.js +18 -18
- package/dist/esm/list/ListSidebar.native.js.map +1 -1
- package/dist/esm/list/bulk-edit-dialog.mjs +12 -7
- package/dist/esm/list/bulk-edit-dialog.mjs.map +1 -1
- package/dist/esm/list/bulk-edit-dialog.native.js +12 -7
- package/dist/esm/list/bulk-edit-dialog.native.js.map +1 -1
- package/dist/esm/list/filter-fields.mjs +23 -1
- package/dist/esm/list/filter-fields.mjs.map +1 -1
- package/dist/esm/list/filter-fields.native.js +28 -1
- package/dist/esm/list/filter-fields.native.js.map +1 -1
- package/dist/esm/list/filter-saved.mjs +4 -4
- package/dist/esm/list/filter-saved.mjs.map +1 -1
- package/dist/esm/list/filter-saved.native.js +4 -7
- package/dist/esm/list/filter-saved.native.js.map +1 -1
- package/dist/esm/list/filter-sort.mjs +2 -1
- package/dist/esm/list/filter-sort.mjs.map +1 -1
- package/dist/esm/list/filter-sort.native.js +2 -1
- package/dist/esm/list/filter-sort.native.js.map +1 -1
- package/dist/esm/list/filter-standard.mjs +1 -1
- package/dist/esm/list/filter-standard.mjs.map +1 -1
- package/dist/esm/list/filter-standard.native.js +1 -1
- package/dist/esm/list/filter-standard.native.js.map +1 -1
- package/dist/esm/list/listColumns.mjs +261 -112
- package/dist/esm/list/listColumns.mjs.map +1 -1
- package/dist/esm/list/listColumns.native.js +266 -121
- package/dist/esm/list/listColumns.native.js.map +1 -1
- package/dist/esm/list/listFields.mjs +6 -2
- package/dist/esm/list/listFields.mjs.map +1 -1
- package/dist/esm/list/listFields.native.js +8 -2
- package/dist/esm/list/listFields.native.js.map +1 -1
- package/dist/esm/list/sidebar-section.mjs +58 -21
- package/dist/esm/list/sidebar-section.mjs.map +1 -1
- package/dist/esm/list/sidebar-section.native.js +61 -21
- package/dist/esm/list/sidebar-section.native.js.map +1 -1
- package/dist/esm/oneAdapter/index.mjs +5 -1
- package/dist/esm/oneAdapter/index.mjs.map +1 -1
- package/dist/esm/oneAdapter/index.native.js +8 -1
- package/dist/esm/oneAdapter/index.native.js.map +1 -1
- package/dist/esm/quickEntry/quickEntryPlan.mjs +2 -6
- package/dist/esm/quickEntry/quickEntryPlan.mjs.map +1 -1
- package/dist/esm/quickEntry/quickEntryPlan.native.js +4 -6
- package/dist/esm/quickEntry/quickEntryPlan.native.js.map +1 -1
- package/dist/esm/report/QueryReportScreen.mjs +103 -94
- package/dist/esm/report/QueryReportScreen.mjs.map +1 -1
- package/dist/esm/report/QueryReportScreen.native.js +125 -143
- package/dist/esm/report/QueryReportScreen.native.js.map +1 -1
- package/dist/esm/report/queryReportColumns.mjs +9 -1
- package/dist/esm/report/queryReportColumns.mjs.map +1 -1
- package/dist/esm/report/queryReportColumns.native.js +15 -1
- package/dist/esm/report/queryReportColumns.native.js.map +1 -1
- package/dist/esm/report/queryReportFilterBar.mjs +246 -0
- package/dist/esm/report/queryReportFilterBar.mjs.map +1 -0
- package/dist/esm/report/queryReportFilterBar.native.js +308 -0
- package/dist/esm/report/queryReportFilterBar.native.js.map +1 -0
- package/dist/esm/report/queryReportUrlState.mjs +29 -0
- package/dist/esm/report/queryReportUrlState.mjs.map +1 -0
- package/dist/esm/report/queryReportUrlState.native.js +79 -0
- package/dist/esm/report/queryReportUrlState.native.js.map +1 -0
- package/dist/esm/report/report-grid.mjs +158 -53
- package/dist/esm/report/report-grid.mjs.map +1 -1
- package/dist/esm/report/report-grid.native.js +177 -57
- package/dist/esm/report/report-grid.native.js.map +1 -1
- package/dist/esm/report/report-toolbar.mjs +2 -7
- package/dist/esm/report/report-toolbar.mjs.map +1 -1
- package/dist/esm/report/report-toolbar.native.js +7 -7
- package/dist/esm/report/report-toolbar.native.js.map +1 -1
- package/dist/esm/report/reportShapes.mjs +266 -12
- package/dist/esm/report/reportShapes.mjs.map +1 -1
- package/dist/esm/report/reportShapes.native.js +330 -12
- package/dist/esm/report/reportShapes.native.js.map +1 -1
- package/dist/esm/report/reportViewModel.mjs +13 -5
- package/dist/esm/report/reportViewModel.mjs.map +1 -1
- package/dist/esm/report/reportViewModel.native.js +38 -5
- package/dist/esm/report/reportViewModel.native.js.map +1 -1
- package/dist/esm/report/useQueryReport.mjs +46 -20
- package/dist/esm/report/useQueryReport.mjs.map +1 -1
- package/dist/esm/report/useQueryReport.native.js +54 -40
- package/dist/esm/report/useQueryReport.native.js.map +1 -1
- package/dist/esm/shared/deskLinks.mjs +13 -0
- package/dist/esm/shared/deskLinks.mjs.map +1 -0
- package/dist/esm/shared/deskLinks.native.js +14 -0
- package/dist/esm/shared/deskLinks.native.js.map +1 -0
- package/dist/esm/shared/listNavContext.mjs +74 -0
- package/dist/esm/shared/listNavContext.mjs.map +1 -0
- package/dist/esm/shared/listNavContext.native.js +99 -0
- package/dist/esm/shared/listNavContext.native.js.map +1 -0
- package/dist/esm/shared/useDocinfo.mjs +40 -3
- package/dist/esm/shared/useDocinfo.mjs.map +1 -1
- package/dist/esm/shared/useDocinfo.native.js +80 -3
- package/dist/esm/shared/useDocinfo.native.js.map +1 -1
- package/dist/esm/shared/useDoctypeMeta.mjs.map +1 -1
- package/dist/esm/shared/useDoctypeMeta.native.js.map +1 -1
- package/dist/esm/shared/useFrappeApp.mjs +10 -5
- package/dist/esm/shared/useFrappeApp.mjs.map +1 -1
- package/dist/esm/shared/useFrappeApp.native.js +10 -5
- package/dist/esm/shared/useFrappeApp.native.js.map +1 -1
- package/dist/esm/shell/BackofficeShell.mjs +75 -23
- package/dist/esm/shell/BackofficeShell.mjs.map +1 -1
- package/dist/esm/shell/BackofficeShell.native.js +81 -27
- package/dist/esm/shell/BackofficeShell.native.js.map +1 -1
- package/dist/esm/shell/WorkspaceSidebar.mjs +115 -6
- package/dist/esm/shell/WorkspaceSidebar.mjs.map +1 -1
- package/dist/esm/shell/WorkspaceSidebar.native.js +122 -6
- package/dist/esm/shell/WorkspaceSidebar.native.js.map +1 -1
- package/dist/esm/shell/useWorkspaces.mjs +2 -0
- package/dist/esm/shell/useWorkspaces.mjs.map +1 -1
- package/dist/esm/shell/useWorkspaces.native.js +2 -0
- package/dist/esm/shell/useWorkspaces.native.js.map +1 -1
- package/dist/esm/shell/workspaceIcons.mjs +13 -3
- package/dist/esm/shell/workspaceIcons.mjs.map +1 -1
- package/dist/esm/shell/workspaceIcons.native.js +36 -3
- package/dist/esm/shell/workspaceIcons.native.js.map +1 -1
- package/dist/esm/views/CalendarView.mjs +2 -5
- package/dist/esm/views/CalendarView.mjs.map +1 -1
- package/dist/esm/views/CalendarView.native.js +2 -7
- package/dist/esm/views/CalendarView.native.js.map +1 -1
- package/dist/esm/views/DoctypeViewScreen.mjs +7 -3
- package/dist/esm/views/DoctypeViewScreen.mjs.map +1 -1
- package/dist/esm/views/DoctypeViewScreen.native.js +7 -3
- package/dist/esm/views/DoctypeViewScreen.native.js.map +1 -1
- package/dist/esm/views/KanbanView.mjs +2 -0
- package/dist/esm/views/KanbanView.mjs.map +1 -1
- package/dist/esm/views/KanbanView.native.js +2 -0
- package/dist/esm/views/KanbanView.native.js.map +1 -1
- package/dist/esm/views/ViewHeader.mjs +49 -78
- package/dist/esm/views/ViewHeader.mjs.map +1 -1
- package/dist/esm/views/ViewHeader.native.js +55 -82
- package/dist/esm/views/ViewHeader.native.js.map +1 -1
- package/dist/esm/views/ViewSwitcherMenu.mjs +69 -0
- package/dist/esm/views/ViewSwitcherMenu.mjs.map +1 -0
- package/dist/esm/views/ViewSwitcherMenu.native.js +70 -0
- package/dist/esm/views/ViewSwitcherMenu.native.js.map +1 -0
- package/dist/esm/views/connection.mjs +5 -1
- package/dist/esm/views/connection.mjs.map +1 -1
- package/dist/esm/views/connection.native.js +5 -1
- package/dist/esm/views/connection.native.js.map +1 -1
- package/dist/esm/views/dashboard-data.mjs +2 -3
- package/dist/esm/views/dashboard-data.mjs.map +1 -1
- package/dist/esm/views/dashboard-data.native.js +2 -5
- package/dist/esm/views/dashboard-data.native.js.map +1 -1
- package/dist/esm/views/kanban-board-controls.mjs +4 -9
- package/dist/esm/views/kanban-board-controls.mjs.map +1 -1
- package/dist/esm/views/kanban-board-controls.native.js +9 -10
- package/dist/esm/views/kanban-board-controls.native.js.map +1 -1
- package/dist/esm/views/viewAvailability.mjs +33 -0
- package/dist/esm/views/viewAvailability.mjs.map +1 -0
- package/dist/esm/views/viewAvailability.native.js +34 -0
- package/dist/esm/views/viewAvailability.native.js.map +1 -0
- package/dist/esm/workspace/WorkspaceLinkCard.mjs +121 -26
- package/dist/esm/workspace/WorkspaceLinkCard.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkCard.native.js +127 -29
- package/dist/esm/workspace/WorkspaceLinkCard.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkDirectory.mjs +27 -21
- package/dist/esm/workspace/WorkspaceLinkDirectory.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkDirectory.native.js +32 -23
- package/dist/esm/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceNumberCard.mjs +1 -1
- package/dist/esm/workspace/WorkspaceNumberCard.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceNumberCard.native.js +1 -1
- package/dist/esm/workspace/WorkspaceNumberCard.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceQuickList.mjs +62 -30
- package/dist/esm/workspace/WorkspaceQuickList.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceQuickList.native.js +66 -33
- package/dist/esm/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceRecents.mjs +9 -1
- package/dist/esm/workspace/WorkspaceRecents.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceRecents.native.js +9 -1
- package/dist/esm/workspace/WorkspaceRecents.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceShortcut.mjs +11 -1
- package/dist/esm/workspace/WorkspaceShortcut.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceShortcut.native.js +11 -1
- package/dist/esm/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/dist/esm/workspace/parseContent.mjs +21 -1
- package/dist/esm/workspace/parseContent.mjs.map +1 -1
- package/dist/esm/workspace/parseContent.native.js +23 -1
- package/dist/esm/workspace/parseContent.native.js.map +1 -1
- package/dist/jsx/chrome/BackofficeAwesomebar.mjs +1 -0
- package/dist/jsx/chrome/BackofficeAwesomebar.mjs.map +1 -1
- package/dist/jsx/chrome/BackofficeAwesomebar.native.js +1 -0
- package/dist/jsx/chrome/BackofficeAwesomebar.native.js.map +1 -1
- package/dist/jsx/chrome/CommandPalette.mjs +96 -19
- package/dist/jsx/chrome/CommandPalette.mjs.map +1 -1
- package/dist/jsx/chrome/CommandPalette.native.js +114 -31
- package/dist/jsx/chrome/CommandPalette.native.js.map +1 -1
- package/dist/jsx/chrome/HelpMenu.mjs +41 -56
- package/dist/jsx/chrome/HelpMenu.mjs.map +1 -1
- package/dist/jsx/chrome/HelpMenu.native.js +50 -66
- package/dist/jsx/chrome/HelpMenu.native.js.map +1 -1
- package/dist/jsx/chrome/awesomebar-data.mjs +51 -9
- package/dist/jsx/chrome/awesomebar-data.mjs.map +1 -1
- package/dist/jsx/chrome/awesomebar-data.native.js +58 -10
- package/dist/jsx/chrome/awesomebar-data.native.js.map +1 -1
- package/dist/jsx/chrome/command-palette-model.mjs +2 -3
- package/dist/jsx/chrome/command-palette-model.mjs.map +1 -1
- package/dist/jsx/chrome/command-palette-model.native.js +1 -2
- package/dist/jsx/chrome/command-palette-model.native.js.map +1 -1
- package/dist/jsx/chrome/notifications-data.mjs +2 -0
- package/dist/jsx/chrome/notifications-data.mjs.map +1 -1
- package/dist/jsx/chrome/notifications-data.native.js +2 -0
- package/dist/jsx/chrome/notifications-data.native.js.map +1 -1
- package/dist/jsx/chrome/notifications-panel.mjs +15 -5
- package/dist/jsx/chrome/notifications-panel.mjs.map +1 -1
- package/dist/jsx/chrome/notifications-panel.native.js +16 -4
- package/dist/jsx/chrome/notifications-panel.native.js.map +1 -1
- package/dist/jsx/chrome/shortcuts.mjs.map +1 -1
- package/dist/jsx/chrome/shortcuts.native.js.map +1 -1
- package/dist/jsx/config/BackofficeProvider.mjs +2 -0
- package/dist/jsx/config/BackofficeProvider.mjs.map +1 -1
- package/dist/jsx/config/BackofficeProvider.native.js +2 -0
- package/dist/jsx/config/BackofficeProvider.native.js.map +1 -1
- package/dist/jsx/form/DocFormScreen.mjs +126 -17
- package/dist/jsx/form/DocFormScreen.mjs.map +1 -1
- package/dist/jsx/form/DocFormScreen.native.js +147 -14
- package/dist/jsx/form/DocFormScreen.native.js.map +1 -1
- package/dist/jsx/form/FormConnections.mjs +38 -6
- package/dist/jsx/form/FormConnections.mjs.map +1 -1
- package/dist/jsx/form/FormConnections.native.js +36 -5
- package/dist/jsx/form/FormConnections.native.js.map +1 -1
- package/dist/jsx/form/FormDialogs.mjs +107 -4
- package/dist/jsx/form/FormDialogs.mjs.map +1 -1
- package/dist/jsx/form/FormDialogs.native.js +110 -0
- package/dist/jsx/form/FormDialogs.native.js.map +1 -1
- package/dist/jsx/form/FormErrorBoundary.mjs +28 -7
- package/dist/jsx/form/FormErrorBoundary.mjs.map +1 -1
- package/dist/jsx/form/FormErrorBoundary.native.js +25 -5
- package/dist/jsx/form/FormErrorBoundary.native.js.map +1 -1
- package/dist/jsx/form/FormSidebarPanel.mjs +71 -23
- package/dist/jsx/form/FormSidebarPanel.mjs.map +1 -1
- package/dist/jsx/form/FormSidebarPanel.native.js +70 -22
- package/dist/jsx/form/FormSidebarPanel.native.js.map +1 -1
- package/dist/jsx/form/FormTimeline.mjs +136 -25
- package/dist/jsx/form/FormTimeline.mjs.map +1 -1
- package/dist/jsx/form/FormTimeline.native.js +171 -24
- package/dist/jsx/form/FormTimeline.native.js.map +1 -1
- package/dist/jsx/form/FormToolbar.mjs +51 -5
- package/dist/jsx/form/FormToolbar.mjs.map +1 -1
- package/dist/jsx/form/FormToolbar.native.js +50 -4
- package/dist/jsx/form/FormToolbar.native.js.map +1 -1
- package/dist/jsx/form/formActions.mjs.map +1 -1
- package/dist/jsx/form/formActions.native.js.map +1 -1
- package/dist/jsx/form/formLayout.mjs +3 -13
- package/dist/jsx/form/formLayout.mjs.map +1 -1
- package/dist/jsx/form/formLayout.native.js +7 -13
- package/dist/jsx/form/formLayout.native.js.map +1 -1
- package/dist/jsx/form/platformHooks.mjs +47 -1
- package/dist/jsx/form/platformHooks.mjs.map +1 -1
- package/dist/jsx/form/platformHooks.native.js +52 -0
- package/dist/jsx/form/platformHooks.native.js.map +1 -1
- package/dist/jsx/form/timeline-entries.mjs +56 -13
- package/dist/jsx/form/timeline-entries.mjs.map +1 -1
- package/dist/jsx/form/timeline-entries.native.js +58 -16
- package/dist/jsx/form/timeline-entries.native.js.map +1 -1
- package/dist/jsx/i18n/en.mjs +31 -9
- package/dist/jsx/i18n/en.mjs.map +1 -1
- package/dist/jsx/i18n/en.native.js +31 -9
- package/dist/jsx/i18n/en.native.js.map +1 -1
- package/dist/jsx/index.js +6 -3
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +6 -3
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +13 -1
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/list/AddTagsDialog.mjs +12 -7
- package/dist/jsx/list/AddTagsDialog.mjs.map +1 -1
- package/dist/jsx/list/AddTagsDialog.native.js +12 -7
- package/dist/jsx/list/AddTagsDialog.native.js.map +1 -1
- package/dist/jsx/list/AssignToDialog.mjs +7 -4
- package/dist/jsx/list/AssignToDialog.mjs.map +1 -1
- package/dist/jsx/list/AssignToDialog.native.js +7 -4
- package/dist/jsx/list/AssignToDialog.native.js.map +1 -1
- package/dist/jsx/list/DoctypeListScreen.mjs +127 -156
- package/dist/jsx/list/DoctypeListScreen.mjs.map +1 -1
- package/dist/jsx/list/DoctypeListScreen.native.js +152 -198
- package/dist/jsx/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/jsx/list/ListFilterBar.mjs +60 -41
- package/dist/jsx/list/ListFilterBar.mjs.map +1 -1
- package/dist/jsx/list/ListFilterBar.native.js +62 -41
- package/dist/jsx/list/ListFilterBar.native.js.map +1 -1
- package/dist/jsx/list/ListSidebar.mjs +16 -14
- package/dist/jsx/list/ListSidebar.mjs.map +1 -1
- package/dist/jsx/list/ListSidebar.native.js +17 -17
- package/dist/jsx/list/ListSidebar.native.js.map +1 -1
- package/dist/jsx/list/bulk-edit-dialog.mjs +12 -7
- package/dist/jsx/list/bulk-edit-dialog.mjs.map +1 -1
- package/dist/jsx/list/bulk-edit-dialog.native.js +12 -7
- package/dist/jsx/list/bulk-edit-dialog.native.js.map +1 -1
- package/dist/jsx/list/filter-fields.mjs +23 -1
- package/dist/jsx/list/filter-fields.mjs.map +1 -1
- package/dist/jsx/list/filter-fields.native.js +28 -1
- package/dist/jsx/list/filter-fields.native.js.map +1 -1
- package/dist/jsx/list/filter-saved.mjs +4 -4
- package/dist/jsx/list/filter-saved.mjs.map +1 -1
- package/dist/jsx/list/filter-saved.native.js +4 -7
- package/dist/jsx/list/filter-saved.native.js.map +1 -1
- package/dist/jsx/list/filter-sort.mjs +2 -1
- package/dist/jsx/list/filter-sort.mjs.map +1 -1
- package/dist/jsx/list/filter-sort.native.js +2 -1
- package/dist/jsx/list/filter-sort.native.js.map +1 -1
- package/dist/jsx/list/filter-standard.mjs +1 -1
- package/dist/jsx/list/filter-standard.mjs.map +1 -1
- package/dist/jsx/list/filter-standard.native.js +1 -1
- package/dist/jsx/list/filter-standard.native.js.map +1 -1
- package/dist/jsx/list/listColumns.mjs +261 -112
- package/dist/jsx/list/listColumns.mjs.map +1 -1
- package/dist/jsx/list/listColumns.native.js +263 -118
- package/dist/jsx/list/listColumns.native.js.map +1 -1
- package/dist/jsx/list/listFields.mjs +6 -2
- package/dist/jsx/list/listFields.mjs.map +1 -1
- package/dist/jsx/list/listFields.native.js +8 -1
- package/dist/jsx/list/listFields.native.js.map +1 -1
- package/dist/jsx/list/sidebar-section.mjs +58 -21
- package/dist/jsx/list/sidebar-section.mjs.map +1 -1
- package/dist/jsx/list/sidebar-section.native.js +60 -19
- package/dist/jsx/list/sidebar-section.native.js.map +1 -1
- package/dist/jsx/oneAdapter/index.mjs +5 -1
- package/dist/jsx/oneAdapter/index.mjs.map +1 -1
- package/dist/jsx/oneAdapter/index.native.js +8 -1
- package/dist/jsx/oneAdapter/index.native.js.map +1 -1
- package/dist/jsx/quickEntry/quickEntryPlan.mjs +2 -6
- package/dist/jsx/quickEntry/quickEntryPlan.mjs.map +1 -1
- package/dist/jsx/quickEntry/quickEntryPlan.native.js +4 -6
- package/dist/jsx/quickEntry/quickEntryPlan.native.js.map +1 -1
- package/dist/jsx/report/QueryReportScreen.mjs +103 -94
- package/dist/jsx/report/QueryReportScreen.mjs.map +1 -1
- package/dist/jsx/report/QueryReportScreen.native.js +125 -143
- package/dist/jsx/report/QueryReportScreen.native.js.map +1 -1
- package/dist/jsx/report/queryReportColumns.mjs +9 -1
- package/dist/jsx/report/queryReportColumns.mjs.map +1 -1
- package/dist/jsx/report/queryReportColumns.native.js +16 -1
- package/dist/jsx/report/queryReportColumns.native.js.map +1 -1
- package/dist/jsx/report/queryReportFilterBar.mjs +246 -0
- package/dist/jsx/report/queryReportFilterBar.mjs.map +1 -0
- package/dist/jsx/report/queryReportFilterBar.native.js +339 -0
- package/dist/jsx/report/queryReportFilterBar.native.js.map +1 -0
- package/dist/jsx/report/queryReportUrlState.mjs +29 -0
- package/dist/jsx/report/queryReportUrlState.mjs.map +1 -0
- package/dist/jsx/report/queryReportUrlState.native.js +108 -0
- package/dist/jsx/report/queryReportUrlState.native.js.map +1 -0
- package/dist/jsx/report/report-grid.mjs +158 -53
- package/dist/jsx/report/report-grid.mjs.map +1 -1
- package/dist/jsx/report/report-grid.native.js +174 -54
- package/dist/jsx/report/report-grid.native.js.map +1 -1
- package/dist/jsx/report/report-toolbar.mjs +2 -7
- package/dist/jsx/report/report-toolbar.mjs.map +1 -1
- package/dist/jsx/report/report-toolbar.native.js +6 -6
- package/dist/jsx/report/report-toolbar.native.js.map +1 -1
- package/dist/jsx/report/reportShapes.mjs +266 -12
- package/dist/jsx/report/reportShapes.mjs.map +1 -1
- package/dist/jsx/report/reportShapes.native.js +333 -11
- package/dist/jsx/report/reportShapes.native.js.map +1 -1
- package/dist/jsx/report/reportViewModel.mjs +13 -5
- package/dist/jsx/report/reportViewModel.mjs.map +1 -1
- package/dist/jsx/report/reportViewModel.native.js +38 -5
- package/dist/jsx/report/reportViewModel.native.js.map +1 -1
- package/dist/jsx/report/useQueryReport.mjs +46 -20
- package/dist/jsx/report/useQueryReport.mjs.map +1 -1
- package/dist/jsx/report/useQueryReport.native.js +56 -37
- package/dist/jsx/report/useQueryReport.native.js.map +1 -1
- package/dist/jsx/shared/deskLinks.mjs +13 -0
- package/dist/jsx/shared/deskLinks.mjs.map +1 -0
- package/dist/jsx/shared/deskLinks.native.js +43 -0
- package/dist/jsx/shared/deskLinks.native.js.map +1 -0
- package/dist/jsx/shared/listNavContext.mjs +74 -0
- package/dist/jsx/shared/listNavContext.mjs.map +1 -0
- package/dist/jsx/shared/listNavContext.native.js +130 -0
- package/dist/jsx/shared/listNavContext.native.js.map +1 -0
- package/dist/jsx/shared/useDocinfo.mjs +40 -3
- package/dist/jsx/shared/useDocinfo.mjs.map +1 -1
- package/dist/jsx/shared/useDocinfo.native.js +82 -2
- package/dist/jsx/shared/useDocinfo.native.js.map +1 -1
- package/dist/jsx/shared/useDoctypeMeta.mjs.map +1 -1
- package/dist/jsx/shared/useDoctypeMeta.native.js.map +1 -1
- package/dist/jsx/shared/useFrappeApp.mjs +10 -5
- package/dist/jsx/shared/useFrappeApp.mjs.map +1 -1
- package/dist/jsx/shared/useFrappeApp.native.js +10 -5
- package/dist/jsx/shared/useFrappeApp.native.js.map +1 -1
- package/dist/jsx/shell/BackofficeShell.mjs +75 -23
- package/dist/jsx/shell/BackofficeShell.mjs.map +1 -1
- package/dist/jsx/shell/BackofficeShell.native.js +89 -24
- package/dist/jsx/shell/BackofficeShell.native.js.map +1 -1
- package/dist/jsx/shell/WorkspaceSidebar.mjs +115 -6
- package/dist/jsx/shell/WorkspaceSidebar.mjs.map +1 -1
- package/dist/jsx/shell/WorkspaceSidebar.native.js +120 -4
- package/dist/jsx/shell/WorkspaceSidebar.native.js.map +1 -1
- package/dist/jsx/shell/useWorkspaces.mjs +2 -0
- package/dist/jsx/shell/useWorkspaces.mjs.map +1 -1
- package/dist/jsx/shell/useWorkspaces.native.js +2 -0
- package/dist/jsx/shell/useWorkspaces.native.js.map +1 -1
- package/dist/jsx/shell/workspaceIcons.mjs +13 -3
- package/dist/jsx/shell/workspaceIcons.mjs.map +1 -1
- package/dist/jsx/shell/workspaceIcons.native.js +35 -2
- package/dist/jsx/shell/workspaceIcons.native.js.map +1 -1
- package/dist/jsx/views/CalendarView.mjs +2 -5
- package/dist/jsx/views/CalendarView.mjs.map +1 -1
- package/dist/jsx/views/CalendarView.native.js +1 -6
- package/dist/jsx/views/CalendarView.native.js.map +1 -1
- package/dist/jsx/views/DoctypeViewScreen.mjs +7 -3
- package/dist/jsx/views/DoctypeViewScreen.mjs.map +1 -1
- package/dist/jsx/views/DoctypeViewScreen.native.js +7 -3
- package/dist/jsx/views/DoctypeViewScreen.native.js.map +1 -1
- package/dist/jsx/views/KanbanView.mjs +2 -0
- package/dist/jsx/views/KanbanView.mjs.map +1 -1
- package/dist/jsx/views/KanbanView.native.js +2 -0
- package/dist/jsx/views/KanbanView.native.js.map +1 -1
- package/dist/jsx/views/ViewHeader.mjs +49 -78
- package/dist/jsx/views/ViewHeader.mjs.map +1 -1
- package/dist/jsx/views/ViewHeader.native.js +51 -78
- package/dist/jsx/views/ViewHeader.native.js.map +1 -1
- package/dist/jsx/views/ViewSwitcherMenu.mjs +69 -0
- package/dist/jsx/views/ViewSwitcherMenu.mjs.map +1 -0
- package/dist/jsx/views/ViewSwitcherMenu.native.js +99 -0
- package/dist/jsx/views/ViewSwitcherMenu.native.js.map +1 -0
- package/dist/jsx/views/connection.mjs +5 -1
- package/dist/jsx/views/connection.mjs.map +1 -1
- package/dist/jsx/views/connection.native.js +5 -1
- package/dist/jsx/views/connection.native.js.map +1 -1
- package/dist/jsx/views/dashboard-data.mjs +2 -3
- package/dist/jsx/views/dashboard-data.mjs.map +1 -1
- package/dist/jsx/views/dashboard-data.native.js +1 -4
- package/dist/jsx/views/dashboard-data.native.js.map +1 -1
- package/dist/jsx/views/kanban-board-controls.mjs +4 -9
- package/dist/jsx/views/kanban-board-controls.mjs.map +1 -1
- package/dist/jsx/views/kanban-board-controls.native.js +9 -10
- package/dist/jsx/views/kanban-board-controls.native.js.map +1 -1
- package/dist/jsx/views/viewAvailability.mjs +33 -0
- package/dist/jsx/views/viewAvailability.mjs.map +1 -0
- package/dist/jsx/views/viewAvailability.native.js +63 -0
- package/dist/jsx/views/viewAvailability.native.js.map +1 -0
- package/dist/jsx/workspace/WorkspaceLinkCard.mjs +121 -26
- package/dist/jsx/workspace/WorkspaceLinkCard.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceLinkCard.native.js +126 -28
- package/dist/jsx/workspace/WorkspaceLinkCard.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceLinkDirectory.mjs +27 -21
- package/dist/jsx/workspace/WorkspaceLinkDirectory.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceLinkDirectory.native.js +32 -23
- package/dist/jsx/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceNumberCard.mjs +1 -1
- package/dist/jsx/workspace/WorkspaceNumberCard.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceNumberCard.native.js +1 -1
- package/dist/jsx/workspace/WorkspaceNumberCard.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceQuickList.mjs +62 -30
- package/dist/jsx/workspace/WorkspaceQuickList.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceQuickList.native.js +65 -32
- package/dist/jsx/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceRecents.mjs +9 -1
- package/dist/jsx/workspace/WorkspaceRecents.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceRecents.native.js +8 -0
- package/dist/jsx/workspace/WorkspaceRecents.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceShortcut.mjs +11 -1
- package/dist/jsx/workspace/WorkspaceShortcut.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceShortcut.native.js +10 -0
- package/dist/jsx/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/dist/jsx/workspace/parseContent.mjs +21 -1
- package/dist/jsx/workspace/parseContent.mjs.map +1 -1
- package/dist/jsx/workspace/parseContent.native.js +24 -0
- package/dist/jsx/workspace/parseContent.native.js.map +1 -1
- package/package.json +14 -14
- package/src/chrome/BackofficeAwesomebar.tsx +1 -0
- package/src/chrome/CommandPalette.spec.tsx +66 -12
- package/src/chrome/CommandPalette.tsx +139 -37
- package/src/chrome/HelpMenu.tsx +48 -67
- package/src/chrome/awesomebar-data.spec.ts +46 -0
- package/src/chrome/awesomebar-data.tsx +62 -12
- package/src/chrome/command-palette-model.ts +2 -2
- package/src/chrome/notifications-data.tsx +2 -0
- package/src/chrome/notifications-panel.tsx +21 -5
- package/src/chrome/shortcuts.ts +2 -0
- package/src/config/BackofficeProvider.tsx +15 -0
- package/src/form/DocFormScreen.tsx +169 -15
- package/src/form/FormConnections.tsx +34 -5
- package/src/form/FormDialogs.tsx +117 -3
- package/src/form/FormErrorBoundary.spec.tsx +1 -0
- package/src/form/FormErrorBoundary.tsx +32 -9
- package/src/form/FormSidebarPanel.spec.tsx +57 -0
- package/src/form/FormSidebarPanel.tsx +69 -14
- package/src/form/FormTimeline.optimistic.spec.tsx +187 -0
- package/src/form/FormTimeline.tsx +246 -28
- package/src/form/FormToolbar.tsx +73 -2
- package/src/form/formActions.ts +4 -0
- package/src/form/formLayout.ts +3 -14
- package/src/form/platformHooks.ts +57 -0
- package/src/form/timeline-entries.spec.ts +180 -0
- package/src/form/timeline-entries.tsx +84 -15
- package/src/i18n/en.ts +32 -9
- package/src/index.ts +14 -1
- package/src/list/AddTagsDialog.tsx +10 -5
- package/src/list/AssignToDialog.tsx +5 -2
- package/src/list/DoctypeListScreen.tsx +208 -209
- package/src/list/ListFilterBar.tsx +61 -26
- package/src/list/ListSidebar.tsx +24 -24
- package/src/list/bulk-edit-dialog.tsx +10 -5
- package/src/list/filter-fields.spec.ts +29 -0
- package/src/list/filter-fields.tsx +22 -2
- package/src/list/filter-saved.tsx +16 -16
- package/src/list/filter-sort.tsx +5 -2
- package/src/list/filter-standard.tsx +1 -1
- package/src/list/listColumns.tsx +307 -114
- package/src/list/listFields.spec.ts +16 -2
- package/src/list/listFields.ts +11 -0
- package/src/list/listUrlState.spec.ts +10 -0
- package/src/list/sidebar-section.spec.tsx +28 -0
- package/src/list/sidebar-section.tsx +57 -14
- package/src/oneAdapter/index.tsx +13 -1
- package/src/quickEntry/quickEntryPlan.ts +2 -6
- package/src/report/DoctypeReportView.tsx +3 -3
- package/src/report/QueryReportScreen.spec.tsx +74 -0
- package/src/report/QueryReportScreen.tsx +159 -121
- package/src/report/queryReportColumns.tsx +17 -0
- package/src/report/queryReportFilterBar.spec.tsx +139 -0
- package/src/report/queryReportFilterBar.tsx +315 -0
- package/src/report/queryReportUrlState.spec.ts +61 -0
- package/src/report/queryReportUrlState.ts +68 -0
- package/src/report/report-grid.spec.tsx +175 -0
- package/src/report/report-grid.tsx +211 -48
- package/src/report/report-toolbar.spec.tsx +90 -0
- package/src/report/report-toolbar.tsx +13 -10
- package/src/report/reportShapes.spec.ts +291 -1
- package/src/report/reportShapes.ts +398 -18
- package/src/report/reportViewModel.spec.ts +55 -0
- package/src/report/reportViewModel.ts +27 -8
- package/src/report/useQueryReport.ts +99 -37
- package/src/shared/deskLinks.spec.ts +38 -0
- package/src/shared/deskLinks.ts +31 -0
- package/src/shared/listNavContext.spec.ts +83 -0
- package/src/shared/listNavContext.ts +115 -0
- package/src/shared/useDocinfo.ts +79 -2
- package/src/shared/useDoctypeMeta.ts +4 -0
- package/src/shared/useFrappeApp.ts +12 -3
- package/src/shell/BackofficeShell.spec.tsx +43 -0
- package/src/shell/BackofficeShell.tsx +93 -24
- package/src/shell/WorkspaceSidebar.spec.tsx +82 -0
- package/src/shell/WorkspaceSidebar.tsx +130 -3
- package/src/shell/useWorkspaces.ts +2 -0
- package/src/shell/workspaceIcons.ts +17 -2
- package/src/views/CalendarView.tsx +2 -5
- package/src/views/DoctypeViewScreen.tsx +3 -1
- package/src/views/KanbanView.tsx +7 -1
- package/src/views/ViewHeader.tsx +63 -99
- package/src/views/ViewSwitcherMenu.spec.tsx +44 -0
- package/src/views/ViewSwitcherMenu.tsx +92 -0
- package/src/views/connection.ts +8 -2
- package/src/views/dashboard-data.tsx +2 -3
- package/src/views/kanban-board-controls.tsx +9 -11
- package/src/views/viewAvailability.spec.ts +199 -0
- package/src/views/viewAvailability.ts +85 -0
- package/src/workspace/WorkspaceLinkCard.tsx +118 -22
- package/src/workspace/WorkspaceLinkDirectory.tsx +32 -27
- package/src/workspace/WorkspaceNumberCard.tsx +1 -1
- package/src/workspace/WorkspaceQuickList.tsx +54 -37
- package/src/workspace/WorkspaceRecents.tsx +5 -1
- package/src/workspace/WorkspaceShortcut.tsx +7 -1
- package/src/workspace/parseContent.spec.ts +89 -0
- package/src/workspace/parseContent.ts +32 -0
- package/types/chrome/BackofficeAwesomebar.d.ts.map +1 -1
- package/types/chrome/CommandPalette.d.ts.map +1 -1
- package/types/chrome/HelpMenu.d.ts.map +1 -1
- package/types/chrome/awesomebar-data.d.ts +9 -2
- package/types/chrome/awesomebar-data.d.ts.map +1 -1
- package/types/chrome/command-palette-model.d.ts.map +1 -1
- package/types/chrome/notifications-data.d.ts.map +1 -1
- package/types/chrome/notifications-panel.d.ts.map +1 -1
- package/types/chrome/shortcuts.d.ts.map +1 -1
- package/types/config/BackofficeProvider.d.ts +13 -0
- package/types/config/BackofficeProvider.d.ts.map +1 -1
- package/types/form/DocFormScreen.d.ts.map +1 -1
- package/types/form/FormConnections.d.ts.map +1 -1
- package/types/form/FormDialogs.d.ts +14 -0
- package/types/form/FormDialogs.d.ts.map +1 -1
- package/types/form/FormErrorBoundary.d.ts +0 -5
- package/types/form/FormErrorBoundary.d.ts.map +1 -1
- package/types/form/FormSidebarPanel.d.ts +22 -0
- package/types/form/FormSidebarPanel.d.ts.map +1 -1
- package/types/form/FormTimeline.d.ts.map +1 -1
- package/types/form/FormToolbar.d.ts +19 -2
- package/types/form/FormToolbar.d.ts.map +1 -1
- package/types/form/formActions.d.ts +4 -0
- package/types/form/formActions.d.ts.map +1 -1
- package/types/form/formLayout.d.ts.map +1 -1
- package/types/form/platformHooks.d.ts +11 -0
- package/types/form/platformHooks.d.ts.map +1 -1
- package/types/form/timeline-entries.d.ts +19 -3
- package/types/form/timeline-entries.d.ts.map +1 -1
- package/types/i18n/en.d.ts +30 -9
- package/types/i18n/en.d.ts.map +1 -1
- package/types/index.d.ts +8 -3
- package/types/index.d.ts.map +1 -1
- package/types/list/AddTagsDialog.d.ts.map +1 -1
- package/types/list/AssignToDialog.d.ts.map +1 -1
- package/types/list/DoctypeListScreen.d.ts +1 -1
- package/types/list/DoctypeListScreen.d.ts.map +1 -1
- package/types/list/ListFilterBar.d.ts +12 -1
- package/types/list/ListFilterBar.d.ts.map +1 -1
- package/types/list/bulk-edit-dialog.d.ts.map +1 -1
- package/types/list/filter-fields.d.ts +4 -1
- package/types/list/filter-fields.d.ts.map +1 -1
- package/types/list/filter-saved.d.ts +1 -1
- package/types/list/filter-saved.d.ts.map +1 -1
- package/types/list/filter-sort.d.ts.map +1 -1
- package/types/list/listColumns.d.ts +8 -1
- package/types/list/listColumns.d.ts.map +1 -1
- package/types/list/listFields.d.ts +2 -0
- package/types/list/listFields.d.ts.map +1 -1
- package/types/list/sidebar-section.d.ts +4 -1
- package/types/list/sidebar-section.d.ts.map +1 -1
- package/types/oneAdapter/index.d.ts.map +1 -1
- package/types/quickEntry/quickEntryPlan.d.ts.map +1 -1
- package/types/report/QueryReportScreen.d.ts +1 -1
- package/types/report/QueryReportScreen.d.ts.map +1 -1
- package/types/report/queryReportColumns.d.ts +2 -0
- package/types/report/queryReportColumns.d.ts.map +1 -1
- package/types/report/queryReportFilterBar.d.ts +22 -0
- package/types/report/queryReportFilterBar.d.ts.map +1 -0
- package/types/report/queryReportUrlState.d.ts +29 -0
- package/types/report/queryReportUrlState.d.ts.map +1 -0
- package/types/report/report-grid.d.ts.map +1 -1
- package/types/report/report-toolbar.d.ts.map +1 -1
- package/types/report/reportShapes.d.ts +49 -2
- package/types/report/reportShapes.d.ts.map +1 -1
- package/types/report/reportViewModel.d.ts +7 -3
- package/types/report/reportViewModel.d.ts.map +1 -1
- package/types/report/useQueryReport.d.ts +10 -5
- package/types/report/useQueryReport.d.ts.map +1 -1
- package/types/shared/deskLinks.d.ts +16 -0
- package/types/shared/deskLinks.d.ts.map +1 -0
- package/types/shared/listNavContext.d.ts +33 -0
- package/types/shared/listNavContext.d.ts.map +1 -0
- package/types/shared/useDocinfo.d.ts +14 -0
- package/types/shared/useDocinfo.d.ts.map +1 -1
- package/types/shared/useDoctypeMeta.d.ts +4 -0
- package/types/shared/useDoctypeMeta.d.ts.map +1 -1
- package/types/shared/useFrappeApp.d.ts.map +1 -1
- package/types/shell/BackofficeShell.d.ts.map +1 -1
- package/types/shell/WorkspaceSidebar.d.ts.map +1 -1
- package/types/shell/useWorkspaces.d.ts.map +1 -1
- package/types/shell/workspaceIcons.d.ts +1 -1
- package/types/shell/workspaceIcons.d.ts.map +1 -1
- package/types/views/CalendarView.d.ts.map +1 -1
- package/types/views/DoctypeViewScreen.d.ts.map +1 -1
- package/types/views/KanbanView.d.ts.map +1 -1
- package/types/views/ViewHeader.d.ts +6 -6
- package/types/views/ViewHeader.d.ts.map +1 -1
- package/types/views/ViewSwitcherMenu.d.ts +14 -0
- package/types/views/ViewSwitcherMenu.d.ts.map +1 -0
- package/types/views/connection.d.ts +4 -0
- package/types/views/connection.d.ts.map +1 -1
- package/types/views/dashboard-data.d.ts.map +1 -1
- package/types/views/kanban-board-controls.d.ts +3 -2
- package/types/views/kanban-board-controls.d.ts.map +1 -1
- package/types/views/viewAvailability.d.ts +27 -0
- package/types/views/viewAvailability.d.ts.map +1 -0
- package/types/workspace/WorkspaceLinkCard.d.ts +7 -1
- package/types/workspace/WorkspaceLinkCard.d.ts.map +1 -1
- package/types/workspace/WorkspaceLinkDirectory.d.ts +1 -6
- package/types/workspace/WorkspaceLinkDirectory.d.ts.map +1 -1
- package/types/workspace/WorkspaceQuickList.d.ts.map +1 -1
- package/types/workspace/WorkspaceRecents.d.ts.map +1 -1
- package/types/workspace/WorkspaceShortcut.d.ts.map +1 -1
- package/types/workspace/parseContent.d.ts +18 -0
- package/types/workspace/parseContent.d.ts.map +1 -1
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
// Data hook for frappe Query / Script Reports (the desk
|
|
2
2
|
// /app/query-report/<name> surface): loads the Report doc (title,
|
|
3
|
-
// ref_doctype, doc-level filters)
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// ref_doctype, doc-level filters) plus the desk-side script module
|
|
4
|
+
// (frappe.desk.query_report.get_script) and runs
|
|
5
|
+
// frappe.desk.query_report.run. Wire-shape normalization (and the probed
|
|
6
|
+
// response documentation) lives in reportShapes.ts; this file owns
|
|
7
|
+
// fetch/state.
|
|
6
8
|
//
|
|
7
9
|
// GET /api/method/frappe.client.get {doctype:"Report", name}
|
|
8
10
|
// → {message: {report_name, ref_doctype, report_type, disabled,
|
|
9
11
|
// prepared_report, add_total_row, filters: [...], ...}}
|
|
12
|
+
// GET /api/method/frappe.desk.query_report.get_script {report_name}
|
|
13
|
+
// → {message: {script, html_format, execution_time, filters}}
|
|
10
14
|
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
15
|
+
// Filter meta sources (desk precedence, query_report.js setup): the script
|
|
16
|
+
// module's declarative `filters` win when the script declares any; the
|
|
17
|
+
// Report doc `filters` child table applies only when it doesn't. Script
|
|
18
|
+
// filters are extracted from the raw JS text without eval
|
|
19
|
+
// (reportShapes.extractScriptFilters) — entries beyond the declarative
|
|
20
|
+
// subset (get_query functions, dynamic defaults, desk-only fieldtypes)
|
|
21
|
+
// surface as `scriptFilterGap` so the screen can render an honest note.
|
|
14
22
|
// `ignore_prepared_report` forces a synchronous run for prepared reports
|
|
15
23
|
// (desk's background Prepared Report queue is out of scope here).
|
|
16
24
|
import type { FrappeApp } from "@multiplatform.one/frappe";
|
|
@@ -24,6 +32,9 @@ import {
|
|
|
24
32
|
type QueryReportMeta,
|
|
25
33
|
type QueryReportRow,
|
|
26
34
|
type QueryReportRunMessage,
|
|
35
|
+
buildRunFilters,
|
|
36
|
+
defaultFilterValues,
|
|
37
|
+
extractScriptFilters,
|
|
27
38
|
humanizeFrappeError,
|
|
28
39
|
isEmptyFilterValue,
|
|
29
40
|
normalizeFilterMeta,
|
|
@@ -32,6 +43,11 @@ import {
|
|
|
32
43
|
} from "./reportShapes";
|
|
33
44
|
|
|
34
45
|
export {
|
|
46
|
+
buildRunFilters,
|
|
47
|
+
compactQueryReportFilters,
|
|
48
|
+
defaultFilterValues,
|
|
49
|
+
extractScriptFilters,
|
|
50
|
+
isEmptyFilterValue,
|
|
35
51
|
normalizeQueryReportColumns,
|
|
36
52
|
normalizeQueryReportRows,
|
|
37
53
|
scrubFieldname,
|
|
@@ -44,9 +60,11 @@ export type {
|
|
|
44
60
|
QueryReportFixture,
|
|
45
61
|
QueryReportMeta,
|
|
46
62
|
QueryReportRow,
|
|
63
|
+
ScriptFilterExtraction,
|
|
47
64
|
} from "./reportShapes";
|
|
48
65
|
|
|
49
66
|
const RUN_METHOD = "frappe.desk.query_report.run";
|
|
67
|
+
const SCRIPT_METHOD = "frappe.desk.query_report.get_script";
|
|
50
68
|
|
|
51
69
|
export interface UseQueryReportOptions {
|
|
52
70
|
fixture?: QueryReportFixture;
|
|
@@ -58,7 +76,7 @@ export interface UseQueryReportResult {
|
|
|
58
76
|
meta?: QueryReportMeta;
|
|
59
77
|
columns: QueryReportColumn[];
|
|
60
78
|
rows: QueryReportRow[];
|
|
61
|
-
/** True until the first meta+run cycle settles. */
|
|
79
|
+
/** True until the first meta+script+run cycle settles. */
|
|
62
80
|
loading: boolean;
|
|
63
81
|
/** True while a (re)run is in flight. */
|
|
64
82
|
running: boolean;
|
|
@@ -67,9 +85,14 @@ export interface UseQueryReportResult {
|
|
|
67
85
|
serverMessage?: string;
|
|
68
86
|
/** Server-reported run time in seconds. */
|
|
69
87
|
executionTime?: number;
|
|
70
|
-
/**
|
|
88
|
+
/** Merged filter meta: script-declared filters, else doc-level rows. */
|
|
71
89
|
filterMeta: QueryReportFilterMeta[];
|
|
72
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* True when the desk script declares filters this surface could not
|
|
92
|
+
* derive (non-declarative entries) — the honest "defined in code" note.
|
|
93
|
+
*/
|
|
94
|
+
scriptFilterGap: boolean;
|
|
95
|
+
/** Mandatory filters currently unfilled — the run is skipped while non-empty. */
|
|
73
96
|
missingRequired: QueryReportFilterMeta[];
|
|
74
97
|
filters: QueryReportFilters;
|
|
75
98
|
setFilters: (next: QueryReportFilters) => void;
|
|
@@ -86,6 +109,14 @@ async function fetchReportMeta(app: FrappeApp, reportName: string): Promise<Quer
|
|
|
86
109
|
return doc;
|
|
87
110
|
}
|
|
88
111
|
|
|
112
|
+
async function fetchReportScript(app: FrappeApp, reportName: string): Promise<string | undefined> {
|
|
113
|
+
const res = await app.call().get<{ message?: { script?: string | null } }>(SCRIPT_METHOD, {
|
|
114
|
+
report_name: reportName,
|
|
115
|
+
});
|
|
116
|
+
const script = res.payload?.message?.script;
|
|
117
|
+
return typeof script === "string" ? script : undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
89
120
|
export function useQueryReport(
|
|
90
121
|
reportName: string,
|
|
91
122
|
options: UseQueryReportOptions = {},
|
|
@@ -98,7 +129,8 @@ export function useQueryReport(
|
|
|
98
129
|
initialFiltersRef.current = options.initialFilters;
|
|
99
130
|
|
|
100
131
|
const [meta, setMeta] = useState<QueryReportMeta | undefined>(undefined);
|
|
101
|
-
const [
|
|
132
|
+
const [script, setScript] = useState<string | undefined>(undefined);
|
|
133
|
+
const [sourcesSettled, setSourcesSettled] = useState(false);
|
|
102
134
|
const [filters, setFiltersState] = useState<QueryReportFilters>(() => ({
|
|
103
135
|
...initialFiltersRef.current,
|
|
104
136
|
}));
|
|
@@ -120,7 +152,8 @@ export function useQueryReport(
|
|
|
120
152
|
lastReport.current = reportName;
|
|
121
153
|
setFiltersState({ ...initialFiltersRef.current });
|
|
122
154
|
setMeta(undefined);
|
|
123
|
-
|
|
155
|
+
setScript(undefined);
|
|
156
|
+
setSourcesSettled(false);
|
|
124
157
|
setColumns([]);
|
|
125
158
|
setRows([]);
|
|
126
159
|
setError(undefined);
|
|
@@ -129,53 +162,79 @@ export function useQueryReport(
|
|
|
129
162
|
setLoading(true);
|
|
130
163
|
}, [reportName]);
|
|
131
164
|
|
|
132
|
-
// Report doc meta (title, ref_doctype, doc
|
|
133
|
-
// non-fatal — the run below
|
|
165
|
+
// Report doc meta (title, ref_doctype, doc filters) + the desk script
|
|
166
|
+
// module, fetched together. Both are non-fatal niceties — the run below
|
|
167
|
+
// reports the real errors — but the run waits for them so declared
|
|
168
|
+
// defaults are seeded into the FIRST run (desk parity).
|
|
134
169
|
useEffect(() => {
|
|
135
170
|
if (fixture) return;
|
|
136
171
|
if (!app) {
|
|
137
|
-
|
|
172
|
+
setSourcesSettled(true);
|
|
138
173
|
return;
|
|
139
174
|
}
|
|
140
175
|
let cancelled = false;
|
|
141
|
-
|
|
142
|
-
fetchReportMeta(app, reportName)
|
|
143
|
-
|
|
176
|
+
setSourcesSettled(false);
|
|
177
|
+
Promise.allSettled([fetchReportMeta(app, reportName), fetchReportScript(app, reportName)]).then(
|
|
178
|
+
([metaResult, scriptResult]) => {
|
|
144
179
|
if (cancelled) return;
|
|
145
|
-
|
|
146
|
-
|
|
180
|
+
const doc = metaResult.status === "fulfilled" ? metaResult.value : undefined;
|
|
181
|
+
const scriptText = scriptResult.status === "fulfilled" ? scriptResult.value : undefined;
|
|
182
|
+
if (doc) setMeta(doc);
|
|
183
|
+
if (scriptText) setScript(scriptText);
|
|
184
|
+
// Seed filter defaults once per report; user edits (and deep-link
|
|
185
|
+
// initialFilters, already in state) win over defaults.
|
|
147
186
|
if (seededFor.current !== reportName) {
|
|
148
187
|
seededFor.current = reportName;
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
188
|
+
const extraction = extractScriptFilters(scriptText);
|
|
189
|
+
const merged = extraction.declared
|
|
190
|
+
? extraction.filters
|
|
191
|
+
: normalizeFilterMeta(doc?.filters);
|
|
192
|
+
const defaults = defaultFilterValues(merged);
|
|
154
193
|
if (Object.keys(defaults).length > 0)
|
|
155
194
|
setFiltersState((previous) => ({ ...defaults, ...previous }));
|
|
156
195
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
})
|
|
161
|
-
.finally(() => {
|
|
162
|
-
if (!cancelled) setMetaSettled(true);
|
|
163
|
-
});
|
|
196
|
+
setSourcesSettled(true);
|
|
197
|
+
},
|
|
198
|
+
);
|
|
164
199
|
return () => {
|
|
165
200
|
cancelled = true;
|
|
166
201
|
};
|
|
167
202
|
}, [app, fixture, reportName]);
|
|
168
203
|
|
|
169
|
-
const
|
|
204
|
+
const scriptExtraction = useMemo(
|
|
205
|
+
() => extractScriptFilters(fixture ? fixture.script : script),
|
|
206
|
+
[fixture, script],
|
|
207
|
+
);
|
|
208
|
+
const docFilterMeta = useMemo(
|
|
170
209
|
() => normalizeFilterMeta(fixture ? fixture.meta?.filters : meta?.filters),
|
|
171
210
|
[fixture, meta],
|
|
172
211
|
);
|
|
212
|
+
// Desk precedence (query_report.js): the script module's filters apply
|
|
213
|
+
// when the script declares the key at all; doc rows only otherwise.
|
|
214
|
+
const filterMeta = useMemo(
|
|
215
|
+
() => (scriptExtraction.declared ? scriptExtraction.filters : docFilterMeta),
|
|
216
|
+
[scriptExtraction, docFilterMeta],
|
|
217
|
+
);
|
|
218
|
+
const scriptFilterGap = scriptExtraction.declaredCount > scriptExtraction.filters.length;
|
|
173
219
|
|
|
220
|
+
// Fixture branch seeds defaults too (no fetch effect runs for fixtures).
|
|
221
|
+
useEffect(() => {
|
|
222
|
+
if (!fixture) return;
|
|
223
|
+
if (seededFor.current === reportName) return;
|
|
224
|
+
seededFor.current = reportName;
|
|
225
|
+
const defaults = defaultFilterValues(filterMeta);
|
|
226
|
+
if (Object.keys(defaults).length > 0)
|
|
227
|
+
setFiltersState((previous) => ({ ...defaults, ...previous }));
|
|
228
|
+
}, [fixture, reportName, filterMeta]);
|
|
229
|
+
|
|
230
|
+
// Desk parity: defaults SEED the controls (state) once; after that the
|
|
231
|
+
// gate reads the live values only — clearing a defaulted mandatory filter
|
|
232
|
+
// re-gates instead of firing a doomed run (desk's get_filter_values reads
|
|
233
|
+
// control values, not declarations).
|
|
174
234
|
const missingRequired = useMemo(
|
|
175
235
|
() =>
|
|
176
236
|
filterMeta.filter(
|
|
177
|
-
(filter) =>
|
|
178
|
-
filter.mandatory === 1 && isEmptyFilterValue(filters[filter.fieldname] ?? filter.default),
|
|
237
|
+
(filter) => filter.mandatory === 1 && isEmptyFilterValue(filters[filter.fieldname]),
|
|
179
238
|
),
|
|
180
239
|
[filterMeta, filters],
|
|
181
240
|
);
|
|
@@ -184,7 +243,7 @@ export function useQueryReport(
|
|
|
184
243
|
|
|
185
244
|
useEffect(() => {
|
|
186
245
|
if (fixture) return;
|
|
187
|
-
if (!
|
|
246
|
+
if (!sourcesSettled) return;
|
|
188
247
|
if (metaDisabled) {
|
|
189
248
|
setLoading(false);
|
|
190
249
|
return;
|
|
@@ -207,7 +266,7 @@ export function useQueryReport(
|
|
|
207
266
|
.call()
|
|
208
267
|
.post<{ message?: QueryReportRunMessage }>(RUN_METHOD, {
|
|
209
268
|
report_name: reportName,
|
|
210
|
-
filters,
|
|
269
|
+
filters: buildRunFilters(filterMeta, filters),
|
|
211
270
|
ignore_prepared_report: 1,
|
|
212
271
|
})
|
|
213
272
|
.then((res) => {
|
|
@@ -241,8 +300,9 @@ export function useQueryReport(
|
|
|
241
300
|
fixture,
|
|
242
301
|
reportName,
|
|
243
302
|
filters,
|
|
303
|
+
filterMeta,
|
|
244
304
|
generation,
|
|
245
|
-
|
|
305
|
+
sourcesSettled,
|
|
246
306
|
metaDisabled,
|
|
247
307
|
hasMissingRequired,
|
|
248
308
|
]);
|
|
@@ -277,6 +337,7 @@ export function useQueryReport(
|
|
|
277
337
|
serverMessage: fixture?.message,
|
|
278
338
|
executionTime: undefined,
|
|
279
339
|
filterMeta,
|
|
340
|
+
scriptFilterGap,
|
|
280
341
|
missingRequired,
|
|
281
342
|
filters,
|
|
282
343
|
setFilters,
|
|
@@ -294,6 +355,7 @@ export function useQueryReport(
|
|
|
294
355
|
serverMessage,
|
|
295
356
|
executionTime,
|
|
296
357
|
filterMeta,
|
|
358
|
+
scriptFilterGap,
|
|
297
359
|
missingRequired,
|
|
298
360
|
filters,
|
|
299
361
|
setFilters,
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { deskDocUrl, deskViewUrl } from "./deskLinks";
|
|
3
|
+
|
|
4
|
+
const BASE = "http://127.0.0.1:8000";
|
|
5
|
+
|
|
6
|
+
describe("deskDocUrl", () => {
|
|
7
|
+
it("builds the desk form route from doctype + name", () => {
|
|
8
|
+
expect(deskDocUrl(BASE, "Pokemon", "pikachu")).toBe(`${BASE}/app/pokemon/pikachu`);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it("slugs multi-word doctypes like frappe.router.slug", () => {
|
|
12
|
+
expect(deskDocUrl(BASE, "Kanban Board", "Test Board")).toBe(
|
|
13
|
+
`${BASE}/app/kanban-board/Test%20Board`,
|
|
14
|
+
);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("encodes reserved characters in doc names", () => {
|
|
18
|
+
expect(deskDocUrl(BASE, "ToDo", "a/b?c#d")).toBe(`${BASE}/app/todo/a%2Fb%3Fc%23d`);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("trims trailing slashes off the base URL", () => {
|
|
22
|
+
expect(deskDocUrl(`${BASE}/`, "User", "test@example.com")).toBe(
|
|
23
|
+
`${BASE}/app/user/test%40example.com`,
|
|
24
|
+
);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe("deskViewUrl", () => {
|
|
29
|
+
it("list view is desk's bare slug route", () => {
|
|
30
|
+
expect(deskViewUrl(BASE, "ToDo")).toBe(`${BASE}/app/todo`);
|
|
31
|
+
expect(deskViewUrl(BASE, "ToDo", "list")).toBe(`${BASE}/app/todo`);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("alternate views ride /view/<view>", () => {
|
|
35
|
+
expect(deskViewUrl(BASE, "ToDo", "kanban")).toBe(`${BASE}/app/todo/view/kanban`);
|
|
36
|
+
expect(deskViewUrl(BASE, "Sales Order", "report")).toBe(`${BASE}/app/sales-order/view/report`);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desk deep links: backoffice surfaces always offer an "Open in Desk" hop to
|
|
3
|
+
* their native frappe/desk counterpart (`…/app/<slug>[/<name>|/view/<view>]`),
|
|
4
|
+
* the mirror of feature screens deep-linking INTO the backoffice. URL shapes
|
|
5
|
+
* follow desk's router: `frappe.router.slug` doctype slugs, encoded doc
|
|
6
|
+
* names, and bare-slug list routes.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { toSlug, type BackofficeView } from "../navigation/paths";
|
|
10
|
+
|
|
11
|
+
function trimBase(baseURL: string): string {
|
|
12
|
+
return baseURL.replace(/\/+$/, "");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Desk form page for one document: `<base>/app/<slug>/<encoded name>`. */
|
|
16
|
+
export function deskDocUrl(baseURL: string, doctype: string, name: string): string {
|
|
17
|
+
return `${trimBase(baseURL)}/app/${toSlug(doctype)}/${encodeURIComponent(name)}`;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Desk view page for a doctype. List is desk's bare slug route; every other
|
|
22
|
+
* view rides `/view/<view>` (desk and backoffice share the view vocabulary).
|
|
23
|
+
*/
|
|
24
|
+
export function deskViewUrl(
|
|
25
|
+
baseURL: string,
|
|
26
|
+
doctype: string,
|
|
27
|
+
view: BackofficeView = "list",
|
|
28
|
+
): string {
|
|
29
|
+
const base = `${trimBase(baseURL)}/app/${toSlug(doctype)}`;
|
|
30
|
+
return view === "list" ? base : `${base}/view/${view}`;
|
|
31
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// The prev/next pager's context channel: DoctypeListScreen writes the last
|
|
2
|
+
// list order, DocFormScreen reads neighbors. Pins the honest-affordance
|
|
3
|
+
// contract — no context (deep link) resolves to inList=false so the pager
|
|
4
|
+
// hides instead of rendering dead arrows.
|
|
5
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
6
|
+
import {
|
|
7
|
+
getListNavContext,
|
|
8
|
+
getListNavNeighbors,
|
|
9
|
+
resetListNavContext,
|
|
10
|
+
setListNavContext,
|
|
11
|
+
} from "./listNavContext";
|
|
12
|
+
|
|
13
|
+
describe("listNavContext", () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
resetListNavContext();
|
|
16
|
+
sessionStorage.clear();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("round-trips the list order per doctype", () => {
|
|
20
|
+
setListNavContext("ToDo", ["a", "b", "c"]);
|
|
21
|
+
setListNavContext("User", ["x", "y"]);
|
|
22
|
+
expect(getListNavContext("ToDo")).toEqual(["a", "b", "c"]);
|
|
23
|
+
expect(getListNavContext("User")).toEqual(["x", "y"]);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("returns undefined when no context was ever written", () => {
|
|
27
|
+
expect(getListNavContext("ToDo")).toBeUndefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("ignores empty writes so fetch-in-flight renders keep the last order", () => {
|
|
31
|
+
setListNavContext("ToDo", ["a", "b"]);
|
|
32
|
+
setListNavContext("ToDo", []);
|
|
33
|
+
expect(getListNavContext("ToDo")).toEqual(["a", "b"]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("drops non-string and empty names from writes", () => {
|
|
37
|
+
setListNavContext("ToDo", ["a", "", "b"]);
|
|
38
|
+
expect(getListNavContext("ToDo")).toEqual(["a", "b"]);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("computes neighbors at the middle of the order", () => {
|
|
42
|
+
setListNavContext("ToDo", ["a", "b", "c"]);
|
|
43
|
+
expect(getListNavNeighbors("ToDo", "b")).toEqual({ inList: true, prev: "a", next: "c" });
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("omits prev at the first entry and next at the last (boundary honesty)", () => {
|
|
47
|
+
setListNavContext("ToDo", ["a", "b", "c"]);
|
|
48
|
+
expect(getListNavNeighbors("ToDo", "a")).toEqual({ inList: true, next: "b" });
|
|
49
|
+
expect(getListNavNeighbors("ToDo", "c")).toEqual({ inList: true, prev: "b" });
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("reports inList=false for a document outside the last order (deep link)", () => {
|
|
53
|
+
setListNavContext("ToDo", ["a", "b"]);
|
|
54
|
+
expect(getListNavNeighbors("ToDo", "zz")).toEqual({ inList: false });
|
|
55
|
+
expect(getListNavNeighbors("Role", "a")).toEqual({ inList: false });
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("survives a reload through the sessionStorage mirror", () => {
|
|
59
|
+
setListNavContext("ToDo", ["a", "b", "c"]);
|
|
60
|
+
// Simulate a reload: module memory is gone, sessionStorage persists.
|
|
61
|
+
const stored = sessionStorage.getItem("backoffice:listNav:ToDo");
|
|
62
|
+
resetListNavContext();
|
|
63
|
+
expect(stored).not.toBeNull();
|
|
64
|
+
sessionStorage.setItem("backoffice:listNav:ToDo", stored as string);
|
|
65
|
+
expect(getListNavContext("ToDo")).toEqual(["a", "b", "c"]);
|
|
66
|
+
expect(getListNavNeighbors("ToDo", "b")).toEqual({ inList: true, prev: "a", next: "c" });
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("ignores a corrupted sessionStorage mirror", () => {
|
|
70
|
+
sessionStorage.setItem("backoffice:listNav:ToDo", "{not json");
|
|
71
|
+
expect(getListNavContext("ToDo")).toBeUndefined();
|
|
72
|
+
sessionStorage.setItem("backoffice:listNav:ToDo", JSON.stringify({ nope: true }));
|
|
73
|
+
expect(getListNavContext("ToDo")).toBeUndefined();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("skips identical rewrites (table state fires every render)", () => {
|
|
77
|
+
setListNavContext("ToDo", ["a", "b"]);
|
|
78
|
+
const first = getListNavContext("ToDo");
|
|
79
|
+
setListNavContext("ToDo", ["a", "b"]);
|
|
80
|
+
// Same array identity — the write bailed instead of re-mirroring.
|
|
81
|
+
expect(getListNavContext("ToDo")).toBe(first);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Last list-result order per doctype — the prev/next document pager's
|
|
3
|
+
* context channel (desk parity: a form opened FROM a list pages through
|
|
4
|
+
* that list's neighbors in the same order).
|
|
5
|
+
*
|
|
6
|
+
* Write side: DoctypeListScreen mirrors each resolved table page here
|
|
7
|
+
* (display order, current page). Read side: DocFormScreen looks the open
|
|
8
|
+
* document up and pages through its neighbors. The store is module-level
|
|
9
|
+
* (writer and reader never co-mount, so React state buys nothing) with a
|
|
10
|
+
* sessionStorage mirror on web so the context survives a reload honestly —
|
|
11
|
+
* a deep link with no context renders no pager at all (LC-40: no dead
|
|
12
|
+
* arrows).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** Cap stored context so a huge page size cannot bloat sessionStorage. */
|
|
16
|
+
const MAX_NAMES = 1000;
|
|
17
|
+
|
|
18
|
+
const memory = new Map<string, string[]>();
|
|
19
|
+
|
|
20
|
+
function storageKey(doctype: string): string {
|
|
21
|
+
return `backoffice:listNav:${doctype}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function readStorage(doctype: string): string[] | undefined {
|
|
25
|
+
try {
|
|
26
|
+
if (typeof sessionStorage === "undefined") return undefined;
|
|
27
|
+
const raw = sessionStorage.getItem(storageKey(doctype));
|
|
28
|
+
if (!raw) return undefined;
|
|
29
|
+
const parsed: unknown = JSON.parse(raw);
|
|
30
|
+
if (!Array.isArray(parsed)) return undefined;
|
|
31
|
+
const names = parsed.filter(
|
|
32
|
+
(name): name is string => typeof name === "string" && name.length > 0,
|
|
33
|
+
);
|
|
34
|
+
return names.length > 0 ? names : undefined;
|
|
35
|
+
} catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function writeStorage(doctype: string, names: string[]): void {
|
|
41
|
+
try {
|
|
42
|
+
if (typeof sessionStorage === "undefined") return;
|
|
43
|
+
sessionStorage.setItem(storageKey(doctype), JSON.stringify(names));
|
|
44
|
+
} catch {
|
|
45
|
+
// Quota / private-mode failures degrade to in-memory context.
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Record the doctype's current list order. Empty writes are ignored on
|
|
51
|
+
* purpose: the table reports state on every render, including the
|
|
52
|
+
* fetch-in-flight passes where `data` is still `[]` — wiping the context
|
|
53
|
+
* there would kill the pager whenever the list remounts.
|
|
54
|
+
*/
|
|
55
|
+
export function setListNavContext(doctype: string, names: readonly string[]): void {
|
|
56
|
+
const cleaned = names
|
|
57
|
+
.filter((name): name is string => typeof name === "string" && name.length > 0)
|
|
58
|
+
.slice(0, MAX_NAMES);
|
|
59
|
+
if (cleaned.length === 0) return;
|
|
60
|
+
const existing = memory.get(doctype);
|
|
61
|
+
if (
|
|
62
|
+
existing &&
|
|
63
|
+
existing.length === cleaned.length &&
|
|
64
|
+
existing.every((name, index) => name === cleaned[index])
|
|
65
|
+
) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
memory.set(doctype, cleaned);
|
|
69
|
+
writeStorage(doctype, cleaned);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** The last recorded list order for a doctype (memory, then reload mirror). */
|
|
73
|
+
export function getListNavContext(doctype: string): readonly string[] | undefined {
|
|
74
|
+
const inMemory = memory.get(doctype);
|
|
75
|
+
if (inMemory) return inMemory;
|
|
76
|
+
const stored = readStorage(doctype);
|
|
77
|
+
if (stored) memory.set(doctype, stored);
|
|
78
|
+
return stored;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface ListNavNeighbors {
|
|
82
|
+
/** True when `name` is part of the doctype's last list result. */
|
|
83
|
+
inList: boolean;
|
|
84
|
+
prev?: string;
|
|
85
|
+
next?: string;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Neighbors of `name` in the doctype's last list order. */
|
|
89
|
+
export function getListNavNeighbors(doctype: string, name: string): ListNavNeighbors {
|
|
90
|
+
const names = getListNavContext(doctype);
|
|
91
|
+
if (!names) return { inList: false };
|
|
92
|
+
const index = names.indexOf(name);
|
|
93
|
+
if (index < 0) return { inList: false };
|
|
94
|
+
const prev = index > 0 ? names[index - 1] : undefined;
|
|
95
|
+
const next = index < names.length - 1 ? names[index + 1] : undefined;
|
|
96
|
+
return {
|
|
97
|
+
inList: true,
|
|
98
|
+
...(prev !== undefined ? { prev } : {}),
|
|
99
|
+
...(next !== undefined ? { next } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Hard-reset (tests). Clears memory and the sessionStorage mirror. */
|
|
104
|
+
export function resetListNavContext(): void {
|
|
105
|
+
try {
|
|
106
|
+
if (typeof sessionStorage !== "undefined") {
|
|
107
|
+
for (const doctype of memory.keys()) {
|
|
108
|
+
sessionStorage.removeItem(storageKey(doctype));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
} catch {
|
|
112
|
+
// storage unavailable — memory reset below still applies
|
|
113
|
+
}
|
|
114
|
+
memory.clear();
|
|
115
|
+
}
|
package/src/shared/useDocinfo.ts
CHANGED
|
@@ -67,6 +67,83 @@ function cacheKey(doctype: string, name: string) {
|
|
|
67
67
|
return `${doctype}\u0000${name}`;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// Optimistic overlays (the docinfo arm of the ONE optimistic pattern)
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
//
|
|
74
|
+
// An overlay is a pure patch composed ON TOP of the fetched docinfo every
|
|
75
|
+
// time subscribers read it. Optimistic mutations (add comment, assign, tag…)
|
|
76
|
+
// apply as overlays instead of editing the base value, so:
|
|
77
|
+
// - a racing full refetch replaces the BASE and the pending record
|
|
78
|
+
// survives (overlays re-compose on the new base);
|
|
79
|
+
// - rollback is exact — remove the overlay, the base was never touched;
|
|
80
|
+
// - reconcile promotes the ack payload into the base (authoritative
|
|
81
|
+
// server identity) and drops the overlay in one notification, so the
|
|
82
|
+
// optimistic record and the server record converge instead of
|
|
83
|
+
// duplicating.
|
|
84
|
+
// Overlay records should carry a pending marker (e.g. `__optimistic: true`)
|
|
85
|
+
// so surfaces render them visible-but-distinct (Axiom 6 HONEST STATE).
|
|
86
|
+
|
|
87
|
+
interface DocinfoOverlay {
|
|
88
|
+
key: string;
|
|
89
|
+
patch: (info: DocInfo) => DocInfo;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
let overlaySeq = 0;
|
|
93
|
+
const docinfoOverlays = new Map<string, DocinfoOverlay>();
|
|
94
|
+
|
|
95
|
+
function composeDocinfo(key: string, base: DocInfo | undefined): DocInfo | undefined {
|
|
96
|
+
if (!base) return base;
|
|
97
|
+
let composed = base;
|
|
98
|
+
for (const overlay of docinfoOverlays.values()) {
|
|
99
|
+
if (overlay.key === key) composed = overlay.patch(composed);
|
|
100
|
+
}
|
|
101
|
+
return composed;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function notifyDocinfo(key: string) {
|
|
105
|
+
const entry = docinfoCache.get(key);
|
|
106
|
+
if (entry) for (const listener of entry.listeners) listener();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Adds an optimistic overlay to a document's docinfo and wakes subscribers.
|
|
111
|
+
* Returns the overlay id for {@link removeDocinfoOverlay}. The patch must be
|
|
112
|
+
* pure — it re-runs on every read, including on refetched bases.
|
|
113
|
+
*/
|
|
114
|
+
export function addDocinfoOverlay(
|
|
115
|
+
doctype: string,
|
|
116
|
+
name: string,
|
|
117
|
+
patch: (info: DocInfo) => DocInfo,
|
|
118
|
+
): string {
|
|
119
|
+
const key = cacheKey(doctype, name);
|
|
120
|
+
const id = `overlay_${++overlaySeq}`;
|
|
121
|
+
docinfoOverlays.set(id, { key, patch });
|
|
122
|
+
notifyDocinfo(key);
|
|
123
|
+
return id;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Removes an optimistic overlay (rollback or post-reconcile) and wakes subscribers. */
|
|
127
|
+
export function removeDocinfoOverlay(id: string) {
|
|
128
|
+
const overlay = docinfoOverlays.get(id);
|
|
129
|
+
if (!overlay) return;
|
|
130
|
+
docinfoOverlays.delete(id);
|
|
131
|
+
notifyDocinfo(overlay.key);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Permanently patches the fetched docinfo base (reconcile step — promote a
|
|
136
|
+
* server ack into the shared store without a refetch). No-ops when the base
|
|
137
|
+
* has not resolved yet; the in-flight fetch will include the change.
|
|
138
|
+
*/
|
|
139
|
+
export function patchDocinfoBase(doctype: string, name: string, patch: (info: DocInfo) => DocInfo) {
|
|
140
|
+
const key = cacheKey(doctype, name);
|
|
141
|
+
const entry = docinfoCache.get(key);
|
|
142
|
+
if (!entry?.value) return;
|
|
143
|
+
entry.value = patch(entry.value);
|
|
144
|
+
notifyDocinfo(key);
|
|
145
|
+
}
|
|
146
|
+
|
|
70
147
|
/**
|
|
71
148
|
* Shared, deduped fetch of frappe's docinfo for a document. Multiple panels
|
|
72
149
|
* (sidebar, timeline, connections) share one fetch; `reload()` from any of
|
|
@@ -123,14 +200,14 @@ export function useDocinfo(
|
|
|
123
200
|
const currentEntry = entry;
|
|
124
201
|
const sync = () => {
|
|
125
202
|
if (!cancelled && currentEntry.value) {
|
|
126
|
-
setDocinfo(currentEntry.value);
|
|
203
|
+
setDocinfo(composeDocinfo(key, currentEntry.value));
|
|
127
204
|
setLoading(false);
|
|
128
205
|
}
|
|
129
206
|
};
|
|
130
207
|
currentEntry.listeners.add(sync);
|
|
131
208
|
setLoading(!currentEntry.value);
|
|
132
209
|
setError(undefined);
|
|
133
|
-
if (currentEntry.value) setDocinfo(currentEntry.value);
|
|
210
|
+
if (currentEntry.value) setDocinfo(composeDocinfo(key, currentEntry.value));
|
|
134
211
|
currentEntry.promise.catch((err: Error) => {
|
|
135
212
|
if (!cancelled) {
|
|
136
213
|
setError(err);
|
|
@@ -80,6 +80,10 @@ export interface DoctypeMeta {
|
|
|
80
80
|
istable?: 0 | 1;
|
|
81
81
|
is_submittable?: 0 | 1;
|
|
82
82
|
is_tree?: 0 | 1;
|
|
83
|
+
/** Desk treeview_settings asset (`{doctype}_tree.js`) — gates Tree. */
|
|
84
|
+
__tree_js?: string;
|
|
85
|
+
/** Desk calendar_settings asset (`{doctype}_calendar.js`) — gates Calendar. */
|
|
86
|
+
__calendar_js?: string;
|
|
83
87
|
is_virtual?: 0 | 1;
|
|
84
88
|
editable_grid?: 0 | 1;
|
|
85
89
|
track_changes?: 0 | 1;
|