ngx-material-entity 15.1.1 → 15.1.3
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/classes/date.utilities.d.ts +1 -1
- package/classes/entity.utilities.d.ts +36 -0
- package/components/input/date/date-range-input/date-range-input.component.d.ts +6 -3
- package/components/input/date/date-time-input/date-time-input.component.d.ts +3 -2
- package/components/input/file/file-image-input/file-image-input.component.d.ts +4 -2
- package/components/input/file/file-input/file-input.component.d.ts +5 -2
- package/components/input/string/string-password-input/string-password-input.component.d.ts +2 -1
- package/decorators/base/base-property.decorator.d.ts +2 -1
- package/decorators/boolean/boolean-decorator.data.d.ts +6 -2
- package/decorators/custom/custom.decorator.d.ts +2 -1
- package/decorators/date/date-decorator-internal.data.d.ts +1 -1
- package/decorators/date/date-decorator.data.d.ts +1 -1
- package/decorators/number/number-decorator-internal.data.d.ts +1 -1
- package/decorators/number/number-decorator.data.d.ts +1 -1
- package/decorators/string/string-decorator-internal.data.d.ts +1 -1
- package/decorators/string/string-decorator.data.d.ts +1 -1
- package/encapsulation/reflect.utilities.d.ts +9 -0
- package/esm2020/classes/date.utilities.mjs +1 -1
- package/esm2020/classes/entity.utilities.mjs +51 -4
- package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +3 -3
- package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +21 -1
- package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +11 -3
- package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +3 -3
- package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +17 -3
- package/esm2020/components/input/file/file-input/file-input.component.mjs +14 -2
- package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +3 -3
- package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +3 -3
- package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +8 -3
- package/esm2020/decorators/base/base-property.decorator.mjs +6 -2
- package/esm2020/decorators/boolean/boolean-decorator-internal.data.mjs +3 -3
- package/esm2020/decorators/boolean/boolean-decorator.data.mjs +1 -1
- package/esm2020/decorators/custom/custom.decorator.mjs +4 -3
- package/esm2020/decorators/date/date-decorator-internal.data.mjs +1 -1
- package/esm2020/decorators/date/date-decorator.data.mjs +1 -1
- package/esm2020/decorators/date/date.decorator.mjs +4 -3
- package/esm2020/decorators/file/file.decorator.mjs +4 -3
- package/esm2020/decorators/number/number-decorator-internal.data.mjs +1 -1
- package/esm2020/decorators/number/number-decorator.data.mjs +1 -1
- package/esm2020/decorators/string/string-decorator-internal.data.mjs +1 -1
- package/esm2020/decorators/string/string-decorator.data.mjs +1 -1
- package/esm2020/decorators/string/string.decorator.mjs +3 -2
- package/esm2020/encapsulation/reflect.utilities.mjs +12 -1
- package/fesm2015/ngx-material-entity.mjs +351 -238
- package/fesm2015/ngx-material-entity.mjs.map +1 -1
- package/fesm2020/ngx-material-entity.mjs +347 -235
- package/fesm2020/ngx-material-entity.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -45,89 +45,6 @@ import { MatSort } from '@angular/material/sort';
|
|
|
45
45
|
import * as i9 from '@angular/material/menu';
|
|
46
46
|
import { MatMenuModule } from '@angular/material/menu';
|
|
47
47
|
|
|
48
|
-
/**
|
|
49
|
-
* Encapsulates all functionality of Reflect.
|
|
50
|
-
*/
|
|
51
|
-
class ReflectUtilities {
|
|
52
|
-
/**
|
|
53
|
-
* Gets the metadata value for the provided metadata key on the target object or its prototype chain.
|
|
54
|
-
*
|
|
55
|
-
* @param metadataKey - A key used to store and retrieve metadata.
|
|
56
|
-
* @param target - The target object on which the metadata is defined.
|
|
57
|
-
* @param propertyKey - The property key for the target.
|
|
58
|
-
* @returns The metadata value for the metadata key if found; otherwise, undefined.
|
|
59
|
-
*/
|
|
60
|
-
static getMetadata(metadataKey, target, propertyKey) {
|
|
61
|
-
return Reflect.getMetadata(metadataKey, target, propertyKey);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Returns the string and symbol keys of the own properties of an object. The own properties of an object
|
|
65
|
-
* are those that are defined directly on that object, and are not inherited from the object's prototype.
|
|
66
|
-
*
|
|
67
|
-
* @param target - Object that contains the own properties.
|
|
68
|
-
* @returns The keys of the given object.
|
|
69
|
-
*/
|
|
70
|
-
static ownKeys(target) {
|
|
71
|
-
return Reflect.ownKeys(target);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Gets the property of target, equivalent to `target[propertyKey]`.
|
|
75
|
-
*
|
|
76
|
-
* @param target - Object that contains the property on itself or in its prototype chain.
|
|
77
|
-
* @param propertyKey - The property name.
|
|
78
|
-
* @returns The property of the target of the given key.
|
|
79
|
-
*/
|
|
80
|
-
static get(target, propertyKey) {
|
|
81
|
-
return Reflect.get(target, propertyKey);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Sets the property of target, equivalent to `target[propertyKey] = value`.
|
|
85
|
-
*
|
|
86
|
-
* @param target - Object that contains the property on itself or in its prototype chain.
|
|
87
|
-
* @param propertyKey - The property name.
|
|
88
|
-
* @param value - The value to set the property to.
|
|
89
|
-
* @returns If setting the value was successful.
|
|
90
|
-
*/
|
|
91
|
-
static set(target, propertyKey, value) {
|
|
92
|
-
return Reflect.set(target, propertyKey, value);
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Equivalent to `propertyKey in target`.
|
|
96
|
-
*
|
|
97
|
-
* @param target - Object that contains the property on itself or in its prototype chain.
|
|
98
|
-
* @param propertyKey - Name of the property.
|
|
99
|
-
* @returns Whether or not the given target has the key.
|
|
100
|
-
*/
|
|
101
|
-
static has(target, propertyKey) {
|
|
102
|
-
return Reflect.has(target, propertyKey);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Define a unique metadata entry on the target.
|
|
106
|
-
*
|
|
107
|
-
* @param metadataKey - A key used to store and retrieve metadata.
|
|
108
|
-
* @param metadataValue - A value that contains attached metadata.
|
|
109
|
-
* @param target - The target object on which to define metadata.
|
|
110
|
-
* @param propertyKey - The property key for the target.
|
|
111
|
-
*/
|
|
112
|
-
static defineMetadata(metadataKey, metadataValue, target, propertyKey) {
|
|
113
|
-
Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* The base decorator for setting metadata on properties.
|
|
119
|
-
*
|
|
120
|
-
* @param metadata - The metadata to define.
|
|
121
|
-
* @param type - The type of metadata.
|
|
122
|
-
* @returns The method that sets the metadata.
|
|
123
|
-
*/
|
|
124
|
-
function baseProperty(metadata, type) {
|
|
125
|
-
return function (target, propertyKey) {
|
|
126
|
-
ReflectUtilities.defineMetadata('metadata', metadata, target, propertyKey);
|
|
127
|
-
ReflectUtilities.defineMetadata('type', type, target, propertyKey);
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
|
|
131
48
|
/**
|
|
132
49
|
* The enum Values for all the different DecoratorTypes.
|
|
133
50
|
*/
|
|
@@ -160,132 +77,6 @@ var DecoratorTypes;
|
|
|
160
77
|
DecoratorTypes["CUSTOM"] = "custom";
|
|
161
78
|
})(DecoratorTypes || (DecoratorTypes = {}));
|
|
162
79
|
|
|
163
|
-
/**
|
|
164
|
-
* The internal Position. Sets default values and validates user input.
|
|
165
|
-
*/
|
|
166
|
-
class PositionInternal {
|
|
167
|
-
constructor(data) {
|
|
168
|
-
this.validateInput(data);
|
|
169
|
-
this.row = data?.row ?? -1;
|
|
170
|
-
this.order = data?.order ?? -1;
|
|
171
|
-
this.tab = data?.tab ?? -1;
|
|
172
|
-
this.tabName = data?.tabName;
|
|
173
|
-
}
|
|
174
|
-
validateInput(data) {
|
|
175
|
-
if (data?.order != null) {
|
|
176
|
-
if (data.order < 1) {
|
|
177
|
-
throw new Error('order must be at least 1');
|
|
178
|
-
}
|
|
179
|
-
if (data.order > 12) {
|
|
180
|
-
throw new Error('order cannot be bigger than 12 (the minimum value for a bootstrap column)');
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
if (data?.row != null && data.row < 1) {
|
|
184
|
-
throw new Error('row must be at least 1');
|
|
185
|
-
}
|
|
186
|
-
if (data?.tab != null && data.tab != -1 && data.tab < 2) {
|
|
187
|
-
throw new Error('tab must be either -1 for the first tab or at least 2');
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* The internal PropertyDecoratorConfig. Sets default values.
|
|
193
|
-
*/
|
|
194
|
-
class PropertyDecoratorConfigInternal {
|
|
195
|
-
constructor(data) {
|
|
196
|
-
this.display = data.display ?? true;
|
|
197
|
-
this.displayName = data.displayName;
|
|
198
|
-
this.required = data.required ?? true;
|
|
199
|
-
this.omitForCreate = data.omitForCreate ?? false;
|
|
200
|
-
this.omitForUpdate = data.omitForUpdate ?? false;
|
|
201
|
-
this.defaultWidths = data.defaultWidths ?? [6, 6, 12];
|
|
202
|
-
this.position = new PositionInternal(data.position);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* The internal DropdownStringDecoratorConfig. Sets default values.
|
|
208
|
-
*/
|
|
209
|
-
class DropdownStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
210
|
-
constructor(data) {
|
|
211
|
-
super(data);
|
|
212
|
-
this.displayStyle = data.displayStyle;
|
|
213
|
-
this.dropdownValues = data.dropdownValues;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* The internal DefaultStringDecoratorConfig. Sets default values.
|
|
218
|
-
*/
|
|
219
|
-
class DefaultStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
220
|
-
constructor(data) {
|
|
221
|
-
super(data);
|
|
222
|
-
this.displayStyle = data.displayStyle;
|
|
223
|
-
this.minLength = data.minLength;
|
|
224
|
-
this.maxLength = data.maxLength;
|
|
225
|
-
this.regex = data.regex;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* The internal TextboxStringDecoratorConfig. Sets default values.
|
|
230
|
-
*/
|
|
231
|
-
class TextboxStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
232
|
-
constructor(data) {
|
|
233
|
-
super(data);
|
|
234
|
-
this.displayStyle = data.displayStyle;
|
|
235
|
-
this.minLength = data.minLength;
|
|
236
|
-
this.maxLength = data.maxLength;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* The internal AutocompleteStringDecoratorConfig. Sets default values.
|
|
241
|
-
*/
|
|
242
|
-
class AutocompleteStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
243
|
-
constructor(data) {
|
|
244
|
-
super(data);
|
|
245
|
-
this.displayStyle = data.displayStyle;
|
|
246
|
-
this.autocompleteValues = data.autocompleteValues;
|
|
247
|
-
this.minLength = data.minLength;
|
|
248
|
-
this.maxLength = data.maxLength;
|
|
249
|
-
this.regex = data.regex;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* The internal PasswordStringDecoratorConfig. Sets default values.
|
|
254
|
-
*/
|
|
255
|
-
class PasswordStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
256
|
-
constructor(data) {
|
|
257
|
-
super(data);
|
|
258
|
-
this.displayStyle = data.displayStyle;
|
|
259
|
-
this.minLength = data.minLength;
|
|
260
|
-
this.maxLength = data.maxLength;
|
|
261
|
-
this.regex = data.regex;
|
|
262
|
-
this.needsConfirmation = data.needsConfirmation ?? true;
|
|
263
|
-
this.confirmationDisplayName = data.confirmationDisplayName ?? 'Confirm Password';
|
|
264
|
-
this.passwordsDontMatchErrorMessage = data.passwordsDontMatchErrorMessage ?? 'Passwords need to match!';
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Decorator for setting and getting string Property metadata.
|
|
270
|
-
*
|
|
271
|
-
* @param metadata - The metadata of the string property.
|
|
272
|
-
* @returns The method that defines the metadata.
|
|
273
|
-
*/
|
|
274
|
-
function string(metadata) {
|
|
275
|
-
switch (metadata.displayStyle) {
|
|
276
|
-
case 'dropdown':
|
|
277
|
-
return baseProperty(new DropdownStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING_DROPDOWN);
|
|
278
|
-
case 'autocomplete':
|
|
279
|
-
return baseProperty(new AutocompleteStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING_AUTOCOMPLETE);
|
|
280
|
-
case 'textbox':
|
|
281
|
-
return baseProperty(new TextboxStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING_TEXTBOX);
|
|
282
|
-
case 'password':
|
|
283
|
-
return baseProperty(new PasswordStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING_PASSWORD);
|
|
284
|
-
default:
|
|
285
|
-
return baseProperty(new DefaultStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
80
|
/**
|
|
290
81
|
* Encapsulates all functionality of lodash.
|
|
291
82
|
*/
|
|
@@ -360,6 +151,86 @@ class LodashUtilities {
|
|
|
360
151
|
}
|
|
361
152
|
}
|
|
362
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Encapsulates all functionality of Reflect.
|
|
156
|
+
*/
|
|
157
|
+
class ReflectUtilities {
|
|
158
|
+
/**
|
|
159
|
+
* Gets the metadata value for the provided metadata key on the target object or its prototype chain.
|
|
160
|
+
*
|
|
161
|
+
* @param metadataKey - A key used to store and retrieve metadata.
|
|
162
|
+
* @param target - The target object on which the metadata is defined.
|
|
163
|
+
* @param propertyKey - The property key for the target.
|
|
164
|
+
* @returns The metadata value for the metadata key if found; otherwise, undefined.
|
|
165
|
+
*/
|
|
166
|
+
static getMetadata(metadataKey, target, propertyKey) {
|
|
167
|
+
return Reflect.getMetadata(metadataKey, target, propertyKey);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Returns the string and symbol keys of the own properties of an object. The own properties of an object
|
|
171
|
+
* are those that are defined directly on that object, and are not inherited from the object's prototype.
|
|
172
|
+
*
|
|
173
|
+
* @param target - Object that contains the own properties.
|
|
174
|
+
* @returns The keys of the given object.
|
|
175
|
+
*/
|
|
176
|
+
static ownKeys(target) {
|
|
177
|
+
return Reflect.ownKeys(target);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Gets the property of target, equivalent to `target[propertyKey]`.
|
|
181
|
+
*
|
|
182
|
+
* @param target - Object that contains the property on itself or in its prototype chain.
|
|
183
|
+
* @param propertyKey - The property name.
|
|
184
|
+
* @returns The property of the target of the given key.
|
|
185
|
+
*/
|
|
186
|
+
static get(target, propertyKey) {
|
|
187
|
+
return Reflect.get(target, propertyKey);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Sets the property of target, equivalent to `target[propertyKey] = value`.
|
|
191
|
+
*
|
|
192
|
+
* @param target - Object that contains the property on itself or in its prototype chain.
|
|
193
|
+
* @param propertyKey - The property name.
|
|
194
|
+
* @param value - The value to set the property to.
|
|
195
|
+
* @returns If setting the value was successful.
|
|
196
|
+
*/
|
|
197
|
+
static set(target, propertyKey, value) {
|
|
198
|
+
return Reflect.set(target, propertyKey, value);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Equivalent to `propertyKey in target`.
|
|
202
|
+
*
|
|
203
|
+
* @param target - Object that contains the property on itself or in its prototype chain.
|
|
204
|
+
* @param propertyKey - Name of the property.
|
|
205
|
+
* @returns Whether or not the given target has the key.
|
|
206
|
+
*/
|
|
207
|
+
static has(target, propertyKey) {
|
|
208
|
+
return Reflect.has(target, propertyKey);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Checks if the targets key entry has a metadata value for the given metadata key.
|
|
212
|
+
*
|
|
213
|
+
* @returns Whether the metadata is null or not.
|
|
214
|
+
* @param metadataKey - The key of the metadata on the property.
|
|
215
|
+
* @param target - Object that contains the property on itself or in its prototype chain.
|
|
216
|
+
* @param propertyKey - The key of the target.
|
|
217
|
+
*/
|
|
218
|
+
static hasMetadata(metadataKey, target, propertyKey) {
|
|
219
|
+
return this.getMetadata(metadataKey, target, propertyKey) != null;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Define a unique metadata entry on the target.
|
|
223
|
+
*
|
|
224
|
+
* @param metadataKey - A key used to store and retrieve metadata.
|
|
225
|
+
* @param metadataValue - A value that contains attached metadata.
|
|
226
|
+
* @param target - The target object on which to define metadata.
|
|
227
|
+
* @param propertyKey - The property key for the target.
|
|
228
|
+
*/
|
|
229
|
+
static defineMetadata(metadataKey, metadataValue, target, propertyKey) {
|
|
230
|
+
Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
363
234
|
const DAY_IN_MS = 1000 * 60 * 60 * 24;
|
|
364
235
|
/**
|
|
365
236
|
* Contains Helper Functions for handling date properties.
|
|
@@ -896,7 +767,7 @@ class EntityUtilities {
|
|
|
896
767
|
case DecoratorTypes.STRING_PASSWORD:
|
|
897
768
|
const entityPassword = entity[key];
|
|
898
769
|
const passwordMetadata = metadata;
|
|
899
|
-
const confirmPassword = ReflectUtilities.getMetadata(
|
|
770
|
+
const confirmPassword = ReflectUtilities.getMetadata(this.CONFIRM_PASSWORD_KEY, entity, key);
|
|
900
771
|
if (!EntityUtilities.isPasswordValid(entityPassword, passwordMetadata, confirmPassword)) {
|
|
901
772
|
return false;
|
|
902
773
|
}
|
|
@@ -949,7 +820,8 @@ class EntityUtilities {
|
|
|
949
820
|
case DecoratorTypes.DATE_TIME:
|
|
950
821
|
const entityDateTime = new Date(entity[key]);
|
|
951
822
|
const dateTimeMetadata = metadata;
|
|
952
|
-
|
|
823
|
+
const hasTime = ReflectUtilities.hasMetadata(this.TIME_KEY, entity, key);
|
|
824
|
+
if (!EntityUtilities.isDateTimeValid(entityDateTime, dateTimeMetadata, hasTime)) {
|
|
953
825
|
return false;
|
|
954
826
|
}
|
|
955
827
|
break;
|
|
@@ -1078,7 +950,10 @@ class EntityUtilities {
|
|
|
1078
950
|
}
|
|
1079
951
|
return true;
|
|
1080
952
|
}
|
|
1081
|
-
static isDateTimeValid(value, metadata) {
|
|
953
|
+
static isDateTimeValid(value, metadata, hasTime) {
|
|
954
|
+
if (!hasTime) {
|
|
955
|
+
return false;
|
|
956
|
+
}
|
|
1082
957
|
if (metadata.minDate && value.getTime() < metadata.minDate(value).getTime()) {
|
|
1083
958
|
return false;
|
|
1084
959
|
}
|
|
@@ -1363,6 +1238,13 @@ class EntityUtilities {
|
|
|
1363
1238
|
static resetChangesOnEntity(entity, entityPriorChanges) {
|
|
1364
1239
|
for (const key in entityPriorChanges) {
|
|
1365
1240
|
ReflectUtilities.set(entity, key, ReflectUtilities.get(entityPriorChanges, key));
|
|
1241
|
+
if (ReflectUtilities.hasMetadata(this.METADATA_KEYS_TO_RESET_KEY, entity, key)) {
|
|
1242
|
+
for (const k of ReflectUtilities.getMetadata(this.METADATA_KEYS_TO_RESET_KEY, entity, key)) {
|
|
1243
|
+
if (ReflectUtilities.hasMetadata(k, entity, key)) {
|
|
1244
|
+
ReflectUtilities.defineMetadata(k, undefined, entity, key);
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1366
1248
|
}
|
|
1367
1249
|
}
|
|
1368
1250
|
static getEntityRows(entity, tab, hideOmitForCreate, hideOmitForEdit) {
|
|
@@ -1465,11 +1347,190 @@ class EntityUtilities {
|
|
|
1465
1347
|
return keys;
|
|
1466
1348
|
}
|
|
1467
1349
|
}
|
|
1350
|
+
/**
|
|
1351
|
+
* The key for all keys of metadata that should be set to undefined when the entity gets reset.
|
|
1352
|
+
*/
|
|
1353
|
+
EntityUtilities.METADATA_KEYS_TO_RESET_KEY = 'metadataKeysToReset';
|
|
1354
|
+
/**
|
|
1355
|
+
* The key for the metadata that saves the single preview image value on image properties.
|
|
1356
|
+
*/
|
|
1357
|
+
EntityUtilities.SINGLE_PREVIEW_IMAGE_KEY = 'singlePreviewImage';
|
|
1358
|
+
/**
|
|
1359
|
+
* The key for the metadata that saves the multi preview images value on image properties.
|
|
1360
|
+
*/
|
|
1361
|
+
EntityUtilities.MULTI_PREVIEW_IMAGES_KEY = 'multiPreviewImages';
|
|
1362
|
+
/**
|
|
1363
|
+
* The key for the metadata that saves the filenames value on file properties.
|
|
1364
|
+
*/
|
|
1365
|
+
EntityUtilities.FILENAMES_KEY = 'fileNames';
|
|
1366
|
+
/**
|
|
1367
|
+
* The key for the metadata that saves the confirm password value on password properties.
|
|
1368
|
+
*/
|
|
1369
|
+
EntityUtilities.CONFIRM_PASSWORD_KEY = 'confirmPassword';
|
|
1370
|
+
/**
|
|
1371
|
+
* The key for the metadata that saves the time value on date time properties.
|
|
1372
|
+
*/
|
|
1373
|
+
EntityUtilities.TIME_KEY = 'time';
|
|
1374
|
+
/**
|
|
1375
|
+
* The key for the metadata that saves the date range value on date range properties.
|
|
1376
|
+
*/
|
|
1377
|
+
EntityUtilities.DATE_RANGE_KEY = 'dateRange';
|
|
1378
|
+
/**
|
|
1379
|
+
* The key for the metadata that saves the date range start value on date range properties.
|
|
1380
|
+
*/
|
|
1381
|
+
EntityUtilities.DATE_RANGE_START_KEY = 'dateRangeStart';
|
|
1382
|
+
/**
|
|
1383
|
+
* The key for the metadata that saves the date range end value on date range properties.
|
|
1384
|
+
*/
|
|
1385
|
+
EntityUtilities.DATE_RANGE_END_KEY = 'dateRangeEnd';
|
|
1468
1386
|
// eslint-disable-next-line @typescript-eslint/member-ordering, jsdoc/require-jsdoc, @typescript-eslint/typedef
|
|
1469
1387
|
EntityUtilities.construct = EntityUtilities.new;
|
|
1470
1388
|
// eslint-disable-next-line @typescript-eslint/member-ordering, jsdoc/require-jsdoc, @typescript-eslint/typedef
|
|
1471
1389
|
EntityUtilities.build = EntityUtilities.new;
|
|
1472
1390
|
|
|
1391
|
+
/**
|
|
1392
|
+
* The base decorator for setting metadata on properties.
|
|
1393
|
+
*
|
|
1394
|
+
* @param metadata - The metadata to define.
|
|
1395
|
+
* @param type - The type of metadata.
|
|
1396
|
+
* @param metadataKeysToReset - Any metadata keys which values should be set to undefined on reset.
|
|
1397
|
+
* @returns The method that sets the metadata.
|
|
1398
|
+
*/
|
|
1399
|
+
function baseProperty(metadata, type, metadataKeysToReset) {
|
|
1400
|
+
return function (target, propertyKey) {
|
|
1401
|
+
ReflectUtilities.defineMetadata('metadata', metadata, target, propertyKey);
|
|
1402
|
+
ReflectUtilities.defineMetadata('type', type, target, propertyKey);
|
|
1403
|
+
// eslint-disable-next-line max-len
|
|
1404
|
+
ReflectUtilities.defineMetadata(EntityUtilities.METADATA_KEYS_TO_RESET_KEY, metadataKeysToReset, target, propertyKey);
|
|
1405
|
+
};
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
/**
|
|
1409
|
+
* The internal Position. Sets default values and validates user input.
|
|
1410
|
+
*/
|
|
1411
|
+
class PositionInternal {
|
|
1412
|
+
constructor(data) {
|
|
1413
|
+
this.validateInput(data);
|
|
1414
|
+
this.row = data?.row ?? -1;
|
|
1415
|
+
this.order = data?.order ?? -1;
|
|
1416
|
+
this.tab = data?.tab ?? -1;
|
|
1417
|
+
this.tabName = data?.tabName;
|
|
1418
|
+
}
|
|
1419
|
+
validateInput(data) {
|
|
1420
|
+
if (data?.order != null) {
|
|
1421
|
+
if (data.order < 1) {
|
|
1422
|
+
throw new Error('order must be at least 1');
|
|
1423
|
+
}
|
|
1424
|
+
if (data.order > 12) {
|
|
1425
|
+
throw new Error('order cannot be bigger than 12 (the minimum value for a bootstrap column)');
|
|
1426
|
+
}
|
|
1427
|
+
}
|
|
1428
|
+
if (data?.row != null && data.row < 1) {
|
|
1429
|
+
throw new Error('row must be at least 1');
|
|
1430
|
+
}
|
|
1431
|
+
if (data?.tab != null && data.tab != -1 && data.tab < 2) {
|
|
1432
|
+
throw new Error('tab must be either -1 for the first tab or at least 2');
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
}
|
|
1436
|
+
/**
|
|
1437
|
+
* The internal PropertyDecoratorConfig. Sets default values.
|
|
1438
|
+
*/
|
|
1439
|
+
class PropertyDecoratorConfigInternal {
|
|
1440
|
+
constructor(data) {
|
|
1441
|
+
this.display = data.display ?? true;
|
|
1442
|
+
this.displayName = data.displayName;
|
|
1443
|
+
this.required = data.required ?? true;
|
|
1444
|
+
this.omitForCreate = data.omitForCreate ?? false;
|
|
1445
|
+
this.omitForUpdate = data.omitForUpdate ?? false;
|
|
1446
|
+
this.defaultWidths = data.defaultWidths ?? [6, 6, 12];
|
|
1447
|
+
this.position = new PositionInternal(data.position);
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
/**
|
|
1452
|
+
* The internal DropdownStringDecoratorConfig. Sets default values.
|
|
1453
|
+
*/
|
|
1454
|
+
class DropdownStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
1455
|
+
constructor(data) {
|
|
1456
|
+
super(data);
|
|
1457
|
+
this.displayStyle = data.displayStyle;
|
|
1458
|
+
this.dropdownValues = data.dropdownValues;
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
/**
|
|
1462
|
+
* The internal DefaultStringDecoratorConfig. Sets default values.
|
|
1463
|
+
*/
|
|
1464
|
+
class DefaultStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
1465
|
+
constructor(data) {
|
|
1466
|
+
super(data);
|
|
1467
|
+
this.displayStyle = data.displayStyle;
|
|
1468
|
+
this.minLength = data.minLength;
|
|
1469
|
+
this.maxLength = data.maxLength;
|
|
1470
|
+
this.regex = data.regex;
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
/**
|
|
1474
|
+
* The internal TextboxStringDecoratorConfig. Sets default values.
|
|
1475
|
+
*/
|
|
1476
|
+
class TextboxStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
1477
|
+
constructor(data) {
|
|
1478
|
+
super(data);
|
|
1479
|
+
this.displayStyle = data.displayStyle;
|
|
1480
|
+
this.minLength = data.minLength;
|
|
1481
|
+
this.maxLength = data.maxLength;
|
|
1482
|
+
}
|
|
1483
|
+
}
|
|
1484
|
+
/**
|
|
1485
|
+
* The internal AutocompleteStringDecoratorConfig. Sets default values.
|
|
1486
|
+
*/
|
|
1487
|
+
class AutocompleteStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
1488
|
+
constructor(data) {
|
|
1489
|
+
super(data);
|
|
1490
|
+
this.displayStyle = data.displayStyle;
|
|
1491
|
+
this.autocompleteValues = data.autocompleteValues;
|
|
1492
|
+
this.minLength = data.minLength;
|
|
1493
|
+
this.maxLength = data.maxLength;
|
|
1494
|
+
this.regex = data.regex;
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
/**
|
|
1498
|
+
* The internal PasswordStringDecoratorConfig. Sets default values.
|
|
1499
|
+
*/
|
|
1500
|
+
class PasswordStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
1501
|
+
constructor(data) {
|
|
1502
|
+
super(data);
|
|
1503
|
+
this.displayStyle = data.displayStyle;
|
|
1504
|
+
this.minLength = data.minLength;
|
|
1505
|
+
this.maxLength = data.maxLength;
|
|
1506
|
+
this.regex = data.regex;
|
|
1507
|
+
this.needsConfirmation = data.needsConfirmation ?? true;
|
|
1508
|
+
this.confirmationDisplayName = data.confirmationDisplayName ?? 'Confirm Password';
|
|
1509
|
+
this.passwordsDontMatchErrorMessage = data.passwordsDontMatchErrorMessage ?? 'Passwords need to match!';
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
/**
|
|
1514
|
+
* Decorator for setting and getting string Property metadata.
|
|
1515
|
+
*
|
|
1516
|
+
* @param metadata - The metadata of the string property.
|
|
1517
|
+
* @returns The method that defines the metadata.
|
|
1518
|
+
*/
|
|
1519
|
+
function string(metadata) {
|
|
1520
|
+
switch (metadata.displayStyle) {
|
|
1521
|
+
case 'dropdown':
|
|
1522
|
+
return baseProperty(new DropdownStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING_DROPDOWN);
|
|
1523
|
+
case 'autocomplete':
|
|
1524
|
+
return baseProperty(new AutocompleteStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING_AUTOCOMPLETE);
|
|
1525
|
+
case 'textbox':
|
|
1526
|
+
return baseProperty(new TextboxStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING_TEXTBOX);
|
|
1527
|
+
case 'password':
|
|
1528
|
+
return baseProperty(new PasswordStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING_PASSWORD, [EntityUtilities.CONFIRM_PASSWORD_KEY]);
|
|
1529
|
+
default:
|
|
1530
|
+
return baseProperty(new DefaultStringDecoratorConfigInternal(metadata), DecoratorTypes.STRING);
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
|
|
1473
1534
|
/**
|
|
1474
1535
|
* A base Entity class with a builtin id.
|
|
1475
1536
|
*/
|
|
@@ -2222,10 +2283,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImpor
|
|
|
2222
2283
|
class BooleanDropdownInputComponent extends NgxMatEntityBaseInputComponent {
|
|
2223
2284
|
}
|
|
2224
2285
|
BooleanDropdownInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: BooleanDropdownInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2225
|
-
BooleanDropdownInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: BooleanDropdownInputComponent, selector: "boolean-dropdown-input", usesInheritance: true, ngImport: i0, template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select\n
|
|
2286
|
+
BooleanDropdownInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: BooleanDropdownInputComponent, selector: "boolean-dropdown-input", usesInheritance: true, ngImport: i0, template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select\n [(ngModel)]=\"propertyValue\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required\"\n [disabled]=\"isReadOnly\"\n >\n <mat-option [value]=\"undefined\" (click)=\"emitChange()\">-</mat-option>\n <mat-option [value]=\"true\" (click)=\"emitChange()\">{{metadata.dropdownTrue}}</mat-option>\n <mat-option [value]=\"false\" (click)=\"emitChange()\">{{metadata.dropdownFalse}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i5$2.MatOption, selector: "mat-option", exportAs: ["matOption"] }] });
|
|
2226
2287
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: BooleanDropdownInputComponent, decorators: [{
|
|
2227
2288
|
type: Component,
|
|
2228
|
-
args: [{ selector: 'boolean-dropdown-input', template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select\n
|
|
2289
|
+
args: [{ selector: 'boolean-dropdown-input', template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select\n [(ngModel)]=\"propertyValue\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required\"\n [disabled]=\"isReadOnly\"\n >\n <mat-option [value]=\"undefined\" (click)=\"emitChange()\">-</mat-option>\n <mat-option [value]=\"true\" (click)=\"emitChange()\">{{metadata.dropdownTrue}}</mat-option>\n <mat-option [value]=\"false\" (click)=\"emitChange()\">{{metadata.dropdownFalse}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>", styles: ["mat-form-field{width:100%}\n"] }]
|
|
2229
2290
|
}] });
|
|
2230
2291
|
|
|
2231
2292
|
/* eslint-disable jsdoc/require-jsdoc */
|
|
@@ -2290,6 +2351,24 @@ class DateRangeInputComponent extends NgxMatEntityBaseInputComponent {
|
|
|
2290
2351
|
super(...arguments);
|
|
2291
2352
|
this.defaultDateFilter = DateUtilities.defaultDateFilter;
|
|
2292
2353
|
}
|
|
2354
|
+
get dateRange() {
|
|
2355
|
+
return ReflectUtilities.getMetadata(EntityUtilities.DATE_RANGE_KEY, this.entity, this.key);
|
|
2356
|
+
}
|
|
2357
|
+
set dateRange(value) {
|
|
2358
|
+
ReflectUtilities.defineMetadata(EntityUtilities.DATE_RANGE_KEY, value, this.entity, this.key);
|
|
2359
|
+
}
|
|
2360
|
+
get dateRangeStart() {
|
|
2361
|
+
return ReflectUtilities.getMetadata(EntityUtilities.DATE_RANGE_START_KEY, this.entity, this.key);
|
|
2362
|
+
}
|
|
2363
|
+
set dateRangeStart(value) {
|
|
2364
|
+
ReflectUtilities.defineMetadata(EntityUtilities.DATE_RANGE_START_KEY, value, this.entity, this.key);
|
|
2365
|
+
}
|
|
2366
|
+
get dateRangeEnd() {
|
|
2367
|
+
return ReflectUtilities.getMetadata(EntityUtilities.DATE_RANGE_END_KEY, this.entity, this.key);
|
|
2368
|
+
}
|
|
2369
|
+
set dateRangeEnd(value) {
|
|
2370
|
+
ReflectUtilities.defineMetadata(EntityUtilities.DATE_RANGE_END_KEY, value, this.entity, this.key);
|
|
2371
|
+
}
|
|
2293
2372
|
ngOnInit() {
|
|
2294
2373
|
super.ngOnInit();
|
|
2295
2374
|
this.dateRange = LodashUtilities.cloneDeep(this.propertyValue) ?? EMPTY_DATERANGE;
|
|
@@ -2327,6 +2406,12 @@ class DateTimeInputComponent extends NgxMatEntityBaseInputComponent {
|
|
|
2327
2406
|
this.DateUtilities = DateUtilities;
|
|
2328
2407
|
this.defaultDateFilter = () => true;
|
|
2329
2408
|
}
|
|
2409
|
+
get time() {
|
|
2410
|
+
return ReflectUtilities.getMetadata(EntityUtilities.TIME_KEY, this.entity, this.key);
|
|
2411
|
+
}
|
|
2412
|
+
set time(value) {
|
|
2413
|
+
ReflectUtilities.defineMetadata(EntityUtilities.TIME_KEY, value, this.entity, this.key);
|
|
2414
|
+
}
|
|
2330
2415
|
ngOnInit() {
|
|
2331
2416
|
super.ngOnInit();
|
|
2332
2417
|
this.time = DateUtilities.getTimeFromDate(this.propertyValue);
|
|
@@ -2366,10 +2451,10 @@ class DateTimeInputComponent extends NgxMatEntityBaseInputComponent {
|
|
|
2366
2451
|
}
|
|
2367
2452
|
}
|
|
2368
2453
|
DateTimeInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: DateTimeInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2369
|
-
DateTimeInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: DateTimeInputComponent, selector: "date-time-input", usesInheritance: true, ngImport: i0, template: "<div class=\"date-time\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"propertyValue\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [matDatepicker]=\"picker\"\n [required]=\"metadata.required\"\n [min]=\"metadata.minDate ? metadata.minDate(propertyValue) : undefined\"\n [max]=\"metadata.maxDate ? metadata.maxDate(propertyValue) : undefined\"\n [matDatepickerFilter]=\"metadata.filterDate ?? defaultDateFilter\"\n (dateInput)=\"setTime()\"\n [disabled]=\"isReadOnly\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n <mat-form-field class=\"timepicker\">\n <mat-label>{{metadata.timeDisplayName}}</mat-label>\n <mat-select\n [(ngModel)]=\"time\"\n [name]=\"key.toString() + 'time'\"\n #timeModel=\"ngModel\"\n [required]=\"metadata.required\"\n [compareWith]=\"compareTimes\"\n
|
|
2454
|
+
DateTimeInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: DateTimeInputComponent, selector: "date-time-input", usesInheritance: true, ngImport: i0, template: "<div class=\"date-time\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"propertyValue\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [matDatepicker]=\"picker\"\n [required]=\"metadata.required\"\n [min]=\"metadata.minDate ? metadata.minDate(propertyValue) : undefined\"\n [max]=\"metadata.maxDate ? metadata.maxDate(propertyValue) : undefined\"\n [matDatepickerFilter]=\"metadata.filterDate ?? defaultDateFilter\"\n (dateInput)=\"setTime()\"\n [disabled]=\"isReadOnly\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n <mat-form-field class=\"timepicker\">\n <mat-label>{{metadata.timeDisplayName}}</mat-label>\n <mat-select\n [(ngModel)]=\"time\"\n [name]=\"key.toString() + 'time'\"\n #timeModel=\"ngModel\"\n [required]=\"metadata.required\"\n [compareWith]=\"compareTimes\"\n [disabled]=\"isReadOnly\"\n >\n <mat-option *ngFor=\"let validTime of DateUtilities.getValidTimesForDropdown(\n metadata.times,\n propertyValue,\n metadata.minTime,\n metadata.maxTime,\n metadata.filterTime\n )\"\n [value]=\"validTime.value\"\n (click)=\"setTime()\"\n >\n {{validTime.displayName}}\n </mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(timeModel)}}</mat-error>\n </mat-form-field>\n</div>", styles: ["mat-form-field{width:100%}.date-time{display:flex;align-items:baseline}.date-time .timepicker{margin-left:10px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i5$2.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i4$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i4$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i4$2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }] });
|
|
2370
2455
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: DateTimeInputComponent, decorators: [{
|
|
2371
2456
|
type: Component,
|
|
2372
|
-
args: [{ selector: 'date-time-input', template: "<div class=\"date-time\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"propertyValue\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [matDatepicker]=\"picker\"\n [required]=\"metadata.required\"\n [min]=\"metadata.minDate ? metadata.minDate(propertyValue) : undefined\"\n [max]=\"metadata.maxDate ? metadata.maxDate(propertyValue) : undefined\"\n [matDatepickerFilter]=\"metadata.filterDate ?? defaultDateFilter\"\n (dateInput)=\"setTime()\"\n [disabled]=\"isReadOnly\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n <mat-form-field class=\"timepicker\">\n <mat-label>{{metadata.timeDisplayName}}</mat-label>\n <mat-select\n [(ngModel)]=\"time\"\n [name]=\"key.toString() + 'time'\"\n #timeModel=\"ngModel\"\n [required]=\"metadata.required\"\n [compareWith]=\"compareTimes\"\n
|
|
2457
|
+
args: [{ selector: 'date-time-input', template: "<div class=\"date-time\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"propertyValue\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [matDatepicker]=\"picker\"\n [required]=\"metadata.required\"\n [min]=\"metadata.minDate ? metadata.minDate(propertyValue) : undefined\"\n [max]=\"metadata.maxDate ? metadata.maxDate(propertyValue) : undefined\"\n [matDatepickerFilter]=\"metadata.filterDate ?? defaultDateFilter\"\n (dateInput)=\"setTime()\"\n [disabled]=\"isReadOnly\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n <mat-form-field class=\"timepicker\">\n <mat-label>{{metadata.timeDisplayName}}</mat-label>\n <mat-select\n [(ngModel)]=\"time\"\n [name]=\"key.toString() + 'time'\"\n #timeModel=\"ngModel\"\n [required]=\"metadata.required\"\n [compareWith]=\"compareTimes\"\n [disabled]=\"isReadOnly\"\n >\n <mat-option *ngFor=\"let validTime of DateUtilities.getValidTimesForDropdown(\n metadata.times,\n propertyValue,\n metadata.minTime,\n metadata.maxTime,\n metadata.filterTime\n )\"\n [value]=\"validTime.value\"\n (click)=\"setTime()\"\n >\n {{validTime.displayName}}\n </mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(timeModel)}}</mat-error>\n </mat-form-field>\n</div>", styles: ["mat-form-field{width:100%}.date-time{display:flex;align-items:baseline}.date-time .timepicker{margin-left:10px}\n"] }]
|
|
2373
2458
|
}] });
|
|
2374
2459
|
|
|
2375
2460
|
/**
|
|
@@ -2440,6 +2525,12 @@ class FileInputComponent {
|
|
|
2440
2525
|
this.FileUtilities = FileUtilities;
|
|
2441
2526
|
this.fileDataChangeEvent = new EventEmitter();
|
|
2442
2527
|
}
|
|
2528
|
+
get filenames() {
|
|
2529
|
+
return ReflectUtilities.getMetadata(EntityUtilities.FILENAMES_KEY, this.entity, this.key);
|
|
2530
|
+
}
|
|
2531
|
+
set filenames(value) {
|
|
2532
|
+
ReflectUtilities.defineMetadata(EntityUtilities.FILENAMES_KEY, value, this.entity, this.key);
|
|
2533
|
+
}
|
|
2443
2534
|
async ngOnInit() {
|
|
2444
2535
|
if (this.metadata.multiple) {
|
|
2445
2536
|
this.initMultiFile();
|
|
@@ -2587,12 +2678,16 @@ class FileInputComponent {
|
|
|
2587
2678
|
}
|
|
2588
2679
|
}
|
|
2589
2680
|
FileInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: FileInputComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
2590
|
-
FileInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: FileInputComponent, selector: "file-input", inputs: { propertyValue: "propertyValue", metadata: "metadata", getValidationErrorMessage: "getValidationErrorMessage", isReadOnly: "isReadOnly" }, outputs: { fileDataChangeEvent: "fileDataChangeEvent" }, ngImport: i0, template: "<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"FileUtilities.getAcceptString(metadata.allowedMimeTypes)\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n [(ngModel)]=\"filenames\" name=\"file\" #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i class=\"{{metadata.deleteIcon}}\"></i>\n </button>\n </mat-chip-row>\n <input [matChipInputFor]=\"chipGrid\" [readonly]=\"true\" hidden>\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-upload\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5$3.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i5$3.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i5$3.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i5$3.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: DragDropDirective, selector: "[dragDrop]", outputs: ["files"] }] });
|
|
2681
|
+
FileInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: FileInputComponent, selector: "file-input", inputs: { propertyValue: "propertyValue", entity: "entity", key: "key", metadata: "metadata", getValidationErrorMessage: "getValidationErrorMessage", isReadOnly: "isReadOnly" }, outputs: { fileDataChangeEvent: "fileDataChangeEvent" }, ngImport: i0, template: "<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"FileUtilities.getAcceptString(metadata.allowedMimeTypes)\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n [(ngModel)]=\"filenames\" name=\"file\" #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i class=\"{{metadata.deleteIcon}}\"></i>\n </button>\n </mat-chip-row>\n <input [matChipInputFor]=\"chipGrid\" [readonly]=\"true\" hidden>\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-upload\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5$3.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i5$3.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i5$3.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i5$3.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: DragDropDirective, selector: "[dragDrop]", outputs: ["files"] }] });
|
|
2591
2682
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: FileInputComponent, decorators: [{
|
|
2592
2683
|
type: Component,
|
|
2593
2684
|
args: [{ selector: 'file-input', template: "<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"FileUtilities.getAcceptString(metadata.allowedMimeTypes)\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n [(ngModel)]=\"filenames\" name=\"file\" #model=\"ngModel\"\n [required]=\"metadata.required\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i class=\"{{metadata.deleteIcon}}\"></i>\n </button>\n </mat-chip-row>\n <input [matChipInputFor]=\"chipGrid\" [readonly]=\"true\" hidden>\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-upload\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"] }]
|
|
2594
2685
|
}], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { propertyValue: [{
|
|
2595
2686
|
type: Input
|
|
2687
|
+
}], entity: [{
|
|
2688
|
+
type: Input
|
|
2689
|
+
}], key: [{
|
|
2690
|
+
type: Input
|
|
2596
2691
|
}], metadata: [{
|
|
2597
2692
|
type: Input
|
|
2598
2693
|
}], getValidationErrorMessage: [{
|
|
@@ -2615,10 +2710,10 @@ class FileDefaultInputComponent extends NgxMatEntityBaseInputComponent {
|
|
|
2615
2710
|
}
|
|
2616
2711
|
}
|
|
2617
2712
|
FileDefaultInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: FileDefaultInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2618
|
-
FileDefaultInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: FileDefaultInputComponent, selector: "file-default-input", usesInheritance: true, ngImport: i0, template: "<div [class.file-input]=\"metadata.dragAndDrop\" [class.mat-elevation-z8]=\"metadata.dragAndDrop\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n >\n </file-input>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}\n"], dependencies: [{ kind: "component", type: FileInputComponent, selector: "file-input", inputs: ["propertyValue", "metadata", "getValidationErrorMessage", "isReadOnly"], outputs: ["fileDataChangeEvent"] }] });
|
|
2713
|
+
FileDefaultInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: FileDefaultInputComponent, selector: "file-default-input", usesInheritance: true, ngImport: i0, template: "<div [class.file-input]=\"metadata.dragAndDrop\" [class.mat-elevation-z8]=\"metadata.dragAndDrop\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}\n"], dependencies: [{ kind: "component", type: FileInputComponent, selector: "file-input", inputs: ["propertyValue", "entity", "key", "metadata", "getValidationErrorMessage", "isReadOnly"], outputs: ["fileDataChangeEvent"] }] });
|
|
2619
2714
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: FileDefaultInputComponent, decorators: [{
|
|
2620
2715
|
type: Component,
|
|
2621
|
-
args: [{ selector: 'file-default-input', template: "<div [class.file-input]=\"metadata.dragAndDrop\" [class.mat-elevation-z8]=\"metadata.dragAndDrop\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n >\n </file-input>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}\n"] }]
|
|
2716
|
+
args: [{ selector: 'file-default-input', template: "<div [class.file-input]=\"metadata.dragAndDrop\" [class.mat-elevation-z8]=\"metadata.dragAndDrop\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}\n"] }]
|
|
2622
2717
|
}] });
|
|
2623
2718
|
|
|
2624
2719
|
// eslint-disable-next-line max-len
|
|
@@ -2632,6 +2727,18 @@ class FileImageInputComponent extends NgxMatEntityBaseInputComponent {
|
|
|
2632
2727
|
this.imageIndex = 0;
|
|
2633
2728
|
this.placeHolder = placeholder;
|
|
2634
2729
|
}
|
|
2730
|
+
get multiPreviewImages() {
|
|
2731
|
+
return ReflectUtilities.getMetadata(EntityUtilities.MULTI_PREVIEW_IMAGES_KEY, this.entity, this.key);
|
|
2732
|
+
}
|
|
2733
|
+
set multiPreviewImages(value) {
|
|
2734
|
+
ReflectUtilities.defineMetadata(EntityUtilities.MULTI_PREVIEW_IMAGES_KEY, value, this.entity, this.key);
|
|
2735
|
+
}
|
|
2736
|
+
get singlePreviewImage() {
|
|
2737
|
+
return ReflectUtilities.getMetadata(EntityUtilities.SINGLE_PREVIEW_IMAGE_KEY, this.entity, this.key);
|
|
2738
|
+
}
|
|
2739
|
+
set singlePreviewImage(value) {
|
|
2740
|
+
ReflectUtilities.defineMetadata(EntityUtilities.SINGLE_PREVIEW_IMAGE_KEY, value, this.entity, this.key);
|
|
2741
|
+
}
|
|
2635
2742
|
async setSinglePreviewImage() {
|
|
2636
2743
|
if (this.propertyValue) {
|
|
2637
2744
|
this.propertyValue = await FileUtilities.getFileData(this.propertyValue);
|
|
@@ -2694,10 +2801,10 @@ class FileImageInputComponent extends NgxMatEntityBaseInputComponent {
|
|
|
2694
2801
|
}
|
|
2695
2802
|
}
|
|
2696
2803
|
FileImageInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: FileImageInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2697
|
-
FileImageInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: FileImageInputComponent, selector: "file-image-input", usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!metadata.dragAndDrop && !metadata.preview\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n >\n </file-input>\n</div>\n\n<div *ngIf=\"metadata.dragAndDrop || metadata.preview\" class=\"file-input mat-elevation-z8\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n >\n </file-input>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && metadata.multiple\">\n <i (click)=\"prev()\" [class.disabled]=\"imageIndex === 0\" class=\"prev-button fa-solid fa-angle-left\"></i>\n <img *ngIf=\"multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"multiPreviewImages?.[imageIndex]\">\n <img *ngIf=\"!multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"metadata.previewPlaceholderUrl ?? placeHolder\">\n <i (click)=\"next()\"\n [class.disabled]=\"!multiPreviewImages || !multiPreviewImages.length || imageIndex === (multiPreviewImages.length - 1)\"\n class=\"next-button fa-solid fa-angle-right\"\n >\n </i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && metadata.multiple\">\n <button type=\"button\" (click)=\"setIndex(imageIndex-4)\" mat-icon-button *ngIf=\"\n this.multiPreviewImages\n && multiPreviewImages[imageIndex-4]\n && imageIndex === (this.multiPreviewImages.length - 1)\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 3}}</span>\n </button>\n <!-- eslint-disable-next-line @angular-eslint/template/conditional-complexity -->\n <button type=\"button\" (click)=\"setIndex(imageIndex-3)\" mat-icon-button *ngIf=\"this.multiPreviewImages\n && multiPreviewImages[imageIndex-3]\n && (\n imageIndex === (this.multiPreviewImages.length - 2)\n || imageIndex === (this.multiPreviewImages.length - 1)\n )\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-1]\">\n <i class=\"dot\"></i>\n <span class=\"image-index\">{{imageIndex}}</span>\n </button>\n <button type=\"button\" mat-icon-button disabled>\n <i class=\"dot selected\"></i>\n <span class=\"image-index\">{{imageIndex + 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+1]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 3}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+3)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+3] && imageIndex <= 1\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 4}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+4)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+4] && imageIndex === 0\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 5}}</span>\n </button>\n </div>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <i class=\"prev-button disabled fa-solid fa-angle-left\"></i>\n <img class=\"mat-elevation-z2\" [src]=\"singlePreviewImage ?? metadata.previewPlaceholderUrl ?? placeHolder\">\n <i class=\"next-button disabled fa-solid fa-angle-right\"></i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <button type=\"button\" disabled mat-icon-button>\n <span class=\"dot selected\"></span>\n <span class=\"image-index\">1</span>\n </button>\n </div>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}.image-preview{height:250px;display:flex;align-items:center;padding-top:15px;padding-bottom:15px}.image-preview .prev-button{font-size:100px;margin-left:5px;color:#0000008a}.image-preview .next-button{font-size:100px;margin-right:5px;color:#0000008a}.image-preview .prev-button:hover,.image-preview .next-button:hover{cursor:pointer;color:#000000b3;transition:all .5s ease}.image-preview .prev-button.disabled,.image-preview .next-button.disabled{color:#00000042}.image-preview .prev-button.disabled:hover,.image-preview .next-button.disabled:hover{color:#00000042;transition:none;cursor:default}.image-preview img{max-width:calc(100% - 100px);max-height:100%;margin-left:auto;margin-right:auto;border-radius:3px}.preview-nav{text-align:center}.preview-nav button{display:inline-block;width:18px;height:18px;margin-left:5px;margin-right:5px}.preview-nav button .dot{height:100%;width:100%;background-color:#00000061;border-radius:50%;display:block}.preview-nav button .dot.selected{background-color:#0000008a}.preview-nav button .image-index{position:absolute;height:100%;width:100%;display:block;top:-11.5px;color:#fff}.preview-nav button:hover .dot{background-color:#0000008a;transition:all .3s ease}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: FileInputComponent, selector: "file-input", inputs: ["propertyValue", "metadata", "getValidationErrorMessage", "isReadOnly"], outputs: ["fileDataChangeEvent"] }] });
|
|
2804
|
+
FileImageInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: FileImageInputComponent, selector: "file-image-input", usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!metadata.dragAndDrop && !metadata.preview\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n</div>\n\n<div *ngIf=\"metadata.dragAndDrop || metadata.preview\" class=\"file-input mat-elevation-z8\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && metadata.multiple\">\n <i (click)=\"prev()\" [class.disabled]=\"imageIndex === 0\" class=\"prev-button fa-solid fa-angle-left\"></i>\n <img *ngIf=\"multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"multiPreviewImages?.[imageIndex]\">\n <img *ngIf=\"!multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"metadata.previewPlaceholderUrl ?? placeHolder\">\n <i (click)=\"next()\"\n [class.disabled]=\"!multiPreviewImages || !multiPreviewImages.length || imageIndex === (multiPreviewImages.length - 1)\"\n class=\"next-button fa-solid fa-angle-right\"\n >\n </i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && metadata.multiple\">\n <button type=\"button\" (click)=\"setIndex(imageIndex-4)\" mat-icon-button *ngIf=\"\n this.multiPreviewImages\n && multiPreviewImages[imageIndex-4]\n && imageIndex === (this.multiPreviewImages.length - 1)\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 3}}</span>\n </button>\n <!-- eslint-disable-next-line @angular-eslint/template/conditional-complexity -->\n <button type=\"button\" (click)=\"setIndex(imageIndex-3)\" mat-icon-button *ngIf=\"this.multiPreviewImages\n && multiPreviewImages[imageIndex-3]\n && (\n imageIndex === (this.multiPreviewImages.length - 2)\n || imageIndex === (this.multiPreviewImages.length - 1)\n )\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-1]\">\n <i class=\"dot\"></i>\n <span class=\"image-index\">{{imageIndex}}</span>\n </button>\n <button type=\"button\" mat-icon-button disabled>\n <i class=\"dot selected\"></i>\n <span class=\"image-index\">{{imageIndex + 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+1]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 3}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+3)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+3] && imageIndex <= 1\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 4}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+4)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+4] && imageIndex === 0\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 5}}</span>\n </button>\n </div>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <i class=\"prev-button disabled fa-solid fa-angle-left\"></i>\n <img class=\"mat-elevation-z2\" [src]=\"singlePreviewImage ?? metadata.previewPlaceholderUrl ?? placeHolder\">\n <i class=\"next-button disabled fa-solid fa-angle-right\"></i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <button type=\"button\" disabled mat-icon-button>\n <span class=\"dot selected\"></span>\n <span class=\"image-index\">1</span>\n </button>\n </div>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}.image-preview{height:250px;display:flex;align-items:center;padding-top:15px;padding-bottom:15px}.image-preview .prev-button{font-size:100px;margin-left:5px;color:#0000008a}.image-preview .next-button{font-size:100px;margin-right:5px;color:#0000008a}.image-preview .prev-button:hover,.image-preview .next-button:hover{cursor:pointer;color:#000000b3;transition:all .5s ease}.image-preview .prev-button.disabled,.image-preview .next-button.disabled{color:#00000042}.image-preview .prev-button.disabled:hover,.image-preview .next-button.disabled:hover{color:#00000042;transition:none;cursor:default}.image-preview img{max-width:calc(100% - 100px);max-height:100%;margin-left:auto;margin-right:auto;border-radius:3px}.preview-nav{text-align:center}.preview-nav button{display:inline-block;width:18px;height:18px;margin-left:5px;margin-right:5px}.preview-nav button .dot{height:100%;width:100%;background-color:#00000061;border-radius:50%;display:block}.preview-nav button .dot.selected{background-color:#0000008a}.preview-nav button .image-index{position:absolute;height:100%;width:100%;display:block;top:-11.5px;color:#fff}.preview-nav button:hover .dot{background-color:#0000008a;transition:all .3s ease}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: FileInputComponent, selector: "file-input", inputs: ["propertyValue", "entity", "key", "metadata", "getValidationErrorMessage", "isReadOnly"], outputs: ["fileDataChangeEvent"] }] });
|
|
2698
2805
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: FileImageInputComponent, decorators: [{
|
|
2699
2806
|
type: Component,
|
|
2700
|
-
args: [{ selector: 'file-image-input', template: "<div *ngIf=\"!metadata.dragAndDrop && !metadata.preview\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n >\n </file-input>\n</div>\n\n<div *ngIf=\"metadata.dragAndDrop || metadata.preview\" class=\"file-input mat-elevation-z8\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n >\n </file-input>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && metadata.multiple\">\n <i (click)=\"prev()\" [class.disabled]=\"imageIndex === 0\" class=\"prev-button fa-solid fa-angle-left\"></i>\n <img *ngIf=\"multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"multiPreviewImages?.[imageIndex]\">\n <img *ngIf=\"!multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"metadata.previewPlaceholderUrl ?? placeHolder\">\n <i (click)=\"next()\"\n [class.disabled]=\"!multiPreviewImages || !multiPreviewImages.length || imageIndex === (multiPreviewImages.length - 1)\"\n class=\"next-button fa-solid fa-angle-right\"\n >\n </i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && metadata.multiple\">\n <button type=\"button\" (click)=\"setIndex(imageIndex-4)\" mat-icon-button *ngIf=\"\n this.multiPreviewImages\n && multiPreviewImages[imageIndex-4]\n && imageIndex === (this.multiPreviewImages.length - 1)\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 3}}</span>\n </button>\n <!-- eslint-disable-next-line @angular-eslint/template/conditional-complexity -->\n <button type=\"button\" (click)=\"setIndex(imageIndex-3)\" mat-icon-button *ngIf=\"this.multiPreviewImages\n && multiPreviewImages[imageIndex-3]\n && (\n imageIndex === (this.multiPreviewImages.length - 2)\n || imageIndex === (this.multiPreviewImages.length - 1)\n )\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-1]\">\n <i class=\"dot\"></i>\n <span class=\"image-index\">{{imageIndex}}</span>\n </button>\n <button type=\"button\" mat-icon-button disabled>\n <i class=\"dot selected\"></i>\n <span class=\"image-index\">{{imageIndex + 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+1]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 3}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+3)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+3] && imageIndex <= 1\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 4}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+4)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+4] && imageIndex === 0\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 5}}</span>\n </button>\n </div>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <i class=\"prev-button disabled fa-solid fa-angle-left\"></i>\n <img class=\"mat-elevation-z2\" [src]=\"singlePreviewImage ?? metadata.previewPlaceholderUrl ?? placeHolder\">\n <i class=\"next-button disabled fa-solid fa-angle-right\"></i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <button type=\"button\" disabled mat-icon-button>\n <span class=\"dot selected\"></span>\n <span class=\"image-index\">1</span>\n </button>\n </div>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}.image-preview{height:250px;display:flex;align-items:center;padding-top:15px;padding-bottom:15px}.image-preview .prev-button{font-size:100px;margin-left:5px;color:#0000008a}.image-preview .next-button{font-size:100px;margin-right:5px;color:#0000008a}.image-preview .prev-button:hover,.image-preview .next-button:hover{cursor:pointer;color:#000000b3;transition:all .5s ease}.image-preview .prev-button.disabled,.image-preview .next-button.disabled{color:#00000042}.image-preview .prev-button.disabled:hover,.image-preview .next-button.disabled:hover{color:#00000042;transition:none;cursor:default}.image-preview img{max-width:calc(100% - 100px);max-height:100%;margin-left:auto;margin-right:auto;border-radius:3px}.preview-nav{text-align:center}.preview-nav button{display:inline-block;width:18px;height:18px;margin-left:5px;margin-right:5px}.preview-nav button .dot{height:100%;width:100%;background-color:#00000061;border-radius:50%;display:block}.preview-nav button .dot.selected{background-color:#0000008a}.preview-nav button .image-index{position:absolute;height:100%;width:100%;display:block;top:-11.5px;color:#fff}.preview-nav button:hover .dot{background-color:#0000008a;transition:all .3s ease}\n"] }]
|
|
2807
|
+
args: [{ selector: 'file-image-input', template: "<div *ngIf=\"!metadata.dragAndDrop && !metadata.preview\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n</div>\n\n<div *ngIf=\"metadata.dragAndDrop || metadata.preview\" class=\"file-input mat-elevation-z8\">\n <file-input\n (fileDataChangeEvent)=\"refreshFileData($event)\"\n [propertyValue]=\"propertyValue\"\n [metadata]=\"metadata\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [isReadOnly]=\"isReadOnly\"\n [entity]=\"entity\"\n [key]=\"key\"\n >\n </file-input>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && metadata.multiple\">\n <i (click)=\"prev()\" [class.disabled]=\"imageIndex === 0\" class=\"prev-button fa-solid fa-angle-left\"></i>\n <img *ngIf=\"multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"multiPreviewImages?.[imageIndex]\">\n <img *ngIf=\"!multiPreviewImages?.[imageIndex]\" class=\"mat-elevation-z2\" [src]=\"metadata.previewPlaceholderUrl ?? placeHolder\">\n <i (click)=\"next()\"\n [class.disabled]=\"!multiPreviewImages || !multiPreviewImages.length || imageIndex === (multiPreviewImages.length - 1)\"\n class=\"next-button fa-solid fa-angle-right\"\n >\n </i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && metadata.multiple\">\n <button type=\"button\" (click)=\"setIndex(imageIndex-4)\" mat-icon-button *ngIf=\"\n this.multiPreviewImages\n && multiPreviewImages[imageIndex-4]\n && imageIndex === (this.multiPreviewImages.length - 1)\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 3}}</span>\n </button>\n <!-- eslint-disable-next-line @angular-eslint/template/conditional-complexity -->\n <button type=\"button\" (click)=\"setIndex(imageIndex-3)\" mat-icon-button *ngIf=\"this.multiPreviewImages\n && multiPreviewImages[imageIndex-3]\n && (\n imageIndex === (this.multiPreviewImages.length - 2)\n || imageIndex === (this.multiPreviewImages.length - 1)\n )\"\n >\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex - 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex-1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex-1]\">\n <i class=\"dot\"></i>\n <span class=\"image-index\">{{imageIndex}}</span>\n </button>\n <button type=\"button\" mat-icon-button disabled>\n <i class=\"dot selected\"></i>\n <span class=\"image-index\">{{imageIndex + 1}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+1)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+1]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 2}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+2)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+2]\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 3}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+3)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+3] && imageIndex <= 1\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 4}}</span>\n </button>\n <button type=\"button\" (click)=\"setIndex(imageIndex+4)\" mat-icon-button *ngIf=\"multiPreviewImages?.[imageIndex+4] && imageIndex === 0\">\n <span class=\"dot\"></span>\n <span class=\"image-index\">{{imageIndex + 5}}</span>\n </button>\n </div>\n\n <div class=\"image-preview\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <i class=\"prev-button disabled fa-solid fa-angle-left\"></i>\n <img class=\"mat-elevation-z2\" [src]=\"singlePreviewImage ?? metadata.previewPlaceholderUrl ?? placeHolder\">\n <i class=\"next-button disabled fa-solid fa-angle-right\"></i>\n </div>\n <div class=\"preview-nav\" *ngIf=\"metadata.preview && !metadata.multiple\">\n <button type=\"button\" disabled mat-icon-button>\n <span class=\"dot selected\"></span>\n <span class=\"image-index\">1</span>\n </button>\n </div>\n</div>", styles: [".file-input{margin-top:15px;margin-bottom:15px;padding:15px;border-radius:5px}.image-preview{height:250px;display:flex;align-items:center;padding-top:15px;padding-bottom:15px}.image-preview .prev-button{font-size:100px;margin-left:5px;color:#0000008a}.image-preview .next-button{font-size:100px;margin-right:5px;color:#0000008a}.image-preview .prev-button:hover,.image-preview .next-button:hover{cursor:pointer;color:#000000b3;transition:all .5s ease}.image-preview .prev-button.disabled,.image-preview .next-button.disabled{color:#00000042}.image-preview .prev-button.disabled:hover,.image-preview .next-button.disabled:hover{color:#00000042;transition:none;cursor:default}.image-preview img{max-width:calc(100% - 100px);max-height:100%;margin-left:auto;margin-right:auto;border-radius:3px}.preview-nav{text-align:center}.preview-nav button{display:inline-block;width:18px;height:18px;margin-left:5px;margin-right:5px}.preview-nav button .dot{height:100%;width:100%;background-color:#00000061;border-radius:50%;display:block}.preview-nav button .dot.selected{background-color:#0000008a}.preview-nav button .image-index{position:absolute;height:100%;width:100%;display:block;top:-11.5px;color:#fff}.preview-nav button:hover .dot{background-color:#0000008a;transition:all .3s ease}\n"] }]
|
|
2701
2808
|
}] });
|
|
2702
2809
|
|
|
2703
2810
|
const NGX_GET_VALIDATION_ERROR_MESSAGE = new InjectionToken('Provider for the default getValidationErrorMessage.', {
|
|
@@ -2852,10 +2959,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImpor
|
|
|
2852
2959
|
class StringDropdownInputComponent extends NgxMatEntityBaseInputComponent {
|
|
2853
2960
|
}
|
|
2854
2961
|
StringDropdownInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: StringDropdownInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2855
|
-
StringDropdownInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: StringDropdownInputComponent, selector: "string-dropdown-input", usesInheritance: true, ngImport: i0, template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select
|
|
2962
|
+
StringDropdownInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: StringDropdownInputComponent, selector: "string-dropdown-input", usesInheritance: true, ngImport: i0, template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"propertyValue\" [name]=\"key.toString()\" #model=\"ngModel\" [required]=\"metadata.required\" [disabled]=\"isReadOnly\">\n <mat-option *ngFor=\"let value of metadata.dropdownValues\" [value]=\"value.value\" (click)=\"emitChange()\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i5$2.MatOption, selector: "mat-option", exportAs: ["matOption"] }] });
|
|
2856
2963
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: StringDropdownInputComponent, decorators: [{
|
|
2857
2964
|
type: Component,
|
|
2858
|
-
args: [{ selector: 'string-dropdown-input', template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select
|
|
2965
|
+
args: [{ selector: 'string-dropdown-input', template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"propertyValue\" [name]=\"key.toString()\" #model=\"ngModel\" [required]=\"metadata.required\" [disabled]=\"isReadOnly\">\n <mat-option *ngFor=\"let value of metadata.dropdownValues\" [value]=\"value.value\" (click)=\"emitChange()\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>", styles: ["mat-form-field{width:100%}\n"] }]
|
|
2859
2966
|
}] });
|
|
2860
2967
|
|
|
2861
2968
|
/* eslint-disable jsdoc/require-jsdoc */
|
|
@@ -2865,15 +2972,19 @@ class StringPasswordInputComponent extends NgxMatEntityBaseInputComponent {
|
|
|
2865
2972
|
this.hide = true;
|
|
2866
2973
|
this.hideConfirm = true;
|
|
2867
2974
|
}
|
|
2975
|
+
get confirmPassword() {
|
|
2976
|
+
return ReflectUtilities.getMetadata(EntityUtilities.CONFIRM_PASSWORD_KEY, this.entity, this.key);
|
|
2977
|
+
}
|
|
2978
|
+
set confirmPassword(value) {
|
|
2979
|
+
ReflectUtilities.defineMetadata(EntityUtilities.CONFIRM_PASSWORD_KEY, value, this.entity, this.key);
|
|
2980
|
+
}
|
|
2868
2981
|
ngOnInit() {
|
|
2869
2982
|
super.ngOnInit();
|
|
2870
2983
|
this.confirmRequired = this.metadata.required;
|
|
2871
2984
|
this.confirmPassword = LodashUtilities.cloneDeep(this.propertyValue);
|
|
2872
|
-
ReflectUtilities.defineMetadata('confirmPassword', this.confirmPassword, this.entity, this.key);
|
|
2873
2985
|
}
|
|
2874
2986
|
passwordInput() {
|
|
2875
2987
|
this.confirmRequired = Boolean(this.propertyValue);
|
|
2876
|
-
ReflectUtilities.defineMetadata('confirmPassword', this.confirmPassword, this.entity, this.key);
|
|
2877
2988
|
this.emitChange();
|
|
2878
2989
|
}
|
|
2879
2990
|
}
|
|
@@ -2898,10 +3009,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImpor
|
|
|
2898
3009
|
class NumberDropdownInputComponent extends NgxMatEntityBaseInputComponent {
|
|
2899
3010
|
}
|
|
2900
3011
|
NumberDropdownInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NumberDropdownInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2901
|
-
NumberDropdownInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: NumberDropdownInputComponent, selector: "number-dropdown-input", usesInheritance: true, ngImport: i0, template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select
|
|
3012
|
+
NumberDropdownInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: NumberDropdownInputComponent, selector: "number-dropdown-input", usesInheritance: true, ngImport: i0, template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"propertyValue\" [name]=\"key.toString()\" #model=\"ngModel\" [required]=\"metadata.required\" [disabled]=\"isReadOnly\">\n <mat-option *ngFor=\"let value of metadata.dropdownValues\" [value]=\"value.value\" (click)=\"emitChange()\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i5$2.MatOption, selector: "mat-option", exportAs: ["matOption"] }] });
|
|
2902
3013
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NumberDropdownInputComponent, decorators: [{
|
|
2903
3014
|
type: Component,
|
|
2904
|
-
args: [{ selector: 'number-dropdown-input', template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select
|
|
3015
|
+
args: [{ selector: 'number-dropdown-input', template: "<mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"propertyValue\" [name]=\"key.toString()\" #model=\"ngModel\" [required]=\"metadata.required\" [disabled]=\"isReadOnly\">\n <mat-option *ngFor=\"let value of metadata.dropdownValues\" [value]=\"value.value\" (click)=\"emitChange()\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>", styles: ["mat-form-field{width:100%}\n"] }]
|
|
2905
3016
|
}] });
|
|
2906
3017
|
|
|
2907
3018
|
/* eslint-disable jsdoc/require-jsdoc */
|
|
@@ -4160,8 +4271,8 @@ class DropdownBooleanDecoratorConfigInternal extends PropertyDecoratorConfigInte
|
|
|
4160
4271
|
constructor(data) {
|
|
4161
4272
|
super(data);
|
|
4162
4273
|
this.displayStyle = data.displayStyle;
|
|
4163
|
-
this.dropdownTrue = data.dropdownTrue;
|
|
4164
|
-
this.dropdownFalse = data.dropdownFalse;
|
|
4274
|
+
this.dropdownTrue = data.dropdownTrue ?? 'Yes';
|
|
4275
|
+
this.dropdownFalse = data.dropdownFalse ?? 'No';
|
|
4165
4276
|
}
|
|
4166
4277
|
}
|
|
4167
4278
|
/**
|
|
@@ -4266,10 +4377,10 @@ function date(metadata) {
|
|
|
4266
4377
|
return baseProperty(new DefaultDateDecoratorConfigInternal(metadata), DecoratorTypes.DATE);
|
|
4267
4378
|
}
|
|
4268
4379
|
else if (metadata.displayStyle === 'datetime') {
|
|
4269
|
-
return baseProperty(new DateTimeDateDecoratorConfigInternal(metadata), DecoratorTypes.DATE_TIME);
|
|
4380
|
+
return baseProperty(new DateTimeDateDecoratorConfigInternal(metadata), DecoratorTypes.DATE_TIME, [EntityUtilities.TIME_KEY]);
|
|
4270
4381
|
}
|
|
4271
4382
|
else {
|
|
4272
|
-
return baseProperty(new DateRangeDateDecoratorConfigInternal(metadata), DecoratorTypes.DATE_RANGE);
|
|
4383
|
+
return baseProperty(new DateRangeDateDecoratorConfigInternal(metadata), DecoratorTypes.DATE_RANGE, [EntityUtilities.DATE_RANGE_END_KEY, EntityUtilities.DATE_RANGE_KEY, EntityUtilities.DATE_RANGE_START_KEY]);
|
|
4273
4384
|
}
|
|
4274
4385
|
}
|
|
4275
4386
|
|
|
@@ -4525,9 +4636,9 @@ function getDefaultMaxSizeTotalErrorDialogData(data) {
|
|
|
4525
4636
|
function file(metadata) {
|
|
4526
4637
|
switch (metadata.type) {
|
|
4527
4638
|
case 'other':
|
|
4528
|
-
return baseProperty(new DefaultFileDecoratorConfigInternal(metadata), DecoratorTypes.FILE_DEFAULT);
|
|
4639
|
+
return baseProperty(new DefaultFileDecoratorConfigInternal(metadata), DecoratorTypes.FILE_DEFAULT, [EntityUtilities.FILENAMES_KEY]);
|
|
4529
4640
|
case 'image':
|
|
4530
|
-
return baseProperty(new ImageFileDecoratorConfigInternal(metadata), DecoratorTypes.FILE_IMAGE);
|
|
4641
|
+
return baseProperty(new ImageFileDecoratorConfigInternal(metadata), DecoratorTypes.FILE_IMAGE, [EntityUtilities.FILENAMES_KEY, EntityUtilities.MULTI_PREVIEW_IMAGES_KEY, EntityUtilities.SINGLE_PREVIEW_IMAGE_KEY]);
|
|
4531
4642
|
default:
|
|
4532
4643
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
|
|
4533
4644
|
throw new Error(`Unknown metadata type ${metadata.type}`);
|
|
@@ -4568,10 +4679,11 @@ class CustomDecoratorConfigInternal extends PropertyDecoratorConfigInternal {
|
|
|
4568
4679
|
* Decorator for setting and getting custom property metadata.
|
|
4569
4680
|
*
|
|
4570
4681
|
* @param metadata - The metadata of the custom property.
|
|
4682
|
+
* @param metadataKeysToReset - Any metadata keys which values should be set to undefined on reset.
|
|
4571
4683
|
* @returns The method that defines the metadata.
|
|
4572
4684
|
*/
|
|
4573
|
-
function custom(metadata) {
|
|
4574
|
-
return baseProperty(new CustomDecoratorConfigInternal(metadata), DecoratorTypes.CUSTOM);
|
|
4685
|
+
function custom(metadata, metadataKeysToReset) {
|
|
4686
|
+
return baseProperty(new CustomDecoratorConfigInternal(metadata), DecoratorTypes.CUSTOM, metadataKeysToReset);
|
|
4575
4687
|
}
|
|
4576
4688
|
|
|
4577
4689
|
/**
|