@multiplatform.one/backoffice 7.34.3 → 7.34.4

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.
Files changed (181) hide show
  1. package/dist/cjs/chrome/BackofficeAwesomebar.cjs +7 -5
  2. package/dist/cjs/chrome/BackofficeAwesomebar.native.js +7 -5
  3. package/dist/cjs/chrome/BackofficeAwesomebar.native.js.map +1 -1
  4. package/dist/cjs/chrome/CommandPalette.cjs +4 -2
  5. package/dist/cjs/chrome/CommandPalette.native.js +4 -2
  6. package/dist/cjs/chrome/CommandPalette.native.js.map +1 -1
  7. package/dist/cjs/chrome/NotificationsButton.cjs +1 -0
  8. package/dist/cjs/chrome/NotificationsButton.native.js +1 -0
  9. package/dist/cjs/chrome/NotificationsButton.native.js.map +1 -1
  10. package/dist/cjs/chrome/UserMenu.cjs +1 -1
  11. package/dist/cjs/chrome/UserMenu.native.js +1 -1
  12. package/dist/cjs/chrome/UserMenu.native.js.map +1 -1
  13. package/dist/cjs/chrome/awesomebar-data.cjs +45 -18
  14. package/dist/cjs/chrome/awesomebar-data.native.js +45 -17
  15. package/dist/cjs/chrome/awesomebar-data.native.js.map +1 -1
  16. package/dist/cjs/chrome/command-palette-model.cjs +8 -7
  17. package/dist/cjs/chrome/command-palette-model.native.js +10 -7
  18. package/dist/cjs/chrome/command-palette-model.native.js.map +1 -1
  19. package/dist/cjs/chrome/notifications-data.cjs +2 -38
  20. package/dist/cjs/chrome/notifications-data.native.js +2 -39
  21. package/dist/cjs/chrome/notifications-data.native.js.map +1 -1
  22. package/dist/cjs/chrome/user-session.cjs +19 -11
  23. package/dist/cjs/chrome/user-session.native.js +20 -13
  24. package/dist/cjs/chrome/user-session.native.js.map +1 -1
  25. package/dist/cjs/list/DoctypeListScreen.cjs +11 -5
  26. package/dist/cjs/list/DoctypeListScreen.native.js +13 -5
  27. package/dist/cjs/list/DoctypeListScreen.native.js.map +1 -1
  28. package/dist/cjs/shared/sessionUser.cjs +89 -0
  29. package/dist/cjs/shared/sessionUser.native.js +96 -0
  30. package/dist/cjs/shared/sessionUser.native.js.map +1 -0
  31. package/dist/cjs/shared/useSessionUserId.cjs +2 -26
  32. package/dist/cjs/shared/useSessionUserId.native.js +2 -28
  33. package/dist/cjs/shared/useSessionUserId.native.js.map +1 -1
  34. package/dist/cjs/shell/BackofficeShell.cjs +6 -2
  35. package/dist/cjs/shell/BackofficeShell.native.js +6 -2
  36. package/dist/cjs/shell/BackofficeShell.native.js.map +1 -1
  37. package/dist/cjs/shell/useWorkspaces.cjs +2 -31
  38. package/dist/cjs/shell/useWorkspaces.native.js +2 -35
  39. package/dist/cjs/shell/useWorkspaces.native.js.map +1 -1
  40. package/dist/esm/chrome/BackofficeAwesomebar.mjs +7 -5
  41. package/dist/esm/chrome/BackofficeAwesomebar.mjs.map +1 -1
  42. package/dist/esm/chrome/BackofficeAwesomebar.native.js +7 -5
  43. package/dist/esm/chrome/BackofficeAwesomebar.native.js.map +1 -1
  44. package/dist/esm/chrome/CommandPalette.mjs +4 -2
  45. package/dist/esm/chrome/CommandPalette.mjs.map +1 -1
  46. package/dist/esm/chrome/CommandPalette.native.js +4 -2
  47. package/dist/esm/chrome/CommandPalette.native.js.map +1 -1
  48. package/dist/esm/chrome/NotificationsButton.mjs +1 -0
  49. package/dist/esm/chrome/NotificationsButton.mjs.map +1 -1
  50. package/dist/esm/chrome/NotificationsButton.native.js +1 -0
  51. package/dist/esm/chrome/NotificationsButton.native.js.map +1 -1
  52. package/dist/esm/chrome/UserMenu.mjs +1 -1
  53. package/dist/esm/chrome/UserMenu.mjs.map +1 -1
  54. package/dist/esm/chrome/UserMenu.native.js +1 -1
  55. package/dist/esm/chrome/UserMenu.native.js.map +1 -1
  56. package/dist/esm/chrome/awesomebar-data.mjs +45 -18
  57. package/dist/esm/chrome/awesomebar-data.mjs.map +1 -1
  58. package/dist/esm/chrome/awesomebar-data.native.js +45 -17
  59. package/dist/esm/chrome/awesomebar-data.native.js.map +1 -1
  60. package/dist/esm/chrome/command-palette-model.mjs +8 -7
  61. package/dist/esm/chrome/command-palette-model.mjs.map +1 -1
  62. package/dist/esm/chrome/command-palette-model.native.js +10 -7
  63. package/dist/esm/chrome/command-palette-model.native.js.map +1 -1
  64. package/dist/esm/chrome/notifications-data.mjs +3 -39
  65. package/dist/esm/chrome/notifications-data.mjs.map +1 -1
  66. package/dist/esm/chrome/notifications-data.native.js +3 -40
  67. package/dist/esm/chrome/notifications-data.native.js.map +1 -1
  68. package/dist/esm/chrome/user-session.mjs +19 -11
  69. package/dist/esm/chrome/user-session.mjs.map +1 -1
  70. package/dist/esm/chrome/user-session.native.js +20 -13
  71. package/dist/esm/chrome/user-session.native.js.map +1 -1
  72. package/dist/esm/list/DoctypeListScreen.mjs +12 -6
  73. package/dist/esm/list/DoctypeListScreen.mjs.map +1 -1
  74. package/dist/esm/list/DoctypeListScreen.native.js +14 -6
  75. package/dist/esm/list/DoctypeListScreen.native.js.map +1 -1
  76. package/dist/esm/shared/sessionUser.mjs +61 -0
  77. package/dist/esm/shared/sessionUser.mjs.map +1 -0
  78. package/dist/esm/shared/sessionUser.native.js +65 -0
  79. package/dist/esm/shared/sessionUser.native.js.map +1 -0
  80. package/dist/esm/shared/useSessionUserId.mjs +2 -26
  81. package/dist/esm/shared/useSessionUserId.mjs.map +1 -1
  82. package/dist/esm/shared/useSessionUserId.native.js +2 -28
  83. package/dist/esm/shared/useSessionUserId.native.js.map +1 -1
  84. package/dist/esm/shell/BackofficeShell.mjs +6 -2
  85. package/dist/esm/shell/BackofficeShell.mjs.map +1 -1
  86. package/dist/esm/shell/BackofficeShell.native.js +6 -2
  87. package/dist/esm/shell/BackofficeShell.native.js.map +1 -1
  88. package/dist/esm/shell/useWorkspaces.mjs +4 -33
  89. package/dist/esm/shell/useWorkspaces.mjs.map +1 -1
  90. package/dist/esm/shell/useWorkspaces.native.js +4 -37
  91. package/dist/esm/shell/useWorkspaces.native.js.map +1 -1
  92. package/dist/jsx/chrome/BackofficeAwesomebar.mjs +7 -5
  93. package/dist/jsx/chrome/BackofficeAwesomebar.mjs.map +1 -1
  94. package/dist/jsx/chrome/BackofficeAwesomebar.native.js +7 -5
  95. package/dist/jsx/chrome/BackofficeAwesomebar.native.js.map +1 -1
  96. package/dist/jsx/chrome/CommandPalette.mjs +4 -2
  97. package/dist/jsx/chrome/CommandPalette.mjs.map +1 -1
  98. package/dist/jsx/chrome/CommandPalette.native.js +4 -2
  99. package/dist/jsx/chrome/CommandPalette.native.js.map +1 -1
  100. package/dist/jsx/chrome/NotificationsButton.mjs +1 -0
  101. package/dist/jsx/chrome/NotificationsButton.mjs.map +1 -1
  102. package/dist/jsx/chrome/NotificationsButton.native.js +1 -0
  103. package/dist/jsx/chrome/NotificationsButton.native.js.map +1 -1
  104. package/dist/jsx/chrome/UserMenu.mjs +1 -1
  105. package/dist/jsx/chrome/UserMenu.mjs.map +1 -1
  106. package/dist/jsx/chrome/UserMenu.native.js +1 -1
  107. package/dist/jsx/chrome/UserMenu.native.js.map +1 -1
  108. package/dist/jsx/chrome/awesomebar-data.mjs +45 -18
  109. package/dist/jsx/chrome/awesomebar-data.mjs.map +1 -1
  110. package/dist/jsx/chrome/awesomebar-data.native.js +45 -17
  111. package/dist/jsx/chrome/awesomebar-data.native.js.map +1 -1
  112. package/dist/jsx/chrome/command-palette-model.mjs +8 -7
  113. package/dist/jsx/chrome/command-palette-model.mjs.map +1 -1
  114. package/dist/jsx/chrome/command-palette-model.native.js +10 -7
  115. package/dist/jsx/chrome/command-palette-model.native.js.map +1 -1
  116. package/dist/jsx/chrome/notifications-data.mjs +3 -39
  117. package/dist/jsx/chrome/notifications-data.mjs.map +1 -1
  118. package/dist/jsx/chrome/notifications-data.native.js +2 -39
  119. package/dist/jsx/chrome/notifications-data.native.js.map +1 -1
  120. package/dist/jsx/chrome/user-session.mjs +19 -11
  121. package/dist/jsx/chrome/user-session.mjs.map +1 -1
  122. package/dist/jsx/chrome/user-session.native.js +20 -13
  123. package/dist/jsx/chrome/user-session.native.js.map +1 -1
  124. package/dist/jsx/list/DoctypeListScreen.mjs +12 -6
  125. package/dist/jsx/list/DoctypeListScreen.mjs.map +1 -1
  126. package/dist/jsx/list/DoctypeListScreen.native.js +13 -5
  127. package/dist/jsx/list/DoctypeListScreen.native.js.map +1 -1
  128. package/dist/jsx/shared/sessionUser.mjs +61 -0
  129. package/dist/jsx/shared/sessionUser.mjs.map +1 -0
  130. package/dist/jsx/shared/sessionUser.native.js +96 -0
  131. package/dist/jsx/shared/sessionUser.native.js.map +1 -0
  132. package/dist/jsx/shared/useSessionUserId.mjs +2 -26
  133. package/dist/jsx/shared/useSessionUserId.mjs.map +1 -1
  134. package/dist/jsx/shared/useSessionUserId.native.js +2 -28
  135. package/dist/jsx/shared/useSessionUserId.native.js.map +1 -1
  136. package/dist/jsx/shell/BackofficeShell.mjs +6 -2
  137. package/dist/jsx/shell/BackofficeShell.mjs.map +1 -1
  138. package/dist/jsx/shell/BackofficeShell.native.js +6 -2
  139. package/dist/jsx/shell/BackofficeShell.native.js.map +1 -1
  140. package/dist/jsx/shell/useWorkspaces.mjs +4 -33
  141. package/dist/jsx/shell/useWorkspaces.mjs.map +1 -1
  142. package/dist/jsx/shell/useWorkspaces.native.js +2 -35
  143. package/dist/jsx/shell/useWorkspaces.native.js.map +1 -1
  144. package/package.json +12 -12
  145. package/src/chrome/BackofficeAwesomebar.tsx +11 -6
  146. package/src/chrome/CommandPalette.spec.tsx +12 -0
  147. package/src/chrome/CommandPalette.tsx +9 -7
  148. package/src/chrome/NotificationsButton.tsx +1 -0
  149. package/src/chrome/UserMenu.screen.spec.tsx +1 -1
  150. package/src/chrome/UserMenu.tsx +1 -1
  151. package/src/chrome/awesomebar-data.tsx +28 -19
  152. package/src/chrome/command-palette-model.spec.tsx +148 -0
  153. package/src/chrome/command-palette-model.ts +13 -5
  154. package/src/chrome/notifications-data.tsx +3 -50
  155. package/src/chrome/user-session.tsx +20 -15
  156. package/src/form/DocFormScreen.guest.screen.spec.tsx +3 -3
  157. package/src/list/DoctypeListScreen.guest.screen.spec.tsx +82 -3
  158. package/src/list/DoctypeListScreen.tsx +19 -13
  159. package/src/report/DoctypeReportView.screen.spec.tsx +12 -0
  160. package/src/shared/sessionUser.spec.tsx +106 -0
  161. package/src/shared/sessionUser.ts +59 -0
  162. package/src/shared/useSessionUserId.ts +2 -40
  163. package/src/shell/BackofficeShell.spec.tsx +31 -2
  164. package/src/shell/BackofficeShell.tsx +5 -3
  165. package/src/shell/useWorkspaces.ts +5 -56
  166. package/types/chrome/BackofficeAwesomebar.d.ts.map +1 -1
  167. package/types/chrome/NotificationsButton.d.ts.map +1 -1
  168. package/types/chrome/awesomebar-data.d.ts +4 -3
  169. package/types/chrome/awesomebar-data.d.ts.map +1 -1
  170. package/types/chrome/command-palette-model.d.ts +1 -0
  171. package/types/chrome/command-palette-model.d.ts.map +1 -1
  172. package/types/chrome/notifications-data.d.ts.map +1 -1
  173. package/types/chrome/user-session.d.ts.map +1 -1
  174. package/types/list/DoctypeListScreen.d.ts.map +1 -1
  175. package/types/shared/sessionUser.d.ts +9 -0
  176. package/types/shared/sessionUser.d.ts.map +1 -0
  177. package/types/shared/useSessionUserId.d.ts +0 -4
  178. package/types/shared/useSessionUserId.d.ts.map +1 -1
  179. package/types/shell/BackofficeShell.d.ts.map +1 -1
  180. package/types/shell/useWorkspaces.d.ts +0 -5
  181. package/types/shell/useWorkspaces.d.ts.map +1 -1
@@ -1,39 +1,10 @@
1
- import { HttpClient, useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
1
+ import { useFrappeCollection, useLiveQuery } from "@multiplatform.one/frappe";
2
2
  import { useFrappeConfig } from "@multiplatform.one/frappe-ui";
3
- import { useEffect, useMemo, useState } from "react";
3
+ import { useMemo } from "react";
4
+ import { useSessionUserId } from "../shared/useSessionUserId.mjs";
4
5
  const WORKSPACE_FIELDS = ["name", "title", "icon", "parent_page", "public", "for_user", "sequence_id", "module", "is_hidden"];
5
- const sessionUserCache = /* @__PURE__ */new Map();
6
- async function fetchSessionUser(baseURL, auth) {
7
- const client = new HttpClient(baseURL, auth);
8
- const res = await client.get("/api/method/frappe.auth.get_logged_user");
9
- const user = res.payload?.message;
10
- return user && user !== "Guest" ? user : void 0;
11
- }
12
6
  function useSessionUser() {
13
- const config = useFrappeConfig();
14
- const baseURL = config?.baseURL;
15
- const auth = config?.auth;
16
- const fixtures = config?.fixtures;
17
- const [user, setUser] = useState(void 0);
18
- useEffect(() => {
19
- if (fixtures || !baseURL) return;
20
- let cancelled = false;
21
- let promise = sessionUserCache.get(baseURL);
22
- if (!promise) {
23
- promise = fetchSessionUser(baseURL, auth).catch(() => {
24
- sessionUserCache.delete(baseURL);
25
- return void 0;
26
- });
27
- sessionUserCache.set(baseURL, promise);
28
- }
29
- promise.then(value => {
30
- if (!cancelled) setUser(value);
31
- });
32
- return () => {
33
- cancelled = true;
34
- };
35
- }, [baseURL, fixtures]);
36
- return user;
7
+ return useSessionUserId();
37
8
  }
38
9
  function bySequence(a, b) {
39
10
  const seqA = Number(a.sequence_id ?? 0);
@@ -1 +1 @@
1
- {"version":3,"names":["HttpClient","useFrappeCollection","useLiveQuery","useFrappeConfig","useEffect","useMemo","useState","WORKSPACE_FIELDS","sessionUserCache","Map","fetchSessionUser","baseURL","auth","client","res","get","user","payload","message","useSessionUser","config","fixtures","setUser","cancelled","promise","catch","delete","set","then","value","bySequence","a","b","seqA","Number","sequence_id","seqB","title","name","localeCompare","useWorkspaces","sessionUser","connectionConfig","socketPort","siteName","socketBaseURL","syncOptions","socketOptions","collection","fields","data","rawData","isLoading","q","from","_workspace","all","filter","w","is_hidden","sort","privateWorkspaces","public","for_user","publicWorkspaces","Boolean","publicNames","Set","map","publicRoots","childrenByParent","workspace","parent_page","has","siblings","push","workspaces","useDefaultWorkspace"],"sources":["../../../src/shell/useWorkspaces.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useFrappeCollection","useLiveQuery","useFrappeConfig","useMemo","useSessionUserId","WORKSPACE_FIELDS","useSessionUser","bySequence","a","b","seqA","Number","sequence_id","seqB","title","name","localeCompare","useWorkspaces","config","sessionUser","connectionConfig","baseURL","socketPort","siteName","socketBaseURL","auth","syncOptions","socketOptions","fixtures","collection","fields","data","rawData","isLoading","q","from","_workspace","all","filter","w","is_hidden","sort","privateWorkspaces","public","for_user","publicWorkspaces","Boolean","publicNames","Set","map","publicRoots","childrenByParent","Map","workspace","parent_page","has","siblings","get","push","set","workspaces","useDefaultWorkspace"],"sources":["../../../src/shell/useWorkspaces.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -32,43 +32,10 @@ module.exports = __toCommonJS(useWorkspaces_exports);
32
32
  var import_frappe = require("@multiplatform.one/frappe");
33
33
  var import_frappe_ui = require("@multiplatform.one/frappe-ui");
34
34
  var import_react = require("react");
35
+ var import_useSessionUserId = require("../shared/useSessionUserId.native.js");
35
36
  var WORKSPACE_FIELDS = ["name", "title", "icon", "parent_page", "public", "for_user", "sequence_id", "module", "is_hidden"];
36
- var sessionUserCache = /* @__PURE__ */new Map();
37
- async function fetchSessionUser(baseURL, auth) {
38
- var _res_payload;
39
- var client = new import_frappe.HttpClient(baseURL, auth);
40
- var res = await client.get("/api/method/frappe.auth.get_logged_user");
41
- var user = (_res_payload = res.payload) === null || _res_payload === void 0 ? void 0 : _res_payload.message;
42
- return user && user !== "Guest" ? user : void 0;
43
- }
44
37
  function useSessionUser() {
45
- var config = (0, import_frappe_ui.useFrappeConfig)();
46
- var baseURL = config === null || config === void 0 ? void 0 : config.baseURL;
47
- var auth = config === null || config === void 0 ? void 0 : config.auth;
48
- var fixtures = config === null || config === void 0 ? void 0 : config.fixtures;
49
- var [user, setUser] = (0, import_react.useState)(void 0);
50
- (0, import_react.useEffect)(function () {
51
- if (fixtures || !baseURL) return;
52
- var cancelled = false;
53
- var promise = sessionUserCache.get(baseURL);
54
- if (!promise) {
55
- promise = fetchSessionUser(baseURL, auth).catch(function () {
56
- sessionUserCache.delete(baseURL);
57
- return void 0;
58
- });
59
- sessionUserCache.set(baseURL, promise);
60
- }
61
- promise.then(function (value) {
62
- if (!cancelled) setUser(value);
63
- });
64
- return function () {
65
- cancelled = true;
66
- };
67
- },
68
- // `auth` is session-stable; the cache is keyed by baseURL.
69
- // oxlint-disable-next-line exhaustive-deps
70
- [baseURL, fixtures]);
71
- return user;
38
+ return (0, import_useSessionUserId.useSessionUserId)();
72
39
  }
73
40
  function bySequence(a, b) {
74
41
  var _a_sequence_id, _b_sequence_id;
@@ -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","useWorkspaces_exports","useDefaultWorkspace","useSessionUser","useWorkspaces","module","exports","import_frappe","require","import_frappe_ui","import_react","WORKSPACE_FIELDS","sessionUserCache","Map","fetchSessionUser","baseURL","auth","_res_payload","client","HttpClient","res","user","payload","message","config","useFrappeConfig","fixtures","setUser","useState","useEffect","cancelled","promise","catch","delete","set","then","bySequence","a","b","_a_sequence_id","_b_sequence_id","seqA","Number","sequence_id","seqB","title","localeCompare","sessionUser","connectionConfig","useMemo","socketPort","siteName","socketBaseURL","syncOptions","socketOptions","collection","useFrappeCollection","fields","data","rawData","isLoading","useLiveQuery","q","_workspace"],"sources":["../../../src/shell/useWorkspaces.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
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","useWorkspaces_exports","useDefaultWorkspace","useSessionUser","useWorkspaces","module","exports","import_frappe","require","import_frappe_ui","import_react","import_useSessionUserId","WORKSPACE_FIELDS","useSessionUserId","bySequence","a","b","_a_sequence_id","_b_sequence_id","seqA","Number","sequence_id","seqB","title","localeCompare","config","useFrappeConfig","sessionUser","connectionConfig","useMemo","baseURL","socketPort","siteName","socketBaseURL","auth","syncOptions","socketOptions","fixtures","collection","useFrappeCollection","fields","data","rawData","isLoading","useLiveQuery","q","_workspace","filter","w"],"sources":["../../../src/shell/useWorkspaces.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/backoffice",
3
- "version": "7.34.3",
3
+ "version": "7.34.4",
4
4
  "description": "Embeddable Frappe desk recreation (backoffice) for the multiplatform.one stack",
5
5
  "keywords": [
6
6
  "backoffice",
@@ -71,21 +71,21 @@
71
71
  "access": "public"
72
72
  },
73
73
  "dependencies": {
74
- "@multiplatform.one/components": "^7.34.3",
75
- "@multiplatform.one/forms": "^7.34.3",
76
- "@multiplatform.one/frappe": "^7.34.3",
77
- "@multiplatform.one/frappe-ui": "^7.34.3",
78
- "@multiplatform.one/i18n": "^7.34.3",
79
- "@multiplatform.one/platform": "^7.34.3",
80
- "@multiplatform.one/store": "^7.34.3",
81
- "@multiplatform.one/table": "^7.34.3",
82
- "@multiplatform.one/theme": "^7.34.3",
74
+ "@multiplatform.one/components": "^7.34.4",
75
+ "@multiplatform.one/forms": "^7.34.4",
76
+ "@multiplatform.one/frappe": "^7.34.4",
77
+ "@multiplatform.one/frappe-ui": "^7.34.4",
78
+ "@multiplatform.one/i18n": "^7.34.4",
79
+ "@multiplatform.one/platform": "^7.34.4",
80
+ "@multiplatform.one/store": "^7.34.4",
81
+ "@multiplatform.one/table": "^7.34.4",
82
+ "@multiplatform.one/theme": "^7.34.4",
83
83
  "@phosphor-icons/react": "^2.1.10",
84
84
  "tamagui": "2.7.6"
85
85
  },
86
86
  "devDependencies": {
87
- "@multiplatform.one/config": "7.34.3",
88
- "@multiplatform.one/test-utils": "7.34.3",
87
+ "@multiplatform.one/config": "7.34.4",
88
+ "@multiplatform.one/test-utils": "7.34.4",
89
89
  "@tamagui/build": "2.7.6",
90
90
  "@testing-library/react": "^16.3.3",
91
91
  "@types/react-dom": "^19.2.3",
@@ -54,9 +54,13 @@ export function BackofficeAwesomebar({ focusRef }: BackofficeAwesomebarProps = {
54
54
  <>
55
55
  <Button
56
56
  size="$3"
57
- flex={1}
57
+ flex={isCompact ? undefined : 1}
58
+ flexShrink={0}
59
+ circular={isCompact}
60
+ chromeless={isCompact}
58
61
  minWidth={0}
59
- justifyContent="flex-start"
62
+ justifyContent={isCompact ? "center" : "flex-start"}
63
+ icon={MagnifyingGlassIcon}
60
64
  aria-label={label}
61
65
  aria-haspopup="dialog"
62
66
  aria-expanded={open}
@@ -64,10 +68,11 @@ export function BackofficeAwesomebar({ focusRef }: BackofficeAwesomebarProps = {
64
68
  onPress={() => setOpen(true)}
65
69
  data-testid="backoffice-awesomebar"
66
70
  >
67
- <MagnifyingGlassIcon size={16} />
68
- <Text flex={1} minWidth={0} numberOfLines={1} textAlign="left" color="$color10">
69
- {label}
70
- </Text>
71
+ {!isCompact && (
72
+ <Text flex={1} minWidth={0} numberOfLines={1} textAlign="left" color="$color10">
73
+ {label}
74
+ </Text>
75
+ )}
71
76
  {showShortcutHint && (
72
77
  <XStack
73
78
  borderWidth={1}
@@ -358,3 +358,15 @@ describe("CommandPalette standalone (story shape)", () => {
358
358
  expect(onOpenChange).toHaveBeenCalledWith(false);
359
359
  });
360
360
  });
361
+
362
+ it("shows search unavailable while local navigation remains", async () => {
363
+ vi.stubGlobal("fetch", async () =>
364
+ Response.json({ exc_type: "PermissionError" }, { status: 403 }),
365
+ );
366
+ renderShell();
367
+ const { input } = await openPalette();
368
+ fireEvent.change(input, { target: { value: "todo" } });
369
+ await waitFor(() => expect(screen.getByText("Search unavailable")).toBeTruthy());
370
+ findOption("Todos");
371
+ expect(screen.queryByTestId("backoffice-palette-section-documents")).toBeNull();
372
+ });
@@ -454,7 +454,7 @@ function PaletteResults({
454
454
  // (combobox focus stays on the search input). Accent + readable ink
455
455
  // (LC-05) so selected + unselected stay one emphasis system.
456
456
  const onAccent = useReadableTextOn("$accentBackground");
457
- const { sections, searching, hasQuery, noResults, query } = model;
457
+ const { sections, searching, searchUnavailable, hasQuery, noResults, query } = model;
458
458
 
459
459
  let flatIndex = -1;
460
460
 
@@ -565,13 +565,15 @@ function PaletteResults({
565
565
  </XStack>
566
566
  )}
567
567
 
568
- {noResults && (
568
+ {(noResults || (hasQuery && searchUnavailable)) && (
569
569
  <XStack paddingHorizontal="$3" paddingVertical="$3">
570
- <Text fontSize="$2" color="$color10" {...knobProps.body}>
571
- {t("awesomebar.noResults", {
572
- defaultValue: "No results for “{{query}}”",
573
- query: model.query,
574
- })}
570
+ <Text role="status" fontSize="$2" color="$color10" {...knobProps.body}>
571
+ {searchUnavailable
572
+ ? t("awesomebar.searchUnavailable", "Search unavailable")
573
+ : t("awesomebar.noResults", {
574
+ defaultValue: "No results for “{{query}}”",
575
+ query: model.query,
576
+ })}
575
577
  </Text>
576
578
  </XStack>
577
579
  )}
@@ -67,6 +67,7 @@ export function NotificationsButton() {
67
67
  fitContent
68
68
  contentPadding="none"
69
69
  triggerA11y={{ label }}
70
+ triggerSizing="content"
70
71
  trigger={
71
72
  <Badge count={unreadCount} max={99}>
72
73
  <Button
@@ -77,7 +77,7 @@ describe("UserMenu", () => {
77
77
  it("disables the profile items while no session user resolves", async () => {
78
78
  loggedUser = null;
79
79
  renderMenu();
80
- await waitFor(() => expect(calls).toContain("/api/method/frappe.auth.get_logged_user"));
80
+ await screen.findByText("Guest");
81
81
  await waitFor(() => expect(item("My Profile").getAttribute("aria-disabled")).toBe("true"));
82
82
  expect(item("My Settings").getAttribute("aria-disabled")).toBe("true");
83
83
  expect(screen.queryByText("Jane Cooper")).toBeNull();
@@ -34,7 +34,7 @@ export function UserMenu({ defaultOpen }: UserMenuProps = {}) {
34
34
  const app = useFrappeApp();
35
35
  const frappeConfig = useFrappeConfig();
36
36
  const { info } = useSessionUserInfo();
37
- const sessionUser = info?.user;
37
+ const sessionUser = info?.user === "Guest" ? undefined : info?.user;
38
38
 
39
39
  const handleLogout = useCallback(async () => {
40
40
  try {
@@ -92,7 +92,7 @@ export interface AwesomebarCatalogState {
92
92
  * honored in stories/tests), fetched once per session. SSR-safe: the fetch
93
93
  * runs in an effect. Without a provider the catalog stays empty.
94
94
  */
95
- export function useAwesomebarCatalog(): AwesomebarCatalogState {
95
+ export function useAwesomebarCatalog(enabled = true): AwesomebarCatalogState {
96
96
  const config = useFrappeConfig();
97
97
  const baseURL = config?.baseURL;
98
98
  const fixtures = config?.fixtures;
@@ -102,7 +102,7 @@ export function useAwesomebarCatalog(): AwesomebarCatalogState {
102
102
  const [error, setError] = useState(false);
103
103
 
104
104
  useEffect(() => {
105
- if (!baseURL) return;
105
+ if (!baseURL || !enabled) return;
106
106
  let cancelled = false;
107
107
  setError(false);
108
108
  getCatalog({ baseURL, auth, fixtures })
@@ -118,7 +118,7 @@ export function useAwesomebarCatalog(): AwesomebarCatalogState {
118
118
  // `auth` is intentionally not a dependency: the cache is keyed by
119
119
  // baseURL/fixtures and provider auth is stable for the session.
120
120
  // oxlint-disable-next-line exhaustive-deps
121
- }, [baseURL, fixtures]);
121
+ }, [baseURL, fixtures, enabled]);
122
122
 
123
123
  return { catalog, error };
124
124
  }
@@ -135,14 +135,15 @@ export interface GlobalSearchHit {
135
135
  }
136
136
 
137
137
  export interface GlobalSearchState {
138
+ query: string;
139
+ error: boolean;
138
140
  hits: GlobalSearchHit[];
139
141
  searching: boolean;
140
142
  }
141
143
 
142
144
  /**
143
145
  * Document hits from the desk full-text index for an (already debounced)
144
- * query. Empty query clears without fetching. Failures degrade to no hits —
145
- * the nav-command and workspace sections still render.
146
+ * query. Empty query clears without fetching. Failures preserve local navigation.
146
147
  */
147
148
  export function useGlobalSearch(query: string, limit = 10): GlobalSearchState {
148
149
  const config = useFrappeConfig();
@@ -158,17 +159,17 @@ export function useGlobalSearch(query: string, limit = 10): GlobalSearchState {
158
159
  [baseURL, authKey],
159
160
  );
160
161
 
161
- const [hits, setHits] = useState<GlobalSearchHit[]>([]);
162
- const [searching, setSearching] = useState(false);
162
+ const [result, setResult] = useState<GlobalSearchState & { client?: HttpClient }>({
163
+ query: "",
164
+ hits: [],
165
+ searching: false,
166
+ error: false,
167
+ });
163
168
 
164
169
  useEffect(() => {
165
- if (!query || !client) {
166
- setHits([]);
167
- setSearching(false);
168
- return;
169
- }
170
+ if (!query || !client) return;
170
171
  let cancelled = false;
171
- setSearching(true);
172
+ setResult({ client, query, hits: [], searching: true, error: false });
172
173
  client
173
174
  .get<{ message?: GlobalSearchHit[] }>("/api/method/frappe.utils.global_search.search", {
174
175
  text: query,
@@ -176,20 +177,28 @@ export function useGlobalSearch(query: string, limit = 10): GlobalSearchState {
176
177
  limit,
177
178
  })
178
179
  .then((response) => {
179
- if (!cancelled) setHits(response.payload?.message ?? []);
180
+ if (!cancelled)
181
+ setResult({
182
+ client,
183
+ query,
184
+ hits: response.payload?.message ?? [],
185
+ searching: false,
186
+ error: false,
187
+ });
180
188
  })
181
189
  .catch(() => {
182
- if (!cancelled) setHits([]);
183
- })
184
- .finally(() => {
185
- if (!cancelled) setSearching(false);
190
+ if (!cancelled) setResult({ client, query, hits: [], searching: false, error: true });
186
191
  });
187
192
  return () => {
188
193
  cancelled = true;
189
194
  };
190
195
  }, [client, query, limit]);
191
196
 
192
- return { hits, searching };
197
+ if (!query || !client) return { query, hits: [], searching: false, error: false };
198
+ if (result.query !== query || result.client !== client) {
199
+ return { query, hits: [], searching: true, error: false };
200
+ }
201
+ return result;
193
202
  }
194
203
 
195
204
  /**
@@ -0,0 +1,148 @@
1
+ import { act, renderHook, waitFor } from "@testing-library/react";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { useCommandPaletteModel } from "./command-palette-model";
4
+
5
+ const provider = vi.hoisted(() => ({ baseURL: "" }));
6
+ vi.mock("@multiplatform.one/frappe-ui", () => ({ useFrappeConfig: () => provider }));
7
+ vi.mock("../config/BackofficeProvider", () => ({
8
+ useBackofficePaths: () => ({
9
+ workspace: (name: string) => `/workspace/${name}`,
10
+ list: (name: string) => `/list/${name}`,
11
+ form: (doctype: string, name: string) => `/form/${doctype}/${name}`,
12
+ newDoc: (name: string) => `/new/${name}`,
13
+ view: (name: string, view: string) => `/view/${name}/${view}`,
14
+ }),
15
+ useBackofficeCapabilities: () => ({ newDoc: { enabled: false }, views: { enabled: false } }),
16
+ useIsDoctypeAllowed: () => () => true,
17
+ }));
18
+
19
+ let run = 0;
20
+ let catalogReads: string[];
21
+ beforeEach(() => {
22
+ provider.baseURL = `https://palette-model-${++run}.test`;
23
+ catalogReads = [];
24
+ vi.stubGlobal("fetch", async (input: string | URL | Request) => {
25
+ const url = new URL(String(input instanceof Request ? input.url : input));
26
+ catalogReads.push(url.pathname);
27
+ return Response.json(
28
+ url.pathname.includes("Workspace")
29
+ ? { data: [{ name: "Sales", title: "Sales" }] }
30
+ : { message: [{ name: "ToDo" }] },
31
+ );
32
+ });
33
+ });
34
+ afterEach(() => vi.unstubAllGlobals());
35
+
36
+ describe("command palette catalog", () => {
37
+ it("waits until opened and shares the catalog on reopening", async () => {
38
+ const { rerender } = renderHook(
39
+ ({ open }) => useCommandPaletteModel({ query: "", debouncedQuery: "", open }),
40
+ {
41
+ initialProps: { open: false },
42
+ },
43
+ );
44
+ await act(async () => {});
45
+ expect(catalogReads).toEqual([]);
46
+ rerender({ open: true });
47
+ await waitFor(() => expect(catalogReads).toHaveLength(2));
48
+ expect(catalogReads.filter((path) => path.includes("Workspace"))).toHaveLength(1);
49
+ expect(catalogReads.filter((path) => path.includes("get_list"))).toHaveLength(1);
50
+ rerender({ open: false });
51
+ rerender({ open: true });
52
+ await act(async () => {});
53
+ expect(catalogReads).toHaveLength(2);
54
+ });
55
+ });
56
+
57
+ describe("command palette search state", () => {
58
+ it("hides old hits during debounce while the current query is pending", async () => {
59
+ const answers = new Map<string, (response: Response) => void>();
60
+ vi.stubGlobal("fetch", (input: string | URL | Request) => {
61
+ const url = new URL(String(input instanceof Request ? input.url : input));
62
+ if (url.pathname.includes("global_search")) {
63
+ return new Promise<Response>((resolve) =>
64
+ answers.set(url.searchParams.get("text") ?? "", resolve),
65
+ );
66
+ }
67
+ return Promise.resolve(Response.json({ data: [], message: [] }));
68
+ });
69
+ const { result, rerender } = renderHook(
70
+ ({ query, debouncedQuery }) => useCommandPaletteModel({ query, debouncedQuery, open: true }),
71
+ {
72
+ initialProps: { query: "A", debouncedQuery: "" },
73
+ },
74
+ );
75
+ expect(result.current.searching).toBe(true);
76
+ expect(result.current.noResults).toBe(false);
77
+ rerender({ query: "A", debouncedQuery: "A" });
78
+ await waitFor(() => expect(answers.has("A")).toBe(true));
79
+ rerender({ query: "B", debouncedQuery: "A" });
80
+ expect(result.current.searching).toBe(true);
81
+ await act(async () =>
82
+ answers.get("A")?.(
83
+ Response.json({ message: [{ doctype: "ToDo", name: "A document", content: "" }] }),
84
+ ),
85
+ );
86
+ expect(result.current.items.filter((item) => item.id.startsWith("doc:"))).toEqual([]);
87
+ expect(result.current.searching).toBe(true);
88
+ rerender({ query: "B", debouncedQuery: "B" });
89
+ await waitFor(() => expect(answers.has("B")).toBe(true));
90
+ await act(async () =>
91
+ answers.get("B")?.(
92
+ Response.json({ message: [{ doctype: "ToDo", name: "B document", content: "" }] }),
93
+ ),
94
+ );
95
+ expect(result.current.items.map((item) => item.label)).toEqual(["B document"]);
96
+ expect(result.current.searching).toBe(false);
97
+ });
98
+
99
+ it("keeps local navigation after a refused remote search", async () => {
100
+ vi.stubGlobal("fetch", async (input: string | URL | Request) => {
101
+ const url = new URL(String(input instanceof Request ? input.url : input));
102
+ if (url.pathname.includes("global_search"))
103
+ return Response.json({ exc_type: "PermissionError" }, { status: 403 });
104
+ return Response.json(
105
+ url.pathname.includes("Workspace")
106
+ ? { data: [{ name: "Sales", title: "Sales" }] }
107
+ : { message: [] },
108
+ );
109
+ });
110
+ const { result } = renderHook(() =>
111
+ useCommandPaletteModel({ query: "Sa", debouncedQuery: "Sa", open: true }),
112
+ );
113
+ await waitFor(() => expect(result.current.searchUnavailable).toBe(true));
114
+ expect(result.current.items.map((item) => item.label)).toEqual(["Sales"]);
115
+ expect(result.current.noResults).toBe(false);
116
+ });
117
+ });
118
+
119
+ it("ignores A when its response arrives after B", async () => {
120
+ const answers = new Map<string, (response: Response) => void>();
121
+ vi.stubGlobal("fetch", (input: string | URL | Request) => {
122
+ const url = new URL(String(input instanceof Request ? input.url : input));
123
+ if (url.pathname.includes("global_search")) {
124
+ return new Promise<Response>((resolve) =>
125
+ answers.set(url.searchParams.get("text") ?? "", resolve),
126
+ );
127
+ }
128
+ return Promise.resolve(Response.json({ data: [], message: [] }));
129
+ });
130
+ const { result, rerender } = renderHook(
131
+ ({ query }) => useCommandPaletteModel({ query, debouncedQuery: query, open: true }),
132
+ { initialProps: { query: "A" } },
133
+ );
134
+ await waitFor(() => expect(answers.has("A")).toBe(true));
135
+ rerender({ query: "B" });
136
+ await waitFor(() => expect(answers.has("B")).toBe(true));
137
+ await act(async () =>
138
+ answers.get("B")?.(
139
+ Response.json({ message: [{ doctype: "ToDo", name: "B result", content: "" }] }),
140
+ ),
141
+ );
142
+ await act(async () =>
143
+ answers.get("A")?.(
144
+ Response.json({ message: [{ doctype: "ToDo", name: "A result", content: "" }] }),
145
+ ),
146
+ );
147
+ expect(result.current.items.map((item) => item.label)).toEqual(["B result"]);
148
+ });
@@ -76,6 +76,7 @@ export interface CommandPaletteModel {
76
76
  items: CommandPaletteItem[];
77
77
  /** Global search in flight for the debounced query. */
78
78
  searching: boolean;
79
+ searchUnavailable: boolean;
79
80
  /** The trimmed query the sections were built from. */
80
81
  query: string;
81
82
  /** Trimmed query is non-empty. */
@@ -135,8 +136,16 @@ export function useCommandPaletteModel({
135
136
  const capabilities = useBackofficeCapabilities();
136
137
  const isDoctypeAllowed = useIsDoctypeAllowed();
137
138
 
138
- const { catalog } = useAwesomebarCatalog();
139
- const { hits, searching } = useGlobalSearch(debouncedQuery);
139
+ const { catalog } = useAwesomebarCatalog(open);
140
+ const remote = useGlobalSearch(open ? debouncedQuery.trim() : "");
141
+ const trimmed = query.trim();
142
+ const searching =
143
+ open && Boolean(trimmed) && (trimmed !== debouncedQuery.trim() || remote.searching);
144
+ const searchUnavailable = open && remote.query === trimmed && remote.error;
145
+ const hits = useMemo(
146
+ () => (remote.query === trimmed ? remote.hits : []),
147
+ [remote.query, remote.hits, trimmed],
148
+ );
140
149
  const [recents, setRecents] = useState<RecentItem[]>([]);
141
150
 
142
151
  // Fresh recents on every open (another surface may have pushed a visit
@@ -152,8 +161,6 @@ export function useCommandPaletteModel({
152
161
  };
153
162
  }, [open]);
154
163
 
155
- const trimmed = query.trim();
156
-
157
164
  const sections = useMemo<CommandPaletteSection[]>(() => {
158
165
  const next: CommandPaletteSection[] = [];
159
166
 
@@ -284,8 +291,9 @@ export function useCommandPaletteModel({
284
291
  sections,
285
292
  items,
286
293
  searching,
294
+ searchUnavailable,
287
295
  query: trimmed,
288
296
  hasQuery: Boolean(trimmed),
289
- noResults: Boolean(trimmed) && !searching && items.length === 0,
297
+ noResults: Boolean(trimmed) && !searching && !searchUnavailable && items.length === 0,
290
298
  };
291
299
  }