ngx-material-entity 18.0.1 → 18.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/components/custom-table/custom-table-configuration.model.d.ts +65 -0
- package/components/custom-table/custom-table.component.d.ts +111 -0
- package/components/edit-page/edit-page.component.d.ts +5 -1
- package/components/input/array/array-date-input/array-date-input.component.d.ts +2 -2
- package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +3 -3
- package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +3 -3
- package/components/input/array/array-table.class.d.ts +25 -19
- package/components/input/input.component.d.ts +99 -80
- package/components/input/relations/references-many-input/references-many-input.component.d.ts +12 -17
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +5 -5
- package/components/table/table-data.d.ts +9 -4
- package/components/table/table.component.d.ts +15 -37
- package/decorators/array/array-decorator-internal.data.d.ts +5 -1
- package/decorators/array/array-decorator.data.d.ts +38 -82
- package/decorators/references-many/references-many-decorator-internal.data.d.ts +3 -1
- package/decorators/references-many/references-many-decorator.data.d.ts +13 -1
- package/directives/dynamic-style-class.directive.d.ts +4 -5
- package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +5 -6
- package/esm2022/components/create-page/create-page.component.mjs +6 -7
- package/esm2022/components/custom-table/custom-table-configuration.model.mjs +37 -0
- package/esm2022/components/custom-table/custom-table.component.mjs +213 -0
- package/esm2022/components/edit-page/edit-page.component.mjs +19 -9
- package/esm2022/components/form/form.component.mjs +5 -6
- package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +16 -20
- package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +27 -26
- package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +17 -21
- package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +4 -4
- package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +4 -4
- package/esm2022/components/input/array/array-table.class.mjs +51 -43
- package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +5 -6
- package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +4 -4
- package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +4 -7
- package/esm2022/components/input/file/file-input/file-input.component.mjs +4 -5
- package/esm2022/components/input/input.component.mjs +143 -106
- package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +4 -5
- package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +40 -55
- package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +4 -5
- package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +4 -5
- package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +4 -4
- package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +7 -8
- package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +19 -14
- package/esm2022/components/table/table-data.mjs +1 -1
- package/esm2022/components/table/table.component.mjs +40 -107
- package/esm2022/components/tooltip/tooltip.component.mjs +3 -3
- package/esm2022/decorators/array/array-decorator-internal.data.mjs +14 -1
- package/esm2022/decorators/array/array-decorator.data.mjs +33 -2
- package/esm2022/decorators/has-many/has-many-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/references-many/references-many-decorator-internal.data.mjs +8 -1
- package/esm2022/decorators/references-many/references-many-decorator.data.mjs +1 -1
- package/esm2022/directives/dynamic-style-class.directive.mjs +5 -5
- package/esm2022/directives/tooltip.directive.mjs +4 -1
- package/esm2022/functions/get-changes-tooltip-content.function.mjs +23 -0
- package/esm2022/functions/get-validation-errors-tooltip-content.function.mjs +23 -0
- package/esm2022/functions/table-column-value-to-sort-value.function.mjs +29 -0
- package/esm2022/public-api.mjs +3 -2
- package/esm2022/utilities/date.utilities.mjs +7 -6
- package/esm2022/utilities/entity.utilities.mjs +23 -7
- package/esm2022/utilities/validation.utilities.mjs +2 -2
- package/fesm2022/ngx-material-entity.mjs +2545 -2224
- package/fesm2022/ngx-material-entity.mjs.map +1 -1
- package/functions/get-changes-tooltip-content.function.d.ts +13 -0
- package/functions/table-column-value-to-sort-value.function.d.ts +9 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -1
- package/utilities/entity.utilities.d.ts +7 -3
- package/esm2022/functions/get-validation-errors-tooltip-content.function.ts.mjs +0 -23
- /package/functions/{get-validation-errors-tooltip-content.function.ts.d.ts → get-validation-errors-tooltip-content.function.d.ts} +0 -0
|
@@ -7,7 +7,7 @@ import { EditEntityDataInternal } from './edit-entity.builder';
|
|
|
7
7
|
import { BaseEntityType } from '../../../classes/entity.model';
|
|
8
8
|
import { NgxGlobalDefaultValues } from '../../../global-configuration-values';
|
|
9
9
|
import { EntityService } from '../../../services/entity.service';
|
|
10
|
-
import {
|
|
10
|
+
import { Difference, EntityUtilities } from '../../../utilities/entity.utilities';
|
|
11
11
|
import { ValidationError } from '../../../utilities/validation.utilities';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
13
|
/**
|
|
@@ -31,10 +31,6 @@ export declare class NgxMatEntityEditDialogComponent<EntityType extends BaseEnti
|
|
|
31
31
|
* Contains HelperMethods around handling Entities and their property-metadata.
|
|
32
32
|
*/
|
|
33
33
|
EntityUtilities: typeof EntityUtilities;
|
|
34
|
-
/**
|
|
35
|
-
* The tabs of the dialog.
|
|
36
|
-
*/
|
|
37
|
-
entityTabs: EntityTab<EntityType>[];
|
|
38
34
|
/**
|
|
39
35
|
* The service of the provided entity.
|
|
40
36
|
*/
|
|
@@ -59,6 +55,10 @@ export declare class NgxMatEntityEditDialogComponent<EntityType extends BaseEnti
|
|
|
59
55
|
* The validation errors of the entity.
|
|
60
56
|
*/
|
|
61
57
|
validationErrors: ValidationError[];
|
|
58
|
+
/**
|
|
59
|
+
* All the changes that have been done to the entity.
|
|
60
|
+
*/
|
|
61
|
+
changes: Difference<EntityType>[];
|
|
62
62
|
/**
|
|
63
63
|
* What to display inside the tooltip.
|
|
64
64
|
*/
|
|
@@ -2,10 +2,14 @@ import { Type } from '@angular/core';
|
|
|
2
2
|
import { NgxMatEntityBaseDisplayColumnValueComponent } from './display-column-value/base-display-column-value.component';
|
|
3
3
|
import { BaseEntityType, EntityClassNewable, EntityServiceClassNewable } from '../../classes/entity.model';
|
|
4
4
|
import { ConfirmDialogData } from '../confirm-dialog/confirm-dialog-data';
|
|
5
|
+
/**
|
|
6
|
+
* The value that can be displayed inside a table column.
|
|
7
|
+
*/
|
|
8
|
+
export type TableColumnValue = string | number | Date;
|
|
5
9
|
/**
|
|
6
10
|
* The Definition of a Column inside the table.
|
|
7
11
|
*/
|
|
8
|
-
export interface DisplayColumn<
|
|
12
|
+
export interface DisplayColumn<T> {
|
|
9
13
|
/**
|
|
10
14
|
* The name inside the header.
|
|
11
15
|
*/
|
|
@@ -13,12 +17,12 @@ export interface DisplayColumn<EntityType extends BaseEntityType<EntityType>> {
|
|
|
13
17
|
/**
|
|
14
18
|
* What to display inside the row.
|
|
15
19
|
*/
|
|
16
|
-
value: (
|
|
20
|
+
value: (value: T) => TableColumnValue;
|
|
17
21
|
/**
|
|
18
22
|
* A custom component to use instead of the value.
|
|
19
23
|
* You still need to provide a value function for the sorting by header to work.
|
|
20
24
|
*/
|
|
21
|
-
Component?: Type<NgxMatEntityBaseDisplayColumnValueComponent<
|
|
25
|
+
Component?: Type<NgxMatEntityBaseDisplayColumnValueComponent<T>>;
|
|
22
26
|
/**
|
|
23
27
|
* Whether or not the click event should be disabled.
|
|
24
28
|
* This can be useful if your component has a custom way to handle clicks.
|
|
@@ -28,7 +32,7 @@ export interface DisplayColumn<EntityType extends BaseEntityType<EntityType>> {
|
|
|
28
32
|
/**
|
|
29
33
|
* Dynamic css class that should be applied based on a condition.
|
|
30
34
|
*/
|
|
31
|
-
export type DynamicStyleClasses<
|
|
35
|
+
export type DynamicStyleClasses<T> = (value: T) => string[];
|
|
32
36
|
/**
|
|
33
37
|
* A table action that will run regardless if something has been selected in the table.
|
|
34
38
|
*/
|
|
@@ -197,6 +201,7 @@ export interface BaseData<EntityType extends BaseEntityType<EntityType>> {
|
|
|
197
201
|
* Configuration for css classes that should be applied to table rows based on a condition.
|
|
198
202
|
* This could be used to eg. Set the background color to green when an item has the status completed etc.
|
|
199
203
|
* INFO: You need to use ng-deep or apply the styling in the styles.scss.
|
|
204
|
+
* @default () => []
|
|
200
205
|
*/
|
|
201
206
|
dynamicRowStyleClasses?: DynamicStyleClasses<EntityType>;
|
|
202
207
|
}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import { SelectionModel } from '@angular/cdk/collections';
|
|
2
1
|
import { EnvironmentInjector, EventEmitter, OnInit } from '@angular/core';
|
|
3
2
|
import { MatDialog } from '@angular/material/dialog';
|
|
4
|
-
import { MatPaginator } from '@angular/material/paginator';
|
|
5
|
-
import { MatSort } from '@angular/material/sort';
|
|
6
|
-
import { MatTableDataSource } from '@angular/material/table';
|
|
7
3
|
import { Router } from '@angular/router';
|
|
8
4
|
import { DisplayColumn, TableData } from './table-data';
|
|
9
5
|
import { BaseTableActionInternal, TableActionInternal, TableDataInternal } from './table-data.builder';
|
|
10
6
|
import { BaseEntityType, Entity } from '../../classes/entity.model';
|
|
11
7
|
import { NgxGlobalDefaultValues } from '../../global-configuration-values';
|
|
12
|
-
import {
|
|
8
|
+
import { CustomTableConfiguration } from '../custom-table/custom-table-configuration.model';
|
|
13
9
|
import * as i0 from "@angular/core";
|
|
14
10
|
/**
|
|
15
11
|
* Generates a fully functional table for displaying, creating, updating and deleting entities
|
|
@@ -35,42 +31,30 @@ export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityTyp
|
|
|
35
31
|
*/
|
|
36
32
|
data: TableDataInternal<EntityType>;
|
|
37
33
|
/**
|
|
38
|
-
*
|
|
39
|
-
*/
|
|
40
|
-
isLoading: boolean;
|
|
41
|
-
/**
|
|
42
|
-
* Whether or not the current user is allowed to create entries for the table.
|
|
43
|
-
*/
|
|
44
|
-
allowCreate: boolean;
|
|
45
|
-
private entityService;
|
|
46
|
-
/**
|
|
47
|
-
* The paginator from the html.
|
|
34
|
+
* Configuration for the table.
|
|
48
35
|
*/
|
|
49
|
-
|
|
36
|
+
tableConfig: CustomTableConfiguration<EntityType>;
|
|
50
37
|
/**
|
|
51
|
-
* The
|
|
38
|
+
* The entities to display inside the table.
|
|
52
39
|
*/
|
|
53
|
-
|
|
40
|
+
entities: EntityType[];
|
|
54
41
|
/**
|
|
55
|
-
*
|
|
42
|
+
* A search string for filtering table results.
|
|
56
43
|
*/
|
|
57
|
-
|
|
44
|
+
searchString: string;
|
|
58
45
|
/**
|
|
59
|
-
* The
|
|
46
|
+
* The currently selected entities.
|
|
60
47
|
*/
|
|
61
|
-
|
|
48
|
+
selected: EntityType[];
|
|
62
49
|
/**
|
|
63
|
-
*
|
|
64
|
-
*/
|
|
65
|
-
dataSource: MatTableDataSource<EntityType>;
|
|
66
|
-
/**
|
|
67
|
-
* The selection of the table.
|
|
50
|
+
* Whether or not the table content is currently loading.
|
|
68
51
|
*/
|
|
69
|
-
|
|
52
|
+
isLoading: boolean;
|
|
70
53
|
/**
|
|
71
|
-
*
|
|
54
|
+
* Whether or not the current user is allowed to create entries for the table.
|
|
72
55
|
*/
|
|
73
|
-
|
|
56
|
+
allowCreate: boolean;
|
|
57
|
+
private entityService;
|
|
74
58
|
/**
|
|
75
59
|
* The internal BaseTableAction. Sets default values.
|
|
76
60
|
*/
|
|
@@ -93,10 +77,9 @@ export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityTyp
|
|
|
93
77
|
/**
|
|
94
78
|
* Edits an entity. This either calls the edit-Method provided by the user or uses a default edit-dialog.
|
|
95
79
|
* @param entity - The entity that should be updated.
|
|
96
|
-
* @param dCol - The display column. Is needed if a custom component was used that handles the click event differently.
|
|
97
80
|
* @throws When no EntityClass was provided, as a new call is needed to initialize metadata.
|
|
98
81
|
*/
|
|
99
|
-
editEntity(entity: EntityType
|
|
82
|
+
editEntity(entity: EntityType): void;
|
|
100
83
|
/**
|
|
101
84
|
* Whether updating the provided entity is allowed.
|
|
102
85
|
* @param entity - The entity that the user wants to edit.
|
|
@@ -131,11 +114,6 @@ export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityTyp
|
|
|
131
114
|
* @returns Whether or not the Action can be used.
|
|
132
115
|
*/
|
|
133
116
|
tableActionDisabled(action: TableActionInternal<EntityType>): boolean;
|
|
134
|
-
/**
|
|
135
|
-
* Applies the search input to filter the table entries.
|
|
136
|
-
* @param event - The keyup-event which contains the search-string of the user.
|
|
137
|
-
*/
|
|
138
|
-
applyFilter(event: Event): void;
|
|
139
117
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgxMatEntityTableComponent<any>, never>;
|
|
140
118
|
static ɵcmp: i0.ɵɵComponentDeclaration<NgxMatEntityTableComponent<any>, "ngx-mat-entity-table", never, { "tableData": { "alias": "tableData"; "required": true; }; }, { "unsavedDialogChanges": "unsavedDialogChanges"; }, never, never, true, never>;
|
|
141
119
|
}
|
|
@@ -2,7 +2,7 @@ import { DateFilterFn } from '@angular/material/datepicker';
|
|
|
2
2
|
import { AutocompleteStringChipsArrayDecoratorConfig, DateArrayDecoratorConfig, DateRangeArrayDecoratorConfig, DateTimeArrayDecoratorConfig, EditArrayItemDialogData, EntityArrayDecoratorConfig, StringChipsArrayDecoratorConfig } from './array-decorator.data';
|
|
3
3
|
import { BaseEntityType, EntityClassNewable } from '../../classes/entity.model';
|
|
4
4
|
import { ConfirmDialogData } from '../../components/confirm-dialog/confirm-dialog-data';
|
|
5
|
-
import { CreateData, DisplayColumn } from '../../components/table/table-data';
|
|
5
|
+
import { CreateData, DisplayColumn, DynamicStyleClasses } from '../../components/table/table-data';
|
|
6
6
|
import { NgxGlobalDefaultValues } from '../../global-configuration-values';
|
|
7
7
|
import { Time } from '../../utilities/date.utilities';
|
|
8
8
|
import { DecoratorTypes } from '../base/decorator-types.enum';
|
|
@@ -28,6 +28,7 @@ export declare class EntityArrayDecoratorConfigInternal<EntityType extends BaseE
|
|
|
28
28
|
duplicatesErrorDialog: ConfirmDialogData;
|
|
29
29
|
EntityClass: EntityClassNewable<EntityType>;
|
|
30
30
|
displayColumns: DisplayColumn<EntityType>[];
|
|
31
|
+
dynamicRowStyleClasses: DynamicStyleClasses<EntityType>;
|
|
31
32
|
createDialogData?: CreateData;
|
|
32
33
|
editDialogData: EditArrayItemDialogDataInternal<EntityType>;
|
|
33
34
|
createInline: boolean;
|
|
@@ -47,6 +48,7 @@ export declare class DateArrayDecoratorConfigInternal extends PropertyDecoratorC
|
|
|
47
48
|
addButtonLabel: string;
|
|
48
49
|
removeButtonLabel: string;
|
|
49
50
|
missingErrorMessage: string;
|
|
51
|
+
dynamicRowStyleClasses: DynamicStyleClasses<Date>;
|
|
50
52
|
min?: (date?: Date) => Date;
|
|
51
53
|
max?: (date?: Date) => Date;
|
|
52
54
|
filter?: DateFilterFn<Date | null | undefined>;
|
|
@@ -65,6 +67,7 @@ export declare class DateTimeArrayDecoratorConfigInternal extends PropertyDecora
|
|
|
65
67
|
missingErrorMessage: string;
|
|
66
68
|
times: DropdownValue<Time>[];
|
|
67
69
|
timeDisplayName: string;
|
|
70
|
+
dynamicRowStyleClasses: DynamicStyleClasses<Date>;
|
|
68
71
|
minDate?: (date?: Date) => Date;
|
|
69
72
|
maxDate?: (date?: Date) => Date;
|
|
70
73
|
filterDate?: DateFilterFn<Date | null | undefined>;
|
|
@@ -86,6 +89,7 @@ export declare class DateRangeArrayDecoratorConfigInternal extends PropertyDecor
|
|
|
86
89
|
missingErrorMessage: string;
|
|
87
90
|
placeholderStart: string;
|
|
88
91
|
placeholderEnd: string;
|
|
92
|
+
dynamicRowStyleClasses: DynamicStyleClasses<DateRange>;
|
|
89
93
|
minStart?: (date?: Date) => Date;
|
|
90
94
|
maxStart?: (date?: Date) => Date;
|
|
91
95
|
minEnd?: (date?: Date) => Date;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DateFilterFn } from '@angular/material/datepicker';
|
|
2
2
|
import { BaseEntityType, EntityClassNewable } from '../../classes/entity.model';
|
|
3
3
|
import { ConfirmDialogData } from '../../components/confirm-dialog/confirm-dialog-data';
|
|
4
|
-
import { CreateData, DisplayColumn } from '../../components/table/table-data';
|
|
4
|
+
import { CreateData, DisplayColumn, DynamicStyleClasses } from '../../components/table/table-data';
|
|
5
5
|
import { Time } from '../../utilities/date.utilities';
|
|
6
6
|
import { DecoratorTypes } from '../base/decorator-types.enum';
|
|
7
7
|
import { DropdownValue } from '../base/dropdown-value.interface';
|
|
@@ -9,7 +9,7 @@ import { PropertyDecoratorConfig } from '../base/property-decorator.data';
|
|
|
9
9
|
import { DateRange } from '../date/date-decorator.data';
|
|
10
10
|
import { StringAutocompleteValues } from '../string/string-decorator.data';
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Base definition for the @array metadata.
|
|
13
13
|
*/
|
|
14
14
|
export declare abstract class ArrayDecoratorConfig<ValueType> extends PropertyDecoratorConfig<ValueType> {
|
|
15
15
|
/**
|
|
@@ -26,6 +26,37 @@ export declare abstract class ArrayDecoratorConfig<ValueType> extends PropertyDe
|
|
|
26
26
|
*/
|
|
27
27
|
duplicatesErrorDialog?: ConfirmDialogData;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Base definition for the @array table metadata.
|
|
31
|
+
*/
|
|
32
|
+
declare abstract class ArrayTableDecoratorConfig<ValueType> extends ArrayDecoratorConfig<ValueType[]> {
|
|
33
|
+
/**
|
|
34
|
+
* The definition of the columns to display. Consists of the displayName to show in the header of the row
|
|
35
|
+
* and the value, which is a function that generates the value to display inside a column.
|
|
36
|
+
*/
|
|
37
|
+
displayColumns: DisplayColumn<ValueType>[];
|
|
38
|
+
/**
|
|
39
|
+
* Configuration for css classes that should be applied to table rows based on a condition.
|
|
40
|
+
* This could be used to eg. Set the background color to green when an item has the status completed etc.
|
|
41
|
+
* INFO: You need to use ng-deep or apply the styling in the styles.scss.
|
|
42
|
+
* @default () => []
|
|
43
|
+
*/
|
|
44
|
+
dynamicRowStyleClasses?: DynamicStyleClasses<ValueType>;
|
|
45
|
+
/**
|
|
46
|
+
* The error-message to display when the array is required but contains no values.
|
|
47
|
+
*/
|
|
48
|
+
missingErrorMessage?: string;
|
|
49
|
+
/**
|
|
50
|
+
* The label for the add button.
|
|
51
|
+
* @default 'Add'
|
|
52
|
+
*/
|
|
53
|
+
addButtonLabel?: string;
|
|
54
|
+
/**
|
|
55
|
+
* The label for the remove button.
|
|
56
|
+
* @default 'Remove'
|
|
57
|
+
*/
|
|
58
|
+
removeButtonLabel?: string;
|
|
59
|
+
}
|
|
29
60
|
/**
|
|
30
61
|
* The dialog data for the entities array edit dialog.
|
|
31
62
|
*/
|
|
@@ -46,17 +77,12 @@ export interface EditArrayItemDialogData<EntityType extends BaseEntityType<Entit
|
|
|
46
77
|
/**
|
|
47
78
|
* Definition for an array of Entities.
|
|
48
79
|
*/
|
|
49
|
-
export interface EntityArrayDecoratorConfig<EntityType extends BaseEntityType<EntityType>> extends
|
|
80
|
+
export interface EntityArrayDecoratorConfig<EntityType extends BaseEntityType<EntityType>> extends ArrayTableDecoratorConfig<EntityType> {
|
|
50
81
|
itemType: DecoratorTypes.OBJECT;
|
|
51
82
|
/**
|
|
52
83
|
* The EntityClass used for generating the create inputs.
|
|
53
84
|
*/
|
|
54
85
|
EntityClass: EntityClassNewable<EntityType>;
|
|
55
|
-
/**
|
|
56
|
-
* The definition of the columns to display. Consists of the displayName to show in the header of the row
|
|
57
|
-
* and the value, which is a function that generates the value to display inside a column.
|
|
58
|
-
*/
|
|
59
|
-
displayColumns: DisplayColumn<EntityType>[];
|
|
60
86
|
/**
|
|
61
87
|
* The data for the add-item-dialog.
|
|
62
88
|
* Can be omitted when adding items inline.
|
|
@@ -73,45 +99,12 @@ export interface EntityArrayDecoratorConfig<EntityType extends BaseEntityType<En
|
|
|
73
99
|
* @default true
|
|
74
100
|
*/
|
|
75
101
|
createInline?: boolean;
|
|
76
|
-
/**
|
|
77
|
-
* The label for the add button when createInline is true.
|
|
78
|
-
* @default 'Add'
|
|
79
|
-
*/
|
|
80
|
-
addButtonLabel?: string;
|
|
81
|
-
/**
|
|
82
|
-
* The label for the remove button when createInline is true.
|
|
83
|
-
* @default 'Remove'
|
|
84
|
-
*/
|
|
85
|
-
removeButtonLabel?: string;
|
|
86
|
-
/**
|
|
87
|
-
* The error-message to display when the array is required but contains no values.
|
|
88
|
-
*/
|
|
89
|
-
missingErrorMessage?: string;
|
|
90
102
|
}
|
|
91
103
|
/**
|
|
92
104
|
* Definition for an array of Dates.
|
|
93
105
|
*/
|
|
94
|
-
export interface DateArrayDecoratorConfig extends
|
|
106
|
+
export interface DateArrayDecoratorConfig extends ArrayTableDecoratorConfig<Date> {
|
|
95
107
|
itemType: DecoratorTypes.DATE;
|
|
96
|
-
/**
|
|
97
|
-
* The definition of the columns to display. Consists of the displayName to show in the header of the row
|
|
98
|
-
* and the value, which is a function that generates the value to display inside a column.
|
|
99
|
-
*/
|
|
100
|
-
displayColumns: DisplayColumn<Date>[];
|
|
101
|
-
/**
|
|
102
|
-
* The label for the add button.
|
|
103
|
-
* @default 'Add'
|
|
104
|
-
*/
|
|
105
|
-
addButtonLabel?: string;
|
|
106
|
-
/**
|
|
107
|
-
* The label for the remove button.
|
|
108
|
-
* @default 'Remove'
|
|
109
|
-
*/
|
|
110
|
-
removeButtonLabel?: string;
|
|
111
|
-
/**
|
|
112
|
-
* The error-message to display when the array is required but contains no values.
|
|
113
|
-
*/
|
|
114
|
-
missingErrorMessage?: string;
|
|
115
108
|
/**
|
|
116
109
|
* A function to get the minimum value of the date.
|
|
117
110
|
*/
|
|
@@ -128,27 +121,8 @@ export interface DateArrayDecoratorConfig extends ArrayDecoratorConfig<Date[]> {
|
|
|
128
121
|
/**
|
|
129
122
|
* Definition for an array of DateTimes.
|
|
130
123
|
*/
|
|
131
|
-
export interface DateTimeArrayDecoratorConfig extends
|
|
124
|
+
export interface DateTimeArrayDecoratorConfig extends ArrayTableDecoratorConfig<Date> {
|
|
132
125
|
itemType: DecoratorTypes.DATE_TIME;
|
|
133
|
-
/**
|
|
134
|
-
* The definition of the columns to display. Consists of the displayName to show in the header of the row
|
|
135
|
-
* and the value, which is a function that generates the value to display inside a column.
|
|
136
|
-
*/
|
|
137
|
-
displayColumns: DisplayColumn<Date>[];
|
|
138
|
-
/**
|
|
139
|
-
* The label for the add button.
|
|
140
|
-
* @default 'Add'
|
|
141
|
-
*/
|
|
142
|
-
addButtonLabel?: string;
|
|
143
|
-
/**
|
|
144
|
-
* The label for the remove button.
|
|
145
|
-
* @default 'Remove'
|
|
146
|
-
*/
|
|
147
|
-
removeButtonLabel?: string;
|
|
148
|
-
/**
|
|
149
|
-
* The error-message to display when the array is required but contains no values.
|
|
150
|
-
*/
|
|
151
|
-
missingErrorMessage?: string;
|
|
152
126
|
/**
|
|
153
127
|
* The selectable times.
|
|
154
128
|
*/
|
|
@@ -186,27 +160,8 @@ export interface DateTimeArrayDecoratorConfig extends ArrayDecoratorConfig<Date[
|
|
|
186
160
|
/**
|
|
187
161
|
* Definition for an array of DateRanges.
|
|
188
162
|
*/
|
|
189
|
-
export interface DateRangeArrayDecoratorConfig extends
|
|
163
|
+
export interface DateRangeArrayDecoratorConfig extends ArrayTableDecoratorConfig<DateRange> {
|
|
190
164
|
itemType: DecoratorTypes.DATE_RANGE;
|
|
191
|
-
/**
|
|
192
|
-
* The definition of the columns to display. Consists of the displayName to show in the header of the row
|
|
193
|
-
* and the value, which is a function that generates the value to display inside a column.
|
|
194
|
-
*/
|
|
195
|
-
displayColumns: DisplayColumn<DateRange>[];
|
|
196
|
-
/**
|
|
197
|
-
* The label for the add button.
|
|
198
|
-
* @default 'Add'
|
|
199
|
-
*/
|
|
200
|
-
addButtonLabel?: string;
|
|
201
|
-
/**
|
|
202
|
-
* The label for the remove button.
|
|
203
|
-
* @default 'Remove'
|
|
204
|
-
*/
|
|
205
|
-
removeButtonLabel?: string;
|
|
206
|
-
/**
|
|
207
|
-
* The error-message to display when the array is required but contains no values.
|
|
208
|
-
*/
|
|
209
|
-
missingErrorMessage?: string;
|
|
210
165
|
/**
|
|
211
166
|
* A function to get the minimum value of the start date.
|
|
212
167
|
*/
|
|
@@ -293,3 +248,4 @@ export interface AutocompleteStringChipsArrayDecoratorConfig extends ArrayDecora
|
|
|
293
248
|
*/
|
|
294
249
|
restrictToOptions?: boolean;
|
|
295
250
|
}
|
|
251
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReferencesManyDecoratorConfig } from './references-many-decorator.data';
|
|
2
2
|
import { BaseEntityType } from '../../classes/entity.model';
|
|
3
|
-
import { DisplayColumn } from '../../components/table/table-data';
|
|
3
|
+
import { DisplayColumn, DynamicStyleClasses } from '../../components/table/table-data';
|
|
4
4
|
import { NgxGlobalDefaultValues } from '../../global-configuration-values';
|
|
5
5
|
import { DropdownValue } from '../base/dropdown-value.interface';
|
|
6
6
|
import { PropertyDecoratorConfigInternal } from '../base/property-decorator-internal.data';
|
|
@@ -11,6 +11,8 @@ export declare class ReferencesManyDecoratorConfigInternal<EntityType extends Ba
|
|
|
11
11
|
getReferencedEntities: () => Promise<EntityType[]>;
|
|
12
12
|
getDropdownValues: (referencedEntities: EntityType[]) => DropdownValue<string>[];
|
|
13
13
|
getEntityForId: (entityId: string, allReferencedEntities: EntityType[]) => EntityType;
|
|
14
|
+
emptyErrorMessage: string;
|
|
15
|
+
dynamicRowStyleClasses: DynamicStyleClasses<EntityType>;
|
|
14
16
|
displayColumns: DisplayColumn<EntityType>[];
|
|
15
17
|
addButtonLabel: string;
|
|
16
18
|
removeButtonLabel: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseEntityType } from '../../classes/entity.model';
|
|
2
|
-
import { DisplayColumn } from '../../components/table/table-data';
|
|
2
|
+
import { DisplayColumn, DynamicStyleClasses } from '../../components/table/table-data';
|
|
3
3
|
import { DropdownValue } from '../base/dropdown-value.interface';
|
|
4
4
|
import { PropertyDecoratorConfig } from '../base/property-decorator.data';
|
|
5
5
|
/**
|
|
@@ -18,6 +18,18 @@ export interface ReferencesManyDecoratorConfig<EntityType extends BaseEntityType
|
|
|
18
18
|
* Gets the referenced entity for the given id.
|
|
19
19
|
*/
|
|
20
20
|
getEntityForId?: (entityId: string, allReferencedEntities: EntityType[]) => EntityType;
|
|
21
|
+
/**
|
|
22
|
+
* The error message to display when an array property is required and empty.
|
|
23
|
+
* @default 'Needs to contain at least one value'
|
|
24
|
+
*/
|
|
25
|
+
emptyErrorMessage?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Configuration for css classes that should be applied to table rows based on a condition.
|
|
28
|
+
* This could be used to eg. Set the background color to green when an item has the status completed etc.
|
|
29
|
+
* INFO: You need to use ng-deep or apply the styling in the styles.scss.
|
|
30
|
+
* @default () => []
|
|
31
|
+
*/
|
|
32
|
+
dynamicRowStyleClasses?: DynamicStyleClasses<EntityType>;
|
|
21
33
|
/**
|
|
22
34
|
* The definition of the columns to display. Consists of the displayName to show in the header of the row
|
|
23
35
|
* and the value, which is a function that generates the value to display inside a column.
|
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
import { ElementRef, OnChanges, Renderer2 } from '@angular/core';
|
|
2
|
-
import { BaseEntityType } from '../classes/entity.model';
|
|
3
2
|
import { DynamicStyleClasses } from '../components/table/table-data';
|
|
4
3
|
import * as i0 from "@angular/core";
|
|
5
4
|
/**
|
|
6
5
|
* Dynamically applies css classes based on a provided function.
|
|
7
6
|
*/
|
|
8
|
-
export declare class DynamicStyleClassDirective<
|
|
7
|
+
export declare class DynamicStyleClassDirective<T> implements OnChanges {
|
|
9
8
|
private readonly element;
|
|
10
9
|
private readonly renderer;
|
|
11
10
|
private styleClassesApplied;
|
|
12
11
|
/**
|
|
13
12
|
* The function that gets the css classes to dynamically apply.
|
|
14
13
|
*/
|
|
15
|
-
dynamicStyleClasses: DynamicStyleClasses<
|
|
14
|
+
dynamicStyleClasses: DynamicStyleClasses<T>;
|
|
16
15
|
/**
|
|
17
16
|
* The input for the dynamic style classes function.
|
|
18
17
|
*/
|
|
19
|
-
|
|
18
|
+
value: T;
|
|
20
19
|
constructor(element: ElementRef, renderer: Renderer2);
|
|
21
20
|
ngOnChanges(): void;
|
|
22
21
|
private applyDynamicClasses;
|
|
23
22
|
static ɵfac: i0.ɵɵFactoryDeclaration<DynamicStyleClassDirective<any>, never>;
|
|
24
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<DynamicStyleClassDirective<any>, "[dynamicStyleClasses]", never, { "dynamicStyleClasses": { "alias": "dynamicStyleClasses"; "required": true; }; "
|
|
23
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<DynamicStyleClassDirective<any>, "[dynamicStyleClasses]", never, { "dynamicStyleClasses": { "alias": "dynamicStyleClasses"; "required": true; }; "value": { "alias": "value"; "required": true; }; }, {}, never, never, true, never>;
|
|
25
24
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
2
|
import { Component, Inject } from '@angular/core';
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
4
|
import { MatButtonModule } from '@angular/material/button';
|
|
@@ -50,18 +50,17 @@ export class NgxMatEntityConfirmDialogComponent {
|
|
|
50
50
|
this.dialogRef.close(false);
|
|
51
51
|
}
|
|
52
52
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgxMatEntityConfirmDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: NGX_COMPLETE_GLOBAL_DEFAULT_VALUES }], target: i0.ɵɵFactoryTarget.Component });
|
|
53
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: NgxMatEntityConfirmDialogComponent, isStandalone: true, selector: "ngx-mat-entity-confirm-dialog", ngImport: i0, template: "@if (data.title) {\n <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n @for (paragraph of data.text; track $index) {\n <p>{{paragraph}}</p>\n }\n @if (data.requireConfirmation) {\n <div class=\"checkbox-wrapper\">\n <mat-checkbox name=\"confirm\" [(ngModel)]=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (data.type === 'delete') {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'delete') {\n <button type=\"button\" mat-raised-button class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'info-only') {\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n {{data.cancelButtonLabel}}\n </button>\n }\n</mat-dialog-actions>", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}mat-dialog-actions{justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { 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] ", exportAs: ["matButton"] }] });
|
|
53
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: NgxMatEntityConfirmDialogComponent, isStandalone: true, selector: "ngx-mat-entity-confirm-dialog", ngImport: i0, template: "@if (data.title) {\n <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n @for (paragraph of data.text; track $index) {\n <p>{{paragraph}}</p>\n }\n @if (data.requireConfirmation) {\n <div class=\"checkbox-wrapper\">\n <mat-checkbox name=\"confirm\" [(ngModel)]=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (data.type === 'delete') {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'delete') {\n <button type=\"button\" mat-raised-button class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'info-only') {\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n {{data.cancelButtonLabel}}\n </button>\n }\n</mat-dialog-actions>", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}\n", "::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { 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] ", exportAs: ["matButton"] }] });
|
|
54
54
|
}
|
|
55
55
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgxMatEntityConfirmDialogComponent, decorators: [{
|
|
56
56
|
type: Component,
|
|
57
57
|
args: [{ selector: 'ngx-mat-entity-confirm-dialog', standalone: true, imports: [
|
|
58
|
-
|
|
59
|
-
NgFor,
|
|
58
|
+
CommonModule,
|
|
60
59
|
MatDialogModule,
|
|
61
60
|
FormsModule,
|
|
62
61
|
MatCheckboxModule,
|
|
63
62
|
MatButtonModule
|
|
64
|
-
], template: "@if (data.title) {\n <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n @for (paragraph of data.text; track $index) {\n <p>{{paragraph}}</p>\n }\n @if (data.requireConfirmation) {\n <div class=\"checkbox-wrapper\">\n <mat-checkbox name=\"confirm\" [(ngModel)]=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (data.type === 'delete') {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'delete') {\n <button type=\"button\" mat-raised-button class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'info-only') {\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n {{data.cancelButtonLabel}}\n </button>\n }\n</mat-dialog-actions>", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}mat-dialog-actions{justify-content:space-between}\n"] }]
|
|
63
|
+
], template: "@if (data.title) {\n <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n @for (paragraph of data.text; track $index) {\n <p>{{paragraph}}</p>\n }\n @if (data.requireConfirmation) {\n <div class=\"checkbox-wrapper\">\n <mat-checkbox name=\"confirm\" [(ngModel)]=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (data.type === 'delete') {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'delete') {\n <button type=\"button\" mat-raised-button class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'info-only') {\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n {{data.cancelButtonLabel}}\n </button>\n }\n</mat-dialog-actions>", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}\n", "::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}\n"] }]
|
|
65
64
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
66
65
|
type: Inject,
|
|
67
66
|
args: [MAT_DIALOG_DATA]
|
|
@@ -69,4 +68,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImpor
|
|
|
69
68
|
type: Inject,
|
|
70
69
|
args: [NGX_COMPLETE_GLOBAL_DEFAULT_VALUES]
|
|
71
70
|
}] }] });
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzFGLE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsa0NBQWtDLEVBQTBCLE1BQU0sbUNBQW1DLENBQUM7Ozs7OztBQUUvRzs7OztHQUlHO0FBY0gsTUFBTSxPQUFPLGtDQUFrQztJQWF0QjtJQUVBO0lBRUU7SUFmdkI7O09BRUc7SUFDSCxPQUFPLEdBQVksS0FBSyxDQUFDO0lBRXpCOztPQUVHO0lBQ0gsSUFBSSxDQUE2QjtJQUVqQyxZQUNxQixTQUEyRCxFQUUzRCxTQUE0QixFQUUxQixZQUFvQztRQUp0QyxjQUFTLEdBQVQsU0FBUyxDQUFrRDtRQUUzRCxjQUFTLEdBQVQsU0FBUyxDQUFtQjtRQUUxQixpQkFBWSxHQUFaLFlBQVksQ0FBd0I7SUFDeEQsQ0FBQztJQUVKLFFBQVE7UUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQzt1R0FyQ1Esa0NBQWtDLDhDQWMvQixlQUFlLGFBRWYsa0NBQWtDOzJGQWhCckMsa0NBQWtDLHlGQzdCL0MsZ3RDQWlDcUIseWlCRFhiLFlBQVksOEJBQ1osZUFBZSx5YkFDZixXQUFXLDhWQUNYLGlCQUFpQiw2V0FDakIsZUFBZTs7MkZBR1Ysa0NBQWtDO2tCQWI5QyxTQUFTOytCQUNJLCtCQUErQixjQUc3QixJQUFJLFdBQ1A7d0JBQ0wsWUFBWTt3QkFDWixlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsaUJBQWlCO3dCQUNqQixlQUFlO3FCQUNsQjs7MEJBZ0JJLE1BQU07MkJBQUMsZUFBZTs7MEJBRXRCLE1BQU07MkJBQUMsa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IENvbmZpcm1EaWFsb2dEYXRhIH0gZnJvbSAnLi9jb25maXJtLWRpYWxvZy1kYXRhJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlciwgQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCB9IGZyb20gJy4vY29uZmlybS1kaWFsb2ctZGF0YS5idWlsZGVyJztcbmltcG9ydCB7IE5HWF9DT01QTEVURV9HTE9CQUxfREVGQVVMVF9WQUxVRVMsIE5neEdsb2JhbERlZmF1bHRWYWx1ZXMgfSBmcm9tICcuLi8uLi9nbG9iYWwtY29uZmlndXJhdGlvbi12YWx1ZXMnO1xuXG4vKipcbiAqIFRoZSBEaWFsb2cgdXNlZCB3aGVuZXZlciBjb25maXJtYXRpb24gYnkgdGhlIHVzZXIgaXMgcmVxdWlyZWQgKGUuZy4gV2hlbiB0aGUgdXNlciB0cmllcyB0byBkZWxldGUgYW4gZW50aXR5KS5cbiAqXG4gKiBDYW4gYmUgY3VzdG9taXplZCB3aXRoIHRoZSBNQVRfRElBTE9HX0RBVEEgXCJpbnB1dERhdGFcIi4gQ3VzdG9taXphdGlvbiBvcHRpb25zIGFyZSBkZWZpbmVkIGluIFwiQ29uZmlybURpYWxvZ0RhdGFcIi5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0LWVudGl0eS1jb25maXJtLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jb25maXJtLWRpYWxvZy5jb21wb25lbnQuc2NzcycsICcuLi8uLi9zY3NzL2RpYWxvZy1zdHlsZXMuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIE1hdERpYWxvZ01vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHVzZXIgbmVlZHMgdG8gdGljayBhIGNoZWNrYm94IHRvIGVuYWJsZSB0aGUgY29uZmlybSBidXR0b24uXG4gICAgICovXG4gICAgY29uZmlybTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBvZiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIGRhdGEhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudD4sXG4gICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGlucHV0RGF0YTogQ29uZmlybURpYWxvZ0RhdGEsXG4gICAgICAgIEBJbmplY3QoTkdYX0NPTVBMRVRFX0dMT0JBTF9ERUZBVUxUX1ZBTFVFUylcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdsb2JhbENvbmZpZzogTmd4R2xvYmFsRGVmYXVsdFZhbHVlc1xuICAgICkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZ2xvYmFsQ29uZmlnLCB0aGlzLmlucHV0RGF0YSkuZ2V0UmVzdWx0KCk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBkaWFsb2cgd2l0aCB0cnVlIHRvIHNpZ25hbCB0aGF0IHRoZSBhY3Rpb24gc2hvdWxkIGJlIHJ1bi5cbiAgICAgKi9cbiAgICBjb25maXJtQWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBjYW5jZWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKGZhbHNlKTtcbiAgICB9XG59IiwiQGlmIChkYXRhLnRpdGxlKSB7XG4gICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3tkYXRhLnRpdGxlfX08L2gyPlxufVxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIEBmb3IgKHBhcmFncmFwaCBvZiBkYXRhLnRleHQ7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8cD57e3BhcmFncmFwaH19PC9wPlxuICAgIH1cbiAgICBAaWYgKGRhdGEucmVxdWlyZUNvbmZpcm1hdGlvbikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBuYW1lPVwiY29uZmlybVwiIFsobmdNb2RlbCldPVwiY29uZmlybVwiPlxuICAgICAgICAgICAgICAgIHt7ZGF0YS5jb25maXJtYXRpb25UZXh0fX1cbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICBAaWYgKGRhdGEudHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJ3YXJuXCIgY2xhc3M9XCJjb25maXJtLWJ1dHRvblwiIFtkaXNhYmxlZF09XCJkYXRhLnJlcXVpcmVDb25maXJtYXRpb24gJiYgIWNvbmZpcm1cIiAoY2xpY2spPVwiY29uZmlybUFjdGlvbigpXCI+XG4gICAgICAgICAgICB7e2RhdGEuY29uZmlybUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoZGF0YS50eXBlICE9PSAnZGVsZXRlJykge1xuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNvbmZpcm0tYnV0dG9uXCIgW2Rpc2FibGVkXT1cImRhdGEucmVxdWlyZUNvbmZpcm1hdGlvbiAmJiAhY29uZmlybVwiIChjbGljayk9XCJjb25maXJtQWN0aW9uKClcIj5cbiAgICAgICAgICAgIHt7ZGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgQGlmIChkYXRhLnR5cGUgIT09ICdpbmZvLW9ubHknKSB7XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAgICAgICAge3tkYXRhLmNhbmNlbEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+Il19
|