@dereekb/dbx-form 9.23.20 → 9.23.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/formly/field/value/date/datetime.field.component.mjs +79 -31
- package/esm2020/lib/formly/field/value/date/datetime.field.mjs +16 -6
- package/esm2020/lib/formly/formly.form.component.mjs +2 -4
- package/esm2020/lib/formly/template/timezone.mjs +10 -3
- package/fesm2015/dereekb-dbx-form.mjs +104 -43
- package/fesm2015/dereekb-dbx-form.mjs.map +1 -1
- package/fesm2020/dereekb-dbx-form.mjs +103 -40
- package/fesm2020/dereekb-dbx-form.mjs.map +1 -1
- package/lib/formly/_formly.scss +5 -0
- package/lib/formly/field/value/date/_date.scss +11 -0
- package/lib/formly/field/value/date/datetime.field.component.d.ts +30 -10
- package/lib/formly/field/value/date/datetime.field.d.ts +4 -4
- package/lib/formly/template/timezone.d.ts +1 -1
- package/mapbox/package.json +4 -4
- package/package.json +4 -4
|
@@ -4,9 +4,9 @@ import * as i1 from '@angular/common';
|
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
5
5
|
import * as i2$1 from '@dereekb/dbx-web';
|
|
6
6
|
import { DbxActionTransitionSafetyDirective, DbxTextModule, DbxLoadingModule, DbxFlexLayoutModule, DbxSectionLayoutModule, DbxRouterAnchorModule, dbxValueListItemDecisionFunction, DbxButtonModule, DbxListLayoutModule, AbstractDbxSelectionListWrapperDirective, DEFAULT_LIST_WRAPPER_DIRECTIVE_TEMPLATE, AbstractDbxSelectionListViewDirective, addConfigToValueListItems, provideDbxListView, AbstractDbxValueListViewItemComponent, DbxActionModule, mapCompactModeObs, DbxBarLayoutModule } from '@dereekb/dbx-web';
|
|
7
|
-
import { isPast, addSeconds,
|
|
8
|
-
import { BehaviorSubject, switchMap, first, exhaustMap, of, catchError, delay, filter, combineLatest, map, distinctUntilChanged, shareReplay, Subject, tap, takeUntil, EMPTY, mergeMap, startWith, debounceTime, skipWhile, scan, interval, merge,
|
|
9
|
-
import { LockSet, SubscriptionObject, asObservable, cleanup, loadingStateHasFinishedLoading, switchMapMaybeObs, filterMaybe, switchMapMaybeDefault, SimpleLoadingContext, distinctUntilHasDifferentValues, startWithBeginLoading, mapLoadingStateResults, successResult, ListLoadingStateContextInstance, isListLoadingStateEmpty, LoadingStateContextInstance, loadingStateHasValue, loadingStateIsLoading, beginLoading, mapLoadingStateValueWithOperator, valueFromLoadingState, loadingStateContext, skipFirstMaybe, asyncPusherCache, scanCount } from '@dereekb/rxjs';
|
|
7
|
+
import { isPast, addSeconds, startOfDay, addMinutes, addDays } from 'date-fns';
|
|
8
|
+
import { BehaviorSubject, switchMap, first, exhaustMap, of, catchError, delay, filter, combineLatest, map, distinctUntilChanged, shareReplay, Subject, tap, takeUntil, EMPTY, mergeMap, startWith, debounceTime, skipWhile, scan, combineLatestWith, throttleTime, interval, merge, timer } from 'rxjs';
|
|
9
|
+
import { LockSet, SubscriptionObject, asObservable, cleanup, loadingStateHasFinishedLoading, switchMapMaybeObs, filterMaybe, switchMapMaybeDefault, SimpleLoadingContext, distinctUntilHasDifferentValues, startWithBeginLoading, mapLoadingStateResults, successResult, ListLoadingStateContextInstance, isListLoadingStateEmpty, LoadingStateContextInstance, loadingStateHasValue, loadingStateIsLoading, beginLoading, mapLoadingStateValueWithOperator, valueFromLoadingState, loadingStateContext, skipFirstMaybe, asObservableFromGetter, asyncPusherCache, scanCount } from '@dereekb/rxjs';
|
|
10
10
|
import * as i2 from '@dereekb/dbx-core';
|
|
11
11
|
import { AbstractSubscriptionDirective, safeDetectChanges, DbxInjectionComponentModule, DbxDatePipeModule, mergeDbxInjectionComponentConfigs, tapDetectChanges } from '@dereekb/dbx-core';
|
|
12
12
|
import * as i3 from '@uirouter/core';
|
|
@@ -44,7 +44,7 @@ import * as i6 from '@angular/material/chips';
|
|
|
44
44
|
import { MatChipsModule } from '@angular/material/chips';
|
|
45
45
|
import { MatListModule } from '@angular/material/list';
|
|
46
46
|
import { ENTER, COMMA } from '@angular/cdk/keycodes';
|
|
47
|
-
import { skipUntilTimeElapsedAfterLastEmission, toJsDate, parseISO8601DayStringToDate,
|
|
47
|
+
import { skipUntilTimeElapsedAfterLastEmission, toJsDate, parseISO8601DayStringToDate, formatToISO8601DateString, formatToISO8601DayString, safeToJsDate, isSameDateHoursAndMinutes, guessCurrentTimezone, dateTimezoneUtcNormal, toLocalReadableTimeString, getTimezoneAbbreviation, isSameDateDay, utcDayForDate, readableTimeStringToDate, findMinDate, findMaxDate, dateTimeMinuteDecisionFunction, DateTimeMinuteInstance, allTimezoneInfos, timezoneInfoForSystem, searchTimezoneInfos } from '@dereekb/date';
|
|
48
48
|
import { FieldType as FieldType$2, FormlyMatFormFieldModule } from '@ngx-formly/material/form-field';
|
|
49
49
|
import * as i3$3 from '@angular/material/select';
|
|
50
50
|
import { MatSelectModule } from '@angular/material/select';
|
|
@@ -3609,11 +3609,13 @@ var DbxDateTimeValueMode;
|
|
|
3609
3609
|
*/
|
|
3610
3610
|
DbxDateTimeValueMode[DbxDateTimeValueMode["DAY_STRING"] = 2] = "DAY_STRING";
|
|
3611
3611
|
})(DbxDateTimeValueMode || (DbxDateTimeValueMode = {}));
|
|
3612
|
-
function dbxDateTimeInputValueParseFactory(mode) {
|
|
3612
|
+
function dbxDateTimeInputValueParseFactory(mode, timezoneInstance) {
|
|
3613
3613
|
let factory;
|
|
3614
|
+
let useTimezoneInstance = true;
|
|
3614
3615
|
switch (mode) {
|
|
3615
3616
|
case DbxDateTimeValueMode.DAY_STRING:
|
|
3616
3617
|
factory = (x) => (typeof x === 'string' ? parseISO8601DayStringToDate(x) : x);
|
|
3618
|
+
useTimezoneInstance = false; // day strings do not use timezones
|
|
3617
3619
|
break;
|
|
3618
3620
|
case DbxDateTimeValueMode.DATE_STRING:
|
|
3619
3621
|
case DbxDateTimeValueMode.DATE:
|
|
@@ -3621,22 +3623,40 @@ function dbxDateTimeInputValueParseFactory(mode) {
|
|
|
3621
3623
|
factory = (x) => (x != null ? toJsDate(x) : x);
|
|
3622
3624
|
break;
|
|
3623
3625
|
}
|
|
3626
|
+
if (timezoneInstance && useTimezoneInstance) {
|
|
3627
|
+
const originalFactory = factory;
|
|
3628
|
+
factory = (input) => {
|
|
3629
|
+
const date = originalFactory(input);
|
|
3630
|
+
const result = date ? timezoneInstance.systemDateToTargetDate(date) : date;
|
|
3631
|
+
return result;
|
|
3632
|
+
};
|
|
3633
|
+
}
|
|
3624
3634
|
return factory;
|
|
3625
3635
|
}
|
|
3626
|
-
function dbxDateTimeOutputValueFactory(mode) {
|
|
3636
|
+
function dbxDateTimeOutputValueFactory(mode, timezoneInstance) {
|
|
3627
3637
|
let factory;
|
|
3638
|
+
let useTimezoneInstance = true;
|
|
3628
3639
|
switch (mode) {
|
|
3629
|
-
case DbxDateTimeValueMode.DATE_STRING:
|
|
3630
|
-
factory = (x) => (x != null ? formatToISO8601DateString(x) : x);
|
|
3631
|
-
break;
|
|
3632
3640
|
case DbxDateTimeValueMode.DAY_STRING:
|
|
3633
3641
|
factory = (x) => (x != null ? formatToISO8601DayString(x) : x);
|
|
3642
|
+
useTimezoneInstance = false; // day strings do not use timezones
|
|
3643
|
+
break;
|
|
3644
|
+
case DbxDateTimeValueMode.DATE_STRING:
|
|
3645
|
+
factory = (x) => (x != null ? formatToISO8601DateString(x) : x);
|
|
3634
3646
|
break;
|
|
3635
3647
|
case DbxDateTimeValueMode.DATE:
|
|
3636
3648
|
default:
|
|
3637
3649
|
factory = (x) => x;
|
|
3638
3650
|
break;
|
|
3639
3651
|
}
|
|
3652
|
+
if (timezoneInstance && useTimezoneInstance) {
|
|
3653
|
+
const originalFactory = factory;
|
|
3654
|
+
factory = (input) => {
|
|
3655
|
+
const date = input ? timezoneInstance.targetDateToSystemDate(input) : input;
|
|
3656
|
+
const result = originalFactory(date);
|
|
3657
|
+
return result;
|
|
3658
|
+
};
|
|
3659
|
+
}
|
|
3640
3660
|
return factory;
|
|
3641
3661
|
}
|
|
3642
3662
|
function syncConfigValueObs(parseConfigsObs, type) {
|
|
@@ -3653,29 +3673,38 @@ function syncConfigValueObs(parseConfigsObs, type) {
|
|
|
3653
3673
|
return result;
|
|
3654
3674
|
}), distinctUntilChanged(), shareReplay(1));
|
|
3655
3675
|
}
|
|
3656
|
-
|
|
3676
|
+
function isSameDateTimeFieldValue(a, b) {
|
|
3677
|
+
return a && b ? (typeof a === 'string' ? a === b : isSameDateHoursAndMinutes(a, b)) : a == b;
|
|
3678
|
+
}
|
|
3679
|
+
const TIME_OUTPUT_THROTTLE_TIME = 10;
|
|
3657
3680
|
class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
3658
3681
|
constructor(cdRef) {
|
|
3659
3682
|
super();
|
|
3660
3683
|
this.cdRef = cdRef;
|
|
3661
3684
|
this._sub = new SubscriptionObject();
|
|
3662
3685
|
this._valueSub = new SubscriptionObject();
|
|
3686
|
+
this._defaultTimezone = new BehaviorSubject(undefined);
|
|
3687
|
+
this._customTimezone = new BehaviorSubject(undefined);
|
|
3663
3688
|
this._fullDayControlObs = new BehaviorSubject(undefined);
|
|
3664
3689
|
this.fullDayControl$ = this._fullDayControlObs.pipe(filterMaybe());
|
|
3665
3690
|
this._offset = new BehaviorSubject(0);
|
|
3666
3691
|
this._formControlObs = new BehaviorSubject(undefined);
|
|
3667
3692
|
this.formControl$ = this._formControlObs.pipe(filterMaybe());
|
|
3668
3693
|
this._updateTime = new Subject();
|
|
3669
|
-
this.
|
|
3694
|
+
this.timezone$ = combineLatest([this._defaultTimezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()), this._customTimezone]).pipe(map(([defaultTimezone, customTimezone]) => {
|
|
3695
|
+
var _a;
|
|
3696
|
+
return (_a = customTimezone !== null && customTimezone !== void 0 ? customTimezone : defaultTimezone) !== null && _a !== void 0 ? _a : guessCurrentTimezone();
|
|
3697
|
+
}), distinctUntilChanged(), shareReplay(1));
|
|
3698
|
+
this.timezoneInstance$ = this.timezone$.pipe(map((timezone) => (Boolean(timezone) ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
|
|
3699
|
+
this.valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
|
|
3700
|
+
return x.pipe(map(dbxDateTimeInputValueParseFactory(this.valueMode, timezoneInstance)));
|
|
3701
|
+
}), throttleTime(20, undefined, { leading: false, trailing: true }), // throttle incoming values and timezone changes
|
|
3702
|
+
distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
|
|
3670
3703
|
/**
|
|
3671
3704
|
* Used to trigger/display visual updates (specifically on timeDistance, etc.).
|
|
3672
3705
|
*/
|
|
3673
|
-
this.displayValue$ = interval(10 * 1000).pipe(startWith(0), map(() => new Date().getMinutes()), distinctUntilChanged(), tap(() => this.cdRef.markForCheck()), switchMap(() => this.
|
|
3674
|
-
this.timeString$ = this.
|
|
3675
|
-
const timezone = guessCurrentTimezone();
|
|
3676
|
-
const timeString = toReadableTimeString(x, timezone);
|
|
3677
|
-
return timeString;
|
|
3678
|
-
}));
|
|
3706
|
+
this.displayValue$ = interval(10 * 1000).pipe(startWith(0), map(() => new Date().getMinutes()), distinctUntilChanged(), tap(() => this.cdRef.markForCheck()), switchMap(() => this.valueInSystemTimezone$), shareReplay(1));
|
|
3707
|
+
this.timeString$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? toLocalReadableTimeString(x) : '')), distinctUntilChanged(), shareReplay(1));
|
|
3679
3708
|
this.dateInputCtrl = new FormControl(new Date(), {
|
|
3680
3709
|
validators: []
|
|
3681
3710
|
});
|
|
@@ -3688,7 +3717,8 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
|
3688
3717
|
this.showTimeInput$ = this.fullDay$.pipe(map((x) => !x && this.timeMode !== DbxDateTimeFieldTimeMode.NONE));
|
|
3689
3718
|
this.showAddTime$ = this.showTimeInput$.pipe(map((x) => !x && this.timeMode === DbxDateTimeFieldTimeMode.OPTIONAL), shareReplay(1));
|
|
3690
3719
|
this.date$ = this.dateInputCtrl.valueChanges.pipe(startWith(this.dateInputCtrl.value), filterMaybe(), shareReplay(1));
|
|
3691
|
-
this.
|
|
3720
|
+
this.timezoneAbbreviation$ = combineLatest([this.date$, this.timezone$]).pipe(map(([date, timezone]) => getTimezoneAbbreviation(timezone, date)), distinctUntilChanged(), shareReplay(1));
|
|
3721
|
+
this.dateValue$ = merge(this.date$, this.valueInSystemTimezone$.pipe(skipFirstMaybe())).pipe(map((x) => (x ? startOfDay(x) : null)), distinctUntilChanged(isSameDateDay), shareReplay(1));
|
|
3692
3722
|
this.timeInput$ = this._updateTime.pipe(debounceTime(5), map(() => this.timeInputCtrl.value || ''), distinctUntilChanged());
|
|
3693
3723
|
this.syncConfigObs$ = this._syncConfigObs.pipe(switchMapMaybeDefault(), shareReplay(1));
|
|
3694
3724
|
this.parsedSyncConfigs$ = this.syncConfigObs$.pipe(map((x) => {
|
|
@@ -3717,6 +3747,9 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
|
3717
3747
|
this.rawDateTime$ = combineLatest([this.dateValue$, this.timeInput$.pipe(startWith(null)), this.fullDay$]).pipe(map(([date, timeString, fullDay]) => {
|
|
3718
3748
|
var _a;
|
|
3719
3749
|
let result;
|
|
3750
|
+
if (!date && this.timeOnly) {
|
|
3751
|
+
date = new Date();
|
|
3752
|
+
}
|
|
3720
3753
|
if (date) {
|
|
3721
3754
|
if (fullDay) {
|
|
3722
3755
|
if (this.dateTimeField.fullDayInUTC) {
|
|
@@ -3738,7 +3771,7 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
|
3738
3771
|
}
|
|
3739
3772
|
}
|
|
3740
3773
|
return result;
|
|
3741
|
-
}), distinctUntilChanged(
|
|
3774
|
+
}), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
|
|
3742
3775
|
this.config$ = combineLatest([this._config.pipe(switchMapMaybeDefault(), shareReplay(1)), this.dateInputMin$, this.dateInputMax$]).pipe(map(([x, dateInputMin, dateInputMax]) => {
|
|
3743
3776
|
var _a;
|
|
3744
3777
|
let result = x;
|
|
@@ -3824,18 +3857,26 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
|
3824
3857
|
var _a;
|
|
3825
3858
|
return (_a = this.field.props.hideDatePicker) !== null && _a !== void 0 ? _a : false;
|
|
3826
3859
|
}
|
|
3860
|
+
get timezone() {
|
|
3861
|
+
return this.field.props.timezone;
|
|
3862
|
+
}
|
|
3863
|
+
get showTimezone() {
|
|
3864
|
+
var _a;
|
|
3865
|
+
return (_a = this.field.props.showTimezone) !== null && _a !== void 0 ? _a : true;
|
|
3866
|
+
}
|
|
3867
|
+
get allowChangeTimezone() {
|
|
3868
|
+
return false; // unused
|
|
3869
|
+
}
|
|
3827
3870
|
ngOnInit() {
|
|
3828
3871
|
var _a, _b, _c, _d;
|
|
3829
3872
|
this._formControlObs.next(this.formControl);
|
|
3830
3873
|
this._config.next((_b = (_a = this.dateTimeField).getConfigObs) === null || _b === void 0 ? void 0 : _b.call(_a));
|
|
3831
3874
|
this._syncConfigObs.next((_d = (_c = this.dateTimeField).getSyncFieldsObs) === null || _d === void 0 ? void 0 : _d.call(_c));
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
.pipe(
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
.subscribe((dateValue) => {
|
|
3838
|
-
const value = valueFactory(dateValue);
|
|
3875
|
+
this._sub.subscription = this.valueInSystemTimezone$
|
|
3876
|
+
.pipe(combineLatestWith(this.timezoneInstance$.pipe(map((timezoneInstance) => dbxDateTimeOutputValueFactory(this.valueMode, timezoneInstance)))), throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), switchMap(([currentValue, valueFactory]) => {
|
|
3877
|
+
return this.timeOutput$.pipe(throttleTime(TIME_OUTPUT_THROTTLE_TIME * 2, undefined, { leading: false, trailing: true }), skipFirstMaybe(), distinctUntilChanged(isSameDateHoursAndMinutes), map((x) => valueFactory(x)), filter((x) => !isSameDateTimeFieldValue(x, currentValue)));
|
|
3878
|
+
}))
|
|
3879
|
+
.subscribe((value) => {
|
|
3839
3880
|
this.formControl.setValue(value);
|
|
3840
3881
|
this.formControl.markAsDirty();
|
|
3841
3882
|
this.formControl.markAsTouched();
|
|
@@ -3847,6 +3888,10 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
|
3847
3888
|
}
|
|
3848
3889
|
this.setTime(x);
|
|
3849
3890
|
});
|
|
3891
|
+
// Set default timezone if provided.
|
|
3892
|
+
if (this.timezone && !this.dateTimeField.fullDayInUTC) {
|
|
3893
|
+
this._defaultTimezone.next(asObservableFromGetter(this.timezone));
|
|
3894
|
+
}
|
|
3850
3895
|
// Watch for disabled changes so we can propogate them properly.
|
|
3851
3896
|
this.formControl.registerOnDisabledChange((disabled) => {
|
|
3852
3897
|
if (disabled) {
|
|
@@ -3886,6 +3931,8 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
|
3886
3931
|
}
|
|
3887
3932
|
ngOnDestroy() {
|
|
3888
3933
|
super.ngOnDestroy();
|
|
3934
|
+
this._defaultTimezone.complete();
|
|
3935
|
+
this._customTimezone.complete();
|
|
3889
3936
|
this._fullDayControlObs.complete();
|
|
3890
3937
|
this._offset.complete();
|
|
3891
3938
|
this._formControlObs.complete();
|
|
@@ -3904,14 +3951,17 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
|
3904
3951
|
setLogicalTime(time) {
|
|
3905
3952
|
const date = dateFromLogicalDate(time);
|
|
3906
3953
|
if (date) {
|
|
3907
|
-
|
|
3908
|
-
this.setTime(timeString);
|
|
3954
|
+
this.setTimeFromDate(date);
|
|
3909
3955
|
}
|
|
3910
3956
|
}
|
|
3911
3957
|
setDateInputValue(date) {
|
|
3912
3958
|
this.dateInputCtrl.setValue(date);
|
|
3913
3959
|
this._updateTime.next();
|
|
3914
3960
|
}
|
|
3961
|
+
setTimeFromDate(timeDate) {
|
|
3962
|
+
const timeString = toLocalReadableTimeString(timeDate);
|
|
3963
|
+
this.setTime(timeString);
|
|
3964
|
+
}
|
|
3915
3965
|
setTime(time) {
|
|
3916
3966
|
this.timeInputCtrl.setValue(time);
|
|
3917
3967
|
this._offset.next(0);
|
|
@@ -3990,10 +4040,10 @@ class DbxDateTimeFieldComponent extends FieldType$1 {
|
|
|
3990
4040
|
}
|
|
3991
4041
|
}
|
|
3992
4042
|
DbxDateTimeFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
3993
|
-
DbxDateTimeFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.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=\"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' }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"value$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</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 class=\"dbx-button-spacer\" *ngIf=\"!hideDatePicker\" 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\" [ngClass]=\"{ 'dbx-datetime-row-field-full-width': hideDatePicker }\">\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 </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <button class=\"dbx-button-spacer\" 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.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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$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.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i2$1.DbxButtonSpacerDirective, selector: "dbx-button-spacer,[dbxButtonSpacer]" }, { kind: "component", type: i1$1.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: i8.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.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.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i2.DateDistancePipe, name: "dateDistance" }] });
|
|
4043
|
+
DbxDateTimeFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.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=\"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 <button class=\"dbx-button-spacer\" *ngIf=\"!hideDatePicker\" 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\" [ngClass]=\"{ 'dbx-datetime-row-field-full-width': hideDatePicker }\">\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 <span matSuffix *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 <button class=\"dbx-button-spacer\" 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 <span matSuffix>\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.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i3$4.MatSuffix, selector: "[matSuffix]" }, { 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.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i2$1.DbxButtonSpacerDirective, selector: "dbx-button-spacer,[dbxButtonSpacer]" }, { kind: "component", type: i1$1.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: i8.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.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" }] });
|
|
3994
4044
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, decorators: [{
|
|
3995
4045
|
type: Component,
|
|
3996
|
-
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=\"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' }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"
|
|
4046
|
+
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=\"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 <button class=\"dbx-button-spacer\" *ngIf=\"!hideDatePicker\" 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\" [ngClass]=\"{ 'dbx-datetime-row-field-full-width': hideDatePicker }\">\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 <span matSuffix *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 <button class=\"dbx-button-spacer\" 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 <span matSuffix>\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" }]
|
|
3997
4047
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; } });
|
|
3998
4048
|
|
|
3999
4049
|
class DbxFormFormlyDateFieldModule {
|
|
@@ -4071,13 +4121,15 @@ function timeOnlyField(config = {}) {
|
|
|
4071
4121
|
return dateTimeField(Object.assign(Object.assign({}, config), { timeMode: DbxDateTimeFieldTimeMode.REQUIRED, timeOnly: true }));
|
|
4072
4122
|
}
|
|
4073
4123
|
function dateTimeField(config = {}) {
|
|
4074
|
-
const { key = 'date', dateLabel, timeLabel, allDayLabel, atTimeLabel, timeMode = DbxDateTimeFieldTimeMode.REQUIRED, valueMode, fullDayInUTC, fullDayFieldName, getConfigObs, getSyncFieldsObs, hideDatePicker, hideDateHint, timeOnly = false, materialFormField } = config;
|
|
4124
|
+
const { key = 'date', dateLabel, timeLabel, allDayLabel, atTimeLabel, timezone, showTimezone, timeMode = DbxDateTimeFieldTimeMode.REQUIRED, valueMode, fullDayInUTC, fullDayFieldName, getConfigObs, getSyncFieldsObs, hideDatePicker, hideDateHint, timeOnly = false, materialFormField } = config;
|
|
4075
4125
|
const fieldConfig = formlyField(Object.assign({ key, type: 'datetime' }, propsAndConfigForFieldConfig(config, Object.assign(Object.assign({}, materialFormField), { appearance: 'standard', dateLabel,
|
|
4076
4126
|
timeLabel,
|
|
4077
4127
|
allDayLabel,
|
|
4078
4128
|
atTimeLabel,
|
|
4079
4129
|
valueMode,
|
|
4080
|
-
timeOnly, timeMode: timeOnly ? DbxDateTimeFieldTimeMode.REQUIRED : timeMode,
|
|
4130
|
+
timeOnly, timeMode: timeOnly ? DbxDateTimeFieldTimeMode.REQUIRED : timeMode, timezone,
|
|
4131
|
+
showTimezone,
|
|
4132
|
+
fullDayFieldName,
|
|
4081
4133
|
fullDayInUTC,
|
|
4082
4134
|
hideDatePicker,
|
|
4083
4135
|
hideDateHint,
|
|
@@ -4089,12 +4141,16 @@ function dateTimeField(config = {}) {
|
|
|
4089
4141
|
}
|
|
4090
4142
|
function dateRangeField(config = {}) {
|
|
4091
4143
|
var _a, _b, _c;
|
|
4092
|
-
const { required: inputRequired, start, end } = config;
|
|
4144
|
+
const { required: inputRequired, start, end, timezone, showTimezone } = config;
|
|
4093
4145
|
const required = (_a = inputRequired !== null && inputRequired !== void 0 ? inputRequired : start === null || start === void 0 ? void 0 : start.required) !== null && _a !== void 0 ? _a : false;
|
|
4094
4146
|
const startFieldKey = (_b = start === null || start === void 0 ? void 0 : start.key) !== null && _b !== void 0 ? _b : 'start';
|
|
4095
4147
|
const endFieldKey = (_c = end === null || end === void 0 ? void 0 : end.key) !== null && _c !== void 0 ? _c : 'end';
|
|
4096
|
-
const startField = dateTimeField(Object.assign(Object.assign({ dateLabel: 'Start'
|
|
4097
|
-
|
|
4148
|
+
const startField = dateTimeField(Object.assign(Object.assign({ dateLabel: 'Start', timeMode: DbxDateTimeFieldTimeMode.NONE, getSyncFieldsObs: () => of([{ syncWith: endFieldKey, syncType: 'after' }]) }, start), { timezone,
|
|
4149
|
+
showTimezone,
|
|
4150
|
+
required, key: startFieldKey }));
|
|
4151
|
+
const endField = dateTimeField(Object.assign(Object.assign({ dateLabel: 'End', timeMode: DbxDateTimeFieldTimeMode.NONE, getSyncFieldsObs: () => of([{ syncWith: startFieldKey, syncType: 'before' }]) }, end), { timezone,
|
|
4152
|
+
showTimezone,
|
|
4153
|
+
required, key: endFieldKey }));
|
|
4098
4154
|
return {
|
|
4099
4155
|
key: undefined,
|
|
4100
4156
|
fieldGroup: [flexLayoutWrapper([startField, endField], { size: 1, relative: true })]
|
|
@@ -4102,15 +4158,17 @@ function dateRangeField(config = {}) {
|
|
|
4102
4158
|
}
|
|
4103
4159
|
function dateTimeRangeField(inputConfig = {}) {
|
|
4104
4160
|
var _a, _b;
|
|
4105
|
-
const { required = false, start: inputStart, end: inputEnd } = inputConfig;
|
|
4161
|
+
const { required = false, start: inputStart, end: inputEnd, timezone, showTimezone } = inputConfig;
|
|
4106
4162
|
function dateTimeRangeFieldConfig(config) {
|
|
4107
|
-
return Object.assign(Object.assign({}, config), { required, timeOnly: true, hideDateHint: true });
|
|
4163
|
+
return Object.assign(Object.assign({}, config), { required, timeMode: DbxDateTimeFieldTimeMode.REQUIRED, getSyncFieldsObs: undefined, timeOnly: true, hideDateHint: true });
|
|
4108
4164
|
}
|
|
4109
4165
|
const startKey = (_a = inputStart === null || inputStart === void 0 ? void 0 : inputStart.key) !== null && _a !== void 0 ? _a : 'start';
|
|
4110
4166
|
const endKey = (_b = inputEnd === null || inputEnd === void 0 ? void 0 : inputEnd.key) !== null && _b !== void 0 ? _b : 'end';
|
|
4111
4167
|
const start = Object.assign(Object.assign({ label: 'Start Time' }, dateTimeRangeFieldConfig(inputStart)), { key: startKey });
|
|
4112
4168
|
const end = Object.assign(Object.assign({ label: 'End Time' }, dateTimeRangeFieldConfig(inputEnd)), { key: endKey });
|
|
4113
4169
|
const config = {
|
|
4170
|
+
timezone,
|
|
4171
|
+
showTimezone,
|
|
4114
4172
|
start,
|
|
4115
4173
|
end
|
|
4116
4174
|
};
|
|
@@ -4888,9 +4946,7 @@ class DbxFormlyFormComponent extends AbstractSubscriptionDirective {
|
|
|
4888
4946
|
else {
|
|
4889
4947
|
return of(state);
|
|
4890
4948
|
}
|
|
4891
|
-
})
|
|
4892
|
-
// tapLog('Change: ')
|
|
4893
|
-
)), shareReplay(1));
|
|
4949
|
+
}))), shareReplay(1));
|
|
4894
4950
|
}
|
|
4895
4951
|
ngOnInit() {
|
|
4896
4952
|
this.context.setDelegate(this);
|
|
@@ -5203,18 +5259,23 @@ function timezoneStringSearchFunction() {
|
|
|
5203
5259
|
};
|
|
5204
5260
|
}
|
|
5205
5261
|
const DISPLAY_FOR_TIMEZONE_STRING_VALUE = (values) => {
|
|
5206
|
-
const
|
|
5262
|
+
const timezoneInfos = allTimezoneInfos();
|
|
5263
|
+
const displayValues = values.map((x) => {
|
|
5264
|
+
var _a, _b;
|
|
5265
|
+
const meta = (_a = x.meta) !== null && _a !== void 0 ? _a : timezoneInfos.find((y) => x.value === y.timezone); // attempt to find the metadata in the timeInfos if it isn't provided.
|
|
5266
|
+
return Object.assign(Object.assign({}, x), { label: x.value, sublabel: (_b = meta === null || meta === void 0 ? void 0 : meta.abbreviation) !== null && _b !== void 0 ? _b : 'Unknown' });
|
|
5267
|
+
});
|
|
5207
5268
|
const obs = of(displayValues);
|
|
5208
5269
|
return obs;
|
|
5209
5270
|
};
|
|
5210
5271
|
/**
|
|
5211
|
-
* Template for
|
|
5272
|
+
* Template for a searchable text field for a timezone.
|
|
5212
5273
|
*
|
|
5213
5274
|
* @param param0
|
|
5214
5275
|
* @returns
|
|
5215
5276
|
*/
|
|
5216
5277
|
function timezoneStringField(config = {}) {
|
|
5217
|
-
return searchableTextField(Object.assign(Object.assign({ key: 'timezone', label: 'Timezone', asArrayValue: false }, config), { searchOnEmptyText: true, search: timezoneStringSearchFunction(), displayForValue: DISPLAY_FOR_TIMEZONE_STRING_VALUE }));
|
|
5278
|
+
return searchableTextField(Object.assign(Object.assign({ key: 'timezone', label: 'Timezone', asArrayValue: false, required: false }, config), { searchOnEmptyText: true, allowStringValues: false, showClearValue: true, search: timezoneStringSearchFunction(), displayForValue: DISPLAY_FOR_TIMEZONE_STRING_VALUE }));
|
|
5218
5279
|
}
|
|
5219
5280
|
|
|
5220
5281
|
/**
|