@antelopejs/dms 0.4.1 → 0.4.3
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/CHANGELOG.md +39 -0
- package/dist/pages/settings/users/invites.js +6 -5
- package/dist/pages/settings/users/invites.js.map +1 -1
- package/dist/pages/settings/users/members.d.ts +1 -0
- package/dist/pages/settings/users/members.js +12 -3
- package/dist/pages/settings/users/members.js.map +1 -1
- package/dist/pages/settings/users/permission-tree-nodes.d.ts +3 -0
- package/dist/pages/settings/users/permission-tree-nodes.js +22 -0
- package/dist/pages/settings/users/permission-tree-nodes.js.map +1 -0
- package/dist/pages/settings/users/roles.js +2 -16
- package/dist/pages/settings/users/roles.js.map +1 -1
- package/dist/test/unit/pages/settings/permission-tree-nodes.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/permission-tree-nodes.test.js +68 -0
- package/dist/test/unit/pages/settings/permission-tree-nodes.test.js.map +1 -0
- package/frontend-vue/dms.frontend.ts +2 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +4 -2
- package/frontend-vue/layers/dms-layout/app/composables/general/types/index.ts +7 -0
- package/frontend-vue/layers/dms-layout/app/composables/general/useColorModePreference.ts +17 -0
- package/frontend-vue/layers/dms-layout/app/custom-pages/settings/appearance.vue +6 -6
- package/frontend-vue/layers/dms-layout/app/plugins/color-mode.ts +100 -0
- package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +41 -1
- package/frontend-vue/layers/dms-ui/app/components/form/components/Calendar.vue +49 -26
- package/frontend-vue/layers/dms-ui/app/components/form/components/DatePicker.vue +77 -32
- package/frontend-vue/layers/dms-ui/app/composables/chart/useThemeRevision.ts +0 -22
- package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +23 -0
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +1 -0
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +1 -0
- package/frontend-vue/package.json +2 -2
- package/frontend-vue/pnpm-lock.yaml +7 -33
- package/frontend-vue/tests/color-mode-server-render.test.ts +84 -0
- package/frontend-vue/tests/color-mode-sync.test.ts +320 -0
- package/frontend-vue/tests/form-required-fields.test.ts +44 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.4.3
|
|
4
|
+
|
|
5
|
+
[compare changes](https://github.com/AntelopeJS/dms/compare/v0.4.2...v0.4.3)
|
|
6
|
+
|
|
7
|
+
### 🚀 Enhancements
|
|
8
|
+
|
|
9
|
+
- **form:** Mark required fields and add a required legend ([#46](https://github.com/AntelopeJS/dms/pull/46))
|
|
10
|
+
- **settings:** Reach pending invites from the members page ([#47](https://github.com/AntelopeJS/dms/pull/47))
|
|
11
|
+
|
|
12
|
+
### 🩹 Fixes
|
|
13
|
+
|
|
14
|
+
- **playground:** Build the dms and the playground before starting ([ce1e7bd](https://github.com/AntelopeJS/dms/commit/ce1e7bd))
|
|
15
|
+
- **form:** Handle partial ranges and show range and multiple dates in the date picker ([b12efcf](https://github.com/AntelopeJS/dms/commit/b12efcf))
|
|
16
|
+
- **form:** Emit ISO strings for multiple dates in the calendar and date picker ([327ebc2](https://github.com/AntelopeJS/dms/commit/327ebc2))
|
|
17
|
+
- **layout:** Keep the current page in the breadcrumb when the URL has a query ([#53](https://github.com/AntelopeJS/dms/pull/53))
|
|
18
|
+
- **layout:** Keep the color-mode preference in a dms-color-mode cookie ([#56](https://github.com/AntelopeJS/dms/pull/56))
|
|
19
|
+
|
|
20
|
+
### 🏡 Chore
|
|
21
|
+
|
|
22
|
+
- **release:** @antelopejs/interface-dms v0.2.2 ([2be2aba](https://github.com/AntelopeJS/dms/commit/2be2aba))
|
|
23
|
+
- **playground:** Add sibling pages whose slugs share a prefix ([#49](https://github.com/AntelopeJS/dms/pull/49))
|
|
24
|
+
|
|
25
|
+
### ❤️ Contributors
|
|
26
|
+
|
|
27
|
+
- Alessandro Aloisio ([@alessaloisio](http://github.com/alessaloisio))
|
|
28
|
+
- Antony Rizzitelli <rizzitelli.antony@pm.me>
|
|
29
|
+
|
|
30
|
+
## v0.4.2
|
|
31
|
+
|
|
32
|
+
[compare changes](https://github.com/AntelopeJS/dms/compare/v0.4.1...v0.4.2)
|
|
33
|
+
|
|
34
|
+
### 🩹 Fixes
|
|
35
|
+
|
|
36
|
+
- **roles:** Show permissions whose parent id is not registered ([#44](https://github.com/AntelopeJS/dms/pull/44))
|
|
37
|
+
|
|
38
|
+
### ❤️ Contributors
|
|
39
|
+
|
|
40
|
+
- Antony Rizzitelli <rizzitelli.antony@pm.me>
|
|
41
|
+
|
|
3
42
|
## v0.4.1
|
|
4
43
|
|
|
5
44
|
[compare changes](https://github.com/AntelopeJS/dms/compare/v0.4.0...v0.4.1)
|
|
@@ -30,9 +30,9 @@ const default_types_1 = require("@antelopejs/interface-dms/base/data-types/defau
|
|
|
30
30
|
const status_type_1 = require("@antelopejs/interface-dms/base/data-types/status-type");
|
|
31
31
|
const types_1 = require("@antelopejs/interface-dms/base/types");
|
|
32
32
|
const fire_and_forget_1 = require("@antelopejs/interface-dms/utils/fire-and-forget");
|
|
33
|
-
const category_1 = require("./category");
|
|
34
33
|
const member_invite_form_1 = require("./member-invite-form");
|
|
35
34
|
const members_1 = require("./members");
|
|
35
|
+
const INVITES_PERMISSION_ID = "settings.user.invites";
|
|
36
36
|
let inviteSettingDataAPI = class inviteSettingDataAPI extends (0, interface_data_api_1.DataController)(db_1.UserInvite, {
|
|
37
37
|
list: base_1.TableViewRoutes.List,
|
|
38
38
|
get: base_1.TableViewRoutes.Get,
|
|
@@ -188,9 +188,10 @@ exports.inviteSettingDataAPI = inviteSettingDataAPI = __decorate([
|
|
|
188
188
|
], inviteSettingDataAPI);
|
|
189
189
|
let InvitesSettingsController = class InvitesSettingsController extends (0, page_1.PageController)("invites", {
|
|
190
190
|
displayName: "$menu.invites",
|
|
191
|
-
category:
|
|
191
|
+
category: members_1.MembersSettingsController,
|
|
192
|
+
permission: { id: INVITES_PERMISSION_ID },
|
|
193
|
+
hidden: true,
|
|
192
194
|
icon: "i-ph-envelope-simple",
|
|
193
|
-
order: 5,
|
|
194
195
|
description: "$page.settings.description.invites",
|
|
195
196
|
}) {
|
|
196
197
|
static table = (0, base_1.TableView)(inviteSettingDataAPI, {
|
|
@@ -225,7 +226,7 @@ let InvitesSettingsController = class InvitesSettingsController extends (0, page
|
|
|
225
226
|
icon: "i-ph-arrow-clockwise",
|
|
226
227
|
target: {
|
|
227
228
|
type: "api",
|
|
228
|
-
url:
|
|
229
|
+
url: `${members_1.INVITES_PAGE_PATH}/{_id}/resend`,
|
|
229
230
|
method: "POST",
|
|
230
231
|
successMessage: "$page.settings.invites.action.resend_success",
|
|
231
232
|
confirm: {
|
|
@@ -240,7 +241,7 @@ let InvitesSettingsController = class InvitesSettingsController extends (0, page
|
|
|
240
241
|
icon: "i-ph-trash",
|
|
241
242
|
target: {
|
|
242
243
|
type: "api",
|
|
243
|
-
url:
|
|
244
|
+
url: `${members_1.INVITES_PAGE_PATH}/{_id}/cancel`,
|
|
244
245
|
method: "DELETE",
|
|
245
246
|
successMessage: "$page.settings.invites.action.cancel_success",
|
|
246
247
|
confirm: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invites.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/invites.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6DAOmC;AACnC,uEAAwD;AACxD,uEAGwC;AACxC,sEAMiD;AACjD,4EAAsF;AACtF,qDAA2E;AAC3E,mFAIqD;AACrD,+DAG2C;AAC3C,yDAA8E;AAC9E,6EAA8E;AAC9E,uFAAkF;AAClF,yDAAsE;AACtE,yDAMwC;AACxC,2FAA2F;AAC3F,uFAAmF;AACnF,gEAA4E;AAC5E,qFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"invites.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/invites.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type RequestContext } from "@antelopejs/interface-api";
|
|
2
2
|
import type { Action } from "@antelopejs/interface-dms/component";
|
|
3
3
|
import { type User, UserModel } from "@antelopejs/interface-dms/auth/db";
|
|
4
|
+
export declare const INVITES_PAGE_PATH = "/settings/user/members/invites";
|
|
4
5
|
export declare const membersTable: import("@antelopejs/interface-dms").ComponentBuilder<import("@antelopejs/interface-dms/base").TableViewOptionsSerialized>;
|
|
5
6
|
export declare const membersTableAddAction: Action;
|
|
6
7
|
declare const MembersSettingsController_base: {
|
|
@@ -12,7 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
12
12
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.MembersSettingsController = exports.membersTableAddAction = exports.membersTable = void 0;
|
|
15
|
+
exports.MembersSettingsController = exports.membersTableAddAction = exports.membersTable = exports.INVITES_PAGE_PATH = void 0;
|
|
16
16
|
const interface_api_1 = require("@antelopejs/interface-api");
|
|
17
17
|
const interface_api_util_1 = require("@antelopejs/interface-api-util");
|
|
18
18
|
const interface_data_api_1 = require("@antelopejs/interface-data-api");
|
|
@@ -28,13 +28,14 @@ const request_tenant_1 = require("@antelopejs/interface-dms/request-tenant");
|
|
|
28
28
|
const tenant_ownership_1 = require("@antelopejs/interface-dms/tenant-ownership");
|
|
29
29
|
const db_2 = require("@antelopejs/interface-dms/auth/db");
|
|
30
30
|
const base_1 = require("@antelopejs/interface-dms/base");
|
|
31
|
+
const types_1 = require("@antelopejs/interface-dms/base/types");
|
|
31
32
|
const saas_mode_1 = require("@antelopejs/interface-dms/utils/saas-mode");
|
|
32
33
|
const member_invite_schema_1 = require("../../../validation/member-invite.schema");
|
|
33
34
|
const category_1 = require("./category");
|
|
34
35
|
const member_invite_form_1 = require("./member-invite-form");
|
|
35
36
|
(0, interface_data_api_1.RegisterDataController)()(data_controllers_1.memberSettingDataAPI);
|
|
36
37
|
const MEMBERS_PAGE_PATH = "/settings/user/members";
|
|
37
|
-
|
|
38
|
+
exports.INVITES_PAGE_PATH = `${MEMBERS_PAGE_PATH}/invites`;
|
|
38
39
|
function detectOwnerChange(current, body) {
|
|
39
40
|
if (body.isTenantOwner === undefined)
|
|
40
41
|
return null;
|
|
@@ -93,6 +94,14 @@ exports.membersTable = (0, base_1.TableView)(data_controllers_1.memberSettingDat
|
|
|
93
94
|
],
|
|
94
95
|
},
|
|
95
96
|
customButtons: [
|
|
97
|
+
{
|
|
98
|
+
label: "$menu.invites",
|
|
99
|
+
icon: "i-ph-envelope-simple",
|
|
100
|
+
color: "neutral",
|
|
101
|
+
variant: types_1.ButtonVariant.outline,
|
|
102
|
+
permission: "add",
|
|
103
|
+
target: { type: "page", url: exports.INVITES_PAGE_PATH },
|
|
104
|
+
},
|
|
96
105
|
{
|
|
97
106
|
label: "$page.settings.members.invite.button",
|
|
98
107
|
icon: "i-ph-user-plus",
|
|
@@ -180,7 +189,7 @@ let MembersSettingsController = class MembersSettingsController extends (0, page
|
|
|
180
189
|
extensions,
|
|
181
190
|
});
|
|
182
191
|
return {
|
|
183
|
-
redirectPath: result.kind === "added" ? MEMBERS_PAGE_PATH : INVITES_PAGE_PATH,
|
|
192
|
+
redirectPath: result.kind === "added" ? MEMBERS_PAGE_PATH : exports.INVITES_PAGE_PATH,
|
|
184
193
|
};
|
|
185
194
|
}
|
|
186
195
|
async validateMemberEmail(ctx, memberId, userModel) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/members.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6DAMmC;AACnC,uEAA0E;AAC1E,uEAAwE;AACxE,6FAA4E;AAE5E,iFAAkF;AAClF,qDAGsC;AACtC,6DAA0E;AAC1E,2DAAqE;AACrE,mFAA6F;AAC7F,+DAAuE;AACvE,yDAA8E;AAC9E,6EAA8E;AAC9E,iFAGoD;AACpD,0DAAyE;AACzE,yDAA2D;AAC3D,yEAAuE;AACvE,mFAA8E;AAC9E,yCAA0C;AAC1C,6DAAwD;AAExD,IAAA,2CAAsB,GAAE,CAAC,uCAAoB,CAAC,CAAC;AAI/C,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/members.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { PermissionTree } from "@antelopejs/interface-dms/permissions";
|
|
2
|
+
import type { FormComponents } from "@antelopejs/interface-dms/base/form";
|
|
3
|
+
export declare function mapPermissionTreeToPermissionNodes(permissionTree: Record<string, PermissionTree>): FormComponents.PermissionsTreeNode[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapPermissionTreeToPermissionNodes = mapPermissionTreeToPermissionNodes;
|
|
4
|
+
function mapPermissionTreeToPermissionNodes(permissionTree) {
|
|
5
|
+
return Object.values(permissionTree).flatMap(mapPermissionTreeNode);
|
|
6
|
+
}
|
|
7
|
+
function mapPermissionTreeNode(node) {
|
|
8
|
+
if (!node.data)
|
|
9
|
+
return mapPermissionTreeToPermissionNodes(node.children);
|
|
10
|
+
if (node.data.defaultGranted)
|
|
11
|
+
return [];
|
|
12
|
+
const children = mapPermissionTreeToPermissionNodes(node.children);
|
|
13
|
+
return [
|
|
14
|
+
{
|
|
15
|
+
id: node.data.id,
|
|
16
|
+
label: node.data.title ?? "Unknown Permission",
|
|
17
|
+
icon: node.data.icon,
|
|
18
|
+
children: children.length > 0 ? children : undefined,
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=permission-tree-nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-tree-nodes.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/permission-tree-nodes.ts"],"names":[],"mappings":";;AAaA,gFAIC;AAJD,SAAgB,kCAAkC,CAChD,cAA8C;IAE9C,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAoB;IAEpB,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,kCAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzE,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,QAAQ,GAAG,kCAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnE,OAAO;QACL;YACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;YAChB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,oBAAoB;YAC9C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACrD;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -17,22 +17,8 @@ const page_1 = require("@antelopejs/interface-dms/page");
|
|
|
17
17
|
const permissions_1 = require("@antelopejs/interface-dms/permissions");
|
|
18
18
|
const base_1 = require("@antelopejs/interface-dms/base");
|
|
19
19
|
const category_1 = require("./category");
|
|
20
|
+
const permission_tree_nodes_1 = require("./permission-tree-nodes");
|
|
20
21
|
(0, interface_data_api_1.RegisterDataController)()(roles_1.roleSettingDataAPI);
|
|
21
|
-
function mapPermissionTreeToPermissionNodes(permissionTree) {
|
|
22
|
-
return Object.values(permissionTree)
|
|
23
|
-
.filter((node) => node.data && !node.data.defaultGranted)
|
|
24
|
-
.map((node) => {
|
|
25
|
-
const permissionNode = {
|
|
26
|
-
id: node.data?.id ?? "",
|
|
27
|
-
label: node.data?.title ?? "Unknown Permission",
|
|
28
|
-
icon: node.data?.icon,
|
|
29
|
-
children: Object.keys(node.children).length > 0
|
|
30
|
-
? mapPermissionTreeToPermissionNodes(node.children)
|
|
31
|
-
: undefined,
|
|
32
|
-
};
|
|
33
|
-
return permissionNode;
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
22
|
let RolesSettingsController = class RolesSettingsController extends (0, page_1.PageController)("roles", {
|
|
37
23
|
displayName: "$menu.roles",
|
|
38
24
|
category: category_1.userCategory,
|
|
@@ -42,7 +28,7 @@ let RolesSettingsController = class RolesSettingsController extends (0, page_1.P
|
|
|
42
28
|
}) {
|
|
43
29
|
async getPermissionsTree() {
|
|
44
30
|
const permissionTree = await (0, permissions_1.GetPermissions)();
|
|
45
|
-
return mapPermissionTreeToPermissionNodes(permissionTree);
|
|
31
|
+
return (0, permission_tree_nodes_1.mapPermissionTreeToPermissionNodes)(permissionTree);
|
|
46
32
|
}
|
|
47
33
|
static table = (0, base_1.TableView)(roles_1.roleSettingDataAPI, {
|
|
48
34
|
caption: "$page.settings.roles.table.caption",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/roles.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6DAAgD;AAChD,uEAAwE;AACxE,4EAAsF;AACtF,yDAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/roles.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6DAAgD;AAChD,uEAAwE;AACxE,4EAAsF;AACtF,yDAA8E;AAC9E,uEAAuE;AACvE,yDAA2D;AAE3D,yCAA0C;AAC1C,mEAA6E;AAE7E,IAAA,2CAAsB,GAAE,CAAC,0BAAkB,CAAC,CAAC;AAGtC,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,IAAA,qBAAc,EAAC,OAAO,EAAE;IACnE,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,uBAAY;IACtB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,kCAAkC;CAChD,CAAC;IAEM,AAAN,KAAK,CAAC,kBAAkB;QACtB,MAAM,cAAc,GAAG,MAAM,IAAA,4BAAc,GAAE,CAAC;QAC9C,OAAO,IAAA,0DAAkC,EAAC,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,KAAK,GAAG,IAAA,gBAAS,EAAC,0BAAkB,EAAE;QAC3C,OAAO,EAAE,oCAAoC;QAC7C,UAAU,EAAE;YACV,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;YAC5C,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;YAC1C,YAAY,EAAE,IAAI;SACnB;QACD,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAChC,CAAC,CAAC;;AAzBQ,0DAAuB;AAQ5B;IADL,IAAA,mBAAG,EAAC,kBAAkB,CAAC;;;;iEAIvB;kCAXU,uBAAuB;IADnC,IAAA,mBAAY,GAAE;GACF,uBAAuB,CA0BnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const permission_tree_nodes_1 = require("../../../../pages/settings/users/permission-tree-nodes");
|
|
5
|
+
function registered(id, children = {}, overrides = {}) {
|
|
6
|
+
return { data: { id, title: id, ...overrides }, children };
|
|
7
|
+
}
|
|
8
|
+
function unregistered(children) {
|
|
9
|
+
return { children };
|
|
10
|
+
}
|
|
11
|
+
describe("[unit] pages/settings/users/permission-tree-nodes", () => {
|
|
12
|
+
it("maps registered permissions to nested nodes", () => {
|
|
13
|
+
const tree = {
|
|
14
|
+
pages: registered("pages", {
|
|
15
|
+
list: registered("pages.list", {}, { title: "List", icon: "i-list" }),
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
(0, chai_1.expect)((0, permission_tree_nodes_1.mapPermissionTreeToPermissionNodes)(tree)).to.deep.equal([
|
|
19
|
+
{
|
|
20
|
+
id: "pages",
|
|
21
|
+
label: "pages",
|
|
22
|
+
icon: undefined,
|
|
23
|
+
children: [
|
|
24
|
+
{
|
|
25
|
+
id: "pages.list",
|
|
26
|
+
label: "List",
|
|
27
|
+
icon: "i-list",
|
|
28
|
+
children: undefined,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
]);
|
|
33
|
+
});
|
|
34
|
+
it("lifts permissions whose parent id is not registered", () => {
|
|
35
|
+
const tree = {
|
|
36
|
+
media: unregistered({
|
|
37
|
+
upload: registered("media.upload"),
|
|
38
|
+
folders: unregistered({ manage: registered("media.folders.manage") }),
|
|
39
|
+
}),
|
|
40
|
+
};
|
|
41
|
+
(0, chai_1.expect)((0, permission_tree_nodes_1.mapPermissionTreeToPermissionNodes)(tree).map((node) => node.id)).to.deep.equal(["media.upload", "media.folders.manage"]);
|
|
42
|
+
});
|
|
43
|
+
it("lifts a permission registered three levels below any registered id", () => {
|
|
44
|
+
const tree = {
|
|
45
|
+
a: unregistered({ b: unregistered({ c: registered("a.b.c") }) }),
|
|
46
|
+
};
|
|
47
|
+
(0, chai_1.expect)((0, permission_tree_nodes_1.mapPermissionTreeToPermissionNodes)(tree)).to.deep.equal([
|
|
48
|
+
{ id: "a.b.c", label: "a.b.c", icon: undefined, children: undefined },
|
|
49
|
+
]);
|
|
50
|
+
});
|
|
51
|
+
it("lifts an orphan permission into its closest registered ancestor", () => {
|
|
52
|
+
const tree = {
|
|
53
|
+
a: registered("a", {
|
|
54
|
+
b: unregistered({ c: registered("a.b.c") }),
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
const [root] = (0, permission_tree_nodes_1.mapPermissionTreeToPermissionNodes)(tree);
|
|
58
|
+
(0, chai_1.expect)(root.id).to.equal("a");
|
|
59
|
+
(0, chai_1.expect)(root.children?.map((node) => node.id)).to.deep.equal(["a.b.c"]);
|
|
60
|
+
});
|
|
61
|
+
it("hides a default-granted permission together with its subtree", () => {
|
|
62
|
+
const tree = {
|
|
63
|
+
docs: registered("docs", { edit: registered("docs.edit") }, { defaultGranted: true }),
|
|
64
|
+
};
|
|
65
|
+
(0, chai_1.expect)((0, permission_tree_nodes_1.mapPermissionTreeToPermissionNodes)(tree)).to.deep.equal([]);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=permission-tree-nodes.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-tree-nodes.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/pages/settings/permission-tree-nodes.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import authMiddleware from "./layers/dms-auth/app/middleware/auth";
|
|
|
9
9
|
import homepageRedirectMiddleware from "./layers/dms-layout/app/middleware/homepage-redirect.global";
|
|
10
10
|
import moduleRoutingMiddleware from "./layers/dms-layout/app/middleware/module-routing.global";
|
|
11
11
|
import pageLeaveGuardMiddleware from "./layers/dms-layout/app/middleware/page-leave-guard.global";
|
|
12
|
+
import colorModePlugin from "./layers/dms-layout/app/plugins/color-mode";
|
|
12
13
|
import interfaceScalePlugin from "./layers/dms-layout/app/plugins/interface-scale";
|
|
13
14
|
import languageSyncPlugin from "./layers/dms-layout/app/plugins/language-sync";
|
|
14
15
|
import seoPlugin from "./layers/dms-layout/app/plugins/seo";
|
|
@@ -143,6 +144,7 @@ function registerPlugins(sdk: Parameters<DmsFrontendModule["setup"]>[0]): void {
|
|
|
143
144
|
await plugin.default(context);
|
|
144
145
|
}, clientOnly);
|
|
145
146
|
}
|
|
147
|
+
sdk.registerPlugin(colorModePlugin);
|
|
146
148
|
sdk.registerPlugin(interfaceScalePlugin);
|
|
147
149
|
sdk.registerPlugin(languageSyncPlugin);
|
|
148
150
|
sdk.registerPlugin(seoPlugin);
|
|
@@ -93,11 +93,13 @@ const toggleCurrentPageFavorite = () => {
|
|
|
93
93
|
const breadcrumb = computed((): BreadcrumbItem[] => {
|
|
94
94
|
const base: BreadcrumbItem[] = [{ label: "home", to: homepage || "/" }];
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
// The path only: with the query, the last segment ("data?table=x") matched
|
|
97
|
+
// no route and the current page dropped out of the breadcrumb.
|
|
98
|
+
if (route.path === (homepage || "/")) {
|
|
97
99
|
return base;
|
|
98
100
|
}
|
|
99
101
|
|
|
100
|
-
const paths = route.
|
|
102
|
+
const paths = route.path.split("/").filter((path) => path);
|
|
101
103
|
|
|
102
104
|
return base.concat(
|
|
103
105
|
paths
|
|
@@ -6,6 +6,13 @@ export interface ScaleOption {
|
|
|
6
6
|
hint: string;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
export type ColorModePreference = "light" | "dark" | "system";
|
|
10
|
+
|
|
11
|
+
export interface ColorModeOption {
|
|
12
|
+
value: ColorModePreference;
|
|
13
|
+
label: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
9
16
|
export interface SystemStateMeta {
|
|
10
17
|
title: string;
|
|
11
18
|
description: string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ColorModePreference } from "./types";
|
|
2
|
+
|
|
3
|
+
export const COLOR_MODE_COOKIE = "dms-color-mode";
|
|
4
|
+
const COLOR_MODE_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;
|
|
5
|
+
const DEFAULT_COLOR_MODE_PREFERENCE: ColorModePreference = "system";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The user's color mode as a cookie ref shared by every caller: assign it to
|
|
9
|
+
* change the theme. The server reads the same cookie, so an explicit `light`
|
|
10
|
+
* or `dark` is already in the rendered HTML; `system` resolves in the browser.
|
|
11
|
+
*/
|
|
12
|
+
export const useColorModePreference = () => {
|
|
13
|
+
return useDmsCookie<ColorModePreference>(COLOR_MODE_COOKIE, {
|
|
14
|
+
default: () => DEFAULT_COLOR_MODE_PREFERENCE,
|
|
15
|
+
maxAge: COLOR_MODE_COOKIE_MAX_AGE,
|
|
16
|
+
});
|
|
17
|
+
};
|
|
@@ -3,7 +3,7 @@ import ThemePreview from "../../build/components/pages/settings/theme/ThemePrevi
|
|
|
3
3
|
import ScalePreview from "../../build/components/pages/settings/theme/ScalePreview.vue";
|
|
4
4
|
import CssVariablesList from "../../build/components/pages/settings/theme/CssVariablesList.vue";
|
|
5
5
|
|
|
6
|
-
const colorOptions = [
|
|
6
|
+
const colorOptions: ColorModeOption[] = [
|
|
7
7
|
{
|
|
8
8
|
value: "system",
|
|
9
9
|
label: "$page.settings.appearance.system",
|
|
@@ -36,7 +36,7 @@ const scaleOptions: ScaleOption[] = [
|
|
|
36
36
|
},
|
|
37
37
|
];
|
|
38
38
|
|
|
39
|
-
const
|
|
39
|
+
const colorModePreference = useColorModePreference();
|
|
40
40
|
const interfaceScale = useInterfaceScale();
|
|
41
41
|
const { processI18n } = useTranslation();
|
|
42
42
|
</script>
|
|
@@ -60,13 +60,13 @@ const { processI18n } = useTranslation();
|
|
|
60
60
|
:key="`color-option-${index}`"
|
|
61
61
|
class="group bg-elevated relative flex cursor-pointer flex-col overflow-hidden rounded-xl transition-all"
|
|
62
62
|
:class="
|
|
63
|
-
|
|
63
|
+
colorModePreference === option.value
|
|
64
64
|
? 'outline-primary outline-2 outline-offset-2'
|
|
65
65
|
: 'ring-default hover:ring-accented ring hover:-translate-y-0.5'
|
|
66
66
|
"
|
|
67
67
|
>
|
|
68
68
|
<input
|
|
69
|
-
v-model="
|
|
69
|
+
v-model="colorModePreference"
|
|
70
70
|
type="radio"
|
|
71
71
|
:value="option.value"
|
|
72
72
|
class="sr-only"
|
|
@@ -85,13 +85,13 @@ const { processI18n } = useTranslation();
|
|
|
85
85
|
<span
|
|
86
86
|
class="ring-accented grid size-4 shrink-0 place-items-center rounded-full ring ring-inset"
|
|
87
87
|
:class="
|
|
88
|
-
|
|
88
|
+
colorModePreference === option.value
|
|
89
89
|
? 'bg-primary ring-primary'
|
|
90
90
|
: ''
|
|
91
91
|
"
|
|
92
92
|
>
|
|
93
93
|
<span
|
|
94
|
-
v-if="
|
|
94
|
+
v-if="colorModePreference === option.value"
|
|
95
95
|
class="bg-default size-1.5 rounded-full"
|
|
96
96
|
/>
|
|
97
97
|
</span>
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type BasicColorSchema,
|
|
3
|
+
useColorMode as useVueUseColorMode,
|
|
4
|
+
} from "@vueuse/core";
|
|
5
|
+
import { type Ref, watch } from "vue";
|
|
6
|
+
import type { ColorModePreference } from "../composables/general/types";
|
|
7
|
+
import {
|
|
8
|
+
COLOR_MODE_COOKIE,
|
|
9
|
+
useColorModePreference,
|
|
10
|
+
} from "../composables/general/useColorModePreference";
|
|
11
|
+
|
|
12
|
+
type ExplicitColorMode = Exclude<ColorModePreference, "system">;
|
|
13
|
+
|
|
14
|
+
/** The preferences that pin their class on `<html>`; any other follows the system. */
|
|
15
|
+
const EXPLICIT_COLOR_MODES: ExplicitColorMode[] = ["light", "dark"];
|
|
16
|
+
const SYSTEM_PREFERENCE: ColorModePreference = "system";
|
|
17
|
+
const VUEUSE_SYSTEM_MODE: BasicColorSchema = "auto";
|
|
18
|
+
/**
|
|
19
|
+
* vueuse's default key. Nuxt UI's `useDark()`, installed with the app, and its
|
|
20
|
+
* color-mode components (`UDashboardSearch`'s theme group…) all read it.
|
|
21
|
+
*/
|
|
22
|
+
const VUEUSE_STORAGE_KEY = "vueuse-color-scheme";
|
|
23
|
+
const DARK_SCHEME_QUERY = "(prefers-color-scheme: dark)";
|
|
24
|
+
const PRE_PAINT_SCRIPT_ID = "dms-color-mode";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Runs in `<head>` before first paint, and so before the entry module installs
|
|
28
|
+
* Nuxt UI: it hands vueuse the cookie's mode, which `useDark()` reads on boot,
|
|
29
|
+
* and sets the `<html>` class, resolving `system` itself. The cookie is read
|
|
30
|
+
* the way `useDmsCookie` writes it (URI-encoded JSON), falling back to the raw
|
|
31
|
+
* value. Source text rather than a serialized function, which a bundler could
|
|
32
|
+
* fill with helpers the page does not have.
|
|
33
|
+
*/
|
|
34
|
+
const PRE_PAINT_SCRIPT = `(() => {
|
|
35
|
+
const modes = ${JSON.stringify(EXPLICIT_COLOR_MODES)};
|
|
36
|
+
const prefix = ${JSON.stringify(`${COLOR_MODE_COOKIE}=`)};
|
|
37
|
+
const entry = document.cookie.split("; ").find((cookie) => cookie.startsWith(prefix)) ?? "";
|
|
38
|
+
let preference = "";
|
|
39
|
+
try {
|
|
40
|
+
preference = decodeURIComponent(entry.slice(prefix.length));
|
|
41
|
+
preference = JSON.parse(preference);
|
|
42
|
+
} catch {}
|
|
43
|
+
const mode = modes.includes(preference) ? preference : ${JSON.stringify(VUEUSE_SYSTEM_MODE)};
|
|
44
|
+
try {
|
|
45
|
+
localStorage.setItem(${JSON.stringify(VUEUSE_STORAGE_KEY)}, mode);
|
|
46
|
+
} catch {}
|
|
47
|
+
const system = matchMedia(${JSON.stringify(DARK_SCHEME_QUERY)}).matches ? "dark" : "light";
|
|
48
|
+
document.documentElement.classList.remove(...modes);
|
|
49
|
+
document.documentElement.classList.add(modes.includes(mode) ? mode : system);
|
|
50
|
+
})();`;
|
|
51
|
+
|
|
52
|
+
function explicitColorMode(value: string): ExplicitColorMode | undefined {
|
|
53
|
+
return EXPLICIT_COLOR_MODES.find((mode) => mode === value);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Mirrors the cookie, the source of truth, into the vueuse store Nuxt UI
|
|
58
|
+
* shares, and a change made from a Nuxt UI component back into the cookie.
|
|
59
|
+
* Each side is written only when it would change, so neither echoes the other.
|
|
60
|
+
*/
|
|
61
|
+
function syncWithVueUse(preference: Ref<ColorModePreference>): void {
|
|
62
|
+
const { store } = useVueUseColorMode({ storageKey: VUEUSE_STORAGE_KEY });
|
|
63
|
+
watch(
|
|
64
|
+
preference,
|
|
65
|
+
(next) => {
|
|
66
|
+
const mode = explicitColorMode(next) ?? VUEUSE_SYSTEM_MODE;
|
|
67
|
+
if (store.value !== mode) store.value = mode;
|
|
68
|
+
},
|
|
69
|
+
{ immediate: true },
|
|
70
|
+
);
|
|
71
|
+
watch(store, (next) => {
|
|
72
|
+
const nextPreference = explicitColorMode(next) ?? SYSTEM_PREFERENCE;
|
|
73
|
+
if (preference.value !== nextPreference) preference.value = nextPreference;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The server renders an explicit preference's class, so the first paint is
|
|
79
|
+
* right before any script runs, and the pre-paint script, which only matters
|
|
80
|
+
* before that paint: inserted later by the browser head it would run after
|
|
81
|
+
* boot and redo what the sync already did. In the browser the class belongs to
|
|
82
|
+
* vueuse, which Nuxt UI already drives it with: were unhead tracking it as
|
|
83
|
+
* well, it would remove it when `dark` gives way to a `system` that still
|
|
84
|
+
* resolves dark, and vueuse, seeing no change, would not put it back. A page
|
|
85
|
+
* rendered without the script (client-side fallback) is corrected by the sync,
|
|
86
|
+
* which applies the cookie on boot.
|
|
87
|
+
*/
|
|
88
|
+
export default defineDmsPlugin(() => {
|
|
89
|
+
const preference = useColorModePreference();
|
|
90
|
+
|
|
91
|
+
if (!import.meta.env.SSR) {
|
|
92
|
+
syncWithVueUse(preference);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const mode = explicitColorMode(preference.value);
|
|
96
|
+
useHead({
|
|
97
|
+
htmlAttrs: mode ? { class: mode } : {},
|
|
98
|
+
script: [{ id: PRE_PAINT_SCRIPT_ID, innerHTML: PRE_PAINT_SCRIPT }],
|
|
99
|
+
});
|
|
100
|
+
});
|