ngx-techlify-core 18.73.1 → 18.75.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/base-model/index.mjs +4 -3
- package/esm2022/lib/base-model/techlify-form/contract/techlify-form.contract.mjs +191 -0
- package/esm2022/lib/base-model/techlify-form/techlify-form.component.mjs +134 -0
- package/esm2022/lib/base-model/techlify-list/contract/techlify-list.contract.mjs +69 -0
- package/esm2022/lib/base-model/techlify-list/techlify-list.component.mjs +17 -2
- package/esm2022/lib/entity-files/entity-files-view-all.component.mjs +3 -3
- package/esm2022/lib/file-dropper/file-dropper.component.mjs +3 -1
- package/esm2022/lib/role/permission/permissions-management.component.mjs +8 -5
- package/esm2022/lib/subscription/subscription-form/subscription-form.component.mjs +2 -2
- package/esm2022/lib/subscription/subscription-package-listing/subscription-package-listing.component.mjs +1 -2
- package/esm2022/lib/techlify-view/techlify-view-form/techlify-view-form.component.mjs +2 -2
- package/esm2022/lib/user-tenant-accept-invitation/user-tenant-accept-invitation.component.mjs +27 -0
- package/esm2022/lib/user-tenant-accept-invitation/user-tenant-accept-invitation.service.mjs +18 -0
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/ngx-techlify-core.mjs +256 -11
- package/fesm2022/ngx-techlify-core.mjs.map +1 -1
- package/lib/base-model/index.d.ts +3 -2
- package/lib/base-model/techlify-form/contract/techlify-form.contract.d.ts +18 -0
- package/lib/base-model/{techlify-form.component.d.ts → techlify-form/techlify-form.component.d.ts} +3 -3
- package/lib/base-model/techlify-list/{techlify-list.contract.d.ts → contract/techlify-list.contract.d.ts} +1 -1
- package/lib/base-model/techlify-list/techlify-list.component.d.ts +3 -1
- package/lib/subscription/subscription-form/subscription-form.component.d.ts +1 -1
- package/lib/subscription/subscription-package-listing/subscription-package-listing.component.d.ts +0 -1
- package/lib/techlify-view/techlify-view-form/techlify-view-form.component.d.ts +1 -1
- package/lib/user-tenant-accept-invitation/user-tenant-accept-invitation.component.d.ts +14 -0
- package/lib/user-tenant-accept-invitation/user-tenant-accept-invitation.service.d.ts +8 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/esm2022/lib/base-model/techlify-form.component.mjs +0 -132
- package/esm2022/lib/base-model/techlify-list/techlify-list.contract.mjs +0 -69
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export * from './techlify-form.component';
|
|
1
|
+
export * from './techlify-form/techlify-form.component';
|
|
2
|
+
export * from './techlify-form/contract/techlify-form.contract';
|
|
2
3
|
export * from './techlify-list/techlify-list.component';
|
|
3
|
-
export * from './techlify-list/techlify-list.contract';
|
|
4
|
+
export * from './techlify-list/contract/techlify-list.contract';
|
|
4
5
|
export * from './techlify-service';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TechlifyFormComponent } from '../techlify-form.component';
|
|
2
|
+
export interface TechlifyFormContractOptions {
|
|
3
|
+
getComponent: () => TechlifyFormComponent;
|
|
4
|
+
getService: () => any;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Reusable test contract for components extending TechlifyFormComponent.
|
|
8
|
+
*
|
|
9
|
+
* Ensures all form components follow the same base behaviour:
|
|
10
|
+
* - Service injection
|
|
11
|
+
* - Default state initialization
|
|
12
|
+
* - Create/update submission flow
|
|
13
|
+
* - Form validation handling
|
|
14
|
+
* - Success event handling
|
|
15
|
+
* - Dialog handling
|
|
16
|
+
* - Field helper methods
|
|
17
|
+
*/
|
|
18
|
+
export declare function techlifyFormContract(options: TechlifyFormContractOptions): void;
|
package/lib/base-model/{techlify-form.component.d.ts → techlify-form/techlify-form.component.d.ts}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { UntypedFormGroup } from '@angular/forms';
|
|
2
|
-
import { FormValidatorService } from '
|
|
2
|
+
import { FormValidatorService } from '../../core/form-validator.service';
|
|
3
3
|
import { EventEmitter } from '@angular/core';
|
|
4
|
-
import { TechlifyService } from '
|
|
4
|
+
import { TechlifyService } from '../techlify-service';
|
|
5
5
|
import { MatDialogRef } from '@angular/material/dialog';
|
|
6
|
-
import { AlertService } from '
|
|
6
|
+
import { AlertService } from '../../core/alert.service';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
/**
|
|
9
9
|
* Interface used to ensure we have a consistent structure across our form components
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ComponentFixture } from '@angular/core/testing';
|
|
2
|
-
import { TechlifyListComponent } from '
|
|
2
|
+
import { TechlifyListComponent } from '../techlify-list.component';
|
|
3
3
|
export interface TechlifyListContractOptions {
|
|
4
4
|
getFixture: () => ComponentFixture<any>;
|
|
5
5
|
getComponent: () => TechlifyListComponent;
|
|
@@ -21,10 +21,12 @@ export declare abstract class TechlifyListComponent {
|
|
|
21
21
|
page: number;
|
|
22
22
|
perPage: number;
|
|
23
23
|
lastPage: number;
|
|
24
|
-
isWorking: boolean;
|
|
25
24
|
filterForm: any;
|
|
26
25
|
isViewLoaded: boolean;
|
|
27
26
|
columnConfigs: ColumnConfig[];
|
|
27
|
+
_isWorking: boolean;
|
|
28
|
+
get isWorking(): boolean;
|
|
29
|
+
set isWorking(value: boolean);
|
|
28
30
|
filters: any;
|
|
29
31
|
/**
|
|
30
32
|
* Boolean to turn off, if we don't want to patch filters from route.
|
|
@@ -2,7 +2,7 @@ import { EventEmitter, OnInit, TemplateRef } from '@angular/core';
|
|
|
2
2
|
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
|
|
3
3
|
import { UntypedFormBuilder } from '@angular/forms';
|
|
4
4
|
import { SubscriptionService } from '../subscription.service';
|
|
5
|
-
import { TechlifyFormComponent } from '../../base-model/techlify-form.component';
|
|
5
|
+
import { TechlifyFormComponent } from '../../base-model/techlify-form/techlify-form.component';
|
|
6
6
|
import { FormValidatorService } from '../../core/form-validator.service';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export declare class SubscriptionFormComponent extends TechlifyFormComponent implements OnInit {
|
package/lib/subscription/subscription-package-listing/subscription-package-listing.component.d.ts
CHANGED
|
@@ -14,7 +14,6 @@ export declare class SubscriptionPackageListingComponent extends TechlifyListCom
|
|
|
14
14
|
private dialog;
|
|
15
15
|
private fb;
|
|
16
16
|
displayedColumns: string[];
|
|
17
|
-
isWorking: boolean;
|
|
18
17
|
filterFormGroup: UntypedFormGroup;
|
|
19
18
|
constructor(subscriptionPackageService: SubscriptionPackageService, activatedRoute: ActivatedRoute, filterService: FilterService, router: Router, dialog: MatDialog, fb: UntypedFormBuilder);
|
|
20
19
|
ngOnInit(): void;
|
|
@@ -2,7 +2,7 @@ import { EventEmitter, OnInit, TemplateRef } from '@angular/core';
|
|
|
2
2
|
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
|
|
3
3
|
import { UntypedFormBuilder } from '@angular/forms';
|
|
4
4
|
import { TechlifyViewService } from '../techlify-view.service';
|
|
5
|
-
import { TechlifyFormComponent } from '../../base-model/techlify-form.component';
|
|
5
|
+
import { TechlifyFormComponent } from '../../base-model/techlify-form/techlify-form.component';
|
|
6
6
|
import { FormValidatorService } from '../../core/form-validator.service';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export declare class TechlifyViewFormComponent extends TechlifyFormComponent implements OnInit {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { ActivatedRoute } from '@angular/router';
|
|
3
|
+
import { UserTenantAcceptInvitationService } from './user-tenant-accept-invitation.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class UserTenantAcceptInvitationComponent implements OnInit {
|
|
6
|
+
private activatedRoute;
|
|
7
|
+
private userTenantAcceptInvitationService;
|
|
8
|
+
invitationCode?: string;
|
|
9
|
+
userTenant: any;
|
|
10
|
+
constructor(activatedRoute: ActivatedRoute, userTenantAcceptInvitationService: UserTenantAcceptInvitationService);
|
|
11
|
+
ngOnInit(): void;
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<UserTenantAcceptInvitationComponent, never>;
|
|
13
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<UserTenantAcceptInvitationComponent, "app-user-tenant-accept-invitation", never, {}, {}, never, never, true, never>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TechlifyService } from '../base-model/techlify-service';
|
|
2
|
+
import { HttpService } from '../core/http.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class UserTenantAcceptInvitationService extends TechlifyService {
|
|
5
|
+
constructor(http: HttpService);
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<UserTenantAcceptInvitationService, never>;
|
|
7
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<UserTenantAcceptInvitationService>;
|
|
8
|
+
}
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -202,3 +202,5 @@ export * from './lib/tag/techlify-tagger-tag-form/techlify-tagger-tag-form.compo
|
|
|
202
202
|
export * from './lib/tag/tag.service';
|
|
203
203
|
export * from './lib/techlify-auto-complete-select/techlify-auto-complete-select.component';
|
|
204
204
|
export * from './lib/techlify-currency-pipe/techlify-currency-pipe.directive';
|
|
205
|
+
export * from './lib/user-tenant-accept-invitation/user-tenant-accept-invitation.component';
|
|
206
|
+
export * from './lib/user-tenant-accept-invitation/user-tenant-accept-invitation.service';
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { Directive, EventEmitter, inject, Input, Optional, Output } from '@angular/core';
|
|
2
|
-
import { finalize } from 'rxjs';
|
|
3
|
-
import { AlertService } from '../core/alert.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../core/form-validator.service";
|
|
6
|
-
import * as i2 from "./techlify-service";
|
|
7
|
-
/**
|
|
8
|
-
* Interface used to ensure we have a consistent structure across our form components
|
|
9
|
-
*
|
|
10
|
-
* It also provides some abstraction of repeated code to reduce our codebase size
|
|
11
|
-
*
|
|
12
|
-
* @todo This should be moved to ngx-techlify-core
|
|
13
|
-
*
|
|
14
|
-
* Advantages of this abstract class
|
|
15
|
-
* - Less code, less maintenance, less bugs
|
|
16
|
-
* - more consistent code
|
|
17
|
-
* - comments on more code
|
|
18
|
-
* - save time, save energy
|
|
19
|
-
*/
|
|
20
|
-
export class TechlifyFormComponent {
|
|
21
|
-
constructor(formValidatorService, service) {
|
|
22
|
-
this.formValidatorService = formValidatorService;
|
|
23
|
-
this.service = service;
|
|
24
|
-
//Boolean to denote the form is in API progress
|
|
25
|
-
this.isWorking = false;
|
|
26
|
-
//Array of created multiple entries
|
|
27
|
-
this.createdEntries = [];
|
|
28
|
-
//Boolean to denote if form is in update mode
|
|
29
|
-
this.isUpdate = false;
|
|
30
|
-
//Boolean to denote if form has ability to create multiple entries
|
|
31
|
-
this.isAllowCreateAnother = true;
|
|
32
|
-
//Emits an event once form submit is success
|
|
33
|
-
this.success = new EventEmitter();
|
|
34
|
-
//Injected alert service
|
|
35
|
-
this.alertService = inject(AlertService, { optional: true });
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Submits the form
|
|
39
|
-
* @param model form model optional, if needed to be overriden
|
|
40
|
-
* @returns
|
|
41
|
-
*/
|
|
42
|
-
submit(model) {
|
|
43
|
-
this.form.markAllAsTouched();
|
|
44
|
-
if (!this.service) {
|
|
45
|
-
throw new Error(`${this.constructor.name}: Service is required to submit the form`);
|
|
46
|
-
}
|
|
47
|
-
if (!this.form.valid) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
if (!model) {
|
|
51
|
-
model = this.form.value;
|
|
52
|
-
}
|
|
53
|
-
this.isWorking = true;
|
|
54
|
-
(this.isUpdate ?
|
|
55
|
-
this.service.update(model) :
|
|
56
|
-
this.service.store(model))
|
|
57
|
-
.pipe(finalize(() => this.isWorking = false))
|
|
58
|
-
.subscribe((res) => {
|
|
59
|
-
this.createdEntries.unshift(res?.item);
|
|
60
|
-
if (model?.is_create_another) {
|
|
61
|
-
this.alertService.addAlert('Successfully Created', 'success');
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (this.isUpdate) {
|
|
65
|
-
this.finalisedResponse(res?.item);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
this.finalisedResponse((this.createdEntries.length == 1) ? this.createdEntries[0] : this.createdEntries);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
//Send uniformed finalised response for both form button and dialog
|
|
73
|
-
finalisedResponse(response) {
|
|
74
|
-
this.success.emit(response);
|
|
75
|
-
if (this.dialogRef) {
|
|
76
|
-
this.dialogRef.close(response);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Close the active dialog
|
|
81
|
-
*/
|
|
82
|
-
closeDialog() {
|
|
83
|
-
if (this.createdEntries?.length > 0) {
|
|
84
|
-
this.success.emit(this.createdEntries);
|
|
85
|
-
}
|
|
86
|
-
this.dialogRef.close();
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Resets the value of a field in the HTML form
|
|
90
|
-
*
|
|
91
|
-
* @param event
|
|
92
|
-
* @param field
|
|
93
|
-
*/
|
|
94
|
-
resetFieldValue(event, field) {
|
|
95
|
-
this.form?.get(field)?.setValue('');
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Retrieves the value of a field from the HTML form
|
|
99
|
-
*
|
|
100
|
-
* @param field
|
|
101
|
-
* @returns
|
|
102
|
-
*/
|
|
103
|
-
getFieldValue(field) {
|
|
104
|
-
return this.form?.get(field)?.value;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Method to evaluate form fields
|
|
108
|
-
* */
|
|
109
|
-
isFieldValid(field) {
|
|
110
|
-
return this.formValidatorService.isFieldValid(field, this.form);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Method to find error in form fields
|
|
114
|
-
* */
|
|
115
|
-
getErrorMessage(field) {
|
|
116
|
-
return this.formValidatorService.getErrorMessage(field, this.form, this.errorMessages);
|
|
117
|
-
}
|
|
118
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyFormComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.TechlifyService, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
119
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TechlifyFormComponent, inputs: { isUpdate: "isUpdate", isAllowCreateAnother: "isAllowCreateAnother" }, outputs: { success: "success" }, ngImport: i0 }); }
|
|
120
|
-
}
|
|
121
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TechlifyFormComponent, decorators: [{
|
|
122
|
-
type: Directive
|
|
123
|
-
}], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.TechlifyService, decorators: [{
|
|
124
|
-
type: Optional
|
|
125
|
-
}] }], propDecorators: { isUpdate: [{
|
|
126
|
-
type: Input
|
|
127
|
-
}], isAllowCreateAnother: [{
|
|
128
|
-
type: Input
|
|
129
|
-
}], success: [{
|
|
130
|
-
type: Output
|
|
131
|
-
}] } });
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2Jhc2UtbW9kZWwvdGVjaGxpZnktZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBRXJEOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE1BQU0sT0FBZ0IscUJBQXFCO0lBNkJ6QyxZQUNZLG9CQUEwQyxFQUM5QixPQUF5QjtRQURyQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzlCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBdkJqRCwrQ0FBK0M7UUFDL0MsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUszQixtQ0FBbUM7UUFDbkMsbUJBQWMsR0FBUSxFQUFFLENBQUM7UUFFekIsNkNBQTZDO1FBQ3BDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbkMsa0VBQWtFO1FBQ3pELHlCQUFvQixHQUFZLElBQUksQ0FBQztRQUU5Qyw0Q0FBNEM7UUFDbEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFNUMsd0JBQXdCO1FBQ2QsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFNbEUsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBVztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLDBDQUEwQyxDQUNuRSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQzVCO2FBQ0UsSUFBSSxDQUNILFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUN2QzthQUNBLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2QyxJQUFJLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDOUQsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMzRyxDQUFDO1FBRUgsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLGlCQUFpQixDQUFDLFFBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsS0FBVSxFQUFFLEtBQWE7UUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7U0FFSztJQUNMLFlBQVksQ0FBQyxLQUFhO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7U0FFSztJQUNMLGVBQWUsQ0FBQyxLQUFhO1FBQzNCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDekYsQ0FBQzsrR0E5SG1CLHFCQUFxQjttR0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQUQxQyxTQUFTOzswQkFnQ0wsUUFBUTt5Q0FiRixRQUFRO3NCQUFoQixLQUFLO2dCQUdHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFHSSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1WYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9mb3JtLXZhbGlkYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPcHRpb25hbCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZWNobGlmeVNlcnZpY2UgfSBmcm9tICcuL3RlY2hsaWZ5LXNlcnZpY2UnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL2FsZXJ0LnNlcnZpY2UnO1xuXG4vKipcbiAqIEludGVyZmFjZSB1c2VkIHRvIGVuc3VyZSB3ZSBoYXZlIGEgY29uc2lzdGVudCBzdHJ1Y3R1cmUgYWNyb3NzIG91ciBmb3JtIGNvbXBvbmVudHNcbiAqXG4gKiBJdCBhbHNvIHByb3ZpZGVzIHNvbWUgYWJzdHJhY3Rpb24gb2YgcmVwZWF0ZWQgY29kZSB0byByZWR1Y2Ugb3VyIGNvZGViYXNlIHNpemVcbiAqXG4gKiBAdG9kbyBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBuZ3gtdGVjaGxpZnktY29yZVxuICpcbiAqIEFkdmFudGFnZXMgb2YgdGhpcyBhYnN0cmFjdCBjbGFzc1xuICogLSBMZXNzIGNvZGUsIGxlc3MgbWFpbnRlbmFuY2UsIGxlc3MgYnVnc1xuICogLSBtb3JlIGNvbnNpc3RlbnQgY29kZVxuICogLSBjb21tZW50cyBvbiBtb3JlIGNvZGVcbiAqIC0gc2F2ZSB0aW1lLCBzYXZlIGVuZXJneVxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUZWNobGlmeUZvcm1Db21wb25lbnQge1xuXG4gIC8vRm9ybSBidWlsZGVyIGluc3RhbmNlXG4gIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgLy9FcnJvciBtZXNzYWdlcyBjb25maWcgZm9yIHRoZSBmb3JtXG4gIGVycm9yTWVzc2FnZXM6IGFueTtcblxuICAvL0Jvb2xlYW4gdG8gZGVub3RlIHRoZSBmb3JtIGlzIGluIEFQSSBwcm9ncmVzc1xuICBpc1dvcmtpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvL0Zvcm0gZGlhbG9ncmVmIHJlZmVyZW5jZVxuICBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnksIGFueT47XG5cbiAgLy9BcnJheSBvZiBjcmVhdGVkIG11bHRpcGxlIGVudHJpZXNcbiAgY3JlYXRlZEVudHJpZXM6IGFueSA9IFtdO1xuXG4gIC8vQm9vbGVhbiB0byBkZW5vdGUgaWYgZm9ybSBpcyBpbiB1cGRhdGUgbW9kZVxuICBASW5wdXQoKSBpc1VwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vQm9vbGVhbiB0byBkZW5vdGUgaWYgZm9ybSBoYXMgYWJpbGl0eSB0byBjcmVhdGUgbXVsdGlwbGUgZW50cmllc1xuICBASW5wdXQoKSBpc0FsbG93Q3JlYXRlQW5vdGhlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy9FbWl0cyBhbiBldmVudCBvbmNlIGZvcm0gc3VibWl0IGlzIHN1Y2Nlc3NcbiAgQE91dHB1dCgpIHN1Y2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvL0luamVjdGVkIGFsZXJ0IHNlcnZpY2VcbiAgcHJvdGVjdGVkIGFsZXJ0U2VydmljZSA9IGluamVjdChBbGVydFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1WYWxpZGF0b3JTZXJ2aWNlOiBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgc2VydmljZT86IFRlY2hsaWZ5U2VydmljZSkge1xuXG4gIH1cbiAgLyoqXG4gICAqIFN1Ym1pdHMgdGhlIGZvcm1cbiAgICogQHBhcmFtIG1vZGVsIGZvcm0gbW9kZWwgb3B0aW9uYWwsIGlmIG5lZWRlZCB0byBiZSBvdmVycmlkZW5cbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdWJtaXQobW9kZWw/OiBhbnkpIHtcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIGlmICghdGhpcy5zZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX06IFNlcnZpY2UgaXMgcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBmb3JtYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgbW9kZWwgPSB0aGlzLmZvcm0udmFsdWU7XG4gICAgfVxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICAoXG4gICAgICB0aGlzLmlzVXBkYXRlID9cbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZShtb2RlbCkgOlxuICAgICAgICB0aGlzLnNlcnZpY2Uuc3RvcmUobW9kZWwpXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNXb3JraW5nID0gZmFsc2UpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jcmVhdGVkRW50cmllcy51bnNoaWZ0KHJlcz8uaXRlbSk7XG4gICAgICAgIGlmIChtb2RlbD8uaXNfY3JlYXRlX2Fub3RoZXIpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnU3VjY2Vzc2Z1bGx5IENyZWF0ZWQnLCAnc3VjY2VzcycpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZSkge1xuICAgICAgICAgIHRoaXMuZmluYWxpc2VkUmVzcG9uc2UocmVzPy5pdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXNlZFJlc3BvbnNlKCh0aGlzLmNyZWF0ZWRFbnRyaWVzLmxlbmd0aCA9PSAxKSA/IHRoaXMuY3JlYXRlZEVudHJpZXNbMF0gOiB0aGlzLmNyZWF0ZWRFbnRyaWVzKTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgfVxuXG4gIC8vU2VuZCB1bmlmb3JtZWQgZmluYWxpc2VkIHJlc3BvbnNlIGZvciBib3RoIGZvcm0gYnV0dG9uIGFuZCBkaWFsb2dcbiAgZmluYWxpc2VkUmVzcG9uc2UocmVzcG9uc2U6IGFueSkge1xuICAgIHRoaXMuc3VjY2Vzcy5lbWl0KHJlc3BvbnNlKTtcbiAgICBpZiAodGhpcy5kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJlc3BvbnNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGFjdGl2ZSBkaWFsb2dcbiAgICovXG4gIGNsb3NlRGlhbG9nKCkge1xuICAgIGlmICh0aGlzLmNyZWF0ZWRFbnRyaWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnN1Y2Nlc3MuZW1pdCh0aGlzLmNyZWF0ZWRFbnRyaWVzKTtcbiAgICB9XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHZhbHVlIG9mIGEgZmllbGQgaW4gdGhlIEhUTUwgZm9ybVxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIGZpZWxkXG4gICAqL1xuICByZXNldEZpZWxkVmFsdWUoZXZlbnQ6IGFueSwgZmllbGQ6IHN0cmluZykge1xuICAgIHRoaXMuZm9ybT8uZ2V0KGZpZWxkKT8uc2V0VmFsdWUoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBmaWVsZCBmcm9tIHRoZSBIVE1MIGZvcm1cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRGaWVsZFZhbHVlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtPy5nZXQoZmllbGQpPy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZXZhbHVhdGUgZm9ybSBmaWVsZHNcbiAgICogKi9cbiAgaXNGaWVsZFZhbGlkKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5pc0ZpZWxkVmFsaWQoZmllbGQsIHRoaXMuZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGZpbmQgZXJyb3IgaW4gZm9ybSBmaWVsZHNcbiAgICogKi9cbiAgZ2V0RXJyb3JNZXNzYWdlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5nZXRFcnJvck1lc3NhZ2UoZmllbGQsIHRoaXMuZm9ybSwgdGhpcy5lcnJvck1lc3NhZ2VzKTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { fakeAsync, tick } from '@angular/core/testing';
|
|
2
|
-
export function techlifyListContract(options) {
|
|
3
|
-
describe('TechlifyListComponent Contract', () => {
|
|
4
|
-
it('should pass a service to the base class', () => {
|
|
5
|
-
const component = options.getComponent();
|
|
6
|
-
expect(component.service).toBe(options.getService());
|
|
7
|
-
});
|
|
8
|
-
it('should have a filter form', () => {
|
|
9
|
-
const component = options.getComponent();
|
|
10
|
-
expect(component.filterForm).toBeTruthy();
|
|
11
|
-
});
|
|
12
|
-
it('should call loadData on init', () => {
|
|
13
|
-
const component = options.getComponent();
|
|
14
|
-
spyOn(component, 'loadData');
|
|
15
|
-
component.ngOnInit();
|
|
16
|
-
expect(component.loadData).toHaveBeenCalled();
|
|
17
|
-
});
|
|
18
|
-
it('should patch filters from route on init', () => {
|
|
19
|
-
const component = options.getComponent();
|
|
20
|
-
spyOn(component, 'patchFiltersFromRoute');
|
|
21
|
-
component.ngOnInit();
|
|
22
|
-
expect(component.patchFiltersFromRoute).toHaveBeenCalled();
|
|
23
|
-
});
|
|
24
|
-
it('should reload when filter changes', fakeAsync(() => {
|
|
25
|
-
const component = options.getComponent();
|
|
26
|
-
const filterField = options.filterField ?? 'search';
|
|
27
|
-
if (!component.filterForm?.contains(filterField)) {
|
|
28
|
-
pending(`Filter '${filterField}' does not exist.`);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
spyOn(component, 'reload');
|
|
32
|
-
component.listenFilterChanges();
|
|
33
|
-
component.filterForm.get(filterField)?.setValue('abc');
|
|
34
|
-
tick(501);
|
|
35
|
-
expect(component.reload).toHaveBeenCalled();
|
|
36
|
-
}));
|
|
37
|
-
it('should load next page on scroll', () => {
|
|
38
|
-
const component = options.getComponent();
|
|
39
|
-
component.page = 1;
|
|
40
|
-
component.lastPage = 3;
|
|
41
|
-
component.isWorking = false;
|
|
42
|
-
spyOn(component, 'loadData');
|
|
43
|
-
component.onScroll();
|
|
44
|
-
expect(component.page).toBe(2);
|
|
45
|
-
expect(component.loadData).toHaveBeenCalled();
|
|
46
|
-
});
|
|
47
|
-
it('should not load next page while already loading', () => {
|
|
48
|
-
const component = options.getComponent();
|
|
49
|
-
component.page = 1;
|
|
50
|
-
component.lastPage = 3;
|
|
51
|
-
component.isWorking = true;
|
|
52
|
-
spyOn(component, 'loadData');
|
|
53
|
-
component.onScroll();
|
|
54
|
-
expect(component.loadData).not.toHaveBeenCalled();
|
|
55
|
-
});
|
|
56
|
-
it('should update sort_by filter', () => {
|
|
57
|
-
const component = options.getComponent();
|
|
58
|
-
const control = component.filterForm.get('sort_by');
|
|
59
|
-
if (!control) {
|
|
60
|
-
pending('No sort_by control.');
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
spyOn(control, 'setValue');
|
|
64
|
-
component.sortColumn({ active: 'name', direction: 'asc' });
|
|
65
|
-
expect(control.setValue).toHaveBeenCalledWith('name|ASC');
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaGxpZnktbGlzdC5jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jb3JlL3NyYy9saWIvYmFzZS1tb2RlbC90ZWNobGlmeS1saXN0L3RlY2hsaWZ5LWxpc3QuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQW9CLE1BQU0sdUJBQXVCLENBQUM7QUFVMUUsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxPQUFvQztJQUVwQyxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1FBQzVDLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBRSxTQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7WUFDakMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3BDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QyxLQUFLLENBQUMsU0FBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNuQyxTQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRCxD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LENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzNELE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFFUCxDQUFDLENBQUMsQ0FBQztBQUVQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmYWtlQXN5bmMsIHRpY2ssIENvbXBvbmVudEZpeHR1cmUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3Rlc3RpbmcnO1xuaW1wb3J0IHsgVGVjaGxpZnlMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi90ZWNobGlmeS1saXN0LmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVjaGxpZnlMaXN0Q29udHJhY3RPcHRpb25zIHtcbiAgICBnZXRGaXh0dXJlOiAoKSA9PiBDb21wb25lbnRGaXh0dXJlPGFueT47XG4gICAgZ2V0Q29tcG9uZW50OiAoKSA9PiBUZWNobGlmeUxpc3RDb21wb25lbnQ7XG4gICAgZ2V0U2VydmljZTogKCkgPT4gYW55O1xuICAgIGZpbHRlckZpZWxkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVjaGxpZnlMaXN0Q29udHJhY3QoXG4gICAgb3B0aW9uczogVGVjaGxpZnlMaXN0Q29udHJhY3RPcHRpb25zXG4pOiB2b2lkIHtcbiAgICBkZXNjcmliZSgnVGVjaGxpZnlMaXN0Q29tcG9uZW50IENvbnRyYWN0JywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHBhc3MgYSBzZXJ2aWNlIHRvIHRoZSBiYXNlIGNsYXNzJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGV4cGVjdCgoY29tcG9uZW50IGFzIGFueSkuc2VydmljZSkudG9CZShvcHRpb25zLmdldFNlcnZpY2UoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGF2ZSBhIGZpbHRlciBmb3JtJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGV4cGVjdChjb21wb25lbnQuZmlsdGVyRm9ybSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNhbGwgbG9hZERhdGEgb24gaW5pdCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG9wdGlvbnMuZ2V0Q29tcG9uZW50KCk7XG4gICAgICAgICAgICBzcHlPbihjb21wb25lbnQgYXMgYW55LCAnbG9hZERhdGEnKTtcbiAgICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5uZ09uSW5pdCgpO1xuICAgICAgICAgICAgZXhwZWN0KGNvbXBvbmVudC5sb2FkRGF0YSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHBhdGNoIGZpbHRlcnMgZnJvbSByb3V0ZSBvbiBpbml0JywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIHNweU9uKGNvbXBvbmVudCBhcyBhbnksICdwYXRjaEZpbHRlcnNGcm9tUm91dGUnKTtcbiAgICAgICAgICAgIChjb21wb25lbnQgYXMgYW55KS5uZ09uSW5pdCgpO1xuICAgICAgICAgICAgZXhwZWN0KGNvbXBvbmVudC5wYXRjaEZpbHRlcnNGcm9tUm91dGUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZWxvYWQgd2hlbiBmaWx0ZXIgY2hhbmdlcycsIGZha2VBc3luYygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBvcHRpb25zLmdldENvbXBvbmVudCgpO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRmllbGQgPSBvcHRpb25zLmZpbHRlckZpZWxkID8/ICdzZWFyY2gnO1xuICAgICAgICAgICAgaWYgKCFjb21wb25lbnQuZmlsdGVyRm9ybT8uY29udGFpbnMoZmlsdGVyRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZyhgRmlsdGVyICcke2ZpbHRlckZpZWxkfScgZG9lcyBub3QgZXhpc3QuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3B5T24oY29tcG9uZW50IGFzIGFueSwgJ3JlbG9hZCcpO1xuICAgICAgICAgICAgY29tcG9uZW50Lmxpc3RlbkZpbHRlckNoYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5maWx0ZXJGb3JtLmdldChmaWx0ZXJGaWVsZCk/LnNldFZhbHVlKCdhYmMnKTtcbiAgICAgICAgICAgIHRpY2soNTAxKTtcbiAgICAgICAgICAgIGV4cGVjdChjb21wb25lbnQucmVsb2FkKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGl0KCdzaG91bGQgbG9hZCBuZXh0IHBhZ2Ugb24gc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5wYWdlID0gMTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5sYXN0UGFnZSA9IDM7XG4gICAgICAgICAgICBjb21wb25lbnQuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgICAgICBzcHlPbihjb21wb25lbnQgYXMgYW55LCAnbG9hZERhdGEnKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vblNjcm9sbCgpO1xuICAgICAgICAgICAgZXhwZWN0KGNvbXBvbmVudC5wYWdlKS50b0JlKDIpO1xuICAgICAgICAgICAgZXhwZWN0KGNvbXBvbmVudC5sb2FkRGF0YSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIG5vdCBsb2FkIG5leHQgcGFnZSB3aGlsZSBhbHJlYWR5IGxvYWRpbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBvcHRpb25zLmdldENvbXBvbmVudCgpO1xuICAgICAgICAgICAgY29tcG9uZW50LnBhZ2UgPSAxO1xuICAgICAgICAgICAgY29tcG9uZW50Lmxhc3RQYWdlID0gMztcbiAgICAgICAgICAgIGNvbXBvbmVudC5pc1dvcmtpbmcgPSB0cnVlO1xuICAgICAgICAgICAgc3B5T24oY29tcG9uZW50IGFzIGFueSwgJ2xvYWREYXRhJyk7XG4gICAgICAgICAgICBjb21wb25lbnQub25TY3JvbGwoKTtcbiAgICAgICAgICAgIGV4cGVjdChjb21wb25lbnQubG9hZERhdGEpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIHNvcnRfYnkgZmlsdGVyJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gb3B0aW9ucy5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjb21wb25lbnQuZmlsdGVyRm9ybS5nZXQoJ3NvcnRfYnknKTtcbiAgICAgICAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICAgICAgICAgIHBlbmRpbmcoJ05vIHNvcnRfYnkgY29udHJvbC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcHlPbihjb250cm9sLCAnc2V0VmFsdWUnKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zb3J0Q29sdW1uKHsgYWN0aXZlOiAnbmFtZScsIGRpcmVjdGlvbjogJ2FzYycgfSk7XG4gICAgICAgICAgICBleHBlY3QoY29udHJvbC5zZXRWYWx1ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ25hbWV8QVNDJyk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbn0iXX0=
|