ngx-techlify-core 18.64.0 → 18.65.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/audit-log/audit-log-for-model/audit-log-for-model.module.mjs +1 -5
- package/esm2022/lib/audit-log/audit-log-list/audit-log-list.module.mjs +4 -9
- package/esm2022/lib/audit-log/audit-log-list-filter/audit-log-list-filter.module.mjs +1 -5
- package/esm2022/lib/audit-log/audit-log-view/audit-log-view.component.mjs +5 -5
- package/esm2022/lib/audit-log/audit-log-view/audit-log-view.module.mjs +1 -5
- package/esm2022/lib/audit-log/audit-log-view-model/audit-log-view-model.component.mjs +4 -5
- package/esm2022/lib/audit-log/audit-log-view-model/audit-log-view-model.module.mjs +1 -5
- package/esm2022/lib/audit-log/audit-logs-view-model/audit-logs-view-model.module.mjs +1 -5
- package/esm2022/lib/entity-files/entity-file-form/entity-file-form.component.mjs +9 -10
- package/esm2022/lib/entity-files/entity-files-view-all.component.mjs +18 -20
- package/esm2022/lib/entity-files/entity-files-view-all.module.mjs +4 -9
- package/esm2022/lib/import-csv/data-import/data-import.component.mjs +4 -5
- package/esm2022/lib/import-csv/failed-items-list/failed-items-list.component.mjs +6 -7
- package/esm2022/lib/import-csv/field-mapping/field-mapping.component.mjs +10 -11
- package/esm2022/lib/import-csv/import-csv.component.mjs +15 -15
- package/esm2022/lib/import-csv/import-history-list/import-history-list.component.mjs +6 -7
- package/esm2022/lib/import-csv/import-success/import-success.component.mjs +7 -8
- package/esm2022/lib/role/index.mjs +2 -2
- package/esm2022/lib/role/role-form.component.mjs +4 -4
- package/esm2022/lib/role/role-list/role-list.component.mjs +120 -0
- package/esm2022/lib/role/role-view/role-view.component.mjs +3 -4
- package/esm2022/lib/role/role.module.mjs +9 -16
- package/esm2022/lib/role/role.routes.mjs +3 -3
- package/fesm2022/ngx-techlify-core.mjs +126 -158
- package/fesm2022/ngx-techlify-core.mjs.map +1 -1
- package/lib/audit-log/audit-log-for-model/audit-log-for-model.module.d.ts +3 -4
- package/lib/audit-log/audit-log-list/audit-log-list.module.d.ts +7 -8
- package/lib/audit-log/audit-log-list-filter/audit-log-list-filter.module.d.ts +5 -6
- package/lib/audit-log/audit-log-view/audit-log-view.module.d.ts +2 -3
- package/lib/audit-log/audit-log-view-model/audit-log-view-model.module.d.ts +2 -3
- package/lib/audit-log/audit-logs-view-model/audit-logs-view-model.module.d.ts +2 -3
- package/lib/entity-files/entity-files-view-all.module.d.ts +11 -12
- package/lib/role/index.d.ts +1 -1
- package/lib/role/{roles-view-all.component.d.ts → role-list/role-list.component.d.ts} +8 -14
- package/lib/role/role.module.d.ts +6 -7
- package/package.json +1 -1
- package/esm2022/lib/role/roles-view-all.component.mjs +0 -128
|
@@ -4,11 +4,10 @@ import * as i2 from "../audit-log-view-model/audit-log-view-model.module";
|
|
|
4
4
|
import * as i3 from "../audit-logs-view-model/audit-logs-view-model.module";
|
|
5
5
|
import * as i4 from "@angular/common";
|
|
6
6
|
import * as i5 from "./audit-log-for-model-routing.module";
|
|
7
|
-
import * as i6 from "
|
|
8
|
-
import * as i7 from "../../
|
|
9
|
-
import * as i8 from "../../techlify-icon/techlify-icon.module";
|
|
7
|
+
import * as i6 from "../../material.module";
|
|
8
|
+
import * as i7 from "../../techlify-icon/techlify-icon.module";
|
|
10
9
|
export declare class AuditLogForModelModule {
|
|
11
10
|
static ɵfac: i0.ɵɵFactoryDeclaration<AuditLogForModelModule, never>;
|
|
12
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogForModelModule, [typeof i1.AuditLogForModelComponent], [typeof i2.AuditLogViewModelModule, typeof i3.AuditLogsViewModelModule, typeof i4.CommonModule, typeof i5.AuditLogForModelRoutingModule, typeof i6.
|
|
11
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogForModelModule, [typeof i1.AuditLogForModelComponent], [typeof i2.AuditLogViewModelModule, typeof i3.AuditLogsViewModelModule, typeof i4.CommonModule, typeof i5.AuditLogForModelRoutingModule, typeof i6.MaterialModule, typeof i7.TechlifyIconModule], [typeof i1.AuditLogForModelComponent]>;
|
|
13
12
|
static ɵinj: i0.ɵɵInjectorDeclaration<AuditLogForModelModule>;
|
|
14
13
|
}
|
|
@@ -3,15 +3,14 @@ import * as i1 from "./audit-log-list.component";
|
|
|
3
3
|
import * as i2 from "@angular/common";
|
|
4
4
|
import * as i3 from "./audit-log-list-routing.module";
|
|
5
5
|
import * as i4 from "../../export-excel/export-excel.module";
|
|
6
|
-
import * as i5 from "@angular/
|
|
7
|
-
import * as i6 from "
|
|
8
|
-
import * as i7 from "
|
|
9
|
-
import * as i8 from "
|
|
10
|
-
import * as i9 from "
|
|
11
|
-
import * as i10 from "
|
|
12
|
-
import * as i11 from "../../techlify-icon/techlify-icon.module";
|
|
6
|
+
import * as i5 from "@angular/forms";
|
|
7
|
+
import * as i6 from "../../material.module";
|
|
8
|
+
import * as i7 from "ngx-infinite-scroll";
|
|
9
|
+
import * as i8 from "../audit-log-list-filter/audit-log-list-filter.module";
|
|
10
|
+
import * as i9 from "@angular/material/progress-bar";
|
|
11
|
+
import * as i10 from "../../techlify-icon/techlify-icon.module";
|
|
13
12
|
export declare class AuditLogListModule {
|
|
14
13
|
static ɵfac: i0.ɵɵFactoryDeclaration<AuditLogListModule, never>;
|
|
15
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogListModule, [typeof i1.AuditLogListComponent], [typeof i2.CommonModule, typeof i3.AuditLogListRoutingModule, typeof i4.ExportExcelModule, typeof i5.
|
|
14
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogListModule, [typeof i1.AuditLogListComponent], [typeof i2.CommonModule, typeof i3.AuditLogListRoutingModule, typeof i4.ExportExcelModule, typeof i5.ReactiveFormsModule, typeof i6.MaterialModule, typeof i7.InfiniteScrollDirective, typeof i8.AuditLogListFilterModule, typeof i9.MatProgressBarModule, typeof i10.TechlifyIconModule], [typeof i1.AuditLogListComponent]>;
|
|
16
15
|
static ɵinj: i0.ɵɵInjectorDeclaration<AuditLogListModule>;
|
|
17
16
|
}
|
|
@@ -2,13 +2,12 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
import * as i1 from "./audit-log-list-filter.component";
|
|
3
3
|
import * as i2 from "@angular/common";
|
|
4
4
|
import * as i3 from "./audit-log-list-filter-routing.module";
|
|
5
|
-
import * as i4 from "@angular/
|
|
6
|
-
import * as i5 from "
|
|
7
|
-
import * as i6 from "../../
|
|
8
|
-
import * as i7 from "../../
|
|
9
|
-
import * as i8 from "../../timeline-filter/timeline-filter.module";
|
|
5
|
+
import * as i4 from "@angular/forms";
|
|
6
|
+
import * as i5 from "../../material.module";
|
|
7
|
+
import * as i6 from "../../searchable-selector/searchable-selector.module";
|
|
8
|
+
import * as i7 from "../../timeline-filter/timeline-filter.module";
|
|
10
9
|
export declare class AuditLogListFilterModule {
|
|
11
10
|
static ɵfac: i0.ɵɵFactoryDeclaration<AuditLogListFilterModule, never>;
|
|
12
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogListFilterModule, [typeof i1.AuditLogListFilterComponent], [typeof i2.CommonModule, typeof i3.AuditLogListFilterRoutingModule, typeof i4.
|
|
11
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogListFilterModule, [typeof i1.AuditLogListFilterComponent], [typeof i2.CommonModule, typeof i3.AuditLogListFilterRoutingModule, typeof i4.ReactiveFormsModule, typeof i5.MaterialModule, typeof i6.SearchableSelectorModule, typeof i7.TimelineFilterModule], [typeof i1.AuditLogListFilterComponent]>;
|
|
13
12
|
static ɵinj: i0.ɵɵInjectorDeclaration<AuditLogListFilterModule>;
|
|
14
13
|
}
|
|
@@ -2,10 +2,9 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
import * as i1 from "./audit-log-view.component";
|
|
3
3
|
import * as i2 from "@angular/common";
|
|
4
4
|
import * as i3 from "./audit-log-view-routing.module";
|
|
5
|
-
import * as i4 from "
|
|
6
|
-
import * as i5 from "../../material.module";
|
|
5
|
+
import * as i4 from "../../material.module";
|
|
7
6
|
export declare class AuditLogViewModule {
|
|
8
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<AuditLogViewModule, never>;
|
|
9
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogViewModule, [typeof i1.AuditLogViewComponent], [typeof i2.CommonModule, typeof i3.AuditLogViewRoutingModule, typeof i4.
|
|
8
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogViewModule, [typeof i1.AuditLogViewComponent], [typeof i2.CommonModule, typeof i3.AuditLogViewRoutingModule, typeof i4.MaterialModule], [typeof i1.AuditLogViewComponent]>;
|
|
10
9
|
static ɵinj: i0.ɵɵInjectorDeclaration<AuditLogViewModule>;
|
|
11
10
|
}
|
|
@@ -2,10 +2,9 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
import * as i1 from "./audit-log-view-model.component";
|
|
3
3
|
import * as i2 from "@angular/common";
|
|
4
4
|
import * as i3 from "./audit-log-view-model-routing.module";
|
|
5
|
-
import * as i4 from "
|
|
6
|
-
import * as i5 from "../../material.module";
|
|
5
|
+
import * as i4 from "../../material.module";
|
|
7
6
|
export declare class AuditLogViewModelModule {
|
|
8
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<AuditLogViewModelModule, never>;
|
|
9
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogViewModelModule, [typeof i1.AuditLogViewModelComponent], [typeof i2.CommonModule, typeof i3.AuditLogViewModelRoutingModule, typeof i4.
|
|
8
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogViewModelModule, [typeof i1.AuditLogViewModelComponent], [typeof i2.CommonModule, typeof i3.AuditLogViewModelRoutingModule, typeof i4.MaterialModule], [typeof i1.AuditLogViewModelComponent]>;
|
|
10
9
|
static ɵinj: i0.ɵɵInjectorDeclaration<AuditLogViewModelModule>;
|
|
11
10
|
}
|
|
@@ -2,10 +2,9 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
import * as i1 from "./audit-logs-view-model.component";
|
|
3
3
|
import * as i2 from "@angular/common";
|
|
4
4
|
import * as i3 from "./audit-logs-view-model-routing.module";
|
|
5
|
-
import * as i4 from "
|
|
6
|
-
import * as i5 from "../audit-log-list/audit-log-list.module";
|
|
5
|
+
import * as i4 from "../audit-log-list/audit-log-list.module";
|
|
7
6
|
export declare class AuditLogsViewModelModule {
|
|
8
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<AuditLogsViewModelModule, never>;
|
|
9
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogsViewModelModule, [typeof i1.AuditLogsViewModelComponent], [typeof i2.CommonModule, typeof i3.AuditLogsViewModelRoutingModule, typeof i4.
|
|
8
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AuditLogsViewModelModule, [typeof i1.AuditLogsViewModelComponent], [typeof i2.CommonModule, typeof i3.AuditLogsViewModelRoutingModule, typeof i4.AuditLogListModule], [typeof i1.AuditLogsViewModelComponent]>;
|
|
10
9
|
static ɵinj: i0.ɵɵInjectorDeclaration<AuditLogsViewModelModule>;
|
|
11
10
|
}
|
|
@@ -3,19 +3,18 @@ import * as i1 from "./entity-file-form/entity-file-form.component";
|
|
|
3
3
|
import * as i2 from "./entity-files-view-all.component";
|
|
4
4
|
import * as i3 from "@angular/common";
|
|
5
5
|
import * as i4 from "@angular/forms";
|
|
6
|
-
import * as i5 from "
|
|
7
|
-
import * as i6 from "../
|
|
8
|
-
import * as i7 from "
|
|
9
|
-
import * as i8 from "
|
|
10
|
-
import * as i9 from "../
|
|
11
|
-
import * as i10 from "../
|
|
12
|
-
import * as i11 from "../
|
|
13
|
-
import * as i12 from "../
|
|
14
|
-
import * as i13 from "
|
|
15
|
-
import * as i14 from "
|
|
16
|
-
import * as i15 from "../pipes/wrap.pipe";
|
|
6
|
+
import * as i5 from "../file-dropper/file-dropper.module";
|
|
7
|
+
import * as i6 from "../document-viewer/document-viewer.module";
|
|
8
|
+
import * as i7 from "ngx-infinite-scroll";
|
|
9
|
+
import * as i8 from "../action-popup/action-popup.module";
|
|
10
|
+
import * as i9 from "../material.module";
|
|
11
|
+
import * as i10 from "../tag/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.module";
|
|
12
|
+
import * as i11 from "../searchable-selector/searchable-selector.module";
|
|
13
|
+
import * as i12 from "../read-more/read-more.module";
|
|
14
|
+
import * as i13 from "@angular/material/progress-bar";
|
|
15
|
+
import * as i14 from "../pipes/wrap.pipe";
|
|
17
16
|
export declare class EntityFilesViewAllModule {
|
|
18
17
|
static ɵfac: i0.ɵɵFactoryDeclaration<EntityFilesViewAllModule, never>;
|
|
19
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<EntityFilesViewAllModule, [typeof i1.EntityFileFormComponent, typeof i2.EntityFilesViewAllComponent], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i4.ReactiveFormsModule, typeof i5.
|
|
18
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<EntityFilesViewAllModule, [typeof i1.EntityFileFormComponent, typeof i2.EntityFilesViewAllComponent], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i4.ReactiveFormsModule, typeof i5.FileDropperModule, typeof i6.DocumentViewerModule, typeof i7.InfiniteScrollDirective, typeof i8.ActionPopupModule, typeof i9.MaterialModule, typeof i10.TechlifyTaggerTagFormFieldModule, typeof i11.SearchableSelectorModule, typeof i12.ReadMoreModule, typeof i13.MatProgressBarModule, typeof i14.WrapPipe], [typeof i2.EntityFilesViewAllComponent]>;
|
|
20
19
|
static ɵinj: i0.ɵɵInjectorDeclaration<EntityFilesViewAllModule>;
|
|
21
20
|
}
|
package/lib/role/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './role-form.component';
|
|
2
2
|
export * from './role.model';
|
|
3
3
|
export * from './role.service';
|
|
4
|
-
export * from './
|
|
4
|
+
export * from './role-list/role-list.component';
|
|
5
5
|
export * from './permission/permissions-management.component';
|
|
6
6
|
export * from './permission/permission.model';
|
|
7
7
|
export * from './role.routes';
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
2
|
import { ActivatedRoute } from '@angular/router';
|
|
3
|
-
import { Role } from '
|
|
4
|
-
import { MultiUserConfig } from '
|
|
5
|
-
import { UserConfigService } from '
|
|
3
|
+
import { Role } from '../role.model';
|
|
4
|
+
import { MultiUserConfig } from '../../user-config';
|
|
5
|
+
import { UserConfigService } from '../../user-config';
|
|
6
6
|
import { MatDialog } from '@angular/material/dialog';
|
|
7
|
-
import { CredentialsService, HttpService } from '
|
|
8
|
-
import { CurrentUserService } from '
|
|
7
|
+
import { CredentialsService, HttpService } from '../../core';
|
|
8
|
+
import { CurrentUserService } from '../../user';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
|
-
|
|
11
|
-
* Component used to view a set of roles
|
|
12
|
-
*
|
|
13
|
-
* @author Joshua Kissoon
|
|
14
|
-
* @since 20160818
|
|
15
|
-
*/
|
|
16
|
-
export declare class RolesViewAllComponent implements OnInit {
|
|
10
|
+
export declare class RoleListComponent implements OnInit {
|
|
17
11
|
private http;
|
|
18
12
|
private route;
|
|
19
13
|
private credentialsService;
|
|
@@ -34,6 +28,6 @@ export declare class RolesViewAllComponent implements OnInit {
|
|
|
34
28
|
reload(): void;
|
|
35
29
|
onScroll(): void;
|
|
36
30
|
createOrModifyRole(role?: any): void;
|
|
37
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
|
38
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<
|
|
31
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RoleListComponent, never>;
|
|
32
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RoleListComponent, "role-list", never, { "clientId": { "alias": "clientId"; "required": false; }; }, {}, never, never, false, never>;
|
|
39
33
|
}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
import * as i1 from "./role-form.component";
|
|
3
|
-
import * as i2 from "./
|
|
3
|
+
import * as i2 from "./role-list/role-list.component";
|
|
4
4
|
import * as i3 from "./role-form-button.component";
|
|
5
5
|
import * as i4 from "@angular/common";
|
|
6
6
|
import * as i5 from "./role.routes";
|
|
7
7
|
import * as i6 from "../material.module";
|
|
8
|
-
import * as i7 from "@angular/
|
|
9
|
-
import * as i8 from "
|
|
10
|
-
import * as i9 from "
|
|
11
|
-
import * as i10 from "
|
|
12
|
-
import * as i11 from "../techlify-icon/techlify-icon.module";
|
|
8
|
+
import * as i7 from "@angular/forms";
|
|
9
|
+
import * as i8 from "ngx-infinite-scroll";
|
|
10
|
+
import * as i9 from "@angular/material/progress-bar";
|
|
11
|
+
import * as i10 from "../techlify-icon/techlify-icon.module";
|
|
13
12
|
export declare class RoleModule {
|
|
14
13
|
static ɵfac: i0.ɵɵFactoryDeclaration<RoleModule, never>;
|
|
15
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<RoleModule, [typeof i1.RoleFormComponent, typeof i2.
|
|
14
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<RoleModule, [typeof i1.RoleFormComponent, typeof i2.RoleListComponent, typeof i3.RoleFormButtonComponent], [typeof i4.CommonModule, typeof i5.RoleRoutingProvider, typeof i6.MaterialModule, typeof i7.FormsModule, typeof i7.ReactiveFormsModule, typeof i8.InfiniteScrollDirective, typeof i9.MatProgressBarModule, typeof i10.TechlifyIconModule], [typeof i2.RoleListComponent, typeof i3.RoleFormButtonComponent, typeof i1.RoleFormComponent]>;
|
|
16
15
|
static ɵinj: i0.ɵɵInjectorDeclaration<RoleModule>;
|
|
17
16
|
}
|
package/package.json
CHANGED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/* tslint:disable:component-selector */
|
|
2
|
-
import { Component, Input } from '@angular/core';
|
|
3
|
-
import { RoleFormComponent } from './role-form.component';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../core";
|
|
6
|
-
import * as i2 from "@angular/router";
|
|
7
|
-
import * as i3 from "../user-config";
|
|
8
|
-
import * as i4 from "@angular/material/dialog";
|
|
9
|
-
import * as i5 from "../user";
|
|
10
|
-
import * as i6 from "@angular/common";
|
|
11
|
-
import * as i7 from "@angular/material/button";
|
|
12
|
-
import * as i8 from "@angular/material/icon";
|
|
13
|
-
import * as i9 from "@angular/material/table";
|
|
14
|
-
import * as i10 from "@angular/material/card";
|
|
15
|
-
import * as i11 from "@angular/material/tooltip";
|
|
16
|
-
import * as i12 from "@angular/material/progress-bar";
|
|
17
|
-
import * as i13 from "@angular/flex-layout/flex";
|
|
18
|
-
import * as i14 from "@angular/flex-layout/extended";
|
|
19
|
-
import * as i15 from "ngx-infinite-scroll";
|
|
20
|
-
import * as i16 from "../techlify-icon/techlify-icon.component";
|
|
21
|
-
import * as i17 from "./role-form-button.component";
|
|
22
|
-
/**
|
|
23
|
-
* Component used to view a set of roles
|
|
24
|
-
*
|
|
25
|
-
* @author Joshua Kissoon
|
|
26
|
-
* @since 20160818
|
|
27
|
-
*/
|
|
28
|
-
export class RolesViewAllComponent {
|
|
29
|
-
constructor(http, route, credentialsService, userConfigService, dialog, currentUserService) {
|
|
30
|
-
this.http = http;
|
|
31
|
-
this.route = route;
|
|
32
|
-
this.credentialsService = credentialsService;
|
|
33
|
-
this.userConfigService = userConfigService;
|
|
34
|
-
this.dialog = dialog;
|
|
35
|
-
this.currentUserService = currentUserService;
|
|
36
|
-
this.roles = [];
|
|
37
|
-
this.displayedColumns = [
|
|
38
|
-
'index',
|
|
39
|
-
'label',
|
|
40
|
-
'description',
|
|
41
|
-
'module',
|
|
42
|
-
'users',
|
|
43
|
-
'permissions',
|
|
44
|
-
'actions'
|
|
45
|
-
];
|
|
46
|
-
this.totalItems = 0;
|
|
47
|
-
this.currentPage = 1;
|
|
48
|
-
this.isWorking = false;
|
|
49
|
-
this.config = this.userConfigService.getConfig();
|
|
50
|
-
}
|
|
51
|
-
get isAdminUser() {
|
|
52
|
-
return (this.credentialsService.credentials?.user?.user_type_id === 1);
|
|
53
|
-
}
|
|
54
|
-
ngOnInit() {
|
|
55
|
-
this.route.params.subscribe(params => {
|
|
56
|
-
this.loadData();
|
|
57
|
-
});
|
|
58
|
-
if (this.isAdminUser) {
|
|
59
|
-
this.displayedColumns = [
|
|
60
|
-
'index',
|
|
61
|
-
'label',
|
|
62
|
-
'description',
|
|
63
|
-
'module',
|
|
64
|
-
'editable',
|
|
65
|
-
'users',
|
|
66
|
-
'actions',
|
|
67
|
-
'permissions'
|
|
68
|
-
];
|
|
69
|
-
}
|
|
70
|
-
if (!(this.config?.roleConfig?.showModuleSelectorOnForm)) {
|
|
71
|
-
this.displayedColumns = this.displayedColumns.filter(x => x !== 'module');
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
loadData() {
|
|
75
|
-
this.isWorking = true;
|
|
76
|
-
const filters = {
|
|
77
|
-
withCount: 'permissions',
|
|
78
|
-
sort_by: 'label|asc',
|
|
79
|
-
is_subscribed: true
|
|
80
|
-
};
|
|
81
|
-
if (this.clientId) {
|
|
82
|
-
filters.client_id = this.clientId;
|
|
83
|
-
}
|
|
84
|
-
this.http.get('api/roles', { params: filters }).toPromise().then((res) => {
|
|
85
|
-
this.isWorking = false;
|
|
86
|
-
this.totalItems = res.total;
|
|
87
|
-
this.roles = this.roles.concat(res.data);
|
|
88
|
-
}, () => {
|
|
89
|
-
this.isWorking = false;
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
reload() {
|
|
93
|
-
this.roles = [];
|
|
94
|
-
this.currentPage = 1;
|
|
95
|
-
if (!this.isWorking) {
|
|
96
|
-
this.loadData();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
onScroll() {
|
|
100
|
-
if (!this.isWorking && this.totalItems > this.roles.length) {
|
|
101
|
-
this.currentPage += 1;
|
|
102
|
-
this.loadData();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
createOrModifyRole(role) {
|
|
106
|
-
const dialogRef = this.dialog.open(RoleFormComponent, {
|
|
107
|
-
width: '500px',
|
|
108
|
-
data: {
|
|
109
|
-
role,
|
|
110
|
-
client_id: this.clientId,
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
dialogRef.afterClosed().subscribe(result => {
|
|
114
|
-
if (result) {
|
|
115
|
-
this.reload();
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RolesViewAllComponent, deps: [{ token: i1.HttpService }, { token: i2.ActivatedRoute }, { token: i1.CredentialsService }, { token: i3.UserConfigService }, { token: i4.MatDialog }, { token: i5.CurrentUserService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
120
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: RolesViewAllComponent, selector: "roles-view-all", inputs: { clientId: "clientId" }, ngImport: i0, template: "<div fxLayout=\"column\" class=\"m-2\">\n <mat-card appearance=\"outlined\">\n <mat-card-content class=\"d-flex justify-content-start align-items-center gap-2\">\n <h3 class=\"m-0\">\n Manage Roles\n </h3>\n <app-role-form-button (success)=\"reload()\" class=\"mx-2\"\n *ngIf=\"(!config.roleConfig.disableAddRole) && currentUserService?.hasPermission('role_create')\"\n [clientId]=\"clientId\"></app-role-form-button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../users']\" *ngIf=\"!config.roleConfig.disableUsers\"\n class=\"ml-1\">\n <mat-icon>people</mat-icon>\n Users\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../role-permissions']\"\n *ngIf=\"!config.roleConfig.disablePermissions\" class=\"ml-1\">\n <mat-icon>lock</mat-icon>\n Role Permissions\n </button>\n </mat-card-content>\n </mat-card>\n\n <mat-card appearance=\"outlined\" class=\"mt-2 p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"roles\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" aria-describedby=\"Roles\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\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 <!-- Label Column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef> Label </th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{element?.label}}</p>\n <span class=\"badge\"\n [ngClass]=\"{'badge-primary':element?.client_id == null, 'badge-secondary': element?.client_id != null}\">\n {{(element?.client_id == null) ? 'App role' : 'Custom role'}}\n </span>\n </td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef> Description </th>\n <td mat-cell *matCellDef=\"let element\"> {{element?.description }} </td>\n </ng-container>\n\n <!-- Module Column -->\n <ng-container matColumnDef=\"module\">\n <th mat-header-cell *matHeaderCellDef> Module </th>\n <td mat-cell *matCellDef=\"let element\"> {{element?.module?.name}} </td>\n </ng-container>\n\n <!-- Editable Column -->\n <ng-container matColumnDef=\"editable\">\n <th mat-header-cell *matHeaderCellDef> Editable </th>\n <td mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"element?.is_editable\" class=\"btn btn-success btn-xs\">Yes</span>\n <span *ngIf=\"!element?.is_editable\" class=\"btn btn-danger btn-xs\">No</span>\n </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?.role_users_count}} </td>\n </ng-container>\n\n <!-- Permissions Column -->\n <ng-container matColumnDef=\"permissions\">\n <th mat-header-cell *matHeaderCellDef> Permissions </th>\n <td mat-cell *matCellDef=\"let element\"> {{element?.permissions_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 role\" class=\"text-muted\">\n <div fxLayoutAlign=\"start center\">\n <app-techlify-icon name=\"view\" matTooltip=\"view\" class=\"clickable\"\n [routerLink]=\"['../roles/', role?.id]\"></app-techlify-icon>\n <app-role-form-button class=\"ml-1\" (success)=\"reload()\" [role]=\"role\" [isUpdate]=\"true\"\n *ngIf=\"(isAdminUser || role.is_editable) && currentUserService.hasPermission('role_update')\"\n [clientId]=\"clientId\"></app-role-form-button>\n </div>\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 *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n\n</div>", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i10.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i13.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i13.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i14.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i15.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i16.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "component", type: i17.RoleFormButtonComponent, selector: "app-role-form-button", inputs: ["config", "clientId", "isUpdate", "role"], outputs: ["success"] }] }); }
|
|
121
|
-
}
|
|
122
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RolesViewAllComponent, decorators: [{
|
|
123
|
-
type: Component,
|
|
124
|
-
args: [{ selector: 'roles-view-all', template: "<div fxLayout=\"column\" class=\"m-2\">\n <mat-card appearance=\"outlined\">\n <mat-card-content class=\"d-flex justify-content-start align-items-center gap-2\">\n <h3 class=\"m-0\">\n Manage Roles\n </h3>\n <app-role-form-button (success)=\"reload()\" class=\"mx-2\"\n *ngIf=\"(!config.roleConfig.disableAddRole) && currentUserService?.hasPermission('role_create')\"\n [clientId]=\"clientId\"></app-role-form-button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../users']\" *ngIf=\"!config.roleConfig.disableUsers\"\n class=\"ml-1\">\n <mat-icon>people</mat-icon>\n Users\n </button>\n <button mat-raised-button type=\"button\" [routerLink]=\"['../role-permissions']\"\n *ngIf=\"!config.roleConfig.disablePermissions\" class=\"ml-1\">\n <mat-icon>lock</mat-icon>\n Role Permissions\n </button>\n </mat-card-content>\n </mat-card>\n\n <mat-card appearance=\"outlined\" class=\"mt-2 p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"roles\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" aria-describedby=\"Roles\">\n\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\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 <!-- Label Column -->\n <ng-container matColumnDef=\"label\">\n <th mat-header-cell *matHeaderCellDef> Label </th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{element?.label}}</p>\n <span class=\"badge\"\n [ngClass]=\"{'badge-primary':element?.client_id == null, 'badge-secondary': element?.client_id != null}\">\n {{(element?.client_id == null) ? 'App role' : 'Custom role'}}\n </span>\n </td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef> Description </th>\n <td mat-cell *matCellDef=\"let element\"> {{element?.description }} </td>\n </ng-container>\n\n <!-- Module Column -->\n <ng-container matColumnDef=\"module\">\n <th mat-header-cell *matHeaderCellDef> Module </th>\n <td mat-cell *matCellDef=\"let element\"> {{element?.module?.name}} </td>\n </ng-container>\n\n <!-- Editable Column -->\n <ng-container matColumnDef=\"editable\">\n <th mat-header-cell *matHeaderCellDef> Editable </th>\n <td mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"element?.is_editable\" class=\"btn btn-success btn-xs\">Yes</span>\n <span *ngIf=\"!element?.is_editable\" class=\"btn btn-danger btn-xs\">No</span>\n </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?.role_users_count}} </td>\n </ng-container>\n\n <!-- Permissions Column -->\n <ng-container matColumnDef=\"permissions\">\n <th mat-header-cell *matHeaderCellDef> Permissions </th>\n <td mat-cell *matCellDef=\"let element\"> {{element?.permissions_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 role\" class=\"text-muted\">\n <div fxLayoutAlign=\"start center\">\n <app-techlify-icon name=\"view\" matTooltip=\"view\" class=\"clickable\"\n [routerLink]=\"['../roles/', role?.id]\"></app-techlify-icon>\n <app-role-form-button class=\"ml-1\" (success)=\"reload()\" [role]=\"role\" [isUpdate]=\"true\"\n *ngIf=\"(isAdminUser || role.is_editable) && currentUserService.hasPermission('role_update')\"\n [clientId]=\"clientId\"></app-role-form-button>\n </div>\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 *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n\n</div>" }]
|
|
125
|
-
}], ctorParameters: () => [{ type: i1.HttpService }, { type: i2.ActivatedRoute }, { type: i1.CredentialsService }, { type: i3.UserConfigService }, { type: i4.MatDialog }, { type: i5.CurrentUserService }], propDecorators: { clientId: [{
|
|
126
|
-
type: Input
|
|
127
|
-
}] } });
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZXMtdmlldy1hbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9yb2xlL3JvbGVzLXZpZXctYWxsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvcm9sZS9yb2xlcy12aWV3LWFsbC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVDQUF1QztBQUN2QyxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU96RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUkxRDs7Ozs7R0FLRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFpQmhDLFlBQ1UsSUFBaUIsRUFDakIsS0FBcUIsRUFDckIsa0JBQXNDLEVBQ3ZDLGlCQUFvQyxFQUNuQyxNQUFpQixFQUNsQixrQkFBc0M7UUFMckMsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3ZDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDbkMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNsQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBdEIvQyxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLHFCQUFnQixHQUFhO1lBQzNCLE9BQU87WUFDUCxPQUFPO1lBQ1AsYUFBYTtZQUNiLFFBQVE7WUFDUixPQUFPO1lBQ1AsYUFBYTtZQUNiLFNBQVM7U0FDVixDQUFDO1FBQ0YsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFZaEIsSUFBSSxDQUFD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QjtTQUNGLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F6R1UscUJBQXFCO21HQUFyQixxQkFBcUIsd0ZDdEJsQywwZ0pBbUdNOzs0RkQ3RU8scUJBQXFCO2tCQUpqQyxTQUFTOytCQUNFLGdCQUFnQjt1T0FpQmpCLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpjb21wb25lbnQtc2VsZWN0b3IgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBSb2xlIH0gZnJvbSAnLi9yb2xlLm1vZGVsJztcbmltcG9ydCB7IE11bHRpVXNlckNvbmZpZyB9IGZyb20gJy4uL3VzZXItY29uZmlnJztcbmltcG9ydCB7IFVzZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vdXNlci1jb25maWcnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFJvbGVGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9yb2xlLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IENyZWRlbnRpYWxzU2VydmljZSwgSHR0cFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IEN1cnJlbnRVc2VyU2VydmljZSB9IGZyb20gJy4uL3VzZXInO1xuXG4vKipcbiAqIENvbXBvbmVudCB1c2VkIHRvIHZpZXcgYSBzZXQgb2Ygcm9sZXNcbiAqXG4gKiBAYXV0aG9yIEpvc2h1YSBLaXNzb29uXG4gKiBAc2luY2UgMjAxNjA4MThcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sZXMtdmlldy1hbGwnLFxuICB0ZW1wbGF0ZVVybDogJy4vcm9sZXMtdmlldy1hbGwuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFJvbGVzVmlld0FsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHJvbGVzOiBSb2xlW10gPSBbXTtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJ2luZGV4JyxcbiAgICAnbGFiZWwnLFxuICAgICdkZXNjcmlwdGlvbicsXG4gICAgJ21vZHVsZScsXG4gICAgJ3VzZXJzJyxcbiAgICAncGVybWlzc2lvbnMnLFxuICAgICdhY3Rpb25zJ1xuICBdO1xuICB0b3RhbEl0ZW1zID0gMDtcbiAgY3VycmVudFBhZ2UgPSAxO1xuICBpc1dvcmtpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgY2xpZW50SWQ6IG51bWJlcjtcbiAgY29uZmlnOiBNdWx0aVVzZXJDb25maWc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGNyZWRlbnRpYWxzU2VydmljZTogQ3JlZGVudGlhbHNTZXJ2aWNlLFxuICAgIHB1YmxpYyB1c2VyQ29uZmlnU2VydmljZTogVXNlckNvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgY3VycmVudFVzZXJTZXJ2aWNlOiBDdXJyZW50VXNlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5jb25maWcgPSB0aGlzLnVzZXJDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xuICB9XG5cbiAgZ2V0IGlzQWRtaW5Vc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5jcmVkZW50aWFsc1NlcnZpY2UuY3JlZGVudGlhbHM/LnVzZXI/LnVzZXJfdHlwZV9pZCA9PT0gMSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmlzQWRtaW5Vc2VyKSB7XG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSBbXG4gICAgICAgICdpbmRleCcsXG4gICAgICAgICdsYWJlbCcsXG4gICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICdtb2R1bGUnLFxuICAgICAgICAnZWRpdGFibGUnLFxuICAgICAgICAndXNlcnMnLFxuICAgICAgICAnYWN0aW9ucycsXG4gICAgICAgICdwZXJtaXNzaW9ucydcbiAgICAgIF07XG4gICAgfVxuXG4gICAgaWYgKCEodGhpcy5jb25maWc/LnJvbGVDb25maWc/LnNob3dNb2R1bGVTZWxlY3Rvck9uRm9ybSkpIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5maWx0ZXIoeCA9PiB4ICE9PSAnbW9kdWxlJyk7XG4gICAgfVxuICB9XG5cbiAgbG9hZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIGNvbnN0IGZpbHRlcnM6IGFueSA9IHtcbiAgICAgIHdpdGhDb3VudDogJ3Blcm1pc3Npb25zJyxcbiAgICAgIHNvcnRfYnk6ICdsYWJlbHxhc2MnLFxuICAgICAgaXNfc3Vic2NyaWJlZDogdHJ1ZVxuICAgIH07XG4gICAgaWYgKHRoaXMuY2xpZW50SWQpIHtcbiAgICAgIGZpbHRlcnMuY2xpZW50X2lkID0gdGhpcy5jbGllbnRJZDtcbiAgICB9XG4gICAgdGhpcy5odHRwLmdldCgnYXBpL3JvbGVzJywgeyBwYXJhbXM6IGZpbHRlcnMgfSkudG9Qcm9taXNlKCkudGhlbihcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXMudG90YWw7XG4gICAgICAgIHRoaXMucm9sZXMgPSB0aGlzLnJvbGVzLmNvbmNhdChyZXMuZGF0YSk7XG4gICAgICB9LCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHJlbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGVzID0gW107XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgaWYgKCF0aGlzLmlzV29ya2luZykge1xuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1dvcmtpbmcgJiYgdGhpcy50b3RhbEl0ZW1zID4gdGhpcy5yb2xlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgKz0gMTtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVPck1vZGlmeVJvbGUocm9sZT86IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUm9sZUZvcm1Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICByb2xlLFxuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwibS0yXCI+XG4gIDxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIj5cbiAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8aDMgY2xhc3M9XCJtLTBcIj5cbiAgICAgICAgTWFuYWdlIFJvbGVzXG4gICAgICA8L2gzPlxuICAgICAgPGFwcC1yb2xlLWZvcm0tYnV0dG9uIChzdWNjZXNzKT1cInJlbG9hZCgpXCIgY2xhc3M9XCJteC0yXCJcbiAgICAgICAgKm5nSWY9XCIoIWNvbmZpZy5yb2xlQ29uZmlnLmRpc2FibGVBZGRSb2xlKSAmJiBjdXJyZW50VXNlclNlcnZpY2U/Lmhhc1Blcm1pc3Npb24oJ3JvbGVfY3JlYXRlJylcIlxuICAgICAgICBbY2xpZW50SWRdPVwiY2xpZW50SWRcIj48L2FwcC1yb2xlLWZvcm0tYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW3JvdXRlckxpbmtdPVwiWycuLi91c2VycyddXCIgKm5nSWY9XCIhY29uZmlnLnJvbGVDb25maWcuZGlzYWJsZVVzZXJzXCJcbiAgICAgICAgY2xhc3M9XCJtbC0xXCI+XG4gICAgICAgIDxtYXQtaWNvbj5wZW9wbGU8L21hdC1pY29uPlxuICAgICAgICBVc2Vyc1xuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbcm91dGVyTGlua109XCJbJy4uL3JvbGUtcGVybWlzc2lvbnMnXVwiXG4gICAgICAgICpuZ0lmPVwiIWNvbmZpZy5yb2xlQ29uZmlnLmRpc2FibGVQZXJtaXNzaW9uc1wiIGNsYXNzPVwibWwtMVwiPlxuICAgICAgICA8bWF0LWljb24+bG9jazwvbWF0LWljb24+XG4gICAgICAgIFJvbGUgUGVybWlzc2lvbnNcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cblxuICA8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCIgY2xhc3M9XCJtdC0yIHAtMFwiPlxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyb2xlc1wiIGNsYXNzPVwidy0xMDBcIiBpbmZpbml0ZVNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIiAoc2Nyb2xsZWQpPVwib25TY3JvbGwoKVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJSb2xlc1wiPlxuXG4gICAgICAgIDwhLS0gSW5kZXggQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gIyA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgaSA9IGluZGV4XCI+IHt7IGkrMSB9fSA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIExhYmVsIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYWJlbFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IExhYmVsIDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7ZWxlbWVudD8ubGFiZWx9fTwvcD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2VcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2JhZGdlLXByaW1hcnknOmVsZW1lbnQ/LmNsaWVudF9pZCA9PSBudWxsLCAnYmFkZ2Utc2Vjb25kYXJ5JzogZWxlbWVudD8uY2xpZW50X2lkICE9IG51bGx9XCI+XG4gICAgICAgICAgICAgIHt7KGVsZW1lbnQ/LmNsaWVudF9pZCA9PSBudWxsKSA/ICdBcHAgcm9sZScgOiAnQ3VzdG9tIHJvbGUnfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIERlc2NyaXB0aW9uIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IERlc2NyaXB0aW9uIDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py5kZXNjcmlwdGlvbiB9fSA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIE1vZHVsZSBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibW9kdWxlXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gTW9kdWxlIDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py5tb2R1bGU/Lm5hbWV9fSA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEVkaXRhYmxlIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJlZGl0YWJsZVwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEVkaXRhYmxlIDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZWxlbWVudD8uaXNfZWRpdGFibGVcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBidG4teHNcIj5ZZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFlbGVtZW50Py5pc19lZGl0YWJsZVwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLXhzXCI+Tm88L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBVc2VycyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXNlcnNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiAjIFVzZXJzIDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py5yb2xlX3VzZXJzX2NvdW50fX0gPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBQZXJtaXNzaW9ucyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicGVybWlzc2lvbnNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBQZXJtaXNzaW9ucyA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudD8ucGVybWlzc2lvbnNfY291bnR9fSA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEFjdGlvbnMgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpb25zIDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvbGVcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxuICAgICAgICAgICAgICA8YXBwLXRlY2hsaWZ5LWljb24gbmFtZT1cInZpZXdcIiBtYXRUb29sdGlwPVwidmlld1wiIGNsYXNzPVwiY2xpY2thYmxlXCJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy4uL3JvbGVzLycsIHJvbGU/LmlkXVwiPjwvYXBwLXRlY2hsaWZ5LWljb24+XG4gICAgICAgICAgICAgIDxhcHAtcm9sZS1mb3JtLWJ1dHRvbiBjbGFzcz1cIm1sLTFcIiAoc3VjY2Vzcyk9XCJyZWxvYWQoKVwiIFtyb2xlXT1cInJvbGVcIiBbaXNVcGRhdGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoaXNBZG1pblVzZXIgfHwgcm9sZS5pc19lZGl0YWJsZSkgJiYgY3VycmVudFVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24oJ3JvbGVfdXBkYXRlJylcIlxuICAgICAgICAgICAgICAgIFtjbGllbnRJZF09XCJjbGllbnRJZFwiPjwvYXBwLXJvbGUtZm9ybS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIj48L3RyPlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiaXNXb3JraW5nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICA8L21hdC1jYXJkPlxuXG48L2Rpdj4iXX0=
|