@sumaris-net/ngx-components 1.15.2 → 1.15.5
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/bundles/sumaris-net.ngx-components.umd.js +99 -60
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +4 -0
- package/esm2015/src/app/core/services/platform.service.js +1 -1
- package/esm2015/src/app/shared/dates.js +15 -1
- package/esm2015/src/app/shared/material/datetime/material.date.js +45 -22
- package/esm2015/src/app/shared/material/datetime/material.datetime.js +41 -39
- package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +2 -2
- package/fesm2015/sumaris-net.ngx-components.js +99 -60
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/dates.d.ts +7 -0
- package/src/app/shared/material/datetime/material.date.d.ts +6 -3
- package/src/app/shared/material/datetime/material.datetime.d.ts +5 -4
- package/sumaris-net.ngx-components.metadata.json +1 -1
|
@@ -2240,6 +2240,20 @@ class DateUtils {
|
|
|
2240
2240
|
.tz(timezone, keepLocalTime)
|
|
2241
2241
|
.startOf('day');
|
|
2242
2242
|
}
|
|
2243
|
+
/**
|
|
2244
|
+
* Test if a date is on the given day of week
|
|
2245
|
+
* @param date
|
|
2246
|
+
* @param weekday
|
|
2247
|
+
* @param timezone
|
|
2248
|
+
*/
|
|
2249
|
+
static isAtDay(date, weekday, timezone) {
|
|
2250
|
+
date = date && fromDateISOString(date);
|
|
2251
|
+
if (!date)
|
|
2252
|
+
return null;
|
|
2253
|
+
if (timezone)
|
|
2254
|
+
date = date.clone().tz(timezone).startOf('day');
|
|
2255
|
+
return date.day() === weekday;
|
|
2256
|
+
}
|
|
2243
2257
|
}
|
|
2244
2258
|
function toDateISOString(value) {
|
|
2245
2259
|
if (!value)
|
|
@@ -4806,8 +4820,10 @@ class MatDate {
|
|
|
4806
4820
|
this.formControl.setValidators(this.required ? [this.formControl.validator, Validators.required, SharedValidators.validDate] :
|
|
4807
4821
|
[this.formControl.validator, SharedValidators.validDate]);
|
|
4808
4822
|
}
|
|
4823
|
+
// Create the day control
|
|
4809
4824
|
this.dayControl = this.formBuilder.control(null, () => this.formControl.errors);
|
|
4810
4825
|
// Get patterns to display date
|
|
4826
|
+
this.updatePattern(this.translate.instant('COMMON.DATE_PATTERN'));
|
|
4811
4827
|
this._subscription.add(this.translate.get('COMMON.DATE_PATTERN')
|
|
4812
4828
|
.subscribe((pattern) => this.updatePattern(pattern)));
|
|
4813
4829
|
this._subscription.add(this.dayControl.valueChanges
|
|
@@ -4818,6 +4834,9 @@ class MatDate {
|
|
|
4818
4834
|
)
|
|
4819
4835
|
.subscribe(() => {
|
|
4820
4836
|
this.dayControl.updateValueAndValidity({ emitEvent: false });
|
|
4837
|
+
if (this.formControl.touched && !this.dayControl.touched) {
|
|
4838
|
+
this.dayControl.markAsTouched();
|
|
4839
|
+
}
|
|
4821
4840
|
this.markForCheck();
|
|
4822
4841
|
}));
|
|
4823
4842
|
this.updateTabIndex();
|
|
@@ -4826,14 +4845,15 @@ class MatDate {
|
|
|
4826
4845
|
ngOnDestroy() {
|
|
4827
4846
|
this._subscription.unsubscribe();
|
|
4828
4847
|
}
|
|
4829
|
-
writeValue(
|
|
4848
|
+
writeValue(value) {
|
|
4830
4849
|
if (this._writing)
|
|
4831
4850
|
return; // Skip
|
|
4832
4851
|
this._writing = true;
|
|
4833
4852
|
// DEBUG
|
|
4834
|
-
//
|
|
4835
|
-
|
|
4836
|
-
|
|
4853
|
+
//console.debug("[mat-date] writeValue() with:", value);
|
|
4854
|
+
// Convert into date, and clone if necessary
|
|
4855
|
+
const date = isMoment(value) ? value.clone() : fromDateISOString(value);
|
|
4856
|
+
if (!date || !date.isValid()) {
|
|
4837
4857
|
this.dayControl.patchValue(null, { emitEvent: false });
|
|
4838
4858
|
if (this.formControl.value) {
|
|
4839
4859
|
this.formControl.patchValue(null, { emitEvent: false });
|
|
@@ -4842,13 +4862,17 @@ class MatDate {
|
|
|
4842
4862
|
}
|
|
4843
4863
|
else {
|
|
4844
4864
|
// Format day
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4865
|
+
let day = date && this.timezone
|
|
4866
|
+
// Move to the expected TZ (keeping local hour - e.g. midnight)
|
|
4867
|
+
? date.tz(this.timezone)
|
|
4868
|
+
// Not TZ: important: do a clone
|
|
4869
|
+
: date;
|
|
4848
4870
|
day = day.startOf('day');
|
|
4849
4871
|
const dayStr = this.dateAdapter.format(day, this.dayPattern);
|
|
4850
|
-
|
|
4851
|
-
|
|
4872
|
+
if (this.dayControl.value !== dayStr) {
|
|
4873
|
+
// Update control
|
|
4874
|
+
this.dayControl.patchValue(dayStr, { emitEvent: false });
|
|
4875
|
+
}
|
|
4852
4876
|
}
|
|
4853
4877
|
this._writing = false;
|
|
4854
4878
|
this.markForCheck();
|
|
@@ -4888,7 +4912,7 @@ class MatDate {
|
|
|
4888
4912
|
}
|
|
4889
4913
|
if (this.dayControl.value !== dateStr) {
|
|
4890
4914
|
// DEBUG
|
|
4891
|
-
console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
|
|
4915
|
+
//console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
|
|
4892
4916
|
this.dayControl.setValue(dateStr, {
|
|
4893
4917
|
emitEvent: true // Will call onFormChange
|
|
4894
4918
|
});
|
|
@@ -4949,28 +4973,37 @@ class MatDate {
|
|
|
4949
4973
|
this.markForCheck();
|
|
4950
4974
|
}
|
|
4951
4975
|
}
|
|
4952
|
-
checkIfTouched() {
|
|
4976
|
+
checkIfTouched(opts) {
|
|
4953
4977
|
if (this.dayControl.touched) {
|
|
4954
4978
|
this._onTouchedCallback();
|
|
4955
|
-
|
|
4979
|
+
if (!opts || opts.emitEvent !== false) {
|
|
4980
|
+
this.markForCheck();
|
|
4981
|
+
}
|
|
4956
4982
|
}
|
|
4957
4983
|
}
|
|
4958
4984
|
onFormChange(dayStr) {
|
|
4959
4985
|
if (this._writing)
|
|
4960
4986
|
return; // Skip if call by self
|
|
4961
4987
|
this._writing = true;
|
|
4988
|
+
if (this.dayControl.invalid) {
|
|
4989
|
+
this.formControl.markAsPending({ onlySelf: true });
|
|
4990
|
+
this.formControl.setErrors(Object.assign(Object.assign({}, this.formControl.errors), this.dayControl.errors));
|
|
4991
|
+
this.formControl.markAsDirty();
|
|
4992
|
+
this._writing = false;
|
|
4993
|
+
return;
|
|
4994
|
+
}
|
|
4962
4995
|
// Make to remove placeholder chars
|
|
4963
4996
|
while (dayStr && dayStr.indexOf(this.placeholderChar) !== -1) {
|
|
4964
4997
|
dayStr = dayStr.replace(this.placeholderChar, '');
|
|
4965
4998
|
}
|
|
4966
4999
|
// Parse day
|
|
4967
|
-
let
|
|
4968
|
-
// Move to the expected TZ
|
|
4969
|
-
|
|
4970
|
-
|
|
4971
|
-
.
|
|
4972
|
-
|
|
4973
|
-
this.emitChange(
|
|
5000
|
+
let dayDate = dayStr && this.dateAdapter.parse(dayStr, this.dayPattern);
|
|
5001
|
+
// Move to the expected TZ, and keep the local hour (= midnight) to have midnight at local time
|
|
5002
|
+
dayDate = dayDate && (this.timezone ? dayDate.tz(this.timezone, true) : dayDate);
|
|
5003
|
+
dayDate = dayDate && dayDate
|
|
5004
|
+
.startOf('day') // Reset hour
|
|
5005
|
+
.utc(); // Convert to UTC (avoid TZ offset in final string)
|
|
5006
|
+
this.emitChange(dayDate);
|
|
4974
5007
|
this._writing = false;
|
|
4975
5008
|
}
|
|
4976
5009
|
waitKeyboardHide(waitKeyboardDelay) {
|
|
@@ -4992,7 +5025,10 @@ class MatDate {
|
|
|
4992
5025
|
const dateStr = toDateISOString(value) || null;
|
|
4993
5026
|
if (this.formControl.value !== dateStr) {
|
|
4994
5027
|
// DEBUG
|
|
4995
|
-
//console.debug('[
|
|
5028
|
+
//console.debug('[mat-date] Emit new value: ' + dateStr);
|
|
5029
|
+
// Apply to form control. => Will call writeValue()
|
|
5030
|
+
// NOT NEED, because a formControl should NOT be used by multiple fields
|
|
5031
|
+
//this.formControl.setValue(dateStr, {emitEvent: false})
|
|
4996
5032
|
// Changes comes from inside function: use the callback
|
|
4997
5033
|
this._onChangeCallback(dateStr);
|
|
4998
5034
|
// Check if need to update controls
|
|
@@ -5025,7 +5061,7 @@ class MatDate {
|
|
|
5025
5061
|
MatDate.decorators = [
|
|
5026
5062
|
{ type: Component, args: [{
|
|
5027
5063
|
selector: 'mat-date-field',
|
|
5028
|
-
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\">\n <ng-container [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </ng-container>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\n\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
|
|
5064
|
+
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\">\n <ng-container [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </ng-container>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"\n ></mat-datepicker>\n\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
|
|
5029
5065
|
providers: [
|
|
5030
5066
|
DEFAULT_VALUE_ACCESSOR$5,
|
|
5031
5067
|
],
|
|
@@ -5055,6 +5091,7 @@ MatDate.propDecorators = {
|
|
|
5055
5091
|
startDate: [{ type: Input }],
|
|
5056
5092
|
clearable: [{ type: Input }],
|
|
5057
5093
|
timezone: [{ type: Input }],
|
|
5094
|
+
datePickerFilter: [{ type: Input }],
|
|
5058
5095
|
readonly: [{ type: Input }],
|
|
5059
5096
|
tabindex: [{ type: Input }],
|
|
5060
5097
|
datePicker: [{ type: ViewChild, args: ['datePicker',] }],
|
|
@@ -5130,18 +5167,18 @@ class MatDateTime {
|
|
|
5130
5167
|
this.formControl.setValidators(this.required ? [this.formControl.validator, Validators.required, SharedValidators.validDate] :
|
|
5131
5168
|
[this.formControl.validator, SharedValidators.validDate]);
|
|
5132
5169
|
}
|
|
5133
|
-
// Create the
|
|
5134
|
-
this.
|
|
5135
|
-
// Create the
|
|
5170
|
+
// Create the day control
|
|
5171
|
+
this.dayControl = this.formBuilder.control(null, this.required ? Validators.required : null);
|
|
5172
|
+
// Create the hour control
|
|
5136
5173
|
const timeValidator = this.required ?
|
|
5137
5174
|
(this.mobile ? Validators.required : Validators.compose([Validators.required, Validators.pattern(HOUR_REGEXP)])) :
|
|
5138
5175
|
(this.mobile ? null : Validators.pattern(HOUR_REGEXP));
|
|
5139
|
-
this.
|
|
5176
|
+
this.hourControl = this.formBuilder.control(null, timeValidator);
|
|
5140
5177
|
// Get patterns to display date and date+time
|
|
5141
5178
|
this._subscription.add(this.translate.get(['COMMON.DATE_PATTERN', 'COMMON.DATE_TIME_PATTERN'])
|
|
5142
5179
|
.subscribe((patterns) => this.updatePattern(patterns)));
|
|
5143
|
-
this._subscription.add(merge(this.
|
|
5144
|
-
.subscribe((
|
|
5180
|
+
this._subscription.add(merge(this.dayControl.valueChanges, this.hourControl.valueChanges)
|
|
5181
|
+
.subscribe((_) => this.onFormChange()));
|
|
5145
5182
|
// Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
|
|
5146
5183
|
this._subscription.add(this.formControl.statusChanges
|
|
5147
5184
|
.pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
|
|
@@ -5153,32 +5190,32 @@ class MatDateTime {
|
|
|
5153
5190
|
ngOnDestroy() {
|
|
5154
5191
|
this._subscription.unsubscribe();
|
|
5155
5192
|
}
|
|
5156
|
-
writeValue(
|
|
5193
|
+
writeValue(value) {
|
|
5157
5194
|
if (this._writing)
|
|
5158
5195
|
return; // Skip
|
|
5159
5196
|
this._writing = true;
|
|
5160
5197
|
// DEBUG
|
|
5161
|
-
// console.debug("[mat-date-time] writeValue() with:",
|
|
5162
|
-
const
|
|
5163
|
-
if (!
|
|
5164
|
-
this.
|
|
5165
|
-
this.
|
|
5198
|
+
// console.debug("[mat-date-time] writeValue() with:", value);
|
|
5199
|
+
const date = fromDateISOString(value);
|
|
5200
|
+
if (!date || !date.isValid()) {
|
|
5201
|
+
this.dayControl.patchValue(null, { emitEvent: false });
|
|
5202
|
+
this.hourControl.patchValue(null, { emitEvent: false });
|
|
5166
5203
|
}
|
|
5167
5204
|
else {
|
|
5168
5205
|
// Format day
|
|
5169
|
-
const day =
|
|
5206
|
+
const day = date.clone().startOf('day');
|
|
5170
5207
|
const dayStr = this.dateAdapter.format(day, this.dayPattern);
|
|
5171
5208
|
// Format time
|
|
5172
5209
|
// - Format hh
|
|
5173
|
-
let hour =
|
|
5210
|
+
let hour = date.hour();
|
|
5174
5211
|
hour = hour < 10 ? ('0' + hour) : hour;
|
|
5175
5212
|
// - Format mm
|
|
5176
|
-
let minutes =
|
|
5213
|
+
let minutes = date.minutes();
|
|
5177
5214
|
minutes = minutes < 10 ? ('0' + minutes) : minutes;
|
|
5178
5215
|
const timeStr = `${hour}:${minutes}`;
|
|
5179
5216
|
// Update controls
|
|
5180
|
-
this.
|
|
5181
|
-
this.
|
|
5217
|
+
this.dayControl.patchValue(dayStr, { emitEvent: false });
|
|
5218
|
+
this.hourControl.patchValue(timeStr, { emitEvent: false });
|
|
5182
5219
|
}
|
|
5183
5220
|
this._writing = false;
|
|
5184
5221
|
this.markForCheck();
|
|
@@ -5194,12 +5231,12 @@ class MatDateTime {
|
|
|
5194
5231
|
return; // Skip
|
|
5195
5232
|
this._disabling = true;
|
|
5196
5233
|
if (isDisabled) {
|
|
5197
|
-
this.
|
|
5198
|
-
this.
|
|
5234
|
+
this.dayControl.disable({ emitEvent: false });
|
|
5235
|
+
this.hourControl.disable({ emitEvent: false });
|
|
5199
5236
|
}
|
|
5200
5237
|
else {
|
|
5201
|
-
this.
|
|
5202
|
-
this.
|
|
5238
|
+
this.dayControl.enable({ emitEvent: false });
|
|
5239
|
+
this.hourControl.enable({ emitEvent: false });
|
|
5203
5240
|
}
|
|
5204
5241
|
this._disabling = false;
|
|
5205
5242
|
this.markForCheck();
|
|
@@ -5212,25 +5249,25 @@ class MatDateTime {
|
|
|
5212
5249
|
}
|
|
5213
5250
|
// Convert to usable date, then convert to day pattern (e.g DD/MM/YYYY)
|
|
5214
5251
|
const day = event.value && event.value
|
|
5215
|
-
.locale(this.locale) // set
|
|
5252
|
+
.locale(this.locale) // set locale
|
|
5216
5253
|
.hour(0).minute(0).seconds(0).millisecond(0) // Reset hour
|
|
5217
5254
|
.utc(true);
|
|
5218
5255
|
const dayStr = day && this.dateAdapter.format(day, this.dayPattern) || null;
|
|
5219
5256
|
// Update the day control
|
|
5220
|
-
if (this.
|
|
5257
|
+
if (this.dayControl.value !== dayStr) {
|
|
5221
5258
|
// DEBUG
|
|
5222
5259
|
// console.debug("[mat-date-time] onDatePickerChange() new value:", dayStr);
|
|
5223
|
-
this.
|
|
5260
|
+
this.dayControl.setValue(dayStr, {
|
|
5224
5261
|
emitEvent: true // Will call onFormChange
|
|
5225
5262
|
});
|
|
5226
5263
|
}
|
|
5227
5264
|
}
|
|
5228
5265
|
onTimePickerChange(timeStr) {
|
|
5229
5266
|
// Update the time control, if need
|
|
5230
|
-
if (this.
|
|
5267
|
+
if (this.hourControl.value !== timeStr) {
|
|
5231
5268
|
// DEBUG
|
|
5232
5269
|
// console.debug("[mat-date-time] onTimePickerChange() new value:", timeStr);
|
|
5233
|
-
this.
|
|
5270
|
+
this.hourControl.setValue(timeStr, {
|
|
5234
5271
|
emitEvent: true // Will call onFormChange
|
|
5235
5272
|
});
|
|
5236
5273
|
}
|
|
@@ -5302,26 +5339,24 @@ class MatDateTime {
|
|
|
5302
5339
|
this.dayPattern = (patterns['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? patterns['COMMON.DATE_PATTERN'] : 'L');
|
|
5303
5340
|
}
|
|
5304
5341
|
checkIfTouched() {
|
|
5305
|
-
if (this.
|
|
5342
|
+
if (this.dayControl.touched || this.hourControl.touched) {
|
|
5306
5343
|
this._onTouchedCallback();
|
|
5307
5344
|
this.markForCheck();
|
|
5308
5345
|
}
|
|
5309
5346
|
}
|
|
5310
|
-
onFormChange(
|
|
5347
|
+
onFormChange() {
|
|
5311
5348
|
if (this._writing)
|
|
5312
5349
|
return; // Skip if call by self
|
|
5313
5350
|
this._writing = true;
|
|
5314
|
-
let dayStr = this.
|
|
5315
|
-
const time = this.
|
|
5351
|
+
let dayStr = this.dayControl.value;
|
|
5352
|
+
const time = this.hourControl.value;
|
|
5316
5353
|
// DEBUG
|
|
5317
5354
|
//console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
|
|
5318
5355
|
const incompleteValue = isNilOrBlank(time) !== isNilOrBlank(dayStr);
|
|
5319
|
-
if (incompleteValue || this.
|
|
5356
|
+
if (incompleteValue || this.dayControl.invalid || this.hourControl.invalid) {
|
|
5320
5357
|
this.formControl.markAsPending({ onlySelf: true });
|
|
5321
|
-
this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.
|
|
5358
|
+
this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.dayControl.errors), this.hourControl.errors));
|
|
5322
5359
|
this.formControl.markAsDirty();
|
|
5323
|
-
// Reset the value
|
|
5324
|
-
//this.emitChange(null);
|
|
5325
5360
|
this._writing = false;
|
|
5326
5361
|
return;
|
|
5327
5362
|
}
|
|
@@ -5363,7 +5398,10 @@ class MatDateTime {
|
|
|
5363
5398
|
const dateStr = toDateISOString(value) || null;
|
|
5364
5399
|
if (this.formControl.value !== dateStr) {
|
|
5365
5400
|
// DEBUG
|
|
5366
|
-
//console.debug('[
|
|
5401
|
+
//console.debug('[mat-date-time] Emit new value: ' + dateStr);
|
|
5402
|
+
// Apply to form control. => Will call writeValue()
|
|
5403
|
+
// NOT NEED, because a formControl should NOT be used by multiple fields
|
|
5404
|
+
//this.formControl.setValue(dateStr, {emitEvent: false});
|
|
5367
5405
|
// Changes comes from inside function: use the callback
|
|
5368
5406
|
this._onChangeCallback(dateStr);
|
|
5369
5407
|
// Check if need to update controls
|
|
@@ -5382,8 +5420,8 @@ class MatDateTime {
|
|
|
5382
5420
|
});
|
|
5383
5421
|
}
|
|
5384
5422
|
markAsTouched(opts) {
|
|
5385
|
-
this.
|
|
5386
|
-
this.
|
|
5423
|
+
this.dayControl.markAsTouched(opts);
|
|
5424
|
+
this.hourControl.markAsTouched(opts);
|
|
5387
5425
|
this._onTouchedCallback();
|
|
5388
5426
|
this.markForCheck();
|
|
5389
5427
|
}
|
|
@@ -5397,7 +5435,7 @@ class MatDateTime {
|
|
|
5397
5435
|
MatDateTime.decorators = [
|
|
5398
5436
|
{ type: Component, args: [{
|
|
5399
5437
|
selector: 'mat-date-time-field',
|
|
5400
|
-
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable + time -->\n<ng-template #writable >\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding no-wrap\" nowrap>\n\n <!-- day -->\n <ion-col class=\"day ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"
|
|
5438
|
+
template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable + time -->\n<ng-template #writable >\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding no-wrap\" nowrap>\n\n <!-- day -->\n <ion-col class=\"day ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dayControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dayControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\n <div class=\"mat-form-field-subscript mat-form-field-subscript-wrapper\" >\n <!-- errors -->\n <ng-container [ngSwitch]=\"formControl.touched && formControl.errors|mapKeys|arrayFirst\">\n <mat-error *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</mat-error>\n </ng-container>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </div>\n\n </ion-col>\n\n <!-- hour -->\n <ion-col class=\"hour ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && (hourControl.invalid || formControl.invalid)\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n <input matInput #matInput type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"hourControl\"\n autocomplete=\"off\"\n min=\"0\" max=\"23\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.TIME_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keyup.arrowdown)=\"openTimePicker($event)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n <input matInput #matInput type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"hourControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"hourControl\"\n hidden\n [ngxTimepicker]=\"timePicker\"\n [format]=\"24\">\n\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && !mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePicker($event)\" >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePickerIfMobile($event)\">\n <mat-icon>access_time</mat-icon>\n </button>\n\n <ngx-material-timepicker #timePicker [@.disabled]=\"true\"\n (timeSet)=\"onTimePickerChange($event)\"\n [ESC]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"false\"\n [disableAnimation]=\"true\">\n <!-- cancel button -->\n <ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n </ng-template>\n\n <!-- confirm button -->\n <ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ng-template>\n\n </ngx-material-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
|
|
5401
5439
|
providers: [
|
|
5402
5440
|
DEFAULT_VALUE_ACCESSOR$4,
|
|
5403
5441
|
],
|
|
@@ -5426,6 +5464,7 @@ MatDateTime.propDecorators = {
|
|
|
5426
5464
|
autofocus: [{ type: Input }],
|
|
5427
5465
|
startDate: [{ type: Input }],
|
|
5428
5466
|
clearable: [{ type: Input }],
|
|
5467
|
+
datePickerFilter: [{ type: Input }],
|
|
5429
5468
|
readonly: [{ type: Input }],
|
|
5430
5469
|
tabindex: [{ type: Input }],
|
|
5431
5470
|
datePicker: [{ type: ViewChild, args: ['datePicker',] }],
|
|
@@ -26275,7 +26314,7 @@ class DateTestPage {
|
|
|
26275
26314
|
DateTestPage.decorators = [
|
|
26276
26315
|
{ type: Component, args: [{
|
|
26277
26316
|
selector: 'app-data-test',
|
|
26278
|
-
template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Date/Time field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <ion-grid>\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\">Start timer</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n </ion-col>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"never\">\n <input matInput type=\"text\" hidden>\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [value]=\"memoryMobile\">\n Mobile ?\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n <ion-col>\n <mat-date-field formControlName=\"empty\"\n *ngIf=\"!memoryHide\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"memoryMobile\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-col>\n </ion-row>\n\n <!-- Mobile mode -->\n <ion-row><ion-col><ion-text><h4>Mobile mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <!-- debug console -->\n <ion-row>\n <!-- buttons -->\n <ion-col size=\"2\">\n <!-- submit form -->\n <ion-button (click)=\"doSubmit($event)\"\n fill=\"outline\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n <!-- clear log -->\n <ion-button (click)=\"clearLogPanel()\"\n fill=\"outline\">\n <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"10\" *ngIf=\"showLogPanel\">\n <ion-text color=\"primary\">Log:<br/></ion-text>\n <div class=\"ion-padding-start\">\n <ion-text color=\"medium\">\n <small [innerHTML]=\"logContent\"></small>\n </ion-text>\n </div>\n </ion-col>\n </ion-row>\n\n <!-- Desktop mode -->\n <ion-row><ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"false\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value=\"{{stringify(form.controls.timezone.value)}}\"</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #readonlyField formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"false\"\n [clearable]=\"true\"\n timezone=\"Indian/Mahe\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-field #readonlyField formControlName=\"readonly\"\n placeholder=\"Date/Time\"\n [readonly]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n </ion-grid>\n </form>\n\n</ion-content>\n"
|
|
26317
|
+
template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Date field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <ion-grid>\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\">Start timer</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n </ion-col>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"never\">\n <input matInput type=\"text\" hidden>\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [value]=\"memoryMobile\">\n Mobile ?\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n <ion-col>\n <mat-date-field formControlName=\"empty\"\n *ngIf=\"!memoryHide\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"memoryMobile\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-col>\n </ion-row>\n\n <!-- Mobile mode -->\n <ion-row><ion-col><ion-text><h4>Mobile mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value=\"{{stringify(form.controls.timezone.value)}}\"</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #readonlyField formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"true\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <!-- debug console -->\n <ion-row>\n <!-- buttons -->\n <ion-col size=\"2\">\n <!-- submit form -->\n <ion-button (click)=\"doSubmit($event)\"\n fill=\"outline\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n <!-- clear log -->\n <ion-button (click)=\"clearLogPanel()\"\n fill=\"outline\">\n <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"10\" *ngIf=\"showLogPanel\">\n <ion-text color=\"primary\">Log:<br/></ion-text>\n <div class=\"ion-padding-start\">\n <ion-text color=\"medium\">\n <small [innerHTML]=\"logContent\"></small>\n </ion-text>\n </div>\n </ion-col>\n </ion-row>\n\n <hr/>\n\n <!-- Desktop mode -->\n <ion-row><ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"empty\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"enable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field formControlName=\"disable\"\n placeholder=\"Date\"\n [required]=\"true\"\n [mobile]=\"false\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- TimeZone -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n TimeZone\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>timezone=\"{{timezone}}\" value={{stringify(form.controls.timezone.value)}}</pre></small>\n <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-field #readonlyField formControlName=\"timezone\"\n placeholder=\"Date\"\n [mobile]=\"false\"\n [clearable]=\"true\"\n [timezone]=\"timezone\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-field #readonlyField formControlName=\"readonly\"\n placeholder=\"Date\"\n [readonly]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n </ion-row>\n </ion-grid>\n </form>\n\n</ion-content>\n"
|
|
26279
26318
|
},] }
|
|
26280
26319
|
];
|
|
26281
26320
|
DateTestPage.ctorParameters = () => [
|