mirror of
https://github.com/zitadel/zitadel.git
synced 2025-12-05 18:12:07 +00:00
* routes, move grid to list comopnent * rename app list component, move to project sub * add owned-project-detail child module * seperate pipes * set password validators only if needed * create org initialize without pwd * no caps * self xss message * fix user table * fix project member paginator * fix project members pagination, user grant pag * move project grants, fix imports * fix owned project detail imports * use pipe and directives * ng content bindings, rem custom schemas * i18n, fix error toast parameter * toast i18n * side background * fix: sequence, add timestamp * audit * fix metanav background * org domain label * cleanup policy component * shorten user grant roles, mk cols visible as bind * move user components, show otp only if available * preload modules * fix password change * fix org create buttons * class css
109 lines
4.0 KiB
TypeScript
109 lines
4.0 KiB
TypeScript
import { SelectionModel } from '@angular/cdk/collections';
|
|
import { AfterViewInit, Component, ViewChild } from '@angular/core';
|
|
import { MatDialog } from '@angular/material/dialog';
|
|
import { MatPaginator } from '@angular/material/paginator';
|
|
import { MatTable } from '@angular/material/table';
|
|
import { tap } from 'rxjs/operators';
|
|
import { CreationType, MemberCreateDialogComponent } from 'src/app/modules/add-member-dialog/member-create-dialog.component';
|
|
import { ProjectMember, ProjectType, User } from 'src/app/proto/generated/management_pb';
|
|
import { AdminService } from 'src/app/services/admin.service';
|
|
import { ToastService } from 'src/app/services/toast.service';
|
|
|
|
import { IamMembersDataSource } from './iam-members-datasource';
|
|
|
|
@Component({
|
|
selector: 'app-iam-members',
|
|
templateUrl: './iam-members.component.html',
|
|
styleUrls: ['./iam-members.component.scss'],
|
|
})
|
|
export class IamMembersComponent implements AfterViewInit {
|
|
public projectType: ProjectType = ProjectType.PROJECTTYPE_OWNED;
|
|
public disabled: boolean = false;
|
|
@ViewChild(MatPaginator) public paginator!: MatPaginator;
|
|
@ViewChild(MatTable) public table!: MatTable<ProjectMember.AsObject>;
|
|
public dataSource!: IamMembersDataSource;
|
|
public selection: SelectionModel<ProjectMember.AsObject> = new SelectionModel<ProjectMember.AsObject>(true, []);
|
|
|
|
/** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */
|
|
public displayedColumns: string[] = ['select', 'firstname', 'lastname', 'username', 'email', 'roles'];
|
|
|
|
constructor(private adminService: AdminService,
|
|
private dialog: MatDialog,
|
|
private toast: ToastService) {
|
|
|
|
this.dataSource = new IamMembersDataSource(this.adminService);
|
|
this.dataSource.loadMembers(0, 25, 'asc');
|
|
}
|
|
|
|
public ngAfterViewInit(): void {
|
|
this.paginator.page
|
|
.pipe(
|
|
tap(() => this.loadMembersPage()),
|
|
)
|
|
.subscribe();
|
|
}
|
|
|
|
private loadMembersPage(): void {
|
|
this.dataSource.loadMembers(
|
|
this.paginator.pageIndex,
|
|
this.paginator.pageSize,
|
|
);
|
|
}
|
|
|
|
public removeProjectMemberSelection(): void {
|
|
Promise.all(this.selection.selected.map(member => {
|
|
return this.adminService.RemoveIamMember(member.userId).then(() => {
|
|
this.toast.showInfo('IAM.TOAST.MEMBERREMOVED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
}));
|
|
}
|
|
|
|
public removeMember(member: ProjectMember.AsObject): void {
|
|
this.adminService.RemoveIamMember(member.userId).then(() => {
|
|
this.toast.showInfo('IAM.TOAST.MEMBERREMOVED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
}
|
|
|
|
public isAllSelected(): boolean {
|
|
const numSelected = this.selection.selected.length;
|
|
const numRows = this.dataSource.membersSubject.value.length;
|
|
return numSelected === numRows;
|
|
}
|
|
|
|
public masterToggle(): void {
|
|
this.isAllSelected() ?
|
|
this.selection.clear() :
|
|
this.dataSource.membersSubject.value.forEach(row => this.selection.select(row));
|
|
}
|
|
|
|
public openAddMember(): void {
|
|
const dialogRef = this.dialog.open(MemberCreateDialogComponent, {
|
|
data: {
|
|
creationType: CreationType.ORG,
|
|
},
|
|
width: '400px',
|
|
});
|
|
|
|
dialogRef.afterClosed().subscribe(resp => {
|
|
if (resp) {
|
|
const users: User.AsObject[] = resp.users;
|
|
const roles: string[] = resp.roles;
|
|
|
|
if (users && users.length && roles && roles.length) {
|
|
Promise.all(users.map(user => {
|
|
return this.adminService.AddIamMember(user.id, roles);
|
|
})).then(() => {
|
|
this.toast.showInfo('IAM.TOAST.MEMBERADDED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|