@antelopejs/interface-dms 0.7.4 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +176 -0
- package/dist/auth/index.d.ts +3 -3
- package/dist/auth/index.js +11 -9
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/internal/jwt-auth-decorator.d.ts +20 -0
- package/dist/auth/internal/jwt-auth-decorator.js +51 -0
- package/dist/auth/internal/jwt-auth-decorator.js.map +1 -0
- package/dist/auth/internal/request-authenticators.d.ts +12 -0
- package/dist/auth/internal/request-authenticators.js +22 -0
- package/dist/auth/internal/request-authenticators.js.map +1 -1
- package/dist/base/activity-feed.d.ts +6 -6
- package/dist/base/block-registry/types.d.ts +16 -0
- package/dist/base/block-types.d.ts +1 -0
- package/dist/base/block-types.js +1 -0
- package/dist/base/block-types.js.map +1 -1
- package/dist/base/chart-card.d.ts +15 -0
- package/dist/base/chart-card.js +4 -0
- package/dist/base/chart-card.js.map +1 -1
- package/dist/base/chart-schemas.d.ts +26 -26
- package/dist/base/code-block.d.ts +3 -3
- package/dist/base/data-types/compare-types.js +19 -13
- package/dist/base/data-types/compare-types.js.map +1 -1
- package/dist/base/data-types/core.d.ts +11 -0
- package/dist/base/data-types/core.js +14 -1
- package/dist/base/data-types/core.js.map +1 -1
- package/dist/base/data-types/default-types.d.ts +112 -2
- package/dist/base/data-types/default-types.js +90 -19
- package/dist/base/data-types/default-types.js.map +1 -1
- package/dist/base/data-types/field-types.d.ts +10 -4
- package/dist/base/data-types/field-types.js +12 -2
- package/dist/base/data-types/field-types.js.map +1 -1
- package/dist/base/data-types/internal/compare-types.d.ts +3 -0
- package/dist/base/data-types/internal/compare-types.js +7 -0
- package/dist/base/data-types/internal/compare-types.js.map +1 -1
- package/dist/base/empty-state.d.ts +4 -4
- package/dist/base/form-block-schema.d.ts +59 -3
- package/dist/base/form-block-schema.js +12 -2
- package/dist/base/form-block-schema.js.map +1 -1
- package/dist/base/form-schema.d.ts +57 -5
- package/dist/base/form-schema.js +22 -0
- package/dist/base/form-schema.js.map +1 -1
- package/dist/base/form-types.d.ts +82 -13
- package/dist/base/form-types.js +12 -4
- package/dist/base/form-types.js.map +1 -1
- package/dist/base/guard.d.ts +6 -6
- package/dist/base/helpers/archive-mode-helpers.js +6 -2
- package/dist/base/helpers/archive-mode-helpers.js.map +1 -1
- package/dist/base/index.d.ts +1 -0
- package/dist/base/index.js +1 -0
- package/dist/base/index.js.map +1 -1
- package/dist/base/internal/form-schema.js +5 -0
- package/dist/base/internal/form-schema.js.map +1 -1
- package/dist/base/internal/layouts.d.ts +15 -3
- package/dist/base/key-value-list.d.ts +12 -9
- package/dist/base/key-value-list.js +1 -1
- package/dist/base/key-value-list.js.map +1 -1
- package/dist/base/kpi-card.d.ts +39 -5
- package/dist/base/kpi-card.js +18 -6
- package/dist/base/kpi-card.js.map +1 -1
- package/dist/base/layouts.d.ts +24 -1
- package/dist/base/layouts.js.map +1 -1
- package/dist/base/live-toggle.d.ts +11 -0
- package/dist/base/live-toggle.js +8 -1
- package/dist/base/live-toggle.js.map +1 -1
- package/dist/base/page-toolbar.d.ts +158 -0
- package/dist/base/page-toolbar.js +198 -0
- package/dist/base/page-toolbar.js.map +1 -0
- package/dist/base/period-selector.d.ts +9 -2
- package/dist/base/period-selector.js.map +1 -1
- package/dist/base/placeholder.d.ts +2 -2
- package/dist/base/section.d.ts +2 -2
- package/dist/base/stack.d.ts +2 -2
- package/dist/base/stat-group.d.ts +18 -6
- package/dist/base/stat-group.js +9 -0
- package/dist/base/stat-group.js.map +1 -1
- package/dist/base/table-view/column-display.d.ts +9 -5
- package/dist/base/table-view/column-display.js +1 -1
- package/dist/base/table-view/column-display.js.map +1 -1
- package/dist/base/table-view/data-functions.d.ts +26 -7
- package/dist/base/table-view/data-functions.js +10 -6
- package/dist/base/table-view/data-functions.js.map +1 -1
- package/dist/base/table-view/factory.js +24 -13
- package/dist/base/table-view/factory.js.map +1 -1
- package/dist/base/table-view/internal/auth.d.ts +2 -0
- package/dist/base/table-view/internal/auth.js +3 -1
- package/dist/base/table-view/internal/auth.js.map +1 -1
- package/dist/base/table-view/internal/column-conditions.d.ts +15 -0
- package/dist/base/table-view/internal/column-conditions.js +94 -0
- package/dist/base/table-view/internal/column-conditions.js.map +1 -0
- package/dist/base/table-view/internal/factory-helpers.d.ts +5 -0
- package/dist/base/table-view/internal/factory-helpers.js +55 -11
- package/dist/base/table-view/internal/factory-helpers.js.map +1 -1
- package/dist/base/table-view/internal/guards.js +19 -2
- package/dist/base/table-view/internal/guards.js.map +1 -1
- package/dist/base/table-view/internal/realtime.js +17 -0
- package/dist/base/table-view/internal/realtime.js.map +1 -1
- package/dist/base/table-view/internal/resource-form.js +1 -0
- package/dist/base/table-view/internal/resource-form.js.map +1 -1
- package/dist/base/table-view/internal/row-actions-schema.d.ts +296 -0
- package/dist/base/table-view/internal/row-actions-schema.js +62 -0
- package/dist/base/table-view/internal/row-actions-schema.js.map +1 -0
- package/dist/base/table-view/internal/validation.d.ts +22 -3
- package/dist/base/table-view/internal/validation.js +92 -2
- package/dist/base/table-view/internal/validation.js.map +1 -1
- package/dist/base/table-view/meta.d.ts +25 -1
- package/dist/base/table-view/meta.js +36 -4
- package/dist/base/table-view/meta.js.map +1 -1
- package/dist/base/table-view/options.d.ts +92 -16
- package/dist/base/table-view/options.js.map +1 -1
- package/dist/base/table-view/realtime.d.ts +8 -0
- package/dist/base/table-view/realtime.js.map +1 -1
- package/dist/base/table-view/routes.js +8 -4
- package/dist/base/table-view/routes.js.map +1 -1
- package/dist/base/table-view/schema.d.ts +36 -30
- package/dist/base/table-view/schema.js +11 -57
- package/dist/base/table-view/schema.js.map +1 -1
- package/dist/base/table-view/source.d.ts +1 -1
- package/dist/base/table-view/source.js +4 -1
- package/dist/base/table-view/source.js.map +1 -1
- package/dist/base/table-view.d.ts +2 -2
- package/dist/base/table-view.js.map +1 -1
- package/dist/base/top-list-card.d.ts +5 -5
- package/dist/base/types/action-target.d.ts +77 -20
- package/dist/base/types/confirm-dialog.d.ts +5 -1
- package/dist/base/types/custom-button.d.ts +5 -3
- package/dist/base/types/field-config.d.ts +4 -4
- package/dist/base/types/guards.d.ts +10 -0
- package/dist/base/types/row-action.d.ts +6 -1
- package/dist/base/types/size.d.ts +3 -1
- package/dist/client-ip.d.ts +6 -2
- package/dist/client-ip.js +4 -2
- package/dist/client-ip.js.map +1 -1
- package/dist/component.d.ts +14 -0
- package/dist/component.js.map +1 -1
- package/dist/data-controllers/members.d.ts +0 -3
- package/dist/data-controllers/members.js +30 -8
- package/dist/data-controllers/members.js.map +1 -1
- package/dist/db/internal/tenantLifecycle.model.js +5 -2
- package/dist/db/internal/tenantLifecycle.model.js.map +1 -1
- package/dist/guards.js +2 -3
- package/dist/guards.js.map +1 -1
- package/dist/hooks.d.ts +54 -10
- package/dist/hooks.js +12 -4
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/invite-membership.d.ts +9 -0
- package/dist/internal/invite-membership.js +25 -7
- package/dist/internal/invite-membership.js.map +1 -1
- package/dist/internal/member-changes.d.ts +24 -0
- package/dist/internal/member-changes.js +66 -0
- package/dist/internal/member-changes.js.map +1 -0
- package/dist/internal/tenant-ownership.d.ts +4 -1
- package/dist/internal/tenant-ownership.js +4 -10
- package/dist/internal/tenant-ownership.js.map +1 -1
- package/dist/invite-extensions/internal/form-slot.js +1 -1
- package/dist/invite-extensions/internal/form-slot.js.map +1 -1
- package/dist/invite-extensions.d.ts +0 -9
- package/dist/invite-extensions.js +1 -36
- package/dist/invite-extensions.js.map +1 -1
- package/dist/invite-resolution.js +6 -2
- package/dist/invite-resolution.js.map +1 -1
- package/dist/invites.js +36 -22
- package/dist/invites.js.map +1 -1
- package/dist/layout-banners.d.ts +40 -4
- package/dist/layout-banners.js +25 -3
- package/dist/layout-banners.js.map +1 -1
- package/dist/notifications/internal.d.ts +2 -2
- package/dist/notifications/internal.js.map +1 -1
- package/dist/notifications/sendable.d.ts +3 -2
- package/dist/notifications/sendable.js +2 -1
- package/dist/notifications/sendable.js.map +1 -1
- package/dist/notifications/types.d.ts +9 -0
- package/dist/page/controllers.d.ts +44 -0
- package/dist/page/controllers.js +14 -1
- package/dist/page/controllers.js.map +1 -1
- package/dist/page/internal/layout-filter.d.ts +10 -4
- package/dist/page/internal/layout-filter.js +27 -14
- package/dist/page/internal/layout-filter.js.map +1 -1
- package/dist/page/internal/metadata-helpers.d.ts +7 -0
- package/dist/page/internal/metadata-helpers.js +13 -2
- package/dist/page/internal/metadata-helpers.js.map +1 -1
- package/dist/page/internal/page-record.d.ts +34 -0
- package/dist/page/internal/page-record.js +87 -0
- package/dist/page/internal/page-record.js.map +1 -0
- package/dist/page/internal/page-registration.d.ts +2 -0
- package/dist/page/internal/page-registration.js.map +1 -1
- package/dist/page/layout-filter.js +31 -10
- package/dist/page/layout-filter.js.map +1 -1
- package/dist/page/metadata.js +36 -26
- package/dist/page/metadata.js.map +1 -1
- package/dist/page/types.d.ts +39 -4
- package/dist/page/types.js.map +1 -1
- package/dist/page.d.ts +1 -1
- package/dist/page.js +2 -1
- package/dist/page.js.map +1 -1
- package/dist/permissions-resolver.d.ts +26 -3
- package/dist/permissions-resolver.js +2 -1
- package/dist/permissions-resolver.js.map +1 -1
- package/dist/permissions.d.ts +7 -3
- package/dist/permissions.js +8 -6
- package/dist/permissions.js.map +1 -1
- package/dist/realtime.d.ts +24 -1
- package/dist/realtime.js +7 -1
- package/dist/realtime.js.map +1 -1
- package/dist/request-tenant.d.ts +17 -13
- package/dist/request-tenant.js +54 -42
- package/dist/request-tenant.js.map +1 -1
- package/dist/tenant-members.d.ts +26 -0
- package/dist/tenant-members.js +29 -0
- package/dist/tenant-members.js.map +1 -0
- package/dist/tenant-ownership.d.ts +4 -1
- package/dist/tenant-ownership.js +12 -17
- package/dist/tenant-ownership.js.map +1 -1
- package/dist/tenant-provisioning.d.ts +15 -0
- package/dist/tenant-provisioning.js +27 -0
- package/dist/tenant-provisioning.js.map +1 -0
- package/dist/tenant-scoped-model.d.ts +2 -1
- package/dist/tenant-scoped-model.js +4 -3
- package/dist/tenant-scoped-model.js.map +1 -1
- package/docs/1.core/10.layout-banners.md +57 -2
- package/docs/1.core/2.pages-and-modules.md +20 -11
- package/docs/1.core/4.permissions.md +34 -1
- package/docs/1.core/5.tenancy.md +37 -6
- package/docs/1.core/7.hooks.md +24 -4
- package/docs/1.core/8.realtime.md +24 -3
- package/docs/2.auth/2.authentication.md +3 -3
- package/docs/3.base/1.introduction.md +1 -0
- package/docs/3.base/10.display-blocks.md +20 -2
- package/docs/3.base/2.types.md +7 -5
- package/docs/3.base/3.forms.md +28 -8
- package/docs/3.base/4.tables.md +27 -9
- package/docs/3.base/5.charts-and-widgets.md +8 -4
- package/docs/3.base/6.layout.md +47 -1
- package/docs/3.base/8.data-types.md +16 -9
- package/docs/4.notifications/3.sending.md +4 -3
- package/docs/5.html-render/1.introduction.md +5 -7
- package/package.json +7 -11
package/dist/invites.js
CHANGED
|
@@ -18,8 +18,9 @@ const hooks_1 = require("./hooks");
|
|
|
18
18
|
const delivery_1 = require("./invite-extensions/internal/delivery");
|
|
19
19
|
const invite_resolution_1 = require("./internal/invite-resolution");
|
|
20
20
|
const invite_resolution_2 = require("./invite-resolution");
|
|
21
|
-
const
|
|
21
|
+
const tenant_members_1 = require("./tenant-members");
|
|
22
22
|
const tenant_ownership_1 = require("./internal/tenant-ownership");
|
|
23
|
+
const member_changes_1 = require("./internal/member-changes");
|
|
23
24
|
const invites_1 = require("./internal/invites");
|
|
24
25
|
var invitee_display_name_1 = require("./invitee-display-name");
|
|
25
26
|
Object.defineProperty(exports, "inviteeDisplayName", { enumerable: true, get: function () { return invitee_display_name_1.inviteeDisplayName; } });
|
|
@@ -42,7 +43,7 @@ exports.INVITE_EXPIRY_DAYS = 7;
|
|
|
42
43
|
* intentionally side-effect-light: it does not throw on duplicates.
|
|
43
44
|
*/
|
|
44
45
|
async function inviteUserToTenant(options) {
|
|
45
|
-
const result = await (0,
|
|
46
|
+
const result = await (0, tenant_members_1.changeTenantMembers)(options.tenantId, () => planInvite(options));
|
|
46
47
|
if (!options.sendEmail || result.kind !== "invited")
|
|
47
48
|
return result;
|
|
48
49
|
const invite = { ...options, token: result.token };
|
|
@@ -55,30 +56,40 @@ async function inviteUserToTenant(options) {
|
|
|
55
56
|
emailDelivery: await (0, invites_1.deliverTenantInviteEmail)(invite),
|
|
56
57
|
};
|
|
57
58
|
}
|
|
58
|
-
async function
|
|
59
|
+
async function planInvite(options) {
|
|
59
60
|
const { tenantId, email, firstname = null, lastname = null, language = "en", roleIds = [], asTenantOwner = false, invitedBy = null, extensions, } = options;
|
|
60
61
|
const userModel = (0, interface_database_decorators_1.GetModel)(db_2.UserModel);
|
|
61
62
|
const existingUser = await userModel.getByEmail(email);
|
|
62
63
|
if (existingUser) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
const userId = existingUser._id;
|
|
65
|
+
const patch = { roleIds, isTenantOwner: asTenantOwner };
|
|
66
|
+
const member = await (0, interface_database_decorators_1.GetModel)(db_1.TenantMemberModel, tenantId).getByUser(userId);
|
|
67
|
+
return {
|
|
68
|
+
changes: (0, member_changes_1.describeMembershipPatch)(member, userId, patch),
|
|
69
|
+
write: async () => {
|
|
70
|
+
await (0, tenant_ownership_1.applyAdmittedTenantOwnership)(userModel, userId, tenantId, patch);
|
|
71
|
+
await deliverToExistingMember(tenantId, email, userId, extensions);
|
|
72
|
+
return { kind: "added", userId };
|
|
73
|
+
},
|
|
74
|
+
};
|
|
69
75
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
return {
|
|
77
|
+
changes: [],
|
|
78
|
+
write: async () => {
|
|
79
|
+
const { inviteId, token } = await createAdmittedInviteToken({
|
|
80
|
+
tenantId,
|
|
81
|
+
email,
|
|
82
|
+
firstname,
|
|
83
|
+
lastname,
|
|
84
|
+
language,
|
|
85
|
+
roleIds,
|
|
86
|
+
asTenantOwner,
|
|
87
|
+
invitedBy,
|
|
88
|
+
extensions,
|
|
89
|
+
});
|
|
90
|
+
return { kind: "invited", inviteId, token };
|
|
91
|
+
},
|
|
92
|
+
};
|
|
82
93
|
}
|
|
83
94
|
/**
|
|
84
95
|
* The membership is already granted when this runs, so a failure here is
|
|
@@ -105,7 +116,10 @@ async function deliverToExistingMember(tenantId, email, userId, extensions) {
|
|
|
105
116
|
* INVITE_DELETED / INVITE_BEING_CREATED / INVITE_CREATED hooks.
|
|
106
117
|
*/
|
|
107
118
|
async function createUserInviteToken(options) {
|
|
108
|
-
return (0,
|
|
119
|
+
return (0, tenant_members_1.changeTenantMembers)(options.tenantId, async () => ({
|
|
120
|
+
changes: [],
|
|
121
|
+
write: () => createAdmittedInviteToken(options),
|
|
122
|
+
}));
|
|
109
123
|
}
|
|
110
124
|
async function createAdmittedInviteToken(options) {
|
|
111
125
|
const { tenantId, email, asTenantOwner, roleIds } = options;
|
package/dist/invites.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invites.js","sourceRoot":"","sources":["../src/invites.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"invites.js","sourceRoot":"","sources":["../src/invites.ts"],"names":[],"mappings":"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"}
|
package/dist/layout-banners.d.ts
CHANGED
|
@@ -14,6 +14,28 @@ export declare const LayoutBannerVariant: {
|
|
|
14
14
|
readonly ERROR: "error";
|
|
15
15
|
};
|
|
16
16
|
export type LayoutBannerVariant = (typeof LayoutBannerVariant)[keyof typeof LayoutBannerVariant];
|
|
17
|
+
/**
|
|
18
|
+
* Which pages of the dashboard a layout banner shows on. The module area is
|
|
19
|
+
* everything under `MODULE_URL_PREFIX` (`/modules`): the modules page, the
|
|
20
|
+
* module store and every module's own pages.
|
|
21
|
+
*/
|
|
22
|
+
export declare const LayoutBannerScope: {
|
|
23
|
+
/**
|
|
24
|
+
* The application's pages, outside the module area: the default, for a
|
|
25
|
+
* banner about the application being built (overdue invoices, a stock
|
|
26
|
+
* alert) that has no business inside a module's back office.
|
|
27
|
+
*/
|
|
28
|
+
readonly APP: "app";
|
|
29
|
+
/** The module area only. */
|
|
30
|
+
readonly MODULES: "modules";
|
|
31
|
+
/**
|
|
32
|
+
* Every page, module area included: for a workspace-wide state that must
|
|
33
|
+
* follow the user wherever they go (billing past due, a suspended
|
|
34
|
+
* workspace, a maintenance window).
|
|
35
|
+
*/
|
|
36
|
+
readonly EVERYWHERE: "everywhere";
|
|
37
|
+
};
|
|
38
|
+
export type LayoutBannerScope = (typeof LayoutBannerScope)[keyof typeof LayoutBannerScope];
|
|
17
39
|
/**
|
|
18
40
|
* What a banner's `visible` or `resolve` resolver decides on: the request the
|
|
19
41
|
* site layout is being built for.
|
|
@@ -83,6 +105,18 @@ interface LayoutBannerBase {
|
|
|
83
105
|
order?: number;
|
|
84
106
|
/** Leading icon. Defaults to one matching the variant. */
|
|
85
107
|
icon?: string;
|
|
108
|
+
/**
|
|
109
|
+
* Which pages the banner shows on, the same option on a text, a resolved
|
|
110
|
+
* and a component banner. Defaults to
|
|
111
|
+
* {@link LayoutBannerScope.APP}: the application's pages, not the module
|
|
112
|
+
* area. A workspace-wide state uses {@link LayoutBannerScope.EVERYWHERE}.
|
|
113
|
+
*
|
|
114
|
+
* The scope is applied by the dashboard against the current route, both
|
|
115
|
+
* when the page is server-rendered and on every client-side navigation, so
|
|
116
|
+
* moving in or out of the module area adds or removes the banner without
|
|
117
|
+
* re-fetching the site layout.
|
|
118
|
+
*/
|
|
119
|
+
scope?: LayoutBannerScope;
|
|
86
120
|
/**
|
|
87
121
|
* Whether the user can close the banner. A dismissal lasts for the browser
|
|
88
122
|
* session and is remembered in a cookie, so the server-rendered page already
|
|
@@ -148,8 +182,9 @@ export interface LayoutBannerResolvedInfo extends LayoutBannerBase {
|
|
|
148
182
|
props?: never;
|
|
149
183
|
}
|
|
150
184
|
/**
|
|
151
|
-
* A global banner rendered under the header of the dashboard layout, on
|
|
152
|
-
*
|
|
185
|
+
* A global banner rendered under the header of the dashboard layout, on the
|
|
186
|
+
* pages its `scope` selects — by default the application's pages, leaving the
|
|
187
|
+
* module area (`/modules/...`) out.
|
|
153
188
|
*/
|
|
154
189
|
export type LayoutBannerInfo = LayoutBannerTextInfo | LayoutBannerComponentInfo | LayoutBannerResolvedInfo;
|
|
155
190
|
/** @internal */
|
|
@@ -157,8 +192,9 @@ export declare namespace internal {
|
|
|
157
192
|
const RegisterLayoutBanner: RegisteringProxy<(info: LayoutBannerInfo) => void>;
|
|
158
193
|
}
|
|
159
194
|
/**
|
|
160
|
-
* Register a global banner under the dashboard header
|
|
161
|
-
* `
|
|
195
|
+
* Register a global banner under the dashboard header, on the pages its
|
|
196
|
+
* `scope` selects (the application's pages by default, not the module area).
|
|
197
|
+
* Banners stack by `order`, and each one's `visible` or `resolve` resolver is evaluated
|
|
162
198
|
* server-side for every site layout request, so the banner is in the
|
|
163
199
|
* server-rendered page. When the state a resolver reads changes, call `NotifyMenuChanged(tenantId)` so the
|
|
164
200
|
* connected clients re-fetch their site layout.
|
package/dist/layout-banners.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.internal = exports.LayoutBannerVariant = void 0;
|
|
3
|
+
exports.internal = exports.LayoutBannerScope = exports.LayoutBannerVariant = void 0;
|
|
4
4
|
exports.RegisterLayoutBanner = RegisterLayoutBanner;
|
|
5
5
|
const interface_core_1 = require("@antelopejs/interface-core");
|
|
6
6
|
/**
|
|
@@ -13,14 +13,36 @@ exports.LayoutBannerVariant = {
|
|
|
13
13
|
WARNING: "warning",
|
|
14
14
|
ERROR: "error",
|
|
15
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* Which pages of the dashboard a layout banner shows on. The module area is
|
|
18
|
+
* everything under `MODULE_URL_PREFIX` (`/modules`): the modules page, the
|
|
19
|
+
* module store and every module's own pages.
|
|
20
|
+
*/
|
|
21
|
+
exports.LayoutBannerScope = {
|
|
22
|
+
/**
|
|
23
|
+
* The application's pages, outside the module area: the default, for a
|
|
24
|
+
* banner about the application being built (overdue invoices, a stock
|
|
25
|
+
* alert) that has no business inside a module's back office.
|
|
26
|
+
*/
|
|
27
|
+
APP: "app",
|
|
28
|
+
/** The module area only. */
|
|
29
|
+
MODULES: "modules",
|
|
30
|
+
/**
|
|
31
|
+
* Every page, module area included: for a workspace-wide state that must
|
|
32
|
+
* follow the user wherever they go (billing past due, a suspended
|
|
33
|
+
* workspace, a maintenance window).
|
|
34
|
+
*/
|
|
35
|
+
EVERYWHERE: "everywhere",
|
|
36
|
+
};
|
|
16
37
|
/** @internal */
|
|
17
38
|
var internal;
|
|
18
39
|
(function (internal) {
|
|
19
40
|
internal.RegisterLayoutBanner = new interface_core_1.RegisteringProxy();
|
|
20
41
|
})(internal || (exports.internal = internal = {}));
|
|
21
42
|
/**
|
|
22
|
-
* Register a global banner under the dashboard header
|
|
23
|
-
* `
|
|
43
|
+
* Register a global banner under the dashboard header, on the pages its
|
|
44
|
+
* `scope` selects (the application's pages by default, not the module area).
|
|
45
|
+
* Banners stack by `order`, and each one's `visible` or `resolve` resolver is evaluated
|
|
24
46
|
* server-side for every site layout request, so the banner is in the
|
|
25
47
|
* server-rendered page. When the state a resolver reads changes, call `NotifyMenuChanged(tenantId)` so the
|
|
26
48
|
* connected clients re-fetch their site layout.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-banners.js","sourceRoot":"","sources":["../src/layout-banners.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"layout-banners.js","sourceRoot":"","sources":["../src/layout-banners.ts"],"names":[],"mappings":";;;AA0OA,oDAGC;AA7OD,+DAA8D;AAM9D;;;;GAIG;AACU,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACN,CAAC;AAKX;;;;GAIG;AACU,QAAA,iBAAiB,GAAG;IAC/B;;;;OAIG;IACH,GAAG,EAAE,KAAK;IACV,4BAA4B;IAC5B,OAAO,EAAE,SAAS;IAClB;;;;OAIG;IACH,UAAU,EAAE,YAAY;CAChB,CAAC;AA8KX,gBAAgB;AAChB,IAAiB,QAAQ,CAIxB;AAJD,WAAiB,QAAQ;IACV,6BAAoB,GAAG,IAAI,iCAAgB,EAErD,CAAC;AACN,CAAC,EAJgB,QAAQ,wBAAR,QAAQ,QAIxB;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,oBAAoB,CAAC,IAAsB;IACzD,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RegisteringProxy } from "@antelopejs/interface-core";
|
|
2
|
-
import type { DeliveryOptions, NotificationCategoryInfo, NotificationData, NotificationSubjectInfo, ReadScope } from "./types";
|
|
2
|
+
import type { DeliveryOptions, NotificationCategoryInfo, NotificationData, NotificationSubjectInfo, ReadScope, RoleSendOptions } from "./types";
|
|
3
3
|
/**
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
@@ -9,6 +9,6 @@ export declare namespace internal {
|
|
|
9
9
|
const RegisterNotificationSubject: RegisteringProxy<(info: NotificationSubjectInfo) => void>;
|
|
10
10
|
const SendToUser: (userId: string, data: NotificationData, groupId?: string | undefined, idempotencyKey?: string | undefined, delivery?: DeliveryOptions | undefined) => Promise<void>;
|
|
11
11
|
const SendToUsers: (userIds: string[], data: NotificationData, readScope?: ReadScope | undefined, idempotencyKey?: string | undefined, delivery?: DeliveryOptions | undefined) => Promise<void>;
|
|
12
|
-
const SendToRoles: (roleIds: string[], data: NotificationData,
|
|
12
|
+
const SendToRoles: (roleIds: string[], data: NotificationData, options?: RoleSendOptions | undefined) => Promise<void>;
|
|
13
13
|
const SendToAll: (data: NotificationData, readScope?: ReadScope | undefined, idempotencyKey?: string | undefined, delivery?: DeliveryOptions | undefined) => Promise<void>;
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/notifications/internal.ts"],"names":[],"mappings":";;;AAAA,+DAGoC;
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/notifications/internal.ts"],"names":[],"mappings":";;;AAAA,+DAGoC;AAUpC,8EAA8E;AAC9E,+EAA+E;AAC/E,6BAA6B;AAE7B;;GAEG;AACH,IAAiB,QAAQ,CAmDxB;AAnDD,WAAiB,QAAQ;IACV,4BAAmB,GAC9B,IAAA,kCAAiB,GAA0B,CAAC;IAEjC,qCAA4B,GAAG,IAAI,iCAAgB,EAE7D,CAAC;IACS,oCAA2B,GAAG,IAAI,iCAAgB,EAE5D,CAAC;IAES,mBAAU,GACrB,IAAA,kCAAiB,GAQd,CAAC;IAEO,oBAAW,GACtB,IAAA,kCAAiB,GAQd,CAAC;IAEO,oBAAW,GACtB,IAAA,kCAAiB,GAMd,CAAC;IAEO,kBAAS,GACpB,IAAA,kCAAiB,GAOd,CAAC;AACR,CAAC,EAnDgB,QAAQ,wBAAR,QAAQ,QAmDxB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NotificationData, SendOptions } from "./types";
|
|
1
|
+
import type { NotificationData, RoleSendOptions, SendOptions } from "./types";
|
|
2
2
|
export declare class SendableNotification {
|
|
3
3
|
private readonly data;
|
|
4
4
|
constructor(data: NotificationData);
|
|
@@ -11,7 +11,8 @@ export declare class SendableNotification {
|
|
|
11
11
|
toUsers(userIds: string[], options?: SendOptions): Promise<void>;
|
|
12
12
|
/** Explicit capability for durable outbox delivery; older DMS versions do not expose this method. */
|
|
13
13
|
toUsersIdempotently(userIds: string[], idempotencyKey: string, options?: SendOptions): Promise<void>;
|
|
14
|
-
|
|
14
|
+
/** Sends to the holders of any of `roleIds`, in `options.tenantId` only when set. */
|
|
15
|
+
toRoles(roleIds: string[], options?: RoleSendOptions): Promise<void>;
|
|
15
16
|
broadcast(options?: SendOptions): Promise<void>;
|
|
16
17
|
private requireIdempotencySupport;
|
|
17
18
|
}
|
|
@@ -27,9 +27,10 @@ class SendableNotification {
|
|
|
27
27
|
async toUsersIdempotently(userIds, idempotencyKey, options = {}) {
|
|
28
28
|
await this.toUsers(userIds, { ...options, idempotencyKey });
|
|
29
29
|
}
|
|
30
|
+
/** Sends to the holders of any of `roleIds`, in `options.tenantId` only when set. */
|
|
30
31
|
async toRoles(roleIds, options = {}) {
|
|
31
32
|
await this.requireIdempotencySupport(options);
|
|
32
|
-
await internal_1.internal.SendToRoles(roleIds, this.data, options
|
|
33
|
+
await internal_1.internal.SendToRoles(roleIds, this.data, options);
|
|
33
34
|
}
|
|
34
35
|
async broadcast(options = {}) {
|
|
35
36
|
await this.requireIdempotencySupport(options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sendable.js","sourceRoot":"","sources":["../../src/notifications/sendable.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;
|
|
1
|
+
{"version":3,"file":"sendable.js","sourceRoot":"","sources":["../../src/notifications/sendable.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AAQtC,SAAS,UAAU,CAAC,OAAoB;IACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,MAAa,oBAAoB;IACd,IAAI,CAAmB;IAExC,YAAY,IAAsB;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAqB,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,UAAuB,EAAE;QACpD,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,mBAAQ,CAAC,UAAU,CACvB,MAAM,EACN,IAAI,CAAC,IAAI,EACT,SAAS,EACT,OAAO,CAAC,cAAc,EACtB,UAAU,CAAC,OAAO,CAAC,CACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAiB,EAAE,UAAuB,EAAE;QACxD,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,mBAAQ,CAAC,WAAW,CACxB,OAAO,EACP,IAAI,CAAC,IAAI,EACT,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,cAAc,EACtB,UAAU,CAAC,OAAO,CAAC,CACpB,CAAC;IACJ,CAAC;IAED,qGAAqG;IACrG,KAAK,CAAC,mBAAmB,CACvB,OAAiB,EACjB,cAAsB,EACtB,UAAuB,EAAE;QAEzB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,OAAO,CACX,OAAiB,EACjB,UAA2B,EAAE;QAE7B,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,mBAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAuB,EAAE;QACvC,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,mBAAQ,CAAC,SAAS,CACtB,IAAI,CAAC,IAAI,EACT,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,cAAc,EACtB,UAAU,CAAC,OAAO,CAAC,CACpB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,OAAoB;QAC1D,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO;QACjD,IAAI,CAAC,MAAM,mBAAQ,CAAC,mBAAmB,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;CACF;AApED,oDAoEC"}
|
|
@@ -41,6 +41,15 @@ export interface SendOptions extends DeliveryOptions {
|
|
|
41
41
|
/** Stable event key, unique across notification producers. Retries preserve delivery and dismissal state. */
|
|
42
42
|
idempotencyKey?: string;
|
|
43
43
|
}
|
|
44
|
+
/** Options of `toRoles`: a send to the holders of roles. */
|
|
45
|
+
export interface RoleSendOptions extends SendOptions {
|
|
46
|
+
/**
|
|
47
|
+
* Only the members of this tenant holding the roles. Role ids belong to a
|
|
48
|
+
* tenant, so a send about one tenant names it; without it, the holders are
|
|
49
|
+
* looked up in every tenant.
|
|
50
|
+
*/
|
|
51
|
+
tenantId?: string;
|
|
52
|
+
}
|
|
44
53
|
export interface NotificationData {
|
|
45
54
|
icon: string;
|
|
46
55
|
title: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ControllerClass } from "@antelopejs/interface-api";
|
|
2
|
+
import { EventProxy } from "@antelopejs/interface-core";
|
|
2
3
|
import { type ComponentInfo } from "../component";
|
|
3
4
|
import type { CategoryInfo, DynamicMenuResolver, MenuOptions } from "./types";
|
|
4
5
|
export declare const RegisterPage: () => import("@antelopejs/interface-core/decorators").ClassDecorator<import("@antelopejs/interface-core/decorators").Class<any, any[]>>;
|
|
@@ -224,6 +225,36 @@ export interface FrontendPublicEndpoint {
|
|
|
224
225
|
headers?: string[];
|
|
225
226
|
}
|
|
226
227
|
export declare const AddFrontendModule: (config: AddFrontendModuleOptions) => Promise<void>;
|
|
228
|
+
/**
|
|
229
|
+
* A module's frontend registration as both the backend and the frontend build
|
|
230
|
+
* compute it from the module's configuration. Its `privateOptions`, if any,
|
|
231
|
+
* hold their shape only, every value an empty string: the backend fills in its
|
|
232
|
+
* secrets before `AddFrontendModule`, and the frontend server fills them from
|
|
233
|
+
* its own environment when it starts (`DMS_HTML_RENDER_SECRET`,
|
|
234
|
+
* `DMS_PRIVATE_OPTIONS`…).
|
|
235
|
+
*/
|
|
236
|
+
export type FrontendModuleRegistration = AddFrontendModuleOptions;
|
|
237
|
+
/** What a {@link FrontendModuleFunction} knows besides the module's config. */
|
|
238
|
+
export interface FrontendModuleContext {
|
|
239
|
+
/** Whether the project runs in development, as the core reports it. */
|
|
240
|
+
dev: boolean;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* The pure `config → registration` function a module ships with its
|
|
244
|
+
* frontend, named in its package.json:
|
|
245
|
+
*
|
|
246
|
+
* ```json
|
|
247
|
+
* { "dmsFrontend": "dist/frontend-module.js" }
|
|
248
|
+
* ```
|
|
249
|
+
*
|
|
250
|
+
* The file exports it as `frontendModule`. The backend passes its result to
|
|
251
|
+
* `AddFrontendModule` (adding the private options); `@antelopejs/dms-frontend`
|
|
252
|
+
* calls it with the configuration it evaluates from `antelope.config.ts`, so
|
|
253
|
+
* a frontend builds and starts without asking a backend. It reads nothing
|
|
254
|
+
* but its arguments: no runtime interface, no database, no network. A module
|
|
255
|
+
* that registers no frontend in this configuration returns `undefined`.
|
|
256
|
+
*/
|
|
257
|
+
export type FrontendModuleFunction<TConfig = unknown> = (config: TConfig, context: FrontendModuleContext) => FrontendModuleRegistration | undefined;
|
|
227
258
|
export interface FrontendModuleMetadata {
|
|
228
259
|
name: string;
|
|
229
260
|
sourcePath: string;
|
|
@@ -255,3 +286,16 @@ export interface FrontendModuleMetadata {
|
|
|
255
286
|
}
|
|
256
287
|
/** Returns registered frontend source metadata for server-side module discovery, excluding private options. */
|
|
257
288
|
export declare const GetFrontendModules: () => Promise<FrontendModuleMetadata[]>;
|
|
289
|
+
/**
|
|
290
|
+
* Fired whenever the list {@link GetFrontendModules} returns changes: a
|
|
291
|
+
* module registered its frontend (or replaced it with a higher priority), or
|
|
292
|
+
* a module was taken down with its frontend. Modules start in parallel, so a
|
|
293
|
+
* module that reads the list in its own `start()` may run before another
|
|
294
|
+
* registers: it registers a handler, reads the list once, and reads it again
|
|
295
|
+
* in the handler.
|
|
296
|
+
*
|
|
297
|
+
* @example
|
|
298
|
+
* FrontendModulesChanged.register(() => void refresh());
|
|
299
|
+
* await refresh(); // reads GetFrontendModules()
|
|
300
|
+
*/
|
|
301
|
+
export declare const FrontendModulesChanged: EventProxy<() => void>;
|
package/dist/page/controllers.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GetFrontendModules = exports.AddFrontendModule = exports.NotifyMenuChanged = exports.RegisterPageExtension = exports.RegisterPage = void 0;
|
|
3
|
+
exports.FrontendModulesChanged = exports.GetFrontendModules = exports.AddFrontendModule = exports.NotifyMenuChanged = exports.RegisterPageExtension = exports.RegisterPage = void 0;
|
|
4
4
|
exports.Category = Category;
|
|
5
5
|
exports.PageController = PageController;
|
|
6
6
|
exports.RootPageController = RootPageController;
|
|
@@ -260,4 +260,17 @@ function RootCategory(id, options) {
|
|
|
260
260
|
exports.AddFrontendModule = (0, interface_core_1.InterfaceFunction)();
|
|
261
261
|
/** Returns registered frontend source metadata for server-side module discovery, excluding private options. */
|
|
262
262
|
exports.GetFrontendModules = (0, interface_core_1.InterfaceFunction)();
|
|
263
|
+
/**
|
|
264
|
+
* Fired whenever the list {@link GetFrontendModules} returns changes: a
|
|
265
|
+
* module registered its frontend (or replaced it with a higher priority), or
|
|
266
|
+
* a module was taken down with its frontend. Modules start in parallel, so a
|
|
267
|
+
* module that reads the list in its own `start()` may run before another
|
|
268
|
+
* registers: it registers a handler, reads the list once, and reads it again
|
|
269
|
+
* in the handler.
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* FrontendModulesChanged.register(() => void refresh());
|
|
273
|
+
* await refresh(); // reads GetFrontendModules()
|
|
274
|
+
*/
|
|
275
|
+
exports.FrontendModulesChanged = new interface_core_1.EventProxy("dms.page.FrontendModulesChanged");
|
|
263
276
|
//# sourceMappingURL=controllers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controllers.js","sourceRoot":"","sources":["../../src/page/controllers.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"controllers.js","sourceRoot":"","sources":["../../src/page/controllers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import type { ComponentInfo, ComponentFilterContext, ComponentInfoSerialized } from "../../component";
|
|
2
|
+
import { type PageRecordStatus } from "./page-record";
|
|
2
3
|
/**
|
|
3
4
|
* The page layout (the frame around the components) as one caller may see it:
|
|
4
5
|
* the header buttons whose gate the caller fails are left out — a `permission`
|
|
5
6
|
* names an action of the page, relative to `pagePermissionId` — and those
|
|
6
7
|
* whose `availability` refuses the request are disabled with its reason, or
|
|
7
|
-
* left out when it hides them.
|
|
8
|
+
* left out when it hides them. The buttons acting on the page's record take
|
|
9
|
+
* its fields, or are left out without it (`context.record`, which
|
|
10
|
+
* `readPageRecord` read); the layout's `record` loader is not served.
|
|
8
11
|
* `loadPermissions` is only called when a button declares a permission. When
|
|
9
|
-
* one declares an `availability`, the layout
|
|
10
|
-
*
|
|
12
|
+
* one declares an `availability`, or the layout reads a record, the layout
|
|
13
|
+
* says which page query it was served for (`headerActionsQuery`,
|
|
14
|
+
* `headerActionsParams`), so the header asks again for another. A layout
|
|
15
|
+
* reading a record also says how it read it (`recordStatus`), so the page
|
|
16
|
+
* leaves a record deleted under it.
|
|
11
17
|
*
|
|
12
18
|
* @internal
|
|
13
19
|
*/
|
|
14
|
-
export declare function filterLayoutHeaderActions<T>(layout: ComponentInfo<T> | undefined, loadPermissions: () => Promise<Set<string>>, context: ComponentFilterContext, pagePermissionId: string | undefined): Promise<ComponentInfo<T> | undefined>;
|
|
20
|
+
export declare function filterLayoutHeaderActions<T>(layout: ComponentInfo<T> | undefined, loadPermissions: () => Promise<Set<string>>, context: ComponentFilterContext, pagePermissionId: string | undefined, recordStatus?: PageRecordStatus): Promise<ComponentInfo<T> | undefined>;
|
|
15
21
|
/**
|
|
16
22
|
* The layout with, after its own header buttons, those the components of the
|
|
17
23
|
* page place in the header (`placement: "header"`): served as the components
|
|
@@ -4,9 +4,13 @@ exports.filterLayoutHeaderActions = filterLayoutHeaderActions;
|
|
|
4
4
|
exports.withComponentHeaderButtons = withComponentHeaderButtons;
|
|
5
5
|
const button_availability_1 = require("../../base/internal/button-availability");
|
|
6
6
|
const component_target_1 = require("./component-target");
|
|
7
|
+
const page_record_1 = require("./page-record");
|
|
7
8
|
const permission_gate_1 = require("../../internal/permission-gate");
|
|
8
|
-
async function serveHeaderButton(
|
|
9
|
-
const
|
|
9
|
+
async function serveHeaderButton(declared, permissions, pagePermissionId, context, declaresRecord) {
|
|
10
|
+
const button = (0, page_record_1.withPageRecord)(declared, declaresRecord, context.record);
|
|
11
|
+
if (!button)
|
|
12
|
+
return undefined;
|
|
13
|
+
const { permission: _permission, permissionId: _permissionId, requiresRecord: _requiresRecord, availability, ...served } = button;
|
|
10
14
|
if ((0, permission_gate_1.isPermissionGated)(button) &&
|
|
11
15
|
!(await (0, permission_gate_1.holdsPermissionGate)(await permissions(), button, pagePermissionId))) {
|
|
12
16
|
return undefined;
|
|
@@ -18,28 +22,37 @@ async function serveHeaderButton(button, permissions, pagePermissionId, context)
|
|
|
18
22
|
* the header buttons whose gate the caller fails are left out — a `permission`
|
|
19
23
|
* names an action of the page, relative to `pagePermissionId` — and those
|
|
20
24
|
* whose `availability` refuses the request are disabled with its reason, or
|
|
21
|
-
* left out when it hides them.
|
|
25
|
+
* left out when it hides them. The buttons acting on the page's record take
|
|
26
|
+
* its fields, or are left out without it (`context.record`, which
|
|
27
|
+
* `readPageRecord` read); the layout's `record` loader is not served.
|
|
22
28
|
* `loadPermissions` is only called when a button declares a permission. When
|
|
23
|
-
* one declares an `availability`, the layout
|
|
24
|
-
*
|
|
29
|
+
* one declares an `availability`, or the layout reads a record, the layout
|
|
30
|
+
* says which page query it was served for (`headerActionsQuery`,
|
|
31
|
+
* `headerActionsParams`), so the header asks again for another. A layout
|
|
32
|
+
* reading a record also says how it read it (`recordStatus`), so the page
|
|
33
|
+
* leaves a record deleted under it.
|
|
25
34
|
*
|
|
26
35
|
* @internal
|
|
27
36
|
*/
|
|
28
|
-
async function filterLayoutHeaderActions(layout, loadPermissions, context, pagePermissionId) {
|
|
37
|
+
async function filterLayoutHeaderActions(layout, loadPermissions, context, pagePermissionId, recordStatus) {
|
|
29
38
|
const options = layout?.options;
|
|
30
|
-
|
|
31
|
-
if (!layout || !buttons)
|
|
39
|
+
if (!layout || !options)
|
|
32
40
|
return layout;
|
|
41
|
+
const { record: _record, headerActions: buttons = [], ...frame } = options;
|
|
42
|
+
const declaresRecord = recordStatus !== undefined;
|
|
33
43
|
let loaded;
|
|
34
44
|
const permissions = () => (loaded ??= loadPermissions());
|
|
35
|
-
const served = await Promise.all(buttons.map((button) => serveHeaderButton(button, permissions, pagePermissionId, context)));
|
|
36
|
-
const servedOptions = {
|
|
37
|
-
|
|
38
|
-
headerActions
|
|
39
|
-
}
|
|
40
|
-
if (buttons.some((button) => button.availability)) {
|
|
45
|
+
const served = await Promise.all(buttons.map((button) => serveHeaderButton(button, permissions, pagePermissionId, context, declaresRecord)));
|
|
46
|
+
const servedOptions = { ...frame };
|
|
47
|
+
if (options.headerActions) {
|
|
48
|
+
servedOptions.headerActions = served.filter((button) => button !== undefined);
|
|
49
|
+
}
|
|
50
|
+
if (declaresRecord || buttons.some((button) => button.availability)) {
|
|
41
51
|
servedOptions.headerActionsQuery = context.query ?? {};
|
|
52
|
+
servedOptions.headerActionsParams = context.params ?? {};
|
|
42
53
|
}
|
|
54
|
+
if (declaresRecord)
|
|
55
|
+
servedOptions.recordStatus = recordStatus;
|
|
43
56
|
return { ...layout, options: servedOptions };
|
|
44
57
|
}
|
|
45
58
|
const HEADER_PLACEMENT = "header";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-filter.js","sourceRoot":"","sources":["../../../src/page/internal/layout-filter.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"layout-filter.js","sourceRoot":"","sources":["../../../src/page/internal/layout-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,13 @@ export declare const RequestTenantIdProperty: () => import("@antelopejs/interfac
|
|
|
11
11
|
export declare function readRequestQuery(ctx: Pick<RequestContext, "url">): Record<string, string>;
|
|
12
12
|
/** @internal */
|
|
13
13
|
export declare const RequestQueryProperty: () => import("@antelopejs/interface-core/decorators").PropertyDecorator & import("@antelopejs/interface-core/decorators").ParameterDecorator;
|
|
14
|
+
/**
|
|
15
|
+
* The route parameters of the request (`:id` of a page's layout route), as a
|
|
16
|
+
* header button's `availability` reads them.
|
|
17
|
+
*
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
export declare const RequestRouteParametersProperty: () => import("@antelopejs/interface-core/decorators").PropertyDecorator & import("@antelopejs/interface-core/decorators").ParameterDecorator;
|
|
14
21
|
/** @internal */
|
|
15
22
|
export declare function isPageInsideModule(pageInfo: PageInfo): boolean;
|
|
16
23
|
/** @internal */
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
//
|
|
6
6
|
// Split out of metadata.ts.
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.RequestQueryProperty = exports.RequestTenantIdProperty = void 0;
|
|
8
|
+
exports.RequestRouteParametersProperty = exports.RequestQueryProperty = exports.RequestTenantIdProperty = void 0;
|
|
9
9
|
exports.readRequestQuery = readRequestQuery;
|
|
10
10
|
exports.isPageInsideModule = isPageInsideModule;
|
|
11
11
|
exports.logModuleRouteGated = logModuleRouteGated;
|
|
@@ -25,7 +25,7 @@ const request_tenant_1 = require("../../request-tenant");
|
|
|
25
25
|
const types_1 = require("../types");
|
|
26
26
|
/** @internal */
|
|
27
27
|
exports.RequestTenantIdProperty = (0, decorators_1.MakeParameterAndPropertyDecorator)((target, key, index) => {
|
|
28
|
-
(0, interface_api_1.SetParameterProvider)(target, key, index, (ctx) => (0, request_tenant_1.
|
|
28
|
+
(0, interface_api_1.SetParameterProvider)(target, key, index, (ctx) => (0, request_tenant_1.resolveRequestTenantId)(ctx));
|
|
29
29
|
});
|
|
30
30
|
/**
|
|
31
31
|
* The query of the request, one value per name (the last one given), as a
|
|
@@ -40,6 +40,17 @@ function readRequestQuery(ctx) {
|
|
|
40
40
|
exports.RequestQueryProperty = (0, decorators_1.MakeParameterAndPropertyDecorator)((target, key, index) => {
|
|
41
41
|
(0, interface_api_1.SetParameterProvider)(target, key, index, readRequestQuery);
|
|
42
42
|
});
|
|
43
|
+
/**
|
|
44
|
+
* The route parameters of the request (`:id` of a page's layout route), as a
|
|
45
|
+
* header button's `availability` reads them.
|
|
46
|
+
*
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
exports.RequestRouteParametersProperty = (0, decorators_1.MakeParameterAndPropertyDecorator)((target, key, index) => {
|
|
50
|
+
(0, interface_api_1.SetParameterProvider)(target, key, index, (ctx) => ({
|
|
51
|
+
...ctx.routeParameters,
|
|
52
|
+
}));
|
|
53
|
+
});
|
|
43
54
|
/** @internal */
|
|
44
55
|
function isPageInsideModule(pageInfo) {
|
|
45
56
|
return pageInfo.fullSlug.startsWith(`${types_1.MODULE_URL_PREFIX}/`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-helpers.js","sourceRoot":"","sources":["../../../src/page/internal/metadata-helpers.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,8EAA8E;AAC9E,eAAe;AACf,EAAE;AACF,4BAA4B;;;AAkC5B,4CAIC;
|
|
1
|
+
{"version":3,"file":"metadata-helpers.js","sourceRoot":"","sources":["../../../src/page/internal/metadata-helpers.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,8EAA8E;AAC9E,eAAe;AACf,EAAE;AACF,4BAA4B;;;AAkC5B,4CAIC;AAwBD,gDAEC;AAKD,kDAIC;AAvED,6DAGmC;AACnC,sEAA0F;AAC1F,gEAA6D;AAC7D,8EAA8E;AAC9E,2EAA2E;AAC3E,mEAAmE;AACnE,kBAAkB;AAClB,yDAA8D;AAC9D,iEAAiE;AACjE,6DAA6D;AAC7D,6DAA6D;AAC7D,6CAA6C;AAC7C,2CAA2C;AAC3C,oCAA4D;AAC5D,gBAAgB;AACH,QAAA,uBAAuB,GAAG,IAAA,8CAAiC,EACtE,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IACrB,IAAA,oCAAoB,EAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAmB,EAAE,EAAE,CAC/D,IAAA,uCAAsB,EAAC,GAAG,CAAC,CAC5B,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,gBAAgB,CAC9B,GAAgC;IAEhC,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,gBAAgB;AACH,QAAA,oBAAoB,GAAG,IAAA,8CAAiC,EACnE,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IACrB,IAAA,oCAAoB,EAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAC7D,CAAC,CACF,CAAC;AAEF;;;;;GAKG;AACU,QAAA,8BAA8B,GAAG,IAAA,8CAAiC,EAC7E,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IACrB,IAAA,oCAAoB,EAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAmB,EAAE,EAAE,CAAC,CAAC;QACjE,GAAG,GAAG,CAAC,eAAe;KACvB,CAAC,CAAC,CAAC;AACN,CAAC,CACF,CAAC;AAEF,gBAAgB;AAChB,SAAgB,kBAAkB,CAAC,QAAkB;IACnD,OAAO,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,yBAAiB,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE5C,gBAAgB;AAChB,SAAgB,mBAAmB,CAAC,QAAgB;IAClD,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC5C,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,iBAAO,CAAC,IAAI,CAAC,sBAAsB,QAAQ,uBAAuB,CAAC,CAAC;AACtE,CAAC"}
|