@cosmicdrift/kumiko-document-designer 0.0.0-stage → 0.363.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/LICENSE +57 -0
- package/README.md +37 -2
- package/dist/constants.d.ts +24 -0
- package/dist/constants.js +33 -0
- package/dist/feature.d.ts +2 -0
- package/dist/feature.js +85 -0
- package/dist/i18n.d.ts +6 -0
- package/dist/i18n.js +670 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/list-definition.d.ts +6 -0
- package/dist/list-definition.js +109 -0
- package/dist/web/cells.d.ts +10 -0
- package/dist/web/cells.js +87 -0
- package/dist/web/client-plugin.d.ts +12 -0
- package/dist/web/client-plugin.js +43 -0
- package/dist/web/compose-layout.d.ts +6 -0
- package/dist/web/compose-layout.js +13 -0
- package/dist/web/errors.d.ts +6 -0
- package/dist/web/errors.js +24 -0
- package/dist/web/field-issue-text.d.ts +4 -0
- package/dist/web/field-issue-text.js +12 -0
- package/dist/web/file-name.d.ts +2 -0
- package/dist/web/file-name.js +17 -0
- package/dist/web/i18n.d.ts +2 -0
- package/dist/web/i18n.js +170 -0
- package/dist/web/index.d.ts +6 -0
- package/dist/web/index.js +7 -0
- package/dist/web/layout-editor-body.d.ts +14 -0
- package/dist/web/layout-editor-body.js +142 -0
- package/dist/web/layout-editor.d.ts +2 -0
- package/dist/web/layout-editor.js +41 -0
- package/dist/web/layout-html.d.ts +7 -0
- package/dist/web/layout-html.js +81 -0
- package/dist/web/layout-rails.d.ts +18 -0
- package/dist/web/layout-rails.js +107 -0
- package/dist/web/layout-types.d.ts +62 -0
- package/dist/web/layout-types.js +1 -0
- package/dist/web/layout-users.d.ts +3 -0
- package/dist/web/layout-users.js +8 -0
- package/dist/web/mail-dialogs.d.ts +29 -0
- package/dist/web/mail-dialogs.js +15 -0
- package/dist/web/mail-draft.d.ts +17 -0
- package/dist/web/mail-draft.js +132 -0
- package/dist/web/mail-edit-center.d.ts +17 -0
- package/dist/web/mail-edit-center.js +11 -0
- package/dist/web/mail-editor-body.d.ts +18 -0
- package/dist/web/mail-editor-body.js +193 -0
- package/dist/web/mail-editor.d.ts +2 -0
- package/dist/web/mail-editor.js +71 -0
- package/dist/web/mail-footer.d.ts +21 -0
- package/dist/web/mail-footer.js +44 -0
- package/dist/web/mail-header.d.ts +23 -0
- package/dist/web/mail-header.js +16 -0
- package/dist/web/mail-left-rail.d.ts +18 -0
- package/dist/web/mail-left-rail.js +53 -0
- package/dist/web/mail-origin-bar.d.ts +17 -0
- package/dist/web/mail-origin-bar.js +84 -0
- package/dist/web/mail-pdf-link-modal.d.ts +11 -0
- package/dist/web/mail-pdf-link-modal.js +54 -0
- package/dist/web/mail-preview-side.d.ts +12 -0
- package/dist/web/mail-preview-side.js +48 -0
- package/dist/web/mail-preview.d.ts +20 -0
- package/dist/web/mail-preview.js +43 -0
- package/dist/web/mail-right-rail.d.ts +19 -0
- package/dist/web/mail-right-rail.js +47 -0
- package/dist/web/mail-types.d.ts +112 -0
- package/dist/web/mail-types.js +1 -0
- package/dist/web/mail-upload-modal.d.ts +16 -0
- package/dist/web/mail-upload-modal.js +56 -0
- package/dist/web/mail-versions.d.ts +6 -0
- package/dist/web/mail-versions.js +43 -0
- package/dist/web/origin-bar.d.ts +13 -0
- package/dist/web/origin-bar.js +82 -0
- package/dist/web/overrides-drawer.d.ts +9 -0
- package/dist/web/overrides-drawer.js +19 -0
- package/dist/web/overview-row.d.ts +21 -0
- package/dist/web/overview-row.js +47 -0
- package/dist/web/page-canvas.d.ts +18 -0
- package/dist/web/page-canvas.js +38 -0
- package/dist/web/pdf-meta.d.ts +23 -0
- package/dist/web/pdf-meta.js +101 -0
- package/dist/web/pdf-preview.d.ts +4 -0
- package/dist/web/pdf-preview.js +99 -0
- package/dist/web/pdf-template-editor.d.ts +8 -0
- package/dist/web/pdf-template-editor.js +326 -0
- package/dist/web/placeholder-panel.d.ts +21 -0
- package/dist/web/placeholder-panel.js +35 -0
- package/dist/web/preview-record-picker.d.ts +12 -0
- package/dist/web/preview-record-picker.js +7 -0
- package/dist/web/rail.d.ts +18 -0
- package/dist/web/rail.js +14 -0
- package/dist/web/settings-panel.d.ts +17 -0
- package/dist/web/settings-panel.js +25 -0
- package/dist/web/status-label.d.ts +7 -0
- package/dist/web/status-label.js +18 -0
- package/dist/web/template-rows.d.ts +9 -0
- package/dist/web/template-rows.js +34 -0
- package/dist/web/types.d.ts +103 -0
- package/dist/web/types.js +3 -0
- package/dist/web/use-insert-targets.d.ts +9 -0
- package/dist/web/use-insert-targets.js +17 -0
- package/dist/web/use-mail-persistence.d.ts +15 -0
- package/dist/web/use-mail-persistence.js +49 -0
- package/dist/web/use-overview-rows.d.ts +7 -0
- package/dist/web/use-overview-rows.js +19 -0
- package/dist/web/use-settled-value.d.ts +2 -0
- package/dist/web/use-settled-value.js +18 -0
- package/dist/web/use-test-mail.d.ts +15 -0
- package/dist/web/use-test-mail.js +27 -0
- package/dist/web/used-by-label.d.ts +9 -0
- package/dist/web/used-by-label.js +32 -0
- package/package.json +63 -4
- package/src/changes.json +20 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
Business Source License 1.1
|
|
2
|
+
|
|
3
|
+
Parameters
|
|
4
|
+
|
|
5
|
+
Licensor: Marc Frost
|
|
6
|
+
|
|
7
|
+
Licensed Work: @cosmicdrift/kumiko-document-designer
|
|
8
|
+
The Licensed Work is © 2026 Marc Frost.
|
|
9
|
+
|
|
10
|
+
Additional Use Grant:
|
|
11
|
+
You may use the Licensed Work in production for any purpose, including
|
|
12
|
+
commercially, EXCEPT for the Restricted Use.
|
|
13
|
+
|
|
14
|
+
"Restricted Use" is defined as using the Licensed Work to provide a platform
|
|
15
|
+
or service to third parties that allows them to host, deploy, or run their
|
|
16
|
+
own applications built with the Licensed Work. This includes, but is not
|
|
17
|
+
limited to: managed hosting services, software-as-a-service (SaaS) platforms,
|
|
18
|
+
platform-as-a-service (PaaS), developer platforms, or any multi-tenant
|
|
19
|
+
managed offering of the Licensed Work.
|
|
20
|
+
|
|
21
|
+
This restriction does not apply to the Licensor, any entity controlled by,
|
|
22
|
+
controlling, or under common control with the Licensor ("Affiliates"), or
|
|
23
|
+
contractors acting on their behalf. The Licensor remains free to use the
|
|
24
|
+
Licensed Work for any purpose, including for the operation of kumiko.rocks.
|
|
25
|
+
|
|
26
|
+
Change Date: 2030-05-05
|
|
27
|
+
Change License: Apache License, Version 2.0
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Terms
|
|
31
|
+
|
|
32
|
+
The Licensor hereby grants you the right to copy, modify, create derivative works,
|
|
33
|
+
redistribute, and make non-production use of the Licensed Work. The Licensor may
|
|
34
|
+
make an Additional Use Grant, above, permitting limited production use.
|
|
35
|
+
|
|
36
|
+
Effective on the Change Date, or the fourth anniversary of the first publicly
|
|
37
|
+
available distribution of the Licensed Work under this License, whichever comes
|
|
38
|
+
first, this License will convert to the Change License.
|
|
39
|
+
|
|
40
|
+
This Business Source License governs use of the Licensed Work in all cases, except
|
|
41
|
+
as to any use that is explicitly granted in the Additional Use Grant above or
|
|
42
|
+
under the Change License after the Change Date.
|
|
43
|
+
|
|
44
|
+
If your use of the Licensed Work does not comply with the requirements of this
|
|
45
|
+
License, you must cease use of the Licensed Work immediately.
|
|
46
|
+
|
|
47
|
+
All copies of the Licensed Work, and all derivative works thereof, must include
|
|
48
|
+
this License.
|
|
49
|
+
|
|
50
|
+
This License does not grant you any right, title, or interest in any trademark,
|
|
51
|
+
logo, or branding of the Licensor, except as required to comply with this License.
|
|
52
|
+
|
|
53
|
+
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN
|
|
54
|
+
“AS IS” BASIS. LICENSOR DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
|
|
55
|
+
WITHOUT LIMITATION WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
|
56
|
+
TITLE, AND NON-INFRINGEMENT. IN NO EVENT WILL LICENSOR BE LIABLE FOR ANY DAMAGES
|
|
57
|
+
ARISING OUT OF OR RELATED TO THIS LICENSE OR THE USE OF THE LICENSED WORK.
|
package/README.md
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @cosmicdrift/kumiko-document-designer
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Document designer for Kumiko: the template overview, the layout editor for the mail layout and the PDF letterhead, and the PDF template editor.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { createTemplateResolverFeature } from "@cosmicdrift/kumiko-bundled-features/template-resolver";
|
|
7
|
+
import { createDocumentDesignerFeature } from "@cosmicdrift/kumiko-document-designer";
|
|
8
|
+
import { documentDesignerClient } from "@cosmicdrift/kumiko-document-designer/web";
|
|
9
|
+
|
|
10
|
+
// server feature list
|
|
11
|
+
createTemplateResolverFeature();
|
|
12
|
+
createDocumentDesignerFeature();
|
|
13
|
+
|
|
14
|
+
createKumikoApp({
|
|
15
|
+
clientFeatures: [
|
|
16
|
+
documentDesignerClient({ appLocales: ["de", "en"] }),
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Overview and layout editor
|
|
22
|
+
|
|
23
|
+
Mount `createDocumentDesignerFeature()` after `template-resolver` (and `managed-pages` if the branding rail should link to the branding screen).
|
|
24
|
+
|
|
25
|
+
- Screens: `templates` (TenantAdmin, SystemAdmin), `platform-templates` (SystemAdmin, adds the "customised by" column), `layout-editor` (opened from the "Edit" row action of a layout), `mail-editor` (opened from the "Edit" row action of a mail template; subject, content, resources, preview and test mail).
|
|
26
|
+
- Navs: `document-designer:nav:templates` and `document-designer:nav:platform-templates`. `createAdminShellFeature({ includeDocumentDesigner: true })` lists them in the admin workspaces.
|
|
27
|
+
- `TEMPLATE_EDITOR_SCREENS` maps a template kind to the screen that edits it; adding a kind there adds the "Edit" row action.
|
|
28
|
+
- `PreviewRecordPickerProvider` (web export) adds a "pick a record" action to the mail preview; without it the action is hidden. Picked values are shown only, the preview endpoint takes no overrides.
|
|
29
|
+
- The MJML tab of the layout editor is shown to SystemAdmin only and only when the system layout is MJML.
|
|
30
|
+
|
|
31
|
+
## PDF template editor
|
|
32
|
+
|
|
33
|
+
The feature declares the `pdf-template-editor` screen (`PDF_TEMPLATE_EDITOR_SCREEN_ID`) and `documentDesignerClient()` registers its component; the "Edit" row action of PDF rows opens it. The screen reads the template from the URL: `?slug=invoice&locale=de`.
|
|
34
|
+
`PdfTemplateEditor` (props `slug`, `locale`, `onLocaleChange`) can also be mounted directly.
|
|
35
|
+
|
|
36
|
+
Requirements: the `template-resolver` and `renderer-puppeteer-client` features on the server.
|
|
37
|
+
A SystemAdmin (via `UserRolesProvider`) edits the system template, everyone else a tenant customisation.
|
|
38
|
+
PDF preview uses `pdfjs-dist` in the main thread (no worker or CDN requests).
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const DOCUMENT_DESIGNER_FEATURE: "document-designer";
|
|
2
|
+
export declare const TEMPLATES_SCREEN_ID: "templates";
|
|
3
|
+
export declare const PLATFORM_TEMPLATES_SCREEN_ID: "platform-templates";
|
|
4
|
+
export declare const LAYOUT_EDITOR_SCREEN_ID: "layout-editor";
|
|
5
|
+
export declare const PDF_TEMPLATE_EDITOR_SCREEN_ID: "pdf-template-editor";
|
|
6
|
+
export declare const MAIL_EDITOR_SCREEN_ID: "mail-editor";
|
|
7
|
+
export declare const TEMPLATES_NAV_ID: "templates";
|
|
8
|
+
export declare const PLATFORM_TEMPLATES_NAV_ID: "platform-templates";
|
|
9
|
+
export declare const BRANDING_SCREEN_QN: "managed-pages:screen:branding-settings";
|
|
10
|
+
export declare const BRANDING_QUERY_QN: "managed-pages:query:branding";
|
|
11
|
+
export declare const DEFAULT_LAYOUT_SLUG: "default";
|
|
12
|
+
export type TemplateEditorKind = "mail" | "document-pdf" | "mail-layout" | "pdf-layout";
|
|
13
|
+
export declare const TEMPLATE_EDITOR_SCREENS: Partial<Record<TemplateEditorKind, string>>;
|
|
14
|
+
export declare const DocumentDesignerCells: {
|
|
15
|
+
readonly title: "document-designer-title-cell";
|
|
16
|
+
readonly kind: "document-designer-kind-cell";
|
|
17
|
+
readonly origin: "document-designer-origin-cell";
|
|
18
|
+
readonly locales: "document-designer-locales-cell";
|
|
19
|
+
readonly status: "document-designer-status-cell";
|
|
20
|
+
readonly usedBy: "document-designer-used-by-cell";
|
|
21
|
+
readonly modifiedAt: "document-designer-modified-cell";
|
|
22
|
+
readonly overriddenBy: "document-designer-overridden-by-cell";
|
|
23
|
+
};
|
|
24
|
+
export declare const DEFAULT_TEMPLATE_LOCALES: readonly string[];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// @runtime client
|
|
2
|
+
// Names shared by the server feature and the client plugin. Plain data, no imports.
|
|
3
|
+
export const DOCUMENT_DESIGNER_FEATURE = "document-designer";
|
|
4
|
+
export const TEMPLATES_SCREEN_ID = "templates";
|
|
5
|
+
export const PLATFORM_TEMPLATES_SCREEN_ID = "platform-templates";
|
|
6
|
+
export const LAYOUT_EDITOR_SCREEN_ID = "layout-editor";
|
|
7
|
+
export const PDF_TEMPLATE_EDITOR_SCREEN_ID = "pdf-template-editor";
|
|
8
|
+
export const MAIL_EDITOR_SCREEN_ID = "mail-editor";
|
|
9
|
+
export const TEMPLATES_NAV_ID = "templates";
|
|
10
|
+
export const PLATFORM_TEMPLATES_NAV_ID = "platform-templates";
|
|
11
|
+
export const BRANDING_SCREEN_QN = "managed-pages:screen:branding-settings";
|
|
12
|
+
export const BRANDING_QUERY_QN = "managed-pages:query:branding";
|
|
13
|
+
export const DEFAULT_LAYOUT_SLUG = "default";
|
|
14
|
+
// Short screen id per template kind. A kind without an entry gets no "Edit" row action.
|
|
15
|
+
// The mail editor adds `mail` here and declares its screen in this feature, because the
|
|
16
|
+
// boot validator only accepts navigate targets in the same feature.
|
|
17
|
+
export const TEMPLATE_EDITOR_SCREENS = {
|
|
18
|
+
"document-pdf": PDF_TEMPLATE_EDITOR_SCREEN_ID,
|
|
19
|
+
mail: MAIL_EDITOR_SCREEN_ID,
|
|
20
|
+
"mail-layout": LAYOUT_EDITOR_SCREEN_ID,
|
|
21
|
+
"pdf-layout": LAYOUT_EDITOR_SCREEN_ID,
|
|
22
|
+
};
|
|
23
|
+
export const DocumentDesignerCells = {
|
|
24
|
+
title: "document-designer-title-cell",
|
|
25
|
+
kind: "document-designer-kind-cell",
|
|
26
|
+
origin: "document-designer-origin-cell",
|
|
27
|
+
locales: "document-designer-locales-cell",
|
|
28
|
+
status: "document-designer-status-cell",
|
|
29
|
+
usedBy: "document-designer-used-by-cell",
|
|
30
|
+
modifiedAt: "document-designer-modified-cell",
|
|
31
|
+
overriddenBy: "document-designer-overridden-by-cell",
|
|
32
|
+
};
|
|
33
|
+
export const DEFAULT_TEMPLATE_LOCALES = ["de", "en"];
|
package/dist/feature.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { access, defineFeature, i18nKey, } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import { DOCUMENT_DESIGNER_FEATURE, LAYOUT_EDITOR_SCREEN_ID, MAIL_EDITOR_SCREEN_ID, PDF_TEMPLATE_EDITOR_SCREEN_ID, PLATFORM_TEMPLATES_NAV_ID, PLATFORM_TEMPLATES_SCREEN_ID, TEMPLATES_NAV_ID, TEMPLATES_SCREEN_ID, } from "./constants.js";
|
|
3
|
+
import { DOCUMENT_DESIGNER_I18N } from "./i18n.js";
|
|
4
|
+
import { TEMPLATE_FACETS, templateColumns, templateRowActions } from "./list-definition.js";
|
|
5
|
+
const OVERVIEW_QUERY = "template-resolver:query:overview";
|
|
6
|
+
const TENANT_ROLES = ["TenantAdmin", "SystemAdmin"];
|
|
7
|
+
export function createDocumentDesignerFeature() {
|
|
8
|
+
return defineFeature(DOCUMENT_DESIGNER_FEATURE, (r) => {
|
|
9
|
+
r.describe("Template overview and layout editor: lists the mail, PDF and layout templates of a tenant (platform admins see the system templates and how many tenants customised each) and edits the mail layout and the PDF letterhead in the browser. Mount after template-resolver and, for the branding rail, managed-pages. Client: `documentDesignerClient()`; admin-shell lists the navs with `includeDocumentDesigner`.");
|
|
10
|
+
r.uiHints({
|
|
11
|
+
displayLabel: "Documents · Template Designer",
|
|
12
|
+
category: "content",
|
|
13
|
+
recommended: false,
|
|
14
|
+
});
|
|
15
|
+
r.requires("template-resolver");
|
|
16
|
+
r.translations({ keys: DOCUMENT_DESIGNER_I18N });
|
|
17
|
+
r.screen({
|
|
18
|
+
id: TEMPLATES_SCREEN_ID,
|
|
19
|
+
type: "projectionList",
|
|
20
|
+
query: OVERVIEW_QUERY,
|
|
21
|
+
columns: templateColumns({ platform: false }),
|
|
22
|
+
facets: [...TEMPLATE_FACETS],
|
|
23
|
+
rowActions: templateRowActions(),
|
|
24
|
+
searchable: true,
|
|
25
|
+
searchPlaceholder: i18nKey("documentDesigner.search"),
|
|
26
|
+
pagination: "pages",
|
|
27
|
+
defaultSort: { field: "modifiedAt", dir: "desc" },
|
|
28
|
+
access: { roles: access.roles(...TENANT_ROLES) },
|
|
29
|
+
});
|
|
30
|
+
r.nav({
|
|
31
|
+
id: TEMPLATES_NAV_ID,
|
|
32
|
+
label: "document-designer:nav.templates",
|
|
33
|
+
icon: "file",
|
|
34
|
+
screen: `${DOCUMENT_DESIGNER_FEATURE}:screen:${TEMPLATES_SCREEN_ID}`,
|
|
35
|
+
access: { roles: access.roles(...TENANT_ROLES) },
|
|
36
|
+
order: 15,
|
|
37
|
+
});
|
|
38
|
+
r.screen({
|
|
39
|
+
id: PLATFORM_TEMPLATES_SCREEN_ID,
|
|
40
|
+
type: "projectionList",
|
|
41
|
+
query: OVERVIEW_QUERY,
|
|
42
|
+
columns: templateColumns({ platform: true }),
|
|
43
|
+
facets: [...TEMPLATE_FACETS],
|
|
44
|
+
rowActions: templateRowActions(),
|
|
45
|
+
searchable: true,
|
|
46
|
+
searchPlaceholder: i18nKey("documentDesigner.search"),
|
|
47
|
+
pagination: "pages",
|
|
48
|
+
defaultSort: { field: "modifiedAt", dir: "desc" },
|
|
49
|
+
access: { roles: access.systemAdmin },
|
|
50
|
+
});
|
|
51
|
+
r.nav({
|
|
52
|
+
id: PLATFORM_TEMPLATES_NAV_ID,
|
|
53
|
+
label: "document-designer:nav.platformTemplates",
|
|
54
|
+
icon: "file",
|
|
55
|
+
screen: `${DOCUMENT_DESIGNER_FEATURE}:screen:${PLATFORM_TEMPLATES_SCREEN_ID}`,
|
|
56
|
+
access: { roles: access.systemAdmin },
|
|
57
|
+
order: 15,
|
|
58
|
+
});
|
|
59
|
+
r.screen({
|
|
60
|
+
id: LAYOUT_EDITOR_SCREEN_ID,
|
|
61
|
+
type: "custom",
|
|
62
|
+
renderer: { react: { __component: LAYOUT_EDITOR_SCREEN_ID } },
|
|
63
|
+
description: "documentDesigner.screen.layoutEditor.description",
|
|
64
|
+
dormant: true,
|
|
65
|
+
access: { roles: access.roles(...TENANT_ROLES) },
|
|
66
|
+
});
|
|
67
|
+
r.screen({
|
|
68
|
+
id: PDF_TEMPLATE_EDITOR_SCREEN_ID,
|
|
69
|
+
type: "custom",
|
|
70
|
+
renderer: { react: { __component: PDF_TEMPLATE_EDITOR_SCREEN_ID } },
|
|
71
|
+
description: "Editor for one PDF template: edit the body, print a preview through the print service, review tenant customisations and export the template as a bundle.",
|
|
72
|
+
dormant: true,
|
|
73
|
+
access: { roles: access.roles(...TENANT_ROLES) },
|
|
74
|
+
});
|
|
75
|
+
// kumiko-lint-ignore app-feature-structure Board-2/3 mail editor (placeholder rail, chip editors, live preview, test mail) has no declarative screen type
|
|
76
|
+
r.screen({
|
|
77
|
+
id: MAIL_EDITOR_SCREEN_ID,
|
|
78
|
+
type: "custom",
|
|
79
|
+
renderer: { react: { __component: MAIL_EDITOR_SCREEN_ID } },
|
|
80
|
+
description: "documentDesigner.screen.mailEditor.description",
|
|
81
|
+
dormant: true,
|
|
82
|
+
access: { roles: access.roles(...TENANT_ROLES) },
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
}
|