adminizer 5.1.0-build.29 → 5.2.0-build.31

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 (117) hide show
  1. package/assets/{abnfDiagram-VCTEODGH-CpSXY7qH.js → abnfDiagram-VCTEODGH-BtJg_wq8.js} +1 -1
  2. package/assets/{add-DQWffo5j.js → add-CcMmw50d.js} +1 -1
  3. package/assets/{add-group-OdAd30ej.js → add-group-BI7Il1o9.js} +1 -1
  4. package/assets/{add-user-C6cqZSzp.js → add-user-CbTznIir.js} +1 -1
  5. package/assets/ai-assistant/agent.es.js +22295 -15655
  6. package/assets/app-Cg7dXJfk.js +138 -0
  7. package/assets/app-DM8KzeFz.css +1 -0
  8. package/assets/{arc-6oG0N2EU.js → arc-BH-jID2f.js} +1 -1
  9. package/assets/{architectureDiagram-5GKGNRK7-BO5E3Osk.js → architectureDiagram-5GKGNRK7-BmFO29Ca.js} +1 -1
  10. package/assets/{blockDiagram-I7D4REHJ-DpKAEeRQ.js → blockDiagram-I7D4REHJ-kmdi7zCh.js} +6 -6
  11. package/assets/{c4Diagram-7LVT6UL2-K4ilHoqv.js → c4Diagram-7LVT6UL2-BqfDgZbz.js} +1 -1
  12. package/assets/{catalog-BaSowP5U.js → catalog-BefPw8hG.js} +3 -3
  13. package/assets/channel-X5bzKz26.js +1 -0
  14. package/assets/{chunk-2Q5K7J3B-CFvbnPgN.js → chunk-2Q5K7J3B-5iRxjfuJ.js} +1 -1
  15. package/assets/{chunk-5VM5RSS4-Cxb3_K7a.js → chunk-5VM5RSS4-BhQiByv7.js} +1 -1
  16. package/assets/{chunk-F27PBJKO-Bp-e-RqW.js → chunk-F27PBJKO-IjJk4n9A.js} +1 -1
  17. package/assets/{chunk-IMKFNOWR-D03Bbv3p.js → chunk-IMKFNOWR-ymA9WbHJ.js} +1 -1
  18. package/assets/{chunk-JWPE2WC7-BQzIFXbt.js → chunk-JWPE2WC7-Dyix1HHX.js} +1 -1
  19. package/assets/{chunk-POPQ4Y6H-DGPhwQEk.js → chunk-POPQ4Y6H-IQ0zsMJS.js} +1 -1
  20. package/assets/{chunk-SVP7TREG-CFG2uzdK.js → chunk-SVP7TREG-CXCxziXD.js} +1 -1
  21. package/assets/{chunk-TICWLB2K-BRoATx6O.js → chunk-TICWLB2K-BcvDM7WB.js} +1 -1
  22. package/assets/{chunk-XXDRQBXY-MTSPV1jX.js → chunk-XXDRQBXY-c2W5S_dd.js} +1 -1
  23. package/assets/classDiagram-ZZMXUADV-EpRQ1LwP.js +1 -0
  24. package/assets/classDiagram-v2-VYDZK3BY-EpRQ1LwP.js +1 -0
  25. package/assets/controls/ckeditor.es.js +14708 -14424
  26. package/assets/controls/handsontable.es.js +13874 -13260
  27. package/assets/controls/jsoneditor.es.js +12752 -12627
  28. package/assets/controls/leaflet.es.js +741 -729
  29. package/assets/controls/toast-ui.es.js +16608 -16344
  30. package/assets/{cose-bilkent-JH36ORCC-Cd04LiHO.js → cose-bilkent-JH36ORCC-B5pmdKpq.js} +1 -1
  31. package/assets/{cynefin-OW5HDTMX-Cvk-t4EK.js → cynefin-OW5HDTMX-HzbUuFkc.js} +1 -1
  32. package/assets/{cynefinDiagram-5FMLGOSQ-CHBsEINZ.js → cynefinDiagram-5FMLGOSQ-DUOm6HTV.js} +1 -1
  33. package/assets/cytoscape.esm-BDkkwuE4.js +321 -0
  34. package/assets/{dagre-GXQ25YYZ-Dq-0d5Tl.js → dagre-GXQ25YYZ-Cq_xhTkE.js} +1 -1
  35. package/assets/{dashboard-BZo6F7y9.js → dashboard-D_XSE-mA.js} +1 -1
  36. package/assets/{diagram-S7CK7UJ4-BKDTPndI.js → diagram-S7CK7UJ4-BB0h2Ycq.js} +1 -1
  37. package/assets/{diagram-UQ7AKVKN-DZYq9mm9.js → diagram-UQ7AKVKN-UmvM898J.js} +1 -1
  38. package/assets/{diagram-VSXAHHWV-CVOsZwCq.js → diagram-VSXAHHWV-C3pfgVZR.js} +1 -1
  39. package/assets/{diagram-VX7I27RA-BCBXgENw.js → diagram-VX7I27RA-S-iQHosH.js} +1 -1
  40. package/assets/{diagram-Z3DM3KII-ByNHDStX.js → diagram-Z3DM3KII-wkmwXnCL.js} +1 -1
  41. package/assets/{docs-CDmOUM3P.js → docs-DmiXIQku.js} +1 -1
  42. package/assets/{ebnfDiagram-PWID7BFC-WrVgmCqC.js → ebnfDiagram-PWID7BFC-TXvp9u_g.js} +1 -1
  43. package/assets/{erDiagram-RLTQ6QDP-1QXTF1US.js → erDiagram-RLTQ6QDP-D3kVz7Nb.js} +1 -1
  44. package/assets/{flowDiagram-HODETNUW-DWcydZT-.js → flowDiagram-HODETNUW-7gxPRGUj.js} +1 -1
  45. package/assets/{ganttDiagram-EL5Y4UJY-BDrQ3uCR.js → ganttDiagram-EL5Y4UJY-CPN-jcnj.js} +1 -1
  46. package/assets/{gitGraphDiagram-WWUBYQGX-oD2bpMWh.js → gitGraphDiagram-WWUBYQGX-Br1ZEaO6.js} +1 -1
  47. package/assets/{history-CTbCqtJA.js → history-Bu1mzK4I.js} +1 -1
  48. package/assets/{infoDiagram-27XIBGKW-C8opSvmW.js → infoDiagram-27XIBGKW-zYs7bQjE.js} +1 -1
  49. package/assets/{init-user-DDmp5FmX.js → init-user-fQwp0v90.js} +1 -1
  50. package/assets/{ishikawaDiagram-5VMMS53U-CqOCcw38.js → ishikawaDiagram-5VMMS53U-BjXTvzge.js} +1 -1
  51. package/assets/{journeyDiagram-3NMN7TZE-B1OlZWx5.js → journeyDiagram-3NMN7TZE-CBfsgbN2.js} +1 -1
  52. package/assets/{kanban-definition-UXKFOSKX-DIEdmOZD.js → kanban-definition-UXKFOSKX-CrzhTXng.js} +1 -1
  53. package/assets/{layout-Cznoi1Xi.js → layout-BUEOcJh3.js} +1 -1
  54. package/assets/{linear-DbhwLrTs.js → linear-Djausokh.js} +1 -1
  55. package/assets/{list-X8LYs75t.js → list-ACmum9cV.js} +2 -2
  56. package/assets/{login-D0flIAhA.js → login-BQuIs2j8.js} +1 -1
  57. package/assets/manifest.json +281 -281
  58. package/assets/media-manager-CU4vMw1V.js +7 -0
  59. package/assets/mermaid.core-Dojzw60O.js +310 -0
  60. package/assets/{mindmap-definition-YA3MSWOX-G8OJl_uT.js → mindmap-definition-YA3MSWOX-s62CDc7B.js} +1 -1
  61. package/assets/{module-D347sEFr.js → module-Cb67xTGv.js} +1 -1
  62. package/assets/{notification-C7usJcF-.js → notification-BTTSwP6c.js} +1 -1
  63. package/assets/{pegDiagram-XKGWAZYB-CqOymfUM.js → pegDiagram-XKGWAZYB-C61Y70Sx.js} +1 -1
  64. package/assets/{pieDiagram-E7YTZNPT-C_nbNUey.js → pieDiagram-E7YTZNPT-p2kr4IMf.js} +1 -1
  65. package/assets/{quadrantDiagram-AXDQQJYC-RDCWL_jp.js → quadrantDiagram-AXDQQJYC-Bt0TmDnC.js} +1 -1
  66. package/assets/{railroadDiagram-O6MQD6OU-Bi_j7Fb_.js → railroadDiagram-O6MQD6OU-3OLC0D_j.js} +1 -1
  67. package/assets/{register-DhdaEsna.js → register-BIVlQHtg.js} +1 -1
  68. package/assets/{requirementDiagram-BXWQKSXE-Cg6IzoFA.js → requirementDiagram-BXWQKSXE-DX_wfhH_.js} +1 -1
  69. package/assets/{ru-DMAUOdKr.js → ru-CQbDDiCI.js} +1 -1
  70. package/assets/{sankeyDiagram-P5KCCOFB-BNN3S4hm.js → sankeyDiagram-P5KCCOFB-C5owbfFt.js} +1 -1
  71. package/assets/{sequenceDiagram-WJ2MYXX4-C9UEgNLg.js → sequenceDiagram-WJ2MYXX4-C9LP6Bzy.js} +1 -1
  72. package/assets/{sizeCapture-INFHLROL-DH9gM8J8.js → sizeCapture-INFHLROL-B7ZoWp62.js} +1 -1
  73. package/assets/{stateDiagram-D77RDMKH-CzuNaJnp.js → stateDiagram-D77RDMKH-uWI0NoaS.js} +1 -1
  74. package/assets/stateDiagram-v2-MP3YSRHH-B_Bjdct-.js +1 -0
  75. package/assets/{swimlanes-42K2YHIH-DlfHkCIp.js → swimlanes-42K2YHIH-B665ttwU.js} +1 -1
  76. package/assets/swimlanesDiagram-VR7AAH4N-BDCBtik2.js +8 -0
  77. package/assets/{timeline-definition-24CTP7MA-B45WKY9z.js → timeline-definition-24CTP7MA-BI5S9uY1.js} +1 -1
  78. package/assets/{use-appearance-DPeAg6kc.js → use-appearance-CETqIse6.js} +1 -1
  79. package/assets/{user-filters-list-B-txVF_a.js → user-filters-list-CyxWxLux.js} +1 -1
  80. package/assets/{vennDiagram-4TSXK5OY-BARlq8EX.js → vennDiagram-4TSXK5OY-Ba9orEWx.js} +1 -1
  81. package/assets/{wardleyDiagram-VM6X3IG4-DSGKYXrr.js → wardleyDiagram-VM6X3IG4-DTWvvomz.js} +1 -1
  82. package/assets/{welcome-Cdhwf3y4.js → welcome-CaSypMCF.js} +1 -1
  83. package/assets/with-app-layout-BNrVlaFw.js +34 -0
  84. package/assets/{xychartDiagram-S5SC5T6Z-DPA8cj4H.js → xychartDiagram-S5SC5T6Z-d9Kf7FbS.js} +1 -1
  85. package/controllers/initUser.js +1 -1
  86. package/helpers/inertiaAddHelper.js +10 -1
  87. package/helpers/inertiaMenuHelper.d.ts +3 -2
  88. package/helpers/inertiaMenuHelper.js +9 -4
  89. package/helpers/navigationAccessHelper.d.ts +5 -0
  90. package/helpers/navigationAccessHelper.js +13 -0
  91. package/helpers/publicUserHelper.d.ts +10 -0
  92. package/helpers/publicUserHelper.js +15 -0
  93. package/index.d.ts +1 -0
  94. package/index.js +1 -0
  95. package/interfaces/adminpanelConfig.d.ts +7 -0
  96. package/lib/Adminizer.d.ts +2 -0
  97. package/lib/Adminizer.js +3 -0
  98. package/lib/admin-links/AdminLinkHandler.js +5 -1
  99. package/lib/app-manager/AdminizerApp.d.ts +34 -0
  100. package/lib/app-manager/AppManager.js +35 -0
  101. package/lib/app-manager/ContextHandler.d.ts +240 -0
  102. package/lib/app-manager/ContextHandler.js +446 -0
  103. package/lib/app-manager/ControllerHandler.d.ts +2 -0
  104. package/lib/app-manager/ControllerHandler.js +7 -0
  105. package/package.json +3 -2
  106. package/system/bindInertia.js +36 -10
  107. package/assets/app-DMN-4aCp.js +0 -138
  108. package/assets/app-TCCHARSx.css +0 -1
  109. package/assets/channel-Dh5UPZKs.js +0 -1
  110. package/assets/classDiagram-ZZMXUADV-a_pfQoRf.js +0 -1
  111. package/assets/classDiagram-v2-VYDZK3BY-a_pfQoRf.js +0 -1
  112. package/assets/cytoscape.esm-BB4DxJjf.js +0 -321
  113. package/assets/media-manager-cyrZjDu3.js +0 -6
  114. package/assets/mermaid.core-DtG9mjld.js +0 -310
  115. package/assets/stateDiagram-v2-MP3YSRHH-Cm0oV4uL.js +0 -1
  116. package/assets/swimlanesDiagram-VR7AAH4N-Cc5GTkO2.js +0 -8
  117. package/assets/with-app-layout-CcoboJFc.js +0 -31
@@ -6,6 +6,8 @@ interface ControllerRecord {
6
6
  method: AppControllerMethod;
7
7
  path: string;
8
8
  enabled: boolean;
9
+ /** Removes the route's layout context declaration. */
10
+ unassign?: () => void;
9
11
  }
10
12
  export declare class ControllerHandler {
11
13
  private adminizer;
@@ -19,6 +19,12 @@ export class ControllerHandler {
19
19
  path: fullPath,
20
20
  enabled: true,
21
21
  };
22
+ if (controller.context) {
23
+ record.unassign = this.adminizer.contextHandler.assign(controller.route, controller.context, {
24
+ owner: appName,
25
+ exact: true,
26
+ });
27
+ }
22
28
  const middleware = bindWithMiddlewares(this.adminizer, this.adminizer.config.middlewares ?? [], (req, res, next) => {
23
29
  if (!record.enabled) {
24
30
  return next();
@@ -69,6 +75,7 @@ export class ControllerHandler {
69
75
  return;
70
76
  }
71
77
  this.removeRoute(record.path, record.method);
78
+ record.unassign?.();
72
79
  this.controllers.delete(id);
73
80
  this.adminizer.emitter.emit("app:controller:unregistered", {
74
81
  appName: record.appName,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "adminizer",
3
3
  "type": "module",
4
- "version": "5.1.0-build.29",
4
+ "version": "5.2.0-build.31",
5
5
  "main": "index.js",
6
6
  "exports": {
7
7
  ".": "./index.js",
@@ -30,7 +30,8 @@
30
30
  "build": "npm run copy:backend && npm run compile:backend && npm run compile:ui && npm run build:assets",
31
31
  "build:catalog-modules": "cross-env CATALOG_COMPONENT=catalogAction vite build --config fixture/virtual-catalog/vite.config.module.ts && cross-env CATALOG_COMPONENT=Group vite build --config fixture/virtual-catalog/vite.config.module.ts",
32
32
  "start:typeorm:seed": "cross-env ORM=typeorm tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
33
- "build:apps": "vite build --config fixture/apps/notification-sender/vite.config.module.ts && vite build --config fixture/apps/module-manager/vite.config.module.ts && vite build --config fixture/apps/navigation/vite.config.module.ts && vite build --config fixture/apps/quill-editor/vite.config.module.ts && vite build --config fixture/apps/widgets/vite.config.module.ts && vite build --config fixture/apps/handsontable-test/vite.config.module.ts && vite build --config fixture/apps/record-scope-test/vite.config.module.ts && npm run build:catalog-modules",
33
+ "build:context-apps": "cross-env CONTEXT_ENTRY=ContextDemoPage vite build --config fixture/apps/contexts/vite.config.module.ts && cross-env CONTEXT_ENTRY=SupportLayout vite build --config fixture/apps/contexts/vite.config.module.ts && cross-env CONTEXT_ENTRY=StudioLayout vite build --config fixture/apps/contexts/vite.config.module.ts && cross-env CONTEXT_ENTRY=DefaultShellOverrides vite build --config fixture/apps/contexts/vite.config.module.ts && cross-env CONTEXT_ENTRY=SystemShellOverrides vite build --config fixture/apps/contexts/vite.config.module.ts && cross-env CONTEXT_ENTRY=ReportsShellOverrides vite build --config fixture/apps/contexts/vite.config.module.ts",
34
+ "build:apps": "npm run build:context-apps && vite build --config fixture/apps/notification-sender/vite.config.module.ts && vite build --config fixture/apps/module-manager/vite.config.module.ts && vite build --config fixture/apps/navigation/vite.config.module.ts && vite build --config fixture/apps/quill-editor/vite.config.module.ts && vite build --config fixture/apps/widgets/vite.config.module.ts && vite build --config fixture/apps/handsontable-test/vite.config.module.ts && vite build --config fixture/apps/record-scope-test/vite.config.module.ts && npm run build:catalog-modules",
34
35
  "build:ai-assistant": "vite build --config vite.config.ai-assistant.ts",
35
36
  "lint": "eslint src",
36
37
  "lint:async": "eslint src -c eslint.config.async.mjs"
@@ -4,6 +4,7 @@ import fs from "fs";
4
4
  import path from "node:path";
5
5
  import { Adminizer } from "../lib/Adminizer.js";
6
6
  import { InertiaMenuHelper } from "../helpers/inertiaMenuHelper.js";
7
+ import { toPublicUser } from "../helpers/publicUserHelper.js";
7
8
  import { getUiTranslations } from "../lib/ui-i18n/getUiTranslations.js";
8
9
  import { getAssetVersion } from "../helpers/assetVersionHelper.js";
9
10
  import { COMMON_UI_TRANSLATION_KEYS } from "../lib/ui-i18n/uiTranslationKeys.js";
@@ -132,7 +133,7 @@ export function bindInertia(adminizer) {
132
133
  headerName: 'x-xsrf-token'
133
134
  }
134
135
  }));
135
- adminizer.app.use(async (req, _, next) => {
136
+ adminizer.app.use(async (req, res, next) => {
136
137
  checkAuth(req, adminizer);
137
138
  const defaultLocale = typeof req.adminizer.config.translation !== "boolean"
138
139
  ? req.adminizer.config.translation.defaultLocale
@@ -143,13 +144,30 @@ export function bindInertia(adminizer) {
143
144
  lang: locale,
144
145
  });
145
146
  const menuHelper = new InertiaMenuHelper(adminizer);
146
- // Contextual documentation of this page: metadata only, and null when
147
- // the subsystem is off or the user may not read documentation.
148
- // A broken implementation must never take the panel down with it.
149
- const menu = req.user ? await menuHelper.getMenuItems(req) : null;
147
+ // The layout context of the request decides which menu and which
148
+ // layout the page gets; the default context reproduces the plain panel.
149
+ // Context, menu and switcher are computed once, and only when a page
150
+ // is rendered: API calls and partial reloads that skip them pay nothing.
151
+ let resolvedContext;
152
+ const resolveContext = () => resolvedContext ??= (async () => {
153
+ const context = await adminizer.contextHandler.resolve(req);
154
+ const contexts = req.user ? await adminizer.contextHandler.listAccessible(req.user) : [];
155
+ // Only page visits move the user between contexts: a rendered page
156
+ // asked for by the browser, never an asset or an API call.
157
+ const isPageVisit = req.headers["x-inertia"] !== undefined || (req.headers.accept ?? "").includes("text/html");
158
+ if (req.user && contexts.length > 1 && isPageVisit)
159
+ adminizer.contextHandler.remember(req, res, context);
160
+ return { context, contexts };
161
+ })();
162
+ let resolvedMenu;
163
+ const resolveMenu = () => resolvedMenu ??= (async () => req.user ? menuHelper.getMenuItems(req, (await resolveContext()).context) : null)();
164
+ const contextProps = (context) => adminizer.contextHandler.toProps({ ...context, title: req.i18n.__(context.title) });
150
165
  const historyAccess = req.user && req.adminizer.config.history.enabled
151
166
  ? await req.adminizer.accessRightsHelper.checkPermission(`history-${req.adminizer.config.history?.adapter ?? 'default'}`, req.user)
152
167
  : false;
168
+ // Contextual documentation of this page: metadata only, and null when
169
+ // the subsystem is off or the user may not read documentation.
170
+ // A broken implementation must never take the panel down with it.
153
171
  let docs = null;
154
172
  try {
155
173
  docs = req.user ? await adminizer.documentationHandler.forContextMeta(req.user, req.path) : null;
@@ -159,23 +177,28 @@ export function bindInertia(adminizer) {
159
177
  }
160
178
  req.Inertia.shareProps({
161
179
  auth: {
162
- user: req.session.userPretended ?? req.user
180
+ user: toPublicUser(req.session.userPretended ?? req.user)
163
181
  },
164
182
  routePrefix: req.adminizer.config.routePrefix,
165
183
  i18n: {
166
184
  locale,
167
185
  common: commonMessages,
168
186
  },
169
- menu,
170
- menuSections: req.user ? menuHelper.getSections(req) : null,
187
+ menu: resolveMenu,
188
+ menuSections: async () => req.user ? menuHelper.getSections(req, (await resolveContext()).context) : null,
189
+ adminContext: async () => contextProps((await resolveContext()).context),
190
+ adminContexts: async () => (await resolveContext()).contexts
191
+ .filter((item) => item.switcher !== false)
192
+ .map(contextProps),
171
193
  // Auto breadcrumbs. A function prop is evaluated by the Inertia
172
194
  // adapter only when the key is rendered and only when the page did
173
195
  // not send `breadcrumbs` of its own — page props override shared
174
196
  // props before evaluation.
175
- ...(menu && adminizer.config.navbar?.breadcrumbs === 'auto' ? {
197
+ ...(req.user && adminizer.config.navbar?.breadcrumbs === 'auto' ? {
176
198
  breadcrumbs: async () => {
177
199
  try {
178
- const crumbs = await adminizer.adminLinkHandler.locate(req.user, req.originalUrl || req.url, menu);
200
+ const menu = await resolveMenu();
201
+ const crumbs = await adminizer.adminLinkHandler.locate(req.user, req.originalUrl || req.url, menu ?? undefined);
179
202
  return crumbs.map((crumb) => ({ ...crumb, title: req.i18n.__(crumb.title) }));
180
203
  }
181
204
  catch (error) {
@@ -224,6 +247,9 @@ export function bindInertia(adminizer) {
224
247
  });
225
248
  next();
226
249
  });
250
+ // Pages declared to belong to a layout context the user may not enter are
251
+ // blocked here, before any route; `req.user` is known by now.
252
+ adminizer.app.use(adminizer.contextHandler.guard());
227
253
  }
228
254
  function checkAuth(req, adminizer) {
229
255
  let locale = "";