@multiplatform.one/backoffice 7.11.0 → 7.16.0
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/desk/Desk.cjs +2 -6
- package/dist/cjs/desk/Desk.native.js +2 -7
- package/dist/cjs/desk/Desk.native.js.map +1 -1
- package/dist/cjs/desk/DeskSurface.native.js.map +1 -1
- package/dist/cjs/form/FormTimeline.cjs +6 -1
- package/dist/cjs/form/FormTimeline.native.js +6 -1
- package/dist/cjs/form/FormTimeline.native.js.map +1 -1
- package/dist/cjs/list/DoctypeListScreen.cjs +1 -0
- package/dist/cjs/list/DoctypeListScreen.native.js +1 -0
- package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/cjs/list/ListBulkActionsBar.cjs +1 -0
- package/dist/cjs/list/ListBulkActionsBar.native.js +1 -0
- package/dist/cjs/list/ListBulkActionsBar.native.js.map +1 -1
- package/dist/cjs/list/bulk-export.cjs +28 -3
- package/dist/cjs/list/bulk-export.native.js +37 -3
- package/dist/cjs/list/bulk-export.native.js.map +1 -1
- package/dist/cjs/shared/useDoctypeMeta.native.js.map +1 -1
- package/dist/cjs/shared/useUserRoles.cjs +1 -39
- package/dist/cjs/shared/useUserRoles.native.js +1 -43
- package/dist/cjs/shared/useUserRoles.native.js.map +1 -1
- package/dist/esm/desk/Desk.mjs +2 -6
- package/dist/esm/desk/Desk.mjs.map +1 -1
- package/dist/esm/desk/Desk.native.js +2 -7
- package/dist/esm/desk/Desk.native.js.map +1 -1
- package/dist/esm/desk/DeskSurface.mjs.map +1 -1
- package/dist/esm/desk/DeskSurface.native.js.map +1 -1
- package/dist/esm/form/FormTimeline.mjs +6 -1
- package/dist/esm/form/FormTimeline.mjs.map +1 -1
- package/dist/esm/form/FormTimeline.native.js +6 -1
- package/dist/esm/form/FormTimeline.native.js.map +1 -1
- package/dist/esm/list/DoctypeListScreen.mjs +1 -0
- package/dist/esm/list/DoctypeListScreen.mjs.map +1 -1
- package/dist/esm/list/DoctypeListScreen.native.js +1 -0
- package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/esm/list/ListBulkActionsBar.mjs +1 -0
- package/dist/esm/list/ListBulkActionsBar.mjs.map +1 -1
- package/dist/esm/list/ListBulkActionsBar.native.js +1 -0
- package/dist/esm/list/ListBulkActionsBar.native.js.map +1 -1
- package/dist/esm/list/bulk-export.mjs +27 -3
- package/dist/esm/list/bulk-export.mjs.map +1 -1
- package/dist/esm/list/bulk-export.native.js +36 -3
- package/dist/esm/list/bulk-export.native.js.map +1 -1
- package/dist/esm/shared/useDoctypeMeta.mjs.map +1 -1
- package/dist/esm/shared/useDoctypeMeta.native.js.map +1 -1
- package/dist/esm/shared/useUserRoles.mjs +2 -40
- package/dist/esm/shared/useUserRoles.mjs.map +1 -1
- package/dist/esm/shared/useUserRoles.native.js +2 -44
- package/dist/esm/shared/useUserRoles.native.js.map +1 -1
- package/dist/jsx/desk/Desk.mjs +2 -6
- package/dist/jsx/desk/Desk.mjs.map +1 -1
- package/dist/jsx/desk/Desk.native.js +2 -7
- package/dist/jsx/desk/Desk.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/FormTimeline.mjs +6 -1
- package/dist/jsx/form/FormTimeline.mjs.map +1 -1
- package/dist/jsx/form/FormTimeline.native.js +6 -1
- package/dist/jsx/form/FormTimeline.native.js.map +1 -1
- package/dist/jsx/list/DoctypeListScreen.mjs +1 -0
- package/dist/jsx/list/DoctypeListScreen.mjs.map +1 -1
- package/dist/jsx/list/DoctypeListScreen.native.js +1 -0
- package/dist/jsx/list/DoctypeListScreen.native.js.map +1 -1
- package/dist/jsx/list/ListBulkActionsBar.mjs +1 -0
- package/dist/jsx/list/ListBulkActionsBar.mjs.map +1 -1
- package/dist/jsx/list/ListBulkActionsBar.native.js +1 -0
- package/dist/jsx/list/ListBulkActionsBar.native.js.map +1 -1
- package/dist/jsx/list/bulk-export.mjs +27 -3
- package/dist/jsx/list/bulk-export.mjs.map +1 -1
- package/dist/jsx/list/bulk-export.native.js +37 -3
- package/dist/jsx/list/bulk-export.native.js.map +1 -1
- package/dist/jsx/shared/useDoctypeMeta.mjs.map +1 -1
- package/dist/jsx/shared/useDoctypeMeta.native.js.map +1 -1
- package/dist/jsx/shared/useUserRoles.mjs +2 -40
- package/dist/jsx/shared/useUserRoles.mjs.map +1 -1
- package/dist/jsx/shared/useUserRoles.native.js +1 -43
- package/dist/jsx/shared/useUserRoles.native.js.map +1 -1
- package/package.json +14 -14
- package/src/desk/Desk.spec.tsx +32 -1
- package/src/desk/Desk.tsx +8 -14
- package/src/desk/DeskSurface.tsx +7 -8
- package/src/form/FormErrorBoundary.spec.tsx +5 -3
- package/src/form/FormTimeline.optimistic.spec.tsx +33 -13
- package/src/form/FormTimeline.tsx +7 -1
- package/src/list/DoctypeListScreen.tsx +2 -2
- package/src/list/ListBulkActionsBar.tsx +2 -1
- package/src/list/bulk-export.spec.ts +75 -0
- package/src/list/bulk-export.tsx +31 -6
- package/src/shared/useDoctypeMeta.ts +4 -5
- package/src/shared/useUserRoles.ts +7 -59
- package/types/desk/Desk.d.ts +4 -4
- package/types/desk/Desk.d.ts.map +1 -1
- package/types/desk/DeskSurface.d.ts.map +1 -1
- package/types/form/FormTimeline.d.ts.map +1 -1
- package/types/list/DoctypeListScreen.d.ts.map +1 -1
- package/types/list/ListBulkActionsBar.d.ts.map +1 -1
- package/types/list/bulk-export.d.ts +5 -1
- package/types/list/bulk-export.d.ts.map +1 -1
- package/types/shared/useDoctypeMeta.d.ts.map +1 -1
- package/types/shared/useUserRoles.d.ts +5 -9
- package/types/shared/useUserRoles.d.ts.map +1 -1
|
@@ -38,11 +38,22 @@ __export(bulk_export_exports, {
|
|
|
38
38
|
buildCsv: () => buildCsv,
|
|
39
39
|
bulkExportCsv: () => bulkExportCsv,
|
|
40
40
|
downloadTextFile: () => downloadTextFile,
|
|
41
|
-
exportFieldnames: () => exportFieldnames
|
|
41
|
+
exportFieldnames: () => exportFieldnames,
|
|
42
|
+
saveCsvFile: () => saveCsvFile
|
|
42
43
|
});
|
|
43
44
|
module.exports = __toCommonJS(bulk_export_exports);
|
|
44
45
|
var import_react = __toESM(require("react"));
|
|
46
|
+
var import_file = require("@multiplatform.one/platform/file");
|
|
45
47
|
var import_bulk_edit_dialog = require("./bulk-edit-dialog.native.js");
|
|
48
|
+
function _instanceof(left, right) {
|
|
49
|
+
"@swc/helpers - instanceof";
|
|
50
|
+
|
|
51
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
52
|
+
return !!right[Symbol.hasInstance](left);
|
|
53
|
+
} else {
|
|
54
|
+
return left instanceof right;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
46
57
|
function _type_of(obj) {
|
|
47
58
|
"@swc/helpers - typeof";
|
|
48
59
|
|
|
@@ -129,6 +140,30 @@ function downloadTextFile(filename, text) {
|
|
|
129
140
|
URL.revokeObjectURL(url);
|
|
130
141
|
return true;
|
|
131
142
|
}
|
|
143
|
+
async function saveCsvFile(filename, csv) {
|
|
144
|
+
try {
|
|
145
|
+
var result = await (0, import_file.saveFile)({
|
|
146
|
+
bytes: new TextEncoder().encode(csv),
|
|
147
|
+
filename,
|
|
148
|
+
mimeType: "text/csv;charset=utf-8"
|
|
149
|
+
});
|
|
150
|
+
return result.status === "not-saved" ? {
|
|
151
|
+
downloaded: false,
|
|
152
|
+
cancelled: true
|
|
153
|
+
} : {
|
|
154
|
+
downloaded: true,
|
|
155
|
+
cancelled: false
|
|
156
|
+
};
|
|
157
|
+
} catch (error) {
|
|
158
|
+
if (_instanceof(error, import_file.FileSaveError) && error.code === "unavailable") {
|
|
159
|
+
return {
|
|
160
|
+
downloaded: false,
|
|
161
|
+
cancelled: false
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
132
167
|
async function bulkExportCsv(app, doctype, names, meta) {
|
|
133
168
|
var fields = exportFieldnames(meta);
|
|
134
169
|
var rows = await app.db().getDocList(doctype, {
|
|
@@ -145,11 +180,10 @@ async function bulkExportCsv(app, doctype, names, meta) {
|
|
|
145
180
|
});
|
|
146
181
|
var csv = buildCsv(fields, sorted);
|
|
147
182
|
var filename = `${doctype.toLowerCase().replace(/\s+/g, "-")}.csv`;
|
|
148
|
-
var downloaded = downloadTextFile(filename, csv);
|
|
149
183
|
return {
|
|
150
184
|
csv,
|
|
151
185
|
rowCount: sorted.length,
|
|
152
|
-
|
|
186
|
+
...(await saveCsvFile(filename, csv))
|
|
153
187
|
};
|
|
154
188
|
}
|
|
155
189
|
//# sourceMappingURL=bulk-export.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","bulk_export_exports","buildCsv","bulkExportCsv","downloadTextFile","exportFieldnames","module","exports","import_react","require","import_bulk_edit_dialog","
|
|
1
|
+
{"version":3,"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","bulk_export_exports","buildCsv","bulkExportCsv","downloadTextFile","exportFieldnames","saveCsvFile","module","exports","import_react","require","import_file","import_bulk_edit_dialog","_instanceof","left","right","Symbol","hasInstance","_type_of","obj","constructor","formatCsvCell","text","JSON","stringify","String","test","replaceAll","columns","rows","lines","map","join","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_loop","row","_step","push","column"],"sources":["../../../src/list/bulk-export.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useFrappeConfig","useCallback","useEffect","useMemo","useState","useFrappeApp","metaCache","Map","parseUserSettings","raw","JSON","parse","loadBundleFromFixtures","fixtures","doctype","doc","getDoc","Error","meta","fields","childMetas","useDoctypeMeta","app","config","bundle","setBundle","loading","setLoading","Boolean","error","setError","generation","setGeneration","cacheKey","baseURL","cancelled","promise","get","call","with_parent","then","res","docs","payload","find","d","name","userSettings","user_settings","set","catch","delete","value","err","reload","g"],"sources":["../../../src/shared/useDoctypeMeta.ts"],"sourcesContent":[null],"mappings":"AAOA,SAASA,eAAA,QAAuB;AAEhC,SAASC,WAAA,EAAaC,SAAA,EAAWC,OAAA,EAASC,QAAA,QAAgB;AAC1D,SAASC,YAAA,QAAoB;
|
|
1
|
+
{"version":3,"names":["useFrappeConfig","useCallback","useEffect","useMemo","useState","useFrappeApp","metaCache","Map","parseUserSettings","raw","JSON","parse","loadBundleFromFixtures","fixtures","doctype","doc","getDoc","Error","meta","fields","childMetas","useDoctypeMeta","app","config","bundle","setBundle","loading","setLoading","Boolean","error","setError","generation","setGeneration","cacheKey","baseURL","cancelled","promise","get","call","with_parent","then","res","docs","payload","find","d","name","userSettings","user_settings","set","catch","delete","value","err","reload","g"],"sources":["../../../src/shared/useDoctypeMeta.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","useDoctypeMeta_exports","useDoctypeMeta","module","exports","import_frappe_ui","require","import_react","import_useFrappeApp","metaCache","Map","parseUserSettings","raw","JSON","parse","unused","loadBundleFromFixtures","fixtures","doctype","_raw_fields","doc","getDoc","Error","meta","fields","childMetas","_ref","app","useFrappeApp","config","useFrappeConfig","bundle","setBundle","useState","loading","setLoading","Boolean","error","setError","generation","setGeneration","cacheKey","baseURL","useEffect","cancelled","promise","with_parent","then","res","_ref2","_docs_find","_res_payload","_res_payload1","docs","payload","find","d","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done"],"sources":["../../../src/shared/useDoctypeMeta.ts"],"sourcesContent":[null],"mappings":"AAOA,YAAS;;AAET,IAAAA,SAAS,GAAAC,MAAa,CAAAC,cAAW;AACjC,IAAAC,gBAAS,GAAAF,MAAoB,CAAAG,wBAAA;
|
|
1
|
+
{"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","useDoctypeMeta_exports","useDoctypeMeta","module","exports","import_frappe_ui","require","import_react","import_useFrappeApp","metaCache","Map","parseUserSettings","raw","JSON","parse","unused","loadBundleFromFixtures","fixtures","doctype","_raw_fields","doc","getDoc","Error","meta","fields","childMetas","_ref","app","useFrappeApp","config","useFrappeConfig","bundle","setBundle","useState","loading","setLoading","Boolean","error","setError","generation","setGeneration","cacheKey","baseURL","useEffect","cancelled","promise","with_parent","then","res","_ref2","_docs_find","_res_payload","_res_payload1","docs","payload","find","d","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done"],"sources":["../../../src/shared/useDoctypeMeta.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,46 +1,8 @@
|
|
|
1
|
-
import { useFrappeConfig } from "@multiplatform.one/frappe-ui";
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
import { useFrappeApp } from "./useFrappeApp.mjs";
|
|
4
|
-
const rolesCache = /* @__PURE__ */new Map();
|
|
1
|
+
import { useFrappeConfig, useSessionRoles } from "@multiplatform.one/frappe-ui";
|
|
5
2
|
function useUserRoles() {
|
|
6
|
-
const app = useFrappeApp();
|
|
7
3
|
const config = useFrappeConfig();
|
|
8
|
-
const fixtures = config?.fixtures;
|
|
9
|
-
const baseURL = config?.baseURL;
|
|
10
|
-
const [roles, setRoles] = useState(void 0);
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
if (!app || fixtures || !baseURL) {
|
|
13
|
-
setRoles(void 0);
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
let cancelled = false;
|
|
17
|
-
let promise = rolesCache.get(baseURL);
|
|
18
|
-
if (!promise) {
|
|
19
|
-
promise = app.call().get("frappe.auth.get_logged_user").then(res => {
|
|
20
|
-
const user = res.payload?.message;
|
|
21
|
-
if (!user) throw new Error("No session user");
|
|
22
|
-
return app.call().get("frappe.core.doctype.user.user.get_roles", {
|
|
23
|
-
uid: user
|
|
24
|
-
});
|
|
25
|
-
}).then(res => {
|
|
26
|
-
const list = res.payload?.message;
|
|
27
|
-
if (!Array.isArray(list)) throw new Error("No roles returned");
|
|
28
|
-
return list;
|
|
29
|
-
});
|
|
30
|
-
rolesCache.set(baseURL, promise);
|
|
31
|
-
promise.catch(() => rolesCache.delete(baseURL));
|
|
32
|
-
}
|
|
33
|
-
promise.then(list => {
|
|
34
|
-
if (!cancelled) setRoles(list);
|
|
35
|
-
}).catch(() => {
|
|
36
|
-
if (!cancelled) setRoles(void 0);
|
|
37
|
-
});
|
|
38
|
-
return () => {
|
|
39
|
-
cancelled = true;
|
|
40
|
-
};
|
|
41
|
-
}, [app, fixtures, baseURL]);
|
|
42
4
|
return {
|
|
43
|
-
roles
|
|
5
|
+
roles: useSessionRoles(config)
|
|
44
6
|
};
|
|
45
7
|
}
|
|
46
8
|
export { useUserRoles };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useFrappeConfig","
|
|
1
|
+
{"version":3,"names":["useFrappeConfig","useSessionRoles","useUserRoles","config","roles"],"sources":["../../../src/shared/useUserRoles.ts"],"sourcesContent":[null],"mappings":"AAQA,SAASA,eAAA,EAAiBC,eAAA,QAAuB;AAE1C,SAASC,aAAA,EAAqC;EACnD,MAAMC,MAAA,GAASH,eAAA,CAAgB;EAC/B,OAAO;IAAEI,KAAA,EAAOH,eAAA,CAAgBE,MAAM;EAAE;AAC1C","ignoreList":[]}
|
|
@@ -28,52 +28,10 @@ __export(useUserRoles_exports, {
|
|
|
28
28
|
});
|
|
29
29
|
module.exports = __toCommonJS(useUserRoles_exports);
|
|
30
30
|
var import_frappe_ui = require("@multiplatform.one/frappe-ui");
|
|
31
|
-
var import_react = require("react");
|
|
32
|
-
var import_useFrappeApp = require("./useFrappeApp.native.js");
|
|
33
|
-
var rolesCache = /* @__PURE__ */new Map();
|
|
34
31
|
function useUserRoles() {
|
|
35
|
-
var app = (0, import_useFrappeApp.useFrappeApp)();
|
|
36
32
|
var config = (0, import_frappe_ui.useFrappeConfig)();
|
|
37
|
-
var fixtures = config === null || config === void 0 ? void 0 : config.fixtures;
|
|
38
|
-
var baseURL = config === null || config === void 0 ? void 0 : config.baseURL;
|
|
39
|
-
var [roles, setRoles] = (0, import_react.useState)(void 0);
|
|
40
|
-
(0, import_react.useEffect)(function () {
|
|
41
|
-
if (!app || fixtures || !baseURL) {
|
|
42
|
-
setRoles(void 0);
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
var cancelled = false;
|
|
46
|
-
var promise = rolesCache.get(baseURL);
|
|
47
|
-
if (!promise) {
|
|
48
|
-
promise = app.call().get("frappe.auth.get_logged_user").then(function (res) {
|
|
49
|
-
var _res_payload;
|
|
50
|
-
var user = (_res_payload = res.payload) === null || _res_payload === void 0 ? void 0 : _res_payload.message;
|
|
51
|
-
if (!user) throw new Error("No session user");
|
|
52
|
-
return app.call().get("frappe.core.doctype.user.user.get_roles", {
|
|
53
|
-
uid: user
|
|
54
|
-
});
|
|
55
|
-
}).then(function (res) {
|
|
56
|
-
var _res_payload;
|
|
57
|
-
var list = (_res_payload = res.payload) === null || _res_payload === void 0 ? void 0 : _res_payload.message;
|
|
58
|
-
if (!Array.isArray(list)) throw new Error("No roles returned");
|
|
59
|
-
return list;
|
|
60
|
-
});
|
|
61
|
-
rolesCache.set(baseURL, promise);
|
|
62
|
-
promise.catch(function () {
|
|
63
|
-
return rolesCache.delete(baseURL);
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
promise.then(function (list) {
|
|
67
|
-
if (!cancelled) setRoles(list);
|
|
68
|
-
}).catch(function () {
|
|
69
|
-
if (!cancelled) setRoles(void 0);
|
|
70
|
-
});
|
|
71
|
-
return function () {
|
|
72
|
-
cancelled = true;
|
|
73
|
-
};
|
|
74
|
-
}, [app, fixtures, baseURL]);
|
|
75
33
|
return {
|
|
76
|
-
roles
|
|
34
|
+
roles: (0, import_frappe_ui.useSessionRoles)(config)
|
|
77
35
|
};
|
|
78
36
|
}
|
|
79
37
|
//# sourceMappingURL=useUserRoles.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty"
|
|
1
|
+
{"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty"],"sources":["../../../src/shared/useUserRoles.ts"],"sourcesContent":[null],"mappings":"AAQA,YAAS;;AAEF,IAAAA,SAAS,GAAAC,MAAA,CAAAC,cAAqC;AACnD,IAAAC,gBAAe,GAAAF,MAAA,CAAAG,wBAAgB;AAC/B,IAAAC,iBAAgB,GAAAJ,MAAA,CAAAK,mBAAwB;AAC1C,IAAAC,YAAA,GAAAN,MAAA,CAAAO,SAAA,CAAAC,cAAA","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplatform.one/backoffice",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.16.0",
|
|
4
4
|
"description": "Embeddable Frappe desk recreation (backoffice) for the multiplatform.one stack",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"backoffice",
|
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
],
|
|
16
16
|
"homepage": "https://multiplatform.one",
|
|
17
17
|
"bugs": {
|
|
18
|
-
"url": "https://
|
|
18
|
+
"url": "https://projects.corp.bitspur.com/tracker/MPO",
|
|
19
19
|
"email": "support@risserlabs.com"
|
|
20
20
|
},
|
|
21
21
|
"license": "Apache-2.0",
|
|
22
22
|
"author": "BitSpur <support@risserlabs.com> (https://risserlabs.com)",
|
|
23
23
|
"repository": {
|
|
24
24
|
"type": "git",
|
|
25
|
-
"url": "git+https://
|
|
25
|
+
"url": "git+https://git.corp.bitspur.com/multiplatform.one/mpo.git",
|
|
26
26
|
"directory": "public/backoffice"
|
|
27
27
|
},
|
|
28
28
|
"source": "src/index.ts",
|
|
@@ -71,21 +71,21 @@
|
|
|
71
71
|
"access": "public"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@multiplatform.one/components": "7.
|
|
75
|
-
"@multiplatform.one/forms": "7.
|
|
76
|
-
"@multiplatform.one/frappe": "7.
|
|
77
|
-
"@multiplatform.one/frappe-ui": "7.
|
|
78
|
-
"@multiplatform.one/i18n": "7.
|
|
79
|
-
"@multiplatform.one/platform": "7.
|
|
80
|
-
"@multiplatform.one/store": "7.
|
|
81
|
-
"@multiplatform.one/table": "7.
|
|
82
|
-
"@multiplatform.one/theme": "7.
|
|
74
|
+
"@multiplatform.one/components": "7.16.0",
|
|
75
|
+
"@multiplatform.one/forms": "7.16.0",
|
|
76
|
+
"@multiplatform.one/frappe": "7.16.0",
|
|
77
|
+
"@multiplatform.one/frappe-ui": "7.16.0",
|
|
78
|
+
"@multiplatform.one/i18n": "7.16.0",
|
|
79
|
+
"@multiplatform.one/platform": "7.16.0",
|
|
80
|
+
"@multiplatform.one/store": "7.16.0",
|
|
81
|
+
"@multiplatform.one/table": "7.16.0",
|
|
82
|
+
"@multiplatform.one/theme": "7.16.0",
|
|
83
83
|
"@phosphor-icons/react": "^2.1.10",
|
|
84
84
|
"tamagui": "2.7.6"
|
|
85
85
|
},
|
|
86
86
|
"devDependencies": {
|
|
87
|
-
"@multiplatform.one/config": "7.
|
|
88
|
-
"@multiplatform.one/test-utils": "7.
|
|
87
|
+
"@multiplatform.one/config": "7.16.0",
|
|
88
|
+
"@multiplatform.one/test-utils": "7.16.0",
|
|
89
89
|
"@tamagui/build": "2.7.6",
|
|
90
90
|
"@testing-library/react": "^16.3.2",
|
|
91
91
|
"@types/react-dom": "^19.2.3",
|
package/src/desk/Desk.spec.tsx
CHANGED
|
@@ -7,7 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import React from "react";
|
|
9
9
|
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
FrappeProvider,
|
|
12
|
+
getFieldComponent,
|
|
13
|
+
useFieldResolver,
|
|
14
|
+
useFrappeConfig,
|
|
15
|
+
} from "@multiplatform.one/frappe-ui";
|
|
11
16
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
12
17
|
import { fireEvent, screen, waitFor } from "@testing-library/react";
|
|
13
18
|
import { describe, expect, it, vi } from "vitest";
|
|
@@ -329,3 +334,29 @@ describe("<Desk /> chrome narrowings", () => {
|
|
|
329
334
|
expect(screen.getByTestId("probe-new").textContent).toContain('"ToDo"');
|
|
330
335
|
});
|
|
331
336
|
});
|
|
337
|
+
|
|
338
|
+
describe("<Desk frappe> under an ambient FrappeProvider", () => {
|
|
339
|
+
const AMBIENT_HOST = "https://ambient.mock.test";
|
|
340
|
+
|
|
341
|
+
function ConnectionProbe() {
|
|
342
|
+
return <div data-testid="probe-connection">{useFrappeConfig()?.baseURL}</div>;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
it("an explicit frappe prop wins over the ambient provider", () => {
|
|
346
|
+
renderWithProviders(
|
|
347
|
+
<FrappeProvider baseURL={AMBIENT_HOST} fixtures={makeFixtures()}>
|
|
348
|
+
<Desk frappe={frappe()} doctype="ToDo" surfaces={{ list: ConnectionProbe }} />
|
|
349
|
+
</FrappeProvider>,
|
|
350
|
+
);
|
|
351
|
+
expect(screen.getByTestId("probe-connection").textContent).toBe(MOCK_HOST);
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it("an omitted frappe prop inherits the ambient provider", () => {
|
|
355
|
+
renderWithProviders(
|
|
356
|
+
<FrappeProvider baseURL={AMBIENT_HOST} fixtures={makeFixtures()}>
|
|
357
|
+
<Desk doctype="ToDo" surfaces={{ list: ConnectionProbe }} />
|
|
358
|
+
</FrappeProvider>,
|
|
359
|
+
);
|
|
360
|
+
expect(screen.getByTestId("probe-connection").textContent).toBe(AMBIENT_HOST);
|
|
361
|
+
});
|
|
362
|
+
});
|
package/src/desk/Desk.tsx
CHANGED
|
@@ -43,10 +43,10 @@ export type DeskChrome = "full" | "bare" | "content";
|
|
|
43
43
|
export interface DeskProps {
|
|
44
44
|
// ─── connection ────────────────────────────────────────────────────────
|
|
45
45
|
/**
|
|
46
|
-
* Frappe connection.
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
46
|
+
* Frappe connection. Wins over an ambient FrappeProvider; omit it to
|
|
47
|
+
* inherit the ambient one. The SyncModule is shared per baseURL, socket
|
|
48
|
+
* target and syncOptions, so a config matching the ambient one on all
|
|
49
|
+
* three also shares its auth.
|
|
50
50
|
*/
|
|
51
51
|
frappe?: BackofficeFrappeConfig;
|
|
52
52
|
|
|
@@ -168,22 +168,16 @@ export function Desk(props: DeskProps) {
|
|
|
168
168
|
[doctype, name, view, workspace, report, path],
|
|
169
169
|
);
|
|
170
170
|
|
|
171
|
-
// ── connection:
|
|
171
|
+
// ── connection: the prop, else an ambient provider, else no bench ─────
|
|
172
172
|
const ambient = useFrappeConfig();
|
|
173
|
-
const warned = useRef(false);
|
|
174
|
-
if (ambient && props.frappe && !warned.current) {
|
|
175
|
-
warned.current = true;
|
|
176
|
-
console.warn(
|
|
177
|
-
"[backoffice] <Desk frappe> is ignored: an ambient FrappeProvider exists and the SyncModule is cached per baseURL.",
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
173
|
const frappe = useMemo<BackofficeFrappeConfig>(() => {
|
|
174
|
+
if (props.frappe) return props.frappe;
|
|
181
175
|
if (ambient) {
|
|
182
176
|
// A fixtures-only provider carries no baseURL; "" is this config's
|
|
183
|
-
// existing "no bench" value
|
|
177
|
+
// existing "no bench" value.
|
|
184
178
|
return { baseURL: ambient.baseURL ?? "", auth: ambient.auth, fixtures: ambient.fixtures };
|
|
185
179
|
}
|
|
186
|
-
return
|
|
180
|
+
return { baseURL: "" };
|
|
187
181
|
}, [ambient, props.frappe]);
|
|
188
182
|
|
|
189
183
|
// ── navigation: host adapter, else internal memory (seeded once) ──────
|
package/src/desk/DeskSurface.tsx
CHANGED
|
@@ -110,14 +110,13 @@ export function DeskSurface({
|
|
|
110
110
|
<NewDocSurface doctype={target.doctype} defaults={target.defaults} readOnly={readOnly} />
|
|
111
111
|
);
|
|
112
112
|
case "form":
|
|
113
|
-
// MPO-15: DocFormScreen is the strong form today. The engine
|
|
114
|
-
// (formLayout + useFormEngine)
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
// set_only_once
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
// nowhere else.
|
|
113
|
+
// MPO-15: DocFormScreen is the strong form today. The engine
|
|
114
|
+
// (formLayout + useFormEngine) lives in frappe-ui and FrappeForm now
|
|
115
|
+
// reads the one lossless meta model, but it still maps fields itself
|
|
116
|
+
// instead of through buildFormTabs, so it does not render permlevel,
|
|
117
|
+
// fetch_from, set_only_once or the *_depends_on chains yet. When it
|
|
118
|
+
// does, the exported FrappeForm becomes this branch's renderer. Swap
|
|
119
|
+
// here, nowhere else.
|
|
121
120
|
return <DocFormScreen doctype={target.doctype} name={target.name} readOnly={readOnly} />;
|
|
122
121
|
case "report":
|
|
123
122
|
return <QueryReportScreen reportName={target.reportName} />;
|
|
@@ -8,7 +8,7 @@ import React from "react";
|
|
|
8
8
|
* desk (the tiptap-v3 TextEditor regression turned "broken editor" into
|
|
9
9
|
* "blank screen", QuickEntry case included).
|
|
10
10
|
*/
|
|
11
|
-
import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
|
|
11
|
+
import { InMemoryFixtureProvider, type FrappeFieldType } from "@multiplatform.one/frappe";
|
|
12
12
|
import { FrappeProvider, registerField, type FieldRenderProps } from "@multiplatform.one/frappe-ui";
|
|
13
13
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
14
14
|
import { fireEvent, screen, waitFor } from "@testing-library/react";
|
|
@@ -30,7 +30,9 @@ function CrashProbeField({ label }: FieldRenderProps) {
|
|
|
30
30
|
return <div data-testid="crash-probe-recovered">{label ?? "recovered"}</div>;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
const crashProbe = "Crash Probe" as FrappeFieldType;
|
|
34
|
+
|
|
35
|
+
registerField(crashProbe, CrashProbeField);
|
|
34
36
|
|
|
35
37
|
// ---------------------------------------------------------------------------
|
|
36
38
|
// Fixtures
|
|
@@ -73,7 +75,7 @@ const quickEntryMeta: DoctypeMeta = {
|
|
|
73
75
|
quick_entry: 1,
|
|
74
76
|
fields: [
|
|
75
77
|
{ fieldname: "title", fieldtype: "Data", label: "Title", reqd: 1 },
|
|
76
|
-
{ fieldname: "boom", fieldtype:
|
|
78
|
+
{ fieldname: "boom", fieldtype: crashProbe, label: "Boom", allow_in_quick_entry: 1 },
|
|
77
79
|
],
|
|
78
80
|
};
|
|
79
81
|
|
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
* post → wait for ack → refetch docinfo → first reveal ~1.7s after the
|
|
8
8
|
* press (measured against the live bench).
|
|
9
9
|
*
|
|
10
|
-
* The add_comment RPC
|
|
11
|
-
* with a gate on the POST, so the specs can
|
|
12
|
-
* server round-trip.
|
|
10
|
+
* The add_comment RPC, the docinfo load and the Comment collection read are
|
|
11
|
+
* stubbed at the fetch layer with a gate on the POST, so the specs can
|
|
12
|
+
* assert what renders DURING the server round-trip. An HTTP-only
|
|
13
|
+
* FrappeProvider gets a live Comment collection since MPO-270, so the
|
|
14
|
+
* stub answers that read as the bench would: seed plus every acked comment.
|
|
13
15
|
*/
|
|
14
16
|
|
|
15
17
|
import React from "react";
|
|
@@ -52,7 +54,8 @@ interface StubOptions {
|
|
|
52
54
|
|
|
53
55
|
/**
|
|
54
56
|
* Fetch stub covering exactly what this screen calls: get_docinfo (GET),
|
|
55
|
-
* the CSRF bootstrap, and the add_comment POST
|
|
57
|
+
* the Comment collection read, the CSRF bootstrap, and the add_comment POST
|
|
58
|
+
* (delegated to the gate).
|
|
56
59
|
*/
|
|
57
60
|
function stubFetch({ docname, onAddComment }: StubOptions) {
|
|
58
61
|
const jsonResponse = (payload: unknown, status = 200) =>
|
|
@@ -60,6 +63,24 @@ function stubFetch({ docname, onAddComment }: StubOptions) {
|
|
|
60
63
|
status,
|
|
61
64
|
headers: { "Content-Type": "application/json" },
|
|
62
65
|
});
|
|
66
|
+
const seedComment = {
|
|
67
|
+
name: "SEED-COMMENT-1",
|
|
68
|
+
comment_type: "Comment",
|
|
69
|
+
content: "<div>seed comment</div>",
|
|
70
|
+
owner: USER,
|
|
71
|
+
creation: "2026-08-10 09:00:00",
|
|
72
|
+
};
|
|
73
|
+
const serverComments: Array<Record<string, unknown>> = [
|
|
74
|
+
{
|
|
75
|
+
...seedComment,
|
|
76
|
+
doctype: "Comment",
|
|
77
|
+
reference_doctype: "ToDo",
|
|
78
|
+
reference_name: docname,
|
|
79
|
+
comment_email: USER,
|
|
80
|
+
comment_by: "Clay Risser",
|
|
81
|
+
modified: seedComment.creation,
|
|
82
|
+
},
|
|
83
|
+
];
|
|
63
84
|
|
|
64
85
|
vi.stubGlobal(
|
|
65
86
|
"fetch",
|
|
@@ -74,15 +95,7 @@ function stubFetch({ docname, onAddComment }: StubOptions) {
|
|
|
74
95
|
doctype: "ToDo",
|
|
75
96
|
name: docname,
|
|
76
97
|
user_info: { [USER]: { fullname: "Clay Risser", name: USER } },
|
|
77
|
-
comments: [
|
|
78
|
-
{
|
|
79
|
-
name: "SEED-COMMENT-1",
|
|
80
|
-
comment_type: "Comment",
|
|
81
|
-
content: "<div>seed comment</div>",
|
|
82
|
-
owner: USER,
|
|
83
|
-
creation: "2026-08-10 09:00:00",
|
|
84
|
-
},
|
|
85
|
-
],
|
|
98
|
+
comments: [seedComment],
|
|
86
99
|
versions: [],
|
|
87
100
|
communications: [],
|
|
88
101
|
automated_messages: [],
|
|
@@ -93,8 +106,15 @@ function stubFetch({ docname, onAddComment }: StubOptions) {
|
|
|
93
106
|
},
|
|
94
107
|
});
|
|
95
108
|
}
|
|
109
|
+
if (url.includes("/api/resource/Comment")) {
|
|
110
|
+
return jsonResponse({ data: serverComments });
|
|
111
|
+
}
|
|
96
112
|
if (url.includes("frappe.desk.form.utils.add_comment")) {
|
|
97
113
|
const { status, payload } = await onAddComment();
|
|
114
|
+
const acked = payload.message;
|
|
115
|
+
if (status < 400 && acked && typeof acked === "object") {
|
|
116
|
+
serverComments.push({ ...acked, reference_doctype: "ToDo", reference_name: docname });
|
|
117
|
+
}
|
|
98
118
|
return jsonResponse(payload, status);
|
|
99
119
|
}
|
|
100
120
|
throw new Error(`Unexpected fetch in FormTimeline optimistic spec: ${url}`);
|
|
@@ -489,7 +489,13 @@ export function FormTimeline({
|
|
|
489
489
|
<Text fontSize="$3" fontWeight="400">
|
|
490
490
|
{displayName}
|
|
491
491
|
</Text>
|
|
492
|
-
{
|
|
492
|
+
{pending ? (
|
|
493
|
+
<Text fontSize="$2" color="$color10" fontStyle="italic">
|
|
494
|
+
{t("timeline.sending", "Sending…")}
|
|
495
|
+
</Text>
|
|
496
|
+
) : (
|
|
497
|
+
renderTimestamp(entry)
|
|
498
|
+
)}
|
|
493
499
|
</XStack>
|
|
494
500
|
{own && !isEditing && !isConfirming && (
|
|
495
501
|
<XStack gap="$1">
|
|
@@ -36,7 +36,6 @@ import {
|
|
|
36
36
|
useFrappeAggregate,
|
|
37
37
|
useFrappeConfig,
|
|
38
38
|
} from "@multiplatform.one/frappe-ui";
|
|
39
|
-
import type { DocTypeField } from "@multiplatform.one/frappe";
|
|
40
39
|
import type {
|
|
41
40
|
BulkAction,
|
|
42
41
|
DataTableColumn,
|
|
@@ -452,7 +451,7 @@ export function DoctypeListScreen({
|
|
|
452
451
|
const filterableFields = useMemo<FilterableField[] | undefined>(() => {
|
|
453
452
|
if (!meta?.fields) return undefined;
|
|
454
453
|
return [
|
|
455
|
-
...docFieldsToFilterFields(meta.fields
|
|
454
|
+
...docFieldsToFilterFields(meta.fields),
|
|
456
455
|
{
|
|
457
456
|
id: "_assign",
|
|
458
457
|
label: t("list.assignedTo", "Assigned To"),
|
|
@@ -547,6 +546,7 @@ export function DoctypeListScreen({
|
|
|
547
546
|
if (!app) return;
|
|
548
547
|
try {
|
|
549
548
|
const result = await bulkExportCsv(app, doctype, names, meta);
|
|
549
|
+
if (result.cancelled) return;
|
|
550
550
|
if (!result.downloaded) {
|
|
551
551
|
notify({
|
|
552
552
|
severity: "warning",
|
|
@@ -105,8 +105,9 @@ export function ListBulkActionsBar({
|
|
|
105
105
|
setExporting(true);
|
|
106
106
|
try {
|
|
107
107
|
const result = await bulkExportCsv(app, doctype, selectedNames, meta);
|
|
108
|
+
if (result.cancelled) return;
|
|
108
109
|
if (!result.downloaded) {
|
|
109
|
-
// KNOWN GAP: no
|
|
110
|
+
// KNOWN GAP: no save path on GTK yet.
|
|
110
111
|
notify({
|
|
111
112
|
severity: "warning",
|
|
112
113
|
scope: "page",
|