@bolttech/form-engine-core 0.0.1-beta.1 → 0.0.1-beta.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/README.md +1616 -0
- package/index.esm.js +93 -5
- package/package.json +1 -1
- package/src/interfaces/schema.d.ts +2 -1
- package/src/managers/field.d.ts +11 -4
- package/src/managers/form.d.ts +8 -0
- package/src/managers/formGroup.d.ts +23 -2
- package/src/managers/index.d.ts +3 -0
- package/src/types/schema.d.ts +11 -1
package/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Subscription, Subject, combineLatest, startWith, groupBy, mergeMap, debounceTime, map } from 'rxjs';
|
|
1
|
+
import { Subscription, Subject, combineLatest, startWith, filter, groupBy, mergeMap, debounceTime, map } from 'rxjs';
|
|
2
2
|
import creditCardType from 'credit-card-type';
|
|
3
3
|
import { isNumber as isNumber$1, isNil, isEqual, get, set } from 'lodash';
|
|
4
4
|
import { getCurrencySymbol } from '@gaignoux/currency';
|
|
@@ -2265,6 +2265,7 @@ class FormField {
|
|
|
2265
2265
|
*
|
|
2266
2266
|
* @param {object} options - Configuration options for the form field.
|
|
2267
2267
|
* @param {IComponentSchema} options.schemaComponent - The schema definition for the form field.
|
|
2268
|
+
* @param {TSchemaFormConfig} options.config - The schema default configuration for debounced actions.
|
|
2268
2269
|
* @param {string} [options.path] - The path within the form field (used internally during recursion).
|
|
2269
2270
|
* @param {string[]} options.children - An array of children fields names.
|
|
2270
2271
|
* @param {Function} options.validateVisibility - A function to validate the visibility of the field.
|
|
@@ -2274,6 +2275,7 @@ class FormField {
|
|
|
2274
2275
|
*/
|
|
2275
2276
|
constructor({
|
|
2276
2277
|
schemaComponent,
|
|
2278
|
+
config,
|
|
2277
2279
|
path,
|
|
2278
2280
|
children,
|
|
2279
2281
|
validateVisibility,
|
|
@@ -2286,6 +2288,10 @@ class FormField {
|
|
|
2286
2288
|
}) {
|
|
2287
2289
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
2288
2290
|
this.fieldStateSubscription$ = new Subscription();
|
|
2291
|
+
this.config = {
|
|
2292
|
+
defaultAPIdebounceTimeMS: Number(config === null || config === void 0 ? void 0 : config.defaultAPIdebounceTimeMS) ? Number(config === null || config === void 0 ? void 0 : config.defaultAPIdebounceTimeMS) : 1000,
|
|
2293
|
+
defaultStateRefreshTimeMS: Number(config === null || config === void 0 ? void 0 : config.defaultStateRefreshTimeMS) ? Number(config === null || config === void 0 ? void 0 : config.defaultStateRefreshTimeMS) : 100
|
|
2294
|
+
};
|
|
2289
2295
|
this.name = schemaComponent.name;
|
|
2290
2296
|
this.component = schemaComponent.component;
|
|
2291
2297
|
this.path = path;
|
|
@@ -2324,6 +2330,7 @@ class FormField {
|
|
|
2324
2330
|
return acc;
|
|
2325
2331
|
}, {})
|
|
2326
2332
|
};
|
|
2333
|
+
this._errors = {};
|
|
2327
2334
|
this._errorsString = '';
|
|
2328
2335
|
this._valid = false;
|
|
2329
2336
|
this.initializeObservers();
|
|
@@ -2332,6 +2339,7 @@ class FormField {
|
|
|
2332
2339
|
* method to initialize all recycled Subjects and initialize Observers on field instance creation or rerender
|
|
2333
2340
|
*/
|
|
2334
2341
|
initializeObservers() {
|
|
2342
|
+
var _a;
|
|
2335
2343
|
if (!this.valueSubject$ || this.valueSubject$.closed) {
|
|
2336
2344
|
this.valueSubject$ = new Subject();
|
|
2337
2345
|
}
|
|
@@ -2361,7 +2369,7 @@ class FormField {
|
|
|
2361
2369
|
});
|
|
2362
2370
|
!this.apiEventQueueSubject$.observed && this.apiEventQueueSubject$.pipe(this.debounceDistinct(({
|
|
2363
2371
|
event
|
|
2364
|
-
}) => event,
|
|
2372
|
+
}) => event, (_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultAPIdebounceTimeMS), filter(() => this.apiSubject$ && !this.apiSubject$.closed)).subscribe(payload => {
|
|
2365
2373
|
this.apiRequest(payload);
|
|
2366
2374
|
});
|
|
2367
2375
|
if (!isNil(this.initialValue)) {
|
|
@@ -2659,6 +2667,19 @@ class FormField {
|
|
|
2659
2667
|
[this.errorMessagePropName]: this.errorsString
|
|
2660
2668
|
});
|
|
2661
2669
|
}
|
|
2670
|
+
/**
|
|
2671
|
+
* WIP expensive function to get updated field validity on each event
|
|
2672
|
+
*/
|
|
2673
|
+
updateValidityFlag() {
|
|
2674
|
+
var _a;
|
|
2675
|
+
let valid = true;
|
|
2676
|
+
const schemaValidations = (_a = this.validations) === null || _a === void 0 ? void 0 : _a.config;
|
|
2677
|
+
schemaValidations && Object.keys(schemaValidations).forEach(validationKey => {
|
|
2678
|
+
const error = validations[validationKey](this.value, schemaValidations);
|
|
2679
|
+
valid = !error && valid;
|
|
2680
|
+
});
|
|
2681
|
+
this._valid = valid;
|
|
2682
|
+
}
|
|
2662
2683
|
/**
|
|
2663
2684
|
* Formats the field value using the specified formatters, if available.
|
|
2664
2685
|
*
|
|
@@ -2802,7 +2823,7 @@ class FormField {
|
|
|
2802
2823
|
* @returns {void}
|
|
2803
2824
|
*/
|
|
2804
2825
|
subscribeState(callback) {
|
|
2805
|
-
this.fieldStateSubscription$ = this.fieldState$.pipe(debounceTime(
|
|
2826
|
+
this.fieldStateSubscription$ = this.fieldState$.pipe(debounceTime(this.config.defaultStateRefreshTimeMS)).subscribe({
|
|
2806
2827
|
next: callback
|
|
2807
2828
|
});
|
|
2808
2829
|
}
|
|
@@ -2845,6 +2866,7 @@ class FormCore {
|
|
|
2845
2866
|
this.method = entry.method || ((_c = entry.schema) === null || _c === void 0 ? void 0 : _c.method);
|
|
2846
2867
|
this._iVars = entry.iVars || ((_d = entry.schema) === null || _d === void 0 ? void 0 : _d.iVars) || {};
|
|
2847
2868
|
this.onSubmit = entry.onSubmit;
|
|
2869
|
+
this.config = entry.config;
|
|
2848
2870
|
this.mappers = entry.mappers;
|
|
2849
2871
|
this.schema && FormCore.checkIndexes(this.schema.components);
|
|
2850
2872
|
this.templateSubject$ = new Subject();
|
|
@@ -2947,7 +2969,8 @@ class FormCore {
|
|
|
2947
2969
|
* @param {(payload: { field: string; data: TFormValues }) => void} callback callback function to call on data
|
|
2948
2970
|
*/
|
|
2949
2971
|
subscribeData(callback) {
|
|
2950
|
-
|
|
2972
|
+
var _a, _b;
|
|
2973
|
+
this.dataCallbackSubscription$ = this.dataSubject$.pipe(debounceTime(Number((_a = this.config) === null || _a === void 0 ? void 0 : _a.defaultStateRefreshTimeMS) ? Number((_b = this.config) === null || _b === void 0 ? void 0 : _b.defaultStateRefreshTimeMS) : 100), map(({
|
|
2951
2974
|
key
|
|
2952
2975
|
}) => ({
|
|
2953
2976
|
field: key,
|
|
@@ -3258,6 +3281,36 @@ class FormCore {
|
|
|
3258
3281
|
});
|
|
3259
3282
|
});
|
|
3260
3283
|
}
|
|
3284
|
+
/**
|
|
3285
|
+
* Adds a field onto the form instance regardless there is a schema or not
|
|
3286
|
+
*
|
|
3287
|
+
* @param fieldSchema
|
|
3288
|
+
*/
|
|
3289
|
+
addField(fieldSchema) {
|
|
3290
|
+
var _a;
|
|
3291
|
+
if (this.fields.has(fieldSchema.name)) {
|
|
3292
|
+
throw new Error(`field name ${fieldSchema.name} already defined`);
|
|
3293
|
+
}
|
|
3294
|
+
const mapper = this.mappers.find(mapEl => mapEl.componentName === fieldSchema.component);
|
|
3295
|
+
if (!mapper) throw new Error(`mapper not found for ${fieldSchema.component}, add it to the mappers configuration`);
|
|
3296
|
+
this.fields.set(fieldSchema.name, new FormField({
|
|
3297
|
+
schemaComponent: fieldSchema,
|
|
3298
|
+
mapper,
|
|
3299
|
+
children: fieldSchema.children ? fieldSchema.children.map(el => el.name) : [],
|
|
3300
|
+
validateVisibility: this.validateVisibility.bind(this),
|
|
3301
|
+
resetValue: this.resetValue.bind(this),
|
|
3302
|
+
initialValue: (_a = this.initialValues) === null || _a === void 0 ? void 0 : _a[fieldSchema.name],
|
|
3303
|
+
templateSubject$: this.templateSubject$,
|
|
3304
|
+
apiResponseSubject$: this.apiResponseSubject$,
|
|
3305
|
+
dataSubject$: this.dataSubject$,
|
|
3306
|
+
config: this.config
|
|
3307
|
+
}));
|
|
3308
|
+
this.subscribeTemplates();
|
|
3309
|
+
this.refreshTemplates({
|
|
3310
|
+
event: 'ON_FIELDS',
|
|
3311
|
+
key: fieldSchema.name
|
|
3312
|
+
});
|
|
3313
|
+
}
|
|
3261
3314
|
/**
|
|
3262
3315
|
* Serializes the schema structure to create form fields.
|
|
3263
3316
|
*
|
|
@@ -3282,7 +3335,8 @@ class FormCore {
|
|
|
3282
3335
|
initialValue: (_a = this.initialValues) === null || _a === void 0 ? void 0 : _a[structElement.name],
|
|
3283
3336
|
templateSubject$: this.templateSubject$,
|
|
3284
3337
|
apiResponseSubject$: this.apiResponseSubject$,
|
|
3285
|
-
dataSubject$: this.dataSubject
|
|
3338
|
+
dataSubject$: this.dataSubject$,
|
|
3339
|
+
config: this.config
|
|
3286
3340
|
}));
|
|
3287
3341
|
} else {
|
|
3288
3342
|
currField.children = ((_b = structElement === null || structElement === void 0 ? void 0 : structElement.children) === null || _b === void 0 ? void 0 : _b.map(el => el.name)) || (currField === null || currField === void 0 ? void 0 : currField.children) || [];
|
|
@@ -3393,6 +3447,7 @@ class FormCore {
|
|
|
3393
3447
|
this.templateSubject$.unsubscribe();
|
|
3394
3448
|
this.apiResponseSubject$.unsubscribe();
|
|
3395
3449
|
this.dataSubject$.unsubscribe();
|
|
3450
|
+
this.fields.forEach(field => field.destroyField());
|
|
3396
3451
|
}
|
|
3397
3452
|
}
|
|
3398
3453
|
/**
|
|
@@ -3429,6 +3484,25 @@ class FormGroup {
|
|
|
3429
3484
|
constructor() {
|
|
3430
3485
|
this.forms = new Map();
|
|
3431
3486
|
}
|
|
3487
|
+
/**
|
|
3488
|
+
* Creates an empty form with given index
|
|
3489
|
+
*
|
|
3490
|
+
* @param {string} options.index
|
|
3491
|
+
* @param {TMapper<unknown>} options.mappers
|
|
3492
|
+
*/
|
|
3493
|
+
createFormWithIndex({
|
|
3494
|
+
index,
|
|
3495
|
+
mappers
|
|
3496
|
+
}) {
|
|
3497
|
+
const formInstance = new FormCore({
|
|
3498
|
+
index,
|
|
3499
|
+
mappers
|
|
3500
|
+
});
|
|
3501
|
+
this.addForm({
|
|
3502
|
+
key: index,
|
|
3503
|
+
formInstance
|
|
3504
|
+
});
|
|
3505
|
+
}
|
|
3432
3506
|
/**
|
|
3433
3507
|
* Adds a form instance to the form group.
|
|
3434
3508
|
*
|
|
@@ -3471,6 +3545,20 @@ class FormGroup {
|
|
|
3471
3545
|
(_a = this.forms.get(key)) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
3472
3546
|
this.forms.delete(key);
|
|
3473
3547
|
}
|
|
3548
|
+
/**
|
|
3549
|
+
* removes a field given a form and field index
|
|
3550
|
+
*
|
|
3551
|
+
* @param {string} options.formIndex
|
|
3552
|
+
* @param {string} options.fieldIndex
|
|
3553
|
+
*/
|
|
3554
|
+
removeField({
|
|
3555
|
+
formIndex,
|
|
3556
|
+
fieldIndex
|
|
3557
|
+
}) {
|
|
3558
|
+
var _a, _b, _c;
|
|
3559
|
+
(_b = (_a = this.forms.get(formIndex)) === null || _a === void 0 ? void 0 : _a.fields.get(fieldIndex)) === null || _b === void 0 ? void 0 : _b.destroyField();
|
|
3560
|
+
(_c = this.forms.get(formIndex)) === null || _c === void 0 ? void 0 : _c.fields.delete(fieldIndex);
|
|
3561
|
+
}
|
|
3474
3562
|
/**
|
|
3475
3563
|
* Checks if the specified key already exists in the form group.
|
|
3476
3564
|
*
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TApiEvent, TErrorMessages, TEvent, TFormatters, TMasks, TProps, TResetValueMethods, TValidationMethods, TVisibility } from '../types/schema';
|
|
1
|
+
import { TApiEvent, TErrorMessages, TEvent, TFormatters, TMasks, TProps, TResetValueMethods, TSchemaFormConfig, TValidationMethods, TVisibility } from '../types/schema';
|
|
2
2
|
/**
|
|
3
3
|
* @interface IComponentSchema
|
|
4
4
|
* Represents the schema for a component within a form.
|
|
@@ -75,6 +75,7 @@ interface IFormSchema {
|
|
|
75
75
|
index: string;
|
|
76
76
|
action?: string;
|
|
77
77
|
method?: string;
|
|
78
|
+
config?: TSchemaFormConfig;
|
|
78
79
|
initialValues?: Record<string, unknown>;
|
|
79
80
|
iVars?: Record<string, unknown>;
|
|
80
81
|
components?: IComponentSchema[];
|
package/src/managers/field.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Observable, Subject, Subscription } from 'rxjs';
|
|
2
|
-
import { TApiConfig, TApiEvent, TApiResponse, TErrorMessages, TEvent, TFormatters, TMasks, TResetValueMethods, TValidationMethods, TVisibility } from '../types/schema';
|
|
2
|
+
import { TApiConfig, TApiEvent, TApiResponse, TErrorMessages, TEvent, TFormatters, TMasks, TResetValueMethods, TSchemaFormConfig, TValidationMethods, TVisibility } from '../types/schema';
|
|
3
3
|
import { IComponentSchema } from '../interfaces/schema';
|
|
4
4
|
import { IState } from '../interfaces/state';
|
|
5
5
|
import { TEvents, TMutationEvents, TValueChangeEvent } from '../types/event';
|
|
@@ -11,7 +11,7 @@ declare class FormField {
|
|
|
11
11
|
name: string;
|
|
12
12
|
component: string;
|
|
13
13
|
path?: string;
|
|
14
|
-
children
|
|
14
|
+
children?: string[];
|
|
15
15
|
validations?: TEvent<TValidationMethods>;
|
|
16
16
|
visibilityConditions?: TVisibility[];
|
|
17
17
|
resetValues?: TResetValueMethods[];
|
|
@@ -22,6 +22,7 @@ declare class FormField {
|
|
|
22
22
|
valuePropName?: string;
|
|
23
23
|
errorMessagePropName?: string;
|
|
24
24
|
initialValue?: unknown;
|
|
25
|
+
config: Required<TSchemaFormConfig>;
|
|
25
26
|
mapper: TMapper<unknown>;
|
|
26
27
|
private _props;
|
|
27
28
|
private _value;
|
|
@@ -67,6 +68,7 @@ declare class FormField {
|
|
|
67
68
|
*
|
|
68
69
|
* @param {object} options - Configuration options for the form field.
|
|
69
70
|
* @param {IComponentSchema} options.schemaComponent - The schema definition for the form field.
|
|
71
|
+
* @param {TSchemaFormConfig} options.config - The schema default configuration for debounced actions.
|
|
70
72
|
* @param {string} [options.path] - The path within the form field (used internally during recursion).
|
|
71
73
|
* @param {string[]} options.children - An array of children fields names.
|
|
72
74
|
* @param {Function} options.validateVisibility - A function to validate the visibility of the field.
|
|
@@ -74,10 +76,11 @@ declare class FormField {
|
|
|
74
76
|
* @param {unknown} [options.initialValue] - The initial value of the form field.
|
|
75
77
|
* @param {Subject<{ key: string }>} options.templateSubject$ - A subject for template updates.
|
|
76
78
|
*/
|
|
77
|
-
constructor({ schemaComponent, path, children, validateVisibility, resetValue, initialValue, templateSubject$, apiResponseSubject$, dataSubject$, mapper, }: {
|
|
79
|
+
constructor({ schemaComponent, config, path, children, validateVisibility, resetValue, initialValue, templateSubject$, apiResponseSubject$, dataSubject$, mapper, }: {
|
|
78
80
|
schemaComponent: IComponentSchema;
|
|
81
|
+
config?: TSchemaFormConfig;
|
|
79
82
|
path?: string;
|
|
80
|
-
children
|
|
83
|
+
children?: string[];
|
|
81
84
|
validateVisibility: (payload: {
|
|
82
85
|
event: TEvents;
|
|
83
86
|
key: string;
|
|
@@ -245,6 +248,10 @@ declare class FormField {
|
|
|
245
248
|
setFieldValidity({ event }: {
|
|
246
249
|
event: TEvents;
|
|
247
250
|
}): void;
|
|
251
|
+
/**
|
|
252
|
+
* WIP expensive function to get updated field validity on each event
|
|
253
|
+
*/
|
|
254
|
+
updateValidityFlag(): void;
|
|
248
255
|
/**
|
|
249
256
|
* Formats the field value using the specified formatters, if available.
|
|
250
257
|
*
|
package/src/managers/form.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { IFormField } from './field';
|
|
2
2
|
import { Subject, Subscription } from 'rxjs';
|
|
3
3
|
import { IComponentSchema, IFormSchema } from '../interfaces/schema';
|
|
4
|
+
import { TSchemaFormConfig } from '../types/schema';
|
|
4
5
|
import { TSubscribedTemplates } from '../types/template';
|
|
5
6
|
import { TEvents, TMutationEvents } from '../types/event';
|
|
6
7
|
import { TFormEntry, TFormValues } from '../types/form';
|
|
@@ -29,6 +30,7 @@ declare class FormCore {
|
|
|
29
30
|
subscribedTemplates: TSubscribedTemplates[];
|
|
30
31
|
action?: string;
|
|
31
32
|
method?: string;
|
|
33
|
+
config?: TSchemaFormConfig;
|
|
32
34
|
mappers: TMapper<unknown>[];
|
|
33
35
|
onSubmit?: (data: TFormValues) => void;
|
|
34
36
|
/**
|
|
@@ -181,6 +183,12 @@ declare class FormCore {
|
|
|
181
183
|
event: TEvents;
|
|
182
184
|
key: string;
|
|
183
185
|
}): void;
|
|
186
|
+
/**
|
|
187
|
+
* Adds a field onto the form instance regardless there is a schema or not
|
|
188
|
+
*
|
|
189
|
+
* @param fieldSchema
|
|
190
|
+
*/
|
|
191
|
+
addField(fieldSchema: IComponentSchema): void;
|
|
184
192
|
/**
|
|
185
193
|
* Serializes the schema structure to create form fields.
|
|
186
194
|
*
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TFormValues } from '../types/form';
|
|
2
|
-
import {
|
|
2
|
+
import { TMapper } from '../types/mapper';
|
|
3
|
+
import { FormCore, TFormCore } from './form';
|
|
3
4
|
/**
|
|
4
5
|
* Represents a group that manages multiple forms.
|
|
5
6
|
*/
|
|
@@ -9,6 +10,16 @@ declare class FormGroup {
|
|
|
9
10
|
* Creates an instance of FormGroup.
|
|
10
11
|
*/
|
|
11
12
|
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Creates an empty form with given index
|
|
15
|
+
*
|
|
16
|
+
* @param {string} options.index
|
|
17
|
+
* @param {TMapper<unknown>} options.mappers
|
|
18
|
+
*/
|
|
19
|
+
createFormWithIndex({ index, mappers, }: {
|
|
20
|
+
index: string;
|
|
21
|
+
mappers: TMapper<unknown>[];
|
|
22
|
+
}): void;
|
|
12
23
|
/**
|
|
13
24
|
* Adds a form instance to the form group.
|
|
14
25
|
*
|
|
@@ -29,7 +40,7 @@ declare class FormGroup {
|
|
|
29
40
|
*/
|
|
30
41
|
getForm({ key }: {
|
|
31
42
|
key: string;
|
|
32
|
-
}):
|
|
43
|
+
}): FormCore | undefined;
|
|
33
44
|
/**
|
|
34
45
|
* Removes a form instance from the form group.
|
|
35
46
|
*
|
|
@@ -39,6 +50,16 @@ declare class FormGroup {
|
|
|
39
50
|
removeForm({ key }: {
|
|
40
51
|
key: string;
|
|
41
52
|
}): void;
|
|
53
|
+
/**
|
|
54
|
+
* removes a field given a form and field index
|
|
55
|
+
*
|
|
56
|
+
* @param {string} options.formIndex
|
|
57
|
+
* @param {string} options.fieldIndex
|
|
58
|
+
*/
|
|
59
|
+
removeField({ formIndex, fieldIndex }: {
|
|
60
|
+
formIndex: string;
|
|
61
|
+
fieldIndex: string;
|
|
62
|
+
}): void;
|
|
42
63
|
/**
|
|
43
64
|
* Checks if the specified key already exists in the form group.
|
|
44
65
|
*
|
package/src/types/schema.d.ts
CHANGED
|
@@ -739,4 +739,14 @@ type TApiResponse = {
|
|
|
739
739
|
response: unknown;
|
|
740
740
|
}>;
|
|
741
741
|
};
|
|
742
|
-
|
|
742
|
+
/**
|
|
743
|
+
* Represents the schema config structure
|
|
744
|
+
*
|
|
745
|
+
* @property {number} defaultAPIdebounceTimeMS - default API debounce time between request events.
|
|
746
|
+
* @property {number} [defaultStateRefreshTimeMS] - default state refresh between events side effects.
|
|
747
|
+
*/
|
|
748
|
+
type TSchemaFormConfig = {
|
|
749
|
+
defaultAPIdebounceTimeMS?: number;
|
|
750
|
+
defaultStateRefreshTimeMS?: number;
|
|
751
|
+
};
|
|
752
|
+
export { TApiConfig, TErrorMessages, TResetValues, TVisibilityConditions, TValidations, TMasks, TProps, TResetValueMethods, TFormatters, TValidationMethods, TEvent, TVisibility, TApiEvent, TApiResponse, TSchemaFormConfig, TLengthValidation, TCreditCardMatch, TDocumentValidation, TCallbackValidation, TBetweenValidation, TMaskGeneric, TSplitterFormatterValue, TCurrencyMask, TDateOperatorsValidation, TConditionsValidationSet, TConditionsValidation, TMultipleValidation, TAvailableValidations, TDateValidation, TBetweenDatesValidation, TDateFormatsValidation, TDateInterval, };
|