ngx-techlify-core 18.18.0 → 18.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/esm2022/lib/app-admin/tenant/tenant-list-widget/tenant-list-widget.component.mjs +6 -4
  2. package/esm2022/lib/company-information/company-info-display/company-info-display.component.mjs +18 -4
  3. package/esm2022/lib/company-information/company-information/company-information.component.mjs +42 -15
  4. package/esm2022/lib/company-information/tenant-form-button/tenant-form-button.component.mjs +36 -0
  5. package/esm2022/lib/document-viewer/document-viewer.component.mjs +3 -3
  6. package/esm2022/lib/user/app-admin-user-view/app-admin-user-view.component.mjs +1 -1
  7. package/esm2022/lib/user/app-admin-user-view/app-admin-user-view.module.mjs +9 -5
  8. package/esm2022/lib/user/current-user.service.mjs +5 -4
  9. package/esm2022/lib/user/index.mjs +4 -1
  10. package/esm2022/lib/user/user-enable-button-component/user-enable-button.module.mjs +28 -0
  11. package/esm2022/lib/user/user-form.component.mjs +2 -2
  12. package/esm2022/lib/user/user-sessions/user-sessions/user-sessions.module.mjs +28 -0
  13. package/esm2022/lib/user/user.module.mjs +24 -26
  14. package/esm2022/lib/user-client-enable-disable-button/user-client-enable-disable-button.module.mjs +28 -0
  15. package/esm2022/lib/user-clients-list/user-clients-list.module.mjs +32 -0
  16. package/esm2022/lib/user-config/user-config.service.mjs +3 -3
  17. package/esm2022/public-api.mjs +5 -1
  18. package/fesm2022/ngx-techlify-core.mjs +577 -413
  19. package/fesm2022/ngx-techlify-core.mjs.map +1 -1
  20. package/lib/company-information/company-info-display/company-info-display.component.d.ts +5 -1
  21. package/lib/company-information/company-information/company-information.component.d.ts +6 -2
  22. package/lib/company-information/tenant-form-button/tenant-form-button.component.d.ts +14 -0
  23. package/lib/user/app-admin-user-view/app-admin-user-view.module.d.ts +3 -2
  24. package/lib/user/current-user.service.d.ts +2 -1
  25. package/lib/user/index.d.ts +3 -0
  26. package/lib/user/user-enable-button-component/user-enable-button.module.d.ts +10 -0
  27. package/lib/user/user-form.component.d.ts +2 -2
  28. package/lib/user/user-sessions/user-sessions/user-sessions.module.d.ts +10 -0
  29. package/lib/user/user.module.d.ts +20 -21
  30. package/lib/user-client-enable-disable-button/user-client-enable-disable-button.module.d.ts +10 -0
  31. package/lib/user-clients-list/user-clients-list.module.d.ts +11 -0
  32. package/lib/user-config/user-config.service.d.ts +2 -2
  33. package/package.json +1 -1
  34. package/public-api.d.ts +3 -0
@@ -6,13 +6,13 @@ import * as i7 from '@angular/flex-layout/flex';
6
6
  import * as i6 from '@angular/material/button';
7
7
  import { MatButtonModule, MatButton } from '@angular/material/button';
8
8
  import { __decorate } from 'tslib';
9
- import { debounceTime, catchError, switchMap, map, distinctUntilChanged, startWith, finalize, filter } from 'rxjs/operators';
9
+ import { debounceTime, catchError, switchMap, map as map$1, distinctUntilChanged, startWith, finalize, filter } from 'rxjs/operators';
10
10
  import { untilDestroyed, UntilDestroy } from '@ngneat/until-destroy';
11
11
  import * as i9 from '@angular/material/sort';
12
12
  import { MatSort, MatSortModule } from '@angular/material/sort';
13
13
  import * as i2 from '@angular/flex-layout/extended';
14
14
  import * as i2$1 from '@angular/common';
15
- import { CommonModule, DatePipe, NgIf } from '@angular/common';
15
+ import { CommonModule, DatePipe, NgIf, NgTemplateOutlet } from '@angular/common';
16
16
  import * as i14 from 'ngx-infinite-scroll';
17
17
  import { InfiniteScrollModule } from 'ngx-infinite-scroll';
18
18
  import * as i8 from '@angular/material/checkbox';
@@ -31,7 +31,7 @@ import * as i1$4 from '@angular/forms';
31
31
  import { UntypedFormControl, Validators, ReactiveFormsModule, FormsModule, NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
32
32
  import * as i1$2 from '@angular/common/http';
33
33
  import { HttpErrorResponse, HttpResponse, HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
34
- import { throwError, Observable, Subject, of, BehaviorSubject, map as map$1, Subscription, from, finalize as finalize$1, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, startWith as startWith$1 } from 'rxjs';
34
+ import { throwError, Observable, Subject, BehaviorSubject, of, map, Subscription, from, finalize as finalize$1, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, startWith as startWith$1 } from 'rxjs';
35
35
  import * as i1$1 from '@angular/material/snack-bar';
36
36
  import { MAT_SNACK_BAR_DATA, MatSnackBarModule } from '@angular/material/snack-bar';
37
37
  import * as i9$1 from '@angular/material/form-field';
@@ -65,6 +65,7 @@ import * as i11 from '@angular/material/datepicker';
65
65
  import { MatDatepickerModule } from '@angular/material/datepicker';
66
66
  import * as i2$2 from '@angular/platform-browser';
67
67
  import * as XLSX from 'xlsx';
68
+ import { FlexLayoutModule, FlexModule } from '@angular/flex-layout';
68
69
  import * as i12 from '@angular/material/progress-spinner';
69
70
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
70
71
  import * as i5$2 from '@angular/material/divider';
@@ -74,7 +75,6 @@ import { MatListModule, MatSelectionList, MatListOption } from '@angular/materia
74
75
  import { MatSidenavModule } from '@angular/material/sidenav';
75
76
  import * as i8$6 from '@angular/material/slide-toggle';
76
77
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
77
- import { FlexLayoutModule, FlexModule } from '@angular/flex-layout';
78
78
  import * as i14$1 from 'ngx-editor';
79
79
  import { Editor, NgxEditorModule } from 'ngx-editor';
80
80
  import * as jsondiffpatch from 'jsondiffpatch';
@@ -586,11 +586,11 @@ class DocumentViewerComponent {
586
586
  return file.split('.').pop();
587
587
  }
588
588
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
589
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DocumentViewerComponent, selector: "app-document-viewer", inputs: { config: "config", file: "file", fileUrl: "fileUrl", disableEdit: "disableEdit" }, outputs: { remove: "remove" }, ngImport: i0, template: "<mat-card *ngIf=\"viewerType === 'image'\">\n <img [ngStyle]=\"config.imageStyle\" mat-card-image [src]=\"fileUrl\" />\n <mat-card-actions>\n <button type=\"button\" mat-raised-button (click)=\"removeFile()\" *ngIf=\"!disableEdit && !config.hideRemove\">\n Remove\n </button>\n </mat-card-actions>\n</mat-card>\n\n<div class=\"mat-elevation-z1 p-4\" *ngIf=\"viewerType !== 'image'\">\n <a [href]=\"fileUrl\" target=\"_blank\">{{fileName}}</a>\n <ngx-doc-viewer [ngStyle]=\"config.viewerStyle\" *ngIf=\"viewerType !== null\" [url]=\"fileUrl\" [viewer]=\"viewerType\">\n </ngx-doc-viewer>\n <div class=\"mt-2\" *ngIf=\"!config.hideRemove\">\n <button type=\"button\" mat-raised-button (click)=\"removeFile()\" *ngIf=\"!disableEdit\">\n Remove\n </button>\n </div>\n</div>", styles: [".image-fit{height:100%;width:100%;object-fit:cover}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i3.NgxDocViewerComponent, selector: "ngx-doc-viewer", inputs: ["url", "queryParams", "viewerUrl", "googleCheckInterval", "googleMaxChecks", "disableContent", "googleCheckContentLoaded", "viewer", "overrideLocalhost"], outputs: ["loaded"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i4.MatCardImage, selector: "[mat-card-image], [matCardImage]" }] }); }
589
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DocumentViewerComponent, selector: "app-document-viewer", inputs: { config: "config", file: "file", fileUrl: "fileUrl", disableEdit: "disableEdit" }, outputs: { remove: "remove" }, ngImport: i0, template: "<mat-card *ngIf=\"viewerType === 'image'\">\n <img [ngStyle]=\"config.imageStyle\" mat-card-image [src]=\"fileUrl\" style=\"object-fit: contain;\" />\n <mat-card-actions>\n <button type=\"button\" mat-raised-button (click)=\"removeFile()\" *ngIf=\"!disableEdit && !config.hideRemove\">\n Remove\n </button>\n </mat-card-actions>\n</mat-card>\n\n<div class=\"mat-elevation-z1 p-4\" *ngIf=\"viewerType !== 'image'\">\n <a [href]=\"fileUrl\" target=\"_blank\">{{fileName}}</a>\n <ngx-doc-viewer [ngStyle]=\"config.viewerStyle\" *ngIf=\"viewerType !== null\" [url]=\"fileUrl\" [viewer]=\"viewerType\">\n </ngx-doc-viewer>\n <div class=\"mt-2\" *ngIf=\"!config.hideRemove\">\n <button type=\"button\" mat-raised-button (click)=\"removeFile()\" *ngIf=\"!disableEdit\">\n Remove\n </button>\n </div>\n</div>", styles: [".image-fit{height:100%;width:100%;object-fit:cover}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i3.NgxDocViewerComponent, selector: "ngx-doc-viewer", inputs: ["url", "queryParams", "viewerUrl", "googleCheckInterval", "googleMaxChecks", "disableContent", "googleCheckContentLoaded", "viewer", "overrideLocalhost"], outputs: ["loaded"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i4.MatCardImage, selector: "[mat-card-image], [matCardImage]" }] }); }
590
590
  }
591
591
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DocumentViewerComponent, decorators: [{
592
592
  type: Component,
593
- args: [{ selector: 'app-document-viewer', template: "<mat-card *ngIf=\"viewerType === 'image'\">\n <img [ngStyle]=\"config.imageStyle\" mat-card-image [src]=\"fileUrl\" />\n <mat-card-actions>\n <button type=\"button\" mat-raised-button (click)=\"removeFile()\" *ngIf=\"!disableEdit && !config.hideRemove\">\n Remove\n </button>\n </mat-card-actions>\n</mat-card>\n\n<div class=\"mat-elevation-z1 p-4\" *ngIf=\"viewerType !== 'image'\">\n <a [href]=\"fileUrl\" target=\"_blank\">{{fileName}}</a>\n <ngx-doc-viewer [ngStyle]=\"config.viewerStyle\" *ngIf=\"viewerType !== null\" [url]=\"fileUrl\" [viewer]=\"viewerType\">\n </ngx-doc-viewer>\n <div class=\"mt-2\" *ngIf=\"!config.hideRemove\">\n <button type=\"button\" mat-raised-button (click)=\"removeFile()\" *ngIf=\"!disableEdit\">\n Remove\n </button>\n </div>\n</div>", styles: [".image-fit{height:100%;width:100%;object-fit:cover}\n"] }]
593
+ args: [{ selector: 'app-document-viewer', template: "<mat-card *ngIf=\"viewerType === 'image'\">\n <img [ngStyle]=\"config.imageStyle\" mat-card-image [src]=\"fileUrl\" style=\"object-fit: contain;\" />\n <mat-card-actions>\n <button type=\"button\" mat-raised-button (click)=\"removeFile()\" *ngIf=\"!disableEdit && !config.hideRemove\">\n Remove\n </button>\n </mat-card-actions>\n</mat-card>\n\n<div class=\"mat-elevation-z1 p-4\" *ngIf=\"viewerType !== 'image'\">\n <a [href]=\"fileUrl\" target=\"_blank\">{{fileName}}</a>\n <ngx-doc-viewer [ngStyle]=\"config.viewerStyle\" *ngIf=\"viewerType !== null\" [url]=\"fileUrl\" [viewer]=\"viewerType\">\n </ngx-doc-viewer>\n <div class=\"mt-2\" *ngIf=\"!config.hideRemove\">\n <button type=\"button\" mat-raised-button (click)=\"removeFile()\" *ngIf=\"!disableEdit\">\n Remove\n </button>\n </div>\n</div>", styles: [".image-fit{height:100%;width:100%;object-fit:cover}\n"] }]
594
594
  }], ctorParameters: () => [], propDecorators: { config: [{
595
595
  type: Input
596
596
  }], file: [{
@@ -1943,6 +1943,187 @@ class User {
1943
1943
  }
1944
1944
  }
1945
1945
 
1946
+ /**
1947
+ * Service used to manage Local Storage
1948
+ *
1949
+ * @author Joshua Kissoon
1950
+ * @since 20190623
1951
+ */
1952
+ class StorageService {
1953
+ constructor() {
1954
+ this.storageSub = new Subject();
1955
+ }
1956
+ watch() {
1957
+ return this.storageSub.asObservable();
1958
+ }
1959
+ setItem(key, data) {
1960
+ localStorage.setItem(key, data);
1961
+ this.storageSub.next({ key: key, value: data });
1962
+ }
1963
+ getItem(key) {
1964
+ return localStorage.getItem(key);
1965
+ }
1966
+ removeItem(key) {
1967
+ const data = this.getItem(key);
1968
+ localStorage.removeItem(key);
1969
+ this.storageSub.next({ key: key, value: data });
1970
+ }
1971
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1972
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageService, providedIn: 'root' }); }
1973
+ }
1974
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageService, decorators: [{
1975
+ type: Injectable,
1976
+ args: [{
1977
+ providedIn: 'root'
1978
+ }]
1979
+ }], ctorParameters: () => [] });
1980
+
1981
+ /**
1982
+ * Service that manages information about the current user
1983
+ *
1984
+ * @author Joshua Kissoon
1985
+ * @since 20170817
1986
+ */
1987
+ class CurrentUserService {
1988
+ constructor(http, storage) {
1989
+ this.http = http;
1990
+ this.storage = storage;
1991
+ /**Deprecated stop using for new projects */
1992
+ this.userSub = new Subject();
1993
+ // Track the auth status of the user.
1994
+ this.isLoggedIn = new BehaviorSubject(false);
1995
+ }
1996
+ /**
1997
+ * Get the login status of the user.
1998
+ */
1999
+ getAuthStatus() {
2000
+ return this.isLoggedIn.asObservable();
2001
+ }
2002
+ /**
2003
+ * Update the login status of the user.
2004
+ *
2005
+ * @param val The next value of the isLoggedIn.
2006
+ */
2007
+ updateAuthStatus(val) {
2008
+ this.isLoggedIn.next(val);
2009
+ }
2010
+ /**
2011
+ * Returns an user if present, otherwise a empty user
2012
+ * @returns {User} user
2013
+ */
2014
+ getUser() {
2015
+ if (this.user) {
2016
+ return this.user;
2017
+ }
2018
+ this.user = new User();
2019
+ const userFromStorage = JSON.parse(this.storage.getItem('currentUser'));
2020
+ if (userFromStorage) {
2021
+ this.user.loadFromMap(userFromStorage);
2022
+ }
2023
+ return this.user;
2024
+ }
2025
+ /**
2026
+ * @deprecated Don't use for new projects, use getUserObservable() instead
2027
+ * @returns {Observable<User>} Observable of user once changed.
2028
+ */
2029
+ watch() {
2030
+ return this.userSub.asObservable();
2031
+ }
2032
+ /**
2033
+ * Loads the current logged in user
2034
+ * @deprecated use getUserObservable() instead
2035
+ * @param reload whether to fetch new data from server
2036
+ * @returns {Promise<User>} promise of user
2037
+ */
2038
+ getCurrentUser(reload = false) {
2039
+ let promise;
2040
+ if (undefined !== this.data && !reload) {
2041
+ promise = new Promise((resolve, reject) => {
2042
+ resolve(this.data);
2043
+ });
2044
+ return promise;
2045
+ }
2046
+ promise = this.http.get('api/user/current').toPromise();
2047
+ promise.then(res => {
2048
+ this.user = new User();
2049
+ this.data = res;
2050
+ this.user.loadFromMap(res.user);
2051
+ this.storage.setItem('currentUser', JSON.stringify(res.user));
2052
+ this.userSub.next(this.user);
2053
+ });
2054
+ return promise;
2055
+ }
2056
+ /**
2057
+ * Used to update the current user data
2058
+ * @param {any} userData data that needs to be updated to current user
2059
+ */
2060
+ updateCurrentUser(userData) {
2061
+ this.user = new User();
2062
+ this.data = userData;
2063
+ this.user.loadFromMap(userData);
2064
+ this.storage.setItem('currentUser', JSON.stringify(userData));
2065
+ this.userSub.next(this.user);
2066
+ }
2067
+ /**
2068
+ * @param {number} id Id of role
2069
+ * @returns {boolean} true if role is present
2070
+ */
2071
+ hasRole(id) {
2072
+ if (this.user.roles == null) {
2073
+ return false;
2074
+ }
2075
+ return (this.user.roles || []).some(role => role.id == id);
2076
+ }
2077
+ /**
2078
+ * @param {number} id Id of permission
2079
+ * @returns {boolean} true if permission is present
2080
+ */
2081
+ hasPermission(slug) {
2082
+ if (!this.user) {
2083
+ return false;
2084
+ }
2085
+ if (this.user.user_type_id == 1) {
2086
+ return true;
2087
+ }
2088
+ else {
2089
+ if (this.user.permissions == null) {
2090
+ return false;
2091
+ }
2092
+ return (this.user.permissions || []).some(permission => permission.slug == slug);
2093
+ }
2094
+ }
2095
+ /**
2096
+ * Returns the observable of user
2097
+ * @param {boolean} reload - whether to reload the entire user again
2098
+ * @returns {Observable<User>} Observable of user.
2099
+ */
2100
+ getUserObservable(reload = false) {
2101
+ if (this.user && !reload) {
2102
+ return of(this.user);
2103
+ }
2104
+ return this.http.get('api/user/current')
2105
+ .pipe(map((res) => {
2106
+ this.user = new User();
2107
+ this.data = res;
2108
+ this.user.loadFromMap(res.user);
2109
+ this.storage.setItem('currentUser', JSON.stringify(res.user));
2110
+ return this.user;
2111
+ }));
2112
+ }
2113
+ /**
2114
+ * @returns {any} Returns the raw user data
2115
+ */
2116
+ getUserData() {
2117
+ return this.data;
2118
+ }
2119
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CurrentUserService, deps: [{ token: HttpService }, { token: StorageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
2120
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CurrentUserService, providedIn: 'root' }); }
2121
+ }
2122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CurrentUserService, decorators: [{
2123
+ type: Injectable,
2124
+ args: [{ providedIn: 'root' }]
2125
+ }], ctorParameters: () => [{ type: HttpService }, { type: StorageService }] });
2126
+
1946
2127
  class SnackModule {
1947
2128
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SnackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1948
2129
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: SnackModule, declarations: [SuccessSnackComponent,
@@ -2031,7 +2212,7 @@ class AuthenticationService {
2031
2212
  // Update the auth status of the user.
2032
2213
  this.currentUserService.updateAuthStatus(true);
2033
2214
  return this.http.get('api/user/current')
2034
- .pipe(map((res) => {
2215
+ .pipe(map$1((res) => {
2035
2216
  data.user = res?.user;
2036
2217
  this.credentialsService.setCredentials(data, context.remember);
2037
2218
  return data;
@@ -2043,7 +2224,7 @@ class AuthenticationService {
2043
2224
  * @return True if the user was logged out successfully.
2044
2225
  */
2045
2226
  logout() {
2046
- return this.http.post('api/user/logout', {}).pipe(map(() => {
2227
+ return this.http.post('api/user/logout', {}).pipe(map$1(() => {
2047
2228
  // On successful logout, update auth status and clear credentials
2048
2229
  this.currentUserService.updateAuthStatus(false);
2049
2230
  this.credentialsService.setCredentials();
@@ -2096,41 +2277,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
2096
2277
  }]
2097
2278
  }] });
2098
2279
 
2099
- /**
2100
- * Service used to manage Local Storage
2101
- *
2102
- * @author Joshua Kissoon
2103
- * @since 20190623
2104
- */
2105
- class StorageService {
2106
- constructor() {
2107
- this.storageSub = new Subject();
2108
- }
2109
- watch() {
2110
- return this.storageSub.asObservable();
2111
- }
2112
- setItem(key, data) {
2113
- localStorage.setItem(key, data);
2114
- this.storageSub.next({ key: key, value: data });
2115
- }
2116
- getItem(key) {
2117
- return localStorage.getItem(key);
2118
- }
2119
- removeItem(key) {
2120
- const data = this.getItem(key);
2121
- localStorage.removeItem(key);
2122
- this.storageSub.next({ key: key, value: data });
2123
- }
2124
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2125
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageService, providedIn: 'root' }); }
2126
- }
2127
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StorageService, decorators: [{
2128
- type: Injectable,
2129
- args: [{
2130
- providedIn: 'root'
2131
- }]
2132
- }], ctorParameters: () => [] });
2133
-
2134
2280
  /**
2135
2281
  * Service that provides a wrapper for retrieving data from the server
2136
2282
  * @deprecated use HttpService Instead
@@ -2285,168 +2431,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
2285
2431
  }], ctorParameters: () => [{ type: i1$5.Router }] });
2286
2432
 
2287
2433
  /**
2288
- * Service that manages information about the current user
2434
+ * Controller used to explore a User
2289
2435
  *
2290
- * @author Joshua Kissoon
2291
- * @since 20170817
2436
+ * @author Saravana Kumar
2437
+ * @since 20190813
2292
2438
  */
2293
- class CurrentUserService {
2294
- constructor(http, storage) {
2439
+ class UserExploreComponent {
2440
+ constructor(http, dialogRef, data) {
2295
2441
  this.http = http;
2296
- this.storage = storage;
2297
- /**Deprecated stop using for new projects */
2298
- this.userSub = new Subject();
2299
- // Track the auth status of the user.
2300
- this.isLoggedIn = new BehaviorSubject(false);
2301
- }
2302
- /**
2303
- * Get the login status of the user.
2304
- */
2305
- getAuthStatus() {
2306
- return this.isLoggedIn.asObservable();
2442
+ this.dialogRef = dialogRef;
2443
+ this.data = data;
2444
+ this.isWorking = false;
2445
+ this.modules = [];
2446
+ this.user = this.data;
2307
2447
  }
2308
- /**
2309
- * Update the login status of the user.
2310
- *
2311
- * @param val The next value of the isLoggedIn.
2312
- */
2313
- updateAuthStatus(val) {
2314
- this.isLoggedIn.next(val);
2315
- }
2316
- /**
2317
- * Returns an user if present, otherwise a empty user
2318
- * @returns {User} user
2319
- */
2320
- getUser() {
2321
- if (this.user) {
2322
- return this.user;
2323
- }
2324
- this.user = new User();
2325
- const userFromStorage = JSON.parse(this.storage.getItem('currentUser'));
2326
- if (userFromStorage) {
2327
- this.user.loadFromMap(userFromStorage);
2328
- }
2329
- return this.user;
2330
- }
2331
- /**
2332
- * @deprecated Don't use for new projects, use getUserObservable() instead
2333
- * @returns {Observable<User>} Observable of user once changed.
2334
- */
2335
- watch() {
2336
- return this.userSub.asObservable();
2337
- }
2338
- /**
2339
- * Loads the current logged in user
2340
- * @deprecated use getUserObservable() instead
2341
- * @param reload whether to fetch new data from server
2342
- * @returns {Promise<User>} promise of user
2343
- */
2344
- getCurrentUser(reload = false) {
2345
- let promise;
2346
- if (undefined !== this.data && !reload) {
2347
- promise = new Promise((resolve, reject) => {
2348
- resolve(this.data);
2349
- });
2350
- return promise;
2351
- }
2352
- promise = this.http.get('api/user/current').toPromise();
2353
- promise.then(res => {
2354
- this.user = new User();
2355
- this.data = res;
2356
- this.user.loadFromMap(res.user);
2357
- this.storage.setItem('currentUser', JSON.stringify(res.user));
2358
- this.userSub.next(this.user);
2359
- });
2360
- return promise;
2361
- }
2362
- /**
2363
- * Used to update the current user data
2364
- * @param {any} userData data that needs to be updated to current user
2365
- */
2366
- updateCurrentUser(userData) {
2367
- this.user = new User();
2368
- this.data = userData;
2369
- this.user.loadFromMap(userData);
2370
- this.storage.setItem('currentUser', JSON.stringify(userData));
2371
- this.userSub.next(this.user);
2372
- }
2373
- /**
2374
- * @param {number} id Id of role
2375
- * @returns {boolean} true if role is present
2376
- */
2377
- hasRole(id) {
2378
- if (this.user.roles == null) {
2379
- return false;
2380
- }
2381
- return (this.user.roles || []).some(role => role.id == id);
2382
- }
2383
- /**
2384
- * @param {number} id Id of permission
2385
- * @returns {boolean} true if permission is present
2386
- */
2387
- hasPermission(slug) {
2388
- if (!this.user) {
2389
- return false;
2390
- }
2391
- if (this.user.user_type_id == 1) {
2392
- return true;
2393
- }
2394
- else {
2395
- if (this.user.permissions == null) {
2396
- return false;
2397
- }
2398
- return (this.user.permissions || []).some(permission => permission.slug == slug);
2399
- }
2400
- }
2401
- /**
2402
- * Returns the observable of user
2403
- * @param {boolean} reload - whether to reload the entire user again
2404
- * @returns {Observable<User>} Observable of user.
2405
- */
2406
- getUserObservable(reload = false) {
2407
- if (this.user && !reload) {
2408
- return of(this.user);
2409
- }
2410
- return this.http.get('api/user/current')
2411
- .pipe(map$1((res) => {
2412
- this.user = new User();
2413
- this.data = res;
2414
- this.user.loadFromMap(res.user);
2415
- this.storage.setItem('currentUser', JSON.stringify(res.user));
2416
- return this.user;
2417
- }));
2418
- }
2419
- /**
2420
- * @returns {any} Returns the raw user data
2421
- */
2422
- getUserData() {
2423
- return this.data;
2424
- }
2425
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CurrentUserService, deps: [{ token: HttpService }, { token: StorageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
2426
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CurrentUserService, providedIn: 'root' }); }
2427
- }
2428
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CurrentUserService, decorators: [{
2429
- type: Injectable,
2430
- args: [{ providedIn: 'root' }]
2431
- }], ctorParameters: () => [{ type: HttpService }, { type: StorageService }] });
2432
-
2433
- /**
2434
- * Controller used to explore a User
2435
- *
2436
- * @author Saravana Kumar
2437
- * @since 20190813
2438
- */
2439
- class UserExploreComponent {
2440
- constructor(http, dialogRef, data) {
2441
- this.http = http;
2442
- this.dialogRef = dialogRef;
2443
- this.data = data;
2444
- this.isWorking = false;
2445
- this.modules = [];
2446
- this.user = this.data;
2447
- }
2448
- ngOnInit() {
2449
- this.loadData();
2448
+ ngOnInit() {
2449
+ this.loadData();
2450
2450
  }
2451
2451
  loadData() {
2452
2452
  this.isWorking = true;
@@ -4378,86 +4378,250 @@ class UserSessionsComponent extends TechlifyListingControllerInterface {
4378
4378
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserSessionsComponent, deps: [{ token: UserSessionService }], target: i0.ɵɵFactoryTarget.Component }); }
4379
4379
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserSessionsComponent, selector: "app-user-sessions", inputs: { user: "user" }, usesInheritance: true, ngImport: i0, template: "<mat-card>\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\">\n\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Started On Column -->\n <ng-container matColumnDef=\"Started On\">\n <th mat-header-cell *matHeaderCellDef> Started On </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.created_at | date:'medium' }}\n </td>\n </ng-container>\n\n <!-- Expires At Column -->\n <ng-container matColumnDef=\"Expires At\">\n <th mat-header-cell *matHeaderCellDef> Expires At </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.expires_at | date:'medium' }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n\n </mat-card-content>\n</mat-card>\n", styles: [""], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i13.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i13.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i13.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i13.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i13.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i13.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i13.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i13.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i13.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i13.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: i2$1.DatePipe, name: "date" }] }); }
4380
4380
  }
4381
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserSessionsComponent, decorators: [{
4382
- type: Component,
4383
- args: [{ selector: 'app-user-sessions', template: "<mat-card>\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\">\n\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Started On Column -->\n <ng-container matColumnDef=\"Started On\">\n <th mat-header-cell *matHeaderCellDef> Started On </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.created_at | date:'medium' }}\n </td>\n </ng-container>\n\n <!-- Expires At Column -->\n <ng-container matColumnDef=\"Expires At\">\n <th mat-header-cell *matHeaderCellDef> Expires At </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.expires_at | date:'medium' }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n\n </mat-card-content>\n</mat-card>\n" }]
4384
- }], ctorParameters: () => [{ type: UserSessionService }], propDecorators: { user: [{
4385
- type: Input
4386
- }] } });
4381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserSessionsComponent, decorators: [{
4382
+ type: Component,
4383
+ args: [{ selector: 'app-user-sessions', template: "<mat-card>\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\">\n\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Started On Column -->\n <ng-container matColumnDef=\"Started On\">\n <th mat-header-cell *matHeaderCellDef> Started On </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.created_at | date:'medium' }}\n </td>\n </ng-container>\n\n <!-- Expires At Column -->\n <ng-container matColumnDef=\"Expires At\">\n <th mat-header-cell *matHeaderCellDef> Expires At </th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.expires_at | date:'medium' }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n\n </mat-card-content>\n</mat-card>\n" }]
4384
+ }], ctorParameters: () => [{ type: UserSessionService }], propDecorators: { user: [{
4385
+ type: Input
4386
+ }] } });
4387
+
4388
+ /**
4389
+ * Controller used to view a single user
4390
+ *
4391
+ * @author Floyd Kissoon
4392
+ * @since 20210701
4393
+ */
4394
+ class UserViewComponent {
4395
+ constructor(userService, route, config, http, dialog, currentUserService) {
4396
+ this.userService = userService;
4397
+ this.route = route;
4398
+ this.config = config;
4399
+ this.http = http;
4400
+ this.dialog = dialog;
4401
+ this.currentUserService = currentUserService;
4402
+ this.UserTypeEnum = UserTypeEnum;
4403
+ this.currentUser = this.currentUserService.getUser();
4404
+ }
4405
+ ngOnInit() {
4406
+ this.route.params.subscribe(params => {
4407
+ if (params.id !== undefined) {
4408
+ this.loadUser(params.id);
4409
+ }
4410
+ });
4411
+ }
4412
+ loadUser(userId) {
4413
+ this.userService.getUser(userId).then((result) => {
4414
+ this.user = result.item;
4415
+ });
4416
+ }
4417
+ enableOrDisableUser(action) {
4418
+ this.http.patch('api/users/' + this.user.id + '/' + action, this.user).toPromise().then((res) => {
4419
+ this.user.user_client = res.item.user_client;
4420
+ });
4421
+ }
4422
+ editUser(user) {
4423
+ const dialogRef = this.dialog.open(UserFormComponent, {
4424
+ width: '700px',
4425
+ data: user,
4426
+ autoFocus: false,
4427
+ restoreFocus: false
4428
+ });
4429
+ dialogRef.afterClosed().subscribe(async (result) => {
4430
+ if (result) {
4431
+ this.loadUser(this.user.id);
4432
+ }
4433
+ });
4434
+ }
4435
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserViewComponent, deps: [{ token: UserService }, { token: i1$5.ActivatedRoute }, { token: ConfigService }, { token: HttpService }, { token: i1.MatDialog }, { token: CurrentUserService }], target: i0.ɵɵFactoryTarget.Component }); }
4436
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserViewComponent, selector: "user-view", ngImport: i0, template: "<div class=\"mat-typography m-4\" *ngIf=\"user\">\n <h1 class=\"text-center\">{{user.name}}</h1>\n\n <div class=\"border\">\n <mat-tab-group>\n <mat-tab label=\"Basic Information\">\n <ng-template matTabContent>\n <div class=\"row m-4\">\n <div class=\"col-4\">\n <div class=\"bordered-section\">\n <div class=\"row\" *ngIf=\"currentUser?.user_type_id != 3\">\n <button type=\"button\" mat-icon-button (click)=\"editUser(user)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-stroked-button color=\"warn\" *ngIf=\"!user.user_client?.is_enabled\"\n (click)=\"enableOrDisableUser('enable')\">\n Enable\n </button>\n <button mat-stroked-button color=\"primary\" *ngIf=\"user.user_client?.is_enabled\"\n (click)=\"enableOrDisableUser('disable')\">Disable</button>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Name:</label>\n <div class=\"col-sm-8\">{{user?.name}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Email:</label>\n <div class=\"col-sm-8\">{{user?.email}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Type:</label>\n <div class=\"col-sm-8\">{{user?.type?.title}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Status:</label>\n <div class=\"col-sm-8\">{{user?.user_client?.is_enabled ? 'Enabled' : 'Disabled' }}\n </div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Role:</label>\n <div class=\"col-sm-8\">\n <span *ngFor=\"let role of user?.roles\">\n <button class=\"btn btn-outline-dark btn-xs mb-2\">{{role?.label}}</button>\n &nbsp;\n </span>\n </div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Signature:</label>\n <div class=\"col-sm-8\">\n <span *ngIf=\"user?.signature\">\n <img src=\"{{user?.signature_url}}\" alt=\"\" width=\"250px\" />\n </span>\n <span *ngIf=\"!user?.signature\">\n No Signature Added\n </span>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Login History\">\n <ng-template matTabContent>\n <app-login-history-for-user [userId]=\"user?.id\"></app-login-history-for-user>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Activity Logs\">\n <ng-template matTabContent>\n <app-audit-log-list objectType=\"User\" [objectId]=\"user?.id\" [showExportButtons]=\"false\">\n </app-audit-log-list>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Tenants\" *ngIf=\"currentUser?.user_type_id === UserTypeEnum.ADMIN\">\n <ng-template matTabContent>\n <app-user-clients-list [user]=\"user\"></app-user-clients-list>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Sessions\">\n <ng-template matTabContent>\n <app-user-sessions [user]=\"user\"></app-user-sessions>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </div>\n\n</div>", styles: [".user-node .page-title{margin:20px 0 0}.user-node #information-tabs-wrapper .nav-pills .nav-link{border-radius:0;border:1px solid #007bff;border-right:none;width:190px}.user-node #information-tabs-wrapper .tab-content{padding:20px;border:1px solid #007bff;width:calc(100vw - 200px)}\n"], dependencies: [{ kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9$5.MatTabContent, selector: "[matTabContent]" }, { kind: "component", type: i9$5.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i9$5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: LoginHistoryForUserComponent, selector: "app-login-history-for-user", inputs: ["userId"] }, { kind: "component", type: AuditLogListComponent, selector: "app-audit-log-list", inputs: ["objectId", "objectType", "showFilter", "showExportButtons", "userId", "disableFilterPatchingFromUrl", "scrollContainer"] }, { kind: "component", type: UserClientsListComponent, selector: "app-user-clients-list", inputs: ["user"] }, { kind: "component", type: UserSessionsComponent, selector: "app-user-sessions", inputs: ["user"] }] }); }
4437
+ }
4438
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserViewComponent, decorators: [{
4439
+ type: Component,
4440
+ args: [{ selector: 'user-view', template: "<div class=\"mat-typography m-4\" *ngIf=\"user\">\n <h1 class=\"text-center\">{{user.name}}</h1>\n\n <div class=\"border\">\n <mat-tab-group>\n <mat-tab label=\"Basic Information\">\n <ng-template matTabContent>\n <div class=\"row m-4\">\n <div class=\"col-4\">\n <div class=\"bordered-section\">\n <div class=\"row\" *ngIf=\"currentUser?.user_type_id != 3\">\n <button type=\"button\" mat-icon-button (click)=\"editUser(user)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-stroked-button color=\"warn\" *ngIf=\"!user.user_client?.is_enabled\"\n (click)=\"enableOrDisableUser('enable')\">\n Enable\n </button>\n <button mat-stroked-button color=\"primary\" *ngIf=\"user.user_client?.is_enabled\"\n (click)=\"enableOrDisableUser('disable')\">Disable</button>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Name:</label>\n <div class=\"col-sm-8\">{{user?.name}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Email:</label>\n <div class=\"col-sm-8\">{{user?.email}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Type:</label>\n <div class=\"col-sm-8\">{{user?.type?.title}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Status:</label>\n <div class=\"col-sm-8\">{{user?.user_client?.is_enabled ? 'Enabled' : 'Disabled' }}\n </div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Role:</label>\n <div class=\"col-sm-8\">\n <span *ngFor=\"let role of user?.roles\">\n <button class=\"btn btn-outline-dark btn-xs mb-2\">{{role?.label}}</button>\n &nbsp;\n </span>\n </div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Signature:</label>\n <div class=\"col-sm-8\">\n <span *ngIf=\"user?.signature\">\n <img src=\"{{user?.signature_url}}\" alt=\"\" width=\"250px\" />\n </span>\n <span *ngIf=\"!user?.signature\">\n No Signature Added\n </span>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Login History\">\n <ng-template matTabContent>\n <app-login-history-for-user [userId]=\"user?.id\"></app-login-history-for-user>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Activity Logs\">\n <ng-template matTabContent>\n <app-audit-log-list objectType=\"User\" [objectId]=\"user?.id\" [showExportButtons]=\"false\">\n </app-audit-log-list>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Tenants\" *ngIf=\"currentUser?.user_type_id === UserTypeEnum.ADMIN\">\n <ng-template matTabContent>\n <app-user-clients-list [user]=\"user\"></app-user-clients-list>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Sessions\">\n <ng-template matTabContent>\n <app-user-sessions [user]=\"user\"></app-user-sessions>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </div>\n\n</div>", styles: [".user-node .page-title{margin:20px 0 0}.user-node #information-tabs-wrapper .nav-pills .nav-link{border-radius:0;border:1px solid #007bff;border-right:none;width:190px}.user-node #information-tabs-wrapper .tab-content{padding:20px;border:1px solid #007bff;width:calc(100vw - 200px)}\n"] }]
4441
+ }], ctorParameters: () => [{ type: UserService }, { type: i1$5.ActivatedRoute }, { type: ConfigService }, { type: HttpService }, { type: i1.MatDialog }, { type: CurrentUserService }] });
4442
+
4443
+ const routes$A = [
4444
+ { path: '', component: UsersViewAllComponent, canActivate: [AuthenticationGuard] },
4445
+ { path: ':id', component: UserViewComponent, canActivate: [AuthenticationGuard] },
4446
+ { path: ':id/app-admin-view', loadChildren: () => Promise.resolve().then(function () { return appAdminUserView_module; }).then(mod => mod.AppAdminUserViewModule), canActivate: [AuthenticationGuard] },
4447
+ // fallback when no prior route found
4448
+ { path: '**', redirectTo: '', pathMatch: 'full' },
4449
+ ];
4450
+ // @dynamic
4451
+ class UserRoutingProvider {
4452
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRoutingProvider, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4453
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UserRoutingProvider, imports: [i1$5.RouterModule], exports: [RouterModule] }); }
4454
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRoutingProvider, imports: [RouterModule.forChild(routes$A), RouterModule] }); }
4455
+ }
4456
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRoutingProvider, decorators: [{
4457
+ type: NgModule,
4458
+ args: [{
4459
+ imports: [RouterModule.forChild(routes$A)],
4460
+ exports: [RouterModule]
4461
+ }]
4462
+ }] });
4463
+
4464
+ class MaterialModule {
4465
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4466
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: MaterialModule, exports: [MatButtonModule,
4467
+ MatCheckboxModule,
4468
+ MatCommonModule,
4469
+ MatDialogModule,
4470
+ MatFormFieldModule,
4471
+ MatIconModule,
4472
+ MatInputModule,
4473
+ MatLineModule,
4474
+ MatMenuModule,
4475
+ MatNativeDateModule,
4476
+ MatOptionModule,
4477
+ MatProgressSpinnerModule,
4478
+ MatPseudoCheckboxModule,
4479
+ MatRippleModule,
4480
+ MatSelectModule,
4481
+ MatSortModule,
4482
+ MatTableModule,
4483
+ MatCardModule,
4484
+ MatDividerModule,
4485
+ MatChipsModule,
4486
+ MatDatepickerModule,
4487
+ MatListModule,
4488
+ MatTooltipModule,
4489
+ MatButtonToggleModule,
4490
+ MatSidenavModule,
4491
+ MatProgressBarModule,
4492
+ MatSlideToggleModule,
4493
+ MatTabsModule] }); }
4494
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialModule, imports: [MatButtonModule,
4495
+ MatCheckboxModule,
4496
+ MatCommonModule,
4497
+ MatDialogModule,
4498
+ MatFormFieldModule,
4499
+ MatIconModule,
4500
+ MatInputModule,
4501
+ MatLineModule,
4502
+ MatMenuModule,
4503
+ MatNativeDateModule,
4504
+ MatOptionModule,
4505
+ MatProgressSpinnerModule,
4506
+ MatPseudoCheckboxModule,
4507
+ MatRippleModule,
4508
+ MatSelectModule,
4509
+ MatSortModule,
4510
+ MatTableModule,
4511
+ MatCardModule,
4512
+ MatDividerModule,
4513
+ MatChipsModule,
4514
+ MatDatepickerModule,
4515
+ MatListModule,
4516
+ MatTooltipModule,
4517
+ MatButtonToggleModule,
4518
+ MatSidenavModule,
4519
+ MatProgressBarModule,
4520
+ MatSlideToggleModule,
4521
+ MatTabsModule] }); }
4522
+ }
4523
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialModule, decorators: [{
4524
+ type: NgModule,
4525
+ args: [{
4526
+ exports: [
4527
+ MatButtonModule,
4528
+ MatCheckboxModule,
4529
+ MatCommonModule,
4530
+ MatDialogModule,
4531
+ MatFormFieldModule,
4532
+ MatIconModule,
4533
+ MatInputModule,
4534
+ MatLineModule,
4535
+ MatMenuModule,
4536
+ MatNativeDateModule,
4537
+ MatOptionModule,
4538
+ MatProgressSpinnerModule,
4539
+ MatPseudoCheckboxModule,
4540
+ MatRippleModule,
4541
+ MatSelectModule,
4542
+ MatSortModule,
4543
+ MatTableModule,
4544
+ MatCardModule,
4545
+ MatDividerModule,
4546
+ MatChipsModule,
4547
+ MatDatepickerModule,
4548
+ MatListModule,
4549
+ MatTooltipModule,
4550
+ MatButtonToggleModule,
4551
+ MatSidenavModule,
4552
+ MatProgressBarModule,
4553
+ MatSlideToggleModule,
4554
+ MatTabsModule
4555
+ ]
4556
+ }]
4557
+ }] });
4558
+
4559
+ class UserClientEnableDisableButtonModule {
4560
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserClientEnableDisableButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4561
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UserClientEnableDisableButtonModule, declarations: [UserClientEnableDisableButtonComponent], imports: [CommonModule,
4562
+ MaterialModule,
4563
+ FlexLayoutModule], exports: [UserClientEnableDisableButtonComponent] }); }
4564
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserClientEnableDisableButtonModule, imports: [CommonModule,
4565
+ MaterialModule,
4566
+ FlexLayoutModule] }); }
4567
+ }
4568
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserClientEnableDisableButtonModule, decorators: [{
4569
+ type: NgModule,
4570
+ args: [{
4571
+ declarations: [UserClientEnableDisableButtonComponent],
4572
+ imports: [
4573
+ CommonModule,
4574
+ MaterialModule,
4575
+ FlexLayoutModule,
4576
+ ],
4577
+ exports: [UserClientEnableDisableButtonComponent]
4578
+ }]
4579
+ }] });
4387
4580
 
4388
- /**
4389
- * Controller used to view a single user
4390
- *
4391
- * @author Floyd Kissoon
4392
- * @since 20210701
4393
- */
4394
- class UserViewComponent {
4395
- constructor(userService, route, config, http, dialog, currentUserService) {
4396
- this.userService = userService;
4397
- this.route = route;
4398
- this.config = config;
4399
- this.http = http;
4400
- this.dialog = dialog;
4401
- this.currentUserService = currentUserService;
4402
- this.UserTypeEnum = UserTypeEnum;
4403
- this.currentUser = this.currentUserService.getUser();
4404
- }
4405
- ngOnInit() {
4406
- this.route.params.subscribe(params => {
4407
- if (params.id !== undefined) {
4408
- this.loadUser(params.id);
4409
- }
4410
- });
4411
- }
4412
- loadUser(userId) {
4413
- this.userService.getUser(userId).then((result) => {
4414
- this.user = result.item;
4415
- });
4416
- }
4417
- enableOrDisableUser(action) {
4418
- this.http.patch('api/users/' + this.user.id + '/' + action, this.user).toPromise().then((res) => {
4419
- this.user.user_client = res.item.user_client;
4420
- });
4421
- }
4422
- editUser(user) {
4423
- const dialogRef = this.dialog.open(UserFormComponent, {
4424
- width: '700px',
4425
- data: user,
4426
- autoFocus: false,
4427
- restoreFocus: false
4428
- });
4429
- dialogRef.afterClosed().subscribe(async (result) => {
4430
- if (result) {
4431
- this.loadUser(this.user.id);
4432
- }
4433
- });
4434
- }
4435
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserViewComponent, deps: [{ token: UserService }, { token: i1$5.ActivatedRoute }, { token: ConfigService }, { token: HttpService }, { token: i1.MatDialog }, { token: CurrentUserService }], target: i0.ɵɵFactoryTarget.Component }); }
4436
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserViewComponent, selector: "user-view", ngImport: i0, template: "<div class=\"mat-typography m-4\" *ngIf=\"user\">\n <h1 class=\"text-center\">{{user.name}}</h1>\n\n <div class=\"border\">\n <mat-tab-group>\n <mat-tab label=\"Basic Information\">\n <ng-template matTabContent>\n <div class=\"row m-4\">\n <div class=\"col-4\">\n <div class=\"bordered-section\">\n <div class=\"row\" *ngIf=\"currentUser?.user_type_id != 3\">\n <button type=\"button\" mat-icon-button (click)=\"editUser(user)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-stroked-button color=\"warn\" *ngIf=\"!user.user_client?.is_enabled\"\n (click)=\"enableOrDisableUser('enable')\">\n Enable\n </button>\n <button mat-stroked-button color=\"primary\" *ngIf=\"user.user_client?.is_enabled\"\n (click)=\"enableOrDisableUser('disable')\">Disable</button>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Name:</label>\n <div class=\"col-sm-8\">{{user?.name}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Email:</label>\n <div class=\"col-sm-8\">{{user?.email}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Type:</label>\n <div class=\"col-sm-8\">{{user?.type?.title}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Status:</label>\n <div class=\"col-sm-8\">{{user?.user_client?.is_enabled ? 'Enabled' : 'Disabled' }}\n </div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Role:</label>\n <div class=\"col-sm-8\">\n <span *ngFor=\"let role of user?.roles\">\n <button class=\"btn btn-outline-dark btn-xs mb-2\">{{role?.label}}</button>\n &nbsp;\n </span>\n </div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Signature:</label>\n <div class=\"col-sm-8\">\n <span *ngIf=\"user?.signature\">\n <img src=\"{{user?.signature_url}}\" alt=\"\" width=\"250px\" />\n </span>\n <span *ngIf=\"!user?.signature\">\n No Signature Added\n </span>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Login History\">\n <ng-template matTabContent>\n <app-login-history-for-user [userId]=\"user?.id\"></app-login-history-for-user>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Activity Logs\">\n <ng-template matTabContent>\n <app-audit-log-list objectType=\"User\" [objectId]=\"user?.id\" [showExportButtons]=\"false\">\n </app-audit-log-list>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Tenants\" *ngIf=\"currentUser?.user_type_id === UserTypeEnum.ADMIN\">\n <ng-template matTabContent>\n <app-user-clients-list [user]=\"user\"></app-user-clients-list>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Sessions\">\n <ng-template matTabContent>\n <app-user-sessions [user]=\"user\"></app-user-sessions>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </div>\n\n</div>", styles: [".user-node .page-title{margin:20px 0 0}.user-node #information-tabs-wrapper .nav-pills .nav-link{border-radius:0;border:1px solid #007bff;border-right:none;width:190px}.user-node #information-tabs-wrapper .tab-content{padding:20px;border:1px solid #007bff;width:calc(100vw - 200px)}\n"], dependencies: [{ kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9$5.MatTabContent, selector: "[matTabContent]" }, { kind: "component", type: i9$5.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i9$5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: LoginHistoryForUserComponent, selector: "app-login-history-for-user", inputs: ["userId"] }, { kind: "component", type: AuditLogListComponent, selector: "app-audit-log-list", inputs: ["objectId", "objectType", "showFilter", "showExportButtons", "userId", "disableFilterPatchingFromUrl", "scrollContainer"] }, { kind: "component", type: UserClientsListComponent, selector: "app-user-clients-list", inputs: ["user"] }, { kind: "component", type: UserSessionsComponent, selector: "app-user-sessions", inputs: ["user"] }] }); }
4581
+ class UserClientsListModule {
4582
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserClientsListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4583
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UserClientsListModule, declarations: [UserClientsListComponent], imports: [CommonModule,
4584
+ MaterialModule,
4585
+ FlexLayoutModule,
4586
+ UserClientEnableDisableButtonModule], exports: [UserClientsListComponent] }); }
4587
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserClientsListModule, imports: [CommonModule,
4588
+ MaterialModule,
4589
+ FlexLayoutModule,
4590
+ UserClientEnableDisableButtonModule] }); }
4437
4591
  }
4438
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserViewComponent, decorators: [{
4439
- type: Component,
4440
- args: [{ selector: 'user-view', template: "<div class=\"mat-typography m-4\" *ngIf=\"user\">\n <h1 class=\"text-center\">{{user.name}}</h1>\n\n <div class=\"border\">\n <mat-tab-group>\n <mat-tab label=\"Basic Information\">\n <ng-template matTabContent>\n <div class=\"row m-4\">\n <div class=\"col-4\">\n <div class=\"bordered-section\">\n <div class=\"row\" *ngIf=\"currentUser?.user_type_id != 3\">\n <button type=\"button\" mat-icon-button (click)=\"editUser(user)\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-stroked-button color=\"warn\" *ngIf=\"!user.user_client?.is_enabled\"\n (click)=\"enableOrDisableUser('enable')\">\n Enable\n </button>\n <button mat-stroked-button color=\"primary\" *ngIf=\"user.user_client?.is_enabled\"\n (click)=\"enableOrDisableUser('disable')\">Disable</button>\n </div>\n\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Name:</label>\n <div class=\"col-sm-8\">{{user?.name}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Email:</label>\n <div class=\"col-sm-8\">{{user?.email}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Type:</label>\n <div class=\"col-sm-8\">{{user?.type?.title}}</div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Status:</label>\n <div class=\"col-sm-8\">{{user?.user_client?.is_enabled ? 'Enabled' : 'Disabled' }}\n </div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Role:</label>\n <div class=\"col-sm-8\">\n <span *ngFor=\"let role of user?.roles\">\n <button class=\"btn btn-outline-dark btn-xs mb-2\">{{role?.label}}</button>\n &nbsp;\n </span>\n </div>\n </div>\n <div class=\"row\">\n <label class=\"col-sm-4 control-label\">Signature:</label>\n <div class=\"col-sm-8\">\n <span *ngIf=\"user?.signature\">\n <img src=\"{{user?.signature_url}}\" alt=\"\" width=\"250px\" />\n </span>\n <span *ngIf=\"!user?.signature\">\n No Signature Added\n </span>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Login History\">\n <ng-template matTabContent>\n <app-login-history-for-user [userId]=\"user?.id\"></app-login-history-for-user>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Activity Logs\">\n <ng-template matTabContent>\n <app-audit-log-list objectType=\"User\" [objectId]=\"user?.id\" [showExportButtons]=\"false\">\n </app-audit-log-list>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Tenants\" *ngIf=\"currentUser?.user_type_id === UserTypeEnum.ADMIN\">\n <ng-template matTabContent>\n <app-user-clients-list [user]=\"user\"></app-user-clients-list>\n </ng-template>\n </mat-tab>\n <mat-tab label=\"Sessions\">\n <ng-template matTabContent>\n <app-user-sessions [user]=\"user\"></app-user-sessions>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </div>\n\n</div>", styles: [".user-node .page-title{margin:20px 0 0}.user-node #information-tabs-wrapper .nav-pills .nav-link{border-radius:0;border:1px solid #007bff;border-right:none;width:190px}.user-node #information-tabs-wrapper .tab-content{padding:20px;border:1px solid #007bff;width:calc(100vw - 200px)}\n"] }]
4441
- }], ctorParameters: () => [{ type: UserService }, { type: i1$5.ActivatedRoute }, { type: ConfigService }, { type: HttpService }, { type: i1.MatDialog }, { type: CurrentUserService }] });
4592
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserClientsListModule, decorators: [{
4593
+ type: NgModule,
4594
+ args: [{
4595
+ declarations: [UserClientsListComponent],
4596
+ imports: [
4597
+ CommonModule,
4598
+ MaterialModule,
4599
+ FlexLayoutModule,
4600
+ UserClientEnableDisableButtonModule
4601
+ ],
4602
+ exports: [UserClientsListComponent]
4603
+ }]
4604
+ }] });
4442
4605
 
4443
- const routes$A = [
4444
- { path: '', component: UsersViewAllComponent, canActivate: [AuthenticationGuard] },
4445
- { path: ':id', component: UserViewComponent, canActivate: [AuthenticationGuard] },
4446
- { path: ':id/app-admin-view', loadChildren: () => Promise.resolve().then(function () { return appAdminUserView_module; }).then(mod => mod.AppAdminUserViewModule), canActivate: [AuthenticationGuard] },
4447
- // fallback when no prior route found
4448
- { path: '**', redirectTo: '', pathMatch: 'full' },
4449
- ];
4450
- // @dynamic
4451
- class UserRoutingProvider {
4452
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRoutingProvider, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4453
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UserRoutingProvider, imports: [i1$5.RouterModule], exports: [RouterModule] }); }
4454
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRoutingProvider, imports: [RouterModule.forChild(routes$A), RouterModule] }); }
4606
+ class UserSessionsModule {
4607
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserSessionsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4608
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UserSessionsModule, declarations: [UserSessionsComponent], imports: [CommonModule,
4609
+ MaterialModule,
4610
+ FlexLayoutModule], exports: [UserSessionsComponent] }); }
4611
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserSessionsModule, imports: [CommonModule,
4612
+ MaterialModule,
4613
+ FlexLayoutModule] }); }
4455
4614
  }
4456
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRoutingProvider, decorators: [{
4615
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserSessionsModule, decorators: [{
4457
4616
  type: NgModule,
4458
4617
  args: [{
4459
- imports: [RouterModule.forChild(routes$A)],
4460
- exports: [RouterModule]
4618
+ declarations: [UserSessionsComponent],
4619
+ imports: [
4620
+ CommonModule,
4621
+ MaterialModule,
4622
+ FlexLayoutModule,
4623
+ ],
4624
+ exports: [UserSessionsComponent]
4461
4625
  }]
4462
4626
  }] });
4463
4627
 
@@ -5286,101 +5450,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
5286
5450
  type: Input
5287
5451
  }] } });
5288
5452
 
5289
- class MaterialModule {
5290
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
5291
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: MaterialModule, exports: [MatButtonModule,
5292
- MatCheckboxModule,
5293
- MatCommonModule,
5294
- MatDialogModule,
5295
- MatFormFieldModule,
5296
- MatIconModule,
5297
- MatInputModule,
5298
- MatLineModule,
5299
- MatMenuModule,
5300
- MatNativeDateModule,
5301
- MatOptionModule,
5302
- MatProgressSpinnerModule,
5303
- MatPseudoCheckboxModule,
5304
- MatRippleModule,
5305
- MatSelectModule,
5306
- MatSortModule,
5307
- MatTableModule,
5308
- MatCardModule,
5309
- MatDividerModule,
5310
- MatChipsModule,
5311
- MatDatepickerModule,
5312
- MatListModule,
5313
- MatTooltipModule,
5314
- MatButtonToggleModule,
5315
- MatSidenavModule,
5316
- MatProgressBarModule,
5317
- MatSlideToggleModule,
5318
- MatTabsModule] }); }
5319
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialModule, imports: [MatButtonModule,
5320
- MatCheckboxModule,
5321
- MatCommonModule,
5322
- MatDialogModule,
5323
- MatFormFieldModule,
5324
- MatIconModule,
5325
- MatInputModule,
5326
- MatLineModule,
5327
- MatMenuModule,
5328
- MatNativeDateModule,
5329
- MatOptionModule,
5330
- MatProgressSpinnerModule,
5331
- MatPseudoCheckboxModule,
5332
- MatRippleModule,
5333
- MatSelectModule,
5334
- MatSortModule,
5335
- MatTableModule,
5336
- MatCardModule,
5337
- MatDividerModule,
5338
- MatChipsModule,
5339
- MatDatepickerModule,
5340
- MatListModule,
5341
- MatTooltipModule,
5342
- MatButtonToggleModule,
5343
- MatSidenavModule,
5344
- MatProgressBarModule,
5345
- MatSlideToggleModule,
5346
- MatTabsModule] }); }
5347
- }
5348
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialModule, decorators: [{
5349
- type: NgModule,
5350
- args: [{
5351
- exports: [
5352
- MatButtonModule,
5353
- MatCheckboxModule,
5354
- MatCommonModule,
5355
- MatDialogModule,
5356
- MatFormFieldModule,
5357
- MatIconModule,
5358
- MatInputModule,
5359
- MatLineModule,
5360
- MatMenuModule,
5361
- MatNativeDateModule,
5362
- MatOptionModule,
5363
- MatProgressSpinnerModule,
5364
- MatPseudoCheckboxModule,
5365
- MatRippleModule,
5366
- MatSelectModule,
5367
- MatSortModule,
5368
- MatTableModule,
5369
- MatCardModule,
5370
- MatDividerModule,
5371
- MatChipsModule,
5372
- MatDatepickerModule,
5373
- MatListModule,
5374
- MatTooltipModule,
5375
- MatButtonToggleModule,
5376
- MatSidenavModule,
5377
- MatProgressBarModule,
5378
- MatSlideToggleModule,
5379
- MatTabsModule
5380
- ]
5381
- }]
5382
- }] });
5383
-
5384
5453
  class CoreModule {
5385
5454
  constructor(parentModule) {
5386
5455
  // Import guard
@@ -10939,16 +11008,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10939
11008
  }]
10940
11009
  }] });
10941
11010
 
11011
+ class UserEnableButtonModule {
11012
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEnableButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
11013
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UserEnableButtonModule, declarations: [UserEnableButtonComponent], imports: [CommonModule,
11014
+ MaterialModule,
11015
+ FlexLayoutModule], exports: [UserEnableButtonComponent] }); }
11016
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEnableButtonModule, imports: [CommonModule,
11017
+ MaterialModule,
11018
+ FlexLayoutModule] }); }
11019
+ }
11020
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEnableButtonModule, decorators: [{
11021
+ type: NgModule,
11022
+ args: [{
11023
+ declarations: [UserEnableButtonComponent],
11024
+ imports: [
11025
+ CommonModule,
11026
+ MaterialModule,
11027
+ FlexLayoutModule,
11028
+ ],
11029
+ exports: [UserEnableButtonComponent]
11030
+ }]
11031
+ }] });
11032
+
10942
11033
  class UserModule {
10943
11034
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10944
11035
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UserModule, declarations: [UsersViewAllComponent,
10945
11036
  UserFormComponent,
10946
11037
  UserExploreComponent,
10947
- UserViewComponent,
10948
- UserEnableButtonComponent,
10949
- UserClientsListComponent,
10950
- UserClientEnableDisableButtonComponent,
10951
- UserSessionsComponent], imports: [CommonModule,
11038
+ UserViewComponent], imports: [CommonModule,
10952
11039
  UserRoutingProvider,
10953
11040
  MaterialModule,
10954
11041
  FlexLayoutModule,
@@ -10964,13 +11051,14 @@ class UserModule {
10964
11051
  MatProgressBarModule,
10965
11052
  MatTableModule,
10966
11053
  MatSortModule,
10967
- DataTableModule], exports: [UserViewComponent,
11054
+ DataTableModule,
11055
+ UserEnableButtonModule,
11056
+ UserClientsListModule,
11057
+ UserSessionsModule], exports: [UserViewComponent,
10968
11058
  UsersViewAllComponent,
10969
- UserEnableButtonComponent,
10970
- UserClientsListComponent,
10971
- UserClientEnableDisableButtonComponent,
10972
- UserSessionsComponent,
10973
- UserClientsListComponent] }); }
11059
+ UserEnableButtonModule,
11060
+ UserClientsListModule,
11061
+ UserSessionsModule] }); }
10974
11062
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserModule, imports: [CommonModule,
10975
11063
  UserRoutingProvider,
10976
11064
  MaterialModule,
@@ -10987,7 +11075,12 @@ class UserModule {
10987
11075
  MatProgressBarModule,
10988
11076
  MatTableModule,
10989
11077
  MatSortModule,
10990
- DataTableModule] }); }
11078
+ DataTableModule,
11079
+ UserEnableButtonModule,
11080
+ UserClientsListModule,
11081
+ UserSessionsModule, UserEnableButtonModule,
11082
+ UserClientsListModule,
11083
+ UserSessionsModule] }); }
10991
11084
  }
10992
11085
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserModule, decorators: [{
10993
11086
  type: NgModule,
@@ -11010,25 +11103,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
11010
11103
  MatTableModule,
11011
11104
  MatSortModule,
11012
11105
  DataTableModule,
11106
+ UserEnableButtonModule,
11107
+ UserClientsListModule,
11108
+ UserSessionsModule
11013
11109
  ],
11014
11110
  declarations: [
11015
11111
  UsersViewAllComponent,
11016
11112
  UserFormComponent,
11017
11113
  UserExploreComponent,
11018
11114
  UserViewComponent,
11019
- UserEnableButtonComponent,
11020
- UserClientsListComponent,
11021
- UserClientEnableDisableButtonComponent,
11022
- UserSessionsComponent
11023
11115
  ],
11024
11116
  exports: [
11025
11117
  UserViewComponent,
11026
11118
  UsersViewAllComponent,
11027
- UserEnableButtonComponent,
11028
- UserClientsListComponent,
11029
- UserClientEnableDisableButtonComponent,
11030
- UserSessionsComponent,
11031
- UserClientsListComponent
11119
+ UserEnableButtonModule,
11120
+ UserClientsListModule,
11121
+ UserSessionsModule
11032
11122
  ]
11033
11123
  }]
11034
11124
  }] });
@@ -12974,6 +13064,10 @@ class CompanyInformationComponent extends TechlifyFormComponentInterface {
12974
13064
  this.clientService = clientService;
12975
13065
  this.alertService = alertService;
12976
13066
  this.location = location;
13067
+ // If we are updating as a client admin, we need to pass a client object
13068
+ this.isAppAdmin = false;
13069
+ this.saved = new EventEmitter();
13070
+ this.cancelled = new EventEmitter();
12977
13071
  this.errorMessages = {
12978
13072
  name: {
12979
13073
  required: 'The name field is required.'
@@ -12991,10 +13085,12 @@ class CompanyInformationComponent extends TechlifyFormComponentInterface {
12991
13085
  });
12992
13086
  }
12993
13087
  ngOnInit() {
12994
- this.user = this.currentUserService.getUser();
12995
- const client = this.user?.client;
12996
- if (client) {
12997
- this.form.patchValue({ ...client });
13088
+ if (!this.isAppAdmin) {
13089
+ this.user = this.currentUserService.getUser();
13090
+ this.client = this.user?.client;
13091
+ }
13092
+ if (this.client) {
13093
+ this.form.patchValue({ ...this.client });
12998
13094
  }
12999
13095
  }
13000
13096
  save() {
@@ -13005,12 +13101,19 @@ class CompanyInformationComponent extends TechlifyFormComponentInterface {
13005
13101
  }
13006
13102
  const data = { ...this.form.value };
13007
13103
  this.isWorking = true;
13008
- this.clientService.update(data).subscribe({
13009
- next: () => {
13104
+ let request = this.clientService.store(data);
13105
+ if (data?.id) {
13106
+ request = this.clientService.update(data);
13107
+ }
13108
+ request.subscribe({
13109
+ next: (response) => {
13010
13110
  this.isWorking = false;
13011
- // update user
13012
- this.currentUserService.getUserObservable(true).subscribe();
13013
13111
  this.alertService.addAlert('The company information saved successfully!', 'success');
13112
+ this.saved.emit(response?.item);
13113
+ if (this.isAppAdmin) {
13114
+ // update user
13115
+ this.currentUserService.getUserObservable(true).subscribe();
13116
+ }
13014
13117
  },
13015
13118
  error: () => (this.isWorking = false)
13016
13119
  });
@@ -13021,10 +13124,15 @@ class CompanyInformationComponent extends TechlifyFormComponentInterface {
13021
13124
  }
13022
13125
  }
13023
13126
  redirectBack() {
13024
- this.location.back();
13127
+ if (this.isAppAdmin) {
13128
+ this.cancelled.emit();
13129
+ }
13130
+ else {
13131
+ this.location.back();
13132
+ }
13025
13133
  }
13026
13134
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CompanyInformationComponent, deps: [{ token: FormValidatorService }, { token: i1$4.FormBuilder }, { token: CurrentUserService }, { token: ClientService }, { token: AlertService }, { token: i2$1.Location }], target: i0.ɵɵFactoryTarget.Component }); }
13027
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CompanyInformationComponent, isStandalone: true, selector: "app-company-information", usesInheritance: true, ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center\">\n <mat-card style=\"width: 50%\">\n <mat-card-content>\n <mat-card-title>Company Information</mat-card-title>\n </mat-card-content>\n <mat-card-content class=\"mt-3\">\n <form\n [formGroup]=\"form\"\n class=\"d-flex flex-wrap justify-content-start align-items-center gap-2\"\n (submit)=\"save()\"\n >\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>Name</mat-label>\n <input matInput formControlName=\"name\">\n <mat-error *ngIf=\"isFieldValid('name')\">\n {{ getErrorMessage('name') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(50% - 0.5rem)\">\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\">\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(50%)\">\n <mat-label>Phone</mat-label>\n <input matInput formControlName=\"phone\">\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>Address</mat-label>\n <textarea matInput formControlName=\"address\" rows=\"3\"></textarea>\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>TIN</mat-label>\n <input matInput formControlName=\"tin\">\n </mat-form-field>\n\n <div style=\"width: calc(50% - 0.5rem)\">\n <p>Logo</p>\n <app-file-upload-button\n *ngIf=\"!form?.value?.logo\"\n [config]=\"{ fileId: 'client-logo-' + this.form.value?.id, accept: 'image/*'}\"\n (uploaded)=\"onFileUploaded($event, 'logo')\"\n ></app-file-upload-button>\n <app-image-preview\n *ngIf=\"form.value?.logo\"\n [path]=\"form.value?.logo\"\n (removed)=\"form.get('logo')?.setValue('')\"\n ></app-image-preview>\n </div>\n\n <div style=\"width: calc(50% - 0.5rem)\">\n <p>Letterhead Image</p>\n <app-file-upload-button\n *ngIf=\"!form.value?.letterhead_image\"\n [config]=\"{ fileId: 'client-letterhead-' + this.form.value?.id, accept: 'image/*'}\"\n (uploaded)=\"onFileUploaded($event, 'letterhead_image')\"\n ></app-file-upload-button>\n <app-image-preview\n *ngIf=\"form.value?.letterhead_image\"\n [path]=\"form.value?.letterhead_image\"\n (removed)=\"form.get('letterhead_image')?.setValue('')\"\n ></app-image-preview>\n </div>\n\n <div style=\"width: calc(100%)\" class=\"d-flex justify-content-end align-items-center gap-3\">\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" type=\"submit\">\n Save\n </button>\n <button [disabled]=\"isWorking\" mat-flat-button type=\"button\" (click)=\"redirectBack()\">\n Cancel\n </button>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FileUploadButtonComponent, selector: "app-file-upload-button", inputs: ["config"], outputs: ["uploaded"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: ImagePreviewComponent, selector: "app-image-preview", inputs: ["path", "height"], outputs: ["removed"] }] }); }
13135
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CompanyInformationComponent, isStandalone: true, selector: "app-company-information", inputs: { client: "client", isAppAdmin: "isAppAdmin" }, outputs: { saved: "saved", cancelled: "cancelled" }, usesInheritance: true, ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center\" *ngIf=\"!isAppAdmin\">\n <mat-card style=\"width: 50%\">\n <mat-card-content>\n <mat-card-title>Company Information</mat-card-title>\n </mat-card-content>\n <mat-card-content class=\"mt-3\">\n <ng-container >\n <ng-container *ngTemplateOutlet=\"tenantForm\"></ng-container>\n </ng-container>\n </mat-card-content>\n </mat-card>\n</div>\n\n<ng-container *ngIf=\"isAppAdmin\">\n <ng-container *ngTemplateOutlet=\"tenantForm\"></ng-container>\n</ng-container>\n\n<ng-template #tenantForm>\n <h4 class=\"fw-bold\">{{ client?.id ? 'Edit' : 'Create' }} Tenant</h4>\n <form [formGroup]=\"form\" class=\"d-flex flex-wrap justify-content-start align-items-center gap-2\" (submit)=\"save()\">\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>Name</mat-label>\n <input matInput formControlName=\"name\">\n <mat-error *ngIf=\"isFieldValid('name')\">\n {{ getErrorMessage('name') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(50% - 0.5rem)\">\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\">\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(50%)\">\n <mat-label>Phone</mat-label>\n <input matInput formControlName=\"phone\">\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>Address</mat-label>\n <textarea matInput formControlName=\"address\" rows=\"3\"></textarea>\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>TIN</mat-label>\n <input matInput formControlName=\"tin\">\n </mat-form-field>\n\n <div style=\"width: calc(50% - 0.5rem)\">\n <p>Logo</p>\n <app-file-upload-button\n *ngIf=\"!form?.value?.logo\"\n [config]=\"{ fileId: 'client-logo-' + this.form.value?.id, accept: 'image/*'}\"\n (uploaded)=\"onFileUploaded($event, 'logo')\"\n ></app-file-upload-button>\n <app-image-preview\n *ngIf=\"form.value?.logo\"\n [path]=\"form.value?.logo\"\n (removed)=\"form.get('logo')?.setValue('')\"\n ></app-image-preview>\n </div>\n\n <div style=\"width: calc(50% - 0.5rem)\">\n <p>Letterhead Image</p>\n <app-file-upload-button\n *ngIf=\"!form.value?.letterhead_image\"\n [config]=\"{ fileId: 'client-letterhead-' + this.form.value?.id, accept: 'image/*'}\"\n (uploaded)=\"onFileUploaded($event, 'letterhead_image')\"\n ></app-file-upload-button>\n <app-image-preview\n *ngIf=\"form.value?.letterhead_image\"\n [path]=\"form.value?.letterhead_image\"\n (removed)=\"form.get('letterhead_image')?.setValue('')\"\n ></app-image-preview>\n </div>\n\n <div style=\"width: calc(100%)\" class=\"d-flex justify-content-end align-items-center gap-3\">\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" type=\"submit\">\n Save\n </button>\n <button [disabled]=\"isWorking\" mat-flat-button type=\"button\" (click)=\"redirectBack()\">\n Cancel\n </button>\n </div>\n </form>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FileUploadButtonComponent, selector: "app-file-upload-button", inputs: ["config"], outputs: ["uploaded"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: ImagePreviewComponent, selector: "app-image-preview", inputs: ["path", "height"], outputs: ["removed"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
13028
13136
  }
13029
13137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CompanyInformationComponent, decorators: [{
13030
13138
  type: Component,
@@ -13041,33 +13149,85 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
13041
13149
  NgIf,
13042
13150
  MatError,
13043
13151
  ImagePreviewComponent,
13044
- ], template: "<div class=\"d-flex justify-content-center align-items-center\">\n <mat-card style=\"width: 50%\">\n <mat-card-content>\n <mat-card-title>Company Information</mat-card-title>\n </mat-card-content>\n <mat-card-content class=\"mt-3\">\n <form\n [formGroup]=\"form\"\n class=\"d-flex flex-wrap justify-content-start align-items-center gap-2\"\n (submit)=\"save()\"\n >\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>Name</mat-label>\n <input matInput formControlName=\"name\">\n <mat-error *ngIf=\"isFieldValid('name')\">\n {{ getErrorMessage('name') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(50% - 0.5rem)\">\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\">\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(50%)\">\n <mat-label>Phone</mat-label>\n <input matInput formControlName=\"phone\">\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>Address</mat-label>\n <textarea matInput formControlName=\"address\" rows=\"3\"></textarea>\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>TIN</mat-label>\n <input matInput formControlName=\"tin\">\n </mat-form-field>\n\n <div style=\"width: calc(50% - 0.5rem)\">\n <p>Logo</p>\n <app-file-upload-button\n *ngIf=\"!form?.value?.logo\"\n [config]=\"{ fileId: 'client-logo-' + this.form.value?.id, accept: 'image/*'}\"\n (uploaded)=\"onFileUploaded($event, 'logo')\"\n ></app-file-upload-button>\n <app-image-preview\n *ngIf=\"form.value?.logo\"\n [path]=\"form.value?.logo\"\n (removed)=\"form.get('logo')?.setValue('')\"\n ></app-image-preview>\n </div>\n\n <div style=\"width: calc(50% - 0.5rem)\">\n <p>Letterhead Image</p>\n <app-file-upload-button\n *ngIf=\"!form.value?.letterhead_image\"\n [config]=\"{ fileId: 'client-letterhead-' + this.form.value?.id, accept: 'image/*'}\"\n (uploaded)=\"onFileUploaded($event, 'letterhead_image')\"\n ></app-file-upload-button>\n <app-image-preview\n *ngIf=\"form.value?.letterhead_image\"\n [path]=\"form.value?.letterhead_image\"\n (removed)=\"form.get('letterhead_image')?.setValue('')\"\n ></app-image-preview>\n </div>\n\n <div style=\"width: calc(100%)\" class=\"d-flex justify-content-end align-items-center gap-3\">\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" type=\"submit\">\n Save\n </button>\n <button [disabled]=\"isWorking\" mat-flat-button type=\"button\" (click)=\"redirectBack()\">\n Cancel\n </button>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n</div>\n" }]
13045
- }], ctorParameters: () => [{ type: FormValidatorService }, { type: i1$4.FormBuilder }, { type: CurrentUserService }, { type: ClientService }, { type: AlertService }, { type: i2$1.Location }] });
13152
+ NgTemplateOutlet,
13153
+ ], template: "<div class=\"d-flex justify-content-center align-items-center\" *ngIf=\"!isAppAdmin\">\n <mat-card style=\"width: 50%\">\n <mat-card-content>\n <mat-card-title>Company Information</mat-card-title>\n </mat-card-content>\n <mat-card-content class=\"mt-3\">\n <ng-container >\n <ng-container *ngTemplateOutlet=\"tenantForm\"></ng-container>\n </ng-container>\n </mat-card-content>\n </mat-card>\n</div>\n\n<ng-container *ngIf=\"isAppAdmin\">\n <ng-container *ngTemplateOutlet=\"tenantForm\"></ng-container>\n</ng-container>\n\n<ng-template #tenantForm>\n <h4 class=\"fw-bold\">{{ client?.id ? 'Edit' : 'Create' }} Tenant</h4>\n <form [formGroup]=\"form\" class=\"d-flex flex-wrap justify-content-start align-items-center gap-2\" (submit)=\"save()\">\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>Name</mat-label>\n <input matInput formControlName=\"name\">\n <mat-error *ngIf=\"isFieldValid('name')\">\n {{ getErrorMessage('name') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(50% - 0.5rem)\">\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\">\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(50%)\">\n <mat-label>Phone</mat-label>\n <input matInput formControlName=\"phone\">\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>Address</mat-label>\n <textarea matInput formControlName=\"address\" rows=\"3\"></textarea>\n </mat-form-field>\n\n <mat-form-field style=\"width: calc(100%)\">\n <mat-label>TIN</mat-label>\n <input matInput formControlName=\"tin\">\n </mat-form-field>\n\n <div style=\"width: calc(50% - 0.5rem)\">\n <p>Logo</p>\n <app-file-upload-button\n *ngIf=\"!form?.value?.logo\"\n [config]=\"{ fileId: 'client-logo-' + this.form.value?.id, accept: 'image/*'}\"\n (uploaded)=\"onFileUploaded($event, 'logo')\"\n ></app-file-upload-button>\n <app-image-preview\n *ngIf=\"form.value?.logo\"\n [path]=\"form.value?.logo\"\n (removed)=\"form.get('logo')?.setValue('')\"\n ></app-image-preview>\n </div>\n\n <div style=\"width: calc(50% - 0.5rem)\">\n <p>Letterhead Image</p>\n <app-file-upload-button\n *ngIf=\"!form.value?.letterhead_image\"\n [config]=\"{ fileId: 'client-letterhead-' + this.form.value?.id, accept: 'image/*'}\"\n (uploaded)=\"onFileUploaded($event, 'letterhead_image')\"\n ></app-file-upload-button>\n <app-image-preview\n *ngIf=\"form.value?.letterhead_image\"\n [path]=\"form.value?.letterhead_image\"\n (removed)=\"form.get('letterhead_image')?.setValue('')\"\n ></app-image-preview>\n </div>\n\n <div style=\"width: calc(100%)\" class=\"d-flex justify-content-end align-items-center gap-3\">\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" type=\"submit\">\n Save\n </button>\n <button [disabled]=\"isWorking\" mat-flat-button type=\"button\" (click)=\"redirectBack()\">\n Cancel\n </button>\n </div>\n </form>\n</ng-template>\n" }]
13154
+ }], ctorParameters: () => [{ type: FormValidatorService }, { type: i1$4.FormBuilder }, { type: CurrentUserService }, { type: ClientService }, { type: AlertService }, { type: i2$1.Location }], propDecorators: { client: [{
13155
+ type: Input
13156
+ }], isAppAdmin: [{
13157
+ type: Input
13158
+ }], saved: [{
13159
+ type: Output
13160
+ }], cancelled: [{
13161
+ type: Output
13162
+ }] } });
13163
+
13164
+ class TenantFormButtonComponent {
13165
+ constructor(matDialog) {
13166
+ this.matDialog = matDialog;
13167
+ this.saved = new EventEmitter();
13168
+ this.isAppAdmin = false;
13169
+ }
13170
+ showForm(templateRef) {
13171
+ this.matDialog.open(templateRef, { width: '600px' });
13172
+ }
13173
+ onSaved(client) {
13174
+ this.saved.emit(client);
13175
+ this.matDialog.closeAll();
13176
+ }
13177
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantFormButtonComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
13178
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TenantFormButtonComponent, isStandalone: true, selector: "app-tenant-form-button", inputs: { client: "client", isAppAdmin: "isAppAdmin" }, outputs: { saved: "saved" }, ngImport: i0, template: "<mat-icon class=\"cursor-pointer\" (click)=\"showForm(formTemplate)\">{{ client ? 'edit' : 'add' }}</mat-icon>\n\n<ng-template #formTemplate>\n <div mat-dialog-content>\n <app-company-information [client]=\"client\" [isAppAdmin]=\"isAppAdmin\" (saved)=\"onSaved($event)\"\n (cancelled)=\"matDialog.closeAll()\"></app-company-information>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MaterialModule }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: CompanyInformationComponent, selector: "app-company-information", inputs: ["client", "isAppAdmin"], outputs: ["saved", "cancelled"] }] }); }
13179
+ }
13180
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantFormButtonComponent, decorators: [{
13181
+ type: Component,
13182
+ args: [{ selector: 'app-tenant-form-button', standalone: true, imports: [
13183
+ MaterialModule,
13184
+ CompanyInformationComponent
13185
+ ], template: "<mat-icon class=\"cursor-pointer\" (click)=\"showForm(formTemplate)\">{{ client ? 'edit' : 'add' }}</mat-icon>\n\n<ng-template #formTemplate>\n <div mat-dialog-content>\n <app-company-information [client]=\"client\" [isAppAdmin]=\"isAppAdmin\" (saved)=\"onSaved($event)\"\n (cancelled)=\"matDialog.closeAll()\"></app-company-information>\n </div>\n</ng-template>\n" }]
13186
+ }], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { client: [{
13187
+ type: Input
13188
+ }], saved: [{
13189
+ type: Output
13190
+ }], isAppAdmin: [{
13191
+ type: Input
13192
+ }] } });
13046
13193
 
13047
13194
  class CompanyInfoDisplayComponent {
13048
13195
  constructor(currentUserService) {
13049
13196
  this.currentUserService = currentUserService;
13050
13197
  this.forceReload = true;
13198
+ this.isEditAllowed = false;
13199
+ this.isAppAdmin = false;
13051
13200
  }
13052
13201
  ngOnInit() {
13202
+ this.loadData();
13203
+ }
13204
+ loadData() {
13053
13205
  if (this.forceReload) {
13054
13206
  this.currentUserService.getUserObservable(true).subscribe((user) => {
13055
13207
  this.client = user?.client;
13056
13208
  });
13057
13209
  }
13058
13210
  }
13211
+ onSaved(client) {
13212
+ this.client = client;
13213
+ }
13059
13214
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CompanyInfoDisplayComponent, deps: [{ token: CurrentUserService }], target: i0.ɵɵFactoryTarget.Component }); }
13060
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CompanyInfoDisplayComponent, isStandalone: true, selector: "app-company-info-display", inputs: { client: "client", forceReload: "forceReload" }, ngImport: i0, template: "<div *ngIf=\"client\" class=\"d-flex justify-content-start align-items-start gap-2\">\n <img *ngIf=\"client?.logo\" [src]=\"client?.logo\" class=\"img img-thumbnail\" style=\"max-height: 75px\" alt=\"\">\n <div>\n <h3 class=\"text-dark mb-1\">{{ client?.name }}</h3>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.address\">\n {{ client?.address }}\n </p>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.phone\">\n {{ client?.phone }}\n </p>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.email\">\n {{ client?.email }}\n </p>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
13215
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CompanyInfoDisplayComponent, isStandalone: true, selector: "app-company-info-display", inputs: { client: "client", forceReload: "forceReload", isEditAllowed: "isEditAllowed", isAppAdmin: "isAppAdmin" }, ngImport: i0, template: "<div *ngIf=\"client\" class=\"d-flex justify-content-start align-items-start gap-2\">\n <img *ngIf=\"client?.logo\" [src]=\"client?.logo\" class=\"img img-thumbnail\" style=\"max-height: 75px\" alt=\"\">\n <div class=\"w-100\">\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <h3 class=\"text-dark mb-1\">{{ client?.name }}</h3>\n <app-tenant-form-button (saved)=\"onSaved($event)\" *ngIf=\"isEditAllowed\" [client]=\"client\" [isAppAdmin]=\"isAppAdmin\">\n </app-tenant-form-button>\n </div>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.address\">\n {{ client?.address }}\n </p>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.phone\">\n {{ client?.phone }}\n </p>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.email\">\n {{ client?.email }}\n </p>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TenantFormButtonComponent, selector: "app-tenant-form-button", inputs: ["client", "isAppAdmin"], outputs: ["saved"] }] }); }
13061
13216
  }
13062
13217
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CompanyInfoDisplayComponent, decorators: [{
13063
13218
  type: Component,
13064
13219
  args: [{ selector: 'app-company-info-display', standalone: true, imports: [
13065
- NgIf
13066
- ], template: "<div *ngIf=\"client\" class=\"d-flex justify-content-start align-items-start gap-2\">\n <img *ngIf=\"client?.logo\" [src]=\"client?.logo\" class=\"img img-thumbnail\" style=\"max-height: 75px\" alt=\"\">\n <div>\n <h3 class=\"text-dark mb-1\">{{ client?.name }}</h3>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.address\">\n {{ client?.address }}\n </p>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.phone\">\n {{ client?.phone }}\n </p>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.email\">\n {{ client?.email }}\n </p>\n </div>\n</div>\n" }]
13220
+ NgIf,
13221
+ TenantFormButtonComponent
13222
+ ], template: "<div *ngIf=\"client\" class=\"d-flex justify-content-start align-items-start gap-2\">\n <img *ngIf=\"client?.logo\" [src]=\"client?.logo\" class=\"img img-thumbnail\" style=\"max-height: 75px\" alt=\"\">\n <div class=\"w-100\">\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <h3 class=\"text-dark mb-1\">{{ client?.name }}</h3>\n <app-tenant-form-button (saved)=\"onSaved($event)\" *ngIf=\"isEditAllowed\" [client]=\"client\" [isAppAdmin]=\"isAppAdmin\">\n </app-tenant-form-button>\n </div>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.address\">\n {{ client?.address }}\n </p>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.phone\">\n {{ client?.phone }}\n </p>\n <p class=\"mb-1 text-secondary\" *ngIf=\"client?.email\">\n {{ client?.email }}\n </p>\n </div>\n</div>\n" }]
13067
13223
  }], ctorParameters: () => [{ type: CurrentUserService }], propDecorators: { client: [{
13068
13224
  type: Input
13069
13225
  }], forceReload: [{
13070
13226
  type: Input
13227
+ }], isEditAllowed: [{
13228
+ type: Input
13229
+ }], isAppAdmin: [{
13230
+ type: Input
13071
13231
  }] } });
13072
13232
 
13073
13233
  class TechlifyAppService extends TechlifyServiceBaseClass {
@@ -13158,15 +13318,16 @@ class TenantListWidgetComponent extends TechlifyListingControllerInterface {
13158
13318
  });
13159
13319
  }
13160
13320
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantListWidgetComponent, deps: [{ token: ClientService }], target: i0.ɵɵFactoryTarget.Component }); }
13161
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TenantListWidgetComponent, isStandalone: true, selector: "app-tenant-list-widget", usesInheritance: true, ngImport: i0, template: "<mat-card>\n <mat-card-content>\n <mat-card-title>Tenants</mat-card-title>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\">\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index;\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"Name\">\n <th mat-header-cell *matHeaderCellDef> Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{ element?.name }}</td>\n </ng-container>\n\n <!-- Users Column -->\n <ng-container matColumnDef=\"Users\">\n <th mat-header-cell *matHeaderCellDef> Users </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.users_count }}</td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"Actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon class=\"cursor-pointer\" [routerLink]=\"['/app-admin/tenants', element?.id, 'view']\">\n visibility\n </mat-icon>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MaterialModule }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i13.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i13.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i13.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i13.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i13.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i13.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i13.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i13.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i13.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
13321
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TenantListWidgetComponent, isStandalone: true, selector: "app-tenant-list-widget", usesInheritance: true, ngImport: i0, template: "<mat-card>\n <mat-card-content>\n <mat-card-title class=\"d-flex justify-content-start align-items-center gap-2\">\n <h4 class=\"mb-0\">Tenants</h4>\n <app-tenant-form-button [isAppAdmin]=\"true\" class=\"mt-2\" (saved)=\"reload()\">\n </app-tenant-form-button>\n </mat-card-title>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\">\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index;\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"Name\">\n <th mat-header-cell *matHeaderCellDef> Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{ element?.name }}</td>\n </ng-container>\n\n <!-- Users Column -->\n <ng-container matColumnDef=\"Users\">\n <th mat-header-cell *matHeaderCellDef> Users </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.users_count }}</td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"Actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon class=\"cursor-pointer\" [routerLink]=\"['/app-admin/tenants', element?.id, 'view']\">\n visibility\n </mat-icon>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MaterialModule }, { kind: "component", type: i8$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i13.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i13.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i13.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i13.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i13.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i13.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i13.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i13.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i13.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: TenantFormButtonComponent, selector: "app-tenant-form-button", inputs: ["client", "isAppAdmin"], outputs: ["saved"] }] }); }
13162
13322
  }
13163
13323
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantListWidgetComponent, decorators: [{
13164
13324
  type: Component,
13165
13325
  args: [{ selector: 'app-tenant-list-widget', standalone: true, imports: [
13166
13326
  MaterialModule,
13167
13327
  NgIf,
13168
- RouterLink
13169
- ], template: "<mat-card>\n <mat-card-content>\n <mat-card-title>Tenants</mat-card-title>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\">\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index;\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"Name\">\n <th mat-header-cell *matHeaderCellDef> Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{ element?.name }}</td>\n </ng-container>\n\n <!-- Users Column -->\n <ng-container matColumnDef=\"Users\">\n <th mat-header-cell *matHeaderCellDef> Users </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.users_count }}</td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"Actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon class=\"cursor-pointer\" [routerLink]=\"['/app-admin/tenants', element?.id, 'view']\">\n visibility\n </mat-icon>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n" }]
13328
+ RouterLink,
13329
+ TenantFormButtonComponent
13330
+ ], template: "<mat-card>\n <mat-card-content>\n <mat-card-title class=\"d-flex justify-content-start align-items-center gap-2\">\n <h4 class=\"mb-0\">Tenants</h4>\n <app-tenant-form-button [isAppAdmin]=\"true\" class=\"mt-2\" (saved)=\"reload()\">\n </app-tenant-form-button>\n </mat-card-title>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\">\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef> # </th>\n <td mat-cell *matCellDef=\"let element; let i = index;\"> {{ i + 1 }} </td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"Name\">\n <th mat-header-cell *matHeaderCellDef> Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{ element?.name }}</td>\n </ng-container>\n\n <!-- Users Column -->\n <ng-container matColumnDef=\"Users\">\n <th mat-header-cell *matHeaderCellDef> Users </th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.users_count }}</td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"Actions\">\n <th mat-header-cell *matHeaderCellDef> Actions </th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon class=\"cursor-pointer\" [routerLink]=\"['/app-admin/tenants', element?.id, 'view']\">\n visibility\n </mat-icon>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>\n" }]
13170
13331
  }], ctorParameters: () => [{ type: ClientService }] });
13171
13332
 
13172
13333
  class AppAdminHomeComponent {
@@ -13348,7 +13509,8 @@ class AppAdminUserViewModule {
13348
13509
  LoginHistoryForUserModule,
13349
13510
  AuditLogListModule,
13350
13511
  AppAdminUserViewRoutingProvider,
13351
- UserModule], exports: [AppAdminUserViewComponent] }); }
13512
+ UserClientsListModule,
13513
+ UserSessionsModule], exports: [AppAdminUserViewComponent] }); }
13352
13514
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminUserViewModule, imports: [CommonModule,
13353
13515
  MaterialModule,
13354
13516
  FlexLayoutModule,
@@ -13357,7 +13519,8 @@ class AppAdminUserViewModule {
13357
13519
  LoginHistoryForUserModule,
13358
13520
  AuditLogListModule,
13359
13521
  AppAdminUserViewRoutingProvider,
13360
- UserModule] }); }
13522
+ UserClientsListModule,
13523
+ UserSessionsModule] }); }
13361
13524
  }
13362
13525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminUserViewModule, decorators: [{
13363
13526
  type: NgModule,
@@ -13371,7 +13534,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
13371
13534
  LoginHistoryForUserModule,
13372
13535
  AuditLogListModule,
13373
13536
  AppAdminUserViewRoutingProvider,
13374
- UserModule,
13537
+ UserClientsListModule,
13538
+ UserSessionsModule
13375
13539
  ],
13376
13540
  declarations: [
13377
13541
  AppAdminUserViewComponent
@@ -13395,5 +13559,5 @@ var appAdminUserView_module = /*#__PURE__*/Object.freeze({
13395
13559
  * Generated bundle index. Do not edit.
13396
13560
  */
13397
13561
 
13398
- export { AccessControlConfigModule, ActionPopup, ActionPopupComponent, ActionPopupModule, AlertService, ApiPrefixInterceptor, AppAdminHomeComponent, AppAdminModule, AppAdminUserViewComponent, AppAdminUserViewModule, AppSwitcherComponent, AuditLogForModelComponent, AuditLogForModelModule, AuditLogForModelRoutingModule, AuditLogListComponent, AuditLogListFilterComponent, AuditLogListFilterModule, AuditLogListFilterRoutingModule, AuditLogListModule, AuditLogListRoutingModule, AuditLogModule, AuditLogRoutingModule, AuditLogViewComponent, AuditLogViewModelComponent, AuditLogViewModelModule, AuditLogViewModelRoutingModule, AuditLogViewModule, AuditLogViewRoutingModule, AuditLogsViewModelComponent, AuditLogsViewModelModule, AuditLogsViewModelRoutingModule, AuthenticationGuard, AuthenticationService, CacheInterceptor, ChangePasswordModule, ClientService, ColumnConfig, ColumnSelectorComponent, ColumnSelectorModule, CommentFormComponent, CompanyInfoDisplayComponent, CompanyInformationComponent, ConfigService, CoreModule, CredentialsService, CurrentUserService, DEFAULT_SELECTED_VALUE, DataManager, DataTable, DataTableComponent, DataTableModule, DateUtils, DateValidator, DocumentViewerComponent, DocumentViewerModule, EmailSubscriptionForUserComponent, EmailSubscriptionForUserModule, EmailSubscriptionForUserRoutingModule, EmailSubscriptionModule, EmailSubscriptionRoutingModule, EmailSubscriptionTypeFormComponent, EmailSubscriptionTypeFormModule, EmailSubscriptionTypeFormRoutingModule, EmailSubscriptionTypeListComponent, EmailSubscriptionTypeListModule, EmailSubscriptionTypeListRoutingModule, EmailSubscriptionTypeModule, EmailSubscriptionTypeRoutingModule, EmailSubscriptionUserFormComponent, EmailSubscriptionUserFormModule, EmailSubscriptionUserFormRoutingModule, EmailSubscriptionUserListComponent, EmailSubscriptionUserListFilterComponent, EmailSubscriptionUserListFilterModule, EmailSubscriptionUserListFilterRoutingModule, EmailSubscriptionUserListModule, EmailSubscriptionUserListRoutingModule, EmailSubscriptionUserModule, EmailSubscriptionUserRoutingModule, EntityFileFormComponent, EntityFileService, EntityFilesViewAllComponent, EntityFilesViewAllModule, ErrorHandlerInterceptor, ErrorHandlerService, ErrorSnackComponent, ExportExcelButtonComponent, ExportExcelModule, FileDragdropUploaderComponent, FileDragdropUploaderModule, FileDropperComponent, FileDropperConfig, FileDropperModule, FilterService, ForgotPasswordComponent, ForgotPasswordModule, ForgotPasswordRoutingModule, FormValidatorService, HTTP_DYNAMIC_INTERCEPTORS, HttpCacheService, HttpService, ImportCsvComponent, ImportCsvModule, LoaderComponent, LoaderModule, LogLevel, Logger, LoginComponent, LoginFormFieldsComponent, LoginHistoryForUserComponent, LoginHistoryForUserModule, LoginHistoryForUserRoutingModule, LoginModule, LoginRoutingModule, MaterialModule, MultiUserConfig, NgxTechlifyUsersModule, NoteFormComponent, NoteListComponent, NoteModule, NumItemsSelector, NumberInputButtonComponent, NumberInputButtonModule, NumberSelector, PageEvent, Permission, PermissionModule, PermissionRoutingProvider, PermissionsManagementComponent, ProfileEditComponent, ProfileModule, ProfileRoutingModule, ReadMoreComponent, ReadMoreModule, RequestHelperService, ResetPasswordComponent, ResetPasswordModule, ResetPasswordRoutingModule, ResetPasswordService, RestrictorTypeSelectorComponent, RestrictorTypeSelectorModule, RestrictorsModule, Role, RoleFormButtonComponent, RoleFormComponent, RoleModule, RoleRoutingProvider, RoleService, RolesViewAllComponent, RouteReusableStrategy, SearchableSelectorComponent, SearchableSelectorModule, SignUpComponent, SignupModule, SignupRoutingModule, SnackModule, StorageService, SuccessSnackComponent, TechlifyCompanySwitcherComponent, TechlifyCompanySwitcherModule, TechlifyConfig, TechlifyFeatureEnabledDirective, TechlifyFeatureListingComponent, TechlifyFeatureModule, TechlifyFeatureRoutes, TechlifyFormComponentInterface, TechlifyListingControllerInterface, TechlifyNotificationForUserComponent, TechlifyNotificationForUserModule, TechlifyNotificationForUserRoutingModule, TechlifyNotificationModule, TechlifyNotificationRoutingModule, TechlifyServiceBaseClass, TechlifyTaggerTagFormConfigModel, TechlifyTaggerTagFormFieldComponent, TechlifyTaggerTagFormFieldModule, TechlifyTaggerTagSelectorComponent, TechlifyTaggerTagSelectorModule, TechlifyUpdateHistoryModule, TechlifyUpdateModule, TechlifyUpdateService, TechlifyUpdatesTeaserComponent, TechlifyUpdatesTeaserModule, TenantListWidgetComponent, Timeline, TimelineFilterComponent, TimelineFilterModule, TokenInterceptor, UpdateNotifierComponent, UpdateNotifierModule, User, UserClientEnableDisableButtonComponent, UserClientsListComponent, UserConfig, UserConfigService, UserDataService, UserEnableButtonComponent, UserExploreComponent, UserFormComponent, UserListPageConfig, UserMenuComponent, UserMenuModule, UserModule, UserRoutingProvider, UserSelectorComponent, UserSelectorModule, UserService, UserSessionsComponent, UserViewComponent, UsersViewAllComponent, UtilityModule, ViewerConfig, WrapPipe, calculateTimeline, esfur, estlr, esulr };
13562
+ export { AccessControlConfigModule, ActionPopup, ActionPopupComponent, ActionPopupModule, AlertService, ApiPrefixInterceptor, AppAdminHomeComponent, AppAdminModule, AppAdminUserViewComponent, AppAdminUserViewModule, AppSwitcherComponent, AuditLogForModelComponent, AuditLogForModelModule, AuditLogForModelRoutingModule, AuditLogListComponent, AuditLogListFilterComponent, AuditLogListFilterModule, AuditLogListFilterRoutingModule, AuditLogListModule, AuditLogListRoutingModule, AuditLogModule, AuditLogRoutingModule, AuditLogViewComponent, AuditLogViewModelComponent, AuditLogViewModelModule, AuditLogViewModelRoutingModule, AuditLogViewModule, AuditLogViewRoutingModule, AuditLogsViewModelComponent, AuditLogsViewModelModule, AuditLogsViewModelRoutingModule, AuthenticationGuard, AuthenticationService, CacheInterceptor, ChangePasswordModule, ClientService, ColumnConfig, ColumnSelectorComponent, ColumnSelectorModule, CommentFormComponent, CompanyInfoDisplayComponent, CompanyInformationComponent, ConfigService, CoreModule, CredentialsService, CurrentUserService, DEFAULT_SELECTED_VALUE, DataManager, DataTable, DataTableComponent, DataTableModule, DateUtils, DateValidator, DocumentViewerComponent, DocumentViewerModule, EmailSubscriptionForUserComponent, EmailSubscriptionForUserModule, EmailSubscriptionForUserRoutingModule, EmailSubscriptionModule, EmailSubscriptionRoutingModule, EmailSubscriptionTypeFormComponent, EmailSubscriptionTypeFormModule, EmailSubscriptionTypeFormRoutingModule, EmailSubscriptionTypeListComponent, EmailSubscriptionTypeListModule, EmailSubscriptionTypeListRoutingModule, EmailSubscriptionTypeModule, EmailSubscriptionTypeRoutingModule, EmailSubscriptionUserFormComponent, EmailSubscriptionUserFormModule, EmailSubscriptionUserFormRoutingModule, EmailSubscriptionUserListComponent, EmailSubscriptionUserListFilterComponent, EmailSubscriptionUserListFilterModule, EmailSubscriptionUserListFilterRoutingModule, EmailSubscriptionUserListModule, EmailSubscriptionUserListRoutingModule, EmailSubscriptionUserModule, EmailSubscriptionUserRoutingModule, EntityFileFormComponent, EntityFileService, EntityFilesViewAllComponent, EntityFilesViewAllModule, ErrorHandlerInterceptor, ErrorHandlerService, ErrorSnackComponent, ExportExcelButtonComponent, ExportExcelModule, FileDragdropUploaderComponent, FileDragdropUploaderModule, FileDropperComponent, FileDropperConfig, FileDropperModule, FilterService, ForgotPasswordComponent, ForgotPasswordModule, ForgotPasswordRoutingModule, FormValidatorService, HTTP_DYNAMIC_INTERCEPTORS, HttpCacheService, HttpService, ImportCsvComponent, ImportCsvModule, LoaderComponent, LoaderModule, LogLevel, Logger, LoginComponent, LoginFormFieldsComponent, LoginHistoryForUserComponent, LoginHistoryForUserModule, LoginHistoryForUserRoutingModule, LoginModule, LoginRoutingModule, MaterialModule, MultiUserConfig, NgxTechlifyUsersModule, NoteFormComponent, NoteListComponent, NoteModule, NumItemsSelector, NumberInputButtonComponent, NumberInputButtonModule, NumberSelector, PageEvent, Permission, PermissionModule, PermissionRoutingProvider, PermissionsManagementComponent, ProfileEditComponent, ProfileModule, ProfileRoutingModule, ReadMoreComponent, ReadMoreModule, RequestHelperService, ResetPasswordComponent, ResetPasswordModule, ResetPasswordRoutingModule, ResetPasswordService, RestrictorTypeSelectorComponent, RestrictorTypeSelectorModule, RestrictorsModule, Role, RoleFormButtonComponent, RoleFormComponent, RoleModule, RoleRoutingProvider, RoleService, RolesViewAllComponent, RouteReusableStrategy, SearchableSelectorComponent, SearchableSelectorModule, SignUpComponent, SignupModule, SignupRoutingModule, SnackModule, StorageService, SuccessSnackComponent, TechlifyCompanySwitcherComponent, TechlifyCompanySwitcherModule, TechlifyConfig, TechlifyFeatureEnabledDirective, TechlifyFeatureListingComponent, TechlifyFeatureModule, TechlifyFeatureRoutes, TechlifyFormComponentInterface, TechlifyListingControllerInterface, TechlifyNotificationForUserComponent, TechlifyNotificationForUserModule, TechlifyNotificationForUserRoutingModule, TechlifyNotificationModule, TechlifyNotificationRoutingModule, TechlifyServiceBaseClass, TechlifyTaggerTagFormConfigModel, TechlifyTaggerTagFormFieldComponent, TechlifyTaggerTagFormFieldModule, TechlifyTaggerTagSelectorComponent, TechlifyTaggerTagSelectorModule, TechlifyUpdateHistoryModule, TechlifyUpdateModule, TechlifyUpdateService, TechlifyUpdatesTeaserComponent, TechlifyUpdatesTeaserModule, TenantFormButtonComponent, TenantListWidgetComponent, Timeline, TimelineFilterComponent, TimelineFilterModule, TokenInterceptor, UpdateNotifierComponent, UpdateNotifierModule, User, UserClientEnableDisableButtonComponent, UserClientEnableDisableButtonModule, UserClientsListComponent, UserClientsListModule, UserConfig, UserConfigService, UserDataService, UserEnableButtonComponent, UserEnableButtonModule, UserExploreComponent, UserFormComponent, UserListPageConfig, UserMenuComponent, UserMenuModule, UserModule, UserRoutingProvider, UserSelectorComponent, UserSelectorModule, UserService, UserSessionsComponent, UserSessionsModule, UserViewComponent, UsersViewAllComponent, UtilityModule, ViewerConfig, WrapPipe, calculateTimeline, esfur, estlr, esulr };
13399
13563
  //# sourceMappingURL=ngx-techlify-core.mjs.map