@antelopejs/dms 0.4.4 → 0.4.6

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 (205) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/config.d.ts +1 -0
  3. package/dist/config.js.map +1 -1
  4. package/dist/hooks/invite-extensions.js +2 -2
  5. package/dist/hooks/invite-extensions.js.map +1 -1
  6. package/dist/implementations/dms/layout-banners.d.ts +18 -0
  7. package/dist/implementations/dms/layout-banners.js +60 -0
  8. package/dist/implementations/dms/layout-banners.js.map +1 -0
  9. package/dist/implementations/dms/page.d.ts +3 -0
  10. package/dist/implementations/dms/page.js +90 -28
  11. package/dist/implementations/dms/page.js.map +1 -1
  12. package/dist/implementations/dms/quick-actions.d.ts +5 -0
  13. package/dist/implementations/dms/quick-actions.js.map +1 -1
  14. package/dist/implementations/dms/resolver-timeout.d.ts +1 -0
  15. package/dist/implementations/dms/resolver-timeout.js +13 -0
  16. package/dist/implementations/dms/resolver-timeout.js.map +1 -0
  17. package/dist/implementations/dms/saas-mode.d.ts +8 -0
  18. package/dist/implementations/dms/saas-mode.js +20 -0
  19. package/dist/implementations/dms/saas-mode.js.map +1 -0
  20. package/dist/implementations/dms/stale-session.d.ts +2 -0
  21. package/dist/implementations/dms/stale-session.js +16 -0
  22. package/dist/implementations/dms/stale-session.js.map +1 -0
  23. package/dist/implementations/dms-auth/index.d.ts +3 -1
  24. package/dist/implementations/dms-auth/index.js +38 -8
  25. package/dist/implementations/dms-auth/index.js.map +1 -1
  26. package/dist/implementations/dms-html-render/service-jwt.js +2 -1
  27. package/dist/implementations/dms-html-render/service-jwt.js.map +1 -1
  28. package/dist/index.js +2 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/pages/settings/users/index.d.ts +1 -0
  31. package/dist/pages/settings/users/index.js +1 -0
  32. package/dist/pages/settings/users/index.js.map +1 -1
  33. package/dist/pages/settings/users/invite-extension-routes.d.ts +4 -0
  34. package/dist/pages/settings/users/invite-extension-routes.js +57 -0
  35. package/dist/pages/settings/users/invite-extension-routes.js.map +1 -0
  36. package/dist/pages/settings/users/invites.d.ts +2 -1
  37. package/dist/pages/settings/users/invites.js +17 -5
  38. package/dist/pages/settings/users/invites.js.map +1 -1
  39. package/dist/pages/settings/users/members.d.ts +4 -1
  40. package/dist/pages/settings/users/members.js +10 -6
  41. package/dist/pages/settings/users/members.js.map +1 -1
  42. package/dist/pages/settings/users/notifications.js +1 -1
  43. package/dist/pages/settings/users/notifications.js.map +1 -1
  44. package/dist/pages/settings/users/quick-actions.d.ts +1 -0
  45. package/dist/pages/settings/users/quick-actions.js +22 -0
  46. package/dist/pages/settings/users/quick-actions.js.map +1 -0
  47. package/dist/routes/auth/client-ip.d.ts +7 -0
  48. package/dist/routes/auth/client-ip.js +42 -0
  49. package/dist/routes/auth/client-ip.js.map +1 -0
  50. package/dist/routes/auth/index.d.ts +1 -0
  51. package/dist/routes/auth/index.js +1 -0
  52. package/dist/routes/auth/index.js.map +1 -1
  53. package/dist/routes/auth/signup.d.ts +2 -0
  54. package/dist/routes/auth/signup.js +7 -2
  55. package/dist/routes/auth/signup.js.map +1 -1
  56. package/dist/routes/auth.d.ts +3 -0
  57. package/dist/routes/auth.js +15 -4
  58. package/dist/routes/auth.js.map +1 -1
  59. package/dist/test/integration/auth/client-ip.test.d.ts +1 -0
  60. package/dist/test/integration/auth/client-ip.test.js +14 -0
  61. package/dist/test/integration/auth/client-ip.test.js.map +1 -0
  62. package/dist/test/integration/invite-extension-edit.test.d.ts +1 -0
  63. package/dist/test/integration/invite-extension-edit.test.js +122 -0
  64. package/dist/test/integration/invite-extension-edit.test.js.map +1 -0
  65. package/dist/test/integration/page-session.test.d.ts +1 -0
  66. package/dist/test/integration/page-session.test.js +52 -0
  67. package/dist/test/integration/page-session.test.js.map +1 -0
  68. package/dist/test/integration/saas-mode-ownership.test.d.ts +1 -0
  69. package/dist/test/integration/saas-mode-ownership.test.js +81 -0
  70. package/dist/test/integration/saas-mode-ownership.test.js.map +1 -0
  71. package/dist/test/integration/tenant-lifecycle.test.js +38 -0
  72. package/dist/test/integration/tenant-lifecycle.test.js.map +1 -1
  73. package/dist/test/unit/client-ip.test.d.ts +1 -0
  74. package/dist/test/unit/client-ip.test.js +77 -0
  75. package/dist/test/unit/client-ip.test.js.map +1 -0
  76. package/dist/test/unit/implementations/dms/layout-banners.test.d.ts +1 -0
  77. package/dist/test/unit/implementations/dms/layout-banners.test.js +217 -0
  78. package/dist/test/unit/implementations/dms/layout-banners.test.js.map +1 -0
  79. package/dist/test/unit/implementations/dms/quick-actions-button.test.d.ts +1 -0
  80. package/dist/test/unit/implementations/dms/quick-actions-button.test.js +220 -0
  81. package/dist/test/unit/implementations/dms/quick-actions-button.test.js.map +1 -0
  82. package/dist/test/unit/implementations/dms-html-render/generate-html.test.js +1 -1
  83. package/dist/test/unit/implementations/dms-html-render/generate-html.test.js.map +1 -1
  84. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.d.ts +1 -0
  85. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.js +37 -0
  86. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.js.map +1 -0
  87. package/dist/test/unit/interfaces/dms/invite-extension.test.js +138 -12
  88. package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
  89. package/dist/test/unit/interfaces/dms/saas-mode.test.d.ts +1 -0
  90. package/dist/test/unit/interfaces/dms/saas-mode.test.js +42 -0
  91. package/dist/test/unit/interfaces/dms/saas-mode.test.js.map +1 -0
  92. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.d.ts +1 -0
  93. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js +53 -0
  94. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js.map +1 -0
  95. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.d.ts +1 -0
  96. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.js +80 -0
  97. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.js.map +1 -0
  98. package/dist/test/unit/interfaces/dms-base/table-view-tab-count-warning.test.d.ts +1 -0
  99. package/dist/test/unit/interfaces/dms-base/table-view-tab-count-warning.test.js +96 -0
  100. package/dist/test/unit/interfaces/dms-base/table-view-tab-count-warning.test.js.map +1 -0
  101. package/dist/test/unit/pages/settings/invite-member-quick-action.test.d.ts +1 -0
  102. package/dist/test/unit/pages/settings/invite-member-quick-action.test.js +104 -0
  103. package/dist/test/unit/pages/settings/invite-member-quick-action.test.js.map +1 -0
  104. package/dist/test/unit/pages/settings/notifications-access-gate.test.d.ts +1 -0
  105. package/dist/test/unit/pages/settings/notifications-access-gate.test.js +78 -0
  106. package/dist/test/unit/pages/settings/notifications-access-gate.test.js.map +1 -0
  107. package/dist/test/unit/signup-account-guard.test.js +20 -2
  108. package/dist/test/unit/signup-account-guard.test.js.map +1 -1
  109. package/dist/test/unit/utils/admin-invite-email.test.d.ts +1 -0
  110. package/dist/test/unit/utils/admin-invite-email.test.js +69 -0
  111. package/dist/test/unit/utils/admin-invite-email.test.js.map +1 -0
  112. package/dist/utils/admin-invite-email.d.ts +14 -0
  113. package/dist/utils/admin-invite-email.js +51 -0
  114. package/dist/utils/admin-invite-email.js.map +1 -0
  115. package/dist/utils/index.d.ts +0 -1
  116. package/dist/utils/index.js +0 -1
  117. package/dist/utils/index.js.map +1 -1
  118. package/dist/validation/auth.schema.d.ts +3 -3
  119. package/dist/validation/auth.schema.js +1 -1
  120. package/dist/validation/auth.schema.js.map +1 -1
  121. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +37 -8
  122. package/frontend-vue/layers/dms-auth/app/middleware/auth.ts +5 -2
  123. package/frontend-vue/layers/dms-auth/i18n/locales/auth-en-GB.json +3 -1
  124. package/frontend-vue/layers/dms-auth/i18n/locales/auth-fr-FR.json +3 -1
  125. package/frontend-vue/layers/dms-core/app/composables/useApiError.ts +27 -2
  126. package/frontend-vue/layers/dms-core/app/utils/menu.ts +26 -10
  127. package/frontend-vue/layers/dms-core/app/utils/routePath.ts +23 -0
  128. package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +3 -0
  129. package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +3 -0
  130. package/frontend-vue/layers/dms-core/shared/types/runtime-config.d.ts +4 -1
  131. package/frontend-vue/layers/dms-layout/app/app.config.ts +9 -1
  132. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardBanners.vue +50 -0
  133. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +16 -13
  134. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +2 -2
  135. package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +11 -5
  136. package/frontend-vue/layers/dms-layout/app/build/components/notification/widgetRequest.ts +20 -0
  137. package/frontend-vue/layers/dms-layout/app/components/navigation/CollapsedMenuItem.vue +0 -5
  138. package/frontend-vue/layers/dms-layout/app/components/profile/ProfileLanguage.vue +3 -23
  139. package/frontend-vue/layers/dms-layout/app/composables/layout/useLayoutBanners.ts +59 -0
  140. package/frontend-vue/layers/dms-layout/app/composables/page/useQuickActions.ts +15 -2
  141. package/frontend-vue/layers/dms-layout/app/composables/profile/useUserLanguage.ts +33 -0
  142. package/frontend-vue/layers/dms-layout/app/custom-layouts/DefaultLayout.vue +2 -0
  143. package/frontend-vue/layers/dms-layout/app/emails/EmailAdminInvite.vue +54 -9
  144. package/frontend-vue/layers/dms-layout/app/error.vue +17 -2
  145. package/frontend-vue/layers/dms-layout/app/plugins/command-palette-session.client.ts +2 -1
  146. package/frontend-vue/layers/dms-layout/app/types/page.ts +22 -0
  147. package/frontend-vue/layers/dms-layout/app/utils/breadcrumb.ts +48 -0
  148. package/frontend-vue/layers/dms-layout/app/utils/favorites.ts +94 -0
  149. package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +21 -2
  150. package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +21 -2
  151. package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/index.ts +1 -1
  152. package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/{useOnboardingMiddleware.ts → useOnboarding.ts} +0 -12
  153. package/frontend-vue/layers/dms-onboarding/app/custom-pages/onboarding.vue +4 -1
  154. package/frontend-vue/layers/dms-onboarding/app/middleware/onboarding.global.ts +21 -4
  155. package/frontend-vue/layers/dms-ui/app/build/components/containers/drawer/DynamicDrawer.vue +13 -3
  156. package/frontend-vue/layers/dms-ui/app/build/components/containers/modal/DynamicModal.vue +13 -3
  157. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerDefaults.ts +31 -3
  158. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/relationBadges.ts +36 -0
  159. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewConfig.ts +2 -7
  160. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/columnVisibility.ts +13 -0
  161. package/frontend-vue/layers/dms-ui/app/build/types/tree.ts +5 -10
  162. package/frontend-vue/layers/dms-ui/app/components/PasswordStrength.vue +1 -1
  163. package/frontend-vue/layers/dms-ui/app/components/activity/ActivityItem.vue +1 -1
  164. package/frontend-vue/layers/dms-ui/app/components/banner/Banner.vue +1 -1
  165. package/frontend-vue/layers/dms-ui/app/components/card/NavCard.vue +2 -2
  166. package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +6 -16
  167. package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +2 -2
  168. package/frontend-vue/layers/dms-ui/app/components/chart/internal/TrendBadge.vue +1 -1
  169. package/frontend-vue/layers/dms-ui/app/components/copy/CopyButton.vue +1 -1
  170. package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +3 -3
  171. package/frontend-vue/layers/dms-ui/app/components/master-detail/MasterDetail.vue +5 -1
  172. package/frontend-vue/layers/dms-ui/app/components/segmented/Segmented.vue +1 -1
  173. package/frontend-vue/layers/dms-ui/app/components/status/StatusSummary.vue +1 -1
  174. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +33 -10
  175. package/frontend-vue/layers/dms-ui/app/composables/chart/donutRecords.ts +26 -0
  176. package/frontend-vue/layers/dms-ui/app/composables/tab/types/props.ts +4 -2
  177. package/frontend-vue/layers/dms-ui/app/composables/tab/useTab.ts +3 -3
  178. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/column.ts +1 -1
  179. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/custom-button.ts +2 -0
  180. package/frontend-vue/layers/dms-ui/app/types/quick-actions.ts +38 -3
  181. package/frontend-vue/tests/admin-invite-email.test.ts +86 -0
  182. package/frontend-vue/tests/api-error-title.test.ts +24 -0
  183. package/frontend-vue/tests/auth-middleware-error.test.ts +58 -0
  184. package/frontend-vue/tests/breadcrumb-target.test.ts +50 -0
  185. package/frontend-vue/tests/button-disabled-theme.test.ts +21 -0
  186. package/frontend-vue/tests/chart-nested-donut.test.ts +97 -0
  187. package/frontend-vue/tests/error-page-message.test.ts +83 -0
  188. package/frontend-vue/tests/favorite-page.test.ts +104 -0
  189. package/frontend-vue/tests/icon-aria-hidden.test.ts +29 -0
  190. package/frontend-vue/tests/layout-banners.test.ts +224 -0
  191. package/frontend-vue/tests/menu-navigation.test.ts +39 -10
  192. package/frontend-vue/tests/notification-popover-errors.test.ts +147 -0
  193. package/frontend-vue/tests/onboarding-middleware.test.ts +103 -0
  194. package/frontend-vue/tests/password-strength-meter.test.ts +33 -0
  195. package/frontend-vue/tests/quick-action-intent.test.ts +74 -0
  196. package/frontend-vue/tests/quick-actions.test.ts +23 -0
  197. package/frontend-vue/tests/relation-badges.test.ts +32 -0
  198. package/frontend-vue/tests/signup-invitation-link.test.ts +126 -0
  199. package/frontend-vue/tests/skeleton-paragraph.test.ts +30 -0
  200. package/frontend-vue/tests/tab-without-component-id.test.ts +51 -0
  201. package/frontend-vue/tests/table-column-visibility.test.ts +20 -0
  202. package/frontend-vue/tests/user-language.test.ts +58 -0
  203. package/frontend-vue/tests/vue-inventory.test.ts +1 -1
  204. package/package.json +2 -2
  205. package/skills/dms/REFERENCE.md +1 -1
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const interface_core_1 = require("@antelopejs/interface-core");
4
+ const chai_1 = require("chai");
5
+ const saas_mode_1 = require("@antelopejs/interface-dms/utils/saas-mode");
6
+ const EXPLICIT_REGISTRATION = { id: "saas-mode-test-registration" };
7
+ function unloadRegisteringModule() {
8
+ const moduleId = (0, interface_core_1.GetResponsibleModule)();
9
+ if (!moduleId)
10
+ throw new Error("No responsible module for the test");
11
+ saas_mode_1.internal.RegisterSaasMode.unregisterModule(moduleId);
12
+ }
13
+ describe("[unit] SaaS mode registration", () => {
14
+ afterEach(() => {
15
+ unloadRegisteringModule();
16
+ });
17
+ it("is off while no module has registered it", async () => {
18
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(false);
19
+ });
20
+ it("is on once a module registers it", async () => {
21
+ (0, saas_mode_1.RegisterSaasMode)();
22
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(true);
23
+ });
24
+ it("turns off when the registration is revoked", async () => {
25
+ saas_mode_1.internal.RegisterSaasMode.register(EXPLICIT_REGISTRATION);
26
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(true);
27
+ saas_mode_1.internal.RegisterSaasMode.unregister(EXPLICIT_REGISTRATION);
28
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(false);
29
+ });
30
+ it("turns off when the registering module unloads", async () => {
31
+ (0, saas_mode_1.RegisterSaasMode)();
32
+ unloadRegisteringModule();
33
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(false);
34
+ });
35
+ it("stays on while another registration is still active", async () => {
36
+ (0, saas_mode_1.RegisterSaasMode)();
37
+ saas_mode_1.internal.RegisterSaasMode.register(EXPLICIT_REGISTRATION);
38
+ saas_mode_1.internal.RegisterSaasMode.unregister(EXPLICIT_REGISTRATION);
39
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(true);
40
+ });
41
+ });
42
+ //# sourceMappingURL=saas-mode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saas-mode.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms/saas-mode.test.ts"],"names":[],"mappings":";;AAAA,+DAAkE;AAClE,+BAA8B;AAC9B,yEAImD;AAEnD,MAAM,qBAAqB,GAAG,EAAE,EAAE,EAAE,6BAA6B,EAAE,CAAC;AAGpE,SAAS,uBAAuB;IAC9B,MAAM,QAAQ,GAAG,IAAA,qCAAoB,GAAE,CAAC;IACxC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrE,oBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,uBAAuB,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,IAAA,4BAAgB,GAAE,CAAC;QACnB,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,oBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QAClE,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,oBAAgB,CAAC,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACpE,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,IAAA,4BAAgB,GAAE,CAAC;QACnB,uBAAuB,EAAE,CAAC;QAC1B,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,IAAA,4BAAgB,GAAE,CAAC;QACnB,oBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QAClE,oBAAgB,CAAC,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACpE,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const interface_core_1 = require("@antelopejs/interface-core");
4
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
5
+ const chai_1 = require("chai");
6
+ const auth_1 = require("@antelopejs/interface-dms/auth");
7
+ const db_1 = require("@antelopejs/interface-dms/db");
8
+ const invites_1 = require("@antelopejs/interface-dms/invites");
9
+ const WORKSPACE_ID = "tenant-invite-email-workspace";
10
+ const WORKSPACE_NAME = "Storefront";
11
+ const INVITEE_EMAIL = "invitee@acme.dev";
12
+ const TOKEN = "tenant-invite-email-token";
13
+ describe("[unit] interfaces/dms — tenant invitation emails", () => {
14
+ const sent = [];
15
+ before(async () => {
16
+ (0, interface_core_1.ImplementInterface)({ sendAdminInviteEmail: auth_1.sendAdminInviteEmail }, {
17
+ sendAdminInviteEmail: async (email, token, inviteeName, context) => {
18
+ sent.push({ email, token, inviteeName, context });
19
+ },
20
+ });
21
+ const now = new Date();
22
+ await (0, interface_database_decorators_1.GetModel)(db_1.TenantModel).insert({
23
+ _id: WORKSPACE_ID,
24
+ name: WORKSPACE_NAME,
25
+ createdAt: now,
26
+ updatedAt: now,
27
+ });
28
+ });
29
+ beforeEach(() => {
30
+ sent.length = 0;
31
+ });
32
+ it("names the workspace and the inviter, in the invitation's language", async () => {
33
+ await invites_1.internal.sendTenantInviteEmail({
34
+ tenantId: WORKSPACE_ID,
35
+ email: INVITEE_EMAIL,
36
+ token: TOKEN,
37
+ firstname: "Ada",
38
+ lastname: "Lovelace",
39
+ language: "fr",
40
+ inviterName: "Grace Hopper",
41
+ });
42
+ (0, chai_1.expect)(sent).to.have.length(1);
43
+ (0, chai_1.expect)(sent[0].email).to.equal(INVITEE_EMAIL);
44
+ (0, chai_1.expect)(sent[0].token).to.equal(TOKEN);
45
+ (0, chai_1.expect)(sent[0].inviteeName).to.equal("Ada Lovelace");
46
+ (0, chai_1.expect)(sent[0].context).to.deep.equal({
47
+ workspaceName: WORKSPACE_NAME,
48
+ inviterName: "Grace Hopper",
49
+ language: "fr",
50
+ });
51
+ });
52
+ });
53
+ //# sourceMappingURL=tenant-invite-email.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-invite-email.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms/tenant-invite-email.test.ts"],"names":[],"mappings":";;AAAA,+DAAgE;AAChE,6FAAqE;AACrE,+BAA8B;AAC9B,yDAGwC;AACxC,qDAA2D;AAC3D,+DAA6D;AAE7D,MAAM,YAAY,GAAG,+BAA+B,CAAC;AACrD,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AACzC,MAAM,KAAK,GAAG,2BAA2B,CAAC;AAS1C,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,MAAM,IAAI,GAAsB,EAAE,CAAC;IAEnC,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,IAAA,mCAAkB,EAChB,EAAE,oBAAoB,EAApB,2BAAoB,EAAE,EACxB;YACE,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;gBACjE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;SACF,CACF,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAA,wCAAQ,EAAC,gBAAW,CAAC,CAAC,MAAM,CAAC;YACjC,GAAG,EAAE,YAAY;YACjB,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,kBAAQ,CAAC,qBAAqB,CAAC;YACnC,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,cAAc;SAC5B,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACrD,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACpC,aAAa,EAAE,cAAc;YAC7B,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const interface_api_1 = require("@antelopejs/interface-api");
13
+ const interface_data_api_1 = require("@antelopejs/interface-data-api");
14
+ const metadata_1 = require("@antelopejs/interface-data-api/metadata");
15
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
16
+ const chai_1 = require("chai");
17
+ const constants_1 = require("@antelopejs/interface-dms/constants");
18
+ const default_types_1 = require("@antelopejs/interface-dms/base/data-types/default-types");
19
+ const table_view_1 = require("@antelopejs/interface-dms/base/table-view");
20
+ const TABLE = "form-slot-notes";
21
+ const EDIT_SLOT = "test.notes-edit";
22
+ let Note = class Note extends interface_database_decorators_1.Table {
23
+ };
24
+ __decorate([
25
+ (0, interface_database_decorators_1.Field)("string"),
26
+ __metadata("design:type", String)
27
+ ], Note.prototype, "title", void 0);
28
+ Note = __decorate([
29
+ (0, interface_database_decorators_1.RegisterTable)(TABLE, constants_1.CORE_SCHEMA_NAME)
30
+ ], Note);
31
+ class NoteModel extends (0, interface_database_decorators_1.BasicDataModel)(Note, TABLE) {
32
+ }
33
+ let NoteAPI = class NoteAPI extends (0, interface_data_api_1.DataController)(Note, {
34
+ get: table_view_1.TableViewRoutes.Get,
35
+ new: table_view_1.TableViewRoutes.New,
36
+ edit: table_view_1.TableViewRoutes.Edit,
37
+ }, (0, interface_api_1.Controller)("/api/form-slot-notes")) {
38
+ };
39
+ __decorate([
40
+ (0, metadata_1.ModelReference)(),
41
+ (0, interface_database_decorators_1.Model)(NoteModel),
42
+ __metadata("design:type", NoteModel)
43
+ ], NoteAPI.prototype, "model", void 0);
44
+ __decorate([
45
+ (0, table_view_1.Column)({ name: "Title", type: new default_types_1.DefaultDataTypes.StringType() }),
46
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
47
+ __metadata("design:type", String)
48
+ ], NoteAPI.prototype, "title", void 0);
49
+ NoteAPI = __decorate([
50
+ (0, interface_data_api_1.RegisterDataController)()
51
+ ], NoteAPI);
52
+ function formSlotIds(table) {
53
+ const options = table.serializeSync().options;
54
+ return Object.fromEntries(Object.entries(options.formComponents).map(([kind, form]) => [
55
+ kind,
56
+ form?.options?.slotId,
57
+ ]));
58
+ }
59
+ describe("[unit] interfaces/dms-base — table view form slots", () => {
60
+ it("opens the declared slot on the matching generated form only", () => {
61
+ const table = (0, table_view_1.TableView)(NoteAPI, {
62
+ formSlots: { edit: EDIT_SLOT },
63
+ realtime: false,
64
+ });
65
+ (0, chai_1.expect)(formSlotIds(table)).to.deep.equal({
66
+ new: undefined,
67
+ edit: EDIT_SLOT,
68
+ view: undefined,
69
+ });
70
+ });
71
+ it("opens no slot unless one is declared", () => {
72
+ const table = (0, table_view_1.TableView)(NoteAPI, { realtime: false });
73
+ (0, chai_1.expect)(formSlotIds(table)).to.deep.equal({
74
+ new: undefined,
75
+ edit: undefined,
76
+ view: undefined,
77
+ });
78
+ });
79
+ });
80
+ //# sourceMappingURL=table-view-form-slots.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-view-form-slots.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-form-slots.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6DAAuD;AACvD,uEAGwC;AACxC,sEAIiD;AACjD,6FAMmD;AACnD,+BAA8B;AAC9B,mEAAuE;AACvE,2FAA2F;AAC3F,0EAKmD;AAEnD,MAAM,KAAK,GAAG,iBAAiB,CAAC;AAChC,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAGpC,IAAM,IAAI,GAAV,MAAM,IAAK,SAAQ,qCAAK;CAEvB,CAAA;AAD0B;IAAxB,IAAA,qCAAK,EAAC,QAAQ,CAAC;;mCAAuB;AADnC,IAAI;IADT,IAAA,6CAAa,EAAC,KAAK,EAAE,4BAAgB,CAAC;GACjC,IAAI,CAET;AAED,MAAM,SAAU,SAAQ,IAAA,8CAAc,EAAC,IAAI,EAAE,KAAK,CAAC;CAAG;AAGtD,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,IAAA,mCAAc,EAClC,IAAI,EACJ;IACE,GAAG,EAAE,4BAAe,CAAC,GAAG;IACxB,GAAG,EAAE,4BAAe,CAAC,GAAG;IACxB,IAAI,EAAE,4BAAe,CAAC,IAAI;CAC3B,EACD,IAAA,0BAAU,EAAC,sBAAsB,CAAC,CACnC;CAOA,CAAA;AAJS;IAFP,IAAA,yBAAc,GAAE;IAChB,IAAA,qCAAK,EAAC,SAAS,CAAC;8BACF,SAAS;sCAAC;AAGjB;IAFP,IAAA,mBAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,gCAAgB,CAAC,UAAU,EAAE,EAAE,CAAC;IAClE,IAAA,iBAAM,EAAC,qBAAU,CAAC,SAAS,CAAC;;sCACP;AAdlB,OAAO;IADZ,IAAA,2CAAsB,GAAE;GACnB,OAAO,CAeZ;AAED,SAAS,WAAW,CAClB,KAAmC;IAEnC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,OAAqC,CAAC;IAC5E,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3D,IAAI;QACH,IAAI,EAAE,OAA2C,EAAE,MAAM;KAC3D,CAAC,CACH,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,KAAK,GAAG,IAAA,sBAAS,EAAC,OAAO,EAAE;YAC/B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC9B,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAA,sBAAS,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtD,IAAA,aAAM,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const interface_api_1 = require("@antelopejs/interface-api");
10
+ const interface_data_api_1 = require("@antelopejs/interface-data-api");
11
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
12
+ const chai_1 = require("chai");
13
+ const constants_1 = require("@antelopejs/interface-dms/constants");
14
+ const table_view_1 = require("@antelopejs/interface-dms/base/table-view");
15
+ const logging_1 = require("../../../helpers/logging");
16
+ const TABLE = "tab-count-warning-rows";
17
+ const MISSING_ROUTE = "count/batch";
18
+ const TABS = [
19
+ {
20
+ id: "open",
21
+ label: "Open",
22
+ filters: [{ accessorKey: "status", value: "open", mode: "is" }],
23
+ },
24
+ ];
25
+ let Row = class Row extends interface_database_decorators_1.Table {
26
+ };
27
+ Row = __decorate([
28
+ (0, interface_database_decorators_1.RegisterTable)(TABLE, constants_1.CORE_SCHEMA_NAME)
29
+ ], Row);
30
+ let CountOnlyAPI = class CountOnlyAPI extends (0, interface_data_api_1.DataController)(Row, { list: table_view_1.TableViewRoutes.List, count: table_view_1.TableViewRoutes.Count }, (0, interface_api_1.Controller)("/api/tab-count-warning/count-only")) {
31
+ };
32
+ CountOnlyAPI = __decorate([
33
+ (0, interface_data_api_1.RegisterDataController)()
34
+ ], CountOnlyAPI);
35
+ let RepeatedAPI = class RepeatedAPI extends (0, interface_data_api_1.DataController)(Row, { list: table_view_1.TableViewRoutes.List }, (0, interface_api_1.Controller)("/api/tab-count-warning/repeated")) {
36
+ };
37
+ RepeatedAPI = __decorate([
38
+ (0, interface_data_api_1.RegisterDataController)()
39
+ ], RepeatedAPI);
40
+ let BatchAPI = class BatchAPI extends (0, interface_data_api_1.DataController)(Row, { list: table_view_1.TableViewRoutes.List, countBatch: table_view_1.TableViewRoutes.CountBatch }, (0, interface_api_1.Controller)("/api/tab-count-warning/batch")) {
41
+ };
42
+ BatchAPI = __decorate([
43
+ (0, interface_data_api_1.RegisterDataController)()
44
+ ], BatchAPI);
45
+ let RenamedBatchAPI = class RenamedBatchAPI extends (0, interface_data_api_1.DataController)(Row, { list: table_view_1.TableViewRoutes.List, tabCounters: table_view_1.TableViewRoutes.CountBatch }, (0, interface_api_1.Controller)("/api/tab-count-warning/renamed")) {
46
+ };
47
+ RenamedBatchAPI = __decorate([
48
+ (0, interface_data_api_1.RegisterDataController)()
49
+ ], RenamedBatchAPI);
50
+ let NoTabsAPI = class NoTabsAPI extends (0, interface_data_api_1.DataController)(Row, { list: table_view_1.TableViewRoutes.List }, (0, interface_api_1.Controller)("/api/tab-count-warning/no-tabs")) {
51
+ };
52
+ NoTabsAPI = __decorate([
53
+ (0, interface_data_api_1.RegisterDataController)()
54
+ ], NoTabsAPI);
55
+ function countBatchWarnings(register) {
56
+ const captured = (0, logging_1.captureWarnings)();
57
+ try {
58
+ register();
59
+ }
60
+ finally {
61
+ captured.restore();
62
+ }
63
+ return captured.messages.filter((message) => message.includes(MISSING_ROUTE));
64
+ }
65
+ describe("[unit] interfaces/dms-base/table-view — filter tabs require countBatch", () => {
66
+ it("warns when a table with tabs is mounted on a controller without countBatch", () => {
67
+ const warnings = countBatchWarnings(() => (0, table_view_1.TableView)(CountOnlyAPI, { tabs: TABS, realtime: false }));
68
+ (0, chai_1.expect)(warnings).to.have.length(1);
69
+ (0, chai_1.expect)(warnings[0]).to.include("CountOnlyAPI");
70
+ (0, chai_1.expect)(warnings[0]).to.include("/api/tab-count-warning/count-only");
71
+ (0, chai_1.expect)(warnings[0]).to.include("TableViewRoutes.CountBatch");
72
+ });
73
+ it("warns once per controller however many tables mount it", () => {
74
+ const warnings = countBatchWarnings(() => {
75
+ (0, table_view_1.TableView)(RepeatedAPI, { tabs: TABS, realtime: false });
76
+ (0, table_view_1.TableView)(RepeatedAPI, { tabs: TABS, realtime: false });
77
+ });
78
+ (0, chai_1.expect)(warnings).to.have.length(1);
79
+ });
80
+ it("stays silent when the controller mounts countBatch", () => {
81
+ const warnings = countBatchWarnings(() => (0, table_view_1.TableView)(BatchAPI, { tabs: TABS, realtime: false }));
82
+ (0, chai_1.expect)(warnings).to.be.empty;
83
+ });
84
+ it("stays silent when countBatch is mounted under another key", () => {
85
+ const warnings = countBatchWarnings(() => (0, table_view_1.TableView)(RenamedBatchAPI, { tabs: TABS, realtime: false }));
86
+ (0, chai_1.expect)(warnings).to.be.empty;
87
+ });
88
+ it("stays silent when the table declares no tabs", () => {
89
+ const warnings = countBatchWarnings(() => {
90
+ (0, table_view_1.TableView)(NoTabsAPI, { realtime: false });
91
+ (0, table_view_1.TableView)(NoTabsAPI, { tabs: [], realtime: false });
92
+ });
93
+ (0, chai_1.expect)(warnings).to.be.empty;
94
+ });
95
+ });
96
+ //# sourceMappingURL=table-view-tab-count-warning.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-view-tab-count-warning.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-tab-count-warning.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const interface_core_1 = require("@antelopejs/interface-core");
37
+ const chai_1 = require("chai");
38
+ const page_1 = require("@antelopejs/interface-dms/page");
39
+ const permissionsInterface = __importStar(require("@antelopejs/interface-dms/permissions"));
40
+ const permissionsResolverInterface = __importStar(require("@antelopejs/interface-dms/permissions-resolver"));
41
+ const quick_actions_1 = require("@antelopejs/interface-dms/quick-actions");
42
+ const tenantAccessInterface = __importStar(require("@antelopejs/interface-dms/tenant-access"));
43
+ const page_2 = require("../../../../implementations/dms/page");
44
+ const permissionsImpl = __importStar(require("../../../../implementations/dms/permissions"));
45
+ const permissionsResolverImpl = __importStar(require("../../../../implementations/dms/permissions-resolver"));
46
+ const quickActionsImpl = __importStar(require("../../../../implementations/dms/quick-actions"));
47
+ const tenantAccessImpl = __importStar(require("../../../../implementations/dms/tenant-access"));
48
+ const members_1 = require("../../../../pages/settings/users/members");
49
+ const quick_actions_2 = require("../../../../pages/settings/users/quick-actions");
50
+ const page_access_1 = require("../../../helpers/page-access");
51
+ const ACTION_KEY = `${quick_actions_2.inviteMemberQuickAction.category.id}:${quick_actions_2.inviteMemberQuickAction.id}`;
52
+ const TENANT_ID = "invite-quick-action-tenant";
53
+ function membersPagePermission() {
54
+ const pageInfo = (0, interface_core_1.GetMetadata)(members_1.MembersSettingsController, page_1.PageMetadata).pageInfo;
55
+ if (!pageInfo) {
56
+ throw new Error("The members page is not registered");
57
+ }
58
+ return pageInfo.fullId;
59
+ }
60
+ function invitePermission() {
61
+ const permissionId = members_1.membersTableAddAction.permissionId;
62
+ if (!permissionId) {
63
+ throw new Error("The members table add action has no permission id");
64
+ }
65
+ return permissionId;
66
+ }
67
+ async function actionsFor(grantedPermissions) {
68
+ const { memberModel, roleModel } = (0, page_access_1.stubPageAccessModels)(grantedPermissions);
69
+ const payload = await (0, page_2.buildSiteLayoutPayload)({ _id: "invite-quick-action-member" }, memberModel, roleModel, TENANT_ID);
70
+ return payload.quickActions.actions;
71
+ }
72
+ describe("[unit] pages/settings/users/quick-actions — invite a member", () => {
73
+ before(() => {
74
+ (0, interface_core_1.ImplementInterface)(permissionsInterface, permissionsImpl);
75
+ (0, interface_core_1.ImplementInterface)(permissionsResolverInterface, permissionsResolverImpl);
76
+ (0, interface_core_1.ImplementInterface)(tenantAccessInterface, tenantAccessImpl);
77
+ (0, interface_core_1.ImplementInterface)(page_1.internal, page_2.internal);
78
+ (0, interface_core_1.ImplementInterface)(quick_actions_1.internal, quickActionsImpl.internal);
79
+ });
80
+ it("presses the members table's invite button", async () => {
81
+ const actions = await actionsFor([
82
+ membersPagePermission(),
83
+ invitePermission(),
84
+ ]);
85
+ (0, chai_1.expect)(actions[ACTION_KEY]).to.deep.include({
86
+ displayName: "$quickActions.invite_member",
87
+ target: {
88
+ type: "button",
89
+ to: "/settings/user/members",
90
+ component: "table",
91
+ button: members_1.MEMBER_INVITE_BUTTON_ID,
92
+ },
93
+ });
94
+ });
95
+ it("is left out for a member who sees the members page but cannot invite", async () => {
96
+ const actions = await actionsFor([membersPagePermission()]);
97
+ (0, chai_1.expect)(actions).to.not.have.property(ACTION_KEY);
98
+ });
99
+ it("is left out for a caller who cannot reach the members page", async () => {
100
+ const actions = await actionsFor([]);
101
+ (0, chai_1.expect)(actions).to.not.have.property(ACTION_KEY);
102
+ });
103
+ });
104
+ //# sourceMappingURL=invite-member-quick-action.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite-member-quick-action.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/pages/settings/invite-member-quick-action.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const interface_api_1 = require("@antelopejs/interface-api");
4
+ const interface_core_1 = require("@antelopejs/interface-core");
5
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
6
+ const chai_1 = require("chai");
7
+ const dms_auth_1 = require("../../../../implementations/dms-auth");
8
+ const notifications_1 = require("../../../../pages/settings/users/notifications");
9
+ const db_1 = require("@antelopejs/interface-dms/db");
10
+ const tenant_access_1 = require("@antelopejs/interface-dms/tenant-access");
11
+ const db_2 = require("@antelopejs/interface-dms/auth/db");
12
+ const page_access_1 = require("../../../helpers/page-access");
13
+ const DENIED_TENANT = "notifications-gate-tenant";
14
+ const MEMBER_ID = "notifications-gate-member";
15
+ const OUTSIDER_ID = "notifications-gate-outsider";
16
+ const AUTH_KEY = "notifications-gate-key";
17
+ const HTTP_FORBIDDEN = 403;
18
+ const gate = (0, page_access_1.denyingTenantGate)("notifications-gate", DENIED_TENANT);
19
+ function context(token) {
20
+ return {
21
+ rawRequest: { headers: { authorization: `Bearer ${token}` } },
22
+ };
23
+ }
24
+ async function insertUser(id) {
25
+ await (0, interface_database_decorators_1.GetModel)(db_2.UserModel).insert({
26
+ _id: id,
27
+ email: `${id}@test.local`,
28
+ name: id,
29
+ authKey: AUTH_KEY,
30
+ isValidated: true,
31
+ language: "en",
32
+ password: null,
33
+ });
34
+ const stored = await (0, interface_database_decorators_1.GetModel)(db_2.UserModel).get(id);
35
+ if (!stored)
36
+ throw new Error(`Missing test user ${id}`);
37
+ return stored;
38
+ }
39
+ function resolveControllerUser(token) {
40
+ const meta = (0, interface_core_1.GetMetadata)(notifications_1.NotificationsApiController, interface_api_1.ControllerMeta);
41
+ return (0, interface_api_1.computeParameter)(context(token), meta.computed_props.user, new notifications_1.NotificationsApiController());
42
+ }
43
+ describe("[unit] pages/settings/users/notifications — tenant access gate", () => {
44
+ let memberToken;
45
+ let outsiderToken;
46
+ before(async () => {
47
+ const member = await insertUser(MEMBER_ID);
48
+ const outsider = await insertUser(OUTSIDER_ID);
49
+ memberToken = (0, dms_auth_1.generateAccessToken)(DENIED_TENANT, member).token;
50
+ outsiderToken = (0, dms_auth_1.generateAccessToken)(DENIED_TENANT, outsider).token;
51
+ await (0, interface_database_decorators_1.GetModel)(db_1.TenantMemberModel, DENIED_TENANT).insert({
52
+ userId: MEMBER_ID,
53
+ roleIds: [],
54
+ isTenantOwner: false,
55
+ joinedAt: new Date(),
56
+ invitedBy: null,
57
+ });
58
+ (0, tenant_access_1.RegisterTenantAccessGate)(gate);
59
+ });
60
+ after(() => {
61
+ tenant_access_1.internal.RegisterTenantAccessGate.unregister(gate);
62
+ });
63
+ it("serves a member's own notifications while a gate denies the tenant", async () => {
64
+ const user = (await resolveControllerUser(memberToken));
65
+ (0, chai_1.expect)(user._id).to.equal(MEMBER_ID);
66
+ });
67
+ it("still refuses a user who is not a member of the tenant", async () => {
68
+ try {
69
+ await resolveControllerUser(outsiderToken);
70
+ chai_1.expect.fail("Expected the membership check to refuse");
71
+ }
72
+ catch (error) {
73
+ (0, chai_1.expect)(error).to.be.instanceOf(interface_api_1.HTTPResult);
74
+ (0, chai_1.expect)(error.getStatus()).to.equal(HTTP_FORBIDDEN);
75
+ }
76
+ });
77
+ });
78
+ //# sourceMappingURL=notifications-access-gate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications-access-gate.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/pages/settings/notifications-access-gate.test.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,7 @@ async function joinWorkspace(userId) {
39
39
  invitedBy: null,
40
40
  });
41
41
  }
42
- async function attemptSignup(existingUser, token, claimedEmail = existingUser.email) {
42
+ async function attemptSignup(existingUser, token, claimedEmail = existingUser.email, lang) {
43
43
  const updatedUsers = [];
44
44
  const userModel = {
45
45
  getByEmail: async (lookup) => lookup === existingUser.email ? existingUser : undefined,
@@ -57,7 +57,7 @@ async function attemptSignup(existingUser, token, claimedEmail = existingUser.em
57
57
  name: INVITEE_NAME,
58
58
  email: claimedEmail,
59
59
  password: INVITEE_PASSWORD,
60
- lang: "en",
60
+ lang,
61
61
  token,
62
62
  }, USER_AGENT, IP);
63
63
  }
@@ -113,6 +113,24 @@ describe("[unit] auth/signup — overwriting an existing account", () => {
113
113
  await attemptSignup(draft, token, "Draft-Case@Acme.dev");
114
114
  (0, chai_1.expect)(draft.email).to.equal("draft-case@acme.dev");
115
115
  });
116
+ it("takes over a draft in the invitation's language when none is chosen", async () => {
117
+ const draft = buildAccount("signup-guard-draft-language", "draft-language@acme.dev", false);
118
+ const { token } = await (0, fixtures_1.seedUserInvite)({
119
+ email: draft.email,
120
+ language: "fr",
121
+ });
122
+ await attemptSignup(draft, token);
123
+ (0, chai_1.expect)(draft.language).to.equal("fr");
124
+ });
125
+ it("keeps the language the invitee chose over the invitation's", async () => {
126
+ const draft = buildAccount("signup-guard-draft-chosen-language", "draft-chosen-language@acme.dev", false);
127
+ const { token } = await (0, fixtures_1.seedUserInvite)({
128
+ email: draft.email,
129
+ language: "fr",
130
+ });
131
+ await attemptSignup(draft, token, draft.email, "en");
132
+ (0, chai_1.expect)(draft.language).to.equal("en");
133
+ });
116
134
  it("settles the invitation before disclosing that the address is taken", async () => {
117
135
  const provisioned = buildAccount("signup-guard-probed", "probed@acme.dev", false);
118
136
  await joinWorkspace(provisioned._id);
@@ -1 +1 @@
1
- {"version":3,"file":"signup-account-guard.test.js","sourceRoot":"","sources":["../../../src/test/unit/signup-account-guard.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signup-account-guard.test.js","sourceRoot":"","sources":["../../../src/test/unit/signup-account-guard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};