@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
|
@@ -2616,6 +2616,20 @@
|
|
|
2616
2616
|
.tz(timezone, keepLocalTime)
|
|
2617
2617
|
.startOf('day');
|
|
2618
2618
|
};
|
|
2619
|
+
/**
|
|
2620
|
+
* Test if a date is on the given day of week
|
|
2621
|
+
* @param date
|
|
2622
|
+
* @param weekday
|
|
2623
|
+
* @param timezone
|
|
2624
|
+
*/
|
|
2625
|
+
DateUtils.isAtDay = function (date, weekday, timezone) {
|
|
2626
|
+
date = date && fromDateISOString(date);
|
|
2627
|
+
if (!date)
|
|
2628
|
+
return null;
|
|
2629
|
+
if (timezone)
|
|
2630
|
+
date = date.clone().tz(timezone).startOf('day');
|
|
2631
|
+
return date.day() === weekday;
|
|
2632
|
+
};
|
|
2619
2633
|
return DateUtils;
|
|
2620
2634
|
}());
|
|
2621
2635
|
function toDateISOString(value) {
|
|
@@ -5414,8 +5428,10 @@
|
|
|
5414
5428
|
this.formControl.setValidators(this.required ? [this.formControl.validator, i1.Validators.required, SharedValidators.validDate] :
|
|
5415
5429
|
[this.formControl.validator, SharedValidators.validDate]);
|
|
5416
5430
|
}
|
|
5431
|
+
// Create the day control
|
|
5417
5432
|
this.dayControl = this.formBuilder.control(null, function () { return _this.formControl.errors; });
|
|
5418
5433
|
// Get patterns to display date
|
|
5434
|
+
this.updatePattern(this.translate.instant('COMMON.DATE_PATTERN'));
|
|
5419
5435
|
this._subscription.add(this.translate.get('COMMON.DATE_PATTERN')
|
|
5420
5436
|
.subscribe(function (pattern) { return _this.updatePattern(pattern); }));
|
|
5421
5437
|
this._subscription.add(this.dayControl.valueChanges
|
|
@@ -5426,6 +5442,9 @@
|
|
|
5426
5442
|
)
|
|
5427
5443
|
.subscribe(function () {
|
|
5428
5444
|
_this.dayControl.updateValueAndValidity({ emitEvent: false });
|
|
5445
|
+
if (_this.formControl.touched && !_this.dayControl.touched) {
|
|
5446
|
+
_this.dayControl.markAsTouched();
|
|
5447
|
+
}
|
|
5429
5448
|
_this.markForCheck();
|
|
5430
5449
|
}));
|
|
5431
5450
|
this.updateTabIndex();
|
|
@@ -5434,14 +5453,15 @@
|
|
|
5434
5453
|
MatDate.prototype.ngOnDestroy = function () {
|
|
5435
5454
|
this._subscription.unsubscribe();
|
|
5436
5455
|
};
|
|
5437
|
-
MatDate.prototype.writeValue = function (
|
|
5456
|
+
MatDate.prototype.writeValue = function (value) {
|
|
5438
5457
|
if (this._writing)
|
|
5439
5458
|
return; // Skip
|
|
5440
5459
|
this._writing = true;
|
|
5441
5460
|
// DEBUG
|
|
5442
|
-
//
|
|
5443
|
-
|
|
5444
|
-
|
|
5461
|
+
//console.debug("[mat-date] writeValue() with:", value);
|
|
5462
|
+
// Convert into date, and clone if necessary
|
|
5463
|
+
var date = momentImported.isMoment(value) ? value.clone() : fromDateISOString(value);
|
|
5464
|
+
if (!date || !date.isValid()) {
|
|
5445
5465
|
this.dayControl.patchValue(null, { emitEvent: false });
|
|
5446
5466
|
if (this.formControl.value) {
|
|
5447
5467
|
this.formControl.patchValue(null, { emitEvent: false });
|
|
@@ -5450,13 +5470,17 @@
|
|
|
5450
5470
|
}
|
|
5451
5471
|
else {
|
|
5452
5472
|
// Format day
|
|
5453
|
-
|
|
5454
|
-
|
|
5455
|
-
|
|
5473
|
+
var day = date && this.timezone
|
|
5474
|
+
// Move to the expected TZ (keeping local hour - e.g. midnight)
|
|
5475
|
+
? date.tz(this.timezone)
|
|
5476
|
+
// Not TZ: important: do a clone
|
|
5477
|
+
: date;
|
|
5456
5478
|
day = day.startOf('day');
|
|
5457
5479
|
var dayStr = this.dateAdapter.format(day, this.dayPattern);
|
|
5458
|
-
|
|
5459
|
-
|
|
5480
|
+
if (this.dayControl.value !== dayStr) {
|
|
5481
|
+
// Update control
|
|
5482
|
+
this.dayControl.patchValue(dayStr, { emitEvent: false });
|
|
5483
|
+
}
|
|
5460
5484
|
}
|
|
5461
5485
|
this._writing = false;
|
|
5462
5486
|
this.markForCheck();
|
|
@@ -5496,7 +5520,7 @@
|
|
|
5496
5520
|
}
|
|
5497
5521
|
if (this.dayControl.value !== dateStr) {
|
|
5498
5522
|
// DEBUG
|
|
5499
|
-
console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
|
|
5523
|
+
//console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
|
|
5500
5524
|
this.dayControl.setValue(dateStr, {
|
|
5501
5525
|
emitEvent: true // Will call onFormChange
|
|
5502
5526
|
});
|
|
@@ -5567,28 +5591,37 @@
|
|
|
5567
5591
|
this.markForCheck();
|
|
5568
5592
|
}
|
|
5569
5593
|
};
|
|
5570
|
-
MatDate.prototype.checkIfTouched = function () {
|
|
5594
|
+
MatDate.prototype.checkIfTouched = function (opts) {
|
|
5571
5595
|
if (this.dayControl.touched) {
|
|
5572
5596
|
this._onTouchedCallback();
|
|
5573
|
-
|
|
5597
|
+
if (!opts || opts.emitEvent !== false) {
|
|
5598
|
+
this.markForCheck();
|
|
5599
|
+
}
|
|
5574
5600
|
}
|
|
5575
5601
|
};
|
|
5576
5602
|
MatDate.prototype.onFormChange = function (dayStr) {
|
|
5577
5603
|
if (this._writing)
|
|
5578
5604
|
return; // Skip if call by self
|
|
5579
5605
|
this._writing = true;
|
|
5606
|
+
if (this.dayControl.invalid) {
|
|
5607
|
+
this.formControl.markAsPending({ onlySelf: true });
|
|
5608
|
+
this.formControl.setErrors(Object.assign(Object.assign({}, this.formControl.errors), this.dayControl.errors));
|
|
5609
|
+
this.formControl.markAsDirty();
|
|
5610
|
+
this._writing = false;
|
|
5611
|
+
return;
|
|
5612
|
+
}
|
|
5580
5613
|
// Make to remove placeholder chars
|
|
5581
5614
|
while (dayStr && dayStr.indexOf(this.placeholderChar) !== -1) {
|
|
5582
5615
|
dayStr = dayStr.replace(this.placeholderChar, '');
|
|
5583
5616
|
}
|
|
5584
5617
|
// Parse day
|
|
5585
|
-
var
|
|
5586
|
-
// Move to the expected TZ
|
|
5587
|
-
|
|
5588
|
-
|
|
5589
|
-
.
|
|
5590
|
-
|
|
5591
|
-
this.emitChange(
|
|
5618
|
+
var dayDate = dayStr && this.dateAdapter.parse(dayStr, this.dayPattern);
|
|
5619
|
+
// Move to the expected TZ, and keep the local hour (= midnight) to have midnight at local time
|
|
5620
|
+
dayDate = dayDate && (this.timezone ? dayDate.tz(this.timezone, true) : dayDate);
|
|
5621
|
+
dayDate = dayDate && dayDate
|
|
5622
|
+
.startOf('day') // Reset hour
|
|
5623
|
+
.utc(); // Convert to UTC (avoid TZ offset in final string)
|
|
5624
|
+
this.emitChange(dayDate);
|
|
5592
5625
|
this._writing = false;
|
|
5593
5626
|
};
|
|
5594
5627
|
MatDate.prototype.waitKeyboardHide = function (waitKeyboardDelay) {
|
|
@@ -5620,7 +5653,10 @@
|
|
|
5620
5653
|
var dateStr = toDateISOString(value) || null;
|
|
5621
5654
|
if (this.formControl.value !== dateStr) {
|
|
5622
5655
|
// DEBUG
|
|
5623
|
-
//console.debug('[
|
|
5656
|
+
//console.debug('[mat-date] Emit new value: ' + dateStr);
|
|
5657
|
+
// Apply to form control. => Will call writeValue()
|
|
5658
|
+
// NOT NEED, because a formControl should NOT be used by multiple fields
|
|
5659
|
+
//this.formControl.setValue(dateStr, {emitEvent: false})
|
|
5624
5660
|
// Changes comes from inside function: use the callback
|
|
5625
5661
|
this._onChangeCallback(dateStr);
|
|
5626
5662
|
// Check if need to update controls
|
|
@@ -5655,7 +5691,7 @@
|
|
|
5655
5691
|
MatDate.decorators = [
|
|
5656
5692
|
{ type: i0.Component, args: [{
|
|
5657
5693
|
selector: 'mat-date-field',
|
|
5658
|
-
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",
|
|
5694
|
+
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",
|
|
5659
5695
|
providers: [
|
|
5660
5696
|
DEFAULT_VALUE_ACCESSOR$5,
|
|
5661
5697
|
],
|
|
@@ -5685,6 +5721,7 @@
|
|
|
5685
5721
|
startDate: [{ type: i0.Input }],
|
|
5686
5722
|
clearable: [{ type: i0.Input }],
|
|
5687
5723
|
timezone: [{ type: i0.Input }],
|
|
5724
|
+
datePickerFilter: [{ type: i0.Input }],
|
|
5688
5725
|
readonly: [{ type: i0.Input }],
|
|
5689
5726
|
tabindex: [{ type: i0.Input }],
|
|
5690
5727
|
datePicker: [{ type: i0.ViewChild, args: ['datePicker',] }],
|
|
@@ -5774,18 +5811,18 @@
|
|
|
5774
5811
|
this.formControl.setValidators(this.required ? [this.formControl.validator, i1.Validators.required, SharedValidators.validDate] :
|
|
5775
5812
|
[this.formControl.validator, SharedValidators.validDate]);
|
|
5776
5813
|
}
|
|
5777
|
-
// Create the
|
|
5778
|
-
this.
|
|
5779
|
-
// Create the
|
|
5814
|
+
// Create the day control
|
|
5815
|
+
this.dayControl = this.formBuilder.control(null, this.required ? i1.Validators.required : null);
|
|
5816
|
+
// Create the hour control
|
|
5780
5817
|
var timeValidator = this.required ?
|
|
5781
5818
|
(this.mobile ? i1.Validators.required : i1.Validators.compose([i1.Validators.required, i1.Validators.pattern(HOUR_REGEXP)])) :
|
|
5782
5819
|
(this.mobile ? null : i1.Validators.pattern(HOUR_REGEXP));
|
|
5783
|
-
this.
|
|
5820
|
+
this.hourControl = this.formBuilder.control(null, timeValidator);
|
|
5784
5821
|
// Get patterns to display date and date+time
|
|
5785
5822
|
this._subscription.add(this.translate.get(['COMMON.DATE_PATTERN', 'COMMON.DATE_TIME_PATTERN'])
|
|
5786
5823
|
.subscribe(function (patterns) { return _this.updatePattern(patterns); }));
|
|
5787
|
-
this._subscription.add(rxjs.merge(this.
|
|
5788
|
-
.subscribe(function (
|
|
5824
|
+
this._subscription.add(rxjs.merge(this.dayControl.valueChanges, this.hourControl.valueChanges)
|
|
5825
|
+
.subscribe(function (_) { return _this.onFormChange(); }));
|
|
5789
5826
|
// Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
|
|
5790
5827
|
this._subscription.add(this.formControl.statusChanges
|
|
5791
5828
|
.pipe(operators.filter(function (_) { return !_this.readonly && !_this._writing && !_this._disabling; }) // Skip
|
|
@@ -5797,32 +5834,32 @@
|
|
|
5797
5834
|
MatDateTime.prototype.ngOnDestroy = function () {
|
|
5798
5835
|
this._subscription.unsubscribe();
|
|
5799
5836
|
};
|
|
5800
|
-
MatDateTime.prototype.writeValue = function (
|
|
5837
|
+
MatDateTime.prototype.writeValue = function (value) {
|
|
5801
5838
|
if (this._writing)
|
|
5802
5839
|
return; // Skip
|
|
5803
5840
|
this._writing = true;
|
|
5804
5841
|
// DEBUG
|
|
5805
|
-
// console.debug("[mat-date-time] writeValue() with:",
|
|
5806
|
-
var
|
|
5807
|
-
if (!
|
|
5808
|
-
this.
|
|
5809
|
-
this.
|
|
5842
|
+
// console.debug("[mat-date-time] writeValue() with:", value);
|
|
5843
|
+
var date = fromDateISOString(value);
|
|
5844
|
+
if (!date || !date.isValid()) {
|
|
5845
|
+
this.dayControl.patchValue(null, { emitEvent: false });
|
|
5846
|
+
this.hourControl.patchValue(null, { emitEvent: false });
|
|
5810
5847
|
}
|
|
5811
5848
|
else {
|
|
5812
5849
|
// Format day
|
|
5813
|
-
var day =
|
|
5850
|
+
var day = date.clone().startOf('day');
|
|
5814
5851
|
var dayStr = this.dateAdapter.format(day, this.dayPattern);
|
|
5815
5852
|
// Format time
|
|
5816
5853
|
// - Format hh
|
|
5817
|
-
var hour =
|
|
5854
|
+
var hour = date.hour();
|
|
5818
5855
|
hour = hour < 10 ? ('0' + hour) : hour;
|
|
5819
5856
|
// - Format mm
|
|
5820
|
-
var minutes =
|
|
5857
|
+
var minutes = date.minutes();
|
|
5821
5858
|
minutes = minutes < 10 ? ('0' + minutes) : minutes;
|
|
5822
5859
|
var timeStr = hour + ":" + minutes;
|
|
5823
5860
|
// Update controls
|
|
5824
|
-
this.
|
|
5825
|
-
this.
|
|
5861
|
+
this.dayControl.patchValue(dayStr, { emitEvent: false });
|
|
5862
|
+
this.hourControl.patchValue(timeStr, { emitEvent: false });
|
|
5826
5863
|
}
|
|
5827
5864
|
this._writing = false;
|
|
5828
5865
|
this.markForCheck();
|
|
@@ -5838,12 +5875,12 @@
|
|
|
5838
5875
|
return; // Skip
|
|
5839
5876
|
this._disabling = true;
|
|
5840
5877
|
if (isDisabled) {
|
|
5841
|
-
this.
|
|
5842
|
-
this.
|
|
5878
|
+
this.dayControl.disable({ emitEvent: false });
|
|
5879
|
+
this.hourControl.disable({ emitEvent: false });
|
|
5843
5880
|
}
|
|
5844
5881
|
else {
|
|
5845
|
-
this.
|
|
5846
|
-
this.
|
|
5882
|
+
this.dayControl.enable({ emitEvent: false });
|
|
5883
|
+
this.hourControl.enable({ emitEvent: false });
|
|
5847
5884
|
}
|
|
5848
5885
|
this._disabling = false;
|
|
5849
5886
|
this.markForCheck();
|
|
@@ -5856,25 +5893,25 @@
|
|
|
5856
5893
|
}
|
|
5857
5894
|
// Convert to usable date, then convert to day pattern (e.g DD/MM/YYYY)
|
|
5858
5895
|
var day = event.value && event.value
|
|
5859
|
-
.locale(this.locale) // set
|
|
5896
|
+
.locale(this.locale) // set locale
|
|
5860
5897
|
.hour(0).minute(0).seconds(0).millisecond(0) // Reset hour
|
|
5861
5898
|
.utc(true);
|
|
5862
5899
|
var dayStr = day && this.dateAdapter.format(day, this.dayPattern) || null;
|
|
5863
5900
|
// Update the day control
|
|
5864
|
-
if (this.
|
|
5901
|
+
if (this.dayControl.value !== dayStr) {
|
|
5865
5902
|
// DEBUG
|
|
5866
5903
|
// console.debug("[mat-date-time] onDatePickerChange() new value:", dayStr);
|
|
5867
|
-
this.
|
|
5904
|
+
this.dayControl.setValue(dayStr, {
|
|
5868
5905
|
emitEvent: true // Will call onFormChange
|
|
5869
5906
|
});
|
|
5870
5907
|
}
|
|
5871
5908
|
};
|
|
5872
5909
|
MatDateTime.prototype.onTimePickerChange = function (timeStr) {
|
|
5873
5910
|
// Update the time control, if need
|
|
5874
|
-
if (this.
|
|
5911
|
+
if (this.hourControl.value !== timeStr) {
|
|
5875
5912
|
// DEBUG
|
|
5876
5913
|
// console.debug("[mat-date-time] onTimePickerChange() new value:", timeStr);
|
|
5877
|
-
this.
|
|
5914
|
+
this.hourControl.setValue(timeStr, {
|
|
5878
5915
|
emitEvent: true // Will call onFormChange
|
|
5879
5916
|
});
|
|
5880
5917
|
}
|
|
@@ -5965,26 +6002,24 @@
|
|
|
5965
6002
|
this.dayPattern = (patterns['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? patterns['COMMON.DATE_PATTERN'] : 'L');
|
|
5966
6003
|
};
|
|
5967
6004
|
MatDateTime.prototype.checkIfTouched = function () {
|
|
5968
|
-
if (this.
|
|
6005
|
+
if (this.dayControl.touched || this.hourControl.touched) {
|
|
5969
6006
|
this._onTouchedCallback();
|
|
5970
6007
|
this.markForCheck();
|
|
5971
6008
|
}
|
|
5972
6009
|
};
|
|
5973
|
-
MatDateTime.prototype.onFormChange = function (
|
|
6010
|
+
MatDateTime.prototype.onFormChange = function () {
|
|
5974
6011
|
if (this._writing)
|
|
5975
6012
|
return; // Skip if call by self
|
|
5976
6013
|
this._writing = true;
|
|
5977
|
-
var dayStr = this.
|
|
5978
|
-
var time = this.
|
|
6014
|
+
var dayStr = this.dayControl.value;
|
|
6015
|
+
var time = this.hourControl.value;
|
|
5979
6016
|
// DEBUG
|
|
5980
6017
|
//console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
|
|
5981
6018
|
var incompleteValue = isNilOrBlank(time) !== isNilOrBlank(dayStr);
|
|
5982
|
-
if (incompleteValue || this.
|
|
6019
|
+
if (incompleteValue || this.dayControl.invalid || this.hourControl.invalid) {
|
|
5983
6020
|
this.formControl.markAsPending({ onlySelf: true });
|
|
5984
|
-
this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.
|
|
6021
|
+
this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.dayControl.errors), this.hourControl.errors));
|
|
5985
6022
|
this.formControl.markAsDirty();
|
|
5986
|
-
// Reset the value
|
|
5987
|
-
//this.emitChange(null);
|
|
5988
6023
|
this._writing = false;
|
|
5989
6024
|
return;
|
|
5990
6025
|
}
|
|
@@ -6036,7 +6071,10 @@
|
|
|
6036
6071
|
var dateStr = toDateISOString(value) || null;
|
|
6037
6072
|
if (this.formControl.value !== dateStr) {
|
|
6038
6073
|
// DEBUG
|
|
6039
|
-
//console.debug('[
|
|
6074
|
+
//console.debug('[mat-date-time] Emit new value: ' + dateStr);
|
|
6075
|
+
// Apply to form control. => Will call writeValue()
|
|
6076
|
+
// NOT NEED, because a formControl should NOT be used by multiple fields
|
|
6077
|
+
//this.formControl.setValue(dateStr, {emitEvent: false});
|
|
6040
6078
|
// Changes comes from inside function: use the callback
|
|
6041
6079
|
this._onChangeCallback(dateStr);
|
|
6042
6080
|
// Check if need to update controls
|
|
@@ -6056,8 +6094,8 @@
|
|
|
6056
6094
|
});
|
|
6057
6095
|
};
|
|
6058
6096
|
MatDateTime.prototype.markAsTouched = function (opts) {
|
|
6059
|
-
this.
|
|
6060
|
-
this.
|
|
6097
|
+
this.dayControl.markAsTouched(opts);
|
|
6098
|
+
this.hourControl.markAsTouched(opts);
|
|
6061
6099
|
this._onTouchedCallback();
|
|
6062
6100
|
this.markForCheck();
|
|
6063
6101
|
};
|
|
@@ -6072,7 +6110,7 @@
|
|
|
6072
6110
|
MatDateTime.decorators = [
|
|
6073
6111
|
{ type: i0.Component, args: [{
|
|
6074
6112
|
selector: 'mat-date-time-field',
|
|
6075
|
-
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]=\"
|
|
6113
|
+
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",
|
|
6076
6114
|
providers: [
|
|
6077
6115
|
DEFAULT_VALUE_ACCESSOR$4,
|
|
6078
6116
|
],
|
|
@@ -6101,6 +6139,7 @@
|
|
|
6101
6139
|
autofocus: [{ type: i0.Input }],
|
|
6102
6140
|
startDate: [{ type: i0.Input }],
|
|
6103
6141
|
clearable: [{ type: i0.Input }],
|
|
6142
|
+
datePickerFilter: [{ type: i0.Input }],
|
|
6104
6143
|
readonly: [{ type: i0.Input }],
|
|
6105
6144
|
tabindex: [{ type: i0.Input }],
|
|
6106
6145
|
datePicker: [{ type: i0.ViewChild, args: ['datePicker',] }],
|
|
@@ -30407,7 +30446,7 @@
|
|
|
30407
30446
|
DateTestPage.decorators = [
|
|
30408
30447
|
{ type: i0.Component, args: [{
|
|
30409
30448
|
selector: 'app-data-test',
|
|
30410
|
-
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"
|
|
30449
|
+
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"
|
|
30411
30450
|
},] }
|
|
30412
30451
|
];
|
|
30413
30452
|
DateTestPage.ctorParameters = function () { return [
|