@multiplatform.one/backoffice 7.6.3 → 7.7.1
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.native.js +1 -1
- package/dist/cjs/chrome/BackofficeAwesomebar.native.js.map +1 -1
- package/dist/cjs/chrome/CommandPalette.native.js +1 -1
- package/dist/cjs/chrome/CommandPalette.native.js.map +1 -1
- package/dist/cjs/chrome/HelpMenu.native.js +1 -1
- package/dist/cjs/chrome/HelpMenu.native.js.map +1 -1
- package/dist/cjs/chrome/NotificationsButton.native.js +1 -1
- package/dist/cjs/chrome/NotificationsButton.native.js.map +1 -1
- package/dist/cjs/chrome/UserMenu.native.js +1 -1
- package/dist/cjs/chrome/UserMenu.native.js.map +1 -1
- package/dist/cjs/chrome/awesomebar-data.native.js.map +1 -1
- package/dist/cjs/chrome/command-palette-model.native.js +1 -1
- package/dist/cjs/chrome/command-palette-model.native.js.map +1 -1
- package/dist/cjs/chrome/help-about-dialog.native.js +1 -1
- package/dist/cjs/chrome/help-about-dialog.native.js.map +1 -1
- package/dist/cjs/chrome/help-shortcuts-dialog.native.js +1 -1
- package/dist/cjs/chrome/help-shortcuts-dialog.native.js.map +1 -1
- package/dist/cjs/chrome/notifications-data.native.js.map +1 -1
- package/dist/cjs/chrome/notifications-panel.native.js +1 -1
- package/dist/cjs/chrome/notifications-panel.native.js.map +1 -1
- package/dist/cjs/chrome/notifications-utils.native.js.map +1 -1
- package/dist/cjs/chrome/shortcuts.native.js.map +1 -1
- package/dist/cjs/chrome/user-session.native.js.map +1 -1
- package/dist/cjs/config/BackofficeProvider.native.js +1 -1
- package/dist/cjs/config/BackofficeProvider.native.js.map +1 -1
- package/dist/cjs/config/capabilities.native.js.map +1 -1
- package/dist/cjs/config/events.native.js.map +1 -1
- package/dist/cjs/config/slots.native.js.map +1 -1
- package/dist/cjs/desk/Desk.native.js.map +1 -1
- package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
- package/dist/cjs/desk/resolveDeskPath.native.js.map +1 -1
- package/dist/cjs/desk/scope.native.js.map +1 -1
- package/dist/cjs/desk/target.native.js.map +1 -1
- package/dist/cjs/form/DocFormScreen.native.js +1 -1
- package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
- package/dist/cjs/form/FormConnections.native.js +1 -1
- package/dist/cjs/form/FormConnections.native.js.map +1 -1
- package/dist/cjs/form/FormDialogs.native.js +1 -1
- package/dist/cjs/form/FormDialogs.native.js.map +1 -1
- package/dist/cjs/form/FormErrorBoundary.native.js +1 -1
- package/dist/cjs/form/FormErrorBoundary.native.js.map +1 -1
- package/dist/cjs/form/FormHeaderCluster.native.js +1 -1
- package/dist/cjs/form/FormHeaderCluster.native.js.map +1 -1
- package/dist/cjs/form/FormSidebarPanel.native.js +1 -1
- package/dist/cjs/form/FormSidebarPanel.native.js.map +1 -1
- package/dist/cjs/form/FormTimeline.native.js +1 -1
- package/dist/cjs/form/FormTimeline.native.js.map +1 -1
- package/dist/cjs/form/FormToolbar.native.js +1 -1
- package/dist/cjs/form/FormToolbar.native.js.map +1 -1
- package/dist/cjs/form/connections-data.native.js.map +1 -1
- package/dist/cjs/form/createPrefill.cjs +3 -11
- package/dist/cjs/form/createPrefill.native.js +3 -11
- package/dist/cjs/form/createPrefill.native.js.map +1 -1
- package/dist/cjs/form/dependsOn.native.js.map +1 -1
- package/dist/cjs/form/dirtyTracking.cjs +4 -29
- package/dist/cjs/form/dirtyTracking.native.js +4 -48
- package/dist/cjs/form/dirtyTracking.native.js.map +1 -1
- package/dist/cjs/form/docinfo.native.js.map +1 -1
- package/dist/cjs/form/fetchFrom.cjs +4 -41
- package/dist/cjs/form/fetchFrom.native.js +4 -81
- package/dist/cjs/form/fetchFrom.native.js.map +1 -1
- package/dist/cjs/form/fieldPermissions.cjs +4 -29
- package/dist/cjs/form/fieldPermissions.native.js +4 -51
- package/dist/cjs/form/fieldPermissions.native.js.map +1 -1
- package/dist/cjs/form/formActions.cjs +2 -171
- package/dist/cjs/form/formActions.native.js +2 -178
- package/dist/cjs/form/formActions.native.js.map +1 -1
- package/dist/cjs/form/formLayout.cjs +5 -219
- package/dist/cjs/form/formLayout.native.js +5 -359
- package/dist/cjs/form/formLayout.native.js.map +1 -1
- package/dist/cjs/form/platformHooks.native.js.map +1 -1
- package/dist/cjs/form/sidebar-attachments.native.js +1 -1
- package/dist/cjs/form/sidebar-attachments.native.js.map +1 -1
- package/dist/cjs/form/sidebar-dialogs.native.js +1 -1
- package/dist/cjs/form/sidebar-dialogs.native.js.map +1 -1
- package/dist/cjs/form/sidebar-people.native.js +1 -1
- package/dist/cjs/form/sidebar-people.native.js.map +1 -1
- package/dist/cjs/form/sidebar-rpc.native.js.map +1 -1
- package/dist/cjs/form/sidebar-utils.native.js.map +1 -1
- package/dist/cjs/form/timeline-entries.native.js.map +1 -1
- package/dist/cjs/form/timeline-utils.native.js.map +1 -1
- package/dist/cjs/form/useFormEngine.cjs +2 -361
- package/dist/cjs/form/useFormEngine.native.js +2 -447
- package/dist/cjs/form/useFormEngine.native.js.map +1 -1
- package/dist/cjs/i18n/en.native.js.map +1 -1
- package/dist/cjs/i18n/index.native.js.map +1 -1
- package/dist/cjs/index.native.js +1 -1
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/list/AddTagsDialog.native.js +1 -1
- package/dist/cjs/list/AddTagsDialog.native.js.map +1 -1
- package/dist/cjs/list/AssignToDialog.native.js +1 -1
- package/dist/cjs/list/AssignToDialog.native.js.map +1 -1
- package/dist/cjs/list/DoctypeListScreen.native.js +1 -1
- package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/cjs/list/ListBulkActionsBar.native.js +1 -1
- package/dist/cjs/list/ListBulkActionsBar.native.js.map +1 -1
- package/dist/cjs/list/ListFilterBar.native.js +1 -1
- package/dist/cjs/list/ListFilterBar.native.js.map +1 -1
- package/dist/cjs/list/ListSidebar.native.js +1 -1
- package/dist/cjs/list/ListSidebar.native.js.map +1 -1
- package/dist/cjs/list/bulk-edit-dialog.native.js +1 -1
- package/dist/cjs/list/bulk-edit-dialog.native.js.map +1 -1
- package/dist/cjs/list/bulk-export.native.js.map +1 -1
- package/dist/cjs/list/bulk-submit-cancel.native.js.map +1 -1
- package/dist/cjs/list/bulkActions.native.js.map +1 -1
- package/dist/cjs/list/filter-chips.native.js +1 -1
- package/dist/cjs/list/filter-chips.native.js.map +1 -1
- package/dist/cjs/list/filter-editor.native.js +1 -1
- package/dist/cjs/list/filter-editor.native.js.map +1 -1
- package/dist/cjs/list/filter-fields.native.js.map +1 -1
- package/dist/cjs/list/filter-saved.native.js +1 -1
- package/dist/cjs/list/filter-saved.native.js.map +1 -1
- package/dist/cjs/list/filter-sort.native.js +1 -1
- package/dist/cjs/list/filter-sort.native.js.map +1 -1
- package/dist/cjs/list/filter-standard.native.js.map +1 -1
- package/dist/cjs/list/filterConversion.native.js.map +1 -1
- package/dist/cjs/list/list-tools-sheet.native.js +1 -1
- package/dist/cjs/list/list-tools-sheet.native.js.map +1 -1
- package/dist/cjs/list/listColumns.native.js.map +1 -1
- package/dist/cjs/list/listFields.native.js.map +1 -1
- package/dist/cjs/list/listFormat.native.js.map +1 -1
- package/dist/cjs/list/listUrlState.native.js.map +1 -1
- package/dist/cjs/list/sidebar-section.native.js +1 -1
- package/dist/cjs/list/sidebar-section.native.js.map +1 -1
- package/dist/cjs/list/sidebar-stats.native.js.map +1 -1
- package/dist/cjs/list/statusColors.native.js.map +1 -1
- package/dist/cjs/navigation/navigator.native.js.map +1 -1
- package/dist/cjs/navigation/paths.native.js.map +1 -1
- package/dist/cjs/oneAdapter/index.native.js.map +1 -1
- package/dist/cjs/quickEntry/QuickEntryDialog.native.js +1 -1
- package/dist/cjs/quickEntry/QuickEntryDialog.native.js.map +1 -1
- package/dist/cjs/quickEntry/quickEntryPlan.native.js.map +1 -1
- package/dist/cjs/report/DoctypeReportView.native.js +1 -1
- package/dist/cjs/report/DoctypeReportView.native.js.map +1 -1
- package/dist/cjs/report/QueryReportScreen.native.js +1 -1
- package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
- package/dist/cjs/report/queryReportColumns.native.js.map +1 -1
- package/dist/cjs/report/queryReportFilterBar.native.js +1 -1
- package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
- package/dist/cjs/report/queryReportUrlState.native.js.map +1 -1
- package/dist/cjs/report/report-grid.native.js +1 -1
- package/dist/cjs/report/report-grid.native.js.map +1 -1
- package/dist/cjs/report/report-toolbar.native.js +1 -1
- package/dist/cjs/report/report-toolbar.native.js.map +1 -1
- package/dist/cjs/report/reportShapes.native.js.map +1 -1
- package/dist/cjs/report/reportViewModel.native.js.map +1 -1
- package/dist/cjs/report/savedReports.native.js.map +1 -1
- package/dist/cjs/report/useQueryReport.native.js.map +1 -1
- package/dist/cjs/shared/deskLinks.native.js.map +1 -1
- package/dist/cjs/shared/listNavContext.native.js.map +1 -1
- package/dist/cjs/shared/types.native.js.map +1 -1
- 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.native.js.map +1 -1
- package/dist/cjs/shared/useRecentVisit.native.js.map +1 -1
- package/dist/cjs/shared/useSessionUserId.native.js.map +1 -1
- package/dist/cjs/shared/useSlugTarget.native.js.map +1 -1
- package/dist/cjs/shared/useUserRoles.native.js.map +1 -1
- package/dist/cjs/shell/BackofficeShell.native.js +1 -1
- package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
- package/dist/cjs/shell/HomeRedirect.native.js +1 -1
- package/dist/cjs/shell/HomeRedirect.native.js.map +1 -1
- package/dist/cjs/shell/NotFoundScreen.native.js +1 -1
- package/dist/cjs/shell/NotFoundScreen.native.js.map +1 -1
- package/dist/cjs/shell/SlugScreen.native.js +1 -1
- package/dist/cjs/shell/SlugScreen.native.js.map +1 -1
- package/dist/cjs/shell/WorkspaceSidebar.native.js +1 -1
- package/dist/cjs/shell/WorkspaceSidebar.native.js.map +1 -1
- package/dist/cjs/shell/useWorkspaces.native.js.map +1 -1
- package/dist/cjs/shell/workspaceIcons.native.js.map +1 -1
- package/dist/cjs/views/CalendarView.native.js +1 -1
- package/dist/cjs/views/CalendarView.native.js.map +1 -1
- package/dist/cjs/views/DashboardView.native.js +1 -1
- package/dist/cjs/views/DashboardView.native.js.map +1 -1
- package/dist/cjs/views/DoctypeViewScreen.native.js.map +1 -1
- package/dist/cjs/views/ImageView.native.js +1 -1
- package/dist/cjs/views/ImageView.native.js.map +1 -1
- package/dist/cjs/views/KanbanView.native.js +1 -1
- package/dist/cjs/views/KanbanView.native.js.map +1 -1
- package/dist/cjs/views/ReportView.native.js +1 -1
- package/dist/cjs/views/ReportView.native.js.map +1 -1
- package/dist/cjs/views/TreeView.native.js +1 -1
- package/dist/cjs/views/TreeView.native.js.map +1 -1
- package/dist/cjs/views/ViewHeader.native.js +1 -1
- package/dist/cjs/views/ViewHeader.native.js.map +1 -1
- package/dist/cjs/views/ViewStates.native.js +1 -1
- package/dist/cjs/views/ViewStates.native.js.map +1 -1
- package/dist/cjs/views/ViewSwitcherMenu.native.js +1 -1
- package/dist/cjs/views/ViewSwitcherMenu.native.js.map +1 -1
- package/dist/cjs/views/calendar-field-selector.native.js +1 -1
- package/dist/cjs/views/calendar-field-selector.native.js.map +1 -1
- package/dist/cjs/views/connection.native.js.map +1 -1
- package/dist/cjs/views/dashboard-data.native.js.map +1 -1
- package/dist/cjs/views/deskViewConfigs.native.js.map +1 -1
- package/dist/cjs/views/kanban-board-controls.native.js +1 -1
- package/dist/cjs/views/kanban-board-controls.native.js.map +1 -1
- package/dist/cjs/views/kanban-field-picker.native.js +1 -1
- package/dist/cjs/views/kanban-field-picker.native.js.map +1 -1
- package/dist/cjs/views/kanbanBoardOps.native.js.map +1 -1
- package/dist/cjs/views/report-controls.native.js +1 -1
- package/dist/cjs/views/report-controls.native.js.map +1 -1
- package/dist/cjs/views/viewAvailability.native.js.map +1 -1
- package/dist/cjs/views/viewMeta.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceChartBlock.native.js +1 -1
- package/dist/cjs/workspace/WorkspaceChartBlock.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceGrid.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceLinkCard.native.js +1 -1
- package/dist/cjs/workspace/WorkspaceLinkCard.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js +1 -1
- package/dist/cjs/workspace/WorkspaceLinkDirectory.native.js.map +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 +1 -1
- package/dist/cjs/workspace/WorkspaceQuickList.native.js +4 -2
- package/dist/cjs/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceRecents.cjs +1 -3
- package/dist/cjs/workspace/WorkspaceRecents.native.js +4 -4
- package/dist/cjs/workspace/WorkspaceRecents.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceScreen.native.js +1 -1
- package/dist/cjs/workspace/WorkspaceScreen.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceShortcut.cjs +1 -3
- package/dist/cjs/workspace/WorkspaceShortcut.native.js +5 -4
- package/dist/cjs/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/dist/cjs/workspace/parseContent.native.js.map +1 -1
- package/dist/cjs/workspace/types.native.js.map +1 -1
- package/dist/cjs/workspace/useDashboardChart.native.js.map +1 -1
- package/dist/cjs/workspace/useWorkspaceDoc.native.js.map +1 -1
- package/dist/esm/chrome/BackofficeAwesomebar.native.js.map +1 -1
- package/dist/esm/chrome/CommandPalette.native.js.map +1 -1
- package/dist/esm/chrome/HelpMenu.native.js.map +1 -1
- package/dist/esm/chrome/NotificationsButton.native.js.map +1 -1
- package/dist/esm/chrome/UserMenu.native.js.map +1 -1
- package/dist/esm/chrome/awesomebar-data.native.js.map +1 -1
- package/dist/esm/chrome/command-palette-model.native.js.map +1 -1
- package/dist/esm/chrome/help-about-dialog.native.js.map +1 -1
- package/dist/esm/chrome/help-shortcuts-dialog.native.js.map +1 -1
- package/dist/esm/chrome/notifications-data.native.js.map +1 -1
- package/dist/esm/chrome/notifications-panel.native.js.map +1 -1
- package/dist/esm/chrome/notifications-utils.native.js.map +1 -1
- package/dist/esm/chrome/shortcuts.native.js.map +1 -1
- package/dist/esm/chrome/user-session.native.js.map +1 -1
- package/dist/esm/config/BackofficeProvider.native.js.map +1 -1
- package/dist/esm/config/capabilities.native.js.map +1 -1
- package/dist/esm/config/events.native.js.map +1 -1
- package/dist/esm/config/slots.native.js.map +1 -1
- package/dist/esm/desk/Desk.native.js.map +1 -1
- package/dist/esm/desk/DeskSurface.mjs.map +1 -1
- package/dist/esm/desk/DeskSurface.native.js.map +1 -1
- package/dist/esm/desk/resolveDeskPath.native.js.map +1 -1
- package/dist/esm/desk/scope.native.js.map +1 -1
- package/dist/esm/desk/target.native.js.map +1 -1
- package/dist/esm/form/DocFormScreen.native.js.map +1 -1
- package/dist/esm/form/FormConnections.native.js.map +1 -1
- package/dist/esm/form/FormDialogs.native.js.map +1 -1
- package/dist/esm/form/FormErrorBoundary.native.js.map +1 -1
- package/dist/esm/form/FormHeaderCluster.native.js.map +1 -1
- package/dist/esm/form/FormSidebarPanel.native.js.map +1 -1
- package/dist/esm/form/FormTimeline.native.js.map +1 -1
- package/dist/esm/form/FormToolbar.native.js.map +1 -1
- package/dist/esm/form/connections-data.native.js.map +1 -1
- package/dist/esm/form/createPrefill.mjs +1 -9
- package/dist/esm/form/createPrefill.mjs.map +1 -1
- package/dist/esm/form/createPrefill.native.js +1 -9
- package/dist/esm/form/createPrefill.native.js.map +1 -1
- package/dist/esm/form/dependsOn.native.js.map +1 -1
- package/dist/esm/form/dirtyTracking.mjs +1 -26
- package/dist/esm/form/dirtyTracking.mjs.map +1 -1
- package/dist/esm/form/dirtyTracking.native.js +1 -45
- package/dist/esm/form/dirtyTracking.native.js.map +1 -1
- package/dist/esm/form/docinfo.native.js.map +1 -1
- package/dist/esm/form/fetchFrom.mjs +1 -38
- package/dist/esm/form/fetchFrom.mjs.map +1 -1
- package/dist/esm/form/fetchFrom.native.js +1 -78
- package/dist/esm/form/fetchFrom.native.js.map +1 -1
- package/dist/esm/form/fieldPermissions.mjs +1 -26
- package/dist/esm/form/fieldPermissions.mjs.map +1 -1
- package/dist/esm/form/fieldPermissions.native.js +1 -48
- package/dist/esm/form/fieldPermissions.native.js.map +1 -1
- package/dist/esm/form/formActions.mjs +1 -145
- package/dist/esm/form/formActions.mjs.map +1 -1
- package/dist/esm/form/formActions.native.js +1 -152
- package/dist/esm/form/formActions.native.js.map +1 -1
- package/dist/esm/form/formLayout.mjs +1 -215
- package/dist/esm/form/formLayout.mjs.map +1 -1
- package/dist/esm/form/formLayout.native.js +1 -355
- package/dist/esm/form/formLayout.native.js.map +1 -1
- package/dist/esm/form/platformHooks.native.js.map +1 -1
- package/dist/esm/form/sidebar-attachments.native.js.map +1 -1
- package/dist/esm/form/sidebar-dialogs.native.js.map +1 -1
- package/dist/esm/form/sidebar-people.native.js.map +1 -1
- package/dist/esm/form/sidebar-rpc.native.js.map +1 -1
- package/dist/esm/form/sidebar-utils.native.js.map +1 -1
- package/dist/esm/form/timeline-entries.native.js.map +1 -1
- package/dist/esm/form/timeline-utils.native.js.map +1 -1
- package/dist/esm/form/useFormEngine.mjs +1 -360
- package/dist/esm/form/useFormEngine.mjs.map +1 -1
- package/dist/esm/form/useFormEngine.native.js +1 -446
- package/dist/esm/form/useFormEngine.native.js.map +1 -1
- package/dist/esm/i18n/en.native.js.map +1 -1
- package/dist/esm/i18n/index.native.js.map +1 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/list/AddTagsDialog.native.js.map +1 -1
- package/dist/esm/list/AssignToDialog.native.js.map +1 -1
- package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/esm/list/ListBulkActionsBar.native.js.map +1 -1
- package/dist/esm/list/ListFilterBar.native.js.map +1 -1
- package/dist/esm/list/ListSidebar.native.js.map +1 -1
- package/dist/esm/list/bulk-edit-dialog.native.js.map +1 -1
- package/dist/esm/list/bulk-export.native.js.map +1 -1
- package/dist/esm/list/bulk-submit-cancel.native.js.map +1 -1
- package/dist/esm/list/bulkActions.native.js.map +1 -1
- package/dist/esm/list/filter-chips.native.js.map +1 -1
- package/dist/esm/list/filter-editor.native.js.map +1 -1
- package/dist/esm/list/filter-fields.native.js.map +1 -1
- package/dist/esm/list/filter-saved.native.js.map +1 -1
- package/dist/esm/list/filter-sort.native.js.map +1 -1
- package/dist/esm/list/filter-standard.native.js.map +1 -1
- package/dist/esm/list/filterConversion.native.js.map +1 -1
- package/dist/esm/list/list-tools-sheet.native.js.map +1 -1
- package/dist/esm/list/listColumns.native.js.map +1 -1
- package/dist/esm/list/listFields.native.js.map +1 -1
- package/dist/esm/list/listFormat.native.js.map +1 -1
- package/dist/esm/list/listUrlState.native.js.map +1 -1
- package/dist/esm/list/sidebar-section.native.js.map +1 -1
- package/dist/esm/list/sidebar-stats.native.js.map +1 -1
- package/dist/esm/list/statusColors.native.js.map +1 -1
- package/dist/esm/navigation/navigator.native.js.map +1 -1
- package/dist/esm/navigation/paths.native.js.map +1 -1
- package/dist/esm/oneAdapter/index.native.js.map +1 -1
- package/dist/esm/quickEntry/QuickEntryDialog.native.js.map +1 -1
- package/dist/esm/quickEntry/quickEntryPlan.native.js.map +1 -1
- package/dist/esm/report/DoctypeReportView.native.js.map +1 -1
- package/dist/esm/report/QueryReportScreen.native.js.map +1 -1
- package/dist/esm/report/queryReportColumns.native.js.map +1 -1
- package/dist/esm/report/queryReportFilterBar.native.js.map +1 -1
- package/dist/esm/report/queryReportUrlState.native.js.map +1 -1
- package/dist/esm/report/report-grid.native.js.map +1 -1
- package/dist/esm/report/report-toolbar.native.js.map +1 -1
- package/dist/esm/report/reportShapes.native.js.map +1 -1
- package/dist/esm/report/reportViewModel.native.js.map +1 -1
- package/dist/esm/report/savedReports.native.js.map +1 -1
- package/dist/esm/report/useQueryReport.native.js.map +1 -1
- package/dist/esm/shared/deskLinks.native.js.map +1 -1
- package/dist/esm/shared/listNavContext.native.js.map +1 -1
- package/dist/esm/shared/types.native.js.map +1 -1
- 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.native.js.map +1 -1
- package/dist/esm/shared/useRecentVisit.native.js.map +1 -1
- package/dist/esm/shared/useSessionUserId.native.js.map +1 -1
- package/dist/esm/shared/useSlugTarget.native.js.map +1 -1
- package/dist/esm/shared/useUserRoles.native.js.map +1 -1
- package/dist/esm/shell/BackofficeShell.native.js.map +1 -1
- package/dist/esm/shell/HomeRedirect.native.js.map +1 -1
- package/dist/esm/shell/NotFoundScreen.native.js.map +1 -1
- package/dist/esm/shell/SlugScreen.native.js.map +1 -1
- package/dist/esm/shell/WorkspaceSidebar.native.js.map +1 -1
- package/dist/esm/shell/useWorkspaces.native.js.map +1 -1
- package/dist/esm/shell/workspaceIcons.native.js.map +1 -1
- package/dist/esm/views/CalendarView.native.js.map +1 -1
- package/dist/esm/views/DashboardView.native.js.map +1 -1
- package/dist/esm/views/DoctypeViewScreen.native.js.map +1 -1
- package/dist/esm/views/ImageView.native.js.map +1 -1
- package/dist/esm/views/KanbanView.native.js.map +1 -1
- package/dist/esm/views/ReportView.native.js.map +1 -1
- package/dist/esm/views/TreeView.native.js.map +1 -1
- package/dist/esm/views/ViewHeader.native.js.map +1 -1
- package/dist/esm/views/ViewStates.native.js.map +1 -1
- package/dist/esm/views/ViewSwitcherMenu.native.js.map +1 -1
- package/dist/esm/views/calendar-field-selector.native.js.map +1 -1
- package/dist/esm/views/connection.native.js.map +1 -1
- package/dist/esm/views/dashboard-data.native.js.map +1 -1
- package/dist/esm/views/deskViewConfigs.native.js.map +1 -1
- package/dist/esm/views/kanban-board-controls.native.js.map +1 -1
- package/dist/esm/views/kanban-field-picker.native.js.map +1 -1
- package/dist/esm/views/kanbanBoardOps.native.js.map +1 -1
- package/dist/esm/views/report-controls.native.js.map +1 -1
- package/dist/esm/views/viewAvailability.native.js.map +1 -1
- package/dist/esm/views/viewMeta.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceChartBlock.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceGrid.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkCard.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceNumberCard.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceQuickList.mjs +2 -2
- package/dist/esm/workspace/WorkspaceQuickList.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceQuickList.native.js +4 -2
- package/dist/esm/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceRecents.mjs +1 -3
- package/dist/esm/workspace/WorkspaceRecents.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceRecents.native.js +3 -3
- package/dist/esm/workspace/WorkspaceRecents.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceScreen.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceShortcut.mjs +1 -3
- package/dist/esm/workspace/WorkspaceShortcut.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceShortcut.native.js +4 -3
- package/dist/esm/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/dist/esm/workspace/parseContent.native.js.map +1 -1
- package/dist/esm/workspace/types.native.js.map +1 -1
- package/dist/esm/workspace/useDashboardChart.native.js.map +1 -1
- package/dist/esm/workspace/useWorkspaceDoc.native.js.map +1 -1
- package/dist/jsx/desk/DeskSurface.mjs.map +1 -1
- package/dist/jsx/desk/DeskSurface.native.js.map +1 -1
- package/dist/jsx/form/createPrefill.mjs +1 -9
- package/dist/jsx/form/createPrefill.mjs.map +1 -1
- package/dist/jsx/form/createPrefill.native.js +3 -11
- package/dist/jsx/form/createPrefill.native.js.map +1 -1
- package/dist/jsx/form/dirtyTracking.mjs +1 -26
- package/dist/jsx/form/dirtyTracking.mjs.map +1 -1
- package/dist/jsx/form/dirtyTracking.native.js +4 -48
- package/dist/jsx/form/dirtyTracking.native.js.map +1 -1
- package/dist/jsx/form/fetchFrom.mjs +1 -38
- package/dist/jsx/form/fetchFrom.mjs.map +1 -1
- package/dist/jsx/form/fetchFrom.native.js +4 -81
- package/dist/jsx/form/fetchFrom.native.js.map +1 -1
- package/dist/jsx/form/fieldPermissions.mjs +1 -26
- package/dist/jsx/form/fieldPermissions.mjs.map +1 -1
- package/dist/jsx/form/fieldPermissions.native.js +4 -51
- package/dist/jsx/form/fieldPermissions.native.js.map +1 -1
- package/dist/jsx/form/formActions.mjs +1 -145
- package/dist/jsx/form/formActions.mjs.map +1 -1
- package/dist/jsx/form/formActions.native.js +2 -178
- package/dist/jsx/form/formActions.native.js.map +1 -1
- package/dist/jsx/form/formLayout.mjs +1 -215
- package/dist/jsx/form/formLayout.mjs.map +1 -1
- package/dist/jsx/form/formLayout.native.js +5 -359
- package/dist/jsx/form/formLayout.native.js.map +1 -1
- package/dist/jsx/form/useFormEngine.mjs +1 -360
- package/dist/jsx/form/useFormEngine.mjs.map +1 -1
- package/dist/jsx/form/useFormEngine.native.js +2 -447
- package/dist/jsx/form/useFormEngine.native.js.map +1 -1
- package/dist/jsx/index.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/workspace/WorkspaceQuickList.mjs +2 -2
- package/dist/jsx/workspace/WorkspaceQuickList.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceQuickList.native.js +3 -1
- package/dist/jsx/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceRecents.mjs +1 -3
- package/dist/jsx/workspace/WorkspaceRecents.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceRecents.native.js +3 -3
- package/dist/jsx/workspace/WorkspaceRecents.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceShortcut.mjs +1 -3
- package/dist/jsx/workspace/WorkspaceShortcut.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceShortcut.native.js +4 -3
- package/dist/jsx/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/package.json +14 -14
- package/src/chrome/CommandPalette.spec.tsx +54 -0
- package/src/chrome/CommandPalette.stories.tsx +207 -0
- package/src/desk/Desk.spec.tsx +44 -0
- package/src/desk/Desk.stories.tsx +299 -0
- package/src/desk/DeskSurface.spec.tsx +160 -0
- package/src/desk/DeskSurface.stories.tsx +297 -0
- package/src/desk/DeskSurface.tsx +8 -4
- package/src/form/createPrefill.ts +5 -25
- package/src/form/dirtyTracking.ts +4 -61
- package/src/form/fetchFrom.ts +5 -108
- package/src/form/fieldPermissions.ts +7 -65
- package/src/form/formActions.ts +10 -281
- package/src/form/formEngineShim.spec.ts +122 -0
- package/src/form/formLayout.ts +15 -387
- package/src/form/useFormEngine.ts +5 -493
- package/src/shared/useDoctypeMeta.ts +12 -100
- package/src/shell/NotFoundScreen.spec.tsx +51 -0
- package/src/shell/NotFoundScreen.stories.tsx +79 -0
- package/src/views/DoctypeViewScreen.spec.tsx +110 -0
- package/src/views/DoctypeViewScreen.stories.tsx +279 -0
- package/src/workspace/WorkspaceQuickList.tsx +10 -2
- package/src/workspace/WorkspaceRecents.tsx +3 -1
- package/src/workspace/WorkspaceShortcut.tsx +4 -1
- package/types/desk/DeskSurface.d.ts.map +1 -1
- package/types/form/createPrefill.d.ts +5 -16
- package/types/form/createPrefill.d.ts.map +1 -1
- package/types/form/dirtyTracking.d.ts +4 -33
- package/types/form/dirtyTracking.d.ts.map +1 -1
- package/types/form/fetchFrom.d.ts +5 -40
- package/types/form/fetchFrom.d.ts.map +1 -1
- package/types/form/fieldPermissions.d.ts +7 -35
- package/types/form/fieldPermissions.d.ts.map +1 -1
- package/types/form/formActions.d.ts +6 -91
- package/types/form/formActions.d.ts.map +1 -1
- package/types/form/formLayout.d.ts +12 -89
- package/types/form/formLayout.d.ts.map +1 -1
- package/types/form/useFormEngine.d.ts +5 -58
- package/types/form/useFormEngine.d.ts.map +1 -1
- package/types/shared/useDoctypeMeta.d.ts +2 -100
- package/types/shared/useDoctypeMeta.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/src/form/dirtyTracking.spec.ts +0 -91
- package/src/form/fetchFrom.spec.ts +0 -92
- package/src/form/fieldPermissions.spec.ts +0 -61
- package/src/form/formLayout.spec.ts +0 -373
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
// OWNER: backoffice screens workstream (MPO-189).
|
|
2
|
+
// DeskSurface stories: the target→surface switch. One arm per DeskTarget
|
|
3
|
+
// kind, so the whole dispatch table is visible in one place, plus the
|
|
4
|
+
// override registry (per-kind and per-doctype).
|
|
5
|
+
//
|
|
6
|
+
// Everything rides fixtures: doctype meta through the fixture provider's
|
|
7
|
+
// "DocType" collection (shared/useDoctypeMeta's fixture branch), rows and
|
|
8
|
+
// Workspace docs through the same InMemoryFixtureProvider. Query reports
|
|
9
|
+
// are the one surface with no fixture branch — they run three desk RPCs —
|
|
10
|
+
// so a fetch mock scoped to this story's mock host answers those and keeps
|
|
11
|
+
// every arm off the network.
|
|
12
|
+
import { Text, YStack } from "@multiplatform.one/components";
|
|
13
|
+
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
14
|
+
import type { ReactNode } from "react";
|
|
15
|
+
import { BackofficeProvider } from "../config/BackofficeProvider";
|
|
16
|
+
import { createMemoryNavigator } from "../navigation/navigator";
|
|
17
|
+
import { DeskSurface, DeskSurfaceLoading, type DeskSurfaceProps } from "./DeskSurface";
|
|
18
|
+
import type { DeskTarget } from "./target";
|
|
19
|
+
|
|
20
|
+
const meta = {
|
|
21
|
+
title: "Screens/Backoffice/DeskSurface",
|
|
22
|
+
component: DeskSurface,
|
|
23
|
+
tags: ["!test"],
|
|
24
|
+
parameters: {
|
|
25
|
+
status: { type: "stable" },
|
|
26
|
+
layout: "fullscreen",
|
|
27
|
+
docs: {
|
|
28
|
+
description: {
|
|
29
|
+
component:
|
|
30
|
+
"The desk's target→surface switch: a resolved DeskTarget in, one wired screen out (home redirect, workspace page, list, alternate view, create form, document form, query report, not-found). It is pure dispatch — no fetch, no filter construction, no visual values — and the override registry lets a host replace a whole surface per kind, or per doctype under a kind.",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
export default meta;
|
|
36
|
+
|
|
37
|
+
const MOCK_HOST = "https://backoffice-desk-surface.mock.test";
|
|
38
|
+
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Fixtures
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
const TASK_DOCTYPE = "QaDeskTask";
|
|
44
|
+
|
|
45
|
+
/** Getdoctype-shaped meta doc for the fixture "DocType" collection. */
|
|
46
|
+
const taskMeta = {
|
|
47
|
+
name: TASK_DOCTYPE,
|
|
48
|
+
doctype: "DocType",
|
|
49
|
+
module: "QA",
|
|
50
|
+
title_field: "subject",
|
|
51
|
+
fields: [
|
|
52
|
+
{ fieldname: "subject", fieldtype: "Data", label: "Subject", in_list_view: 1, reqd: 1 },
|
|
53
|
+
{
|
|
54
|
+
fieldname: "status",
|
|
55
|
+
fieldtype: "Select",
|
|
56
|
+
label: "Status",
|
|
57
|
+
options: "Open\nWorking\nDone",
|
|
58
|
+
in_list_view: 1,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
fieldname: "priority",
|
|
62
|
+
fieldtype: "Select",
|
|
63
|
+
label: "Priority",
|
|
64
|
+
options: "High\nMedium\nLow",
|
|
65
|
+
in_list_view: 1,
|
|
66
|
+
},
|
|
67
|
+
{ fieldname: "owner_name", fieldtype: "Data", label: "Owner", in_list_view: 1 },
|
|
68
|
+
],
|
|
69
|
+
permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const statuses = ["Open", "Working", "Done"];
|
|
73
|
+
const priorities = ["High", "Medium", "Low"];
|
|
74
|
+
const owners = ["ana", "bo", "cyrus", "dee"];
|
|
75
|
+
|
|
76
|
+
const firstTaskName = "QDT-0001";
|
|
77
|
+
|
|
78
|
+
const taskDocs = Array.from({ length: 12 }, (_, i) => ({
|
|
79
|
+
name: `QDT-${String(i + 1).padStart(4, "0")}`,
|
|
80
|
+
doctype: TASK_DOCTYPE,
|
|
81
|
+
subject: `Task ${i + 1}: ${["triage inbox", "ship release", "write docs", "fix flaky test"][i % 4]}`,
|
|
82
|
+
status: statuses[i % statuses.length],
|
|
83
|
+
priority: priorities[i % priorities.length],
|
|
84
|
+
owner_name: owners[i % owners.length],
|
|
85
|
+
}));
|
|
86
|
+
|
|
87
|
+
const workspaceDocs = [
|
|
88
|
+
{
|
|
89
|
+
name: "Tools",
|
|
90
|
+
doctype: "Workspace",
|
|
91
|
+
label: "Tools",
|
|
92
|
+
title: "Tools",
|
|
93
|
+
icon: "tool",
|
|
94
|
+
module: "Automation",
|
|
95
|
+
parent_page: "",
|
|
96
|
+
public: 1,
|
|
97
|
+
for_user: "",
|
|
98
|
+
sequence_id: 1,
|
|
99
|
+
is_hidden: 0,
|
|
100
|
+
content: JSON.stringify([
|
|
101
|
+
{
|
|
102
|
+
id: "h1",
|
|
103
|
+
type: "header",
|
|
104
|
+
data: { text: '<span class="h4"><b>Your Shortcuts</b></span>', col: 12 },
|
|
105
|
+
},
|
|
106
|
+
{ id: "s1", type: "shortcut", data: { shortcut_name: "Tasks", col: 3 } },
|
|
107
|
+
{
|
|
108
|
+
id: "p1",
|
|
109
|
+
type: "paragraph",
|
|
110
|
+
data: { text: "Everything on this page comes from fixtures.<br>", col: 12 },
|
|
111
|
+
},
|
|
112
|
+
]),
|
|
113
|
+
shortcuts: [{ name: "sc1", type: "DocType", link_to: TASK_DOCTYPE, label: "Tasks" }],
|
|
114
|
+
links: [],
|
|
115
|
+
charts: [],
|
|
116
|
+
number_cards: [],
|
|
117
|
+
quick_lists: [],
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
const makeFixtures = () =>
|
|
122
|
+
new InMemoryFixtureProvider({
|
|
123
|
+
DocType: [taskMeta],
|
|
124
|
+
Workspace: workspaceDocs,
|
|
125
|
+
"Notification Log": [],
|
|
126
|
+
[TASK_DOCTYPE]: taskDocs,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Query-report RPCs. useQueryReport has no fixture branch (it calls
|
|
131
|
+
// frappe.client.get, query_report.get_script and query_report.run), so the
|
|
132
|
+
// `report` arm needs these three answered. Scoped to MOCK_HOST, installed
|
|
133
|
+
// once; stories only run on web. Same precedent as DeskShell.stories.
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
|
|
136
|
+
const reportColumns = [
|
|
137
|
+
{ label: "Task", fieldname: "task", fieldtype: "Data", width: "140" },
|
|
138
|
+
{ label: "Status", fieldname: "status", fieldtype: "Data", width: "110" },
|
|
139
|
+
{ label: "Owner", fieldname: "owner_name", fieldtype: "Data", width: "120" },
|
|
140
|
+
{ label: "Age (days)", fieldname: "age", fieldtype: "Int", width: "100" },
|
|
141
|
+
];
|
|
142
|
+
|
|
143
|
+
const reportRows = taskDocs.map((doc, i) => ({
|
|
144
|
+
task: doc.name,
|
|
145
|
+
status: doc.status,
|
|
146
|
+
owner_name: doc.owner_name,
|
|
147
|
+
age: (i * 3) % 41,
|
|
148
|
+
}));
|
|
149
|
+
|
|
150
|
+
function jsonResponse(body: unknown): Response {
|
|
151
|
+
return new Response(JSON.stringify(body), {
|
|
152
|
+
status: 200,
|
|
153
|
+
headers: { "Content-Type": "application/json" },
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
(() => {
|
|
158
|
+
if (typeof window === "undefined") return;
|
|
159
|
+
const w = window as unknown as Record<string, unknown>;
|
|
160
|
+
if (w.__deskSurfaceMockFetch) return;
|
|
161
|
+
w.__deskSurfaceMockFetch = true;
|
|
162
|
+
const realFetch = window.fetch.bind(window);
|
|
163
|
+
window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
164
|
+
const urlStr =
|
|
165
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
166
|
+
if (!urlStr.startsWith(MOCK_HOST)) return realFetch(input as RequestInfo, init);
|
|
167
|
+
const { pathname } = new URL(urlStr);
|
|
168
|
+
if (pathname.endsWith("frappe.desk.query_report.run")) {
|
|
169
|
+
return jsonResponse({ message: { columns: reportColumns, result: reportRows } });
|
|
170
|
+
}
|
|
171
|
+
if (pathname.endsWith("frappe.desk.query_report.get_script")) {
|
|
172
|
+
return jsonResponse({ message: { script: null } });
|
|
173
|
+
}
|
|
174
|
+
if (pathname.endsWith("frappe.client.get")) {
|
|
175
|
+
return jsonResponse({
|
|
176
|
+
message: { name: "Open Tasks", report_name: "Open Tasks", ref_doctype: TASK_DOCTYPE },
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// No session against the inert mock host: get_logged_user must answer
|
|
180
|
+
// null, not a truthy docname (BackofficeShell.stories precedent).
|
|
181
|
+
if (pathname.endsWith("frappe.auth.get_logged_user")) return jsonResponse({ message: null });
|
|
182
|
+
return jsonResponse({ data: [], message: [] });
|
|
183
|
+
};
|
|
184
|
+
})();
|
|
185
|
+
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
// Harness
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
|
|
190
|
+
function Surface({ target, children }: { target?: DeskTarget; children?: ReactNode }) {
|
|
191
|
+
return (
|
|
192
|
+
<BackofficeProvider
|
|
193
|
+
frappe={{ baseURL: MOCK_HOST, fixtures: makeFixtures() }}
|
|
194
|
+
navigation={createMemoryNavigator("/backoffice")}
|
|
195
|
+
>
|
|
196
|
+
<YStack flex={1} height={560} minHeight={0}>
|
|
197
|
+
{children ?? (target ? <DeskSurface target={target} /> : null)}
|
|
198
|
+
</YStack>
|
|
199
|
+
</BackofficeProvider>
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
// One arm per DeskTarget kind
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
|
|
207
|
+
/** kind "list" — the doctype list surface, the desk's most-visited screen. */
|
|
208
|
+
export const List = () => <Surface target={{ kind: "list", doctype: TASK_DOCTYPE }} />;
|
|
209
|
+
List.storyName = "Main";
|
|
210
|
+
|
|
211
|
+
/** kind "home" — the home redirect, resolving the default workspace. */
|
|
212
|
+
export const Home = () => <Surface target={{ kind: "home" }} />;
|
|
213
|
+
|
|
214
|
+
/** kind "workspace" — a workspace page rendered from its fixture doc. */
|
|
215
|
+
export const Workspace = () => <Surface target={{ kind: "workspace", workspace: "Tools" }} />;
|
|
216
|
+
|
|
217
|
+
/** kind "view" — an alternate view; the switch hands off to DoctypeViewScreen. */
|
|
218
|
+
export const AlternateView = () => (
|
|
219
|
+
<Surface target={{ kind: "view", doctype: TASK_DOCTYPE, view: "kanban" }} />
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
/** kind "new" — create mode; `defaults` route through the ONE prefill stash. */
|
|
223
|
+
export const NewDocument = () => (
|
|
224
|
+
<Surface
|
|
225
|
+
target={{
|
|
226
|
+
kind: "new",
|
|
227
|
+
doctype: TASK_DOCTYPE,
|
|
228
|
+
defaults: { status: "Working", priority: "High" },
|
|
229
|
+
}}
|
|
230
|
+
/>
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
/** kind "form" — an existing document. */
|
|
234
|
+
export const Form = () => (
|
|
235
|
+
<Surface target={{ kind: "form", doctype: TASK_DOCTYPE, name: firstTaskName }} />
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
/** kind "report" — a Query/Script Report, served by the scoped RPC mock. */
|
|
239
|
+
export const Report = () => <Surface target={{ kind: "report", reportName: "Open Tasks" }} />;
|
|
240
|
+
|
|
241
|
+
/** kind "not-found" — a dead address. */
|
|
242
|
+
export const NotFound = () => <Surface target={{ kind: "not-found", slug: "no-such-doctype" }} />;
|
|
243
|
+
|
|
244
|
+
/** The resolving state: an ambiguous slug still in flight against the index. */
|
|
245
|
+
export const Loading = () => (
|
|
246
|
+
<Surface>
|
|
247
|
+
<DeskSurfaceLoading />
|
|
248
|
+
</Surface>
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
// Override registry
|
|
253
|
+
// ---------------------------------------------------------------------------
|
|
254
|
+
|
|
255
|
+
function TargetCard({ target }: DeskSurfaceProps) {
|
|
256
|
+
return (
|
|
257
|
+
<YStack
|
|
258
|
+
flex={1}
|
|
259
|
+
padding="$4"
|
|
260
|
+
gap="$2"
|
|
261
|
+
borderWidth={1}
|
|
262
|
+
borderColor="$borderColor"
|
|
263
|
+
borderRadius="$3"
|
|
264
|
+
backgroundColor="$color2"
|
|
265
|
+
>
|
|
266
|
+
<Text>{`host surface for kind "${target.kind}"`}</Text>
|
|
267
|
+
<Text>{JSON.stringify(target)}</Text>
|
|
268
|
+
</YStack>
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Per-kind override: the host replaces the whole list surface. The override
|
|
274
|
+
* receives the target and the readOnly flag — thin enough to wrap the
|
|
275
|
+
* built-in rather than reimplement it.
|
|
276
|
+
*/
|
|
277
|
+
export const OverrideByKind = () => (
|
|
278
|
+
<Surface>
|
|
279
|
+
<DeskSurface
|
|
280
|
+
target={{ kind: "list", doctype: TASK_DOCTYPE }}
|
|
281
|
+
overrides={{ list: TargetCard }}
|
|
282
|
+
/>
|
|
283
|
+
</Surface>
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Per-doctype override beats per-kind, and a miss falls through to the
|
|
288
|
+
* built-in: the same registry keyed by doctype under one kind.
|
|
289
|
+
*/
|
|
290
|
+
export const OverrideByDoctype = () => (
|
|
291
|
+
<Surface>
|
|
292
|
+
<DeskSurface
|
|
293
|
+
target={{ kind: "list", doctype: TASK_DOCTYPE }}
|
|
294
|
+
overrides={{ list: { [TASK_DOCTYPE]: TargetCard } }}
|
|
295
|
+
/>
|
|
296
|
+
</Surface>
|
|
297
|
+
);
|
package/src/desk/DeskSurface.tsx
CHANGED
|
@@ -110,10 +110,14 @@ export function DeskSurface({
|
|
|
110
110
|
<NewDocSurface doctype={target.doctype} defaults={target.defaults} readOnly={readOnly} />
|
|
111
111
|
);
|
|
112
112
|
case "form":
|
|
113
|
-
// MPO-15: DocFormScreen is the strong form today.
|
|
114
|
-
//
|
|
115
|
-
//
|
|
116
|
-
//
|
|
113
|
+
// MPO-15: DocFormScreen is the strong form today. The engine itself
|
|
114
|
+
// (formLayout + useFormEngine) now lives in frappe-ui, but FrappeForm
|
|
115
|
+
// still builds its schema from the LOSSY normalized meta
|
|
116
|
+
// (frappe/src/doctype.ts parseRawField drops permlevel, fetch_from,
|
|
117
|
+
// set_only_once and the *_depends_on keys), so it cannot render those
|
|
118
|
+
// semantics yet. When that meta model collapses (gap GL-3), the
|
|
119
|
+
// exported FrappeForm becomes this branch's renderer — swap here,
|
|
120
|
+
// nowhere else.
|
|
117
121
|
return <DocFormScreen doctype={target.doctype} name={target.name} readOnly={readOnly} />;
|
|
118
122
|
case "report":
|
|
119
123
|
return <QueryReportScreen reportName={target.reportName} />;
|
|
@@ -1,28 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
* copied values here (in-memory only — a refresh honestly falls back to
|
|
7
|
-
* a blank form; no URL-size limits for large docs).
|
|
8
|
-
* - NewDocRouteScreen stashes parsed `?d=` URL defaults (kanban column "+",
|
|
9
|
-
* calendar day click, connections "+") before rendering the form — those
|
|
10
|
-
* survive refresh because the URL re-stashes them.
|
|
11
|
-
*
|
|
12
|
-
* The create-mode form (useFormEngine seeding) consumes and clears the
|
|
13
|
-
* stash on mount, merging it over meta defaults. Last stash per doctype
|
|
14
|
-
* wins, so a `?d=` navigation cannot double-apply with a stale
|
|
15
|
-
* Duplicate/Amend hand-off.
|
|
2
|
+
* Create-mode prefill handoff — moved to
|
|
3
|
+
* `@multiplatform.one/frappe-ui/src/formEngine/createPrefill` (MPO-15).
|
|
4
|
+
* Re-exported here so existing imports keep resolving (the GNOME shim
|
|
5
|
+
* deep-imports this path).
|
|
16
6
|
*/
|
|
17
7
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
export function setCreatePrefill(doctype: string, values: Record<string, unknown>): void {
|
|
21
|
-
prefills.set(doctype, values);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function takeCreatePrefill(doctype: string): Record<string, unknown> | undefined {
|
|
25
|
-
const values = prefills.get(doctype);
|
|
26
|
-
if (values) prefills.delete(doctype);
|
|
27
|
-
return values;
|
|
28
|
-
}
|
|
8
|
+
export { setCreatePrefill, takeCreatePrefill } from "@multiplatform.one/frappe-ui";
|
|
@@ -1,64 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dirty
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* A strict `!==` diff falsely armed Save on untouched documents whenever a
|
|
6
|
-
* field's *representation* of a value differed from the wire format (mount
|
|
7
|
-
* emitters have been fixed at the field level — forms contract: initialization
|
|
8
|
-
* must not emit change events — but the engine stays defensive).
|
|
2
|
+
* Dirty-field diffing — moved to
|
|
3
|
+
* `@multiplatform.one/frappe-ui/src/formEngine/dirtyTracking` (MPO-15).
|
|
4
|
+
* Re-exported here so existing imports keep resolving.
|
|
9
5
|
*/
|
|
10
6
|
|
|
11
|
-
export
|
|
12
|
-
if (value === undefined || value === null) return true;
|
|
13
|
-
if (typeof value === "string" && value.trim() === "") return true;
|
|
14
|
-
if (Array.isArray(value) && value.length === 0) return true;
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Init-aware value equality. Two representation classes are folded:
|
|
20
|
-
*
|
|
21
|
-
* - empty: null / undefined / "" / [] are one empty state (a field
|
|
22
|
-
* normalizing null → "" is not an edit)
|
|
23
|
-
* - boolean: Check wires 0/1 but a control may emit true/false
|
|
24
|
-
*
|
|
25
|
-
* Everything else stays strict equality — deliberately shallow and honest
|
|
26
|
-
* (no deep equality): desk parity means an edit reverted to a value that is
|
|
27
|
-
* merely *equivalent* (not identical) may still read dirty, while reverting
|
|
28
|
-
* to the exact original value reads clean.
|
|
29
|
-
*/
|
|
30
|
-
export function isSameValue(a: unknown, b: unknown): boolean {
|
|
31
|
-
if (a === b) return true;
|
|
32
|
-
if (isEmptyValue(a) && isEmptyValue(b)) return true;
|
|
33
|
-
if (typeof a === "boolean" || typeof b === "boolean") {
|
|
34
|
-
const an = a === true ? 1 : a === false ? 0 : a;
|
|
35
|
-
const bn = b === true ? 1 : b === false ? 0 : b;
|
|
36
|
-
return an === bn;
|
|
37
|
-
}
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Names of fields whose local value differs from the baseline.
|
|
43
|
-
*
|
|
44
|
-
* - Edit mode (baseline defined): normalization-insensitive diff via
|
|
45
|
-
* `isSameValue` — an untouched doc reads pristine even if a field
|
|
46
|
-
* re-represented its value during initialization.
|
|
47
|
-
* - Create mode (no baseline): any non-empty value counts, defaults included —
|
|
48
|
-
* desk parity, a new doc shows "Not Saved".
|
|
49
|
-
*
|
|
50
|
-
* `doctype` / `name` are bookkeeping, never dirty.
|
|
51
|
-
*/
|
|
52
|
-
export function computeDirtyFields(
|
|
53
|
-
localDoc: Record<string, unknown>,
|
|
54
|
-
baseline: Record<string, unknown> | undefined,
|
|
55
|
-
): string[] {
|
|
56
|
-
const dirty: string[] = [];
|
|
57
|
-
for (const key of Object.keys(localDoc)) {
|
|
58
|
-
if (key === "doctype" || key === "name") continue;
|
|
59
|
-
if (baseline ? !isSameValue(localDoc[key], baseline[key]) : !isEmptyValue(localDoc[key])) {
|
|
60
|
-
dirty.push(key);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return dirty;
|
|
64
|
-
}
|
|
7
|
+
export { computeDirtyFields, isEmptyValue, isSameValue } from "@multiplatform.one/frappe-ui";
|
package/src/form/fetchFrom.ts
CHANGED
|
@@ -1,111 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* fetch_from
|
|
3
|
-
* frappe/
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* - A field participates when `fetch_from` is "<link_field>.<source_field>"
|
|
7
|
-
* AND (its fieldtype is in the scalar set desk registers, or it is
|
|
8
|
-
* read_only / is_virtual).
|
|
9
|
-
* - When the link field changes to a value, desk calls
|
|
10
|
-
* `frappe.client.validate_link` with the source columns and writes the
|
|
11
|
-
* returned values onto the targets; clearing the link clears the targets.
|
|
12
|
-
* - `fetch_if_empty` targets keep a non-empty existing value (server
|
|
13
|
-
* semantics; desk leaves such fields editable — see
|
|
14
|
-
* `read_only_because_of_fetch_from`, base_input.js:56-66).
|
|
15
|
-
*
|
|
16
|
-
* The server remains authoritative: this is a preview so the user sees the
|
|
17
|
-
* fetched values before save.
|
|
2
|
+
* `fetch_from` map + lock helpers — moved to
|
|
3
|
+
* `@multiplatform.one/frappe-ui/src/formEngine/fetchFrom` (MPO-15).
|
|
4
|
+
* Re-exported here so existing imports keep resolving.
|
|
18
5
|
*/
|
|
19
6
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
/** Fieldtypes desk registers for client-side fetch (script_manager.js:196-215). */
|
|
23
|
-
const FETCHABLE_FIELDTYPES = new Set([
|
|
24
|
-
"Data",
|
|
25
|
-
"Read Only",
|
|
26
|
-
"Text",
|
|
27
|
-
"Small Text",
|
|
28
|
-
"Currency",
|
|
29
|
-
"Check",
|
|
30
|
-
"Text Editor",
|
|
31
|
-
"Attach Image",
|
|
32
|
-
"Code",
|
|
33
|
-
"Link",
|
|
34
|
-
"Float",
|
|
35
|
-
"Int",
|
|
36
|
-
"Date",
|
|
37
|
-
"Datetime",
|
|
38
|
-
"Select",
|
|
39
|
-
"Duration",
|
|
40
|
-
"Time",
|
|
41
|
-
]);
|
|
42
|
-
|
|
43
|
-
export interface FetchRule {
|
|
44
|
-
/** Field to populate. */
|
|
45
|
-
target: string;
|
|
46
|
-
/** Column on the linked doc to read. */
|
|
47
|
-
source: string;
|
|
48
|
-
/** Only fill when the target is currently empty; never lock the field. */
|
|
49
|
-
fetchIfEmpty: boolean;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Map of link fieldname → fetch rules hanging off that link. */
|
|
53
|
-
export type FetchMap = Map<string, FetchRule[]>;
|
|
54
|
-
|
|
55
|
-
export function buildFetchMap(fields: DocFieldMeta[]): FetchMap {
|
|
56
|
-
const map: FetchMap = new Map();
|
|
57
|
-
for (const field of fields) {
|
|
58
|
-
const fetchFrom = typeof field.fetch_from === "string" ? field.fetch_from : "";
|
|
59
|
-
if (!fetchFrom || !fetchFrom.includes(".")) continue;
|
|
60
|
-
const eligible =
|
|
61
|
-
FETCHABLE_FIELDTYPES.has(field.fieldtype) ||
|
|
62
|
-
!!field.read_only ||
|
|
63
|
-
!!(field as { is_virtual?: 0 | 1 }).is_virtual;
|
|
64
|
-
if (!eligible) continue;
|
|
65
|
-
const [linkField, ...rest] = fetchFrom.split(".");
|
|
66
|
-
const source = rest.join(".");
|
|
67
|
-
if (!linkField || !source) continue;
|
|
68
|
-
const rules = map.get(linkField) ?? [];
|
|
69
|
-
rules.push({
|
|
70
|
-
target: field.fieldname,
|
|
71
|
-
source,
|
|
72
|
-
fetchIfEmpty: !!field.fetch_if_empty,
|
|
73
|
-
});
|
|
74
|
-
map.set(linkField, rules);
|
|
75
|
-
}
|
|
76
|
-
return map;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function isEmpty(value: unknown): boolean {
|
|
80
|
-
return value === undefined || value === null || value === "";
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Values to patch onto the doc after the linked doc's columns arrive.
|
|
85
|
-
* `fetched` is empty when the link was cleared — desk then blanks the
|
|
86
|
-
* targets; `fetch_if_empty` targets holding a value are left alone in both
|
|
87
|
-
* directions (they belong to the user until the server reconciles).
|
|
88
|
-
*/
|
|
89
|
-
export function applyFetchedValues(
|
|
90
|
-
rules: FetchRule[],
|
|
91
|
-
fetched: Record<string, unknown>,
|
|
92
|
-
currentDoc: Record<string, unknown>,
|
|
93
|
-
): Record<string, unknown> {
|
|
94
|
-
const patch: Record<string, unknown> = {};
|
|
95
|
-
for (const rule of rules) {
|
|
96
|
-
if (rule.fetchIfEmpty && !isEmpty(currentDoc[rule.target])) continue;
|
|
97
|
-
patch[rule.target] = fetched[rule.source] ?? "";
|
|
98
|
-
}
|
|
99
|
-
return patch;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Desk's `read_only_because_of_fetch_from`: a fetch target without
|
|
104
|
-
* `fetch_if_empty` renders read-only while its source link holds a value.
|
|
105
|
-
*/
|
|
106
|
-
export function isFetchLocked(field: DocFieldMeta, doc: Record<string, unknown>): boolean {
|
|
107
|
-
const fetchFrom = typeof field.fetch_from === "string" ? field.fetch_from : "";
|
|
108
|
-
if (!fetchFrom || !fetchFrom.includes(".") || field.fetch_if_empty) return false;
|
|
109
|
-
const linkField = fetchFrom.split(".")[0];
|
|
110
|
-
return !isEmpty(doc[linkField]);
|
|
111
|
-
}
|
|
7
|
+
export { applyFetchedValues, buildFetchMap, isFetchLocked } from "@multiplatform.one/frappe-ui";
|
|
8
|
+
export type { FetchMap, FetchRule } from "@multiplatform.one/frappe-ui";
|
|
@@ -1,68 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* frappe/
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* holds. A field at permlevel L then resolves to:
|
|
8
|
-
* - no read at L → hidden ("None")
|
|
9
|
-
* - read, no write → read-only ("Read")
|
|
10
|
-
* - write → editable ("Write", subject to the other rules)
|
|
11
|
-
*
|
|
12
|
-
* Levels that appear on fields but have no granting rows resolve to
|
|
13
|
-
* {read: false} — desk hides those fields (gap-filled `{}` in perm.js:153).
|
|
14
|
-
* When the caller has no role list (fixtures, roles RPC unavailable) the
|
|
15
|
-
* matrix is undefined and formLayout falls back to the conservative
|
|
16
|
-
* "permlevel > 0 → read-only" rule (never hides, never unlocks).
|
|
2
|
+
* Permlevel matrix helpers — moved to
|
|
3
|
+
* `@multiplatform.one/frappe-ui/src/formEngine/fieldPermissions` (MPO-15),
|
|
4
|
+
* because formLayout consumes them and formLayout now lives there.
|
|
5
|
+
* Re-exported here so existing imports keep resolving (the GNOME shim
|
|
6
|
+
* deep-imports this path).
|
|
17
7
|
*/
|
|
18
8
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export interface LevelPerm {
|
|
22
|
-
read: boolean;
|
|
23
|
-
write: boolean;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Sparse array indexed by permlevel; missing entries mean "no rights". */
|
|
27
|
-
export type PermLevelMatrix = LevelPerm[];
|
|
28
|
-
|
|
29
|
-
export function buildPermLevelMatrix(
|
|
30
|
-
permissions: DocPermissionRule[] | undefined,
|
|
31
|
-
userRoles: string[] | undefined,
|
|
32
|
-
): PermLevelMatrix | undefined {
|
|
33
|
-
if (!userRoles || !permissions || permissions.length === 0) return undefined;
|
|
34
|
-
const roles = new Set(userRoles);
|
|
35
|
-
const matrix: PermLevelMatrix = [];
|
|
36
|
-
for (const rule of permissions) {
|
|
37
|
-
if (!rule.role || !roles.has(rule.role)) continue;
|
|
38
|
-
const level = Number(rule.permlevel ?? 0) || 0;
|
|
39
|
-
const current = (matrix[level] ??= { read: false, write: false });
|
|
40
|
-
// if_owner rows are unioned in like desk's get_role_permissions — the
|
|
41
|
-
// owner check itself is enforced server-side (and via docinfo at level 0).
|
|
42
|
-
if (rule.read) current.read = true;
|
|
43
|
-
if (rule.write) current.write = true;
|
|
44
|
-
}
|
|
45
|
-
return matrix;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Read access at a permlevel. Level 0 is implied by having the doc at all
|
|
50
|
-
* (docinfo/doc-level perms govern it — including share/if_owner grants the
|
|
51
|
-
* role matrix can't see), so only higher levels consult the matrix.
|
|
52
|
-
*/
|
|
53
|
-
export function canReadLevel(matrix: PermLevelMatrix | undefined, permlevel: number): boolean {
|
|
54
|
-
if (!permlevel) return true;
|
|
55
|
-
if (!matrix) return true; // caller falls back to the coarse read-only rule
|
|
56
|
-
return !!matrix[permlevel]?.read;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Write access at a permlevel. Level 0 defers to the doc-level write flag
|
|
61
|
-
* (formReadOnly); higher levels require a granting role row — without a
|
|
62
|
-
* matrix the coarse fallback keeps them read-only (desk-safe direction).
|
|
63
|
-
*/
|
|
64
|
-
export function canWriteLevel(matrix: PermLevelMatrix | undefined, permlevel: number): boolean {
|
|
65
|
-
if (!permlevel) return true;
|
|
66
|
-
if (!matrix) return false;
|
|
67
|
-
return !!matrix[permlevel]?.write;
|
|
68
|
-
}
|
|
9
|
+
export { buildPermLevelMatrix, canReadLevel, canWriteLevel } from "@multiplatform.one/frappe-ui";
|
|
10
|
+
export type { LevelPerm, PermLevelMatrix } from "@multiplatform.one/frappe-ui";
|