Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
membership-panel.component.ts 7.32 KiB
Newer Older
import {Component, Input, ViewChild,} from '@angular/core';
import {DomainRo} from "../../model/domain-ro.model";
import {AdminDomainService} from "../../../system-settings/admin-domain/admin-domain.service";
import {AlertMessageService} from "../../alert-message/alert-message.service";
import {MatDialog} from "@angular/material/dialog";
import {BeforeLeaveGuard} from "../../../window/sidenav/navigation-on-leave-guard";
import {MatPaginator, PageEvent} from "@angular/material/paginator";
import {MemberRo} from "../../model/member-ro.model";
import {finalize} from "rxjs/operators";
import {TableResult} from "../../model/table-result.model";
import {MemberDialogComponent} from "../../dialogs/member-dialog/member-dialog.component";
import {MembershipService} from "./membership.service";
import {MembershipRoleEnum} from "../../enums/membership-role.enum";
import {MemberTypeEnum} from "../../enums/member-type.enum";
import {GroupRo} from "../../model/group-ro.model";
import {Observable} from "rxjs";
import {SearchTableResult} from "../../search-table/search-table-result.model";
import {ConfirmationDialogComponent} from "../../dialogs/confirmation-dialog/confirmation-dialog.component";
import {ResourceRo} from "../../model/resource-ro.model";


@Component({
  selector: 'domain-member-panel',
  templateUrl: './membership-panel.component.html',
  styleUrls: ['./membership-panel.component.scss']
})
export class MembershipPanelComponent implements BeforeLeaveGuard {

  @Input() membershipType: MemberTypeEnum = MemberTypeEnum.DOMAIN;

  private _domain: DomainRo;
  private _group: GroupRo;
  private _resource: ResourceRo;


  displayedColumns: string[] = ['username', 'fullName', 'roleType', 'memberOf'];
  data: MemberRo[] = [];
  selectedMember: MemberRo;
  filter: any = {};
  resultsLength = 0;
  isLoadingResults = false;
  @ViewChild(MatPaginator) paginator: MatPaginator;

  constructor(private domainService: AdminDomainService,
              private membershipService: MembershipService,
              private alertService: AlertMessageService,
              private dialog: MatDialog) {


  }

  ngAfterViewInit() {
    this.loadMembershipData();
  }

  get title() {
    switch (this.membershipType) {
      case MemberTypeEnum.DOMAIN:

        return "Direct Domain members" + (!!this._domain ? ": [" + this._domain.domainCode + "]" : "")
      case MemberTypeEnum.GROUP:
        return "Direct Group members" + (!!this._group ? ": [" + this._group.groupName + "]" : "")
      case MemberTypeEnum.RESOURCE:
        return "Resource direct members"
    }
  }

  get domain(): DomainRo {
    return this._domain;
  }

  @Input() set domain(value: DomainRo) {
    this._domain = value;

    if (!!value) {
      if (this.membershipType == MemberTypeEnum.DOMAIN) {
        this.loadMembershipData();
      }
    } else {
      this.isLoadingResults = false;
    }
  }

  get group(): GroupRo {
    return this._group;
  }

  @Input() set group(value: GroupRo) {
    this._group = value;

    if (!!value) {
      if (this.membershipType == MemberTypeEnum.GROUP) {
        this.loadMembershipData();
      }
    } else {
      this.isLoadingResults = false;
    }
  }
  get resource(): ResourceRo {
    return this._resource;
  }

  @Input() set resource(value: ResourceRo) {
    this._resource = value;
    if (!!value) {
      if (this.membershipType == MemberTypeEnum.RESOURCE) {
        this.loadMembershipData();
      }
    } else {
      this.isLoadingResults = false;
    }
  }

  onPageChanged(page: PageEvent) {
    this.loadMembershipData();
  }

  public loadMembershipData() {

    let membershipService: Observable<SearchTableResult> = this.getMembershipListService();
    if (!membershipService) {
      return;
    }
    this.isLoadingResults = true;
    membershipService
      .pipe(
        finalize(() => {
          this.isLoadingResults = false;
        }))
      .subscribe((result: TableResult<MemberRo>) => {
          this.data = [...result.serviceEntities];
          this.resultsLength = result.count;
          this.isLoadingResults = false;
        }
      );
  }

  applyMemberFilter(event: Event) {
    const filterValue = (event.target as HTMLInputElement).value;
    this.filter["filter"] = filterValue.trim().toLowerCase();
    this.refresh();
  }

  get inviteMemberDisabled(): boolean {
    return !this._domain && !this._group;
  }

  public memberSelected(member: MemberRo) {
    this.selectedMember = member;
  }

  public onAddMemberButtonClicked() {
    this.showEditDialogForMember(this.createMember())
  }

  public refresh() {
    if (this.paginator) {
      this.paginator.firstPage();
    }
    this.loadMembershipData();
  }

  public createMember(): MemberRo {
    return {
      memberOf: this.membershipType,
      roleType: MembershipRoleEnum.VIEWER
    } as MemberRo
  }

  public onEditSelectedButtonClicked() {
    this.showEditDialogForMember(this.selectedMember);
  }

  public showEditDialogForMember(member: MemberRo) {
    this.dialog.open(MemberDialogComponent, {
      data: {
        membershipType: this.membershipType,
        domain: this._domain,
        group: this._group,
        resource: this._resource,
        member: member,
      }
    }).afterClosed().subscribe(value => {
      this.refresh();
    });
  }

  public onDeleteSelectedButtonClicked() {


    this.dialog.open(ConfirmationDialogComponent, {
      data: {
        title: "Remove member",
        description: "Action will remove member  [" + this.selectedMember.username + "]! " +
          "Do you wish to continue?"
    }).afterClosed().subscribe(result => {
      if (result) {
        this.getDeleteMembershipService().subscribe(value => {
            this.refresh();
          }, (error) => {
            this.alertService.error(error.error?.errorDescription);
          }
        );
      }
    });
  }

  isDirty(): boolean {
    return false
  }

  get entityNotSelected() {
    switch (this.membershipType) {
      case MemberTypeEnum.DOMAIN:
        return !this._domain;
      case MemberTypeEnum.GROUP:
        return !this._group;
      case MemberTypeEnum.RESOURCE:
        return !this._resource;
    }
  }

  protected getMembershipListService(): Observable<SearchTableResult> {
    switch (this.membershipType) {
      case MemberTypeEnum.DOMAIN:
        return this.membershipService.getDomainMembersObservable(this._domain.domainId, this.filter, this.paginator.pageIndex, this.paginator.pageSize);
      case MemberTypeEnum.GROUP:
        return this.membershipService.getGroupMembersObservable(this._group.groupId, this._domain.domainId, this.filter, this.paginator.pageIndex, this.paginator.pageSize);
      case MemberTypeEnum.RESOURCE:
        return this.membershipService.getResourceMembersObservable(this._resource, this._group, this._domain, this.filter, this.paginator.pageIndex, this.paginator.pageSize);

    }
  }

  protected getDeleteMembershipService(): Observable<MemberRo> {
    switch (this.membershipType) {
      case MemberTypeEnum.DOMAIN:
        return this.membershipService.deleteMemberFromDomain(this._domain.domainId, this.selectedMember);
      case MemberTypeEnum.GROUP:
        return this.membershipService.deleteMemberFromGroup(this._group.groupId, this._domain.domainId, this.selectedMember);
      case MemberTypeEnum.RESOURCE:
        return this.membershipService.deleteMemberFromResource(this._resource, this._group, this._domain, this.selectedMember);