@antelopejs/dms 0.4.5 → 0.4.7

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 (178) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/hooks/invite-extensions.js +2 -2
  3. package/dist/hooks/invite-extensions.js.map +1 -1
  4. package/dist/implementations/dms/layout-banners.d.ts +18 -0
  5. package/dist/implementations/dms/layout-banners.js +60 -0
  6. package/dist/implementations/dms/layout-banners.js.map +1 -0
  7. package/dist/implementations/dms/page.d.ts +2 -0
  8. package/dist/implementations/dms/page.js +82 -27
  9. package/dist/implementations/dms/page.js.map +1 -1
  10. package/dist/implementations/dms/quick-actions.d.ts +5 -0
  11. package/dist/implementations/dms/quick-actions.js.map +1 -1
  12. package/dist/implementations/dms/resolver-timeout.d.ts +1 -0
  13. package/dist/implementations/dms/resolver-timeout.js +13 -0
  14. package/dist/implementations/dms/resolver-timeout.js.map +1 -0
  15. package/dist/implementations/dms/saas-mode.d.ts +8 -0
  16. package/dist/implementations/dms/saas-mode.js +20 -0
  17. package/dist/implementations/dms/saas-mode.js.map +1 -0
  18. package/dist/implementations/dms-auth/index.d.ts +2 -1
  19. package/dist/implementations/dms-auth/index.js +19 -8
  20. package/dist/implementations/dms-auth/index.js.map +1 -1
  21. package/dist/implementations/dms-html-render/service-jwt.js +2 -1
  22. package/dist/implementations/dms-html-render/service-jwt.js.map +1 -1
  23. package/dist/index.js +2 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/pages/settings/users/index.d.ts +1 -0
  26. package/dist/pages/settings/users/index.js +1 -0
  27. package/dist/pages/settings/users/index.js.map +1 -1
  28. package/dist/pages/settings/users/invite-extension-routes.d.ts +4 -0
  29. package/dist/pages/settings/users/invite-extension-routes.js +57 -0
  30. package/dist/pages/settings/users/invite-extension-routes.js.map +1 -0
  31. package/dist/pages/settings/users/invites.d.ts +2 -1
  32. package/dist/pages/settings/users/invites.js +17 -5
  33. package/dist/pages/settings/users/invites.js.map +1 -1
  34. package/dist/pages/settings/users/members.d.ts +4 -1
  35. package/dist/pages/settings/users/members.js +10 -6
  36. package/dist/pages/settings/users/members.js.map +1 -1
  37. package/dist/pages/settings/users/notifications.js +1 -1
  38. package/dist/pages/settings/users/notifications.js.map +1 -1
  39. package/dist/pages/settings/users/quick-actions.d.ts +1 -0
  40. package/dist/pages/settings/users/quick-actions.js +22 -0
  41. package/dist/pages/settings/users/quick-actions.js.map +1 -0
  42. package/dist/routes/auth/signup.d.ts +2 -0
  43. package/dist/routes/auth/signup.js +7 -2
  44. package/dist/routes/auth/signup.js.map +1 -1
  45. package/dist/test/integration/invite-extension-edit.test.d.ts +1 -0
  46. package/dist/test/integration/invite-extension-edit.test.js +122 -0
  47. package/dist/test/integration/invite-extension-edit.test.js.map +1 -0
  48. package/dist/test/integration/saas-mode-ownership.test.d.ts +1 -0
  49. package/dist/test/integration/saas-mode-ownership.test.js +81 -0
  50. package/dist/test/integration/saas-mode-ownership.test.js.map +1 -0
  51. package/dist/test/integration/tenant-lifecycle.test.js +38 -0
  52. package/dist/test/integration/tenant-lifecycle.test.js.map +1 -1
  53. package/dist/test/unit/implementations/dms/layout-banners.test.d.ts +1 -0
  54. package/dist/test/unit/implementations/dms/layout-banners.test.js +217 -0
  55. package/dist/test/unit/implementations/dms/layout-banners.test.js.map +1 -0
  56. package/dist/test/unit/implementations/dms/quick-actions-button.test.d.ts +1 -0
  57. package/dist/test/unit/implementations/dms/quick-actions-button.test.js +220 -0
  58. package/dist/test/unit/implementations/dms/quick-actions-button.test.js.map +1 -0
  59. package/dist/test/unit/implementations/dms-html-render/generate-html.test.js +1 -1
  60. package/dist/test/unit/implementations/dms-html-render/generate-html.test.js.map +1 -1
  61. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.d.ts +1 -0
  62. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.js +37 -0
  63. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.js.map +1 -0
  64. package/dist/test/unit/interfaces/dms/invite-extension.test.js +138 -12
  65. package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
  66. package/dist/test/unit/interfaces/dms/password-policy.test.d.ts +1 -0
  67. package/dist/test/unit/interfaces/dms/password-policy.test.js +43 -0
  68. package/dist/test/unit/interfaces/dms/password-policy.test.js.map +1 -0
  69. package/dist/test/unit/interfaces/dms/saas-mode.test.d.ts +1 -0
  70. package/dist/test/unit/interfaces/dms/saas-mode.test.js +42 -0
  71. package/dist/test/unit/interfaces/dms/saas-mode.test.js.map +1 -0
  72. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.d.ts +1 -0
  73. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js +53 -0
  74. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js.map +1 -0
  75. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.d.ts +1 -0
  76. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.js +80 -0
  77. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.js.map +1 -0
  78. package/dist/test/unit/pages/settings/invite-member-quick-action.test.d.ts +1 -0
  79. package/dist/test/unit/pages/settings/invite-member-quick-action.test.js +104 -0
  80. package/dist/test/unit/pages/settings/invite-member-quick-action.test.js.map +1 -0
  81. package/dist/test/unit/pages/settings/notifications-access-gate.test.d.ts +1 -0
  82. package/dist/test/unit/pages/settings/notifications-access-gate.test.js +78 -0
  83. package/dist/test/unit/pages/settings/notifications-access-gate.test.js.map +1 -0
  84. package/dist/test/unit/signup-account-guard.test.js +20 -2
  85. package/dist/test/unit/signup-account-guard.test.js.map +1 -1
  86. package/dist/test/unit/utils/admin-invite-email.test.d.ts +1 -0
  87. package/dist/test/unit/utils/admin-invite-email.test.js +69 -0
  88. package/dist/test/unit/utils/admin-invite-email.test.js.map +1 -0
  89. package/dist/utils/admin-invite-email.d.ts +14 -0
  90. package/dist/utils/admin-invite-email.js +51 -0
  91. package/dist/utils/admin-invite-email.js.map +1 -0
  92. package/dist/utils/index.d.ts +0 -1
  93. package/dist/utils/index.js +0 -1
  94. package/dist/utils/index.js.map +1 -1
  95. package/dist/validation/auth.schema.d.ts +3 -3
  96. package/dist/validation/auth.schema.js +1 -1
  97. package/dist/validation/auth.schema.js.map +1 -1
  98. package/dist/validation/password.d.ts +0 -1
  99. package/dist/validation/password.js +6 -3
  100. package/dist/validation/password.js.map +1 -1
  101. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +37 -8
  102. package/frontend-vue/layers/dms-auth/i18n/locales/auth-en-GB.json +3 -1
  103. package/frontend-vue/layers/dms-auth/i18n/locales/auth-fr-FR.json +3 -1
  104. package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +4 -0
  105. package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +4 -0
  106. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardBanners.vue +50 -0
  107. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +16 -13
  108. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +2 -2
  109. package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +11 -5
  110. package/frontend-vue/layers/dms-layout/app/build/components/notification/widgetRequest.ts +20 -0
  111. package/frontend-vue/layers/dms-layout/app/composables/layout/useLayoutBanners.ts +59 -0
  112. package/frontend-vue/layers/dms-layout/app/composables/page/useQuickActions.ts +15 -2
  113. package/frontend-vue/layers/dms-layout/app/custom-layouts/DefaultLayout.vue +2 -0
  114. package/frontend-vue/layers/dms-layout/app/emails/EmailAdminInvite.vue +54 -9
  115. package/frontend-vue/layers/dms-layout/app/error.vue +17 -2
  116. package/frontend-vue/layers/dms-layout/app/types/page.ts +22 -0
  117. package/frontend-vue/layers/dms-layout/app/utils/breadcrumb.ts +48 -0
  118. package/frontend-vue/layers/dms-layout/app/utils/favorites.ts +94 -0
  119. package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +21 -2
  120. package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +21 -2
  121. package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/index.ts +1 -1
  122. package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/{useOnboardingMiddleware.ts → useOnboarding.ts} +0 -12
  123. package/frontend-vue/layers/dms-onboarding/app/custom-pages/onboarding.vue +4 -1
  124. package/frontend-vue/layers/dms-onboarding/app/middleware/onboarding.global.ts +21 -4
  125. package/frontend-vue/layers/dms-ui/app/build/components/containers/drawer/DynamicDrawer.vue +13 -3
  126. package/frontend-vue/layers/dms-ui/app/build/components/containers/modal/DynamicModal.vue +13 -3
  127. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewConfig.ts +2 -7
  128. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/columnVisibility.ts +13 -0
  129. package/frontend-vue/layers/dms-ui/app/components/PasswordStrength.vue +1 -1
  130. package/frontend-vue/layers/dms-ui/app/components/activity/ActivityItem.vue +1 -1
  131. package/frontend-vue/layers/dms-ui/app/components/banner/Banner.vue +1 -1
  132. package/frontend-vue/layers/dms-ui/app/components/card/NavCard.vue +2 -2
  133. package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +6 -16
  134. package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +2 -2
  135. package/frontend-vue/layers/dms-ui/app/components/chart/internal/TrendBadge.vue +1 -1
  136. package/frontend-vue/layers/dms-ui/app/components/copy/CopyButton.vue +1 -1
  137. package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +3 -3
  138. package/frontend-vue/layers/dms-ui/app/components/master-detail/MasterDetail.vue +5 -1
  139. package/frontend-vue/layers/dms-ui/app/components/segmented/Segmented.vue +1 -1
  140. package/frontend-vue/layers/dms-ui/app/components/status/StatusSummary.vue +1 -1
  141. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +35 -11
  142. package/frontend-vue/layers/dms-ui/app/components/tree/Tree.vue +10 -9
  143. package/frontend-vue/layers/dms-ui/app/composables/chart/donutRecords.ts +26 -0
  144. package/frontend-vue/layers/dms-ui/app/composables/tab/types/props.ts +4 -2
  145. package/frontend-vue/layers/dms-ui/app/composables/tab/useTab.ts +3 -3
  146. package/frontend-vue/layers/dms-ui/app/composables/table-view/shortcuts/index.ts +17 -4
  147. package/frontend-vue/layers/dms-ui/app/composables/table-view/shortcuts/tableViewEscape.ts +22 -0
  148. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/column.ts +1 -1
  149. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/custom-button.ts +2 -0
  150. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/index.ts +19 -4
  151. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeEscape.ts +21 -0
  152. package/frontend-vue/layers/dms-ui/app/types/quick-actions.ts +38 -3
  153. package/frontend-vue/layers/dms-ui/app/utils/overlayFocus.ts +16 -0
  154. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +4 -2
  155. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +4 -2
  156. package/frontend-vue/package.json +1 -1
  157. package/frontend-vue/pnpm-lock.yaml +5 -5
  158. package/frontend-vue/tests/admin-invite-email.test.ts +86 -0
  159. package/frontend-vue/tests/breadcrumb-target.test.ts +50 -0
  160. package/frontend-vue/tests/chart-nested-donut.test.ts +97 -0
  161. package/frontend-vue/tests/error-page-message.test.ts +83 -0
  162. package/frontend-vue/tests/favorite-page.test.ts +104 -0
  163. package/frontend-vue/tests/icon-aria-hidden.test.ts +29 -0
  164. package/frontend-vue/tests/layout-banners.test.ts +224 -0
  165. package/frontend-vue/tests/notification-popover-errors.test.ts +147 -0
  166. package/frontend-vue/tests/onboarding-middleware.test.ts +103 -0
  167. package/frontend-vue/tests/password-strength-meter.test.ts +33 -0
  168. package/frontend-vue/tests/quick-action-intent.test.ts +74 -0
  169. package/frontend-vue/tests/quick-actions.test.ts +23 -0
  170. package/frontend-vue/tests/signup-invitation-link.test.ts +126 -0
  171. package/frontend-vue/tests/skeleton-paragraph.test.ts +30 -0
  172. package/frontend-vue/tests/tab-without-component-id.test.ts +51 -0
  173. package/frontend-vue/tests/table-column-visibility.test.ts +20 -0
  174. package/frontend-vue/tests/table-view-escape-shortcut.test.ts +141 -0
  175. package/frontend-vue/tests/tree-escape-shortcut.test.ts +138 -0
  176. package/frontend-vue/tests/vue-inventory.test.ts +1 -1
  177. package/package.json +2 -2
  178. package/skills/dms/REFERENCE.md +1 -1
@@ -0,0 +1,141 @@
1
+ // @vitest-environment jsdom
2
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
3
+ import {
4
+ computed,
5
+ createApp,
6
+ defineComponent,
7
+ nextTick,
8
+ ref,
9
+ shallowRef,
10
+ type App,
11
+ type Ref,
12
+ type ShallowRef,
13
+ } from "vue";
14
+ import { useActiveElement } from "@vueuse/core";
15
+ import type { RowSelectionState } from "@tanstack/vue-table";
16
+ import { defineShortcuts } from "@nuxt/ui/runtime/composables/defineShortcuts.js";
17
+ import {
18
+ TABLE_VIEW_SHORTCUTS_METADATA,
19
+ buildTableViewShortcuts,
20
+ } from "../layers/dms-ui/app/composables/table-view/shortcuts";
21
+
22
+ let app: App;
23
+ let host: HTMLDivElement;
24
+ let globalFilter: ShallowRef<string | undefined>;
25
+ let rowSelect: Ref<RowSelectionState>;
26
+
27
+ function mountTableShortcuts() {
28
+ const Harness = defineComponent({
29
+ setup() {
30
+ defineShortcuts(
31
+ buildTableViewShortcuts({
32
+ refresh: () => {},
33
+ tableProps: computed(() => ({})),
34
+ newRow: () => {},
35
+ globalFilter,
36
+ rowSelect,
37
+ data: ref(null),
38
+ activeElement: useActiveElement(),
39
+ }),
40
+ );
41
+ return () => null;
42
+ },
43
+ });
44
+ app = createApp(Harness);
45
+ app.mount(host);
46
+ }
47
+
48
+ function pressEscape(target: EventTarget = document.body): KeyboardEvent {
49
+ const event = new KeyboardEvent("keydown", {
50
+ key: "Escape",
51
+ code: "Escape",
52
+ bubbles: true,
53
+ cancelable: true,
54
+ });
55
+ target.dispatchEvent(event);
56
+ return event;
57
+ }
58
+
59
+ beforeEach(() => {
60
+ host = document.createElement("div");
61
+ document.body.appendChild(host);
62
+ globalFilter = shallowRef<string | undefined>(undefined);
63
+ rowSelect = ref<RowSelectionState>({});
64
+ });
65
+
66
+ afterEach(() => {
67
+ app.unmount();
68
+ document.body.innerHTML = "";
69
+ });
70
+
71
+ describe("TableView Escape shortcut", () => {
72
+ it("leaves Escape to overlays when there is nothing to clear", async () => {
73
+ mountTableShortcuts();
74
+ await nextTick();
75
+
76
+ expect(pressEscape().defaultPrevented).toBe(false);
77
+ });
78
+
79
+ it("closes the search when a global filter is set", async () => {
80
+ globalFilter.value = "acme";
81
+ mountTableShortcuts();
82
+ await nextTick();
83
+
84
+ expect(pressEscape().defaultPrevented).toBe(true);
85
+ expect(globalFilter.value).toBeUndefined();
86
+ });
87
+
88
+ it("clears the row selection when no search is open", async () => {
89
+ rowSelect.value = { a: true, b: true };
90
+ mountTableShortcuts();
91
+ await nextTick();
92
+
93
+ expect(pressEscape().defaultPrevented).toBe(true);
94
+ expect(rowSelect.value).toEqual({});
95
+ });
96
+
97
+ it("closes the search before touching the selection", async () => {
98
+ globalFilter.value = "";
99
+ rowSelect.value = { a: true };
100
+ mountTableShortcuts();
101
+ await nextTick();
102
+
103
+ pressEscape();
104
+ expect(globalFilter.value).toBeUndefined();
105
+ expect(rowSelect.value).toEqual({ a: true });
106
+ });
107
+
108
+ it("stops handling Escape once the filter is cleared", async () => {
109
+ globalFilter.value = "acme";
110
+ mountTableShortcuts();
111
+ await nextTick();
112
+
113
+ pressEscape();
114
+ await nextTick();
115
+ expect(pressEscape().defaultPrevented).toBe(false);
116
+ });
117
+
118
+ it("lets an open dialog take Escape even with a filter set", async () => {
119
+ globalFilter.value = "acme";
120
+ mountTableShortcuts();
121
+ const dialog = document.createElement("div");
122
+ dialog.setAttribute("role", "dialog");
123
+ const button = document.createElement("button");
124
+ dialog.appendChild(button);
125
+ document.body.appendChild(dialog);
126
+ button.focus();
127
+ await nextTick();
128
+
129
+ expect(pressEscape(button).defaultPrevented).toBe(false);
130
+ expect(globalFilter.value).toBe("acme");
131
+ });
132
+
133
+ it("describes when the shortcut applies in the help list", () => {
134
+ const escape = TABLE_VIEW_SHORTCUTS_METADATA.find((metadata) =>
135
+ metadata.key.includes("$keyboard.escape"),
136
+ );
137
+ expect(escape?.condition?.descriptionKey).toBe(
138
+ "$dms.shortcuts.tableview.escape.condition",
139
+ );
140
+ });
141
+ });
@@ -0,0 +1,138 @@
1
+ // @vitest-environment jsdom
2
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
3
+ import {
4
+ computed,
5
+ createApp,
6
+ defineComponent,
7
+ nextTick,
8
+ ref,
9
+ type App,
10
+ type Ref,
11
+ } from "vue";
12
+ import { useActiveElement } from "@vueuse/core";
13
+ import { defineShortcuts } from "@nuxt/ui/runtime/composables/defineShortcuts.js";
14
+ import {
15
+ TREE_SHORTCUTS_METADATA,
16
+ buildTreeShortcuts,
17
+ } from "../layers/dms-ui/app/composables/tree/shortcuts";
18
+ import type {
19
+ TreeNode,
20
+ TreeProps,
21
+ } from "../layers/dms-ui/app/composables/tree/types";
22
+
23
+ let app: App;
24
+ let host: HTMLDivElement;
25
+ let selected: Ref<TreeNode | TreeNode[] | undefined>;
26
+
27
+ const nodeA = { label: "A", value: "a" } as TreeNode;
28
+ const nodeB = { label: "B", value: "b" } as TreeNode;
29
+
30
+ function mountTreeShortcuts(multiple = false) {
31
+ const Harness = defineComponent({
32
+ setup() {
33
+ defineShortcuts(
34
+ buildTreeShortcuts({
35
+ navigateTree: () => {},
36
+ props: { multiple } as TreeProps,
37
+ items: computed(() => [nodeA, nodeB]),
38
+ selected,
39
+ activeElement: useActiveElement(),
40
+ }),
41
+ );
42
+ return () => null;
43
+ },
44
+ });
45
+ app = createApp(Harness);
46
+ app.mount(host);
47
+ }
48
+
49
+ function pressEscape(target: EventTarget = document.body): KeyboardEvent {
50
+ const event = new KeyboardEvent("keydown", {
51
+ key: "Escape",
52
+ code: "Escape",
53
+ bubbles: true,
54
+ cancelable: true,
55
+ });
56
+ target.dispatchEvent(event);
57
+ return event;
58
+ }
59
+
60
+ beforeEach(() => {
61
+ host = document.createElement("div");
62
+ document.body.appendChild(host);
63
+ selected = ref<TreeNode | TreeNode[] | undefined>(undefined);
64
+ });
65
+
66
+ afterEach(() => {
67
+ app.unmount();
68
+ document.body.innerHTML = "";
69
+ });
70
+
71
+ describe("Tree Escape shortcut", () => {
72
+ it("leaves Escape to overlays when nothing is selected", async () => {
73
+ mountTreeShortcuts();
74
+ await nextTick();
75
+
76
+ expect(pressEscape().defaultPrevented).toBe(false);
77
+ });
78
+
79
+ it("leaves Escape to overlays when a multiple selection is empty", async () => {
80
+ selected.value = [];
81
+ mountTreeShortcuts(true);
82
+ await nextTick();
83
+
84
+ expect(pressEscape().defaultPrevented).toBe(false);
85
+ });
86
+
87
+ it("deselects the node in single selection mode", async () => {
88
+ selected.value = nodeA;
89
+ mountTreeShortcuts();
90
+ await nextTick();
91
+
92
+ expect(pressEscape().defaultPrevented).toBe(true);
93
+ expect(selected.value).toBeUndefined();
94
+ });
95
+
96
+ it("clears every node in multiple selection mode", async () => {
97
+ selected.value = [nodeA, nodeB];
98
+ mountTreeShortcuts(true);
99
+ await nextTick();
100
+
101
+ expect(pressEscape().defaultPrevented).toBe(true);
102
+ expect(selected.value).toEqual([]);
103
+ });
104
+
105
+ it("stops handling Escape once the selection is cleared", async () => {
106
+ selected.value = [nodeA];
107
+ mountTreeShortcuts(true);
108
+ await nextTick();
109
+
110
+ pressEscape();
111
+ await nextTick();
112
+ expect(pressEscape().defaultPrevented).toBe(false);
113
+ });
114
+
115
+ it("lets an open dialog take Escape even with a selection", async () => {
116
+ selected.value = nodeA;
117
+ mountTreeShortcuts();
118
+ const dialog = document.createElement("div");
119
+ dialog.setAttribute("role", "dialog");
120
+ const button = document.createElement("button");
121
+ dialog.appendChild(button);
122
+ document.body.appendChild(dialog);
123
+ button.focus();
124
+ await nextTick();
125
+
126
+ expect(pressEscape(button).defaultPrevented).toBe(false);
127
+ expect(selected.value).toStrictEqual(nodeA);
128
+ });
129
+
130
+ it("describes when the shortcut applies in the help list", () => {
131
+ const escape = TREE_SHORTCUTS_METADATA.find((metadata) =>
132
+ metadata.key.includes("$keyboard.escape"),
133
+ );
134
+ expect(escape?.condition?.descriptionKey).toBe(
135
+ "$dms.shortcuts.tree.escape.condition",
136
+ );
137
+ });
138
+ });
@@ -2,7 +2,7 @@ import { readFileSync, readdirSync, statSync } from "node:fs";
2
2
  import { join, relative } from "node:path";
3
3
  import { describe, expect, it } from "vitest";
4
4
 
5
- const EXPECTED_VUE_FILES = 143;
5
+ const EXPECTED_VUE_FILES = 144;
6
6
 
7
7
  function walk(directory: string): string[] {
8
8
  return readdirSync(directory).flatMap((name) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antelopejs/dms",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/AntelopeJS/dms.git"
@@ -36,7 +36,7 @@
36
36
  "@antelopejs/interface-data-api": ">=0.1.9 <1.0.0",
37
37
  "@antelopejs/interface-database": ">=0.1.7 <1.0.0",
38
38
  "@antelopejs/interface-database-decorators": ">=0.1.6 <1.0.0",
39
- "@antelopejs/interface-dms": ">=0.2.0 <1.0.0",
39
+ "@antelopejs/interface-dms": ">=0.2.6 <1.0.0",
40
40
  "@antelopejs/interface-email": ">=0.0.5 <1.0.0",
41
41
  "@antelopejs/interface-file-storage": ">=0.1.3 <1.0.0",
42
42
  "archiver": "^7.0.1",
@@ -21,7 +21,7 @@ List a section to see its files:
21
21
 
22
22
  Everything the DMS exposes to a consumer ships in **one** package, `@antelopejs/interface-dms`,
23
23
  split into subpaths: `/page`, `/component`, `/permissions`, `/guards`, `/db`, `/hooks`, `/realtime`,
24
- `/quick-actions`, `/auth` (+ `/auth/db`), `/base` (+ `/base/form`, `/base/table-view`,
24
+ `/quick-actions`, `/layout-banners`, `/auth` (+ `/auth/db`), `/base` (+ `/base/form`, `/base/table-view`,
25
25
  `/base/data-types`, `/base/types`, …), `/notifications`, `/html-render`. There is no separate
26
26
  `dms-auth` or `dms-base` interface, and nothing is imported through the runtime package
27
27
  `@antelopejs/dms`. Other modules follow the same shape: one `interface-<name>` package per module.