@sumaris-net/ngx-components 1.15.1 → 1.15.4
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 +85 -59
- 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/material/datetime/material.date.js +45 -21
- 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 +85 -59
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- 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
|
@@ -5414,8 +5414,10 @@
|
|
|
5414
5414
|
this.formControl.setValidators(this.required ? [this.formControl.validator, i1.Validators.required, SharedValidators.validDate] :
|
|
5415
5415
|
[this.formControl.validator, SharedValidators.validDate]);
|
|
5416
5416
|
}
|
|
5417
|
+
// Create the day control
|
|
5417
5418
|
this.dayControl = this.formBuilder.control(null, function () { return _this.formControl.errors; });
|
|
5418
5419
|
// Get patterns to display date
|
|
5420
|
+
this.updatePattern(this.translate.instant('COMMON.DATE_PATTERN'));
|
|
5419
5421
|
this._subscription.add(this.translate.get('COMMON.DATE_PATTERN')
|
|
5420
5422
|
.subscribe(function (pattern) { return _this.updatePattern(pattern); }));
|
|
5421
5423
|
this._subscription.add(this.dayControl.valueChanges
|
|
@@ -5426,6 +5428,9 @@
|
|
|
5426
5428
|
)
|
|
5427
5429
|
.subscribe(function () {
|
|
5428
5430
|
_this.dayControl.updateValueAndValidity({ emitEvent: false });
|
|
5431
|
+
if (_this.formControl.touched && !_this.dayControl.touched) {
|
|
5432
|
+
_this.dayControl.markAsTouched();
|
|
5433
|
+
}
|
|
5429
5434
|
_this.markForCheck();
|
|
5430
5435
|
}));
|
|
5431
5436
|
this.updateTabIndex();
|
|
@@ -5434,14 +5439,15 @@
|
|
|
5434
5439
|
MatDate.prototype.ngOnDestroy = function () {
|
|
5435
5440
|
this._subscription.unsubscribe();
|
|
5436
5441
|
};
|
|
5437
|
-
MatDate.prototype.writeValue = function (
|
|
5442
|
+
MatDate.prototype.writeValue = function (value) {
|
|
5438
5443
|
if (this._writing)
|
|
5439
5444
|
return; // Skip
|
|
5440
5445
|
this._writing = true;
|
|
5441
5446
|
// DEBUG
|
|
5442
|
-
//
|
|
5443
|
-
|
|
5444
|
-
|
|
5447
|
+
//console.debug("[mat-date] writeValue() with:", value);
|
|
5448
|
+
// Convert into date, and clone if necessary
|
|
5449
|
+
var date = momentImported.isMoment(value) ? value.clone() : fromDateISOString(value);
|
|
5450
|
+
if (!date || !date.isValid()) {
|
|
5445
5451
|
this.dayControl.patchValue(null, { emitEvent: false });
|
|
5446
5452
|
if (this.formControl.value) {
|
|
5447
5453
|
this.formControl.patchValue(null, { emitEvent: false });
|
|
@@ -5450,13 +5456,17 @@
|
|
|
5450
5456
|
}
|
|
5451
5457
|
else {
|
|
5452
5458
|
// Format day
|
|
5453
|
-
|
|
5454
|
-
|
|
5455
|
-
|
|
5459
|
+
var day = date && this.timezone
|
|
5460
|
+
// Move to the expected TZ (keeping local hour - e.g. midnight)
|
|
5461
|
+
? date.tz(this.timezone)
|
|
5462
|
+
// Not TZ: important: do a clone
|
|
5463
|
+
: date;
|
|
5456
5464
|
day = day.startOf('day');
|
|
5457
5465
|
var dayStr = this.dateAdapter.format(day, this.dayPattern);
|
|
5458
|
-
|
|
5459
|
-
|
|
5466
|
+
if (this.dayControl.value !== dayStr) {
|
|
5467
|
+
// Update control
|
|
5468
|
+
this.dayControl.patchValue(dayStr, { emitEvent: false });
|
|
5469
|
+
}
|
|
5460
5470
|
}
|
|
5461
5471
|
this._writing = false;
|
|
5462
5472
|
this.markForCheck();
|
|
@@ -5496,7 +5506,7 @@
|
|
|
5496
5506
|
}
|
|
5497
5507
|
if (this.dayControl.value !== dateStr) {
|
|
5498
5508
|
// DEBUG
|
|
5499
|
-
console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
|
|
5509
|
+
//console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
|
|
5500
5510
|
this.dayControl.setValue(dateStr, {
|
|
5501
5511
|
emitEvent: true // Will call onFormChange
|
|
5502
5512
|
});
|
|
@@ -5567,27 +5577,37 @@
|
|
|
5567
5577
|
this.markForCheck();
|
|
5568
5578
|
}
|
|
5569
5579
|
};
|
|
5570
|
-
MatDate.prototype.checkIfTouched = function () {
|
|
5580
|
+
MatDate.prototype.checkIfTouched = function (opts) {
|
|
5571
5581
|
if (this.dayControl.touched) {
|
|
5572
5582
|
this._onTouchedCallback();
|
|
5573
|
-
|
|
5583
|
+
if (!opts || opts.emitEvent !== false) {
|
|
5584
|
+
this.markForCheck();
|
|
5585
|
+
}
|
|
5574
5586
|
}
|
|
5575
5587
|
};
|
|
5576
5588
|
MatDate.prototype.onFormChange = function (dayStr) {
|
|
5577
5589
|
if (this._writing)
|
|
5578
5590
|
return; // Skip if call by self
|
|
5579
5591
|
this._writing = true;
|
|
5592
|
+
if (this.dayControl.invalid) {
|
|
5593
|
+
this.formControl.markAsPending({ onlySelf: true });
|
|
5594
|
+
this.formControl.setErrors(Object.assign(Object.assign({}, this.formControl.errors), this.dayControl.errors));
|
|
5595
|
+
this.formControl.markAsDirty();
|
|
5596
|
+
this._writing = false;
|
|
5597
|
+
return;
|
|
5598
|
+
}
|
|
5580
5599
|
// Make to remove placeholder chars
|
|
5581
5600
|
while (dayStr && dayStr.indexOf(this.placeholderChar) !== -1) {
|
|
5582
5601
|
dayStr = dayStr.replace(this.placeholderChar, '');
|
|
5583
5602
|
}
|
|
5584
5603
|
// Parse day
|
|
5585
|
-
var
|
|
5586
|
-
// Move to the expected TZ
|
|
5587
|
-
|
|
5588
|
-
|
|
5589
|
-
|
|
5590
|
-
|
|
5604
|
+
var dayDate = dayStr && this.dateAdapter.parse(dayStr, this.dayPattern);
|
|
5605
|
+
// Move to the expected TZ, and keep the local hour (= midnight) to have midnight at local time
|
|
5606
|
+
dayDate = dayDate && (this.timezone ? dayDate.tz(this.timezone, true) : dayDate);
|
|
5607
|
+
dayDate = dayDate && dayDate
|
|
5608
|
+
.startOf('day') // Reset hour
|
|
5609
|
+
.utc(); // Convert to UTC (avoid TZ offset in final string)
|
|
5610
|
+
this.emitChange(dayDate);
|
|
5591
5611
|
this._writing = false;
|
|
5592
5612
|
};
|
|
5593
5613
|
MatDate.prototype.waitKeyboardHide = function (waitKeyboardDelay) {
|
|
@@ -5619,7 +5639,10 @@
|
|
|
5619
5639
|
var dateStr = toDateISOString(value) || null;
|
|
5620
5640
|
if (this.formControl.value !== dateStr) {
|
|
5621
5641
|
// DEBUG
|
|
5622
|
-
//console.debug('[
|
|
5642
|
+
//console.debug('[mat-date] Emit new value: ' + dateStr);
|
|
5643
|
+
// Apply to form control. => Will call writeValue()
|
|
5644
|
+
// NOT NEED, because a formControl should NOT be used by multiple fields
|
|
5645
|
+
//this.formControl.setValue(dateStr, {emitEvent: false})
|
|
5623
5646
|
// Changes comes from inside function: use the callback
|
|
5624
5647
|
this._onChangeCallback(dateStr);
|
|
5625
5648
|
// Check if need to update controls
|
|
@@ -5654,7 +5677,7 @@
|
|
|
5654
5677
|
MatDate.decorators = [
|
|
5655
5678
|
{ type: i0.Component, args: [{
|
|
5656
5679
|
selector: 'mat-date-field',
|
|
5657
|
-
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",
|
|
5680
|
+
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",
|
|
5658
5681
|
providers: [
|
|
5659
5682
|
DEFAULT_VALUE_ACCESSOR$5,
|
|
5660
5683
|
],
|
|
@@ -5684,6 +5707,7 @@
|
|
|
5684
5707
|
startDate: [{ type: i0.Input }],
|
|
5685
5708
|
clearable: [{ type: i0.Input }],
|
|
5686
5709
|
timezone: [{ type: i0.Input }],
|
|
5710
|
+
datePickerFilter: [{ type: i0.Input }],
|
|
5687
5711
|
readonly: [{ type: i0.Input }],
|
|
5688
5712
|
tabindex: [{ type: i0.Input }],
|
|
5689
5713
|
datePicker: [{ type: i0.ViewChild, args: ['datePicker',] }],
|
|
@@ -5773,18 +5797,18 @@
|
|
|
5773
5797
|
this.formControl.setValidators(this.required ? [this.formControl.validator, i1.Validators.required, SharedValidators.validDate] :
|
|
5774
5798
|
[this.formControl.validator, SharedValidators.validDate]);
|
|
5775
5799
|
}
|
|
5776
|
-
// Create the
|
|
5777
|
-
this.
|
|
5778
|
-
// Create the
|
|
5800
|
+
// Create the day control
|
|
5801
|
+
this.dayControl = this.formBuilder.control(null, this.required ? i1.Validators.required : null);
|
|
5802
|
+
// Create the hour control
|
|
5779
5803
|
var timeValidator = this.required ?
|
|
5780
5804
|
(this.mobile ? i1.Validators.required : i1.Validators.compose([i1.Validators.required, i1.Validators.pattern(HOUR_REGEXP)])) :
|
|
5781
5805
|
(this.mobile ? null : i1.Validators.pattern(HOUR_REGEXP));
|
|
5782
|
-
this.
|
|
5806
|
+
this.hourControl = this.formBuilder.control(null, timeValidator);
|
|
5783
5807
|
// Get patterns to display date and date+time
|
|
5784
5808
|
this._subscription.add(this.translate.get(['COMMON.DATE_PATTERN', 'COMMON.DATE_TIME_PATTERN'])
|
|
5785
5809
|
.subscribe(function (patterns) { return _this.updatePattern(patterns); }));
|
|
5786
|
-
this._subscription.add(rxjs.merge(this.
|
|
5787
|
-
.subscribe(function (
|
|
5810
|
+
this._subscription.add(rxjs.merge(this.dayControl.valueChanges, this.hourControl.valueChanges)
|
|
5811
|
+
.subscribe(function (_) { return _this.onFormChange(); }));
|
|
5788
5812
|
// Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
|
|
5789
5813
|
this._subscription.add(this.formControl.statusChanges
|
|
5790
5814
|
.pipe(operators.filter(function (_) { return !_this.readonly && !_this._writing && !_this._disabling; }) // Skip
|
|
@@ -5796,32 +5820,32 @@
|
|
|
5796
5820
|
MatDateTime.prototype.ngOnDestroy = function () {
|
|
5797
5821
|
this._subscription.unsubscribe();
|
|
5798
5822
|
};
|
|
5799
|
-
MatDateTime.prototype.writeValue = function (
|
|
5823
|
+
MatDateTime.prototype.writeValue = function (value) {
|
|
5800
5824
|
if (this._writing)
|
|
5801
5825
|
return; // Skip
|
|
5802
5826
|
this._writing = true;
|
|
5803
5827
|
// DEBUG
|
|
5804
|
-
// console.debug("[mat-date-time] writeValue() with:",
|
|
5805
|
-
var
|
|
5806
|
-
if (!
|
|
5807
|
-
this.
|
|
5808
|
-
this.
|
|
5828
|
+
// console.debug("[mat-date-time] writeValue() with:", value);
|
|
5829
|
+
var date = fromDateISOString(value);
|
|
5830
|
+
if (!date || !date.isValid()) {
|
|
5831
|
+
this.dayControl.patchValue(null, { emitEvent: false });
|
|
5832
|
+
this.hourControl.patchValue(null, { emitEvent: false });
|
|
5809
5833
|
}
|
|
5810
5834
|
else {
|
|
5811
5835
|
// Format day
|
|
5812
|
-
var day =
|
|
5836
|
+
var day = date.clone().startOf('day');
|
|
5813
5837
|
var dayStr = this.dateAdapter.format(day, this.dayPattern);
|
|
5814
5838
|
// Format time
|
|
5815
5839
|
// - Format hh
|
|
5816
|
-
var hour =
|
|
5840
|
+
var hour = date.hour();
|
|
5817
5841
|
hour = hour < 10 ? ('0' + hour) : hour;
|
|
5818
5842
|
// - Format mm
|
|
5819
|
-
var minutes =
|
|
5843
|
+
var minutes = date.minutes();
|
|
5820
5844
|
minutes = minutes < 10 ? ('0' + minutes) : minutes;
|
|
5821
5845
|
var timeStr = hour + ":" + minutes;
|
|
5822
5846
|
// Update controls
|
|
5823
|
-
this.
|
|
5824
|
-
this.
|
|
5847
|
+
this.dayControl.patchValue(dayStr, { emitEvent: false });
|
|
5848
|
+
this.hourControl.patchValue(timeStr, { emitEvent: false });
|
|
5825
5849
|
}
|
|
5826
5850
|
this._writing = false;
|
|
5827
5851
|
this.markForCheck();
|
|
@@ -5837,12 +5861,12 @@
|
|
|
5837
5861
|
return; // Skip
|
|
5838
5862
|
this._disabling = true;
|
|
5839
5863
|
if (isDisabled) {
|
|
5840
|
-
this.
|
|
5841
|
-
this.
|
|
5864
|
+
this.dayControl.disable({ emitEvent: false });
|
|
5865
|
+
this.hourControl.disable({ emitEvent: false });
|
|
5842
5866
|
}
|
|
5843
5867
|
else {
|
|
5844
|
-
this.
|
|
5845
|
-
this.
|
|
5868
|
+
this.dayControl.enable({ emitEvent: false });
|
|
5869
|
+
this.hourControl.enable({ emitEvent: false });
|
|
5846
5870
|
}
|
|
5847
5871
|
this._disabling = false;
|
|
5848
5872
|
this.markForCheck();
|
|
@@ -5855,25 +5879,25 @@
|
|
|
5855
5879
|
}
|
|
5856
5880
|
// Convert to usable date, then convert to day pattern (e.g DD/MM/YYYY)
|
|
5857
5881
|
var day = event.value && event.value
|
|
5858
|
-
.locale(this.locale) // set
|
|
5882
|
+
.locale(this.locale) // set locale
|
|
5859
5883
|
.hour(0).minute(0).seconds(0).millisecond(0) // Reset hour
|
|
5860
5884
|
.utc(true);
|
|
5861
5885
|
var dayStr = day && this.dateAdapter.format(day, this.dayPattern) || null;
|
|
5862
5886
|
// Update the day control
|
|
5863
|
-
if (this.
|
|
5887
|
+
if (this.dayControl.value !== dayStr) {
|
|
5864
5888
|
// DEBUG
|
|
5865
5889
|
// console.debug("[mat-date-time] onDatePickerChange() new value:", dayStr);
|
|
5866
|
-
this.
|
|
5890
|
+
this.dayControl.setValue(dayStr, {
|
|
5867
5891
|
emitEvent: true // Will call onFormChange
|
|
5868
5892
|
});
|
|
5869
5893
|
}
|
|
5870
5894
|
};
|
|
5871
5895
|
MatDateTime.prototype.onTimePickerChange = function (timeStr) {
|
|
5872
5896
|
// Update the time control, if need
|
|
5873
|
-
if (this.
|
|
5897
|
+
if (this.hourControl.value !== timeStr) {
|
|
5874
5898
|
// DEBUG
|
|
5875
5899
|
// console.debug("[mat-date-time] onTimePickerChange() new value:", timeStr);
|
|
5876
|
-
this.
|
|
5900
|
+
this.hourControl.setValue(timeStr, {
|
|
5877
5901
|
emitEvent: true // Will call onFormChange
|
|
5878
5902
|
});
|
|
5879
5903
|
}
|
|
@@ -5964,26 +5988,24 @@
|
|
|
5964
5988
|
this.dayPattern = (patterns['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? patterns['COMMON.DATE_PATTERN'] : 'L');
|
|
5965
5989
|
};
|
|
5966
5990
|
MatDateTime.prototype.checkIfTouched = function () {
|
|
5967
|
-
if (this.
|
|
5991
|
+
if (this.dayControl.touched || this.hourControl.touched) {
|
|
5968
5992
|
this._onTouchedCallback();
|
|
5969
5993
|
this.markForCheck();
|
|
5970
5994
|
}
|
|
5971
5995
|
};
|
|
5972
|
-
MatDateTime.prototype.onFormChange = function (
|
|
5996
|
+
MatDateTime.prototype.onFormChange = function () {
|
|
5973
5997
|
if (this._writing)
|
|
5974
5998
|
return; // Skip if call by self
|
|
5975
5999
|
this._writing = true;
|
|
5976
|
-
var dayStr = this.
|
|
5977
|
-
var time = this.
|
|
6000
|
+
var dayStr = this.dayControl.value;
|
|
6001
|
+
var time = this.hourControl.value;
|
|
5978
6002
|
// DEBUG
|
|
5979
6003
|
//console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
|
|
5980
6004
|
var incompleteValue = isNilOrBlank(time) !== isNilOrBlank(dayStr);
|
|
5981
|
-
if (incompleteValue || this.
|
|
6005
|
+
if (incompleteValue || this.dayControl.invalid || this.hourControl.invalid) {
|
|
5982
6006
|
this.formControl.markAsPending({ onlySelf: true });
|
|
5983
|
-
this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.
|
|
6007
|
+
this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.dayControl.errors), this.hourControl.errors));
|
|
5984
6008
|
this.formControl.markAsDirty();
|
|
5985
|
-
// Reset the value
|
|
5986
|
-
//this.emitChange(null);
|
|
5987
6009
|
this._writing = false;
|
|
5988
6010
|
return;
|
|
5989
6011
|
}
|
|
@@ -6035,7 +6057,10 @@
|
|
|
6035
6057
|
var dateStr = toDateISOString(value) || null;
|
|
6036
6058
|
if (this.formControl.value !== dateStr) {
|
|
6037
6059
|
// DEBUG
|
|
6038
|
-
//console.debug('[
|
|
6060
|
+
//console.debug('[mat-date-time] Emit new value: ' + dateStr);
|
|
6061
|
+
// Apply to form control. => Will call writeValue()
|
|
6062
|
+
// NOT NEED, because a formControl should NOT be used by multiple fields
|
|
6063
|
+
//this.formControl.setValue(dateStr, {emitEvent: false});
|
|
6039
6064
|
// Changes comes from inside function: use the callback
|
|
6040
6065
|
this._onChangeCallback(dateStr);
|
|
6041
6066
|
// Check if need to update controls
|
|
@@ -6055,8 +6080,8 @@
|
|
|
6055
6080
|
});
|
|
6056
6081
|
};
|
|
6057
6082
|
MatDateTime.prototype.markAsTouched = function (opts) {
|
|
6058
|
-
this.
|
|
6059
|
-
this.
|
|
6083
|
+
this.dayControl.markAsTouched(opts);
|
|
6084
|
+
this.hourControl.markAsTouched(opts);
|
|
6060
6085
|
this._onTouchedCallback();
|
|
6061
6086
|
this.markForCheck();
|
|
6062
6087
|
};
|
|
@@ -6071,7 +6096,7 @@
|
|
|
6071
6096
|
MatDateTime.decorators = [
|
|
6072
6097
|
{ type: i0.Component, args: [{
|
|
6073
6098
|
selector: 'mat-date-time-field',
|
|
6074
|
-
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]=\"
|
|
6099
|
+
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",
|
|
6075
6100
|
providers: [
|
|
6076
6101
|
DEFAULT_VALUE_ACCESSOR$4,
|
|
6077
6102
|
],
|
|
@@ -6100,6 +6125,7 @@
|
|
|
6100
6125
|
autofocus: [{ type: i0.Input }],
|
|
6101
6126
|
startDate: [{ type: i0.Input }],
|
|
6102
6127
|
clearable: [{ type: i0.Input }],
|
|
6128
|
+
datePickerFilter: [{ type: i0.Input }],
|
|
6103
6129
|
readonly: [{ type: i0.Input }],
|
|
6104
6130
|
tabindex: [{ type: i0.Input }],
|
|
6105
6131
|
datePicker: [{ type: i0.ViewChild, args: ['datePicker',] }],
|
|
@@ -30406,7 +30432,7 @@
|
|
|
30406
30432
|
DateTestPage.decorators = [
|
|
30407
30433
|
{ type: i0.Component, args: [{
|
|
30408
30434
|
selector: 'app-data-test',
|
|
30409
|
-
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"
|
|
30435
|
+
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"
|
|
30410
30436
|
},] }
|
|
30411
30437
|
];
|
|
30412
30438
|
DateTestPage.ctorParameters = function () { return [
|