@sumaris-net/ngx-components 1.6.6 → 1.6.11

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.
Files changed (29) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +130 -116
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +3 -0
  6. package/esm2015/public_api.js +3 -3
  7. package/esm2015/src/app/core/auth/form/form-auth.js +2 -2
  8. package/esm2015/src/app/core/services/model/filter.model.js +1 -1
  9. package/esm2015/src/app/core/services/model/referential.model.js +1 -1
  10. package/esm2015/src/app/core/table/table.class.js +8 -8
  11. package/esm2015/src/app/shared/form/field.component.js +2 -2
  12. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +25 -22
  13. package/esm2015/src/app/shared/material/boolean/material.boolean.js +3 -4
  14. package/esm2015/src/app/shared/material/chips/material.chips.js +21 -9
  15. package/esm2015/src/app/shared/material/datetime/material.date.js +42 -42
  16. package/esm2015/src/app/shared/material/datetime/material.dateshort.js +2 -2
  17. package/esm2015/src/app/shared/material/datetime/material.datetime.js +32 -32
  18. package/esm2015/src/app/shared/material/duration/material.duration.js +2 -2
  19. package/fesm2015/sumaris-net.ngx-components.js +128 -114
  20. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  21. package/package.json +1 -1
  22. package/public_api.d.ts +2 -2
  23. package/src/app/core/services/model/filter.model.d.ts +1 -1
  24. package/src/app/core/services/model/referential.model.d.ts +3 -3
  25. package/src/app/core/table/table.class.d.ts +4 -4
  26. package/src/app/shared/material/boolean/material.boolean.d.ts +0 -1
  27. package/src/app/shared/material/datetime/material.date.d.ts +6 -6
  28. package/src/app/shared/material/datetime/material.datetime.d.ts +11 -11
  29. package/sumaris-net.ngx-components.metadata.json +1 -1
@@ -1,7 +1,7 @@
1
1
  (function (global, factory) {
2
2
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/cdk/table'), require('@angular/cdk/a11y'), require('@angular/cdk/overlay'), require('@angular/cdk/scrolling'), require('@angular/material/core'), require('@angular/material/table'), require('@angular/material/sort'), require('@angular/material/paginator'), require('@angular/material/form-field'), require('@angular/material/input'), require('@angular/material/checkbox'), require('@angular/material/expansion'), require('@angular/material/toolbar'), require('@angular/material/icon'), require('@angular/material/button'), require('@angular/material/menu'), require('@angular/material/select'), require('@angular/material/card'), require('@angular/material/tabs'), require('@angular/material/stepper'), require('@angular/material/list'), require('@angular/material/button-toggle'), require('@angular/material/progress-spinner'), require('@angular/material/progress-bar'), require('@angular/material/radio'), require('@angular/material/badge'), require('@angular/material/slide-toggle'), require('@angular/material/dialog'), require('@angular/material/autocomplete'), require('@angular/forms'), require('rxjs'), require('rxjs/operators'), require('@ngx-translate/core'), require('@ionic/angular'), require('moment'), require('@angular/material-moment-adapter'), require('@ionic-native/keyboard/ngx'), require('angular2-text-mask'), require('ngx-material-timepicker'), require('@angular/material/datepicker'), require('@angular/animations'), require('@angular/material/divider'), require('@angular/material/tooltip'), require('@angular/material/chips'), require('@angular/router'), require('@angular/platform-browser'), require('@angular/common/http'), require('ngx-color-picker'), require('@ionic-native/native-audio/ngx'), require('@ionic-native/vibration/ngx'), require('@ionic-native/audio-management/ngx'), require('@ionic-native/native-audio/ngx/index'), require('@ionic-native/vibration/ngx/index'), require('@ionic-native/audio-management/ngx/index'), require('uuid/v4'), require('@angular/cdk/drag-drop'), require('ngx-markdown'), require('tweetnacl'), require('@ionic/storage'), require('zone.js/dist/zone-error'), require('@ionic-native/splash-screen/ngx'), require('@ionic-native/network/ngx'), require('ionic-cache'), require('ionic-cache/dist/cache.service'), require('@ionic-native/network/ngx/index'), require('@ionic-native/splash-screen/ngx/index'), require('@ionic-native/status-bar/ngx'), require('@angular/cdk/platform'), require('@ionic-native/in-app-browser/ngx'), require('@apollo/client/core'), require('apollo-angular'), require('@apollo/client/link/ws'), require('@apollo/client/utilities'), require('@apollo/client/link/retry'), require('apollo-link-queue'), require('apollo-link-serialize'), require('apollo-link-logger'), require('apollo-angular/http'), require('apollo3-cache-persist'), require('@ionic-native/downloader/ngx'), require('@ionic-native/status-bar/ngx/index'), require('@ionic-native/keyboard/ngx/index'), require('@ionic-native/in-app-browser/ngx/index'), require('@ionic-native/downloader/ngx/index'), require('@e-is/ngx-material-table'), require('@angular/cdk/collections'), require('ngx-jdenticon'), require('tweetnacl-util'), require('scrypt-async'), require('hammerjs')) :
3
3
  typeof define === 'function' && define.amd ? define('@sumaris-net/ngx-components', ['exports', '@angular/core', '@angular/common', '@angular/cdk/table', '@angular/cdk/a11y', '@angular/cdk/overlay', '@angular/cdk/scrolling', '@angular/material/core', '@angular/material/table', '@angular/material/sort', '@angular/material/paginator', '@angular/material/form-field', '@angular/material/input', '@angular/material/checkbox', '@angular/material/expansion', '@angular/material/toolbar', '@angular/material/icon', '@angular/material/button', '@angular/material/menu', '@angular/material/select', '@angular/material/card', '@angular/material/tabs', '@angular/material/stepper', '@angular/material/list', '@angular/material/button-toggle', '@angular/material/progress-spinner', '@angular/material/progress-bar', '@angular/material/radio', '@angular/material/badge', '@angular/material/slide-toggle', '@angular/material/dialog', '@angular/material/autocomplete', '@angular/forms', 'rxjs', 'rxjs/operators', '@ngx-translate/core', '@ionic/angular', 'moment', '@angular/material-moment-adapter', '@ionic-native/keyboard/ngx', 'angular2-text-mask', 'ngx-material-timepicker', '@angular/material/datepicker', '@angular/animations', '@angular/material/divider', '@angular/material/tooltip', '@angular/material/chips', '@angular/router', '@angular/platform-browser', '@angular/common/http', 'ngx-color-picker', '@ionic-native/native-audio/ngx', '@ionic-native/vibration/ngx', '@ionic-native/audio-management/ngx', '@ionic-native/native-audio/ngx/index', '@ionic-native/vibration/ngx/index', '@ionic-native/audio-management/ngx/index', 'uuid/v4', '@angular/cdk/drag-drop', 'ngx-markdown', 'tweetnacl', '@ionic/storage', 'zone.js/dist/zone-error', '@ionic-native/splash-screen/ngx', '@ionic-native/network/ngx', 'ionic-cache', 'ionic-cache/dist/cache.service', '@ionic-native/network/ngx/index', '@ionic-native/splash-screen/ngx/index', '@ionic-native/status-bar/ngx', '@angular/cdk/platform', '@ionic-native/in-app-browser/ngx', '@apollo/client/core', 'apollo-angular', '@apollo/client/link/ws', '@apollo/client/utilities', '@apollo/client/link/retry', 'apollo-link-queue', 'apollo-link-serialize', 'apollo-link-logger', 'apollo-angular/http', 'apollo3-cache-persist', '@ionic-native/downloader/ngx', '@ionic-native/status-bar/ngx/index', '@ionic-native/keyboard/ngx/index', '@ionic-native/in-app-browser/ngx/index', '@ionic-native/downloader/ngx/index', '@e-is/ngx-material-table', '@angular/cdk/collections', 'ngx-jdenticon', 'tweetnacl-util', 'scrypt-async', 'hammerjs'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["sumaris-net"] = global["sumaris-net"] || {}, global["sumaris-net"]["ngx-components"] = {}), global.ng.core, global.ng.common, global.ng.cdk.table, global.ng.cdk.a11y, global.ng.cdk.overlay, global.ng.cdk.scrolling, global.ng.material.core, global.ng.material.table, global.ng.material.sort, global.ng.material.paginator, global.ng.material.formField, global.ng.material.input, global.ng.material.checkbox, global.ng.material.expansion, global.ng.material.toolbar, global.ng.material.icon, global.ng.material.button, global.ng.material.menu, global.ng.material.select, global.ng.material.card, global.ng.material.tabs, global.ng.material.stepper, global.ng.material.list, global.ng.material.buttonToggle, global.ng.material.progressSpinner, global.ng.material.progressBar, global.ng.material.radio, global.ng.material.badge, global.ng.material.slideToggle, global.ng.material.dialog, global.ng.material.autocomplete, global.ng.forms, global.rxjs, global.rxjs.operators, global["ngx-translate"].core, global.ionic.angular, global.moment, global.ng.materialMomentAdapter, global["ionic-native"].keyboard.ngx, global["angular2-text-mask"], global["ngx-material-timepicker"], global.ng.material.datepicker, global.ng.animations, global.ng.material.divider, global.ng.material.tooltip, global.ng.material.chips, global.ng.router, global.ng.platformBrowser, global.ng.common.http, global["ngx-color-picker"], global["ionic-native"]["native-audio"].ngx, global["ionic-native"].vibration.ngx, global["ionic-native"]["audio-management"].ngx, global["ionic-native"]["native-audio"].ngx.index, global["ionic-native"].vibration.ngx.index, global["ionic-native"]["audio-management"].ngx.index, global.uuid.v4, global.ng.cdk.dragDrop, global["ngx-markdown"], global.tweetnacl, global.ionic.storage, null, global["ionic-native"]["splash-screen"].ngx, global["ionic-native"].network.ngx, global["ionic-cache"], global["ionic-cache/dist/cache"].service, global["ionic-native"].network.ngx.index, global["ionic-native"]["splash-screen"].ngx.index, global["ionic-native"]["status-bar"].ngx, global.ng.cdk.platform, global["ionic-native"]["in-app-browser"].ngx, global.apollo.client.core, global["apollo-angular"], global.apollo.client.link.ws, global.apollo.client.utilities, global.apollo.client.link.retry, global["apollo-link-queue"], global["apollo-link-serialize"], global["apollo-link-logger"], global["apollo-angular"].http, global["apollo3-cache-persist"], global.ngx$6, global["ionic-native"]["status-bar"].ngx.index, global["ionic-native"].keyboard.ngx.index, global["ionic-native"]["in-app-browser"].ngx.index, global.i18, global["e-is"]["ngx-material-table"], global.ng.cdk.collections, global["ngx-jdenticon"]));
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["sumaris-net"] = global["sumaris-net"] || {}, global["sumaris-net"]["ngx-components"] = {}), global.ng.core, global.ng.common, global.ng.cdk.table, global.ng.cdk.a11y, global.ng.cdk.overlay, global.ng.cdk.scrolling, global.ng.material.core, global.ng.material.table, global.ng.material.sort, global.ng.material.paginator, global.ng.material.formField, global.ng.material.input, global.ng.material.checkbox, global.ng.material.expansion, global.ng.material.toolbar, global.ng.material.icon, global.ng.material.button, global.ng.material.menu, global.ng.material.select, global.ng.material.card, global.ng.material.tabs, global.ng.material.stepper, global.ng.material.list, global.ng.material.buttonToggle, global.ng.material.progressSpinner, global.ng.material.progressBar, global.ng.material.radio, global.ng.material.badge, global.ng.material.slideToggle, global.ng.material.dialog, global.ng.material.autocomplete, global.ng.forms, global.rxjs, global.rxjs.operators, global["ngx-translate"].core, global.ionic.angular, global.moment, global.ng.materialMomentAdapter, global["ionic-native"].keyboard.ngx, global["angular2-text-mask"], global["ngx-material-timepicker"], global.ng.material.datepicker, global.ng.animations, global.ng.material.divider, global.ng.material.tooltip, global.ng.material.chips, global.ng.router, global.ng.platformBrowser, global.ng.common.http, global["ngx-color-picker"], global["ionic-native"]["native-audio"].ngx, global["ionic-native"].vibration.ngx, global["ionic-native"]["audio-management"].ngx, global["ionic-native"]["native-audio"].ngx.index, global["ionic-native"].vibration.ngx.index, global["ionic-native"]["audio-management"].ngx.index, global.uuid.v4, global.ng.cdk.dragDrop, global["ngx-markdown"], global.tweetnacl, global.ionic.storage, null, global["ionic-native"]["splash-screen"].ngx, global["ionic-native"].network.ngx, global["ionic-cache"], global["ionic-cache/dist/cache"].service, global["ionic-native"].network.ngx.index, global["ionic-native"]["splash-screen"].ngx.index, global["ionic-native"]["status-bar"].ngx, global.ng.cdk.platform, global["ionic-native"]["in-app-browser"].ngx, global.apollo.client.core, global["apollo-angular"], global.apollo.client.link.ws, global.apollo.client.utilities, global.apollo.client.link.retry, global["apollo-link-queue"], global["apollo-link-serialize"], global["apollo-link-logger"], global["apollo-angular"].http, global["apollo3-cache-persist"], global["ionic-native"].downloader.ngx, global["ionic-native"]["status-bar"].ngx.index, global["ionic-native"].keyboard.ngx.index, global["ionic-native"]["in-app-browser"].ngx.index, global["ionic-native"].downloader.ngx.index, global["e-is"]["ngx-material-table"], global.ng.cdk.collections, global["ngx-jdenticon"]));
5
5
  })(this, (function (exports, i0, i1$4, table$1, a11y, overlay, scrolling, i1$3, table, sort$1, paginator, formField, input, checkbox, expansion, toolbar, icon, button, menu, select, card, tabs, stepper, list, buttonToggle, progressSpinner, progressBar, radio, badge, slideToggle, i2, autocomplete, i1, rxjs, operators, i1$2, i1$5, momentImported, i1$1, ngx, angular2TextMask, ngxMaterialTimepicker, datepicker, animations, divider, tooltip, chips, i3, i1$6, i2$1, ngxColorPicker, ngx$2, ngx$3, ngx$1, i2$2, i3$1, i4, uuidv4Imported, dragDrop, ngxMarkdown, tweetnacl, i3$2, zoneError, ngx$5, ngx$4, ionicCache, i6, i9, i10, ngx$7, i2$4, ngx$8, core, i2$3, ws, utilities, retry, QueueLink, SerializingLink, loggerLink, i3$3, apollo3CachePersist, ngx$6, i14, i15, i17, i18, ngxMaterialTable, collections, ngxJdenticon) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -1528,9 +1528,10 @@
1528
1528
  // Filter if not enough character
1529
1529
  operators.filter(function (value) { return value.length >= _this.suggestLengthThreshold; }),
1530
1530
  // Wait a debounce time
1531
- operators.debounceTime(this.debounceTime),
1531
+ operators.debounceTime(this.debounceTime)
1532
1532
  // DEBUG
1533
- operators.tap(function (value) { return console.debug(_this.logPrefix + ' Search text changes:', value); })),
1533
+ //,tap((value) => this.debug && console.debug(this.logPrefix + ' Search text changes:', value))
1534
+ ),
1534
1535
  // Object set: use it (no distinctUntilChanged() pipe need)
1535
1536
  this.formControl.valueChanges
1536
1537
  .pipe(operators.startWith(this.formControl.value), operators.filter(function (value) { return (_this.searchable && isNotNil(value) && typeof value === 'object'); }), operators.tap(function (value) {
@@ -1546,35 +1547,38 @@
1546
1547
  _this.matInputText.nativeElement.value = _this.displayValue;
1547
1548
  }
1548
1549
  }
1549
- }),
1550
+ })
1550
1551
  // DEBUG
1551
- operators.tap(function (value) { return _this.debug && console.debug(_this.logPrefix + ' Received an object value: ', value); })),
1552
+ //,tap(value => this.debug && console.debug(this.logPrefix + ' Received an object value: ', value))
1553
+ ),
1552
1554
  // On dropdown button click (no distinctUntilChanged(), nor debounceTime)
1553
1555
  this.dropButtonClick
1554
1556
  .pipe(operators.filter(function (event) { return _this.searchable && _this.enabled && (!event || !event.defaultPrevented); }), operators.map(function (_) { return _this.showAllOnFocus ? '*' : _this.formControl.value; }),
1555
- // Make enough characters
1557
+ // Make sure there is enough characters
1556
1558
  operators.filter(thresholdFilterFn)),
1557
1559
  // Merge some observables, with a common distinctUntilChanged() pipe, and NO debounceTime
1558
1560
  rxjs.merge(
1559
1561
  // Focus or click => Load all
1560
1562
  rxjs.merge(this.focused, this.clicked)
1561
- .pipe(operators.filter(function (_) { return _this.enabled && _this.searchable; }), operators.map(function (_) { return _this.showAllOnFocus ? '*' : _this.formControl.value; }),
1562
- // DEBUG
1563
- operators.tap(function (value) { return _this.debug && console.debug(_this.logPrefix + ' Received focused or clicked event: ', value); })), rxjs.merge(this.$inputItems, this._$filter)
1564
- .pipe(operators.filter(function (_) { return _this.searchable && _this.enabled; }), operators.map(function (_) { return _this.formControl.value; }),
1563
+ .pipe(operators.filter(function (_) { return _this.enabled && _this.searchable; }), operators.map(function (_) { return _this.showAllOnFocus ? '*' : _this.formControl.value; })
1565
1564
  // DEBUG
1566
- operators.tap(function (value) { return _this.debug && console.debug(_this.logPrefix + ' Received $inputItems or filter event: ', value); })))
1565
+ //,tap(value => this.debug && console.debug(this.logPrefix + ' Received focused or clicked event: ', value))
1566
+ ), rxjs.merge(this.$inputItems, this._$filter)
1567
+ .pipe(operators.filter(function (_) { return _this.searchable && _this.enabled; }), operators.map(function (_) { return _this.formControl.value; })))
1567
1568
  .pipe(
1568
1569
  // Make sure there is enough characters
1569
1570
  operators.filter(thresholdFilterFn),
1570
1571
  // Distinguish changes
1571
1572
  // - do NOT filter if loading, to force update after a blur event
1572
- operators.distinctUntilChanged(function (v1, v2) { return !_this.loading && (v1 === v2 || _this.equals(v1, v2)); })))
1573
+ operators.distinctUntilChanged(function (v1, v2) { return !_this.loading && (v1 === v2 || _this.equals(v1, v2)); })
1574
+ // DEBUG
1575
+ //,tap(value => this.debug && console.debug(this.logPrefix + ' Received update event: ', value))
1576
+ ))
1573
1577
  .pipe(
1574
1578
  // Suggest values
1575
1579
  operators.mergeMap(function (value) { return _this.suggest(value, _this.filter); }),
1576
1580
  // DEBUG
1577
- operators.tap(function (items) { return _this.debug && console.debug(_this.logPrefix + ' Received from suggest: ', items); }),
1581
+ //tap(items => this.debug && console.debug(this.logPrefix + ' Received from suggest: ', items)),
1578
1582
  // Store implicit value (will use it onBlur if not other value selected)
1579
1583
  operators.tap(function (items) { return _this.updateImplicitValue(items); }));
1580
1584
  // Fetch more events
@@ -1607,9 +1611,10 @@
1607
1611
  this._subscription.add(this.blurred
1608
1612
  .pipe(
1609
1613
  // Skip if not searchable
1610
- operators.filter(function (_) { return _this.searchable; }), operators.map(function (_) { return _this.formControl.value; }),
1614
+ operators.filter(function (_) { return _this.searchable; }), operators.map(function (_) { return _this.formControl.value; })
1611
1615
  // DEBUG
1612
- operators.tap(function (value) { return console.debug(_this.logPrefix + ' Received blurred event: ', value); }))
1616
+ //,tap(value => this.debug && console.debug(this.logPrefix + ' Received blurred event: ', value)),
1617
+ )
1613
1618
  .subscribe(function (value) {
1614
1619
  // When leave component without object, use implicit value if :
1615
1620
  // - an explicit value
@@ -1695,7 +1700,7 @@
1695
1700
  };
1696
1701
  MatAutocompleteField.prototype.writeValue = function (value) {
1697
1702
  // DEBUG
1698
- // console.debug(this.logPrefix + ' Writing value: ', value);
1703
+ // if (this.debug) console.debug(this.logPrefix + ' Writing value: ', value);
1699
1704
  if (value !== this.formControl.value) {
1700
1705
  this.formControl.patchValue(value, { emitEvent: false });
1701
1706
  this._onChangeCallback(value);
@@ -1733,18 +1738,16 @@
1733
1738
  event.stopPropagation();
1734
1739
  event.returnValue = false;
1735
1740
  // DEBUG
1736
- if (this.debug)
1737
- console.debug(this.logPrefix + ' Cancelling focus event');
1741
+ //if (this.debug) console.debug(this.logPrefix + ' Cancelling focus event');
1738
1742
  return false;
1739
1743
  }
1740
- if (this.debug)
1741
- console.debug(this.logPrefix + ' Select input content');
1744
+ // DEBUG
1745
+ //if (this.debug) console.debug(this.logPrefix + ' Select input content');
1742
1746
  var hasContent = true; // selectInputContent(event);
1743
1747
  // If combo is empty, or if has content but should force to show panel on focus
1744
1748
  if (!hasContent || this.showPanelOnFocus || this.showAllOnFocus) {
1745
1749
  // DEBUG
1746
- if (this.debug)
1747
- console.debug(this.logPrefix + ' Emit focus event');
1750
+ //if (this.debug) console.debug(this.logPrefix + ' Emit focus event');
1748
1751
  this.focused.emit();
1749
1752
  return true;
1750
1753
  }
@@ -5091,7 +5094,7 @@
5091
5094
  var _this = this;
5092
5095
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
5093
5096
  if (!this.formControl)
5094
- throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-time-field>.');
5097
+ throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-field>.');
5095
5098
  this.required = toBoolean(this.required, this.formControl.validator === i1.Validators.required);
5096
5099
  // Redirect errors from main control, into day sub control
5097
5100
  var $error = new rxjs.BehaviorSubject(null);
@@ -5188,44 +5191,6 @@
5188
5191
  this.markForCheck();
5189
5192
  this._onChangeCallback(dateStr);
5190
5193
  };
5191
- MatDate.prototype.updatePattern = function (pattern) {
5192
- pattern = pattern !== 'COMMON.DATE_PATTERN' ? pattern : 'L';
5193
- if (this.displayPattern !== pattern) {
5194
- this.displayPattern = pattern;
5195
- this.dayPattern = pattern;
5196
- this.markForCheck();
5197
- }
5198
- };
5199
- MatDate.prototype.onFormChange = function (dayValue) {
5200
- if (this.writing)
5201
- return; // Skip if call by self
5202
- this.writing = true;
5203
- // Make to remove placeholder chars
5204
- while (dayValue && dayValue.indexOf(this.placeholderChar) !== -1) {
5205
- dayValue = dayValue.replace(this.placeholderChar, '');
5206
- }
5207
- var date;
5208
- // Parse day string
5209
- date = dayValue && this.dateAdapter.parse(dayValue, this.dayPattern) || null;
5210
- // Reset time
5211
- date = date && date.utc(true).hour(0).minute(0).seconds(0).millisecond(0);
5212
- // update date picker
5213
- this._value = date && this.dateAdapter.parse(date.clone(), DATE_ISO_PATTERN);
5214
- // Get the model value
5215
- var dateStr = date && date.isValid() && this.dateAdapter.format(date, DATE_ISO_PATTERN).replace('+00:00', 'Z') || date;
5216
- //console.debug("[mat-date-time] Setting date: ", dateStr);
5217
- this.formControl.patchValue(dateStr, { emitEvent: false });
5218
- //this.formControl.updateValueAndValidity();
5219
- this.writing = false;
5220
- this.markForCheck();
5221
- this._onChangeCallback(dateStr);
5222
- };
5223
- MatDate.prototype.checkIfTouched = function () {
5224
- if (this.dayControl.touched) {
5225
- this.markForCheck();
5226
- this._onTouchedCallback();
5227
- }
5228
- };
5229
5194
  MatDate.prototype.openDatePickerIfMobile = function (event, datePicker) {
5230
5195
  return __awaiter(this, void 0, void 0, function () {
5231
5196
  return __generator(this, function (_a) {
@@ -5275,7 +5240,45 @@
5275
5240
  }
5276
5241
  });
5277
5242
  };
5278
- /* -- protected method -- */
5243
+ /* -- private method -- */
5244
+ MatDate.prototype.updatePattern = function (pattern) {
5245
+ pattern = pattern !== 'COMMON.DATE_PATTERN' ? pattern : 'L';
5246
+ if (this.displayPattern !== pattern) {
5247
+ this.displayPattern = pattern;
5248
+ this.dayPattern = pattern;
5249
+ this.markForCheck();
5250
+ }
5251
+ };
5252
+ MatDate.prototype.onFormChange = function (dayValue) {
5253
+ if (this.writing)
5254
+ return; // Skip if call by self
5255
+ this.writing = true;
5256
+ // Make to remove placeholder chars
5257
+ while (dayValue && dayValue.indexOf(this.placeholderChar) !== -1) {
5258
+ dayValue = dayValue.replace(this.placeholderChar, '');
5259
+ }
5260
+ var date;
5261
+ // Parse day string
5262
+ date = dayValue && this.dateAdapter.parse(dayValue, this.dayPattern) || null;
5263
+ // Reset time
5264
+ date = date && date.utc(true).hour(0).minute(0).seconds(0).millisecond(0);
5265
+ // update date picker
5266
+ this._value = date && this.dateAdapter.parse(date.clone(), DATE_ISO_PATTERN);
5267
+ // Get the model value
5268
+ var dateStr = date && date.isValid() && this.dateAdapter.format(date, DATE_ISO_PATTERN).replace('+00:00', 'Z') || date;
5269
+ //console.debug("[mat-date-time] Setting date: ", dateStr);
5270
+ this.formControl.patchValue(dateStr, { emitEvent: false });
5271
+ //this.formControl.updateValueAndValidity();
5272
+ this.writing = false;
5273
+ this.markForCheck();
5274
+ this._onChangeCallback(dateStr);
5275
+ };
5276
+ MatDate.prototype.checkIfTouched = function () {
5277
+ if (this.dayControl.touched) {
5278
+ this.markForCheck();
5279
+ this._onTouchedCallback();
5280
+ }
5281
+ };
5279
5282
  MatDate.prototype.waitKeyboardHide = function (waitKeyboardDelay) {
5280
5283
  return __awaiter(this, void 0, void 0, function () {
5281
5284
  return __generator(this, function (_a) {
@@ -5367,13 +5370,13 @@
5367
5370
  };
5368
5371
  var ɵ0$8 = noop$5;
5369
5372
  var MatDateTime = /** @class */ (function () {
5370
- function MatDateTime(platform, dateAdapter, translate, formBuilder, keyboard, cd, formGroupDir) {
5373
+ function MatDateTime(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5371
5374
  this.platform = platform;
5372
5375
  this.dateAdapter = dateAdapter;
5373
5376
  this.translate = translate;
5374
5377
  this.formBuilder = formBuilder;
5375
- this.keyboard = keyboard;
5376
5378
  this.cd = cd;
5379
+ this.keyboard = keyboard;
5377
5380
  this.formGroupDir = formGroupDir;
5378
5381
  this._onChangeCallback = noop$5;
5379
5382
  this._onTouchedCallback = noop$5;
@@ -5426,7 +5429,7 @@
5426
5429
  MatDateTime.prototype.ngOnInit = function () {
5427
5430
  var _this = this;
5428
5431
  this.mobile = isNil(this.mobile) ? this.platform.is('mobile') : this.mobile;
5429
- this.waitHideKeyboardDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
5432
+ this.keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
5430
5433
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
5431
5434
  if (!this.formControl)
5432
5435
  throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-time-field>.');
@@ -5550,10 +5553,6 @@
5550
5553
  this.disabling = false;
5551
5554
  this.markForCheck();
5552
5555
  };
5553
- MatDateTime.prototype.updatePattern = function (patterns) {
5554
- this.displayPattern = (patterns['COMMON.DATE_TIME_PATTERN'] !== 'COMMON.DATE_TIME_PATTERN' ? patterns['COMMON.DATE_TIME_PATTERN'] : 'L LT');
5555
- this.dayPattern = (patterns['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? patterns['COMMON.DATE_PATTERN'] : 'L');
5556
- };
5557
5556
  MatDateTime.prototype.onDatePickerChange = function (event) {
5558
5557
  // Make sure event is valid
5559
5558
  if (!event || (event.value !== null && !momentImported.isMoment(event.value))) {
@@ -5594,7 +5593,7 @@
5594
5593
  return [2 /*return*/];
5595
5594
  this.preventEvent(event);
5596
5595
  // Make sure the keyboard is closed
5597
- return [4 /*yield*/, this.hideKeyboard(false)];
5596
+ return [4 /*yield*/, this.waitKeyboardHide(false)];
5598
5597
  case 1:
5599
5598
  // Make sure the keyboard is closed
5600
5599
  _a.sent();
@@ -5624,7 +5623,7 @@
5624
5623
  return [2 /*return*/];
5625
5624
  this.preventEvent(event);
5626
5625
  // Make sure the keyboard is closed
5627
- return [4 /*yield*/, this.hideKeyboard(true)];
5626
+ return [4 /*yield*/, this.waitKeyboardHide(true)];
5628
5627
  case 1:
5629
5628
  // Make sure the keyboard is closed
5630
5629
  _a.sent();
@@ -5649,12 +5648,6 @@
5649
5648
  event.stopPropagation();
5650
5649
  event.returnValue = false;
5651
5650
  };
5652
- MatDateTime.prototype.checkIfTouched = function () {
5653
- if (this.dateFormControl.touched || this.timeFormControl.touched) {
5654
- this._onTouchedCallback();
5655
- this.markForCheck();
5656
- }
5657
- };
5658
5651
  MatDateTime.prototype.focus = function () {
5659
5652
  var _this = this;
5660
5653
  if (!this.matInputs.length)
@@ -5671,26 +5664,24 @@
5671
5664
  this.markAsTouched();
5672
5665
  this.markAsDirty();
5673
5666
  };
5674
- /* -- protected method -- */
5675
- MatDateTime.prototype.emitChange = function (value) {
5676
- // Get the model value
5677
- var dateStr = toDateISOString(value) || null;
5678
- if (this.formControl.value !== dateStr) {
5679
- // DEBUG
5680
- //console.debug('[matèdate-time] Emit new value: ' + dateStr);
5681
- // Changes comes from inside function: use the callback
5682
- this._onChangeCallback(dateStr);
5683
- // Check if need to update controls
5684
- this.checkIfTouched();
5667
+ /* -- private method -- */
5668
+ MatDateTime.prototype.updatePattern = function (patterns) {
5669
+ this.displayPattern = (patterns['COMMON.DATE_TIME_PATTERN'] !== 'COMMON.DATE_TIME_PATTERN' ? patterns['COMMON.DATE_TIME_PATTERN'] : 'L LT');
5670
+ this.dayPattern = (patterns['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? patterns['COMMON.DATE_PATTERN'] : 'L');
5671
+ };
5672
+ MatDateTime.prototype.checkIfTouched = function () {
5673
+ if (this.dateFormControl.touched || this.timeFormControl.touched) {
5674
+ this._onTouchedCallback();
5675
+ this.markForCheck();
5685
5676
  }
5686
5677
  };
5687
- MatDateTime.prototype.hideKeyboard = function (waitIsHidden) {
5678
+ MatDateTime.prototype.waitKeyboardHide = function (waitKeyboardDelay) {
5688
5679
  return __awaiter(this, void 0, void 0, function () {
5689
5680
  return __generator(this, function (_a) {
5690
5681
  switch (_a.label) {
5691
5682
  case 0:
5692
- if (!this.keyboard.isVisible)
5693
- return [2 /*return*/]; // ok, already hidden
5683
+ if (!this.keyboard || !this.keyboard.isVisible)
5684
+ return [2 /*return*/]; // ok, already hidden (or not accessible)
5694
5685
  // Force keyboard to be hide
5695
5686
  this.keyboard.hide();
5696
5687
  // Wait hide occur
@@ -5698,8 +5689,8 @@
5698
5689
  case 1:
5699
5690
  // Wait hide occur
5700
5691
  _a.sent();
5701
- if (!(this.waitHideKeyboardDelay > 0 && waitIsHidden)) return [3 /*break*/, 3];
5702
- return [4 /*yield*/, sleep(this.waitHideKeyboardDelay)];
5692
+ if (!(this.keyboardHideDelay > 0 && waitKeyboardDelay)) return [3 /*break*/, 3];
5693
+ return [4 /*yield*/, sleep(this.keyboardHideDelay)];
5703
5694
  case 2:
5704
5695
  _a.sent();
5705
5696
  _a.label = 3;
@@ -5708,6 +5699,18 @@
5708
5699
  });
5709
5700
  });
5710
5701
  };
5702
+ MatDateTime.prototype.emitChange = function (value) {
5703
+ // Get the model value
5704
+ var dateStr = toDateISOString(value) || null;
5705
+ if (this.formControl.value !== dateStr) {
5706
+ // DEBUG
5707
+ //console.debug('[matèdate-time] Emit new value: ' + dateStr);
5708
+ // Changes comes from inside function: use the callback
5709
+ this._onChangeCallback(dateStr);
5710
+ // Check if need to update controls
5711
+ this.checkIfTouched();
5712
+ }
5713
+ };
5711
5714
  MatDateTime.prototype.updateTabIndex = function () {
5712
5715
  var _this = this;
5713
5716
  if (isNil(this._tabindex) || this._tabindex === -1)
@@ -5750,8 +5753,8 @@
5750
5753
  { type: i1$3.DateAdapter },
5751
5754
  { type: i1$2.TranslateService },
5752
5755
  { type: i1.FormBuilder },
5753
- { type: ngx.Keyboard },
5754
5756
  { type: i0.ChangeDetectorRef },
5757
+ { type: ngx.Keyboard, decorators: [{ type: i0.Optional }] },
5755
5758
  { type: i1.FormGroupDirective, decorators: [{ type: i0.Optional }] }
5756
5759
  ]; };
5757
5760
  MatDateTime.propDecorators = {
@@ -5831,7 +5834,7 @@
5831
5834
  var _this = this;
5832
5835
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
5833
5836
  if (!this.formControl)
5834
- throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-time-field>.');
5837
+ throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-short-field>.');
5835
5838
  // Redirect errors from main control, into day sub control
5836
5839
  var $error = new rxjs.BehaviorSubject(null);
5837
5840
  this.required = toBoolean(this.required, this.formControl.validator === i1.Validators.required);
@@ -6208,7 +6211,7 @@
6208
6211
  }
6209
6212
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
6210
6213
  if (!this.formControl)
6211
- throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-time-field>.');
6214
+ throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-duration-field>.');
6212
6215
  this.required = toBoolean(this.required, this.formControl.validator === i1.Validators.required);
6213
6216
  // Redirect errors from main control, into day sub control
6214
6217
  var $error = new rxjs.BehaviorSubject(null);
@@ -6605,7 +6608,7 @@
6605
6608
  MatBooleanField.decorators = [
6606
6609
  { type: i0.Component, args: [{
6607
6610
  selector: 'mat-boolean-field',
6608
- template: "<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{(formControl.value == null && 'COMMON.EMPTY_OPTION' || (formControl.value === true && yesLabel) || noLabel) | translate }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<ng-template #writable>\n <ng-container [ngSwitch]=\"style\">\n\n <!-- Radio -->\n <mat-form-field *ngSwitchCase=\"'radio'\"\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-radio {{classList}}\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n <span [hidden]=\"showRadio\">({{yesLabel|translate}}/{{'COMMON.NO'|translate}})</span>\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #fakeInput type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <!-- radio button -->\n <mat-radio-group [hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\">\n <mat-radio-button #yesButton [value]=\"true\">\n <span>{{yesLabel|translate}}</span>\n </mat-radio-button>&nbsp;\n <mat-radio-button #noButton [value]=\"false\">\n <span>{{noLabel|translate}}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Checkbox -->\n <mat-form-field *ngSwitchCase=\"'checkbox'\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{classList}}\">\n <mat-label *ngIf=\"placeholder && !showRadio\">\n {{placeholder}}\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #matInput\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <ion-label>&nbsp;</ion-label>\n\n <!-- checkbox, when compact -->\n <mat-checkbox #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value===undefined\"\n [hidden]=\"!showRadio\"\n [tabindex]=\"tabindex\">\n </mat-checkbox>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Buttons -->\n <mat-form-field *ngSwitchCase=\"'button'\"\n [floatLabel]=\"floatLabel === 'never' ? 'never' : 'always'\"\n class=\"mat-boolean-field mat-boolean-field-button {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput type=\"text\" hidden\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\">\n <div class=\"mat-form-field-buttons\"\n [style.--buttons-col-count]=\"buttonsColCount\"\n *ngIf=\"!formControl.disabled; else disabledLabel\">\n <!-- yes -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === true) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && yesIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{yesLabel|translate}}\n </ion-button>\n\n <!-- No button -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex !== undefined ? (_tabindex + 1) : undefined\"\n (click)=\"writeValue(false, $event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === false) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && noIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{noLabel|translate}}\n </ion-button>\n </div>\n <ng-template #disabledLabel>\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ng-template>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n </ng-container>\n\n <div class=\"cdk-visually-hidden\">\n <div #suffix><ng-content select=\"[matSuffix]\"></ng-content></div>\n </div>\n\n</ng-template>\n\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
6611
+ template: "<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{(formControl.value == null && 'COMMON.EMPTY_OPTION' || (formControl.value === true && yesLabel) || noLabel) | translate }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<ng-template #writable>\n <ng-container [ngSwitch]=\"style\">\n\n <!-- Radio -->\n <mat-form-field *ngSwitchCase=\"'radio'\"\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always': floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-radio {{classList}}\">\n <mat-label *ngIf=\"placeholder && floatLabel!=='never'\">\n {{placeholder}}\n <span [hidden]=\"showRadio\">({{yesLabel|translate}}/{{'COMMON.NO'|translate}})</span>\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #fakeInput type=\"text\" readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <!-- radio button -->\n <mat-radio-group [hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\">\n <mat-radio-button #yesButton [value]=\"true\">\n <span>{{yesLabel|translate}}</span>\n </mat-radio-button>&nbsp;\n <mat-radio-button #noButton [value]=\"false\">\n <span>{{noLabel|translate}}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Checkbox -->\n <mat-form-field *ngSwitchCase=\"'checkbox'\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{classList}}\">\n <mat-label *ngIf=\"placeholder && !showRadio\">\n {{placeholder}}\n </mat-label>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput #matInput\n [formControl]=\"formControl\"\n (focus)=\"_onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\">\n\n <ion-label>&nbsp;</ion-label>\n\n <!-- checkbox, when compact -->\n <mat-checkbox #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value===undefined\"\n [hidden]=\"!showRadio\"\n [tabindex]=\"tabindex\">\n </mat-checkbox>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- Buttons -->\n <mat-form-field *ngSwitchCase=\"'button'\"\n [floatLabel]=\"floatLabel === 'never' ? 'never' : 'always'\"\n class=\"mat-boolean-field mat-boolean-field-button {{classList}}\">\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput type=\"text\" hidden\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\">\n <div class=\"mat-form-field-buttons\"\n [style.--buttons-col-count]=\"buttonsColCount\"\n *ngIf=\"!formControl.disabled; else disabledLabel\">\n <!-- yes -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === true) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && yesIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{yesLabel|translate}}\n </ion-button>\n\n <!-- No button -->\n <ion-button class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex !== undefined ? (_tabindex + 1) : undefined\"\n (click)=\"writeValue(false, $event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value == null ? 'tertiary' : (_value === false) ? 'accent' : 'light'\">\n <ion-icon *ngIf=\"showButtonIcons && noIcon; let icon\" slot=\"start\" [name]=\"icon\"></ion-icon>\n {{noLabel|translate}}\n </ion-button>\n </div>\n <ng-template #disabledLabel>\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ng-template>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n </ng-container>\n\n</ng-template>\n\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
6609
6612
  providers: [
6610
6613
  DEFAULT_VALUE_ACCESSOR$1
6611
6614
  ],
@@ -6643,8 +6646,7 @@
6643
6646
  yesButton: [{ type: i0.ViewChild, args: ['yesButton',] }],
6644
6647
  noButton: [{ type: i0.ViewChild, args: ['noButton',] }],
6645
6648
  checkboxButton: [{ type: i0.ViewChild, args: ['checkboxButton',] }],
6646
- fakeInput: [{ type: i0.ViewChild, args: ['fakeInput',] }],
6647
- suffixDiv: [{ type: i0.ViewChild, args: ['suffix', { static: false },] }]
6649
+ fakeInput: [{ type: i0.ViewChild, args: ['fakeInput',] }]
6648
6650
  };
6649
6651
 
6650
6652
  var SharedMatBooleanModule = /** @class */ (function () {
@@ -7882,7 +7884,7 @@
7882
7884
  // Wait a debounce time
7883
7885
  operators.debounceTime(this.debounceTime)
7884
7886
  // DEBUG
7885
- //tap((value) => console.debug(this.logPrefix + ' Search text changes:', value))
7887
+ //,tap((value) => this.debug && console.debug(this.logPrefix + ' Search text changes:', value))
7886
7888
  ),
7887
7889
  // Object set: use it (no distinctUntilChanged() pipe need)
7888
7890
  this.inputControl.valueChanges
@@ -7898,18 +7900,25 @@
7898
7900
  rxjs.merge(
7899
7901
  // Focus or click => Load all
7900
7902
  rxjs.merge(this.focused, this.clicked)
7901
- .pipe(operators.filter(function (_) { return _this.enabled; }), operators.map(function (_) { return _this.showAllOnFocus ? '*' : _this.inputControl.value; })), rxjs.merge(this.$inputItems, this._$filter)
7903
+ .pipe(operators.filter(function (_) { return _this.enabled; }), operators.map(function (_) { return _this.showAllOnFocus ? '*' : _this.inputControl.value; })
7904
+ // DEBUG
7905
+ //,tap(value => this.debug && console.debug(this.logPrefix + ' Received focused or clicked event: ', value))
7906
+ ), rxjs.merge(this.$inputItems, this._$filter)
7902
7907
  .pipe(operators.filter(function (_) { return _this.enabled; }), operators.map(function (_) { return _this.inputControl.value; })))
7903
7908
  .pipe(
7904
7909
  // Make sure there is enough characters
7905
7910
  operators.filter(thresholdFilterFn),
7906
7911
  // Distinguish changes
7907
- operators.distinctUntilChanged()))
7912
+ // - do NOT filter if loading, to force update after a blur event
7913
+ operators.distinctUntilChanged(function (v1, v2) { return !_this.loading && (v1 === v2 || _this.equals(v1, v2)); })
7914
+ // DEBUG
7915
+ //,tap(value => this.debug && console.debug(this.logPrefix + ' Received update event: ', value))
7916
+ ))
7908
7917
  .pipe(
7909
7918
  // Suggest values
7910
7919
  operators.mergeMap(function (value) { return _this.suggest(value, _this.filter); }),
7911
7920
  // DEBUG
7912
- //tap(items => console.debug(this.logPrefix + ' Received from suggest: ', items)),
7921
+ //tap(items => this.debug && console.debug(this.logPrefix + ' Received from suggest: ', items)),
7913
7922
  // Store implicit value (will use it onBlur if not other value selected)
7914
7923
  operators.tap(function (items) { return _this.updateImplicitValue(items); }));
7915
7924
  // Fetch more events
@@ -7930,7 +7939,10 @@
7930
7939
  .subscribe(function (items) { return _this.$filteredItems.next(items); }));
7931
7940
  // Applying implicit value, on blur
7932
7941
  this._subscription.add(this.blurred
7933
- .pipe(operators.map(function (_) { return _this.formControl.value; }))
7942
+ .pipe(operators.map(function (_) { return _this.formControl.value; })
7943
+ // DEBUG
7944
+ //,tap(value => this.debug && console.debug(this.logPrefix + ' Received blurred event: ', value)),
7945
+ )
7934
7946
  .subscribe(function (value) {
7935
7947
  // When leave component without object, use implicit value if :
7936
7948
  // - an explicit value
@@ -8042,6 +8054,8 @@
8042
8054
  this._reload$.next(value || '*');
8043
8055
  };
8044
8056
  MatChipsField.prototype.writeValue = function (value) {
8057
+ // DEBUG
8058
+ // if (this.debug) console.debug(this.logPrefix + ' Writing value: ', value);
8045
8059
  if (value && !Array.isArray(value)) {
8046
8060
  value = [value];
8047
8061
  }
@@ -8312,9 +8326,9 @@
8312
8326
  showLoadingSpinner: [{ type: i0.Input }],
8313
8327
  chipColor: [{ type: i0.Input }],
8314
8328
  debug: [{ type: i0.Input }],
8315
- clicked: [{ type: i0.Output }],
8316
- blurred: [{ type: i0.Output }],
8317
- focused: [{ type: i0.Output }],
8329
+ clicked: [{ type: i0.Output, args: ['click',] }],
8330
+ blurred: [{ type: i0.Output, args: ['blur',] }],
8331
+ focused: [{ type: i0.Output, args: ['focus',] }],
8318
8332
  dropButtonClick: [{ type: i0.Output }],
8319
8333
  keydownEscape: [{ type: i0.Output, args: ['keydown.escape',] }],
8320
8334
  keyupEnter: [{ type: i0.Output, args: ['keyup.enter',] }],
@@ -9101,7 +9115,7 @@
9101
9115
  AppFormField.decorators = [
9102
9116
  { type: i0.Component, args: [{
9103
9117
  selector: 'app-form-field',
9104
- template: "<ng-container [ngSwitch]=\"type\">\n\n <!-- integer -->\n <mat-form-field *ngSwitchCase=\"'integer'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n <input matInput #matInput\n type=\"number\"\n autocomplete=\"off\"\n [readonly]=\"readonly\"\n [min]=\"definition.minValue\"\n [max]=\"definition.maxValue\"\n pattern=\"-?[0-9]*\"\n step=\"1\"\n [appAutofocus]=\"autofocus\"\n [placeholder]=\"placeholder\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keypress)=\"filterNumberInput($event, false)\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContent($event)\">\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{(compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate:formControl.errors['min'] }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors['max'] }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('pattern')\">\n {{'ERROR.FIELD_NOT_VALID_INTEGER'| translate }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('integer')\">\n {{'ERROR.FIELD_NOT_VALID_INTEGER'| translate }}</mat-error>\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-form-field>\n\n <!-- double -->\n <mat-form-field *ngSwitchCase=\"'double'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n\n <input matInput #matInput\n type=\"number\"\n decimal=\"true\"\n autocomplete=\"off\"\n [min]=\"definition.minValue\"\n [max]=\"definition.maxValue\"\n [appAutofocus]=\"autofocus\"\n [readonly]=\"readonly\"\n [placeholder]=\"placeholder\"\n [step]=\"numberInputStep\"\n (keypress)=\"filterNumberInput($event, true)\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContent($event)\">\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN')| translate:formControl.errors['min'] }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors['max'] }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('maxDecimals')\">\n {{ (compact ? 'ERROR.FIELD_MAXIMUM_DECIMALS_COMPACT' : 'ERROR.FIELD_MAXIMUM_DECIMALS')| translate:{max:\n definition.maximumNumberDecimals} }}</mat-error>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-form-field>\n\n <!-- boolean -->\n <mat-boolean-field *ngSwitchCase=\"'boolean'\" #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [required]=\"required\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [readonly]=\"readonly\">\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-boolean-field>\n\n <!-- date -->\n <mat-date-field *ngSwitchCase=\"'date'\" #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"compact ? ('COMMON.DATE_PLACEHOLDER'|translate): placeholder\"\n [floatLabel]=\"floatLabel\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [autofocus]=\"autofocus\">\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-date-field>\n\n <!-- date time -->\n <mat-date-time-field *ngSwitchCase=\"'dateTime'\"\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"compact ? ('COMMON.DATE_TIME_PLACEHOLDER'|translate): placeholder\"\n [floatLabel]=\"floatLabel\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [autofocus]=\"autofocus\">\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-date-time-field>\n\n <!-- enum -->\n <mat-form-field *ngSwitchCase=\"'enum'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n <mat-select [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\">\n <mat-option *ngFor=\"let item of definition.values\" [value]=\"item.key || item\">{{ (item.value || item) | translate }}</mat-option>\n </mat-select>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-form-field>\n\n <!-- color -->\n <mat-form-field *ngSwitchCase=\"'color'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n\n <ion-icon margin-right name=\"color-fill\" matPrefix></ion-icon>\n\n <input matInput autocomplete=\"off\"\n [appAutofocus]=\"autofocus\"\n [formControl]=\"formControl\"\n [style.color]=\"getColorContrast(formControl.value)\"\n [style.background]=\"formControl.value\"\n [colorPicker]=\"formControl.value\"\n (colorPickerChange)=\"writeValue($event)\"\n [cpSaveClickOutside]=\"true\"\n cpPosition=\"top\"\n cpOutputFormat=\"hex\"\n [cpOKButton]=\"false\"\n [required]=\"required\"/>\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n\n <!-- string -->\n <mat-form-field *ngSwitchCase=\"'string'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n <input matInput #matInput\n autocomplete=\"off\"\n [appAutofocus]=\"autofocus\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContent($event)\"\n (keypress)=\"filterAlphanumericalInput($event)\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\">\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-form-field>\n\n <!-- auto-complete -->\n <mat-autocomplete-field *ngSwitchCase=\"'entity'\"\n [class]=\"classList\"\n [autofocus]=\"autofocus\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [formControl]=\"formControl\"\n [config]=\"definition.autocomplete\"\n [required]=\"required\"\n [displayWith]=\"getDisplayValueFn(definition)\">\n <ng-content select=\"[matPrefix]\"></ng-content>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </mat-autocomplete-field>\n\n <!-- multi auto-complete -->\n <mat-chips-field *ngSwitchCase=\"'entities'\"\n [class]=\"classList\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [formControl]=\"formControl\"\n [config]=\"definition.autocomplete\"\n [required]=\"required\"\n [displayWith]=\"getDisplayValueFn(definition)\">\n <ng-content select=\"[matPrefix]\"></ng-content>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </mat-chips-field>\n\n <!-- other -->\n <div *ngSwitchDefault>\n <mat-error *ngIf=\"type\">Unknown type {{type}} for option {{definition.key}}. Please report this error.</mat-error>\n <mat-error *ngIf=\"!type\">Error on option field. Please check console log for details.</mat-error>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </div>\n\n</ng-container>\n",
9118
+ template: "<ng-container [ngSwitch]=\"type\">\n\n <!-- integer -->\n <mat-form-field *ngSwitchCase=\"'integer'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n <input matInput #matInput\n type=\"number\"\n autocomplete=\"off\"\n [readonly]=\"readonly\"\n [min]=\"definition.minValue\"\n [max]=\"definition.maxValue\"\n pattern=\"-?[0-9]*\"\n step=\"1\"\n [appAutofocus]=\"autofocus\"\n [placeholder]=\"placeholder\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\"\n (keypress)=\"filterNumberInput($event, false)\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContent($event)\">\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{(compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate:formControl.errors['min'] }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors['max'] }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('pattern')\">\n {{'ERROR.FIELD_NOT_VALID_INTEGER'| translate }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('integer')\">\n {{'ERROR.FIELD_NOT_VALID_INTEGER'| translate }}</mat-error>\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-form-field>\n\n <!-- double -->\n <mat-form-field *ngSwitchCase=\"'double'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n\n <input matInput #matInput\n type=\"number\"\n decimal=\"true\"\n autocomplete=\"off\"\n [min]=\"definition.minValue\"\n [max]=\"definition.maxValue\"\n [appAutofocus]=\"autofocus\"\n [readonly]=\"readonly\"\n [placeholder]=\"placeholder\"\n [step]=\"numberInputStep\"\n (keypress)=\"filterNumberInput($event, true)\"\n [formControl]=\"formControl\"\n [required]=\"required\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContent($event)\">\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('min')\">\n {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN')| translate:formControl.errors['min'] }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('max')\">\n {{(compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate:formControl.errors['max'] }}</mat-error>\n <mat-error *ngIf=\"formControl.hasError('maxDecimals')\">\n {{ (compact ? 'ERROR.FIELD_MAXIMUM_DECIMALS_COMPACT' : 'ERROR.FIELD_MAXIMUM_DECIMALS')| translate:{max:\n definition.maximumNumberDecimals} }}</mat-error>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-form-field>\n\n <!-- boolean -->\n <mat-boolean-field *ngSwitchCase=\"'boolean'\" #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [required]=\"required\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [readonly]=\"readonly\">\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-boolean-field>\n\n <!-- date -->\n <mat-date-field *ngSwitchCase=\"'date'\" #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"compact ? ('COMMON.DATE_PLACEHOLDER'|translate): placeholder\"\n [floatLabel]=\"floatLabel\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [autofocus]=\"autofocus\">\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-date-field>\n\n <!-- date time -->\n <mat-date-time-field *ngSwitchCase=\"'dateTime'\" #matInput\n [class]=\"classList\"\n [formControl]=\"formControl\"\n [placeholder]=\"compact ? ('COMMON.DATE_TIME_PLACEHOLDER'|translate): placeholder\"\n [floatLabel]=\"floatLabel\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [compact]=\"compact\"\n [tabindex]=\"tabindex\"\n [autofocus]=\"autofocus\">\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-date-time-field>\n\n <!-- enum -->\n <mat-form-field *ngSwitchCase=\"'enum'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n <mat-select [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\">\n <mat-option *ngFor=\"let item of definition.values\" [value]=\"item.key || item\">{{ (item.value || item) | translate }}</mat-option>\n </mat-select>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-form-field>\n\n <!-- color -->\n <mat-form-field *ngSwitchCase=\"'color'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n\n <ion-icon margin-right name=\"color-fill\" matPrefix></ion-icon>\n\n <input matInput autocomplete=\"off\"\n [appAutofocus]=\"autofocus\"\n [formControl]=\"formControl\"\n [style.color]=\"getColorContrast(formControl.value)\"\n [style.background]=\"formControl.value\"\n [colorPicker]=\"formControl.value\"\n (colorPickerChange)=\"writeValue($event)\"\n [cpSaveClickOutside]=\"true\"\n cpPosition=\"top\"\n cpOutputFormat=\"hex\"\n [cpOKButton]=\"false\"\n [required]=\"required\"/>\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-form-field>\n\n <!-- string -->\n <mat-form-field *ngSwitchCase=\"'string'\" [floatLabel]=\"floatLabel\" [class]=\"classList\">\n <input matInput #matInput\n autocomplete=\"off\"\n [appAutofocus]=\"autofocus\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n [readonly]=\"readonly\"\n [tabIndex]=\"tabindex\"\n (click)=\"selectInputContent($event)\"\n (keypress)=\"filterAlphanumericalInput($event)\"\n (keyup.enter)=\"onKeyupEnter.emit($event)\">\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </mat-form-field>\n\n <!-- auto-complete -->\n <mat-autocomplete-field *ngSwitchCase=\"'entity'\"\n [class]=\"classList\"\n [autofocus]=\"autofocus\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [formControl]=\"formControl\"\n [config]=\"definition.autocomplete\"\n [required]=\"required\"\n [displayWith]=\"getDisplayValueFn(definition)\">\n <ng-content select=\"[matPrefix]\"></ng-content>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </mat-autocomplete-field>\n\n <!-- multi auto-complete -->\n <mat-chips-field *ngSwitchCase=\"'entities'\"\n [class]=\"classList\"\n [placeholder]=\"placeholder\"\n [floatLabel]=\"floatLabel\"\n [formControl]=\"formControl\"\n [config]=\"definition.autocomplete\"\n [required]=\"required\"\n [displayWith]=\"getDisplayValueFn(definition)\">\n <ng-content select=\"[matPrefix]\"></ng-content>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </mat-chips-field>\n\n <!-- other -->\n <div *ngSwitchDefault>\n <mat-error *ngIf=\"type\">Unknown type {{type}} for option {{definition.key}}. Please report this error.</mat-error>\n <mat-error *ngIf=\"!type\">Error on option field. Please check console log for details.</mat-error>\n <div matSuffix>\n <ng-content select=\"[matSuffix]\"></ng-content>\n </div>\n </div>\n\n</ng-container>\n",
9105
9119
  providers: [
9106
9120
  {
9107
9121
  provide: i1.NG_VALUE_ACCESSOR,
@@ -20107,7 +20121,7 @@
20107
20121
  _this.form.get('username').setValidators(i1.Validators.required);
20108
20122
  }
20109
20123
  // Enable/disable registration link
20110
- _this.canRegister = config.getProperty(CORE_CONFIG_OPTIONS.REGISTRATION_ENABLE);
20124
+ _this.canRegister = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.REGISTRATION_ENABLE);
20111
20125
  _this.markForCheck();
20112
20126
  }));
20113
20127
  // For DEV only
@@ -24724,13 +24738,6 @@
24724
24738
  AppTable.prototype.markAsLoaded = function (opts) {
24725
24739
  this.setLoading(false, opts);
24726
24740
  };
24727
- AppTable.prototype.markRowAsDirty = function (row, opts) {
24728
- var _a;
24729
- row = row || this.editedRow;
24730
- if (row)
24731
- (_a = row.validator) === null || _a === void 0 ? void 0 : _a.markAsDirty(opts);
24732
- this.markAsDirty(opts);
24733
- };
24734
24741
  AppTable.prototype.markAsReady = function (opts) {
24735
24742
  if (this.readySubject.value !== true) {
24736
24743
  this.readySubject.next(true);
@@ -26083,6 +26090,13 @@
26083
26090
  AppTable.prototype.equals = function (d1, d2) {
26084
26091
  return EntityUtils.equals(d1, d2, 'id');
26085
26092
  };
26093
+ AppTable.prototype.markRowAsDirty = function (row, opts) {
26094
+ var _a;
26095
+ row = row || this.editedRow;
26096
+ if (row)
26097
+ (_a = row.validator) === null || _a === void 0 ? void 0 : _a.markAsDirty(opts);
26098
+ this.markAsDirty(opts);
26099
+ };
26086
26100
  /* -- private method -- */
26087
26101
  AppTable.prototype.setLoading = function (value, opts) {
26088
26102
  if (this.loadingSubject.value !== value) {