@dereekb/dbx-form 10.1.12 → 10.1.14

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.
@@ -17,13 +17,14 @@ export function timeOnlyField(config = {}) {
17
17
  });
18
18
  }
19
19
  export function dateTimeField(config = {}) {
20
- const { key = 'date', dateLabel, timeLabel, allDayLabel, atTimeLabel, timeDate, timezone, showTimezone, timeMode = DbxDateTimeFieldTimeMode.REQUIRED, valueMode, fullDayInUTC, fullDayFieldName, pickerConfig, getSyncFieldsObs, hideDatePicker, hideDateHint, timeOnly = false, presets, materialFormField } = config;
20
+ const { key = 'date', showClearButton, dateLabel, timeLabel, allDayLabel, atTimeLabel, timeDate, timezone, showTimezone, timeMode = DbxDateTimeFieldTimeMode.REQUIRED, valueMode, fullDayInUTC, fullDayFieldName, pickerConfig, getSyncFieldsObs, hideDatePicker, hideDateHint, timeOnly = false, presets, materialFormField } = config;
21
21
  const classGetter = 'dbx-mat-form-field-disable-underline dbx-mat-form-date-time-field-wrapper';
22
22
  const fieldConfig = formlyField({
23
23
  key,
24
24
  type: 'datetime',
25
25
  ...propsAndConfigForFieldConfig(config, {
26
26
  ...materialFormField,
27
+ showClearButton,
27
28
  classGetter,
28
29
  dateLabel,
29
30
  timeLabel,
@@ -83,7 +84,7 @@ export function dateRangeField(config = {}) {
83
84
  };
84
85
  }
85
86
  export function dateTimeRangeField(inputConfig = {}) {
86
- const { required = false, start: inputStart, end: inputEnd, timezone, timeDate, showTimezone, presets } = inputConfig;
87
+ const { required = false, start: inputStart, end: inputEnd, timezone, timeDate, showTimezone, presets, valueMode } = inputConfig;
87
88
  function dateTimeRangeFieldConfig(config) {
88
89
  return {
89
90
  ...config,
@@ -138,4 +139,4 @@ export function fixedDateRangeField(config = {}) {
138
139
  });
139
140
  return fieldConfig;
140
141
  }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuZmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2RhdGV0aW1lLmZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFzQixXQUFXLEVBQUUsNEJBQTRCLEVBQW1ELE1BQU0sYUFBYSxDQUFDO0FBQzdJLE9BQU8sRUFBeUIsd0JBQXdCLEVBQWtDLE1BQU0sNEJBQTRCLENBQUM7QUFDN0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPMUQsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQXFELEdBQUcsRUFBRSxDQUN2RyxFQUFFLENBQUM7SUFDRCxvQkFBb0IsRUFBRSxJQUFJO0lBQzFCLGlCQUFpQixFQUFFLElBQUk7Q0FDeEIsQ0FBQyxDQUFDO0FBRUw7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQW1DLEVBQUU7SUFDakUsT0FBTyxhQUFhLENBQUM7UUFDbkIsR0FBRyxNQUFNO1FBQ1QsUUFBUSxFQUFFLHdCQUF3QixDQUFDLFFBQVE7UUFDM0MsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxTQUF1QyxFQUFFO0lBQ3JFLE1BQU0sRUFBRSxHQUFHLEdBQUcsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFdlQsTUFBTSxXQUFXLEdBQUcsMkVBQTJFLENBQUM7SUFDaEcsTUFBTSxXQUFXLEdBQTZDLFdBQVcsQ0FBQztRQUN4RSxHQUFHO1FBQ0gsSUFBSSxFQUFFLFVBQVU7UUFDaEIsR0FBRyw0QkFBNEIsQ0FBQyxNQUFNLEVBQUU7WUFDdEMsR0FBRyxpQkFBaUI7WUFDcEIsV0FBVztZQUNYLFNBQVM7WUFDVCxTQUFTO1lBQ1QsV0FBVztZQUNYLFdBQVc7WUFDWCxTQUFTO1lBQ1QsUUFBUTtZQUNSLE9BQU87WUFDUCxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVE7WUFDakUsUUFBUTtZQUNSLFFBQVE7WUFDUixZQUFZO1lBQ1osZ0JBQWdCO1lBQ2hCLFlBQVk7WUFDWixjQUFjO1lBQ2QsWUFBWTtZQUNaLFlBQVk7WUFDWixnQkFBZ0I7U0FDakIsQ0FBQztLQUNILENBQUMsQ0FBQztJQUVILE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFVRCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQW1DLEVBQUU7SUFDbEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDbEcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLEtBQUssRUFBRSxRQUFRLElBQUksS0FBSyxDQUFDO0lBRTNELE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDO0lBQzVDLE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDO0lBRXRDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUMvQixTQUFTLEVBQUUsT0FBTztRQUNsQixRQUFRLEVBQUUsd0JBQXdCLENBQUMsSUFBSTtRQUN2QyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUUsT0FBTztRQUNQLFdBQVcsRUFBRSxFQUFFO1FBQ2YsUUFBUTtRQUNSLFFBQVE7UUFDUixZQUFZO1FBQ1osR0FBRyxLQUFLO1FBQ1IsUUFBUTtRQUNSLEdBQUcsRUFBRSxhQUFhO0tBQ25CLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUM3QixTQUFTLEVBQUUsS0FBSztRQUNoQixRQUFRLEVBQUUsd0JBQXdCLENBQUMsSUFBSTtRQUN2QyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0UsT0FBTztRQUNQLFdBQVcsRUFBRSxFQUFFO1FBQ2YsUUFBUTtRQUNSLFFBQVE7UUFDUixZQUFZO1FBQ1osR0FBRyxHQUFHO1FBQ04sUUFBUTtRQUNSLEdBQUcsRUFBRSxXQUFXO0tBQ2pCLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxHQUFHLEVBQUUsU0FBUztRQUNkLFVBQVUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0tBQ3RILENBQUM7QUFDSixDQUFDO0FBVUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLGNBQTRDLEVBQUU7SUFDL0UsTUFBTSxFQUFFLFFBQVEsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxHQUFHLFdBQVcsQ0FBQztJQUV0SCxTQUFTLHdCQUF3QixDQUFDLE1BQW9EO1FBQ3BGLE9BQU87WUFDTCxHQUFHLE1BQU07WUFDVCxRQUFRO1lBQ1IsUUFBUSxFQUFFLHdCQUF3QixDQUFDLFFBQVE7WUFDM0MsZ0JBQWdCLEVBQUUsU0FBUztZQUMzQixRQUFRLEVBQUUsSUFBSTtZQUNkLFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxFQUFFLEdBQUcsSUFBSSxLQUFLLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQWlDO1FBQzFDLEtBQUssRUFBRSxZQUFZO1FBQ25CLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLEdBQUcsRUFBRSxRQUFRO0tBQ2QsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFpQztRQUN4QyxLQUFLLEVBQUUsVUFBVTtRQUNqQixHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQztRQUNyQyxHQUFHLEVBQUUsTUFBTTtLQUNaLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRztRQUNiLFFBQVE7UUFDUixRQUFRO1FBQ1IsWUFBWTtRQUNaLE9BQU87UUFDUCxLQUFLO1FBQ0wsR0FBRztLQUNKLENBQUM7SUFFRixPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBS0QsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFNBQTZDLEVBQUU7SUFDakYsTUFBTSxFQUFFLEdBQUcsR0FBRyxXQUFXLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFL0ssTUFBTSxXQUFXLEdBQUcsOEVBQThFLENBQUM7SUFDbkcsTUFBTSxXQUFXLEdBQTZDLFdBQVcsQ0FBQztRQUN4RSxHQUFHO1FBQ0gsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixHQUFHLDRCQUE0QixDQUFDLE1BQU0sRUFBRTtZQUN0QyxHQUFHLGlCQUFpQjtZQUNwQixXQUFXO1lBQ1gsY0FBYztZQUNkLFlBQVk7WUFDWixTQUFTO1lBQ1QsT0FBTztZQUNQLFFBQVE7WUFDUixhQUFhO1lBQ2IsWUFBWTtZQUNaLFlBQVk7WUFDWixjQUFjO1NBQ2YsQ0FBQztLQUNILENBQUMsQ0FBQztJQUVILE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRm9ybWx5RmllbGRDb25maWcgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IExhYmVsZWRGaWVsZENvbmZpZywgZm9ybWx5RmllbGQsIHByb3BzQW5kQ29uZmlnRm9yRmllbGRDb25maWcsIERlc2NyaXB0aW9uRmllbGRDb25maWcsIE1hdGVyaWFsRm9ybUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZmllbGQnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVGaWVsZFByb3BzLCBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUsIERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IGZsZXhMYXlvdXRXcmFwcGVyIH0gZnJvbSAnLi4vLi4vd3JhcHBlci93cmFwcGVyJztcbmltcG9ydCB7IE1heWJlIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBEYnhGaXhlZERhdGVSYW5nZUZpZWxkUHJvcHMgfSBmcm9tICcuL2ZpeGVkZGF0ZXJhbmdlLmZpZWxkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRpbWVGaWVsZENvbmZpZyBleHRlbmRzIExhYmVsZWRGaWVsZENvbmZpZywgRGVzY3JpcHRpb25GaWVsZENvbmZpZywgRGJ4RGF0ZVRpbWVGaWVsZFByb3BzLCBNYXRlcmlhbEZvcm1GaWVsZENvbmZpZyB7fVxuZXhwb3J0IHR5cGUgVGltZUZpZWxkQ29uZmlnID0gT21pdDxEYXRlVGltZUZpZWxkQ29uZmlnLCAnc2hvd0RhdGUnIHwgJ3RpbWVPbmx5Jz47XG5cbmV4cG9ydCBjb25zdCBUQUtFX05FWFRfVVBDT01JTkdfVElNRV9DT05GSUdfT0JTOiAoKSA9PiBPYnNlcnZhYmxlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4gPSAoKSA9PlxuICBvZih7XG4gICAgdGFrZU5leHRVcGNvbWluZ1RpbWU6IHRydWUsXG4gICAgcm91bmREb3duVG9NaW51dGU6IHRydWVcbiAgfSk7XG5cbi8qKlxuICogU2FtZSBhcyBEYXRlVGltZSBmaWVsZCBidXQgd2l0aCB0aGUgRGF0ZSBpbnB1dCBoaWRkZW4gYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWVPbmx5RmllbGQoY29uZmlnOiBQYXJ0aWFsPFRpbWVGaWVsZENvbmZpZz4gPSB7fSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgcmV0dXJuIGRhdGVUaW1lRmllbGQoe1xuICAgIC4uLmNvbmZpZyxcbiAgICB0aW1lTW9kZTogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVELFxuICAgIHRpbWVPbmx5OiB0cnVlXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZVRpbWVGaWVsZChjb25maWc6IFBhcnRpYWw8RGF0ZVRpbWVGaWVsZENvbmZpZz4gPSB7fSkge1xuICBjb25zdCB7IGtleSA9ICdkYXRlJywgZGF0ZUxhYmVsLCB0aW1lTGFiZWwsIGFsbERheUxhYmVsLCBhdFRpbWVMYWJlbCwgdGltZURhdGUsIHRpbWV6b25lLCBzaG93VGltZXpvbmUsIHRpbWVNb2RlID0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVELCB2YWx1ZU1vZGUsIGZ1bGxEYXlJblVUQywgZnVsbERheUZpZWxkTmFtZSwgcGlja2VyQ29uZmlnLCBnZXRTeW5jRmllbGRzT2JzLCBoaWRlRGF0ZVBpY2tlciwgaGlkZURhdGVIaW50LCB0aW1lT25seSA9IGZhbHNlLCBwcmVzZXRzLCBtYXRlcmlhbEZvcm1GaWVsZCB9ID0gY29uZmlnO1xuXG4gIGNvbnN0IGNsYXNzR2V0dGVyID0gJ2RieC1tYXQtZm9ybS1maWVsZC1kaXNhYmxlLXVuZGVybGluZSBkYngtbWF0LWZvcm0tZGF0ZS10aW1lLWZpZWxkLXdyYXBwZXInO1xuICBjb25zdCBmaWVsZENvbmZpZzogRm9ybWx5RmllbGRDb25maWc8RGJ4RGF0ZVRpbWVGaWVsZFByb3BzPiA9IGZvcm1seUZpZWxkKHtcbiAgICBrZXksXG4gICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAuLi5wcm9wc0FuZENvbmZpZ0ZvckZpZWxkQ29uZmlnKGNvbmZpZywge1xuICAgICAgLi4ubWF0ZXJpYWxGb3JtRmllbGQsXG4gICAgICBjbGFzc0dldHRlcixcbiAgICAgIGRhdGVMYWJlbCxcbiAgICAgIHRpbWVMYWJlbCxcbiAgICAgIGFsbERheUxhYmVsLFxuICAgICAgYXRUaW1lTGFiZWwsXG4gICAgICB2YWx1ZU1vZGUsXG4gICAgICB0aW1lT25seSxcbiAgICAgIHByZXNldHMsXG4gICAgICB0aW1lTW9kZTogdGltZU9ubHkgPyBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQgOiB0aW1lTW9kZSxcbiAgICAgIHRpbWV6b25lLFxuICAgICAgdGltZURhdGUsXG4gICAgICBzaG93VGltZXpvbmUsXG4gICAgICBmdWxsRGF5RmllbGROYW1lLFxuICAgICAgZnVsbERheUluVVRDLFxuICAgICAgaGlkZURhdGVQaWNrZXIsXG4gICAgICBoaWRlRGF0ZUhpbnQsXG4gICAgICBwaWNrZXJDb25maWcsXG4gICAgICBnZXRTeW5jRmllbGRzT2JzXG4gICAgfSlcbiAgfSk7XG5cbiAgcmV0dXJuIGZpZWxkQ29uZmlnO1xufVxuXG5leHBvcnQgdHlwZSBEYXRlRGF0ZVJhbmdlRmllbGREYXRlQ29uZmlnID0gT21pdDxEYXRlVGltZUZpZWxkQ29uZmlnLCAnZGF0ZUxhYmVsJyB8ICd0aW1lT25seScgfCAndGltZU1vZGUnIHwgJ2dldFN5bmNGaWVsZHNPYnMnPjtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlRGF0ZVJhbmdlRmllbGRDb25maWcgZXh0ZW5kcyBQaWNrPERhdGVUaW1lRmllbGRDb25maWcsICd0aW1lRGF0ZScgfCAndGltZXpvbmUnIHwgJ3Nob3dUaW1lem9uZScgfCAncHJlc2V0cyc+IHtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBzdGFydD86IFBhcnRpYWw8RGF0ZURhdGVSYW5nZUZpZWxkRGF0ZUNvbmZpZz47XG4gIGVuZD86IFBhcnRpYWw8RGF0ZURhdGVSYW5nZUZpZWxkRGF0ZUNvbmZpZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlUmFuZ2VGaWVsZChjb25maWc6IERhdGVEYXRlUmFuZ2VGaWVsZENvbmZpZyA9IHt9KTogRm9ybWx5RmllbGRDb25maWcge1xuICBjb25zdCB7IHJlcXVpcmVkOiBpbnB1dFJlcXVpcmVkLCBzdGFydCwgZW5kLCB0aW1lRGF0ZSwgdGltZXpvbmUsIHNob3dUaW1lem9uZSwgcHJlc2V0cyB9ID0gY29uZmlnO1xuICBjb25zdCByZXF1aXJlZCA9IGlucHV0UmVxdWlyZWQgPz8gc3RhcnQ/LnJlcXVpcmVkID8/IGZhbHNlO1xuXG4gIGNvbnN0IHN0YXJ0RmllbGRLZXkgPSBzdGFydD8ua2V5ID8/ICdzdGFydCc7XG4gIGNvbnN0IGVuZEZpZWxkS2V5ID0gZW5kPy5rZXkgPz8gJ2VuZCc7XG5cbiAgY29uc3Qgc3RhcnRGaWVsZCA9IGRhdGVUaW1lRmllbGQoe1xuICAgIGRhdGVMYWJlbDogJ1N0YXJ0JyxcbiAgICB0aW1lTW9kZTogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkUsXG4gICAgZ2V0U3luY0ZpZWxkc09iczogKCkgPT4gb2YoW3sgc3luY1dpdGg6IGVuZEZpZWxkS2V5LCBzeW5jVHlwZTogJ2FmdGVyJyB9XSksXG4gICAgcHJlc2V0cyxcbiAgICBhbGxEYXlMYWJlbDogJycsXG4gICAgdGltZURhdGUsXG4gICAgdGltZXpvbmUsXG4gICAgc2hvd1RpbWV6b25lLFxuICAgIC4uLnN0YXJ0LFxuICAgIHJlcXVpcmVkLFxuICAgIGtleTogc3RhcnRGaWVsZEtleVxuICB9KTtcblxuICBjb25zdCBlbmRGaWVsZCA9IGRhdGVUaW1lRmllbGQoe1xuICAgIGRhdGVMYWJlbDogJ0VuZCcsXG4gICAgdGltZU1vZGU6IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5OT05FLFxuICAgIGdldFN5bmNGaWVsZHNPYnM6ICgpID0+IG9mKFt7IHN5bmNXaXRoOiBzdGFydEZpZWxkS2V5LCBzeW5jVHlwZTogJ2JlZm9yZScgfV0pLFxuICAgIHByZXNldHMsXG4gICAgYWxsRGF5TGFiZWw6ICcnLFxuICAgIHRpbWVEYXRlLFxuICAgIHRpbWV6b25lLFxuICAgIHNob3dUaW1lem9uZSxcbiAgICAuLi5lbmQsXG4gICAgcmVxdWlyZWQsXG4gICAga2V5OiBlbmRGaWVsZEtleVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGtleTogdW5kZWZpbmVkLFxuICAgIGZpZWxkR3JvdXA6IFtmbGV4TGF5b3V0V3JhcHBlcihbc3RhcnRGaWVsZCwgZW5kRmllbGRdLCB7IHJlbGF0aXZlOiB0cnVlLCBicmVha1RvQ29sdW1uOiB0cnVlLCBicmVha3BvaW50OiAnbGFyZ2UnIH0pXVxuICB9O1xufVxuXG5leHBvcnQgdHlwZSBEYXRlVGltZVJhbmdlRmllbGRUaW1lQ29uZmlnID0gT21pdDxEYXRlRGF0ZVJhbmdlRmllbGREYXRlQ29uZmlnLCAnYWxsRGF5TGFiZWwnIHwgJ2Z1bGxEYXlGaWVsZE5hbWUnIHwgJ2Z1bGxEYXlJblVUQyc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVEYXRlVGltZVJhbmdlRmllbGRDb25maWcgZXh0ZW5kcyBQaWNrPERhdGVUaW1lRmllbGRDb25maWcsICd0aW1lRGF0ZScgfCAndGltZXpvbmUnIHwgJ3Nob3dUaW1lem9uZScgfCAncHJlc2V0cyc+IHtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBzdGFydD86IFBhcnRpYWw8RGF0ZVRpbWVSYW5nZUZpZWxkVGltZUNvbmZpZz47XG4gIGVuZD86IFBhcnRpYWw8RGF0ZVRpbWVSYW5nZUZpZWxkVGltZUNvbmZpZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlVGltZVJhbmdlRmllbGQoaW5wdXRDb25maWc6IERhdGVEYXRlVGltZVJhbmdlRmllbGRDb25maWcgPSB7fSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgY29uc3QgeyByZXF1aXJlZCA9IGZhbHNlLCBzdGFydDogaW5wdXRTdGFydCwgZW5kOiBpbnB1dEVuZCwgdGltZXpvbmUsIHRpbWVEYXRlLCBzaG93VGltZXpvbmUsIHByZXNldHMgfSA9IGlucHV0Q29uZmlnO1xuXG4gIGZ1bmN0aW9uIGRhdGVUaW1lUmFuZ2VGaWVsZENvbmZpZyhjb25maWc6IE1heWJlPFBhcnRpYWw8RGF0ZVRpbWVSYW5nZUZpZWxkVGltZUNvbmZpZz4+KTogUGFydGlhbDxEYXRlVGltZUZpZWxkQ29uZmlnPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgdGltZU1vZGU6IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRCxcbiAgICAgIGdldFN5bmNGaWVsZHNPYnM6IHVuZGVmaW5lZCxcbiAgICAgIHRpbWVPbmx5OiB0cnVlLFxuICAgICAgaGlkZURhdGVIaW50OiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0S2V5ID0gaW5wdXRTdGFydD8ua2V5ID8/ICdzdGFydCc7XG4gIGNvbnN0IGVuZEtleSA9IGlucHV0RW5kPy5rZXkgPz8gJ2VuZCc7XG5cbiAgY29uc3Qgc3RhcnQ6IFBhcnRpYWw8RGF0ZVRpbWVGaWVsZENvbmZpZz4gPSB7XG4gICAgbGFiZWw6ICdTdGFydCBUaW1lJyxcbiAgICAuLi5kYXRlVGltZVJhbmdlRmllbGRDb25maWcoaW5wdXRTdGFydCksXG4gICAga2V5OiBzdGFydEtleVxuICB9O1xuXG4gIGNvbnN0IGVuZDogUGFydGlhbDxEYXRlVGltZUZpZWxkQ29uZmlnPiA9IHtcbiAgICBsYWJlbDogJ0VuZCBUaW1lJyxcbiAgICAuLi5kYXRlVGltZVJhbmdlRmllbGRDb25maWcoaW5wdXRFbmQpLFxuICAgIGtleTogZW5kS2V5XG4gIH07XG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIHRpbWV6b25lLFxuICAgIHRpbWVEYXRlLFxuICAgIHNob3dUaW1lem9uZSxcbiAgICBwcmVzZXRzLFxuICAgIHN0YXJ0LFxuICAgIGVuZFxuICB9O1xuXG4gIHJldHVybiBkYXRlUmFuZ2VGaWVsZChjb25maWcpO1xufVxuXG4vLyBNQVJLOiBGaXhlZERhdGVSYW5nZVxuZXhwb3J0IGludGVyZmFjZSBGaXhlZERhdGVSYW5nZUZpZWxkQ29uZmlnIGV4dGVuZHMgTGFiZWxlZEZpZWxkQ29uZmlnLCBEZXNjcmlwdGlvbkZpZWxkQ29uZmlnLCBEYnhGaXhlZERhdGVSYW5nZUZpZWxkUHJvcHMsIE1hdGVyaWFsRm9ybUZpZWxkQ29uZmlnIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhlZERhdGVSYW5nZUZpZWxkKGNvbmZpZzogUGFydGlhbDxGaXhlZERhdGVSYW5nZUZpZWxkQ29uZmlnPiA9IHt9KSB7XG4gIGNvbnN0IHsga2V5ID0gJ2RhdGVSYW5nZScsIGRhdGVSYW5nZUlucHV0LCBwaWNrZXJDb25maWcsIHRpbWV6b25lLCBzZWxlY3Rpb25Nb2RlLCBzaG93VGltZXpvbmUsIHZhbHVlTW9kZSwgZnVsbERheUluVVRDLCBwcmVzZXRzLCBzaG93UmFuZ2VJbnB1dCwgbWF0ZXJpYWxGb3JtRmllbGQgfSA9IGNvbmZpZztcblxuICBjb25zdCBjbGFzc0dldHRlciA9ICdkYngtbWF0LWZvcm0tZmllbGQtZGlzYWJsZS11bmRlcmxpbmUgZGJ4LWZvcm0tZml4ZWQtZGF0ZS1yYW5nZS1maWVsZC13cmFwcGVyJztcbiAgY29uc3QgZmllbGRDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnPERieERhdGVUaW1lRmllbGRQcm9wcz4gPSBmb3JtbHlGaWVsZCh7XG4gICAga2V5LFxuICAgIHR5cGU6ICdmaXhlZGRhdGVyYW5nZScsXG4gICAgLi4ucHJvcHNBbmRDb25maWdGb3JGaWVsZENvbmZpZyhjb25maWcsIHtcbiAgICAgIC4uLm1hdGVyaWFsRm9ybUZpZWxkLFxuICAgICAgY2xhc3NHZXR0ZXIsXG4gICAgICBkYXRlUmFuZ2VJbnB1dCxcbiAgICAgIHBpY2tlckNvbmZpZyxcbiAgICAgIHZhbHVlTW9kZSxcbiAgICAgIHByZXNldHMsXG4gICAgICB0aW1lem9uZSxcbiAgICAgIHNlbGVjdGlvbk1vZGUsXG4gICAgICBzaG93VGltZXpvbmUsXG4gICAgICBmdWxsRGF5SW5VVEMsXG4gICAgICBzaG93UmFuZ2VJbnB1dFxuICAgIH0pXG4gIH0pO1xuXG4gIHJldHVybiBmaWVsZENvbmZpZztcbn1cbiJdfQ==
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuZmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2RhdGV0aW1lLmZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFzQixXQUFXLEVBQUUsNEJBQTRCLEVBQW1ELE1BQU0sYUFBYSxDQUFDO0FBQzdJLE9BQU8sRUFBeUIsd0JBQXdCLEVBQWtDLE1BQU0sNEJBQTRCLENBQUM7QUFDN0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPMUQsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQXFELEdBQUcsRUFBRSxDQUN2RyxFQUFFLENBQUM7SUFDRCxvQkFBb0IsRUFBRSxJQUFJO0lBQzFCLGlCQUFpQixFQUFFLElBQUk7Q0FDeEIsQ0FBQyxDQUFDO0FBRUw7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQW1DLEVBQUU7SUFDakUsT0FBTyxhQUFhLENBQUM7UUFDbkIsR0FBRyxNQUFNO1FBQ1QsUUFBUSxFQUFFLHdCQUF3QixDQUFDLFFBQVE7UUFDM0MsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxTQUF1QyxFQUFFO0lBQ3JFLE1BQU0sRUFBRSxHQUFHLEdBQUcsTUFBTSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxHQUFHLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxjQUFj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QUFXLEdBQTZDLFdBQVcsQ0FBQztRQUN4RSxHQUFHO1FBQ0gsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixHQUFHLDRCQUE0QixDQUFDLE1BQU0sRUFBRTtZQUN0QyxHQUFHLGlCQUFpQjtZQUNwQixXQUFXO1lBQ1gsY0FBYztZQUNkLFlBQVk7WUFDWixTQUFTO1lBQ1QsT0FBTztZQUNQLFFBQVE7WUFDUixhQUFhO1lBQ2IsWUFBWTtZQUNaLFlBQVk7WUFDWixjQUFjO1NBQ2YsQ0FBQztLQUNILENBQUMsQ0FBQztJQUVILE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRm9ybWx5RmllbGRDb25maWcgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IExhYmVsZWRGaWVsZENvbmZpZywgZm9ybWx5RmllbGQsIHByb3BzQW5kQ29uZmlnRm9yRmllbGRDb25maWcsIERlc2NyaXB0aW9uRmllbGRDb25maWcsIE1hdGVyaWFsRm9ybUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZmllbGQnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVGaWVsZFByb3BzLCBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUsIERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IGZsZXhMYXlvdXRXcmFwcGVyIH0gZnJvbSAnLi4vLi4vd3JhcHBlci93cmFwcGVyJztcbmltcG9ydCB7IE1heWJlIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBEYnhGaXhlZERhdGVSYW5nZUZpZWxkUHJvcHMgfSBmcm9tICcuL2ZpeGVkZGF0ZXJhbmdlLmZpZWxkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRpbWVGaWVsZENvbmZpZyBleHRlbmRzIExhYmVsZWRGaWVsZENvbmZpZywgRGVzY3JpcHRpb25GaWVsZENvbmZpZywgRGJ4RGF0ZVRpbWVGaWVsZFByb3BzLCBNYXRlcmlhbEZvcm1GaWVsZENvbmZpZyB7fVxuZXhwb3J0IHR5cGUgVGltZUZpZWxkQ29uZmlnID0gT21pdDxEYXRlVGltZUZpZWxkQ29uZmlnLCAnc2hvd0RhdGUnIHwgJ3RpbWVPbmx5Jz47XG5cbmV4cG9ydCBjb25zdCBUQUtFX05FWFRfVVBDT01JTkdfVElNRV9DT05GSUdfT0JTOiAoKSA9PiBPYnNlcnZhYmxlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4gPSAoKSA9PlxuICBvZih7XG4gICAgdGFrZU5leHRVcGNvbWluZ1RpbWU6IHRydWUsXG4gICAgcm91bmREb3duVG9NaW51dGU6IHRydWVcbiAgfSk7XG5cbi8qKlxuICogU2FtZSBhcyBEYXRlVGltZSBmaWVsZCBidXQgd2l0aCB0aGUgRGF0ZSBpbnB1dCBoaWRkZW4gYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWVPbmx5RmllbGQoY29uZmlnOiBQYXJ0aWFsPFRpbWVGaWVsZENvbmZpZz4gPSB7fSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgcmV0dXJuIGRhdGVUaW1lRmllbGQoe1xuICAgIC4uLmNvbmZpZyxcbiAgICB0aW1lTW9kZTogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVELFxuICAgIHRpbWVPbmx5OiB0cnVlXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZVRpbWVGaWVsZChjb25maWc6IFBhcnRpYWw8RGF0ZVRpbWVGaWVsZENvbmZpZz4gPSB7fSkge1xuICBjb25zdCB7IGtleSA9ICdkYXRlJywgc2hvd0NsZWFyQnV0dG9uLCBkYXRlTGFiZWwsIHRpbWVMYWJlbCwgYWxsRGF5TGFiZWwsIGF0VGltZUxhYmVsLCB0aW1lRGF0ZSwgdGltZXpvbmUsIHNob3dUaW1lem9uZSwgdGltZU1vZGUgPSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQsIHZhbHVlTW9kZSwgZnVsbERheUluVVRDLCBmdWxsRGF5RmllbGROYW1lLCBwaWNrZXJDb25maWcsIGdldFN5bmNGaWVsZHNPYnMsIGhpZGVEYXRlUGlja2VyLCBoaWRlRGF0ZUhpbnQsIHRpbWVPbmx5ID0gZmFsc2UsIHByZXNldHMsIG1hdGVyaWFsRm9ybUZpZWxkIH0gPSBjb25maWc7XG5cbiAgY29uc3QgY2xhc3NHZXR0ZXIgPSAnZGJ4LW1hdC1mb3JtLWZpZWxkLWRpc2FibGUtdW5kZXJsaW5lIGRieC1tYXQtZm9ybS1kYXRlLXRpbWUtZmllbGQtd3JhcHBlcic7XG4gIGNvbnN0IGZpZWxkQ29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZzxEYnhEYXRlVGltZUZpZWxkUHJvcHM+ID0gZm9ybWx5RmllbGQoe1xuICAgIGtleSxcbiAgICB0eXBlOiAnZGF0ZXRpbWUnLFxuICAgIC4uLnByb3BzQW5kQ29uZmlnRm9yRmllbGRDb25maWcoY29uZmlnLCB7XG4gICAgICAuLi5tYXRlcmlhbEZvcm1GaWVsZCxcbiAgICAgIHNob3dDbGVhckJ1dHRvbixcbiAgICAgIGNsYXNzR2V0dGVyLFxuICAgICAgZGF0ZUxhYmVsLFxuICAgICAgdGltZUxhYmVsLFxuICAgICAgYWxsRGF5TGFiZWwsXG4gICAgICBhdFRpbWVMYWJlbCxcbiAgICAgIHZhbHVlTW9kZSxcbiAgICAgIHRpbWVPbmx5LFxuICAgICAgcHJlc2V0cyxcbiAgICAgIHRpbWVNb2RlOiB0aW1lT25seSA/IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRCA6IHRpbWVNb2RlLFxuICAgICAgdGltZXpvbmUsXG4gICAgICB0aW1lRGF0ZSxcbiAgICAgIHNob3dUaW1lem9uZSxcbiAgICAgIGZ1bGxEYXlGaWVsZE5hbWUsXG4gICAgICBmdWxsRGF5SW5VVEMsXG4gICAgICBoaWRlRGF0ZVBpY2tlcixcbiAgICAgIGhpZGVEYXRlSGludCxcbiAgICAgIHBpY2tlckNvbmZpZyxcbiAgICAgIGdldFN5bmNGaWVsZHNPYnNcbiAgICB9KVxuICB9KTtcblxuICByZXR1cm4gZmllbGRDb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIERhdGVEYXRlUmFuZ2VGaWVsZERhdGVDb25maWcgPSBPbWl0PERhdGVUaW1lRmllbGRDb25maWcsICdkYXRlTGFiZWwnIHwgJ3RpbWVPbmx5JyB8ICd0aW1lTW9kZScgfCAnZ2V0U3luY0ZpZWxkc09icyc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVEYXRlUmFuZ2VGaWVsZENvbmZpZyBleHRlbmRzIFBpY2s8RGF0ZVRpbWVGaWVsZENvbmZpZywgJ3RpbWVEYXRlJyB8ICd0aW1lem9uZScgfCAnc2hvd1RpbWV6b25lJyB8ICdwcmVzZXRzJz4ge1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIHN0YXJ0PzogUGFydGlhbDxEYXRlRGF0ZVJhbmdlRmllbGREYXRlQ29uZmlnPjtcbiAgZW5kPzogUGFydGlhbDxEYXRlRGF0ZVJhbmdlRmllbGREYXRlQ29uZmlnPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVSYW5nZUZpZWxkKGNvbmZpZzogRGF0ZURhdGVSYW5nZUZpZWxkQ29uZmlnID0ge30pOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gIGNvbnN0IHsgcmVxdWlyZWQ6IGlucHV0UmVxdWlyZWQsIHN0YXJ0LCBlbmQsIHRpbWVEYXRlLCB0aW1lem9uZSwgc2hvd1RpbWV6b25lLCBwcmVzZXRzIH0gPSBjb25maWc7XG4gIGNvbnN0IHJlcXVpcmVkID0gaW5wdXRSZXF1aXJlZCA/PyBzdGFydD8ucmVxdWlyZWQgPz8gZmFsc2U7XG5cbiAgY29uc3Qgc3RhcnRGaWVsZEtleSA9IHN0YXJ0Py5rZXkgPz8gJ3N0YXJ0JztcbiAgY29uc3QgZW5kRmllbGRLZXkgPSBlbmQ/LmtleSA/PyAnZW5kJztcblxuICBjb25zdCBzdGFydEZpZWxkID0gZGF0ZVRpbWVGaWVsZCh7XG4gICAgZGF0ZUxhYmVsOiAnU3RhcnQnLFxuICAgIHRpbWVNb2RlOiBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORSxcbiAgICBnZXRTeW5jRmllbGRzT2JzOiAoKSA9PiBvZihbeyBzeW5jV2l0aDogZW5kRmllbGRLZXksIHN5bmNUeXBlOiAnYWZ0ZXInIH1dKSxcbiAgICBwcmVzZXRzLFxuICAgIGFsbERheUxhYmVsOiAnJyxcbiAgICB0aW1lRGF0ZSxcbiAgICB0aW1lem9uZSxcbiAgICBzaG93VGltZXpvbmUsXG4gICAgLi4uc3RhcnQsXG4gICAgcmVxdWlyZWQsXG4gICAga2V5OiBzdGFydEZpZWxkS2V5XG4gIH0pO1xuXG4gIGNvbnN0IGVuZEZpZWxkID0gZGF0ZVRpbWVGaWVsZCh7XG4gICAgZGF0ZUxhYmVsOiAnRW5kJyxcbiAgICB0aW1lTW9kZTogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkUsXG4gICAgZ2V0U3luY0ZpZWxkc09iczogKCkgPT4gb2YoW3sgc3luY1dpdGg6IHN0YXJ0RmllbGRLZXksIHN5bmNUeXBlOiAnYmVmb3JlJyB9XSksXG4gICAgcHJlc2V0cyxcbiAgICBhbGxEYXlMYWJlbDogJycsXG4gICAgdGltZURhdGUsXG4gICAgdGltZXpvbmUsXG4gICAgc2hvd1RpbWV6b25lLFxuICAgIC4uLmVuZCxcbiAgICByZXF1aXJlZCxcbiAgICBrZXk6IGVuZEZpZWxkS2V5XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAga2V5OiB1bmRlZmluZWQsXG4gICAgZmllbGRHcm91cDogW2ZsZXhMYXlvdXRXcmFwcGVyKFtzdGFydEZpZWxkLCBlbmRGaWVsZF0sIHsgcmVsYXRpdmU6IHRydWUsIGJyZWFrVG9Db2x1bW46IHRydWUsIGJyZWFrcG9pbnQ6ICdsYXJnZScgfSldXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIERhdGVUaW1lUmFuZ2VGaWVsZFRpbWVDb25maWcgPSBPbWl0PERhdGVEYXRlUmFuZ2VGaWVsZERhdGVDb25maWcsICdhbGxEYXlMYWJlbCcgfCAnZnVsbERheUZpZWxkTmFtZScgfCAnZnVsbERheUluVVRDJz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZURhdGVUaW1lUmFuZ2VGaWVsZENvbmZpZyBleHRlbmRzIFBpY2s8RGF0ZVRpbWVGaWVsZENvbmZpZywgJ3RpbWVEYXRlJyB8ICd0aW1lem9uZScgfCAnc2hvd1RpbWV6b25lJyB8ICdwcmVzZXRzJyB8ICd2YWx1ZU1vZGUnPiB7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgc3RhcnQ/OiBQYXJ0aWFsPERhdGVUaW1lUmFuZ2VGaWVsZFRpbWVDb25maWc+O1xuICBlbmQ/OiBQYXJ0aWFsPERhdGVUaW1lUmFuZ2VGaWVsZFRpbWVDb25maWc+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZVRpbWVSYW5nZUZpZWxkKGlucHV0Q29uZmlnOiBEYXRlRGF0ZVRpbWVSYW5nZUZpZWxkQ29uZmlnID0ge30pOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gIGNvbnN0IHsgcmVxdWlyZWQgPSBmYWxzZSwgc3RhcnQ6IGlucHV0U3RhcnQsIGVuZDogaW5wdXRFbmQsIHRpbWV6b25lLCB0aW1lRGF0ZSwgc2hvd1RpbWV6b25lLCBwcmVzZXRzLCB2YWx1ZU1vZGUgfSA9IGlucHV0Q29uZmlnO1xuXG4gIGZ1bmN0aW9uIGRhdGVUaW1lUmFuZ2VGaWVsZENvbmZpZyhjb25maWc6IE1heWJlPFBhcnRpYWw8RGF0ZVRpbWVSYW5nZUZpZWxkVGltZUNvbmZpZz4+KTogUGFydGlhbDxEYXRlVGltZUZpZWxkQ29uZmlnPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgdGltZU1vZGU6IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRCxcbiAgICAgIGdldFN5bmNGaWVsZHNPYnM6IHVuZGVmaW5lZCxcbiAgICAgIHRpbWVPbmx5OiB0cnVlLFxuICAgICAgaGlkZURhdGVIaW50OiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0S2V5ID0gaW5wdXRTdGFydD8ua2V5ID8/ICdzdGFydCc7XG4gIGNvbnN0IGVuZEtleSA9IGlucHV0RW5kPy5rZXkgPz8gJ2VuZCc7XG5cbiAgY29uc3Qgc3RhcnQ6IFBhcnRpYWw8RGF0ZVRpbWVGaWVsZENvbmZpZz4gPSB7XG4gICAgbGFiZWw6ICdTdGFydCBUaW1lJyxcbiAgICAuLi5kYXRlVGltZVJhbmdlRmllbGRDb25maWcoaW5wdXRTdGFydCksXG4gICAga2V5OiBzdGFydEtleVxuICB9O1xuXG4gIGNvbnN0IGVuZDogUGFydGlhbDxEYXRlVGltZUZpZWxkQ29uZmlnPiA9IHtcbiAgICBsYWJlbDogJ0VuZCBUaW1lJyxcbiAgICAuLi5kYXRlVGltZVJhbmdlRmllbGRDb25maWcoaW5wdXRFbmQpLFxuICAgIGtleTogZW5kS2V5XG4gIH07XG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIHRpbWV6b25lLFxuICAgIHRpbWVEYXRlLFxuICAgIHNob3dUaW1lem9uZSxcbiAgICBwcmVzZXRzLFxuICAgIHN0YXJ0LFxuICAgIGVuZFxuICB9O1xuXG4gIHJldHVybiBkYXRlUmFuZ2VGaWVsZChjb25maWcpO1xufVxuXG4vLyBNQVJLOiBGaXhlZERhdGVSYW5nZVxuZXhwb3J0IGludGVyZmFjZSBGaXhlZERhdGVSYW5nZUZpZWxkQ29uZmlnIGV4dGVuZHMgTGFiZWxlZEZpZWxkQ29uZmlnLCBEZXNjcmlwdGlvbkZpZWxkQ29uZmlnLCBEYnhGaXhlZERhdGVSYW5nZUZpZWxkUHJvcHMsIE1hdGVyaWFsRm9ybUZpZWxkQ29uZmlnIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhlZERhdGVSYW5nZUZpZWxkKGNvbmZpZzogUGFydGlhbDxGaXhlZERhdGVSYW5nZUZpZWxkQ29uZmlnPiA9IHt9KSB7XG4gIGNvbnN0IHsga2V5ID0gJ2RhdGVSYW5nZScsIGRhdGVSYW5nZUlucHV0LCBwaWNrZXJDb25maWcsIHRpbWV6b25lLCBzZWxlY3Rpb25Nb2RlLCBzaG93VGltZXpvbmUsIHZhbHVlTW9kZSwgZnVsbERheUluVVRDLCBwcmVzZXRzLCBzaG93UmFuZ2VJbnB1dCwgbWF0ZXJpYWxGb3JtRmllbGQgfSA9IGNvbmZpZztcblxuICBjb25zdCBjbGFzc0dldHRlciA9ICdkYngtbWF0LWZvcm0tZmllbGQtZGlzYWJsZS11bmRlcmxpbmUgZGJ4LWZvcm0tZml4ZWQtZGF0ZS1yYW5nZS1maWVsZC13cmFwcGVyJztcbiAgY29uc3QgZmllbGRDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnPERieERhdGVUaW1lRmllbGRQcm9wcz4gPSBmb3JtbHlGaWVsZCh7XG4gICAga2V5LFxuICAgIHR5cGU6ICdmaXhlZGRhdGVyYW5nZScsXG4gICAgLi4ucHJvcHNBbmRDb25maWdGb3JGaWVsZENvbmZpZyhjb25maWcsIHtcbiAgICAgIC4uLm1hdGVyaWFsRm9ybUZpZWxkLFxuICAgICAgY2xhc3NHZXR0ZXIsXG4gICAgICBkYXRlUmFuZ2VJbnB1dCxcbiAgICAgIHBpY2tlckNvbmZpZyxcbiAgICAgIHZhbHVlTW9kZSxcbiAgICAgIHByZXNldHMsXG4gICAgICB0aW1lem9uZSxcbiAgICAgIHNlbGVjdGlvbk1vZGUsXG4gICAgICBzaG93VGltZXpvbmUsXG4gICAgICBmdWxsRGF5SW5VVEMsXG4gICAgICBzaG93UmFuZ2VJbnB1dFxuICAgIH0pXG4gIH0pO1xuXG4gIHJldHVybiBmaWVsZENvbmZpZztcbn1cbiJdfQ==
@@ -3869,6 +3869,12 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3869
3869
  return this.timeOnly ? DbxDateTimeFieldTimeMode.REQUIRED : this.dateTimeField.timeMode ?? DbxDateTimeFieldTimeMode.REQUIRED;
3870
3870
  }
3871
3871
  }
3872
+ get isDateRequired() {
3873
+ return this.props.required ?? false;
3874
+ }
3875
+ get isTimeRequired() {
3876
+ return this.isDateRequired && this.timeMode === DbxDateTimeFieldTimeMode.REQUIRED;
3877
+ }
3872
3878
  get description() {
3873
3879
  return this.field.props.description;
3874
3880
  }
@@ -3890,6 +3896,9 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3890
3896
  get presets() {
3891
3897
  return this.field.props.presets;
3892
3898
  }
3899
+ get showClearButton() {
3900
+ return this.field.props.showClearButton;
3901
+ }
3893
3902
  constructor(cdRef, dbxDateTimeFieldConfigService) {
3894
3903
  super();
3895
3904
  this.cdRef = cdRef;
@@ -3906,6 +3915,7 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3906
3915
  this._offset = new BehaviorSubject(0);
3907
3916
  this._formControlObs = new BehaviorSubject(undefined);
3908
3917
  this.formControl$ = this._formControlObs.pipe(filterMaybe());
3918
+ this._cleared = new Subject();
3909
3919
  this._updateTime = new Subject();
3910
3920
  this.timezone$ = this._defaultTimezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
3911
3921
  return defaultTimezone ?? guessCurrentTimezone();
@@ -3941,16 +3951,17 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3941
3951
  // every 10 seconds, refresh w/interval
3942
3952
  startWith(0), map(() => new Date().getMinutes()), distinctUntilChanged(), tap(() => this.cdRef.markForCheck()), switchMap(() => this.valueInSystemTimezone$), shareReplay(1));
3943
3953
  this.timeString$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? toLocalReadableTimeString(x) : '')), distinctUntilChanged(), shareReplay(1));
3944
- this.dateInputCtrl = new FormControl(new Date(), {
3954
+ this.dateInputCtrl = new FormControl(null, {
3945
3955
  validators: []
3946
3956
  });
3947
- this.timeInputCtrl = new FormControl('', {
3957
+ this.timeInputCtrl = new FormControl(null, {
3948
3958
  validators: [Validators.pattern(/^(now)$|^([0-9]|(0[0-9])|(1[0-9])|(2[0-3]))(:)?([0-5][0-9])?(\s)?([apAP][Mm])?(\\s)*$/)]
3949
3959
  });
3950
3960
  this.fullDay$ = this.fullDayControl$.pipe(switchMap((control) => control.valueChanges.pipe(startWith(control.value))), distinctUntilChanged(), shareReplay(1));
3951
3961
  this.showTimeInput$ = this.fullDay$.pipe(map((x) => !x && this.timeMode !== DbxDateTimeFieldTimeMode.NONE));
3952
3962
  this.showAddTime$ = this.showTimeInput$.pipe(map((x) => !x && this.timeMode === DbxDateTimeFieldTimeMode.OPTIONAL), shareReplay(1));
3953
- this.date$ = this.dateInputCtrl.valueChanges.pipe(startWith(this.dateInputCtrl.value), filterMaybe(), shareReplay(1));
3963
+ this.currentDate$ = this.dateInputCtrl.valueChanges.pipe(startWith(this.dateInputCtrl.value), shareReplay(1));
3964
+ this.date$ = this.currentDate$.pipe(filterMaybe(), shareReplay(1));
3954
3965
  this.timezoneAbbreviation$ = combineLatest([this.date$, this.timezone$, this.timeDate$]).pipe(map(([date, timezone, timeDate]) => getTimezoneAbbreviation(timezone, timeDate ?? date)), distinctUntilChanged(), shareReplay(1));
3955
3966
  this.dateValue$ = merge(this.date$, this.valueInSystemTimezone$.pipe(skipFirstMaybe())).pipe(map((x) => (x ? startOfDay(x) : null)), distinctUntilChanged(isSameDateDay), shareReplay(1));
3956
3967
  this.timeInput$ = this._updateTime.pipe(debounceTime(5), map(() => this.timeInputCtrl.value || ''), distinctUntilChanged());
@@ -3978,29 +3989,41 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
3978
3989
  }), shareReplay(1));
3979
3990
  this.syncConfigBeforeValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'before');
3980
3991
  this.syncConfigAfterValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'after');
3981
- this.rawDateTime$ = combineLatest([this.dateValue$, this.timeInput$.pipe(startWith(null)), this.fullDay$, this.timeDate$]).pipe(map(([date, timeString, fullDay, timeDate]) => {
3992
+ this.isTimeCleared$ = combineLatest([this.currentDate$, this._timeDate.pipe(startWith(null))]).pipe(switchMap(([date, time]) => {
3993
+ const isTimeCleared = Boolean(!date && !time);
3994
+ return this._cleared.pipe(map(() => true), startWith(isTimeCleared));
3995
+ }), distinctUntilChanged(), shareReplay(1));
3996
+ this.rawDateTime$ = combineLatest([
3997
+ this._config.pipe(first(), switchMap(() => (this.timeOnly ? of(null) : this.dateValue$))),
3998
+ this.timeInput$.pipe(startWith(null)),
3999
+ this.fullDay$,
4000
+ this.timeDate$,
4001
+ this.isTimeCleared$
4002
+ ]).pipe(map(([date, timeString, fullDay, timeDate, isTimeCleared]) => {
3982
4003
  let result;
3983
- if (!date || this.timeOnly) {
3984
- date = timeDate ?? new Date(); // use the time date, or default to the current day
3985
- }
3986
- if (date) {
3987
- if (fullDay) {
3988
- if (this.dateTimeField.fullDayInUTC) {
3989
- result = utcDayForDate(date);
4004
+ if (!isTimeCleared) {
4005
+ if (!date || this.timeOnly) {
4006
+ date = timeDate ?? new Date(); // use the time date, or default to the current day
4007
+ }
4008
+ if (date) {
4009
+ if (fullDay) {
4010
+ if (this.dateTimeField.fullDayInUTC) {
4011
+ result = utcDayForDate(date);
4012
+ }
4013
+ else {
4014
+ result = startOfDay(date);
4015
+ }
3990
4016
  }
3991
- else {
3992
- result = startOfDay(date);
4017
+ else if (timeString) {
4018
+ result =
4019
+ readableTimeStringToDate(timeString, {
4020
+ date,
4021
+ useSystemTimezone: true
4022
+ }) ?? date;
4023
+ }
4024
+ else if (!this.timeOnly) {
4025
+ result = date;
3993
4026
  }
3994
- }
3995
- else if (timeString) {
3996
- result =
3997
- readableTimeStringToDate(timeString, {
3998
- date,
3999
- useSystemTimezone: true
4000
- }) ?? date;
4001
- }
4002
- else if (!this.timeOnly) {
4003
- result = date;
4004
4027
  }
4005
4028
  }
4006
4029
  return result;
@@ -4050,7 +4073,9 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
4050
4073
  }
4051
4074
  return date;
4052
4075
  }), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
4076
+ this.hasEmptyDisplayValue$ = this.displayValue$.pipe(map((x) => !x), distinctUntilChanged(), shareReplay(1));
4053
4077
  this.presets$ = this._presets.pipe(switchMapMaybeObs(), map((x) => x.map(dateTimePreset)), shareReplay(1));
4078
+ this.showClearButton$ = this.hasEmptyDisplayValue$.pipe(map((x) => Boolean(this.showClearButton && !x)), distinctUntilChanged(), shareReplay(1));
4054
4079
  }
4055
4080
  ngOnInit() {
4056
4081
  this._formControlObs.next(this.formControl);
@@ -4150,6 +4175,7 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
4150
4175
  this._offset.complete();
4151
4176
  this._formControlObs.complete();
4152
4177
  this._updateTime.complete();
4178
+ this._cleared.complete();
4153
4179
  this._syncConfigObs.complete();
4154
4180
  }
4155
4181
  selectPreset(preset) {
@@ -4266,12 +4292,15 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
4266
4292
  x.setValue(fullDay);
4267
4293
  });
4268
4294
  }
4295
+ clearValue() {
4296
+ this._cleared.next();
4297
+ }
4269
4298
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DbxDateTimeFieldMenuPresetsService }], target: i0.ɵɵFactoryTarget.Component }); }
4270
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", 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 <!-- Additional spacing -->\n <dbx-button-spacer *ngIf=\"!dateOnly\"></dbx-button-spacer>\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 *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer 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\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\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\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\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 <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\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 <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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: "directive", type: i4$3.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.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i2$1.DbxButtonSpacerDirective, selector: "dbx-button-spacer,[dbxButtonSpacer]" }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.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: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$2.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$2.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$2.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$3.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.DateDistancePipe, name: "dateDistance" }, { kind: "pipe", type: i2.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i2.GetValuePipe, name: "getValue" }] }); }
4299
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", 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 <!-- Additional spacing -->\n <dbx-button-spacer *ngIf=\"!dateOnly\"></dbx-button-spacer>\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 *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer 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\">\n <ng-container [ngSwitch]=\"hasEmptyDisplayValue$ | async\">\n <ng-container *ngSwitchCase=\"true\">\n <span class=\"dbx-small\">No date/time set</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"false\">\n <ng-container [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [required]=\"isDateRequired\" [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <button matSuffix *ngIf=\"showClearButton$ | async\" class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\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 <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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: "directive", type: i3$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$3.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.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i2$1.DbxButtonSpacerDirective, selector: "dbx-button-spacer,[dbxButtonSpacer]" }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.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: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$2.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$2.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$2.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$3.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.DateDistancePipe, name: "dateDistance" }, { kind: "pipe", type: i2.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i2.GetValuePipe, name: "getValue" }] }); }
4271
4300
  }
4272
4301
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, decorators: [{
4273
4302
  type: Component,
4274
- 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 <!-- Additional spacing -->\n <dbx-button-spacer *ngIf=\"!dateOnly\"></dbx-button-spacer>\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 *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer 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\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\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\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\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 <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\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 <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n" }]
4303
+ 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 <!-- Additional spacing -->\n <dbx-button-spacer *ngIf=\"!dateOnly\"></dbx-button-spacer>\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 *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer 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\">\n <ng-container [ngSwitch]=\"hasEmptyDisplayValue$ | async\">\n <ng-container *ngSwitchCase=\"true\">\n <span class=\"dbx-small\">No date/time set</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"false\">\n <ng-container [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [required]=\"isDateRequired\" [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <button matSuffix *ngIf=\"showClearButton$ | async\" class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\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 <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n" }]
4275
4304
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: DbxDateTimeFieldMenuPresetsService }]; } });
4276
4305
 
4277
4306
  function dbxFixedDateRangeInputValueFactory(mode, timezoneInstance) {
@@ -4915,13 +4944,14 @@ function timeOnlyField(config = {}) {
4915
4944
  });
4916
4945
  }
4917
4946
  function dateTimeField(config = {}) {
4918
- const { key = 'date', dateLabel, timeLabel, allDayLabel, atTimeLabel, timeDate, timezone, showTimezone, timeMode = DbxDateTimeFieldTimeMode.REQUIRED, valueMode, fullDayInUTC, fullDayFieldName, pickerConfig, getSyncFieldsObs, hideDatePicker, hideDateHint, timeOnly = false, presets, materialFormField } = config;
4947
+ const { key = 'date', showClearButton, dateLabel, timeLabel, allDayLabel, atTimeLabel, timeDate, timezone, showTimezone, timeMode = DbxDateTimeFieldTimeMode.REQUIRED, valueMode, fullDayInUTC, fullDayFieldName, pickerConfig, getSyncFieldsObs, hideDatePicker, hideDateHint, timeOnly = false, presets, materialFormField } = config;
4919
4948
  const classGetter = 'dbx-mat-form-field-disable-underline dbx-mat-form-date-time-field-wrapper';
4920
4949
  const fieldConfig = formlyField({
4921
4950
  key,
4922
4951
  type: 'datetime',
4923
4952
  ...propsAndConfigForFieldConfig(config, {
4924
4953
  ...materialFormField,
4954
+ showClearButton,
4925
4955
  classGetter,
4926
4956
  dateLabel,
4927
4957
  timeLabel,
@@ -4981,7 +5011,7 @@ function dateRangeField(config = {}) {
4981
5011
  };
4982
5012
  }
4983
5013
  function dateTimeRangeField(inputConfig = {}) {
4984
- const { required = false, start: inputStart, end: inputEnd, timezone, timeDate, showTimezone, presets } = inputConfig;
5014
+ const { required = false, start: inputStart, end: inputEnd, timezone, timeDate, showTimezone, presets, valueMode } = inputConfig;
4985
5015
  function dateTimeRangeFieldConfig(config) {
4986
5016
  return {
4987
5017
  ...config,