@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
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fetchFrom — fetch_from preview parity with desk script_manager.js
|
|
3
|
-
* setup_add_fetch + link.js validate_link_and_fetch.
|
|
4
|
-
*/
|
|
5
|
-
import { describe, expect, it } from "vitest";
|
|
6
|
-
import type { DocFieldMeta } from "../shared/useDoctypeMeta";
|
|
7
|
-
import { applyFetchedValues, buildFetchMap, isFetchLocked } from "./fetchFrom";
|
|
8
|
-
|
|
9
|
-
function field(overrides: Partial<DocFieldMeta> & { fieldname: string }): DocFieldMeta {
|
|
10
|
-
return { fieldtype: "Data", ...overrides };
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
describe("buildFetchMap", () => {
|
|
14
|
-
it("registers scalar fieldtypes keyed by their link field", () => {
|
|
15
|
-
const map = buildFetchMap([
|
|
16
|
-
field({ fieldname: "customer", fieldtype: "Link", options: "Customer" }),
|
|
17
|
-
field({ fieldname: "customer_name", fetch_from: "customer.customer_name" }),
|
|
18
|
-
field({ fieldname: "territory", fieldtype: "Select", fetch_from: "customer.territory" }),
|
|
19
|
-
]);
|
|
20
|
-
expect(map.get("customer")).toEqual([
|
|
21
|
-
{ target: "customer_name", source: "customer_name", fetchIfEmpty: false },
|
|
22
|
-
{ target: "territory", source: "territory", fetchIfEmpty: false },
|
|
23
|
-
]);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("skips fetch_from without a dot and non-registered fieldtypes", () => {
|
|
27
|
-
const map = buildFetchMap([
|
|
28
|
-
field({ fieldname: "bad", fetch_from: "customer" }),
|
|
29
|
-
field({ fieldname: "html", fieldtype: "HTML", fetch_from: "customer.blurb" }),
|
|
30
|
-
]);
|
|
31
|
-
expect(map.size).toBe(0);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it("includes non-scalar fieldtypes when read_only (script_manager gate)", () => {
|
|
35
|
-
const map = buildFetchMap([
|
|
36
|
-
field({
|
|
37
|
-
fieldname: "blurb",
|
|
38
|
-
fieldtype: "HTML Editor",
|
|
39
|
-
fetch_from: "customer.blurb",
|
|
40
|
-
read_only: 1,
|
|
41
|
-
}),
|
|
42
|
-
]);
|
|
43
|
-
expect(map.get("customer")).toHaveLength(1);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("records fetch_if_empty", () => {
|
|
47
|
-
const map = buildFetchMap([
|
|
48
|
-
field({ fieldname: "note", fetch_from: "customer.note", fetch_if_empty: 1 }),
|
|
49
|
-
]);
|
|
50
|
-
expect(map.get("customer")?.[0].fetchIfEmpty).toBe(true);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe("applyFetchedValues", () => {
|
|
55
|
-
const rules = [
|
|
56
|
-
{ target: "customer_name", source: "customer_name", fetchIfEmpty: false },
|
|
57
|
-
{ target: "note", source: "note", fetchIfEmpty: true },
|
|
58
|
-
];
|
|
59
|
-
|
|
60
|
-
it("writes fetched values onto targets", () => {
|
|
61
|
-
const patch = applyFetchedValues(rules, { customer_name: "Acme", note: "VIP" }, {});
|
|
62
|
-
expect(patch).toEqual({ customer_name: "Acme", note: "VIP" });
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it("fetch_if_empty targets keep an existing value", () => {
|
|
66
|
-
const patch = applyFetchedValues(
|
|
67
|
-
rules,
|
|
68
|
-
{ customer_name: "Acme", note: "VIP" },
|
|
69
|
-
{ note: "user wrote this" },
|
|
70
|
-
);
|
|
71
|
-
expect(patch).toEqual({ customer_name: "Acme" });
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("clearing the link blanks plain targets but spares fetch_if_empty values", () => {
|
|
75
|
-
const patch = applyFetchedValues(rules, {}, { customer_name: "Acme", note: "mine" });
|
|
76
|
-
expect(patch).toEqual({ customer_name: "" });
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
describe("isFetchLocked", () => {
|
|
81
|
-
it("locks while the source link holds a value, unless fetch_if_empty", () => {
|
|
82
|
-
const target = field({ fieldname: "customer_name", fetch_from: "customer.customer_name" });
|
|
83
|
-
expect(isFetchLocked(target, { customer: "CUST-1" })).toBe(true);
|
|
84
|
-
expect(isFetchLocked(target, {})).toBe(false);
|
|
85
|
-
const softTarget = field({
|
|
86
|
-
fieldname: "note",
|
|
87
|
-
fetch_from: "customer.note",
|
|
88
|
-
fetch_if_empty: 1,
|
|
89
|
-
});
|
|
90
|
-
expect(isFetchLocked(softTarget, { customer: "CUST-1" })).toBe(false);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* fieldPermissions — permlevel matrix parity with desk perm.js
|
|
3
|
-
* get_role_permissions / get_field_display_status.
|
|
4
|
-
*/
|
|
5
|
-
import { describe, expect, it } from "vitest";
|
|
6
|
-
import { buildPermLevelMatrix, canReadLevel, canWriteLevel } from "./fieldPermissions";
|
|
7
|
-
|
|
8
|
-
const userDoctypePerms = [
|
|
9
|
-
{ role: "System Manager", permlevel: 0, read: 1 as const, write: 1 as const },
|
|
10
|
-
{ role: "System Manager", permlevel: 1, read: 1 as const, write: 1 as const },
|
|
11
|
-
{ role: "Desk User", permlevel: 0, read: 0 as const, write: 0 as const },
|
|
12
|
-
];
|
|
13
|
-
|
|
14
|
-
describe("buildPermLevelMatrix", () => {
|
|
15
|
-
it("unions rights across the user's matching roles", () => {
|
|
16
|
-
const matrix = buildPermLevelMatrix(
|
|
17
|
-
[
|
|
18
|
-
{ role: "Blogger", permlevel: 1, read: 1 as const, write: 0 as const },
|
|
19
|
-
{ role: "Website Manager", permlevel: 1, read: 1 as const, write: 1 as const },
|
|
20
|
-
],
|
|
21
|
-
["Blogger", "Website Manager"],
|
|
22
|
-
);
|
|
23
|
-
expect(matrix?.[1]).toEqual({ read: true, write: true });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("ignores rows for roles the user does not hold (User doctype shape)", () => {
|
|
27
|
-
const matrix = buildPermLevelMatrix(userDoctypePerms, ["Desk User"]);
|
|
28
|
-
expect(matrix?.[1]).toBeUndefined();
|
|
29
|
-
expect(canReadLevel(matrix, 1)).toBe(false);
|
|
30
|
-
expect(canWriteLevel(matrix, 1)).toBe(false);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it("returns undefined without roles or permission rows (fallback signal)", () => {
|
|
34
|
-
expect(buildPermLevelMatrix(userDoctypePerms, undefined)).toBeUndefined();
|
|
35
|
-
expect(buildPermLevelMatrix([], ["System Manager"])).toBeUndefined();
|
|
36
|
-
expect(buildPermLevelMatrix(undefined, ["System Manager"])).toBeUndefined();
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
describe("canReadLevel / canWriteLevel", () => {
|
|
41
|
-
const matrix = buildPermLevelMatrix(userDoctypePerms, ["System Manager"]);
|
|
42
|
-
|
|
43
|
-
it("level 0 defers to doc-level perms (always true here)", () => {
|
|
44
|
-
expect(canReadLevel(matrix, 0)).toBe(true);
|
|
45
|
-
expect(canWriteLevel(matrix, 0)).toBe(true);
|
|
46
|
-
expect(canReadLevel(undefined, 0)).toBe(true);
|
|
47
|
-
expect(canWriteLevel(undefined, 0)).toBe(true);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it("higher levels resolve from the matrix", () => {
|
|
51
|
-
expect(canReadLevel(matrix, 1)).toBe(true);
|
|
52
|
-
expect(canWriteLevel(matrix, 1)).toBe(true);
|
|
53
|
-
// Level with no rows at all → hidden (desk fills gaps with {}).
|
|
54
|
-
expect(canReadLevel(matrix, 2)).toBe(false);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it("without a matrix: visible but read-only above level 0 (coarse fallback)", () => {
|
|
58
|
-
expect(canReadLevel(undefined, 1)).toBe(true);
|
|
59
|
-
expect(canWriteLevel(undefined, 1)).toBe(false);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* formLayout — desk layout-engine parity specs. Ground truth:
|
|
3
|
-
* frappe/public/js/frappe/form/layout.js (+ section.js, tab.js) and
|
|
4
|
-
* frappe/public/js/frappe/model/perm.js get_field_display_status.
|
|
5
|
-
*/
|
|
6
|
-
import { describe, expect, it } from "vitest";
|
|
7
|
-
import type { DocFieldMeta } from "../shared/useDoctypeMeta";
|
|
8
|
-
import { buildPermLevelMatrix } from "./fieldPermissions";
|
|
9
|
-
import { buildCreateDefaults, buildFormTabs, type BuildTabsOptions } from "./formLayout";
|
|
10
|
-
|
|
11
|
-
function field(overrides: Partial<DocFieldMeta> & { fieldname: string }): DocFieldMeta {
|
|
12
|
-
return { fieldtype: "Data", label: overrides.fieldname, ...overrides };
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function build(
|
|
16
|
-
fields: DocFieldMeta[],
|
|
17
|
-
overrides: Partial<BuildTabsOptions> = {},
|
|
18
|
-
): ReturnType<typeof buildFormTabs> {
|
|
19
|
-
return buildFormTabs({
|
|
20
|
-
fields,
|
|
21
|
-
doc: {},
|
|
22
|
-
docstatus: 0,
|
|
23
|
-
formReadOnly: false,
|
|
24
|
-
isCreate: false,
|
|
25
|
-
detailsLabel: "Details",
|
|
26
|
-
...overrides,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function flatFieldNames(tabs: ReturnType<typeof buildFormTabs>): string[] {
|
|
31
|
-
return tabs.flatMap((tab) => tab.schema.fields.map((f) => f.name));
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function findField(tabs: ReturnType<typeof buildFormTabs>, name: string) {
|
|
35
|
-
for (const tab of tabs) {
|
|
36
|
-
const hit = tab.schema.fields.find((f) => f.name === name);
|
|
37
|
-
if (hit) return hit;
|
|
38
|
-
}
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
describe("tab / section / column grouping", () => {
|
|
43
|
-
it("groups fields under Tab Breaks with an implicit Details tab", () => {
|
|
44
|
-
const tabs = build([
|
|
45
|
-
field({ fieldname: "a" }),
|
|
46
|
-
field({ fieldname: "tab1", fieldtype: "Tab Break", label: "More" }),
|
|
47
|
-
field({ fieldname: "b" }),
|
|
48
|
-
]);
|
|
49
|
-
expect(tabs.map((t) => t.key)).toEqual(["__details", "tab1"]);
|
|
50
|
-
expect(tabs[0].label).toBe("Details");
|
|
51
|
-
expect(tabs[0].schema.fields.map((f) => f.name)).toEqual(["a"]);
|
|
52
|
-
expect(tabs[1].schema.fields.map((f) => f.name)).toEqual(["b"]);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("drops the implicit Details tab when the doctype starts with a Tab Break (User)", () => {
|
|
56
|
-
const tabs = build([
|
|
57
|
-
field({ fieldname: "details_tab", fieldtype: "Tab Break", label: "User Details" }),
|
|
58
|
-
field({ fieldname: "email" }),
|
|
59
|
-
]);
|
|
60
|
-
expect(tabs.map((t) => t.key)).toEqual(["details_tab"]);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("splits Section Breaks into sections and Column Breaks into columns", () => {
|
|
64
|
-
const tabs = build([
|
|
65
|
-
field({ fieldname: "a" }),
|
|
66
|
-
field({ fieldname: "sec1", fieldtype: "Section Break", label: "Second" }),
|
|
67
|
-
field({ fieldname: "b" }),
|
|
68
|
-
field({ fieldname: "col1", fieldtype: "Column Break" }),
|
|
69
|
-
field({ fieldname: "c" }),
|
|
70
|
-
]);
|
|
71
|
-
const sections = tabs[0].schema.sections;
|
|
72
|
-
expect(sections).toHaveLength(2);
|
|
73
|
-
expect(sections[1].label).toBe("Second");
|
|
74
|
-
expect(sections[1].columns).toHaveLength(2);
|
|
75
|
-
expect(sections[1].columns[0].fields[0].name).toBe("b");
|
|
76
|
-
expect(sections[1].columns[1].fields[0].name).toBe("c");
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
describe("hidden + depends_on visibility", () => {
|
|
81
|
-
it("drops hidden fields", () => {
|
|
82
|
-
const tabs = build([field({ fieldname: "a" }), field({ fieldname: "b", hidden: 1 })]);
|
|
83
|
-
expect(flatFieldNames(tabs)).toEqual(["a"]);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("auto-hides a section when all its fields hide (desk empty-section)", () => {
|
|
87
|
-
const tabs = build([
|
|
88
|
-
field({ fieldname: "a" }),
|
|
89
|
-
field({ fieldname: "sec1", fieldtype: "Section Break", label: "Hidden Section" }),
|
|
90
|
-
field({ fieldname: "b", hidden: 1 }),
|
|
91
|
-
field({ fieldname: "c", depends_on: "eval:doc.missing" }),
|
|
92
|
-
]);
|
|
93
|
-
expect(tabs[0].schema.sections).toHaveLength(1);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("auto-hides a tab when all its sections hide", () => {
|
|
97
|
-
const tabs = build([
|
|
98
|
-
field({ fieldname: "a" }),
|
|
99
|
-
field({ fieldname: "tab1", fieldtype: "Tab Break", label: "Empty" }),
|
|
100
|
-
field({ fieldname: "b", hidden: 1 }),
|
|
101
|
-
]);
|
|
102
|
-
expect(tabs.map((t) => t.key)).toEqual(["__details"]);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("hides a whole section when its Section Break depends_on is false", () => {
|
|
106
|
-
const tabs = build(
|
|
107
|
-
[
|
|
108
|
-
field({ fieldname: "a" }),
|
|
109
|
-
field({
|
|
110
|
-
fieldname: "sec1",
|
|
111
|
-
fieldtype: "Section Break",
|
|
112
|
-
depends_on: "eval:doc.show_more",
|
|
113
|
-
}),
|
|
114
|
-
field({ fieldname: "b" }),
|
|
115
|
-
],
|
|
116
|
-
{ doc: { show_more: 0 } },
|
|
117
|
-
);
|
|
118
|
-
expect(flatFieldNames(tabs)).toEqual(["a"]);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("re-resolves depends_on against the live doc", () => {
|
|
122
|
-
const fields = [
|
|
123
|
-
field({ fieldname: "channel", fieldtype: "Select", options: "Email\nSlack" }),
|
|
124
|
-
field({
|
|
125
|
-
fieldname: "slack_webhook_url",
|
|
126
|
-
depends_on: "eval:doc.channel=='Slack'",
|
|
127
|
-
mandatory_depends_on: "eval:doc.channel=='Slack'",
|
|
128
|
-
}),
|
|
129
|
-
];
|
|
130
|
-
expect(flatFieldNames(build(fields, { doc: { channel: "Email" } }))).toEqual(["channel"]);
|
|
131
|
-
const slackTabs = build(fields, { doc: { channel: "Slack" } });
|
|
132
|
-
expect(flatFieldNames(slackTabs)).toEqual(["channel", "slack_webhook_url"]);
|
|
133
|
-
expect(findField(slackTabs, "slack_webhook_url")?.required).toBe(true);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
describe("read_only / read_only_depends_on / set_only_once", () => {
|
|
138
|
-
it("marks read_only fields readOnly", () => {
|
|
139
|
-
const tabs = build([field({ fieldname: "a", read_only: 1 })]);
|
|
140
|
-
expect(findField(tabs, "a")?.readOnly).toBe(true);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it("resolves read_only_depends_on per doc state", () => {
|
|
144
|
-
const fields = [field({ fieldname: "a", read_only_depends_on: "eval:doc.locked" })];
|
|
145
|
-
expect(findField(build(fields, { doc: { locked: 1 } }), "a")?.readOnly).toBe(true);
|
|
146
|
-
expect(findField(build(fields, { doc: { locked: 0 } }), "a")?.readOnly).toBe(false);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it("set_only_once: editable on new docs, read-only on saved docs (perm.js:261)", () => {
|
|
150
|
-
const fields = [field({ fieldname: "a", set_only_once: 1 })];
|
|
151
|
-
expect(findField(build(fields, { isCreate: true }), "a")?.readOnly).toBe(false);
|
|
152
|
-
expect(findField(build(fields, { isCreate: false }), "a")?.readOnly).toBe(true);
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
describe("docstatus lifecycle locking", () => {
|
|
157
|
-
const fields = [
|
|
158
|
-
field({ fieldname: "locked_field" }),
|
|
159
|
-
field({ fieldname: "open_field", allow_on_submit: 1 }),
|
|
160
|
-
];
|
|
161
|
-
|
|
162
|
-
it("docstatus 1 locks everything except allow_on_submit", () => {
|
|
163
|
-
const tabs = build(fields, { docstatus: 1 });
|
|
164
|
-
expect(findField(tabs, "locked_field")?.readOnly).toBe(true);
|
|
165
|
-
expect(findField(tabs, "open_field")?.readOnly).toBe(false);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it("docstatus 2 locks allow_on_submit fields too", () => {
|
|
169
|
-
const tabs = build(fields, { docstatus: 2 });
|
|
170
|
-
expect(findField(tabs, "open_field")?.readOnly).toBe(true);
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
describe("permlevel gating (perm.js get_field_display_status)", () => {
|
|
175
|
-
const permissions = [
|
|
176
|
-
{ role: "System Manager", permlevel: 0, read: 1 as const, write: 1 as const },
|
|
177
|
-
{ role: "System Manager", permlevel: 1, read: 1 as const, write: 1 as const },
|
|
178
|
-
{ role: "Auditor", permlevel: 1, read: 1 as const, write: 0 as const },
|
|
179
|
-
{ role: "Desk User", permlevel: 0, read: 1 as const, write: 1 as const },
|
|
180
|
-
];
|
|
181
|
-
const fields = [field({ fieldname: "plain" }), field({ fieldname: "restricted", permlevel: 1 })];
|
|
182
|
-
|
|
183
|
-
it("write at the level → editable (fixes the coarse always-read-only rule)", () => {
|
|
184
|
-
const matrix = buildPermLevelMatrix(permissions, ["System Manager"]);
|
|
185
|
-
const tabs = build(fields, { permLevels: matrix });
|
|
186
|
-
expect(findField(tabs, "restricted")?.readOnly).toBe(false);
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
it("read without write at the level → read-only", () => {
|
|
190
|
-
const matrix = buildPermLevelMatrix(permissions, ["Auditor"]);
|
|
191
|
-
const tabs = build(fields, { permLevels: matrix });
|
|
192
|
-
expect(findField(tabs, "restricted")?.readOnly).toBe(true);
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it("no read at the level → field hidden (desk status None)", () => {
|
|
196
|
-
const matrix = buildPermLevelMatrix(permissions, ["Desk User"]);
|
|
197
|
-
const tabs = build(fields, { permLevels: matrix });
|
|
198
|
-
expect(findField(tabs, "restricted")).toBeUndefined();
|
|
199
|
-
expect(findField(tabs, "plain")).toBeDefined();
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
it("without a matrix falls back to coarse permlevel>0 read-only, never hidden", () => {
|
|
203
|
-
const tabs = build(fields);
|
|
204
|
-
expect(findField(tabs, "restricted")?.readOnly).toBe(true);
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
it("hides a Tab Break the user cannot read (tab.js:41)", () => {
|
|
208
|
-
const matrix = buildPermLevelMatrix(permissions, ["Desk User"]);
|
|
209
|
-
const tabs = build(
|
|
210
|
-
[
|
|
211
|
-
field({ fieldname: "a" }),
|
|
212
|
-
field({ fieldname: "sec_tab", fieldtype: "Tab Break", label: "Secret", permlevel: 1 }),
|
|
213
|
-
field({ fieldname: "b" }),
|
|
214
|
-
],
|
|
215
|
-
{ permLevels: matrix },
|
|
216
|
-
);
|
|
217
|
-
expect(tabs.map((t) => t.key)).toEqual(["__details"]);
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
describe("section collapse state (layout.js refresh_section_collapse)", () => {
|
|
222
|
-
it("collapsible sections start collapsed", () => {
|
|
223
|
-
const tabs = build([
|
|
224
|
-
field({ fieldname: "sec1", fieldtype: "Section Break", label: "S", collapsible: 1 }),
|
|
225
|
-
field({ fieldname: "a" }),
|
|
226
|
-
]);
|
|
227
|
-
expect(tabs[0].schema.sections[0].collapsed).toBe(true);
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it("collapsible_depends_on truthy → expanded (Notification print settings)", () => {
|
|
231
|
-
const fields = [
|
|
232
|
-
field({
|
|
233
|
-
fieldname: "sec1",
|
|
234
|
-
fieldtype: "Section Break",
|
|
235
|
-
label: "S",
|
|
236
|
-
collapsible: 1,
|
|
237
|
-
collapsible_depends_on: "attach_print",
|
|
238
|
-
}),
|
|
239
|
-
field({ fieldname: "a" }),
|
|
240
|
-
];
|
|
241
|
-
expect(build(fields, { doc: { attach_print: 1 } })[0].schema.sections[0].collapsed).toBe(false);
|
|
242
|
-
expect(build(fields, { doc: { attach_print: 0 } })[0].schema.sections[0].collapsed).toBe(true);
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
it("a missing mandatory value forces the section open (section.js has_missing_mandatory)", () => {
|
|
246
|
-
const fields = [
|
|
247
|
-
field({ fieldname: "sec1", fieldtype: "Section Break", label: "S", collapsible: 1 }),
|
|
248
|
-
field({ fieldname: "a", reqd: 1 }),
|
|
249
|
-
];
|
|
250
|
-
expect(build(fields, { doc: {} })[0].schema.sections[0].collapsed).toBe(false);
|
|
251
|
-
// Desk checks `value == null` — an empty string counts as present.
|
|
252
|
-
expect(build(fields, { doc: { a: "" } })[0].schema.sections[0].collapsed).toBe(true);
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
it("non-collapsible sections have no collapse state", () => {
|
|
256
|
-
const tabs = build([
|
|
257
|
-
field({ fieldname: "sec1", fieldtype: "Section Break", label: "S" }),
|
|
258
|
-
field({ fieldname: "a" }),
|
|
259
|
-
]);
|
|
260
|
-
expect(tabs[0].schema.sections[0].collapsed).toBeUndefined();
|
|
261
|
-
expect(tabs[0].schema.sections[0].collapsible).toBe(false);
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
it("forwards hide_border and description", () => {
|
|
265
|
-
const tabs = build([
|
|
266
|
-
field({
|
|
267
|
-
fieldname: "sec1",
|
|
268
|
-
fieldtype: "Section Break",
|
|
269
|
-
label: "S",
|
|
270
|
-
hide_border: 1,
|
|
271
|
-
description: "About this group",
|
|
272
|
-
}),
|
|
273
|
-
field({ fieldname: "a" }),
|
|
274
|
-
]);
|
|
275
|
-
expect(tabs[0].schema.sections[0].hideBorder).toBe(true);
|
|
276
|
-
expect(tabs[0].schema.sections[0].description).toBe("About this group");
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
describe("fetch_from read-only lock", () => {
|
|
281
|
-
const fields = [
|
|
282
|
-
field({ fieldname: "customer", fieldtype: "Link", options: "Customer" }),
|
|
283
|
-
field({ fieldname: "customer_name", fetch_from: "customer.customer_name" }),
|
|
284
|
-
field({
|
|
285
|
-
fieldname: "note",
|
|
286
|
-
fetch_from: "customer.note",
|
|
287
|
-
fetch_if_empty: 1,
|
|
288
|
-
}),
|
|
289
|
-
];
|
|
290
|
-
|
|
291
|
-
it("locks a fetch target while its source link is set (base_input.js:56)", () => {
|
|
292
|
-
const tabs = build(fields, { doc: { customer: "CUST-1" } });
|
|
293
|
-
expect(findField(tabs, "customer_name")?.readOnly).toBe(true);
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
it("keeps the target editable when the source is empty or fetch_if_empty is set", () => {
|
|
297
|
-
const emptyTabs = build(fields, { doc: {} });
|
|
298
|
-
expect(findField(emptyTabs, "customer_name")?.readOnly).toBe(false);
|
|
299
|
-
const setTabs = build(fields, { doc: { customer: "CUST-1" } });
|
|
300
|
-
expect(findField(setTabs, "note")?.readOnly).toBe(false);
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
describe("field property pass-through", () => {
|
|
305
|
-
it("forwards description, precision, and length", () => {
|
|
306
|
-
const tabs = build([
|
|
307
|
-
field({ fieldname: "a", description: "help", precision: "3", length: 20 }),
|
|
308
|
-
]);
|
|
309
|
-
const schema = findField(tabs, "a");
|
|
310
|
-
expect(schema?.description).toBe("help");
|
|
311
|
-
expect(schema?.precision).toBe(3);
|
|
312
|
-
expect(schema?.maxLength).toBe(20);
|
|
313
|
-
});
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
describe("buildCreateDefaults (create_new.js get_default_value)", () => {
|
|
317
|
-
it("seeds static, Today, and __user defaults", () => {
|
|
318
|
-
const doc = buildCreateDefaults(
|
|
319
|
-
[
|
|
320
|
-
field({
|
|
321
|
-
fieldname: "status",
|
|
322
|
-
fieldtype: "Select",
|
|
323
|
-
options: "Open\nClosed",
|
|
324
|
-
default: "Open",
|
|
325
|
-
}),
|
|
326
|
-
field({ fieldname: "date", fieldtype: "Date", default: "Today" }),
|
|
327
|
-
field({ fieldname: "owner_field", fieldtype: "Link", options: "User", default: "__user" }),
|
|
328
|
-
field({ fieldname: "count", fieldtype: "Int", default: "5" }),
|
|
329
|
-
],
|
|
330
|
-
"admin@example.com",
|
|
331
|
-
);
|
|
332
|
-
expect(doc.status).toBe("Open");
|
|
333
|
-
expect(doc.date).toMatch(/^\d{4}-\d{2}-\d{2}$/);
|
|
334
|
-
expect(doc.owner_field).toBe("admin@example.com");
|
|
335
|
-
expect(doc.count).toBe(5);
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
it("seeds `user` alias on Link/Data only and `now` per fieldtype", () => {
|
|
339
|
-
const doc = buildCreateDefaults(
|
|
340
|
-
[
|
|
341
|
-
field({ fieldname: "who", fieldtype: "Link", options: "User", default: "user" }),
|
|
342
|
-
field({ fieldname: "sel", fieldtype: "Select", options: "user\nrole", default: "user" }),
|
|
343
|
-
field({ fieldname: "at_time", fieldtype: "Time", default: "now" }),
|
|
344
|
-
field({ fieldname: "at_dt", fieldtype: "Datetime", default: "now" }),
|
|
345
|
-
],
|
|
346
|
-
"admin@example.com",
|
|
347
|
-
);
|
|
348
|
-
expect(doc.who).toBe("admin@example.com");
|
|
349
|
-
expect(doc.sel).toBe("user"); // Select keeps its literal option
|
|
350
|
-
expect(doc.at_time).toMatch(/^\d{2}:\d{2}:\d{2}$/);
|
|
351
|
-
expect(doc.at_dt).toMatch(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/);
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
it("seeds the first Select option when no default exists (create_new.js:107)", () => {
|
|
355
|
-
const doc = buildCreateDefaults([
|
|
356
|
-
field({ fieldname: "kind", fieldtype: "Select", options: "Small\nLarge" }),
|
|
357
|
-
field({ fieldname: "empty_first", fieldtype: "Select", options: "\nA\nB" }),
|
|
358
|
-
field({ fieldname: "placeholder", fieldtype: "Select", options: "[Select]" }),
|
|
359
|
-
]);
|
|
360
|
-
expect(doc.kind).toBe("Small");
|
|
361
|
-
expect(doc.empty_first).toBe("");
|
|
362
|
-
expect(doc.placeholder).toBeUndefined();
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
it("leaves server-resolved tokens unset", () => {
|
|
366
|
-
const doc = buildCreateDefaults([
|
|
367
|
-
field({ fieldname: "company", fieldtype: "Link", options: "Company", default: ":Company" }),
|
|
368
|
-
field({ fieldname: "fullname", fieldtype: "Data", default: "user_fullname" }),
|
|
369
|
-
]);
|
|
370
|
-
expect(doc.company).toBeUndefined();
|
|
371
|
-
expect(doc.fullname).toBeUndefined();
|
|
372
|
-
});
|
|
373
|
-
});
|