diff --git a/console/src/app/app-routing.module.ts b/console/src/app/app-routing.module.ts index 2557c1dcf9..9a6ae48c6c 100644 --- a/console/src/app/app-routing.module.ts +++ b/console/src/app/app-routing.module.ts @@ -13,6 +13,10 @@ const routes: Routes = [ loadChildren: () => import('./pages/home/home.module').then((m) => m.HomeModule), canActivate: [AuthGuard], }, + { + path: 'orgs', + loadChildren: () => import('./pages/org-list/org-list.module').then((m) => m.OrgListModule), + }, { path: 'granted-projects', loadChildren: () => @@ -41,8 +45,8 @@ const routes: Routes = [ ], }, { - path: 'system', - loadChildren: () => import('./pages/iam/iam.module').then((m) => m.IamModule), + path: 'instance', + loadChildren: () => import('./pages/instance/instance.module').then((m) => m.InstanceModule), canActivate: [AuthGuard, RoleGuard], data: { roles: ['iam.read', 'iam.write'], @@ -59,7 +63,7 @@ const routes: Routes = [ }, { path: 'org', - loadChildren: () => import('./pages/orgs/orgs.module').then((m) => m.OrgsModule), + loadChildren: () => import('./pages/orgs/org.module').then((m) => m.OrgModule), canActivate: [AuthGuard, RoleGuard], data: { roles: ['org.read'], @@ -140,6 +144,14 @@ const routes: Routes = [ roles: ['iam.read'], }, }, + { + path: 'settings', + loadChildren: () => import('./pages/instance-settings/instance-settings.module').then((m) => m.InstanceSettingsModule), + canActivate: [AuthGuard, RoleGuard], + data: { + roles: ['iam.read', 'iam.write'], + }, + }, { path: 'domains', loadChildren: () => import('./pages/domains/domains.module').then((m) => m.DomainsModule), @@ -148,6 +160,14 @@ const routes: Routes = [ roles: ['org.read'], }, }, + { + path: 'org-settings', + loadChildren: () => import('./pages/org-settings/org-settings.module').then((m) => m.OrgSettingsModule), + canActivate: [AuthGuard, RoleGuard], + data: { + roles: ['iam.read', 'iam.write'], + }, + }, { path: 'signedout', loadChildren: () => import('./pages/signedout/signedout.module').then((m) => m.SignedoutModule), diff --git a/console/src/app/app.component.scss b/console/src/app/app.component.scss index 97585ca4b0..49ea39dbc8 100644 --- a/console/src/app/app.component.scss +++ b/console/src/app/app.component.scss @@ -22,7 +22,7 @@ position: relative; .router-container { - padding: 0 2rem; + padding: 0 2rem 50px 2rem; @media only screen and (max-width: 500px) { padding: 0 1rem; diff --git a/console/src/app/app.component.ts b/console/src/app/app.component.ts index 640f6afc5c..3bda9a2e13 100644 --- a/console/src/app/app.component.ts +++ b/console/src/app/app.component.ts @@ -349,7 +349,7 @@ export class AppComponent implements OnInit, OnDestroy { public changedOrg(org: Org.AsObject): void { this.loadPrivateLabelling(); this.authService.zitadelPermissionsChanged.pipe(take(1)).subscribe(() => { - this.router.navigate(['/']); + this.router.navigate(['/org'],{fragment: org.id} ); }); } diff --git a/console/src/app/modules/accounts-card/accounts-card.component.html b/console/src/app/modules/accounts-card/accounts-card.component.html index 38978c2e80..376ca8f055 100644 --- a/console/src/app/modules/accounts-card/accounts-card.component.html +++ b/console/src/app/modules/accounts-card/accounts-card.component.html @@ -17,19 +17,6 @@ {{ user.human?.profile?.displayName ? user.human?.profile?.displayName : 'A' }} {{ user.preferredLoginName }} - - {{ 'MENU.INSTANCE' | translate }} - - - - - - - {{ 'MENU.ORGANIZATION' | translate }} - - - -
diff --git a/console/src/app/modules/accounts-card/accounts-card.component.scss b/console/src/app/modules/accounts-card/accounts-card.component.scss index df0a1be940..039b3b2613 100644 --- a/console/src/app/modules/accounts-card/accounts-card.component.scss +++ b/console/src/app/modules/accounts-card/accounts-card.component.scss @@ -50,40 +50,6 @@ margin-top: 0; } - .iamuser { - position: absolute; - border-radius: 50vw; - right: 1rem; - top: 1rem; - font-size: 12px; - line-height: 12px; - font-weight: 600; - background-color: $primary-color; - color: mat.get-color-from-palette($primary, default-contrast); - flex-direction: row; - align-items: center; - text-decoration: none; - padding: 0 4px; - display: none; - - .label { - margin: 0.5rem 1rem; - } - - .iambtn { - margin: 0 0 0 4px; - color: mat.get-color-from-palette($primary, default-contrast); - } - - @media only screen and (max-width: 600px) { - display: flex; - - .label { - margin: 0.5rem 0 0.5rem 0.5rem; - } - } - } - button { border-radius: 50vh; margin: 0.5rem; diff --git a/console/src/app/modules/accounts-card/accounts-card.component.ts b/console/src/app/modules/accounts-card/accounts-card.component.ts index 9ce7caea07..d53aebe7b6 100644 --- a/console/src/app/modules/accounts-card/accounts-card.component.ts +++ b/console/src/app/modules/accounts-card/accounts-card.component.ts @@ -78,11 +78,4 @@ export class AccountsCardComponent implements OnInit { this.authService.signout(); this.closedCard.emit(); } - - public get isOnSystem(): boolean { - return ( - ['/system', '/views', '/failed-events', '/system/members'].includes(this.router.url) || - new RegExp('/system/policy/*').test(this.router.url) - ); - } } diff --git a/console/src/app/modules/footer/footer.component.scss b/console/src/app/modules/footer/footer.component.scss index c57e094966..4ee1ff240e 100644 --- a/console/src/app/modules/footer/footer.component.scss +++ b/console/src/app/modules/footer/footer.component.scss @@ -16,7 +16,6 @@ padding: 2rem; background-color: map-get($background, footer) !important; border-top: 1px solid map-get($foreground, divider); - margin-top: 50px; display: flex; transition: background-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); diff --git a/console/src/app/modules/header/header.component.html b/console/src/app/modules/header/header.component.html index 40d46ca6b9..9f31b8cfbe 100644 --- a/console/src/app/modules/header/header.component.html +++ b/console/src/app/modules/header/header.component.html @@ -37,7 +37,7 @@ - + - + @@ -186,7 +186,7 @@ {{ 'IDP.DEACTIVATE' | translate }} @@ -24,12 +34,38 @@ class="bg-state active" mat-stroked-button *ngIf="selection.hasValue()" - [disabled]="disabled" + [disabled]=" + ([ + serviceType === PolicyComponentServiceType.ADMIN + ? 'iam.idp.write' + : serviceType === PolicyComponentServiceType.MGMT + ? 'org.idp.write' + : '' + ] + | hasRole + | async) === false + " > {{ 'IDP.ACTIVATE' | translate }} - + add{{ 'ACTIONS.NEW' | translate }}
@@ -193,7 +229,22 @@ - + diff --git a/console/src/app/modules/idp-table/idp-table.component.ts b/console/src/app/modules/idp-table/idp-table.component.ts index 62edf5835a..e2950ca810 100644 --- a/console/src/app/modules/idp-table/idp-table.component.ts +++ b/console/src/app/modules/idp-table/idp-table.component.ts @@ -24,7 +24,6 @@ import { WarnDialogComponent } from '../warn-dialog/warn-dialog.component'; export class IdpTableComponent implements OnInit { @Input() public serviceType!: PolicyComponentServiceType; @Input() service!: AdminService | ManagementService; - @Input() disabled: boolean = false; @ViewChild(PaginatorComponent) public paginator!: PaginatorComponent; public dataSource: MatTableDataSource = new MatTableDataSource(); public selection: SelectionModel = new SelectionModel(true, []); @@ -55,10 +54,6 @@ export class IdpTableComponent implements OnInit { if (this.serviceType === PolicyComponentServiceType.MGMT) { this.displayedColumns = ['availability', 'name', 'type', 'owner', 'creationDate', 'changeDate', 'state']; } - - if (!this.disabled) { - this.displayedColumns.push('actions'); - } } public isAllSelected(): boolean { @@ -195,7 +190,7 @@ export class IdpTableComponent implements OnInit { public get createRouterLink(): RouterLink | any { if (this.service instanceof AdminService) { - return ['/system', 'idp', 'create']; + return ['/instance', 'idp', 'create']; } else if (this.service instanceof ManagementService) { return ['/org', 'idp', 'create']; } @@ -207,13 +202,13 @@ export class IdpTableComponent implements OnInit { case PolicyComponentServiceType.MGMT: switch (row.owner) { case IDPOwnerType.IDP_OWNER_TYPE_SYSTEM: - return ['/system', 'idp', row.id]; + return ['/instance', 'idp', row.id]; case IDPOwnerType.IDP_OWNER_TYPE_ORG: return ['/org', 'idp', row.id]; } break; case PolicyComponentServiceType.ADMIN: - return ['/system', 'idp', row.id]; + return ['/instance', 'idp', row.id]; } } } @@ -289,4 +284,8 @@ export class IdpTableComponent implements OnInit { public isEnabled(idp: IDP.AsObject): boolean { return this.idps.findIndex((i) => i.idpId === idp.id) > -1; } + + public get displayedColumnsWithActions(): string[] { + return ['actions', ...this.displayedColumns]; + } } diff --git a/console/src/app/modules/idp/idp.component.ts b/console/src/app/modules/idp/idp.component.ts index d12c5d3d38..e5d94afc59 100644 --- a/console/src/app/modules/idp/idp.component.ts +++ b/console/src/app/modules/idp/idp.component.ts @@ -8,15 +8,15 @@ import { ActivatedRoute, Router } from '@angular/router'; import { Observable, Subject } from 'rxjs'; import { take } from 'rxjs/operators'; import { - UpdateIDPJWTConfigRequest, - UpdateIDPOIDCConfigRequest, - UpdateIDPRequest, + UpdateIDPJWTConfigRequest, + UpdateIDPOIDCConfigRequest, + UpdateIDPRequest, } from 'src/app/proto/generated/zitadel/admin_pb'; import { IDP, IDPState, IDPStylingType, OIDCMappingField } from 'src/app/proto/generated/zitadel/idp_pb'; import { - UpdateOrgIDPJWTConfigRequest, - UpdateOrgIDPOIDCConfigRequest, - UpdateOrgIDPRequest, + UpdateOrgIDPJWTConfigRequest, + UpdateOrgIDPOIDCConfigRequest, + UpdateOrgIDPRequest, } from 'src/app/proto/generated/zitadel/management_pb'; import { AdminService } from 'src/app/services/admin.service'; import { Breadcrumb, BreadcrumbService, BreadcrumbType } from 'src/app/services/breadcrumb.service'; @@ -101,24 +101,19 @@ export class IdpComponent implements OnDestroy { case PolicyComponentServiceType.MGMT: this.service = this.injector.get(ManagementService as Type); - const iambread = new Breadcrumb({ - type: BreadcrumbType.IAM, - name: 'System', - routerLink: ['/system'], - }); const bread: Breadcrumb = { type: BreadcrumbType.ORG, routerLink: ['/org'], }; - breadcrumbService.setBreadcrumb([iambread, bread]); + breadcrumbService.setBreadcrumb([bread]); break; case PolicyComponentServiceType.ADMIN: this.service = this.injector.get(AdminService as Type); const iamBread = new Breadcrumb({ - type: BreadcrumbType.IAM, - name: 'System', - routerLink: ['/system'], + type: BreadcrumbType.INSTANCE, + name: 'Instance', + routerLink: ['/instance'], }); breadcrumbService.setBreadcrumb([iamBread]); break; @@ -419,7 +414,7 @@ export class IdpComponent implements OnDestroy { case PolicyComponentServiceType.MGMT: return ['/org', 'policy', 'login']; case PolicyComponentServiceType.ADMIN: - return ['/system', 'policy', 'login']; + return ['/instance', 'policy', 'login']; } } diff --git a/console/src/app/modules/keyboard-shortcuts/keyboard-shortcuts.component.ts b/console/src/app/modules/keyboard-shortcuts/keyboard-shortcuts.component.ts index 10eb381fea..c924e70fdb 100644 --- a/console/src/app/modules/keyboard-shortcuts/keyboard-shortcuts.component.ts +++ b/console/src/app/modules/keyboard-shortcuts/keyboard-shortcuts.component.ts @@ -23,8 +23,8 @@ export class KeyboardShortcutsComponent { public get isNotOnSystem(): boolean { return !( - ['/system', '/views', '/failed-events'].includes(this.router.url) || - new RegExp('/system/policy/*').test(this.router.url) + ['/instance', '/views', '/failed-events'].includes(this.router.url) || + new RegExp('/instance/policy/*').test(this.router.url) ); } } diff --git a/console/src/app/modules/members-table/members-table.component.ts b/console/src/app/modules/members-table/members-table.component.ts index 2aa8b31c1a..87fdc8e6f6 100644 --- a/console/src/app/modules/members-table/members-table.component.ts +++ b/console/src/app/modules/members-table/members-table.component.ts @@ -4,10 +4,10 @@ import { MatDialog } from '@angular/material/dialog'; import { MatTable } from '@angular/material/table'; import { Observable, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; -import { IamMembersDataSource } from 'src/app/pages/iam/iam-members/iam-members-datasource'; +import { InstanceMembersDataSource } from 'src/app/pages/instance/instance-members/instance-members-datasource'; import { OrgMembersDataSource } from 'src/app/pages/orgs/org-members/org-members-datasource'; import { - ProjectGrantMembersDataSource, + ProjectGrantMembersDataSource, } from 'src/app/pages/projects/owned-projects/project-grant-detail/project-grant-members-datasource'; import { Member } from 'src/app/proto/generated/zitadel/member_pb'; import { getMembershipColor } from 'src/app/utils/color'; @@ -21,7 +21,7 @@ type MemberDatasource = | OrgMembersDataSource | ProjectMembersDataSource | ProjectGrantMembersDataSource - | IamMembersDataSource; + | InstanceMembersDataSource; @Component({ selector: 'cnsl-members-table', @@ -121,7 +121,7 @@ export class MembersTableComponent implements OnInit, OnDestroy { public masterToggle(): void { this.isAllSelected() ? this.selection.clear() - : this.dataSource.membersSubject.value.forEach((row) => this.selection.select(row)); + : this.dataSource.membersSubject.value.forEach((row: Member.AsObject) => this.selection.select(row)); } public changePage(event?: PageEvent): any { diff --git a/console/src/app/modules/memberships-table/memberships-table.component.ts b/console/src/app/modules/memberships-table/memberships-table.component.ts index 082747decd..0428134ac8 100644 --- a/console/src/app/modules/memberships-table/memberships-table.component.ts +++ b/console/src/app/modules/memberships-table/memberships-table.component.ts @@ -160,31 +160,10 @@ export class MembershipsTableComponent implements OnInit, OnDestroy { }); } else if (membership.iam) { // only shown on auth user - this.router.navigate(['/system/members']); + this.router.navigate(['/instance/members']); } } - // public canNavigateToEdit(membership: Membership.AsObject): Observable { - // if (membership.orgId && !membership.projectId && !membership.projectGrantId) { - // return this.authService.isAllowed(['org.member.read:' + membership.orgId]); - // } else if (membership.projectGrantId && membership.details?.resourceOwner) { - // return from(this.authService.getActiveOrg(membership.details?.resourceOwner)).pipe( - // switchMap(() => this.authService.isAllowed(['project.grant.member.read:' + membership.projectId])), - // catchError(() => of(false)), - // ); - // } else if (membership.projectId && membership.details?.resourceOwner) { - // return from(this.authService.getActiveOrg(membership.details?.resourceOwner)).pipe( - // take(1), - // switchMap(() => this.authService.isAllowed(['project.member.read:' + membership.projectId])), - // catchError(() => of(false)), - // ); - // } else if (membership.iam) { - // return this.authService.isAllowed(['iam.member.read']); - // } else { - // return of(false); - // } - // } - private startOrgContextWorkflow(membershipOrg: Org.AsObject, currentOrg?: Org.AsObject | null): void { if (!currentOrg || (membershipOrg.id && currentOrg.id && currentOrg.id !== membershipOrg.id)) { setTimeout(() => { diff --git a/console/src/app/modules/nav/nav.component.html b/console/src/app/modules/nav/nav.component.html index 7fc509f666..04c6c26716 100644 --- a/console/src/app/modules/nav/nav.component.html +++ b/console/src/app/modules/nav/nav.component.html @@ -7,27 +7,36 @@ *ngIf=" breadc[breadc.length - 1] && !breadc[breadc.length - 1].hideNav && - breadc[breadc.length - 1].type !== BreadcrumbType.GRANTEDPROJECT && - breadc[breadc.length - 1].type !== BreadcrumbType.APP && breadc[breadc.length - 1].type !== BreadcrumbType.AUTHUSER " - [ngSwitch]="breadc[breadc.length - 1].type" + [ngSwitch]="breadc[0].type" >