ngx-material-entity 15.1.3 → 15.1.4
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/README.md +100 -0
- package/components/confirm-dialog/confirm-dialog.component.d.ts +1 -1
- package/components/edit-page/edit-page.component.d.ts +112 -0
- package/components/edit-page/page-edit-data.builder.d.ts +17 -0
- package/components/input/array/array-date-input/array-date-input.component.d.ts +1 -1
- package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +1 -1
- package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +1 -1
- package/components/input/array/array-table.class.d.ts +1 -1
- package/components/input/date/date-input/date-input.component.d.ts +1 -1
- package/components/input/date/date-time-input/date-time-input.component.d.ts +1 -1
- package/components/input/file/file-default-input/file-default-input.component.d.ts +1 -1
- package/components/input/file/file-image-input/file-image-input.component.d.ts +1 -1
- package/components/input/file/file-input/file-input.component.d.ts +3 -3
- package/components/input/input.component.d.ts +3 -3
- package/components/input/relations/references-many-input/references-many-input.component.d.ts +1 -1
- package/components/input/string/string-password-input/string-password-input.component.d.ts +1 -1
- package/components/table/create-dialog/create-entity-dialog-data.builder.d.ts +3 -3
- package/components/table/create-dialog/create-entity-dialog-data.d.ts +1 -1
- package/components/table/create-dialog/create-entity-dialog.component.d.ts +4 -4
- package/components/table/edit-dialog/{edit-dialog-data.builder.d.ts → edit-data.builder.d.ts} +7 -7
- package/components/table/edit-dialog/{edit-entity-dialog-data.d.ts → edit-entity-data.d.ts} +5 -5
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +6 -6
- package/components/table/edit-dialog/edit-entity.builder.d.ts +24 -0
- package/components/table/table-data.builder.d.ts +9 -7
- package/components/table/table-data.d.ts +18 -8
- package/components/table/table.component.d.ts +11 -7
- package/components/table/table.module.d.ts +4 -3
- package/esm2020/classes/entity.model.mjs +2 -2
- package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
- package/esm2020/components/edit-page/edit-page.component.mjs +203 -0
- package/esm2020/components/edit-page/page-edit-data.builder.mjs +32 -0
- package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-table.class.mjs +3 -3
- package/esm2020/components/input/base-input.component.mjs +2 -2
- package/esm2020/components/input/date/date-input/date-input.component.mjs +2 -2
- package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +5 -5
- package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +3 -3
- package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +2 -2
- package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +3 -3
- package/esm2020/components/input/file/file-input/file-input.component.mjs +5 -5
- package/esm2020/components/input/input.component.mjs +6 -6
- package/esm2020/components/input/relations/references-many-input/references-many-input.component.mjs +4 -4
- package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +4 -4
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +2 -2
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +1 -1
- package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +5 -5
- package/esm2020/components/table/edit-dialog/edit-data.builder.mjs +41 -0
- package/esm2020/components/table/edit-dialog/edit-entity-data.mjs +2 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +16 -16
- package/esm2020/components/table/edit-dialog/edit-entity.builder.mjs +28 -0
- package/esm2020/components/table/table-data.builder.mjs +11 -8
- package/esm2020/components/table/table-data.mjs +1 -1
- package/esm2020/components/table/table.component.mjs +42 -29
- package/esm2020/components/table/table.module.mjs +5 -1
- package/esm2020/decorators/array/array-decorator-internal.data.mjs +2 -2
- package/esm2020/decorators/base/base-property.decorator.mjs +2 -2
- package/esm2020/decorators/date/date-decorator-internal.data.mjs +2 -2
- package/esm2020/decorators/date/date.decorator.mjs +2 -2
- package/esm2020/decorators/file/file.decorator.mjs +2 -2
- package/esm2020/decorators/string/string.decorator.mjs +2 -2
- package/esm2020/public-api.mjs +30 -26
- package/esm2020/services/entity.service.mjs +236 -0
- package/esm2020/services/unsaved-changes.guard.mjs +14 -0
- package/esm2020/utilities/date.utilities.mjs +158 -0
- package/esm2020/utilities/entity.utilities.mjs +828 -0
- package/esm2020/utilities/file.utilities.mjs +163 -0
- package/esm2020/utilities/selection.utilities.mjs +50 -0
- package/fesm2015/ngx-material-entity.mjs +882 -613
- package/fesm2015/ngx-material-entity.mjs.map +1 -1
- package/fesm2020/ngx-material-entity.mjs +896 -633
- package/fesm2020/ngx-material-entity.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +27 -25
- package/{classes → services}/entity.service.d.ts +18 -1
- package/services/unsaved-changes.guard.d.ts +4 -0
- package/{classes → utilities}/entity.utilities.d.ts +1 -1
- package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +0 -24
- package/esm2020/classes/date.utilities.mjs +0 -158
- package/esm2020/classes/entity.service.mjs +0 -213
- package/esm2020/classes/entity.utilities.mjs +0 -828
- package/esm2020/classes/file.utilities.mjs +0 -163
- package/esm2020/classes/selection.utilities.mjs +0 -50
- package/esm2020/components/table/edit-dialog/edit-dialog-data.builder.mjs +0 -41
- package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +0 -2
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +0 -28
- /package/{classes → utilities}/date.utilities.d.ts +0 -0
- /package/{classes → utilities}/file.utilities.d.ts +0 -0
- /package/{classes → utilities}/selection.utilities.d.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { EntityService } from '../../classes/entity.service';
|
|
3
2
|
import { BaseEntityType, EntityClassNewable } from '../../classes/entity.model';
|
|
3
|
+
import { EntityService } from '../../services/entity.service';
|
|
4
4
|
import { ConfirmDialogData } from '../confirm-dialog/confirm-dialog-data';
|
|
5
5
|
/**
|
|
6
6
|
* The Definition of a Column inside the table.
|
|
@@ -74,6 +74,10 @@ export interface BaseData<EntityType extends BaseEntityType<EntityType>> {
|
|
|
74
74
|
* The label on the button for adding new entities. Defaults to "Create".
|
|
75
75
|
*/
|
|
76
76
|
createButtonLabel?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Whether editing happens in a dialog or a separate page.
|
|
79
|
+
*/
|
|
80
|
+
defaultEdit?: 'dialog' | 'page';
|
|
77
81
|
/**
|
|
78
82
|
* Takes a custom edit method which runs when you click on a entity.
|
|
79
83
|
* If you don't need any special editing of entries you can also omit this.
|
|
@@ -123,6 +127,12 @@ export interface BaseData<EntityType extends BaseEntityType<EntityType>> {
|
|
|
123
127
|
* The Label for the button that opens all multi-actions.
|
|
124
128
|
*/
|
|
125
129
|
multiSelectLabel?: string;
|
|
130
|
+
/**
|
|
131
|
+
* Whether or not to display a loading spinner while the entities of the table are loaded.
|
|
132
|
+
*
|
|
133
|
+
* @default true
|
|
134
|
+
*/
|
|
135
|
+
displayLoadingSpinner?: boolean;
|
|
126
136
|
}
|
|
127
137
|
/**
|
|
128
138
|
* The data of the default create-dialog.
|
|
@@ -150,23 +160,23 @@ export interface CreateDialogData {
|
|
|
150
160
|
confirmCreateDialogData?: ConfirmDialogData;
|
|
151
161
|
}
|
|
152
162
|
/**
|
|
153
|
-
* The data of the default edit-dialog.
|
|
163
|
+
* The data of the default edit-dialog or page.
|
|
154
164
|
*/
|
|
155
|
-
export interface
|
|
165
|
+
export interface EditData<EntityType extends BaseEntityType<EntityType>> {
|
|
156
166
|
/**
|
|
157
167
|
* The title of the default edit-dialog.
|
|
158
168
|
*/
|
|
159
169
|
title?: (entity: EntityType) => string;
|
|
160
170
|
/**
|
|
161
|
-
* The label on the confirm-button of the default edit-dialog. Defaults to "Save".
|
|
171
|
+
* The label on the confirm-button of the default edit-dialog or page. Defaults to "Save".
|
|
162
172
|
*/
|
|
163
173
|
confirmButtonLabel?: string;
|
|
164
174
|
/**
|
|
165
|
-
* The label on the delete-button of the default edit-dialog. Defaults to "Delete".
|
|
175
|
+
* The label on the delete-button of the default edit-dialog or page. Defaults to "Delete".
|
|
166
176
|
*/
|
|
167
177
|
deleteButtonLabel?: string;
|
|
168
178
|
/**
|
|
169
|
-
* The label on the cancel-button for the default edit-dialog. Defaults to "Cancel".
|
|
179
|
+
* The label on the cancel-button for the default edit-dialog or page. Defaults to "Cancel".
|
|
170
180
|
*/
|
|
171
181
|
cancelButtonLabel?: string;
|
|
172
182
|
/**
|
|
@@ -182,7 +192,7 @@ export interface EditDialogData<EntityType extends BaseEntityType<EntityType>> {
|
|
|
182
192
|
*/
|
|
183
193
|
confirmDeleteDialogData?: ConfirmDialogData;
|
|
184
194
|
/**
|
|
185
|
-
* The data used to generate a confirmation dialog for the
|
|
195
|
+
* The data used to generate a confirmation dialog for the edit action.
|
|
186
196
|
*/
|
|
187
197
|
confirmEditDialogData?: ConfirmDialogData;
|
|
188
198
|
}
|
|
@@ -204,5 +214,5 @@ export interface TableData<EntityType extends BaseEntityType<EntityType>> {
|
|
|
204
214
|
* The data for the default edit-dialog.
|
|
205
215
|
* Can be omitted when specifying a custom "edit" method inside the baseData.
|
|
206
216
|
*/
|
|
207
|
-
|
|
217
|
+
editData?: EditData<EntityType>;
|
|
208
218
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { SelectionModel } from '@angular/cdk/collections';
|
|
1
2
|
import { Injector, OnDestroy, OnInit } from '@angular/core';
|
|
3
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
2
4
|
import { MatPaginator } from '@angular/material/paginator';
|
|
3
5
|
import { MatSort } from '@angular/material/sort';
|
|
4
6
|
import { MatTableDataSource } from '@angular/material/table';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
+
import { Router } from '@angular/router';
|
|
8
|
+
import { BaseEntityType, Entity } from '../../classes/entity.model';
|
|
9
|
+
import { SelectionUtilities } from '../../utilities/selection.utilities';
|
|
7
10
|
import { MultiSelectAction, TableData } from './table-data';
|
|
8
11
|
import { TableDataInternal } from './table-data.builder';
|
|
9
|
-
import { BaseEntityType } from '../../classes/entity.model';
|
|
10
|
-
import { SelectionUtilities } from '../../classes/selection.utilities';
|
|
11
12
|
import * as i0 from "@angular/core";
|
|
12
13
|
/**
|
|
13
14
|
* Generates a fully functional table for displaying, creating, updating and deleting entities
|
|
@@ -15,14 +16,16 @@ import * as i0 from "@angular/core";
|
|
|
15
16
|
*
|
|
16
17
|
* It offers a lot of customization options which can be found in "TableData".
|
|
17
18
|
*/
|
|
18
|
-
export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityType<
|
|
19
|
+
export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityType<Entity>> implements OnInit, OnDestroy {
|
|
19
20
|
private readonly dialog;
|
|
20
21
|
private readonly injector;
|
|
22
|
+
private readonly router;
|
|
21
23
|
/**
|
|
22
24
|
* The configuration for the component.
|
|
23
25
|
*/
|
|
24
26
|
tableData: TableData<EntityType>;
|
|
25
27
|
data: TableDataInternal<EntityType>;
|
|
28
|
+
isLoading: boolean;
|
|
26
29
|
private entityService;
|
|
27
30
|
private readonly onDestroy;
|
|
28
31
|
paginator: MatPaginator;
|
|
@@ -32,7 +35,7 @@ export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityTyp
|
|
|
32
35
|
dataSource: MatTableDataSource<EntityType>;
|
|
33
36
|
selection: SelectionModel<EntityType>;
|
|
34
37
|
SelectionUtilities: typeof SelectionUtilities;
|
|
35
|
-
constructor(dialog: MatDialog, injector: Injector);
|
|
38
|
+
constructor(dialog: MatDialog, injector: Injector, router: Router);
|
|
36
39
|
/**
|
|
37
40
|
* Sets up all the configuration for the table and the EntityService.
|
|
38
41
|
*/
|
|
@@ -44,7 +47,8 @@ export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityTyp
|
|
|
44
47
|
* @throws When no EntityClass was provided, as a new call is needed to initialize metadata.
|
|
45
48
|
*/
|
|
46
49
|
editEntity(entity: EntityType): void;
|
|
47
|
-
private
|
|
50
|
+
private editDefaultPage;
|
|
51
|
+
private editDefaultDialog;
|
|
48
52
|
/**
|
|
49
53
|
* Creates a new Entity. This either calls the create-Method provided by the user or uses a default create-dialog.
|
|
50
54
|
*
|
|
@@ -10,10 +10,11 @@ import * as i8 from "@angular/material/paginator";
|
|
|
10
10
|
import * as i9 from "@angular/material/button";
|
|
11
11
|
import * as i10 from "@angular/material/menu";
|
|
12
12
|
import * as i11 from "@angular/material/dialog";
|
|
13
|
-
import * as i12 from "
|
|
14
|
-
import * as i13 from "./
|
|
13
|
+
import * as i12 from "@angular/material/progress-spinner";
|
|
14
|
+
import * as i13 from "./create-dialog/create-entity-dialog.module";
|
|
15
|
+
import * as i14 from "./edit-dialog/edit-entity-dialog.module";
|
|
15
16
|
export declare class NgxMatEntityTableModule {
|
|
16
17
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgxMatEntityTableModule, never>;
|
|
17
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<NgxMatEntityTableModule, [typeof i1.NgxMatEntityTableComponent], [typeof i2.CommonModule, typeof i3.MatInputModule, typeof i4.FormsModule, typeof i5.MatFormFieldModule, typeof i6.MatCheckboxModule, typeof i7.MatTableModule, typeof i8.MatPaginatorModule, typeof i9.MatButtonModule, typeof i10.MatMenuModule, typeof i11.MatDialogModule, typeof i12.
|
|
18
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgxMatEntityTableModule, [typeof i1.NgxMatEntityTableComponent], [typeof i2.CommonModule, typeof i3.MatInputModule, typeof i4.FormsModule, typeof i5.MatFormFieldModule, typeof i6.MatCheckboxModule, typeof i7.MatTableModule, typeof i8.MatPaginatorModule, typeof i9.MatButtonModule, typeof i10.MatMenuModule, typeof i11.MatDialogModule, typeof i12.MatProgressSpinnerModule, typeof i13.NgxMatEntityCreateDialogModule, typeof i14.NgxMatEntityEditDialogModule], [typeof i1.NgxMatEntityTableComponent]>;
|
|
18
19
|
static ɵinj: i0.ɵɵInjectorDeclaration<NgxMatEntityTableModule>;
|
|
19
20
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import { string } from '../decorators/string/string.decorator';
|
|
3
|
-
import { EntityUtilities } from '
|
|
3
|
+
import { EntityUtilities } from '../utilities/entity.utilities';
|
|
4
4
|
/**
|
|
5
5
|
* A base Entity class with a builtin id.
|
|
6
6
|
*/
|
|
@@ -20,4 +20,4 @@ __decorate([
|
|
|
20
20
|
}),
|
|
21
21
|
__metadata("design:type", String)
|
|
22
22
|
], Entity.prototype, "id", void 0);
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY2xhc3Nlcy9lbnRpdHkubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFZaEU7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLE1BQU07SUFjeEIsWUFBWSxNQUFlO1FBQ3ZCLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDSjtBQWJHO0lBQUMsTUFBTSxDQUFDO1FBQ0osYUFBYSxFQUFFLElBQUk7UUFDbkIsYUFBYSxFQUFFLElBQUk7UUFDbkIsT0FBTyxFQUFFLEtBQUs7UUFDZCxZQUFZLEVBQUUsTUFBTTtRQUNwQixXQUFXLEVBQUUsSUFBSTtRQUNqQixRQUFRLEVBQUUsSUFBSTtLQUNqQixDQUFDOztrQ0FDbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuLi9kZWNvcmF0b3JzL3N0cmluZy9zdHJpbmcuZGVjb3JhdG9yJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcblxuLyoqXG4gKiBUaGUgbmV3YWJsZSB0eXBlIHVzZWQgd2hlbmV2ZXIgYW4gZW50aXR5IGNsYXNzIGlzIHBhc3NlZCB0byBjcmVhdGUgYW4gZW50aXR5IGFuZCBpbml0aWFsaXplIGl0cyBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IHR5cGUgRW50aXR5Q2xhc3NOZXdhYmxlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4gPSBuZXcoZGF0YT86IEVudGl0eVR5cGUpID0+IEVudGl0eVR5cGU7XG5cbi8qKlxuICogVGhlIEdlbmVyaWMgQmFzZSBFbnRpdHlUeXBlLlxuICovXG5leHBvcnQgdHlwZSBCYXNlRW50aXR5VHlwZTxUPiA9IHsgW0sgaW4ga2V5b2YgVF06IHVua25vd24gfTtcblxuLyoqXG4gKiBBIGJhc2UgRW50aXR5IGNsYXNzIHdpdGggYSBidWlsdGluIGlkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRW50aXR5LlxuICAgICAqL1xuICAgIEBzdHJpbmcoe1xuICAgICAgICBvbWl0Rm9yQ3JlYXRlOiB0cnVlLFxuICAgICAgICBvbWl0Rm9yVXBkYXRlOiB0cnVlLFxuICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgZGlzcGxheVN0eWxlOiAnbGluZScsXG4gICAgICAgIGRpc3BsYXlOYW1lOiAnSUQnLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0pXG4gICAgcmVhZG9ubHkgaWQhOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihlbnRpdHk/OiBFbnRpdHkpIHtcbiAgICAgICAgRW50aXR5VXRpbGl0aWVzLm5ldyh0aGlzLCBlbnRpdHkpO1xuICAgIH1cbn0iXX0=
|
|
@@ -23,16 +23,16 @@ export class NgxMatEntityConfirmDialogComponent {
|
|
|
23
23
|
this.dialogRef.disableClose = true;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* Closes the dialog with
|
|
26
|
+
* Closes the dialog with true to signal that the action should be run.
|
|
27
27
|
*/
|
|
28
28
|
confirmAction() {
|
|
29
|
-
this.dialogRef.close(
|
|
29
|
+
this.dialogRef.close(true);
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* Closes the dialog.
|
|
33
33
|
*/
|
|
34
34
|
cancel() {
|
|
35
|
-
this.dialogRef.close();
|
|
35
|
+
this.dialogRef.close(false);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
NgxMatEntityConfirmDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgxMatEntityConfirmDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
@@ -44,4 +44,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImpor
|
|
|
44
44
|
type: Inject,
|
|
45
45
|
args: [MAT_DIALOG_DATA]
|
|
46
46
|
}] }]; } });
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFekUsT0FBTyxFQUFFLHdCQUF3QixFQUE2QixNQUFNLCtCQUErQixDQUFDOzs7Ozs7O0FBRXBHOzs7O0dBSUc7QUFNSCxNQUFNLE9BQU8sa0NBQWtDO0lBTTNDLFlBQ3FCLFNBQTJELEVBRTNELFNBQTRCO1FBRjVCLGNBQVMsR0FBVCxTQUFTLENBQWtEO1FBRTNELGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBUGpELFlBQU8sR0FBWSxLQUFLLENBQUM7SUFRdEIsQ0FBQztJQUVKLFFBQVE7UUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7OytIQTdCUSxrQ0FBa0MsOENBUS9CLGVBQWU7bUhBUmxCLGtDQUFrQyxxRUNmL0Msb2xDQXNCQTsyRkRQYSxrQ0FBa0M7a0JBTDlDLFNBQVM7K0JBQ0ksK0JBQStCOzswQkFZcEMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ0RhdGEgfSBmcm9tICcuL2NvbmZpcm0tZGlhbG9nLWRhdGEnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyLCBDb25maXJtRGlhbG9nRGF0YUludGVybmFsIH0gZnJvbSAnLi9jb25maXJtLWRpYWxvZy1kYXRhLmJ1aWxkZXInO1xuXG4vKipcbiAqIFRoZSBEaWFsb2cgdXNlZCB3aGVuZXZlciBjb25maXJtYXRpb24gYnkgdGhlIHVzZXIgaXMgcmVxdWlyZWQgKGUuZy4gV2hlbiB0aGUgdXNlciB0cmllcyB0byBkZWxldGUgYW4gZW50aXR5KS5cbiAqXG4gKiBDYW4gYmUgY3VzdG9taXplZCB3aXRoIHRoZSBNQVRfRElBTE9HX0RBVEEgXCJpbnB1dERhdGFcIi4gQ3VzdG9taXphdGlvbiBvcHRpb25zIGFyZSBkZWZpbmVkIGluIFwiQ29uZmlybURpYWxvZ0RhdGFcIi5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0LWVudGl0eS1jb25maXJtLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jb25maXJtLWRpYWxvZy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgY29uZmlybTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZGF0YSE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50PixcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW5wdXREYXRhOiBDb25maXJtRGlhbG9nRGF0YVxuICAgICkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuaW5wdXREYXRhKS5nZXRSZXN1bHQoKTtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGRpYWxvZyB3aXRoIHRydWUgdG8gc2lnbmFsIHRoYXQgdGhlIGFjdGlvbiBzaG91bGQgYmUgcnVuLlxuICAgICAqL1xuICAgIGNvbmZpcm1BY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIGNhbmNlbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xuICAgIH1cbn0iLCI8aDIgbWF0LWRpYWxvZy10aXRsZSAqbmdJZj1cImRhdGEudGl0bGVcIj57e2RhdGEudGl0bGV9fTwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPHAgKm5nRm9yPVwibGV0IHBhcmFncmFwaCBvZiBkYXRhLnRleHRcIj57e3BhcmFncmFwaH19PC9wPlxuICAgIDxkaXYgKm5nSWY9XCJkYXRhLnJlcXVpcmVDb25maXJtYXRpb25cIiBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIj5cbiAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cImNvbmZpcm1cIiBuYW1lPVwiY29uZmlybVwiPlxuICAgICAgICAgICAge3tkYXRhLmNvbmZpcm1hdGlvblRleHR9fVxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICA8L2Rpdj5cbjwvbWF0LWRpYWxvZy1jb250ZW50PlxuXG48bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS50eXBlID09PSAnZGVsZXRlJ1wiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwid2FyblwiIChjbGljayk9XCJjb25maXJtQWN0aW9uKClcIiBbZGlzYWJsZWRdPVwiZGF0YS5yZXF1aXJlQ29uZmlybWF0aW9uICYmICFjb25maXJtXCIgY2xhc3M9XCJjb25maXJtLWJ1dHRvblwiPlxuICAgICAgICB7e2RhdGEuY29uZmlybUJ1dHRvbkxhYmVsfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImRhdGEudHlwZSAhPT0gJ2RlbGV0ZSdcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY29uZmlybUFjdGlvbigpXCIgW2Rpc2FibGVkXT1cImRhdGEucmVxdWlyZUNvbmZpcm1hdGlvbiAmJiAhY29uZmlybVwiIGNsYXNzPVwiY29uZmlybS1idXR0b25cIj5cbiAgICAgICAge3tkYXRhLmNvbmZpcm1CdXR0b25MYWJlbH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJkYXRhLnR5cGUgIT09ICdpbmZvLW9ubHknXCIgbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImNhbmNlbCgpXCIgY2xhc3M9XCJjYW5jZWwtYnV0dG9uXCI+XG4gICAgICAgIHt7ZGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgPC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cbiJdfQ==
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { CommonModule, Location } from '@angular/common';
|
|
2
|
+
import { Component, HostListener, Inject, InjectionToken } from '@angular/core';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
5
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
6
|
+
import { MatTabsModule } from '@angular/material/tabs';
|
|
7
|
+
import { ActivatedRoute } from '@angular/router';
|
|
8
|
+
import { first, map } from 'rxjs';
|
|
9
|
+
import { LodashUtilities } from '../../encapsulation/lodash.utilities';
|
|
10
|
+
import { EntityService } from '../../services/entity.service';
|
|
11
|
+
import { EntityUtilities } from '../../utilities/entity.utilities';
|
|
12
|
+
import { ConfirmDialogDataBuilder } from '../confirm-dialog/confirm-dialog-data.builder';
|
|
13
|
+
import { NgxMatEntityConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';
|
|
14
|
+
import { NgxMatEntityInputModule } from '../input/input.module';
|
|
15
|
+
import { PageEditDataBuilder } from './page-edit-data.builder';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "@angular/material/dialog";
|
|
18
|
+
import * as i2 from "@angular/common";
|
|
19
|
+
import * as i3 from "@angular/router";
|
|
20
|
+
import * as i4 from "@angular/material/button";
|
|
21
|
+
import * as i5 from "@angular/material/tabs";
|
|
22
|
+
import * as i6 from "../input/input.component";
|
|
23
|
+
import * as i7 from "@angular/material/progress-spinner";
|
|
24
|
+
import * as i8 from "../../services/entity.service";
|
|
25
|
+
export const defaultEditDataRoute = {
|
|
26
|
+
loadComponent: () => NgxMatEntityEditPageComponent,
|
|
27
|
+
title: 'Edit',
|
|
28
|
+
path: 'entities:id'
|
|
29
|
+
};
|
|
30
|
+
// eslint-disable-next-line max-len, @typescript-eslint/no-explicit-any
|
|
31
|
+
export const NGX_EDIT_DATA_ENTITY_SERVICE = new InjectionToken('NGX_EDIT_DATA_ENTITY_SERVICE');
|
|
32
|
+
// eslint-disable-next-line max-len, @typescript-eslint/no-explicit-any
|
|
33
|
+
export const NGX_EDIT_DATA_ENTITY = new InjectionToken('NGX_EDIT_DATA_ENTITY');
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
+
export const NGX_EDIT_DATA = new InjectionToken('NGX_EDIT_DATA');
|
|
36
|
+
/**
|
|
37
|
+
* A generic page that allows you to edit a specific entity.
|
|
38
|
+
* For this to work you need to provide some data for the route.
|
|
39
|
+
*/
|
|
40
|
+
export class NgxMatEntityEditPageComponent {
|
|
41
|
+
constructor(dialog, location, route, entityService, EntityClass, inputData) {
|
|
42
|
+
this.dialog = dialog;
|
|
43
|
+
this.location = location;
|
|
44
|
+
this.route = route;
|
|
45
|
+
this.entityService = entityService;
|
|
46
|
+
this.EntityClass = EntityClass;
|
|
47
|
+
this.inputData = inputData;
|
|
48
|
+
this.EntityUtilities = EntityUtilities;
|
|
49
|
+
this.isEntityValid = true;
|
|
50
|
+
this.isEntityDirty = false;
|
|
51
|
+
this.inConfirmNavigation = false;
|
|
52
|
+
}
|
|
53
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
54
|
+
get hasUnsavedChanges() {
|
|
55
|
+
return this.isEntityDirty && this.data.editData.unsavedChangesRequireConfirmDialog;
|
|
56
|
+
}
|
|
57
|
+
async ngOnInit() {
|
|
58
|
+
this.data = new PageEditDataBuilder(this.inputData).getResult();
|
|
59
|
+
if (this.data == null) {
|
|
60
|
+
this.confirmNavigateBack();
|
|
61
|
+
throw new Error('No edit data was provided for "NGX_EDIT_DATA". You need to provide a value in your routes providers array.');
|
|
62
|
+
}
|
|
63
|
+
const id = this.route.snapshot.paramMap.get('id');
|
|
64
|
+
const foundEntity = await this.entityService.findById(id);
|
|
65
|
+
if (foundEntity == null) {
|
|
66
|
+
this.confirmNavigateBack();
|
|
67
|
+
throw new Error(`Could not find entity with id ${id}`);
|
|
68
|
+
}
|
|
69
|
+
this.entity = new this.EntityClass(foundEntity);
|
|
70
|
+
this.entityPriorChanges = LodashUtilities.cloneDeep(this.entity);
|
|
71
|
+
this.isReadOnly = !this.data.allowUpdate(this.entityPriorChanges);
|
|
72
|
+
this.entityTabs = EntityUtilities.getEntityTabs(this.entity, false, true);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Whether the page can be left without confirmation (of unsaved changes).
|
|
76
|
+
*
|
|
77
|
+
* @returns Whether or not the page can be left without confirmation.
|
|
78
|
+
*/
|
|
79
|
+
canDeactivate() {
|
|
80
|
+
return !this.hasUnsavedChanges || this.inConfirmNavigation;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Checks if the entity has become invalid or dirty.
|
|
84
|
+
*/
|
|
85
|
+
async checkEntity() {
|
|
86
|
+
this.isEntityValid = EntityUtilities.isEntityValid(this.entity, 'update');
|
|
87
|
+
this.isEntityDirty = await EntityUtilities.isDirty(this.entity, this.entityPriorChanges);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Tries to save the changes and close the dialog afterwards.
|
|
91
|
+
* Also handles the confirmation if required.
|
|
92
|
+
*/
|
|
93
|
+
edit() {
|
|
94
|
+
if (this.isReadOnly || !this.isEntityValid || !this.isEntityDirty) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!this.data.editData.editRequiresConfirmDialog) {
|
|
98
|
+
this.confirmEdit();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const dialogData = new ConfirmDialogDataBuilder(this.data.editData.confirmEditDialogData)
|
|
102
|
+
.withDefault('text', ['Do you really want to save all changes?'])
|
|
103
|
+
.withDefault('confirmButtonLabel', 'Save')
|
|
104
|
+
.withDefault('title', 'Edit')
|
|
105
|
+
.getResult();
|
|
106
|
+
const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
107
|
+
data: dialogData,
|
|
108
|
+
autoFocus: false,
|
|
109
|
+
restoreFocus: false
|
|
110
|
+
});
|
|
111
|
+
dialogRef.afterClosed().subscribe(res => {
|
|
112
|
+
if (res == true) {
|
|
113
|
+
this.confirmEdit();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
confirmEdit() {
|
|
118
|
+
void this.entityService.update(this.entity, this.entityPriorChanges).then(() => this.confirmNavigateBack());
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Tries to delete the entity and close the dialog afterwards.
|
|
122
|
+
* Also handles the confirmation if required.
|
|
123
|
+
*/
|
|
124
|
+
delete() {
|
|
125
|
+
if (!this.data.editData.deleteRequiresConfirmDialog) {
|
|
126
|
+
this.confirmDelete();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const dialogData = new ConfirmDialogDataBuilder(this.data.editData.confirmDeleteDialogData)
|
|
130
|
+
.withDefault('text', ['Do you really want to delete this entity?'])
|
|
131
|
+
.withDefault('type', 'delete')
|
|
132
|
+
.withDefault('confirmButtonLabel', 'Delete')
|
|
133
|
+
.withDefault('title', 'Delete')
|
|
134
|
+
.getResult();
|
|
135
|
+
const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
136
|
+
data: dialogData,
|
|
137
|
+
autoFocus: false,
|
|
138
|
+
restoreFocus: false
|
|
139
|
+
});
|
|
140
|
+
dialogRef.afterClosed().subscribe(res => {
|
|
141
|
+
if (res == true) {
|
|
142
|
+
this.confirmDelete();
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
confirmDelete() {
|
|
147
|
+
void this.entityService
|
|
148
|
+
.delete(this.entityPriorChanges)
|
|
149
|
+
.then(() => this.confirmNavigateBack());
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Tries to navigate back.
|
|
153
|
+
*/
|
|
154
|
+
navigateBack() {
|
|
155
|
+
if (!this.hasUnsavedChanges) {
|
|
156
|
+
this.confirmNavigateBack();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this.openConfirmNavigationDialog().subscribe(res => {
|
|
160
|
+
if (res) {
|
|
161
|
+
this.confirmNavigateBack();
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Opens the confirm dialog for navigating with unsaved changes.
|
|
167
|
+
* This is exposed because the UnsavedChangesGuard needs to access this.
|
|
168
|
+
*
|
|
169
|
+
* @returns The first observable result of the confirm dialog.
|
|
170
|
+
*/
|
|
171
|
+
openConfirmNavigationDialog() {
|
|
172
|
+
const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
|
|
173
|
+
data: this.data.editData.confirmUnsavedChangesDialogData,
|
|
174
|
+
autoFocus: false,
|
|
175
|
+
restoreFocus: false
|
|
176
|
+
});
|
|
177
|
+
return dialogRef.afterClosed().pipe(first(), map(p => (p ?? false)));
|
|
178
|
+
}
|
|
179
|
+
confirmNavigateBack() {
|
|
180
|
+
this.inConfirmNavigation = true;
|
|
181
|
+
EntityUtilities.resetChangesOnEntity(this.entity, this.entityPriorChanges);
|
|
182
|
+
this.location.back();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
NgxMatEntityEditPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgxMatEntityEditPageComponent, deps: [{ token: i1.MatDialog }, { token: i2.Location }, { token: i3.ActivatedRoute }, { token: NGX_EDIT_DATA_ENTITY_SERVICE }, { token: NGX_EDIT_DATA_ENTITY }, { token: NGX_EDIT_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
186
|
+
NgxMatEntityEditPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: NgxMatEntityEditPageComponent, isStandalone: true, selector: "ngx-mat-entity-edit-page", host: { listeners: { "window:beforeunload": "canDeactivate()" } }, ngImport: i0, template: "<div *ngIf=\"!entityTabs && data.displayLoadingSpinner\" class=\"container\">\n <br>\n <mat-spinner style=\"margin-left: auto; margin-right: auto;\"></mat-spinner>\n <br>\n</div>\n\n<div *ngIf=\"entityTabs\" class=\"container\">\n <br>\n\n <!------------>\n <!-- Header -->\n <!------------>\n <div class=\"header\">\n <div>\n <button type=\"button\" [class.unsavedChanges]=\"hasUnsavedChanges\" mat-raised-button (click)=\"navigateBack()\" class=\"back-button\" tabindex=\"-1\">\n <i class=\"fas fa-chevron-left\"></i>\n {{data.editData.cancelButtonLabel}}\n <i class=\"fas fa-warning\" style=\"color: orange;\" *ngIf=\"hasUnsavedChanges\"></i>\n </button>\n <button (click)=\"edit()\" mat-raised-button [disabled]=\"isReadOnly || !isEntityValid || !isEntityDirty\">\n {{data.editData.confirmButtonLabel}}\n </button>\n </div>\n <button type=\"button\" *ngIf=\"data.allowDelete(entity)\" mat-raised-button (click)=\"delete()\" color=\"warn\" class=\"delete-button\" tabindex=\"-1\">\n {{data.editData.deleteButtonLabel}}\n </button>\n </div>\n\n <h1>{{data.editData.title(entityPriorChanges)}}</h1>\n\n <!----------->\n <!-- Input -->\n <!----------->\n <form>\n <mat-tab-group *ngIf=\"entityTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of entityTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"entity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkEntity()\"\n [isReadOnly]=\"isReadOnly\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"entityTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of entityTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"entity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkEntity()\"\n [isReadOnly]=\"isReadOnly\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <button type=\"submit\" (click)=\"edit()\" mat-raised-button [disabled]=\"isReadOnly || !isEntityValid || !isEntityDirty\">\n {{data.editData.confirmButtonLabel}}\n </button>\n </form>\n\n <br>\n</div>", styles: [".header{display:flex;justify-content:space-between}.header div{display:flex;column-gap:10px}h1{text-align:center}.unsavedChanges{background-color:#ffe48d}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i5.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: NgxMatEntityInputModule }, { kind: "component", type: i6.NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit", "isReadOnly"], outputs: ["inputChangeEvent"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
|
|
187
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgxMatEntityEditPageComponent, decorators: [{
|
|
188
|
+
type: Component,
|
|
189
|
+
args: [{ selector: 'ngx-mat-entity-edit-page', standalone: true, imports: [CommonModule, MatButtonModule, MatTabsModule, NgxMatEntityInputModule, MatProgressSpinnerModule], template: "<div *ngIf=\"!entityTabs && data.displayLoadingSpinner\" class=\"container\">\n <br>\n <mat-spinner style=\"margin-left: auto; margin-right: auto;\"></mat-spinner>\n <br>\n</div>\n\n<div *ngIf=\"entityTabs\" class=\"container\">\n <br>\n\n <!------------>\n <!-- Header -->\n <!------------>\n <div class=\"header\">\n <div>\n <button type=\"button\" [class.unsavedChanges]=\"hasUnsavedChanges\" mat-raised-button (click)=\"navigateBack()\" class=\"back-button\" tabindex=\"-1\">\n <i class=\"fas fa-chevron-left\"></i>\n {{data.editData.cancelButtonLabel}}\n <i class=\"fas fa-warning\" style=\"color: orange;\" *ngIf=\"hasUnsavedChanges\"></i>\n </button>\n <button (click)=\"edit()\" mat-raised-button [disabled]=\"isReadOnly || !isEntityValid || !isEntityDirty\">\n {{data.editData.confirmButtonLabel}}\n </button>\n </div>\n <button type=\"button\" *ngIf=\"data.allowDelete(entity)\" mat-raised-button (click)=\"delete()\" color=\"warn\" class=\"delete-button\" tabindex=\"-1\">\n {{data.editData.deleteButtonLabel}}\n </button>\n </div>\n\n <h1>{{data.editData.title(entityPriorChanges)}}</h1>\n\n <!----------->\n <!-- Input -->\n <!----------->\n <form>\n <mat-tab-group *ngIf=\"entityTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of entityTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"entity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkEntity()\"\n [isReadOnly]=\"isReadOnly\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"entityTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of entityTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"entity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkEntity()\"\n [isReadOnly]=\"isReadOnly\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <button type=\"submit\" (click)=\"edit()\" mat-raised-button [disabled]=\"isReadOnly || !isEntityValid || !isEntityDirty\">\n {{data.editData.confirmButtonLabel}}\n </button>\n </form>\n\n <br>\n</div>", styles: [".header{display:flex;justify-content:space-between}.header div{display:flex;column-gap:10px}h1{text-align:center}.unsavedChanges{background-color:#ffe48d}\n"] }]
|
|
190
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.Location }, { type: i3.ActivatedRoute }, { type: i8.EntityService, decorators: [{
|
|
191
|
+
type: Inject,
|
|
192
|
+
args: [NGX_EDIT_DATA_ENTITY_SERVICE]
|
|
193
|
+
}] }, { type: undefined, decorators: [{
|
|
194
|
+
type: Inject,
|
|
195
|
+
args: [NGX_EDIT_DATA_ENTITY]
|
|
196
|
+
}] }, { type: undefined, decorators: [{
|
|
197
|
+
type: Inject,
|
|
198
|
+
args: [NGX_EDIT_DATA]
|
|
199
|
+
}] }]; }, propDecorators: { canDeactivate: [{
|
|
200
|
+
type: HostListener,
|
|
201
|
+
args: ['window:beforeunload']
|
|
202
|
+
}] } });
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1wYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvZWRpdC1wYWdlL2VkaXQtcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2VkaXQtcGFnZS9lZGl0LXBhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUF3QixZQUFZLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDOUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFDdkUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFOUUsT0FBTyxFQUFFLHdCQUF3QixFQUE2QixNQUFNLCtDQUErQyxDQUFDO0FBQ3BILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDRDQUE0QyxDQUFD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QUFDO1FBQ2hDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7MEhBaExRLDZCQUE2QixpR0EyQjFCLDRCQUE0QixhQUU1QixvQkFBb0IsYUFFcEIsYUFBYTs4R0EvQmhCLDZCQUE2Qix1SkN0RjFDLHdyR0F3RU0scU5EWVEsWUFBWSwrUEFBRSxlQUFlLDJRQUFFLGFBQWEsd1RBQUUsdUJBQXVCLGlSQUFFLHdCQUF3QjsyRkFFaEcsNkJBQTZCO2tCQVB6QyxTQUFTOytCQUNJLDBCQUEwQixjQUd4QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsQ0FBQzs7MEJBNkJyRyxNQUFNOzJCQUFDLDRCQUE0Qjs7MEJBRW5DLE1BQU07MkJBQUMsb0JBQW9COzswQkFFM0IsTUFBTTsyQkFBQyxhQUFhOzRDQWdDekIsYUFBYTtzQkFEWixZQUFZO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSwgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbnZpcm9ubWVudFByb3ZpZGVycywgSG9zdExpc3RlbmVyLCBJbmplY3QsIEluamVjdGlvblRva2VuLCBPbkluaXQsIFByb3ZpZGVyLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgRGVmYXVsdEV4cG9ydCwgUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlyc3QsIG1hcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUsIEVudGl0eUNsYXNzTmV3YWJsZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IExvZGFzaFV0aWxpdGllcyB9IGZyb20gJy4uLy4uL2VuY2Fwc3VsYXRpb24vbG9kYXNoLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBFbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRW50aXR5VGFiLCBFbnRpdHlVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvZW50aXR5LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBDb25maXJtRGlhbG9nRGF0YSB9IGZyb20gJy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLWRhdGEnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyLCBDb25maXJtRGlhbG9nRGF0YUludGVybmFsIH0gZnJvbSAnLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2ctZGF0YS5idWlsZGVyJztcbmltcG9ydCB7IE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd4TWF0RW50aXR5SW5wdXRNb2R1bGUgfSBmcm9tICcuLi9pbnB1dC9pbnB1dC5tb2R1bGUnO1xuaW1wb3J0IHsgRWRpdEVudGl0eURhdGEgfSBmcm9tICcuLi90YWJsZS9lZGl0LWRpYWxvZy9lZGl0LWVudGl0eS1kYXRhJztcbmltcG9ydCB7IEVkaXREYXRhIH0gZnJvbSAnLi4vdGFibGUvdGFibGUtZGF0YSc7XG5pbXBvcnQgeyBQYWdlRWRpdERhdGFCdWlsZGVyLCBQYWdlRWRpdERhdGFJbnRlcm5hbCB9IGZyb20gJy4vcGFnZS1lZGl0LWRhdGEuYnVpbGRlcic7XG5cbi8qKlxuICogVGhlIGRlZmluaXRpb24gZm9yIGEgcm91dGUgdG8gdXNlIHdpdGggdGhlIFwiTmd4TWF0RW50aXR5RWRpdFBhZ2VDb21wb25lbnRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0RGF0YVJvdXRlIGV4dGVuZHMgUm91dGUge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuLCBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgbG9hZENvbXBvbmVudDogKCkgPT4gVHlwZTx1bmtub3duPiB8IE9ic2VydmFibGU8VHlwZTx1bmtub3duPiB8IERlZmF1bHRFeHBvcnQ8VHlwZTx1bmtub3duPj4+IHwgUHJvbWlzZTxUeXBlPHVua25vd24+IHwgRGVmYXVsdEV4cG9ydDxUeXBlPHVua25vd24+Pj4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICBwcm92aWRlcnM6IChQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzKVtdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIHBhdGg6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEVkaXREYXRhUm91dGU6IE9taXQ8RWRpdERhdGFSb3V0ZSwgJ3Byb3ZpZGVycyc+ID0ge1xuICAgIGxvYWRDb21wb25lbnQ6ICgpID0+IE5neE1hdEVudGl0eUVkaXRQYWdlQ29tcG9uZW50LFxuICAgIHRpdGxlOiAnRWRpdCcsXG4gICAgcGF0aDogJ2VudGl0aWVzOmlkJ1xufTtcblxuLyoqXG4gKiBUaGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb3ZpZGVkIGZvciBhIHJvdXRlIHRvIGJlIGFibGUgdG8gZWRpdCBhIGVudGl0eS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbmV4cG9ydCB0eXBlIFBhZ2VFZGl0RGF0YTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+ID0gT21pdDxFZGl0RW50aXR5RGF0YTxFbnRpdHlUeXBlPiwgJ2VudGl0eScgfCAnRW50aXR5U2VydmljZUNsYXNzJz4gJiB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSBhIGxvYWRpbmcgc3Bpbm5lciB3aGlsZSB0aGUgZW50aXR5IGZvciB0aGUgcGFnZSBpcyBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZGlzcGxheUxvYWRpbmdTcGlubmVyPzogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBvZiB0aGUgZGVmYXVsdCBlZGl0IHBhZ2UuXG4gICAgICovXG4gICAgZWRpdERhdGE/OiBFZGl0RGF0YTxFbnRpdHlUeXBlPiAmIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkYXRhIGZvciB0aGUgZGlhbG9nIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG8gbGVhdmUgdGhlIHNpdGUgd2l0aCB1bnNhdmVkIGNoYW5nZXMuXG4gICAgICAgICAqL1xuICAgICAgICBjb25maXJtVW5zYXZlZENoYW5nZXNEaWFsb2dEYXRhPzogQ29uZmlybURpYWxvZ0RhdGEsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCBsZWF2aW5nIHdpdGggdW5zYXZlZCBjaGFuZ2VzIHNob3VsZCByZXF1aXJlIGEgY29uZmlybSBkaWFsb2cuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIHVuc2F2ZWRDaGFuZ2VzUmVxdWlyZUNvbmZpcm1EaWFsb2c/OiBib29sZWFuXG4gICAgfVxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW4sIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBOR1hfRURJVF9EQVRBX0VOVElUWV9TRVJWSUNFOiBJbmplY3Rpb25Ub2tlbjxFbnRpdHlTZXJ2aWNlPGFueT4+ID0gbmV3IEluamVjdGlvblRva2VuPEVudGl0eVNlcnZpY2U8YW55Pj4oJ05HWF9FRElUX0RBVEFfRU5USVRZX1NFUlZJQ0UnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgTkdYX0VESVRfREFUQV9FTlRJVFk6IEluamVjdGlvblRva2VuPEVudGl0eUNsYXNzTmV3YWJsZTxhbnk+PiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxFbnRpdHlDbGFzc05ld2FibGU8YW55Pj4oJ05HWF9FRElUX0RBVEFfRU5USVRZJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IE5HWF9FRElUX0RBVEE6IEluamVjdGlvblRva2VuPFBhZ2VFZGl0RGF0YTxhbnk+PiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQYWdlRWRpdERhdGE8YW55Pj4oJ05HWF9FRElUX0RBVEEnKTtcblxuLyoqXG4gKiBBIGdlbmVyaWMgcGFnZSB0aGF0IGFsbG93cyB5b3UgdG8gZWRpdCBhIHNwZWNpZmljIGVudGl0eS5cbiAqIEZvciB0aGlzIHRvIHdvcmsgeW91IG5lZWQgdG8gcHJvdmlkZSBzb21lIGRhdGEgZm9yIHRoZSByb3V0ZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0LWVudGl0eS1lZGl0LXBhZ2UnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9lZGl0LXBhZ2UuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2VkaXQtcGFnZS5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRUYWJzTW9kdWxlLCBOZ3hNYXRFbnRpdHlJbnB1dE1vZHVsZSwgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hNYXRFbnRpdHlFZGl0UGFnZUNvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEVudGl0eVV0aWxpdGllczogdHlwZW9mIEVudGl0eVV0aWxpdGllcyA9IEVudGl0eVV0aWxpdGllcztcblxuICAgIGVudGl0eVRhYnMhOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXTtcblxuICAgIGVudGl0eSE6IEVudGl0eVR5cGU7XG4gICAgZW50aXR5UHJpb3JDaGFuZ2VzITogRW50aXR5VHlwZTtcblxuICAgIGRhdGEhOiBQYWdlRWRpdERhdGFJbnRlcm5hbDxFbnRpdHlUeXBlPjtcblxuICAgIGlzRW50aXR5VmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGlzRW50aXR5RGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGlzUmVhZE9ubHkhOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBpbkNvbmZpcm1OYXZpZ2F0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGdldCBoYXNVbnNhdmVkQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNFbnRpdHlEaXJ0eSAmJiB0aGlzLmRhdGEuZWRpdERhdGEudW5zYXZlZENoYW5nZXNSZXF1aXJlQ29uZmlybURpYWxvZztcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBASW5qZWN0KE5HWF9FRElUX0RBVEFfRU5USVRZX1NFUlZJQ0UpXG4gICAgICAgIHJlYWRvbmx5IGVudGl0eVNlcnZpY2U6IEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZT4sXG4gICAgICAgIEBJbmplY3QoTkdYX0VESVRfREFUQV9FTlRJVFkpXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRW50aXR5Q2xhc3M6IEVudGl0eUNsYXNzTmV3YWJsZTxFbnRpdHlUeXBlPixcbiAgICAgICAgQEluamVjdChOR1hfRURJVF9EQVRBKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGlucHV0RGF0YTogUGFnZUVkaXREYXRhPEVudGl0eVR5cGU+XG4gICAgKSB7IH1cblxuICAgIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgUGFnZUVkaXREYXRhQnVpbGRlcih0aGlzLmlucHV0RGF0YSkuZ2V0UmVzdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb25maXJtTmF2aWdhdGVCYWNrKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVkaXQgZGF0YSB3YXMgcHJvdmlkZWQgZm9yIFwiTkdYX0VESVRfREFUQVwiLiBZb3UgbmVlZCB0byBwcm92aWRlIGEgdmFsdWUgaW4geW91ciByb3V0ZXMgcHJvdmlkZXJzIGFycmF5LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQ6IEVudGl0eVR5cGVba2V5b2YgRW50aXR5VHlwZV0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKSBhcyBFbnRpdHlUeXBlW2tleW9mIEVudGl0eVR5cGVdO1xuICAgICAgICBjb25zdCBmb3VuZEVudGl0eTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IGF3YWl0IHRoaXMuZW50aXR5U2VydmljZS5maW5kQnlJZChpZCk7XG5cbiAgICAgICAgaWYgKGZvdW5kRW50aXR5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybU5hdmlnYXRlQmFjaygpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBlbnRpdHkgd2l0aCBpZCAke2lkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRpdHkgPSBuZXcgdGhpcy5FbnRpdHlDbGFzcyhmb3VuZEVudGl0eSk7XG4gICAgICAgIHRoaXMuZW50aXR5UHJpb3JDaGFuZ2VzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmVudGl0eSk7XG5cbiAgICAgICAgdGhpcy5pc1JlYWRPbmx5ID0gIXRoaXMuZGF0YS5hbGxvd1VwZGF0ZSh0aGlzLmVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuZW50aXR5VGFicyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuZW50aXR5LCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgcGFnZSBjYW4gYmUgbGVmdCB3aXRob3V0IGNvbmZpcm1hdGlvbiAob2YgdW5zYXZlZCBjaGFuZ2VzKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBwYWdlIGNhbiBiZSBsZWZ0IHdpdGhvdXQgY29uZmlybWF0aW9uLlxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpiZWZvcmV1bmxvYWQnKVxuICAgIGNhbkRlYWN0aXZhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5oYXNVbnNhdmVkQ2hhbmdlcyB8fCB0aGlzLmluQ29uZmlybU5hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgaGFzIGJlY29tZSBpbnZhbGlkIG9yIGRpcnR5LlxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrRW50aXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmlzRW50aXR5VmFsaWQgPSBFbnRpdHlVdGlsaXRpZXMuaXNFbnRpdHlWYWxpZCh0aGlzLmVudGl0eSwgJ3VwZGF0ZScpO1xuICAgICAgICB0aGlzLmlzRW50aXR5RGlydHkgPSBhd2FpdCBFbnRpdHlVdGlsaXRpZXMuaXNEaXJ0eSh0aGlzLmVudGl0eSwgdGhpcy5lbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHNhdmUgdGhlIGNoYW5nZXMgYW5kIGNsb3NlIHRoZSBkaWFsb2cgYWZ0ZXJ3YXJkcy5cbiAgICAgKiBBbHNvIGhhbmRsZXMgdGhlIGNvbmZpcm1hdGlvbiBpZiByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBlZGl0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1JlYWRPbmx5IHx8ICF0aGlzLmlzRW50aXR5VmFsaWQgfHwgIXRoaXMuaXNFbnRpdHlEaXJ0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kYXRhLmVkaXREYXRhLmVkaXRSZXF1aXJlc0NvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybUVkaXQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLmRhdGEuZWRpdERhdGEuY29uZmlybUVkaXREaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgWydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gc2F2ZSBhbGwgY2hhbmdlcz8nXSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgnY29uZmlybUJ1dHRvbkxhYmVsJywgJ1NhdmUnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0aXRsZScsICdFZGl0JylcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm1FZGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybUVkaXQoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5lbnRpdHlTZXJ2aWNlLnVwZGF0ZSh0aGlzLmVudGl0eSwgdGhpcy5lbnRpdHlQcmlvckNoYW5nZXMpLnRoZW4oKCkgPT4gdGhpcy5jb25maXJtTmF2aWdhdGVCYWNrKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGRlbGV0ZSB0aGUgZW50aXR5IGFuZCBjbG9zZSB0aGUgZGlhbG9nIGFmdGVyd2FyZHMuXG4gICAgICogQWxzbyBoYW5kbGVzIHRoZSBjb25maXJtYXRpb24gaWYgcmVxdWlyZWQuXG4gICAgICovXG4gICAgZGVsZXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YS5lZGl0RGF0YS5kZWxldGVSZXF1aXJlc0NvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybURlbGV0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZGF0YS5lZGl0RGF0YS5jb25maXJtRGVsZXRlRGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIFsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGVudGl0eT8nXSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndHlwZScsICdkZWxldGUnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjb25maXJtQnV0dG9uTGFiZWwnLCAnRGVsZXRlJylcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCAnRGVsZXRlJylcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm1EZWxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maXJtRGVsZXRlKCk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMuZW50aXR5U2VydmljZVxuICAgICAgICAgICAgLmRlbGV0ZSh0aGlzLmVudGl0eVByaW9yQ2hhbmdlcylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuY29uZmlybU5hdmlnYXRlQmFjaygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmllcyB0byBuYXZpZ2F0ZSBiYWNrLlxuICAgICAqL1xuICAgIG5hdmlnYXRlQmFjaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Vuc2F2ZWRDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1OYXZpZ2F0ZUJhY2soKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlbkNvbmZpcm1OYXZpZ2F0aW9uRGlhbG9nKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtTmF2aWdhdGVCYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBjb25maXJtIGRpYWxvZyBmb3IgbmF2aWdhdGluZyB3aXRoIHVuc2F2ZWQgY2hhbmdlcy5cbiAgICAgKiBUaGlzIGlzIGV4cG9zZWQgYmVjYXVzZSB0aGUgVW5zYXZlZENoYW5nZXNHdWFyZCBuZWVkcyB0byBhY2Nlc3MgdGhpcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBmaXJzdCBvYnNlcnZhYmxlIHJlc3VsdCBvZiB0aGUgY29uZmlybSBkaWFsb2cuXG4gICAgICovXG4gICAgb3BlbkNvbmZpcm1OYXZpZ2F0aW9uRGlhbG9nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLmVkaXREYXRhLmNvbmZpcm1VbnNhdmVkQ2hhbmdlc0RpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnBpcGUoZmlyc3QoKSwgbWFwKHAgPT4gKHAgPz8gZmFsc2UpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maXJtTmF2aWdhdGVCYWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluQ29uZmlybU5hdmlnYXRpb24gPSB0cnVlO1xuICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5lbnRpdHksIHRoaXMuZW50aXR5UHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgfVxufSIsIjxkaXYgKm5nSWY9XCIhZW50aXR5VGFicyAmJiBkYXRhLmRpc3BsYXlMb2FkaW5nU3Bpbm5lclwiIGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPGJyPlxuICAgIDxtYXQtc3Bpbm5lciBzdHlsZT1cIm1hcmdpbi1sZWZ0OiBhdXRvOyBtYXJnaW4tcmlnaHQ6IGF1dG87XCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8YnI+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImVudGl0eVRhYnNcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgIDxicj5cblxuICAgIDwhLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0gSGVhZGVyIC0tPlxuICAgIDwhLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtjbGFzcy51bnNhdmVkQ2hhbmdlc109XCJoYXNVbnNhdmVkQ2hhbmdlc1wiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJuYXZpZ2F0ZUJhY2soKVwiIGNsYXNzPVwiYmFjay1idXR0b25cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0XCI+PC9pPlxuICAgICAgICAgICAgICAgIHt7ZGF0YS5lZGl0RGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtd2FybmluZ1wiIHN0eWxlPVwiY29sb3I6IG9yYW5nZTtcIiAqbmdJZj1cImhhc1Vuc2F2ZWRDaGFuZ2VzXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJlZGl0KClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNSZWFkT25seSB8fCAhaXNFbnRpdHlWYWxpZCB8fCAhaXNFbnRpdHlEaXJ0eVwiPlxuICAgICAgICAgICAgICAgIHt7ZGF0YS5lZGl0RGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImRhdGEuYWxsb3dEZWxldGUoZW50aXR5KVwiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJkZWxldGUoKVwiIGNvbG9yPVwid2FyblwiIGNsYXNzPVwiZGVsZXRlLWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICAgIHt7ZGF0YS5lZGl0RGF0YS5kZWxldGVCdXR0b25MYWJlbH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGgxPnt7ZGF0YS5lZGl0RGF0YS50aXRsZShlbnRpdHlQcmlvckNoYW5nZXMpfX08L2gxPlxuXG4gICAgPCEtLS0tLS0tLS0tLT5cbiAgICA8IS0tIElucHV0IC0tPlxuICAgIDwhLS0tLS0tLS0tLS0+XG4gICAgPGZvcm0+XG4gICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiZW50aXR5VGFicy5sZW5ndGggPiAxXCIgcHJlc2VydmVDb250ZW50PlxuICAgICAgICAgICAgPG1hdC10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiBlbnRpdHlUYWJzXCIgW2xhYmVsXT1cInRhYi50YWJOYW1lXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgdGFiLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yRWRpdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGVudGl0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChlbnRpdHksIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoZW50aXR5LCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tFbnRpdHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJlbnRpdHlUYWJzLmxlbmd0aCA8PSAxXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBlbnRpdHlUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiZW50aXR5XCJcbiAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGVudGl0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChlbnRpdHksIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoZW50aXR5LCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJjaGVja0VudGl0eSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cImVkaXQoKVwiIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc1JlYWRPbmx5IHx8ICFpc0VudGl0eVZhbGlkIHx8ICFpc0VudGl0eURpcnR5XCI+XG4gICAgICAgICAgICB7e2RhdGEuZWRpdERhdGEuY29uZmlybUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9mb3JtPlxuXG4gICAgPGJyPlxuPC9kaXY+Il19
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BaseBuilder } from '../../classes/base.builder';
|
|
2
|
+
import { ConfirmDialogDataBuilder } from '../confirm-dialog/confirm-dialog-data.builder';
|
|
3
|
+
import { EditDialogDataBuilder } from '../table/edit-dialog/edit-data.builder';
|
|
4
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
5
|
+
export class PageEditDataBuilder extends BaseBuilder {
|
|
6
|
+
constructor(data) {
|
|
7
|
+
super(data);
|
|
8
|
+
}
|
|
9
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
10
|
+
generateBaseData(data) {
|
|
11
|
+
const editDialogData = new EditDialogDataBuilder(data.editData)
|
|
12
|
+
.withDefault('cancelButtonLabel', 'Back')
|
|
13
|
+
.getResult();
|
|
14
|
+
// eslint-disable-next-line max-len
|
|
15
|
+
const confirmUnsavedChangesDialogData = new ConfirmDialogDataBuilder(data.editData?.confirmUnsavedChangesDialogData)
|
|
16
|
+
.withDefault('title', 'Unsaved Changes')
|
|
17
|
+
.withDefault('text', ['You have unsaved changes that will be deleted when you leave this page.', 'Continue?'])
|
|
18
|
+
.withDefault('confirmButtonLabel', 'Leave')
|
|
19
|
+
.getResult();
|
|
20
|
+
return {
|
|
21
|
+
editData: {
|
|
22
|
+
...editDialogData,
|
|
23
|
+
confirmUnsavedChangesDialogData: confirmUnsavedChangesDialogData,
|
|
24
|
+
unsavedChangesRequireConfirmDialog: data.editData?.unsavedChangesRequireConfirmDialog ?? true
|
|
25
|
+
},
|
|
26
|
+
allowUpdate: data.allowUpdate ?? (() => true),
|
|
27
|
+
allowDelete: data.allowDelete ?? (() => true),
|
|
28
|
+
displayLoadingSpinner: data.displayLoadingSpinner ?? true
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1lZGl0LWRhdGEuYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvZWRpdC1wYWdlL3BhZ2UtZWRpdC1kYXRhLmJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSwrQ0FBK0MsQ0FBQztBQUNwSCxPQUFPLEVBQW9CLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFpQmpHLCtDQUErQztBQUMvQyxNQUFNLE9BQU8sbUJBQ1QsU0FBUSxXQUF1RTtJQUUvRSxZQUFZLElBQThCO1FBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsK0NBQStDO0lBQ3JDLGdCQUFnQixDQUFDLElBQThCO1FBQ3JELE1BQU0sY0FBYyxHQUFpQyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDeEYsV0FBVyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQzthQUN4QyxTQUFTLEVBQUUsQ0FBQztRQUNqQixtQ0FBbUM7UUFDbkMsTUFBTSwrQkFBK0IsR0FBOEIsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLCtCQUErQixDQUFDO2FBQzFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUM7YUFDdkMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLHlFQUF5RSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQzdHLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUM7YUFDMUMsU0FBUyxFQUFFLENBQUM7UUFFakIsT0FBTztZQUNILFFBQVEsRUFBRTtnQkFDTixHQUFHLGNBQWM7Z0JBQ2pCLCtCQUErQixFQUFFLCtCQUErQjtnQkFDaEUsa0NBQWtDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxrQ0FBa0MsSUFBSSxJQUFJO2FBQ2hHO1lBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDN0MsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDN0MscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUk7U0FDNUQsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VCdWlsZGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9iYXNlLmJ1aWxkZXInO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBDb25maXJtRGlhbG9nRGF0YUJ1aWxkZXIsIENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgfSBmcm9tICcuLi9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgRWRpdERhdGFJbnRlcm5hbCwgRWRpdERpYWxvZ0RhdGFCdWlsZGVyIH0gZnJvbSAnLi4vdGFibGUvZWRpdC1kaWFsb2cvZWRpdC1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgRWRpdEVudGl0eURhdGFJbnRlcm5hbCB9IGZyb20gJy4uL3RhYmxlL2VkaXQtZGlhbG9nL2VkaXQtZW50aXR5LmJ1aWxkZXInO1xuaW1wb3J0IHsgUGFnZUVkaXREYXRhIH0gZnJvbSAnLi9lZGl0LXBhZ2UuY29tcG9uZW50JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2MsIG1heC1sZW5cbmV4cG9ydCB0eXBlIFBhZ2VFZGl0RGF0YUludGVybmFsPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4gPSBPbWl0PEVkaXRFbnRpdHlEYXRhSW50ZXJuYWw8RW50aXR5VHlwZT4sICdlbnRpdHknIHwgJ0VudGl0eVNlcnZpY2VDbGFzcyc+ICYge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgZGlzcGxheUxvYWRpbmdTcGlubmVyOiBib29sZWFuLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgZWRpdERhdGE6IEVkaXREYXRhSW50ZXJuYWw8RW50aXR5VHlwZT4gJiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgICAgIGNvbmZpcm1VbnNhdmVkQ2hhbmdlc0RpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgICAgIHVuc2F2ZWRDaGFuZ2VzUmVxdWlyZUNvbmZpcm1EaWFsb2c6IGJvb2xlYW5cbiAgICB9XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGNsYXNzIFBhZ2VFZGl0RGF0YUJ1aWxkZXI8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PlxuICAgIGV4dGVuZHMgQmFzZUJ1aWxkZXI8UGFnZUVkaXREYXRhSW50ZXJuYWw8RW50aXR5VHlwZT4sIFBhZ2VFZGl0RGF0YTxFbnRpdHlUeXBlPj4ge1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFnZUVkaXREYXRhPEVudGl0eVR5cGU+KSB7XG4gICAgICAgIHN1cGVyKGRhdGEpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlQmFzZURhdGEoZGF0YTogUGFnZUVkaXREYXRhPEVudGl0eVR5cGU+KTogUGFnZUVkaXREYXRhSW50ZXJuYWw8RW50aXR5VHlwZT4ge1xuICAgICAgICBjb25zdCBlZGl0RGlhbG9nRGF0YTogRWRpdERhdGFJbnRlcm5hbDxFbnRpdHlUeXBlPiA9IG5ldyBFZGl0RGlhbG9nRGF0YUJ1aWxkZXIoZGF0YS5lZGl0RGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgnY2FuY2VsQnV0dG9uTGFiZWwnLCAnQmFjaycpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIGNvbnN0IGNvbmZpcm1VbnNhdmVkQ2hhbmdlc0RpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKGRhdGEuZWRpdERhdGE/LmNvbmZpcm1VbnNhdmVkQ2hhbmdlc0RpYWxvZ0RhdGEpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgJ1Vuc2F2ZWQgQ2hhbmdlcycpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RleHQnLCBbJ1lvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IHdpbGwgYmUgZGVsZXRlZCB3aGVuIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJywgJ0NvbnRpbnVlPyddKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjb25maXJtQnV0dG9uTGFiZWwnLCAnTGVhdmUnKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlZGl0RGF0YToge1xuICAgICAgICAgICAgICAgIC4uLmVkaXREaWFsb2dEYXRhLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1VbnNhdmVkQ2hhbmdlc0RpYWxvZ0RhdGE6IGNvbmZpcm1VbnNhdmVkQ2hhbmdlc0RpYWxvZ0RhdGEsXG4gICAgICAgICAgICAgICAgdW5zYXZlZENoYW5nZXNSZXF1aXJlQ29uZmlybURpYWxvZzogZGF0YS5lZGl0RGF0YT8udW5zYXZlZENoYW5nZXNSZXF1aXJlQ29uZmlybURpYWxvZyA/PyB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWxsb3dVcGRhdGU6IGRhdGEuYWxsb3dVcGRhdGUgPz8gKCgpID0+IHRydWUpLFxuICAgICAgICAgICAgYWxsb3dEZWxldGU6IGRhdGEuYWxsb3dEZWxldGUgPz8gKCgpID0+IHRydWUpLFxuICAgICAgICAgICAgZGlzcGxheUxvYWRpbmdTcGlubmVyOiBkYXRhLmRpc3BsYXlMb2FkaW5nU3Bpbm5lciA/PyB0cnVlXG4gICAgICAgIH07XG4gICAgfVxufSJdfQ==
|