@antelopejs/dms 0.5.3 → 0.5.4
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 +16 -0
- package/dist/pages/settings/users/invite-email-outcome.d.ts +6 -0
- package/dist/pages/settings/users/invite-email-outcome.js +9 -0
- package/dist/pages/settings/users/invite-email-outcome.js.map +1 -0
- package/dist/pages/settings/users/invites.d.ts +4 -1
- package/dist/pages/settings/users/invites.js +33 -28
- package/dist/pages/settings/users/invites.js.map +1 -1
- package/dist/pages/settings/users/members.d.ts +8 -3
- package/dist/pages/settings/users/members.js +16 -4
- package/dist/pages/settings/users/members.js.map +1 -1
- package/dist/test/unit/pages/settings/invite-email-delivery.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/invite-email-delivery.test.js +141 -0
- package/dist/test/unit/pages/settings/invite-email-delivery.test.js.map +1 -0
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +2 -0
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +2 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewRowActions.ts +9 -5
- package/frontend-vue/layers/dms-ui/app/composables/form/types/api.ts +2 -1
- package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +15 -8
- package/frontend-vue/layers/dms-ui/app/utils/responseWarning.ts +46 -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/tests/response-warning-toast.test.ts +57 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.5.4
|
|
4
|
+
|
|
5
|
+
[compare changes](https://github.com/AntelopeJS/dms/compare/v0.5.3...v0.5.4)
|
|
6
|
+
|
|
7
|
+
### 🩹 Fixes
|
|
8
|
+
|
|
9
|
+
- **invites:** Tell the inviter when the invitation e-mail was not sent ([#122](https://github.com/AntelopeJS/dms/pull/122))
|
|
10
|
+
|
|
11
|
+
### 🏡 Chore
|
|
12
|
+
|
|
13
|
+
- **release:** @antelopejs/interface-dms v0.3.5 ([dcc9afe](https://github.com/AntelopeJS/dms/commit/dcc9afe))
|
|
14
|
+
|
|
15
|
+
### ❤️ Contributors
|
|
16
|
+
|
|
17
|
+
- Antony Rizzitelli <rizzitelli.antony@pm.me>
|
|
18
|
+
|
|
3
19
|
## v0.5.3
|
|
4
20
|
|
|
5
21
|
[compare changes](https://github.com/AntelopeJS/dms/compare/v0.5.2...v0.5.3)
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { InviteEmailDelivery } from "@antelopejs/interface-dms/invites";
|
|
2
|
+
export interface InviteEmailOutcome {
|
|
3
|
+
emailDelivery: InviteEmailDelivery;
|
|
4
|
+
warning?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function inviteEmailOutcome(emailDelivery: InviteEmailDelivery, failureWarning: string): InviteEmailOutcome;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inviteEmailOutcome = inviteEmailOutcome;
|
|
4
|
+
function inviteEmailOutcome(emailDelivery, failureWarning) {
|
|
5
|
+
if (emailDelivery === "sent")
|
|
6
|
+
return { emailDelivery };
|
|
7
|
+
return { emailDelivery, warning: failureWarning };
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=invite-email-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invite-email-outcome.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/invite-email-outcome.ts"],"names":[],"mappings":";;AAYA,gDAMC;AAND,SAAgB,kBAAkB,CAChC,aAAkC,EAClC,cAAsB;IAEtB,IAAI,aAAa,KAAK,MAAM;QAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IACvD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { type RequestContext } from "@antelopejs/interface-api";
|
|
2
2
|
import { UserInvite, UserInviteModel } from "@antelopejs/interface-dms/db";
|
|
3
3
|
import type { User } from "@antelopejs/interface-dms/auth/db";
|
|
4
|
+
import { type InviteEmailOutcome } from "./invite-email-outcome";
|
|
5
|
+
export declare const INVITE_RESEND_EMAIL_FAILED_WARNING = "$page.settings.invites.action.resend_email_failed";
|
|
6
|
+
export declare function resendPendingInvite(tenantId: string, inviteId: string, inviterName?: string): Promise<InviteEmailOutcome>;
|
|
4
7
|
declare const inviteSettingDataAPI_base: import("@antelopejs/interface-core/decorators").Class<import("@antelopejs/interface-data-api").ExtractDefCallbacks<{
|
|
5
8
|
list: import("@antelopejs/interface-data-api").DataControllerCallback;
|
|
6
9
|
get: import("@antelopejs/interface-data-api").DataControllerCallback;
|
|
@@ -32,7 +35,7 @@ declare const InvitesSettingsController_base: {
|
|
|
32
35
|
};
|
|
33
36
|
export declare class InvitesSettingsController extends InvitesSettingsController_base {
|
|
34
37
|
static table: import("@antelopejs/interface-dms").ComponentBuilder<import("@antelopejs/interface-dms/base").TableViewOptionsSerialized>;
|
|
35
|
-
resendInvite(id: string, ctx: RequestContext, user: User): Promise<
|
|
38
|
+
resendInvite(id: string, ctx: RequestContext, user: User): Promise<InviteEmailOutcome>;
|
|
36
39
|
cancelInvite(id: string, ctx: RequestContext): Promise<void>;
|
|
37
40
|
}
|
|
38
41
|
export {};
|
|
@@ -12,7 +12,8 @@ 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.InvitesSettingsController = exports.inviteSettingDataAPI = void 0;
|
|
15
|
+
exports.InvitesSettingsController = exports.inviteSettingDataAPI = exports.INVITE_RESEND_EMAIL_FAILED_WARNING = void 0;
|
|
16
|
+
exports.resendPendingInvite = resendPendingInvite;
|
|
16
17
|
const interface_api_1 = require("@antelopejs/interface-api");
|
|
17
18
|
const interface_api_util_1 = require("@antelopejs/interface-api-util");
|
|
18
19
|
const interface_data_api_1 = require("@antelopejs/interface-data-api");
|
|
@@ -30,11 +31,39 @@ const base_1 = require("@antelopejs/interface-dms/base");
|
|
|
30
31
|
const default_types_1 = require("@antelopejs/interface-dms/base/data-types/default-types");
|
|
31
32
|
const status_type_1 = require("@antelopejs/interface-dms/base/data-types/status-type");
|
|
32
33
|
const types_1 = require("@antelopejs/interface-dms/base/types");
|
|
33
|
-
const
|
|
34
|
+
const invite_email_outcome_1 = require("./invite-email-outcome");
|
|
34
35
|
const invite_extension_routes_1 = require("./invite-extension-routes");
|
|
35
36
|
const member_invite_form_1 = require("./member-invite-form");
|
|
36
37
|
const members_1 = require("./members");
|
|
37
38
|
const INVITES_PERMISSION_ID = "settings.user.invites";
|
|
39
|
+
exports.INVITE_RESEND_EMAIL_FAILED_WARNING = "$page.settings.invites.action.resend_email_failed";
|
|
40
|
+
async function resendPendingInvite(tenantId, inviteId, inviterName) {
|
|
41
|
+
const existingInvite = await (0, invite_resolution_1.loadInviteForAction)(tenantId, inviteId);
|
|
42
|
+
(0, interface_api_util_1.assert)(existingInvite, 404, "$page.settings.invites.error.not_found");
|
|
43
|
+
const { token } = await (0, invites_1.createUserInviteToken)({
|
|
44
|
+
tenantId,
|
|
45
|
+
replacesInvite: existingInvite,
|
|
46
|
+
email: existingInvite.email,
|
|
47
|
+
firstname: existingInvite.firstname,
|
|
48
|
+
lastname: existingInvite.lastname,
|
|
49
|
+
language: existingInvite.language,
|
|
50
|
+
roleIds: existingInvite.roles_ids,
|
|
51
|
+
asTenantOwner: existingInvite.asTenantOwner,
|
|
52
|
+
skipEmailValidation: existingInvite.skipEmailValidation,
|
|
53
|
+
extensions: existingInvite.extensions ?? undefined,
|
|
54
|
+
replacementReason: "resent",
|
|
55
|
+
});
|
|
56
|
+
const emailDelivery = await invites_1.internal.deliverTenantInviteEmail({
|
|
57
|
+
tenantId,
|
|
58
|
+
email: existingInvite.email,
|
|
59
|
+
token,
|
|
60
|
+
firstname: existingInvite.firstname,
|
|
61
|
+
lastname: existingInvite.lastname,
|
|
62
|
+
language: existingInvite.language,
|
|
63
|
+
inviterName,
|
|
64
|
+
});
|
|
65
|
+
return (0, invite_email_outcome_1.inviteEmailOutcome)(emailDelivery, exports.INVITE_RESEND_EMAIL_FAILED_WARNING);
|
|
66
|
+
}
|
|
38
67
|
let inviteSettingDataAPI = class inviteSettingDataAPI extends (0, interface_data_api_1.DataController)(db_1.UserInvite, {
|
|
39
68
|
list: base_1.TableViewRoutes.List,
|
|
40
69
|
get: invite_extension_routes_1.inviteGetRoute,
|
|
@@ -257,32 +286,8 @@ let InvitesSettingsController = class InvitesSettingsController extends (0, page
|
|
|
257
286
|
],
|
|
258
287
|
},
|
|
259
288
|
});
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
const existingInvite = await (0, invite_resolution_1.loadInviteForAction)(tenantId, id);
|
|
263
|
-
(0, interface_api_util_1.assert)(existingInvite, 404, "$page.settings.invites.error.not_found");
|
|
264
|
-
const { token } = await (0, invites_1.createUserInviteToken)({
|
|
265
|
-
tenantId,
|
|
266
|
-
replacesInvite: existingInvite,
|
|
267
|
-
email: existingInvite.email,
|
|
268
|
-
firstname: existingInvite.firstname,
|
|
269
|
-
lastname: existingInvite.lastname,
|
|
270
|
-
language: existingInvite.language,
|
|
271
|
-
roleIds: existingInvite.roles_ids,
|
|
272
|
-
asTenantOwner: existingInvite.asTenantOwner,
|
|
273
|
-
skipEmailValidation: existingInvite.skipEmailValidation,
|
|
274
|
-
extensions: existingInvite.extensions ?? undefined,
|
|
275
|
-
replacementReason: "resent",
|
|
276
|
-
});
|
|
277
|
-
(0, fire_and_forget_1.fireAndForget)(invites_1.internal.sendTenantInviteEmail({
|
|
278
|
-
tenantId,
|
|
279
|
-
email: existingInvite.email,
|
|
280
|
-
token,
|
|
281
|
-
firstname: existingInvite.firstname,
|
|
282
|
-
lastname: existingInvite.lastname,
|
|
283
|
-
language: existingInvite.language,
|
|
284
|
-
inviterName: user.name,
|
|
285
|
-
}), `invite email to "${existingInvite.email}"`);
|
|
289
|
+
resendInvite(id, ctx, user) {
|
|
290
|
+
return resendPendingInvite((0, request_tenant_1.getRequestTenantId)(ctx), id, user.name);
|
|
286
291
|
}
|
|
287
292
|
async cancelInvite(id, ctx) {
|
|
288
293
|
const tenantId = (0, request_tenant_1.getRequestTenantId)(ctx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invites.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/invites.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"invites.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/invites.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { type RequestContext } from "@antelopejs/interface-api";
|
|
2
2
|
import type { Action } from "@antelopejs/interface-dms/component";
|
|
3
3
|
import { type TenantMember } from "@antelopejs/interface-dms/db";
|
|
4
|
+
import { type InviteUserToTenantResult } from "@antelopejs/interface-dms/invites";
|
|
4
5
|
import { type User, UserModel } from "@antelopejs/interface-dms/auth/db";
|
|
6
|
+
import { type InviteEmailOutcome } from "./invite-email-outcome";
|
|
5
7
|
import { type InviteFormDefaults } from "./member-invite-form";
|
|
6
8
|
export declare const INVITES_PAGE_PATH = "/settings/user/members/invites";
|
|
7
9
|
export declare const MEMBER_INVITE_BUTTON_ID = "invite";
|
|
10
|
+
export declare const INVITE_EMAIL_FAILED_WARNING = "$page.settings.members.invite.email_failed";
|
|
11
|
+
export interface MemberInviteResponse extends Partial<InviteEmailOutcome> {
|
|
12
|
+
redirectPath: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function memberInviteResponse(result: InviteUserToTenantResult): MemberInviteResponse;
|
|
8
15
|
export declare function assertNotLastPlatformOwnerOnDelete(targets: TenantMember[]): Promise<void>;
|
|
9
16
|
export declare const membersTable: import("@antelopejs/interface-dms").ComponentBuilder<import("@antelopejs/interface-dms/base").TableViewOptionsSerialized>;
|
|
10
17
|
export declare const membersTableAddAction: Action;
|
|
@@ -16,9 +23,7 @@ declare const MembersSettingsController_base: {
|
|
|
16
23
|
export declare class MembersSettingsController extends MembersSettingsController_base {
|
|
17
24
|
static table: import("@antelopejs/interface-dms").ComponentBuilder<import("@antelopejs/interface-dms/base").TableViewOptionsSerialized>;
|
|
18
25
|
inviteDefaults(user: User): InviteFormDefaults;
|
|
19
|
-
invite(ctx: RequestContext, user: User, userModel: UserModel, body: unknown): Promise<
|
|
20
|
-
redirectPath: string;
|
|
21
|
-
}>;
|
|
26
|
+
invite(ctx: RequestContext, user: User, userModel: UserModel, body: unknown): Promise<MemberInviteResponse>;
|
|
22
27
|
validateMemberEmail(ctx: RequestContext, memberId: string, userModel: UserModel): Promise<void>;
|
|
23
28
|
}
|
|
24
29
|
export {};
|
|
@@ -12,7 +12,8 @@ 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 = exports.MEMBER_INVITE_BUTTON_ID = exports.INVITES_PAGE_PATH = void 0;
|
|
15
|
+
exports.MembersSettingsController = exports.membersTableAddAction = exports.membersTable = exports.INVITE_EMAIL_FAILED_WARNING = exports.MEMBER_INVITE_BUTTON_ID = exports.INVITES_PAGE_PATH = void 0;
|
|
16
|
+
exports.memberInviteResponse = memberInviteResponse;
|
|
16
17
|
exports.assertNotLastPlatformOwnerOnDelete = assertNotLastPlatformOwnerOnDelete;
|
|
17
18
|
const interface_api_1 = require("@antelopejs/interface-api");
|
|
18
19
|
const interface_api_util_1 = require("@antelopejs/interface-api-util");
|
|
@@ -33,11 +34,23 @@ const types_1 = require("@antelopejs/interface-dms/base/types");
|
|
|
33
34
|
const saas_mode_1 = require("@antelopejs/interface-dms/utils/saas-mode");
|
|
34
35
|
const member_invite_schema_1 = require("../../../validation/member-invite.schema");
|
|
35
36
|
const category_1 = require("./category");
|
|
37
|
+
const invite_email_outcome_1 = require("./invite-email-outcome");
|
|
36
38
|
const member_invite_form_1 = require("./member-invite-form");
|
|
37
39
|
(0, interface_data_api_1.RegisterDataController)()(data_controllers_1.memberSettingDataAPI);
|
|
38
40
|
const MEMBERS_PAGE_PATH = "/settings/user/members";
|
|
39
41
|
exports.INVITES_PAGE_PATH = `${MEMBERS_PAGE_PATH}/invites`;
|
|
40
42
|
exports.MEMBER_INVITE_BUTTON_ID = "invite";
|
|
43
|
+
exports.INVITE_EMAIL_FAILED_WARNING = "$page.settings.members.invite.email_failed";
|
|
44
|
+
function memberInviteResponse(result) {
|
|
45
|
+
if (result.kind === "added")
|
|
46
|
+
return { redirectPath: MEMBERS_PAGE_PATH };
|
|
47
|
+
if (!result.emailDelivery)
|
|
48
|
+
return { redirectPath: exports.INVITES_PAGE_PATH };
|
|
49
|
+
return {
|
|
50
|
+
redirectPath: exports.INVITES_PAGE_PATH,
|
|
51
|
+
...(0, invite_email_outcome_1.inviteEmailOutcome)(result.emailDelivery, exports.INVITE_EMAIL_FAILED_WARNING),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
41
54
|
function detectOwnerChange(current, body) {
|
|
42
55
|
if (body.isTenantOwner === undefined)
|
|
43
56
|
return null;
|
|
@@ -193,12 +206,11 @@ let MembersSettingsController = class MembersSettingsController extends (0, page
|
|
|
193
206
|
asTenantOwner,
|
|
194
207
|
skipEmailValidation,
|
|
195
208
|
sendEmail: true,
|
|
209
|
+
awaitEmailDelivery: true,
|
|
196
210
|
inviterName: user.name,
|
|
197
211
|
extensions,
|
|
198
212
|
});
|
|
199
|
-
return
|
|
200
|
-
redirectPath: result.kind === "added" ? MEMBERS_PAGE_PATH : exports.INVITES_PAGE_PATH,
|
|
201
|
-
};
|
|
213
|
+
return memberInviteResponse(result);
|
|
202
214
|
}
|
|
203
215
|
async validateMemberEmail(ctx, memberId, userModel) {
|
|
204
216
|
const tenantId = (0, request_tenant_1.getRequestTenantId)(ctx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/members.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../../../src/pages/settings/users/members.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
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 actions_1 = require("../../../../automation/actions");
|
|
10
|
+
const invites_2 = require("../../../../pages/settings/users/invites");
|
|
11
|
+
const members_1 = require("../../../../pages/settings/users/members");
|
|
12
|
+
const db_2 = require("../../../helpers/db");
|
|
13
|
+
const WORKSPACE_ID = "invite-email-delivery-workspace";
|
|
14
|
+
const INVITEE_EMAIL = "invitee@delivery.test";
|
|
15
|
+
const SMTP_REFUSAL = "525 5.7.1 Unauthorized IP address";
|
|
16
|
+
const refuse = async () => {
|
|
17
|
+
throw new Error(`Failed to send email: ${SMTP_REFUSAL}`);
|
|
18
|
+
};
|
|
19
|
+
const accept = async () => undefined;
|
|
20
|
+
const automationCtx = {
|
|
21
|
+
procedureId: "procedure",
|
|
22
|
+
runId: "run",
|
|
23
|
+
nodeId: "node",
|
|
24
|
+
log: () => undefined,
|
|
25
|
+
};
|
|
26
|
+
function inviteThroughMembersRoute() {
|
|
27
|
+
return (0, invites_1.inviteUserToTenant)({
|
|
28
|
+
tenantId: WORKSPACE_ID,
|
|
29
|
+
email: INVITEE_EMAIL,
|
|
30
|
+
roleIds: [],
|
|
31
|
+
sendEmail: true,
|
|
32
|
+
awaitEmailDelivery: true,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function createPendingInviteId() {
|
|
36
|
+
const result = await (0, invites_1.inviteUserToTenant)({
|
|
37
|
+
tenantId: WORKSPACE_ID,
|
|
38
|
+
email: INVITEE_EMAIL,
|
|
39
|
+
});
|
|
40
|
+
if (result.kind !== "invited")
|
|
41
|
+
throw new Error("Expected a pending invite");
|
|
42
|
+
return result.inviteId;
|
|
43
|
+
}
|
|
44
|
+
function pendingInvite() {
|
|
45
|
+
return (0, interface_database_decorators_1.GetModel)(db_1.UserInviteModel, WORKSPACE_ID).getByEmail(INVITEE_EMAIL);
|
|
46
|
+
}
|
|
47
|
+
describe("[unit] pages/settings — invitation email delivery", () => {
|
|
48
|
+
let sendEmail;
|
|
49
|
+
let sentCount;
|
|
50
|
+
before(() => {
|
|
51
|
+
(0, interface_core_1.ImplementInterface)({ sendAdminInviteEmail: auth_1.sendAdminInviteEmail }, {
|
|
52
|
+
sendAdminInviteEmail: () => {
|
|
53
|
+
sentCount += 1;
|
|
54
|
+
return sendEmail();
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
beforeEach(async () => {
|
|
59
|
+
await (0, db_2.resetDatabase)();
|
|
60
|
+
sendEmail = accept;
|
|
61
|
+
sentCount = 0;
|
|
62
|
+
const now = new Date();
|
|
63
|
+
await (0, interface_database_decorators_1.GetModel)(db_1.TenantModel).insert({
|
|
64
|
+
_id: WORKSPACE_ID,
|
|
65
|
+
name: "Delivery",
|
|
66
|
+
createdAt: now,
|
|
67
|
+
updatedAt: now,
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe("members invite route", () => {
|
|
71
|
+
it("keeps the invitation and tells the inviter when the email fails", async () => {
|
|
72
|
+
sendEmail = refuse;
|
|
73
|
+
const result = await inviteThroughMembersRoute();
|
|
74
|
+
(0, chai_1.expect)(result).to.include({ kind: "invited", emailDelivery: "failed" });
|
|
75
|
+
(0, chai_1.expect)(await pendingInvite()).to.exist;
|
|
76
|
+
const response = (0, members_1.memberInviteResponse)(result);
|
|
77
|
+
(0, chai_1.expect)(response).to.deep.equal({
|
|
78
|
+
redirectPath: members_1.INVITES_PAGE_PATH,
|
|
79
|
+
emailDelivery: "failed",
|
|
80
|
+
warning: members_1.INVITE_EMAIL_FAILED_WARNING,
|
|
81
|
+
});
|
|
82
|
+
(0, chai_1.expect)(JSON.stringify(response)).not.to.contain(SMTP_REFUSAL);
|
|
83
|
+
});
|
|
84
|
+
it("reports a sent email without a warning", async () => {
|
|
85
|
+
const result = await inviteThroughMembersRoute();
|
|
86
|
+
(0, chai_1.expect)(sentCount).to.equal(1);
|
|
87
|
+
(0, chai_1.expect)((0, members_1.memberInviteResponse)(result)).to.deep.equal({
|
|
88
|
+
redirectPath: members_1.INVITES_PAGE_PATH,
|
|
89
|
+
emailDelivery: "sent",
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe("resend", () => {
|
|
94
|
+
it("keeps the reissued invitation and warns when the email fails", async () => {
|
|
95
|
+
const inviteId = await createPendingInviteId();
|
|
96
|
+
sendEmail = refuse;
|
|
97
|
+
const outcome = await (0, invites_2.resendPendingInvite)(WORKSPACE_ID, inviteId);
|
|
98
|
+
(0, chai_1.expect)(outcome).to.deep.equal({
|
|
99
|
+
emailDelivery: "failed",
|
|
100
|
+
warning: invites_2.INVITE_RESEND_EMAIL_FAILED_WARNING,
|
|
101
|
+
});
|
|
102
|
+
(0, chai_1.expect)(await pendingInvite()).to.exist;
|
|
103
|
+
});
|
|
104
|
+
it("reports a sent email without a warning", async () => {
|
|
105
|
+
const inviteId = await createPendingInviteId();
|
|
106
|
+
const outcome = await (0, invites_2.resendPendingInvite)(WORKSPACE_ID, inviteId);
|
|
107
|
+
(0, chai_1.expect)(outcome).to.deep.equal({ emailDelivery: "sent" });
|
|
108
|
+
(0, chai_1.expect)(sentCount).to.equal(1);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe("callers that do not opt in", () => {
|
|
112
|
+
it("still send in the background and report no delivery", async () => {
|
|
113
|
+
let releaseEmail = () => undefined;
|
|
114
|
+
const emailRequested = new Promise((requested) => {
|
|
115
|
+
sendEmail = () => {
|
|
116
|
+
requested();
|
|
117
|
+
return new Promise((resolve) => {
|
|
118
|
+
releaseEmail = resolve;
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
const result = await (0, invites_1.inviteUserToTenant)({
|
|
123
|
+
tenantId: WORKSPACE_ID,
|
|
124
|
+
email: INVITEE_EMAIL,
|
|
125
|
+
sendEmail: true,
|
|
126
|
+
});
|
|
127
|
+
await emailRequested;
|
|
128
|
+
releaseEmail();
|
|
129
|
+
(0, chai_1.expect)(result).to.have.property("kind", "invited");
|
|
130
|
+
(0, chai_1.expect)(result).not.to.have.property("emailDelivery");
|
|
131
|
+
});
|
|
132
|
+
it("leave the automation invite action's output unchanged", async () => {
|
|
133
|
+
sendEmail = refuse;
|
|
134
|
+
const action = actions_1.ACTIONS.find(({ id }) => id === "dms.invite-user");
|
|
135
|
+
const output = await action?.execute({ email: INVITEE_EMAIL, tenantId: WORKSPACE_ID }, automationCtx);
|
|
136
|
+
const invite = await pendingInvite();
|
|
137
|
+
(0, chai_1.expect)(output).to.deep.equal({ kind: "invited", inviteId: invite?._id });
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=invite-email-delivery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invite-email-delivery.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/pages/settings/invite-email-delivery.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -146,6 +146,7 @@
|
|
|
146
146
|
"description": "Enter the email address of the person to invite and click 'Send invitation' to grant them access.",
|
|
147
147
|
"submit": "Send invitation",
|
|
148
148
|
"success": "Invitation sent successfully",
|
|
149
|
+
"email_failed": "Invitation created, but the email could not be sent. Resend it from the pending invitations list once email sending works again.",
|
|
149
150
|
"field": {
|
|
150
151
|
"email": "Email address",
|
|
151
152
|
"firstname": "First name",
|
|
@@ -212,6 +213,7 @@
|
|
|
212
213
|
"action": {
|
|
213
214
|
"resend": "Resend",
|
|
214
215
|
"resend_success": "Invitation resent successfully",
|
|
216
|
+
"resend_email_failed": "Invitation renewed, but the email could not be sent. Try again once email sending works again.",
|
|
215
217
|
"resend_confirm_title": "Resend invitation",
|
|
216
218
|
"resend_confirm_description": "This will generate a new invitation link and send it to the user. The previous link will be invalidated.",
|
|
217
219
|
"cancel": "Cancel invite",
|
|
@@ -150,6 +150,7 @@
|
|
|
150
150
|
"description": "Saisissez l'adresse e-mail de la personne à inviter et cliquez sur 'Envoyer l'invitation' pour lui accorder l'accès.",
|
|
151
151
|
"submit": "Envoyer l'invitation",
|
|
152
152
|
"success": "Invitation envoyée avec succès",
|
|
153
|
+
"email_failed": "Invitation créée, mais l'e-mail n'a pas pu être envoyé. Renvoyez-la depuis la liste des invitations en attente une fois l'envoi des e-mails rétabli.",
|
|
153
154
|
"already_member": "Cet utilisateur est déjà enregistré",
|
|
154
155
|
"field": {
|
|
155
156
|
"email": "Adresse e-mail",
|
|
@@ -216,6 +217,7 @@
|
|
|
216
217
|
"action": {
|
|
217
218
|
"resend": "Renvoyer",
|
|
218
219
|
"resend_success": "Invitation renvoyée avec succès",
|
|
220
|
+
"resend_email_failed": "Invitation renouvelée, mais l'e-mail n'a pas pu être envoyé. Réessayez une fois l'envoi des e-mails rétabli.",
|
|
219
221
|
"resend_confirm_title": "Renvoyer l'invitation",
|
|
220
222
|
"resend_confirm_description": "Un nouveau lien d'invitation sera généré et envoyé à l'utilisateur. L'ancien lien sera invalidé.",
|
|
221
223
|
"cancel": "Annuler l'invitation",
|
package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewRowActions.ts
CHANGED
|
@@ -18,6 +18,7 @@ import DmsForm from "../../../components/form/Form.vue";
|
|
|
18
18
|
import { get } from "@nuxt/ui/runtime/utils/index.js";
|
|
19
19
|
import type { ActionTarget } from "../../../composables/table-view/types/action-target";
|
|
20
20
|
import { TableViewEvents } from "../../../composables/table-view/types";
|
|
21
|
+
import { resolveResponseToast } from "../../../utils/responseWarning";
|
|
21
22
|
|
|
22
23
|
const DEFAULT_ROW_ID_KEY = "_id";
|
|
23
24
|
const DEFAULT_MODAL_SIZE = "xl";
|
|
@@ -592,13 +593,16 @@ export const useTableRowActions = <T extends Data>(
|
|
|
592
593
|
}
|
|
593
594
|
|
|
594
595
|
try {
|
|
595
|
-
await config.api(url, {
|
|
596
|
+
const response = await config.api(url, {
|
|
596
597
|
method: target.method || HttpMethod.post,
|
|
597
598
|
});
|
|
598
|
-
toast.add(
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
599
|
+
toast.add(
|
|
600
|
+
resolveResponseToast(
|
|
601
|
+
response,
|
|
602
|
+
{ color: Color.success, title: processI18n(target.successMessage) },
|
|
603
|
+
{ processI18n, processApiMessage },
|
|
604
|
+
),
|
|
605
|
+
);
|
|
602
606
|
config.refreshCallback?.();
|
|
603
607
|
} catch (error: unknown) {
|
|
604
608
|
handleApiError(error, t("dms.form.error_unknown"));
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { FormData } from "./value";
|
|
2
|
+
import type { WarningResponse } from "../../../utils/responseWarning";
|
|
2
3
|
|
|
3
4
|
export interface FormFetchResponse extends FormData {}
|
|
4
5
|
|
|
5
|
-
export interface FormSubmitResponse {
|
|
6
|
+
export interface FormSubmitResponse extends WarningResponse {
|
|
6
7
|
success?: boolean;
|
|
7
8
|
message?: string;
|
|
8
9
|
}
|
|
@@ -7,6 +7,7 @@ import { FormEvents } from "./types/events";
|
|
|
7
7
|
import type { FormData, FormFieldValue } from "./types/value";
|
|
8
8
|
import type { FormField, FormFieldOrGroup } from "./types/field";
|
|
9
9
|
import { isFieldGroup } from "./types/field";
|
|
10
|
+
import { resolveResponseToast } from "../../utils/responseWarning";
|
|
10
11
|
import type { DataType } from "#dms-core/app/composables/data-types/useDataType";
|
|
11
12
|
|
|
12
13
|
interface FormResetTarget {
|
|
@@ -492,14 +493,20 @@ export const useForm = (props: FormProps) => {
|
|
|
492
493
|
),
|
|
493
494
|
);
|
|
494
495
|
|
|
495
|
-
const showSubmitSuccessToast = () => {
|
|
496
|
-
toast.add(
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
496
|
+
const showSubmitSuccessToast = (response: FormSubmitResponse | undefined) => {
|
|
497
|
+
toast.add(
|
|
498
|
+
resolveResponseToast(
|
|
499
|
+
response,
|
|
500
|
+
{
|
|
501
|
+
title: processI18n("$dms.form.success_title"),
|
|
502
|
+
description: processI18n(
|
|
503
|
+
props.successMessage || "$dms.form.success_message",
|
|
504
|
+
),
|
|
505
|
+
color: Color.success,
|
|
506
|
+
},
|
|
507
|
+
{ processI18n, processApiMessage },
|
|
500
508
|
),
|
|
501
|
-
|
|
502
|
-
});
|
|
509
|
+
);
|
|
503
510
|
};
|
|
504
511
|
|
|
505
512
|
const resolveSubmitErrorDescription = (error: EventError) => {
|
|
@@ -520,7 +527,7 @@ export const useForm = (props: FormProps) => {
|
|
|
520
527
|
response: FormSubmitResponse | undefined,
|
|
521
528
|
plainData: FormData,
|
|
522
529
|
) => {
|
|
523
|
-
showSubmitSuccessToast();
|
|
530
|
+
showSubmitSuccessToast(response);
|
|
524
531
|
props.onSuccessCallback?.(response, plainData);
|
|
525
532
|
initialValues.value = snapshotFormState(state.value);
|
|
526
533
|
if (props.redirectOnSuccess) {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Color } from "#dms-core/app/types/color";
|
|
2
|
+
|
|
3
|
+
const WARNING_TITLE_KEY = "$dms.form.warning_title";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A response to an action that went through but left something the user has
|
|
7
|
+
* to act on — an invitation created whose email did not leave. `warning` is
|
|
8
|
+
* an API message (an i18n key or plain text), shown in place of the success
|
|
9
|
+
* message.
|
|
10
|
+
*/
|
|
11
|
+
export interface WarningResponse {
|
|
12
|
+
warning?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ResponseToast {
|
|
16
|
+
color: Color;
|
|
17
|
+
title: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface ResponseToastTranslation {
|
|
22
|
+
processI18n: (key: string) => string;
|
|
23
|
+
processApiMessage: (message: unknown) => string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** The warning a response carries, or `undefined` when it reports a plain success. */
|
|
27
|
+
export function readResponseWarning(response: unknown): string | undefined {
|
|
28
|
+
if (!response || typeof response !== "object") return undefined;
|
|
29
|
+
const { warning } = response as WarningResponse;
|
|
30
|
+
return typeof warning === "string" && warning ? warning : undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** `success`, unless the response carries a warning, which is told instead. */
|
|
34
|
+
export function resolveResponseToast(
|
|
35
|
+
response: unknown,
|
|
36
|
+
success: ResponseToast,
|
|
37
|
+
{ processI18n, processApiMessage }: ResponseToastTranslation,
|
|
38
|
+
): ResponseToast {
|
|
39
|
+
const warning = readResponseWarning(response);
|
|
40
|
+
if (!warning) return success;
|
|
41
|
+
return {
|
|
42
|
+
color: Color.warning,
|
|
43
|
+
title: processI18n(WARNING_TITLE_KEY),
|
|
44
|
+
description: processApiMessage(warning),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -159,6 +159,7 @@
|
|
|
159
159
|
"form": {
|
|
160
160
|
"success_title": "Success",
|
|
161
161
|
"success_message": "Data has been successfully saved",
|
|
162
|
+
"warning_title": "Done, with a warning",
|
|
162
163
|
"error_title": "Error",
|
|
163
164
|
"error_unknown": "An unknown error occurred",
|
|
164
165
|
"error_no_target": "This form does not know which item to save. Open it from a link that names one.",
|
|
@@ -159,6 +159,7 @@
|
|
|
159
159
|
"form": {
|
|
160
160
|
"success_title": "Succès",
|
|
161
161
|
"success_message": "Les données ont été enregistrées avec succès",
|
|
162
|
+
"warning_title": "Terminé, avec un avertissement",
|
|
162
163
|
"error_title": "Erreur",
|
|
163
164
|
"error_unknown": "Une erreur inconnue s'est produite",
|
|
164
165
|
"error_no_target": "Ce formulaire ne sait pas quel élément enregistrer. Ouvrez-le depuis un lien qui en désigne un.",
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
readResponseWarning,
|
|
4
|
+
resolveResponseToast,
|
|
5
|
+
} from "../layers/dms-ui/app/utils/responseWarning";
|
|
6
|
+
import en from "../layers/dms-layout/i18n/locales/layout-en-GB.json";
|
|
7
|
+
import fr from "../layers/dms-layout/i18n/locales/layout-fr-FR.json";
|
|
8
|
+
import uiEn from "../layers/dms-ui/i18n/locales/ui-en-GB.json";
|
|
9
|
+
import uiFr from "../layers/dms-ui/i18n/locales/ui-fr-FR.json";
|
|
10
|
+
|
|
11
|
+
const INVITE_EMAIL_FAILED = "$page.settings.members.invite.email_failed";
|
|
12
|
+
const SUCCESS = { color: "success", title: "Invitation sent successfully" };
|
|
13
|
+
|
|
14
|
+
const translation = {
|
|
15
|
+
processI18n: (key: string) => `i18n:${key}`,
|
|
16
|
+
processApiMessage: (message: unknown) => `api:${String(message)}`,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
describe("response warning toast", () => {
|
|
20
|
+
it("tells the warning instead of the success when the response carries one", () => {
|
|
21
|
+
expect(
|
|
22
|
+
resolveResponseToast(
|
|
23
|
+
{ redirectPath: "/invites", warning: INVITE_EMAIL_FAILED },
|
|
24
|
+
SUCCESS,
|
|
25
|
+
translation,
|
|
26
|
+
),
|
|
27
|
+
).toEqual({
|
|
28
|
+
color: "warning",
|
|
29
|
+
title: "i18n:$dms.form.warning_title",
|
|
30
|
+
description: `api:${INVITE_EMAIL_FAILED}`,
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("keeps the success toast for a plain success", () => {
|
|
35
|
+
expect(
|
|
36
|
+
resolveResponseToast({ emailDelivery: "sent" }, SUCCESS, translation),
|
|
37
|
+
).toBe(SUCCESS);
|
|
38
|
+
expect(resolveResponseToast(undefined, SUCCESS, translation)).toBe(SUCCESS);
|
|
39
|
+
expect(resolveResponseToast("", SUCCESS, translation)).toBe(SUCCESS);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("ignores a warning that is not a message", () => {
|
|
43
|
+
expect(readResponseWarning({ warning: "" })).toBeUndefined();
|
|
44
|
+
expect(readResponseWarning({ warning: 42 })).toBeUndefined();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("has the invitation warnings in every shipped locale", () => {
|
|
48
|
+
for (const locale of [en, fr]) {
|
|
49
|
+
const settings = locale.page.settings;
|
|
50
|
+
expect(settings.members.invite.email_failed).toBeTruthy();
|
|
51
|
+
expect(settings.invites.action.resend_email_failed).toBeTruthy();
|
|
52
|
+
}
|
|
53
|
+
for (const locale of [uiEn, uiFr]) {
|
|
54
|
+
expect(locale.dms.form.warning_title).toBeTruthy();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antelopejs/dms",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4",
|
|
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.8 <1.0.0",
|
|
38
38
|
"@antelopejs/interface-database-decorators": ">=0.1.7 <1.0.0",
|
|
39
|
-
"@antelopejs/interface-dms": ">=0.3.
|
|
39
|
+
"@antelopejs/interface-dms": ">=0.3.5 <0.4.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",
|