@multiplatform.one/backoffice 7.7.0 → 7.7.2
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.native.js.map +1 -1
- package/dist/cjs/form/dependsOn.native.js.map +1 -1
- 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.native.js.map +1 -1
- package/dist/cjs/form/fieldPermissions.native.js.map +1 -1
- package/dist/cjs/form/formActions.native.js.map +1 -1
- 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.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.native.js +1 -1
- package/dist/cjs/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceRecents.native.js +1 -1
- 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.native.js +1 -1
- 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.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.native.js.map +1 -1
- package/dist/esm/form/dependsOn.native.js.map +1 -1
- 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.native.js.map +1 -1
- package/dist/esm/form/fieldPermissions.native.js.map +1 -1
- package/dist/esm/form/formActions.native.js.map +1 -1
- 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.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.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.native.js.map +1 -1
- 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.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/package.json +14 -13
- 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/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
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
// OWNER: backoffice screens workstream (MPO-189).
|
|
2
|
+
// <Desk /> stories: the whole desk as one component. One required prop, and
|
|
3
|
+
// that prop is nothing — `<Desk />` renders the full desk, and every other
|
|
4
|
+
// arm here is a NARROWING of that: a pin, a chrome mode, a fence, a surface
|
|
5
|
+
// override.
|
|
6
|
+
//
|
|
7
|
+
// Everything rides fixtures. Doctype meta comes from the fixture provider's
|
|
8
|
+
// "DocType" collection, rows and Workspace docs from the same
|
|
9
|
+
// InMemoryFixtureProvider, and a fetch mock scoped to this story's mock host
|
|
10
|
+
// keeps the navbar's session probe and the desk's catalog reads off the
|
|
11
|
+
// network. Navigation is internal: with no `navigation` prop Desk seeds its
|
|
12
|
+
// own MemoryNavigator from the pins, so the host URL never moves.
|
|
13
|
+
import { Text, YStack } from "@multiplatform.one/components";
|
|
14
|
+
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
15
|
+
import type { ReactNode } from "react";
|
|
16
|
+
import { Desk } from "./Desk";
|
|
17
|
+
import type { DeskSurfaceProps } from "./DeskSurface";
|
|
18
|
+
|
|
19
|
+
const meta = {
|
|
20
|
+
title: "Screens/Backoffice/Desk",
|
|
21
|
+
component: Desk,
|
|
22
|
+
tags: ["!test"],
|
|
23
|
+
parameters: {
|
|
24
|
+
status: { type: "stable" },
|
|
25
|
+
layout: "fullscreen",
|
|
26
|
+
docs: {
|
|
27
|
+
description: {
|
|
28
|
+
component:
|
|
29
|
+
"The embeddable desk: navbar and workspace rail, the resolved surface underneath, and one memory navigator when the host supplies no router. Pins (doctype / name / view / workspace / report / path) set the entry surface and, for a doctype pin, the reachability fence; `chrome` picks full banner + rail, banner only, or no chrome at all; `surfaces` replaces a whole screen per kind or per doctype; `scope` filters are ANDed into every doctype-homed query and cannot be cleared from the filter chrome.",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
export default meta;
|
|
35
|
+
|
|
36
|
+
const MOCK_HOST = "https://backoffice-desk.mock.test";
|
|
37
|
+
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Fixtures
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
|
|
42
|
+
const TASK_DOCTYPE = "QaDeskWorkItem";
|
|
43
|
+
const FIRST_TASK = "QDW-0001";
|
|
44
|
+
|
|
45
|
+
const taskMeta = {
|
|
46
|
+
name: TASK_DOCTYPE,
|
|
47
|
+
doctype: "DocType",
|
|
48
|
+
module: "QA",
|
|
49
|
+
title_field: "subject",
|
|
50
|
+
fields: [
|
|
51
|
+
{ fieldname: "subject", fieldtype: "Data", label: "Subject", in_list_view: 1, reqd: 1 },
|
|
52
|
+
{
|
|
53
|
+
fieldname: "status",
|
|
54
|
+
fieldtype: "Select",
|
|
55
|
+
label: "Status",
|
|
56
|
+
options: "Open\nWorking\nDone",
|
|
57
|
+
in_list_view: 1,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
fieldname: "priority",
|
|
61
|
+
fieldtype: "Select",
|
|
62
|
+
label: "Priority",
|
|
63
|
+
options: "High\nMedium\nLow",
|
|
64
|
+
in_list_view: 1,
|
|
65
|
+
},
|
|
66
|
+
{ fieldname: "company", fieldtype: "Data", label: "Company", in_list_view: 1 },
|
|
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 companies = ["Acme", "Globex"];
|
|
75
|
+
const owners = ["ana", "bo", "cyrus", "dee"];
|
|
76
|
+
|
|
77
|
+
const taskDocs = Array.from({ length: 14 }, (_, i) => ({
|
|
78
|
+
name: `QDW-${String(i + 1).padStart(4, "0")}`,
|
|
79
|
+
doctype: TASK_DOCTYPE,
|
|
80
|
+
subject: `Work item ${i + 1}: ${["triage inbox", "ship release", "write docs", "fix flaky test"][i % 4]}`,
|
|
81
|
+
status: statuses[i % statuses.length],
|
|
82
|
+
priority: priorities[i % priorities.length],
|
|
83
|
+
company: companies[i % companies.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: "Work Items", col: 3 } },
|
|
107
|
+
{
|
|
108
|
+
id: "p1",
|
|
109
|
+
type: "paragraph",
|
|
110
|
+
data: { text: "This whole desk is served from fixtures.<br>", col: 12 },
|
|
111
|
+
},
|
|
112
|
+
]),
|
|
113
|
+
shortcuts: [{ name: "sc1", type: "DocType", link_to: TASK_DOCTYPE, label: "Work Items" }],
|
|
114
|
+
links: [],
|
|
115
|
+
charts: [],
|
|
116
|
+
number_cards: [],
|
|
117
|
+
quick_lists: [],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: "Users",
|
|
121
|
+
doctype: "Workspace",
|
|
122
|
+
label: "Users",
|
|
123
|
+
title: "Users",
|
|
124
|
+
icon: "users",
|
|
125
|
+
module: "Core",
|
|
126
|
+
parent_page: "",
|
|
127
|
+
public: 1,
|
|
128
|
+
for_user: "",
|
|
129
|
+
sequence_id: 2,
|
|
130
|
+
is_hidden: 0,
|
|
131
|
+
content: JSON.stringify([]),
|
|
132
|
+
shortcuts: [],
|
|
133
|
+
links: [],
|
|
134
|
+
charts: [],
|
|
135
|
+
number_cards: [],
|
|
136
|
+
quick_lists: [],
|
|
137
|
+
},
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
const makeFixtures = () =>
|
|
141
|
+
new InMemoryFixtureProvider({
|
|
142
|
+
DocType: [taskMeta],
|
|
143
|
+
Workspace: workspaceDocs,
|
|
144
|
+
"Notification Log": [],
|
|
145
|
+
[TASK_DOCTYPE]: taskDocs,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const frappe = () => ({ baseURL: MOCK_HOST, fixtures: makeFixtures() });
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Quiet fetch mock for the mock host (navbar session probe, catalog reads),
|
|
152
|
+
* so no arm ever hits the network. The session probe must answer null: the
|
|
153
|
+
* generic `message: []` reads as a truthy user docname and crashes the
|
|
154
|
+
* avatar's initials (BackofficeShell.stories precedent). Web only.
|
|
155
|
+
*/
|
|
156
|
+
(() => {
|
|
157
|
+
if (typeof window === "undefined") return;
|
|
158
|
+
const w = window as unknown as Record<string, unknown>;
|
|
159
|
+
if (w.__deskStoriesMockFetch) return;
|
|
160
|
+
w.__deskStoriesMockFetch = true;
|
|
161
|
+
const realFetch = window.fetch.bind(window);
|
|
162
|
+
window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
163
|
+
const urlStr =
|
|
164
|
+
typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
165
|
+
if (!urlStr.startsWith(MOCK_HOST)) return realFetch(input as RequestInfo, init);
|
|
166
|
+
const body =
|
|
167
|
+
new URL(urlStr).pathname === "/api/method/frappe.auth.get_logged_user"
|
|
168
|
+
? { message: null }
|
|
169
|
+
: { data: [], message: [] };
|
|
170
|
+
return new Response(JSON.stringify(body), {
|
|
171
|
+
status: 200,
|
|
172
|
+
headers: { "Content-Type": "application/json" },
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
})();
|
|
176
|
+
|
|
177
|
+
function Frame({ children }: { children: ReactNode }) {
|
|
178
|
+
return (
|
|
179
|
+
<YStack height={680} minHeight={0}>
|
|
180
|
+
{children}
|
|
181
|
+
</YStack>
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Arms
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* No required props: full chrome (navbar + workspace rail) and the home
|
|
191
|
+
* surface, which lands on the default workspace.
|
|
192
|
+
*/
|
|
193
|
+
export const FullDesk = () => (
|
|
194
|
+
<Frame>
|
|
195
|
+
<Desk frappe={frappe()} />
|
|
196
|
+
</Frame>
|
|
197
|
+
);
|
|
198
|
+
FullDesk.storyName = "Main";
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* A doctype pin. It sets the entry surface (the list) AND the reachability
|
|
202
|
+
* fence, and it flips the chrome default to "content" — the embedded shape a
|
|
203
|
+
* host drops into its own page.
|
|
204
|
+
*/
|
|
205
|
+
export const PinnedList = () => (
|
|
206
|
+
<Frame>
|
|
207
|
+
<Desk frappe={frappe()} doctype={TASK_DOCTYPE} />
|
|
208
|
+
</Frame>
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
/** doctype + name: the document form, still fenced to that one doctype. */
|
|
212
|
+
export const PinnedForm = () => (
|
|
213
|
+
<Frame>
|
|
214
|
+
<Desk frappe={frappe()} doctype={TASK_DOCTYPE} name={FIRST_TASK} />
|
|
215
|
+
</Frame>
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
/** doctype + name="new": create mode. */
|
|
219
|
+
export const PinnedNewDocument = () => (
|
|
220
|
+
<Frame>
|
|
221
|
+
<Desk frappe={frappe()} doctype={TASK_DOCTYPE} name="new" />
|
|
222
|
+
</Frame>
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
/** doctype + view: an alternate view as the entry surface. */
|
|
226
|
+
export const PinnedKanban = () => (
|
|
227
|
+
<Frame>
|
|
228
|
+
<Desk frappe={frappe()} doctype={TASK_DOCTYPE} view="kanban" />
|
|
229
|
+
</Frame>
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
/** A workspace pin: one page, no rail. */
|
|
233
|
+
export const PinnedWorkspace = () => (
|
|
234
|
+
<Frame>
|
|
235
|
+
<Desk frappe={frappe()} workspace="Tools" />
|
|
236
|
+
</Frame>
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* chrome="bare": the banner without the workspace rail. The sidebar
|
|
241
|
+
* capability is forced off with it, so nothing can put the rail back.
|
|
242
|
+
*/
|
|
243
|
+
export const BareChrome = () => (
|
|
244
|
+
<Frame>
|
|
245
|
+
<Desk frappe={frappe()} doctype={TASK_DOCTYPE} chrome="bare" />
|
|
246
|
+
</Frame>
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
/** chrome="full" over a pin: the pin picks the surface, the host picks the chrome. */
|
|
250
|
+
export const PinnedWithFullChrome = () => (
|
|
251
|
+
<Frame>
|
|
252
|
+
<Desk frappe={frappe()} doctype={TASK_DOCTYPE} chrome="full" />
|
|
253
|
+
</Frame>
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
/** `embedded` is sugar for chrome="content": the surface and nothing else. */
|
|
257
|
+
export const Embedded = () => (
|
|
258
|
+
<Frame>
|
|
259
|
+
<Desk frappe={frappe()} workspace="Tools" embedded />
|
|
260
|
+
</Frame>
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* `scope` is the tenant seam: ANDed into every doctype-homed query, invisible
|
|
265
|
+
* to the filter chrome and not removable by the user. Here the desk can only
|
|
266
|
+
* ever see Acme rows, on the list and on every alternate view.
|
|
267
|
+
*/
|
|
268
|
+
export const ScopedToOneTenant = () => (
|
|
269
|
+
<Frame>
|
|
270
|
+
<Desk frappe={frappe()} doctype={TASK_DOCTYPE} scope={[["company", "=", "Acme"]]} />
|
|
271
|
+
</Frame>
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
function HostSurface({ target }: DeskSurfaceProps) {
|
|
275
|
+
return (
|
|
276
|
+
<YStack
|
|
277
|
+
flex={1}
|
|
278
|
+
padding="$4"
|
|
279
|
+
gap="$2"
|
|
280
|
+
borderWidth={1}
|
|
281
|
+
borderColor="$borderColor"
|
|
282
|
+
borderRadius="$3"
|
|
283
|
+
backgroundColor="$color2"
|
|
284
|
+
>
|
|
285
|
+
<Text>{`host-rendered surface for kind "${target.kind}"`}</Text>
|
|
286
|
+
<Text>{JSON.stringify(target)}</Text>
|
|
287
|
+
</YStack>
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* `surfaces` replaces a whole screen. Overrides are per-Desk by
|
|
293
|
+
* construction, so two desks on one page never see each other's.
|
|
294
|
+
*/
|
|
295
|
+
export const HostSurfaceOverride = () => (
|
|
296
|
+
<Frame>
|
|
297
|
+
<Desk frappe={frappe()} doctype={TASK_DOCTYPE} surfaces={{ list: HostSurface }} />
|
|
298
|
+
</Frame>
|
|
299
|
+
);
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeskSurface specs (MPO-189) — the target→surface switch, mounted over the
|
|
3
|
+
* same fixture shape its stories use.
|
|
4
|
+
*
|
|
5
|
+
* Desk.spec.tsx already covers dispatch THROUGH <Desk />; this file pins the
|
|
6
|
+
* switch itself: every DeskTarget kind reaches a surface, and the override
|
|
7
|
+
* registry resolves per-doctype before per-kind before the built-in.
|
|
8
|
+
*/
|
|
9
|
+
import React from "react";
|
|
10
|
+
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
11
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
12
|
+
import { screen, waitFor } from "@testing-library/react";
|
|
13
|
+
import { describe, expect, it } from "vitest";
|
|
14
|
+
import { BackofficeProvider } from "../config/BackofficeProvider";
|
|
15
|
+
import { createMemoryNavigator } from "../navigation/navigator";
|
|
16
|
+
import { DeskSurface, DeskSurfaceLoading, type DeskSurfaceProps } from "./DeskSurface";
|
|
17
|
+
import type { DeskTarget } from "./target";
|
|
18
|
+
|
|
19
|
+
const MOCK_HOST = "https://backoffice-desk-surface-spec.mock.test";
|
|
20
|
+
const TASK_DOCTYPE = "QaDeskTask";
|
|
21
|
+
|
|
22
|
+
const taskMeta = {
|
|
23
|
+
name: TASK_DOCTYPE,
|
|
24
|
+
doctype: "DocType",
|
|
25
|
+
module: "QA",
|
|
26
|
+
title_field: "subject",
|
|
27
|
+
fields: [
|
|
28
|
+
{ fieldname: "subject", fieldtype: "Data", label: "Subject", in_list_view: 1 },
|
|
29
|
+
{
|
|
30
|
+
fieldname: "status",
|
|
31
|
+
fieldtype: "Select",
|
|
32
|
+
label: "Status",
|
|
33
|
+
options: "Open\nWorking\nDone",
|
|
34
|
+
in_list_view: 1,
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
permissions: [{ role: "All", read: 1 }],
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const makeFixtures = () =>
|
|
41
|
+
new InMemoryFixtureProvider({
|
|
42
|
+
DocType: [taskMeta],
|
|
43
|
+
Workspace: [
|
|
44
|
+
{
|
|
45
|
+
name: "Tools",
|
|
46
|
+
doctype: "Workspace",
|
|
47
|
+
title: "Tools",
|
|
48
|
+
icon: "tool",
|
|
49
|
+
parent_page: "",
|
|
50
|
+
public: 1,
|
|
51
|
+
for_user: "",
|
|
52
|
+
sequence_id: 1,
|
|
53
|
+
module: "Automation",
|
|
54
|
+
is_hidden: 0,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
"Notification Log": [],
|
|
58
|
+
[TASK_DOCTYPE]: [{ name: "QDT-0001", doctype: TASK_DOCTYPE, subject: "First", status: "Open" }],
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
function Probe({ target }: DeskSurfaceProps) {
|
|
62
|
+
return <div data-testid={`probe-${target.kind}`}>{JSON.stringify(target)}</div>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function renderSurface(node: React.ReactNode) {
|
|
66
|
+
return renderWithProviders(
|
|
67
|
+
<BackofficeProvider
|
|
68
|
+
frappe={{ baseURL: MOCK_HOST, fixtures: makeFixtures() }}
|
|
69
|
+
navigation={createMemoryNavigator("/backoffice")}
|
|
70
|
+
>
|
|
71
|
+
{node}
|
|
72
|
+
</BackofficeProvider>,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const everyKind: DeskTarget[] = [
|
|
77
|
+
{ kind: "home" },
|
|
78
|
+
{ kind: "workspace", workspace: "Tools" },
|
|
79
|
+
{ kind: "list", doctype: TASK_DOCTYPE },
|
|
80
|
+
{ kind: "view", doctype: TASK_DOCTYPE, view: "kanban" },
|
|
81
|
+
{ kind: "new", doctype: TASK_DOCTYPE },
|
|
82
|
+
{ kind: "form", doctype: TASK_DOCTYPE, name: "QDT-0001" },
|
|
83
|
+
{ kind: "report", reportName: "Open Tasks" },
|
|
84
|
+
{ kind: "not-found", slug: "nope" },
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
describe("<DeskSurface />", () => {
|
|
88
|
+
it("dispatches every DeskTarget kind — no kind falls through the switch", () => {
|
|
89
|
+
// A probe per kind proves the switch reaches a component for each one,
|
|
90
|
+
// without depending on any individual surface's async chrome.
|
|
91
|
+
for (const target of everyKind) {
|
|
92
|
+
const { unmount } = renderSurface(
|
|
93
|
+
<DeskSurface
|
|
94
|
+
target={target}
|
|
95
|
+
overrides={{
|
|
96
|
+
home: Probe,
|
|
97
|
+
workspace: Probe,
|
|
98
|
+
list: Probe,
|
|
99
|
+
view: Probe,
|
|
100
|
+
new: Probe,
|
|
101
|
+
form: Probe,
|
|
102
|
+
report: Probe,
|
|
103
|
+
"not-found": Probe,
|
|
104
|
+
}}
|
|
105
|
+
/>,
|
|
106
|
+
);
|
|
107
|
+
expect(screen.getByTestId(`probe-${target.kind}`)).toBeTruthy();
|
|
108
|
+
unmount();
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("renders the built-in not-found surface when no override matches", async () => {
|
|
113
|
+
renderSurface(<DeskSurface target={{ kind: "not-found", slug: "nope" }} />);
|
|
114
|
+
await waitFor(() => expect(screen.getByText("Not found")).toBeTruthy());
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("per-doctype override beats per-kind; a miss falls through to the built-in", () => {
|
|
118
|
+
function DoctypeProbe({ target }: DeskSurfaceProps) {
|
|
119
|
+
return <div data-testid="doctype-probe">{JSON.stringify(target)}</div>;
|
|
120
|
+
}
|
|
121
|
+
const { unmount } = renderSurface(
|
|
122
|
+
<DeskSurface
|
|
123
|
+
target={{ kind: "list", doctype: TASK_DOCTYPE }}
|
|
124
|
+
overrides={{ list: { [TASK_DOCTYPE]: DoctypeProbe } }}
|
|
125
|
+
/>,
|
|
126
|
+
);
|
|
127
|
+
expect(screen.getByTestId("doctype-probe")).toBeTruthy();
|
|
128
|
+
unmount();
|
|
129
|
+
|
|
130
|
+
// Keyed by a different doctype: the record misses, so the built-in list
|
|
131
|
+
// mounts instead of the probe.
|
|
132
|
+
renderSurface(
|
|
133
|
+
<DeskSurface
|
|
134
|
+
target={{ kind: "list", doctype: TASK_DOCTYPE }}
|
|
135
|
+
overrides={{ list: { "Sales Order": DoctypeProbe } }}
|
|
136
|
+
/>,
|
|
137
|
+
);
|
|
138
|
+
expect(screen.queryByTestId("doctype-probe")).toBeNull();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("forwards readOnly to the override contract", () => {
|
|
142
|
+
function ReadOnlyProbe({ readOnly }: DeskSurfaceProps) {
|
|
143
|
+
return <div data-testid="readonly-probe">{String(readOnly)}</div>;
|
|
144
|
+
}
|
|
145
|
+
renderSurface(
|
|
146
|
+
<DeskSurface
|
|
147
|
+
target={{ kind: "form", doctype: TASK_DOCTYPE, name: "QDT-0001" }}
|
|
148
|
+
readOnly
|
|
149
|
+
overrides={{ form: ReadOnlyProbe }}
|
|
150
|
+
/>,
|
|
151
|
+
);
|
|
152
|
+
expect(screen.getByTestId("readonly-probe").textContent).toBe("true");
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it("DeskSurfaceLoading renders the resolving state", () => {
|
|
156
|
+
renderSurface(<DeskSurfaceLoading />);
|
|
157
|
+
// The spinner is the whole surface; nothing else may paint over it.
|
|
158
|
+
expect(screen.queryByText("Not found")).toBeNull();
|
|
159
|
+
});
|
|
160
|
+
});
|