@acorex-platform/module-security-management-client 0.0.58 → 0.0.60
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/fesm2022/{acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-BSGZRsGz.mjs → acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-B61j_cJF.mjs} +212 -13
- package/fesm2022/acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-B61j_cJF.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-approve-join-request.command-BSvK59LV.mjs +322 -0
- package/fesm2022/acorex-platform-module-security-management-client-approve-join-request.command-BSvK59LV.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entities-device-sessions.mjs +21 -2
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entities-device-sessions.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entities-users.mjs +173 -14
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entities-users.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-acorex-platform-module-security-management-client-contracts-entity-catalog-B4oiF8FO.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-acorex-platform-module-security-management-client-contracts-entity-catalog-JP3zTrun.mjs} +10 -10
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-acorex-platform-module-security-management-client-contracts-entity-catalog-B4oiF8FO.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-acorex-platform-module-security-management-client-contracts-entity-catalog-JP3zTrun.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-device-sessions.entity-CU-5X-qu.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-device-sessions.entity-lwQtCJoy.mjs} +23 -4
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog-device-sessions.entity-lwQtCJoy.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-identity-provider.entity-Bld1buTd.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-identity-provider.entity-DZfizo-n.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-identity-provider.entity-Bld1buTd.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-identity-provider.entity-DZfizo-n.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-policy.entity-DZVzHzVM.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-policy.entity-Dkl_6Iio.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-policy.entity-DZVzHzVM.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-policy.entity-Dkl_6Iio.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-profile.entity-BCy5fNc9.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-profile.entity-Ddbd-rAG.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-profile.entity-BCy5fNc9.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-profile.entity-Ddbd-rAG.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-role-permission.entity-DcvYjfZm.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-role-permission.entity-WCgik8MV.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-role-permission.entity-DcvYjfZm.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-role-permission.entity-WCgik8MV.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-roles.entity-lNKDIDry.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-roles.entity-CRZftClq.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-roles.entity-lNKDIDry.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-roles.entity-CRZftClq.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-user-role.entity-DKII6o5N.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-user-role.entity-9QpoRCOF.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-user-role.entity-DKII6o5N.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-user-role.entity-9QpoRCOF.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-user-two-factor.entity-ge21b3mE.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-user-two-factor.entity-C34VzcYk.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-user-two-factor.entity-ge21b3mE.mjs.map → acorex-platform-module-security-management-client-contracts-entity-catalog-user-two-factor.entity-C34VzcYk.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-security-management-client-contracts-entity-catalog-users.entity-CJ7x5rjC.mjs → acorex-platform-module-security-management-client-contracts-entity-catalog-users.entity-DuC5cfIb.mjs} +175 -16
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog-users.entity-DuC5cfIb.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog.mjs +1 -1
- package/fesm2022/acorex-platform-module-security-management-client-contracts.mjs +342 -4
- package/fesm2022/acorex-platform-module-security-management-client-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-security-management-client-create-user-in-tenant.command-BFnZRmh9.mjs +376 -0
- package/fesm2022/acorex-platform-module-security-management-client-create-user-in-tenant.command-BFnZRmh9.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-security-management-client-index-DKk9lEIl.mjs → acorex-platform-module-security-management-client-index-B6qo6qLT.mjs} +5 -156
- package/fesm2022/acorex-platform-module-security-management-client-index-B6qo6qLT.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-ClQ6WxxN.mjs +370 -0
- package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-ClQ6WxxN.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-reject-join-request.command-B3kiok6b.mjs +76 -0
- package/fesm2022/acorex-platform-module-security-management-client-reject-join-request.command-B3kiok6b.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-security-management-client-reset-two-factor.command-psTDKoNf.mjs → acorex-platform-module-security-management-client-reset-two-factor.command-C27mUZ1-.mjs} +7 -2
- package/fesm2022/acorex-platform-module-security-management-client-reset-two-factor.command-C27mUZ1-.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-security-management-client-send-password-reset-email.command-CoQgWdya.mjs → acorex-platform-module-security-management-client-send-password-reset-email.command-DFxm2T_x.mjs} +7 -2
- package/fesm2022/acorex-platform-module-security-management-client-send-password-reset-email.command-DFxm2T_x.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-settings.provider-CwDiU-C8.mjs +54 -0
- package/fesm2022/acorex-platform-module-security-management-client-settings.provider-CwDiU-C8.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client-user-role-grant.service-6U17jzjq.mjs +231 -0
- package/fesm2022/acorex-platform-module-security-management-client-user-role-grant.service-6U17jzjq.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-security-management-client.mjs +1 -1
- package/i18n/en-AU/security-management.json +91 -4
- package/i18n/en-US/security-management.json +91 -4
- package/i18n/fa-IR/security-management.json +91 -4
- package/package.json +1 -1
- package/types/acorex-platform-module-security-management-client-contracts.d.ts +288 -8
- package/fesm2022/acorex-platform-module-security-management-client-acorex-platform-module-security-management-client-BSGZRsGz.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog-device-sessions.entity-CU-5X-qu.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-contracts-entity-catalog-users.entity-CJ7x5rjC.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-index-DKk9lEIl.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-kFXjLdxy.mjs +0 -143
- package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-kFXjLdxy.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-reset-two-factor.command-psTDKoNf.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-security-management-client-send-password-reset-email.command-CoQgWdya.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-security-management-client-index-B6qo6qLT.mjs","sources":["../../../../libs/modules/security-management/client/src/lib/features/user-roles/pages/user-roles-page/user-roles-page.component.ts","../../../../libs/modules/security-management/client/src/lib/features/user-roles/pages/user-roles-page/user-roles-page.component.html","../../../../libs/modules/security-management/client/src/lib/features/user-roles/pages/user-roles-page/user-roles-page-component.provider.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport {\n AXPActionMenuItem,\n AXPExecuteCommand,\n type AXPRuntimeCommandResult,\n} from '@acorex-platform/framework-shared/core';\nimport type { AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type { AXPLayoutDetailsViewAction } from '@acorex-platform/framework-client/layout/views';\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent } from '@acorex-platform/framework-client/layout/views';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXSelectionListModule } from '@acorex/components/selection-list';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { isEqual } from 'lodash-es';\nimport { resolvePersistedEntityId } from '../../../permissions/resolve-persisted-entity-id.util';\nimport { AXMUserRoleGrantService } from '../../user-role-grant.service';\nimport type { UserRoleGrantRow, UserRoleOption } from '../../user-role-grant.types';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst USER_ROLES_DISCARD_COMMAND = 'User:Roles:Discard';\nconst USER_ROLES_SAVE_COMMAND = 'User:Roles:Save';\n\n//#endregion\n\n//#region ----- Component -----\n\n/**\n * User detail/create wizard page that edits scoped UserRole assignments.\n */\n@Component({\n selector: 'axm-user-roles-page',\n standalone: true,\n imports: [\n AXPStateMessageComponent,\n AXSelectionListModule,\n AXSkeletonModule,\n AXTranslationModule,\n AsyncPipe,\n FormsModule,\n ],\n templateUrl: './user-roles-page.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMUserRolesPageComponent,\n },\n ],\n host: {\n class: 'flex h-full min-h-0 flex-1 flex-col overflow-hidden',\n },\n})\nexport class AXMUserRolesPageComponent extends AXPPageLayoutBaseComponent {\n //#region ----- Inputs -----\n\n rootContext = input<Record<string, unknown>>();\n pageConfig = input<Record<string, unknown>>();\n\n //#endregion\n\n //#region ----- Services & Dependencies -----\n\n private readonly grantService = inject(AXMUserRoleGrantService);\n private readonly hostPageLayout = inject(AXPPageLayoutBase, { optional: true, skipSelf: true });\n\n //#endregion\n\n //#region ----- State Signals -----\n\n private readonly loadedUserId = signal<string | undefined>(undefined);\n private readonly existingGrant = signal<UserRoleGrantRow | null>(null);\n private readonly baselineRoleIds = signal<string[]>([]);\n protected readonly currentRoleIds = signal<string[]>([]);\n protected readonly roleOptions = signal<UserRoleOption[]>([]);\n protected readonly isLoading = signal(true);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly userId = computed(() => resolvePersistedEntityId(this.rootContext()));\n\n protected readonly isDirty = computed(() => {\n return !this.areRoleSetsEqual(this.baselineRoleIds(), this.currentRoleIds());\n });\n\n /** System UserRole grants are seeded and not editable in product/platform UI. */\n protected readonly isGrantReadonly = computed(() => {\n const state = this.existingGrant()?.stateInfo;\n return state?.isSystem === true || state?.isImmutable === true;\n });\n\n /** Checkbox + label row placeholders for the loading skeleton */\n protected readonly roleSkeletonPlaceholders = computed(() => [\n 'w-40',\n 'w-28',\n 'w-48',\n 'w-32',\n 'w-44',\n 'w-36',\n 'w-40',\n 'w-52',\n ]);\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n super();\n effect(() => {\n const id = this.userId();\n untracked(() => {\n void this.loadGrantForUser(id);\n });\n });\n }\n\n //#endregion\n\n //#region ----- Unsaved Changes -----\n\n override hasUnsavedChanges(): boolean {\n return this.isDirty();\n }\n\n //#endregion\n\n //#region ----- Page Actions -----\n\n override async getPrimaryMenuItems(): Promise<AXPActionMenuItem[]> {\n const discardTitle = (await this.translateService.translateAsync('@general:actions.discard.title')) ?? '';\n const saveTitle = (await this.translateService.translateAsync('@general:actions.save.title')) ?? '';\n const canEdit = !!this.userId() && !this.isLoading() && !this.isGrantReadonly();\n\n const discardAction: AXPLayoutDetailsViewAction = {\n title: discardTitle,\n icon: 'fa-light fa-rotate-left',\n zone: 'footer',\n priority: 'secondary',\n color: 'default',\n visible: canEdit && this.isDirty(),\n command: { name: USER_ROLES_DISCARD_COMMAND, options: {} },\n };\n\n const saveAction: AXPLayoutDetailsViewAction = {\n title: saveTitle,\n icon: 'fa-light fa-floppy-disk',\n zone: 'footer',\n priority: 'primary',\n color: 'primary',\n visible: canEdit && this.isDirty(),\n command: { name: USER_ROLES_SAVE_COMMAND, options: {} },\n };\n\n return [discardAction, saveAction];\n }\n\n //#endregion\n\n //#region ----- Command Handling -----\n\n override execute(command: AXPExecuteCommand): void | Promise<void> {\n if (command.name === USER_ROLES_DISCARD_COMMAND) {\n this.handleDiscard();\n return;\n }\n if (command.name !== USER_ROLES_SAVE_COMMAND) {\n return;\n }\n return this.handleSaveExecute() as unknown as Promise<void>;\n }\n\n private async handleSaveExecute(): AXPCommandExecuteResultPromise {\n const userId = this.userId();\n const scope = this.grantService.resolveSessionScope();\n\n if (!userId || !scope) {\n return {\n success: false,\n message: {\n text: await this.translateService.translateAsync('@general:messages.entity.invalid-data'),\n },\n };\n }\n\n try {\n const roleIds = [...this.currentRoleIds()];\n const saved = await this.grantService.saveGrant({\n existing: this.existingGrant(),\n userId,\n roleIds,\n tenantId: scope.tenantId,\n applicationId: scope.applicationId,\n });\n\n const nextGrant: UserRoleGrantRow = {\n id: String(saved['id'] ?? this.existingGrant()?.id ?? ''),\n userId,\n roleIds,\n scopeInfo: (saved['scopeInfo'] as UserRoleGrantRow['scopeInfo']) ?? this.existingGrant()?.scopeInfo,\n };\n this.existingGrant.set(nextGrant.id ? nextGrant : this.existingGrant());\n this.baselineRoleIds.set([...roleIds]);\n this.currentRoleIds.set([...roleIds]);\n this.grantService.notifyGrantModified(saved);\n this.recompute();\n\n return {\n success: true,\n kind: 'object',\n data: roleIds,\n } as AXPRuntimeCommandResult;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to save roles.';\n return {\n success: false,\n message: { text: message },\n };\n }\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected onRolesValueChanged(event: AXValueChangedEvent): void {\n if (!event.isUserInteraction || this.isGrantReadonly()) {\n return;\n }\n\n const next = Array.isArray(event.value)\n ? event.value.map(String)\n : event.value != null\n ? [String(event.value)]\n : [];\n\n this.currentRoleIds.set(next);\n this.recompute();\n }\n\n private handleDiscard(): void {\n this.currentRoleIds.set([...this.baselineRoleIds()]);\n this.recompute();\n }\n\n //#endregion\n\n //#region ----- Wizard step context -----\n\n override getWizardStepContext(): Record<string, unknown> | null {\n return null;\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async loadGrantForUser(userId: string | undefined): Promise<void> {\n if (!userId) {\n this.loadedUserId.set(undefined);\n this.existingGrant.set(null);\n this.baselineRoleIds.set([]);\n this.currentRoleIds.set([]);\n this.roleOptions.set([]);\n this.isLoading.set(false);\n this.recompute();\n return;\n }\n\n if (userId === this.loadedUserId() && !this.isLoading()) {\n return;\n }\n\n this.isLoading.set(true);\n this.recompute();\n\n const scope = this.grantService.resolveSessionScope();\n if (!scope) {\n this.loadedUserId.set(userId);\n this.existingGrant.set(null);\n this.baselineRoleIds.set([]);\n this.currentRoleIds.set([]);\n this.isLoading.set(false);\n this.recompute();\n return;\n }\n\n try {\n const grant = await this.grantService.findGrant(userId, scope.tenantId, scope.applicationId);\n const roleIds = [...(grant?.roleIds ?? [])];\n const options = await this.grantService.listRoleOptions(roleIds);\n this.loadedUserId.set(userId);\n this.existingGrant.set(grant);\n this.baselineRoleIds.set(roleIds);\n this.currentRoleIds.set([...roleIds]);\n this.roleOptions.set(options);\n } catch {\n this.loadedUserId.set(userId);\n this.existingGrant.set(null);\n this.baselineRoleIds.set([]);\n this.currentRoleIds.set([]);\n this.roleOptions.set([]);\n } finally {\n this.isLoading.set(false);\n this.recompute();\n }\n }\n\n //#endregion\n\n //#region ----- Utility Methods -----\n\n private areRoleSetsEqual(a: string[], b: string[]): boolean {\n return isEqual([...a].sort(), [...b].sort());\n }\n\n protected override recompute(): void {\n super.recompute();\n const maybeLayout = this.hostPageLayout as unknown as { recompute?: () => void };\n maybeLayout?.recompute?.();\n }\n\n //#endregion\n}\n\n//#endregion\n","@if (isLoading()) {\n <!-- ----- Skeleton while UserRole grant loads for the current workspace ----- -->\n <div class=\"flex h-full min-h-0 flex-1 flex-col overflow-auto p-4\" aria-hidden=\"true\">\n <div class=\"user-roles-frame rounded border border-default bg-lightest p-4\">\n <div class=\"mb-4 h-4 w-3/5 max-w-md rounded-md overflow-hidden\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n <div class=\"flex flex-col gap-3\">\n @for (widthClass of roleSkeletonPlaceholders(); track $index) {\n <!-- ----- One checkbox + label row placeholder ----- -->\n <div class=\"flex items-center gap-3\">\n <div class=\"h-4 w-4 shrink-0 rounded-sm overflow-hidden\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n <div class=\"h-4 max-w-full rounded-md overflow-hidden\" [class]=\"widthClass\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n}\n<!-- ----- User must be persisted before role grants can be edited ----- -->\n@else if (!userId()) {\n <div class=\"flex h-full min-h-[20rem] items-center justify-center p-6\">\n <axp-state-message\n [title]=\"'@security-management:users.entities.user.pages.roles.save-user-first.title'\"\n [description]=\"'@security-management:users.entities.user.pages.roles.save-user-first.description'\"\n ></axp-state-message>\n </div>\n}\n<!-- ----- Scoped role checklist for the current tenant/application ----- -->\n@else {\n <div class=\"flex h-full min-h-0 flex-1 flex-col overflow-auto p-4\">\n <div class=\"user-roles-frame rounded border border-default bg-lightest p-4\">\n <p class=\"mb-4 text-sm opacity-70\">\n {{ '@security-management:users.entities.user.pages.roles.description' | translate | async }}\n </p>\n <ax-selection-list\n class=\"w-full\"\n valueField=\"id\"\n textField=\"title\"\n look=\"solid\"\n direction=\"vertical\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n [items]=\"roleOptions()\"\n [ngModel]=\"currentRoleIds()\"\n [disabled]=\"isGrantReadonly()\"\n [readonly]=\"isGrantReadonly()\"\n (onValueChanged)=\"onRolesValueChanged($event)\"\n ></ax-selection-list>\n </div>\n </div>\n}\n","//#region ----- Imports -----\n\nimport {\n AXPPageComponentDefinition,\n AXPPageComponentProvider,\n} from '@acorex-platform/framework-client/layout/components';\nimport { USER_ROLES_PAGE_COMPONENT_KEY } from '@acorex-platform/module-security-management-client/contracts';\nimport { Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ----- Provider -----\n\n@Injectable()\nexport class AXMUserRolesPageComponentProvider implements AXPPageComponentProvider {\n async components(): Promise<AXPPageComponentDefinition[]> {\n return [\n {\n key: USER_ROLES_PAGE_COMPONENT_KEY,\n loader: () =>\n import('./user-roles-page.component').then((m) => m.AXMUserRolesPageComponent),\n },\n ];\n }\n}\n\n//#endregion\n"],"names":["i2","i3","i4"],"mappings":"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"}
|
package/fesm2022/acorex-platform-module-security-management-client-invite-user.command-ClQ6WxxN.mjs
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { AXDialogService } from '@acorex/components/dialog';
|
|
2
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
3
|
+
import { AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
|
|
4
|
+
import { AXPSessionService } from '@acorex-platform/framework-client/auth';
|
|
5
|
+
import { AXPLayoutBuilderService, resolveLayoutBuilderDialogResult } from '@acorex-platform/framework-client/layout/builder';
|
|
6
|
+
import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
|
|
7
|
+
import { AXPWidgetsList } from '@acorex-platform/framework-shared/core';
|
|
8
|
+
import { resolveEntityActionCommandInput } from '@acorex-platform/framework-shared/runtime';
|
|
9
|
+
import { AXMSecurityManagementServerCommands, normalizeInviteApplicationRoleAssignments, flattenInviteApplicationRoleAssignments } from '@acorex-platform/module-security-management-client/contracts';
|
|
10
|
+
export { AXM_USER_INVITE_COMMAND } from '@acorex-platform/module-security-management-client/contracts';
|
|
11
|
+
import * as i0 from '@angular/core';
|
|
12
|
+
import { inject, Injectable } from '@angular/core';
|
|
13
|
+
import { A as AXMUserRoleGrantService } from './acorex-platform-module-security-management-client-user-role-grant.service-6U17jzjq.mjs';
|
|
14
|
+
|
|
15
|
+
/** TM edition feature — multi-app invite (ADR-TEN-001 D-05). String avoids client↔client package edge. */
|
|
16
|
+
const INVITE_MULTI_APPLICATION_FEATURE = 'TenantManagement:Feature:InviteMultiApplication';
|
|
17
|
+
/** Tenant-wide invite surface only — Application Users (Security.User) stay app-scoped. */
|
|
18
|
+
const TENANT_USER_ENTITY = 'TenantManagement.TenantUser';
|
|
19
|
+
const TENANT_USER_ENTITY_NAME = 'TenantUser';
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region ---- Invite user command ----
|
|
22
|
+
class AXPInviteUserCommand {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
25
|
+
this.commandService = inject(AXPCommandService);
|
|
26
|
+
this.dialogService = inject(AXDialogService);
|
|
27
|
+
this.toastService = inject(AXToastService);
|
|
28
|
+
this.translationService = inject(AXTranslationService);
|
|
29
|
+
this.sessionService = inject(AXPSessionService);
|
|
30
|
+
this.userRoleGrantService = inject(AXMUserRoleGrantService);
|
|
31
|
+
}
|
|
32
|
+
async execute(input) {
|
|
33
|
+
const actionInput = resolveEntityActionCommandInput(input);
|
|
34
|
+
const form = await this.openInviteDialog(actionInput);
|
|
35
|
+
if (!form) {
|
|
36
|
+
return { success: true, kind: 'object', data: { outcome: 'cancelled' } };
|
|
37
|
+
}
|
|
38
|
+
const webOrigin = typeof window !== 'undefined' ? window.location.origin : undefined;
|
|
39
|
+
const tenantMembershipInvite = this.allowsMultiApplicationInvite(actionInput);
|
|
40
|
+
const remotePayload = this.toRemotePayload(form, tenantMembershipInvite, webOrigin);
|
|
41
|
+
// Nested server call must skip toast middleware — this command owns UX toasts.
|
|
42
|
+
let result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.InviteUser, remotePayload);
|
|
43
|
+
const payload = result?.data;
|
|
44
|
+
if (result?.success && payload?.userAlreadyExists && !payload.sent) {
|
|
45
|
+
const title = await this.translationService
|
|
46
|
+
.translateAsync('@security-management:users.entities.user.actions.invite.existing-warning-title')
|
|
47
|
+
.catch(() => 'User Already Exists');
|
|
48
|
+
const message = await this.translationService
|
|
49
|
+
.translateAsync('@security-management:users.entities.user.actions.invite.existing-warning-message', {
|
|
50
|
+
params: { email: form.email },
|
|
51
|
+
})
|
|
52
|
+
.catch(() => `A user with email ${form.email} already exists. Send an invitation to join this tenant?`);
|
|
53
|
+
const confirmed = await this.dialogService.confirm(title, message, 'warning', 'horizontal');
|
|
54
|
+
if (!confirmed.result) {
|
|
55
|
+
return { success: true, kind: 'object', data: { outcome: 'cancelled' } };
|
|
56
|
+
}
|
|
57
|
+
result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.InviteUser, {
|
|
58
|
+
...remotePayload,
|
|
59
|
+
confirmExisting: true,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (result?.success) {
|
|
63
|
+
const [toastTitle, toastContent] = await Promise.all([
|
|
64
|
+
this.translationService
|
|
65
|
+
.translateAsync('@security-management:users.entities.user.actions.invite.success.title')
|
|
66
|
+
.catch(() => 'Invitation Sent'),
|
|
67
|
+
this.translationService
|
|
68
|
+
.translateAsync('@security-management:users.entities.user.actions.invite.success.description')
|
|
69
|
+
.catch(() => 'The invitation email was sent.'),
|
|
70
|
+
]);
|
|
71
|
+
this.toastService.show({ color: 'success', title: toastTitle, content: toastContent, timeOut: 3000 });
|
|
72
|
+
return { success: true, kind: 'object', data: result.data };
|
|
73
|
+
}
|
|
74
|
+
const [toastTitle, fallback] = await Promise.all([
|
|
75
|
+
this.translationService
|
|
76
|
+
.translateAsync('@security-management:users.entities.user.actions.invite.error.title')
|
|
77
|
+
.catch(() => 'Invite Failed'),
|
|
78
|
+
this.translationService
|
|
79
|
+
.translateAsync('@security-management:users.entities.user.actions.invite.error.description')
|
|
80
|
+
.catch(() => 'Failed to invite user.'),
|
|
81
|
+
]);
|
|
82
|
+
const toastContent = (typeof result?.message?.text === 'string' && result.message.text) || fallback;
|
|
83
|
+
this.toastService.show({ color: 'danger', title: toastTitle, content: toastContent, timeOut: 4000 });
|
|
84
|
+
// No `message` — outer command toast middleware would duplicate this toast.
|
|
85
|
+
return { success: false };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Multi-app selector only for TM → Tenant Users invite (ADR D-05).
|
|
89
|
+
* Security → Users (even inside TM) stays current-application only.
|
|
90
|
+
*/
|
|
91
|
+
allowsMultiApplicationInvite(actionInput) {
|
|
92
|
+
if (!this.sessionService.isFeatureEnabled(INVITE_MULTI_APPLICATION_FEATURE)) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
const entity = actionInput.entity ?? '';
|
|
96
|
+
const name = actionInput.entityInfo?.name ?? '';
|
|
97
|
+
return entity === TENANT_USER_ENTITY || name === TENANT_USER_ENTITY_NAME;
|
|
98
|
+
}
|
|
99
|
+
toRemotePayload(form, tenantMembershipInvite, webOrigin) {
|
|
100
|
+
const base = {
|
|
101
|
+
email: form.email,
|
|
102
|
+
displayName: form.displayName,
|
|
103
|
+
tenantMembershipInvite,
|
|
104
|
+
webOrigin,
|
|
105
|
+
};
|
|
106
|
+
if (!tenantMembershipInvite) {
|
|
107
|
+
return {
|
|
108
|
+
...base,
|
|
109
|
+
roleIds: form.roleIds,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Same application on multiple rows → one assignment with union of roleIds.
|
|
113
|
+
const assignments = normalizeInviteApplicationRoleAssignments(form.applicationRoleRows);
|
|
114
|
+
const flat = flattenInviteApplicationRoleAssignments(assignments);
|
|
115
|
+
return {
|
|
116
|
+
...base,
|
|
117
|
+
applicationIds: flat.applicationIds,
|
|
118
|
+
roleIds: flat.roleIds.length > 0 ? flat.roleIds : undefined,
|
|
119
|
+
applicationRoleAssignments: assignments,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
async loadEntitledApplicationOptions() {
|
|
123
|
+
const result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.ListTenantEntitledApplications, {});
|
|
124
|
+
if (!result?.success) {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
const payload = result?.data;
|
|
128
|
+
const items = Array.isArray(payload?.items) ? payload.items : [];
|
|
129
|
+
const locale = this.translationService.getActiveLang?.() ?? 'en-US';
|
|
130
|
+
return items
|
|
131
|
+
.map((item) => {
|
|
132
|
+
const id = String(item?.id ?? '').trim();
|
|
133
|
+
if (!id) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const title = resolveMultiLanguageString(item.title, locale).trim() || id;
|
|
137
|
+
return { id, title };
|
|
138
|
+
})
|
|
139
|
+
.filter((row) => row != null);
|
|
140
|
+
}
|
|
141
|
+
async loadTenantUserInviteRoleOptions(applicationId) {
|
|
142
|
+
const result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.ListInviteAssignableRoles, applicationId ? { applicationId } : {});
|
|
143
|
+
if (!result?.success) {
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
const payload = result?.data;
|
|
147
|
+
const items = Array.isArray(payload?.items) ? payload.items : [];
|
|
148
|
+
const locale = this.translationService.getActiveLang?.() ?? 'en-US';
|
|
149
|
+
return items
|
|
150
|
+
.map((item) => {
|
|
151
|
+
const id = String(item?.id ?? '').trim();
|
|
152
|
+
const applicationId = String(item?.applicationId ?? '').trim();
|
|
153
|
+
if (!id || !applicationId) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
const title = resolveMultiLanguageString(item.title, locale).trim() || id;
|
|
157
|
+
return { id, title, applicationId };
|
|
158
|
+
})
|
|
159
|
+
.filter((row) => row != null);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Per-row Application + Roles. Duplicate apps are allowed in the UI; submit merges them
|
|
163
|
+
* (`normalizeInviteApplicationRoleAssignments`). Isolation (do not regress):
|
|
164
|
+
* - Roles reset only on `events.context('>applicationId')` (this row). Never `*applicationId`.
|
|
165
|
+
* - Roles `filter` equal `>applicationId`; titles come from the combo array, not lookup ids.
|
|
166
|
+
* - Do not hide selected apps from other rows (`excludeIds` / `filter` not-in).
|
|
167
|
+
*/
|
|
168
|
+
buildApplicationRoleRepeaterChildren(entitledApps, roleOptions) {
|
|
169
|
+
return [
|
|
170
|
+
{
|
|
171
|
+
type: AXPWidgetsList.Layouts.FlexLayout,
|
|
172
|
+
mode: 'edit',
|
|
173
|
+
options: {
|
|
174
|
+
flexDirection: 'row',
|
|
175
|
+
gap: '12px',
|
|
176
|
+
alignItems: 'flex-end',
|
|
177
|
+
wrap: 'nowrap',
|
|
178
|
+
},
|
|
179
|
+
children: [
|
|
180
|
+
{
|
|
181
|
+
type: AXPWidgetsList.Layouts.FlexItemLayout,
|
|
182
|
+
mode: 'edit',
|
|
183
|
+
options: { grow: '1', shrink: '1', basis: '0' },
|
|
184
|
+
children: [
|
|
185
|
+
{
|
|
186
|
+
type: AXPWidgetsList.Layouts.FormField,
|
|
187
|
+
mode: 'edit',
|
|
188
|
+
options: {
|
|
189
|
+
label: '@security-management:users.entities.user.actions.invite.fields.application',
|
|
190
|
+
showLabel: true,
|
|
191
|
+
},
|
|
192
|
+
children: [
|
|
193
|
+
{
|
|
194
|
+
type: AXPWidgetsList.Editors.SelectBox,
|
|
195
|
+
mode: 'edit',
|
|
196
|
+
path: 'applicationId',
|
|
197
|
+
name: 'applicationId',
|
|
198
|
+
options: {
|
|
199
|
+
dataSource: entitledApps,
|
|
200
|
+
valueField: 'id',
|
|
201
|
+
textField: 'title',
|
|
202
|
+
allowSearch: true,
|
|
203
|
+
validations: [{ rule: 'required' }],
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
type: AXPWidgetsList.Layouts.FlexItemLayout,
|
|
212
|
+
mode: 'edit',
|
|
213
|
+
options: { grow: '1', shrink: '1', basis: '0' },
|
|
214
|
+
children: [
|
|
215
|
+
{
|
|
216
|
+
type: AXPWidgetsList.Layouts.FormField,
|
|
217
|
+
mode: 'edit',
|
|
218
|
+
options: {
|
|
219
|
+
label: '@security-management:users.entities.user.actions.invite.fields.roles',
|
|
220
|
+
showLabel: true,
|
|
221
|
+
},
|
|
222
|
+
children: [
|
|
223
|
+
{
|
|
224
|
+
type: AXPWidgetsList.Editors.SelectBox,
|
|
225
|
+
mode: 'edit',
|
|
226
|
+
path: 'roleIds',
|
|
227
|
+
name: 'roleIds',
|
|
228
|
+
options: {
|
|
229
|
+
dataSource: roleOptions,
|
|
230
|
+
valueField: 'id',
|
|
231
|
+
textField: 'title',
|
|
232
|
+
multiple: true,
|
|
233
|
+
allowSearch: true,
|
|
234
|
+
disabled: "{{ !context.eval('>applicationId') }}",
|
|
235
|
+
filter: {
|
|
236
|
+
field: 'applicationId',
|
|
237
|
+
operator: { type: 'equal' },
|
|
238
|
+
value: "{{ context.eval('>applicationId') }}",
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
triggers: [
|
|
242
|
+
{
|
|
243
|
+
event: "{{ events.context('>applicationId') }}",
|
|
244
|
+
action: '{{ widget.setValue([]); widget.refresh(); }}',
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
},
|
|
252
|
+
],
|
|
253
|
+
},
|
|
254
|
+
];
|
|
255
|
+
}
|
|
256
|
+
async openInviteDialog(actionInput) {
|
|
257
|
+
const multiApp = this.allowsMultiApplicationInvite(actionInput);
|
|
258
|
+
const [entitledApps, inviteRoleOptions, roleOptions] = await Promise.all([
|
|
259
|
+
multiApp ? this.loadEntitledApplicationOptions() : Promise.resolve([]),
|
|
260
|
+
multiApp ? this.loadTenantUserInviteRoleOptions() : Promise.resolve([]),
|
|
261
|
+
multiApp
|
|
262
|
+
? Promise.resolve([])
|
|
263
|
+
: this.userRoleGrantService.listInviteRoleOptions('application'),
|
|
264
|
+
]);
|
|
265
|
+
const appsWithRoles = new Set(inviteRoleOptions.map((row) => row.applicationId));
|
|
266
|
+
const selectableApps = appsWithRoles.size > 0
|
|
267
|
+
? entitledApps.filter((app) => appsWithRoles.has(app.id))
|
|
268
|
+
: entitledApps;
|
|
269
|
+
const result = await this.layoutBuilder
|
|
270
|
+
.create()
|
|
271
|
+
.dialog((dialog) => {
|
|
272
|
+
dialog
|
|
273
|
+
.setTitle('@security-management:users.entities.user.actions.invite.dialog.title')
|
|
274
|
+
.setSize(multiApp ? 'lg' : 'md')
|
|
275
|
+
.setCloseButton(true)
|
|
276
|
+
.setContext(multiApp
|
|
277
|
+
? {
|
|
278
|
+
email: '',
|
|
279
|
+
displayName: '',
|
|
280
|
+
applicationRoleRows: [{ applicationId: '', roleIds: [] }],
|
|
281
|
+
}
|
|
282
|
+
: { email: '', displayName: '', roleIds: [] })
|
|
283
|
+
.content((flex) => {
|
|
284
|
+
flex
|
|
285
|
+
.setDirection('column')
|
|
286
|
+
.setGap('12px')
|
|
287
|
+
.formField('@security-management:users.entities.user.actions.invite.fields.email', (field) => {
|
|
288
|
+
field.path('email');
|
|
289
|
+
field.textBox({ validations: [{ rule: 'required' }, { rule: 'email' }] });
|
|
290
|
+
})
|
|
291
|
+
.formField('@security-management:users.entities.user.actions.invite.fields.display-name', (field) => {
|
|
292
|
+
field.path('displayName');
|
|
293
|
+
field.textBox({});
|
|
294
|
+
});
|
|
295
|
+
// TM Tenant Users: repeater of application + roles for that app (ADR D-05).
|
|
296
|
+
if (multiApp) {
|
|
297
|
+
flex.formField('@security-management:users.entities.user.actions.invite.fields.application-roles', (field) => {
|
|
298
|
+
field.path('applicationRoleRows');
|
|
299
|
+
field.setShowLabel(true);
|
|
300
|
+
field.customWidget(AXPWidgetsList.Layouts.RepeaterLayout, {
|
|
301
|
+
hasControls: true,
|
|
302
|
+
inlineAddControl: true,
|
|
303
|
+
defaultItem: { applicationId: '', roleIds: [] },
|
|
304
|
+
children: this.buildApplicationRoleRepeaterChildren(selectableApps, inviteRoleOptions),
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
flex.formField('@security-management:users.entities.user.actions.invite.fields.roles', (field) => {
|
|
310
|
+
field.path('roleIds');
|
|
311
|
+
field.selectBox({
|
|
312
|
+
dataSource: roleOptions,
|
|
313
|
+
valueField: 'id',
|
|
314
|
+
textField: 'title',
|
|
315
|
+
multiple: true,
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
})
|
|
320
|
+
.setActions((actions) => {
|
|
321
|
+
actions.cancel('@general:actions.cancel.title');
|
|
322
|
+
actions.submit('@security-management:users.entities.user.actions.invite.dialog.submit');
|
|
323
|
+
})
|
|
324
|
+
.onAction(async (dialogRef) => {
|
|
325
|
+
if (dialogRef.action() === 'cancel') {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
const ctx = dialogRef.context();
|
|
329
|
+
const email = (ctx.email ?? '').trim();
|
|
330
|
+
if (!email) {
|
|
331
|
+
throw new Error('@security-management:users.entities.user.actions.invite.errors.email-required');
|
|
332
|
+
}
|
|
333
|
+
if (multiApp) {
|
|
334
|
+
// Duplicate application rows merge; one app with all selected roles is sent.
|
|
335
|
+
const assignments = normalizeInviteApplicationRoleAssignments(ctx.applicationRoleRows);
|
|
336
|
+
if (assignments.length === 0) {
|
|
337
|
+
throw new Error('@security-management:users.entities.user.actions.invite.errors.application-required');
|
|
338
|
+
}
|
|
339
|
+
if (assignments.some((row) => row.roleIds.length === 0)) {
|
|
340
|
+
throw new Error('@security-management:users.entities.user.actions.invite.errors.roles-required');
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
email,
|
|
344
|
+
displayName: (ctx.displayName ?? '').trim() || undefined,
|
|
345
|
+
applicationRoleRows: assignments,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
const roleIds = Array.isArray(ctx.roleIds)
|
|
349
|
+
? [...new Set(ctx.roleIds.map((id) => String(id).trim()).filter(Boolean))]
|
|
350
|
+
: [];
|
|
351
|
+
return {
|
|
352
|
+
email,
|
|
353
|
+
displayName: (ctx.displayName ?? '').trim() || undefined,
|
|
354
|
+
roleIds: roleIds.length > 0 ? roleIds : undefined,
|
|
355
|
+
};
|
|
356
|
+
});
|
|
357
|
+
})
|
|
358
|
+
.show();
|
|
359
|
+
return resolveLayoutBuilderDialogResult(result);
|
|
360
|
+
}
|
|
361
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPInviteUserCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
362
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPInviteUserCommand, providedIn: 'root' }); }
|
|
363
|
+
}
|
|
364
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPInviteUserCommand, decorators: [{
|
|
365
|
+
type: Injectable,
|
|
366
|
+
args: [{ providedIn: 'root' }]
|
|
367
|
+
}] });
|
|
368
|
+
|
|
369
|
+
export { AXPInviteUserCommand };
|
|
370
|
+
//# sourceMappingURL=acorex-platform-module-security-management-client-invite-user.command-ClQ6WxxN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-security-management-client-invite-user.command-ClQ6WxxN.mjs","sources":["../../../../libs/modules/security-management/client/src/lib/commands/invite-user.command.ts"],"sourcesContent":["import { AXDialogService } from '@acorex/components/dialog';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPLayoutBuilderService,\n resolveLayoutBuilderDialogResult,\n} from '@acorex-platform/framework-client/layout/builder';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport type {\n AXPCommand,\n AXPCommandExecuteResultPromise,\n AXPEntityActionCommandInput,\n} from '@acorex-platform/framework-shared/runtime';\nimport { resolveEntityActionCommandInput } from '@acorex-platform/framework-shared/runtime';\nimport {\n AXM_USER_INVITE_COMMAND,\n AXMSecurityManagementServerCommands,\n flattenInviteApplicationRoleAssignments,\n normalizeInviteApplicationRoleAssignments,\n type AXMInviteUserResult,\n type AXMListInviteAssignableRolesResult,\n type AXMListTenantEntitledApplicationsResult,\n} from '@acorex-platform/module-security-management-client/contracts';\nimport { inject, Injectable } from '@angular/core';\nimport { AXMUserRoleGrantService } from '../features/user-roles/user-role-grant.service';\nimport type { UserRoleOption } from '../features/user-roles/user-role-grant.types';\n\n//#region ---- Types ----\n\ninterface InviteApplicationRoleRow {\n id?: string;\n applicationId?: string;\n roleIds?: string[];\n}\n\ninterface InviteFormResult {\n email: string;\n displayName?: string;\n applicationIds?: string[];\n roleIds?: string[];\n applicationRoleRows?: InviteApplicationRoleRow[];\n}\n\ninterface EntitledApplicationOption {\n id: string;\n title: string;\n}\n\ninterface InviteRoleOption {\n id: string;\n title: string;\n applicationId: string;\n}\n\ninterface InviteRemotePayload {\n email: string;\n displayName?: string;\n applicationIds?: string[];\n roleIds?: string[];\n applicationRoleAssignments?: Array<{ applicationId: string; roleIds: string[] }>;\n tenantMembershipInvite: boolean;\n confirmExisting?: boolean;\n webOrigin?: string;\n}\n\n/** TM edition feature — multi-app invite (ADR-TEN-001 D-05). String avoids client↔client package edge. */\nconst INVITE_MULTI_APPLICATION_FEATURE = 'TenantManagement:Feature:InviteMultiApplication';\n\n/** Tenant-wide invite surface only — Application Users (Security.User) stay app-scoped. */\nconst TENANT_USER_ENTITY = 'TenantManagement.TenantUser';\nconst TENANT_USER_ENTITY_NAME = 'TenantUser';\n\n//#endregion\n\n//#region ---- Invite user command ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPInviteUserCommand implements AXPCommand {\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly commandService = inject(AXPCommandService);\n private readonly dialogService = inject(AXDialogService);\n private readonly toastService = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly userRoleGrantService = inject(AXMUserRoleGrantService);\n\n async execute(input?: unknown): AXPCommandExecuteResultPromise {\n const actionInput = resolveEntityActionCommandInput(input);\n const form = await this.openInviteDialog(actionInput);\n if (!form) {\n return { success: true, kind: 'object', data: { outcome: 'cancelled' } };\n }\n\n const webOrigin = typeof window !== 'undefined' ? window.location.origin : undefined;\n const tenantMembershipInvite = this.allowsMultiApplicationInvite(actionInput);\n const remotePayload = this.toRemotePayload(form, tenantMembershipInvite, webOrigin);\n\n // Nested server call must skip toast middleware — this command owns UX toasts.\n let result = await this.commandService.executeRemote(\n AXMSecurityManagementServerCommands.InviteUser,\n remotePayload,\n );\n\n const payload = (result as { data?: AXMInviteUserResult })?.data;\n if (result?.success && payload?.userAlreadyExists && !payload.sent) {\n const title = await this.translationService\n .translateAsync('@security-management:users.entities.user.actions.invite.existing-warning-title')\n .catch(() => 'User Already Exists');\n const message = await this.translationService\n .translateAsync('@security-management:users.entities.user.actions.invite.existing-warning-message', {\n params: { email: form.email },\n })\n .catch(() => `A user with email ${form.email} already exists. Send an invitation to join this tenant?`);\n const confirmed = await this.dialogService.confirm(title, message, 'warning', 'horizontal');\n if (!confirmed.result) {\n return { success: true, kind: 'object', data: { outcome: 'cancelled' } };\n }\n result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.InviteUser, {\n ...remotePayload,\n confirmExisting: true,\n });\n }\n\n if (result?.success) {\n const [toastTitle, toastContent] = await Promise.all([\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.invite.success.title')\n .catch(() => 'Invitation Sent'),\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.invite.success.description')\n .catch(() => 'The invitation email was sent.'),\n ]);\n this.toastService.show({ color: 'success', title: toastTitle, content: toastContent, timeOut: 3000 });\n return { success: true, kind: 'object', data: result.data };\n }\n\n const [toastTitle, fallback] = await Promise.all([\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.invite.error.title')\n .catch(() => 'Invite Failed'),\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.invite.error.description')\n .catch(() => 'Failed to invite user.'),\n ]);\n const toastContent =\n (typeof result?.message?.text === 'string' && result.message.text) || fallback;\n this.toastService.show({ color: 'danger', title: toastTitle, content: toastContent, timeOut: 4000 });\n // No `message` — outer command toast middleware would duplicate this toast.\n return { success: false };\n }\n\n /**\n * Multi-app selector only for TM → Tenant Users invite (ADR D-05).\n * Security → Users (even inside TM) stays current-application only.\n */\n private allowsMultiApplicationInvite(actionInput: AXPEntityActionCommandInput): boolean {\n if (!this.sessionService.isFeatureEnabled(INVITE_MULTI_APPLICATION_FEATURE)) {\n return false;\n }\n const entity = actionInput.entity ?? '';\n const name = actionInput.entityInfo?.name ?? '';\n return entity === TENANT_USER_ENTITY || name === TENANT_USER_ENTITY_NAME;\n }\n\n private toRemotePayload(\n form: InviteFormResult,\n tenantMembershipInvite: boolean,\n webOrigin: string | undefined,\n ): InviteRemotePayload {\n const base: InviteRemotePayload = {\n email: form.email,\n displayName: form.displayName,\n tenantMembershipInvite,\n webOrigin,\n };\n\n if (!tenantMembershipInvite) {\n return {\n ...base,\n roleIds: form.roleIds,\n };\n }\n\n // Same application on multiple rows → one assignment with union of roleIds.\n const assignments = normalizeInviteApplicationRoleAssignments(form.applicationRoleRows);\n const flat = flattenInviteApplicationRoleAssignments(assignments);\n return {\n ...base,\n applicationIds: flat.applicationIds,\n roleIds: flat.roleIds.length > 0 ? flat.roleIds : undefined,\n applicationRoleAssignments: assignments,\n };\n }\n\n private async loadEntitledApplicationOptions(): Promise<EntitledApplicationOption[]> {\n const result = await this.commandService.executeRemote(\n AXMSecurityManagementServerCommands.ListTenantEntitledApplications,\n {},\n );\n if (!result?.success) {\n return [];\n }\n const payload = (result as { data?: AXMListTenantEntitledApplicationsResult })?.data;\n const items = Array.isArray(payload?.items) ? payload.items : [];\n const locale = this.translationService.getActiveLang?.() ?? 'en-US';\n return items\n .map((item) => {\n const id = String(item?.id ?? '').trim();\n if (!id) {\n return null;\n }\n const title =\n resolveMultiLanguageString(item.title as never, locale).trim() || id;\n return { id, title };\n })\n .filter((row): row is EntitledApplicationOption => row != null);\n }\n\n private async loadTenantUserInviteRoleOptions(applicationId?: string): Promise<InviteRoleOption[]> {\n const result = await this.commandService.executeRemote(\n AXMSecurityManagementServerCommands.ListInviteAssignableRoles,\n applicationId ? { applicationId } : {},\n );\n if (!result?.success) {\n return [];\n }\n const payload = (result as { data?: AXMListInviteAssignableRolesResult })?.data;\n const items = Array.isArray(payload?.items) ? payload.items : [];\n const locale = this.translationService.getActiveLang?.() ?? 'en-US';\n return items\n .map((item) => {\n const id = String(item?.id ?? '').trim();\n const applicationId = String(item?.applicationId ?? '').trim();\n if (!id || !applicationId) {\n return null;\n }\n const title =\n resolveMultiLanguageString(item.title as never, locale).trim() || id;\n return { id, title, applicationId };\n })\n .filter((row): row is InviteRoleOption => row != null);\n }\n\n /**\n * Per-row Application + Roles. Duplicate apps are allowed in the UI; submit merges them\n * (`normalizeInviteApplicationRoleAssignments`). Isolation (do not regress):\n * - Roles reset only on `events.context('>applicationId')` (this row). Never `*applicationId`.\n * - Roles `filter` equal `>applicationId`; titles come from the combo array, not lookup ids.\n * - Do not hide selected apps from other rows (`excludeIds` / `filter` not-in).\n */\n private buildApplicationRoleRepeaterChildren(\n entitledApps: EntitledApplicationOption[],\n roleOptions: InviteRoleOption[],\n ): Record<string, unknown>[] {\n return [\n {\n type: AXPWidgetsList.Layouts.FlexLayout,\n mode: 'edit' as const,\n options: {\n flexDirection: 'row',\n gap: '12px',\n alignItems: 'flex-end',\n wrap: 'nowrap',\n },\n children: [\n {\n type: AXPWidgetsList.Layouts.FlexItemLayout,\n mode: 'edit' as const,\n options: { grow: '1', shrink: '1', basis: '0' },\n children: [\n {\n type: AXPWidgetsList.Layouts.FormField,\n mode: 'edit' as const,\n options: {\n label:\n '@security-management:users.entities.user.actions.invite.fields.application',\n showLabel: true,\n },\n children: [\n {\n type: AXPWidgetsList.Editors.SelectBox,\n mode: 'edit' as const,\n path: 'applicationId',\n name: 'applicationId',\n options: {\n dataSource: entitledApps,\n valueField: 'id',\n textField: 'title',\n allowSearch: true,\n validations: [{ rule: 'required' }],\n },\n },\n ],\n },\n ],\n },\n {\n type: AXPWidgetsList.Layouts.FlexItemLayout,\n mode: 'edit' as const,\n options: { grow: '1', shrink: '1', basis: '0' },\n children: [\n {\n type: AXPWidgetsList.Layouts.FormField,\n mode: 'edit' as const,\n options: {\n label: '@security-management:users.entities.user.actions.invite.fields.roles',\n showLabel: true,\n },\n children: [\n {\n type: AXPWidgetsList.Editors.SelectBox,\n mode: 'edit' as const,\n path: 'roleIds',\n name: 'roleIds',\n options: {\n dataSource: roleOptions,\n valueField: 'id',\n textField: 'title',\n multiple: true,\n allowSearch: true,\n disabled: \"{{ !context.eval('>applicationId') }}\",\n filter: {\n field: 'applicationId',\n operator: { type: 'equal' },\n value: \"{{ context.eval('>applicationId') }}\",\n },\n },\n triggers: [\n {\n event: \"{{ events.context('>applicationId') }}\",\n action: '{{ widget.setValue([]); widget.refresh(); }}',\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ];\n }\n\n private async openInviteDialog(\n actionInput: AXPEntityActionCommandInput,\n ): Promise<InviteFormResult | null> {\n const multiApp = this.allowsMultiApplicationInvite(actionInput);\n const [entitledApps, inviteRoleOptions, roleOptions] = await Promise.all([\n multiApp ? this.loadEntitledApplicationOptions() : Promise.resolve([] as EntitledApplicationOption[]),\n multiApp ? this.loadTenantUserInviteRoleOptions() : Promise.resolve([] as InviteRoleOption[]),\n multiApp\n ? Promise.resolve([] as UserRoleOption[])\n : this.userRoleGrantService.listInviteRoleOptions('application'),\n ]);\n const appsWithRoles = new Set(inviteRoleOptions.map((row) => row.applicationId));\n const selectableApps =\n appsWithRoles.size > 0\n ? entitledApps.filter((app) => appsWithRoles.has(app.id))\n : entitledApps;\n\n const result = await this.layoutBuilder\n .create()\n .dialog<InviteFormResult | null>((dialog) => {\n dialog\n .setTitle('@security-management:users.entities.user.actions.invite.dialog.title')\n .setSize(multiApp ? 'lg' : 'md')\n .setCloseButton(true)\n .setContext(\n multiApp\n ? {\n email: '',\n displayName: '',\n applicationRoleRows: [{ applicationId: '', roleIds: [] }],\n }\n : { email: '', displayName: '', roleIds: [] },\n )\n .content((flex) => {\n flex\n .setDirection('column')\n .setGap('12px')\n .formField('@security-management:users.entities.user.actions.invite.fields.email', (field) => {\n field.path('email');\n field.textBox({ validations: [{ rule: 'required' }, { rule: 'email' }] });\n })\n .formField('@security-management:users.entities.user.actions.invite.fields.display-name', (field) => {\n field.path('displayName');\n field.textBox({});\n });\n\n // TM Tenant Users: repeater of application + roles for that app (ADR D-05).\n if (multiApp) {\n flex.formField(\n '@security-management:users.entities.user.actions.invite.fields.application-roles',\n (field) => {\n field.path('applicationRoleRows');\n field.setShowLabel(true);\n field.customWidget(AXPWidgetsList.Layouts.RepeaterLayout, {\n hasControls: true,\n inlineAddControl: true,\n defaultItem: { applicationId: '', roleIds: [] },\n children: this.buildApplicationRoleRepeaterChildren(selectableApps, inviteRoleOptions),\n });\n },\n );\n } else {\n flex.formField(\n '@security-management:users.entities.user.actions.invite.fields.roles',\n (field) => {\n field.path('roleIds');\n field.selectBox({\n dataSource: roleOptions as UserRoleOption[],\n valueField: 'id',\n textField: 'title',\n multiple: true,\n });\n },\n );\n }\n })\n .setActions((actions) => {\n actions.cancel('@general:actions.cancel.title');\n actions.submit('@security-management:users.entities.user.actions.invite.dialog.submit');\n })\n .onAction(async (dialogRef) => {\n if (dialogRef.action() === 'cancel') {\n return null;\n }\n const ctx = dialogRef.context() as InviteFormResult;\n const email = (ctx.email ?? '').trim();\n if (!email) {\n throw new Error('@security-management:users.entities.user.actions.invite.errors.email-required');\n }\n\n if (multiApp) {\n // Duplicate application rows merge; one app with all selected roles is sent.\n const assignments = normalizeInviteApplicationRoleAssignments(ctx.applicationRoleRows);\n if (assignments.length === 0) {\n throw new Error(\n '@security-management:users.entities.user.actions.invite.errors.application-required',\n );\n }\n if (assignments.some((row) => row.roleIds.length === 0)) {\n throw new Error(\n '@security-management:users.entities.user.actions.invite.errors.roles-required',\n );\n }\n return {\n email,\n displayName: (ctx.displayName ?? '').trim() || undefined,\n applicationRoleRows: assignments,\n };\n }\n\n const roleIds = Array.isArray(ctx.roleIds)\n ? [...new Set(ctx.roleIds.map((id) => String(id).trim()).filter(Boolean))]\n : [];\n return {\n email,\n displayName: (ctx.displayName ?? '').trim() || undefined,\n roleIds: roleIds.length > 0 ? roleIds : undefined,\n };\n });\n })\n .show();\n\n return resolveLayoutBuilderDialogResult<InviteFormResult>(result);\n }\n}\n\nexport { AXM_USER_INVITE_COMMAND };\n\n//#endregion\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAmEA;AACA,MAAM,gCAAgC,GAAG,iDAAiD;AAE1F;AACA,MAAM,kBAAkB,GAAG,6BAA6B;AACxD,MAAM,uBAAuB,GAAG,YAAY;AAE5C;AAEA;MAGa,oBAAoB,CAAA;AADjC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC/C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACjD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AA+XxE,IAAA;IA7XC,MAAM,OAAO,CAAC,KAAe,EAAA;AAC3B,QAAA,MAAM,WAAW,GAAG,+BAA+B,CAAC,KAAK,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC;QACrD,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;QAC1E;AAEA,QAAA,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS;QACpF,MAAM,sBAAsB,GAAG,IAAI,CAAC,4BAA4B,CAAC,WAAW,CAAC;AAC7E,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,sBAAsB,EAAE,SAAS,CAAC;;AAGnF,QAAA,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAClD,mCAAmC,CAAC,UAAU,EAC9C,aAAa,CACd;AAED,QAAA,MAAM,OAAO,GAAI,MAAyC,EAAE,IAAI;AAChE,QAAA,IAAI,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AAClE,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC;iBACtB,cAAc,CAAC,gFAAgF;AAC/F,iBAAA,KAAK,CAAC,MAAM,qBAAqB,CAAC;AACrC,YAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;iBACxB,cAAc,CAAC,kFAAkF,EAAE;AAClG,gBAAA,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;aAC9B;iBACA,KAAK,CAAC,MAAM,CAAA,kBAAA,EAAqB,IAAI,CAAC,KAAK,CAAA,wDAAA,CAA0D,CAAC;AACzG,YAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC;AAC3F,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AACrB,gBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;YAC1E;YACA,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,mCAAmC,CAAC,UAAU,EAAE;AAC/F,gBAAA,GAAG,aAAa;AAChB,gBAAA,eAAe,EAAE,IAAI;AACtB,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,MAAM,EAAE,OAAO,EAAE;YACnB,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACnD,gBAAA,IAAI,CAAC;qBACF,cAAc,CAAC,uEAAuE;AACtF,qBAAA,KAAK,CAAC,MAAM,iBAAiB,CAAC;AACjC,gBAAA,IAAI,CAAC;qBACF,cAAc,CAAC,6EAA6E;AAC5F,qBAAA,KAAK,CAAC,MAAM,gCAAgC,CAAC;AACjD,aAAA,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrG,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;QAC7D;QAEA,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AAC/C,YAAA,IAAI,CAAC;iBACF,cAAc,CAAC,qEAAqE;AACpF,iBAAA,KAAK,CAAC,MAAM,eAAe,CAAC;AAC/B,YAAA,IAAI,CAAC;iBACF,cAAc,CAAC,2EAA2E;AAC1F,iBAAA,KAAK,CAAC,MAAM,wBAAwB,CAAC;AACzC,SAAA,CAAC;QACF,MAAM,YAAY,GAChB,CAAC,OAAO,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;QAChF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;AAEpG,QAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;IAC3B;AAEA;;;AAGG;AACK,IAAA,4BAA4B,CAAC,WAAwC,EAAA;QAC3E,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,EAAE;AAC3E,YAAA,OAAO,KAAK;QACd;AACA,QAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE;AAC/C,QAAA,OAAO,MAAM,KAAK,kBAAkB,IAAI,IAAI,KAAK,uBAAuB;IAC1E;AAEQ,IAAA,eAAe,CACrB,IAAsB,EACtB,sBAA+B,EAC/B,SAA6B,EAAA;AAE7B,QAAA,MAAM,IAAI,GAAwB;YAChC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,sBAAsB;YACtB,SAAS;SACV;QAED,IAAI,CAAC,sBAAsB,EAAE;YAC3B,OAAO;AACL,gBAAA,GAAG,IAAI;gBACP,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB;QACH;;QAGA,MAAM,WAAW,GAAG,yCAAyC,CAAC,IAAI,CAAC,mBAAmB,CAAC;AACvF,QAAA,MAAM,IAAI,GAAG,uCAAuC,CAAC,WAAW,CAAC;QACjE,OAAO;AACL,YAAA,GAAG,IAAI;YACP,cAAc,EAAE,IAAI,CAAC,cAAc;AACnC,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS;AAC3D,YAAA,0BAA0B,EAAE,WAAW;SACxC;IACH;AAEQ,IAAA,MAAM,8BAA8B,GAAA;AAC1C,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CACpD,mCAAmC,CAAC,8BAA8B,EAClE,EAAE,CACH;AACD,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;AACpB,YAAA,OAAO,EAAE;QACX;AACA,QAAA,MAAM,OAAO,GAAI,MAA6D,EAAE,IAAI;QACpF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,IAAI,IAAI,OAAO;AACnE,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,CAAC,IAAI,KAAI;AACZ,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACxC,IAAI,CAAC,EAAE,EAAE;AACP,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,MAAM,KAAK,GACT,0BAA0B,CAAC,IAAI,CAAC,KAAc,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE;AACtE,YAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE;AACtB,QAAA,CAAC;aACA,MAAM,CAAC,CAAC,GAAG,KAAuC,GAAG,IAAI,IAAI,CAAC;IACnE;IAEQ,MAAM,+BAA+B,CAAC,aAAsB,EAAA;QAClE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CACpD,mCAAmC,CAAC,yBAAyB,EAC7D,aAAa,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CACvC;AACD,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;AACpB,YAAA,OAAO,EAAE;QACX;AACA,QAAA,MAAM,OAAO,GAAI,MAAwD,EAAE,IAAI;QAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,IAAI,IAAI,OAAO;AACnE,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,CAAC,IAAI,KAAI;AACZ,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AACxC,YAAA,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AAC9D,YAAA,IAAI,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE;AACzB,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,MAAM,KAAK,GACT,0BAA0B,CAAC,IAAI,CAAC,KAAc,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE;AACtE,YAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;AACrC,QAAA,CAAC;aACA,MAAM,CAAC,CAAC,GAAG,KAA8B,GAAG,IAAI,IAAI,CAAC;IAC1D;AAEA;;;;;;AAMG;IACK,oCAAoC,CAC1C,YAAyC,EACzC,WAA+B,EAAA;QAE/B,OAAO;AACL,YAAA;AACE,gBAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,UAAU;AACvC,gBAAA,IAAI,EAAE,MAAe;AACrB,gBAAA,OAAO,EAAE;AACP,oBAAA,aAAa,EAAE,KAAK;AACpB,oBAAA,GAAG,EAAE,MAAM;AACX,oBAAA,UAAU,EAAE,UAAU;AACtB,oBAAA,IAAI,EAAE,QAAQ;AACf,iBAAA;AACD,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,cAAc;AAC3C,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;AAC/C,wBAAA,QAAQ,EAAE;AACR,4BAAA;AACE,gCAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,SAAS;AACtC,gCAAA,IAAI,EAAE,MAAe;AACrB,gCAAA,OAAO,EAAE;AACP,oCAAA,KAAK,EACH,4EAA4E;AAC9E,oCAAA,SAAS,EAAE,IAAI;AAChB,iCAAA;AACD,gCAAA,QAAQ,EAAE;AACR,oCAAA;AACE,wCAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,SAAS;AACtC,wCAAA,IAAI,EAAE,MAAe;AACrB,wCAAA,IAAI,EAAE,eAAe;AACrB,wCAAA,IAAI,EAAE,eAAe;AACrB,wCAAA,OAAO,EAAE;AACP,4CAAA,UAAU,EAAE,YAAY;AACxB,4CAAA,UAAU,EAAE,IAAI;AAChB,4CAAA,SAAS,EAAE,OAAO;AAClB,4CAAA,WAAW,EAAE,IAAI;AACjB,4CAAA,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACpC,yCAAA;AACF,qCAAA;AACF,iCAAA;AACF,6BAAA;AACF,yBAAA;AACF,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,cAAc;AAC3C,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;AAC/C,wBAAA,QAAQ,EAAE;AACR,4BAAA;AACE,gCAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,SAAS;AACtC,gCAAA,IAAI,EAAE,MAAe;AACrB,gCAAA,OAAO,EAAE;AACP,oCAAA,KAAK,EAAE,sEAAsE;AAC7E,oCAAA,SAAS,EAAE,IAAI;AAChB,iCAAA;AACD,gCAAA,QAAQ,EAAE;AACR,oCAAA;AACE,wCAAA,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,SAAS;AACtC,wCAAA,IAAI,EAAE,MAAe;AACrB,wCAAA,IAAI,EAAE,SAAS;AACf,wCAAA,IAAI,EAAE,SAAS;AACf,wCAAA,OAAO,EAAE;AACP,4CAAA,UAAU,EAAE,WAAW;AACvB,4CAAA,UAAU,EAAE,IAAI;AAChB,4CAAA,SAAS,EAAE,OAAO;AAClB,4CAAA,QAAQ,EAAE,IAAI;AACd,4CAAA,WAAW,EAAE,IAAI;AACjB,4CAAA,QAAQ,EAAE,uCAAuC;AACjD,4CAAA,MAAM,EAAE;AACN,gDAAA,KAAK,EAAE,eAAe;AACtB,gDAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,gDAAA,KAAK,EAAE,sCAAsC;AAC9C,6CAAA;AACF,yCAAA;AACD,wCAAA,QAAQ,EAAE;AACR,4CAAA;AACE,gDAAA,KAAK,EAAE,wCAAwC;AAC/C,gDAAA,MAAM,EAAE,8CAA8C;AACvD,6CAAA;AACF,yCAAA;AACF,qCAAA;AACF,iCAAA;AACF,6BAAA;AACF,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF;IACH;IAEQ,MAAM,gBAAgB,CAC5B,WAAwC,EAAA;QAExC,MAAM,QAAQ,GAAG,IAAI,CAAC,4BAA4B,CAAC,WAAW,CAAC;AAC/D,QAAA,MAAM,CAAC,YAAY,EAAE,iBAAiB,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACvE,YAAA,QAAQ,GAAG,IAAI,CAAC,8BAA8B,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,EAAiC,CAAC;AACrG,YAAA,QAAQ,GAAG,IAAI,CAAC,+BAA+B,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,EAAwB,CAAC;YAC7F;AACE,kBAAE,OAAO,CAAC,OAAO,CAAC,EAAsB;kBACtC,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,aAAa,CAAC;AACnE,SAAA,CAAC;AACF,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;AAChF,QAAA,MAAM,cAAc,GAClB,aAAa,CAAC,IAAI,GAAG;AACnB,cAAE,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;cACtD,YAAY;AAElB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;AACvB,aAAA,MAAM;AACN,aAAA,MAAM,CAA0B,CAAC,MAAM,KAAI;YAC1C;iBACG,QAAQ,CAAC,sEAAsE;iBAC/E,OAAO,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI;iBAC9B,cAAc,CAAC,IAAI;AACnB,iBAAA,UAAU,CACT;AACE,kBAAE;AACE,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,WAAW,EAAE,EAAE;oBACf,mBAAmB,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAC1D;AACH,kBAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;AAEhD,iBAAA,OAAO,CAAC,CAAC,IAAI,KAAI;gBAChB;qBACG,YAAY,CAAC,QAAQ;qBACrB,MAAM,CAAC,MAAM;AACb,qBAAA,SAAS,CAAC,sEAAsE,EAAE,CAAC,KAAK,KAAI;AAC3F,oBAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;oBACnB,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC3E,gBAAA,CAAC;AACA,qBAAA,SAAS,CAAC,6EAA6E,EAAE,CAAC,KAAK,KAAI;AAClG,oBAAA,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;AACzB,oBAAA,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AACnB,gBAAA,CAAC,CAAC;;gBAGJ,IAAI,QAAQ,EAAE;oBACZ,IAAI,CAAC,SAAS,CACZ,kFAAkF,EAClF,CAAC,KAAK,KAAI;AACR,wBAAA,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC;AACjC,wBAAA,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;wBACxB,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE;AACxD,4BAAA,WAAW,EAAE,IAAI;AACjB,4BAAA,gBAAgB,EAAE,IAAI;4BACtB,WAAW,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;4BAC/C,QAAQ,EAAE,IAAI,CAAC,oCAAoC,CAAC,cAAc,EAAE,iBAAiB,CAAC;AACvF,yBAAA,CAAC;AACJ,oBAAA,CAAC,CACF;gBACH;qBAAO;oBACL,IAAI,CAAC,SAAS,CACZ,sEAAsE,EACtE,CAAC,KAAK,KAAI;AACR,wBAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;wBACrB,KAAK,CAAC,SAAS,CAAC;AACd,4BAAA,UAAU,EAAE,WAA+B;AAC3C,4BAAA,UAAU,EAAE,IAAI;AAChB,4BAAA,SAAS,EAAE,OAAO;AAClB,4BAAA,QAAQ,EAAE,IAAI;AACf,yBAAA,CAAC;AACJ,oBAAA,CAAC,CACF;gBACH;AACF,YAAA,CAAC;AACA,iBAAA,UAAU,CAAC,CAAC,OAAO,KAAI;AACtB,gBAAA,OAAO,CAAC,MAAM,CAAC,+BAA+B,CAAC;AAC/C,gBAAA,OAAO,CAAC,MAAM,CAAC,uEAAuE,CAAC;AACzF,YAAA,CAAC;AACA,iBAAA,QAAQ,CAAC,OAAO,SAAS,KAAI;AAC5B,gBAAA,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,QAAQ,EAAE;AACnC,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAsB;AACnD,gBAAA,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE;gBACtC,IAAI,CAAC,KAAK,EAAE;AACV,oBAAA,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC;gBAClG;gBAEA,IAAI,QAAQ,EAAE;;oBAEZ,MAAM,WAAW,GAAG,yCAAyC,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACtF,oBAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,wBAAA,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF;oBACH;AACA,oBAAA,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;AACvD,wBAAA,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF;oBACH;oBACA,OAAO;wBACL,KAAK;AACL,wBAAA,WAAW,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,SAAS;AACxD,wBAAA,mBAAmB,EAAE,WAAW;qBACjC;gBACH;gBAEA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;AACvC,sBAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;sBACvE,EAAE;gBACN,OAAO;oBACL,KAAK;AACL,oBAAA,WAAW,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,SAAS;AACxD,oBAAA,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,SAAS;iBAClD;AACH,YAAA,CAAC,CAAC;AACN,QAAA,CAAC;AACA,aAAA,IAAI,EAAE;AAET,QAAA,OAAO,gCAAgC,CAAmB,MAAM,CAAC;IACnE;8GArYW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { AXDialogService } from '@acorex/components/dialog';
|
|
2
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
3
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
4
|
+
import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
|
|
5
|
+
import { AXMSecurityManagementServerCommands, AXM_JOIN_REQUEST_ERROR_CODES } from '@acorex-platform/module-security-management-client/contracts';
|
|
6
|
+
export { AXM_USER_REJECT_JOIN_REQUEST_COMMAND } from '@acorex-platform/module-security-management-client/contracts';
|
|
7
|
+
import * as i0 from '@angular/core';
|
|
8
|
+
import { inject, Injectable } from '@angular/core';
|
|
9
|
+
import { r as resolveInvitationCommandTargets } from './acorex-platform-module-security-management-client-invitation-target.util-BAXQZwLW.mjs';
|
|
10
|
+
|
|
11
|
+
//#region ---- AXPRejectJoinRequestCommand ----
|
|
12
|
+
class AXPRejectJoinRequestCommand {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.dialogService = inject(AXDialogService);
|
|
15
|
+
this.toastService = inject(AXToastService);
|
|
16
|
+
this.translationService = inject(AXTranslationService);
|
|
17
|
+
this.commandService = inject(AXPCommandService);
|
|
18
|
+
}
|
|
19
|
+
async execute(input = {}) {
|
|
20
|
+
const { tenantUserId, userId } = resolveInvitationCommandTargets(input);
|
|
21
|
+
if (!tenantUserId && !userId) {
|
|
22
|
+
return { success: false, message: { text: 'Tenant user id is required.' } };
|
|
23
|
+
}
|
|
24
|
+
const who = input.data?.displayName || input.data?.email || String(tenantUserId || userId);
|
|
25
|
+
const confirmTitle = await this.translationService
|
|
26
|
+
.translateAsync('@security-management:users.entities.user.actions.reject-join-request.confirm-title')
|
|
27
|
+
.catch(() => 'Reject Join Request');
|
|
28
|
+
const confirmMessage = await this.translationService
|
|
29
|
+
.translateAsync('@security-management:users.entities.user.actions.reject-join-request.confirm-message', {
|
|
30
|
+
params: { user: who },
|
|
31
|
+
})
|
|
32
|
+
.catch(() => `Reject the membership request for ${who}?`);
|
|
33
|
+
const confirmed = await this.dialogService.confirm(confirmTitle, confirmMessage, 'danger', 'horizontal');
|
|
34
|
+
if (!confirmed.result) {
|
|
35
|
+
return { success: false };
|
|
36
|
+
}
|
|
37
|
+
const result = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.RejectJoinRequest, { tenantUserId, userId });
|
|
38
|
+
if (result?.success) {
|
|
39
|
+
const [toastTitle, toastContent] = await Promise.all([
|
|
40
|
+
this.translationService
|
|
41
|
+
.translateAsync('@security-management:users.entities.user.actions.reject-join-request.success.title')
|
|
42
|
+
.catch(() => 'Rejected'),
|
|
43
|
+
this.translationService
|
|
44
|
+
.translateAsync('@security-management:users.entities.user.actions.reject-join-request.success.description')
|
|
45
|
+
.catch(() => 'The membership request was rejected.'),
|
|
46
|
+
]);
|
|
47
|
+
this.toastService.show({ color: 'success', title: toastTitle, content: toastContent, timeOut: 3000 });
|
|
48
|
+
return { success: true, kind: 'object', data: undefined };
|
|
49
|
+
}
|
|
50
|
+
const [toastTitle, fallback] = await Promise.all([
|
|
51
|
+
this.translationService
|
|
52
|
+
.translateAsync('@security-management:users.entities.user.actions.reject-join-request.error.title')
|
|
53
|
+
.catch(() => 'Reject Failed'),
|
|
54
|
+
this.translationService
|
|
55
|
+
.translateAsync('@security-management:users.entities.user.actions.reject-join-request.error.description')
|
|
56
|
+
.catch(() => 'Failed to reject the membership request.'),
|
|
57
|
+
]);
|
|
58
|
+
const code = typeof result?.message?.code === 'string' ? result.message.code : '';
|
|
59
|
+
const mapped = code === AXM_JOIN_REQUEST_ERROR_CODES.NotPending
|
|
60
|
+
? await this.translationService
|
|
61
|
+
.translateAsync('@security-management:users.entities.user.actions.reject-join-request.error.not-pending')
|
|
62
|
+
.catch(() => fallback)
|
|
63
|
+
: fallback;
|
|
64
|
+
this.toastService.show({ color: 'danger', title: toastTitle, content: mapped, timeOut: 4000 });
|
|
65
|
+
return { success: false };
|
|
66
|
+
}
|
|
67
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRejectJoinRequestCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
68
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRejectJoinRequestCommand, providedIn: 'root' }); }
|
|
69
|
+
}
|
|
70
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRejectJoinRequestCommand, decorators: [{
|
|
71
|
+
type: Injectable,
|
|
72
|
+
args: [{ providedIn: 'root' }]
|
|
73
|
+
}] });
|
|
74
|
+
|
|
75
|
+
export { AXPRejectJoinRequestCommand };
|
|
76
|
+
//# sourceMappingURL=acorex-platform-module-security-management-client-reject-join-request.command-B3kiok6b.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-security-management-client-reject-join-request.command-B3kiok6b.mjs","sources":["../../../../libs/modules/security-management/client/src/lib/commands/reject-join-request.command.ts"],"sourcesContent":["import { AXDialogService } from '@acorex/components/dialog';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport type { AXPCommand, AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport {\n AXM_JOIN_REQUEST_ERROR_CODES,\n AXM_USER_REJECT_JOIN_REQUEST_COMMAND,\n AXMSecurityManagementServerCommands,\n} from '@acorex-platform/module-security-management-client/contracts';\nimport { inject, Injectable } from '@angular/core';\nimport {\n resolveInvitationCommandTargets,\n type AXPInvitationTargetCommandInput,\n} from './invitation-target.util';\n\nexport { AXM_USER_REJECT_JOIN_REQUEST_COMMAND };\n\n//#region ---- AXPRejectJoinRequestCommand ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXPRejectJoinRequestCommand implements AXPCommand<AXPInvitationTargetCommandInput> {\n private readonly dialogService = inject(AXDialogService);\n private readonly toastService = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n private readonly commandService = inject(AXPCommandService);\n\n async execute(input: AXPInvitationTargetCommandInput = {}): AXPCommandExecuteResultPromise {\n const { tenantUserId, userId } = resolveInvitationCommandTargets(input);\n if (!tenantUserId && !userId) {\n return { success: false, message: { text: 'Tenant user id is required.' } };\n }\n\n const who = input.data?.displayName || input.data?.email || String(tenantUserId || userId);\n const confirmTitle = await this.translationService\n .translateAsync('@security-management:users.entities.user.actions.reject-join-request.confirm-title')\n .catch(() => 'Reject Join Request');\n const confirmMessage = await this.translationService\n .translateAsync('@security-management:users.entities.user.actions.reject-join-request.confirm-message', {\n params: { user: who },\n })\n .catch(() => `Reject the membership request for ${who}?`);\n\n const confirmed = await this.dialogService.confirm(confirmTitle, confirmMessage, 'danger', 'horizontal');\n if (!confirmed.result) {\n return { success: false };\n }\n\n const result = await this.commandService.executeRemote(\n AXMSecurityManagementServerCommands.RejectJoinRequest,\n { tenantUserId, userId },\n );\n\n if (result?.success) {\n const [toastTitle, toastContent] = await Promise.all([\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.reject-join-request.success.title')\n .catch(() => 'Rejected'),\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.reject-join-request.success.description')\n .catch(() => 'The membership request was rejected.'),\n ]);\n this.toastService.show({ color: 'success', title: toastTitle, content: toastContent, timeOut: 3000 });\n return { success: true, kind: 'object', data: undefined };\n }\n\n const [toastTitle, fallback] = await Promise.all([\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.reject-join-request.error.title')\n .catch(() => 'Reject Failed'),\n this.translationService\n .translateAsync('@security-management:users.entities.user.actions.reject-join-request.error.description')\n .catch(() => 'Failed to reject the membership request.'),\n ]);\n const code = typeof result?.message?.code === 'string' ? result.message.code : '';\n const mapped =\n code === AXM_JOIN_REQUEST_ERROR_CODES.NotPending\n ? await this.translationService\n .translateAsync('@security-management:users.entities.user.actions.reject-join-request.error.not-pending')\n .catch(() => fallback)\n : fallback;\n this.toastService.show({ color: 'danger', title: toastTitle, content: mapped, timeOut: 4000 });\n return { success: false };\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
|
|
@@ -33,13 +33,18 @@ class AXPResetTwoFactorCommand {
|
|
|
33
33
|
//#endregion
|
|
34
34
|
//#region ----- Command -----
|
|
35
35
|
async execute(input = {}) {
|
|
36
|
-
|
|
36
|
+
// Users row: data.id is User id. TenantUser row: data.userId is User id.
|
|
37
|
+
const userId = input.userId ?? input.data?.userId ?? input.data?.id;
|
|
37
38
|
if (!userId) {
|
|
38
39
|
return { success: false, message: { text: `${I18N}.errors.invalid-input` } };
|
|
39
40
|
}
|
|
41
|
+
const nested = input.data?.user;
|
|
40
42
|
const who = input.data?.displayName ||
|
|
43
|
+
nested?.displayName ||
|
|
41
44
|
input.data?.username ||
|
|
45
|
+
nested?.username ||
|
|
42
46
|
input.data?.email ||
|
|
47
|
+
nested?.email ||
|
|
43
48
|
String(userId);
|
|
44
49
|
// Preflight: stop before confirm when 2FA was never enabled for this user.
|
|
45
50
|
const preflight = await this.commandService.executeRemote(AXMSecurityManagementServerCommands.AdminResetTwoFactor, { userId: String(userId), dryRun: true });
|
|
@@ -93,4 +98,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
93
98
|
}] });
|
|
94
99
|
|
|
95
100
|
export { AXPResetTwoFactorCommand };
|
|
96
|
-
//# sourceMappingURL=acorex-platform-module-security-management-client-reset-two-factor.command-
|
|
101
|
+
//# sourceMappingURL=acorex-platform-module-security-management-client-reset-two-factor.command-C27mUZ1-.mjs.map
|