diff --git a/console/package-lock.json b/console/package-lock.json index 5c5d3c740a..99765d6310 100644 --- a/console/package-lock.json +++ b/console/package-lock.json @@ -28,6 +28,7 @@ "@types/google-protobuf": "^3.15.3", "@types/uuid": "^8.3.0", "angular-oauth2-oidc": "^13.0.1", + "buffer": "^6.0.3", "codemirror": "^5.65.0", "cors": "^2.8.5", "file-saver": "^2.0.5", @@ -4690,7 +4691,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "dev": true, "funding": [ { "type": "github", @@ -4754,6 +4754,30 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/blob-util": { "version": "2.0.2", "dev": true, @@ -4940,8 +4964,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "dev": true, + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -4956,10 +4981,9 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-crc32": { @@ -6225,6 +6249,30 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/cypress/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/cypress/node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -8696,7 +8744,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "dev": true, "funding": [ { "type": "github", @@ -19971,8 +20018,7 @@ "dev": true }, "base64-js": { - "version": "1.5.1", - "dev": true + "version": "1.5.1" }, "base64id": { "version": "2.0.0", @@ -20004,6 +20050,18 @@ "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } } }, "blob-util": { @@ -20138,11 +20196,12 @@ } }, "buffer": { - "version": "5.7.1", - "dev": true, + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "requires": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "buffer-crc32": { @@ -20895,6 +20954,16 @@ "color-convert": "^2.0.1" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "chalk": { "version": "4.1.2", "dev": true, @@ -22565,8 +22634,7 @@ "requires": {} }, "ieee754": { - "version": "1.2.1", - "dev": true + "version": "1.2.1" }, "ignore": { "version": "5.2.0", diff --git a/console/package.json b/console/package.json index 3996cc3c28..29174fa72d 100644 --- a/console/package.json +++ b/console/package.json @@ -32,6 +32,7 @@ "@types/google-protobuf": "^3.15.3", "@types/uuid": "^8.3.0", "angular-oauth2-oidc": "^13.0.1", + "buffer": "^6.0.3", "codemirror": "^5.65.0", "cors": "^2.8.5", "file-saver": "^2.0.5", diff --git a/console/src/app/animations.ts b/console/src/app/animations.ts index 6d2973fa10..a33655d2b3 100644 --- a/console/src/app/animations.ts +++ b/console/src/app/animations.ts @@ -1,13 +1,13 @@ import { - animate, - animateChild, - AnimationTriggerMetadata, - group, - query, - stagger, - style, - transition, - trigger, + animate, + animateChild, + AnimationTriggerMetadata, + group, + query, + stagger, + style, + transition, + trigger, } from '@angular/animations'; export const toolbarAnimation: AnimationTriggerMetadata = trigger('toolbar', [ @@ -121,10 +121,10 @@ export const enterAnimations: Array = [ export const routeAnimations: AnimationTriggerMetadata = trigger('routeAnimations', [ transition('HomePage => AddPage', [ - style({ transform: 'translateX(50%)', opacity: 0.5 }), + style({ transform: 'translateX(30vw)', opacity: 0 }), animate('250ms ease-out', style({ transform: 'translateX(0%)', opacity: 1 })), ]), - transition('AddPage => HomePage', [animate('250ms', style({ transform: 'translateX(50%)', opacity: 0.5 }))]), + transition('AddPage => HomePage', [animate('250ms', style({ transform: 'translateX(30vw)', opacity: 0 }))]), transition('HomePage => DetailPage', [ query(':enter, :leave', style({ position: 'absolute', left: 0, right: 0 }), { optional: true, @@ -135,7 +135,7 @@ export const routeAnimations: AnimationTriggerMetadata = trigger('routeAnimation [ style({ transform: 'translateX(20%)', - opacity: 0.5, + opacity: 0, }), animate( '.35s ease-in', diff --git a/console/src/app/app-routing.module.ts b/console/src/app/app-routing.module.ts index 9a6ae48c6c..13da07dc9e 100644 --- a/console/src/app/app-routing.module.ts +++ b/console/src/app/app-routing.module.ts @@ -16,6 +16,7 @@ const routes: Routes = [ { path: 'orgs', loadChildren: () => import('./pages/org-list/org-list.module').then((m) => m.OrgListModule), + canActivate: [AuthGuard], }, { path: 'granted-projects', diff --git a/console/src/app/app.component.ts b/console/src/app/app.component.ts index 3bda9a2e13..bfdb5bf2ce 100644 --- a/console/src/app/app.component.ts +++ b/console/src/app/app.component.ts @@ -163,6 +163,11 @@ export class AppComponent implements OnInit, OnDestroy { this.matIconRegistry.addSvgIcon('mdi_symbol', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/symbol.svg')); + this.matIconRegistry.addSvgIcon( + 'mdi_shield_alert', + this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/shield-alert.svg'), + ); + this.matIconRegistry.addSvgIcon( 'mdi_numeric', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/numeric.svg'), @@ -349,7 +354,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(['/org'],{fragment: org.id} ); + this.router.navigate(['/org'], { fragment: org.id }); }); } diff --git a/console/src/app/directives/copy-to-clipboard/copy-to-clipboard.directive.ts b/console/src/app/directives/copy-to-clipboard/copy-to-clipboard.directive.ts index 568f54fb30..d0bcd9104e 100644 --- a/console/src/app/directives/copy-to-clipboard/copy-to-clipboard.directive.ts +++ b/console/src/app/directives/copy-to-clipboard/copy-to-clipboard.directive.ts @@ -9,6 +9,7 @@ export class CopyToClipboardDirective { @HostListener('click', ['$event']) onMouseEnter($event: any): void { $event.preventDefault(); + $event.stopPropagation(); this.copytoclipboard(this.valueToCopy); } diff --git a/console/src/app/modules/filter-org/filter-org.component.spec.ts b/console/src/app/modules/filter-org/filter-org.component.spec.ts index d6369afa1c..e2f6b11879 100644 --- a/console/src/app/modules/filter-org/filter-org.component.spec.ts +++ b/console/src/app/modules/filter-org/filter-org.component.spec.ts @@ -1,20 +1,19 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { FilterUserComponent } from './filter-user.component'; +import { FilterOrgComponent } from './filter-org.component'; -describe('FilterUserComponent', () => { - let component: FilterUserComponent; - let fixture: ComponentFixture; +describe('FilterOrgComponent', () => { + let component: FilterOrgComponent; + let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ FilterUserComponent ] - }) - .compileComponents(); + declarations: [FilterOrgComponent], + }).compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(FilterUserComponent); + fixture = TestBed.createComponent(FilterOrgComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/console/src/app/modules/filter-org/filter-org.component.ts b/console/src/app/modules/filter-org/filter-org.component.ts index 107e585fb1..82a92dc08f 100644 --- a/console/src/app/modules/filter-org/filter-org.component.ts +++ b/console/src/app/modules/filter-org/filter-org.component.ts @@ -1,5 +1,7 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { MatCheckboxChange } from '@angular/material/checkbox'; +import { ActivatedRoute, Router } from '@angular/router'; +import { take } from 'rxjs'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { OrgNameQuery, OrgQuery, OrgState } from 'src/app/proto/generated/zitadel/org_pb'; import { UserNameQuery } from 'src/app/proto/generated/zitadel/user_pb'; @@ -15,13 +17,44 @@ enum SubQuery { templateUrl: './filter-org.component.html', styleUrls: ['./filter-org.component.scss'], }) -export class FilterOrgComponent extends FilterComponent { +export class FilterOrgComponent extends FilterComponent implements OnInit { public SubQuery: any = SubQuery; public searchQueries: OrgQuery[] = []; public states: OrgState[] = [OrgState.ORG_STATE_ACTIVE, OrgState.ORG_STATE_INACTIVE]; - constructor() { - super(); + + constructor(router: Router, protected route: ActivatedRoute) { + super(router, route); + } + + ngOnInit(): void { + this.route.queryParams.pipe(take(1)).subscribe((params) => { + const { filter } = params; + if (filter) { + const stringifiedFilters = filter as string; + const filters: OrgQuery.AsObject[] = JSON.parse(stringifiedFilters) as OrgQuery.AsObject[]; + + const orgQueries = filters.map((filter) => { + if (filter.nameQuery) { + const orgQuery = new OrgQuery(); + + const orgNameQuery = new OrgNameQuery(); + orgNameQuery.setName(filter.nameQuery.name); + orgNameQuery.setMethod(filter.nameQuery.method); + + orgQuery.setNameQuery(orgNameQuery); + return orgQuery; + } else { + return undefined; + } + }); + + this.searchQueries = orgQueries.filter((q) => q !== undefined) as OrgQuery[]; + this.filterChanged.emit(this.filterCount ? this.searchQueries : undefined); + // this.showFilter = true; + // this.filterOpen.emit(true); + } + }); } public changeCheckbox(subquery: SubQuery, event: MatCheckboxChange) { diff --git a/console/src/app/modules/filter-org/filter-org.module.ts b/console/src/app/modules/filter-org/filter-org.module.ts index 23a91719b7..285571431e 100644 --- a/console/src/app/modules/filter-org/filter-org.module.ts +++ b/console/src/app/modules/filter-org/filter-org.module.ts @@ -4,6 +4,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatIconModule } from '@angular/material/icon'; import { MatSelectModule } from '@angular/material/select'; +import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { FilterModule } from '../filter/filter.module'; @@ -21,6 +22,7 @@ import { FilterOrgComponent } from './filter-org.component'; MatButtonModule, MatIconModule, TranslateModule, + RouterModule, ], exports: [FilterOrgComponent], }) diff --git a/console/src/app/modules/filter-project/filter-project.component.ts b/console/src/app/modules/filter-project/filter-project.component.ts index 5e76ff7943..00f0b0d9f5 100644 --- a/console/src/app/modules/filter-project/filter-project.component.ts +++ b/console/src/app/modules/filter-project/filter-project.component.ts @@ -1,5 +1,7 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { MatCheckboxChange } from '@angular/material/checkbox'; +import { ActivatedRoute, Router } from '@angular/router'; +import { take } from 'rxjs'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { ProjectNameQuery, ProjectQuery, ProjectState } from 'src/app/proto/generated/zitadel/project_pb'; import { UserNameQuery } from 'src/app/proto/generated/zitadel/user_pb'; @@ -16,13 +18,43 @@ enum SubQuery { templateUrl: './filter-project.component.html', styleUrls: ['./filter-project.component.scss'], }) -export class FilterProjectComponent extends FilterComponent { +export class FilterProjectComponent extends FilterComponent implements OnInit { public SubQuery: any = SubQuery; public searchQueries: ProjectQuery[] = []; public states: ProjectState[] = [ProjectState.PROJECT_STATE_ACTIVE, ProjectState.PROJECT_STATE_INACTIVE]; - constructor() { - super(); + constructor(router: Router, route: ActivatedRoute) { + super(router, route); + } + + ngOnInit(): void { + this.route.queryParams.pipe(take(1)).subscribe((params) => { + const { filter } = params; + if (filter) { + const stringifiedFilters = filter as string; + const filters: ProjectQuery.AsObject[] = JSON.parse(stringifiedFilters) as ProjectQuery.AsObject[]; + + const projectQueries = filters.map((filter) => { + if (filter.nameQuery) { + const nameQuery = new ProjectNameQuery(); + + const projectQuery = new ProjectQuery(); + nameQuery.setName(filter.nameQuery.name); + nameQuery.setMethod(filter.nameQuery.method); + + projectQuery.setNameQuery(nameQuery); + return projectQuery; + } else { + return undefined; + } + }); + + this.searchQueries = projectQueries.filter((q) => q !== undefined) as ProjectQuery[]; + this.filterChanged.emit(this.filterCount ? this.searchQueries : undefined); + // this.showFilter = true; + // this.filterOpen.emit(true); + } + }); } public changeCheckbox(subquery: SubQuery, event: MatCheckboxChange) { diff --git a/console/src/app/modules/filter-project/filter-project.module.ts b/console/src/app/modules/filter-project/filter-project.module.ts index 9c048fde84..d279355065 100644 --- a/console/src/app/modules/filter-project/filter-project.module.ts +++ b/console/src/app/modules/filter-project/filter-project.module.ts @@ -4,6 +4,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatIconModule } from '@angular/material/icon'; import { MatSelectModule } from '@angular/material/select'; +import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { FilterModule } from '../filter/filter.module'; @@ -21,6 +22,7 @@ import { FilterProjectComponent } from './filter-project.component'; MatButtonModule, MatIconModule, TranslateModule, + RouterModule, ], exports: [FilterProjectComponent], }) diff --git a/console/src/app/modules/filter-user-grants/filter-user-grants.component.html b/console/src/app/modules/filter-user-grants/filter-user-grants.component.html index 1da97a6967..6eac6086f7 100644 --- a/console/src/app/modules/filter-user-grants/filter-user-grants.component.html +++ b/console/src/app/modules/filter-user-grants/filter-user-grants.component.html @@ -1,82 +1,105 @@
- {{'FILTER.DISPLAYNAME' | translate}} + {{ 'FILTER.DISPLAYNAME' | translate }}
- {{ 'FILTER.METHODS.'+method | translate }} + {{ 'FILTER.METHODS.' + method | translate }} - +
- {{'FILTER.USERNAME' | translate}} + {{ 'FILTER.USERNAME' | translate }}
- {{ 'FILTER.METHODS.'+method | translate}} + {{ 'FILTER.METHODS.' + method | translate }} - +
-
\ No newline at end of file + diff --git a/console/src/app/modules/filter-user-grants/filter-user-grants.component.ts b/console/src/app/modules/filter-user-grants/filter-user-grants.component.ts index 1c98eb4363..807f4c646f 100644 --- a/console/src/app/modules/filter-user-grants/filter-user-grants.component.ts +++ b/console/src/app/modules/filter-user-grants/filter-user-grants.component.ts @@ -1,12 +1,14 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { MatCheckboxChange } from '@angular/material/checkbox'; +import { ActivatedRoute, Router } from '@angular/router'; +import { take } from 'rxjs'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { - DisplayNameQuery, - UserGrantOrgNameQuery, - UserGrantProjectNameQuery, - UserGrantQuery, - UserNameQuery, + DisplayNameQuery, + UserGrantOrgNameQuery, + UserGrantProjectNameQuery, + UserGrantQuery, + UserNameQuery, } from 'src/app/proto/generated/zitadel/user_pb'; import { FilterComponent } from '../filter/filter.component'; @@ -23,11 +25,68 @@ enum SubQuery { templateUrl: './filter-user-grants.component.html', styleUrls: ['./filter-user-grants.component.scss'], }) -export class FilterUserGrantsComponent extends FilterComponent { +export class FilterUserGrantsComponent extends FilterComponent implements OnInit { public SubQuery: any = SubQuery; public searchQueries: UserGrantQuery[] = []; - constructor() { - super(); + + constructor(router: Router, route: ActivatedRoute) { + super(router, route); + } + + ngOnInit(): void { + this.route.queryParams.pipe(take(1)).subscribe((params) => { + const { filter } = params; + if (filter) { + const stringifiedFilters = filter as string; + const filters: UserGrantQuery.AsObject[] = JSON.parse(stringifiedFilters) as UserGrantQuery.AsObject[]; + + const userQueries = filters.map((filter) => { + if (filter.userNameQuery) { + const userGrantQuery = new UserGrantQuery(); + + const userNameQuery = new UserNameQuery(); + userNameQuery.setUserName(filter.userNameQuery.userName); + userNameQuery.setMethod(filter.userNameQuery.method); + + userGrantQuery.setUserNameQuery(userNameQuery); + return userGrantQuery; + } else if (filter.displayNameQuery) { + const userGrantQuery = new UserGrantQuery(); + + const displayNameQuery = new DisplayNameQuery(); + displayNameQuery.setDisplayName(filter.displayNameQuery.displayName); + displayNameQuery.setMethod(filter.displayNameQuery.method); + + userGrantQuery.setDisplayNameQuery(displayNameQuery); + return userGrantQuery; + } else if (filter.orgNameQuery) { + const userGrantQuery = new UserGrantQuery(); + + const orgNameQuery = new UserGrantOrgNameQuery(); + orgNameQuery.setOrgName(filter.orgNameQuery.orgName); + orgNameQuery.setMethod(filter.orgNameQuery.method); + + userGrantQuery.setOrgNameQuery(orgNameQuery); + return userGrantQuery; + } else if (filter.projectNameQuery) { + const userGrantQuery = new UserGrantQuery(); + + const projectNameQuery = new UserGrantProjectNameQuery(); + projectNameQuery.setProjectName(filter.projectNameQuery.projectName); + + userGrantQuery.setProjectNameQuery(projectNameQuery); + return userGrantQuery; + } else { + return undefined; + } + }); + + this.searchQueries = userQueries.filter((q) => q !== undefined) as UserGrantQuery[]; + this.filterChanged.emit(this.filterCount ? this.searchQueries : undefined); + // this.showFilter = true; + // this.filterOpen.emit(true); + } + }); } public changeCheckbox(subquery: SubQuery, event: MatCheckboxChange) { diff --git a/console/src/app/modules/filter-user-grants/filter-user-grants.module.ts b/console/src/app/modules/filter-user-grants/filter-user-grants.module.ts index ed4f367497..21dd82d5a8 100644 --- a/console/src/app/modules/filter-user-grants/filter-user-grants.module.ts +++ b/console/src/app/modules/filter-user-grants/filter-user-grants.module.ts @@ -4,6 +4,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatIconModule } from '@angular/material/icon'; import { MatSelectModule } from '@angular/material/select'; +import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { FilterModule } from '../filter/filter.module'; @@ -21,6 +22,7 @@ import { FilterUserGrantsComponent } from './filter-user-grants.component'; MatButtonModule, MatIconModule, TranslateModule, + RouterModule, ], exports: [FilterUserGrantsComponent], }) diff --git a/console/src/app/modules/filter-user/filter-user.component.ts b/console/src/app/modules/filter-user/filter-user.component.ts index 16c647eeb8..d2e8beaa8d 100644 --- a/console/src/app/modules/filter-user/filter-user.component.ts +++ b/console/src/app/modules/filter-user/filter-user.component.ts @@ -1,13 +1,15 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { MatCheckboxChange } from '@angular/material/checkbox'; +import { ActivatedRoute, Router } from '@angular/router'; +import { take } from 'rxjs'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { - DisplayNameQuery, - EmailQuery, - SearchQuery as UserSearchQuery, - StateQuery, - UserNameQuery, - UserState, + DisplayNameQuery, + EmailQuery, + SearchQuery as UserSearchQuery, + StateQuery, + UserNameQuery, + UserState, } from 'src/app/proto/generated/zitadel/user_pb'; import { FilterComponent } from '../filter/filter.component'; @@ -24,7 +26,7 @@ enum SubQuery { templateUrl: './filter-user.component.html', styleUrls: ['./filter-user.component.scss'], }) -export class FilterUserComponent extends FilterComponent { +export class FilterUserComponent extends FilterComponent implements OnInit { public SubQuery: any = SubQuery; public searchQueries: UserSearchQuery[] = []; @@ -36,8 +38,64 @@ export class FilterUserComponent extends FilterComponent { UserState.USER_STATE_LOCKED, UserState.USER_STATE_SUSPEND, ]; - constructor() { - super(); + constructor(router: Router, route: ActivatedRoute) { + super(router, route); + } + + ngOnInit(): void { + this.route.queryParams.pipe(take(1)).subscribe((params) => { + const { filter } = params; + if (filter) { + const stringifiedFilters = filter as string; + const filters: UserSearchQuery.AsObject[] = JSON.parse(stringifiedFilters) as UserSearchQuery.AsObject[]; + + const userQueries = filters.map((filter) => { + if (filter.userNameQuery) { + const userQuery = new UserSearchQuery(); + + const userNameQuery = new UserNameQuery(); + userNameQuery.setUserName(filter.userNameQuery.userName); + userNameQuery.setMethod(filter.userNameQuery.method); + + userQuery.setUserNameQuery(userNameQuery); + return userQuery; + } else if (filter.displayNameQuery) { + const userQuery = new UserSearchQuery(); + + const displayNameQuery = new DisplayNameQuery(); + displayNameQuery.setDisplayName(filter.displayNameQuery.displayName); + displayNameQuery.setMethod(filter.displayNameQuery.method); + + userQuery.setDisplayNameQuery(displayNameQuery); + return userQuery; + } else if (filter.emailQuery) { + const userQuery = new UserSearchQuery(); + + const emailQuery = new EmailQuery(); + emailQuery.setEmailAddress(filter.emailQuery.emailAddress); + emailQuery.setMethod(filter.emailQuery.method); + + userQuery.setEmailQuery(emailQuery); + return userQuery; + } else if (filter.stateQuery) { + const userQuery = new UserSearchQuery(); + + const stateQuery = new StateQuery(); + stateQuery.setState(filter.stateQuery.state); + + userQuery.setStateQuery(stateQuery); + return userQuery; + } else { + return undefined; + } + }); + + this.searchQueries = userQueries.filter((q) => q !== undefined) as UserSearchQuery[]; + this.filterChanged.emit(this.filterCount ? this.searchQueries : undefined); + // this.showFilter = true; + // this.filterOpen.emit(true); + } + }); } public changeCheckbox(subquery: SubQuery, event: MatCheckboxChange) { diff --git a/console/src/app/modules/filter-user/filter-user.module.ts b/console/src/app/modules/filter-user/filter-user.module.ts index e9c8220af4..36da5bacc8 100644 --- a/console/src/app/modules/filter-user/filter-user.module.ts +++ b/console/src/app/modules/filter-user/filter-user.module.ts @@ -4,6 +4,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatIconModule } from '@angular/material/icon'; import { MatSelectModule } from '@angular/material/select'; +import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { FilterModule } from '../filter/filter.module'; @@ -19,6 +20,7 @@ import { FilterUserComponent } from './filter-user.component'; MatSelectModule, MatCheckboxModule, MatButtonModule, + RouterModule, MatIconModule, TranslateModule, ], diff --git a/console/src/app/modules/filter/filter.component.ts b/console/src/app/modules/filter/filter.component.ts index 553730bb34..8f83747279 100644 --- a/console/src/app/modules/filter/filter.component.ts +++ b/console/src/app/modules/filter/filter.component.ts @@ -1,6 +1,7 @@ import { ConnectedPosition, ConnectionPositionPair } from '@angular/cdk/overlay'; import { Component, EventEmitter, OnDestroy, Output } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; +import { ActivatedRoute, Router } from '@angular/router'; +import { BehaviorSubject, Subject, takeUntil } from 'rxjs'; import { SearchQuery as MemberSearchQuery } from 'src/app/proto/generated/zitadel/member_pb'; import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb'; import { OrgQuery } from 'src/app/proto/generated/zitadel/org_pb'; @@ -10,6 +11,12 @@ import { SearchQuery as UserSearchQuery, UserGrantQuery } from 'src/app/proto/ge import { ActionKeysType } from '../action-keys/action-keys.component'; type FilterSearchQuery = UserSearchQuery | MemberSearchQuery | UserGrantQuery | ProjectQuery | OrgQuery; +type FilterSearchQueryAsObject = + | UserSearchQuery.AsObject + | MemberSearchQuery.AsObject + | UserGrantQuery.AsObject + | ProjectQuery.AsObject + | OrgQuery.AsObject; @Component({ selector: 'cnsl-filter', @@ -23,6 +30,8 @@ export class FilterComponent implements OnDestroy { @Output() public resetted: EventEmitter = new EventEmitter(); @Output() public trigger: EventEmitter = new EventEmitter(); + private destroy$: Subject = new Subject(); + public filterCount$: BehaviorSubject = new BehaviorSubject(0); public showFilter: boolean = false; @@ -51,5 +60,33 @@ export class FilterComponent implements OnDestroy { public ngOnDestroy(): void { this.filterCount$.complete(); + this.destroy$.next(); + this.destroy$.complete(); + } + + constructor(private router: Router, protected route: ActivatedRoute) { + const changes$ = this.filterChanged.asObservable(); + changes$.pipe(takeUntil(this.destroy$)).subscribe((queries) => { + const filters: Array | undefined = queries + ?.map((q) => q.toObject()) + .map((query) => + Object.keys(query).reduce((acc, key) => { + const _acc = acc; + if ((query as any)[key] !== undefined) (_acc as any)[key] = (query as any)[key]; + return _acc as FilterSearchQueryAsObject; + }, {}), + ); + + if (filters && Object.keys(filters)) { + this.router.navigate([], { + relativeTo: this.route, + queryParams: { + ['filter']: JSON.stringify(filters), + }, + queryParamsHandling: 'merge', + skipLocationChange: false, + }); + } + }); } } diff --git a/console/src/app/modules/info-section/info-section.component.html b/console/src/app/modules/info-section/info-section.component.html index 3b81d0bec6..7792bcb12a 100644 --- a/console/src/app/modules/info-section/info-section.component.html +++ b/console/src/app/modules/info-section/info-section.component.html @@ -1,8 +1,12 @@ -
- - +
+ + + -
- -
+
+ +
diff --git a/console/src/app/modules/info-section/info-section.component.scss b/console/src/app/modules/info-section/info-section.component.scss index e1e7cff165..e2d402d703 100644 --- a/console/src/app/modules/info-section/info-section.component.scss +++ b/console/src/app/modules/info-section/info-section.component.scss @@ -10,23 +10,27 @@ .info-section-row { display: flex; border-radius: 4px; - padding: .5rem 0; + padding: 0.5rem 0; padding-right: 1rem; font-size: 14px; - margin: .5rem 0; + margin: 0.5rem 0; + + &.fit { + width: fit-content; + } .icon { margin-right: 1rem; height: 1.2rem; line-height: 1.2rem; font-size: 1.2rem; - margin-left: .5rem; - padding: .25rem 0; + margin-left: 0.5rem; + padding: 0.25rem 0; } .info-section-content { flex: 1; - padding: .25rem 0; + padding: 0.25rem 0; } &.info { @@ -55,5 +59,14 @@ color: map-get($foreground, warninfosection); } } + + &.alert { + background-color: map-get($background, alertinfosection); + color: map-get($foreground, alertinfosection); + + .icon { + color: map-get($foreground, alertinfosection); + } + } } } diff --git a/console/src/app/modules/info-section/info-section.component.ts b/console/src/app/modules/info-section/info-section.component.ts index 79243f32ec..0ae60d290a 100644 --- a/console/src/app/modules/info-section/info-section.component.ts +++ b/console/src/app/modules/info-section/info-section.component.ts @@ -4,6 +4,7 @@ export enum InfoSectionType { INFO = 'INFO', SUCCESS = 'SUCCESS', WARN = 'WARN', + ALERT = 'ALERT', } @Component({ @@ -12,6 +13,6 @@ export enum InfoSectionType { styleUrls: ['./info-section.component.scss'], }) export class InfoSectionComponent { - @Input() type: InfoSectionType = InfoSectionType.INFO; + @Input() fitWidth: boolean = false; } diff --git a/console/src/app/modules/org-table/org-table.component.html b/console/src/app/modules/org-table/org-table.component.html index 0e79cb961e..113414f16b 100644 --- a/console/src/app/modules/org-table/org-table.component.html +++ b/console/src/app/modules/org-table/org-table.component.html @@ -1,5 +1,4 @@ {{ 'ORG.PAGES.PRIMARYDOMAIN' | translate }} - + {{ org.primaryDomain }}
diff --git a/console/src/app/modules/policies/notification-settings/notification-settings.component.html b/console/src/app/modules/policies/notification-settings/notification-settings.component.html index a5bd417780..a5fda68aef 100644 --- a/console/src/app/modules/policies/notification-settings/notification-settings.component.html +++ b/console/src/app/modules/policies/notification-settings/notification-settings.component.html @@ -4,6 +4,10 @@

{{ 'SETTING.SMTP.TITLE' | translate }}

+{{ + 'SETTING.SMTP.REQUIREDWARN' | translate +}} + {{ 'SETTING.SMTP.SENDERADDRESS' | translate }} @@ -50,26 +54,28 @@

{{ 'SETTING.SMS.TITLE' | translate }}

-

{{ 'SETTING.SMS.PROVIDERS' | translate }}

- -
+ +

Twilio

- {{ 'SETTING.SMS.PROVIDER' | translate }} + + +
-
diff --git a/console/src/app/modules/policies/notification-settings/notification-settings.component.scss b/console/src/app/modules/policies/notification-settings/notification-settings.component.scss index 28ad4930b9..360dc13c88 100644 --- a/console/src/app/modules/policies/notification-settings/notification-settings.component.scss +++ b/console/src/app/modules/policies/notification-settings/notification-settings.component.scss @@ -2,11 +2,16 @@ margin: 0.5rem 0; } -.smtp-form-field { +.smtp-form-field, +.info-section-warn { max-width: 400px; display: block; } +.info-section-warn { + margin-bottom: 0.5rem; +} + .smtp-checkbox { max-width: 400px; display: block; @@ -40,7 +45,6 @@ display: flex; flex-direction: row; align-items: center; - margin-bottom: -0.5rem; .title { font-size: 16px; diff --git a/console/src/app/modules/policies/notification-settings/notification-settings.component.ts b/console/src/app/modules/policies/notification-settings/notification-settings.component.ts index f2bfc34455..886b99a766 100644 --- a/console/src/app/modules/policies/notification-settings/notification-settings.component.ts +++ b/console/src/app/modules/policies/notification-settings/notification-settings.component.ts @@ -3,13 +3,15 @@ import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/fo import { MatDialog } from '@angular/material/dialog'; import { AddSMSProviderTwilioRequest, + UpdateSMTPConfigPasswordRequest, UpdateSMTPConfigPasswordResponse, UpdateSMTPConfigRequest, } from 'src/app/proto/generated/zitadel/admin_pb'; -import { SMSProvider, SMSProviderConfigState } from 'src/app/proto/generated/zitadel/settings_pb'; +import { DebugNotificationProvider, SMSProvider, SMSProviderConfigState } from 'src/app/proto/generated/zitadel/settings_pb'; import { AdminService } from 'src/app/services/admin.service'; import { ToastService } from 'src/app/services/toast.service'; +import { InfoSectionType } from '../../info-section/info-section.component'; import { PolicyComponentServiceType } from '../policy-component-types.enum'; import { DialogAddSMSProviderComponent } from './dialog-add-sms-provider/dialog-add-sms-provider.component'; @@ -21,11 +23,16 @@ import { DialogAddSMSProviderComponent } from './dialog-add-sms-provider/dialog- export class NotificationSettingsComponent implements OnInit { @Input() public serviceType!: PolicyComponentServiceType; public smsProviders: SMSProvider.AsObject[] = []; - + public logNotificationProvider!: DebugNotificationProvider.AsObject; + public fileNotificationProvider!: DebugNotificationProvider.AsObject; public loading: boolean = false; public form!: FormGroup; public SMSProviderConfigState: any = SMSProviderConfigState; + public InfoSectionType: any = InfoSectionType; + + // show available providers + constructor( private service: AdminService, private dialog: MatDialog, @@ -66,6 +73,30 @@ export class NotificationSettingsComponent implements OnInit { console.log(this.smsProviders); } }); + + this.service + .getLogNotificationProvider() + .then((logNotificationProvider) => { + if (logNotificationProvider.provider) { + this.logNotificationProvider = logNotificationProvider.provider; + } + }) + .catch((error) => { + this.toast.showError(error); + }); + + this.service + .getFileSystemNotificationProvider() + .then((fileNotificationProvider) => { + if (fileNotificationProvider.provider) { + console.log(fileNotificationProvider); + this.fileNotificationProvider = fileNotificationProvider.provider; + } + }) + .catch((error) => { + console.log('hehe'); + this.toast.showError(error); + }); } private updateData(): Promise | any { @@ -76,18 +107,16 @@ export class NotificationSettingsComponent implements OnInit { req.setTls(this.tls?.value ?? false); req.setUser(this.user?.value ?? ''); - console.log(req.toObject()); - - // return this.service.updateSMTPConfig(req).then(() => { - // let passwordReq: UpdateSMTPConfigPasswordRequest; - // if (this.password) { - // passwordReq = new UpdateSMTPConfigPasswordRequest(); - // passwordReq.setPassword(this.password.value); - // return this.service.updateSMTPConfigPassword(passwordReq); - // } else { - // return; - // } - // }); + return this.service.updateSMTPConfig(req).then(() => { + let passwordReq: UpdateSMTPConfigPasswordRequest; + if (this.password) { + passwordReq = new UpdateSMTPConfigPasswordRequest(); + passwordReq.setPassword(this.password.value); + return this.service.updateSMTPConfigPassword(passwordReq); + } else { + return; + } + }); } public savePolicy(): void { @@ -126,6 +155,10 @@ export class NotificationSettingsComponent implements OnInit { }); } + public get twilio(): SMSProvider.AsObject | undefined { + return this.smsProviders.find((p) => p.twilio); + } + public get senderAddress(): AbstractControl | null { return this.form.get('senderAddress'); } diff --git a/console/src/app/modules/policies/notification-settings/notification-settings.module.ts b/console/src/app/modules/policies/notification-settings/notification-settings.module.ts index 559d9b0467..12e378b1d2 100644 --- a/console/src/app/modules/policies/notification-settings/notification-settings.module.ts +++ b/console/src/app/modules/policies/notification-settings/notification-settings.module.ts @@ -10,6 +10,7 @@ import { TranslateModule } from '@ngx-translate/core'; import { CardModule } from '../../card/card.module'; import { FormFieldModule } from '../../form-field/form-field.module'; +import { InfoSectionModule } from '../../info-section/info-section.module'; import { InputModule } from '../../input/input.module'; import { DialogAddSMSProviderComponent } from './dialog-add-sms-provider/dialog-add-sms-provider.component'; import { NotificationSettingsComponent } from './notification-settings.component'; @@ -19,6 +20,7 @@ import { NotificationSettingsComponent } from './notification-settings.component imports: [ CommonModule, CardModule, + InfoSectionModule, FormsModule, ReactiveFormsModule, MatButtonModule, diff --git a/console/src/app/modules/sidenav/sidenav.component.html b/console/src/app/modules/sidenav/sidenav.component.html index 34bd0ee6d4..bc1309041f 100644 --- a/console/src/app/modules/sidenav/sidenav.component.html +++ b/console/src/app/modules/sidenav/sidenav.component.html @@ -32,6 +32,7 @@ [ngClass]="{ active: currentSetting === setting.id, show: currentSetting === undefined }" > {{ setting.i18nKey | translate }} + diff --git a/console/src/app/modules/sidenav/sidenav.component.scss b/console/src/app/modules/sidenav/sidenav.component.scss index 6503d9baaf..0636d2f749 100644 --- a/console/src/app/modules/sidenav/sidenav.component.scss +++ b/console/src/app/modules/sidenav/sidenav.component.scss @@ -67,21 +67,35 @@ background: none; text-align: left; padding: 0.75rem 0; - opacity: 0.6; font-size: 15px; cursor: pointer; color: map-get($foreground, base); display: flex; align-items: center; + span { + opacity: 0.6; + } + i { font-size: 1.2rem; height: 1.2rem; line-height: 1.2rem; } + .warn-icon { + color: map-get($background, alert); + margin-left: 0.5rem; + font-size: 1.2rem; + height: 1.2rem; + width: 1.2rem; + flex-shrink: 0; + } + &:hover { - opacity: 1; + span { + opacity: 1; + } } &.mob-only { @@ -108,7 +122,10 @@ &.active { font-weight: 600; - opacity: 1; + + span { + opacity: 1; + } } } } diff --git a/console/src/app/modules/sidenav/sidenav.component.ts b/console/src/app/modules/sidenav/sidenav.component.ts index ac3e38c493..25b3610428 100644 --- a/console/src/app/modules/sidenav/sidenav.component.ts +++ b/console/src/app/modules/sidenav/sidenav.component.ts @@ -9,6 +9,7 @@ export interface SidenavSetting { i18nKey: string; groupI18nKey?: string; requiredRoles?: { [serviceType in PolicyComponentServiceType]: string[] }; + showWarn?: boolean; } @Component({ diff --git a/console/src/app/pages/failed-events/failed-events.component.html b/console/src/app/pages/failed-events/failed-events.component.html index 96f069fadb..958d187ad5 100644 --- a/console/src/app/pages/failed-events/failed-events.component.html +++ b/console/src/app/pages/failed-events/failed-events.component.html @@ -1,40 +1,38 @@

{{ 'IAM.FAILEDEVENTS.TITLE' | translate }}

-

{{'IAM.FAILEDEVENTS.DESCRIPTION' | translate }}

+

{{ 'IAM.FAILEDEVENTS.DESCRIPTION' | translate }}

- - - + +
- - + + - - + + - + - + - + @@ -42,8 +40,13 @@ - +
{{ 'IAM.FAILEDEVENTS.VIEWNAME' | translate }} {{event.viewName}} {{ 'IAM.FAILEDEVENTS.VIEWNAME' | translate }}{{ event.viewName }} {{ 'IAM.FAILEDEVENTS.DATABASE' | translate }} {{event.database}} {{ 'IAM.FAILEDEVENTS.DATABASE' | translate }}{{ event.database }} {{ 'IAM.FAILEDEVENTS.FAILEDSEQUENCE' | translate }} {{ 'IAM.FAILEDEVENTS.FAILEDSEQUENCE' | translate }} - {{event?.failedSequence}} + {{ event?.failedSequence }} {{ 'IAM.FAILEDEVENTS.FAILURECOUNT' | translate }} {{ 'IAM.FAILEDEVENTS.FAILURECOUNT' | translate }} - {{event?.failureCount }} + {{ event?.failureCount }} {{ 'IAM.FAILEDEVENTS.ERRORMESSAGE' | translate }} {{ 'IAM.FAILEDEVENTS.ERRORMESSAGE' | translate }} - {{event?.errorMessage }} + {{ event?.errorMessage }} - @@ -51,10 +54,10 @@
-
\ No newline at end of file +
diff --git a/console/src/app/pages/failed-events/failed-events.component.ts b/console/src/app/pages/failed-events/failed-events.component.ts index 62404bc016..d93a4a44e9 100644 --- a/console/src/app/pages/failed-events/failed-events.component.ts +++ b/console/src/app/pages/failed-events/failed-events.component.ts @@ -15,7 +15,7 @@ import { ToastService } from 'src/app/services/toast.service'; }) export class FailedEventsComponent implements AfterViewInit { @ViewChild(MatPaginator) public eventPaginator!: MatPaginator; - public eventDataSource!: MatTableDataSource; + public eventDataSource: MatTableDataSource = new MatTableDataSource([]); public eventDisplayedColumns: string[] = [ 'viewName', @@ -59,8 +59,8 @@ export class FailedEventsComponent implements AfterViewInit { catchError(() => of([])), finalize(() => this.loadingSubject.next(false)), ) - .subscribe((views) => { - this.eventDataSource = new MatTableDataSource(views); + .subscribe((events) => { + this.eventDataSource = new MatTableDataSource(events); this.eventDataSource.paginator = this.eventPaginator; }); } diff --git a/console/src/app/pages/iam-views/iam-views.component.html b/console/src/app/pages/iam-views/iam-views.component.html index 8325aa32a9..7b2930d03c 100644 --- a/console/src/app/pages/iam-views/iam-views.component.html +++ b/console/src/app/pages/iam-views/iam-views.component.html @@ -1,45 +1,42 @@
-

{{ 'IAM.VIEWS.TITLE' | translate }}

-

{{'IAM.VIEWS.DESCRIPTION' | translate }}

+

{{ 'IAM.VIEWS.TITLE' | translate }}

+

{{ 'IAM.VIEWS.DESCRIPTION' | translate }}

- + + + + + + -
{{ 'IAM.VIEWS.VIEWNAME' | translate }}{{ view.viewName }}
- - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - - -
{{ 'IAM.VIEWS.VIEWNAME' | translate }} {{view.viewName}} {{ 'IAM.VIEWS.DATABASE' | translate }}{{ view.database }} {{ 'IAM.VIEWS.DATABASE' | translate }} {{view.database}} {{ 'IAM.VIEWS.SEQUENCE' | translate }}{{ view.processedSequence }} {{ 'IAM.VIEWS.SEQUENCE' | translate }} {{view.processedSequence}} {{ 'IAM.VIEWS.EVENTTIMESTAMP' | translate }} + {{ view?.eventTimestamp | timestampToDate | localizedDate: 'EEE dd. MMM, HH:mm' }} + {{ 'IAM.VIEWS.EVENTTIMESTAMP' | translate }} - {{view?.eventTimestamp | timestampToDate | localizedDate: 'EEE dd. MMM, HH:mm' }} - {{ 'IAM.VIEWS.LASTSPOOL' | translate }} + {{ view?.lastSuccessfulSpoolerRun | timestampToDate | localizedDate: 'EEE dd. MMM, HH:mm' }} + {{ 'IAM.VIEWS.LASTSPOOL' | translate }} - {{view?.lastSuccessfulSpoolerRun | timestampToDate | localizedDate: 'EEE dd. MMM, HH:mm' - }} -
- - -
-
\ No newline at end of file + + + + + + + diff --git a/console/src/app/pages/iam-views/iam-views.component.ts b/console/src/app/pages/iam-views/iam-views.component.ts index d9fe7910b4..007148bae9 100644 --- a/console/src/app/pages/iam-views/iam-views.component.ts +++ b/console/src/app/pages/iam-views/iam-views.component.ts @@ -17,7 +17,7 @@ export class IamViewsComponent implements AfterViewInit { @ViewChild(MatSort) sort!: MatSort; @ViewChild(MatPaginator) public paginator!: MatPaginator; - public dataSource!: MatTableDataSource; + public dataSource: MatTableDataSource = new MatTableDataSource([]); public displayedColumns: string[] = ['viewName', 'database', 'sequence', 'eventTimestamp', 'lastSuccessfulSpoolerRun']; @@ -51,7 +51,7 @@ export class IamViewsComponent implements AfterViewInit { finalize(() => this.loadingSubject.next(false)), ) .subscribe((views) => { - this.dataSource = new MatTableDataSource(views); + this.dataSource = new MatTableDataSource(views); this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort; }); diff --git a/console/src/app/pages/instance-settings/instance-settings.component.ts b/console/src/app/pages/instance-settings/instance-settings.component.ts index b1ae05306c..b35ca912bb 100644 --- a/console/src/app/pages/instance-settings/instance-settings.component.ts +++ b/console/src/app/pages/instance-settings/instance-settings.component.ts @@ -31,7 +31,7 @@ export class InstanceSettingsComponent { public settingsList: SidenavSetting[] = [ GENERAL, // notifications - NOTIFICATIONS, + { showWarn: true, ...NOTIFICATIONS }, // login LOGIN, COMPLEXITY, diff --git a/console/src/app/pages/users/user-list/user-table/user-table.component.ts b/console/src/app/pages/users/user-list/user-table/user-table.component.ts index 5d23344eb7..b185254a87 100644 --- a/console/src/app/pages/users/user-list/user-table/user-table.component.ts +++ b/console/src/app/pages/users/user-list/user-table/user-table.component.ts @@ -241,7 +241,12 @@ export class UserTableComponent implements OnInit { public applySearchQuery(searchQueries: SearchQuery[]): void { this.selection.clear(); - this.getData(this.paginator.pageSize, this.paginator.pageIndex * this.paginator.pageSize, this.type, searchQueries); + this.getData( + this.paginator ? this.paginator.pageSize : this.INITIAL_PAGE_SIZE, + this.paginator ? this.paginator.pageIndex * this.paginator.pageSize : 0, + this.type, + searchQueries, + ); } public deleteUser(user: User.AsObject): void { diff --git a/console/src/app/services/admin.service.ts b/console/src/app/services/admin.service.ts index 955b5d2650..c9736cc78f 100644 --- a/console/src/app/services/admin.service.ts +++ b/console/src/app/services/admin.service.ts @@ -579,9 +579,8 @@ export class AdminService { return this.grpcService.admin.getLogNotificationProvider(req, null).then((resp) => resp.toObject()); } - public getFileSystemNotificationProvider( - req: GetFileSystemNotificationProviderRequest, - ): Promise { + public getFileSystemNotificationProvider(): Promise { + const req = new GetFileSystemNotificationProviderRequest(); return this.grpcService.admin.getFileSystemNotificationProvider(req, null).then((resp) => resp.toObject()); } diff --git a/console/src/assets/i18n/de.json b/console/src/assets/i18n/de.json index 7543ee270d..7051bcc34c 100644 --- a/console/src/assets/i18n/de.json +++ b/console/src/assets/i18n/de.json @@ -847,7 +847,8 @@ "USER": "Benutzer", "PASSWORD": "Passwort", "TLS": "Transport Layer Security (TLS)", - "SAVED": "Erfolgreich gespeichert." + "SAVED": "Erfolgreich gespeichert.", + "REQUIREDWARN": "Damit Mails von Ihrer Domain verschickt werden können, müssen Sie Ihre SMTP Einstellungen konfigurieren." }, "SMS": { "TITLE": "SMS Einstellungen", diff --git a/console/src/assets/i18n/en.json b/console/src/assets/i18n/en.json index 62bb62bd04..a2caa916e5 100644 --- a/console/src/assets/i18n/en.json +++ b/console/src/assets/i18n/en.json @@ -847,7 +847,8 @@ "USER": "User", "PASSWORD": "Password", "TLS": "Transport Layer Security (TLS)", - "SAVED": "Saved successfully!" + "SAVED": "Saved successfully!", + "REQUIREDWARN": "To send notifications from your domain, you have to enter your SMTP data." }, "SMS": { "TITLE": "SMS Settings", diff --git a/console/src/assets/i18n/it.json b/console/src/assets/i18n/it.json index 0b095d6fda..e85bc5d1aa 100644 --- a/console/src/assets/i18n/it.json +++ b/console/src/assets/i18n/it.json @@ -847,7 +847,8 @@ "USER": "Utente", "PASSWORD": "Password", "TLS": "Transport Layer Security (TLS)", - "SAVED": "Salvato con successo!" + "SAVED": "Salvato con successo!", + "REQUIREDWARN": "Per inviare notifiche dal tuo dominio, devi inserire i tuoi dati SMTP." }, "SMS": { "TITLE": "Impostazioni SMS", diff --git a/console/src/assets/mdi/shield-alert.svg b/console/src/assets/mdi/shield-alert.svg new file mode 100644 index 0000000000..a8fcb7abfd --- /dev/null +++ b/console/src/assets/mdi/shield-alert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/console/src/styles.scss b/console/src/styles.scss index fa9f141199..d3a71f0ea2 100644 --- a/console/src/styles.scss +++ b/console/src/styles.scss @@ -253,6 +253,7 @@ $caos-dark-theme-background: ( tooltip: map_get($mat-gray, 700), infosection: map_get($caos-dark-background, 300), warninfosection: #741f2c4a, + alertinfosection: #92400e50, successinfosection: map_get($caos-dark-background, 300), state: map_get($caos-dark-background, 300), state-active: #68cf8340, @@ -261,6 +262,7 @@ $caos-dark-theme-background: ( moz-toolbar: map_get($caos-dark-background, 500), footer: #00000020, metadata-section: #00000020, + alert: #fbbf24, ); $caos-light-theme-background: ( @@ -287,11 +289,13 @@ $caos-light-theme-background: ( tooltip: map_get($mat-gray, 700), infosection: map_get($caos-light-primary, 100), warninfosection: #ffc1c1, + alertinfosection: rgb(251, 191, 36), successinfosection: #cbf4c9, toolbar: rgba(map_get($caos-light-background, 500), 0.9), moz-toolbar: map_get($caos-light-background, 500), footer: #00000008, metadata-section: #605f5f08, + alert: rgb(251, 191, 36), ); $caos-dark-theme-foreground: ( @@ -313,6 +317,7 @@ $caos-dark-theme-foreground: ( slider-off-active: rgba(white, 0.38), infosection: #f0f0f0, warninfosection: #ffc1c1, + alertinfosection: rgb(251, 191, 36), successinfosection: #cbf4c9, toolbar-items: map-get(map-get($caos-dark-primary, contrast), 500), slash: #ffffff6e, @@ -337,6 +342,7 @@ $caos-light-theme-foreground: ( slider-off-active: rgba(black, 0.38), infosection: #4a4a4a, warninfosection: #620e0e, + alertinfosection: rgb(146, 64, 14), successinfosection: #0e6245, toolbar-items: map-get(map-get($caos-light-primary, contrast), 500), slash: #0000006e, diff --git a/console/tsconfig.json b/console/tsconfig.json index 11a1482803..d0aa2840c8 100644 --- a/console/tsconfig.json +++ b/console/tsconfig.json @@ -16,10 +16,7 @@ "importHelpers": true, "target": "es2015", "module": "es2020", - "lib": [ - "es2019", - "dom" - ] + "lib": ["es2020", "dom"] }, "angularCompilerOptions": { "strictInjectionParameters": true,