@multiplatform.one/backoffice 7.28.1 → 7.29.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/README.md +1 -1
- package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
- package/dist/cjs/form/DocFormScreen.cjs +167 -224
- package/dist/cjs/form/DocFormScreen.native.js +182 -259
- package/dist/cjs/form/DocFormScreen.native.js.map +1 -1
- package/dist/cjs/i18n/en.cjs +1 -0
- package/dist/cjs/i18n/en.native.js +1 -0
- package/dist/cjs/i18n/en.native.js.map +1 -1
- package/dist/cjs/list/ListBulkActionsBar.cjs +30 -18
- package/dist/cjs/list/ListBulkActionsBar.native.js +43 -31
- package/dist/cjs/list/ListBulkActionsBar.native.js.map +1 -1
- package/dist/cjs/list/sidebar-section.cjs +15 -7
- package/dist/cjs/list/sidebar-section.native.js +16 -7
- package/dist/cjs/list/sidebar-section.native.js.map +1 -1
- package/dist/cjs/report/DoctypeReportView.cjs +20 -374
- package/dist/cjs/report/DoctypeReportView.native.js +23 -455
- package/dist/cjs/report/DoctypeReportView.native.js.map +1 -1
- package/dist/cjs/report/QueryReportScreen.cjs +33 -23
- package/dist/cjs/report/QueryReportScreen.native.js +33 -23
- package/dist/cjs/report/QueryReportScreen.native.js.map +1 -1
- package/dist/cjs/report/queryReportColumns.cjs +3 -105
- package/dist/cjs/report/queryReportColumns.native.js +2 -129
- package/dist/cjs/report/queryReportColumns.native.js.map +1 -1
- package/dist/cjs/report/queryReportFilterBar.cjs +3 -4
- package/dist/cjs/report/queryReportFilterBar.native.js +3 -4
- package/dist/cjs/report/queryReportFilterBar.native.js.map +1 -1
- package/dist/cjs/report/queryReportUrlState.cjs +2 -2
- package/dist/cjs/report/queryReportUrlState.native.js +2 -2
- package/dist/cjs/report/queryReportUrlState.native.js.map +1 -1
- package/dist/cjs/report/report-grid.cjs +2 -426
- package/dist/cjs/report/report-grid.native.js +1 -479
- package/dist/cjs/report/report-grid.native.js.map +1 -1
- package/dist/cjs/report/report-toolbar.cjs +2 -228
- package/dist/cjs/report/report-toolbar.native.js +1 -274
- package/dist/cjs/report/report-toolbar.native.js.map +1 -1
- package/dist/cjs/report/reportShapes.cjs +12 -383
- package/dist/cjs/report/reportShapes.native.js +12 -501
- package/dist/cjs/report/reportShapes.native.js.map +1 -1
- package/dist/cjs/report/reportViewModel.cjs +20 -360
- package/dist/cjs/report/reportViewModel.native.js +19 -627
- package/dist/cjs/report/reportViewModel.native.js.map +1 -1
- package/dist/cjs/report/savedReports.cjs +2 -106
- package/dist/cjs/report/savedReports.native.js +1 -132
- package/dist/cjs/report/savedReports.native.js.map +1 -1
- package/dist/cjs/report/useQueryReport.cjs +11 -219
- package/dist/cjs/report/useQueryReport.native.js +11 -244
- package/dist/cjs/report/useQueryReport.native.js.map +1 -1
- package/dist/cjs/shared/measures.cjs +3 -5
- package/dist/cjs/shared/measures.native.js +3 -5
- package/dist/cjs/shared/measures.native.js.map +1 -1
- package/dist/cjs/views/ReportView.cjs +3 -256
- package/dist/cjs/views/ReportView.native.js +3 -382
- package/dist/cjs/views/ReportView.native.js.map +1 -1
- package/dist/cjs/views/report-controls.cjs +6 -6
- package/dist/cjs/views/report-controls.native.js +6 -6
- package/dist/cjs/views/report-controls.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/form/DocFormScreen.mjs +169 -226
- package/dist/esm/form/DocFormScreen.mjs.map +1 -1
- package/dist/esm/form/DocFormScreen.native.js +184 -261
- package/dist/esm/form/DocFormScreen.native.js.map +1 -1
- package/dist/esm/i18n/en.mjs +1 -0
- package/dist/esm/i18n/en.mjs.map +1 -1
- package/dist/esm/i18n/en.native.js +1 -0
- package/dist/esm/i18n/en.native.js.map +1 -1
- package/dist/esm/list/ListBulkActionsBar.mjs +31 -19
- package/dist/esm/list/ListBulkActionsBar.mjs.map +1 -1
- package/dist/esm/list/ListBulkActionsBar.native.js +37 -25
- package/dist/esm/list/ListBulkActionsBar.native.js.map +1 -1
- package/dist/esm/list/sidebar-section.mjs +16 -8
- package/dist/esm/list/sidebar-section.mjs.map +1 -1
- package/dist/esm/list/sidebar-section.native.js +17 -8
- package/dist/esm/list/sidebar-section.native.js.map +1 -1
- package/dist/esm/report/DoctypeReportView.mjs +21 -375
- package/dist/esm/report/DoctypeReportView.mjs.map +1 -1
- package/dist/esm/report/DoctypeReportView.native.js +24 -456
- package/dist/esm/report/DoctypeReportView.native.js.map +1 -1
- package/dist/esm/report/QueryReportScreen.mjs +26 -16
- package/dist/esm/report/QueryReportScreen.mjs.map +1 -1
- package/dist/esm/report/QueryReportScreen.native.js +26 -16
- package/dist/esm/report/QueryReportScreen.native.js.map +1 -1
- package/dist/esm/report/queryReportColumns.mjs +1 -103
- package/dist/esm/report/queryReportColumns.mjs.map +1 -1
- package/dist/esm/report/queryReportColumns.native.js +1 -117
- package/dist/esm/report/queryReportColumns.native.js.map +1 -1
- package/dist/esm/report/queryReportFilterBar.mjs +1 -2
- package/dist/esm/report/queryReportFilterBar.mjs.map +1 -1
- package/dist/esm/report/queryReportFilterBar.native.js +1 -2
- package/dist/esm/report/queryReportFilterBar.native.js.map +1 -1
- package/dist/esm/report/queryReportUrlState.mjs +1 -1
- package/dist/esm/report/queryReportUrlState.native.js +1 -1
- package/dist/esm/report/report-grid.mjs +1 -425
- package/dist/esm/report/report-grid.mjs.map +1 -1
- package/dist/esm/report/report-grid.native.js +1 -468
- package/dist/esm/report/report-grid.native.js.map +1 -1
- package/dist/esm/report/report-toolbar.mjs +2 -228
- package/dist/esm/report/report-toolbar.mjs.map +1 -1
- package/dist/esm/report/report-toolbar.native.js +2 -264
- package/dist/esm/report/report-toolbar.native.js.map +1 -1
- package/dist/esm/report/reportShapes.mjs +2 -373
- package/dist/esm/report/reportShapes.mjs.map +1 -1
- package/dist/esm/report/reportShapes.native.js +2 -491
- package/dist/esm/report/reportShapes.native.js.map +1 -1
- package/dist/esm/report/reportViewModel.mjs +2 -342
- package/dist/esm/report/reportViewModel.mjs.map +1 -1
- package/dist/esm/report/reportViewModel.native.js +2 -610
- package/dist/esm/report/reportViewModel.native.js.map +1 -1
- package/dist/esm/report/savedReports.mjs +1 -105
- package/dist/esm/report/savedReports.mjs.map +1 -1
- package/dist/esm/report/savedReports.native.js +1 -132
- package/dist/esm/report/savedReports.native.js.map +1 -1
- package/dist/esm/report/useQueryReport.mjs +2 -210
- package/dist/esm/report/useQueryReport.mjs.map +1 -1
- package/dist/esm/report/useQueryReport.native.js +2 -235
- package/dist/esm/report/useQueryReport.native.js.map +1 -1
- package/dist/esm/shared/measures.mjs +1 -3
- package/dist/esm/shared/measures.mjs.map +1 -1
- package/dist/esm/shared/measures.native.js +1 -3
- package/dist/esm/shared/measures.native.js.map +1 -1
- package/dist/esm/views/ReportView.mjs +3 -256
- package/dist/esm/views/ReportView.mjs.map +1 -1
- package/dist/esm/views/ReportView.native.js +3 -382
- package/dist/esm/views/ReportView.native.js.map +1 -1
- package/dist/esm/views/report-controls.mjs +3 -3
- package/dist/esm/views/report-controls.mjs.map +1 -1
- package/dist/esm/views/report-controls.native.js +3 -3
- package/dist/esm/views/report-controls.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/DocFormScreen.mjs +169 -226
- package/dist/jsx/form/DocFormScreen.mjs.map +1 -1
- package/dist/jsx/form/DocFormScreen.native.js +182 -259
- package/dist/jsx/form/DocFormScreen.native.js.map +1 -1
- package/dist/jsx/i18n/en.mjs +1 -0
- package/dist/jsx/i18n/en.mjs.map +1 -1
- package/dist/jsx/i18n/en.native.js +1 -0
- package/dist/jsx/i18n/en.native.js.map +1 -1
- package/dist/jsx/list/ListBulkActionsBar.mjs +31 -19
- package/dist/jsx/list/ListBulkActionsBar.mjs.map +1 -1
- package/dist/jsx/list/ListBulkActionsBar.native.js +43 -31
- package/dist/jsx/list/ListBulkActionsBar.native.js.map +1 -1
- package/dist/jsx/list/sidebar-section.mjs +16 -8
- package/dist/jsx/list/sidebar-section.mjs.map +1 -1
- package/dist/jsx/list/sidebar-section.native.js +16 -7
- package/dist/jsx/list/sidebar-section.native.js.map +1 -1
- package/dist/jsx/report/DoctypeReportView.mjs +21 -375
- package/dist/jsx/report/DoctypeReportView.mjs.map +1 -1
- package/dist/jsx/report/DoctypeReportView.native.js +23 -455
- package/dist/jsx/report/DoctypeReportView.native.js.map +1 -1
- package/dist/jsx/report/QueryReportScreen.mjs +26 -16
- package/dist/jsx/report/QueryReportScreen.mjs.map +1 -1
- package/dist/jsx/report/QueryReportScreen.native.js +33 -23
- package/dist/jsx/report/QueryReportScreen.native.js.map +1 -1
- package/dist/jsx/report/queryReportColumns.mjs +1 -103
- package/dist/jsx/report/queryReportColumns.mjs.map +1 -1
- package/dist/jsx/report/queryReportColumns.native.js +2 -129
- package/dist/jsx/report/queryReportColumns.native.js.map +1 -1
- package/dist/jsx/report/queryReportFilterBar.mjs +1 -2
- package/dist/jsx/report/queryReportFilterBar.mjs.map +1 -1
- package/dist/jsx/report/queryReportFilterBar.native.js +3 -4
- package/dist/jsx/report/queryReportFilterBar.native.js.map +1 -1
- package/dist/jsx/report/queryReportUrlState.mjs +1 -1
- package/dist/jsx/report/queryReportUrlState.native.js +2 -2
- package/dist/jsx/report/queryReportUrlState.native.js.map +1 -1
- package/dist/jsx/report/report-grid.mjs +1 -425
- package/dist/jsx/report/report-grid.mjs.map +1 -1
- package/dist/jsx/report/report-grid.native.js +1 -479
- package/dist/jsx/report/report-grid.native.js.map +1 -1
- package/dist/jsx/report/report-toolbar.mjs +2 -228
- package/dist/jsx/report/report-toolbar.mjs.map +1 -1
- package/dist/jsx/report/report-toolbar.native.js +1 -274
- package/dist/jsx/report/report-toolbar.native.js.map +1 -1
- package/dist/jsx/report/reportShapes.mjs +2 -373
- package/dist/jsx/report/reportShapes.mjs.map +1 -1
- package/dist/jsx/report/reportShapes.native.js +12 -501
- package/dist/jsx/report/reportShapes.native.js.map +1 -1
- package/dist/jsx/report/reportViewModel.mjs +2 -342
- package/dist/jsx/report/reportViewModel.mjs.map +1 -1
- package/dist/jsx/report/reportViewModel.native.js +19 -627
- package/dist/jsx/report/reportViewModel.native.js.map +1 -1
- package/dist/jsx/report/savedReports.mjs +1 -105
- package/dist/jsx/report/savedReports.mjs.map +1 -1
- package/dist/jsx/report/savedReports.native.js +1 -132
- package/dist/jsx/report/savedReports.native.js.map +1 -1
- package/dist/jsx/report/useQueryReport.mjs +2 -210
- package/dist/jsx/report/useQueryReport.mjs.map +1 -1
- package/dist/jsx/report/useQueryReport.native.js +11 -244
- package/dist/jsx/report/useQueryReport.native.js.map +1 -1
- package/dist/jsx/shared/measures.mjs +1 -3
- package/dist/jsx/shared/measures.mjs.map +1 -1
- package/dist/jsx/shared/measures.native.js +3 -5
- package/dist/jsx/shared/measures.native.js.map +1 -1
- package/dist/jsx/views/ReportView.mjs +3 -256
- package/dist/jsx/views/ReportView.mjs.map +1 -1
- package/dist/jsx/views/ReportView.native.js +3 -382
- package/dist/jsx/views/ReportView.native.js.map +1 -1
- package/dist/jsx/views/report-controls.mjs +3 -3
- package/dist/jsx/views/report-controls.mjs.map +1 -1
- package/dist/jsx/views/report-controls.native.js +6 -6
- package/dist/jsx/views/report-controls.native.js.map +1 -1
- package/package.json +12 -12
- package/src/backofficeScreens.designLaw.spec.ts +0 -5
- package/src/desk/DeskSurface.tsx +4 -7
- package/src/form/DocFormScreen.chrome.spec.ts +77 -0
- package/src/form/DocFormScreen.guest.screen.spec.tsx +175 -0
- package/src/form/DocFormScreen.rights.spec.tsx +7 -3
- package/src/form/DocFormScreen.tsx +214 -315
- package/src/i18n/en.ts +1 -0
- package/src/list/ListBulkActionsBar.rights.spec.tsx +134 -0
- package/src/list/ListBulkActionsBar.screen.spec.tsx +7 -1
- package/src/list/ListBulkActionsBar.tsx +76 -57
- package/src/list/ListFilterBar.screen.spec.tsx +14 -13
- package/src/list/sidebar-section.tsx +11 -3
- package/src/report/DoctypeReportView.tsx +28 -550
- package/src/report/QueryReportScreen.spec.tsx +75 -1
- package/src/report/QueryReportScreen.tsx +38 -22
- package/src/report/queryReportColumns.tsx +4 -123
- package/src/report/queryReportFilterBar.tsx +3 -5
- package/src/report/queryReportUrlState.ts +1 -1
- package/src/report/report-grid.tsx +4 -529
- package/src/report/report-toolbar.tsx +4 -308
- package/src/report/reportShapes.ts +25 -613
- package/src/report/reportShim.spec.ts +162 -0
- package/src/report/reportViewModel.ts +32 -605
- package/src/report/savedReports.ts +4 -161
- package/src/report/useQueryReport.ts +9 -347
- package/src/shared/measures.ts +3 -11
- package/src/views/ReportView.screen.spec.tsx +25 -20
- package/src/views/ReportView.tsx +7 -439
- package/src/views/report-controls.tsx +12 -20
- package/types/desk/DeskSurface.d.ts.map +1 -1
- package/types/form/DocFormScreen.d.ts +2 -2
- package/types/form/DocFormScreen.d.ts.map +1 -1
- package/types/i18n/en.d.ts +1 -0
- package/types/i18n/en.d.ts.map +1 -1
- package/types/list/ListBulkActionsBar.d.ts.map +1 -1
- package/types/list/sidebar-section.d.ts.map +1 -1
- package/types/report/DoctypeReportView.d.ts.map +1 -1
- package/types/report/QueryReportScreen.d.ts +1 -1
- package/types/report/QueryReportScreen.d.ts.map +1 -1
- package/types/report/queryReportColumns.d.ts +2 -11
- package/types/report/queryReportColumns.d.ts.map +1 -1
- package/types/report/queryReportFilterBar.d.ts +1 -1
- package/types/report/queryReportFilterBar.d.ts.map +1 -1
- package/types/report/queryReportUrlState.d.ts +1 -1
- package/types/report/queryReportUrlState.d.ts.map +1 -1
- package/types/report/report-grid.d.ts +2 -19
- package/types/report/report-grid.d.ts.map +1 -1
- package/types/report/report-toolbar.d.ts +2 -29
- package/types/report/report-toolbar.d.ts.map +1 -1
- package/types/report/reportShapes.d.ts +2 -115
- package/types/report/reportShapes.d.ts.map +1 -1
- package/types/report/reportViewModel.d.ts +2 -135
- package/types/report/reportViewModel.d.ts.map +1 -1
- package/types/report/savedReports.d.ts +2 -18
- package/types/report/savedReports.d.ts.map +1 -1
- package/types/report/useQueryReport.d.ts +2 -35
- package/types/report/useQueryReport.d.ts.map +1 -1
- package/types/shared/measures.d.ts +1 -2
- package/types/shared/measures.d.ts.map +1 -1
- package/types/views/ReportView.d.ts +3 -22
- package/types/views/ReportView.d.ts.map +1 -1
- package/types/views/report-controls.d.ts +2 -5
- package/types/views/report-controls.d.ts.map +1 -1
- package/src/report/report-grid.spec.tsx +0 -175
- package/src/report/report-toolbar.spec.tsx +0 -90
- package/src/report/reportShapes.spec.ts +0 -391
- package/src/report/reportViewModel.spec.ts +0 -393
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { AsyncSkeleton, Button, ConfirmDialog, EmptyState, ScrollView,
|
|
2
|
-
import {
|
|
3
|
-
import { SchemaForm, sessionDocRights, useFrappeConfig } from "@multiplatform.one/frappe-ui";
|
|
1
|
+
import { AsyncBoundary, AsyncSkeleton, Button, ConfirmDialog, EmptyState, ScrollView, Text, XStack, YStack, notify } from "@multiplatform.one/components";
|
|
2
|
+
import { FrappeForm, docinfoRights, fixtureDocRights, isPermissionError, refusalReason, useFrappeConfig, useFrappeForm } from "@multiplatform.one/frappe-ui";
|
|
4
3
|
import { useLayoutSizeClass, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
5
4
|
import { ListBulletsIcon } from "@phosphor-icons/react";
|
|
6
5
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -12,14 +11,11 @@ import { getListNavNeighbors } from "../shared/listNavContext.mjs";
|
|
|
12
11
|
import { invalidateDocinfo, useDocinfo } from "../shared/useDocinfo.mjs";
|
|
13
12
|
import { useRecentVisit } from "../shared/useRecentVisit.mjs";
|
|
14
13
|
import { useDoctypeMeta } from "../shared/useDoctypeMeta.mjs";
|
|
15
|
-
import {
|
|
14
|
+
import { groupConnectionLinks } from "./connections-data.mjs";
|
|
16
15
|
import { setCreatePrefill } from "./createPrefill.mjs";
|
|
17
|
-
import { normalizeDocPermissions } from "./docinfo.mjs";
|
|
18
|
-
import { buildPermLevelMatrix } from "./fieldPermissions.mjs";
|
|
19
16
|
import { createHttpClient, renameDoc, sendEmail } from "./formActions.mjs";
|
|
20
17
|
import { EmailDialog, JumpToFieldDialog, RenameDialog } from "./FormDialogs.mjs";
|
|
21
18
|
import { FormErrorBoundary, wrapFieldWithErrorBoundary } from "./FormErrorBoundary.mjs";
|
|
22
|
-
import { buildCopyValues, buildFormTabs, isPromptNamed } from "./formLayout.mjs";
|
|
23
19
|
import { FormConnections } from "./FormConnections.mjs";
|
|
24
20
|
import { FormHeaderCluster } from "./FormHeaderCluster.mjs";
|
|
25
21
|
import { FormSidebarPanel } from "./FormSidebarPanel.mjs";
|
|
@@ -27,7 +23,6 @@ import { FormTimeline } from "./FormTimeline.mjs";
|
|
|
27
23
|
import { FormToolbar, resolveIndicator } from "./FormToolbar.mjs";
|
|
28
24
|
import { htmlToText } from "./timeline-utils.mjs";
|
|
29
25
|
import { canOpenNewTab, openInNewTab, useBeforeUnloadGuard, useDocPagerShortcuts, useJumpToFieldShortcut, useNavigationDirtyGuard, useSaveShortcut } from "./platformHooks.mjs";
|
|
30
|
-
import { useFormEngine } from "./useFormEngine.mjs";
|
|
31
26
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
32
27
|
const CONNECTIONS_TAB = "__connections";
|
|
33
28
|
function DocFormScreen({
|
|
@@ -76,29 +71,18 @@ function DocFormScreen({
|
|
|
76
71
|
name
|
|
77
72
|
});
|
|
78
73
|
}, [isCreate, doctype, name, emitEvent]);
|
|
79
|
-
const connection = useMemo(() => config?.baseURL ? {
|
|
80
|
-
baseURL: config.baseURL,
|
|
81
|
-
socketPort: config.socketPort,
|
|
82
|
-
siteName: config.siteName,
|
|
83
|
-
socketBaseURL: config.socketBaseURL,
|
|
84
|
-
auth: config.auth,
|
|
85
|
-
syncOptions: config.syncOptions,
|
|
86
|
-
fixtures: config.fixtures
|
|
87
|
-
} : void 0, [config]);
|
|
88
74
|
const {
|
|
89
75
|
meta,
|
|
90
76
|
loading: isMetaLoading,
|
|
91
77
|
error: metaError,
|
|
92
78
|
reload: refetchMeta
|
|
93
79
|
} = useDoctypeMeta(doctype);
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
});
|
|
101
|
-
}, [metaError, meta, emitEvent]);
|
|
80
|
+
const metaSource = useMemo(() => ({
|
|
81
|
+
meta,
|
|
82
|
+
isLoading: isMetaLoading,
|
|
83
|
+
error: metaError
|
|
84
|
+
}), [meta, isMetaLoading, metaError]);
|
|
85
|
+
const metaRefused = !meta && metaError !== void 0 && isPermissionError(metaError);
|
|
102
86
|
const {
|
|
103
87
|
docinfo,
|
|
104
88
|
reload: reloadDocinfo
|
|
@@ -107,7 +91,32 @@ function DocFormScreen({
|
|
|
107
91
|
if (docName) invalidateDocinfo(doctype, docName);
|
|
108
92
|
reloadDocinfo();
|
|
109
93
|
}, [doctype, docName, reloadDocinfo]);
|
|
110
|
-
const
|
|
94
|
+
const fixtureMode = Boolean(config?.fixtures);
|
|
95
|
+
const rights = useMemo(() => docinfoRights(docinfo?.permissions) ?? (fixtureMode ? fixtureDocRights(meta) : void 0), [docinfo?.permissions, fixtureMode, meta]);
|
|
96
|
+
const form = useFrappeForm({
|
|
97
|
+
doctype,
|
|
98
|
+
name: docName,
|
|
99
|
+
meta: metaSource,
|
|
100
|
+
rights,
|
|
101
|
+
shares: docinfo?.shared,
|
|
102
|
+
readShares: false,
|
|
103
|
+
disabled: readOnly,
|
|
104
|
+
hideFields: hiddenFields,
|
|
105
|
+
hideSections: hiddenSections
|
|
106
|
+
});
|
|
107
|
+
const connection = form.connection;
|
|
108
|
+
const currentUser = form.user ?? "";
|
|
109
|
+
const perms = form.rights;
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
if (metaError && !meta && !metaRefused) {
|
|
112
|
+
emitEvent({
|
|
113
|
+
type: "error",
|
|
114
|
+
error: metaError,
|
|
115
|
+
context: "form-meta"
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}, [metaError, meta, metaRefused, emitEvent]);
|
|
119
|
+
const modifiedStamp = typeof form.baseline?.modified === "string" ? form.baseline.modified : void 0;
|
|
111
120
|
const stampRef = useRef(void 0);
|
|
112
121
|
useEffect(() => {
|
|
113
122
|
stampRef.current = void 0;
|
|
@@ -122,103 +131,20 @@ function DocFormScreen({
|
|
|
122
131
|
reloadDocinfo();
|
|
123
132
|
}
|
|
124
133
|
}, [modifiedStamp, docName, doctype, reloadDocinfo]);
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const fixtureMode = Boolean(config?.fixtures);
|
|
130
|
-
const recordOwner = !isCreate && typeof engine.baseline?.owner === "string" ? engine.baseline.owner : void 0;
|
|
131
|
-
const perms = useMemo(() => {
|
|
132
|
-
const docPerms = normalizeDocPermissions(docinfo?.permissions);
|
|
133
|
-
if (docPerms) {
|
|
134
|
-
return {
|
|
135
|
-
write: !!docPerms.write,
|
|
136
|
-
create: !!docPerms.create,
|
|
137
|
-
delete: !!docPerms.delete,
|
|
138
|
-
submit: !!docPerms.submit,
|
|
139
|
-
cancel: !!docPerms.cancel,
|
|
140
|
-
amend: !!docPerms.amend,
|
|
141
|
-
email: !!docPerms.email,
|
|
142
|
-
print: !!docPerms.print
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
if (!fixtureMode) {
|
|
146
|
-
const rights = sessionDocRights({
|
|
147
|
-
fixtures: false,
|
|
148
|
-
meta,
|
|
149
|
-
roles,
|
|
150
|
-
user: sessionUser,
|
|
151
|
-
owner: recordOwner,
|
|
152
|
-
shares: docinfo?.shared
|
|
153
|
-
});
|
|
154
|
-
return {
|
|
155
|
-
write: rights.write,
|
|
156
|
-
create: rights.create,
|
|
157
|
-
delete: rights.delete,
|
|
158
|
-
submit: rights.submit,
|
|
159
|
-
cancel: rights.cancel,
|
|
160
|
-
amend: rights.amend,
|
|
161
|
-
email: rights.email,
|
|
162
|
-
print: rights.print
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
const rules = meta?.permissions ?? [];
|
|
166
|
-
const anyRole = key => rules.some(rule => !rule.permlevel && !!rule[key]);
|
|
167
|
-
return {
|
|
168
|
-
write: rules.length === 0 || anyRole("write"),
|
|
169
|
-
create: rules.length === 0 || anyRole("create"),
|
|
170
|
-
delete: anyRole("delete"),
|
|
171
|
-
submit: anyRole("submit"),
|
|
172
|
-
cancel: anyRole("cancel"),
|
|
173
|
-
amend: anyRole("amend"),
|
|
174
|
-
email: rules.length === 0 || anyRole("email"),
|
|
175
|
-
print: rules.length === 0 || anyRole("print")
|
|
176
|
-
};
|
|
177
|
-
}, [docinfo?.permissions, docinfo?.shared, meta, fixtureMode, roles, sessionUser, recordOwner]);
|
|
178
|
-
const isSubmittable = !!meta?.is_submittable;
|
|
179
|
-
const formReadOnly = !!readOnly || !!meta?.read_only || engine.wasDeleted || !isCreate && !perms.write || isCreate && !perms.create;
|
|
180
|
-
const permLevels = useMemo(() => buildPermLevelMatrix(meta?.permissions, roles), [meta?.permissions, roles]);
|
|
181
|
-
const formTabs = useMemo(() => {
|
|
182
|
-
if (!meta) return [];
|
|
183
|
-
return buildFormTabs({
|
|
184
|
-
fields: meta.fields,
|
|
185
|
-
// depends_on evaluates against the doc plus desk's ambient context:
|
|
186
|
-
// __islocal (unsaved doc flag) and the session user behind
|
|
187
|
-
// `frappe.session.user` references.
|
|
188
|
-
doc: {
|
|
189
|
-
...engine.doc,
|
|
190
|
-
__islocal: isCreate ? 1 : 0,
|
|
191
|
-
...(engine.currentUser ? {
|
|
192
|
-
__session_user: engine.currentUser
|
|
193
|
-
} : {})
|
|
194
|
-
},
|
|
195
|
-
docstatus: engine.docstatus,
|
|
196
|
-
formReadOnly,
|
|
197
|
-
isCreate,
|
|
198
|
-
detailsLabel: t("detailsTab", "Details"),
|
|
199
|
-
permLevels,
|
|
200
|
-
hiddenFields,
|
|
201
|
-
hiddenSections
|
|
202
|
-
});
|
|
203
|
-
}, [meta, engine.doc, engine.currentUser, engine.docstatus, formReadOnly, isCreate, permLevels, hiddenFields, hiddenSections, t]);
|
|
204
|
-
const jumpTargets = useMemo(() => formTabs.flatMap(tab => tab.schema.fields.map(field => ({
|
|
205
|
-
name: field.name,
|
|
206
|
-
label: field.label || field.name,
|
|
207
|
-
tabKey: tab.key,
|
|
208
|
-
tabLabel: tab.label
|
|
209
|
-
}))), [formTabs]);
|
|
210
|
-
const [activeTab, setActiveTab] = useState(void 0);
|
|
211
|
-
const showConnections = !isCreate && !!connection && (meta?.links?.some(link => !link.hidden) ?? false);
|
|
134
|
+
const isSubmittable = form.isSubmittable;
|
|
135
|
+
const formReadOnly = form.readOnly;
|
|
136
|
+
const jumpTargets = form.fieldTargets;
|
|
137
|
+
const showConnections = !isCreate && !!connection && groupConnectionLinks(meta).length > 0;
|
|
212
138
|
const [pendingNav, setPendingNav] = useState(void 0);
|
|
213
139
|
const navigate = useCallback(href => {
|
|
214
|
-
if (
|
|
140
|
+
if (form.isDirty) {
|
|
215
141
|
setPendingNav(href);
|
|
216
142
|
return;
|
|
217
143
|
}
|
|
218
144
|
navigator.navigate(href);
|
|
219
|
-
}, [
|
|
220
|
-
useBeforeUnloadGuard(
|
|
221
|
-
const backGuard = useNavigationDirtyGuard(
|
|
145
|
+
}, [form.isDirty, navigator]);
|
|
146
|
+
useBeforeUnloadGuard(form.isDirty);
|
|
147
|
+
const backGuard = useNavigationDirtyGuard(form.isDirty);
|
|
222
148
|
const [confirmAction, setConfirmAction] = useState(void 0);
|
|
223
149
|
const [renameOpen, setRenameOpen] = useState(false);
|
|
224
150
|
const [emailOpen, setEmailOpen] = useState(false);
|
|
@@ -226,11 +152,10 @@ function DocFormScreen({
|
|
|
226
152
|
const [pendingJump, setPendingJump] = useState(void 0);
|
|
227
153
|
const [validationSummary, setValidationSummary] = useState(void 0);
|
|
228
154
|
const handleSave = useCallback(async () => {
|
|
229
|
-
const validationErrors =
|
|
155
|
+
const validationErrors = form.validate();
|
|
230
156
|
const errorFields = Object.keys(validationErrors);
|
|
231
157
|
if (errorFields.length > 0) {
|
|
232
|
-
|
|
233
|
-
if (owner) setActiveTab(owner.key);
|
|
158
|
+
errorFields.some(field => form.revealField(field));
|
|
234
159
|
setValidationSummary(t("validationSummary", {
|
|
235
160
|
count: errorFields.length,
|
|
236
161
|
defaultValue_one: "Cannot save \u2014 {{count}} required field is missing.",
|
|
@@ -239,7 +164,7 @@ function DocFormScreen({
|
|
|
239
164
|
} else {
|
|
240
165
|
setValidationSummary(void 0);
|
|
241
166
|
}
|
|
242
|
-
const savedName = await
|
|
167
|
+
const savedName = await form.save();
|
|
243
168
|
if (!savedName) return;
|
|
244
169
|
setValidationSummary(void 0);
|
|
245
170
|
notify({
|
|
@@ -255,7 +180,7 @@ function DocFormScreen({
|
|
|
255
180
|
isNew: isCreate
|
|
256
181
|
});
|
|
257
182
|
onSaved?.({
|
|
258
|
-
...
|
|
183
|
+
...form.doc,
|
|
259
184
|
name: savedName
|
|
260
185
|
});
|
|
261
186
|
if (isCreate) {
|
|
@@ -263,24 +188,17 @@ function DocFormScreen({
|
|
|
263
188
|
} else {
|
|
264
189
|
reloadDocinfo();
|
|
265
190
|
}
|
|
266
|
-
}, [
|
|
191
|
+
}, [form, isCreate, navigator, paths, doctype, reloadDocinfo, t, emitEvent, onSaved]);
|
|
267
192
|
useSaveShortcut(!formReadOnly, () => {
|
|
268
|
-
if (
|
|
193
|
+
if (form.isDirty || isCreate) void handleSave();
|
|
269
194
|
});
|
|
270
195
|
useJumpToFieldShortcut(jumpTargets.length > 0 && !jumpOpen, () => setJumpOpen(true));
|
|
271
196
|
const handleAmend = useCallback(() => {
|
|
272
|
-
if (
|
|
273
|
-
|
|
274
|
-
...buildCopyValues(meta.fields, engine.doc),
|
|
275
|
-
amended_from: docName
|
|
276
|
-
});
|
|
277
|
-
navigator.navigate(paths.newDoc(doctype));
|
|
278
|
-
}, [meta, docName, doctype, engine.doc, navigator, paths]);
|
|
197
|
+
if (form.amend()) navigator.navigate(paths.newDoc(doctype));
|
|
198
|
+
}, [form, doctype, navigator, paths]);
|
|
279
199
|
const handleDuplicate = useCallback(() => {
|
|
280
|
-
if (
|
|
281
|
-
|
|
282
|
-
navigator.navigate(paths.newDoc(doctype));
|
|
283
|
-
}, [meta, doctype, engine.doc, navigator, paths]);
|
|
200
|
+
if (form.duplicate()) navigator.navigate(paths.newDoc(doctype));
|
|
201
|
+
}, [form, doctype, navigator, paths]);
|
|
284
202
|
const handleRename = useCallback(async newName => {
|
|
285
203
|
if (!connection || !docName) return;
|
|
286
204
|
try {
|
|
@@ -295,11 +213,11 @@ function DocFormScreen({
|
|
|
295
213
|
if (target) navigate(paths.form(doctype, target));
|
|
296
214
|
}, [navigate, paths, doctype]);
|
|
297
215
|
useDocPagerShortcuts(docPager.inList, () => openNeighborDoc(docPager.prev), () => openNeighborDoc(docPager.next));
|
|
298
|
-
const titleFieldValue = meta?.title_field && typeof
|
|
216
|
+
const titleFieldValue = meta?.title_field && typeof form.doc[meta.title_field] === "string" ?
|
|
299
217
|
// Title fields can hold rich text (e.g. ToDo.description = "<p>…</p>");
|
|
300
218
|
// strip to plain text so the breadcrumb + toolbar heading don't show
|
|
301
219
|
// literal HTML tags.
|
|
302
|
-
htmlToText(
|
|
220
|
+
htmlToText(form.doc[meta.title_field]) : void 0;
|
|
303
221
|
const title = isCreate ? t("newDocTitle", "New {{doctype}}", {
|
|
304
222
|
doctype
|
|
305
223
|
}) : titleFieldValue || name;
|
|
@@ -310,18 +228,21 @@ function DocFormScreen({
|
|
|
310
228
|
label: t("menuReload", "Reload"),
|
|
311
229
|
icon: "reload",
|
|
312
230
|
onSelect: () => {
|
|
313
|
-
|
|
231
|
+
form.reset();
|
|
314
232
|
setValidationSummary(void 0);
|
|
315
233
|
refetchMeta();
|
|
316
234
|
invalidateDocinfo(doctype, name);
|
|
317
235
|
reloadDocinfo();
|
|
318
236
|
}
|
|
319
|
-
}, {
|
|
320
|
-
key: "duplicate",
|
|
321
|
-
label: t("menuDuplicate", "Duplicate"),
|
|
322
|
-
icon: "duplicate",
|
|
323
|
-
onSelect: handleDuplicate
|
|
324
237
|
}];
|
|
238
|
+
if (!metaRefused) {
|
|
239
|
+
items.push({
|
|
240
|
+
key: "duplicate",
|
|
241
|
+
label: t("menuDuplicate", "Duplicate"),
|
|
242
|
+
icon: "duplicate",
|
|
243
|
+
onSelect: handleDuplicate
|
|
244
|
+
});
|
|
245
|
+
}
|
|
325
246
|
if (meta?.allow_rename && perms.write) {
|
|
326
247
|
items.push({
|
|
327
248
|
key: "rename",
|
|
@@ -354,7 +275,7 @@ function DocFormScreen({
|
|
|
354
275
|
key: "links",
|
|
355
276
|
label: t("menuLinks", "Links"),
|
|
356
277
|
icon: "links",
|
|
357
|
-
onSelect: () => setActiveTab(CONNECTIONS_TAB)
|
|
278
|
+
onSelect: () => form.setActiveTab(CONNECTIONS_TAB)
|
|
358
279
|
});
|
|
359
280
|
}
|
|
360
281
|
if (jumpTargets.length > 0) {
|
|
@@ -401,10 +322,10 @@ function DocFormScreen({
|
|
|
401
322
|
});
|
|
402
323
|
}
|
|
403
324
|
return items;
|
|
404
|
-
}, [isCreate, t,
|
|
325
|
+
}, [isCreate, t, form, refetchMeta, reloadDocinfo, handleDuplicate, metaRefused, meta?.allow_rename, perms, connection, doctype, name, showConnections, jumpTargets, navigate, paths, capabilities]);
|
|
405
326
|
const effectiveMenuItems = useMemo(() => {
|
|
406
|
-
const
|
|
407
|
-
const items = menuItems.filter(item => !
|
|
327
|
+
const hiddenKeys = new Set(actionOverrides?.hide ?? []);
|
|
328
|
+
const items = menuItems.filter(item => !hiddenKeys.has(item.key));
|
|
408
329
|
const injected = [...actionsForDoctype(actions.form, doctype), ...actionsForDoctype(actionOverrides?.extra, doctype)];
|
|
409
330
|
for (const action of injected) {
|
|
410
331
|
items.push({
|
|
@@ -422,9 +343,9 @@ function DocFormScreen({
|
|
|
422
343
|
}, [menuItems, actions.form, actionOverrides, doctype, docName]);
|
|
423
344
|
const handleJumpToField = useCallback(field => {
|
|
424
345
|
setJumpOpen(false);
|
|
425
|
-
setActiveTab(field.tabKey);
|
|
346
|
+
form.setActiveTab(field.tabKey);
|
|
426
347
|
setPendingJump(field.name);
|
|
427
|
-
}, []);
|
|
348
|
+
}, [form]);
|
|
428
349
|
useEffect(() => {
|
|
429
350
|
if (!pendingJump) return;
|
|
430
351
|
if (typeof document === "undefined") {
|
|
@@ -471,18 +392,59 @@ function DocFormScreen({
|
|
|
471
392
|
})
|
|
472
393
|
});
|
|
473
394
|
}
|
|
474
|
-
if (metaError && !meta) {
|
|
395
|
+
if (metaError && !meta && !metaRefused) {
|
|
475
396
|
return /* @__PURE__ */jsx(YStack, {
|
|
476
397
|
flex: 1,
|
|
477
|
-
children: /* @__PURE__ */jsx(
|
|
478
|
-
|
|
398
|
+
children: /* @__PURE__ */jsx(AsyncBoundary, {
|
|
399
|
+
error: metaError,
|
|
400
|
+
errorTitle: t("metaError", "Could not load {{doctype}}", {
|
|
479
401
|
doctype
|
|
480
402
|
}),
|
|
481
|
-
|
|
403
|
+
onRetry: refetchMeta
|
|
482
404
|
})
|
|
483
405
|
});
|
|
484
406
|
}
|
|
485
|
-
if (!isCreate &&
|
|
407
|
+
if (!isCreate && form.status === "error" && form.docError && isPermissionError(form.docError)) {
|
|
408
|
+
return /* @__PURE__ */jsx(YStack, {
|
|
409
|
+
flex: 1,
|
|
410
|
+
children: /* @__PURE__ */jsx(EmptyState, {
|
|
411
|
+
testID: "frappe-form-not-permitted",
|
|
412
|
+
title: t("docNotPermitted", "You can't open {{doctype}} {{name}}", {
|
|
413
|
+
doctype,
|
|
414
|
+
name
|
|
415
|
+
}),
|
|
416
|
+
description: refusalReason(form.docError),
|
|
417
|
+
action: /* @__PURE__ */jsx(Button, {
|
|
418
|
+
icon: ListBulletsIcon,
|
|
419
|
+
onPress: () => navigator.navigate(paths.list(doctype)),
|
|
420
|
+
children: t("backToList", "Back to {{doctype}} list", {
|
|
421
|
+
doctype
|
|
422
|
+
})
|
|
423
|
+
})
|
|
424
|
+
})
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
if (!isCreate && form.status === "error" && form.docError) {
|
|
428
|
+
return /* @__PURE__ */jsx(YStack, {
|
|
429
|
+
flex: 1,
|
|
430
|
+
children: /* @__PURE__ */jsx(EmptyState, {
|
|
431
|
+
intent: "error",
|
|
432
|
+
title: t("docLoadError", "Could not load {{doctype}} {{name}}", {
|
|
433
|
+
doctype,
|
|
434
|
+
name
|
|
435
|
+
}),
|
|
436
|
+
description: form.docError.message,
|
|
437
|
+
action: /* @__PURE__ */jsx(Button, {
|
|
438
|
+
icon: ListBulletsIcon,
|
|
439
|
+
onPress: () => navigator.navigate(paths.list(doctype)),
|
|
440
|
+
children: t("backToList", "Back to {{doctype}} list", {
|
|
441
|
+
doctype
|
|
442
|
+
})
|
|
443
|
+
})
|
|
444
|
+
})
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
if (!isCreate && form.status === "notFound") {
|
|
486
448
|
return /* @__PURE__ */jsx(YStack, {
|
|
487
449
|
flex: 1,
|
|
488
450
|
children: /* @__PURE__ */jsx(EmptyState, {
|
|
@@ -501,7 +463,7 @@ function DocFormScreen({
|
|
|
501
463
|
})
|
|
502
464
|
});
|
|
503
465
|
}
|
|
504
|
-
if (!isCreate &&
|
|
466
|
+
if (!isCreate && form.status === "loading") {
|
|
505
467
|
return /* @__PURE__ */jsx(YStack, {
|
|
506
468
|
flex: 1,
|
|
507
469
|
...knobProps.panelPadding,
|
|
@@ -513,16 +475,16 @@ function DocFormScreen({
|
|
|
513
475
|
}
|
|
514
476
|
const indicator = resolveIndicator({
|
|
515
477
|
isCreate,
|
|
516
|
-
isDirty:
|
|
517
|
-
docstatus:
|
|
478
|
+
isDirty: form.isDirty,
|
|
479
|
+
docstatus: form.docstatus,
|
|
518
480
|
isSubmittable,
|
|
519
|
-
statusValue: typeof
|
|
481
|
+
statusValue: typeof form.doc.status === "string" ? form.doc.status : void 0,
|
|
520
482
|
states: meta?.states
|
|
521
483
|
});
|
|
522
|
-
const canSave = !formReadOnly && (isCreate ? perms.create : perms.write &&
|
|
523
|
-
const canSubmit = !isCreate && isSubmittable &&
|
|
524
|
-
const canCancel = !isCreate && isSubmittable &&
|
|
525
|
-
const canAmend = !isCreate && isSubmittable &&
|
|
484
|
+
const canSave = !formReadOnly && (isCreate ? perms.create : perms.write && form.docstatus === 0);
|
|
485
|
+
const canSubmit = !isCreate && isSubmittable && form.docstatus === 0 && !form.isDirty && perms.submit && !form.wasDeleted;
|
|
486
|
+
const canCancel = !isCreate && isSubmittable && form.docstatus === 1 && perms.cancel && !form.wasDeleted;
|
|
487
|
+
const canAmend = !isCreate && isSubmittable && form.docstatus === 2 && perms.amend && !form.wasDeleted;
|
|
526
488
|
const breadcrumbs = [{
|
|
527
489
|
label: t("home", "Home"),
|
|
528
490
|
href: paths.home()
|
|
@@ -532,29 +494,8 @@ function DocFormScreen({
|
|
|
532
494
|
}, {
|
|
533
495
|
label: isCreate ? t("newCrumb", "New") : title
|
|
534
496
|
}];
|
|
535
|
-
const promptNamed = isCreate && isPromptNamed(meta?.autoname, meta?.naming_rule);
|
|
536
497
|
const sidebarStacked = sizeClass === "compact";
|
|
537
|
-
const
|
|
538
|
-
value: tab.key,
|
|
539
|
-
label: tab.label,
|
|
540
|
-
content: /* @__PURE__ */jsx(YStack, {
|
|
541
|
-
...knobProps.gapLg,
|
|
542
|
-
paddingTop: "$3",
|
|
543
|
-
children: /* @__PURE__ */jsx(FormErrorBoundary, {
|
|
544
|
-
errorTitle: t("formTabRenderError", "This form tab failed to render"),
|
|
545
|
-
testID: `form-tab-error-${tab.key}`,
|
|
546
|
-
children: /* @__PURE__ */jsx(SchemaForm, {
|
|
547
|
-
schema: tab.schema,
|
|
548
|
-
doc: engine.doc,
|
|
549
|
-
setValue: engine.setValue,
|
|
550
|
-
errors: engine.errors,
|
|
551
|
-
disabled: formReadOnly || engine.isSaving,
|
|
552
|
-
sectionHeadingLevel: 2,
|
|
553
|
-
renderFieldWrapper: wrapFieldWithErrorBoundary
|
|
554
|
-
})
|
|
555
|
-
})
|
|
556
|
-
})
|
|
557
|
-
})), ...(showConnections ? [{
|
|
498
|
+
const connectionsTab = showConnections ? [{
|
|
558
499
|
value: CONNECTIONS_TAB,
|
|
559
500
|
label: t("connectionsTab", "Connections"),
|
|
560
501
|
content: /* @__PURE__ */jsx(YStack, {
|
|
@@ -565,38 +506,40 @@ function DocFormScreen({
|
|
|
565
506
|
meta
|
|
566
507
|
})
|
|
567
508
|
})
|
|
568
|
-
}] : []
|
|
569
|
-
const
|
|
509
|
+
}] : [];
|
|
510
|
+
const renderTab = (tab, content) => /* @__PURE__ */jsx(YStack, {
|
|
511
|
+
...knobProps.gapLg,
|
|
512
|
+
paddingTop: "$3",
|
|
513
|
+
children: /* @__PURE__ */jsx(FormErrorBoundary, {
|
|
514
|
+
errorTitle: t("formTabRenderError", "This form tab failed to render"),
|
|
515
|
+
testID: `form-tab-error-${tab.key}`,
|
|
516
|
+
children: content
|
|
517
|
+
})
|
|
518
|
+
});
|
|
570
519
|
const formBody =
|
|
571
|
-
// No flex here: formBody
|
|
572
|
-
//
|
|
573
|
-
//
|
|
520
|
+
// No flex here: formBody lives inside COLUMN containers (both branches
|
|
521
|
+
// below), where `flex={1}` means flex-basis:0 — the body would stop
|
|
522
|
+
// contributing height and the timeline/sidebar would paint over it.
|
|
574
523
|
/* @__PURE__ */
|
|
575
|
-
|
|
524
|
+
jsx(YStack, {
|
|
576
525
|
minWidth: 0,
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
}) : bodyTabs[0]?.content ?? null, engine.errors.general && /* @__PURE__ */jsx(Text, {
|
|
593
|
-
color: "$red10",
|
|
594
|
-
fontSize: "$3",
|
|
595
|
-
role: "alert",
|
|
596
|
-
children: engine.errors.general
|
|
597
|
-
})]
|
|
526
|
+
children: /* @__PURE__ */jsx(FrappeForm, {
|
|
527
|
+
form,
|
|
528
|
+
doctype,
|
|
529
|
+
name: docName,
|
|
530
|
+
disabled: readOnly,
|
|
531
|
+
showToolbar: false,
|
|
532
|
+
showSidebar: false,
|
|
533
|
+
showTimeline: false,
|
|
534
|
+
showConnections: false,
|
|
535
|
+
showBanners: false,
|
|
536
|
+
sectionHeadingLevel: 2,
|
|
537
|
+
renderFieldWrapper: wrapFieldWithErrorBoundary,
|
|
538
|
+
renderTab,
|
|
539
|
+
extraTabs: connectionsTab
|
|
540
|
+
})
|
|
598
541
|
});
|
|
599
|
-
const timeline = capabilities.timeline.enabled && !isCreate && docName ?
|
|
542
|
+
const timeline = capabilities.timeline.enabled && !isCreate && docName && !metaRefused ?
|
|
600
543
|
// Composed mode: the screen's shared docinfo (and its refresh) feed
|
|
601
544
|
// the timeline. Self-fetch mode subscribed the timeline to its OWN
|
|
602
545
|
// cache entry, which the save path's invalidate+reload orphaned — the
|
|
@@ -608,16 +551,16 @@ function DocFormScreen({
|
|
|
608
551
|
name: docName,
|
|
609
552
|
docInfo: docinfo,
|
|
610
553
|
refreshDocInfo: refreshDocinfo,
|
|
611
|
-
currentUser
|
|
554
|
+
currentUser,
|
|
612
555
|
connection
|
|
613
556
|
}) : null;
|
|
614
557
|
const sidebar = !isCreate && docName && meta ? /* @__PURE__ */jsx(FormSidebarPanel, {
|
|
615
558
|
doctype,
|
|
616
559
|
name: docName,
|
|
617
560
|
meta,
|
|
618
|
-
doc:
|
|
561
|
+
doc: form.doc,
|
|
619
562
|
docinfo,
|
|
620
|
-
currentUser
|
|
563
|
+
currentUser,
|
|
621
564
|
onRefresh: refreshDocinfo,
|
|
622
565
|
stacked: sidebarStacked
|
|
623
566
|
}) : null;
|
|
@@ -627,12 +570,12 @@ function DocFormScreen({
|
|
|
627
570
|
title,
|
|
628
571
|
indicator,
|
|
629
572
|
showIndicator: !!meta,
|
|
630
|
-
isSaving:
|
|
631
|
-
cluster: !isCreate && docName ? /* @__PURE__ */jsx(FormHeaderCluster, {
|
|
573
|
+
isSaving: form.isSubmitting,
|
|
574
|
+
cluster: !isCreate && docName && !metaRefused ? /* @__PURE__ */jsx(FormHeaderCluster, {
|
|
632
575
|
doctype,
|
|
633
576
|
name: docName,
|
|
634
577
|
docinfo,
|
|
635
|
-
currentUser
|
|
578
|
+
currentUser,
|
|
636
579
|
onRefresh: refreshDocinfo
|
|
637
580
|
}) : void 0,
|
|
638
581
|
canSave,
|
|
@@ -660,9 +603,9 @@ function DocFormScreen({
|
|
|
660
603
|
name: docName
|
|
661
604
|
} : {}),
|
|
662
605
|
defaultContent: toolbar
|
|
663
|
-
}) : toolbar, (
|
|
606
|
+
}) : toolbar, (form.wasDeleted || validationSummary || form.conflict) && /* @__PURE__ */jsxs(YStack, {
|
|
664
607
|
paddingHorizontal: "$3",
|
|
665
|
-
children: [
|
|
608
|
+
children: [form.wasDeleted && /* @__PURE__ */jsx(XStack, {
|
|
666
609
|
role: "alert",
|
|
667
610
|
...knobProps.containerRadius,
|
|
668
611
|
...knobProps.panelPadding,
|
|
@@ -672,7 +615,7 @@ function DocFormScreen({
|
|
|
672
615
|
fontSize: "$3",
|
|
673
616
|
children: t("deletedBanner", "This document was deleted on the server. Fields are read-only.")
|
|
674
617
|
})
|
|
675
|
-
}), validationSummary && !
|
|
618
|
+
}), validationSummary && !form.wasDeleted && /* @__PURE__ */jsx(XStack, {
|
|
676
619
|
role: "alert",
|
|
677
620
|
...knobProps.containerRadius,
|
|
678
621
|
...knobProps.panelPadding,
|
|
@@ -683,7 +626,7 @@ function DocFormScreen({
|
|
|
683
626
|
fontSize: "$3",
|
|
684
627
|
children: validationSummary
|
|
685
628
|
})
|
|
686
|
-
}),
|
|
629
|
+
}), form.conflict && !form.wasDeleted && /* @__PURE__ */jsxs(XStack, {
|
|
687
630
|
role: "status",
|
|
688
631
|
alignItems: "center",
|
|
689
632
|
justifyContent: "space-between",
|
|
@@ -700,7 +643,7 @@ function DocFormScreen({
|
|
|
700
643
|
size: "$2",
|
|
701
644
|
outlined: true,
|
|
702
645
|
"aria-label": t("reloadDoc", "Reload"),
|
|
703
|
-
onPress:
|
|
646
|
+
onPress: form.reset,
|
|
704
647
|
children: t("reloadDoc", "Reload")
|
|
705
648
|
})]
|
|
706
649
|
})]
|
|
@@ -740,7 +683,7 @@ function DocFormScreen({
|
|
|
740
683
|
warning: true,
|
|
741
684
|
onConfirm: () => {
|
|
742
685
|
setConfirmAction(void 0);
|
|
743
|
-
void
|
|
686
|
+
void form.submitDocument().then(ok => {
|
|
744
687
|
if (ok) {
|
|
745
688
|
notify({
|
|
746
689
|
severity: "success",
|
|
@@ -762,7 +705,7 @@ function DocFormScreen({
|
|
|
762
705
|
destructive: true,
|
|
763
706
|
onConfirm: () => {
|
|
764
707
|
setConfirmAction(void 0);
|
|
765
|
-
void
|
|
708
|
+
void form.cancelDocument().then(ok => {
|
|
766
709
|
if (ok) {
|
|
767
710
|
notify({
|
|
768
711
|
severity: "success",
|
|
@@ -785,7 +728,7 @@ function DocFormScreen({
|
|
|
785
728
|
destructive: true,
|
|
786
729
|
onConfirm: () => {
|
|
787
730
|
setConfirmAction(void 0);
|
|
788
|
-
void
|
|
731
|
+
void form.remove().then(ok => {
|
|
789
732
|
if (ok) {
|
|
790
733
|
invalidateDocinfo(doctype, name);
|
|
791
734
|
emitEvent({
|