@antelopejs/dms 0.6.2 → 0.7.1
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 +30 -0
- package/dist/db/models/notification-feed-filter.d.ts +0 -1
- package/dist/db/models/notification-feed-filter.js +0 -4
- package/dist/db/models/notification-feed-filter.js.map +1 -1
- package/dist/db/models/signInAttempts.model.d.ts +18 -0
- package/dist/db/models/signInAttempts.model.js +83 -12
- package/dist/db/models/signInAttempts.model.js.map +1 -1
- package/dist/db/models/userEmailChanges.model.d.ts +8 -1
- package/dist/db/models/userEmailChanges.model.js +27 -2
- package/dist/db/models/userEmailChanges.model.js.map +1 -1
- package/dist/db/models/userNotificationPreferences.model.d.ts +0 -2
- package/dist/db/models/userNotificationPreferences.model.js +0 -13
- package/dist/db/models/userNotificationPreferences.model.js.map +1 -1
- package/dist/db/models/userNotifications.model.d.ts +5 -2
- package/dist/db/models/userNotifications.model.js +19 -2
- package/dist/db/models/userNotifications.model.js.map +1 -1
- package/dist/db/tables/signInAttempts.table.d.ts +2 -1
- package/dist/db/tables/signInAttempts.table.js +4 -0
- package/dist/db/tables/signInAttempts.table.js.map +1 -1
- package/dist/db/tables/userEmailChanges.table.d.ts +2 -1
- package/dist/db/tables/userEmailChanges.table.js +6 -1
- package/dist/db/tables/userEmailChanges.table.js.map +1 -1
- package/dist/db/tables/userNotificationPreferences.table.d.ts +0 -1
- package/dist/db/tables/userNotificationPreferences.table.js +0 -4
- package/dist/db/tables/userNotificationPreferences.table.js.map +1 -1
- package/dist/implementations/dms/nav-badges.d.ts +6 -4
- package/dist/implementations/dms/nav-badges.js +6 -5
- package/dist/implementations/dms/nav-badges.js.map +1 -1
- package/dist/implementations/dms/page.d.ts +1 -0
- package/dist/implementations/dms/page.js +46 -8
- package/dist/implementations/dms/page.js.map +1 -1
- package/dist/implementations/dms/permission-preview.d.ts +1 -1
- package/dist/implementations/dms/permission-preview.js +9 -4
- package/dist/implementations/dms/permission-preview.js.map +1 -1
- package/dist/implementations/dms-auth/index.d.ts +3 -2
- package/dist/implementations/dms-auth/index.js +39 -35
- package/dist/implementations/dms-auth/index.js.map +1 -1
- package/dist/implementations/dms-auth/token-session.d.ts +3 -0
- package/dist/implementations/dms-auth/token-session.js +22 -0
- package/dist/implementations/dms-auth/token-session.js.map +1 -0
- package/dist/implementations/dms-notifications/index.d.ts +0 -1
- package/dist/implementations/dms-notifications/index.js +0 -7
- package/dist/implementations/dms-notifications/index.js.map +1 -1
- package/dist/pages/settings/settings-index.js +3 -2
- package/dist/pages/settings/settings-index.js.map +1 -1
- package/dist/pages/settings/users/account-activity-feed.d.ts +1 -1
- package/dist/pages/settings/users/account-activity-feed.js +1 -1
- package/dist/pages/settings/users/account-activity-feed.js.map +1 -1
- package/dist/pages/settings/users/account-activity.d.ts +1 -1
- package/dist/pages/settings/users/account-activity.js +1 -1
- package/dist/pages/settings/users/account-activity.js.map +1 -1
- package/dist/pages/settings/users/account-credentials.d.ts +3 -0
- package/dist/pages/settings/users/account-credentials.js +2 -0
- package/dist/pages/settings/users/account-credentials.js.map +1 -1
- package/dist/pages/settings/users/current-password.d.ts +1 -1
- package/dist/pages/settings/users/current-password.js +23 -2
- package/dist/pages/settings/users/current-password.js.map +1 -1
- package/dist/pages/settings/users/email-change.d.ts +1 -1
- package/dist/pages/settings/users/email-change.js +33 -26
- package/dist/pages/settings/users/email-change.js.map +1 -1
- package/dist/pages/settings/users/invite-resend.js +0 -1
- package/dist/pages/settings/users/invite-resend.js.map +1 -1
- package/dist/pages/settings/users/invites.d.ts +1 -2
- package/dist/pages/settings/users/invites.js +21 -19
- package/dist/pages/settings/users/invites.js.map +1 -1
- package/dist/pages/settings/users/member-invite-batch.js +0 -1
- package/dist/pages/settings/users/member-invite-batch.js.map +1 -1
- package/dist/pages/settings/users/member-invite-form.js +10 -22
- package/dist/pages/settings/users/member-invite-form.js.map +1 -1
- package/dist/pages/settings/users/member-role-options.d.ts +6 -4
- package/dist/pages/settings/users/member-role-options.js +15 -4
- package/dist/pages/settings/users/member-role-options.js.map +1 -1
- package/dist/pages/settings/users/members.d.ts +2 -3
- package/dist/pages/settings/users/members.js +7 -12
- package/dist/pages/settings/users/members.js.map +1 -1
- package/dist/pages/settings/users/notifications.d.ts +1 -8
- package/dist/pages/settings/users/notifications.js +6 -38
- package/dist/pages/settings/users/notifications.js.map +1 -1
- package/dist/pages/settings/users/permission-tree-nodes.d.ts +1 -1
- package/dist/pages/settings/users/permission-tree-nodes.js +23 -9
- package/dist/pages/settings/users/permission-tree-nodes.js.map +1 -1
- package/dist/pages/settings/users/permission-warnings.d.ts +7 -0
- package/dist/pages/settings/users/permission-warnings.js +42 -0
- package/dist/pages/settings/users/permission-warnings.js.map +1 -0
- package/dist/pages/settings/users/profile-helpers.d.ts +1 -3
- package/dist/pages/settings/users/profile-helpers.js +0 -16
- package/dist/pages/settings/users/profile-helpers.js.map +1 -1
- package/dist/pages/settings/users/role-editor-store.js +6 -3
- package/dist/pages/settings/users/role-editor-store.js.map +1 -1
- package/dist/pages/settings/users/role-editor.d.ts +2 -1
- package/dist/pages/settings/users/role-editor.js +8 -4
- package/dist/pages/settings/users/role-editor.js.map +1 -1
- package/dist/pages/settings/users/role-preview.js +2 -1
- package/dist/pages/settings/users/role-preview.js.map +1 -1
- package/dist/pages/settings/users/roles.js +5 -1
- package/dist/pages/settings/users/roles.js.map +1 -1
- package/dist/pages/settings/users/security-attention.d.ts +4 -0
- package/dist/pages/settings/users/security-attention.js +23 -7
- package/dist/pages/settings/users/security-attention.js.map +1 -1
- package/dist/pages/settings/users/security.d.ts +2 -1
- package/dist/pages/settings/users/security.js +13 -2
- package/dist/pages/settings/users/security.js.map +1 -1
- package/dist/pages/settings/users/two-factor-operations.d.ts +2 -1
- package/dist/pages/settings/users/two-factor-operations.js +28 -29
- package/dist/pages/settings/users/two-factor-operations.js.map +1 -1
- package/dist/routes/auth/forgot-password.js +3 -0
- package/dist/routes/auth/forgot-password.js.map +1 -1
- package/dist/routes/auth/index.d.ts +1 -0
- package/dist/routes/auth/index.js +1 -0
- package/dist/routes/auth/index.js.map +1 -1
- package/dist/routes/auth/invite.js +28 -4
- package/dist/routes/auth/invite.js.map +1 -1
- package/dist/routes/auth/login-throttle.d.ts +2 -0
- package/dist/routes/auth/login-throttle.js +5 -4
- package/dist/routes/auth/login-throttle.js.map +1 -1
- package/dist/routes/auth/request-2fa-email.js +6 -18
- package/dist/routes/auth/request-2fa-email.js.map +1 -1
- package/dist/routes/auth/reset-code.d.ts +3 -0
- package/dist/routes/auth/reset-code.js +37 -0
- package/dist/routes/auth/reset-code.js.map +1 -0
- package/dist/routes/auth/reset-password.d.ts +2 -2
- package/dist/routes/auth/reset-password.js +5 -10
- package/dist/routes/auth/reset-password.js.map +1 -1
- package/dist/routes/auth/signup.js +10 -32
- package/dist/routes/auth/signup.js.map +1 -1
- package/dist/routes/auth/two-factor-throttle.d.ts +5 -0
- package/dist/routes/auth/two-factor-throttle.js +81 -0
- package/dist/routes/auth/two-factor-throttle.js.map +1 -0
- package/dist/routes/auth/validate-forgot-password-token.js +2 -8
- package/dist/routes/auth/validate-forgot-password-token.js.map +1 -1
- package/dist/routes/auth/validate-invite-token.d.ts +1 -0
- package/dist/routes/auth/validate-invite-token.js +11 -0
- package/dist/routes/auth/validate-invite-token.js.map +1 -0
- package/dist/routes/auth/verify-2fa.js +10 -13
- package/dist/routes/auth/verify-2fa.js.map +1 -1
- package/dist/routes/auth.d.ts +1 -0
- package/dist/routes/auth.js +11 -1
- package/dist/routes/auth.js.map +1 -1
- package/dist/test/helpers/auth.d.ts +0 -1
- package/dist/test/helpers/auth.js +0 -1
- package/dist/test/helpers/auth.js.map +1 -1
- package/dist/test/helpers/emails.d.ts +10 -0
- package/dist/test/helpers/emails.js +36 -0
- package/dist/test/helpers/emails.js.map +1 -0
- package/dist/test/helpers/fixtures.d.ts +0 -1
- package/dist/test/helpers/fixtures.js +1 -2
- package/dist/test/helpers/fixtures.js.map +1 -1
- package/dist/test/helpers/page-access.d.ts +1 -0
- package/dist/test/helpers/page-access.js +6 -1
- package/dist/test/helpers/page-access.js.map +1 -1
- package/dist/test/integration/auth/current-password.test.d.ts +1 -0
- package/dist/test/integration/auth/current-password.test.js +65 -0
- package/dist/test/integration/auth/current-password.test.js.map +1 -0
- package/dist/test/integration/auth/password-reset.test.d.ts +1 -0
- package/dist/test/integration/auth/password-reset.test.js +126 -0
- package/dist/test/integration/auth/password-reset.test.js.map +1 -0
- package/dist/test/integration/auth/session-revocation.test.d.ts +1 -0
- package/dist/test/integration/auth/session-revocation.test.js +45 -0
- package/dist/test/integration/auth/session-revocation.test.js.map +1 -0
- package/dist/test/integration/auth/two-factor-codes.test.d.ts +1 -0
- package/dist/test/integration/auth/two-factor-codes.test.js +335 -0
- package/dist/test/integration/auth/two-factor-codes.test.js.map +1 -0
- package/dist/test/integration/auth/two-factor-password.test.js +5 -1
- package/dist/test/integration/auth/two-factor-password.test.js.map +1 -1
- package/dist/test/integration/auth/two-factor-token.test.d.ts +1 -0
- package/dist/test/integration/auth/two-factor-token.test.js +92 -0
- package/dist/test/integration/auth/two-factor-token.test.js.map +1 -0
- package/dist/test/integration/email-change.test.js +36 -0
- package/dist/test/integration/email-change.test.js.map +1 -1
- package/dist/test/integration/invite-extension-edit.test.js +0 -1
- package/dist/test/integration/invite-extension-edit.test.js.map +1 -1
- package/dist/test/integration/invite-link-status.test.d.ts +1 -0
- package/dist/test/integration/invite-link-status.test.js +110 -0
- package/dist/test/integration/invite-link-status.test.js.map +1 -0
- package/dist/test/integration/invite-resolution.test.js +0 -3
- package/dist/test/integration/invite-resolution.test.js.map +1 -1
- package/dist/test/integration/member-settings-access.test.js +17 -0
- package/dist/test/integration/member-settings-access.test.js.map +1 -1
- package/dist/test/integration/notification-unread-badge.test.d.ts +1 -0
- package/dist/test/integration/notification-unread-badge.test.js +92 -0
- package/dist/test/integration/notification-unread-badge.test.js.map +1 -0
- package/dist/test/integration/permission-warnings.test.d.ts +1 -0
- package/dist/test/integration/permission-warnings.test.js +71 -0
- package/dist/test/integration/permission-warnings.test.js.map +1 -0
- package/dist/test/integration/removed-member-notifications.test.d.ts +1 -0
- package/dist/test/integration/removed-member-notifications.test.js +80 -0
- package/dist/test/integration/removed-member-notifications.test.js.map +1 -0
- package/dist/test/integration/role-permission-ancestors.test.d.ts +1 -0
- package/dist/test/integration/role-permission-ancestors.test.js +146 -0
- package/dist/test/integration/role-permission-ancestors.test.js.map +1 -0
- package/dist/test/integration/tenant-lifecycle.test.js +0 -4
- package/dist/test/integration/tenant-lifecycle.test.js.map +1 -1
- package/dist/test/unit/auth-session-revocation.test.d.ts +1 -0
- package/dist/test/unit/auth-session-revocation.test.js +105 -0
- package/dist/test/unit/auth-session-revocation.test.js.map +1 -0
- package/dist/test/unit/db/email-normalization.test.js +0 -1
- package/dist/test/unit/db/email-normalization.test.js.map +1 -1
- package/dist/test/unit/db/notification-feed-filter.test.js +0 -16
- package/dist/test/unit/db/notification-feed-filter.test.js.map +1 -1
- package/dist/test/unit/db/notification-inbox.test.js +63 -13
- package/dist/test/unit/db/notification-inbox.test.js.map +1 -1
- package/dist/test/unit/db/notification-preferences.test.js +0 -17
- package/dist/test/unit/db/notification-preferences.test.js.map +1 -1
- package/dist/test/unit/implementations/dms/empty-menu-group.test.d.ts +1 -0
- package/dist/test/unit/implementations/dms/empty-menu-group.test.js +133 -0
- package/dist/test/unit/implementations/dms/empty-menu-group.test.js.map +1 -0
- package/dist/test/unit/implementations/dms/layout-banners.test.js +2 -1
- package/dist/test/unit/implementations/dms/layout-banners.test.js.map +1 -1
- package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.d.ts +1 -0
- package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.js +149 -0
- package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.js.map +1 -0
- package/dist/test/unit/implementations/dms/nav-badges.test.js +55 -4
- package/dist/test/unit/implementations/dms/nav-badges.test.js.map +1 -1
- package/dist/test/unit/implementations/dms/page-all-components-hidden.test.d.ts +1 -0
- package/dist/test/unit/implementations/dms/page-all-components-hidden.test.js +118 -0
- package/dist/test/unit/implementations/dms/page-all-components-hidden.test.js.map +1 -0
- package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.js +16 -0
- package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.js.map +1 -1
- package/dist/test/unit/implementations/dms/permission-preview-cost.test.js +5 -3
- package/dist/test/unit/implementations/dms/permission-preview-cost.test.js.map +1 -1
- package/dist/test/unit/implementations/dms/permission-preview-menu.test.js +29 -3
- package/dist/test/unit/implementations/dms/permission-preview-menu.test.js.map +1 -1
- package/dist/test/unit/implementations/dms/quick-actions-button.test.js +4 -2
- package/dist/test/unit/implementations/dms/quick-actions-button.test.js.map +1 -1
- package/dist/test/unit/implementations/dms/user-permissions-gate.test.js +2 -1
- package/dist/test/unit/implementations/dms/user-permissions-gate.test.js.map +1 -1
- package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js +2 -1
- package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms/component-children-permissions.test.js +7 -2
- package/dist/test/unit/interfaces/dms/component-children-permissions.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms/form-watch-permissions.test.d.ts +1 -0
- package/dist/test/unit/interfaces/dms/form-watch-permissions.test.js +133 -0
- package/dist/test/unit/interfaces/dms/form-watch-permissions.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.d.ts +1 -0
- package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.js +149 -0
- package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms/invite-extension.test.js +13 -0
- package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms/member-access.test.js +27 -1
- package/dist/test/unit/interfaces/dms/member-access.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms/nav-badge-tones.test.d.ts +1 -0
- package/dist/test/unit/interfaces/dms/nav-badge-tones.test.js +31 -0
- package/dist/test/unit/interfaces/dms/nav-badge-tones.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms/page-extension.test.js +4 -1
- package/dist/test/unit/interfaces/dms/page-extension.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms/permission-requirements.test.d.ts +1 -0
- package/dist/test/unit/interfaces/dms/permission-requirements.test.js +144 -0
- package/dist/test/unit/interfaces/dms/permission-requirements.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js +6 -2
- package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.js +1 -1
- package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.js +2 -1
- package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.js +2 -1
- package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.js +2 -1
- package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.js.map +1 -1
- package/dist/test/unit/pages/settings/account-activity-feed.test.js +2 -2
- package/dist/test/unit/pages/settings/account-activity-feed.test.js.map +1 -1
- package/dist/test/unit/pages/settings/account-activity.test.js +11 -2
- package/dist/test/unit/pages/settings/account-activity.test.js.map +1 -1
- package/dist/test/unit/pages/settings/invite-email-delivery.test.js +0 -1
- package/dist/test/unit/pages/settings/invite-email-delivery.test.js.map +1 -1
- package/dist/test/unit/pages/settings/invite-email-validation-option.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/invite-email-validation-option.test.js +33 -0
- package/dist/test/unit/pages/settings/invite-email-validation-option.test.js.map +1 -0
- package/dist/test/unit/pages/settings/member-lists-page-size.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/member-lists-page-size.test.js +22 -0
- package/dist/test/unit/pages/settings/member-lists-page-size.test.js.map +1 -0
- package/dist/test/unit/pages/settings/member-table-widths.test.js +2 -2
- package/dist/test/unit/pages/settings/member-table-widths.test.js.map +1 -1
- package/dist/test/unit/pages/settings/members-page.test.js +7 -10
- package/dist/test/unit/pages/settings/members-page.test.js.map +1 -1
- package/dist/test/unit/pages/settings/notifications-access-gate.test.js +3 -10
- package/dist/test/unit/pages/settings/notifications-access-gate.test.js.map +1 -1
- package/dist/test/unit/pages/settings/permission-tree-nodes.test.js +57 -0
- package/dist/test/unit/pages/settings/permission-tree-nodes.test.js.map +1 -1
- package/dist/test/unit/pages/settings/permission-warnings.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/permission-warnings.test.js +49 -0
- package/dist/test/unit/pages/settings/permission-warnings.test.js.map +1 -0
- package/dist/test/unit/pages/settings/role-editor.test.js +16 -0
- package/dist/test/unit/pages/settings/role-editor.test.js.map +1 -1
- package/dist/test/unit/pages/settings/role-preview.test.js +7 -0
- package/dist/test/unit/pages/settings/role-preview.test.js.map +1 -1
- package/dist/test/unit/pages/settings/security-attention.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/security-attention.test.js +74 -0
- package/dist/test/unit/pages/settings/security-attention.test.js.map +1 -0
- package/dist/test/unit/sanitize-user.test.d.ts +1 -0
- package/dist/test/unit/sanitize-user.test.js +21 -0
- package/dist/test/unit/sanitize-user.test.js.map +1 -0
- package/dist/test/unit/signup-email-validation.test.d.ts +1 -0
- package/dist/test/unit/signup-email-validation.test.js +79 -0
- package/dist/test/unit/signup-email-validation.test.js.map +1 -0
- package/dist/test/unit/validation/member-invite.schema.test.js +14 -52
- package/dist/test/unit/validation/member-invite.schema.test.js.map +1 -1
- package/dist/utils/account-notifications.d.ts +5 -0
- package/dist/utils/account-notifications.js +8 -0
- package/dist/utils/account-notifications.js.map +1 -1
- package/dist/utils/notification-emitter.d.ts +1 -1
- package/dist/utils/notification-emitter.js +1 -1
- package/dist/utils/notification-emitter.js.map +1 -1
- package/dist/utils/notification-tones.d.ts +2 -1
- package/dist/utils/notification-tones.js +5 -1
- package/dist/utils/notification-tones.js.map +1 -1
- package/dist/utils/one-time-code.d.ts +3 -0
- package/dist/utils/one-time-code.js +21 -0
- package/dist/utils/one-time-code.js.map +1 -0
- package/dist/utils/sign-in-monitor.d.ts +1 -0
- package/dist/utils/sign-in-monitor.js +3 -2
- package/dist/utils/sign-in-monitor.js.map +1 -1
- package/dist/utils/two-factor-codes.d.ts +10 -0
- package/dist/utils/two-factor-codes.js +76 -0
- package/dist/utils/two-factor-codes.js.map +1 -0
- package/dist/validation/auth.schema.d.ts +17 -0
- package/dist/validation/auth.schema.js +17 -6
- package/dist/validation/auth.schema.js.map +1 -1
- package/dist/validation/issue-message.d.ts +1 -0
- package/dist/validation/issue-message.js +9 -0
- package/dist/validation/issue-message.js.map +1 -0
- package/dist/validation/member-invite.schema.d.ts +1 -25
- package/dist/validation/member-invite.schema.js +2 -23
- package/dist/validation/member-invite.schema.js.map +1 -1
- package/frontend-vue/dms.frontend.ts +2 -0
- package/frontend-vue/layers/dms-auth/app/custom-pages/auth/forgot-validation.vue +3 -0
- package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +105 -5
- package/frontend-vue/layers/dms-auth/i18n/locales/auth-en-GB.json +20 -4
- package/frontend-vue/layers/dms-auth/i18n/locales/auth-fr-FR.json +20 -4
- package/frontend-vue/layers/dms-core/app/composables/useFieldErrors.ts +3 -2
- package/frontend-vue/layers/dms-core/app/types/menu.ts +15 -0
- package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +4 -1
- package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +4 -1
- package/frontend-vue/layers/dms-layout/app/assets/css/main.css +20 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/CommandPaletteAssistantAnswer.vue +75 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardFrame.vue +22 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +24 -10
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidePanel.vue +139 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/Footer.vue +4 -2
- package/frontend-vue/layers/dms-layout/app/build/components/layout/GithubStarPrompt.vue +90 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/SidePanelHost.vue +17 -0
- package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +25 -43
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/members/MemberRolePicker.vue +24 -2
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationMatrixCategory.vue +70 -25
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationPreferencesForm.vue +25 -10
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/notificationDisplay.ts +41 -5
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfilePreferencesSummary.vue +2 -1
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfileSecuritySummary.vue +20 -4
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RoleEditor.vue +21 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionArea.vue +16 -2
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionBranch.vue +1 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionLeaf.vue +13 -1
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionTree.vue +9 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionWarning.vue +46 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-permissions.ts +108 -29
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-types.ts +2 -0
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityDialogFrame.vue +6 -6
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityEmail.vue +7 -1
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecuritySessions.vue +5 -4
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityStatus.vue +4 -3
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityTwoFactor.vue +54 -18
- package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/shell/SettingsNav.vue +13 -8
- package/frontend-vue/layers/dms-layout/app/build/composables/command-palette/assistantGroups.ts +143 -0
- package/frontend-vue/layers/dms-layout/app/build/composables/command-palette/useCommandPaletteAssistantMode.ts +249 -0
- package/frontend-vue/layers/dms-layout/app/build/composables/general/useGithubStarPrompt.ts +178 -0
- package/frontend-vue/layers/dms-layout/app/build/composables/layout/sidePanelState.ts +191 -0
- package/frontend-vue/layers/dms-layout/app/build/composables/layout/useHeaderActionControls.ts +51 -0
- package/frontend-vue/layers/dms-layout/app/build/composables/layout/useSidePanelWidth.ts +113 -0
- package/frontend-vue/layers/dms-layout/app/build/composables/navigation/useCategoryNavCards.ts +17 -10
- package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationGroupsOpen.ts +45 -0
- package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useProfilePreferences.ts +8 -1
- package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useSecurityOverview.ts +50 -3
- package/frontend-vue/layers/dms-layout/app/build/composables/settings/useSettingsNavigation.ts +3 -0
- package/frontend-vue/layers/dms-layout/app/build/utils/categoryPages.ts +1 -2
- package/frontend-vue/layers/dms-layout/app/build/utils/github-repository.ts +5 -0
- package/frontend-vue/layers/dms-layout/app/components/layout/DashboardSearch.vue +109 -7
- package/frontend-vue/layers/dms-layout/app/components/navigation/NavigationMenu.vue +19 -9
- package/frontend-vue/layers/dms-layout/app/composables/notification/useNotifications.ts +22 -40
- package/frontend-vue/layers/dms-layout/app/composables/useAppSidePanels.ts +96 -0
- package/frontend-vue/layers/dms-layout/app/composables/useCommandPaletteAssistant.ts +129 -0
- package/frontend-vue/layers/dms-layout/app/composables/useHeaderActions.ts +33 -11
- package/frontend-vue/layers/dms-layout/app/composables/useSidePanel.ts +41 -0
- package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +15 -0
- package/frontend-vue/layers/dms-layout/app/plugins/notification-stream.client.ts +1 -7
- package/frontend-vue/layers/dms-layout/app/plugins/side-panel-host.ts +13 -0
- package/frontend-vue/layers/dms-layout/app/types/page.ts +4 -0
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +43 -13
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +43 -13
- package/frontend-vue/layers/dms-ui/app/build/components/form/FormLoadError.vue +45 -0
- package/frontend-vue/layers/dms-ui/app/build/components/modal/ModalEscHint.vue +28 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/floatingSaveBars.ts +38 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/form/formRecordLoad.ts +66 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/navigation/useNavBadges.ts +50 -9
- package/frontend-vue/layers/dms-ui/app/build/composables/table/useTable.ts +7 -1
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/chrome.ts +2 -2
- package/frontend-vue/layers/dms-ui/app/build/types/tree.ts +14 -10
- package/frontend-vue/layers/dms-ui/app/build/utils/navBadge.ts +12 -0
- package/frontend-vue/layers/dms-ui/app/build/utils/tone.ts +22 -0
- package/frontend-vue/layers/dms-ui/app/components/activity-feed/ActivityFeed.vue +117 -82
- package/frontend-vue/layers/dms-ui/app/components/blocks/NavCardGridBlock.vue +12 -1
- package/frontend-vue/layers/dms-ui/app/components/card/NavCard.vue +16 -1
- package/frontend-vue/layers/dms-ui/app/components/confirm/ConfirmModal.vue +7 -8
- package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +28 -6
- package/frontend-vue/layers/dms-ui/app/components/form/components/Display.vue +5 -1
- package/frontend-vue/layers/dms-ui/app/components/save-bar/SaveBar.vue +4 -0
- package/frontend-vue/layers/dms-ui/app/components/status-pill/StatusPill.vue +7 -2
- package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +7 -2
- package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +48 -34
- package/frontend-vue/layers/dms-ui/app/composables/table-view/types/config.ts +13 -3
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +16 -14
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +16 -14
- package/frontend-vue/package.json +2 -2
- package/frontend-vue/pnpm-lock.yaml +5 -5
- package/frontend-vue/tests/activity-feed-fill-height.test.ts +107 -0
- package/frontend-vue/tests/category-nav-cards.test.ts +21 -13
- package/frontend-vue/tests/command-palette-assistant.test.ts +344 -0
- package/frontend-vue/tests/fixtures/dashboard-search-stub.ts +91 -0
- package/frontend-vue/tests/forgot-validation-resend.test.ts +234 -0
- package/frontend-vue/tests/form-display-options.test.ts +64 -0
- package/frontend-vue/tests/form-load-error.test.ts +160 -0
- package/frontend-vue/tests/form-saved-before-success.test.ts +110 -0
- package/frontend-vue/tests/github-star-prompt.test.ts +328 -0
- package/frontend-vue/tests/header-actions.test.ts +191 -0
- package/frontend-vue/tests/invites-edit-modal.test.ts +157 -0
- package/frontend-vue/tests/member-role-picker.test.ts +26 -0
- package/frontend-vue/tests/menu-hidden-page.test.ts +93 -0
- package/frontend-vue/tests/nav-badge-tones.test.ts +274 -0
- package/frontend-vue/tests/nav-card-badge.test.ts +69 -0
- package/frontend-vue/tests/nav-card-grid-empty-category.test.ts +163 -0
- package/frontend-vue/tests/notification-popover-errors.test.ts +71 -37
- package/frontend-vue/tests/notification-preferences-groups.test.ts +268 -0
- package/frontend-vue/tests/notification-tone-contract.test.ts +70 -0
- package/frontend-vue/tests/page-fill-height.test.ts +9 -1
- package/frontend-vue/tests/page-no-visible-blocks.test.ts +202 -0
- package/frontend-vue/tests/profile-preferences-summary.test.ts +26 -2
- package/frontend-vue/tests/profile-security-summary.test.ts +121 -0
- package/frontend-vue/tests/role-permission-tree.test.ts +102 -8
- package/frontend-vue/tests/role-permissions.test.ts +178 -56
- package/frontend-vue/tests/side-panels.test.ts +470 -0
- package/frontend-vue/tests/signup-invitation-link.test.ts +71 -2
- package/frontend-vue/tests/table-actions-column-width.test.ts +51 -1
- package/frontend-vue/tests/table-view-chrome.test.ts +2 -2
- package/frontend-vue/tests/vue-inventory.test.ts +1 -1
- package/package.json +2 -2
- package/skills/dms/REFERENCE.md +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { FormSubmitEvent } from "@nuxt/ui";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { unref } from "vue";
|
|
3
|
+
import { onMounted, unref } from "vue";
|
|
4
4
|
import type { FormProps, FormFetchResponse, FormSubmitResponse } from "./types";
|
|
5
5
|
import { jsonSchemaToZod } from "json-schema-to-zod";
|
|
6
6
|
import { FormEvents } from "./types/events";
|
|
@@ -62,8 +62,8 @@ export interface UseFormOptions {
|
|
|
62
62
|
showFieldErrors?: (errors: FormServerFieldError[]) => boolean;
|
|
63
63
|
/**
|
|
64
64
|
* Called once a submit succeeded and the values are the saved ones (or
|
|
65
|
-
* back to the opening ones for an `action` form), before
|
|
66
|
-
* the form has nothing unsaved from there on.
|
|
65
|
+
* back to the opening ones for an `action` form), before the success event
|
|
66
|
+
* goes out and any redirect: the form has nothing unsaved from there on.
|
|
67
67
|
*/
|
|
68
68
|
onSaved?: () => void;
|
|
69
69
|
}
|
|
@@ -458,32 +458,35 @@ function watchFieldChanges(
|
|
|
458
458
|
) => void,
|
|
459
459
|
): void {
|
|
460
460
|
if (!componentId) return;
|
|
461
|
+
const id = componentId;
|
|
461
462
|
const previousValuesJson: Record<string, string> = {};
|
|
462
463
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
value: newState[fieldId],
|
|
479
|
-
formValues: newState,
|
|
480
|
-
});
|
|
481
|
-
previousValuesJson[fieldId] = newJson;
|
|
482
|
-
}
|
|
464
|
+
// From mount, once `useWatch` listens: the values the form starts from
|
|
465
|
+
// (defaults, loaded row) reach the watch rules too, not only later edits.
|
|
466
|
+
onMounted(() => {
|
|
467
|
+
watch(() => state.value, sendChanges, { deep: true, immediate: true });
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
function sendChanges(newState: Record<string, unknown>): void {
|
|
471
|
+
for (const fieldId of Object.keys(newState)) {
|
|
472
|
+
if (INTERNAL_STATE_KEYS.has(fieldId)) continue;
|
|
473
|
+
|
|
474
|
+
let newJson: string;
|
|
475
|
+
try {
|
|
476
|
+
newJson = JSON.stringify(newState[fieldId]);
|
|
477
|
+
} catch {
|
|
478
|
+
newJson = String(newState[fieldId]);
|
|
483
479
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
480
|
+
if (newJson !== previousValuesJson[fieldId]) {
|
|
481
|
+
sendComponentEvent(FormEvents.FIELD_CHANGE, id, {
|
|
482
|
+
fieldId,
|
|
483
|
+
value: newState[fieldId],
|
|
484
|
+
formValues: newState,
|
|
485
|
+
});
|
|
486
|
+
previousValuesJson[fieldId] = newJson;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
487
490
|
}
|
|
488
491
|
|
|
489
492
|
/**
|
|
@@ -748,6 +751,16 @@ export const useForm = (props: FormProps, options: UseFormOptions = {}) => {
|
|
|
748
751
|
);
|
|
749
752
|
};
|
|
750
753
|
|
|
754
|
+
/** A submit the server accepted: nothing is left unsaved. */
|
|
755
|
+
const markSubmitSaved = (): void => {
|
|
756
|
+
submitSucceeded.value = true;
|
|
757
|
+
// A form sending something new each time starts over from the values it
|
|
758
|
+
// opened with; any other keeps what it saved as its new starting point.
|
|
759
|
+
if (props.kind === "action") restoreInitialValues();
|
|
760
|
+
else initialValues.value = snapshotFormState(state.value);
|
|
761
|
+
options.onSaved?.();
|
|
762
|
+
};
|
|
763
|
+
|
|
751
764
|
const handleSubmitSuccess = async (
|
|
752
765
|
response: FormSubmitResponse | undefined,
|
|
753
766
|
plainData: FormData,
|
|
@@ -755,11 +768,6 @@ export const useForm = (props: FormProps, options: UseFormOptions = {}) => {
|
|
|
755
768
|
showSubmitSuccessToast(response);
|
|
756
769
|
showSubmitNotice(response);
|
|
757
770
|
props.onSuccessCallback?.(response, plainData);
|
|
758
|
-
// A form sending something new each time starts over from the values it
|
|
759
|
-
// opened with; any other keeps what it saved as its new starting point.
|
|
760
|
-
if (props.kind === "action") restoreInitialValues();
|
|
761
|
-
else initialValues.value = snapshotFormState(state.value);
|
|
762
|
-
options.onSaved?.();
|
|
763
771
|
if (props.redirectOnSuccess) {
|
|
764
772
|
const target = replaceUrlVariables(
|
|
765
773
|
props.redirectOnSuccess,
|
|
@@ -777,10 +785,16 @@ export const useForm = (props: FormProps, options: UseFormOptions = {}) => {
|
|
|
777
785
|
});
|
|
778
786
|
};
|
|
779
787
|
|
|
780
|
-
/**
|
|
788
|
+
/**
|
|
789
|
+
* Sends a body to the submit URL, through the form's submit events.
|
|
790
|
+
* `onAccepted` runs once the server took it, before the success event goes
|
|
791
|
+
* out: what watches that event (a form page's way back to its list) finds
|
|
792
|
+
* the form with nothing unsaved, and leaves it without asking.
|
|
793
|
+
*/
|
|
781
794
|
const sendSubmit = async (
|
|
782
795
|
submitUrl: string,
|
|
783
796
|
body: FormData,
|
|
797
|
+
onAccepted?: () => void,
|
|
784
798
|
): Promise<FormSubmitResponse | undefined> => {
|
|
785
799
|
let submitResponse: FormSubmitResponse | undefined;
|
|
786
800
|
await executeSubmit(
|
|
@@ -791,6 +805,7 @@ export const useForm = (props: FormProps, options: UseFormOptions = {}) => {
|
|
|
791
805
|
headers: { [CONTENT_LANGUAGE_HEADER]: "*" },
|
|
792
806
|
}).then((res) => {
|
|
793
807
|
submitResponse = res;
|
|
808
|
+
onAccepted?.();
|
|
794
809
|
return res;
|
|
795
810
|
}),
|
|
796
811
|
{
|
|
@@ -831,8 +846,7 @@ export const useForm = (props: FormProps, options: UseFormOptions = {}) => {
|
|
|
831
846
|
|
|
832
847
|
loading.value = true;
|
|
833
848
|
try {
|
|
834
|
-
const response = await sendSubmit(target.url, plainData);
|
|
835
|
-
submitSucceeded.value = true;
|
|
849
|
+
const response = await sendSubmit(target.url, plainData, markSubmitSaved);
|
|
836
850
|
await handleSubmitSuccess(response, plainData);
|
|
837
851
|
} catch (error) {
|
|
838
852
|
reportSubmitError(error);
|
|
@@ -7,6 +7,7 @@ import type { TableViewDisplayCapabilities } from "./display";
|
|
|
7
7
|
import type { CustomButton } from "./custom-button";
|
|
8
8
|
import type { FormProps } from "../../form/types";
|
|
9
9
|
import type { TableProps, TableFilter } from "../../../types/table";
|
|
10
|
+
import type { Tone } from "../../../types/tone";
|
|
10
11
|
import type { BlockAction } from "../../../build/components/blocks/BlockActions.vue";
|
|
11
12
|
|
|
12
13
|
export interface QueryParamFilter {
|
|
@@ -37,13 +38,22 @@ export interface TableViewTab {
|
|
|
37
38
|
toPage?: string;
|
|
38
39
|
/** Data API location whose row total a link tab shows. */
|
|
39
40
|
countFrom?: string;
|
|
40
|
-
/**
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Keeps the nav badge of the page it stands for up to date; `{ tone }`
|
|
43
|
+
* draws it in that tone.
|
|
44
|
+
*/
|
|
45
|
+
navBadge?: boolean | TableViewTabNavBadge;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** A tab's nav badge drawn in a tone (interface-dms `TableViewTabNavBadge`). */
|
|
49
|
+
export interface TableViewTabNavBadge {
|
|
50
|
+
tone?: Tone;
|
|
42
51
|
}
|
|
43
52
|
|
|
44
53
|
/**
|
|
45
54
|
* How much a table draws around its rows (backend `layout`): the full
|
|
46
|
-
* dashboard grid, or the compact list of a settings page
|
|
55
|
+
* dashboard grid, or the compact list of a settings page (no caption,
|
|
56
|
+
* refresh, ⋯ menu nor column menus; the footer keeps the page size picker).
|
|
47
57
|
*/
|
|
48
58
|
export type TableViewLayout = "full" | "compact";
|
|
49
59
|
|
|
@@ -276,6 +276,13 @@
|
|
|
276
276
|
"unsaved_changes": "Unsaved changes",
|
|
277
277
|
"fetch_error_title": "Failed to fetch data",
|
|
278
278
|
"fetch_error_unknown": "An unexpected error occurred. Please try again later.",
|
|
279
|
+
"load_error": {
|
|
280
|
+
"error_title": "Couldn't load this entry",
|
|
281
|
+
"error_description": "Check your connection, then try again. Nothing can be saved until the entry loads.",
|
|
282
|
+
"forbidden_title": "You can't view this entry",
|
|
283
|
+
"forbidden_description": "Your role doesn't let you view this entry, so the form can't open on its current values. Ask an administrator for access.",
|
|
284
|
+
"retry": "Try again"
|
|
285
|
+
},
|
|
279
286
|
"select_date": "Select date",
|
|
280
287
|
"relation": {
|
|
281
288
|
"selected_count": "{count} selected",
|
|
@@ -489,11 +496,7 @@
|
|
|
489
496
|
"notifications": {
|
|
490
497
|
"categories": {
|
|
491
498
|
"system": "System",
|
|
492
|
-
"system_desc": "Core system notifications and security alerts"
|
|
493
|
-
"module_one": "Security",
|
|
494
|
-
"module_one_desc": "Security monitoring and threat detection",
|
|
495
|
-
"module_two": "Logistics",
|
|
496
|
-
"module_two_desc": "Shipping, inventory and supply chain updates"
|
|
499
|
+
"system_desc": "Core system notifications and security alerts"
|
|
497
500
|
},
|
|
498
501
|
"subjects": {
|
|
499
502
|
"general": "General",
|
|
@@ -508,12 +511,6 @@
|
|
|
508
511
|
"automation_desc": "Notifications sent by automation procedures",
|
|
509
512
|
"updates": "Module updates",
|
|
510
513
|
"updates_desc": "Available updates for the project's Antelope modules (development mode)",
|
|
511
|
-
"module_one_alerts": "Security alerts",
|
|
512
|
-
"module_one_alerts_desc": "Critical security events requiring immediate attention",
|
|
513
|
-
"module_one_updates": "Threat reports",
|
|
514
|
-
"module_one_updates_desc": "Updates on security threats and vulnerabilities",
|
|
515
|
-
"module_two_notifications": "Shipment updates",
|
|
516
|
-
"module_two_notifications_desc": "Updates on shipping and inventory",
|
|
517
514
|
"updates_badge": "Developer mode"
|
|
518
515
|
},
|
|
519
516
|
"preferences": {
|
|
@@ -544,8 +541,8 @@
|
|
|
544
541
|
"description": "You can now sign in with {provider}. Not you? Change your password and review your sign-in methods in Security."
|
|
545
542
|
},
|
|
546
543
|
"password_reset": {
|
|
547
|
-
"title": "Password reset with an email
|
|
548
|
-
"description": "The
|
|
544
|
+
"title": "Password reset with an email code",
|
|
545
|
+
"description": "The code was sent to {email}. Not you? Someone can read that mailbox: secure it first, then reset your password again."
|
|
549
546
|
},
|
|
550
547
|
"email_changed": {
|
|
551
548
|
"title": "Sign-in email changed to {email}",
|
|
@@ -599,6 +596,10 @@
|
|
|
599
596
|
"description": "Someone entered a wrong password in the last {minutes} minutes. Don't recognise this? Change your password and turn on two-factor authentication in Security.",
|
|
600
597
|
"description_two_factor": "Someone entered a wrong password in the last {minutes} minutes; two-factor authentication still stood in the way. Don't recognise this? Change your password in Security."
|
|
601
598
|
},
|
|
599
|
+
"two_factor_lockout": {
|
|
600
|
+
"title": "{count} wrong two-factor codes on your account",
|
|
601
|
+
"description": "Someone gave your password, then {count} wrong two-factor codes within {minutes} minutes; codes are refused for a while. Don't recognise this? Your password is known: change it in Security."
|
|
602
|
+
},
|
|
602
603
|
"roles_changed": {
|
|
603
604
|
"title": "Your roles are now {roles}",
|
|
604
605
|
"title_one": "Your role is now {roles}",
|
|
@@ -678,7 +679,8 @@
|
|
|
678
679
|
"empty_title": "No activity yet",
|
|
679
680
|
"error_title": "Activity could not be loaded",
|
|
680
681
|
"error_description": "Check your connection, then try again.",
|
|
681
|
-
"retry": "Try again"
|
|
682
|
+
"retry": "Try again",
|
|
683
|
+
"list_label": "Activity"
|
|
682
684
|
},
|
|
683
685
|
"leave_guard": {
|
|
684
686
|
"title": "Discard unsaved changes?",
|
|
@@ -277,6 +277,13 @@
|
|
|
277
277
|
"error_not_submitted": "Le formulaire n'a pas été soumis",
|
|
278
278
|
"fetch_error_title": "Échec de la récupération des données",
|
|
279
279
|
"fetch_error_unknown": "Une erreur inattendue s'est produite. Veuillez réessayer plus tard.",
|
|
280
|
+
"load_error": {
|
|
281
|
+
"error_title": "Impossible de charger cet élément",
|
|
282
|
+
"error_description": "Vérifiez votre connexion, puis réessayez. Rien ne peut être enregistré tant que l'élément n'est pas chargé.",
|
|
283
|
+
"forbidden_title": "Vous ne pouvez pas voir cet élément",
|
|
284
|
+
"forbidden_description": "Votre rôle ne vous permet pas de voir cet élément, le formulaire ne peut donc pas s'ouvrir sur ses valeurs actuelles. Demandez l'accès à un administrateur.",
|
|
285
|
+
"retry": "Réessayer"
|
|
286
|
+
},
|
|
280
287
|
"select_date": "Sélectionner une date",
|
|
281
288
|
"relation": {
|
|
282
289
|
"selected_count": "{count} sélectionné(s)",
|
|
@@ -490,11 +497,7 @@
|
|
|
490
497
|
"notifications": {
|
|
491
498
|
"categories": {
|
|
492
499
|
"system": "Système",
|
|
493
|
-
"system_desc": "Notifications système et alertes de sécurité"
|
|
494
|
-
"module_one": "Sécurité",
|
|
495
|
-
"module_one_desc": "Surveillance et détection des menaces",
|
|
496
|
-
"module_two": "Logistique",
|
|
497
|
-
"module_two_desc": "Expéditions, inventaire et chaîne d'approvisionnement"
|
|
500
|
+
"system_desc": "Notifications système et alertes de sécurité"
|
|
498
501
|
},
|
|
499
502
|
"subjects": {
|
|
500
503
|
"general": "Général",
|
|
@@ -509,12 +512,6 @@
|
|
|
509
512
|
"automation_desc": "Notifications envoyées par les procédures d'automatisation",
|
|
510
513
|
"updates": "Mises à jour des modules",
|
|
511
514
|
"updates_desc": "Mises à jour disponibles des modules Antelope du projet (mode développement)",
|
|
512
|
-
"module_one_alerts": "Alertes de sécurité",
|
|
513
|
-
"module_one_alerts_desc": "Événements critiques nécessitant une attention immédiate",
|
|
514
|
-
"module_one_updates": "Rapports de menaces",
|
|
515
|
-
"module_one_updates_desc": "Mises à jour sur les menaces et vulnérabilités de sécurité",
|
|
516
|
-
"module_two_notifications": "Suivi des expéditions",
|
|
517
|
-
"module_two_notifications_desc": "Mises à jour sur les expéditions et l'inventaire",
|
|
518
515
|
"updates_badge": "Mode développeur"
|
|
519
516
|
},
|
|
520
517
|
"preferences": {
|
|
@@ -545,8 +542,8 @@
|
|
|
545
542
|
"description": "Vous pouvez désormais vous connecter avec {provider}. Ce n'était pas vous ? Changez votre mot de passe et vérifiez vos méthodes de connexion dans Sécurité."
|
|
546
543
|
},
|
|
547
544
|
"password_reset": {
|
|
548
|
-
"title": "Mot de passe réinitialisé par
|
|
549
|
-
"description": "Le
|
|
545
|
+
"title": "Mot de passe réinitialisé par code e-mail",
|
|
546
|
+
"description": "Le code a été envoyé à {email}. Ce n'était pas vous ? Quelqu'un a accès à cette boîte mail : sécurisez-la d'abord, puis réinitialisez à nouveau votre mot de passe."
|
|
550
547
|
},
|
|
551
548
|
"email_changed": {
|
|
552
549
|
"title": "E-mail de connexion changé pour {email}",
|
|
@@ -600,6 +597,10 @@
|
|
|
600
597
|
"description": "Quelqu'un a saisi un mauvais mot de passe ces {minutes} dernières minutes. Vous ne reconnaissez pas ces tentatives ? Changez votre mot de passe et activez la double authentification dans Sécurité.",
|
|
601
598
|
"description_two_factor": "Quelqu'un a saisi un mauvais mot de passe ces {minutes} dernières minutes ; la double authentification a tout de même barré la route. Vous ne reconnaissez pas ces tentatives ? Changez votre mot de passe dans Sécurité."
|
|
602
599
|
},
|
|
600
|
+
"two_factor_lockout": {
|
|
601
|
+
"title": "{count} codes de double authentification erronés sur votre compte",
|
|
602
|
+
"description": "Quelqu'un a saisi votre mot de passe, puis {count} codes de double authentification erronés en moins de {minutes} minutes ; les codes sont refusés pour un temps. Vous ne reconnaissez pas ces tentatives ? Votre mot de passe est connu : changez-le dans Sécurité."
|
|
603
|
+
},
|
|
603
604
|
"roles_changed": {
|
|
604
605
|
"title": "Vos rôles sont désormais : {roles}",
|
|
605
606
|
"title_one": "Votre rôle est désormais : {roles}",
|
|
@@ -679,7 +680,8 @@
|
|
|
679
680
|
"empty_title": "Aucune activité pour l'instant",
|
|
680
681
|
"error_title": "Impossible de charger l'activité",
|
|
681
682
|
"error_description": "Vérifiez votre connexion, puis réessayez.",
|
|
682
|
-
"retry": "Réessayer"
|
|
683
|
+
"retry": "Réessayer",
|
|
684
|
+
"list_label": "Activité"
|
|
683
685
|
},
|
|
684
686
|
"leave_guard": {
|
|
685
687
|
"title": "Abandonner les modifications non enregistrées ?",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"packageManager": "pnpm@10.6.5",
|
|
13
13
|
"engines": {
|
|
14
|
-
"@antelopejs/dms-frontend": ">=0.5.
|
|
14
|
+
"@antelopejs/dms-frontend": ">=0.5.1 <0.6.0"
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
17
|
"typecheck": "ajs dms verify-source --layer \"$PWD\" --local-package @antelopejs/dms=.. --local-package @antelopejs/interface-dms=../../interface-dms",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
75
|
"@antelopejs/core": ">=1.13.4 <2",
|
|
76
|
-
"@antelopejs/dms-frontend": ">=0.5.
|
|
76
|
+
"@antelopejs/dms-frontend": ">=0.5.1 <0.6.0",
|
|
77
77
|
"@eslint/js": "^8.57.0",
|
|
78
78
|
"@inertiajs/vue3": "^3.7.0",
|
|
79
79
|
"@nuxt/ui": "4.10.0",
|
|
@@ -157,8 +157,8 @@ importers:
|
|
|
157
157
|
specifier: '>=1.13.4 <2'
|
|
158
158
|
version: 1.13.5
|
|
159
159
|
'@antelopejs/dms-frontend':
|
|
160
|
-
specifier: '>=0.5.
|
|
161
|
-
version: 0.5.
|
|
160
|
+
specifier: '>=0.5.1 <0.6.0'
|
|
161
|
+
version: 0.5.1(@antelopejs/core@1.13.5)
|
|
162
162
|
'@eslint/js':
|
|
163
163
|
specifier: ^8.57.0
|
|
164
164
|
version: 8.57.0
|
|
@@ -234,8 +234,8 @@ packages:
|
|
|
234
234
|
engines: {node: '>=20.19'}
|
|
235
235
|
hasBin: true
|
|
236
236
|
|
|
237
|
-
'@antelopejs/dms-frontend@0.5.
|
|
238
|
-
resolution: {integrity: sha512-
|
|
237
|
+
'@antelopejs/dms-frontend@0.5.1':
|
|
238
|
+
resolution: {integrity: sha512-ykrqlHfYF+BqNy+h4FuZBbqAW6UjviauCiI8cQCW1M55MzIxk2Ar3ZnMH1VKH8QsfDBBNapDik5rd/AMLQ33dw==}
|
|
239
239
|
engines: {node: '>=20.12.0'}
|
|
240
240
|
hasBin: true
|
|
241
241
|
peerDependencies:
|
|
@@ -4205,7 +4205,7 @@ snapshots:
|
|
|
4205
4205
|
semver: 7.8.5
|
|
4206
4206
|
typescript: 5.9.3
|
|
4207
4207
|
|
|
4208
|
-
'@antelopejs/dms-frontend@0.5.
|
|
4208
|
+
'@antelopejs/dms-frontend@0.5.1(@antelopejs/core@1.13.5)':
|
|
4209
4209
|
dependencies:
|
|
4210
4210
|
'@antelopejs/core': 1.13.5
|
|
4211
4211
|
chokidar: 4.0.3
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { computed, createSSRApp, defineComponent, h, ref } from "vue";
|
|
2
|
+
import { renderToString } from "vue/server-renderer";
|
|
3
|
+
import { afterEach, beforeEach, expect, it, vi } from "vitest";
|
|
4
|
+
import ActivityFeed from "../layers/dms-ui/app/components/activity-feed/ActivityFeed.vue";
|
|
5
|
+
|
|
6
|
+
const items = ref<Array<Record<string, unknown>>>([]);
|
|
7
|
+
|
|
8
|
+
vi.mock("../layers/dms-ui/app/build/composables/blocks/useBlockItems", () => ({
|
|
9
|
+
useBlockItems: () => ({
|
|
10
|
+
items: computed(() => items.value),
|
|
11
|
+
isPending: computed(() => false),
|
|
12
|
+
hasError: computed(() => false),
|
|
13
|
+
refresh: async () => {},
|
|
14
|
+
}),
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
const Slot = defineComponent({
|
|
18
|
+
props: { title: { type: String, default: undefined } },
|
|
19
|
+
setup:
|
|
20
|
+
(props, { slots, attrs }) =>
|
|
21
|
+
() =>
|
|
22
|
+
h("div", attrs, [props.title, slots.default?.()]),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
async function render(props: Record<string, unknown>): Promise<string> {
|
|
26
|
+
const app = createSSRApp({
|
|
27
|
+
render: () =>
|
|
28
|
+
h(ActivityFeed, {
|
|
29
|
+
componentId: "activity",
|
|
30
|
+
pageId: "settings",
|
|
31
|
+
title: "Recent account activity",
|
|
32
|
+
fetchUrl: "/settings/activity",
|
|
33
|
+
...props,
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
for (const name of [
|
|
37
|
+
"DmsCard",
|
|
38
|
+
"UIcon",
|
|
39
|
+
"USkeleton",
|
|
40
|
+
"UButton",
|
|
41
|
+
"ULink",
|
|
42
|
+
"NuxtLink",
|
|
43
|
+
]) {
|
|
44
|
+
app.component(name, Slot);
|
|
45
|
+
}
|
|
46
|
+
return renderToString(app);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** The opening tag of the feed's scroll area, if it has one. */
|
|
50
|
+
function scrollArea(html: string): string | undefined {
|
|
51
|
+
return html.match(/<div[^>]*role="region"[^>]*>/)?.[0];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
items.value = Array.from({ length: 25 }, (_, index) => ({
|
|
56
|
+
id: `e${index}`,
|
|
57
|
+
title: `Entry ${index}`,
|
|
58
|
+
date: new Date(Date.UTC(2026, 9, 9, 23 - index)).toISOString(),
|
|
59
|
+
}));
|
|
60
|
+
vi.stubGlobal("useI18n", () => ({ locale: ref("en-GB"), t: String }));
|
|
61
|
+
vi.stubGlobal("useTranslation", () => ({ processI18n: String }));
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
afterEach(() => vi.unstubAllGlobals());
|
|
65
|
+
|
|
66
|
+
it("filling its cell, scrolls the entries in a focusable region sized to nothing", async () => {
|
|
67
|
+
const area = scrollArea(await render({ fillHeight: true }));
|
|
68
|
+
expect(area).toBeDefined();
|
|
69
|
+
expect(area).toContain('tabindex="0"');
|
|
70
|
+
expect(area).toContain('aria-label="Recent account activity"');
|
|
71
|
+
// Sized to nothing, it leaves the row's height to the cards beside it…
|
|
72
|
+
expect(area).toMatch(/\bcontain-size\b/);
|
|
73
|
+
expect(area).toMatch(/\boverflow-y-auto\b/);
|
|
74
|
+
expect(area).toMatch(/\bh-full\b/);
|
|
75
|
+
// …and once the grid stacks its cells, takes its own height, capped.
|
|
76
|
+
expect(area).toContain(
|
|
77
|
+
"[@container_style(--dms-grid-tracks:1)]:max-h-[24rem]",
|
|
78
|
+
);
|
|
79
|
+
expect(area).toContain(
|
|
80
|
+
"[@container_style(--dms-grid-tracks:1)]:contain-none",
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("keeps each day's separator on top of the scrolled entries", async () => {
|
|
85
|
+
const html = await render({ fillHeight: true });
|
|
86
|
+
expect(html).toMatch(/<div[^>]*class="[^"]*\bsticky top-0\b[^"]*"[^>]*><h3/);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("names the region after the feed when it has no title", async () => {
|
|
90
|
+
const area = scrollArea(await render({ fillHeight: true, title: undefined }));
|
|
91
|
+
expect(area).toContain('aria-label="dms.activity_feed.list_label"');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("grows with its entries by default, without a scroll area", async () => {
|
|
95
|
+
const html = await render({});
|
|
96
|
+
expect(scrollArea(html)).toBeUndefined();
|
|
97
|
+
expect(html).not.toContain("contain-size");
|
|
98
|
+
expect(html).not.toContain("sticky");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("shows only the latest `maxItems` entries", async () => {
|
|
102
|
+
const html = await render({ fillHeight: true, maxItems: 20 });
|
|
103
|
+
expect(html).toContain("Entry 0");
|
|
104
|
+
expect(html).toContain("Entry 19");
|
|
105
|
+
expect(html).not.toContain("Entry 20");
|
|
106
|
+
expect(new Set(html.match(/Entry \d+/g)).size).toBe(20);
|
|
107
|
+
});
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import { afterEach, beforeEach, expect, it, vi } from "vitest";
|
|
2
2
|
import { computed, ref } from "vue";
|
|
3
3
|
import { useCategoryNavCards } from "../layers/dms-layout/app/build/composables/navigation/useCategoryNavCards";
|
|
4
|
+
import type { NavBadge } from "../layers/dms-ui/app/build/composables/navigation/useNavBadges";
|
|
4
5
|
|
|
5
|
-
const badges = ref<Record<string,
|
|
6
|
-
|
|
7
|
-
vi.mock(
|
|
8
|
-
"../layers/dms-ui/app/build/composables/navigation/useNavBadges",
|
|
9
|
-
() => ({
|
|
10
|
-
useNavBadges: () => ({ badges }),
|
|
11
|
-
}),
|
|
12
|
-
);
|
|
6
|
+
const badges = ref<Record<string, NavBadge>>({});
|
|
13
7
|
vi.mock(
|
|
14
8
|
"../layers/dms-core/app/build/composables/auth/usePermissionPreview",
|
|
15
9
|
() => ({
|
|
@@ -40,7 +34,10 @@ const tree = ref({
|
|
|
40
34
|
children: {
|
|
41
35
|
profile: node("settings.user.profile", { icon: "i-ph-user" }),
|
|
42
36
|
security: node("settings.user.security", { badge: "1" }),
|
|
43
|
-
notifications: node("settings.user.notifications", {
|
|
37
|
+
notifications: node("settings.user.notifications", {
|
|
38
|
+
badge: "4",
|
|
39
|
+
badgeTone: "warning",
|
|
40
|
+
}),
|
|
44
41
|
locked: node("settings.user.locked", { hasAccess: false }),
|
|
45
42
|
},
|
|
46
43
|
childrenOrders: ["profile", "security", "notifications", "locked"],
|
|
@@ -57,6 +54,7 @@ beforeEach(() => {
|
|
|
57
54
|
vi.stubGlobal("computed", computed);
|
|
58
55
|
vi.stubGlobal("useI18n", () => ({ t: (key: string) => key }));
|
|
59
56
|
vi.stubGlobal("useSiteLayout", () => ({ siteLayoutTree: tree }));
|
|
57
|
+
vi.stubGlobal("useDmsState", () => badges);
|
|
60
58
|
});
|
|
61
59
|
|
|
62
60
|
afterEach(() => {
|
|
@@ -74,21 +72,31 @@ it("makes a card of each page the viewer can open, in menu order", () => {
|
|
|
74
72
|
title: "$settings.user.profile",
|
|
75
73
|
icon: "i-ph-user",
|
|
76
74
|
to: "/settings/user/profile",
|
|
77
|
-
|
|
75
|
+
badge: undefined,
|
|
78
76
|
});
|
|
79
77
|
});
|
|
80
78
|
|
|
81
79
|
it("shows the navigation badge, a fresher count first", () => {
|
|
82
80
|
badges.value = {
|
|
83
|
-
"settings.user.notifications": "",
|
|
84
|
-
"settings.user.security": "2",
|
|
81
|
+
"settings.user.notifications": { label: "" },
|
|
82
|
+
"settings.user.security": { label: "2", tone: "error" },
|
|
85
83
|
};
|
|
86
84
|
const { cards } = useCategoryNavCards(() => "settings.user");
|
|
87
|
-
expect(cards.value.map((card) => card.
|
|
85
|
+
expect(cards.value.map((card) => card.badge)).toEqual([
|
|
88
86
|
undefined,
|
|
89
87
|
"2",
|
|
90
88
|
undefined,
|
|
91
89
|
]);
|
|
90
|
+
expect(cards.value[1]?.badgeTone).toBe("error");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("draws the served badge in the tone the server gave it", () => {
|
|
94
|
+
const { cards } = useCategoryNavCards(() => "settings.user");
|
|
95
|
+
expect(cards.value[2]).toMatchObject({ badge: "4", badgeTone: "warning" });
|
|
96
|
+
expect(cards.value[1]).toMatchObject({ badge: "1", badgeTone: undefined });
|
|
97
|
+
// The badge is the card's corner pill, not the live state line under the
|
|
98
|
+
// description that a fetched card closes on.
|
|
99
|
+
expect(cards.value[2]).not.toHaveProperty("state");
|
|
92
100
|
});
|
|
93
101
|
|
|
94
102
|
it("lists nothing for a category the site layout does not hold", () => {
|