@sumaris-net/ngx-components 1.14.2 → 1.15.1

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.
@@ -1733,7 +1733,7 @@ DateFormatPipe.ctorParameters = () => [
1733
1733
  { type: TranslateService }
1734
1734
  ];
1735
1735
 
1736
- const moment$6 = momentImported;
1736
+ const moment$7 = momentImported;
1737
1737
  class DateDiffDurationPipe {
1738
1738
  constructor(dateAdapter, translate) {
1739
1739
  this.dateAdapter = dateAdapter;
@@ -1749,10 +1749,10 @@ class DateDiffDurationPipe {
1749
1749
  return this.format(startDate, endDate);
1750
1750
  }
1751
1751
  format(startDate, endDate) {
1752
- const duration = moment$6.duration(endDate.diff(startDate));
1752
+ const duration = moment$7.duration(endDate.diff(startDate));
1753
1753
  if (duration.asMinutes() < 0)
1754
1754
  return '';
1755
- const timeDuration = moment$6(0)
1755
+ const timeDuration = moment$7(0)
1756
1756
  .hour(duration.hours())
1757
1757
  .minute(duration.minutes());
1758
1758
  const days = Math.floor(duration.asDays());
@@ -2196,7 +2196,7 @@ FileSizePipe.decorators = [
2196
2196
  { type: Pipe, args: [{ name: 'fileSize' },] }
2197
2197
  ];
2198
2198
 
2199
- const moment$5 = momentImported;
2199
+ const moment$6 = momentImported;
2200
2200
  const tz = momentTZImported;
2201
2201
  const DATE_UNIX_TIMESTAMP = 'X';
2202
2202
  const DATE_UNIX_MS_TIMESTAMP = 'x';
@@ -2225,8 +2225,9 @@ class DateUtils {
2225
2225
  * Same implementation as the Java class Dates.resetTime() (see any SUMARiS like Pod)
2226
2226
  * @param value
2227
2227
  * @param timezone a timezone (see https://momentjs.com/timezone/)
2228
+ * @param keepLocalTime if true, only the timezone (and offset) is updated, keeping the local time same. Consequently, it will now point to a different point in time if the offset has changed.
2228
2229
  */
2229
- static resetTime(value, timezone) {
2230
+ static resetTime(value, timezone, keepLocalTime) {
2230
2231
  if (!value)
2231
2232
  return undefined;
2232
2233
  const date = fromDateISOString(value);
@@ -2235,10 +2236,8 @@ class DateUtils {
2235
2236
  return date.clone().startOf('day');
2236
2237
  }
2237
2238
  // Use timezone
2238
- return moment$5.tz(timezone)
2239
- .set('year', date.get('year'))
2240
- .set('month', date.get('month'))
2241
- .set('day', date.get('day'))
2239
+ return date.clone() // clone the original date
2240
+ .tz(timezone, keepLocalTime)
2242
2241
  .startOf('day');
2243
2242
  }
2244
2243
  }
@@ -2260,32 +2259,32 @@ function fromDateISOString(value) {
2260
2259
  if (!value || isMoment(value))
2261
2260
  return value;
2262
2261
  // Parse the input value, as a ISO date time
2263
- const date = moment$5(value, DATE_ISO_PATTERN);
2262
+ const date = moment$6(value, DATE_ISO_PATTERN);
2264
2263
  if (date.isValid())
2265
2264
  return date;
2266
2265
  // Not valid: trying to convert from unix timestamp
2267
2266
  if (typeof value === 'string') {
2268
2267
  console.warn('Wrong date format - Trying to convert from local time: ' + value);
2269
2268
  if (value.length === 10) {
2270
- return moment$5(value, DATE_UNIX_TIMESTAMP);
2269
+ return moment$6(value, DATE_UNIX_TIMESTAMP);
2271
2270
  }
2272
2271
  else if (value.length === 13) {
2273
- return moment$5(value, DATE_UNIX_MS_TIMESTAMP);
2272
+ return moment$6(value, DATE_UNIX_MS_TIMESTAMP);
2274
2273
  }
2275
2274
  }
2276
2275
  console.warn('Unable to parse date: ' + value);
2277
2276
  return undefined;
2278
2277
  }
2279
2278
  function fromUnixTimestamp(timeInSec) {
2280
- return moment$5(timeInSec, DATE_UNIX_TIMESTAMP);
2279
+ return moment$6(timeInSec, DATE_UNIX_TIMESTAMP);
2281
2280
  }
2282
2281
  function fromUnixMsTimestamp(timeInMs) {
2283
- return moment$5(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2282
+ return moment$6(timeInMs, DATE_UNIX_MS_TIMESTAMP);
2284
2283
  }
2285
2284
  function toDuration(value, unit) {
2286
2285
  if (!value)
2287
2286
  return undefined;
2288
- const duration = moment$5.duration(value, unit);
2287
+ const duration = moment$6.duration(value, unit);
2289
2288
  // fix 990+ ms
2290
2289
  if (duration.milliseconds() >= 990) {
2291
2290
  duration.add(1000 - duration.milliseconds(), 'ms');
@@ -2708,7 +2707,7 @@ NgInitDirective.propDecorators = {
2708
2707
  ngInit: [{ type: Output }]
2709
2708
  };
2710
2709
 
2711
- const moment$4 = momentImported;
2710
+ const moment$5 = momentImported;
2712
2711
  // @dynamic
2713
2712
  class SharedValidators {
2714
2713
  static getDoubleRegexp(maxDecimals) {
@@ -2723,14 +2722,6 @@ class SharedValidators {
2723
2722
  this._REGEXP_CACHE.DOUBLE_BY_MAX_DECIMALS[maxDecimals] = new RegExp(`^[-]?[0-9]+([.,][0-9]{1,${maxDecimals}})?$`);
2724
2723
  return this._REGEXP_CACHE.DOUBLE_BY_MAX_DECIMALS[maxDecimals];
2725
2724
  }
2726
- static validDate(control) {
2727
- const value = control.value;
2728
- const date = !value || moment$4.isMoment(value) ? value : moment$4(control.value, DATE_ISO_PATTERN);
2729
- if (date && (!date.isValid() || date.year() < 1970)) {
2730
- return { validDate: true };
2731
- }
2732
- return null;
2733
- }
2734
2725
  static latitude(control) {
2735
2726
  const value = control.value;
2736
2727
  if (isNotNil(value) && (value < -90 || value > 90)) {
@@ -2795,6 +2786,14 @@ class SharedValidators {
2795
2786
  return null;
2796
2787
  };
2797
2788
  }
2789
+ static validDate(control) {
2790
+ const value = control.value;
2791
+ const date = !value || moment$5.isMoment(value) ? value : moment$5(control.value, DATE_ISO_PATTERN);
2792
+ if (date && (!date.isValid() || date.year() < 1970)) {
2793
+ return { validDate: true };
2794
+ }
2795
+ return null;
2796
+ }
2798
2797
  static dateIsAfter(previousValue, errorParam, granularity) {
2799
2798
  return (control) => {
2800
2799
  const value = fromDateISOString(control.value);
@@ -2805,6 +2804,16 @@ class SharedValidators {
2805
2804
  return null;
2806
2805
  };
2807
2806
  }
2807
+ static dateIsBefore(maxValue, errorParam, granularity) {
2808
+ return (control) => {
2809
+ const value = fromDateISOString(control.value);
2810
+ if (isNotNil(value) && isNotNil(maxValue) && value.isSameOrAfter(maxValue, granularity)) {
2811
+ // Return the error
2812
+ return { dateIsBefore: { maxDate: errorParam } };
2813
+ }
2814
+ return null;
2815
+ };
2816
+ }
2808
2817
  static dateRangeEnd(startDateFieldName, msg) {
2809
2818
  const errorCode = msg ? 'msg' : 'dateRange';
2810
2819
  const error = msg ? { msg } : { dateRange: true };
@@ -2899,6 +2908,7 @@ SharedValidators.I18N_ERROR_KEYS = {
2899
2908
  pubkey: 'ERROR.FIELD_NOT_VALID_PUBKEY',
2900
2909
  validDate: 'ERROR.FIELD_NOT_VALID_DATE',
2901
2910
  dateIsAfter: 'ERROR.FIELD_NOT_VALID_DATE_AFTER',
2911
+ dateIsBefore: 'ERROR.FIELD_NOT_VALID_DATE_BEFORE',
2902
2912
  dateRange: 'ERROR.FIELD_NOT_VALID_DATE_RANGE',
2903
2913
  dateMinDuration: 'ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION',
2904
2914
  dateMaxDuration: 'ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION',
@@ -4739,6 +4749,7 @@ const noop$6 = () => { };
4739
4749
  const ɵ0$9 = noop$6;
4740
4750
  class MatDate {
4741
4751
  constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
4752
+ this.platform = platform;
4742
4753
  this.dateAdapter = dateAdapter;
4743
4754
  this.translate = translate;
4744
4755
  this.formBuilder = formBuilder;
@@ -4748,21 +4759,26 @@ class MatDate {
4748
4759
  this._onChangeCallback = noop$6;
4749
4760
  this._onTouchedCallback = noop$6;
4750
4761
  this._subscription = new Subscription();
4751
- this.writing = true;
4752
- this.disabling = false;
4762
+ this._writing = true;
4763
+ this._disabling = false;
4764
+ this._readonly = false;
4753
4765
  this.dayMask = DAY_MASK$2;
4754
- this.disabled = false;
4755
4766
  this.floatLabel = 'auto';
4756
- this.readonly = false;
4757
4767
  this.compact = false;
4758
4768
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
4759
4769
  this.autofocus = false;
4770
+ this.startDate = null;
4760
4771
  this.clearable = false;
4761
- // Workaround because ion-datetime has issue (do not returned a ISO date)
4762
- this.mobile = platform.is('mobile');
4763
- this.keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
4772
+ this.timezone = null;
4764
4773
  this.locale = (translate.currentLang || translate.defaultLang).substr(0, 2);
4765
4774
  }
4775
+ set readonly(value) {
4776
+ this._readonly = value;
4777
+ this.markForCheck();
4778
+ }
4779
+ get readonly() {
4780
+ return this._readonly;
4781
+ }
4766
4782
  set tabindex(value) {
4767
4783
  if (this._tabindex !== value) {
4768
4784
  this._tabindex = value;
@@ -4773,67 +4789,68 @@ class MatDate {
4773
4789
  return this._tabindex;
4774
4790
  }
4775
4791
  get value() {
4776
- return toDateISOString(this._value);
4792
+ return this.formControl.value;
4777
4793
  }
4778
4794
  ngOnInit() {
4795
+ this.mobile = isNil(this.mobile) ? this.platform.is('mobile') : this.mobile;
4796
+ this._keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
4779
4797
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
4780
4798
  if (!this.formControl)
4781
4799
  throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-field>.');
4782
4800
  this.required = toBoolean(this.required, this.formControl.validator === Validators.required);
4783
- // Redirect errors from main control, into day sub control
4784
- const $error = new BehaviorSubject(null);
4785
- this.dayControl = this.formBuilder.control(null, () => $error.getValue());
4786
- // Add custom 'validDate' validator
4787
- this.formControl.setValidators(this.required ? [Validators.required, SharedValidators.validDate] : SharedValidators.validDate);
4801
+ // Add 'validDate' validator (when existing validator are null or required, to be sure to keep it)
4802
+ if (!this.formControl.validator || this.formControl.validator === Validators.required) {
4803
+ this.formControl.setValidators(this.required ? [Validators.required, SharedValidators.validDate] : SharedValidators.validDate);
4804
+ }
4805
+ else {
4806
+ this.formControl.setValidators(this.required ? [this.formControl.validator, Validators.required, SharedValidators.validDate] :
4807
+ [this.formControl.validator, SharedValidators.validDate]);
4808
+ }
4809
+ this.dayControl = this.formBuilder.control(null, () => this.formControl.errors);
4788
4810
  // Get patterns to display date
4789
- this.updatePattern(this.translate.instant('COMMON.DATE_PATTERN'));
4790
4811
  this._subscription.add(this.translate.get('COMMON.DATE_PATTERN')
4791
4812
  .subscribe((pattern) => this.updatePattern(pattern)));
4792
4813
  this._subscription.add(this.dayControl.valueChanges
4793
4814
  .subscribe((value) => this.onFormChange(value)));
4794
- // Listen status changes outside the component (e.g. when setErrors() is calling on the formControl)
4815
+ // Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
4795
4816
  this._subscription.add(this.formControl.statusChanges
4796
- .pipe(filter(() => !this.readonly && !this.writing && !this.disabling)) // Skip
4797
- .subscribe((status) => {
4798
- if (status === 'INVALID') {
4799
- $error.next(this.formControl.errors);
4800
- }
4801
- else if (status === 'VALID') {
4802
- $error.next(null);
4803
- }
4804
- this.dayControl.updateValueAndValidity({ onlySelf: true, emitEvent: false });
4817
+ .pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
4818
+ )
4819
+ .subscribe(() => {
4820
+ this.dayControl.updateValueAndValidity({ emitEvent: false });
4805
4821
  this.markForCheck();
4806
4822
  }));
4807
4823
  this.updateTabIndex();
4808
- this.writing = false;
4824
+ this._writing = false;
4809
4825
  }
4810
4826
  ngOnDestroy() {
4811
4827
  this._subscription.unsubscribe();
4812
4828
  }
4813
- writeValue(obj) {
4814
- if (this.writing)
4815
- return;
4816
- // console.debug('[mat-date] writeValue:', obj);
4817
- if (isNilOrBlank(obj)) {
4818
- this.writing = true;
4829
+ writeValue(valueStr) {
4830
+ if (this._writing)
4831
+ return; // Skip
4832
+ this._writing = true;
4833
+ // DEBUG
4834
+ // console.debug("[mat-date] writeValue() with:", valueStr);
4835
+ const value = fromDateISOString(valueStr);
4836
+ if (!value || !value.isValid()) {
4819
4837
  this.dayControl.patchValue(null, { emitEvent: false });
4820
- this._value = undefined;
4821
4838
  if (this.formControl.value) {
4822
4839
  this.formControl.patchValue(null, { emitEvent: false });
4823
4840
  this._onChangeCallback(null);
4824
4841
  }
4825
- this.writing = false;
4826
- this.markForCheck();
4827
- return;
4828
4842
  }
4829
- this._value = this.dateAdapter.parse(obj, DATE_ISO_PATTERN);
4830
- if (!this._value) { // invalid date
4831
- return;
4843
+ else {
4844
+ // Format day
4845
+ // Move to the expected TZ (keeping local hour - e.g. midnight)
4846
+ let day = value && this.timezone ? value.clone().tz(this.timezone) : value.clone();
4847
+ // Reset hour
4848
+ day = day.startOf('day');
4849
+ const dayStr = this.dateAdapter.format(day, this.dayPattern);
4850
+ // Update control
4851
+ this.dayControl.patchValue(dayStr, { emitEvent: false });
4832
4852
  }
4833
- this.writing = true;
4834
- // Set form value
4835
- this.dayControl.patchValue(this.dateAdapter.format(this._value.clone().startOf('day'), this.dayPattern), { emitEvent: false });
4836
- this.writing = false;
4853
+ this._writing = false;
4837
4854
  this.markForCheck();
4838
4855
  }
4839
4856
  registerOnChange(fn) {
@@ -4843,37 +4860,39 @@ class MatDate {
4843
4860
  this._onTouchedCallback = fn;
4844
4861
  }
4845
4862
  setDisabledState(isDisabled) {
4846
- if (this.disabling)
4863
+ if (this._disabling)
4847
4864
  return;
4848
- this.disabling = true;
4849
- this.disabled = isDisabled;
4865
+ this._disabling = true;
4850
4866
  if (isDisabled) {
4851
- this.dayControl.disable({ onlySelf: true, emitEvent: false });
4867
+ this.dayControl.disable({ emitEvent: false });
4852
4868
  }
4853
4869
  else {
4854
- this.dayControl.enable({ onlySelf: true, emitEvent: false });
4870
+ this.dayControl.enable({ emitEvent: false });
4855
4871
  }
4856
- this.disabling = false;
4872
+ this._disabling = false;
4857
4873
  this.markForCheck();
4858
4874
  }
4859
4875
  onDatePickerChange(event) {
4860
- if (this.writing || !(event && event.value))
4861
- return; // Skip if call by self
4862
- this.writing = true;
4863
- let date = event.value;
4864
- date = typeof date === 'string' && this.dateAdapter.parse(date, DATE_ISO_PATTERN) || date;
4865
- let day;
4866
- // avoid to have TZ offset
4867
- date = date && date.utc(true).hour(0).minute(0).seconds(0).millisecond(0);
4868
- day = date && date.clone().startOf('day');
4869
- // update day value
4870
- this.dayControl.setValue(date && this.dateAdapter.format(day, this.dayPattern), { emitEvent: false });
4871
- // Get the model value
4872
- const dateStr = date && this.dateAdapter.format(date, DATE_ISO_PATTERN).replace('+00:00', 'Z');
4873
- this.formControl.patchValue(dateStr, { emitEvent: false });
4874
- this.writing = false;
4875
- this.markForCheck();
4876
- this._onChangeCallback(dateStr);
4876
+ // Make sure event is valid
4877
+ if (!event || (event.value !== null && !isMoment(event.value))) {
4878
+ console.warn('Invalid MatDatepicker event. Skipping', event);
4879
+ return; // Skip
4880
+ }
4881
+ let dateStr = null;
4882
+ if (event.value) {
4883
+ let date = event.value
4884
+ .locale(this.locale) // set as time as locale time
4885
+ .minute(0).seconds(0).millisecond(0) // Reset hour
4886
+ .utc(true);
4887
+ dateStr = this.dateAdapter.format(date, this.dayPattern) || null;
4888
+ }
4889
+ if (this.dayControl.value !== dateStr) {
4890
+ // DEBUG
4891
+ console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
4892
+ this.dayControl.setValue(dateStr, {
4893
+ emitEvent: true // Will call onFormChange
4894
+ });
4895
+ }
4877
4896
  }
4878
4897
  openDatePickerIfMobile(event, datePicker) {
4879
4898
  return __awaiter(this, void 0, void 0, function* () {
@@ -4914,6 +4933,13 @@ class MatDate {
4914
4933
  }
4915
4934
  });
4916
4935
  }
4936
+ clear() {
4937
+ this.dayControl.patchValue(null, { emitEvent: false });
4938
+ this.formControl.setValue(null, { emitEvent: false });
4939
+ this._onChangeCallback(null);
4940
+ this.markAsTouched();
4941
+ this.markAsDirty();
4942
+ }
4917
4943
  /* -- private method -- */
4918
4944
  updatePattern(pattern) {
4919
4945
  pattern = pattern !== 'COMMON.DATE_PATTERN' ? pattern : 'L';
@@ -4923,36 +4949,29 @@ class MatDate {
4923
4949
  this.markForCheck();
4924
4950
  }
4925
4951
  }
4926
- onFormChange(dayValue) {
4927
- if (this.writing)
4928
- return; // Skip if call by self
4929
- this.writing = true;
4930
- // Make to remove placeholder chars
4931
- while (dayValue && dayValue.indexOf(this.placeholderChar) !== -1) {
4932
- dayValue = dayValue.replace(this.placeholderChar, '');
4933
- }
4934
- let date;
4935
- // Parse day string
4936
- date = dayValue && this.dateAdapter.parse(dayValue, this.dayPattern) || null;
4937
- // Reset time
4938
- date = date && date.utc(true).hour(0).minute(0).seconds(0).millisecond(0);
4939
- // update date picker
4940
- this._value = date && this.dateAdapter.parse(date.clone(), DATE_ISO_PATTERN);
4941
- // Get the model value
4942
- const dateStr = date && date.isValid() && this.dateAdapter.format(date, DATE_ISO_PATTERN).replace('+00:00', 'Z') || date;
4943
- //console.debug("[mat-date-time] Setting date: ", dateStr);
4944
- this.formControl.patchValue(dateStr, { emitEvent: false });
4945
- //this.formControl.updateValueAndValidity();
4946
- this.writing = false;
4947
- this.markForCheck();
4948
- this._onChangeCallback(dateStr);
4949
- }
4950
4952
  checkIfTouched() {
4951
4953
  if (this.dayControl.touched) {
4952
- this.markForCheck();
4953
4954
  this._onTouchedCallback();
4955
+ this.markForCheck();
4954
4956
  }
4955
4957
  }
4958
+ onFormChange(dayStr) {
4959
+ if (this._writing)
4960
+ return; // Skip if call by self
4961
+ this._writing = true;
4962
+ // Make to remove placeholder chars
4963
+ while (dayStr && dayStr.indexOf(this.placeholderChar) !== -1) {
4964
+ dayStr = dayStr.replace(this.placeholderChar, '');
4965
+ }
4966
+ // Parse day
4967
+ let date = dayStr && this.dateAdapter.parse(dayStr, this.dayPattern);
4968
+ // Move to the expected TZ (keeping local hour - e.g. midnight)
4969
+ date = date && (this.timezone ? date.tz(this.timezone, true) : date);
4970
+ date = date === null || date === void 0 ? void 0 : date.startOf('day').utc(); // Convert local date into utc (avoid TZ offset to be in the final string)
4971
+ // Set model value
4972
+ this.emitChange(date);
4973
+ this._writing = false;
4974
+ }
4956
4975
  waitKeyboardHide(waitKeyboardDelay) {
4957
4976
  return __awaiter(this, void 0, void 0, function* () {
4958
4977
  if (!this.keyboard || !this.keyboard.isVisible)
@@ -4962,11 +4981,23 @@ class MatDate {
4962
4981
  // Wait hide occur
4963
4982
  yield this.keyboard.onKeyboardHide().pipe(first()).toPromise();
4964
4983
  // Wait an additional delay if need (depending on the OS)
4965
- if (this.keyboardHideDelay > 0 && waitKeyboardDelay) {
4966
- yield sleep(this.keyboardHideDelay);
4984
+ if (this._keyboardHideDelay > 0 && waitKeyboardDelay) {
4985
+ yield sleep(this._keyboardHideDelay);
4967
4986
  }
4968
4987
  });
4969
4988
  }
4989
+ emitChange(value) {
4990
+ // Get the model value
4991
+ const dateStr = toDateISOString(value) || null;
4992
+ if (this.formControl.value !== dateStr) {
4993
+ // DEBUG
4994
+ //console.debug('[matèdate-time] Emit new value: ' + dateStr);
4995
+ // Changes comes from inside function: use the callback
4996
+ this._onChangeCallback(dateStr);
4997
+ // Check if need to update controls
4998
+ this.checkIfTouched();
4999
+ }
5000
+ }
4970
5001
  updateTabIndex() {
4971
5002
  if (isNil(this._tabindex) || this._tabindex === -1)
4972
5003
  return; // skip
@@ -4978,6 +5009,14 @@ class MatDate {
4978
5009
  this.markForCheck();
4979
5010
  });
4980
5011
  }
5012
+ markAsTouched(opts) {
5013
+ this.dayControl.markAsTouched(opts);
5014
+ this._onTouchedCallback();
5015
+ this.markForCheck();
5016
+ }
5017
+ markAsDirty(opts) {
5018
+ this.formControl.markAsDirty(opts);
5019
+ }
4981
5020
  markForCheck() {
4982
5021
  this.cd.markForCheck();
4983
5022
  }
@@ -4985,7 +5024,7 @@ class MatDate {
4985
5024
  MatDate.decorators = [
4986
5025
  { type: Component, args: [{
4987
5026
  selector: 'mat-date-field',
4988
- template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly else writable\">\n <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></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 control -->\n <input matInput type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\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)=\"writeValue(null)\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('validDate')\" translate>ERROR.FIELD_NOT_VALID_DATE</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateIsAfter')\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('dateRange')\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMaxDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngIf=\"!formControl.hasError('dateRange') && formControl.hasError('dateMinDuration')\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngIf=\"formControl.hasError('msg')\">{{formControl.errors.msg}}</mat-error>\n </mat-form-field>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\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>\n\n",
5027
+ 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",
4989
5028
  providers: [
4990
5029
  DEFAULT_VALUE_ACCESSOR$5,
4991
5030
  ],
@@ -5003,19 +5042,20 @@ MatDate.ctorParameters = () => [
5003
5042
  { type: FormGroupDirective, decorators: [{ type: Optional }] }
5004
5043
  ];
5005
5044
  MatDate.propDecorators = {
5006
- disabled: [{ type: Input }],
5007
5045
  formControl: [{ type: Input }],
5008
5046
  formControlName: [{ type: Input }],
5009
5047
  placeholder: [{ type: Input }],
5010
5048
  floatLabel: [{ type: Input }],
5011
- readonly: [{ type: Input }],
5012
5049
  required: [{ type: Input }],
5050
+ mobile: [{ type: Input }],
5013
5051
  compact: [{ type: Input }],
5014
5052
  placeholderChar: [{ type: Input }],
5015
5053
  autofocus: [{ type: Input }],
5016
- tabindex: [{ type: Input }],
5017
5054
  startDate: [{ type: Input }],
5018
5055
  clearable: [{ type: Input }],
5056
+ timezone: [{ type: Input }],
5057
+ readonly: [{ type: Input }],
5058
+ tabindex: [{ type: Input }],
5019
5059
  datePicker: [{ type: ViewChild, args: ['datePicker',] }],
5020
5060
  matInputs: [{ type: ViewChildren, args: ['matInput',] }]
5021
5061
  };
@@ -5028,8 +5068,7 @@ const DEFAULT_VALUE_ACCESSOR$4 = {
5028
5068
  const DAY_MASK$1 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
5029
5069
  const HOUR_REGEXP = /^[012][0-9][:][012345][0-9]$/;
5030
5070
  const HOUR_MASK$1 = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5031
- const noop$5 = () => {
5032
- };
5071
+ const noop$5 = () => { };
5033
5072
  const ɵ0$8 = noop$5;
5034
5073
  class MatDateTime {
5035
5074
  constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
@@ -5043,8 +5082,8 @@ class MatDateTime {
5043
5082
  this._onChangeCallback = noop$5;
5044
5083
  this._onTouchedCallback = noop$5;
5045
5084
  this._subscription = new Subscription();
5046
- this.writing = true;
5047
- this.disabling = false;
5085
+ this._writing = true;
5086
+ this._disabling = false;
5048
5087
  this._readonly = false;
5049
5088
  this.dayMask = DAY_MASK$1;
5050
5089
  this.hourMask = HOUR_MASK$1;
@@ -5077,7 +5116,7 @@ class MatDateTime {
5077
5116
  }
5078
5117
  ngOnInit() {
5079
5118
  this.mobile = isNil(this.mobile) ? this.platform.is('mobile') : this.mobile;
5080
- this.keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
5119
+ this._keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
5081
5120
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
5082
5121
  if (!this.formControl)
5083
5122
  throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-time-field>.');
@@ -5104,19 +5143,19 @@ class MatDateTime {
5104
5143
  .subscribe((event) => this.onFormChange(event)));
5105
5144
  // Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
5106
5145
  this._subscription.add(this.formControl.statusChanges
5107
- .pipe(filter((_) => !this.readonly && !this.writing && !this.disabling) // Skip
5146
+ .pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
5108
5147
  )
5109
5148
  .subscribe(() => this.markForCheck()));
5110
5149
  this.updateTabIndex();
5111
- this.writing = false;
5150
+ this._writing = false;
5112
5151
  }
5113
5152
  ngOnDestroy() {
5114
5153
  this._subscription.unsubscribe();
5115
5154
  }
5116
5155
  writeValue(valueStr) {
5117
- if (this.writing)
5156
+ if (this._writing)
5118
5157
  return; // Skip
5119
- this.writing = true;
5158
+ this._writing = true;
5120
5159
  // DEBUG
5121
5160
  // console.debug("[mat-date-time] writeValue() with:", valueStr);
5122
5161
  const value = fromDateISOString(valueStr);
@@ -5125,10 +5164,10 @@ class MatDateTime {
5125
5164
  this.timeFormControl.patchValue(null, { emitEvent: false });
5126
5165
  }
5127
5166
  else {
5128
- // Parse day
5167
+ // Format day
5129
5168
  const day = value.clone().startOf('day');
5130
5169
  const dayStr = this.dateAdapter.format(day, this.dayPattern);
5131
- // Parse time
5170
+ // Format time
5132
5171
  // - Format hh
5133
5172
  let hour = value.hour();
5134
5173
  hour = hour < 10 ? ('0' + hour) : hour;
@@ -5140,46 +5179,9 @@ class MatDateTime {
5140
5179
  this.dateFormControl.patchValue(dayStr, { emitEvent: false });
5141
5180
  this.timeFormControl.patchValue(timeStr, { emitEvent: false });
5142
5181
  }
5143
- this.writing = false;
5182
+ this._writing = false;
5144
5183
  this.markForCheck();
5145
5184
  }
5146
- onFormChange(event) {
5147
- if (this.writing)
5148
- return; // Skip if call by self
5149
- this.writing = true;
5150
- let dayStr = this.dateFormControl.value;
5151
- const time = this.timeFormControl.value;
5152
- // DEBUG
5153
- //console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
5154
- const incompleteValue = isNilOrBlank(time) !== isNilOrBlank(dayStr);
5155
- if (incompleteValue || this.dateFormControl.invalid || this.timeFormControl.invalid) {
5156
- this.formControl.markAsPending({ onlySelf: true });
5157
- this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.dateFormControl.errors), this.timeFormControl.errors));
5158
- this.formControl.markAsDirty();
5159
- // Reset the value
5160
- //this.emitChange(null);
5161
- this.writing = false;
5162
- return;
5163
- }
5164
- // Make to remove placeholder chars
5165
- while (dayStr && dayStr.indexOf(this.placeholderChar) !== -1) {
5166
- dayStr = dayStr.replace(this.placeholderChar, '');
5167
- }
5168
- // Parse day
5169
- const day = dayStr && this.dateAdapter.parse(dayStr, this.dayPattern) || null;
5170
- // Parse time
5171
- const hourParts = (time || '').split(':');
5172
- const hour = parseInt(hourParts[0] || 0);
5173
- const minutes = parseInt(hourParts[1] || 0);
5174
- const dateTime = day && day
5175
- .locale(this.locale) // set as time as locale time
5176
- .hour(hour).minute(minutes) // Set local hour
5177
- .seconds(0).millisecond(0) // Reset seconds/millisecond
5178
- .utc(); // Convert to UTC (avoid TZ offset in final string)
5179
- // Set model value
5180
- this.emitChange(dateTime);
5181
- this.writing = false;
5182
- }
5183
5185
  registerOnChange(fn) {
5184
5186
  this._onChangeCallback = fn;
5185
5187
  }
@@ -5187,9 +5189,9 @@ class MatDateTime {
5187
5189
  this._onTouchedCallback = fn;
5188
5190
  }
5189
5191
  setDisabledState(isDisabled) {
5190
- if (this.disabling)
5192
+ if (this._disabling)
5191
5193
  return; // Skip
5192
- this.disabling = true;
5194
+ this._disabling = true;
5193
5195
  if (isDisabled) {
5194
5196
  this.dateFormControl.disable({ emitEvent: false });
5195
5197
  this.timeFormControl.disable({ emitEvent: false });
@@ -5198,7 +5200,7 @@ class MatDateTime {
5198
5200
  this.dateFormControl.enable({ emitEvent: false });
5199
5201
  this.timeFormControl.enable({ emitEvent: false });
5200
5202
  }
5201
- this.disabling = false;
5203
+ this._disabling = false;
5202
5204
  this.markForCheck();
5203
5205
  }
5204
5206
  onDatePickerChange(event) {
@@ -5304,6 +5306,43 @@ class MatDateTime {
5304
5306
  this.markForCheck();
5305
5307
  }
5306
5308
  }
5309
+ onFormChange(event) {
5310
+ if (this._writing)
5311
+ return; // Skip if call by self
5312
+ this._writing = true;
5313
+ let dayStr = this.dateFormControl.value;
5314
+ const time = this.timeFormControl.value;
5315
+ // DEBUG
5316
+ //console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
5317
+ const incompleteValue = isNilOrBlank(time) !== isNilOrBlank(dayStr);
5318
+ if (incompleteValue || this.dateFormControl.invalid || this.timeFormControl.invalid) {
5319
+ this.formControl.markAsPending({ onlySelf: true });
5320
+ this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.dateFormControl.errors), this.timeFormControl.errors));
5321
+ this.formControl.markAsDirty();
5322
+ // Reset the value
5323
+ //this.emitChange(null);
5324
+ this._writing = false;
5325
+ return;
5326
+ }
5327
+ // Make to remove placeholder chars
5328
+ while (dayStr && dayStr.indexOf(this.placeholderChar) !== -1) {
5329
+ dayStr = dayStr.replace(this.placeholderChar, '');
5330
+ }
5331
+ // Parse day
5332
+ const day = dayStr && this.dateAdapter.parse(dayStr, this.dayPattern) || null;
5333
+ // Parse time
5334
+ const hourParts = (time || '').split(':');
5335
+ const hour = parseInt(hourParts[0] || 0);
5336
+ const minutes = parseInt(hourParts[1] || 0);
5337
+ const dateTime = day && day
5338
+ .locale(this.locale) // set as time as locale time
5339
+ .hour(hour).minute(minutes) // Set local hour
5340
+ .seconds(0).millisecond(0) // Reset seconds/millisecond
5341
+ .utc(); // Convert to UTC (avoid TZ offset in final string)
5342
+ // Set model value
5343
+ this.emitChange(dateTime);
5344
+ this._writing = false;
5345
+ }
5307
5346
  waitKeyboardHide(waitKeyboardDelay) {
5308
5347
  return __awaiter(this, void 0, void 0, function* () {
5309
5348
  if (!this.keyboard || !this.keyboard.isVisible)
@@ -5313,8 +5352,8 @@ class MatDateTime {
5313
5352
  // Wait hide occur
5314
5353
  yield this.keyboard.onKeyboardHide().pipe(first()).toPromise();
5315
5354
  // Wait an additional delay if need (depending on the OS)
5316
- if (this.keyboardHideDelay > 0 && waitKeyboardDelay) {
5317
- yield sleep(this.keyboardHideDelay);
5355
+ if (this._keyboardHideDelay > 0 && waitKeyboardDelay) {
5356
+ yield sleep(this._keyboardHideDelay);
5318
5357
  }
5319
5358
  });
5320
5359
  }
@@ -5341,9 +5380,9 @@ class MatDateTime {
5341
5380
  this.markForCheck();
5342
5381
  });
5343
5382
  }
5344
- markAsTouched() {
5345
- this.dateFormControl.markAsTouched();
5346
- this.timeFormControl.markAsTouched();
5383
+ markAsTouched(opts) {
5384
+ this.dateFormControl.markAsTouched(opts);
5385
+ this.timeFormControl.markAsTouched(opts);
5347
5386
  this._onTouchedCallback();
5348
5387
  this.markForCheck();
5349
5388
  }
@@ -5357,7 +5396,7 @@ class MatDateTime {
5357
5396
  MatDateTime.decorators = [
5358
5397
  { type: Component, args: [{
5359
5398
  selector: 'mat-date-time-field',
5360
- 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]=\"dateFormControl\"\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]=\"dateFormControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\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 #datePickerButton2 (click)=\"openDatePicker($event, datePicker)\" [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=\"'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 && (timeFormControl.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]=\"timeFormControl\"\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]=\"timeFormControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"timeFormControl\"\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",
5399
+ 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]=\"dateFormControl\"\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]=\"dateFormControl\"\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 </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 && (timeFormControl.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]=\"timeFormControl\"\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]=\"timeFormControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"timeFormControl\"\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",
5361
5400
  providers: [
5362
5401
  DEFAULT_VALUE_ACCESSOR$4,
5363
5402
  ],
@@ -10253,7 +10292,7 @@ SelectPeerModal.propDecorators = {
10253
10292
  onRefresh: [{ type: Input }]
10254
10293
  };
10255
10294
 
10256
- const moment$3 = momentImported;
10295
+ const moment$4 = momentImported;
10257
10296
  const SETTINGS_STORAGE_KEY = 'settings';
10258
10297
  const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];
10259
10298
  // fixme: this constant points to static environment
@@ -10496,11 +10535,11 @@ class LocalSettingsService extends StartableService {
10496
10535
  if (!feature) {
10497
10536
  feature = {
10498
10537
  name: featureName.toLowerCase(),
10499
- lastSyncDate: moment$3().toISOString()
10538
+ lastSyncDate: moment$4().toISOString()
10500
10539
  };
10501
10540
  }
10502
10541
  else {
10503
- feature.lastSyncDate = moment$3().toISOString();
10542
+ feature.lastSyncDate = moment$4().toISOString();
10504
10543
  }
10505
10544
  this.saveOfflineFeature(feature);
10506
10545
  }
@@ -10661,7 +10700,7 @@ class LocalSettingsService extends StartableService {
10661
10700
  if (!page || !page.title || !page.path)
10662
10701
  throw Error('Missing required argument \'page\', \'page.path\' or \'page.title\'');
10663
10702
  // Set time
10664
- page.time = page.time || moment$3();
10703
+ page.time = page.time || moment$4();
10665
10704
  // Clean the title (remove <small> tags)
10666
10705
  if (!opts || opts.removeTitleSmallTag !== false) {
10667
10706
  const tagIndex = page.title.indexOf('</small>');
@@ -15488,7 +15527,7 @@ ConfigService.ctorParameters = () => [
15488
15527
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_CONFIG_OPTIONS,] }] }
15489
15528
  ];
15490
15529
 
15491
- const moment$2 = momentImported;
15530
+ const moment$3 = momentImported;
15492
15531
  class PlatformService extends StartableService {
15493
15532
  constructor(platform, cdkPlatform, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, storage, audioProvider, environment, statusBar, keyboard, splashScreen, browser, downloader) {
15494
15533
  super(platform);
@@ -15712,16 +15751,16 @@ class PlatformService extends StartableService {
15712
15751
  }
15713
15752
  // config moment lib
15714
15753
  try {
15715
- moment$2.locale(event.lang);
15754
+ moment$3.locale(event.lang);
15716
15755
  console.debug('[platform] Use locale {' + event.lang + '}');
15717
15756
  }
15718
15757
  // If error, fallback to en
15719
15758
  catch (err) {
15720
- moment$2.locale('en');
15759
+ moment$3.locale('en');
15721
15760
  console.warn('[platform] Unknown local for moment lib. Using default [en]');
15722
15761
  }
15723
15762
  // Config date adapter
15724
- this.dateAdapter.setLocale(moment$2.locale());
15763
+ this.dateAdapter.setLocale(moment$3.locale());
15725
15764
  }
15726
15765
  });
15727
15766
  this.settings.onChange.subscribe(data => {
@@ -25808,13 +25847,13 @@ LatLongTestPage.ctorParameters = () => [
25808
25847
  { type: FormBuilder }
25809
25848
  ];
25810
25849
 
25811
- const moment$1 = momentImported;
25850
+ const moment$2 = momentImported;
25812
25851
  class SwipeTestPage {
25813
25852
  constructor(formBuilder, dateFormatPipe) {
25814
25853
  this.formBuilder = formBuilder;
25815
25854
  this.dateFormatPipe = dateFormatPipe;
25816
25855
  this.$dates = new BehaviorSubject(undefined);
25817
- this._today = moment$1().startOf('day');
25856
+ this._today = moment$2().startOf('day');
25818
25857
  this.form = formBuilder.group({
25819
25858
  empty: [null, Validators.required],
25820
25859
  date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],
@@ -25827,7 +25866,7 @@ class SwipeTestPage {
25827
25866
  ngOnInit() {
25828
25867
  const dates = [];
25829
25868
  for (let d = 0; d < 7; d++) {
25830
- dates[d] = moment$1(this._today).add(d - 3, 'day');
25869
+ dates[d] = moment$2(this._today).add(d - 3, 'day');
25831
25870
  }
25832
25871
  this.$dates.next(dates);
25833
25872
  this.loadData();
@@ -25868,7 +25907,7 @@ SwipeTestPage.ctorParameters = () => [
25868
25907
  { type: DateFormatPipe }
25869
25908
  ];
25870
25909
 
25871
- const moment = momentImported;
25910
+ const moment$1 = momentImported;
25872
25911
  class DateTimeTestPage {
25873
25912
  constructor(platform, formBuilder, cd) {
25874
25913
  this.platform = platform;
@@ -25900,7 +25939,7 @@ class DateTimeTestPage {
25900
25939
  // Load the form with data
25901
25940
  loadData() {
25902
25941
  return __awaiter(this, void 0, void 0, function* () {
25903
- const now = moment();
25942
+ const now = moment$1();
25904
25943
  const data = {
25905
25944
  empty: toDateISOString(now.clone().add(2, 'hours')),
25906
25945
  enable: toDateISOString(now),
@@ -26144,9 +26183,110 @@ NumpadTestPage.ctorParameters = () => [
26144
26183
  { type: FormBuilder }
26145
26184
  ];
26146
26185
 
26186
+ const moment = momentImported;
26187
+ class DateTestPage {
26188
+ constructor(platform, formBuilder, cd) {
26189
+ this.platform = platform;
26190
+ this.formBuilder = formBuilder;
26191
+ this.cd = cd;
26192
+ this.showLogPanel = true;
26193
+ this.logContent = '';
26194
+ this.memoryHide = false;
26195
+ this.memoryMobile = true;
26196
+ this.timezone = 'Indian/Mahe';
26197
+ this.stringify = JSON.stringify;
26198
+ this.form = formBuilder.group({
26199
+ empty: [null, Validators.required],
26200
+ enable: [null, Validators.required],
26201
+ disable: [null, Validators.required],
26202
+ readonly: [null],
26203
+ timezone: [null]
26204
+ }, {
26205
+ validators: SharedFormGroupValidators.dateRange('empty', 'enable')
26206
+ });
26207
+ const disableControl = this.form.get('disable');
26208
+ disableControl.disable();
26209
+ // Copy the 'enable' value, into the disable control
26210
+ this.form.get('enable').valueChanges.subscribe(value => disableControl.setValue(value));
26211
+ const mobile = platform.is('mobile');
26212
+ this.showLogPanel = this.showLogPanel || mobile;
26213
+ }
26214
+ ngOnInit() {
26215
+ setTimeout(() => this.loadData(), 250);
26216
+ }
26217
+ // Load the form with data
26218
+ loadData() {
26219
+ return __awaiter(this, void 0, void 0, function* () {
26220
+ const now = moment();
26221
+ const nowAtMahe = now.clone().tz(this.timezone).startOf('day');
26222
+ const data = {
26223
+ empty: toDateISOString(now.clone().add(2, 'hours')),
26224
+ enable: toDateISOString(now),
26225
+ disable: now.clone(),
26226
+ readonly: now.clone(),
26227
+ timezone: nowAtMahe
26228
+ };
26229
+ this.form.setValue(data);
26230
+ this.log('[test-page] Data loaded: ' + JSON.stringify(data));
26231
+ this.form.get('empty').valueChanges
26232
+ .pipe(debounceTime(300))
26233
+ .subscribe(value => this.log('[test-page] Value n°1: ' + JSON.stringify(value)));
26234
+ this.form.get('enable').valueChanges
26235
+ .pipe(debounceTime(300))
26236
+ .subscribe(value => this.log('[test-page] Value n°2: ' + JSON.stringify(value)));
26237
+ this.form.get('timezone').valueChanges
26238
+ .pipe(debounceTime(300))
26239
+ .subscribe(value => this.log('[test-page] Value with timezone: ' + JSON.stringify(value)));
26240
+ });
26241
+ }
26242
+ doSubmit(event) {
26243
+ this.form.markAllAsTouched();
26244
+ this.log('[test-page] Form content: ' + JSON.stringify(this.form.value));
26245
+ this.log('[test-page] Form status: ' + this.form.status);
26246
+ if (this.form.invalid) {
26247
+ this.log('[test-page] Form errors: ' + JSON.stringify(this.form.errors));
26248
+ // DEBUG
26249
+ AppFormUtils.logFormErrors(this.form);
26250
+ }
26251
+ }
26252
+ log(message) {
26253
+ console.debug(message);
26254
+ if (this.showLogPanel) {
26255
+ this.logContent += message + '<br/>';
26256
+ this.cd.markForCheck();
26257
+ }
26258
+ }
26259
+ clearLogPanel() {
26260
+ this.logContent = '';
26261
+ this.cd.markForCheck();
26262
+ }
26263
+ startMemoryTimer() {
26264
+ this.memoryTimer = setInterval(() => {
26265
+ this.memoryHide = !this.memoryHide;
26266
+ }, 50);
26267
+ }
26268
+ stopMemoryTimer() {
26269
+ clearInterval(this.memoryTimer);
26270
+ this.memoryTimer = null;
26271
+ this.memoryHide = false;
26272
+ }
26273
+ }
26274
+ DateTestPage.decorators = [
26275
+ { type: Component, args: [{
26276
+ selector: 'app-data-test',
26277
+ 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"
26278
+ },] }
26279
+ ];
26280
+ DateTestPage.ctorParameters = () => [
26281
+ { type: Platform },
26282
+ { type: FormBuilder },
26283
+ { type: ChangeDetectorRef }
26284
+ ];
26285
+
26147
26286
  const SHARED_MATERIAL_TESTING_PAGES = [
26148
26287
  { label: 'Shared Material components', divider: true },
26149
26288
  { label: 'Date/Time field', page: '/testing/shared/datetime' },
26289
+ { label: 'Date field', page: '/testing/shared/date' },
26150
26290
  { label: 'Autocomplete field', page: '/testing/shared/autocomplete' },
26151
26291
  { label: 'Lat/Long field', page: '/testing/shared/latlong' },
26152
26292
  { label: 'Numeric pad component', page: '/testing/shared/numpad' },
@@ -26171,6 +26311,11 @@ const routes$4 = [
26171
26311
  pathMatch: 'full',
26172
26312
  component: DateTimeTestPage
26173
26313
  },
26314
+ {
26315
+ path: 'date',
26316
+ pathMatch: 'full',
26317
+ component: DateTestPage
26318
+ },
26174
26319
  {
26175
26320
  path: 'latlong',
26176
26321
  pathMatch: 'full',
@@ -26211,6 +26356,7 @@ MaterialTestingModule.decorators = [
26211
26356
  ],
26212
26357
  declarations: [
26213
26358
  DateTimeTestPage,
26359
+ DateTestPage,
26214
26360
  AutocompleteTestPage,
26215
26361
  LatLongTestPage,
26216
26362
  NumpadTestPage,
@@ -26222,6 +26368,7 @@ MaterialTestingModule.decorators = [
26222
26368
  SharedMaterialModule,
26223
26369
  RouterModule,
26224
26370
  DateTimeTestPage,
26371
+ DateTestPage,
26225
26372
  AutocompleteTestPage,
26226
26373
  LatLongTestPage,
26227
26374
  NumpadTestPage,
@@ -26816,5 +26963,5 @@ CoreTestingModule.decorators = [
26816
26963
  * Generated bundle index. Do not edit.
26817
26964
  */
26818
26965
 
26819
- export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetPipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isControlHasInput, isCordova, isDesktop, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindow, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$b as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppIconComponent as ɵi, NumpadTestPage as ɵj, MatBadgeIconTestPage as ɵk, ToastTestingModule as ɵl, ToastTestingPage as ɵm };
26966
+ export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetPipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isControlHasInput, isCordova, isDesktop, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindow, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$b as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppIconComponent as ɵi, DateTestPage as ɵj, NumpadTestPage as ɵk, MatBadgeIconTestPage as ɵl, ToastTestingModule as ɵm, ToastTestingPage as ɵn };
26820
26967
  //# sourceMappingURL=sumaris-net.ngx-components.js.map