{"version":3,"file":"c8y-ngx-components-application-access-user-application-access-user-details-wrapper.mjs","sources":["../../application-access/user/application-access-user-details-wrapper/application-access-user-details-wrapper.component.ts","../../application-access/user/application-access-user-details-wrapper/application-access-user-details-wrapper.component.html","../../application-access/user/application-access-user-details-wrapper/c8y-ngx-components-application-access-user-application-access-user-details-wrapper.ts"],"sourcesContent":["import { Component, computed, inject, OnDestroy, OnInit, signal } from '@angular/core';\nimport { FormBuilder, ReactiveFormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IUser, UserService } from '@c8y/client';\nimport {\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  ContextRouteService,\n  Permissions,\n  LoadingComponent,\n  AlertService,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent\n} from '@c8y/ngx-components';\nimport { ApplicationAccessListComponent } from '@c8y/ngx-components/application-access/list';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Component({\n  selector: 'c8y-application-access-user-details-wrapper',\n  templateUrl: './application-access-user-details-wrapper.component.html',\n  imports: [\n    C8yTranslatePipe,\n    C8yTranslateDirective,\n    ApplicationAccessListComponent,\n    ReactiveFormsModule,\n    LoadingComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent\n  ]\n})\nexport class ApplicationAccessUserDetailsWrapperComponent implements OnInit, OnDestroy {\n  userWithOwner = signal<{ user: IUser; owner: IUser | null } | null>(null);\n  hasAppManagement = computed(() => {\n    const userWithOwner = this.userWithOwner();\n    if (!userWithOwner) {\n      return false;\n    }\n    return this.hasApplicationManagementRoles(userWithOwner.user);\n  });\n  formGroup: ReturnType<typeof this.initForm>;\n  private contextService = inject(ContextRouteService);\n  private activatedRoute = inject(ActivatedRoute);\n  private userService = inject(UserService);\n  private formBuilder = inject(FormBuilder);\n  private alertService = inject(AlertService);\n  private router = inject(Router);\n\n  async ngOnInit(): Promise<void> {\n    const data = this.contextService.getContextData(this.activatedRoute);\n    let user = data.contextData as IUser;\n\n    const { data: refreshedUser } = await this.userService.detail(user.id);\n    user = refreshedUser;\n    let owner: IUser | null = null;\n    if (user.owner) {\n      try {\n        const ownerResponse = await this.userService.detail(user.owner);\n        owner = ownerResponse.data;\n      } catch (e) {\n        // proceed without owner\n      }\n    }\n\n    this.userWithOwner.set({ user, owner });\n\n    this.formGroup = this.initForm(user);\n  }\n\n  initForm(user: IUser) {\n    const currentApplicationOfUser = user.applications || [];\n    const form = this.formBuilder.group({\n      applications: [currentApplicationOfUser]\n    });\n\n    const hasApplicationManagementRoles = this.hasApplicationManagementRoles(user);\n    const isExternalUser = this.userService.isExternalUser(user);\n    if (hasApplicationManagementRoles || isExternalUser) {\n      form.controls.applications.disable();\n    }\n    if (isExternalUser) {\n      this.alertService.warning(\n        gettext('You cannot edit the user since it is managed via your authorization server.')\n      );\n    }\n\n    return form;\n  }\n\n  async save() {\n    const user = this.userWithOwner().user;\n    const applications = this.formGroup.value.applications.map(app => ({\n      id: app.id,\n      type: app.type\n    }));\n    try {\n      await this.userService.update({\n        id: user.id,\n        applications: applications\n      });\n      this.alertService.success(gettext(\"User's application access changed.\"));\n      this.formGroup.markAsPristine();\n    } catch (e) {\n      this.alertService.danger(gettext(\"Failed to update user's application access.\"), e);\n    }\n  }\n\n  cancel() {\n    this.router.navigate(['users']);\n  }\n\n  ngOnDestroy(): void {\n    // remove SSO related alert once navigating away\n    this.alertService.clearAll();\n  }\n\n  private hasApplicationManagementRoles(user: IUser): boolean {\n    return this.userService.hasAnyRole(user, [\n      Permissions.ROLE_APPLICATION_MANAGEMENT_ADMIN,\n      Permissions.ROLE_APPLICATION_MANAGEMENT_READ\n    ]);\n  }\n}\n","<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'c8y-accounts'\"\n    [label]=\"'Accounts' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'c8y-accounts'\"\n    path=\"#users\"\n    [label]=\"'Users' | translate\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"row\">\n  <div class=\"col-md-8\">\n    <div class=\"card card--fullpage\">\n      <div class=\"card-header separator\">\n        <div class=\"card-title\">\n          {{ 'Application access' | translate }}\n        </div>\n      </div>\n      <div class=\"inner-scroll\">\n        <div class=\"card-block\">\n          @if (formGroup) {\n            <form [formGroup]=\"formGroup\">\n              @if (hasAppManagement()) {\n                <div\n                  class=\"alert alert-info\"\n                  translate\n                >\n                  This user is assigned a global role with \"Application management\" permission.\n                  Therefore all applications are accessible.\n                </div>\n              }\n              <c8y-application-access-list\n                formControlName=\"applications\"\n                [userWithOwner]=\"userWithOwner()\"\n                [allSelected]=\"hasAppManagement()\"\n              ></c8y-application-access-list>\n            </form>\n          } @else {\n            <c8y-loading></c8y-loading>\n          }\n        </div>\n      </div>\n      <div class=\"card-footer separator\">\n        <button\n          class=\"btn btn-default\"\n          [title]=\"'Cancel' | translate\"\n          type=\"button\"\n          (click)=\"cancel()\"\n        >\n          {{ 'Cancel' | translate }}\n        </button>\n        <button\n          class=\"btn btn-primary\"\n          [title]=\"'Save' | translate\"\n          type=\"button\"\n          (click)=\"save()\"\n          [disabled]=\"hasAppManagement() || formGroup?.invalid || formGroup?.pristine\"\n        >\n          {{ 'Save' | translate }}\n        </button>\n      </div>\n    </div>\n  </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}