@dereekb/dbx-form 9.15.6 → 9.15.8

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.
Files changed (51) hide show
  1. package/esm2020/lib/form/form.mjs +1 -1
  2. package/esm2020/lib/form/io/form.input.directive.mjs +49 -10
  3. package/esm2020/lib/form/io/form.loading.directive.mjs +3 -3
  4. package/esm2020/lib/formly/field/checklist/checklist.item.field.mjs +3 -3
  5. package/esm2020/lib/formly/field/field.mjs +19 -3
  6. package/esm2020/lib/formly/field/selection/pickable/pickable.field.mjs +4 -4
  7. package/esm2020/lib/formly/field/selection/searchable/searchable.field.mjs +4 -4
  8. package/esm2020/lib/formly/field/selection/selection.field.mjs +3 -3
  9. package/esm2020/lib/formly/field/texteditor/texteditor.field.mjs +3 -3
  10. package/esm2020/lib/formly/field/value/array/array.field.mjs +3 -3
  11. package/esm2020/lib/formly/field/value/boolean/boolean.field.mjs +4 -4
  12. package/esm2020/lib/formly/field/value/date/datetime.field.component.mjs +110 -15
  13. package/esm2020/lib/formly/field/value/date/datetime.field.mjs +32 -6
  14. package/esm2020/lib/formly/field/value/number/number.field.mjs +19 -4
  15. package/esm2020/lib/formly/field/value/phone/phone.field.mjs +3 -3
  16. package/esm2020/lib/formly/field/value/text/text.additional.field.mjs +5 -2
  17. package/esm2020/lib/formly/field/value/text/text.field.mjs +24 -7
  18. package/esm2020/lib/formly/field/wrapper/section.wrapper.component.mjs +1 -1
  19. package/esm2020/lib/formly/field/wrapper/subsection.wrapper.component.mjs +1 -1
  20. package/esm2020/lib/validator/number.mjs +7 -1
  21. package/esm2020/mapbox/lib/field/latlng/latlng.field.mjs +3 -3
  22. package/esm2020/mapbox/lib/field/zoom/zoom.field.mjs +3 -3
  23. package/fesm2015/dereekb-dbx-form-mapbox.mjs +3 -3
  24. package/fesm2015/dereekb-dbx-form-mapbox.mjs.map +1 -1
  25. package/fesm2015/dereekb-dbx-form.mjs +243 -48
  26. package/fesm2015/dereekb-dbx-form.mjs.map +1 -1
  27. package/fesm2020/dereekb-dbx-form-mapbox.mjs +3 -3
  28. package/fesm2020/dereekb-dbx-form-mapbox.mjs.map +1 -1
  29. package/fesm2020/dereekb-dbx-form.mjs +262 -47
  30. package/fesm2020/dereekb-dbx-form.mjs.map +1 -1
  31. package/lib/form/form.d.ts +4 -2
  32. package/lib/form/io/form.input.directive.d.ts +2 -1
  33. package/lib/formly/field/field.d.ts +29 -3
  34. package/lib/formly/field/value/array/array.field.d.ts +6 -0
  35. package/lib/formly/field/value/date/datetime.field.component.d.ts +45 -3
  36. package/lib/formly/field/value/date/datetime.field.d.ts +5 -0
  37. package/lib/formly/field/value/number/number.field.d.ts +4 -2
  38. package/lib/formly/field/value/text/text.additional.field.d.ts +3 -6
  39. package/lib/formly/field/value/text/text.field.d.ts +6 -3
  40. package/lib/formly/field/wrapper/section.wrapper.component.d.ts +1 -2
  41. package/lib/formly/field/wrapper/subsection.wrapper.component.d.ts +1 -2
  42. package/lib/formly/field/wrapper/wrapper.d.ts +2 -2
  43. package/lib/validator/number.d.ts +6 -0
  44. package/mapbox/esm2020/lib/field/latlng/latlng.field.mjs +3 -3
  45. package/mapbox/esm2020/lib/field/zoom/zoom.field.mjs +3 -3
  46. package/mapbox/fesm2015/dereekb-dbx-form-mapbox.mjs +3 -3
  47. package/mapbox/fesm2015/dereekb-dbx-form-mapbox.mjs.map +1 -1
  48. package/mapbox/fesm2020/dereekb-dbx-form-mapbox.mjs +3 -3
  49. package/mapbox/fesm2020/dereekb-dbx-form-mapbox.mjs.map +1 -1
  50. package/mapbox/package.json +4 -4
  51. package/package.json +4 -4
@@ -9,9 +9,9 @@ import * as i2 from '@dereekb/dbx-core';
9
9
  import { AbstractSubscriptionDirective, safeDetectChanges, DbxInjectionComponentModule, DbxDatePipeModule, mergeDbxInjectionComponentConfigs, tapDetectChanges } from '@dereekb/dbx-core';
10
10
  import * as i1$1 from '@dereekb/dbx-web';
11
11
  import { DbxActionTransitionSafetyDirective, DbxTextModule, DbxLoadingModule, DbxFlexLayoutModule, DbxSectionLayoutModule, DbxRouterAnchorModule, AbstractDbxSelectionListWrapperDirective, DEFAULT_LIST_WRAPPER_DIRECTIVE_TEMPLATE, AbstractDbxSelectionListViewDirective, addConfigToValueListItems, provideDbxListView, AbstractDbxValueListViewItemComponent, DbxButtonModule, DbxListLayoutModule, mapCompactModeObs, DbxBarLayoutModule } from '@dereekb/dbx-web';
12
- import { isPast, addSeconds, isSameMinute, startOfDay, isSameDay, addMinutes } from 'date-fns';
13
- import { BehaviorSubject, switchMap, first, exhaustMap, of, catchError, delay, filter, combineLatest, map, distinctUntilChanged, mergeMap, shareReplay, startWith, debounceTime, Subject, skipWhile, interval, tap, merge, throttleTime, scan, timer } from 'rxjs';
14
- import { LockSet, SubscriptionObject, asObservable, loadingStateHasFinishedLoading, switchMapMaybeObs, filterMaybe, switchMapMaybeDefault, SimpleLoadingContext, startWithBeginLoading, mapLoadingStateResults, successResult, ListLoadingStateContextInstance, isListLoadingStateEmpty, LoadingStateContextInstance, tapLog, skipFirstMaybe, asyncPusherCache, scanCount } from '@dereekb/rxjs';
12
+ import { isPast, addSeconds, isSameMinute, startOfDay, isSameDay, addMinutes, addDays } from 'date-fns';
13
+ import { BehaviorSubject, switchMap, first, exhaustMap, of, catchError, delay, filter, combineLatest, map, distinctUntilChanged, shareReplay, Subject, tap, takeUntil, EMPTY, mergeMap, startWith, debounceTime, skipWhile, interval, merge, throttleTime, scan, timer } from 'rxjs';
14
+ import { LockSet, SubscriptionObject, asObservable, cleanup, loadingStateHasFinishedLoading, switchMapMaybeObs, filterMaybe, switchMapMaybeDefault, SimpleLoadingContext, startWithBeginLoading, mapLoadingStateResults, successResult, ListLoadingStateContextInstance, isListLoadingStateEmpty, LoadingStateContextInstance, skipFirstMaybe, asyncPusherCache, scanCount } from '@dereekb/rxjs';
15
15
  import * as i1$3 from '@ngx-formly/core';
16
16
  import { FieldType, FieldWrapper, FormlyModule, FieldArrayType } from '@ngx-formly/core';
17
17
  import * as i3$1 from '@angular/forms';
@@ -26,7 +26,7 @@ import * as i1$2 from '@angular/material/button';
26
26
  import { MatButtonModule } from '@angular/material/button';
27
27
  import * as i3$3 from '@angular/flex-layout/flex';
28
28
  import { FlexLayoutModule } from '@angular/flex-layout';
29
- import { objectIsEmpty, mergeObjectsFunction, filterFromPOJOFunction, mergeObjects, filterFromPOJO, asArray, objectHasNoKeys, addPlusPrefixToNumber, convertMaybeToArray, makeValuesGroupMap, findUnique, searchStringFilterFunction, caseInsensitiveFilterByIndexOfDecisionFactory, mergeIntoArray, lastValue, separateValues, arrayToMap, getValueFromGetter, dateFromLogicalDate, WEBSITE_DOMAIN_NAME_REGEX, KeyValueTypleValueFilter, valuesFromPOJO, allObjectsAreEqual, isNumberDivisibleBy, nearestDivisibleValues, US_STATE_CODE_STRING_REGEX, ZIP_CODE_STRING_REGEX, LAT_LNG_PATTERN, capitalizeFirstLetter, BooleanStringKeyArrayUtilityInstance } from '@dereekb/util';
29
+ import { objectIsEmpty, mergeObjectsFunction, filterFromPOJOFunction, mergeObjects, filterFromPOJO, asArray, objectHasNoKeys, addPlusPrefixToNumber, convertMaybeToArray, makeValuesGroupMap, findUnique, searchStringFilterFunction, caseInsensitiveFilterByIndexOfDecisionFactory, mergeIntoArray, lastValue, separateValues, arrayToMap, getValueFromGetter, filterMaybeValues, dateFromLogicalDate, WEBSITE_DOMAIN_NAME_REGEX, KeyValueTypleValueFilter, valuesFromPOJO, allObjectsAreEqual, isNumberDivisibleBy, nearestDivisibleValues, transformNumberFunction, concatArrays, transformStringFunction, US_STATE_CODE_STRING_REGEX, ZIP_CODE_STRING_REGEX, LAT_LNG_PATTERN, capitalizeFirstLetter, BooleanStringKeyArrayUtilityInstance } from '@dereekb/util';
30
30
  import * as i2$1 from '@angular/material/slide-toggle';
31
31
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
32
32
  import * as i2$2 from '@angular/flex-layout/extended';
@@ -44,7 +44,7 @@ import { MatListModule } from '@angular/material/list';
44
44
  import * as i3$4 from '@angular/material/form-field';
45
45
  import { MatFormFieldModule } from '@angular/material/form-field';
46
46
  import { ENTER, COMMA } from '@angular/cdk/keycodes';
47
- import { skipUntilTimeElapsedAfterLastEmission, toJsDate, parseISO8601DayStringToDate, formatToISO8601DayString, formatToISO8601DateString, guessCurrentTimezone, toReadableTimeString, utcDayForDate, readableTimeStringToDate, DateTimeMinuteInstance, toLocalReadableTimeString, allTimezoneInfos, timezoneInfoForSystem, searchTimezoneInfos } from '@dereekb/date';
47
+ import { skipUntilTimeElapsedAfterLastEmission, toJsDate, parseISO8601DayStringToDate, formatToISO8601DayString, formatToISO8601DateString, safeToJsDate, guessCurrentTimezone, toReadableTimeString, utcDayForDate, readableTimeStringToDate, findMinDate, findMaxDate, DateTimeMinuteInstance, toLocalReadableTimeString, allTimezoneInfos, timezoneInfoForSystem, searchTimezoneInfos } from '@dereekb/date';
48
48
  import * as i4$4 from 'ngx-editor';
49
49
  import { Editor, NgxEditorModule } from 'ngx-editor';
50
50
  import * as i4$5 from '@angular/cdk/drag-drop';
@@ -290,12 +290,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImpor
290
290
  }] });
291
291
 
292
292
  function dbxFormSourceObservable(form, inputObs, mode$) {
293
- const observable = asObservable(inputObs);
294
- return combineLatest([observable.pipe(distinctUntilChanged()), mode$.pipe(distinctUntilChanged())]).pipe(switchMap(([value, mode]) => form.stream$.pipe(
295
- // wait for the form to finish initializing.
296
- filter((x) => x.state !== DbxFormState.INITIALIZING),
297
- // if mode is reset, then filter out changes until the form is reset again.
298
- filter((x) => (mode === 'reset' ? x.state === DbxFormState.RESET : true)), first(), map(() => value))));
293
+ return dbxFormSourceObservableFromStream(form.stream$, inputObs, mode$);
294
+ }
295
+ function dbxFormSourceObservableFromStream(stream$, inputObs, mode$) {
296
+ const value$ = asObservable(inputObs).pipe(shareReplay(1)); // catch/share the latest emission
297
+ const state$ = stream$.pipe(map((x) => x.state), distinctUntilChanged());
298
+ return combineLatest([mode$, value$]).pipe(map((x) => x[0]), distinctUntilChanged(), switchMap((mode) => {
299
+ if (mode === 'reset') {
300
+ // reset only
301
+ return state$.pipe(exhaustMap((state) => {
302
+ if (state === DbxFormState.RESET) {
303
+ let firstValueSent = false;
304
+ const doneSubject = new Subject();
305
+ return combineLatest([value$, state$]).pipe(map(([value, state]) => {
306
+ if (!firstValueSent || state === DbxFormState.RESET) {
307
+ return [value, true]; // always forward the first value.
308
+ }
309
+ else {
310
+ return [value, false];
311
+ }
312
+ }), tap(([value, send]) => {
313
+ firstValueSent = true;
314
+ if (!send) {
315
+ doneSubject.next(undefined);
316
+ }
317
+ }), filter(([value, send]) => send), map((x) => x[0]), takeUntil(doneSubject), cleanup(() => {
318
+ doneSubject.complete();
319
+ }));
320
+ }
321
+ else {
322
+ return EMPTY;
323
+ }
324
+ }));
325
+ }
326
+ else {
327
+ // pass any updated value while not initializing.
328
+ return state$.pipe(map((x) => x === DbxFormState.INITIALIZING), switchMap((initializing) => {
329
+ if (initializing) {
330
+ return EMPTY;
331
+ }
332
+ else {
333
+ return value$;
334
+ }
335
+ }));
336
+ }
337
+ }));
299
338
  }
300
339
  /**
301
340
  * Used with a FormComponent to set the value based on the input value.
@@ -318,7 +357,7 @@ class DbxFormSourceDirective extends AbstractSubscriptionDirective {
318
357
  setObs(inputObs) {
319
358
  let subscription;
320
359
  if (inputObs) {
321
- subscription = dbxFormSourceObservable(this.form, inputObs, this._mode).subscribe((x) => {
360
+ subscription = dbxFormSourceObservableFromStream(this.form.stream$, inputObs, this._mode).subscribe((x) => {
322
361
  this.form.setValue(x);
323
362
  });
324
363
  }
@@ -370,7 +409,7 @@ class DbxFormLoadingSourceDirective extends AbstractSubscriptionDirective {
370
409
  _setObs(inputObs) {
371
410
  let subscription;
372
411
  if (inputObs) {
373
- subscription = dbxFormSourceObservable(this.form, inputObs, this._mode).subscribe((x) => {
412
+ subscription = dbxFormSourceObservableFromStream(this.form.stream$, inputObs, this._mode).subscribe((x) => {
374
413
  if (loadingStateHasFinishedLoading(x)) {
375
414
  this.form.setValue(x.value);
376
415
  }
@@ -1163,10 +1202,20 @@ function formlyField(fieldConfig) {
1163
1202
  }
1164
1203
  return fieldConfig;
1165
1204
  }
1166
- function propsForFieldConfig(fieldConfig, override) {
1205
+ /**
1206
+ * Creates an object with propers, expressions, and parsers properly configured from the input FieldConfig.
1207
+ *
1208
+ * @param fieldConfig
1209
+ * @param override
1210
+ * @returns
1211
+ */
1212
+ function propsAndConfigForFieldConfig(fieldConfig, override) {
1213
+ const { expressions, parsers } = fieldConfig;
1167
1214
  const props = propsValueForFieldConfig(fieldConfig, override);
1168
1215
  return {
1169
- props
1216
+ props,
1217
+ expressions,
1218
+ parsers
1170
1219
  };
1171
1220
  }
1172
1221
  const partialPotentialFieldConfigKeys = ['label', 'placeholder', 'required', 'readonly', 'description', 'autocomplete'];
@@ -1238,13 +1287,19 @@ function validatorsForFieldConfig(input) {
1238
1287
  }
1239
1288
  return config;
1240
1289
  }
1290
+ /**
1291
+ * MARK: Compat
1292
+ *
1293
+ * @deprecated use propsAndConfigForFieldConfig instead.
1294
+ */
1295
+ const propsForFieldConfig = propsAndConfigForFieldConfig;
1241
1296
 
1242
1297
  function checklistItemField(config) {
1243
1298
  const { key, displayContentObs, componentClass } = config;
1244
1299
  const fieldConfig = formlyField({
1245
1300
  key,
1246
1301
  type: 'checklistitem',
1247
- ...propsForFieldConfig(config, {
1302
+ ...propsAndConfigForFieldConfig(config, {
1248
1303
  displayContentObs,
1249
1304
  componentClass
1250
1305
  })
@@ -1867,7 +1922,7 @@ function pickableItemChipField(config) {
1867
1922
  return formlyField({
1868
1923
  key,
1869
1924
  type: 'pickablechipfield',
1870
- ...propsForFieldConfig(config, {
1925
+ ...propsAndConfigForFieldConfig(config, {
1871
1926
  ...config,
1872
1927
  autocomplete: false
1873
1928
  })
@@ -1878,7 +1933,7 @@ function pickableItemListField(config) {
1878
1933
  return formlyField({
1879
1934
  key,
1880
1935
  type: 'pickablelistfield',
1881
- ...propsForFieldConfig(config, {
1936
+ ...propsAndConfigForFieldConfig(config, {
1882
1937
  ...config,
1883
1938
  autocomplete: false
1884
1939
  })
@@ -2300,7 +2355,7 @@ function searchableChipField(config) {
2300
2355
  return formlyField({
2301
2356
  key,
2302
2357
  type: 'searchablechipfield',
2303
- ...propsForFieldConfig(config, {
2358
+ ...propsAndConfigForFieldConfig(config, {
2304
2359
  ...config,
2305
2360
  placeholder: placeholder ?? 'Add...',
2306
2361
  autocomplete: false
@@ -2312,7 +2367,7 @@ function searchableTextField(config) {
2312
2367
  return formlyField({
2313
2368
  key,
2314
2369
  type: 'searchabletextfield',
2315
- ...propsForFieldConfig(config, {
2370
+ ...propsAndConfigForFieldConfig(config, {
2316
2371
  ...config,
2317
2372
  autocomplete: false
2318
2373
  })
@@ -2457,7 +2512,7 @@ function valueSelectionField(config) {
2457
2512
  return formlyField({
2458
2513
  key,
2459
2514
  type: native ? 'native-select' : 'select',
2460
- ...propsForFieldConfig(config, {
2515
+ ...propsAndConfigForFieldConfig(config, {
2461
2516
  options: config.options,
2462
2517
  multiple: config.multiple ?? false,
2463
2518
  ...selectAllOptionConfig
@@ -2610,7 +2665,7 @@ function textEditorField(config) {
2610
2665
  // Set to trigger value update on blurs with the form. However, the value is set internally too.
2611
2666
  updateOn: 'blur'
2612
2667
  },
2613
- ...propsForFieldConfig(config, {
2668
+ ...propsAndConfigForFieldConfig(config, {
2614
2669
  minLength,
2615
2670
  maxLength
2616
2671
  })
@@ -2792,7 +2847,7 @@ function repeatArrayField(config) {
2792
2847
  return formlyField({
2793
2848
  key,
2794
2849
  type: 'repeatarray',
2795
- ...propsForFieldConfig(config, {
2850
+ ...propsAndConfigForFieldConfig(config, {
2796
2851
  maxLength,
2797
2852
  labelForField,
2798
2853
  addText,
@@ -2825,7 +2880,7 @@ function toggleField(config) {
2825
2880
  type: 'toggle',
2826
2881
  wrappers: ['autotouch', 'form-field'],
2827
2882
  defaultValue: defaultValue ?? false,
2828
- ...propsForFieldConfig(config)
2883
+ ...propsAndConfigForFieldConfig(config)
2829
2884
  });
2830
2885
  }
2831
2886
  function checkboxField(config) {
@@ -2834,7 +2889,7 @@ function checkboxField(config) {
2834
2889
  key,
2835
2890
  type: 'checkbox',
2836
2891
  defaultValue: defaultValue ?? false,
2837
- ...propsForFieldConfig(config)
2892
+ ...propsAndConfigForFieldConfig(config)
2838
2893
  });
2839
2894
  }
2840
2895
  /*
@@ -2918,6 +2973,20 @@ function dbxDateTimeOutputValueFactory(mode) {
2918
2973
  }
2919
2974
  return factory;
2920
2975
  }
2976
+ function syncConfigValueObs(parseConfigsObs, type) {
2977
+ return parseConfigsObs.pipe(switchMap((x) => {
2978
+ const config = x.find((y) => y.syncType === type);
2979
+ let result;
2980
+ if (config) {
2981
+ const { control } = config;
2982
+ result = control.valueChanges.pipe(startWith(control.value), map(safeToJsDate));
2983
+ }
2984
+ else {
2985
+ result = of(undefined);
2986
+ }
2987
+ return result;
2988
+ }), distinctUntilChanged(), shareReplay(1));
2989
+ }
2921
2990
  class DbxDateTimeFieldComponent extends FieldType$1 {
2922
2991
  constructor(cdRef) {
2923
2992
  super();
@@ -2947,13 +3016,40 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
2947
3016
  validators: [Validators.pattern(/^(now)$|^([0-9]|(0[0-9])|(1[0-9])|(2[0-3]))(:)?([0-5][0-9])?(\s)?([apAP][Mm])?(\\s)*$/)]
2948
3017
  });
2949
3018
  this._config = new BehaviorSubject(undefined);
3019
+ this._syncConfigObs = new BehaviorSubject(undefined);
2950
3020
  this.fullDay$ = this.fullDayControl$.pipe(switchMap((control) => control.valueChanges.pipe(startWith(control.value))));
2951
3021
  this.showTimeInput$ = this.fullDay$.pipe(map((x) => !x && this.timeMode !== DbxDateTimeFieldTimeMode.NONE));
2952
3022
  this.showAddTime$ = this.showTimeInput$.pipe(map((x) => !x && this.timeMode === DbxDateTimeFieldTimeMode.OPTIONAL), shareReplay(1));
2953
3023
  this.date$ = this.dateInputCtrl.valueChanges.pipe(startWith(this.dateInputCtrl.value), filterMaybe(), shareReplay(1));
2954
- this.dateValue$ = merge(this.date$.pipe(tapLog('date')), this.value$.pipe(skipFirstMaybe())).pipe(map((x) => (x ? startOfDay(x) : x)), distinctUntilChanged((a, b) => a != null && b != null && isSameDay(a, b)), shareReplay(1));
3024
+ this.dateValue$ = merge(this.date$, this.value$.pipe(skipFirstMaybe())).pipe(map((x) => (x ? startOfDay(x) : x)), distinctUntilChanged((a, b) => a != null && b != null && isSameDay(a, b)), shareReplay(1));
2955
3025
  this.timeInput$ = this._updateTime.pipe(debounceTime(5), map(() => this.timeInputCtrl.value || ''), distinctUntilChanged());
2956
- this.config$ = this._config.pipe(switchMapMaybeDefault(), shareReplay(1));
3026
+ this.syncConfigObs$ = this._syncConfigObs.pipe(switchMapMaybeDefault(), shareReplay(1));
3027
+ this.parsedSyncConfigs$ = this.syncConfigObs$.pipe(map((x) => {
3028
+ let parsed;
3029
+ if (x) {
3030
+ parsed = filterMaybeValues(asArray(x).map((y) => {
3031
+ const control = this.form.get(y.syncWith);
3032
+ if (control) {
3033
+ return {
3034
+ control,
3035
+ ...y
3036
+ };
3037
+ }
3038
+ else {
3039
+ return undefined;
3040
+ }
3041
+ }));
3042
+ }
3043
+ else {
3044
+ parsed = [];
3045
+ }
3046
+ return parsed;
3047
+ }), shareReplay(1));
3048
+ this.syncConfigBeforeValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'before');
3049
+ this.syncConfigAfterValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'after');
3050
+ // TODO: Get min/max using the DateTimePickerConfiguration too
3051
+ this.dateInputMin$ = this.syncConfigBeforeValue$;
3052
+ this.dateInputMax$ = this.syncConfigAfterValue$;
2957
3053
  this.rawDateTime$ = combineLatest([this.dateValue$, this.timeInput$.pipe(startWith(null)), this.fullDay$]).pipe(map(([date, timeString, fullDay]) => {
2958
3054
  let result;
2959
3055
  if (date) {
@@ -2978,7 +3074,24 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
2978
3074
  }
2979
3075
  return result;
2980
3076
  }), distinctUntilChanged((a, b) => a != null && b != null && isSameMinute(a, b)), shareReplay(1));
2981
- this.timeOutput$ = combineLatest([this.rawDateTime$, this._offset, this.config$.pipe(distinctUntilChanged())]).pipe(throttleTime(40, undefined, { leading: false, trailing: true }), distinctUntilChanged((current, next) => current[0] === next[0] && next[1] === 0), tap(([, stepsOffset]) => (stepsOffset ? this._offset.next(0) : 0)), map(([date, stepsOffset, config]) => {
3077
+ this.config$ = combineLatest([this._config.pipe(switchMapMaybeDefault(), shareReplay(1)), this.dateInputMin$, this.dateInputMax$]).pipe(map(([x, dateInputMin, dateInputMax]) => {
3078
+ let result = x;
3079
+ if (dateInputMin != null || dateInputMax != null) {
3080
+ const { min: limitMin, max: limitMax } = x?.limits ?? {};
3081
+ const min = findMinDate([dateInputMin, limitMin]);
3082
+ const max = findMaxDate([dateInputMax, limitMax]);
3083
+ result = {
3084
+ ...x,
3085
+ limits: {
3086
+ ...x?.limits,
3087
+ min,
3088
+ max
3089
+ }
3090
+ };
3091
+ }
3092
+ return result;
3093
+ }), distinctUntilChanged(), shareReplay(1));
3094
+ this.timeOutput$ = combineLatest([this.rawDateTime$, this._offset, this.config$]).pipe(throttleTime(40, undefined, { leading: false, trailing: true }), distinctUntilChanged((current, next) => current[0] === next[0] && next[1] === 0), tap(([, stepsOffset]) => (stepsOffset ? this._offset.next(0) : 0)), map(([date, stepsOffset, config]) => {
2982
3095
  if (date != null) {
2983
3096
  const instance = new DateTimeMinuteInstance({
2984
3097
  date,
@@ -2992,6 +3105,12 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
2992
3105
  return date;
2993
3106
  }), distinctUntilChanged((a, b) => a != null && b != null && isSameMinute(a, b)), shareReplay(1));
2994
3107
  }
3108
+ get dateLabel() {
3109
+ return this.props.dateLabel ?? 'Date';
3110
+ }
3111
+ get timeLabel() {
3112
+ return this.props.timeLabel ?? 'Time';
3113
+ }
2995
3114
  get dateOnly() {
2996
3115
  return this.timeMode === DbxDateTimeFieldTimeMode.NONE;
2997
3116
  }
@@ -3019,6 +3138,7 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3019
3138
  ngOnInit() {
3020
3139
  this._formControlObs.next(this.formControl);
3021
3140
  this._config.next(this.dateTimeField.getConfigObs?.());
3141
+ this._syncConfigObs.next(this.dateTimeField.getSyncFieldsObs?.());
3022
3142
  const valueFactory = dbxDateTimeOutputValueFactory(this.valueMode);
3023
3143
  this._sub.subscription = this.timeOutput$.pipe(skipFirstMaybe()).subscribe((dateValue) => {
3024
3144
  const value = valueFactory(dateValue);
@@ -3076,15 +3196,14 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3076
3196
  this._formControlObs.complete();
3077
3197
  this._config.complete();
3078
3198
  this._updateTime.complete();
3199
+ this._syncConfigObs.complete();
3079
3200
  this._sub.destroy();
3080
3201
  this._valueSub.destroy();
3081
3202
  }
3082
3203
  datePicked(event) {
3083
3204
  const date = event.value;
3084
- console.log('date picked?', event);
3085
3205
  if (date) {
3086
- this.dateInputCtrl.setValue(date);
3087
- this._updateTime.next();
3206
+ this.setDateInputValue(date);
3088
3207
  }
3089
3208
  }
3090
3209
  setLogicalTime(time) {
@@ -3094,12 +3213,43 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3094
3213
  this.setTime(timeString);
3095
3214
  }
3096
3215
  }
3216
+ setDateInputValue(date) {
3217
+ this.dateInputCtrl.setValue(date);
3218
+ this._updateTime.next();
3219
+ }
3097
3220
  setTime(time) {
3098
3221
  this.timeInputCtrl.setValue(time);
3099
3222
  this._offset.next(0);
3100
3223
  this._updateTime.next();
3101
3224
  }
3102
- keydownOnInput(event) {
3225
+ keydownOnDateInput(event) {
3226
+ let direction = 0;
3227
+ switch (event.key?.toLowerCase()) {
3228
+ case 'arrowup':
3229
+ direction = 1;
3230
+ break;
3231
+ case 'arrowdown':
3232
+ direction = -1;
3233
+ break;
3234
+ }
3235
+ let offset = 1;
3236
+ if (event.ctrlKey && event.shiftKey) {
3237
+ offset = 365;
3238
+ }
3239
+ else if (event.ctrlKey) {
3240
+ offset = 30;
3241
+ }
3242
+ else if (event.shiftKey) {
3243
+ offset = 7;
3244
+ }
3245
+ if (direction !== 0) {
3246
+ this.date$.pipe(first()).subscribe((date) => {
3247
+ const newDate = addDays(date, offset * direction);
3248
+ this.setDateInputValue(newDate);
3249
+ });
3250
+ }
3251
+ }
3252
+ keydownOnTimeInput(event) {
3103
3253
  let direction = 0;
3104
3254
  switch (event.key?.toLowerCase()) {
3105
3255
  case 'arrowup':
@@ -3143,10 +3293,10 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3143
3293
  }
3144
3294
  }
3145
3295
  DbxDateTimeFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: DbxDateTimeFieldComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
3146
- DbxDateTimeFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.2", type: DbxDateTimeFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInput ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div class=\"add-time-button-wrapper\" *ngIf=\"showAddTime$ | async\">\n <button mat-button class=\"add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\" [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">All Day</b>\n {{ dateValue$ | async | date: 'fullDate' }} ({{ dateValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"value$ | async\">\n <b class=\"dbx-ok\">At</b>\n {{ displayValue$ | async | date: 'medium' }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <button mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>Date</mat-label>\n <input #dateInput matInput [matDatepicker]=\"picker\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" />\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <button mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <button mat-menu-item (click)=\"setLogicalTime('now')\">\n <span>Now</span>\n </button>\n <button mat-menu-item (click)=\"setTime('12:00AM')\">\n <span>Midnight</span>\n </button>\n <button mat-menu-item (click)=\"setTime('6:00AM')\">\n <span>6:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('8:00AM')\">\n <span>8:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('10:00AM')\">\n <span>10:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('12:00PM')\">\n <span>Noon</span>\n </button>\n <button mat-menu-item (click)=\"setTime('2:00PM')\">\n <span>2:00PM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('5:00PM')\">\n <span>5:00PM</span>\n </button>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>Time</mat-label>\n <input #timeInput matInput [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnInput($event)\" />\n </mat-form-field>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3$1.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: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i3$4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.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: i5$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i1$2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i3$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3$3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3$3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i2$2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i2.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i2.DateDistancePipe, name: "dateDistance" }] });
3296
+ DbxDateTimeFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.2", type: DbxDateTimeFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInput ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div class=\"add-time-button-wrapper\" *ngIf=\"showAddTime$ | async\">\n <button mat-button class=\"add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\" [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">All Day</b>\n {{ displayValue$ | async | date: 'fullDate' }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"value$ | async\">\n <b class=\"dbx-ok\">At</b>\n {{ displayValue$ | async | date: 'medium' }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <button mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <button mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <button mat-menu-item (click)=\"setLogicalTime('now')\">\n <span>Now</span>\n </button>\n <button mat-menu-item (click)=\"setTime('12:00AM')\">\n <span>Midnight</span>\n </button>\n <button mat-menu-item (click)=\"setTime('6:00AM')\">\n <span>6:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('8:00AM')\">\n <span>8:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('10:00AM')\">\n <span>10:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('12:00PM')\">\n <span>Noon</span>\n </button>\n <button mat-menu-item (click)=\"setTime('2:00PM')\">\n <span>2:00PM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('5:00PM')\">\n <span>5:00PM</span>\n </button>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n </mat-form-field>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3$1.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: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i3$4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.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: i5$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i1$2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i3$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3$3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3$3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i2$2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i2.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i2.DateDistancePipe, name: "dateDistance" }] });
3147
3297
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: DbxDateTimeFieldComponent, decorators: [{
3148
3298
  type: Component,
3149
- args: [{ template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInput ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div class=\"add-time-button-wrapper\" *ngIf=\"showAddTime$ | async\">\n <button mat-button class=\"add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\" [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">All Day</b>\n {{ dateValue$ | async | date: 'fullDate' }} ({{ dateValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"value$ | async\">\n <b class=\"dbx-ok\">At</b>\n {{ displayValue$ | async | date: 'medium' }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <button mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>Date</mat-label>\n <input #dateInput matInput [matDatepicker]=\"picker\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" />\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <button mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <button mat-menu-item (click)=\"setLogicalTime('now')\">\n <span>Now</span>\n </button>\n <button mat-menu-item (click)=\"setTime('12:00AM')\">\n <span>Midnight</span>\n </button>\n <button mat-menu-item (click)=\"setTime('6:00AM')\">\n <span>6:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('8:00AM')\">\n <span>8:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('10:00AM')\">\n <span>10:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('12:00PM')\">\n <span>Noon</span>\n </button>\n <button mat-menu-item (click)=\"setTime('2:00PM')\">\n <span>2:00PM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('5:00PM')\">\n <span>5:00PM</span>\n </button>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>Time</mat-label>\n <input #timeInput matInput [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnInput($event)\" />\n </mat-form-field>\n</ng-template>\n" }]
3299
+ args: [{ template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInput ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div class=\"add-time-button-wrapper\" *ngIf=\"showAddTime$ | async\">\n <button mat-button class=\"add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\" [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">All Day</b>\n {{ displayValue$ | async | date: 'fullDate' }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"value$ | async\">\n <b class=\"dbx-ok\">At</b>\n {{ displayValue$ | async | date: 'medium' }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <button mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <button mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <button mat-menu-item (click)=\"setLogicalTime('now')\">\n <span>Now</span>\n </button>\n <button mat-menu-item (click)=\"setTime('12:00AM')\">\n <span>Midnight</span>\n </button>\n <button mat-menu-item (click)=\"setTime('6:00AM')\">\n <span>6:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('8:00AM')\">\n <span>8:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('10:00AM')\">\n <span>10:00AM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('12:00PM')\">\n <span>Noon</span>\n </button>\n <button mat-menu-item (click)=\"setTime('2:00PM')\">\n <span>2:00PM</span>\n </button>\n <button mat-menu-item (click)=\"setTime('5:00PM')\">\n <span>5:00PM</span>\n </button>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n </mat-form-field>\n</ng-template>\n" }]
3150
3300
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; } });
3151
3301
 
3152
3302
  class DbxFormFormlyDateFieldModule {
@@ -3225,24 +3375,50 @@ function timeOnlyField(config = {}) {
3225
3375
  });
3226
3376
  }
3227
3377
  function dateTimeField(config = {}) {
3228
- const { key = 'date', timeMode = DbxDateTimeFieldTimeMode.REQUIRED, valueMode, fullDayInUTC, fullDayFieldName, getConfigObs, hideDateHint, timeOnly = false } = config;
3378
+ const { key = 'date', dateLabel, timeLabel, timeMode = DbxDateTimeFieldTimeMode.REQUIRED, valueMode, fullDayInUTC, fullDayFieldName, getConfigObs, getSyncFieldsObs, hideDateHint, timeOnly = false } = config;
3229
3379
  const fieldConfig = formlyField({
3230
3380
  key,
3231
3381
  type: 'datetime',
3232
- ...propsForFieldConfig(config, {
3382
+ ...propsAndConfigForFieldConfig(config, {
3383
+ dateLabel,
3384
+ timeLabel,
3233
3385
  valueMode,
3234
3386
  timeOnly,
3235
3387
  timeMode: timeOnly ? DbxDateTimeFieldTimeMode.REQUIRED : timeMode,
3236
3388
  fullDayFieldName,
3237
3389
  fullDayInUTC,
3238
3390
  hideDateHint,
3239
- getConfigObs
3391
+ getConfigObs,
3392
+ getSyncFieldsObs
3240
3393
  })
3241
3394
  });
3242
3395
  return styleWrapper(fieldConfig, {
3243
3396
  classGetter: 'dbx-mat-form-field-disable-underline'
3244
3397
  });
3245
3398
  }
3399
+ function dateRangeField(config = {}) {
3400
+ const { start, end } = config;
3401
+ const startFieldKey = start?.key ?? 'start';
3402
+ const endFieldKey = end?.key ?? 'end';
3403
+ const startField = dateTimeField({
3404
+ dateLabel: 'Start',
3405
+ timeMode: DbxDateTimeFieldTimeMode.NONE,
3406
+ getSyncFieldsObs: () => of([{ syncWith: endFieldKey, syncType: 'after' }]),
3407
+ ...start,
3408
+ key: startFieldKey
3409
+ });
3410
+ const endField = dateTimeField({
3411
+ dateLabel: 'End',
3412
+ timeMode: DbxDateTimeFieldTimeMode.NONE,
3413
+ getSyncFieldsObs: () => of([{ syncWith: startFieldKey, syncType: 'before' }]),
3414
+ ...end,
3415
+ key: endFieldKey
3416
+ });
3417
+ return {
3418
+ key: undefined,
3419
+ fieldGroup: [flexLayoutWrapper([startField, endField], { size: 1, relative: true })]
3420
+ };
3421
+ }
3246
3422
 
3247
3423
  function isTruthy() {
3248
3424
  return (control) => {
@@ -3314,6 +3490,12 @@ function isInRange(min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER)
3314
3490
  };
3315
3491
  }
3316
3492
  const IS_DIVISIBLE_BY_VALIDATION_KEY = 'isDivisibleBy';
3493
+ /**
3494
+ * Angular Form ValidationFn for checking isDivisibleBy the input divisor.
3495
+ *
3496
+ * @param divisor
3497
+ * @returns
3498
+ */
3317
3499
  function isDivisibleBy(divisor) {
3318
3500
  if (divisor === 0) {
3319
3501
  throw new Error('Divisior must be greater than zero.');
@@ -3364,8 +3546,21 @@ function fieldValueIsAvailableValidator(config) {
3364
3546
  })), first());
3365
3547
  }
3366
3548
 
3549
+ function numberFieldTransformParser(config) {
3550
+ const { parsers: inputParsers, transform } = config;
3551
+ let parsers;
3552
+ if (inputParsers) {
3553
+ parsers = inputParsers;
3554
+ }
3555
+ if (transform) {
3556
+ const transformParser = transformNumberFunction(transform);
3557
+ parsers = concatArrays([transformParser], parsers);
3558
+ }
3559
+ return parsers;
3560
+ }
3367
3561
  function numberField(config) {
3368
3562
  const { key, min, max, step, enforceStep, inputType: type = 'number' } = config;
3563
+ const parsers = numberFieldTransformParser(config);
3369
3564
  const validators = [];
3370
3565
  if (step && enforceStep) {
3371
3566
  validators.push(isDivisibleBy(step));
@@ -3373,7 +3568,7 @@ function numberField(config) {
3373
3568
  return formlyField({
3374
3569
  key,
3375
3570
  type: 'input',
3376
- ...propsForFieldConfig(config, {
3571
+ ...propsAndConfigForFieldConfig(config, {
3377
3572
  type,
3378
3573
  min,
3379
3574
  max,
@@ -3381,7 +3576,8 @@ function numberField(config) {
3381
3576
  }),
3382
3577
  ...validatorsForFieldConfig({
3383
3578
  validators
3384
- })
3579
+ }),
3580
+ parsers
3385
3581
  });
3386
3582
  }
3387
3583
 
@@ -3466,30 +3662,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImpor
3466
3662
  }]
3467
3663
  }] });
3468
3664
 
3665
+ function textFieldTransformParser(config) {
3666
+ const { parsers: inputParsers, transform } = config;
3667
+ let parsers;
3668
+ if (inputParsers) {
3669
+ parsers = inputParsers;
3670
+ }
3671
+ if (transform) {
3672
+ const transformParser = transformStringFunction(transform);
3673
+ parsers = concatArrays([transformParser], parsers);
3674
+ }
3675
+ return parsers;
3676
+ }
3469
3677
  function textField(config) {
3470
- const { key, pattern, minLength, maxLength, inputType: type = 'text' } = config;
3678
+ const { transform, key, pattern, minLength, maxLength, inputType: type = 'text' } = config;
3679
+ const parsers = textFieldTransformParser(config);
3471
3680
  return formlyField({
3472
3681
  key,
3473
3682
  type: 'input',
3474
- ...propsForFieldConfig(config, {
3683
+ ...propsAndConfigForFieldConfig(config, {
3475
3684
  type,
3476
3685
  minLength,
3477
3686
  maxLength,
3478
3687
  pattern
3479
- })
3688
+ }),
3689
+ parsers
3480
3690
  });
3481
3691
  }
3482
3692
  function textAreaField(config) {
3483
3693
  const { key, rows = 3, pattern, minLength, maxLength } = config;
3694
+ const parsers = textFieldTransformParser(config);
3484
3695
  return formlyField({
3485
3696
  key,
3486
3697
  type: 'textarea',
3487
- ...propsForFieldConfig(config, {
3698
+ ...propsAndConfigForFieldConfig(config, {
3488
3699
  rows,
3489
3700
  minLength,
3490
3701
  maxLength,
3491
3702
  pattern
3492
- })
3703
+ }),
3704
+ parsers
3493
3705
  });
3494
3706
  }
3495
3707
 
@@ -3498,7 +3710,7 @@ function phoneField(config = {}) {
3498
3710
  const fieldConfig = formlyField({
3499
3711
  key,
3500
3712
  type: 'intphone',
3501
- ...propsForFieldConfig(config, {
3713
+ ...propsAndConfigForFieldConfig(config, {
3502
3714
  preferredCountries,
3503
3715
  onlyCountries
3504
3716
  })
@@ -3601,7 +3813,10 @@ function stateField(config = {}) {
3601
3813
  pattern,
3602
3814
  autocomplete,
3603
3815
  required,
3604
- maxLength
3816
+ maxLength,
3817
+ transform: {
3818
+ toUppercase: true
3819
+ }
3605
3820
  });
3606
3821
  }
3607
3822
  function countryField(config = {}) {
@@ -4380,5 +4595,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImpor
4380
4595
  * Generated bundle index. Do not edit.
4381
4596
  */
4382
4597
 
4383
- export { APP_ACTION_FORM_DISABLED_KEY, AUTO_TOUCH_WRAPPER_KEY, AbstractAsyncFormlyFormDirective, AbstractConfigAsyncFormlyFormDirective, AbstractDbxPickableItemFieldDirective, AbstractDbxSearchableFieldDisplayDirective, AbstractDbxSearchableValueFieldDirective, AbstractFormExpandableSectionWrapperDirective, AbstractFormlyFormDirective, AbstractSyncFormlyFormDirective, AutoTouchFieldWrapperComponent, ChecklistItemFieldDataSetBuilder, DBX_SEARCHABLE_FIELD_COMPONENT_DATA_TOKEN, DEFAULT_FORM_DISABLED_KEY, DEFAULT_HAS_VALUE_FN, DEFAULT_LAT_LNG_TEXT_FIELD_PATTERN_MESSAGE, DEFAULT_LAT_LNG_TEXT_FIELD_PLACEHOLDER, DEFAULT_PREFERRED_COUNTRIES, DISPLAY_FOR_TIMEZONE_STRING_VALUE, DbxActionFormDirective, DbxActionFormSafetyDirective, DbxChecklistItemContentComponent, DbxChecklistItemFieldComponent, DbxDateTimeFieldComponent, DbxDateTimeFieldTimeMode, DbxDateTimeValueMode, DbxDefaultChecklistItemFieldDisplayComponent, DbxDefaultSearchableFieldDisplayComponent, DbxForm, DbxFormActionModule, DbxFormActionTransitionModule, DbxFormComponentFieldComponent, DbxFormExpandWrapperComponent, DbxFormExtensionModule, DbxFormFlexWrapperComponent, DbxFormFormlyArrayFieldModule, DbxFormFormlyBooleanFieldModule, DbxFormFormlyChecklistItemFieldModule, DbxFormFormlyComponentFieldModule, DbxFormFormlyDateFieldModule, DbxFormFormlyFieldModule, DbxFormFormlyNumberFieldModule, DbxFormFormlyPhoneFieldModule, DbxFormFormlyPickableFieldModule, DbxFormFormlySearchableFieldModule, DbxFormFormlySelectionModule, DbxFormFormlyTextEditorFieldModule, DbxFormFormlyTextFieldModule, DbxFormFormlyValueModule, DbxFormFormlyWrapperModule, DbxFormInfoWrapperComponent, DbxFormIoModule, DbxFormLayoutModule, DbxFormLoadingSourceDirective, DbxFormModule, DbxFormRepeatArrayTypeComponent, DbxFormSectionWrapperComponent, DbxFormSourceDirective, DbxFormSpacerComponent, DbxFormState, DbxFormSubsectionWrapperComponent, DbxFormToggleWrapperComponent, DbxFormValueChangesDirective, DbxFormWorkingWrapperComponent, DbxFormlyContext, DbxFormlyFieldsContextDirective, DbxFormlyFormComponent, DbxFormlyModule, DbxMutableForm, DbxPhoneFieldComponent, DbxPickableChipListFieldComponent, DbxPickableListFieldComponent, DbxPickableListFieldItemListComponent, DbxPickableListFieldItemListViewComponent, DbxPickableListFieldItemListViewItemComponent, DbxSearchableChipFieldComponent, DbxSearchableFieldAutocompleteItemComponent, DbxSearchableTextFieldComponent, DbxTextEditorFieldComponent, EXPANDABLE_WRAPPER_KEY, FIELD_VALUES_ARE_EQUAL_VALIDATION_KEY, FIELD_VALUE_IS_AVAILABLE_ERROR_VALIDATION_KEY, FIELD_VALUE_IS_AVAILABLE_VALIDATION_KEY, FLEX_WRAPPER_KEY, INFO_WRAPPER_KEY, INVALID_PHONE_NUMBER_MESSAGE, IS_DIVISIBLE_BY_VALIDATION_KEY, LABEL_STRING_MAX_LENGTH, MAX_LENGTH_VALIDATION_MESSAGE, MAX_VALIDATION_MESSAGE, MIN_LENGTH_VALIDATION_MESSAGE, MIN_VALIDATION_MESSAGE, PHONE_LABEL_MAX_LENGTH, REQUIRED_VALIDATION_MESSAGE, SEARCH_STRING_MAX_LENGTH, SECTION_WRAPPER_KEY, STYLE_WRAPPER_KEY, SUBSECTION_WRAPPER_KEY, TAKE_NEXT_UPCOMING_TIME_CONFIG_OBS, TOGGLE_WRAPPER_KEY, WORKING_WRAPPER_KEY, addWrapperToFormlyFieldConfig, addressField, addressFormlyFields, addressLineField, addressListField, autoTouchWrapper, checkIsFieldFlexLayoutGroupFieldConfig, checkboxField, checklistItemField, chipTextField, cityField, componentField, countryField, dateTimeField, dbxDateTimeInputValueParseFactory, dbxDateTimeOutputValueFactory, dbxFormSourceObservable, defaultValidationMessages, disableFormlyFieldAutofillAttributes, emailField, expandWrapper, fieldValueIsAvailableValidator, fieldValuesAreEqualValidator, filterPartialPotentialFieldConfigValuesFromObject, filterPickableItemFieldValuesByLabel, filterPickableItemFieldValuesByLabelFilterFunction, flexLayoutWrapper, formlyField, hiddenField, infoWrapper, isDivisibleBy, isDomain, isInRange, isTruthy, latLngTextField, makeMetaFilterSearchableFieldValueDisplayFn, maxLengthValidationMessage, maxValidationMessage, mergePropsValueObjects, minLengthValidationMessage, minValidationMessage, nameField, numberField, partialPotentialFieldConfigKeys, partialPotentialFieldConfigKeysFilter, phoneAndLabelSectionField, phoneField, phoneListField, pickableItemChipField, pickableItemListField, propsForFieldConfig, propsValueForFieldConfig, provideDbxForm, provideDbxMutableForm, provideFormlyContext, repeatArrayField, searchableChipField, searchableStringChipField, searchableTextField, sectionWrapper, sortPickableItemsByLabel, stateField, styleWrapper, subsectionWrapper, textAreaField, textEditorField, textField, textIsAvailableField, textPasswordField, textPasswordWithVerifyFieldGroup, textVerifyPasswordField, timeOnlyField, timezoneStringField, timezoneStringSearchFunction, toggleField, toggleWrapper, usernamePasswordLoginFields, validatorsForFieldConfig, valueSelectionField, workingWrapper, wrappedPhoneAndLabelField, zipCodeField };
4598
+ export { APP_ACTION_FORM_DISABLED_KEY, AUTO_TOUCH_WRAPPER_KEY, AbstractAsyncFormlyFormDirective, AbstractConfigAsyncFormlyFormDirective, AbstractDbxPickableItemFieldDirective, AbstractDbxSearchableFieldDisplayDirective, AbstractDbxSearchableValueFieldDirective, AbstractFormExpandableSectionWrapperDirective, AbstractFormlyFormDirective, AbstractSyncFormlyFormDirective, AutoTouchFieldWrapperComponent, ChecklistItemFieldDataSetBuilder, DBX_SEARCHABLE_FIELD_COMPONENT_DATA_TOKEN, DEFAULT_FORM_DISABLED_KEY, DEFAULT_HAS_VALUE_FN, DEFAULT_LAT_LNG_TEXT_FIELD_PATTERN_MESSAGE, DEFAULT_LAT_LNG_TEXT_FIELD_PLACEHOLDER, DEFAULT_PREFERRED_COUNTRIES, DISPLAY_FOR_TIMEZONE_STRING_VALUE, DbxActionFormDirective, DbxActionFormSafetyDirective, DbxChecklistItemContentComponent, DbxChecklistItemFieldComponent, DbxDateTimeFieldComponent, DbxDateTimeFieldTimeMode, DbxDateTimeValueMode, DbxDefaultChecklistItemFieldDisplayComponent, DbxDefaultSearchableFieldDisplayComponent, DbxForm, DbxFormActionModule, DbxFormActionTransitionModule, DbxFormComponentFieldComponent, DbxFormExpandWrapperComponent, DbxFormExtensionModule, DbxFormFlexWrapperComponent, DbxFormFormlyArrayFieldModule, DbxFormFormlyBooleanFieldModule, DbxFormFormlyChecklistItemFieldModule, DbxFormFormlyComponentFieldModule, DbxFormFormlyDateFieldModule, DbxFormFormlyFieldModule, DbxFormFormlyNumberFieldModule, DbxFormFormlyPhoneFieldModule, DbxFormFormlyPickableFieldModule, DbxFormFormlySearchableFieldModule, DbxFormFormlySelectionModule, DbxFormFormlyTextEditorFieldModule, DbxFormFormlyTextFieldModule, DbxFormFormlyValueModule, DbxFormFormlyWrapperModule, DbxFormInfoWrapperComponent, DbxFormIoModule, DbxFormLayoutModule, DbxFormLoadingSourceDirective, DbxFormModule, DbxFormRepeatArrayTypeComponent, DbxFormSectionWrapperComponent, DbxFormSourceDirective, DbxFormSpacerComponent, DbxFormState, DbxFormSubsectionWrapperComponent, DbxFormToggleWrapperComponent, DbxFormValueChangesDirective, DbxFormWorkingWrapperComponent, DbxFormlyContext, DbxFormlyFieldsContextDirective, DbxFormlyFormComponent, DbxFormlyModule, DbxMutableForm, DbxPhoneFieldComponent, DbxPickableChipListFieldComponent, DbxPickableListFieldComponent, DbxPickableListFieldItemListComponent, DbxPickableListFieldItemListViewComponent, DbxPickableListFieldItemListViewItemComponent, DbxSearchableChipFieldComponent, DbxSearchableFieldAutocompleteItemComponent, DbxSearchableTextFieldComponent, DbxTextEditorFieldComponent, EXPANDABLE_WRAPPER_KEY, FIELD_VALUES_ARE_EQUAL_VALIDATION_KEY, FIELD_VALUE_IS_AVAILABLE_ERROR_VALIDATION_KEY, FIELD_VALUE_IS_AVAILABLE_VALIDATION_KEY, FLEX_WRAPPER_KEY, INFO_WRAPPER_KEY, INVALID_PHONE_NUMBER_MESSAGE, IS_DIVISIBLE_BY_VALIDATION_KEY, LABEL_STRING_MAX_LENGTH, MAX_LENGTH_VALIDATION_MESSAGE, MAX_VALIDATION_MESSAGE, MIN_LENGTH_VALIDATION_MESSAGE, MIN_VALIDATION_MESSAGE, PHONE_LABEL_MAX_LENGTH, REQUIRED_VALIDATION_MESSAGE, SEARCH_STRING_MAX_LENGTH, SECTION_WRAPPER_KEY, STYLE_WRAPPER_KEY, SUBSECTION_WRAPPER_KEY, TAKE_NEXT_UPCOMING_TIME_CONFIG_OBS, TOGGLE_WRAPPER_KEY, WORKING_WRAPPER_KEY, addWrapperToFormlyFieldConfig, addressField, addressFormlyFields, addressLineField, addressListField, autoTouchWrapper, checkIsFieldFlexLayoutGroupFieldConfig, checkboxField, checklistItemField, chipTextField, cityField, componentField, countryField, dateRangeField, dateTimeField, dbxDateTimeInputValueParseFactory, dbxDateTimeOutputValueFactory, dbxFormSourceObservable, dbxFormSourceObservableFromStream, defaultValidationMessages, disableFormlyFieldAutofillAttributes, emailField, expandWrapper, fieldValueIsAvailableValidator, fieldValuesAreEqualValidator, filterPartialPotentialFieldConfigValuesFromObject, filterPickableItemFieldValuesByLabel, filterPickableItemFieldValuesByLabelFilterFunction, flexLayoutWrapper, formlyField, hiddenField, infoWrapper, isDivisibleBy, isDomain, isInRange, isTruthy, latLngTextField, makeMetaFilterSearchableFieldValueDisplayFn, maxLengthValidationMessage, maxValidationMessage, mergePropsValueObjects, minLengthValidationMessage, minValidationMessage, nameField, numberField, numberFieldTransformParser, partialPotentialFieldConfigKeys, partialPotentialFieldConfigKeysFilter, phoneAndLabelSectionField, phoneField, phoneListField, pickableItemChipField, pickableItemListField, propsAndConfigForFieldConfig, propsForFieldConfig, propsValueForFieldConfig, provideDbxForm, provideDbxMutableForm, provideFormlyContext, repeatArrayField, searchableChipField, searchableStringChipField, searchableTextField, sectionWrapper, sortPickableItemsByLabel, stateField, styleWrapper, subsectionWrapper, syncConfigValueObs, textAreaField, textEditorField, textField, textFieldTransformParser, textIsAvailableField, textPasswordField, textPasswordWithVerifyFieldGroup, textVerifyPasswordField, timeOnlyField, timezoneStringField, timezoneStringSearchFunction, toggleField, toggleWrapper, usernamePasswordLoginFields, validatorsForFieldConfig, valueSelectionField, workingWrapper, wrappedPhoneAndLabelField, zipCodeField };
4384
4599
  //# sourceMappingURL=dereekb-dbx-form.mjs.map