ngx-material-entity 0.1.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/CONTRIBUTING.md +93 -0
- package/LICENSE.md +21 -0
- package/README.md +691 -0
- package/classes/entity-model.class.d.ts +9 -0
- package/classes/entity-service.class.d.ts +56 -0
- package/classes/entity-utilities.class.d.ts +95 -0
- package/components/confirm-dialog/confirm-dialog-data.d.ts +41 -0
- package/components/confirm-dialog/confirm-dialog.component.d.ts +18 -0
- package/components/confirm-dialog/confirm-dialog.module.d.ts +12 -0
- package/components/get-validation-error-message.function.d.ts +7 -0
- package/components/input/array-table/add-array-item-dialog/add-array-item-dialog.component.d.ts +35 -0
- package/components/input/array-table/add-array-item-dialog/add-array-item-dialog.module.d.ts +12 -0
- package/components/input/array-table/array-table.component.d.ts +34 -0
- package/components/input/array-table/array-table.module.d.ts +19 -0
- package/components/input/input.component.d.ts +73 -0
- package/components/input/input.module.d.ts +18 -0
- package/components/input/internal-input/internal-input.component.d.ts +57 -0
- package/components/input/internal-input/internal-input.module.d.ts +16 -0
- package/components/table/create-dialog/create-entity-dialog-data.d.ts +21 -0
- package/components/table/create-dialog/create-entity-dialog.component.d.ts +25 -0
- package/components/table/create-dialog/create-entity-dialog.module.d.ts +12 -0
- package/components/table/edit-dialog/edit-entity-dialog-data.d.ts +25 -0
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +28 -0
- package/components/table/edit-dialog/edit-entity-dialog.module.d.ts +13 -0
- package/components/table/table-data.d.ts +184 -0
- package/components/table/table.component.d.ts +41 -0
- package/components/table/table.module.d.ts +17 -0
- package/decorators/array.decorator.d.ts +125 -0
- package/decorators/base/base-property.decorator.d.ts +9 -0
- package/decorators/base/decorator-types.enum.d.ts +28 -0
- package/decorators/base/property-decorator-config.interface.d.ts +50 -0
- package/decorators/boolean.decorator.d.ts +42 -0
- package/decorators/number.decorator.d.ts +40 -0
- package/decorators/object.decorator.d.ts +27 -0
- package/decorators/string.decorator.d.ts +76 -0
- package/esm2020/classes/entity-model.class.mjs +19 -0
- package/esm2020/classes/entity-service.class.mjs +70 -0
- package/esm2020/classes/entity-utilities.class.mjs +296 -0
- package/esm2020/components/confirm-dialog/confirm-dialog-data.mjs +2 -0
- package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +51 -0
- package/esm2020/components/confirm-dialog/confirm-dialog.module.mjs +22 -0
- package/esm2020/components/get-validation-error-message.function.mjs +32 -0
- package/esm2020/components/input/array-table/add-array-item-dialog/add-array-item-dialog.component.mjs +43 -0
- package/esm2020/components/input/array-table/add-array-item-dialog/add-array-item-dialog.module.mjs +22 -0
- package/esm2020/components/input/array-table/array-table.component.mjs +116 -0
- package/esm2020/components/input/array-table/array-table.module.mjs +66 -0
- package/esm2020/components/input/input.component.mjs +158 -0
- package/esm2020/components/input/input.module.mjs +62 -0
- package/esm2020/components/input/internal-input/internal-input.component.mjs +73 -0
- package/esm2020/components/input/internal-input/internal-input.module.mjs +54 -0
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +2 -0
- package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +77 -0
- package/esm2020/components/table/create-dialog/create-entity-dialog.module.mjs +22 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +2 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +112 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.module.mjs +42 -0
- package/esm2020/components/table/table-data.mjs +2 -0
- package/esm2020/components/table/table.component.mjs +232 -0
- package/esm2020/components/table/table.module.mjs +58 -0
- package/esm2020/decorators/array.decorator.mjs +70 -0
- package/esm2020/decorators/base/base-property.decorator.mjs +13 -0
- package/esm2020/decorators/base/decorator-types.enum.mjs +20 -0
- package/esm2020/decorators/base/property-decorator-config.interface.mjs +31 -0
- package/esm2020/decorators/boolean.decorator.mjs +44 -0
- package/esm2020/decorators/number.decorator.mjs +36 -0
- package/esm2020/decorators/object.decorator.mjs +23 -0
- package/esm2020/decorators/string.decorator.mjs +61 -0
- package/esm2020/ngx-material-entity.mjs +5 -0
- package/esm2020/public-api.mjs +32 -0
- package/fesm2015/ngx-material-entity.mjs +1786 -0
- package/fesm2015/ngx-material-entity.mjs.map +1 -0
- package/fesm2020/ngx-material-entity.mjs +1760 -0
- package/fesm2020/ngx-material-entity.mjs.map +1 -0
- package/ngx-material-entity.d.ts +5 -0
- package/package.json +40 -0
- package/public-api.d.ts +25 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { BehaviorSubject, firstValueFrom } from 'rxjs';
|
|
2
|
+
import { isNil, omit, omitBy } from 'lodash';
|
|
3
|
+
import { EntityUtilities } from './entity-utilities.class';
|
|
4
|
+
/**
|
|
5
|
+
* A generic EntityService class.
|
|
6
|
+
* Offers basic CRUD-functionality.
|
|
7
|
+
* You should create a service for every Entity you have.
|
|
8
|
+
* If you extend from this you need to make sure that the extended Service can be injected.
|
|
9
|
+
*/
|
|
10
|
+
export class EntityService {
|
|
11
|
+
constructor(http) {
|
|
12
|
+
this.http = http;
|
|
13
|
+
/**
|
|
14
|
+
* a subject of all the entity values.
|
|
15
|
+
* Can be subscribed to when you want to do a specific thing whenever the entities change.
|
|
16
|
+
*/
|
|
17
|
+
this.entitiesSubject = new BehaviorSubject([]);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* gets the entities in an array from the internal entitiesSubject
|
|
21
|
+
*/
|
|
22
|
+
get entities() {
|
|
23
|
+
return this.entitiesSubject.value;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new Entity and pushes it to the entities array
|
|
27
|
+
* @param entity The data of the entity to create.
|
|
28
|
+
* All values that should be omitted will be removed from it inside this method.
|
|
29
|
+
* @returns A Promise of the created entity
|
|
30
|
+
*/
|
|
31
|
+
async create(entity) {
|
|
32
|
+
const body = omit(entity, EntityUtilities.getOmitForCreate(entity));
|
|
33
|
+
const e = await firstValueFrom(this.http.post(this.baseUrl, body));
|
|
34
|
+
this.entities.push(e);
|
|
35
|
+
this.entitiesSubject.next(this.entities);
|
|
36
|
+
return e;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Gets all existing entities and pushes them to the entites array
|
|
40
|
+
* @returns A Promise of all received Entities
|
|
41
|
+
*/
|
|
42
|
+
async read() {
|
|
43
|
+
const e = await firstValueFrom(this.http.get(this.baseUrl));
|
|
44
|
+
this.entitiesSubject.next(e);
|
|
45
|
+
return e;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Updates a specific Entity
|
|
49
|
+
* @param entity The updated Entity
|
|
50
|
+
* All values that should be omitted will be removed from it inside this method.
|
|
51
|
+
* @param entityPriorChanges The current Entity.
|
|
52
|
+
* It Is used to get changed values and only update them instead of sending the whole entity data
|
|
53
|
+
*/
|
|
54
|
+
async update(entity, entityPriorChanges) {
|
|
55
|
+
const reqBody = omit(EntityUtilities.difference(entity, entityPriorChanges), EntityUtilities.getOmitForUpdate(entity));
|
|
56
|
+
const updatedEntity = await firstValueFrom(this.http.patch(`${this.baseUrl}/${entityPriorChanges.id}`, omitBy(reqBody, isNil)));
|
|
57
|
+
this.entities[this.entities.findIndex((e) => e.id === entityPriorChanges.id)] = updatedEntity;
|
|
58
|
+
this.entitiesSubject.next(this.entities);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Method to delete a specific Entity
|
|
62
|
+
* @param id The id of the element to delete
|
|
63
|
+
*/
|
|
64
|
+
async delete(id) {
|
|
65
|
+
await firstValueFrom(this.http.delete(`${this.baseUrl}/${id}`));
|
|
66
|
+
this.entities.splice(this.entities.findIndex((e) => e.id === id), 1);
|
|
67
|
+
this.entitiesSubject.next(this.entities);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXNlcnZpY2UuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jbGFzc2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFM0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQWdCLGFBQWE7SUF3Qi9CLFlBQTZCLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFiN0M7OztXQUdHO1FBQ00sb0JBQWUsR0FBa0MsSUFBSSxlQUFlLENBQWUsRUFBRSxDQUFDLENBQUM7SUFTaEQsQ0FBQztJQVBqRDs7T0FFRztJQUNILElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUlEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFrQjtRQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFhLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDTixNQUFNLENBQUMsR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBZSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWtCLEVBQUUsa0JBQThCO1FBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FDaEIsZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsRUFDdEQsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUMzQyxDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsTUFBTSxjQUFjLENBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUNYLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsRUFDMUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FDekIsQ0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUM5RixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBVTtRQUNuQixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQ2pELENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5IH0gZnJvbSAnLi9lbnRpdHktbW9kZWwuY2xhc3MnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzTmlsLCBvbWl0LCBvbWl0QnkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRW50aXR5VXRpbGl0aWVzIH0gZnJvbSAnLi9lbnRpdHktdXRpbGl0aWVzLmNsYXNzJztcblxuLyoqXG4gKiBBIGdlbmVyaWMgRW50aXR5U2VydmljZSBjbGFzcy5cbiAqIE9mZmVycyBiYXNpYyBDUlVELWZ1bmN0aW9uYWxpdHkuXG4gKiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIHNlcnZpY2UgZm9yIGV2ZXJ5IEVudGl0eSB5b3UgaGF2ZS5cbiAqIElmIHlvdSBleHRlbmQgZnJvbSB0aGlzIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBleHRlbmRlZCBTZXJ2aWNlIGNhbiBiZSBpbmplY3RlZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZSBleHRlbmRzIEVudGl0eT4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIHVybCB1c2VkIGZvciBhcGkgcmVxdWVzdHMuIElmIHUgd2FudCB0byBoYXZlIG1vcmUgY29udHJvbCBvdmVyIHRoaXMsXG4gICAgICogeW91IGNhbiBvdmVycmlkZSB0aGUgY3JlYXRlLCByZWFkLCB1cGRhdGUgYW5kIGRlbGV0ZSBtZXRob2RzLlxuICAgICAqIEBjcmVhdGUgU2VuZHMgYSBQT1NULVJlcXVlc3QgdG8gYmFzZVVybFxuICAgICAqIEByZWFkIFNlbmRzIGEgR0VULVJlcXVlc3QgdG8gYmFzZVVybFxuICAgICAqIEB1cGRhdGUgU2VuZHMgYSBQQVRDSC1SZXF1ZXN0IHRvIGJhc2VVcmwve2lkfVxuICAgICAqIEBkZWxldGUgU2VuZHMgYSBERUwtUmVxdWVzdCB0byBiYXNlVXJsL3tpZH1cbiAgICAgKi9cbiAgICBhYnN0cmFjdCByZWFkb25seSBiYXNlVXJsOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBhIHN1YmplY3Qgb2YgYWxsIHRoZSBlbnRpdHkgdmFsdWVzLlxuICAgICAqIENhbiBiZSBzdWJzY3JpYmVkIHRvIHdoZW4geW91IHdhbnQgdG8gZG8gYSBzcGVjaWZpYyB0aGluZyB3aGVuZXZlciB0aGUgZW50aXRpZXMgY2hhbmdlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudGl0aWVzU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEVudGl0eVR5cGVbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVudGl0eVR5cGVbXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICogZ2V0cyB0aGUgZW50aXRpZXMgaW4gYW4gYXJyYXkgZnJvbSB0aGUgaW50ZXJuYWwgZW50aXRpZXNTdWJqZWN0XG4gICAgICovXG4gICAgZ2V0IGVudGl0aWVzKCk6IEVudGl0eVR5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEVudGl0eSBhbmQgcHVzaGVzIGl0IHRvIHRoZSBlbnRpdGllcyBhcnJheVxuICAgICAqIEBwYXJhbSBlbnRpdHkgVGhlIGRhdGEgb2YgdGhlIGVudGl0eSB0byBjcmVhdGUuXG4gICAgICogQWxsIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBvbWl0dGVkIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGl0IGluc2lkZSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2Ugb2YgdGhlIGNyZWF0ZWQgZW50aXR5XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8RW50aXR5VHlwZT4ge1xuICAgICAgICBjb25zdCBib2R5ID0gb21pdChlbnRpdHksIEVudGl0eVV0aWxpdGllcy5nZXRPbWl0Rm9yQ3JlYXRlKGVudGl0eSkpO1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnBvc3Q8RW50aXR5VHlwZT4odGhpcy5iYXNlVXJsLCBib2R5KSk7XG4gICAgICAgIHRoaXMuZW50aXRpZXMucHVzaChlKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N1YmplY3QubmV4dCh0aGlzLmVudGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgZXhpc3RpbmcgZW50aXRpZXMgYW5kIHB1c2hlcyB0aGVtIHRvIHRoZSBlbnRpdGVzIGFycmF5XG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIG9mIGFsbCByZWNlaXZlZCBFbnRpdGllc1xuICAgICAqL1xuICAgIGFzeW5jIHJlYWQoKTogUHJvbWlzZTxFbnRpdHlUeXBlW10+IHtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8RW50aXR5VHlwZVtdPih0aGlzLmJhc2VVcmwpKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N1YmplY3QubmV4dChlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHNwZWNpZmljIEVudGl0eVxuICAgICAqIEBwYXJhbSBlbnRpdHkgVGhlIHVwZGF0ZWQgRW50aXR5XG4gICAgICogQWxsIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBvbWl0dGVkIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGl0IGluc2lkZSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIFRoZSBjdXJyZW50IEVudGl0eS5cbiAgICAgKiBJdCBJcyB1c2VkIHRvIGdldCBjaGFuZ2VkIHZhbHVlcyBhbmQgb25seSB1cGRhdGUgdGhlbSBpbnN0ZWFkIG9mIHNlbmRpbmcgdGhlIHdob2xlIGVudGl0eSBkYXRhXG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlKGVudGl0eTogRW50aXR5VHlwZSwgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcUJvZHkgPSBvbWl0KFxuICAgICAgICAgICAgRW50aXR5VXRpbGl0aWVzLmRpZmZlcmVuY2UoZW50aXR5LCBlbnRpdHlQcmlvckNoYW5nZXMpLFxuICAgICAgICAgICAgRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JVcGRhdGUoZW50aXR5KVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB1cGRhdGVkRW50aXR5ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aGlzLmh0dHAucGF0Y2g8RW50aXR5VHlwZT4oXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS8ke2VudGl0eVByaW9yQ2hhbmdlcy5pZH1gLFxuICAgICAgICAgICAgICAgIG9taXRCeShyZXFCb2R5LCBpc05pbClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1t0aGlzLmVudGl0aWVzLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gZW50aXR5UHJpb3JDaGFuZ2VzLmlkKV0gPSB1cGRhdGVkRW50aXR5O1xuICAgICAgICB0aGlzLmVudGl0aWVzU3ViamVjdC5uZXh0KHRoaXMuZW50aXRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCB0byBkZWxldGUgYSBzcGVjaWZpYyBFbnRpdHlcbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGRlbGV0ZVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5kZWxldGU8dm9pZD4oYCR7dGhpcy5iYXNlVXJsfS8ke2lkfWApKTtcbiAgICAgICAgdGhpcy5lbnRpdGllcy5zcGxpY2UoXG4gICAgICAgICAgICB0aGlzLmVudGl0aWVzLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gaWQpLCAxXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNTdWJqZWN0Lm5leHQodGhpcy5lbnRpdGllcyk7XG4gICAgfVxufSJdfQ==
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { isEqual } from 'lodash';
|
|
3
|
+
import { DecoratorTypes } from '../decorators/base/decorator-types.enum';
|
|
4
|
+
/**
|
|
5
|
+
* Contains HelperMethods around handling Entities and their property-metadata
|
|
6
|
+
*/
|
|
7
|
+
export class EntityUtilities {
|
|
8
|
+
/**
|
|
9
|
+
* Gets the properties to omit when updating the entity
|
|
10
|
+
* @returns The properties which should be left out for updating a new Entity
|
|
11
|
+
*/
|
|
12
|
+
static getOmitForUpdate(entity) {
|
|
13
|
+
const res = [];
|
|
14
|
+
for (const key of Reflect.ownKeys(entity)) {
|
|
15
|
+
const metadata = Reflect.getMetadata('metadata', entity, key);
|
|
16
|
+
if (metadata.omitForUpdate) {
|
|
17
|
+
res.push(key);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return res;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Gets the properties to omit when creating new entities
|
|
24
|
+
* @returns The properties which should be left out for creating a new Entity
|
|
25
|
+
*/
|
|
26
|
+
static getOmitForCreate(entity) {
|
|
27
|
+
const res = [];
|
|
28
|
+
for (const key of Reflect.ownKeys(entity)) {
|
|
29
|
+
const metadata = Reflect.getMetadata('metadata', entity, key);
|
|
30
|
+
if (metadata.omitForCreate) {
|
|
31
|
+
res.push(key);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return res;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Gets the metadata included in an property
|
|
38
|
+
* @param entity The entity with the property to get the metadata from
|
|
39
|
+
* @param propertyKey The property on the given Entity to get the metadata from
|
|
40
|
+
* @param type For secure Typing, defines the returned PropertyConfig
|
|
41
|
+
* @returns The metadata of the property
|
|
42
|
+
*/
|
|
43
|
+
static getPropertyMetadata(entity, propertyKey,
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
45
|
+
type) {
|
|
46
|
+
try {
|
|
47
|
+
const metadata = Reflect.getMetadata('metadata', entity, propertyKey);
|
|
48
|
+
if (!metadata) {
|
|
49
|
+
throw new Error(`Could not find metadata for property ${String(propertyKey)}
|
|
50
|
+
on the entity ${JSON.stringify(entity)}`);
|
|
51
|
+
}
|
|
52
|
+
return metadata;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
throw new Error(`Could not find metadata for property ${String(propertyKey)}
|
|
56
|
+
on the entity ${JSON.stringify(entity)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Gets the type of the property-metadata.
|
|
61
|
+
* @param entity The entity with the property to get the type from
|
|
62
|
+
* @param propertyKey The property on the given Entity to get the type from
|
|
63
|
+
* @returns The type of the metadata
|
|
64
|
+
*/
|
|
65
|
+
static getPropertyType(entity, propertyKey) {
|
|
66
|
+
try {
|
|
67
|
+
const propertyType = Reflect.getMetadata('type', entity, propertyKey);
|
|
68
|
+
if (!propertyType) {
|
|
69
|
+
throw new Error(`Could not find type metadata for property ${String(propertyKey)}
|
|
70
|
+
on the entity ${JSON.stringify(entity)}`);
|
|
71
|
+
}
|
|
72
|
+
return propertyType;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new Error(`Could not find type metadata for property ${String(propertyKey)}
|
|
76
|
+
on the entity ${JSON.stringify(entity)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Sets all property values based on a given entity data-object.
|
|
81
|
+
* @param entity The data object to get the property values from.
|
|
82
|
+
* @param target
|
|
83
|
+
* the target object that needs to be constructed
|
|
84
|
+
* (if called inside a Entity constructor its usually this)
|
|
85
|
+
* @alias new
|
|
86
|
+
* @alias build
|
|
87
|
+
* @alias construct
|
|
88
|
+
*/
|
|
89
|
+
static new(target, entity) {
|
|
90
|
+
if (entity) {
|
|
91
|
+
for (const key in entity) {
|
|
92
|
+
Reflect.set(target, key, Reflect.get(entity, key));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Checks if the values on an entity are valid.
|
|
98
|
+
* Also checks all the validators given by the metadata ("required", "maxLength" etc.)
|
|
99
|
+
* @param entity The entity to validate.
|
|
100
|
+
* @param omit Whether to check for creatiung or editing validity
|
|
101
|
+
* @returns Whether or not the entity is valid.
|
|
102
|
+
*/
|
|
103
|
+
static isEntityValid(entity, omit) {
|
|
104
|
+
for (const key in entity) {
|
|
105
|
+
if (!this.isPropertyValid(entity, key, omit)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Checks if a single property value is valid
|
|
113
|
+
* @param entity The entity where the property is from
|
|
114
|
+
* @param key The name of the property
|
|
115
|
+
* @returns Whether or not the property value is valid
|
|
116
|
+
*/
|
|
117
|
+
static isPropertyValid(entity, key, omit) {
|
|
118
|
+
const type = this.getPropertyType(entity, key);
|
|
119
|
+
const metadata = this.getPropertyMetadata(entity, key, type);
|
|
120
|
+
const metadataDefaultString = metadata;
|
|
121
|
+
const metadataTextboxString = metadata;
|
|
122
|
+
const metadataAutocompleteString = metadata;
|
|
123
|
+
const metadataDefaultNumber = metadata;
|
|
124
|
+
const objectProperty = entity[key];
|
|
125
|
+
const metadataEntityArray = metadata;
|
|
126
|
+
const arrayItems = entity[key];
|
|
127
|
+
if (metadata.omitForCreate && omit === 'create') {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
if (metadata.omitForUpdate && omit === 'edit') {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
if (metadata.required && !entity[key]) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
switch (type) {
|
|
137
|
+
case DecoratorTypes.STRING:
|
|
138
|
+
if (metadataDefaultString.maxLength
|
|
139
|
+
&& entity[key].length > metadataDefaultString.maxLength) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
if (metadataDefaultString.minLength
|
|
143
|
+
&& entity[key].length < metadataDefaultString.minLength) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (metadataDefaultString.regex
|
|
147
|
+
&& !entity[key].match(metadataDefaultString.regex)) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
break;
|
|
151
|
+
case DecoratorTypes.STRING_AUTOCOMPLETE:
|
|
152
|
+
if (metadataAutocompleteString.maxLength
|
|
153
|
+
&& entity[key].length > metadataAutocompleteString.maxLength) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (metadataAutocompleteString.minLength
|
|
157
|
+
&& entity[key].length < metadataAutocompleteString.minLength) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
if (metadataAutocompleteString.regex
|
|
161
|
+
&& entity[key].match(metadataAutocompleteString.regex)) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
case DecoratorTypes.STRING_TEXTBOX:
|
|
166
|
+
if (metadataTextboxString.maxLength
|
|
167
|
+
&& entity[key].length > metadataTextboxString.maxLength) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
if (metadataTextboxString.minLength
|
|
171
|
+
&& entity[key].length < metadataTextboxString.minLength) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case DecoratorTypes.NUMBER:
|
|
176
|
+
if (metadataDefaultNumber.max && entity[key] > metadataDefaultNumber.max) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
if (metadataDefaultNumber.min && entity[key] > metadataDefaultNumber.min) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
break;
|
|
183
|
+
case DecoratorTypes.OBJECT:
|
|
184
|
+
for (const parameterKey in objectProperty) {
|
|
185
|
+
if (!this.isPropertyValid(objectProperty, parameterKey, omit)) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
case DecoratorTypes.ARRAY_STRING_CHIPS:
|
|
191
|
+
case DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS:
|
|
192
|
+
case DecoratorTypes.ARRAY:
|
|
193
|
+
if (metadataEntityArray.required && !arrayItems.length) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
default:
|
|
198
|
+
throw new Error(`Could not validate the input because the DecoratorType ${type} is not known`);
|
|
199
|
+
}
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Checks if an entity is "dirty" (if its values have changed)
|
|
204
|
+
* @param entity The entity after all changes
|
|
205
|
+
* @param entityPriorChanges The entity before the changes
|
|
206
|
+
* @returns Whether or not the entity is dirty
|
|
207
|
+
*/
|
|
208
|
+
static dirty(entity, entityPriorChanges) {
|
|
209
|
+
if (!entityPriorChanges) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
const diff = this.difference(entity, entityPriorChanges);
|
|
214
|
+
if (JSON.stringify(diff) === '{}') {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Compares two Entities and returns their difference in an object
|
|
224
|
+
* @param entity The first entity to compare
|
|
225
|
+
* @param entityPriorChanges The second entity to compare
|
|
226
|
+
* @returns The difference between the two Entities in form of a Partial
|
|
227
|
+
*/
|
|
228
|
+
static difference(entity, entityPriorChanges) {
|
|
229
|
+
const res = {};
|
|
230
|
+
for (const key in entity) {
|
|
231
|
+
if (!isEqual(entity[key], entityPriorChanges[key])) {
|
|
232
|
+
res[key] = entity[key];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return res;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* compare function for sorting entity keys by their order value
|
|
239
|
+
* @param a first key of entity
|
|
240
|
+
* @param b second key of entity
|
|
241
|
+
* @param entity current entity (used to get metadata of entity keys)
|
|
242
|
+
*/
|
|
243
|
+
static compareOrder(a, b, entity) {
|
|
244
|
+
const metadataA = EntityUtilities.getPropertyMetadata(entity, a, EntityUtilities.getPropertyType(entity, a));
|
|
245
|
+
const metadataB = EntityUtilities.getPropertyMetadata(entity, b, EntityUtilities.getPropertyType(entity, b));
|
|
246
|
+
if (metadataA.order === -1) {
|
|
247
|
+
return 1;
|
|
248
|
+
}
|
|
249
|
+
else if (metadataB.order === -1) {
|
|
250
|
+
return 0;
|
|
251
|
+
}
|
|
252
|
+
return (metadataA.order - metadataB.order);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* gets the bootstrap column values for "lg", "md", "sm"
|
|
256
|
+
* @param entity entity to get the bootstrap column values of the key
|
|
257
|
+
* @param key key of the property to get bootstrap column values from
|
|
258
|
+
* @param type defines for which screensize the column values should be returned
|
|
259
|
+
* @returns bootstrap column value
|
|
260
|
+
*/
|
|
261
|
+
static getWidth(entity, key, type) {
|
|
262
|
+
const propertyType = EntityUtilities.getPropertyType(entity, key);
|
|
263
|
+
const metadata = EntityUtilities.getPropertyMetadata(entity, key, propertyType);
|
|
264
|
+
if (metadata.defaultWidths) {
|
|
265
|
+
switch (type) {
|
|
266
|
+
case 'lg':
|
|
267
|
+
return metadata.defaultWidths[0];
|
|
268
|
+
case 'md':
|
|
269
|
+
return metadata.defaultWidths[1];
|
|
270
|
+
case 'sm':
|
|
271
|
+
return metadata.defaultWidths[2];
|
|
272
|
+
default:
|
|
273
|
+
throw new Error('Something went wrong getting the width');
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
throw new Error('Something went wrong getting the width');
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Resets all changes on an entity
|
|
282
|
+
* @param entity The entity to reset
|
|
283
|
+
* @param entityPriorChanges The entity before any changes
|
|
284
|
+
*/
|
|
285
|
+
static resetChangesOnEntity(entity, entityPriorChanges) {
|
|
286
|
+
for (const key in entityPriorChanges) {
|
|
287
|
+
Reflect.set(entity, key, Reflect.get(entityPriorChanges, key));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
_a = EntityUtilities;
|
|
292
|
+
// eslint-disable-next-line @typescript-eslint/member-ordering
|
|
293
|
+
EntityUtilities.construct = _a.new;
|
|
294
|
+
// eslint-disable-next-line @typescript-eslint/member-ordering
|
|
295
|
+
EntityUtilities.build = _a.new;
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXV0aWxpdGllcy5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NsYXNzZXMvZW50aXR5LXV0aWxpdGllcy5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBT3hGOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixlQUFlO0lBQ2pDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBNEIsTUFBa0I7UUFDakUsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdkMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBNEIsQ0FBQztZQUN6RixJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBdUIsQ0FBQyxDQUFDO2FBQ3JDO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQTRCLE1BQWtCO1FBQ2pFLE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQTRCLENBQUM7WUFDekYsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUN4QixHQUFHLENBQUMsSUFBSSxD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SSxFQUFFO2dCQUNWLEtBQUssSUFBSTtvQkFDTCxPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssSUFBSTtvQkFDTCxPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssSUFBSTtvQkFDTCxPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDO29CQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQzthQUNqRTtTQUNKO2FBQ0k7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7U0FDN0Q7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxvQkFBb0IsQ0FBNEIsTUFBa0IsRUFBRSxrQkFBOEI7UUFDckcsS0FBSyxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsRUFBRTtZQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO0lBQ0wsQ0FBQzs7O0FBak9ELDhEQUE4RDtBQUN2RCx5QkFBUyxHQUFHLEVBQUksQ0FBQyxHQUFHLENBQUM7QUFDNUIsOERBQThEO0FBQ3ZELHFCQUFLLEdBQUcsRUFBSSxDQUFDLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZSwgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgUHJvcGVydHlEZWNvcmF0b3JDb25maWcgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvcHJvcGVydHktZGVjb3JhdG9yLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZyB9IGZyb20gJy4uL2RlY29yYXRvcnMvbnVtYmVyLmRlY29yYXRvcic7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVTdHJpbmdEZWNvcmF0b3JDb25maWcsIERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWcsIFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWcgfSBmcm9tICcuLi9kZWNvcmF0b3JzL3N0cmluZy5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWcgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2FycmF5LmRlY29yYXRvcic7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuL2VudGl0eS1tb2RlbC5jbGFzcyc7XG5cbi8qKlxuICogQ29udGFpbnMgSGVscGVyTWV0aG9kcyBhcm91bmQgaGFuZGxpbmcgRW50aXRpZXMgYW5kIHRoZWlyIHByb3BlcnR5LW1ldGFkYXRhXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRpdHlVdGlsaXRpZXMge1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnRpZXMgdG8gb21pdCB3aGVuIHVwZGF0aW5nIHRoZSBlbnRpdHlcbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIHVwZGF0aW5nIGEgbmV3IEVudGl0eVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPbWl0Rm9yVXBkYXRlPEVudGl0eVR5cGUgZXh0ZW5kcyBFbnRpdHk+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoZW50aXR5KSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKCdtZXRhZGF0YScsIGVudGl0eSwga2V5KSBhcyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZztcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5IGFzIGtleW9mIEVudGl0eVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydGllcyB0byBvbWl0IHdoZW4gY3JlYXRpbmcgbmV3IGVudGl0aWVzXG4gICAgICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciBjcmVhdGluZyBhIG5ldyBFbnRpdHlcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvckNyZWF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgRW50aXR5PihlbnRpdHk6IEVudGl0eVR5cGUpOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKGVudGl0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgnbWV0YWRhdGEnLCBlbnRpdHksIGtleSkgYXMgUHJvcGVydHlEZWNvcmF0b3JDb25maWc7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEub21pdEZvckNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSBhcyBrZXlvZiBFbnRpdHlUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGluY2x1ZGVkIGluIGFuIHByb3BlcnR5XG4gICAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgbWV0YWRhdGEgZnJvbVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSBUaGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIEVudGl0eSB0byBnZXQgdGhlIG1ldGFkYXRhIGZyb21cbiAgICAgKiBAcGFyYW0gdHlwZSBGb3Igc2VjdXJlIFR5cGluZywgZGVmaW5lcyB0aGUgcmV0dXJuZWQgUHJvcGVydHlDb25maWdcbiAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgb2YgdGhlIHByb3BlcnR5XG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5TWV0YWRhdGE8RW50aXR5VHlwZSBleHRlbmRzIEVudGl0eSwgVCBleHRlbmRzIERlY29yYXRvclR5cGVzPihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBwcm9wZXJ0eUtleToga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICB0eXBlOiBUXG4gICAgKTogRGVjb3JhdG9yVHlwZTxUPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoJ21ldGFkYXRhJywgZW50aXR5LCBwcm9wZXJ0eUtleSBhcyBzdHJpbmcpIGFzIERlY29yYXRvclR5cGU8VD47XG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgbWV0YWRhdGEgZm9yIHByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5S2V5KX1cbiAgICAgICAgICAgICAgICAgICAgb24gdGhlIGVudGl0eSAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEgO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRhZGF0YSBmb3IgcHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlLZXkpfVxuICAgICAgICAgICAgICAgIG9uIHRoZSBlbnRpdHkgJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgd2l0aCB0aGUgcHJvcGVydHkgdG8gZ2V0IHRoZSB0eXBlIGZyb21cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgVGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBFbnRpdHkgdG8gZ2V0IHRoZSB0eXBlIGZyb21cbiAgICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UHJvcGVydHlUeXBlPEVudGl0eVR5cGUgZXh0ZW5kcyBFbnRpdHk+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsIHByb3BlcnR5S2V5OiBrZXlvZiBFbnRpdHlUeXBlXG4gICAgKTogRGVjb3JhdG9yVHlwZXMge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlUeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgndHlwZScsIGVudGl0eSwgcHJvcGVydHlLZXkgYXMgc3RyaW5nKSBhcyBEZWNvcmF0b3JUeXBlcztcbiAgICAgICAgICAgIGlmICghcHJvcGVydHlUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgdHlwZSBtZXRhZGF0YSBmb3IgcHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlLZXkpfVxuICAgICAgICAgICAgICAgICAgICBvbiB0aGUgZW50aXR5ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHR5cGUgbWV0YWRhdGEgZm9yIHByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5S2V5KX1cbiAgICAgICAgICAgICAgICBvbiB0aGUgZW50aXR5ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhbGwgcHJvcGVydHkgdmFsdWVzIGJhc2VkIG9uIGEgZ2l2ZW4gZW50aXR5IGRhdGEtb2JqZWN0LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgVGhlIGRhdGEgb2JqZWN0IHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHRhcmdldFxuICAgICAqIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgY29uc3RydWN0ZWRcbiAgICAgKiAoaWYgY2FsbGVkIGluc2lkZSBhIEVudGl0eSBjb25zdHJ1Y3RvciBpdHMgdXN1YWxseSB0aGlzKVxuICAgICAqIEBhbGlhcyBuZXdcbiAgICAgKiBAYWxpYXMgYnVpbGRcbiAgICAgKiBAYWxpYXMgY29uc3RydWN0XG4gICAgICovXG4gICAgc3RhdGljIG5ldzxFbnRpdHlUeXBlIGV4dGVuZHMgRW50aXR5Pih0YXJnZXQ6IEVudGl0eVR5cGUsIGVudGl0eT86IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIFJlZmxlY3QuZ2V0KGVudGl0eSwga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBzdGF0aWMgY29uc3RydWN0ID0gdGhpcy5uZXc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBzdGF0aWMgYnVpbGQgPSB0aGlzLm5ldztcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdmFsdWVzIG9uIGFuIGVudGl0eSBhcmUgdmFsaWQuXG4gICAgICogQWxzbyBjaGVja3MgYWxsIHRoZSB2YWxpZGF0b3JzIGdpdmVuIGJ5IHRoZSBtZXRhZGF0YSAoXCJyZXF1aXJlZFwiLCBcIm1heExlbmd0aFwiIGV0Yy4pXG4gICAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIHZhbGlkYXRlLlxuICAgICAqIEBwYXJhbSBvbWl0IFdoZXRoZXIgdG8gY2hlY2sgZm9yIGNyZWF0aXVuZyBvciBlZGl0aW5nIHZhbGlkaXR5XG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGVudGl0eSBpcyB2YWxpZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNFbnRpdHlWYWxpZDxFbnRpdHlUeXBlIGV4dGVuZHMgRW50aXR5PihlbnRpdHk6IEVudGl0eVR5cGUsIG9taXQ6ICdjcmVhdGUnIHwgJ2VkaXQnKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUHJvcGVydHlWYWxpZChlbnRpdHksIGtleSwgb21pdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHNpbmdsZSBwcm9wZXJ0eSB2YWx1ZSBpcyB2YWxpZFxuICAgICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB3aGVyZSB0aGUgcHJvcGVydHkgaXMgZnJvbVxuICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHZhbGlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNQcm9wZXJ0eVZhbGlkPEVudGl0eVR5cGUgZXh0ZW5kcyBFbnRpdHk+KGVudGl0eTogRW50aXR5VHlwZSwga2V5OiBrZXlvZiBFbnRpdHlUeXBlLCBvbWl0OiAnY3JlYXRlJyB8ICdlZGl0Jyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWcgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXksIHR5cGUpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YURlZmF1bHRTdHJpbmcgPSBtZXRhZGF0YSBhcyBEZWZhdWx0U3RyaW5nRGVjb3JhdG9yQ29uZmlnO1xuICAgICAgICBjb25zdCBtZXRhZGF0YVRleHRib3hTdHJpbmcgPSBtZXRhZGF0YSBhcyBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnO1xuICAgICAgICBjb25zdCBtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZyA9IG1ldGFkYXRhIGFzIEF1dG9jb21wbGV0ZVN0cmluZ0RlY29yYXRvckNvbmZpZztcbiAgICAgICAgY29uc3QgbWV0YWRhdGFEZWZhdWx0TnVtYmVyID0gbWV0YWRhdGEgYXMgRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZztcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJvcGVydHkgPSBlbnRpdHlba2V5XSBhcyB1bmtub3duIGFzIEVudGl0eVR5cGU7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhRW50aXR5QXJyYXkgPSBtZXRhZGF0YSBhcyBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZzxFbnRpdHk+O1xuICAgICAgICBjb25zdCBhcnJheUl0ZW1zID0gZW50aXR5W2tleV0gYXMgdW5rbm93biBhcyBbXTtcblxuICAgICAgICBpZiAobWV0YWRhdGEub21pdEZvckNyZWF0ZSAmJiBvbWl0ID09PSAnY3JlYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm9taXRGb3JVcGRhdGUgJiYgb21pdCA9PT0gJ2VkaXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEucmVxdWlyZWQgJiYgIWVudGl0eVtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklORzpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhRGVmYXVsdFN0cmluZy5tYXhMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVudGl0eVtrZXldIGFzIHVua25vd24gYXMgc3RyaW5nKS5sZW5ndGggPiBtZXRhZGF0YURlZmF1bHRTdHJpbmcubWF4TGVuZ3RoXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YURlZmF1bHRTdHJpbmcubWluTGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICYmIChlbnRpdHlba2V5XSBhcyB1bmtub3duIGFzIHN0cmluZykubGVuZ3RoIDwgbWV0YWRhdGFEZWZhdWx0U3RyaW5nLm1pbkxlbmd0aFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFEZWZhdWx0U3RyaW5nLnJlZ2V4XG4gICAgICAgICAgICAgICAgICAgICYmICEoZW50aXR5W2tleV0gYXMgdW5rbm93biBhcyBzdHJpbmcpLm1hdGNoKG1ldGFkYXRhRGVmYXVsdFN0cmluZy5yZWdleClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0FVVE9DT01QTEVURTpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLm1heExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAmJiAoZW50aXR5W2tleV0gYXMgdW5rbm93biBhcyBzdHJpbmcpLmxlbmd0aCA+IG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLm1heExlbmd0aFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFBdXRvY29tcGxldGVTdHJpbmcubWluTGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICYmIChlbnRpdHlba2V5XSBhcyB1bmtub3duIGFzIHN0cmluZykubGVuZ3RoIDwgbWV0YWRhdGFBdXRvY29tcGxldGVTdHJpbmcubWluTGVuZ3RoXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZy5yZWdleFxuICAgICAgICAgICAgICAgICAgICAmJiAoZW50aXR5W2tleV0gYXMgdW5rbm93biBhcyBzdHJpbmcpLm1hdGNoKG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLnJlZ2V4KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5TVFJJTkdfVEVYVEJPWDpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhVGV4dGJveFN0cmluZy5tYXhMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVudGl0eVtrZXldIGFzIHVua25vd24gYXMgc3RyaW5nKS5sZW5ndGggPiBtZXRhZGF0YVRleHRib3hTdHJpbmcubWF4TGVuZ3RoXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVRleHRib3hTdHJpbmcubWluTGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICYmIChlbnRpdHlba2V5XSBhcyB1bmtub3duIGFzIHN0cmluZykubGVuZ3RoIDwgbWV0YWRhdGFUZXh0Ym94U3RyaW5nLm1pbkxlbmd0aFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhRGVmYXVsdE51bWJlci5tYXggJiYgKGVudGl0eVtrZXldIGFzIHVua25vd24gYXMgbnVtYmVyKSA+IG1ldGFkYXRhRGVmYXVsdE51bWJlci5tYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFEZWZhdWx0TnVtYmVyLm1pbiAmJiAoZW50aXR5W2tleV0gYXMgdW5rbm93biBhcyBudW1iZXIpID4gbWV0YWRhdGFEZWZhdWx0TnVtYmVyLm1pbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXJLZXkgaW4gb2JqZWN0UHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUHJvcGVydHlWYWxpZChvYmplY3RQcm9wZXJ0eSwgcGFyYW1ldGVyS2V5LCBvbWl0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQ0hJUFM6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19BVVRPQ09NUExFVEVfQ0hJUFM6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YUVudGl0eUFycmF5LnJlcXVpcmVkICYmICFhcnJheUl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2YWxpZGF0ZSB0aGUgaW5wdXQgYmVjYXVzZSB0aGUgRGVjb3JhdG9yVHlwZSAke3R5cGV9IGlzIG5vdCBrbm93bmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBlbnRpdHkgaXMgXCJkaXJ0eVwiIChpZiBpdHMgdmFsdWVzIGhhdmUgY2hhbmdlZClcbiAgICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgYWZ0ZXIgYWxsIGNoYW5nZXNcbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIFRoZSBlbnRpdHkgYmVmb3JlIHRoZSBjaGFuZ2VzXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGVudGl0eSBpcyBkaXJ0eVxuICAgICAqL1xuICAgIHN0YXRpYyBkaXJ0eShlbnRpdHk6IEVudGl0eSwgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFlbnRpdHlQcmlvckNoYW5nZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLmRpZmZlcmVuY2UoZW50aXR5LCBlbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGRpZmYpID09PSAne30nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gRW50aXRpZXMgYW5kIHJldHVybnMgdGhlaXIgZGlmZmVyZW5jZSBpbiBhbiBvYmplY3RcbiAgICAgKiBAcGFyYW0gZW50aXR5IFRoZSBmaXJzdCBlbnRpdHkgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgVGhlIHNlY29uZCBlbnRpdHkgdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBFbnRpdGllcyBpbiBmb3JtIG9mIGEgUGFydGlhbFxuICAgICAqL1xuICAgIHN0YXRpYyBkaWZmZXJlbmNlPEVudGl0eVR5cGUgZXh0ZW5kcyBFbnRpdHk+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZVxuICAgICk6IFBhcnRpYWw8RW50aXR5VHlwZT4ge1xuICAgICAgICBjb25zdCByZXM6IFBhcnRpYWw8RW50aXR5VHlwZT4gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBpZiAoIWlzRXF1YWwoZW50aXR5W2tleV0sIGVudGl0eVByaW9yQ2hhbmdlc1trZXldKSkge1xuICAgICAgICAgICAgICAgIHJlc1trZXldID0gZW50aXR5W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb21wYXJlIGZ1bmN0aW9uIGZvciBzb3J0aW5nIGVudGl0eSBrZXlzIGJ5IHRoZWlyIG9yZGVyIHZhbHVlXG4gICAgICogQHBhcmFtIGEgZmlyc3Qga2V5IG9mIGVudGl0eVxuICAgICAqIEBwYXJhbSBiIHNlY29uZCBrZXkgb2YgZW50aXR5XG4gICAgICogQHBhcmFtIGVudGl0eSBjdXJyZW50IGVudGl0eSAodXNlZCB0byBnZXQgbWV0YWRhdGEgb2YgZW50aXR5IGtleXMpXG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmVPcmRlcjxFbnRpdHlUeXBlIGV4dGVuZHMgRW50aXR5PihhOiBrZXlvZiBFbnRpdHlUeXBlLCBiOiBrZXlvZiBFbnRpdHlUeXBlLCBlbnRpdHk6IEVudGl0eVR5cGUpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtZXRhZGF0YUEgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGEsIEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBhKSk7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQiA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgYiwgRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGIpKTtcblxuICAgICAgICBpZiAobWV0YWRhdGFBLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWV0YWRhdGFCLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKChtZXRhZGF0YUEub3JkZXIgYXMgbnVtYmVyKSAtIChtZXRhZGF0YUIub3JkZXIgYXMgbnVtYmVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0cyB0aGUgYm9vdHN0cmFwIGNvbHVtbiB2YWx1ZXMgZm9yIFwibGdcIiwgXCJtZFwiLCBcInNtXCJcbiAgICAgKiBAcGFyYW0gZW50aXR5IGVudGl0eSB0byBnZXQgdGhlIGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIG9mIHRoZSBrZXlcbiAgICAgKiBAcGFyYW0ga2V5IGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0IGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIGZyb21cbiAgICAgKiBAcGFyYW0gdHlwZSBkZWZpbmVzIGZvciB3aGljaCBzY3JlZW5zaXplIHRoZSBjb2x1bW4gdmFsdWVzIHNob3VsZCBiZSByZXR1cm5lZFxuICAgICAqIEByZXR1cm5zIGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0V2lkdGg8RW50aXR5VHlwZSBleHRlbmRzIEVudGl0eT4oZW50aXR5OiBFbnRpdHlUeXBlLCBrZXk6IGtleW9mIEVudGl0eVR5cGUsIHR5cGU6ICdsZycgfCAnbWQnIHwgJ3NtJyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5LCBwcm9wZXJ0eVR5cGUpO1xuICAgICAgICBpZiAobWV0YWRhdGEuZGVmYXVsdFdpZHRocykge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbGcnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuZGVmYXVsdFdpZHRoc1swXTtcbiAgICAgICAgICAgICAgICBjYXNlICdtZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0V2lkdGhzWzFdO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NtJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmRlZmF1bHRXaWR0aHNbMl07XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgd2VudCB3cm9uZyBnZXR0aW5nIHRoZSB3aWR0aCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgd2VudCB3cm9uZyBnZXR0aW5nIHRoZSB3aWR0aCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIGFsbCBjaGFuZ2VzIG9uIGFuIGVudGl0eVxuICAgICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0byByZXNldFxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgVGhlIGVudGl0eSBiZWZvcmUgYW55IGNoYW5nZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzZXRDaGFuZ2VzT25FbnRpdHk8RW50aXR5VHlwZSBleHRlbmRzIEVudGl0eT4oZW50aXR5OiBFbnRpdHlUeXBlLCBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5UHJpb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICBSZWZsZWN0LnNldChlbnRpdHksIGtleSwgUmVmbGVjdC5nZXQoZW50aXR5UHJpb3JDaGFuZ2VzLCBrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kaWFsb2ctZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2ctZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ29uZmlybURpYWxvZ1R5cGVzID0gJ2RlZmF1bHQnIHwgJ2RlbGV0ZScgfCAnaW5mby1vbmx5JztcblxuLyoqXG4gKiBUaGUgRGVmaW5pdGlvbiBvZiB0aGUgQ29uZmlybSBEaWFsb2cgRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpcm1EaWFsb2dEYXRhIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXJhZ3JhcGhzIHRvIGRpc3BsYXkgaW5zaWRlIHRoZSBkaWFsb2cgYm9keVxuICAgICAqL1xuICAgIHRleHQ/OiBzdHJpbmdbXSxcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgQ29uZmlybSBEaWFsb2cuIENoYW5nZXMgdGhlIGJ1dHRvbiBsYXlvdXQuIENhbiBiZSBlaXRoZXI6XG4gICAgICogQHZhbHVlICdkZWZhdWx0JzogQSBjb25maXJtLSBhbmQgYSBjYW5jZWwtYnV0dG9uXG4gICAgICogQHZhbHVlICdkZWxldGUnOiBMaWtlIGRlZmF1bHQgYnV0IHRoZSBjb25maXJtLWJ1dHRvbiBpcyByZWRcbiAgICAgKiBAdmFsdWUgJ2luZm8tb25seSc6IE9ubHkgYSBjYW5jZWwtYnV0dG9uXG4gICAgICovXG4gICAgdHlwZT86IENvbmZpcm1EaWFsb2dUeXBlcyxcbiAgICAvKipcbiAgICAgKiBUaGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiB0aGF0IGNvbmZpcm1zIHRoZSBkaWFsb2cuXG4gICAgICogSW4gY2FzZSBvZiB0aGUgJ2RlbGV0ZScgRGlhbG9nIHRoaXMgaXMgdGhlIHN0cmluZyB0aGF0IGlzIHNob3duIG9uIHRoZSBkZWxldGUtYnV0dG9uLlxuICAgICAqIERlZmF1bHRzIHRvIFwiQ29uZmlybVwiIG9yIFwiRGVsZXRlXCIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZVxuICAgICAqL1xuICAgIGNvbmZpcm1CdXR0b25MYWJlbD86IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBUaGUgbGFiZWwgb2YgdGhlIGJ1dHRvbiB0aGF0IGNsb3NlcyB0aGUgZGlhbG9nIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuXG4gICAgICogRGVmYXVsdHMgdG8gXCJDYW5jZWxcIlxuICAgICAqL1xuICAgIGNhbmNlbEJ1dHRvbkxhYmVsPzogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIHRpdGxlPzogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IGEgY2hlY2tib3ggbmVlZHMgdG8gYmUgc2VsZWN0ZWQgYmVmb3JlIHRoZSB1c2VyIGNhbiBjb25maXJtIHRoZSBkaWFsb2cuXG4gICAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAgICovXG4gICAgcmVxdWlyZUNvbmZpcm1hdGlvbj86IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgdG8gZGlzcGxheSBvbiB0aGUgY2hlY2tib3ggaWYgJ3JlcXVpcmVDb25maXJtYXRpb24nIGlzIHNldCB0byB0cnVlLlxuICAgICAqL1xuICAgIGNvbmZpcm1hdGlvblRleHQ/OiBzdHJpbmdcbn0iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Component, Inject } from '@angular/core';
|
|
2
|
+
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/material/dialog";
|
|
5
|
+
import * as i2 from "@angular/material/checkbox";
|
|
6
|
+
import * as i3 from "@angular/material/button";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
import * as i5 from "@angular/forms";
|
|
9
|
+
export class NgxMatEntityConfirmDialogComponent {
|
|
10
|
+
constructor(dialogRef, data) {
|
|
11
|
+
this.dialogRef = dialogRef;
|
|
12
|
+
this.data = data;
|
|
13
|
+
/**
|
|
14
|
+
* Used for the checkbox to confirm the action
|
|
15
|
+
*/
|
|
16
|
+
this.confirm = false;
|
|
17
|
+
}
|
|
18
|
+
ngOnInit() {
|
|
19
|
+
if (this.data.requireConfirmation && !this.data.confirmationText) {
|
|
20
|
+
throw new Error(`
|
|
21
|
+
Missing required Input "confirmationText".
|
|
22
|
+
You can only omit this if you dont have "requireConfirmation" set`);
|
|
23
|
+
}
|
|
24
|
+
if (!this.data.requireConfirmation && this.data.confirmationText) {
|
|
25
|
+
throw new Error('The "confirmationText" will never be shown because "requireConfirmation" is not set to true');
|
|
26
|
+
}
|
|
27
|
+
if (this.data.requireConfirmation !== true && this.data.requireConfirmation !== false) {
|
|
28
|
+
this.data.requireConfirmation = false;
|
|
29
|
+
}
|
|
30
|
+
if (this.data.type === 'info-only' && this.data.cancelButtonLabel) {
|
|
31
|
+
throw new Error('The "cancelButtonLabel" will never be shown because "type" is set to "info-only"');
|
|
32
|
+
}
|
|
33
|
+
this.dialogRef.disableClose = true;
|
|
34
|
+
}
|
|
35
|
+
confirmAction() {
|
|
36
|
+
this.dialogRef.close(1);
|
|
37
|
+
}
|
|
38
|
+
cancel() {
|
|
39
|
+
this.dialogRef.close();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
NgxMatEntityConfirmDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityConfirmDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
43
|
+
NgxMatEntityConfirmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: NgxMatEntityConfirmDialogComponent, selector: "ngx-mat-entity-confirm-dialog", ngImport: i0, template: "<h2 mat-dialog-title *ngIf=\"data.title\">{{data.title}}</h2>\n\n<mat-dialog-content>\n <p *ngFor=\"let paragraph of data.text\">{{paragraph}}</p>\n <div *ngIf=\"data.requireConfirmation\" class=\"checkbox-wrapper\">\n <mat-checkbox [(ngModel)]=\"confirm\" name=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button *ngIf=\"data.type === 'delete'\" mat-raised-button color=\"warn\" (click)=\"confirmAction()\" [disabled]=\"data.requireConfirmation && !confirm\" class=\"confirm-button\">\n {{data.confirmButtonLabel ? data.confirmButtonLabel : 'Delete'}}\n </button>\n <button *ngIf=\"data.type !== 'delete'\" mat-raised-button (click)=\"confirmAction()\" [disabled]=\"data.requireConfirmation && !confirm\" class=\"confirm-button\">\n {{data.confirmButtonLabel ? data.confirmButtonLabel : data.type === 'info-only' ? 'Ok' : 'Confirm'}}\n </button>\n <button mat-raised-button (click)=\"cancel()\" class=\"cancel-button\">\n {{data.cancelButtonLabel ? data.cancelButtonLabel : 'Cancel'}}\n </button>\n</mat-dialog-actions>\n", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}mat-dialog-actions{display:flex;justify-content:space-between}\n"], components: [{ type: i2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityConfirmDialogComponent, decorators: [{
|
|
45
|
+
type: Component,
|
|
46
|
+
args: [{ selector: 'ngx-mat-entity-confirm-dialog', template: "<h2 mat-dialog-title *ngIf=\"data.title\">{{data.title}}</h2>\n\n<mat-dialog-content>\n <p *ngFor=\"let paragraph of data.text\">{{paragraph}}</p>\n <div *ngIf=\"data.requireConfirmation\" class=\"checkbox-wrapper\">\n <mat-checkbox [(ngModel)]=\"confirm\" name=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button *ngIf=\"data.type === 'delete'\" mat-raised-button color=\"warn\" (click)=\"confirmAction()\" [disabled]=\"data.requireConfirmation && !confirm\" class=\"confirm-button\">\n {{data.confirmButtonLabel ? data.confirmButtonLabel : 'Delete'}}\n </button>\n <button *ngIf=\"data.type !== 'delete'\" mat-raised-button (click)=\"confirmAction()\" [disabled]=\"data.requireConfirmation && !confirm\" class=\"confirm-button\">\n {{data.confirmButtonLabel ? data.confirmButtonLabel : data.type === 'info-only' ? 'Ok' : 'Confirm'}}\n </button>\n <button mat-raised-button (click)=\"cancel()\" class=\"cancel-button\">\n {{data.cancelButtonLabel ? data.cancelButtonLabel : 'Cancel'}}\n </button>\n</mat-dialog-actions>\n", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}mat-dialog-actions{display:flex;justify-content:space-between}\n"] }]
|
|
47
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
48
|
+
type: Inject,
|
|
49
|
+
args: [MAT_DIALOG_DATA]
|
|
50
|
+
}] }]; } });
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7QUFRekUsTUFBTSxPQUFPLGtDQUFrQztJQU0zQyxZQUNxQixTQUEyRCxFQUVuRSxJQUF1QjtRQUZmLGNBQVMsR0FBVCxTQUFTLENBQWtEO1FBRW5FLFNBQUksR0FBSixJQUFJLENBQW1CO1FBUnBDOztXQUVHO1FBQ0gsWUFBTyxHQUFHLEtBQUssQ0FBQztJQU1iLENBQUM7SUFFSixRQUFRO1FBQ0osSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDOztrRkFFc0QsQ0FDckUsQ0FBQztTQUNMO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUM5RCxNQUFNLElBQUksS0FBSyxDQUNYLDZGQUE2RixDQUNoRyxDQUFDO1NBQ0w7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxFQUFFO1lBQ25GLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUM7U0FDdkc7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDdkMsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7Z0lBdkNRLGtDQUFrQyw4Q0FRL0IsZUFBZTtvSEFSbEIsa0NBQWtDLHFFQ1QvQyxrcENBc0JBOzRGRGJhLGtDQUFrQztrQkFMOUMsU0FBUzsrQkFDSSwrQkFBK0I7OzBCQVlwQyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBDb25maXJtRGlhbG9nRGF0YSB9IGZyb20gJy4vY29uZmlybS1kaWFsb2ctZGF0YSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LW1hdC1lbnRpdHktY29uZmlybS1kaWFsb2cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb25maXJtLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY29uZmlybS1kaWFsb2cuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciB0aGUgY2hlY2tib3ggdG8gY29uZmlybSB0aGUgYWN0aW9uXG4gICAgICovXG4gICAgY29uZmlybSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudD4sXG4gICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKVxuICAgICAgICByZWFkb25seSBkYXRhOiBDb25maXJtRGlhbG9nRGF0YVxuICAgICkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kYXRhLnJlcXVpcmVDb25maXJtYXRpb24gJiYgIXRoaXMuZGF0YS5jb25maXJtYXRpb25UZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuICAgICAgICAgICAgICAgIE1pc3NpbmcgcmVxdWlyZWQgSW5wdXQgXCJjb25maXJtYXRpb25UZXh0XCIuXG4gICAgICAgICAgICAgICAgWW91IGNhbiBvbmx5IG9taXQgdGhpcyBpZiB5b3UgZG9udCBoYXZlIFwicmVxdWlyZUNvbmZpcm1hdGlvblwiIHNldGBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRhdGEucmVxdWlyZUNvbmZpcm1hdGlvbiAmJiB0aGlzLmRhdGEuY29uZmlybWF0aW9uVGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdUaGUgXCJjb25maXJtYXRpb25UZXh0XCIgd2lsbCBuZXZlciBiZSBzaG93biBiZWNhdXNlIFwicmVxdWlyZUNvbmZpcm1hdGlvblwiIGlzIG5vdCBzZXQgdG8gdHJ1ZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5yZXF1aXJlQ29uZmlybWF0aW9uICE9PSB0cnVlICYmIHRoaXMuZGF0YS5yZXF1aXJlQ29uZmlybWF0aW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnJlcXVpcmVDb25maXJtYXRpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLnR5cGUgPT09ICdpbmZvLW9ubHknICYmIHRoaXMuZGF0YS5jYW5jZWxCdXR0b25MYWJlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJjYW5jZWxCdXR0b25MYWJlbFwiIHdpbGwgbmV2ZXIgYmUgc2hvd24gYmVjYXVzZSBcInR5cGVcIiBpcyBzZXQgdG8gXCJpbmZvLW9ubHlcIicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uZmlybUFjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoMSk7XG4gICAgfVxuXG4gICAgY2FuY2VsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgIH1cbn0iLCI8aDIgbWF0LWRpYWxvZy10aXRsZSAqbmdJZj1cImRhdGEudGl0bGVcIj57e2RhdGEudGl0bGV9fTwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPHAgKm5nRm9yPVwibGV0IHBhcmFncmFwaCBvZiBkYXRhLnRleHRcIj57e3BhcmFncmFwaH19PC9wPlxuICAgIDxkaXYgKm5nSWY9XCJkYXRhLnJlcXVpcmVDb25maXJtYXRpb25cIiBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIj5cbiAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cImNvbmZpcm1cIiBuYW1lPVwiY29uZmlybVwiPlxuICAgICAgICAgICAge3tkYXRhLmNvbmZpcm1hdGlvblRleHR9fVxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICA8L2Rpdj5cbjwvbWF0LWRpYWxvZy1jb250ZW50PlxuXG48bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b24gKm5nSWY9XCJkYXRhLnR5cGUgPT09ICdkZWxldGUnXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJ3YXJuXCIgKGNsaWNrKT1cImNvbmZpcm1BY3Rpb24oKVwiIFtkaXNhYmxlZF09XCJkYXRhLnJlcXVpcmVDb25maXJtYXRpb24gJiYgIWNvbmZpcm1cIiBjbGFzcz1cImNvbmZpcm0tYnV0dG9uXCI+XG4gICAgICAgIHt7ZGF0YS5jb25maXJtQnV0dG9uTGFiZWwgPyBkYXRhLmNvbmZpcm1CdXR0b25MYWJlbCA6ICdEZWxldGUnfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiZGF0YS50eXBlICE9PSAnZGVsZXRlJ1wiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJjb25maXJtQWN0aW9uKClcIiBbZGlzYWJsZWRdPVwiZGF0YS5yZXF1aXJlQ29uZmlybWF0aW9uICYmICFjb25maXJtXCIgY2xhc3M9XCJjb25maXJtLWJ1dHRvblwiPlxuICAgICAgICB7e2RhdGEuY29uZmlybUJ1dHRvbkxhYmVsID8gZGF0YS5jb25maXJtQnV0dG9uTGFiZWwgOiBkYXRhLnR5cGUgPT09ICdpbmZvLW9ubHknID8gJ09rJyA6ICdDb25maXJtJ319XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY2FuY2VsKClcIiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5cbiAgICAgICAge3tkYXRhLmNhbmNlbEJ1dHRvbkxhYmVsID8gZGF0YS5jYW5jZWxCdXR0b25MYWJlbCA6ICdDYW5jZWwnfX1cbiAgICA8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatDialogModule } from '@angular/material/dialog';
|
|
4
|
+
import { FormsModule } from '@angular/forms';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import { NgxMatEntityConfirmDialogComponent } from './confirm-dialog.component';
|
|
7
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class NgxMatEntityConfirmDialogModule {
|
|
10
|
+
}
|
|
11
|
+
NgxMatEntityConfirmDialogModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityConfirmDialogModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
NgxMatEntityConfirmDialogModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityConfirmDialogModule, declarations: [NgxMatEntityConfirmDialogComponent], imports: [CommonModule, MatDialogModule, FormsModule, MatCheckboxModule, MatButtonModule], exports: [NgxMatEntityConfirmDialogComponent] });
|
|
13
|
+
NgxMatEntityConfirmDialogModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityConfirmDialogModule, imports: [[CommonModule, MatDialogModule, FormsModule, MatCheckboxModule, MatButtonModule]] });
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityConfirmDialogModule, decorators: [{
|
|
15
|
+
type: NgModule,
|
|
16
|
+
args: [{
|
|
17
|
+
declarations: [NgxMatEntityConfirmDialogComponent],
|
|
18
|
+
imports: [CommonModule, MatDialogModule, FormsModule, MatCheckboxModule, MatButtonModule],
|
|
19
|
+
exports: [NgxMatEntityConfirmDialogComponent]
|
|
20
|
+
}]
|
|
21
|
+
}] });
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kaWFsb2cubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBTy9ELE1BQU0sT0FBTywrQkFBK0I7OzZIQUEvQiwrQkFBK0I7OEhBQS9CLCtCQUErQixpQkFKekIsa0NBQWtDLGFBQ3ZDLFlBQVksRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsYUFDOUUsa0NBQWtDOzhIQUVuQywrQkFBK0IsWUFIL0IsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLENBQUM7NEZBR2hGLCtCQUErQjtrQkFMM0MsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQztvQkFDbEQsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDO29CQUN6RixPQUFPLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQztpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9jb25maXJtLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudF0sXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBGb3Jtc01vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZV0sXG4gICAgZXhwb3J0czogW05neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dNb2R1bGUge30iXX0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a default error message for most validation errors.
|
|
3
|
+
* @param model The ngModel to get the error from
|
|
4
|
+
* @returns The Validation Error Message to display
|
|
5
|
+
*/
|
|
6
|
+
export function getValidationErrorMessage(model) {
|
|
7
|
+
if (model.hasError('matDatepickerParse')) {
|
|
8
|
+
return 'not a valid date';
|
|
9
|
+
}
|
|
10
|
+
else if (model.hasError('email')) {
|
|
11
|
+
return 'not a valid email';
|
|
12
|
+
}
|
|
13
|
+
else if (model.hasError('minlength')) {
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
15
|
+
return `needs to be at least ${model.getError('minlength').requiredLength} characters long`;
|
|
16
|
+
}
|
|
17
|
+
else if (model.hasError('min')) {
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
19
|
+
return `needs to be equal or bigger than ${model.getError('min').min}`;
|
|
20
|
+
}
|
|
21
|
+
else if (model.hasError('max')) {
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
23
|
+
return `needs to be equal or smaller than ${model.getError('max').max}`;
|
|
24
|
+
}
|
|
25
|
+
else if (model.hasError('required')) {
|
|
26
|
+
return 'required';
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return 'invalid input';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXZhbGlkYXRpb24tZXJyb3ItbWVzc2FnZS5mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvZ2V0LXZhbGlkYXRpb24tZXJyb3ItbWVzc2FnZS5mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQWM7SUFDcEQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7UUFDdEMsT0FBTyxrQkFBa0IsQ0FBQztLQUM3QjtTQUNJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUM5QixPQUFPLG1CQUFtQixDQUFDO0tBQzlCO1NBQ0ksSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQ2xDLHNFQUFzRTtRQUN0RSxPQUFPLHdCQUF3QixLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsa0JBQWtCLENBQUM7S0FDL0Y7U0FDSSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDNUIsc0VBQXNFO1FBQ3RFLE9BQU8sb0NBQW9DLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDMUU7U0FDSSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDNUIsc0VBQXNFO1FBQ3RFLE9BQU8scUNBQXFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDM0U7U0FDSSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDakMsT0FBTyxVQUFVLENBQUM7S0FDckI7U0FDSTtRQUNELE9BQU8sZUFBZSxDQUFDO0tBQzFCO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgZGVmYXVsdCBlcnJvciBtZXNzYWdlIGZvciBtb3N0IHZhbGlkYXRpb24gZXJyb3JzLlxuICogQHBhcmFtIG1vZGVsIFRoZSBuZ01vZGVsIHRvIGdldCB0aGUgZXJyb3IgZnJvbVxuICogQHJldHVybnMgVGhlIFZhbGlkYXRpb24gRXJyb3IgTWVzc2FnZSB0byBkaXNwbGF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsOiBOZ01vZGVsKTogc3RyaW5nIHtcbiAgICBpZiAobW9kZWwuaGFzRXJyb3IoJ21hdERhdGVwaWNrZXJQYXJzZScpKSB7XG4gICAgICAgIHJldHVybiAnbm90IGEgdmFsaWQgZGF0ZSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1vZGVsLmhhc0Vycm9yKCdlbWFpbCcpKSB7XG4gICAgICAgIHJldHVybiAnbm90IGEgdmFsaWQgZW1haWwnO1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2RlbC5oYXNFcnJvcignbWlubGVuZ3RoJykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXR1cm4gYG5lZWRzIHRvIGJlIGF0IGxlYXN0ICR7bW9kZWwuZ2V0RXJyb3IoJ21pbmxlbmd0aCcpLnJlcXVpcmVkTGVuZ3RofSBjaGFyYWN0ZXJzIGxvbmdgO1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2RlbC5oYXNFcnJvcignbWluJykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXR1cm4gYG5lZWRzIHRvIGJlIGVxdWFsIG9yIGJpZ2dlciB0aGFuICR7bW9kZWwuZ2V0RXJyb3IoJ21pbicpLm1pbn1gO1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2RlbC5oYXNFcnJvcignbWF4JykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXR1cm4gYG5lZWRzIHRvIGJlIGVxdWFsIG9yIHNtYWxsZXIgdGhhbiAke21vZGVsLmdldEVycm9yKCdtYXgnKS5tYXh9YDtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kZWwuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgcmV0dXJuICdyZXF1aXJlZCc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gJ2ludmFsaWQgaW5wdXQnO1xuICAgIH1cbn0iXX0=
|