mirror of
https://github.com/zitadel/zitadel.git
synced 2025-10-20 18:49:04 +00:00

* fix: remove user.write guard for filtering * border color * fix user routing from member tables * idp detail layout * generic contact component * fix redirect to auth user, user grant disable * disable policy action without permission, i18n * user-create flex fix, contact ng-content * rm unused styles * sidenav divider * lint * chore(deps-dev): bump @angular/cli from 10.1.3 to 10.1.4 in /console (#806) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps-dev): bump @angular/cli from 10.1.3 to 10.1.4 in /console Bumps [@angular/cli](https://github.com/angular/angular-cli) from 10.1.3 to 10.1.4. - [Release notes](https://github.com/angular/angular-cli/releases) - [Commits](https://github.com/angular/angular-cli/compare/v10.1.3...v10.1.4) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster <florian@caos.ch> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @angular/language-service from 10.1.3 to 10.1.4 in /console (#805) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps-dev): bump @angular/language-service in /console Bumps [@angular/language-service](https://github.com/angular/angular/tree/HEAD/packages/language-service) from 10.1.3 to 10.1.4. - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/10.1.4/packages/language-service) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster <florian@caos.ch> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump codelyzer from 6.0.0 to 6.0.1 in /console (#804) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps-dev): bump codelyzer from 6.0.0 to 6.0.1 in /console Bumps [codelyzer](https://github.com/mgechev/codelyzer) from 6.0.0 to 6.0.1. - [Release notes](https://github.com/mgechev/codelyzer/releases) - [Changelog](https://github.com/mgechev/codelyzer/blob/master/CHANGELOG.md) - [Commits](https://github.com/mgechev/codelyzer/commits/6.0.1) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster <florian@caos.ch> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @angular-devkit/build-angular from 0.1000.8 to 0.1001.4 in /console (#803) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps-dev): bump @angular-devkit/build-angular in /console Bumps [@angular-devkit/build-angular](https://github.com/angular/angular-cli) from 0.1000.8 to 0.1001.4. - [Release notes](https://github.com/angular/angular-cli/releases) - [Commits](https://github.com/angular/angular-cli/commits) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster <florian@caos.ch> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Max Peintner <max@caos.ch> * chore(deps): bump uuid from 8.3.0 to 8.3.1 in /console (#802) * fix: user session with external login (#797) * fix: user session with external login * fix: tests * fix: tests * fix: change idp config name * fix(container): stop copying / and instead only copy zitadel (#691) * chore: stop copying / and instead only copy zitadel * Update Dockerfile * Update release.yml * enable anchors debug * fix(container): don't copy alpine content into scratch execpt pwd * chore: remove need step * merge master * chore(deps): bump uuid from 8.3.0 to 8.3.1 in /console Bumps [uuid](https://github.com/uuidjs/uuid) from 8.3.0 to 8.3.1. - [Release notes](https://github.com/uuidjs/uuid/releases) - [Changelog](https://github.com/uuidjs/uuid/blob/master/CHANGELOG.md) - [Commits](https://github.com/uuidjs/uuid/compare/v8.3.0...v8.3.1) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster <florian@caos.ch> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * create memberstable as common component * iam member cleanup * iam + org m table, user table service user avatar * toast config * fix selection emitter * fix project grant table width * project grant members refactor * theme optimizations * member table col delete * lint * fix table row color * refactor grey color * lint scss * org list redirect on click, fix user table undef * refresh table after grant add Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Fabi <38692350+fgerschwiler@users.noreply.github.com> Co-authored-by: Florian Forster <florian@caos.ch>
212 lines
9.2 KiB
TypeScript
212 lines
9.2 KiB
TypeScript
import { Component, EventEmitter } from '@angular/core';
|
|
import { MatDialog } from '@angular/material/dialog';
|
|
import { PageEvent } from '@angular/material/paginator';
|
|
import { MatSelectChange } from '@angular/material/select';
|
|
import { ActivatedRoute } from '@angular/router';
|
|
import { take } from 'rxjs/operators';
|
|
import {
|
|
ProjectGrantMemberView,
|
|
ProjectGrantView,
|
|
ProjectMember,
|
|
ProjectMemberView,
|
|
ProjectType,
|
|
ProjectView,
|
|
UserView,
|
|
} from 'src/app/proto/generated/management_pb';
|
|
import { ManagementService } from 'src/app/services/mgmt.service';
|
|
import { ToastService } from 'src/app/services/toast.service';
|
|
|
|
import { CreationType, MemberCreateDialogComponent } from '../add-member-dialog/member-create-dialog.component';
|
|
import { ProjectMembersDataSource } from './project-members-datasource';
|
|
|
|
|
|
@Component({
|
|
selector: 'app-project-members',
|
|
templateUrl: './project-members.component.html',
|
|
styleUrls: ['./project-members.component.scss'],
|
|
})
|
|
export class ProjectMembersComponent {
|
|
public INITIALPAGESIZE: number = 25;
|
|
public project!: ProjectView.AsObject | ProjectGrantView.AsObject;
|
|
public projectType: ProjectType = ProjectType.PROJECTTYPE_OWNED;
|
|
public grantId: string = '';
|
|
public projectName: string = '';
|
|
public dataSource!: ProjectMembersDataSource;
|
|
public memberRoleOptions: string[] = [];
|
|
|
|
public changePageFactory!: Function;
|
|
public changePage: EventEmitter<void> = new EventEmitter();
|
|
public selection: Array<ProjectMemberView.AsObject | ProjectGrantMemberView.AsObject> = [];
|
|
constructor(
|
|
private mgmtService: ManagementService,
|
|
private dialog: MatDialog,
|
|
private toast: ToastService,
|
|
private route: ActivatedRoute) {
|
|
this.route.data.pipe(take(1)).subscribe(data => {
|
|
this.projectType = data.type;
|
|
|
|
this.getRoleOptions();
|
|
|
|
this.route.params.subscribe(params => {
|
|
this.grantId = params.grantid;
|
|
if (this.projectType === ProjectType.PROJECTTYPE_OWNED) {
|
|
this.mgmtService.GetProjectById(params.projectid).then(project => {
|
|
this.project = project.toObject();
|
|
this.projectName = this.project.name;
|
|
this.dataSource = new ProjectMembersDataSource(this.mgmtService);
|
|
this.dataSource.loadMembers(this.project.projectId, this.projectType, 0, this.INITIALPAGESIZE);
|
|
|
|
this.changePageFactory = (event?: PageEvent) => {
|
|
return this.dataSource.loadMembers(
|
|
this.project.projectId,
|
|
this.projectType,
|
|
event?.pageIndex ?? 0,
|
|
event?.pageSize ?? this.INITIALPAGESIZE,
|
|
this.grantId,
|
|
);
|
|
};
|
|
});
|
|
} else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) {
|
|
this.mgmtService.GetGrantedProjectByID(params.projectid, params.grantid).then(project => {
|
|
this.project = project.toObject();
|
|
this.projectName = this.project.projectName;
|
|
this.dataSource = new ProjectMembersDataSource(this.mgmtService);
|
|
this.dataSource.loadMembers(this.project.projectId,
|
|
this.projectType,
|
|
0,
|
|
this.INITIALPAGESIZE,
|
|
this.grantId,
|
|
);
|
|
|
|
this.changePageFactory = (event?: PageEvent) => {
|
|
return this.dataSource.loadMembers(
|
|
this.project.projectId,
|
|
this.projectType,
|
|
event?.pageIndex ?? 0,
|
|
event?.pageSize ?? this.INITIALPAGESIZE,
|
|
this.grantId,
|
|
);
|
|
};
|
|
});
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
public getRoleOptions(): void {
|
|
if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) {
|
|
this.mgmtService.GetProjectGrantMemberRoles().then(resp => {
|
|
this.memberRoleOptions = resp.toObject().rolesList;
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
} else if (this.projectType === ProjectType.PROJECTTYPE_OWNED) {
|
|
this.mgmtService.GetProjectMemberRoles().then(resp => {
|
|
this.memberRoleOptions = resp.toObject().rolesList;
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
}
|
|
}
|
|
|
|
public removeProjectMemberSelection(): void {
|
|
Promise.all(this.selection.map(member => {
|
|
if (this.projectType === ProjectType.PROJECTTYPE_OWNED) {
|
|
return this.mgmtService.RemoveProjectMember(this.project.projectId, member.userId).then(() => {
|
|
this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
} else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) {
|
|
return this.mgmtService.RemoveProjectGrantMember(this.project.projectId, this.grantId,
|
|
member.userId).then(() => {
|
|
this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
}
|
|
})).then(() => {
|
|
setTimeout(() => {
|
|
this.changePage.emit();
|
|
}, 1000);
|
|
});
|
|
}
|
|
|
|
public removeProjectMember(member: ProjectMemberView.AsObject | ProjectGrantMemberView.AsObject): void {
|
|
if (this.projectType === ProjectType.PROJECTTYPE_OWNED) {
|
|
this.mgmtService.RemoveProjectMember(this.project.projectId, member.userId).then(() => {
|
|
setTimeout(() => {
|
|
this.changePage.emit();
|
|
}, 1000);
|
|
this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
} else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) {
|
|
this.mgmtService.RemoveProjectGrantMember(this.project.projectId, this.grantId,
|
|
member.userId).then(() => {
|
|
setTimeout(() => {
|
|
this.changePage.emit();
|
|
}, 1000);
|
|
this.toast.showInfo('PROJECT.TOAST.MEMBERREMOVED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
}
|
|
}
|
|
|
|
public openAddMember(): void {
|
|
const dialogRef = this.dialog.open(MemberCreateDialogComponent, {
|
|
data: {
|
|
creationType: CreationType.PROJECT_OWNED,
|
|
},
|
|
width: '400px',
|
|
});
|
|
|
|
dialogRef.afterClosed().subscribe(resp => {
|
|
if (resp) {
|
|
const users: UserView.AsObject[] = resp.users;
|
|
const roles: string[] = resp.roles;
|
|
|
|
if (users && users.length && roles && roles.length) {
|
|
Promise.all(users.map(user => {
|
|
if (this.projectType === ProjectType.PROJECTTYPE_OWNED) {
|
|
return this.mgmtService.AddProjectMember(this.project.projectId, user.id, roles);
|
|
|
|
} else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) {
|
|
return this.mgmtService.AddProjectGrantMember(this.project.projectId, this.grantId,
|
|
user.id, roles);
|
|
}
|
|
})).then(() => {
|
|
setTimeout(() => {
|
|
this.changePage.emit();
|
|
}, 1000);
|
|
this.toast.showInfo('PROJECT.TOAST.MEMBERSADDED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
updateRoles(member: ProjectMember.AsObject, selectionChange: MatSelectChange): void {
|
|
if (this.projectType === ProjectType.PROJECTTYPE_OWNED) {
|
|
this.mgmtService.ChangeProjectMember(this.project.projectId, member.userId, selectionChange.value)
|
|
.then((_: ProjectMember) => {
|
|
this.toast.showInfo('PROJECT.TOAST.MEMBERCHANGED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
} else if (this.projectType === ProjectType.PROJECTTYPE_GRANTED) {
|
|
this.mgmtService.ChangeProjectGrantMember(this.project.projectId,
|
|
this.grantId, member.userId, selectionChange.value)
|
|
.then((_: ProjectMember) => {
|
|
this.toast.showInfo('PROJECT.TOAST.MEMBERCHANGED', true);
|
|
}).catch(error => {
|
|
this.toast.showError(error);
|
|
});
|
|
}
|
|
}
|
|
}
|