ngx-techlify-core 18.10.0 → 18.12.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.
- package/esm2022/lib/app-admin/app-admin-home/app-admin-home.component.mjs +17 -0
- package/esm2022/lib/app-admin/app-admin-routing.module.mjs +29 -0
- package/esm2022/lib/app-admin/app-admin.module.mjs +22 -0
- package/esm2022/lib/app-admin/tenant/tenant-list-widget/tenant-list-widget.component.mjs +50 -0
- package/esm2022/lib/app-switcher/app-switcher.component.mjs +4 -12
- package/esm2022/lib/login/login-form-fields/login-form-fields.component.mjs +25 -10
- package/esm2022/lib/role/permission/permissions-management.component.mjs +10 -11
- package/esm2022/lib/searchable-selector/searchable-selector.component.mjs +3 -3
- package/esm2022/lib/user/user-form.component.mjs +7 -8
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/ngx-techlify-core.mjs +287 -193
- package/fesm2022/ngx-techlify-core.mjs.map +1 -1
- package/lib/app-admin/app-admin-home/app-admin-home.component.d.ts +5 -0
- package/lib/app-admin/app-admin-routing.module.d.ts +7 -0
- package/lib/app-admin/app-admin.module.d.ts +8 -0
- package/lib/app-admin/tenant/tenant-list-widget/tenant-list-widget.component.d.ts +13 -0
- package/lib/app-switcher/app-switcher.component.d.ts +0 -2
- package/lib/login/login-form-fields/login-form-fields.component.d.ts +3 -1
- package/package.json +3 -2
- package/public-api.d.ts +3 -0
- package/esm2022/lib/app-switcher/app-switcher-icons.mjs +0 -10
- package/lib/app-switcher/app-switcher-icons.d.ts +0 -5
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { NgxPermissionsModule } from 'ngx-permissions';
|
|
3
|
+
import { TenantListWidgetComponent } from '../tenant/tenant-list-widget/tenant-list-widget.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "ngx-permissions";
|
|
6
|
+
export class AppAdminHomeComponent {
|
|
7
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminHomeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppAdminHomeComponent, isStandalone: true, selector: "app-app-admin-home", ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-lg-6\">\n <app-tenant-list-widget *ngxPermissionsOnly=\"['app_admin']\"></app-tenant-list-widget>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: TenantListWidgetComponent, selector: "app-tenant-list-widget" }, { kind: "ngmodule", type: NgxPermissionsModule }, { kind: "directive", type: i1.NgxPermissionsDirective, selector: "[ngxPermissionsOnly],[ngxPermissionsExcept]", inputs: ["ngxPermissionsOnly", "ngxPermissionsOnlyThen", "ngxPermissionsOnlyElse", "ngxPermissionsExcept", "ngxPermissionsExceptElse", "ngxPermissionsExceptThen", "ngxPermissionsThen", "ngxPermissionsElse", "ngxPermissionsOnlyAuthorisedStrategy", "ngxPermissionsOnlyUnauthorisedStrategy", "ngxPermissionsExceptUnauthorisedStrategy", "ngxPermissionsExceptAuthorisedStrategy", "ngxPermissionsUnauthorisedStrategy", "ngxPermissionsAuthorisedStrategy"], outputs: ["permissionsAuthorized", "permissionsUnauthorized"] }] }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminHomeComponent, decorators: [{
|
|
11
|
+
type: Component,
|
|
12
|
+
args: [{ selector: 'app-app-admin-home', standalone: true, imports: [
|
|
13
|
+
TenantListWidgetComponent,
|
|
14
|
+
NgxPermissionsModule
|
|
15
|
+
], template: "<div class=\"row\">\n <div class=\"col-lg-6\">\n <app-tenant-list-widget *ngxPermissionsOnly=\"['app_admin']\"></app-tenant-list-widget>\n </div>\n</div>\n" }]
|
|
16
|
+
}] });
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWFkbWluLWhvbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9hcHAtYWRtaW4vYXBwLWFkbWluLWhvbWUvYXBwLWFkbWluLWhvbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9hcHAtYWRtaW4vYXBwLWFkbWluLWhvbWUvYXBwLWFkbWluLWhvbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwyREFBMkQsQ0FBQzs7O0FBWXBHLE1BQU0sT0FBTyxxQkFBcUI7K0dBQXJCLHFCQUFxQjttR0FBckIscUJBQXFCLDhFQ2RsQyxrS0FLQSwwRERHSSx5QkFBeUIsa0VBQ3pCLG9CQUFvQjs7NEZBS1gscUJBQXFCO2tCQVZqQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1A7d0JBQ1AseUJBQXlCO3dCQUN6QixvQkFBb0I7cUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ3hQZXJtaXNzaW9uc01vZHVsZX0gZnJvbSAnbmd4LXBlcm1pc3Npb25zJztcbmltcG9ydCB7VGVuYW50TGlzdFdpZGdldENvbXBvbmVudH0gZnJvbSAnLi4vdGVuYW50L3RlbmFudC1saXN0LXdpZGdldC90ZW5hbnQtbGlzdC13aWRnZXQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFwcC1hZG1pbi1ob21lJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFRlbmFudExpc3RXaWRnZXRDb21wb25lbnQsXG4gICAgTmd4UGVybWlzc2lvbnNNb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC1hZG1pbi1ob21lLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2FwcC1hZG1pbi1ob21lLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBBcHBBZG1pbkhvbWVDb21wb25lbnQge1xuXG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtbGctNlwiPlxuICAgIDxhcHAtdGVuYW50LWxpc3Qtd2lkZ2V0ICpuZ3hQZXJtaXNzaW9uc09ubHk9XCJbJ2FwcF9hZG1pbiddXCI+PC9hcHAtdGVuYW50LWxpc3Qtd2lkZ2V0PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { RouterModule } from '@angular/router';
|
|
3
|
+
import { AppAdminHomeComponent } from "./app-admin-home/app-admin-home.component";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/router";
|
|
6
|
+
const routes = [
|
|
7
|
+
{
|
|
8
|
+
path: 'home',
|
|
9
|
+
component: AppAdminHomeComponent
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
path: '',
|
|
13
|
+
redirectTo: 'home',
|
|
14
|
+
pathMatch: 'full'
|
|
15
|
+
}
|
|
16
|
+
];
|
|
17
|
+
export class AppAdminRoutingModule {
|
|
18
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
19
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AppAdminRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] }); }
|
|
20
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminRoutingModule, imports: [RouterModule.forChild(routes), RouterModule] }); }
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminRoutingModule, decorators: [{
|
|
23
|
+
type: NgModule,
|
|
24
|
+
args: [{
|
|
25
|
+
imports: [RouterModule.forChild(routes)],
|
|
26
|
+
exports: [RouterModule]
|
|
27
|
+
}]
|
|
28
|
+
}] });
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWFkbWluLXJvdXRpbmcubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9hcHAtYWRtaW4vYXBwLWFkbWluLXJvdXRpbmcubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFDLFlBQVksRUFBUyxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDOzs7QUFFaEYsTUFBTSxNQUFNLEdBQVc7SUFDckI7UUFDRSxJQUFJLEVBQUUsTUFBTTtRQUNaLFNBQVMsRUFBRSxxQkFBcUI7S0FDakM7SUFDRDtRQUNFLElBQUksRUFBRSxFQUFFO1FBQ1IsVUFBVSxFQUFFLE1BQU07UUFDbEIsU0FBUyxFQUFFLE1BQU07S0FDbEI7Q0FDRixDQUFDO0FBTUYsTUFBTSxPQUFPLHFCQUFxQjsrR0FBckIscUJBQXFCO2dIQUFyQixxQkFBcUIsd0NBRnRCLFlBQVk7Z0hBRVgscUJBQXFCLFlBSHRCLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQzdCLFlBQVk7OzRGQUVYLHFCQUFxQjtrQkFKakMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN4QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JvdXRlck1vZHVsZSwgUm91dGVzfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtBcHBBZG1pbkhvbWVDb21wb25lbnR9IGZyb20gXCIuL2FwcC1hZG1pbi1ob21lL2FwcC1hZG1pbi1ob21lLmNvbXBvbmVudFwiO1xuXG5jb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAge1xuICAgIHBhdGg6ICdob21lJyxcbiAgICBjb21wb25lbnQ6IEFwcEFkbWluSG9tZUNvbXBvbmVudFxuICB9LFxuICB7XG4gICAgcGF0aDogJycsXG4gICAgcmVkaXJlY3RUbzogJ2hvbWUnLFxuICAgIHBhdGhNYXRjaDogJ2Z1bGwnXG4gIH1cbl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKV0sXG4gIGV4cG9ydHM6IFtSb3V0ZXJNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIEFwcEFkbWluUm91dGluZ01vZHVsZSB7XG59XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { AppAdminRoutingModule } from './app-admin-routing.module';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class AppAdminModule {
|
|
6
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
7
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AppAdminModule, imports: [CommonModule,
|
|
8
|
+
AppAdminRoutingModule] }); }
|
|
9
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminModule, imports: [CommonModule,
|
|
10
|
+
AppAdminRoutingModule] }); }
|
|
11
|
+
}
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppAdminModule, decorators: [{
|
|
13
|
+
type: NgModule,
|
|
14
|
+
args: [{
|
|
15
|
+
declarations: [],
|
|
16
|
+
imports: [
|
|
17
|
+
CommonModule,
|
|
18
|
+
AppAdminRoutingModule
|
|
19
|
+
]
|
|
20
|
+
}]
|
|
21
|
+
}] });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWFkbWluLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvYXBwLWFkbWluL2FwcC1hZG1pbi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBVW5FLE1BQU0sT0FBTyxjQUFjOytHQUFkLGNBQWM7Z0hBQWQsY0FBYyxZQUp2QixZQUFZO1lBQ1oscUJBQXFCO2dIQUdaLGNBQWMsWUFKdkIsWUFBWTtZQUNaLHFCQUFxQjs7NEZBR1osY0FBYztrQkFQMUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1oscUJBQXFCO3FCQUN0QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBBcHBBZG1pblJvdXRpbmdNb2R1bGUgfSBmcm9tICcuL2FwcC1hZG1pbi1yb3V0aW5nLm1vZHVsZSc7XG5cblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBBcHBBZG1pblJvdXRpbmdNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBcHBBZG1pbk1vZHVsZSB7IH1cbiJdfQ==
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { NgIf } from '@angular/common';
|
|
3
|
+
import { MaterialModule } from '../../../material.module';
|
|
4
|
+
import { TechlifyListingControllerInterface } from '../../../base-model';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../../company-information/client.service";
|
|
7
|
+
import * as i2 from "@angular/material/table";
|
|
8
|
+
import * as i3 from "@angular/material/card";
|
|
9
|
+
import * as i4 from "@angular/material/progress-bar";
|
|
10
|
+
export class TenantListWidgetComponent extends TechlifyListingControllerInterface {
|
|
11
|
+
constructor(service) {
|
|
12
|
+
super();
|
|
13
|
+
this.service = service;
|
|
14
|
+
this.displayedColumns = [
|
|
15
|
+
'#',
|
|
16
|
+
'Name',
|
|
17
|
+
'Users',
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
this.loadData();
|
|
22
|
+
}
|
|
23
|
+
loadData() {
|
|
24
|
+
const params = {
|
|
25
|
+
page: this.page,
|
|
26
|
+
perPage: this.perPage,
|
|
27
|
+
num_items: this.perPage + '|' + this.page,
|
|
28
|
+
withCount: 'users',
|
|
29
|
+
};
|
|
30
|
+
this.isWorking = true;
|
|
31
|
+
this.service.index(params).subscribe({
|
|
32
|
+
next: (response) => {
|
|
33
|
+
this.models = this.models?.concat(response?.data);
|
|
34
|
+
this.lastPage = response?.last_page;
|
|
35
|
+
this.isWorking = false;
|
|
36
|
+
},
|
|
37
|
+
error: () => { this.isWorking = false; }
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantListWidgetComponent, deps: [{ token: i1.ClientService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
41
|
+
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 <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: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i4.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
42
|
+
}
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantListWidgetComponent, decorators: [{
|
|
44
|
+
type: Component,
|
|
45
|
+
args: [{ selector: 'app-tenant-list-widget', standalone: true, imports: [
|
|
46
|
+
MaterialModule,
|
|
47
|
+
NgIf
|
|
48
|
+
], 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 <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" }]
|
|
49
|
+
}], ctorParameters: () => [{ type: i1.ClientService }] });
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWxpc3Qtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvYXBwLWFkbWluL3RlbmFudC90ZW5hbnQtbGlzdC13aWRnZXQvdGVuYW50LWxpc3Qtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvYXBwLWFkbWluL3RlbmFudC90ZW5hbnQtbGlzdC13aWRnZXQvdGVuYW50LWxpc3Qtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBYXZFLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxrQ0FBa0M7SUFNL0UsWUFBb0IsT0FBc0I7UUFDeEMsS0FBSyxFQUFFLENBQUM7UUFEVSxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBTDFDLHFCQUFnQixHQUFhO1lBQzNCLEdBQUc7WUFDSCxNQUFNO1lBQ04sT0FBTztTQUNSLENBQUM7SUFHRixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sTUFBTSxHQUFRO1lBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDekMsU0FBUyxFQUFFLE9BQU87U0FDbkIsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuQyxJQUFJLEVBQUUsQ0FBQyxRQUFhLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxFQUFFLFNBQVMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0E5QlUseUJBQXlCO21HQUF6Qix5QkFBeUIseUdDaEJ0Qyx1cUNBOEJBLHlERHBCSSxjQUFjLHkrQ0FDZCxJQUFJOzs0RkFLSyx5QkFBeUI7a0JBVnJDLFNBQVM7K0JBQ0Usd0JBQXdCLGNBQ3RCLElBQUksV0FDUDt3QkFDUCxjQUFjO3dCQUNkLElBQUk7cUJBQ0wiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7TWF0ZXJpYWxNb2R1bGV9IGZyb20gJy4uLy4uLy4uL21hdGVyaWFsLm1vZHVsZSc7XG5pbXBvcnQge1RlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2V9IGZyb20gJy4uLy4uLy4uL2Jhc2UtbW9kZWwnO1xuaW1wb3J0IHtDbGllbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb21wYW55LWluZm9ybWF0aW9uL2NsaWVudC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXRlbmFudC1saXN0LXdpZGdldCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRlcmlhbE1vZHVsZSxcbiAgICBOZ0lmXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW5hbnQtbGlzdC13aWRnZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdGVuYW50LWxpc3Qtd2lkZ2V0LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBUZW5hbnRMaXN0V2lkZ2V0Q29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgICcjJyxcbiAgICAnTmFtZScsXG4gICAgJ1VzZXJzJyxcbiAgXTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBDbGllbnRTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgfVxuXG4gIGxvYWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge1xuICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgcGVyUGFnZTogdGhpcy5wZXJQYWdlLFxuICAgICAgbnVtX2l0ZW1zOiB0aGlzLnBlclBhZ2UgKyAnfCcgKyB0aGlzLnBhZ2UsXG4gICAgICB3aXRoQ291bnQ6ICd1c2VycycsXG4gICAgfTtcbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLmluZGV4KHBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5tb2RlbHM/LmNvbmNhdChyZXNwb25zZT8uZGF0YSk7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXNwb25zZT8ubGFzdF9wYWdlO1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuaXNXb3JraW5nID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPG1hdC1jYXJkPlxuICA8bWF0LWNhcmQtY29udGVudD5cbiAgICA8bWF0LWNhcmQtdGl0bGU+VGVuYW50czwvbWF0LWNhcmQtdGl0bGU+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJwLTBcIj5cbiAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cIm1vZGVsc1wiIGNsYXNzPVwidy0xMDBcIj5cbiAgICAgIDwhLS0gIyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIiNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gIyA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleDtcIj4ge3sgaSArIDEgfX0gPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIE5hbWUgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJOYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IE5hbWUgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3sgZWxlbWVudD8ubmFtZSB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBVc2VycyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIlVzZXJzXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFVzZXJzIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8udXNlcnNfY291bnQgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIj48L3RyPlxuICAgIDwvdGFibGU+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cbiJdfQ==
|
|
@@ -2,7 +2,6 @@ import { CommonModule } from '@angular/common';
|
|
|
2
2
|
import { Component } from '@angular/core';
|
|
3
3
|
import { CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';
|
|
4
4
|
import { TechlifyListingControllerInterface } from '../base-model';
|
|
5
|
-
import { AppSwitcherIcons } from './app-switcher-icons';
|
|
6
5
|
import { MaterialModule } from '../material.module';
|
|
7
6
|
import * as i0 from "@angular/core";
|
|
8
7
|
import * as i1 from "../services/techlify-app.service";
|
|
@@ -17,14 +16,13 @@ export class AppSwitcherComponent extends TechlifyListingControllerInterface {
|
|
|
17
16
|
this.appService = appService;
|
|
18
17
|
this.errorHandler = errorHandler;
|
|
19
18
|
this.isOpen = false;
|
|
20
|
-
this.iconMap = AppSwitcherIcons;
|
|
21
19
|
}
|
|
22
20
|
ngOnInit() {
|
|
23
21
|
this.loadData();
|
|
24
22
|
}
|
|
25
23
|
loadData() {
|
|
26
24
|
this.isWorking = true;
|
|
27
|
-
this.appService.index().subscribe({
|
|
25
|
+
this.appService.index({}, true).subscribe({
|
|
28
26
|
next: (response) => {
|
|
29
27
|
this.models = response.data;
|
|
30
28
|
this.isWorking = false;
|
|
@@ -34,18 +32,12 @@ export class AppSwitcherComponent extends TechlifyListingControllerInterface {
|
|
|
34
32
|
this.isWorking = false;
|
|
35
33
|
},
|
|
36
34
|
complete: () => {
|
|
37
|
-
this.setupAppIcons();
|
|
38
35
|
this.isWorking = false;
|
|
39
36
|
}
|
|
40
37
|
});
|
|
41
38
|
}
|
|
42
|
-
setupAppIcons() {
|
|
43
|
-
this.models.forEach((app) => {
|
|
44
|
-
app.iconUrl = this.iconMap[app.code];
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
39
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppSwitcherComponent, deps: [{ token: i1.TechlifyAppService }, { token: i2.ErrorHandlerService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
48
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppSwitcherComponent, isStandalone: true, selector: "app-switcher", usesInheritance: true, ngImport: i0, template: "<!-- Button to open app switcher -->\n<button mat-icon-button (click)=\"isOpen = !isOpen\" cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\" class='d-flex justify-content-center align-items-center'>\n <mat-icon>apps</mat-icon>\n</button>\n\n<!-- Overlay container -->\n<ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"trigger\" [cdkConnectedOverlayOpen]=\"isOpen\"\n (overlayOutsideClick)=\"isOpen = false\">\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-start align-items-center\">\n <div *ngFor=\"let app of models\">\n <a [href]=\"app.url\" target=\"_blank\" class=\"d-flex flex-column align-items-center gap-1 app-item p-2 text-decoration-none text-dark\">\n <img [src]=\"app.
|
|
40
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppSwitcherComponent, isStandalone: true, selector: "app-switcher", usesInheritance: true, ngImport: i0, template: "<!-- Button to open app switcher -->\n<button mat-icon-button (click)=\"isOpen = !isOpen\" cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\" class='d-flex justify-content-center align-items-center'>\n <mat-icon>apps</mat-icon>\n</button>\n\n<!-- Overlay container -->\n<ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"trigger\" [cdkConnectedOverlayOpen]=\"isOpen\"\n (overlayOutsideClick)=\"isOpen = false\">\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-start align-items-center\">\n <div *ngFor=\"let app of models\">\n <a [href]=\"app.url\" target=\"_blank\" class=\"d-flex flex-column align-items-center gap-1 app-item p-2 text-decoration-none text-dark\">\n <img [src]=\"app.icon_url\" [alt]=\"app.title\" class=\"app-icon\" width='50px' />\n <p>{{ app.title }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card>\n</ng-template>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: MaterialModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6.MatCardContent, selector: "mat-card-content" }] }); }
|
|
49
41
|
}
|
|
50
42
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppSwitcherComponent, decorators: [{
|
|
51
43
|
type: Component,
|
|
@@ -54,6 +46,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
54
46
|
CdkOverlayOrigin,
|
|
55
47
|
CdkConnectedOverlay,
|
|
56
48
|
MaterialModule,
|
|
57
|
-
], template: "<!-- Button to open app switcher -->\n<button mat-icon-button (click)=\"isOpen = !isOpen\" cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\" class='d-flex justify-content-center align-items-center'>\n <mat-icon>apps</mat-icon>\n</button>\n\n<!-- Overlay container -->\n<ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"trigger\" [cdkConnectedOverlayOpen]=\"isOpen\"\n (overlayOutsideClick)=\"isOpen = false\">\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-start align-items-center\">\n <div *ngFor=\"let app of models\">\n <a [href]=\"app.url\" target=\"_blank\" class=\"d-flex flex-column align-items-center gap-1 app-item p-2 text-decoration-none text-dark\">\n <img [src]=\"app.
|
|
49
|
+
], template: "<!-- Button to open app switcher -->\n<button mat-icon-button (click)=\"isOpen = !isOpen\" cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\" class='d-flex justify-content-center align-items-center'>\n <mat-icon>apps</mat-icon>\n</button>\n\n<!-- Overlay container -->\n<ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"trigger\" [cdkConnectedOverlayOpen]=\"isOpen\"\n (overlayOutsideClick)=\"isOpen = false\">\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-start align-items-center\">\n <div *ngFor=\"let app of models\">\n <a [href]=\"app.url\" target=\"_blank\" class=\"d-flex flex-column align-items-center gap-1 app-item p-2 text-decoration-none text-dark\">\n <img [src]=\"app.icon_url\" [alt]=\"app.title\" class=\"app-icon\" width='50px' />\n <p>{{ app.title }}</p>\n </a>\n </div>\n </mat-card-content>\n </mat-card>\n</ng-template>" }]
|
|
58
50
|
}], ctorParameters: () => [{ type: i1.TechlifyAppService }, { type: i2.ErrorHandlerService }] });
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN3aXRjaGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvYXBwLXN3aXRjaGVyL2FwcC1zd2l0Y2hlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2FwcC1zd2l0Y2hlci9hcHAtc3dpdGNoZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7QUFjcEQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGtDQUFrQztJQUkxRSxZQUFvQixVQUE4QixFQUN4QyxZQUFpQztRQUV6QyxLQUFLLEVBQUUsQ0FBQztRQUhVLGVBQVUsR0FBVixVQUFVLENBQW9CO1FBQ3hDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUgzQyxXQUFNLEdBQVksS0FBSyxDQUFDO0lBTXhCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFFdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN4QyxJQUFJLEVBQUUsQ0FBQyxRQUFhLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN6QixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN6QixDQUFDO1lBQ0QsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN6QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0E5QlUsb0JBQW9CO21HQUFwQixvQkFBb0IsK0ZDcEJqQyx5NUJBa0JjLHlEREpWLFlBQVksNEpBQ1osZ0JBQWdCLHVJQUNoQixtQkFBbUIsMitCQUNuQixjQUFjOzs0RkFHTCxvQkFBb0I7a0JBWmhDLFNBQVM7K0JBQ0UsY0FBYyxjQUdaLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsbUJBQW1CO3dCQUNuQixjQUFjO3FCQUNmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDZGtPdmVybGF5T3JpZ2luLCBDZGtDb25uZWN0ZWRPdmVybGF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSB9IGZyb20gJy4uL2Jhc2UtbW9kZWwnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyU2VydmljZSB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgVGVjaGxpZnlBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdGVjaGxpZnktYXBwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0ZXJpYWxNb2R1bGUgfSBmcm9tICcuLi9tYXRlcmlhbC5tb2R1bGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc3dpdGNoZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXN3aXRjaGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXN3aXRjaGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICBDZGtDb25uZWN0ZWRPdmVybGF5LFxuICAgIE1hdGVyaWFsTW9kdWxlLFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFwcFN3aXRjaGVyQ29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhcHBTZXJ2aWNlOiBUZWNobGlmeUFwcFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgfVxuXG4gIGxvYWREYXRhKCkge1xuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuYXBwU2VydmljZS5pbmRleCh7fSwgdHJ1ZSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubW9kZWxzID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxufVxuIiwiPCEtLSBCdXR0b24gdG8gb3BlbiBhcHAgc3dpdGNoZXIgLS0+XG48YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiaXNPcGVuID0gIWlzT3BlblwiIGNka092ZXJsYXlPcmlnaW4gI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCIgY2xhc3M9J2QtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlcic+XG4gIDxtYXQtaWNvbj5hcHBzPC9tYXQtaWNvbj5cbjwvYnV0dG9uPlxuXG48IS0tIE92ZXJsYXkgY29udGFpbmVyIC0tPlxuPG5nLXRlbXBsYXRlIGNka0Nvbm5lY3RlZE92ZXJsYXkgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc09wZW5cIlxuICAob3ZlcmxheU91dHNpZGVDbGljayk9XCJpc09wZW4gPSBmYWxzZVwiPlxuICA8bWF0LWNhcmQ+XG4gICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYXBwIG9mIG1vZGVsc1wiPlxuICAgICAgICA8YSBbaHJlZl09XCJhcHAudXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xIGFwcC1pdGVtIHAtMiB0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LWRhcmtcIj5cbiAgICAgICAgICA8aW1nIFtzcmNdPVwiYXBwLmljb25fdXJsXCIgW2FsdF09XCJhcHAudGl0bGVcIiBjbGFzcz1cImFwcC1pY29uXCIgd2lkdGg9JzUwcHgnIC8+XG4gICAgICAgICAgPHA+e3sgYXBwLnRpdGxlIH19PC9wPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gIDwvbWF0LWNhcmQ+XG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
@@ -14,13 +14,14 @@ import * as i2 from "../../core";
|
|
|
14
14
|
import * as i3 from "../../user";
|
|
15
15
|
import * as i4 from "@angular/router";
|
|
16
16
|
import * as i5 from "../../user-config";
|
|
17
|
-
import * as i6 from "
|
|
18
|
-
import * as i7 from "@angular/
|
|
19
|
-
import * as i8 from "@angular/material/
|
|
20
|
-
import * as i9 from "@angular/material/
|
|
21
|
-
import * as i10 from "@angular/material/
|
|
17
|
+
import * as i6 from "ngx-permissions";
|
|
18
|
+
import * as i7 from "@angular/common";
|
|
19
|
+
import * as i8 from "@angular/material/button";
|
|
20
|
+
import * as i9 from "@angular/material/form-field";
|
|
21
|
+
import * as i10 from "@angular/material/input";
|
|
22
|
+
import * as i11 from "@angular/material/list";
|
|
22
23
|
let LoginFormFieldsComponent = class LoginFormFieldsComponent extends TechlifyFormComponentInterface {
|
|
23
|
-
constructor(fb, formValidatorService, config, credentialService, currentUserService, authService, router, route, userConfigService, errorHandler) {
|
|
24
|
+
constructor(fb, formValidatorService, config, credentialService, currentUserService, authService, router, route, userConfigService, errorHandler, ngxPermissionsService) {
|
|
24
25
|
super(formValidatorService);
|
|
25
26
|
this.fb = fb;
|
|
26
27
|
this.config = config;
|
|
@@ -31,6 +32,7 @@ let LoginFormFieldsComponent = class LoginFormFieldsComponent extends TechlifyFo
|
|
|
31
32
|
this.route = route;
|
|
32
33
|
this.userConfigService = userConfigService;
|
|
33
34
|
this.errorHandler = errorHandler;
|
|
35
|
+
this.ngxPermissionsService = ngxPermissionsService;
|
|
34
36
|
this.isWorking = false;
|
|
35
37
|
this.userType = UserTypeEnum;
|
|
36
38
|
this.errorMessages = {
|
|
@@ -96,6 +98,19 @@ let LoginFormFieldsComponent = class LoginFormFieldsComponent extends TechlifyFo
|
|
|
96
98
|
const login$ = this.authService.login(data);
|
|
97
99
|
login$.pipe(finalize(() => this.isWorking = false), untilDestroyed(this)).subscribe(credentials => {
|
|
98
100
|
this.currentUserService.updateCurrentUser(credentials?.user);
|
|
101
|
+
const user = credentials?.user;
|
|
102
|
+
const permissions = (user?.permissions || []).map((x) => x.slug);
|
|
103
|
+
if (user?.user_type_id === this.userType.ADMIN) {
|
|
104
|
+
permissions.push('app_admin');
|
|
105
|
+
}
|
|
106
|
+
else if (user?.user_type_id === this.userType.CLIENT_ADMIN) {
|
|
107
|
+
permissions.push('client_admin');
|
|
108
|
+
}
|
|
109
|
+
else if (user?.user_type_id === this.userType.CLIENT_USER) {
|
|
110
|
+
permissions.push('client_user');
|
|
111
|
+
}
|
|
112
|
+
this.ngxPermissionsService.flushPermissions();
|
|
113
|
+
this.ngxPermissionsService.loadPermissions(permissions);
|
|
99
114
|
this.handleUserRedirect();
|
|
100
115
|
}, error => {
|
|
101
116
|
this.handleLoginErrors(error);
|
|
@@ -113,8 +128,8 @@ let LoginFormFieldsComponent = class LoginFormFieldsComponent extends TechlifyFo
|
|
|
113
128
|
redirect(provider) {
|
|
114
129
|
window.location.href = this.userConfig.socialLoginRedirectUrl + provider;
|
|
115
130
|
}
|
|
116
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoginFormFieldsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.FormValidatorService }, { token: i2.ConfigService }, { token: i2.CredentialsService }, { token: i3.CurrentUserService }, { token: i2.AuthenticationService }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i5.UserConfigService }, { token: i2.ErrorHandlerService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
117
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LoginFormFieldsComponent, isStandalone: true, selector: "app-login-form-fields", inputs: { userConfig: "userConfig" }, usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"login()\" class='d-flex flex-column gap-3'>\n <div *ngIf=\"!userClients\" class='d-flex flex-column gap-2'>\n <mat-form-field>\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\" placeholder=\"Email\" type=\"email\" autocomplete=\"off\" required />\n <mat-error *ngIf=\"isFieldValid('email')\">{{getErrorMessage('email')}}</mat-error>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"password\" placeholder=\"Password\" type=\"password\" autocomplete=\"off\" required />\n <mat-error *ngIf=\"isFieldValid('password')\">{{getErrorMessage('password')}}</mat-error>\n </mat-form-field>\n\n <div class=\"alert alert-danger\" *ngIf=\"loginError\">\n <p class=\"mb-0\">{{ loginError?.message }}</p>\n </div>\n\n <button mat-raised-button color=\"primary\" class=\"w-100\" type=\"submit\" [disabled]=\"isWorking\">\n LOGIN\n </button>\n\n <div class=\"mt-2\" *ngIf=\"userConfig.showSocialLogin\">\n <button class=\"w-100 google-button mb-2\" mat-raised-button type=\"button\"\n (click)=\"redirect('google')\">Google</button>\n\n <button class=\"w-100 facebook-button\" mat-raised-button type=\"button\"\n (click)=\"redirect('facebook')\">Facebook</button>\n </div>\n <div class=\"mt-2 mb-4 text-center\" *ngIf=\"userConfig.showForgotPassword\">\n <a href=\"javascript:;\" [routerLink]=\"['/forgot-password']\">Forgot password?</a>\n </div>\n </div>\n\n <div *ngIf=\"userClients\" class='d-flex flex-column gap-2'>\n <h4 class=\"section-title text-center mt-4\">\n {{ userClients ? 'SELECT CLIENT TO LOGIN WITH' : 'LOGIN' }}\n </h4>\n\n <mat-selection-list formControlName=\"selected_client\" [multiple]=\"false\">\n <mat-list-option *ngFor=\"let userClient of userClients\" [value]=\"userClient?.client_id\"\n [disabled]=\"!userClient?.is_enabled || isWorking\">\n {{ userClient?.client?.name }}\n </mat-list-option>\n </mat-selection-list>\n\n <div class=\"mt-2 mb-4 text-center\" *ngIf=\"userConfig.showForgotPassword\">\n <a href=\"javascript:;\" (click)=\"backToLogin()\">Back to Login</a>\n </div>\n </div>\n\n</form>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type:
|
|
131
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LoginFormFieldsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.FormValidatorService }, { token: i2.ConfigService }, { token: i2.CredentialsService }, { token: i3.CurrentUserService }, { token: i2.AuthenticationService }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i5.UserConfigService }, { token: i2.ErrorHandlerService }, { token: i6.NgxPermissionsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
132
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LoginFormFieldsComponent, isStandalone: true, selector: "app-login-form-fields", inputs: { userConfig: "userConfig" }, usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"login()\" class='d-flex flex-column gap-3'>\n <div *ngIf=\"!userClients\" class='d-flex flex-column gap-2'>\n <mat-form-field>\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\" placeholder=\"Email\" type=\"email\" autocomplete=\"off\" required />\n <mat-error *ngIf=\"isFieldValid('email')\">{{getErrorMessage('email')}}</mat-error>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"password\" placeholder=\"Password\" type=\"password\" autocomplete=\"off\" required />\n <mat-error *ngIf=\"isFieldValid('password')\">{{getErrorMessage('password')}}</mat-error>\n </mat-form-field>\n\n <div class=\"alert alert-danger\" *ngIf=\"loginError\">\n <p class=\"mb-0\">{{ loginError?.message }}</p>\n </div>\n\n <button mat-raised-button color=\"primary\" class=\"w-100\" type=\"submit\" [disabled]=\"isWorking\">\n LOGIN\n </button>\n\n <div class=\"mt-2\" *ngIf=\"userConfig.showSocialLogin\">\n <button class=\"w-100 google-button mb-2\" mat-raised-button type=\"button\"\n (click)=\"redirect('google')\">Google</button>\n\n <button class=\"w-100 facebook-button\" mat-raised-button type=\"button\"\n (click)=\"redirect('facebook')\">Facebook</button>\n </div>\n <div class=\"mt-2 mb-4 text-center\" *ngIf=\"userConfig.showForgotPassword\">\n <a href=\"javascript:;\" [routerLink]=\"['/forgot-password']\">Forgot password?</a>\n </div>\n </div>\n\n <div *ngIf=\"userClients\" class='d-flex flex-column gap-2'>\n <h4 class=\"section-title text-center mt-4\">\n {{ userClients ? 'SELECT CLIENT TO LOGIN WITH' : 'LOGIN' }}\n </h4>\n\n <mat-selection-list formControlName=\"selected_client\" [multiple]=\"false\">\n <mat-list-option *ngFor=\"let userClient of userClients\" [value]=\"userClient?.client_id\"\n [disabled]=\"!userClient?.is_enabled || isWorking\">\n {{ userClient?.client?.name }}\n </mat-list-option>\n </mat-selection-list>\n\n <div class=\"mt-2 mb-4 text-center\" *ngIf=\"userConfig.showForgotPassword\">\n <a href=\"javascript:;\" (click)=\"backToLogin()\">Back to Login</a>\n </div>\n </div>\n\n</form>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MaterialModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i10.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: i11.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i11.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
|
|
118
133
|
};
|
|
119
134
|
LoginFormFieldsComponent = __decorate([
|
|
120
135
|
UntilDestroy()
|
|
@@ -128,7 +143,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
128
143
|
ReactiveFormsModule,
|
|
129
144
|
RouterModule
|
|
130
145
|
], template: "<form [formGroup]=\"form\" (ngSubmit)=\"login()\" class='d-flex flex-column gap-3'>\n <div *ngIf=\"!userClients\" class='d-flex flex-column gap-2'>\n <mat-form-field>\n <mat-label>Email</mat-label>\n <input matInput formControlName=\"email\" placeholder=\"Email\" type=\"email\" autocomplete=\"off\" required />\n <mat-error *ngIf=\"isFieldValid('email')\">{{getErrorMessage('email')}}</mat-error>\n </mat-form-field>\n <mat-form-field>\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"password\" placeholder=\"Password\" type=\"password\" autocomplete=\"off\" required />\n <mat-error *ngIf=\"isFieldValid('password')\">{{getErrorMessage('password')}}</mat-error>\n </mat-form-field>\n\n <div class=\"alert alert-danger\" *ngIf=\"loginError\">\n <p class=\"mb-0\">{{ loginError?.message }}</p>\n </div>\n\n <button mat-raised-button color=\"primary\" class=\"w-100\" type=\"submit\" [disabled]=\"isWorking\">\n LOGIN\n </button>\n\n <div class=\"mt-2\" *ngIf=\"userConfig.showSocialLogin\">\n <button class=\"w-100 google-button mb-2\" mat-raised-button type=\"button\"\n (click)=\"redirect('google')\">Google</button>\n\n <button class=\"w-100 facebook-button\" mat-raised-button type=\"button\"\n (click)=\"redirect('facebook')\">Facebook</button>\n </div>\n <div class=\"mt-2 mb-4 text-center\" *ngIf=\"userConfig.showForgotPassword\">\n <a href=\"javascript:;\" [routerLink]=\"['/forgot-password']\">Forgot password?</a>\n </div>\n </div>\n\n <div *ngIf=\"userClients\" class='d-flex flex-column gap-2'>\n <h4 class=\"section-title text-center mt-4\">\n {{ userClients ? 'SELECT CLIENT TO LOGIN WITH' : 'LOGIN' }}\n </h4>\n\n <mat-selection-list formControlName=\"selected_client\" [multiple]=\"false\">\n <mat-list-option *ngFor=\"let userClient of userClients\" [value]=\"userClient?.client_id\"\n [disabled]=\"!userClient?.is_enabled || isWorking\">\n {{ userClient?.client?.name }}\n </mat-list-option>\n </mat-selection-list>\n\n <div class=\"mt-2 mb-4 text-center\" *ngIf=\"userConfig.showForgotPassword\">\n <a href=\"javascript:;\" (click)=\"backToLogin()\">Back to Login</a>\n </div>\n </div>\n\n</form>" }]
|
|
131
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.FormValidatorService }, { type: i2.ConfigService }, { type: i2.CredentialsService }, { type: i3.CurrentUserService }, { type: i2.AuthenticationService }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i5.UserConfigService }, { type: i2.ErrorHandlerService }], propDecorators: { userConfig: [{
|
|
146
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.FormValidatorService }, { type: i2.ConfigService }, { type: i2.CredentialsService }, { type: i3.CurrentUserService }, { type: i2.AuthenticationService }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i5.UserConfigService }, { type: i2.ErrorHandlerService }, { type: i6.NgxPermissionsService }], propDecorators: { userConfig: [{
|
|
132
147
|
type: Input
|
|
133
148
|
}] } });
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tZm9ybS1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9sb2dpbi9sb2dpbi1mb3JtLWZpZWxkcy9sb2dpbi1mb3JtLWZpZWxkcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2xvZ2luL2xvZ2luLWZvcm0tZmllbGRzL2xvZ2luLWZvcm0tZmllbGRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBMEIsbUJBQW1CLEVBQW9CLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNHLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUEwQixZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7OztBQWVsRCxJQUFNLHdCQUF3QixHQUE5QixNQUFNLHdCQUF5QixTQUFRLDhCQUE4QjtJQVcxRSxZQUFvQixFQUFlLEVBQ2pDLG9CQUEwQyxFQUNsQyxNQUFxQixFQUNyQixpQkFBcUMsRUFDdEMsa0JBQXNDLEVBQ3JDLFdBQWtDLEVBQ2xD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aUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8saUJBQWlCLENBQUMsUUFBYTtRQUNyQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxHQUFHLFFBQVEsRUFBRSxLQUFLLENBQUM7UUFDbkUsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUM7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7SUFDbEMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUSxDQUFDLFFBQVE7UUFDZixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztJQUMzRSxDQUFDOytHQXJIVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw4SUMxQnJDLDZ2RUFrRE8seUREOUJILFlBQVksK1BBQ1osY0FBYyxnMUNBQ2QsbUJBQW1CLHlxQ0FDbkIsWUFBWTs7QUFHSCx3QkFBd0I7SUFicEMsWUFBWSxFQUFFO0dBYUYsd0JBQXdCLENBc0hwQzs7NEZBdEhZLHdCQUF3QjtrQkFacEMsU0FBUzsrQkFDRSx1QkFBdUIsY0FHckIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLFlBQVk7cUJBQ2I7eVdBSVEsVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdGVyaWFsTW9kdWxlIH0gZnJvbSAnLi4vLi4vbWF0ZXJpYWwubW9kdWxlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUZWNobGlmeUZvcm1Db21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9iYXNlLW1vZGVsJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSwgQ29uZmlnU2VydmljZSwgQ3JlZGVudGlhbHNTZXJ2aWNlLCBFcnJvckhhbmRsZXJTZXJ2aWNlLCBGb3JtVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVW50aWxEZXN0cm95LCB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ0BuZ25lYXQvdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBDdXJyZW50VXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi91c2VyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNdWx0aVVzZXJDb25maWcsIFVzZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXNlci1jb25maWcnO1xuaW1wb3J0IHsgVXNlclR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyLXR5cGUuZW51bSc7XG5cbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxvZ2luLWZvcm0tZmllbGRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvZ2luLWZvcm0tZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbG9naW4tZm9ybS1maWVsZHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRlcmlhbE1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExvZ2luRm9ybUZpZWxkc0NvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5Rm9ybUNvbXBvbmVudEludGVyZmFjZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgdXNlckNvbmZpZz86IE11bHRpVXNlckNvbmZpZztcblxuICBpc1dvcmtpbmcgPSBmYWxzZTtcbiAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgbG9naW5FcnJvcjogeyB0eXBlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyB9O1xuICB1c2VyQ2xpZW50cyE6IGFueVtdO1xuXG4gIHVzZXJUeXBlOiB0eXBlb2YgVXNlclR5cGVFbnVtID0gVXNlclR5cGVFbnVtO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIGZvcm1WYWxpZGF0b3JTZXJ2aWNlOiBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZzogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGNyZWRlbnRpYWxTZXJ2aWNlOiBDcmVkZW50aWFsc1NlcnZpY2UsXG4gICAgcHVibGljIGN1cnJlbnRVc2VyU2VydmljZTogQ3VycmVudFVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHB1YmxpYyB1c2VyQ29uZmlnU2VydmljZTogVXNlckNvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoZm9ybVZhbGlkYXRvclNlcnZpY2UpO1xuXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VzID0ge1xuICAgICAgZW1haWw6IHtcbiAgICAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gICAgICAgIGVtYWlsOiAnSW52YWxpZCBlbWFpbCdcbiAgICAgIH0sXG4gICAgICBwYXNzd29yZDoge1xuICAgICAgICByZXF1aXJlZDogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJ1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm0gPSBmYi5ncm91cCh7XG4gICAgICBlbWFpbDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF1dLFxuICAgICAgcGFzc3dvcmQ6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBzZWxlY3RlZF9jbGllbnQ6IFsnJ10sXG4gICAgfSk7XG5cbiAgICAvLyBJZiB0aGUgY29uZmlnIHdhcyBub3QgcGFzc2VkIGxvYWQgaXQgZnJvbSB0aGUgc2VydmljZVxuICAgIGlmICghdGhpcy51c2VyQ29uZmlnKSB7XG4gICAgICB0aGlzLnVzZXJDb25maWcgPSB0aGlzLnVzZXJDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIGxpc3RlbiBmb3Igc2VsZWN0ZWRfY2xpZW50IGNoYW5nZSBhbmQgc3VibWl0IHRoZSBmb3JtLlxuICAgIHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGVkX2NsaWVudCcpLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDUwMCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubG9naW4oKSk7XG5cbiAgICBpZiAodGhpcy5jcmVkZW50aWFsU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHRoaXMuaGFuZGxlVXNlclJlZGlyZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVXNlclJlZGlyZWN0KCkge1xuICAgIHRoaXMuY3VycmVudFVzZXJTZXJ2aWNlLmdldFVzZXJPYnNlcnZhYmxlKHRydWUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAodXNlcikgPT4ge1xuICAgICAgICBpZiAodXNlci51c2VyX3R5cGVfaWQgPT0gdGhpcy51c2VyVHlwZS5BRE1JTikge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLnJlZGlyZWN0IHx8ICdhcHAtYWRtaW4nXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLnJlZGlyZWN0IHx8ICdkYXNoYm9hcmQnXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2dpbigpIHtcbiAgICBpZiAoIXRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgLy8gcmVzZXQgbG9naW4gZXJyb3JcbiAgICB0aGlzLmxvZ2luRXJyb3IgPSBudWxsO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGNsaWVudF9pZDogMixcbiAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuY29uZmlnLmdldEF1dGhDbGllbnRTZWNyZXQoKSxcbiAgICAgIGdyYW50X3R5cGU6IHRoaXMuY29uZmlnLmdldEF1dGhHcmFudFR5cGUoKSxcbiAgICAgIHVzZXJuYW1lOiB0aGlzLmZvcm0udmFsdWUuZW1haWwsXG4gICAgICBwYXNzd29yZDogdGhpcy5mb3JtLnZhbHVlLnBhc3N3b3JkLFxuICAgICAgc2VsZWN0ZWRfY2xpZW50OiB0aGlzLmZvcm0udmFsdWUuc2VsZWN0ZWRfY2xpZW50Py50b1N0cmluZygpLFxuICAgICAgcmVtZW1iZXI6IHRydWVcbiAgICB9O1xuICAgIHRoaXMuY3JlZGVudGlhbFNlcnZpY2Uuc2V0Q3JlZGVudGlhbHMoKTtcbiAgICBjb25zdCBsb2dpbiQgPSB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2luKGRhdGEpO1xuICAgIGxvZ2luJC5waXBlKFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5pc1dvcmtpbmcgPSBmYWxzZSksXG4gICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICkuc3Vic2NyaWJlKGNyZWRlbnRpYWxzID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFVzZXJTZXJ2aWNlLnVwZGF0ZUN1cnJlbnRVc2VyKGNyZWRlbnRpYWxzPy51c2VyKTtcbiAgICAgIHRoaXMuaGFuZGxlVXNlclJlZGlyZWN0KCk7XG4gICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVMb2dpbkVycm9ycyhlcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTG9naW5FcnJvcnMoZXJyb3JPYmo6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHsgZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uLCB1c2VyX2NsaWVudHMgfSA9IGVycm9yT2JqPy5lcnJvcjtcbiAgICB0aGlzLmxvZ2luRXJyb3IgPSB7IHR5cGU6IGVycm9yLCBtZXNzYWdlOiBlcnJvcl9kZXNjcmlwdGlvbiB9O1xuICAgIHRoaXMudXNlckNsaWVudHMgPSB1c2VyX2NsaWVudHM7XG4gIH1cblxuICBiYWNrVG9Mb2dpbigpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJDbGllbnRzID0gbnVsbDtcbiAgICB0aGlzLmxvZ2luRXJyb3IgPSBudWxsO1xuICB9XG5cbiAgcmVkaXJlY3QocHJvdmlkZXIpIHtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMudXNlckNvbmZpZy5zb2NpYWxMb2dpblJlZGlyZWN0VXJsICsgcHJvdmlkZXI7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJsb2dpbigpXCIgY2xhc3M9J2QtZmxleCBmbGV4LWNvbHVtbiBnYXAtMyc+XG4gIDxkaXYgKm5nSWY9XCIhdXNlckNsaWVudHNcIiBjbGFzcz0nZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yJz5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPkVtYWlsPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cIkVtYWlsXCIgdHlwZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcmVxdWlyZWQgLz5cbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ2VtYWlsJylcIj57e2dldEVycm9yTWVzc2FnZSgnZW1haWwnKX19PC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPlBhc3N3b3JkPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgdHlwZT1cInBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcmVxdWlyZWQgLz5cbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ3Bhc3N3b3JkJylcIj57e2dldEVycm9yTWVzc2FnZSgncGFzc3dvcmQnKX19PC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiAqbmdJZj1cImxvZ2luRXJyb3JcIj5cbiAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IGxvZ2luRXJyb3I/Lm1lc3NhZ2UgfX08L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwidy0xMDBcIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cImlzV29ya2luZ1wiPlxuICAgICAgTE9HSU5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dTb2NpYWxMb2dpblwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInctMTAwIGdvb2dsZS1idXR0b24gbWItMlwiIG1hdC1yYWlzZWQtYnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwicmVkaXJlY3QoJ2dvb2dsZScpXCI+R29vZ2xlPC9idXR0b24+XG5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ3LTEwMCBmYWNlYm9vay1idXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInJlZGlyZWN0KCdmYWNlYm9vaycpXCI+RmFjZWJvb2s8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMiBtYi00IHRleHQtY2VudGVyXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dGb3Jnb3RQYXNzd29yZFwiPlxuICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIFtyb3V0ZXJMaW5rXT1cIlsnL2ZvcmdvdC1wYXNzd29yZCddXCI+Rm9yZ290IHBhc3N3b3JkPzwvYT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInVzZXJDbGllbnRzXCIgY2xhc3M9J2QtZmxleCBmbGV4LWNvbHVtbiBnYXAtMic+XG4gICAgPGg0IGNsYXNzPVwic2VjdGlvbi10aXRsZSB0ZXh0LWNlbnRlciBtdC00XCI+XG4gICAgICB7eyB1c2VyQ2xpZW50cyA/ICdTRUxFQ1QgQ0xJRU5UIFRPIExPR0lOIFdJVEgnIDogJ0xPR0lOJyB9fVxuICAgIDwvaDQ+XG5cbiAgICA8bWF0LXNlbGVjdGlvbi1saXN0IGZvcm1Db250cm9sTmFtZT1cInNlbGVjdGVkX2NsaWVudFwiIFttdWx0aXBsZV09XCJmYWxzZVwiPlxuICAgICAgPG1hdC1saXN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdXNlckNsaWVudCBvZiB1c2VyQ2xpZW50c1wiIFt2YWx1ZV09XCJ1c2VyQ2xpZW50Py5jbGllbnRfaWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXVzZXJDbGllbnQ/LmlzX2VuYWJsZWQgfHwgaXNXb3JraW5nXCI+XG4gICAgICAgIHt7IHVzZXJDbGllbnQ/LmNsaWVudD8ubmFtZSB9fVxuICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XG4gICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMiBtYi00IHRleHQtY2VudGVyXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dGb3Jnb3RQYXNzd29yZFwiPlxuICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIChjbGljayk9XCJiYWNrVG9Mb2dpbigpXCI+QmFjayB0byBMb2dpbjwvYT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjwvZm9ybT4iXX0=
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tZm9ybS1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9sb2dpbi9sb2dpbi1mb3JtLWZpZWxkcy9sb2dpbi1mb3JtLWZpZWxkcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2xvZ2luL2xvZ2luLWZvcm0tZmllbGRzL2xvZ2luLWZvcm0tZmllbGRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBMEIsbUJBQW1CLEVBQW9CLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNHLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUEwQixZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFnQmxELElBQU0sd0JBQXdCLEdBQTlCLE1BQU0sd0JBQXlCLFNBQVEsOEJBQThCO0lBVzFFLFlBQ1UsRUFBZSxFQUN2QixvQkFBMEMsRUFDbEMsTUFBcUIsRUFDckIsaUJBQXFDLEVBQ3RDLGtCQUFzQyxFQUNyQyxXQUFrQyxFQUNsQyxNQUFjLEVBQ2QsS0FBcUIsRUFDdEIsaUJBQW9DLEVBQ25DLFlBQWlDLEVBQ2pDLHFCQUE0QztRQUVwRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQVpwQixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBRWYsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW9CO1FBQ3RDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDckMsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ25DLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBbEJ0RCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBS2xCLGFBQVEsR0FBd0IsWUFBWSxDQUFDO1FBaUIzQyxJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixLQUFLLEVBQUUsZUFBZTthQUN2QjtZQUNELFFBQVEsRUFBRTtnQkFDUixRQUFRLEVBQUUsc0JBQXNCO2FBQ2pDO1NBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDdEIsQ0FBQyxDQUFDO1FBRUgsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04seURBQXlEO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWTthQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3hELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNiLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDeEcsQ0FBQztxQkFDSSxDQUFDO29CQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RyxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRXZCLE1BQU0sSUFBSSxHQUFHO1lBQ1gsU0FBUyxFQUFFLENBQUM7WUFDWixhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtZQUNoRCxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUMvQixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtZQUNsQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRTtZQUM1RCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLElBQUksQ0FDVCxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsRUFDdEMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUNyQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN0QixJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTdELE1BQU0sSUFBSSxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUM7WUFDL0IsTUFBTSxXQUFXLEdBQUcsQ0FBRSxJQUFJLEVBQUUsV0FBa0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU5RSxJQUFJLElBQUksRUFBRSxZQUFZLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDL0MsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoQyxDQUFDO2lCQUFNLElBQUksSUFBSSxFQUFFLFlBQVksS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM3RCxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ25DLENBQUM7aUJBQU0sSUFBSSxJQUFJLEVBQUUsWUFBWSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzVELFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEMsQ0FBQztZQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFeEQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxFQUNELEtBQUssQ0FBQyxFQUFFO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFFBQWE7UUFDckMsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsR0FBRyxRQUFRLEVBQUUsS0FBSyxDQUFDO1FBQ25FLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDO1FBQzlELElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELFFBQVEsQ0FBQyxRQUFRO1FBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsR0FBRyxRQUFRLENBQUM7SUFDM0UsQ0FBQzsrR0F0SVUsd0JBQXdCO21HQUF4Qix3QkFBd0IsOElDM0JyQyw2dkVBa0RPLHlERDdCSCxZQUFZLCtQQUNaLGNBQWMsaTFDQUNkLG1CQUFtQix5cUNBQ25CLFlBQVk7O0FBR0gsd0JBQXdCO0lBYnBDLFlBQVksRUFBRTtHQWFGLHdCQUF3QixDQXVJcEM7OzRGQXZJWSx3QkFBd0I7a0JBWnBDLFNBQVM7K0JBQ0UsdUJBQXVCLGNBR3JCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsbUJBQW1CO3dCQUNuQixZQUFZO3FCQUNiOzZZQUlRLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRlcmlhbE1vZHVsZSB9IGZyb20gJy4uLy4uL21hdGVyaWFsLm1vZHVsZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVGVjaGxpZnlGb3JtQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UsIENvbmZpZ1NlcnZpY2UsIENyZWRlbnRpYWxzU2VydmljZSwgRXJyb3JIYW5kbGVyU2VydmljZSwgRm9ybVZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmluYWxpemUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgQ3VycmVudFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXNlcic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyLCBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTXVsdGlVc2VyQ29uZmlnLCBVc2VyQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3VzZXItY29uZmlnJztcbmltcG9ydCB7IFVzZXJUeXBlRW51bSB9IGZyb20gJy4uLy4uL3VzZXIvdXNlci10eXBlLmVudW0nO1xuaW1wb3J0IHsgTmd4UGVybWlzc2lvbnNTZXJ2aWNlIH0gZnJvbSAnbmd4LXBlcm1pc3Npb25zJztcblxuQFVudGlsRGVzdHJveSgpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbG9naW4tZm9ybS1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9naW4tZm9ybS1maWVsZHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sb2dpbi1mb3JtLWZpZWxkcy5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdGVyaWFsTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTG9naW5Gb3JtRmllbGRzQ29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlGb3JtQ29tcG9uZW50SW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSB1c2VyQ29uZmlnPzogTXVsdGlVc2VyQ29uZmlnO1xuXG4gIGlzV29ya2luZyA9IGZhbHNlO1xuICBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBsb2dpbkVycm9yOiB7IHR5cGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nIH07XG4gIHVzZXJDbGllbnRzITogYW55W107XG5cbiAgdXNlclR5cGU6IHR5cGVvZiBVc2VyVHlwZUVudW0gPSBVc2VyVHlwZUVudW07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgZm9ybVZhbGlkYXRvclNlcnZpY2U6IEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY3JlZGVudGlhbFNlcnZpY2U6IENyZWRlbnRpYWxzU2VydmljZSxcbiAgICBwdWJsaWMgY3VycmVudFVzZXJTZXJ2aWNlOiBDdXJyZW50VXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHVibGljIHVzZXJDb25maWdTZXJ2aWNlOiBVc2VyQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyU2VydmljZSxcbiAgICBwcml2YXRlIG5neFBlcm1pc3Npb25zU2VydmljZTogTmd4UGVybWlzc2lvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGZvcm1WYWxpZGF0b3JTZXJ2aWNlKTtcblxuICAgIHRoaXMuZXJyb3JNZXNzYWdlcyA9IHtcbiAgICAgIGVtYWlsOiB7XG4gICAgICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICAgICAgICBlbWFpbDogJ0ludmFsaWQgZW1haWwnXG4gICAgICB9LFxuICAgICAgcGFzc3dvcmQ6IHtcbiAgICAgICAgcmVxdWlyZWQ6ICdQYXNzd29yZCBpcyByZXF1aXJlZCdcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtID0gZmIuZ3JvdXAoe1xuICAgICAgZW1haWw6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdXSxcbiAgICAgIHBhc3N3b3JkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgc2VsZWN0ZWRfY2xpZW50OiBbJyddLFxuICAgIH0pO1xuXG4gICAgLy8gSWYgdGhlIGNvbmZpZyB3YXMgbm90IHBhc3NlZCBsb2FkIGl0IGZyb20gdGhlIHNlcnZpY2VcbiAgICBpZiAoIXRoaXMudXNlckNvbmZpZykge1xuICAgICAgdGhpcy51c2VyQ29uZmlnID0gdGhpcy51c2VyQ29uZmlnU2VydmljZS5nZXRDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBsaXN0ZW4gZm9yIHNlbGVjdGVkX2NsaWVudCBjaGFuZ2UgYW5kIHN1Ym1pdCB0aGUgZm9ybS5cbiAgICB0aGlzLmZvcm0uZ2V0KCdzZWxlY3RlZF9jbGllbnQnKS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmxvZ2luKCkpO1xuXG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICB0aGlzLmhhbmRsZVVzZXJSZWRpcmVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVVzZXJSZWRpcmVjdCgpIHtcbiAgICB0aGlzLmN1cnJlbnRVc2VyU2VydmljZS5nZXRVc2VyT2JzZXJ2YWJsZSh0cnVlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHVzZXIpID0+IHtcbiAgICAgICAgaWYgKHVzZXIudXNlcl90eXBlX2lkID09IHRoaXMudXNlclR5cGUuQURNSU4pIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5yZWRpcmVjdCB8fCAnYXBwLWFkbWluJ10sIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5yZWRpcmVjdCB8fCAnZGFzaGJvYXJkJ10sIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9naW4oKSB7XG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIC8vIHJlc2V0IGxvZ2luIGVycm9yXG4gICAgdGhpcy5sb2dpbkVycm9yID0gbnVsbDtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBjbGllbnRfaWQ6IDIsXG4gICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLmNvbmZpZy5nZXRBdXRoQ2xpZW50U2VjcmV0KCksXG4gICAgICBncmFudF90eXBlOiB0aGlzLmNvbmZpZy5nZXRBdXRoR3JhbnRUeXBlKCksXG4gICAgICB1c2VybmFtZTogdGhpcy5mb3JtLnZhbHVlLmVtYWlsLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuZm9ybS52YWx1ZS5wYXNzd29yZCxcbiAgICAgIHNlbGVjdGVkX2NsaWVudDogdGhpcy5mb3JtLnZhbHVlLnNlbGVjdGVkX2NsaWVudD8udG9TdHJpbmcoKSxcbiAgICAgIHJlbWVtYmVyOiB0cnVlXG4gICAgfTtcbiAgICB0aGlzLmNyZWRlbnRpYWxTZXJ2aWNlLnNldENyZWRlbnRpYWxzKCk7XG4gICAgY29uc3QgbG9naW4kID0gdGhpcy5hdXRoU2VydmljZS5sb2dpbihkYXRhKTtcbiAgICBsb2dpbiQucGlwZShcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNXb3JraW5nID0gZmFsc2UpLFxuICAgICAgdW50aWxEZXN0cm95ZWQodGhpcylcbiAgICApLnN1YnNjcmliZShjcmVkZW50aWFscyA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJTZXJ2aWNlLnVwZGF0ZUN1cnJlbnRVc2VyKGNyZWRlbnRpYWxzPy51c2VyKTtcblxuICAgICAgICBjb25zdCB1c2VyID0gY3JlZGVudGlhbHM/LnVzZXI7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gKCh1c2VyPy5wZXJtaXNzaW9ucyBhcyBbXSkgfHwgW10pLm1hcCgoeDogYW55KSA9PiB4LnNsdWcpO1xuXG4gICAgICAgIGlmICh1c2VyPy51c2VyX3R5cGVfaWQgPT09IHRoaXMudXNlclR5cGUuQURNSU4pIHtcbiAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKCdhcHBfYWRtaW4nKTtcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyPy51c2VyX3R5cGVfaWQgPT09IHRoaXMudXNlclR5cGUuQ0xJRU5UX0FETUlOKSB7XG4gICAgICAgICAgcGVybWlzc2lvbnMucHVzaCgnY2xpZW50X2FkbWluJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodXNlcj8udXNlcl90eXBlX2lkID09PSB0aGlzLnVzZXJUeXBlLkNMSUVOVF9VU0VSKSB7XG4gICAgICAgICAgcGVybWlzc2lvbnMucHVzaCgnY2xpZW50X3VzZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmd4UGVybWlzc2lvbnNTZXJ2aWNlLmZsdXNoUGVybWlzc2lvbnMoKTtcbiAgICAgICAgdGhpcy5uZ3hQZXJtaXNzaW9uc1NlcnZpY2UubG9hZFBlcm1pc3Npb25zKHBlcm1pc3Npb25zKTtcblxuICAgICAgICB0aGlzLmhhbmRsZVVzZXJSZWRpcmVjdCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVMb2dpbkVycm9ycyhlcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTG9naW5FcnJvcnMoZXJyb3JPYmo6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHsgZXJyb3IsIGVycm9yX2Rlc2NyaXB0aW9uLCB1c2VyX2NsaWVudHMgfSA9IGVycm9yT2JqPy5lcnJvcjtcbiAgICB0aGlzLmxvZ2luRXJyb3IgPSB7IHR5cGU6IGVycm9yLCBtZXNzYWdlOiBlcnJvcl9kZXNjcmlwdGlvbiB9O1xuICAgIHRoaXMudXNlckNsaWVudHMgPSB1c2VyX2NsaWVudHM7XG4gIH1cblxuICBiYWNrVG9Mb2dpbigpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJDbGllbnRzID0gbnVsbDtcbiAgICB0aGlzLmxvZ2luRXJyb3IgPSBudWxsO1xuICB9XG5cbiAgcmVkaXJlY3QocHJvdmlkZXIpIHtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMudXNlckNvbmZpZy5zb2NpYWxMb2dpblJlZGlyZWN0VXJsICsgcHJvdmlkZXI7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJsb2dpbigpXCIgY2xhc3M9J2QtZmxleCBmbGV4LWNvbHVtbiBnYXAtMyc+XG4gIDxkaXYgKm5nSWY9XCIhdXNlckNsaWVudHNcIiBjbGFzcz0nZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yJz5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPkVtYWlsPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cIkVtYWlsXCIgdHlwZT1cImVtYWlsXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcmVxdWlyZWQgLz5cbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ2VtYWlsJylcIj57e2dldEVycm9yTWVzc2FnZSgnZW1haWwnKX19PC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPlBhc3N3b3JkPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgdHlwZT1cInBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcmVxdWlyZWQgLz5cbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ3Bhc3N3b3JkJylcIj57e2dldEVycm9yTWVzc2FnZSgncGFzc3dvcmQnKX19PC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiAqbmdJZj1cImxvZ2luRXJyb3JcIj5cbiAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IGxvZ2luRXJyb3I/Lm1lc3NhZ2UgfX08L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwidy0xMDBcIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cImlzV29ya2luZ1wiPlxuICAgICAgTE9HSU5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dTb2NpYWxMb2dpblwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInctMTAwIGdvb2dsZS1idXR0b24gbWItMlwiIG1hdC1yYWlzZWQtYnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwicmVkaXJlY3QoJ2dvb2dsZScpXCI+R29vZ2xlPC9idXR0b24+XG5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ3LTEwMCBmYWNlYm9vay1idXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInJlZGlyZWN0KCdmYWNlYm9vaycpXCI+RmFjZWJvb2s8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMiBtYi00IHRleHQtY2VudGVyXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dGb3Jnb3RQYXNzd29yZFwiPlxuICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIFtyb3V0ZXJMaW5rXT1cIlsnL2ZvcmdvdC1wYXNzd29yZCddXCI+Rm9yZ290IHBhc3N3b3JkPzwvYT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInVzZXJDbGllbnRzXCIgY2xhc3M9J2QtZmxleCBmbGV4LWNvbHVtbiBnYXAtMic+XG4gICAgPGg0IGNsYXNzPVwic2VjdGlvbi10aXRsZSB0ZXh0LWNlbnRlciBtdC00XCI+XG4gICAgICB7eyB1c2VyQ2xpZW50cyA/ICdTRUxFQ1QgQ0xJRU5UIFRPIExPR0lOIFdJVEgnIDogJ0xPR0lOJyB9fVxuICAgIDwvaDQ+XG5cbiAgICA8bWF0LXNlbGVjdGlvbi1saXN0IGZvcm1Db250cm9sTmFtZT1cInNlbGVjdGVkX2NsaWVudFwiIFttdWx0aXBsZV09XCJmYWxzZVwiPlxuICAgICAgPG1hdC1saXN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdXNlckNsaWVudCBvZiB1c2VyQ2xpZW50c1wiIFt2YWx1ZV09XCJ1c2VyQ2xpZW50Py5jbGllbnRfaWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXVzZXJDbGllbnQ/LmlzX2VuYWJsZWQgfHwgaXNXb3JraW5nXCI+XG4gICAgICAgIHt7IHVzZXJDbGllbnQ/LmNsaWVudD8ubmFtZSB9fVxuICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XG4gICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMiBtYi00IHRleHQtY2VudGVyXCIgKm5nSWY9XCJ1c2VyQ29uZmlnLnNob3dGb3Jnb3RQYXNzd29yZFwiPlxuICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIChjbGljayk9XCJiYWNrVG9Mb2dpbigpXCI+QmFjayB0byBMb2dpbjwvYT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjwvZm9ybT4iXX0=
|