@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
|
@@ -26,7 +26,6 @@ __export(DocFormScreen_exports, {
|
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(DocFormScreen_exports);
|
|
28
28
|
var import_components = require("@multiplatform.one/components");
|
|
29
|
-
var import_forms = require("@multiplatform.one/forms");
|
|
30
29
|
var import_frappe_ui = require("@multiplatform.one/frappe-ui");
|
|
31
30
|
var import_theme = require("@multiplatform.one/theme");
|
|
32
31
|
var import_react = require("@phosphor-icons/react");
|
|
@@ -39,14 +38,11 @@ var import_listNavContext = require("../shared/listNavContext.cjs");
|
|
|
39
38
|
var import_useDocinfo = require("../shared/useDocinfo.cjs");
|
|
40
39
|
var import_useRecentVisit = require("../shared/useRecentVisit.cjs");
|
|
41
40
|
var import_useDoctypeMeta = require("../shared/useDoctypeMeta.cjs");
|
|
42
|
-
var
|
|
41
|
+
var import_connections_data = require("./connections-data.cjs");
|
|
43
42
|
var import_createPrefill = require("./createPrefill.cjs");
|
|
44
|
-
var import_docinfo = require("./docinfo.cjs");
|
|
45
|
-
var import_fieldPermissions = require("./fieldPermissions.cjs");
|
|
46
43
|
var import_formActions = require("./formActions.cjs");
|
|
47
44
|
var import_FormDialogs = require("./FormDialogs.cjs");
|
|
48
45
|
var import_FormErrorBoundary = require("./FormErrorBoundary.cjs");
|
|
49
|
-
var import_formLayout = require("./formLayout.cjs");
|
|
50
46
|
var import_FormConnections = require("./FormConnections.cjs");
|
|
51
47
|
var import_FormHeaderCluster = require("./FormHeaderCluster.cjs");
|
|
52
48
|
var import_FormSidebarPanel = require("./FormSidebarPanel.cjs");
|
|
@@ -54,7 +50,6 @@ var import_FormTimeline = require("./FormTimeline.cjs");
|
|
|
54
50
|
var import_FormToolbar = require("./FormToolbar.cjs");
|
|
55
51
|
var import_timeline_utils = require("./timeline-utils.cjs");
|
|
56
52
|
var import_platformHooks = require("./platformHooks.cjs");
|
|
57
|
-
var import_useFormEngine = require("./useFormEngine.cjs");
|
|
58
53
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
59
54
|
const CONNECTIONS_TAB = "__connections";
|
|
60
55
|
function DocFormScreen({
|
|
@@ -103,29 +98,18 @@ function DocFormScreen({
|
|
|
103
98
|
name
|
|
104
99
|
});
|
|
105
100
|
}, [isCreate, doctype, name, emitEvent]);
|
|
106
|
-
const connection = (0, import_react2.useMemo)(() => config?.baseURL ? {
|
|
107
|
-
baseURL: config.baseURL,
|
|
108
|
-
socketPort: config.socketPort,
|
|
109
|
-
siteName: config.siteName,
|
|
110
|
-
socketBaseURL: config.socketBaseURL,
|
|
111
|
-
auth: config.auth,
|
|
112
|
-
syncOptions: config.syncOptions,
|
|
113
|
-
fixtures: config.fixtures
|
|
114
|
-
} : void 0, [config]);
|
|
115
101
|
const {
|
|
116
102
|
meta,
|
|
117
103
|
loading: isMetaLoading,
|
|
118
104
|
error: metaError,
|
|
119
105
|
reload: refetchMeta
|
|
120
106
|
} = (0, import_useDoctypeMeta.useDoctypeMeta)(doctype);
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
});
|
|
128
|
-
}, [metaError, meta, emitEvent]);
|
|
107
|
+
const metaSource = (0, import_react2.useMemo)(() => ({
|
|
108
|
+
meta,
|
|
109
|
+
isLoading: isMetaLoading,
|
|
110
|
+
error: metaError
|
|
111
|
+
}), [meta, isMetaLoading, metaError]);
|
|
112
|
+
const metaRefused = !meta && metaError !== void 0 && (0, import_frappe_ui.isPermissionError)(metaError);
|
|
129
113
|
const {
|
|
130
114
|
docinfo,
|
|
131
115
|
reload: reloadDocinfo
|
|
@@ -134,7 +118,32 @@ function DocFormScreen({
|
|
|
134
118
|
if (docName) (0, import_useDocinfo.invalidateDocinfo)(doctype, docName);
|
|
135
119
|
reloadDocinfo();
|
|
136
120
|
}, [doctype, docName, reloadDocinfo]);
|
|
137
|
-
const
|
|
121
|
+
const fixtureMode = Boolean(config?.fixtures);
|
|
122
|
+
const rights = (0, import_react2.useMemo)(() => (0, import_frappe_ui.docinfoRights)(docinfo?.permissions) ?? (fixtureMode ? (0, import_frappe_ui.fixtureDocRights)(meta) : void 0), [docinfo?.permissions, fixtureMode, meta]);
|
|
123
|
+
const form = (0, import_frappe_ui.useFrappeForm)({
|
|
124
|
+
doctype,
|
|
125
|
+
name: docName,
|
|
126
|
+
meta: metaSource,
|
|
127
|
+
rights,
|
|
128
|
+
shares: docinfo?.shared,
|
|
129
|
+
readShares: false,
|
|
130
|
+
disabled: readOnly,
|
|
131
|
+
hideFields: hiddenFields,
|
|
132
|
+
hideSections: hiddenSections
|
|
133
|
+
});
|
|
134
|
+
const connection = form.connection;
|
|
135
|
+
const currentUser = form.user ?? "";
|
|
136
|
+
const perms = form.rights;
|
|
137
|
+
(0, import_react2.useEffect)(() => {
|
|
138
|
+
if (metaError && !meta && !metaRefused) {
|
|
139
|
+
emitEvent({
|
|
140
|
+
type: "error",
|
|
141
|
+
error: metaError,
|
|
142
|
+
context: "form-meta"
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}, [metaError, meta, metaRefused, emitEvent]);
|
|
146
|
+
const modifiedStamp = typeof form.baseline?.modified === "string" ? form.baseline.modified : void 0;
|
|
138
147
|
const stampRef = (0, import_react2.useRef)(void 0);
|
|
139
148
|
(0, import_react2.useEffect)(() => {
|
|
140
149
|
stampRef.current = void 0;
|
|
@@ -149,103 +158,20 @@ function DocFormScreen({
|
|
|
149
158
|
reloadDocinfo();
|
|
150
159
|
}
|
|
151
160
|
}, [modifiedStamp, docName, doctype, reloadDocinfo]);
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const fixtureMode = Boolean(config?.fixtures);
|
|
157
|
-
const recordOwner = !isCreate && typeof engine.baseline?.owner === "string" ? engine.baseline.owner : void 0;
|
|
158
|
-
const perms = (0, import_react2.useMemo)(() => {
|
|
159
|
-
const docPerms = (0, import_docinfo.normalizeDocPermissions)(docinfo?.permissions);
|
|
160
|
-
if (docPerms) {
|
|
161
|
-
return {
|
|
162
|
-
write: !!docPerms.write,
|
|
163
|
-
create: !!docPerms.create,
|
|
164
|
-
delete: !!docPerms.delete,
|
|
165
|
-
submit: !!docPerms.submit,
|
|
166
|
-
cancel: !!docPerms.cancel,
|
|
167
|
-
amend: !!docPerms.amend,
|
|
168
|
-
email: !!docPerms.email,
|
|
169
|
-
print: !!docPerms.print
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
if (!fixtureMode) {
|
|
173
|
-
const rights = (0, import_frappe_ui.sessionDocRights)({
|
|
174
|
-
fixtures: false,
|
|
175
|
-
meta,
|
|
176
|
-
roles,
|
|
177
|
-
user: sessionUser,
|
|
178
|
-
owner: recordOwner,
|
|
179
|
-
shares: docinfo?.shared
|
|
180
|
-
});
|
|
181
|
-
return {
|
|
182
|
-
write: rights.write,
|
|
183
|
-
create: rights.create,
|
|
184
|
-
delete: rights.delete,
|
|
185
|
-
submit: rights.submit,
|
|
186
|
-
cancel: rights.cancel,
|
|
187
|
-
amend: rights.amend,
|
|
188
|
-
email: rights.email,
|
|
189
|
-
print: rights.print
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
const rules = meta?.permissions ?? [];
|
|
193
|
-
const anyRole = key => rules.some(rule => !rule.permlevel && !!rule[key]);
|
|
194
|
-
return {
|
|
195
|
-
write: rules.length === 0 || anyRole("write"),
|
|
196
|
-
create: rules.length === 0 || anyRole("create"),
|
|
197
|
-
delete: anyRole("delete"),
|
|
198
|
-
submit: anyRole("submit"),
|
|
199
|
-
cancel: anyRole("cancel"),
|
|
200
|
-
amend: anyRole("amend"),
|
|
201
|
-
email: rules.length === 0 || anyRole("email"),
|
|
202
|
-
print: rules.length === 0 || anyRole("print")
|
|
203
|
-
};
|
|
204
|
-
}, [docinfo?.permissions, docinfo?.shared, meta, fixtureMode, roles, sessionUser, recordOwner]);
|
|
205
|
-
const isSubmittable = !!meta?.is_submittable;
|
|
206
|
-
const formReadOnly = !!readOnly || !!meta?.read_only || engine.wasDeleted || !isCreate && !perms.write || isCreate && !perms.create;
|
|
207
|
-
const permLevels = (0, import_react2.useMemo)(() => (0, import_fieldPermissions.buildPermLevelMatrix)(meta?.permissions, roles), [meta?.permissions, roles]);
|
|
208
|
-
const formTabs = (0, import_react2.useMemo)(() => {
|
|
209
|
-
if (!meta) return [];
|
|
210
|
-
return (0, import_formLayout.buildFormTabs)({
|
|
211
|
-
fields: meta.fields,
|
|
212
|
-
// depends_on evaluates against the doc plus desk's ambient context:
|
|
213
|
-
// __islocal (unsaved doc flag) and the session user behind
|
|
214
|
-
// `frappe.session.user` references.
|
|
215
|
-
doc: {
|
|
216
|
-
...engine.doc,
|
|
217
|
-
__islocal: isCreate ? 1 : 0,
|
|
218
|
-
...(engine.currentUser ? {
|
|
219
|
-
__session_user: engine.currentUser
|
|
220
|
-
} : {})
|
|
221
|
-
},
|
|
222
|
-
docstatus: engine.docstatus,
|
|
223
|
-
formReadOnly,
|
|
224
|
-
isCreate,
|
|
225
|
-
detailsLabel: t("detailsTab", "Details"),
|
|
226
|
-
permLevels,
|
|
227
|
-
hiddenFields,
|
|
228
|
-
hiddenSections
|
|
229
|
-
});
|
|
230
|
-
}, [meta, engine.doc, engine.currentUser, engine.docstatus, formReadOnly, isCreate, permLevels, hiddenFields, hiddenSections, t]);
|
|
231
|
-
const jumpTargets = (0, import_react2.useMemo)(() => formTabs.flatMap(tab => tab.schema.fields.map(field => ({
|
|
232
|
-
name: field.name,
|
|
233
|
-
label: field.label || field.name,
|
|
234
|
-
tabKey: tab.key,
|
|
235
|
-
tabLabel: tab.label
|
|
236
|
-
}))), [formTabs]);
|
|
237
|
-
const [activeTab, setActiveTab] = (0, import_react2.useState)(void 0);
|
|
238
|
-
const showConnections = !isCreate && !!connection && (meta?.links?.some(link => !link.hidden) ?? false);
|
|
161
|
+
const isSubmittable = form.isSubmittable;
|
|
162
|
+
const formReadOnly = form.readOnly;
|
|
163
|
+
const jumpTargets = form.fieldTargets;
|
|
164
|
+
const showConnections = !isCreate && !!connection && (0, import_connections_data.groupConnectionLinks)(meta).length > 0;
|
|
239
165
|
const [pendingNav, setPendingNav] = (0, import_react2.useState)(void 0);
|
|
240
166
|
const navigate = (0, import_react2.useCallback)(href => {
|
|
241
|
-
if (
|
|
167
|
+
if (form.isDirty) {
|
|
242
168
|
setPendingNav(href);
|
|
243
169
|
return;
|
|
244
170
|
}
|
|
245
171
|
navigator.navigate(href);
|
|
246
|
-
}, [
|
|
247
|
-
(0, import_platformHooks.useBeforeUnloadGuard)(
|
|
248
|
-
const backGuard = (0, import_platformHooks.useNavigationDirtyGuard)(
|
|
172
|
+
}, [form.isDirty, navigator]);
|
|
173
|
+
(0, import_platformHooks.useBeforeUnloadGuard)(form.isDirty);
|
|
174
|
+
const backGuard = (0, import_platformHooks.useNavigationDirtyGuard)(form.isDirty);
|
|
249
175
|
const [confirmAction, setConfirmAction] = (0, import_react2.useState)(void 0);
|
|
250
176
|
const [renameOpen, setRenameOpen] = (0, import_react2.useState)(false);
|
|
251
177
|
const [emailOpen, setEmailOpen] = (0, import_react2.useState)(false);
|
|
@@ -253,11 +179,10 @@ function DocFormScreen({
|
|
|
253
179
|
const [pendingJump, setPendingJump] = (0, import_react2.useState)(void 0);
|
|
254
180
|
const [validationSummary, setValidationSummary] = (0, import_react2.useState)(void 0);
|
|
255
181
|
const handleSave = (0, import_react2.useCallback)(async () => {
|
|
256
|
-
const validationErrors =
|
|
182
|
+
const validationErrors = form.validate();
|
|
257
183
|
const errorFields = Object.keys(validationErrors);
|
|
258
184
|
if (errorFields.length > 0) {
|
|
259
|
-
|
|
260
|
-
if (owner) setActiveTab(owner.key);
|
|
185
|
+
errorFields.some(field => form.revealField(field));
|
|
261
186
|
setValidationSummary(t("validationSummary", {
|
|
262
187
|
count: errorFields.length,
|
|
263
188
|
defaultValue_one: "Cannot save \u2014 {{count}} required field is missing.",
|
|
@@ -266,7 +191,7 @@ function DocFormScreen({
|
|
|
266
191
|
} else {
|
|
267
192
|
setValidationSummary(void 0);
|
|
268
193
|
}
|
|
269
|
-
const savedName = await
|
|
194
|
+
const savedName = await form.save();
|
|
270
195
|
if (!savedName) return;
|
|
271
196
|
setValidationSummary(void 0);
|
|
272
197
|
(0, import_components.notify)({
|
|
@@ -282,7 +207,7 @@ function DocFormScreen({
|
|
|
282
207
|
isNew: isCreate
|
|
283
208
|
});
|
|
284
209
|
onSaved?.({
|
|
285
|
-
...
|
|
210
|
+
...form.doc,
|
|
286
211
|
name: savedName
|
|
287
212
|
});
|
|
288
213
|
if (isCreate) {
|
|
@@ -290,24 +215,17 @@ function DocFormScreen({
|
|
|
290
215
|
} else {
|
|
291
216
|
reloadDocinfo();
|
|
292
217
|
}
|
|
293
|
-
}, [
|
|
218
|
+
}, [form, isCreate, navigator, paths, doctype, reloadDocinfo, t, emitEvent, onSaved]);
|
|
294
219
|
(0, import_platformHooks.useSaveShortcut)(!formReadOnly, () => {
|
|
295
|
-
if (
|
|
220
|
+
if (form.isDirty || isCreate) void handleSave();
|
|
296
221
|
});
|
|
297
222
|
(0, import_platformHooks.useJumpToFieldShortcut)(jumpTargets.length > 0 && !jumpOpen, () => setJumpOpen(true));
|
|
298
223
|
const handleAmend = (0, import_react2.useCallback)(() => {
|
|
299
|
-
if (
|
|
300
|
-
|
|
301
|
-
...(0, import_formLayout.buildCopyValues)(meta.fields, engine.doc),
|
|
302
|
-
amended_from: docName
|
|
303
|
-
});
|
|
304
|
-
navigator.navigate(paths.newDoc(doctype));
|
|
305
|
-
}, [meta, docName, doctype, engine.doc, navigator, paths]);
|
|
224
|
+
if (form.amend()) navigator.navigate(paths.newDoc(doctype));
|
|
225
|
+
}, [form, doctype, navigator, paths]);
|
|
306
226
|
const handleDuplicate = (0, import_react2.useCallback)(() => {
|
|
307
|
-
if (
|
|
308
|
-
|
|
309
|
-
navigator.navigate(paths.newDoc(doctype));
|
|
310
|
-
}, [meta, doctype, engine.doc, navigator, paths]);
|
|
227
|
+
if (form.duplicate()) navigator.navigate(paths.newDoc(doctype));
|
|
228
|
+
}, [form, doctype, navigator, paths]);
|
|
311
229
|
const handleRename = (0, import_react2.useCallback)(async newName => {
|
|
312
230
|
if (!connection || !docName) return;
|
|
313
231
|
try {
|
|
@@ -322,11 +240,11 @@ function DocFormScreen({
|
|
|
322
240
|
if (target) navigate(paths.form(doctype, target));
|
|
323
241
|
}, [navigate, paths, doctype]);
|
|
324
242
|
(0, import_platformHooks.useDocPagerShortcuts)(docPager.inList, () => openNeighborDoc(docPager.prev), () => openNeighborDoc(docPager.next));
|
|
325
|
-
const titleFieldValue = meta?.title_field && typeof
|
|
243
|
+
const titleFieldValue = meta?.title_field && typeof form.doc[meta.title_field] === "string" ?
|
|
326
244
|
// Title fields can hold rich text (e.g. ToDo.description = "<p>…</p>");
|
|
327
245
|
// strip to plain text so the breadcrumb + toolbar heading don't show
|
|
328
246
|
// literal HTML tags.
|
|
329
|
-
(0, import_timeline_utils.htmlToText)(
|
|
247
|
+
(0, import_timeline_utils.htmlToText)(form.doc[meta.title_field]) : void 0;
|
|
330
248
|
const title = isCreate ? t("newDocTitle", "New {{doctype}}", {
|
|
331
249
|
doctype
|
|
332
250
|
}) : titleFieldValue || name;
|
|
@@ -337,18 +255,21 @@ function DocFormScreen({
|
|
|
337
255
|
label: t("menuReload", "Reload"),
|
|
338
256
|
icon: "reload",
|
|
339
257
|
onSelect: () => {
|
|
340
|
-
|
|
258
|
+
form.reset();
|
|
341
259
|
setValidationSummary(void 0);
|
|
342
260
|
refetchMeta();
|
|
343
261
|
(0, import_useDocinfo.invalidateDocinfo)(doctype, name);
|
|
344
262
|
reloadDocinfo();
|
|
345
263
|
}
|
|
346
|
-
}, {
|
|
347
|
-
key: "duplicate",
|
|
348
|
-
label: t("menuDuplicate", "Duplicate"),
|
|
349
|
-
icon: "duplicate",
|
|
350
|
-
onSelect: handleDuplicate
|
|
351
264
|
}];
|
|
265
|
+
if (!metaRefused) {
|
|
266
|
+
items.push({
|
|
267
|
+
key: "duplicate",
|
|
268
|
+
label: t("menuDuplicate", "Duplicate"),
|
|
269
|
+
icon: "duplicate",
|
|
270
|
+
onSelect: handleDuplicate
|
|
271
|
+
});
|
|
272
|
+
}
|
|
352
273
|
if (meta?.allow_rename && perms.write) {
|
|
353
274
|
items.push({
|
|
354
275
|
key: "rename",
|
|
@@ -381,7 +302,7 @@ function DocFormScreen({
|
|
|
381
302
|
key: "links",
|
|
382
303
|
label: t("menuLinks", "Links"),
|
|
383
304
|
icon: "links",
|
|
384
|
-
onSelect: () => setActiveTab(CONNECTIONS_TAB)
|
|
305
|
+
onSelect: () => form.setActiveTab(CONNECTIONS_TAB)
|
|
385
306
|
});
|
|
386
307
|
}
|
|
387
308
|
if (jumpTargets.length > 0) {
|
|
@@ -428,10 +349,10 @@ function DocFormScreen({
|
|
|
428
349
|
});
|
|
429
350
|
}
|
|
430
351
|
return items;
|
|
431
|
-
}, [isCreate, t,
|
|
352
|
+
}, [isCreate, t, form, refetchMeta, reloadDocinfo, handleDuplicate, metaRefused, meta?.allow_rename, perms, connection, doctype, name, showConnections, jumpTargets, navigate, paths, capabilities]);
|
|
432
353
|
const effectiveMenuItems = (0, import_react2.useMemo)(() => {
|
|
433
|
-
const
|
|
434
|
-
const items = menuItems.filter(item => !
|
|
354
|
+
const hiddenKeys = new Set(actionOverrides?.hide ?? []);
|
|
355
|
+
const items = menuItems.filter(item => !hiddenKeys.has(item.key));
|
|
435
356
|
const injected = [...(0, import_BackofficeProvider.actionsForDoctype)(actions.form, doctype), ...(0, import_BackofficeProvider.actionsForDoctype)(actionOverrides?.extra, doctype)];
|
|
436
357
|
for (const action of injected) {
|
|
437
358
|
items.push({
|
|
@@ -449,9 +370,9 @@ function DocFormScreen({
|
|
|
449
370
|
}, [menuItems, actions.form, actionOverrides, doctype, docName]);
|
|
450
371
|
const handleJumpToField = (0, import_react2.useCallback)(field => {
|
|
451
372
|
setJumpOpen(false);
|
|
452
|
-
setActiveTab(field.tabKey);
|
|
373
|
+
form.setActiveTab(field.tabKey);
|
|
453
374
|
setPendingJump(field.name);
|
|
454
|
-
}, []);
|
|
375
|
+
}, [form]);
|
|
455
376
|
(0, import_react2.useEffect)(() => {
|
|
456
377
|
if (!pendingJump) return;
|
|
457
378
|
if (typeof document === "undefined") {
|
|
@@ -498,18 +419,59 @@ function DocFormScreen({
|
|
|
498
419
|
})
|
|
499
420
|
});
|
|
500
421
|
}
|
|
501
|
-
if (metaError && !meta) {
|
|
422
|
+
if (metaError && !meta && !metaRefused) {
|
|
502
423
|
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
503
424
|
flex: 1,
|
|
504
|
-
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.
|
|
505
|
-
|
|
425
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.AsyncBoundary, {
|
|
426
|
+
error: metaError,
|
|
427
|
+
errorTitle: t("metaError", "Could not load {{doctype}}", {
|
|
506
428
|
doctype
|
|
507
429
|
}),
|
|
508
|
-
|
|
430
|
+
onRetry: refetchMeta
|
|
509
431
|
})
|
|
510
432
|
});
|
|
511
433
|
}
|
|
512
|
-
if (!isCreate &&
|
|
434
|
+
if (!isCreate && form.status === "error" && form.docError && (0, import_frappe_ui.isPermissionError)(form.docError)) {
|
|
435
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
436
|
+
flex: 1,
|
|
437
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
|
|
438
|
+
testID: "frappe-form-not-permitted",
|
|
439
|
+
title: t("docNotPermitted", "You can't open {{doctype}} {{name}}", {
|
|
440
|
+
doctype,
|
|
441
|
+
name
|
|
442
|
+
}),
|
|
443
|
+
description: (0, import_frappe_ui.refusalReason)(form.docError),
|
|
444
|
+
action: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Button, {
|
|
445
|
+
icon: import_react.ListBulletsIcon,
|
|
446
|
+
onPress: () => navigator.navigate(paths.list(doctype)),
|
|
447
|
+
children: t("backToList", "Back to {{doctype}} list", {
|
|
448
|
+
doctype
|
|
449
|
+
})
|
|
450
|
+
})
|
|
451
|
+
})
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
if (!isCreate && form.status === "error" && form.docError) {
|
|
455
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
456
|
+
flex: 1,
|
|
457
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
|
|
458
|
+
intent: "error",
|
|
459
|
+
title: t("docLoadError", "Could not load {{doctype}} {{name}}", {
|
|
460
|
+
doctype,
|
|
461
|
+
name
|
|
462
|
+
}),
|
|
463
|
+
description: form.docError.message,
|
|
464
|
+
action: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Button, {
|
|
465
|
+
icon: import_react.ListBulletsIcon,
|
|
466
|
+
onPress: () => navigator.navigate(paths.list(doctype)),
|
|
467
|
+
children: t("backToList", "Back to {{doctype}} list", {
|
|
468
|
+
doctype
|
|
469
|
+
})
|
|
470
|
+
})
|
|
471
|
+
})
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
if (!isCreate && form.status === "notFound") {
|
|
513
475
|
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
514
476
|
flex: 1,
|
|
515
477
|
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.EmptyState, {
|
|
@@ -528,7 +490,7 @@ function DocFormScreen({
|
|
|
528
490
|
})
|
|
529
491
|
});
|
|
530
492
|
}
|
|
531
|
-
if (!isCreate &&
|
|
493
|
+
if (!isCreate && form.status === "loading") {
|
|
532
494
|
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
533
495
|
flex: 1,
|
|
534
496
|
...knobProps.panelPadding,
|
|
@@ -540,16 +502,16 @@ function DocFormScreen({
|
|
|
540
502
|
}
|
|
541
503
|
const indicator = (0, import_FormToolbar.resolveIndicator)({
|
|
542
504
|
isCreate,
|
|
543
|
-
isDirty:
|
|
544
|
-
docstatus:
|
|
505
|
+
isDirty: form.isDirty,
|
|
506
|
+
docstatus: form.docstatus,
|
|
545
507
|
isSubmittable,
|
|
546
|
-
statusValue: typeof
|
|
508
|
+
statusValue: typeof form.doc.status === "string" ? form.doc.status : void 0,
|
|
547
509
|
states: meta?.states
|
|
548
510
|
});
|
|
549
|
-
const canSave = !formReadOnly && (isCreate ? perms.create : perms.write &&
|
|
550
|
-
const canSubmit = !isCreate && isSubmittable &&
|
|
551
|
-
const canCancel = !isCreate && isSubmittable &&
|
|
552
|
-
const canAmend = !isCreate && isSubmittable &&
|
|
511
|
+
const canSave = !formReadOnly && (isCreate ? perms.create : perms.write && form.docstatus === 0);
|
|
512
|
+
const canSubmit = !isCreate && isSubmittable && form.docstatus === 0 && !form.isDirty && perms.submit && !form.wasDeleted;
|
|
513
|
+
const canCancel = !isCreate && isSubmittable && form.docstatus === 1 && perms.cancel && !form.wasDeleted;
|
|
514
|
+
const canAmend = !isCreate && isSubmittable && form.docstatus === 2 && perms.amend && !form.wasDeleted;
|
|
553
515
|
const breadcrumbs = [{
|
|
554
516
|
label: t("home", "Home"),
|
|
555
517
|
href: paths.home()
|
|
@@ -559,29 +521,8 @@ function DocFormScreen({
|
|
|
559
521
|
}, {
|
|
560
522
|
label: isCreate ? t("newCrumb", "New") : title
|
|
561
523
|
}];
|
|
562
|
-
const promptNamed = isCreate && (0, import_formLayout.isPromptNamed)(meta?.autoname, meta?.naming_rule);
|
|
563
524
|
const sidebarStacked = sizeClass === "compact";
|
|
564
|
-
const
|
|
565
|
-
value: tab.key,
|
|
566
|
-
label: tab.label,
|
|
567
|
-
content: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
568
|
-
...knobProps.gapLg,
|
|
569
|
-
paddingTop: "$3",
|
|
570
|
-
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormErrorBoundary.FormErrorBoundary, {
|
|
571
|
-
errorTitle: t("formTabRenderError", "This form tab failed to render"),
|
|
572
|
-
testID: `form-tab-error-${tab.key}`,
|
|
573
|
-
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_frappe_ui.SchemaForm, {
|
|
574
|
-
schema: tab.schema,
|
|
575
|
-
doc: engine.doc,
|
|
576
|
-
setValue: engine.setValue,
|
|
577
|
-
errors: engine.errors,
|
|
578
|
-
disabled: formReadOnly || engine.isSaving,
|
|
579
|
-
sectionHeadingLevel: 2,
|
|
580
|
-
renderFieldWrapper: import_FormErrorBoundary.wrapFieldWithErrorBoundary
|
|
581
|
-
})
|
|
582
|
-
})
|
|
583
|
-
})
|
|
584
|
-
})), ...(showConnections ? [{
|
|
525
|
+
const connectionsTab = showConnections ? [{
|
|
585
526
|
value: CONNECTIONS_TAB,
|
|
586
527
|
label: t("connectionsTab", "Connections"),
|
|
587
528
|
content: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
@@ -592,38 +533,40 @@ function DocFormScreen({
|
|
|
592
533
|
meta
|
|
593
534
|
})
|
|
594
535
|
})
|
|
595
|
-
}] : []
|
|
596
|
-
const
|
|
536
|
+
}] : [];
|
|
537
|
+
const renderTab = (tab, content) => /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
538
|
+
...knobProps.gapLg,
|
|
539
|
+
paddingTop: "$3",
|
|
540
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormErrorBoundary.FormErrorBoundary, {
|
|
541
|
+
errorTitle: t("formTabRenderError", "This form tab failed to render"),
|
|
542
|
+
testID: `form-tab-error-${tab.key}`,
|
|
543
|
+
children: content
|
|
544
|
+
})
|
|
545
|
+
});
|
|
597
546
|
const formBody =
|
|
598
|
-
// No flex here: formBody
|
|
599
|
-
//
|
|
600
|
-
//
|
|
547
|
+
// No flex here: formBody lives inside COLUMN containers (both branches
|
|
548
|
+
// below), where `flex={1}` means flex-basis:0 — the body would stop
|
|
549
|
+
// contributing height and the timeline/sidebar would paint over it.
|
|
601
550
|
/* @__PURE__ */
|
|
602
|
-
(0, import_jsx_runtime.
|
|
551
|
+
(0, import_jsx_runtime.jsx)(import_components.YStack, {
|
|
603
552
|
minWidth: 0,
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
}) : bodyTabs[0]?.content ?? null, engine.errors.general && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
|
|
620
|
-
color: "$red10",
|
|
621
|
-
fontSize: "$3",
|
|
622
|
-
role: "alert",
|
|
623
|
-
children: engine.errors.general
|
|
624
|
-
})]
|
|
553
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_frappe_ui.FrappeForm, {
|
|
554
|
+
form,
|
|
555
|
+
doctype,
|
|
556
|
+
name: docName,
|
|
557
|
+
disabled: readOnly,
|
|
558
|
+
showToolbar: false,
|
|
559
|
+
showSidebar: false,
|
|
560
|
+
showTimeline: false,
|
|
561
|
+
showConnections: false,
|
|
562
|
+
showBanners: false,
|
|
563
|
+
sectionHeadingLevel: 2,
|
|
564
|
+
renderFieldWrapper: import_FormErrorBoundary.wrapFieldWithErrorBoundary,
|
|
565
|
+
renderTab,
|
|
566
|
+
extraTabs: connectionsTab
|
|
567
|
+
})
|
|
625
568
|
});
|
|
626
|
-
const timeline = capabilities.timeline.enabled && !isCreate && docName ?
|
|
569
|
+
const timeline = capabilities.timeline.enabled && !isCreate && docName && !metaRefused ?
|
|
627
570
|
// Composed mode: the screen's shared docinfo (and its refresh) feed
|
|
628
571
|
// the timeline. Self-fetch mode subscribed the timeline to its OWN
|
|
629
572
|
// cache entry, which the save path's invalidate+reload orphaned — the
|
|
@@ -635,16 +578,16 @@ function DocFormScreen({
|
|
|
635
578
|
name: docName,
|
|
636
579
|
docInfo: docinfo,
|
|
637
580
|
refreshDocInfo: refreshDocinfo,
|
|
638
|
-
currentUser
|
|
581
|
+
currentUser,
|
|
639
582
|
connection
|
|
640
583
|
}) : null;
|
|
641
584
|
const sidebar = !isCreate && docName && meta ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormSidebarPanel.FormSidebarPanel, {
|
|
642
585
|
doctype,
|
|
643
586
|
name: docName,
|
|
644
587
|
meta,
|
|
645
|
-
doc:
|
|
588
|
+
doc: form.doc,
|
|
646
589
|
docinfo,
|
|
647
|
-
currentUser
|
|
590
|
+
currentUser,
|
|
648
591
|
onRefresh: refreshDocinfo,
|
|
649
592
|
stacked: sidebarStacked
|
|
650
593
|
}) : null;
|
|
@@ -654,12 +597,12 @@ function DocFormScreen({
|
|
|
654
597
|
title,
|
|
655
598
|
indicator,
|
|
656
599
|
showIndicator: !!meta,
|
|
657
|
-
isSaving:
|
|
658
|
-
cluster: !isCreate && docName ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormHeaderCluster.FormHeaderCluster, {
|
|
600
|
+
isSaving: form.isSubmitting,
|
|
601
|
+
cluster: !isCreate && docName && !metaRefused ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_FormHeaderCluster.FormHeaderCluster, {
|
|
659
602
|
doctype,
|
|
660
603
|
name: docName,
|
|
661
604
|
docinfo,
|
|
662
|
-
currentUser
|
|
605
|
+
currentUser,
|
|
663
606
|
onRefresh: refreshDocinfo
|
|
664
607
|
}) : void 0,
|
|
665
608
|
canSave,
|
|
@@ -687,9 +630,9 @@ function DocFormScreen({
|
|
|
687
630
|
name: docName
|
|
688
631
|
} : {}),
|
|
689
632
|
defaultContent: toolbar
|
|
690
|
-
}) : toolbar, (
|
|
633
|
+
}) : toolbar, (form.wasDeleted || validationSummary || form.conflict) && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.YStack, {
|
|
691
634
|
paddingHorizontal: "$3",
|
|
692
|
-
children: [
|
|
635
|
+
children: [form.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.XStack, {
|
|
693
636
|
role: "alert",
|
|
694
637
|
...knobProps.containerRadius,
|
|
695
638
|
...knobProps.panelPadding,
|
|
@@ -699,7 +642,7 @@ function DocFormScreen({
|
|
|
699
642
|
fontSize: "$3",
|
|
700
643
|
children: t("deletedBanner", "This document was deleted on the server. Fields are read-only.")
|
|
701
644
|
})
|
|
702
|
-
}), validationSummary && !
|
|
645
|
+
}), validationSummary && !form.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.XStack, {
|
|
703
646
|
role: "alert",
|
|
704
647
|
...knobProps.containerRadius,
|
|
705
648
|
...knobProps.panelPadding,
|
|
@@ -710,7 +653,7 @@ function DocFormScreen({
|
|
|
710
653
|
fontSize: "$3",
|
|
711
654
|
children: validationSummary
|
|
712
655
|
})
|
|
713
|
-
}),
|
|
656
|
+
}), form.conflict && !form.wasDeleted && /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
|
|
714
657
|
role: "status",
|
|
715
658
|
alignItems: "center",
|
|
716
659
|
justifyContent: "space-between",
|
|
@@ -727,7 +670,7 @@ function DocFormScreen({
|
|
|
727
670
|
size: "$2",
|
|
728
671
|
outlined: true,
|
|
729
672
|
"aria-label": t("reloadDoc", "Reload"),
|
|
730
|
-
onPress:
|
|
673
|
+
onPress: form.reset,
|
|
731
674
|
children: t("reloadDoc", "Reload")
|
|
732
675
|
})]
|
|
733
676
|
})]
|
|
@@ -767,7 +710,7 @@ function DocFormScreen({
|
|
|
767
710
|
warning: true,
|
|
768
711
|
onConfirm: () => {
|
|
769
712
|
setConfirmAction(void 0);
|
|
770
|
-
void
|
|
713
|
+
void form.submitDocument().then(ok => {
|
|
771
714
|
if (ok) {
|
|
772
715
|
(0, import_components.notify)({
|
|
773
716
|
severity: "success",
|
|
@@ -789,7 +732,7 @@ function DocFormScreen({
|
|
|
789
732
|
destructive: true,
|
|
790
733
|
onConfirm: () => {
|
|
791
734
|
setConfirmAction(void 0);
|
|
792
|
-
void
|
|
735
|
+
void form.cancelDocument().then(ok => {
|
|
793
736
|
if (ok) {
|
|
794
737
|
(0, import_components.notify)({
|
|
795
738
|
severity: "success",
|
|
@@ -812,7 +755,7 @@ function DocFormScreen({
|
|
|
812
755
|
destructive: true,
|
|
813
756
|
onConfirm: () => {
|
|
814
757
|
setConfirmAction(void 0);
|
|
815
|
-
void
|
|
758
|
+
void form.remove().then(ok => {
|
|
816
759
|
if (ok) {
|
|
817
760
|
(0, import_useDocinfo.invalidateDocinfo)(doctype, name);
|
|
818
761
|
emitEvent({
|