2020-05-13 14:41:43 +02:00
|
|
|
import { Component, Input, OnInit } from '@angular/core';
|
2020-06-10 12:59:12 +02:00
|
|
|
import { BehaviorSubject, from, Observable, of } from 'rxjs';
|
|
|
|
|
import { catchError, scan, take, tap } from 'rxjs/operators';
|
2020-05-13 14:41:43 +02:00
|
|
|
import { Change, Changes } from 'src/app/proto/generated/management_pb';
|
2020-07-02 17:16:47 +02:00
|
|
|
import { AuthUserService } from 'src/app/services/auth-user.service';
|
2020-05-13 14:41:43 +02:00
|
|
|
import { MgmtUserService } from 'src/app/services/mgmt-user.service';
|
|
|
|
|
|
|
|
|
|
export enum ChangeType {
|
2020-07-02 17:16:47 +02:00
|
|
|
MYUSER = 'myuser',
|
2020-05-13 14:41:43 +02:00
|
|
|
USER = 'user',
|
|
|
|
|
ORG = 'org',
|
|
|
|
|
PROJECT = 'project',
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Component({
|
|
|
|
|
selector: 'app-changes',
|
|
|
|
|
templateUrl: './changes.component.html',
|
|
|
|
|
styleUrls: ['./changes.component.scss'],
|
|
|
|
|
})
|
|
|
|
|
export class ChangesComponent implements OnInit {
|
|
|
|
|
@Input() public changeType: ChangeType = ChangeType.USER;
|
|
|
|
|
@Input() public id: string = '';
|
2020-06-25 12:52:57 +02:00
|
|
|
@Input() public sortDirectionAsc: boolean = true;
|
2020-06-26 14:15:05 +02:00
|
|
|
public bottom: boolean = false;
|
2020-05-13 14:41:43 +02:00
|
|
|
|
|
|
|
|
private _done: BehaviorSubject<any> = new BehaviorSubject(false);
|
|
|
|
|
private _loading: BehaviorSubject<any> = new BehaviorSubject(false);
|
|
|
|
|
private _data: BehaviorSubject<any> = new BehaviorSubject([]);
|
|
|
|
|
|
|
|
|
|
loading: Observable<boolean> = this._loading.asObservable();
|
|
|
|
|
public data!: Observable<Change.AsObject[]>;
|
|
|
|
|
public changes!: Changes.AsObject;
|
2020-07-02 17:16:47 +02:00
|
|
|
constructor(private mgmtUserService: MgmtUserService, private authUserService: AuthUserService) { }
|
2020-05-13 14:41:43 +02:00
|
|
|
|
|
|
|
|
ngOnInit(): void {
|
|
|
|
|
this.init();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public scrollHandler(e: any): void {
|
|
|
|
|
if (e === 'bottom') {
|
|
|
|
|
this.more();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private init(): void {
|
|
|
|
|
let first: Promise<Changes>;
|
|
|
|
|
switch (this.changeType) {
|
feat(console): user memberships, generic member create dialog, fix user autocomplete emitter (#606)
* load manager mgmtservice, user service
* add org memberships
* membership component, generic member creation
* refactor member create dialog
* project autocomplete context
* create batch managers in user component
* project context wrapper
* emit on user removal, preselect user on init
* membership avatar style, service
* auth user memberships, navigate to target
* cursor fix, avatar gen
* lint
* i18n fix
* remove role translations
* membership detail page, i18n
* fix role label i18n, after view init loader
* remove projectid from grant remove
* fix iam race condition
* refresh table ts, fix no permission project search
* change membership colors
* refresh table everywhere, replace assets, routing
* fix logo header size
* lint, fix project grant removal
* timestmp for p mem, user list, grants, p list (#615)
* npm audit
* update deps, resolve vulnerability
* fix tslint config
* update lock
* load 20 changes at once
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/en.json
Co-authored-by: Florian Forster <florian@caos.ch>
* membership i18n
Co-authored-by: Florian Forster <florian@caos.ch>
2020-08-24 08:48:47 +02:00
|
|
|
case ChangeType.MYUSER: first = this.authUserService.GetMyUserChanges(20, 0);
|
2020-07-02 17:16:47 +02:00
|
|
|
break;
|
feat(console): user memberships, generic member create dialog, fix user autocomplete emitter (#606)
* load manager mgmtservice, user service
* add org memberships
* membership component, generic member creation
* refactor member create dialog
* project autocomplete context
* create batch managers in user component
* project context wrapper
* emit on user removal, preselect user on init
* membership avatar style, service
* auth user memberships, navigate to target
* cursor fix, avatar gen
* lint
* i18n fix
* remove role translations
* membership detail page, i18n
* fix role label i18n, after view init loader
* remove projectid from grant remove
* fix iam race condition
* refresh table ts, fix no permission project search
* change membership colors
* refresh table everywhere, replace assets, routing
* fix logo header size
* lint, fix project grant removal
* timestmp for p mem, user list, grants, p list (#615)
* npm audit
* update deps, resolve vulnerability
* fix tslint config
* update lock
* load 20 changes at once
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/en.json
Co-authored-by: Florian Forster <florian@caos.ch>
* membership i18n
Co-authored-by: Florian Forster <florian@caos.ch>
2020-08-24 08:48:47 +02:00
|
|
|
case ChangeType.USER: first = this.mgmtUserService.UserChanges(this.id, 20, 0);
|
2020-05-13 14:41:43 +02:00
|
|
|
break;
|
|
|
|
|
case ChangeType.PROJECT: first = this.mgmtUserService.ProjectChanges(this.id, 20, 0);
|
|
|
|
|
break;
|
feat(console): user memberships, generic member create dialog, fix user autocomplete emitter (#606)
* load manager mgmtservice, user service
* add org memberships
* membership component, generic member creation
* refactor member create dialog
* project autocomplete context
* create batch managers in user component
* project context wrapper
* emit on user removal, preselect user on init
* membership avatar style, service
* auth user memberships, navigate to target
* cursor fix, avatar gen
* lint
* i18n fix
* remove role translations
* membership detail page, i18n
* fix role label i18n, after view init loader
* remove projectid from grant remove
* fix iam race condition
* refresh table ts, fix no permission project search
* change membership colors
* refresh table everywhere, replace assets, routing
* fix logo header size
* lint, fix project grant removal
* timestmp for p mem, user list, grants, p list (#615)
* npm audit
* update deps, resolve vulnerability
* fix tslint config
* update lock
* load 20 changes at once
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/en.json
Co-authored-by: Florian Forster <florian@caos.ch>
* membership i18n
Co-authored-by: Florian Forster <florian@caos.ch>
2020-08-24 08:48:47 +02:00
|
|
|
case ChangeType.ORG: first = this.mgmtUserService.OrgChanges(this.id, 20, 0);
|
2020-05-13 14:41:43 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.mapAndUpdate(first);
|
|
|
|
|
|
|
|
|
|
// Create the observable array for consumption in components
|
|
|
|
|
this.data = this._data.asObservable().pipe(
|
|
|
|
|
scan((acc, val) => {
|
|
|
|
|
return false ? val.concat(acc) : acc.concat(val);
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private more(): void {
|
|
|
|
|
const cursor = this.getCursor();
|
|
|
|
|
|
|
|
|
|
let more: Promise<Changes>;
|
|
|
|
|
|
|
|
|
|
switch (this.changeType) {
|
feat(console): user memberships, generic member create dialog, fix user autocomplete emitter (#606)
* load manager mgmtservice, user service
* add org memberships
* membership component, generic member creation
* refactor member create dialog
* project autocomplete context
* create batch managers in user component
* project context wrapper
* emit on user removal, preselect user on init
* membership avatar style, service
* auth user memberships, navigate to target
* cursor fix, avatar gen
* lint
* i18n fix
* remove role translations
* membership detail page, i18n
* fix role label i18n, after view init loader
* remove projectid from grant remove
* fix iam race condition
* refresh table ts, fix no permission project search
* change membership colors
* refresh table everywhere, replace assets, routing
* fix logo header size
* lint, fix project grant removal
* timestmp for p mem, user list, grants, p list (#615)
* npm audit
* update deps, resolve vulnerability
* fix tslint config
* update lock
* load 20 changes at once
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/en.json
Co-authored-by: Florian Forster <florian@caos.ch>
* membership i18n
Co-authored-by: Florian Forster <florian@caos.ch>
2020-08-24 08:48:47 +02:00
|
|
|
case ChangeType.MYUSER: more = this.authUserService.GetMyUserChanges(20, cursor);
|
2020-07-02 17:16:47 +02:00
|
|
|
break;
|
feat(console): user memberships, generic member create dialog, fix user autocomplete emitter (#606)
* load manager mgmtservice, user service
* add org memberships
* membership component, generic member creation
* refactor member create dialog
* project autocomplete context
* create batch managers in user component
* project context wrapper
* emit on user removal, preselect user on init
* membership avatar style, service
* auth user memberships, navigate to target
* cursor fix, avatar gen
* lint
* i18n fix
* remove role translations
* membership detail page, i18n
* fix role label i18n, after view init loader
* remove projectid from grant remove
* fix iam race condition
* refresh table ts, fix no permission project search
* change membership colors
* refresh table everywhere, replace assets, routing
* fix logo header size
* lint, fix project grant removal
* timestmp for p mem, user list, grants, p list (#615)
* npm audit
* update deps, resolve vulnerability
* fix tslint config
* update lock
* load 20 changes at once
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/en.json
Co-authored-by: Florian Forster <florian@caos.ch>
* membership i18n
Co-authored-by: Florian Forster <florian@caos.ch>
2020-08-24 08:48:47 +02:00
|
|
|
case ChangeType.USER: more = this.mgmtUserService.UserChanges(this.id, 20, cursor);
|
2020-05-13 14:41:43 +02:00
|
|
|
break;
|
feat(console): user memberships, generic member create dialog, fix user autocomplete emitter (#606)
* load manager mgmtservice, user service
* add org memberships
* membership component, generic member creation
* refactor member create dialog
* project autocomplete context
* create batch managers in user component
* project context wrapper
* emit on user removal, preselect user on init
* membership avatar style, service
* auth user memberships, navigate to target
* cursor fix, avatar gen
* lint
* i18n fix
* remove role translations
* membership detail page, i18n
* fix role label i18n, after view init loader
* remove projectid from grant remove
* fix iam race condition
* refresh table ts, fix no permission project search
* change membership colors
* refresh table everywhere, replace assets, routing
* fix logo header size
* lint, fix project grant removal
* timestmp for p mem, user list, grants, p list (#615)
* npm audit
* update deps, resolve vulnerability
* fix tslint config
* update lock
* load 20 changes at once
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/en.json
Co-authored-by: Florian Forster <florian@caos.ch>
* membership i18n
Co-authored-by: Florian Forster <florian@caos.ch>
2020-08-24 08:48:47 +02:00
|
|
|
case ChangeType.PROJECT: more = this.mgmtUserService.ProjectChanges(this.id, 20, cursor);
|
2020-05-13 14:41:43 +02:00
|
|
|
break;
|
feat(console): user memberships, generic member create dialog, fix user autocomplete emitter (#606)
* load manager mgmtservice, user service
* add org memberships
* membership component, generic member creation
* refactor member create dialog
* project autocomplete context
* create batch managers in user component
* project context wrapper
* emit on user removal, preselect user on init
* membership avatar style, service
* auth user memberships, navigate to target
* cursor fix, avatar gen
* lint
* i18n fix
* remove role translations
* membership detail page, i18n
* fix role label i18n, after view init loader
* remove projectid from grant remove
* fix iam race condition
* refresh table ts, fix no permission project search
* change membership colors
* refresh table everywhere, replace assets, routing
* fix logo header size
* lint, fix project grant removal
* timestmp for p mem, user list, grants, p list (#615)
* npm audit
* update deps, resolve vulnerability
* fix tslint config
* update lock
* load 20 changes at once
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/de.json
Co-authored-by: Florian Forster <florian@caos.ch>
* Update console/src/assets/i18n/en.json
Co-authored-by: Florian Forster <florian@caos.ch>
* membership i18n
Co-authored-by: Florian Forster <florian@caos.ch>
2020-08-24 08:48:47 +02:00
|
|
|
case ChangeType.ORG: more = this.mgmtUserService.OrgChanges(this.id, 20, cursor);
|
2020-05-13 14:41:43 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.mapAndUpdate(more);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Determines the snapshot to paginate query
|
|
|
|
|
private getCursor(): number {
|
|
|
|
|
const current = this._data.value;
|
|
|
|
|
if (current.length) {
|
2020-06-25 12:52:57 +02:00
|
|
|
return !this.sortDirectionAsc ? current[0].sequence :
|
|
|
|
|
current[current.length - 1].sequence;
|
2020-05-13 14:41:43 +02:00
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Maps the snapshot to usable format the updates source
|
|
|
|
|
private mapAndUpdate(col: Promise<Changes>): any {
|
|
|
|
|
if (this._done.value || this._loading.value) { return; }
|
|
|
|
|
|
|
|
|
|
// Map snapshot with doc ref (needed for cursor)
|
2020-06-26 14:15:05 +02:00
|
|
|
if (!this.bottom) {
|
|
|
|
|
// loading
|
|
|
|
|
this._loading.next(true);
|
|
|
|
|
|
|
|
|
|
return from(col).pipe(
|
|
|
|
|
tap((res: Changes) => {
|
|
|
|
|
let values = res.toObject().changesList;
|
|
|
|
|
// If prepending, reverse the batch order
|
|
|
|
|
values = false ? values.reverse() : values;
|
|
|
|
|
|
|
|
|
|
// update source with new values, done loading
|
|
|
|
|
this._data.next(values);
|
|
|
|
|
|
|
|
|
|
this._loading.next(false);
|
|
|
|
|
|
|
|
|
|
// no more values, mark done
|
|
|
|
|
if (!values.length) {
|
|
|
|
|
this._done.next(true);
|
|
|
|
|
}
|
|
|
|
|
}),
|
|
|
|
|
catchError(err => {
|
|
|
|
|
this._loading.next(false);
|
|
|
|
|
this.bottom = true;
|
|
|
|
|
return of([]);
|
|
|
|
|
}),
|
|
|
|
|
take(1),
|
|
|
|
|
).subscribe();
|
|
|
|
|
}
|
2020-05-13 14:41:43 +02:00
|
|
|
}
|
|
|
|
|
}
|