@multiplatform.one/backoffice 7.23.0 → 7.23.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/CommandPalette.cjs +2 -2
- package/dist/cjs/chrome/CommandPalette.native.js +2 -2
- package/dist/cjs/chrome/CommandPalette.native.js.map +1 -1
- package/dist/cjs/chrome/help-about-dialog.cjs +2 -1
- package/dist/cjs/chrome/help-about-dialog.native.js +2 -1
- package/dist/cjs/chrome/help-about-dialog.native.js.map +1 -1
- package/dist/cjs/chrome/help-shortcuts-dialog.cjs +3 -3
- package/dist/cjs/chrome/help-shortcuts-dialog.native.js +3 -3
- package/dist/cjs/chrome/help-shortcuts-dialog.native.js.map +1 -1
- package/dist/cjs/chrome/notifications-panel.cjs +4 -5
- package/dist/cjs/chrome/notifications-panel.native.js +4 -5
- package/dist/cjs/chrome/notifications-panel.native.js.map +1 -1
- package/dist/cjs/form/FormConnections.cjs +7 -7
- package/dist/cjs/form/FormConnections.native.js +7 -7
- package/dist/cjs/form/FormConnections.native.js.map +1 -1
- package/dist/cjs/form/FormDialogs.cjs +6 -5
- package/dist/cjs/form/FormDialogs.native.js +6 -5
- package/dist/cjs/form/FormDialogs.native.js.map +1 -1
- package/dist/cjs/form/FormSidebarPanel.cjs +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.cjs +4 -4
- package/dist/cjs/form/FormTimeline.native.js +4 -4
- package/dist/cjs/form/FormTimeline.native.js.map +1 -1
- package/dist/cjs/form/sidebar-dialogs.cjs +3 -2
- package/dist/cjs/form/sidebar-dialogs.native.js +3 -2
- package/dist/cjs/form/sidebar-dialogs.native.js.map +1 -1
- package/dist/cjs/list/AddTagsDialog.cjs +2 -1
- package/dist/cjs/list/AddTagsDialog.native.js +2 -1
- package/dist/cjs/list/AddTagsDialog.native.js.map +1 -1
- package/dist/cjs/list/AssignToDialog.cjs +2 -1
- package/dist/cjs/list/AssignToDialog.native.js +2 -1
- package/dist/cjs/list/AssignToDialog.native.js.map +1 -1
- package/dist/cjs/list/DoctypeListScreen.cjs +1 -22
- package/dist/cjs/list/DoctypeListScreen.native.js +1 -24
- package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/cjs/list/ListSidebar.cjs +2 -1
- package/dist/cjs/list/ListSidebar.native.js +2 -1
- package/dist/cjs/list/ListSidebar.native.js.map +1 -1
- package/dist/cjs/list/bulk-edit-dialog.cjs +2 -1
- package/dist/cjs/list/bulk-edit-dialog.native.js +2 -1
- package/dist/cjs/list/bulk-edit-dialog.native.js.map +1 -1
- package/dist/cjs/list/filter-editor.cjs +7 -5
- package/dist/cjs/list/filter-editor.native.js +7 -5
- package/dist/cjs/list/filter-editor.native.js.map +1 -1
- package/dist/cjs/list/filter-saved.cjs +2 -1
- package/dist/cjs/list/filter-saved.native.js +2 -1
- package/dist/cjs/list/filter-saved.native.js.map +1 -1
- package/dist/cjs/list/filter-sort.cjs +2 -1
- package/dist/cjs/list/filter-sort.native.js +2 -1
- package/dist/cjs/list/filter-sort.native.js.map +1 -1
- package/dist/cjs/list/sidebar-section.cjs +7 -3
- package/dist/cjs/list/sidebar-section.native.js +7 -3
- package/dist/cjs/list/sidebar-section.native.js.map +1 -1
- package/dist/cjs/quickEntry/QuickEntryDialog.cjs +1 -1
- package/dist/cjs/quickEntry/QuickEntryDialog.native.js +1 -1
- package/dist/cjs/quickEntry/QuickEntryDialog.native.js.map +1 -1
- package/dist/cjs/report/queryReportFilterBar.cjs +2 -2
- package/dist/cjs/report/queryReportFilterBar.native.js +2 -2
- package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
- package/dist/cjs/report/report-toolbar.cjs +5 -4
- package/dist/cjs/report/report-toolbar.native.js +5 -4
- package/dist/cjs/report/report-toolbar.native.js.map +1 -1
- package/dist/cjs/shared/measures.cjs +31 -0
- package/dist/cjs/shared/measures.native.js +34 -0
- package/dist/cjs/shared/measures.native.js.map +1 -0
- package/dist/cjs/shell/BackofficeShell.cjs +1 -1
- package/dist/cjs/shell/BackofficeShell.native.js +1 -1
- package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
- package/dist/cjs/views/DashboardView.cjs +17 -13
- package/dist/cjs/views/DashboardView.native.js +17 -13
- package/dist/cjs/views/DashboardView.native.js.map +1 -1
- package/dist/cjs/views/kanban-board-controls.cjs +4 -3
- package/dist/cjs/views/kanban-board-controls.native.js +4 -3
- package/dist/cjs/views/kanban-board-controls.native.js.map +1 -1
- package/dist/cjs/views/report-controls.cjs +5 -4
- package/dist/cjs/views/report-controls.native.js +5 -4
- package/dist/cjs/views/report-controls.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceChartBlock.cjs +4 -3
- package/dist/cjs/workspace/WorkspaceChartBlock.native.js +4 -3
- package/dist/cjs/workspace/WorkspaceChartBlock.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceLinkCard.cjs +2 -2
- package/dist/cjs/workspace/WorkspaceLinkCard.native.js +2 -2
- package/dist/cjs/workspace/WorkspaceLinkCard.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceLinkDirectory.cjs +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.cjs +2 -3
- package/dist/cjs/workspace/WorkspaceNumberCard.native.js +2 -3
- 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 +1 -1
- package/dist/cjs/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceRecents.cjs +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.cjs +11 -21
- package/dist/cjs/workspace/WorkspaceScreen.native.js +14 -22
- package/dist/cjs/workspace/WorkspaceScreen.native.js.map +1 -1
- package/dist/cjs/workspace/WorkspaceShortcut.cjs +3 -3
- package/dist/cjs/workspace/WorkspaceShortcut.native.js +3 -3
- package/dist/cjs/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/dist/cjs/workspace/useDashboardChart.cjs +1 -1
- package/dist/cjs/workspace/useDashboardChart.native.js +1 -1
- package/dist/cjs/workspace/useDashboardChart.native.js.map +1 -1
- package/dist/cjs/workspace/useWorkspaceDoc.cjs +1 -1
- package/dist/cjs/workspace/useWorkspaceDoc.native.js +1 -1
- package/dist/cjs/workspace/useWorkspaceDoc.native.js.map +1 -1
- package/dist/esm/chrome/CommandPalette.mjs +2 -2
- package/dist/esm/chrome/CommandPalette.mjs.map +1 -1
- package/dist/esm/chrome/CommandPalette.native.js +2 -2
- package/dist/esm/chrome/help-about-dialog.mjs +2 -1
- package/dist/esm/chrome/help-about-dialog.mjs.map +1 -1
- package/dist/esm/chrome/help-about-dialog.native.js +2 -1
- package/dist/esm/chrome/help-about-dialog.native.js.map +1 -1
- package/dist/esm/chrome/help-shortcuts-dialog.mjs +4 -4
- package/dist/esm/chrome/help-shortcuts-dialog.mjs.map +1 -1
- package/dist/esm/chrome/help-shortcuts-dialog.native.js +4 -4
- package/dist/esm/chrome/help-shortcuts-dialog.native.js.map +1 -1
- package/dist/esm/chrome/notifications-panel.mjs +5 -6
- package/dist/esm/chrome/notifications-panel.mjs.map +1 -1
- package/dist/esm/chrome/notifications-panel.native.js +5 -6
- package/dist/esm/chrome/notifications-panel.native.js.map +1 -1
- package/dist/esm/form/FormConnections.mjs +8 -8
- package/dist/esm/form/FormConnections.mjs.map +1 -1
- package/dist/esm/form/FormConnections.native.js +8 -8
- package/dist/esm/form/FormConnections.native.js.map +1 -1
- package/dist/esm/form/FormDialogs.mjs +7 -6
- package/dist/esm/form/FormDialogs.mjs.map +1 -1
- package/dist/esm/form/FormDialogs.native.js +7 -6
- package/dist/esm/form/FormDialogs.native.js.map +1 -1
- package/dist/esm/form/FormSidebarPanel.mjs +2 -2
- package/dist/esm/form/FormSidebarPanel.mjs.map +1 -1
- package/dist/esm/form/FormSidebarPanel.native.js +2 -2
- package/dist/esm/form/FormSidebarPanel.native.js.map +1 -1
- package/dist/esm/form/FormTimeline.mjs +4 -4
- package/dist/esm/form/FormTimeline.mjs.map +1 -1
- package/dist/esm/form/FormTimeline.native.js +4 -4
- package/dist/esm/form/FormTimeline.native.js.map +1 -1
- package/dist/esm/form/sidebar-dialogs.mjs +3 -2
- package/dist/esm/form/sidebar-dialogs.mjs.map +1 -1
- package/dist/esm/form/sidebar-dialogs.native.js +3 -2
- package/dist/esm/form/sidebar-dialogs.native.js.map +1 -1
- package/dist/esm/list/AddTagsDialog.mjs +2 -1
- package/dist/esm/list/AddTagsDialog.mjs.map +1 -1
- package/dist/esm/list/AddTagsDialog.native.js +2 -1
- package/dist/esm/list/AddTagsDialog.native.js.map +1 -1
- package/dist/esm/list/AssignToDialog.mjs +2 -1
- package/dist/esm/list/AssignToDialog.mjs.map +1 -1
- package/dist/esm/list/AssignToDialog.native.js +2 -1
- package/dist/esm/list/AssignToDialog.native.js.map +1 -1
- package/dist/esm/list/DoctypeListScreen.mjs +1 -22
- package/dist/esm/list/DoctypeListScreen.mjs.map +1 -1
- package/dist/esm/list/DoctypeListScreen.native.js +1 -24
- package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/esm/list/ListSidebar.mjs +2 -1
- package/dist/esm/list/ListSidebar.mjs.map +1 -1
- package/dist/esm/list/ListSidebar.native.js +2 -1
- package/dist/esm/list/ListSidebar.native.js.map +1 -1
- package/dist/esm/list/bulk-edit-dialog.mjs +2 -1
- package/dist/esm/list/bulk-edit-dialog.mjs.map +1 -1
- package/dist/esm/list/bulk-edit-dialog.native.js +2 -1
- package/dist/esm/list/bulk-edit-dialog.native.js.map +1 -1
- package/dist/esm/list/filter-editor.mjs +7 -5
- package/dist/esm/list/filter-editor.mjs.map +1 -1
- package/dist/esm/list/filter-editor.native.js +7 -5
- package/dist/esm/list/filter-editor.native.js.map +1 -1
- package/dist/esm/list/filter-saved.mjs +2 -1
- package/dist/esm/list/filter-saved.mjs.map +1 -1
- package/dist/esm/list/filter-saved.native.js +2 -1
- package/dist/esm/list/filter-saved.native.js.map +1 -1
- package/dist/esm/list/filter-sort.mjs +2 -1
- package/dist/esm/list/filter-sort.mjs.map +1 -1
- package/dist/esm/list/filter-sort.native.js +2 -1
- package/dist/esm/list/filter-sort.native.js.map +1 -1
- package/dist/esm/list/sidebar-section.mjs +8 -4
- package/dist/esm/list/sidebar-section.mjs.map +1 -1
- package/dist/esm/list/sidebar-section.native.js +8 -4
- package/dist/esm/list/sidebar-section.native.js.map +1 -1
- package/dist/esm/quickEntry/QuickEntryDialog.mjs +2 -2
- package/dist/esm/quickEntry/QuickEntryDialog.mjs.map +1 -1
- package/dist/esm/quickEntry/QuickEntryDialog.native.js +2 -2
- package/dist/esm/quickEntry/QuickEntryDialog.native.js.map +1 -1
- package/dist/esm/report/queryReportFilterBar.mjs +3 -3
- package/dist/esm/report/queryReportFilterBar.mjs.map +1 -1
- package/dist/esm/report/queryReportFilterBar.native.js +3 -3
- package/dist/esm/report/queryReportFilterBar.native.js.map +1 -1
- package/dist/esm/report/report-toolbar.mjs +5 -4
- package/dist/esm/report/report-toolbar.mjs.map +1 -1
- package/dist/esm/report/report-toolbar.native.js +5 -4
- package/dist/esm/report/report-toolbar.native.js.map +1 -1
- package/dist/esm/shared/measures.mjs +5 -0
- package/dist/esm/shared/measures.mjs.map +1 -0
- package/dist/esm/shared/measures.native.js +5 -0
- package/dist/esm/shared/measures.native.js.map +1 -0
- package/dist/esm/shell/BackofficeShell.mjs +2 -2
- package/dist/esm/shell/BackofficeShell.mjs.map +1 -1
- package/dist/esm/shell/BackofficeShell.native.js +2 -2
- package/dist/esm/shell/BackofficeShell.native.js.map +1 -1
- package/dist/esm/views/DashboardView.mjs +18 -14
- package/dist/esm/views/DashboardView.mjs.map +1 -1
- package/dist/esm/views/DashboardView.native.js +18 -14
- package/dist/esm/views/DashboardView.native.js.map +1 -1
- package/dist/esm/views/kanban-board-controls.mjs +5 -4
- package/dist/esm/views/kanban-board-controls.mjs.map +1 -1
- package/dist/esm/views/kanban-board-controls.native.js +5 -4
- package/dist/esm/views/kanban-board-controls.native.js.map +1 -1
- package/dist/esm/views/report-controls.mjs +5 -4
- package/dist/esm/views/report-controls.mjs.map +1 -1
- package/dist/esm/views/report-controls.native.js +5 -4
- package/dist/esm/views/report-controls.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceChartBlock.mjs +5 -4
- package/dist/esm/workspace/WorkspaceChartBlock.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceChartBlock.native.js +5 -4
- package/dist/esm/workspace/WorkspaceChartBlock.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkCard.mjs +2 -2
- package/dist/esm/workspace/WorkspaceLinkCard.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkCard.native.js +2 -2
- package/dist/esm/workspace/WorkspaceLinkCard.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkDirectory.mjs +2 -2
- package/dist/esm/workspace/WorkspaceLinkDirectory.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceLinkDirectory.native.js +2 -2
- package/dist/esm/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceNumberCard.mjs +2 -3
- package/dist/esm/workspace/WorkspaceNumberCard.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceNumberCard.native.js +2 -3
- 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 +2 -2
- package/dist/esm/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceRecents.mjs +2 -2
- package/dist/esm/workspace/WorkspaceRecents.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceRecents.native.js +2 -2
- package/dist/esm/workspace/WorkspaceRecents.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceScreen.mjs +12 -22
- package/dist/esm/workspace/WorkspaceScreen.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceScreen.native.js +15 -23
- package/dist/esm/workspace/WorkspaceScreen.native.js.map +1 -1
- package/dist/esm/workspace/WorkspaceShortcut.mjs +4 -4
- package/dist/esm/workspace/WorkspaceShortcut.mjs.map +1 -1
- package/dist/esm/workspace/WorkspaceShortcut.native.js +4 -4
- package/dist/esm/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/dist/esm/workspace/useDashboardChart.mjs +1 -1
- package/dist/esm/workspace/useDashboardChart.mjs.map +1 -1
- package/dist/esm/workspace/useDashboardChart.native.js +1 -1
- package/dist/esm/workspace/useDashboardChart.native.js.map +1 -1
- package/dist/esm/workspace/useWorkspaceDoc.mjs +1 -1
- package/dist/esm/workspace/useWorkspaceDoc.mjs.map +1 -1
- package/dist/esm/workspace/useWorkspaceDoc.native.js +1 -1
- package/dist/esm/workspace/useWorkspaceDoc.native.js.map +1 -1
- package/dist/jsx/chrome/CommandPalette.mjs +2 -2
- package/dist/jsx/chrome/CommandPalette.mjs.map +1 -1
- package/dist/jsx/chrome/CommandPalette.native.js +2 -2
- package/dist/jsx/chrome/CommandPalette.native.js.map +1 -1
- package/dist/jsx/chrome/help-about-dialog.mjs +2 -1
- package/dist/jsx/chrome/help-about-dialog.mjs.map +1 -1
- package/dist/jsx/chrome/help-about-dialog.native.js +2 -1
- package/dist/jsx/chrome/help-about-dialog.native.js.map +1 -1
- package/dist/jsx/chrome/help-shortcuts-dialog.mjs +4 -4
- package/dist/jsx/chrome/help-shortcuts-dialog.mjs.map +1 -1
- package/dist/jsx/chrome/help-shortcuts-dialog.native.js +3 -3
- package/dist/jsx/chrome/help-shortcuts-dialog.native.js.map +1 -1
- package/dist/jsx/chrome/notifications-panel.mjs +5 -6
- package/dist/jsx/chrome/notifications-panel.mjs.map +1 -1
- package/dist/jsx/chrome/notifications-panel.native.js +4 -5
- package/dist/jsx/chrome/notifications-panel.native.js.map +1 -1
- package/dist/jsx/form/FormConnections.mjs +8 -8
- package/dist/jsx/form/FormConnections.mjs.map +1 -1
- package/dist/jsx/form/FormConnections.native.js +7 -7
- package/dist/jsx/form/FormConnections.native.js.map +1 -1
- package/dist/jsx/form/FormDialogs.mjs +7 -6
- package/dist/jsx/form/FormDialogs.mjs.map +1 -1
- package/dist/jsx/form/FormDialogs.native.js +6 -5
- package/dist/jsx/form/FormDialogs.native.js.map +1 -1
- package/dist/jsx/form/FormSidebarPanel.mjs +2 -2
- package/dist/jsx/form/FormSidebarPanel.mjs.map +1 -1
- package/dist/jsx/form/FormSidebarPanel.native.js +1 -1
- package/dist/jsx/form/FormSidebarPanel.native.js.map +1 -1
- package/dist/jsx/form/FormTimeline.mjs +4 -4
- package/dist/jsx/form/FormTimeline.mjs.map +1 -1
- package/dist/jsx/form/FormTimeline.native.js +4 -4
- package/dist/jsx/form/FormTimeline.native.js.map +1 -1
- package/dist/jsx/form/sidebar-dialogs.mjs +3 -2
- package/dist/jsx/form/sidebar-dialogs.mjs.map +1 -1
- package/dist/jsx/form/sidebar-dialogs.native.js +3 -2
- package/dist/jsx/form/sidebar-dialogs.native.js.map +1 -1
- package/dist/jsx/list/AddTagsDialog.mjs +2 -1
- package/dist/jsx/list/AddTagsDialog.mjs.map +1 -1
- package/dist/jsx/list/AddTagsDialog.native.js +2 -1
- package/dist/jsx/list/AddTagsDialog.native.js.map +1 -1
- package/dist/jsx/list/AssignToDialog.mjs +2 -1
- package/dist/jsx/list/AssignToDialog.mjs.map +1 -1
- package/dist/jsx/list/AssignToDialog.native.js +2 -1
- package/dist/jsx/list/AssignToDialog.native.js.map +1 -1
- package/dist/jsx/list/DoctypeListScreen.mjs +1 -22
- package/dist/jsx/list/DoctypeListScreen.mjs.map +1 -1
- package/dist/jsx/list/DoctypeListScreen.native.js +1 -24
- package/dist/jsx/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/jsx/list/ListSidebar.mjs +2 -1
- package/dist/jsx/list/ListSidebar.mjs.map +1 -1
- package/dist/jsx/list/ListSidebar.native.js +2 -1
- package/dist/jsx/list/ListSidebar.native.js.map +1 -1
- package/dist/jsx/list/bulk-edit-dialog.mjs +2 -1
- package/dist/jsx/list/bulk-edit-dialog.mjs.map +1 -1
- package/dist/jsx/list/bulk-edit-dialog.native.js +2 -1
- package/dist/jsx/list/bulk-edit-dialog.native.js.map +1 -1
- package/dist/jsx/list/filter-editor.mjs +7 -5
- package/dist/jsx/list/filter-editor.mjs.map +1 -1
- package/dist/jsx/list/filter-editor.native.js +7 -5
- package/dist/jsx/list/filter-editor.native.js.map +1 -1
- package/dist/jsx/list/filter-saved.mjs +2 -1
- package/dist/jsx/list/filter-saved.mjs.map +1 -1
- package/dist/jsx/list/filter-saved.native.js +2 -1
- package/dist/jsx/list/filter-saved.native.js.map +1 -1
- package/dist/jsx/list/filter-sort.mjs +2 -1
- package/dist/jsx/list/filter-sort.mjs.map +1 -1
- package/dist/jsx/list/filter-sort.native.js +2 -1
- package/dist/jsx/list/filter-sort.native.js.map +1 -1
- package/dist/jsx/list/sidebar-section.mjs +8 -4
- package/dist/jsx/list/sidebar-section.mjs.map +1 -1
- package/dist/jsx/list/sidebar-section.native.js +7 -3
- package/dist/jsx/list/sidebar-section.native.js.map +1 -1
- package/dist/jsx/quickEntry/QuickEntryDialog.mjs +2 -2
- package/dist/jsx/quickEntry/QuickEntryDialog.mjs.map +1 -1
- package/dist/jsx/quickEntry/QuickEntryDialog.native.js +1 -1
- package/dist/jsx/quickEntry/QuickEntryDialog.native.js.map +1 -1
- package/dist/jsx/report/queryReportFilterBar.mjs +3 -3
- package/dist/jsx/report/queryReportFilterBar.mjs.map +1 -1
- package/dist/jsx/report/queryReportFilterBar.native.js +2 -2
- package/dist/jsx/report/queryReportFilterBar.native.js.map +1 -1
- package/dist/jsx/report/report-toolbar.mjs +5 -4
- package/dist/jsx/report/report-toolbar.mjs.map +1 -1
- package/dist/jsx/report/report-toolbar.native.js +5 -4
- package/dist/jsx/report/report-toolbar.native.js.map +1 -1
- package/dist/jsx/shared/measures.mjs +5 -0
- package/dist/jsx/shared/measures.mjs.map +1 -0
- package/dist/jsx/shared/measures.native.js +34 -0
- package/dist/jsx/shared/measures.native.js.map +1 -0
- package/dist/jsx/shell/BackofficeShell.mjs +2 -2
- package/dist/jsx/shell/BackofficeShell.mjs.map +1 -1
- package/dist/jsx/shell/BackofficeShell.native.js +1 -1
- package/dist/jsx/shell/BackofficeShell.native.js.map +1 -1
- package/dist/jsx/views/DashboardView.mjs +18 -14
- package/dist/jsx/views/DashboardView.mjs.map +1 -1
- package/dist/jsx/views/DashboardView.native.js +17 -13
- package/dist/jsx/views/DashboardView.native.js.map +1 -1
- package/dist/jsx/views/kanban-board-controls.mjs +5 -4
- package/dist/jsx/views/kanban-board-controls.mjs.map +1 -1
- package/dist/jsx/views/kanban-board-controls.native.js +4 -3
- package/dist/jsx/views/kanban-board-controls.native.js.map +1 -1
- package/dist/jsx/views/report-controls.mjs +5 -4
- package/dist/jsx/views/report-controls.mjs.map +1 -1
- package/dist/jsx/views/report-controls.native.js +5 -4
- package/dist/jsx/views/report-controls.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceChartBlock.mjs +5 -4
- package/dist/jsx/workspace/WorkspaceChartBlock.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceChartBlock.native.js +4 -3
- package/dist/jsx/workspace/WorkspaceChartBlock.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceLinkCard.mjs +2 -2
- package/dist/jsx/workspace/WorkspaceLinkCard.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceLinkCard.native.js +2 -2
- package/dist/jsx/workspace/WorkspaceLinkCard.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceLinkDirectory.mjs +2 -2
- package/dist/jsx/workspace/WorkspaceLinkDirectory.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceLinkDirectory.native.js +1 -1
- package/dist/jsx/workspace/WorkspaceLinkDirectory.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceNumberCard.mjs +2 -3
- package/dist/jsx/workspace/WorkspaceNumberCard.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceNumberCard.native.js +2 -3
- package/dist/jsx/workspace/WorkspaceNumberCard.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 +1 -1
- package/dist/jsx/workspace/WorkspaceQuickList.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceRecents.mjs +2 -2
- package/dist/jsx/workspace/WorkspaceRecents.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceRecents.native.js +1 -1
- package/dist/jsx/workspace/WorkspaceRecents.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceScreen.mjs +12 -22
- package/dist/jsx/workspace/WorkspaceScreen.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceScreen.native.js +14 -22
- package/dist/jsx/workspace/WorkspaceScreen.native.js.map +1 -1
- package/dist/jsx/workspace/WorkspaceShortcut.mjs +4 -4
- package/dist/jsx/workspace/WorkspaceShortcut.mjs.map +1 -1
- package/dist/jsx/workspace/WorkspaceShortcut.native.js +3 -3
- package/dist/jsx/workspace/WorkspaceShortcut.native.js.map +1 -1
- package/dist/jsx/workspace/useDashboardChart.mjs +1 -1
- package/dist/jsx/workspace/useDashboardChart.mjs.map +1 -1
- package/dist/jsx/workspace/useDashboardChart.native.js +1 -1
- package/dist/jsx/workspace/useDashboardChart.native.js.map +1 -1
- package/dist/jsx/workspace/useWorkspaceDoc.mjs +1 -1
- package/dist/jsx/workspace/useWorkspaceDoc.mjs.map +1 -1
- package/dist/jsx/workspace/useWorkspaceDoc.native.js +1 -1
- package/dist/jsx/workspace/useWorkspaceDoc.native.js.map +1 -1
- package/package.json +12 -12
- package/src/chrome/CommandPalette.stories.tsx +7 -1
- package/src/chrome/CommandPalette.tsx +2 -2
- package/src/chrome/help-about-dialog.tsx +5 -1
- package/src/chrome/help-shortcuts-dialog.tsx +16 -4
- package/src/chrome/notifications-panel.tsx +11 -4
- package/src/desk/Desk.stories.tsx +7 -1
- package/src/desk/DeskSurface.stories.tsx +7 -1
- package/src/form/FormConnections.tsx +40 -5
- package/src/form/FormDialogs.tsx +18 -4
- package/src/form/FormSidebarPanel.tsx +5 -1
- package/src/form/FormTimeline.tsx +14 -2
- package/src/form/sidebar-dialogs.tsx +3 -2
- package/src/list/AddTagsDialog.tsx +2 -1
- package/src/list/AssignToDialog.tsx +2 -1
- package/src/list/DoctypeListScreen.auth.spec.tsx +84 -0
- package/src/list/DoctypeListScreen.tsx +5 -32
- package/src/list/ListSidebar.tsx +2 -1
- package/src/list/bulk-edit-dialog.tsx +2 -1
- package/src/list/filter-editor.tsx +29 -5
- package/src/list/filter-saved.tsx +11 -1
- package/src/list/filter-sort.tsx +7 -1
- package/src/list/sidebar-section.tsx +10 -2
- package/src/quickEntry/QuickEntryDialog.tsx +7 -2
- package/src/report/queryReportFilterBar.tsx +9 -3
- package/src/report/report-toolbar.tsx +5 -4
- package/src/shared/measures.ts +11 -0
- package/src/shell/BackofficeShell.tsx +14 -2
- package/src/shell/NotFoundScreen.stories.tsx +7 -1
- package/src/views/DashboardView.tsx +32 -8
- package/src/views/DoctypeViewScreen.stories.tsx +7 -1
- package/src/views/kanban-board-controls.tsx +12 -4
- package/src/views/report-controls.tsx +5 -4
- package/src/workspace/WorkspaceChartBlock.tsx +15 -4
- package/src/workspace/WorkspaceLinkCard.tsx +2 -2
- package/src/workspace/WorkspaceLinkDirectory.tsx +10 -2
- package/src/workspace/WorkspaceNumberCard.tsx +2 -2
- package/src/workspace/WorkspaceQuickList.tsx +2 -1
- package/src/workspace/WorkspaceRecents.tsx +11 -2
- package/src/workspace/WorkspaceScreen.tsx +17 -9
- package/src/workspace/WorkspaceShortcut.tsx +20 -3
- package/src/workspace/clientCache.auth.spec.ts +65 -0
- package/src/workspace/useDashboardChart.ts +1 -1
- package/src/workspace/useWorkspaceDoc.ts +1 -1
- package/types/chrome/help-about-dialog.d.ts.map +1 -1
- package/types/chrome/help-shortcuts-dialog.d.ts.map +1 -1
- package/types/chrome/notifications-panel.d.ts.map +1 -1
- package/types/form/FormConnections.d.ts.map +1 -1
- package/types/form/FormDialogs.d.ts.map +1 -1
- package/types/form/FormSidebarPanel.d.ts.map +1 -1
- package/types/form/FormTimeline.d.ts.map +1 -1
- package/types/form/sidebar-dialogs.d.ts.map +1 -1
- package/types/list/AddTagsDialog.d.ts.map +1 -1
- package/types/list/AssignToDialog.d.ts.map +1 -1
- package/types/list/DoctypeListScreen.d.ts.map +1 -1
- package/types/list/ListSidebar.d.ts.map +1 -1
- package/types/list/bulk-edit-dialog.d.ts.map +1 -1
- package/types/list/filter-editor.d.ts.map +1 -1
- package/types/list/filter-saved.d.ts.map +1 -1
- package/types/list/filter-sort.d.ts.map +1 -1
- package/types/list/sidebar-section.d.ts.map +1 -1
- package/types/quickEntry/QuickEntryDialog.d.ts.map +1 -1
- package/types/report/queryReportFilterBar.d.ts.map +1 -1
- package/types/report/report-toolbar.d.ts.map +1 -1
- package/types/shared/measures.d.ts +3 -0
- package/types/shared/measures.d.ts.map +1 -0
- package/types/shell/BackofficeShell.d.ts.map +1 -1
- package/types/views/DashboardView.d.ts.map +1 -1
- package/types/views/kanban-board-controls.d.ts.map +1 -1
- package/types/views/report-controls.d.ts.map +1 -1
- package/types/workspace/WorkspaceChartBlock.d.ts.map +1 -1
- package/types/workspace/WorkspaceLinkDirectory.d.ts.map +1 -1
- package/types/workspace/WorkspaceQuickList.d.ts.map +1 -1
- package/types/workspace/WorkspaceRecents.d.ts.map +1 -1
- package/types/workspace/WorkspaceScreen.d.ts.map +1 -1
- package/types/workspace/WorkspaceShortcut.d.ts.map +1 -1
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
import {
|
|
16
16
|
ensureFocusVisibleRing,
|
|
17
17
|
getGroupPosition,
|
|
18
|
+
sizeRecipeEscape,
|
|
18
19
|
stackRadiusProps,
|
|
19
20
|
useResolvedKnobs,
|
|
20
21
|
} from "@multiplatform.one/theme";
|
|
@@ -108,7 +109,14 @@ function ConnectionRow({ link, docname, count, countsLoading, index, total }: Co
|
|
|
108
109
|
{link.targetDoctype}
|
|
109
110
|
</SizableText>
|
|
110
111
|
{countsLoading ? (
|
|
111
|
-
<Skeleton
|
|
112
|
+
<Skeleton
|
|
113
|
+
variant="rounded"
|
|
114
|
+
width="$2"
|
|
115
|
+
height={sizeRecipeEscape(
|
|
116
|
+
18,
|
|
117
|
+
"loading bones sized to the connection card rows they stand in for",
|
|
118
|
+
)}
|
|
119
|
+
/>
|
|
112
120
|
) : (
|
|
113
121
|
<>
|
|
114
122
|
{openText !== undefined && (
|
|
@@ -189,12 +197,39 @@ function ConnectionsSkeleton() {
|
|
|
189
197
|
return (
|
|
190
198
|
<Card flexBasis={240} flexGrow={1} flexShrink={1}>
|
|
191
199
|
<YStack {...knobProps.panelPadding} {...knobProps.gap}>
|
|
192
|
-
<Skeleton
|
|
200
|
+
<Skeleton
|
|
201
|
+
width={sizeRecipeEscape(
|
|
202
|
+
120,
|
|
203
|
+
"loading bones sized to the connection card rows they stand in for",
|
|
204
|
+
)}
|
|
205
|
+
height={sizeRecipeEscape(
|
|
206
|
+
18,
|
|
207
|
+
"loading bones sized to the connection card rows they stand in for",
|
|
208
|
+
)}
|
|
209
|
+
/>
|
|
193
210
|
<Separator />
|
|
194
211
|
<YStack gap="$2">
|
|
195
|
-
<Skeleton
|
|
196
|
-
|
|
197
|
-
|
|
212
|
+
<Skeleton
|
|
213
|
+
width="82%"
|
|
214
|
+
height={sizeRecipeEscape(
|
|
215
|
+
16,
|
|
216
|
+
"loading bones sized to the connection card rows they stand in for",
|
|
217
|
+
)}
|
|
218
|
+
/>
|
|
219
|
+
<Skeleton
|
|
220
|
+
width="64%"
|
|
221
|
+
height={sizeRecipeEscape(
|
|
222
|
+
16,
|
|
223
|
+
"loading bones sized to the connection card rows they stand in for",
|
|
224
|
+
)}
|
|
225
|
+
/>
|
|
226
|
+
<Skeleton
|
|
227
|
+
width="73%"
|
|
228
|
+
height={sizeRecipeEscape(
|
|
229
|
+
16,
|
|
230
|
+
"loading bones sized to the connection card rows they stand in for",
|
|
231
|
+
)}
|
|
232
|
+
/>
|
|
198
233
|
</YStack>
|
|
199
234
|
</YStack>
|
|
200
235
|
</Card>
|
package/src/form/FormDialogs.tsx
CHANGED
|
@@ -13,12 +13,14 @@ import { Link } from "@multiplatform.one/frappe-ui";
|
|
|
13
13
|
import {
|
|
14
14
|
ensureFocusVisibleRing,
|
|
15
15
|
getGroupPosition,
|
|
16
|
+
sizeRecipeEscape,
|
|
16
17
|
stackRadiusProps,
|
|
17
18
|
useResolvedKnobs,
|
|
18
19
|
} from "@multiplatform.one/theme";
|
|
19
20
|
import { useEffect, useMemo, useState } from "react";
|
|
20
21
|
import { useTranslation } from "react-i18next";
|
|
21
22
|
import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
23
|
+
import { dialogBodyMinWidth } from "../shared/measures";
|
|
22
24
|
|
|
23
25
|
// ---------------------------------------------------------------------------
|
|
24
26
|
// Rename
|
|
@@ -106,7 +108,7 @@ export function EmailDialog({ open, onOpenChange, defaultSubject, onSend }: Emai
|
|
|
106
108
|
confirmDisabledReason={t("emailDisabled", "Recipients and subject are required")}
|
|
107
109
|
onConfirm={() => onSend({ recipients: recipients.trim(), subject: subject.trim(), content })}
|
|
108
110
|
>
|
|
109
|
-
<YStack {...knobProps.gap} minWidth={
|
|
111
|
+
<YStack {...knobProps.gap} minWidth={dialogBodyMinWidth}>
|
|
110
112
|
<Input
|
|
111
113
|
value={recipients}
|
|
112
114
|
onChangeText={setRecipients}
|
|
@@ -163,7 +165,7 @@ export function AssignDialog({ open, onOpenChange, onAssign }: AssignDialogProps
|
|
|
163
165
|
confirmDisabledReason={t("assignDisabled", "Pick a user first")}
|
|
164
166
|
onConfirm={() => onAssign(user)}
|
|
165
167
|
>
|
|
166
|
-
<YStack {...knobProps.gap} minWidth={
|
|
168
|
+
<YStack {...knobProps.gap} minWidth={dialogBodyMinWidth}>
|
|
167
169
|
<Link
|
|
168
170
|
label={t("assignTo", "Assign to")}
|
|
169
171
|
doctype="User"
|
|
@@ -226,7 +228,14 @@ export function JumpToFieldDialog({ open, onOpenChange, fields, onJump }: JumpTo
|
|
|
226
228
|
if (matches[0]) onJump(matches[0]);
|
|
227
229
|
}}
|
|
228
230
|
>
|
|
229
|
-
<YStack
|
|
231
|
+
<YStack
|
|
232
|
+
{...knobProps.gap}
|
|
233
|
+
minWidth={dialogBodyMinWidth}
|
|
234
|
+
maxWidth={sizeRecipeEscape(
|
|
235
|
+
420,
|
|
236
|
+
"jump-to-field: a scannable column width, and the match list scrolls past about six rows",
|
|
237
|
+
)}
|
|
238
|
+
>
|
|
230
239
|
<Input
|
|
231
240
|
value={query}
|
|
232
241
|
onChangeText={setQuery}
|
|
@@ -236,7 +245,12 @@ export function JumpToFieldDialog({ open, onOpenChange, fields, onJump }: JumpTo
|
|
|
236
245
|
autoFocus: true,
|
|
237
246
|
}}
|
|
238
247
|
/>
|
|
239
|
-
<ScrollView
|
|
248
|
+
<ScrollView
|
|
249
|
+
maxHeight={sizeRecipeEscape(
|
|
250
|
+
240,
|
|
251
|
+
"jump-to-field: a scannable column width, and the match list scrolls past about six rows",
|
|
252
|
+
)}
|
|
253
|
+
>
|
|
240
254
|
<YStack>
|
|
241
255
|
{matches.map((field, index) => {
|
|
242
256
|
const position = getGroupPosition(index, matches.length);
|
|
@@ -50,6 +50,7 @@ import {
|
|
|
50
50
|
import {
|
|
51
51
|
ensureFocusVisibleRing,
|
|
52
52
|
getGroupPosition,
|
|
53
|
+
sizeRecipeEscape,
|
|
53
54
|
stackEdgeRadius,
|
|
54
55
|
useResolvedKnobs,
|
|
55
56
|
} from "@multiplatform.one/theme";
|
|
@@ -553,7 +554,10 @@ export function FormSidebarPanel({
|
|
|
553
554
|
src={imageUrl}
|
|
554
555
|
alt={t("documentImage", "Document image")}
|
|
555
556
|
width="100%"
|
|
556
|
-
height={
|
|
557
|
+
height={sizeRecipeEscape(
|
|
558
|
+
140,
|
|
559
|
+
"document image: a fixed-height cover thumbnail in the sidebar",
|
|
560
|
+
)}
|
|
557
561
|
objectFit="cover"
|
|
558
562
|
{...knobProps.containerRadius}
|
|
559
563
|
/>
|
|
@@ -607,7 +607,13 @@ export function FormTimeline({
|
|
|
607
607
|
gap="$3"
|
|
608
608
|
alignItems="flex-start"
|
|
609
609
|
>
|
|
610
|
-
<YStack
|
|
610
|
+
<YStack
|
|
611
|
+
width="$1.5"
|
|
612
|
+
height="$1.5"
|
|
613
|
+
alignItems="center"
|
|
614
|
+
justifyContent="center"
|
|
615
|
+
opacity={0.6}
|
|
616
|
+
>
|
|
611
617
|
{icon}
|
|
612
618
|
</YStack>
|
|
613
619
|
<XStack flex={1} gap="$1.5" alignItems="center" flexWrap="wrap" paddingTop={2}>
|
|
@@ -643,7 +649,13 @@ export function FormTimeline({
|
|
|
643
649
|
gap="$3"
|
|
644
650
|
alignItems="flex-start"
|
|
645
651
|
>
|
|
646
|
-
<YStack
|
|
652
|
+
<YStack
|
|
653
|
+
width="$1.5"
|
|
654
|
+
height="$1.5"
|
|
655
|
+
alignItems="center"
|
|
656
|
+
justifyContent="center"
|
|
657
|
+
opacity={0.6}
|
|
658
|
+
>
|
|
647
659
|
{icon}
|
|
648
660
|
</YStack>
|
|
649
661
|
<YStack
|
|
@@ -12,6 +12,7 @@ import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
|
12
12
|
import { useEffect, useState } from "react";
|
|
13
13
|
import { useTranslation } from "react-i18next";
|
|
14
14
|
import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
15
|
+
import { dialogBodyMinWidth } from "../shared/measures";
|
|
15
16
|
|
|
16
17
|
export interface SidebarAssignDialogProps {
|
|
17
18
|
open: boolean;
|
|
@@ -44,7 +45,7 @@ export function SidebarAssignDialog({ open, onOpenChange, onAssign }: SidebarAss
|
|
|
44
45
|
confirmDisabledReason={t("assignDisabled", "Pick a user first")}
|
|
45
46
|
onConfirm={() => onAssign(user, description.trim() || undefined)}
|
|
46
47
|
>
|
|
47
|
-
<YStack {...knobProps.gap} minWidth={
|
|
48
|
+
<YStack {...knobProps.gap} minWidth={dialogBodyMinWidth}>
|
|
48
49
|
<Link
|
|
49
50
|
label={t("assignTo", "Assign to")}
|
|
50
51
|
doctype="User"
|
|
@@ -94,7 +95,7 @@ export function SidebarShareDialog({ open, onOpenChange, onShare }: SidebarShare
|
|
|
94
95
|
confirmDisabledReason={t("shareDisabled", "Pick a user first")}
|
|
95
96
|
onConfirm={() => onShare(user, canWrite)}
|
|
96
97
|
>
|
|
97
|
-
<YStack {...knobProps.gap} minWidth={
|
|
98
|
+
<YStack {...knobProps.gap} minWidth={dialogBodyMinWidth}>
|
|
98
99
|
<Link
|
|
99
100
|
label={t("shareWith", "Share with")}
|
|
100
101
|
doctype="User"
|
|
@@ -9,6 +9,7 @@ import { useTranslation } from "react-i18next";
|
|
|
9
9
|
import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
10
10
|
import { useFrappeApp } from "../shared/useFrappeApp";
|
|
11
11
|
import { bulkAddTag } from "./bulkActions";
|
|
12
|
+
import { dialogBodyMinWidth } from "../shared/measures";
|
|
12
13
|
|
|
13
14
|
export interface AddTagsDialogProps {
|
|
14
15
|
doctype: string;
|
|
@@ -82,7 +83,7 @@ export function AddTagsDialog({ doctype, names, open, onOpenChange, onDone }: Ad
|
|
|
82
83
|
void handleConfirm();
|
|
83
84
|
}}
|
|
84
85
|
>
|
|
85
|
-
<YStack gap="$3" minWidth={
|
|
86
|
+
<YStack gap="$3" minWidth={dialogBodyMinWidth}>
|
|
86
87
|
<Text color="$color11" fontSize="$3">
|
|
87
88
|
{t("list.tagBody", {
|
|
88
89
|
count: names.length,
|
|
@@ -8,6 +8,7 @@ import { useTranslation } from "react-i18next";
|
|
|
8
8
|
import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
9
9
|
import { useFrappeApp } from "../shared/useFrappeApp";
|
|
10
10
|
import { bulkAssign } from "./bulkActions";
|
|
11
|
+
import { dialogBodyMinWidth } from "../shared/measures";
|
|
11
12
|
|
|
12
13
|
export interface AssignToDialogProps {
|
|
13
14
|
doctype: string;
|
|
@@ -74,7 +75,7 @@ export function AssignToDialog({
|
|
|
74
75
|
void handleConfirm();
|
|
75
76
|
}}
|
|
76
77
|
>
|
|
77
|
-
<YStack gap="$3" minWidth={
|
|
78
|
+
<YStack gap="$3" minWidth={dialogBodyMinWidth}>
|
|
78
79
|
<Text color="$color11" fontSize="$3">
|
|
79
80
|
{t("list.assignBody", {
|
|
80
81
|
count: names.length,
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// A Keycloak-signed-in reader hands the provider its token as a getter
|
|
2
|
+
// (MPO-399). Every request the list makes must carry that bearer: the bench
|
|
3
|
+
// answers a tokenless call as Guest (403), which is how the header count
|
|
4
|
+
// read "0 results" beside a full page of rows.
|
|
5
|
+
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
6
|
+
import { screen, waitFor } from "@testing-library/react";
|
|
7
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
|
+
import { BackofficeProvider } from "../config/BackofficeProvider";
|
|
9
|
+
import { createMemoryNavigator } from "../navigation/navigator";
|
|
10
|
+
import { DoctypeListScreen } from "./DoctypeListScreen";
|
|
11
|
+
|
|
12
|
+
const doctype = "Pokemon";
|
|
13
|
+
const bearer = "Bearer kc-access-token";
|
|
14
|
+
|
|
15
|
+
const meta = {
|
|
16
|
+
name: doctype,
|
|
17
|
+
doctype: "DocType",
|
|
18
|
+
title_field: "pokemon_name",
|
|
19
|
+
fields: [
|
|
20
|
+
{ fieldname: "pokemon_name", fieldtype: "Data", label: "Pokemon Name", in_list_view: 1 },
|
|
21
|
+
],
|
|
22
|
+
permissions: [{ role: "Pokemon Reader", read: 1 }],
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
let run = 0;
|
|
26
|
+
let calls: { path: string; authorization: string | null }[] = [];
|
|
27
|
+
|
|
28
|
+
function json(body: unknown, status = 200) {
|
|
29
|
+
return new Response(JSON.stringify(body), {
|
|
30
|
+
status,
|
|
31
|
+
headers: { "content-type": "application/json" },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
run += 1;
|
|
37
|
+
calls = [];
|
|
38
|
+
vi.stubGlobal("fetch", async (input: string | URL | Request, init?: RequestInit) => {
|
|
39
|
+
const url = new URL(String(input instanceof Request ? input.url : input));
|
|
40
|
+
const headers = new Headers(input instanceof Request ? input.headers : init?.headers);
|
|
41
|
+
const authorization = headers.get("Authorization");
|
|
42
|
+
calls.push({ path: `${url.pathname}${url.search}`, authorization });
|
|
43
|
+
if (authorization !== bearer) {
|
|
44
|
+
return json({ exc_type: "PermissionError" }, 403);
|
|
45
|
+
}
|
|
46
|
+
const method = url.pathname.replace(/^\/api\/method\//, "");
|
|
47
|
+
if (method === "frappe.auth.get_logged_user") return json({ message: "ash@pokemon.test" });
|
|
48
|
+
if (method === "frappe.core.doctype.user.user.get_roles") {
|
|
49
|
+
return json({ message: ["Pokemon Reader"] });
|
|
50
|
+
}
|
|
51
|
+
if (method === "frappe.desk.form.load.getdoctype") return json({ docs: [meta] });
|
|
52
|
+
if (method === "frappe.client.get_count") return json({ message: 21 });
|
|
53
|
+
if (url.pathname === `/api/resource/${doctype}`) {
|
|
54
|
+
return json({ data: [{ name: "bulbasaur", doctype, pokemon_name: "Bulbasaur" }] });
|
|
55
|
+
}
|
|
56
|
+
return json({ data: [], message: [] });
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
afterEach(() => {
|
|
61
|
+
vi.restoreAllMocks();
|
|
62
|
+
vi.unstubAllGlobals();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe("DoctypeListScreen auth", () => {
|
|
66
|
+
it("sends the provider's token getter on every call, the header count included", async () => {
|
|
67
|
+
renderWithProviders(
|
|
68
|
+
<BackofficeProvider
|
|
69
|
+
frappe={{
|
|
70
|
+
baseURL: `https://list-auth-${run}.spec.test`,
|
|
71
|
+
auth: { useToken: true, type: "Bearer", token: async () => "kc-access-token" },
|
|
72
|
+
}}
|
|
73
|
+
navigation={createMemoryNavigator("/backoffice")}
|
|
74
|
+
>
|
|
75
|
+
<DoctypeListScreen doctype={doctype} />
|
|
76
|
+
</BackofficeProvider>,
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
await waitFor(() => expect(screen.getByText("21 results")).toBeTruthy(), { timeout: 5000 });
|
|
80
|
+
const counts = calls.filter((call) => call.path.includes("frappe.client.get_count"));
|
|
81
|
+
expect(counts.length).toBeGreaterThan(0);
|
|
82
|
+
expect(calls.filter((call) => call.authorization !== bearer)).toEqual([]);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -361,38 +361,11 @@ export function DoctypeListScreen({
|
|
|
361
361
|
effectiveSortRef.current = { field: sortField, order: sortOrder };
|
|
362
362
|
const currentFilters = effectiveFilters ?? withFixed(baseFilters);
|
|
363
363
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
socketPort: config.socketPort,
|
|
370
|
-
siteName: config.siteName,
|
|
371
|
-
socketBaseURL: config.socketBaseURL,
|
|
372
|
-
auth: config.auth
|
|
373
|
-
? {
|
|
374
|
-
useToken: config.auth.useToken,
|
|
375
|
-
token: typeof config.auth.token === "string" ? config.auth.token : undefined,
|
|
376
|
-
type: config.auth.type,
|
|
377
|
-
}
|
|
378
|
-
: undefined,
|
|
379
|
-
// Forward the provider's engine options: the SyncModule is
|
|
380
|
-
// shared per baseURL and the FIRST consumer's config wins — a
|
|
381
|
-
// connection built without syncOptions here would silently
|
|
382
|
-
// strip persistKey/cdcInterval for every other screen when the
|
|
383
|
-
// list's aggregate watcher happens to construct the engine
|
|
384
|
-
// first (observed on GNOME, where this screen is the first
|
|
385
|
-
// engine touch).
|
|
386
|
-
syncOptions: config.syncOptions,
|
|
387
|
-
socketOptions: config.socketOptions,
|
|
388
|
-
fixtures: config.fixtures,
|
|
389
|
-
}
|
|
390
|
-
: undefined,
|
|
391
|
-
[config],
|
|
392
|
-
);
|
|
393
|
-
|
|
394
|
-
// Live result count — realtime refetch on doctype events.
|
|
395
|
-
const count = useFrappeAggregate(connection, {
|
|
364
|
+
// Live result count — realtime refetch on doctype events. It takes the
|
|
365
|
+
// provider config itself, never a copy: the SyncModule is shared per socket
|
|
366
|
+
// target and the first consumer's config wins, so a field a copy drops
|
|
367
|
+
// (syncOptions, a token getter) is gone for every screen.
|
|
368
|
+
const count = useFrappeAggregate(config, {
|
|
396
369
|
doctype,
|
|
397
370
|
filters: currentFilters.length > 0 ? currentFilters : undefined,
|
|
398
371
|
});
|
package/src/list/ListSidebar.tsx
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import { Accordion, SizableText, YStack } from "@multiplatform.one/components";
|
|
19
19
|
import { useCallback, useMemo } from "react";
|
|
20
20
|
import { useTranslation } from "react-i18next";
|
|
21
|
+
import { sizeRecipeEscape } from "@multiplatform.one/theme";
|
|
21
22
|
import { useBackofficeCapabilities } from "../config/BackofficeProvider";
|
|
22
23
|
import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
23
24
|
import type { FrappeFilter, FrappeFilters } from "../shared/types";
|
|
@@ -156,7 +157,7 @@ export function ListSidebar({
|
|
|
156
157
|
|
|
157
158
|
return (
|
|
158
159
|
<YStack
|
|
159
|
-
width={200}
|
|
160
|
+
width={sizeRecipeEscape(200, "list sidebar: a fixed facet column beside the list")}
|
|
160
161
|
paddingRight="$2"
|
|
161
162
|
paddingBottom="$4"
|
|
162
163
|
aria-label={t("list.sidebarLabel", "List filters sidebar")}
|
|
@@ -22,6 +22,7 @@ import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
|
22
22
|
import type { DocFieldMeta, DoctypeMeta } from "../shared/useDoctypeMeta";
|
|
23
23
|
import { useFrappeApp } from "../shared/useFrappeApp";
|
|
24
24
|
import type { BulkResult } from "./bulkActions";
|
|
25
|
+
import { dialogBodyMinWidth } from "../shared/measures";
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* Fieldtypes with no stored value (layout / display / child rows) plus
|
|
@@ -274,7 +275,7 @@ export function BulkEditDialog({
|
|
|
274
275
|
void handleConfirm();
|
|
275
276
|
}}
|
|
276
277
|
>
|
|
277
|
-
<YStack gap="$3" minWidth={
|
|
278
|
+
<YStack gap="$3" minWidth={dialogBodyMinWidth}>
|
|
278
279
|
<Text color="$color11" fontSize="$3">
|
|
279
280
|
{t("list.editBody", {
|
|
280
281
|
count: names.length,
|
|
@@ -19,6 +19,7 @@ import { Button, Input, Select } from "@multiplatform.one/forms";
|
|
|
19
19
|
import { FunnelIcon, PlusIcon, XIcon } from "@phosphor-icons/react";
|
|
20
20
|
import { useMemo, useRef, useState } from "react";
|
|
21
21
|
import { useTranslation } from "react-i18next";
|
|
22
|
+
import { sizeRecipeEscape } from "@multiplatform.one/theme";
|
|
22
23
|
import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
23
24
|
import type { FrappeFilters } from "../shared/types";
|
|
24
25
|
import type { DoctypeMeta } from "../shared/useDoctypeMeta";
|
|
@@ -35,6 +36,7 @@ import {
|
|
|
35
36
|
type FilterFieldDescriptor,
|
|
36
37
|
type FilterRowDraft,
|
|
37
38
|
} from "@multiplatform.one/frappe-ui";
|
|
39
|
+
import { overlayListMaxHeight } from "../shared/measures";
|
|
38
40
|
|
|
39
41
|
export interface FilterEditorButtonProps {
|
|
40
42
|
meta?: DoctypeMeta;
|
|
@@ -141,7 +143,7 @@ export function FilterEditorPanel({
|
|
|
141
143
|
{t("list.filters.empty", "No filters applied")}
|
|
142
144
|
</Text>
|
|
143
145
|
) : scrollRows ? (
|
|
144
|
-
<ScrollView maxHeight={
|
|
146
|
+
<ScrollView maxHeight={overlayListMaxHeight}>{rowList}</ScrollView>
|
|
145
147
|
) : (
|
|
146
148
|
rowList
|
|
147
149
|
)}
|
|
@@ -192,7 +194,13 @@ export function FilterEditorButton({ meta, filters, onFiltersChange }: FilterEdi
|
|
|
192
194
|
</Popover.Trigger>
|
|
193
195
|
<PopoverContent padding="$3">
|
|
194
196
|
<Popover.Arrow borderWidth={1} borderColor="$borderColor" />
|
|
195
|
-
<YStack
|
|
197
|
+
<YStack
|
|
198
|
+
width={sizeRecipeEscape(
|
|
199
|
+
620,
|
|
200
|
+
"filter editor: fixed panel and column widths so field, condition and value line up across rows",
|
|
201
|
+
)}
|
|
202
|
+
maxWidth="100%"
|
|
203
|
+
>
|
|
196
204
|
<FilterEditorPanel
|
|
197
205
|
key={openGen}
|
|
198
206
|
meta={meta}
|
|
@@ -238,7 +246,12 @@ function FilterEditorRow({ row, fields, onChange, onRemove }: FilterEditorRowPro
|
|
|
238
246
|
{/* Column wrappers: fields only stretch to the wrapper width through
|
|
239
247
|
a column cross-axis on native (row wrappers leave them at
|
|
240
248
|
intrinsic width — sliver bug in the list-tools sheet). */}
|
|
241
|
-
<YStack
|
|
249
|
+
<YStack
|
|
250
|
+
width={sizeRecipeEscape(
|
|
251
|
+
170,
|
|
252
|
+
"filter editor: fixed panel and column widths so field, condition and value line up across rows",
|
|
253
|
+
)}
|
|
254
|
+
>
|
|
242
255
|
<Select
|
|
243
256
|
value={row.fieldname}
|
|
244
257
|
onChange={(next) => {
|
|
@@ -257,7 +270,12 @@ function FilterEditorRow({ row, fields, onChange, onRemove }: FilterEditorRowPro
|
|
|
257
270
|
aria-label={t("list.filters.field", "Filter field")}
|
|
258
271
|
/>
|
|
259
272
|
</YStack>
|
|
260
|
-
<YStack
|
|
273
|
+
<YStack
|
|
274
|
+
width={sizeRecipeEscape(
|
|
275
|
+
150,
|
|
276
|
+
"filter editor: fixed panel and column widths so field, condition and value line up across rows",
|
|
277
|
+
)}
|
|
278
|
+
>
|
|
261
279
|
<Select
|
|
262
280
|
value={row.operator}
|
|
263
281
|
onChange={(next) => {
|
|
@@ -270,7 +288,13 @@ function FilterEditorRow({ row, fields, onChange, onRemove }: FilterEditorRowPro
|
|
|
270
288
|
aria-label={t("list.filters.condition", "Condition")}
|
|
271
289
|
/>
|
|
272
290
|
</YStack>
|
|
273
|
-
<YStack
|
|
291
|
+
<YStack
|
|
292
|
+
flex={1}
|
|
293
|
+
minWidth={sizeRecipeEscape(
|
|
294
|
+
170,
|
|
295
|
+
"filter editor: fixed panel and column widths so field, condition and value line up across rows",
|
|
296
|
+
)}
|
|
297
|
+
>
|
|
274
298
|
<FilterValueEditor row={row} field={field} onChange={onChange} />
|
|
275
299
|
</YStack>
|
|
276
300
|
<Button
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
} from "@multiplatform.one/table";
|
|
24
24
|
import { useMemo, useState } from "react";
|
|
25
25
|
import { useTranslation } from "react-i18next";
|
|
26
|
+
import { sizeRecipeEscape } from "@multiplatform.one/theme";
|
|
26
27
|
import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
27
28
|
import type { FrappeFilters } from "../shared/types";
|
|
28
29
|
import { useFrappeApp } from "../shared/useFrappeApp";
|
|
@@ -162,7 +163,16 @@ export function SavedFiltersControl({
|
|
|
162
163
|
|
|
163
164
|
return (
|
|
164
165
|
<XStack gap="$2" alignItems="center">
|
|
165
|
-
{savedFilters.length > 0 ?
|
|
166
|
+
{savedFilters.length > 0 ? (
|
|
167
|
+
<XStack
|
|
168
|
+
maxWidth={sizeRecipeEscape(
|
|
169
|
+
220,
|
|
170
|
+
"saved-filter picker: caps the trigger beside the filter chips",
|
|
171
|
+
)}
|
|
172
|
+
>
|
|
173
|
+
{dropdown}
|
|
174
|
+
</XStack>
|
|
175
|
+
) : null}
|
|
166
176
|
{filters.length > 0 ? (
|
|
167
177
|
<FilterManager
|
|
168
178
|
currentFilters={filters}
|
package/src/list/filter-sort.tsx
CHANGED
|
@@ -19,6 +19,7 @@ import { useMemo } from "react";
|
|
|
19
19
|
import { useTranslation } from "react-i18next";
|
|
20
20
|
import { BACKOFFICE_I18N_NAMESPACE } from "../i18n";
|
|
21
21
|
import type { DoctypeMeta } from "../shared/useDoctypeMeta";
|
|
22
|
+
import { overlayListMaxHeight } from "../shared/measures";
|
|
22
23
|
|
|
23
24
|
export interface SortControlProps {
|
|
24
25
|
meta?: DoctypeMeta;
|
|
@@ -203,7 +204,12 @@ export function SortControl({
|
|
|
203
204
|
|
|
204
205
|
return (
|
|
205
206
|
<XStack gap="$1" alignItems="center">
|
|
206
|
-
<DropdownMenu
|
|
207
|
+
<DropdownMenu
|
|
208
|
+
items={items}
|
|
209
|
+
closeOnSelect
|
|
210
|
+
placement="bottom-end"
|
|
211
|
+
maxHeight={overlayListMaxHeight}
|
|
212
|
+
>
|
|
207
213
|
<Button
|
|
208
214
|
size="$3"
|
|
209
215
|
chromeless
|
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
ensureFocusVisibleRing,
|
|
18
18
|
getGroupPosition,
|
|
19
19
|
hairline,
|
|
20
|
+
sizeRecipeEscape,
|
|
21
|
+
sizeRecipeForToken,
|
|
20
22
|
stackRadiusProps,
|
|
21
23
|
useGroupPosition,
|
|
22
24
|
useResolvedKnobs,
|
|
@@ -129,12 +131,18 @@ export interface SidebarSectionSkeletonProps {
|
|
|
129
131
|
|
|
130
132
|
export function SidebarSectionSkeleton({ rows = 3 }: SidebarSectionSkeletonProps) {
|
|
131
133
|
const { t } = useTranslation(BACKOFFICE_I18N_NAMESPACE);
|
|
134
|
+
const { knobProps } = useResolvedKnobs();
|
|
135
|
+
const lineBone = sizeRecipeForToken(knobProps.sizeToken).fontSize;
|
|
132
136
|
return (
|
|
133
137
|
<YStack gap="$2" paddingVertical="$1" aria-busy aria-label={t("loading", "Loading")}>
|
|
134
138
|
{Array.from({ length: rows }, (_, index) => (
|
|
135
139
|
<XStack key={index} alignItems="center" justifyContent="space-between" gap="$2">
|
|
136
|
-
<Skeleton width={`${55 + ((index * 13) % 25)}%`} height={
|
|
137
|
-
<Skeleton
|
|
140
|
+
<Skeleton width={`${55 + ((index * 13) % 25)}%`} height={lineBone} />
|
|
141
|
+
<Skeleton
|
|
142
|
+
variant="rounded"
|
|
143
|
+
width={sizeRecipeEscape(26, "count bone: the width of a two-digit count chip")}
|
|
144
|
+
height={lineBone}
|
|
145
|
+
/>
|
|
138
146
|
</XStack>
|
|
139
147
|
))}
|
|
140
148
|
</YStack>
|
|
@@ -25,7 +25,7 @@ import { AsyncSkeleton, ScrollView, Text, XStack, YStack } from "@multiplatform.
|
|
|
25
25
|
import { AdaptivePopup, Button } from "@multiplatform.one/forms";
|
|
26
26
|
import type { FrappeDocData } from "@multiplatform.one/frappe";
|
|
27
27
|
import { SchemaForm, useFrappeConfig } from "@multiplatform.one/frappe-ui";
|
|
28
|
-
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
28
|
+
import { sizeRecipeEscape, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
29
29
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
30
30
|
import { useTranslation } from "react-i18next";
|
|
31
31
|
import { useBackofficeCapabilities } from "../config/BackofficeProvider";
|
|
@@ -290,7 +290,12 @@ export function QuickEntryDialog({
|
|
|
290
290
|
>
|
|
291
291
|
{showForm ? (
|
|
292
292
|
<YStack {...knobProps.gap} testID="quick-entry-form">
|
|
293
|
-
<ScrollView
|
|
293
|
+
<ScrollView
|
|
294
|
+
maxHeight={sizeRecipeEscape(
|
|
295
|
+
480,
|
|
296
|
+
"quick entry: the field list scrolls inside the dialog past this height",
|
|
297
|
+
)}
|
|
298
|
+
>
|
|
294
299
|
<YStack {...knobProps.gap}>
|
|
295
300
|
{/* A crashing field degrades to its inline error slot (per-field
|
|
296
301
|
wrapper); a form-level crash costs the mini-form body only —
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
// read_only filters pass `disabled` through so pickers open nothing.
|
|
20
20
|
import { View, XStack, YStack, isWeb } from "@multiplatform.one/components";
|
|
21
21
|
import { Button, Checkbox, Input, Select, zIndex } from "@multiplatform.one/forms";
|
|
22
|
-
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
22
|
+
import { sizeRecipeEscape, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
23
23
|
import { XIcon } from "@phosphor-icons/react";
|
|
24
24
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
25
25
|
import { useTranslation } from "react-i18next";
|
|
@@ -289,8 +289,14 @@ export function QueryReportFilterBar({ filterMeta, filters, onApply }: QueryRepo
|
|
|
289
289
|
return (
|
|
290
290
|
<YStack
|
|
291
291
|
key={filter.fieldname}
|
|
292
|
-
minWidth={
|
|
293
|
-
|
|
292
|
+
minWidth={sizeRecipeEscape(
|
|
293
|
+
180,
|
|
294
|
+
"report filter bar: each filter flexes between a readable floor and a cap",
|
|
295
|
+
)}
|
|
296
|
+
maxWidth={sizeRecipeEscape(
|
|
297
|
+
280,
|
|
298
|
+
"report filter bar: each filter flexes between a readable floor and a cap",
|
|
299
|
+
)}
|
|
294
300
|
flex={1}
|
|
295
301
|
overflow="visible"
|
|
296
302
|
data-query-report-filter={filter.fieldname}
|
|
@@ -27,6 +27,7 @@ import { filterTupleLabel } from "@multiplatform.one/frappe-ui";
|
|
|
27
27
|
import type { FrappeFilters } from "../shared/types";
|
|
28
28
|
import type { SavedReportSummary } from "./savedReports";
|
|
29
29
|
import type { ReportColumnDef } from "./reportViewModel";
|
|
30
|
+
import { dialogBodyMinWidth, overlayListMaxHeight } from "../shared/measures";
|
|
30
31
|
|
|
31
32
|
export interface ReportToolbarProps {
|
|
32
33
|
/** Every pickable column (reportColumnsFromMeta). */
|
|
@@ -113,7 +114,7 @@ export function ReportToolbar({
|
|
|
113
114
|
})}
|
|
114
115
|
</Button>
|
|
115
116
|
</DropdownMenu.Trigger>
|
|
116
|
-
<DropdownMenu.Content maxHeight={
|
|
117
|
+
<DropdownMenu.Content maxHeight={overlayListMaxHeight}>
|
|
117
118
|
<DropdownMenu.Label>{t("report.pickColumns", "Report columns")}</DropdownMenu.Label>
|
|
118
119
|
{columns.map((column) => {
|
|
119
120
|
const isSelected = selectedSet.has(column.fieldname);
|
|
@@ -153,7 +154,7 @@ export function ReportToolbar({
|
|
|
153
154
|
: t("report.groupBy", "Group by")}
|
|
154
155
|
</Button>
|
|
155
156
|
</DropdownMenu.Trigger>
|
|
156
|
-
<DropdownMenu.Content maxHeight={
|
|
157
|
+
<DropdownMenu.Content maxHeight={overlayListMaxHeight}>
|
|
157
158
|
<DropdownMenu.CheckboxItem
|
|
158
159
|
checked={!groupBy}
|
|
159
160
|
closeOnSelect
|
|
@@ -187,7 +188,7 @@ export function ReportToolbar({
|
|
|
187
188
|
: t("report.savedReport", "Select Report")}
|
|
188
189
|
</Button>
|
|
189
190
|
</DropdownMenu.Trigger>
|
|
190
|
-
<DropdownMenu.Content maxHeight={
|
|
191
|
+
<DropdownMenu.Content maxHeight={overlayListMaxHeight}>
|
|
191
192
|
<DropdownMenu.CheckboxItem
|
|
192
193
|
checked={!currentReport}
|
|
193
194
|
closeOnSelect
|
|
@@ -241,7 +242,7 @@ export function ReportToolbar({
|
|
|
241
242
|
bare boolean leaked to the DOM (LC-46 class). */}
|
|
242
243
|
<PopoverContent {...knobProps.panelPadding}>
|
|
243
244
|
<Popover.Arrow borderWidth={1} borderColor="$borderColor" />
|
|
244
|
-
<XStack gap="$2" alignItems="center" minWidth={
|
|
245
|
+
<XStack gap="$2" alignItems="center" minWidth={dialogBodyMinWidth}>
|
|
245
246
|
<YStack flex={1} minWidth={0}>
|
|
246
247
|
<Input
|
|
247
248
|
size="$3"
|