@ecodev/natural 37.1.0 → 40.0.0

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 (46) hide show
  1. package/bundles/ecodev-natural.umd.js +158 -109
  2. package/bundles/ecodev-natural.umd.js.map +1 -1
  3. package/ecodev-natural.metadata.json +1 -1
  4. package/esm2015/lib/classes/abstract-list.js +20 -22
  5. package/esm2015/lib/classes/abstract-navigable-list.js +32 -23
  6. package/esm2015/lib/classes/rxjs.js +13 -2
  7. package/esm2015/lib/classes/validators.js +15 -1
  8. package/esm2015/lib/modules/alert/confirm.component.js +1 -1
  9. package/esm2015/lib/modules/columns-picker/columns-picker.component.js +26 -8
  10. package/esm2015/lib/modules/detail-header/detail-header.component.js +1 -1
  11. package/esm2015/lib/modules/dropdown-components/type-number/type-number.component.js +1 -1
  12. package/esm2015/lib/modules/dropdown-components/type-text/type-text.component.js +1 -1
  13. package/esm2015/lib/modules/file/component/file.component.js +1 -1
  14. package/esm2015/lib/modules/file/file-drop.directive.js +2 -4
  15. package/esm2015/lib/modules/fixed-button/fixed-button.component.js +1 -1
  16. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.js +1 -1
  17. package/esm2015/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.js +1 -1
  18. package/esm2015/lib/modules/icon/icon.component.js +1 -1
  19. package/esm2015/lib/modules/relations/relations.component.js +1 -1
  20. package/esm2015/lib/modules/search/dropdown-container/dropdown-container.component.js +2 -2
  21. package/esm2015/lib/modules/search/dropdown-container/dropdown-ref.js +1 -1
  22. package/esm2015/lib/modules/search/facet-selector/facet-selector.component.js +1 -1
  23. package/esm2015/lib/modules/search/group/group.component.js +1 -1
  24. package/esm2015/lib/modules/search/input/input.component.js +4 -4
  25. package/esm2015/lib/modules/search/search/search.component.js +1 -1
  26. package/esm2015/lib/modules/select/select/select.component.js +1 -1
  27. package/esm2015/lib/modules/select/select-hierarchic/select-hierarchic.component.js +1 -1
  28. package/esm2015/lib/modules/sidenav/sidenav-container/sidenav-container.component.js +3 -3
  29. package/esm2015/lib/modules/sidenav/sidenav-content/sidenav-content.component.js +1 -1
  30. package/esm2015/lib/modules/table-button/table-button.component.js +1 -1
  31. package/fesm2015/ecodev-natural.js +126 -78
  32. package/fesm2015/ecodev-natural.js.map +1 -1
  33. package/lib/classes/abstract-list.d.ts +7 -10
  34. package/lib/classes/abstract-navigable-list.d.ts +4 -2
  35. package/lib/classes/rxjs.d.ts +6 -1
  36. package/lib/classes/validators.d.ts +7 -0
  37. package/lib/modules/columns-picker/columns-picker.component.d.ts +15 -5
  38. package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +1 -2
  39. package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +3 -2
  40. package/package.json +5 -5
  41. package/src/lib/modules/alert/_alert.theme.scss +1 -1
  42. package/src/lib/modules/file/component/_file.theme.scss +1 -1
  43. package/src/lib/modules/icon/_icon.theme.scss +1 -1
  44. package/src/lib/modules/search/dropdown-container/_dropdown-container.theme.scss +1 -1
  45. package/src/lib/modules/sidenav/_sidenav.theme.scss +1 -1
  46. package/src/lib/styles/_table.scss +1 -1
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
2
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/localize/init'), require('@angular/core'), require('rxjs'), require('@angular/forms'), require('@angular/router'), require('lodash-es'), require('@angular/material/dialog'), require('@angular/material/snack-bar'), require('rxjs/operators'), require('@angular/material/table'), require('@angular/cdk/collections'), require('apollo-angular'), require('@apollo/client/core'), require('@angular/material/core'), require('@angular/cdk/platform'), require('@angular/common'), require('@angular/material/button'), require('@angular/material/checkbox'), require('@angular/material/menu'), require('@angular/material/icon'), require('@angular/platform-browser'), require('@angular/material/tooltip'), require('@angular/material/tabs'), require('@angular/material/form-field'), require('@angular/material/input'), require('@angular/material/select'), require('@angular/material/list'), require('@angular/cdk/overlay'), require('@angular/cdk/portal'), require('@angular/cdk/a11y'), require('@angular/animations'), require('@angular/material/datepicker'), require('@angular/cdk/tree'), require('@angular/material/chips'), require('@angular/material/progress-spinner'), require('@angular/material/tree'), require('@angular/material/autocomplete'), require('@angular/cdk/coercion'), require('@angular/flex-layout'), require('@angular/flex-layout/core'), require('@angular/material/paginator'), require('@angular/material/sidenav'), require('ts-md5')) :
3
3
  typeof define === 'function' && define.amd ? define('@ecodev/natural', ['exports', '@angular/localize/init', '@angular/core', 'rxjs', '@angular/forms', '@angular/router', 'lodash-es', '@angular/material/dialog', '@angular/material/snack-bar', 'rxjs/operators', '@angular/material/table', '@angular/cdk/collections', 'apollo-angular', '@apollo/client/core', '@angular/material/core', '@angular/cdk/platform', '@angular/common', '@angular/material/button', '@angular/material/checkbox', '@angular/material/menu', '@angular/material/icon', '@angular/platform-browser', '@angular/material/tooltip', '@angular/material/tabs', '@angular/material/form-field', '@angular/material/input', '@angular/material/select', '@angular/material/list', '@angular/cdk/overlay', '@angular/cdk/portal', '@angular/cdk/a11y', '@angular/animations', '@angular/material/datepicker', '@angular/cdk/tree', '@angular/material/chips', '@angular/material/progress-spinner', '@angular/material/tree', '@angular/material/autocomplete', '@angular/cdk/coercion', '@angular/flex-layout', '@angular/flex-layout/core', '@angular/material/paginator', '@angular/material/sidenav', 'ts-md5'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.ecodev = global.ecodev || {}, global.ecodev.natural = {}), global.ng.localize.init, global.ng.core, global.rxjs, global.ng.forms, global.ng.router, global['lodash-es'], global.ng.material.dialog, global.ng.material.snackBar, global.rxjs.operators, global.ng.material.table, global.ng.cdk.collections, global['apollo-angular'], global.core, global.ng.material.core, global.ng.cdk.platform, global.ng.common, global.ng.material.button, global.ng.material.checkbox, global.ng.material.menu, global.ng.material.icon, global.ng.platformBrowser, global.ng.material.tooltip, global.ng.material.tabs, global.ng.material.formField, global.ng.material.input, global.ng.material.select, global.ng.material.list, global.ng.cdk.overlay, global.ng.cdk.portal, global.ng.cdk.a11y, global.ng.animations, global.ng.material.datepicker, global.ng.cdk.tree, global.ng.material.chips, global.ng.material.progressSpinner, global.ng.material.tree, global.ng.material.autocomplete, global.ng.cdk.coercion, global.ng.flexLayout, global.ng.flexLayout.core, global.ng.material.paginator, global.ng.material.sidenav, global.tsMd5));
5
- }(this, (function (exports, init, i0, rxjs, forms, i1$1, lodashEs, i1, i2, operators, table, collections, i1$2, core, i1$3, i2$1, i1$4, button, checkbox, menu, icon, i2$2, tooltip, tabs, formField, input, select, list, i1$5, portal, a11y, animations, datepicker, tree$1, chips, progressSpinner, tree, autocomplete, coercion, flexLayout, i4, paginator, sidenav, tsMd5) { 'use strict';
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.ecodev = global.ecodev || {}, global.ecodev.natural = {}), global.ng.localize.init, global.ng.core, global.rxjs, global.ng.forms, global.ng.router, global["lodash-es"], global.ng.material.dialog, global.ng.material.snackBar, global.rxjs.operators, global.ng.material.table, global.ng.cdk.collections, global["apollo-angular"], global.core, global.ng.material.core, global.ng.cdk.platform, global.ng.common, global.ng.material.button, global.ng.material.checkbox, global.ng.material.menu, global.ng.material.icon, global.ng.platformBrowser, global.ng.material.tooltip, global.ng.material.tabs, global.ng.material.formField, global.ng.material.input, global.ng.material.select, global.ng.material.list, global.ng.cdk.overlay, global.ng.cdk.portal, global.ng.cdk.a11y, global.ng.animations, global.ng.material.datepicker, global.ng.cdk.tree, global.ng.material.chips, global.ng.material.progressSpinner, global.ng.material.tree, global.ng.material.autocomplete, global.ng.cdk.coercion, global.ng.flexLayout, global.ng.flexLayout.core, global.ng.material.paginator, global.ng.material.sidenav, global.tsMd5));
5
+ })(this, (function (exports, init, i0, rxjs, forms, i1$1, lodashEs, i1, i2, operators, table, collections, i1$2, core, i1$3, i2$1, i1$4, button, checkbox, menu, icon, i2$2, tooltip, tabs, formField, input, select, list, i1$5, portal, a11y, animations, datepicker, tree$1, chips, progressSpinner, tree, autocomplete, coercion, flexLayout, i4, paginator, sidenav, tsMd5) { 'use strict';
6
6
 
7
7
  function _interopNamespace(e) {
8
8
  if (e && e.__esModule) return e;
@@ -13,14 +13,12 @@
13
13
  var d = Object.getOwnPropertyDescriptor(e, k);
14
14
  Object.defineProperty(n, k, d.get ? d : {
15
15
  enumerable: true,
16
- get: function () {
17
- return e[k];
18
- }
16
+ get: function () { return e[k]; }
19
17
  });
20
18
  }
21
19
  });
22
20
  }
23
- n['default'] = e;
21
+ n["default"] = e;
24
22
  return Object.freeze(n);
25
23
  }
26
24
 
@@ -299,7 +297,7 @@
299
297
  ar[i] = from[i];
300
298
  }
301
299
  }
302
- return to.concat(ar || from);
300
+ return to.concat(ar || Array.prototype.slice.call(from));
303
301
  }
304
302
  function __await(v) {
305
303
  return this instanceof __await ? (this.v = v, this) : new __await(v);
@@ -391,7 +389,7 @@
391
389
  NaturalConfirmComponent.decorators = [
392
390
  { type: i0.Component, args: [{
393
391
  template: "<h2 mat-dialog-title>{{ data.title }}</h2>\n<mat-dialog-content\n ><p class=\"mat-body\">{{ data.message }}</p></mat-dialog-content\n>\n<mat-dialog-actions>\n <button [mat-dialog-close]=\"false\" mat-button>{{ data.cancelText }}</button>\n <button [mat-dialog-close]=\"true\" mat-stroked-button cdkFocusInitial>{{ data.confirmText }}</button>\n</mat-dialog-actions>\n",
394
- styles: ["mat-dialog-content{max-width:40em}mat-dialog-actions{display:flex;justify-content:flex-end}mat-dialog-actions>*{margin-left:10px}"]
392
+ styles: ["mat-dialog-content{max-width:40em}mat-dialog-actions{display:flex;justify-content:flex-end}mat-dialog-actions>*{margin-left:10px}\n"]
395
393
  },] }
396
394
  ];
397
395
  NaturalConfirmComponent.ctorParameters = function () { return [
@@ -2386,6 +2384,21 @@
2386
2384
  return rxjs.timer(500).pipe(operators.switchMap(function () { return modelService.count(qvm).pipe(operators.map(function (count) { return (count > 0 ? { duplicateValue: count } : null); })); }));
2387
2385
  };
2388
2386
  }
2387
+ /**
2388
+ * Returns an async validator function that checks that the form control value is available
2389
+ *
2390
+ * Similar to `unique` validator, but allows to use a custom query for when the client does
2391
+ * not have permissions for `modelService.count()`.
2392
+ */
2393
+ function available(getAvailableQuery, excludedId) {
2394
+ if (excludedId === void 0) { excludedId = null; }
2395
+ return function (control) {
2396
+ if (!control.value || !control.dirty) {
2397
+ return rxjs.of(null);
2398
+ }
2399
+ return rxjs.timer(500).pipe(operators.switchMap(function () { return getAvailableQuery(control.value, excludedId).pipe(operators.map(function (isAvailable) { return (isAvailable ? null : { available: true }); })); }));
2400
+ };
2401
+ }
2389
2402
  /**
2390
2403
  * Return all errors recursively for the given Form or control
2391
2404
  */
@@ -3359,7 +3372,7 @@
3359
3372
  * Components inheriting from this class can be used as standalone with input attributes.
3360
3373
  *
3361
3374
  * Usage :
3362
- * <natural-my-listing [forcedVariables]="{filter:...}" [initialColumns]="['col1']" [persistSearch]="false">
3375
+ * <natural-my-listing [forcedVariables]="{filter:...}" [selectedColumns]="['col1']" [persistSearch]="false">
3363
3376
  */
3364
3377
  // @dynamic
3365
3378
  var NaturalAbstractList = /** @class */ (function (_super) {
@@ -3375,7 +3388,7 @@
3375
3388
  /**
3376
3389
  * Columns list after interaction with <natural-columns-picker>
3377
3390
  */
3378
- _this._selectedColumns = [];
3391
+ _this.columnsForTable = [];
3379
3392
  /**
3380
3393
  * The default column selection that automatically happened after <natural-columns-picker> initialization
3381
3394
  */
@@ -3445,11 +3458,14 @@
3445
3458
  /**
3446
3459
  * Persist search and then launch whatever is required to refresh the list
3447
3460
  */
3448
- NaturalAbstractList.prototype.search = function (naturalSearchSelections, navigationExtras) {
3461
+ NaturalAbstractList.prototype.search = function (naturalSearchSelections, navigationExtras, resetPagination) {
3462
+ if (resetPagination === void 0) { resetPagination = true; }
3449
3463
  // Reset page index to restart the pagination (preserve pageSize)
3450
- this.variablesManager.merge('pagination', {
3451
- pagination: lodashEs.pick(this.defaultPagination, ['offset', 'pageIndex']),
3452
- });
3464
+ if (resetPagination) {
3465
+ this.variablesManager.merge('pagination', {
3466
+ pagination: lodashEs.pick(this.defaultPagination, ['offset', 'pageIndex']),
3467
+ });
3468
+ }
3453
3469
  // Persist if activated
3454
3470
  // Two parallel navigations conflict. We first persist the search, then the pagination
3455
3471
  if (this.persistSearch && !this.isPanel) {
@@ -3623,7 +3639,7 @@
3623
3639
  * Uses data provided by router such as:
3624
3640
  *
3625
3641
  * - `route.data.forcedVariables`
3626
- * - `route.data.initialColumns`
3642
+ * - `route.data.selectedColumns`
3627
3643
  */
3628
3644
  NaturalAbstractList.prototype.initFromRoute = function () {
3629
3645
  // Variables
@@ -3631,8 +3647,8 @@
3631
3647
  this.applyForcedVariables(this.route.snapshot.data.forcedVariables);
3632
3648
  }
3633
3649
  // Columns
3634
- if (this.route.snapshot.data.initialColumns) {
3635
- this.initialColumns = this.route.snapshot.data.initialColumns;
3650
+ if (this.route.snapshot.data.selectedColumns) {
3651
+ this.selectedColumns = this.route.snapshot.data.selectedColumns;
3636
3652
  }
3637
3653
  };
3638
3654
  NaturalAbstractList.prototype.getDataObservable = function () {
@@ -3658,6 +3674,11 @@
3658
3674
  if (sorting) {
3659
3675
  this.variablesManager.set('sorting', { sorting: sorting });
3660
3676
  }
3677
+ // Columns
3678
+ var persistedColumns = this.persistenceService.get('col', this.route, storageKey);
3679
+ if (typeof persistedColumns === 'string') {
3680
+ this.selectedColumns = persistedColumns.split(',');
3681
+ }
3661
3682
  // Natural search : ns
3662
3683
  this.naturalSearchSelections = fromUrl(this.persistenceService.get('ns', this.route, storageKey));
3663
3684
  this.translateSearchAndRefreshList(this.naturalSearchSelections, true);
@@ -3715,34 +3736,21 @@
3715
3736
  this.variablesManager.set('sorting', { sorting: variables.sorting });
3716
3737
  }
3717
3738
  };
3718
- Object.defineProperty(NaturalAbstractList.prototype, "selectedColumns", {
3719
- get: function () {
3720
- return this._selectedColumns;
3721
- },
3722
- set: function (columns) {
3723
- this._selectedColumns = columns;
3724
- if (!this.persistSearch || this.isPanel) {
3725
- return;
3726
- }
3727
- // The first selection we receive is the default one made by <natural-columns-picker>
3728
- if (!this.defaultSelectedColumns) {
3729
- this.defaultSelectedColumns = columns;
3730
- // Now that we know the defaults, we can try to reload from persistence
3731
- var storageKey = this.getStorageKey();
3732
- var persistedColumns = this.persistenceService.get('col', this.route, storageKey);
3733
- if (typeof persistedColumns === 'string') {
3734
- this.selectedColumns = persistedColumns.split(',');
3735
- }
3736
- }
3737
- else {
3738
- // Persist only if wanted columns are different from default selection
3739
- var value = lodashEs.isEqual(this.defaultSelectedColumns, columns) ? null : columns.join(',');
3740
- this.persistenceService.persist('col', value, this.route, this.getStorageKey());
3741
- }
3742
- },
3743
- enumerable: false,
3744
- configurable: true
3745
- });
3739
+ NaturalAbstractList.prototype.selectColumns = function (columns) {
3740
+ this.columnsForTable = columns;
3741
+ if (!this.persistSearch || this.isPanel) {
3742
+ return;
3743
+ }
3744
+ // The first selection we receive is the default one made by <natural-columns-picker>
3745
+ if (!this.defaultSelectedColumns) {
3746
+ this.defaultSelectedColumns = columns;
3747
+ }
3748
+ else {
3749
+ // Persist only if wanted columns are different from default selection
3750
+ var value = lodashEs.isEqual(this.defaultSelectedColumns, columns) ? null : columns.join(',');
3751
+ this.persistenceService.persist('col', value, this.route, this.getStorageKey());
3752
+ }
3753
+ };
3746
3754
  return NaturalAbstractList;
3747
3755
  }(NaturalAbstractPanel));
3748
3756
  NaturalAbstractList.decorators = [
@@ -3754,7 +3762,7 @@
3754
3762
  ]; };
3755
3763
  NaturalAbstractList.propDecorators = {
3756
3764
  persistSearch: [{ type: i0.Input }],
3757
- initialColumns: [{ type: i0.Input }],
3765
+ selectedColumns: [{ type: i0.Input }],
3758
3766
  forcedVariables: [{ type: i0.Input }]
3759
3767
  };
3760
3768
  var templateObject_1$6, templateObject_2$1, templateObject_3$1, templateObject_4$1;
@@ -3773,6 +3781,7 @@
3773
3781
  * Name of filter for child items to access ancestor item
3774
3782
  */
3775
3783
  _this.ancestorRelationName = 'parent';
3784
+ _this.oldAncertorId = null;
3776
3785
  _this.breadcrumbs = [];
3777
3786
  return _this;
3778
3787
  }
@@ -3783,27 +3792,30 @@
3783
3792
  // "na" is a trailing param, and should be considered only when there is no search
3784
3793
  this.route.params.subscribe(function (params) {
3785
3794
  // "ns" stands for natural-search to be shorter in url
3786
- if (!params['ns']) {
3787
- var navigationConditionValue = null;
3788
- // "na" stands for "navigation" (relation) in url
3789
- if (params['na']) {
3790
- navigationConditionValue = { have: { values: [params['na']] } };
3791
- _this.service.getOne(params['na']).subscribe(
3792
- // TODO casting should disappear and instead this class should enforce
3793
- // the service to support Tone with a new generic
3794
- function (ancestor) { return (_this.breadcrumbs = _this.getBreadcrumb(ancestor)); });
3795
- _this.clearSearch();
3796
- }
3797
- else {
3798
- navigationConditionValue = { empty: {} };
3799
- _this.breadcrumbs = [];
3800
- }
3801
- var condition = {};
3802
- condition[_this.ancestorRelationName] = navigationConditionValue;
3803
- var variables = { filter: { groups: [{ conditions: [condition] }] } };
3804
- // todo : check why without "as Vall" it errors. Vall is supposed to be QueryVariables, and filter too.
3805
- _this.variablesManager.set('navigation', variables);
3795
+ if (params['ns']) {
3796
+ return;
3797
+ }
3798
+ var navigationConditionValue = null;
3799
+ // "na" stands for "navigation" (relation) in url
3800
+ if (params['na']) {
3801
+ navigationConditionValue = { have: { values: [params['na']] } };
3802
+ _this.service.getOne(params['na']).subscribe(
3803
+ // TODO casting should disappear and instead this class should enforce
3804
+ // the service to support Tone with a new generic
3805
+ function (ancestor) { return (_this.breadcrumbs = _this.getBreadcrumb(ancestor)); });
3806
+ var hasAncestorChanged = params['na'] !== _this.oldAncertorId;
3807
+ _this.oldAncertorId = params['na'];
3808
+ _this.clearSearch(hasAncestorChanged);
3806
3809
  }
3810
+ else {
3811
+ navigationConditionValue = { empty: {} };
3812
+ _this.breadcrumbs = [];
3813
+ }
3814
+ var condition = {};
3815
+ condition[_this.ancestorRelationName] = navigationConditionValue;
3816
+ var variables = { filter: { groups: [{ conditions: [condition] }] } };
3817
+ // todo : check why without "as Vall" it errors. Vall is supposed to be QueryVariables, and filter too.
3818
+ _this.variablesManager.set('navigation', variables);
3807
3819
  });
3808
3820
  _super.prototype.ngOnInit.call(this);
3809
3821
  };
@@ -3836,11 +3848,19 @@
3836
3848
  }
3837
3849
  _super.prototype.translateSearchAndRefreshList.call(this, naturalSearchSelections);
3838
3850
  };
3839
- NaturalAbstractNavigableList.prototype.clearSearch = function () {
3851
+ NaturalAbstractNavigableList.prototype.clearSearch = function (resetPagination) {
3852
+ if (resetPagination === void 0) { resetPagination = true; }
3840
3853
  this.naturalSearchSelections = [[]];
3841
- this.search([[]]);
3854
+ _super.prototype.search.call(this, [[]], undefined, resetPagination);
3842
3855
  this.persistenceService.persistInStorage('ns', null, this.getStorageKey());
3843
3856
  };
3857
+ NaturalAbstractNavigableList.prototype.search = function (naturalSearchSelections, navigationExtras, resetPagination) {
3858
+ var _this = this;
3859
+ if (resetPagination === void 0) { resetPagination = true; }
3860
+ this.persistenceService.persistInUrl('na', null, this.route).then(function () {
3861
+ _super.prototype.search.call(_this, naturalSearchSelections, navigationExtras, resetPagination);
3862
+ });
3863
+ };
3844
3864
  /**
3845
3865
  * Return an array for router link usage
3846
3866
  */
@@ -3940,6 +3960,17 @@
3940
3960
  return;
3941
3961
  }));
3942
3962
  }
3963
+ /**
3964
+ * For debugging purpose only, will dump in console everything that happen to
3965
+ * the observable
3966
+ */
3967
+ function debug(debugName) {
3968
+ return operators.tap({
3969
+ next: function (value) { return console.log('NEXT', debugName, value); },
3970
+ error: function (error) { return console.log('ERROR', debugName, error); },
3971
+ complete: function () { return console.log('COMPLETE', debugName); },
3972
+ });
3973
+ }
3943
3974
 
3944
3975
  var NaturalAbstractModelService = /** @class */ (function () {
3945
3976
  function NaturalAbstractModelService(apollo, name, oneQuery, allQuery, createMutation, updateMutation, deleteMutation) {
@@ -4831,20 +4862,38 @@
4831
4862
  function NaturalColumnsPickerComponent(changeDetectorRef) {
4832
4863
  this.changeDetectorRef = changeDetectorRef;
4833
4864
  /**
4834
- * Emit a list of column keys whenever the selection changes
4865
+ * Emit a list of valid and selected column keys whenever the selection changes
4835
4866
  */
4836
4867
  this.selectionChange = new i0.EventEmitter();
4837
- this.defaultSelectionChange = new i0.EventEmitter();
4868
+ /**
4869
+ * Available columns are defined by options in the template
4870
+ */
4838
4871
  this.availableColumns = null;
4872
+ /**
4873
+ * Displayed options in the dropdown menu
4874
+ */
4839
4875
  this.displayedColumns = [];
4840
4876
  this.ngUnsubscribe = new rxjs.Subject();
4841
4877
  }
4842
- Object.defineProperty(NaturalColumnsPickerComponent.prototype, "selection", {
4878
+ Object.defineProperty(NaturalColumnsPickerComponent.prototype, "selections", {
4879
+ /**
4880
+ * Set the columns that are wanted but might be unavailable.
4881
+ *
4882
+ * If a column is unavailable it will be ignored silently. To know what columns were actually applied
4883
+ * you should use `selectionChange`.
4884
+ *
4885
+ * It is often set once on component initialization, but it can also be set again later in the lifespan of the component.
4886
+ */
4843
4887
  set: function (columns) {
4844
4888
  var _a;
4889
+ this._selections = columns;
4890
+ if (!columns || !this.availableColumns) {
4891
+ return;
4892
+ }
4845
4893
  (_a = this.availableColumns) === null || _a === void 0 ? void 0 : _a.forEach(function (col) {
4846
4894
  col.checked = columns.includes(col.key);
4847
4895
  });
4896
+ this.updateColumns();
4848
4897
  },
4849
4898
  enumerable: false,
4850
4899
  configurable: true
@@ -4861,8 +4910,10 @@
4861
4910
  var _this = this;
4862
4911
  var _a, _b, _c;
4863
4912
  (_a = this.availableColumns) === null || _a === void 0 ? void 0 : _a.forEach(function (col) {
4864
- col.checked = _this.initialSelection ? _this.initialSelection.includes(col.key) : col.checked;
4913
+ var _a;
4914
+ col.checked = ((_a = _this._selections) === null || _a === void 0 ? void 0 : _a.length) ? _this._selections.includes(col.key) : col.checked;
4865
4915
  });
4916
+ // Show options only for columns that are not hidden
4866
4917
  this.displayedColumns = (_c = (_b = this.availableColumns) === null || _b === void 0 ? void 0 : _b.filter(function (col) { return !col.hidden; })) !== null && _c !== void 0 ? _c : [];
4867
4918
  };
4868
4919
  NaturalColumnsPickerComponent.prototype.updateColumns = function () {
@@ -4887,10 +4938,8 @@
4887
4938
  { type: i0.ChangeDetectorRef }
4888
4939
  ]; };
4889
4940
  NaturalColumnsPickerComponent.propDecorators = {
4890
- selection: [{ type: i0.Input }],
4941
+ selections: [{ type: i0.Input }],
4891
4942
  selectionChange: [{ type: i0.Output }],
4892
- defaultSelectionChange: [{ type: i0.Output }],
4893
- initialSelection: [{ type: i0.Input }],
4894
4943
  availableColumns: [{ type: i0.ContentChildren, args: [NaturalColumnsPickerColumnDirective,] }]
4895
4944
  };
4896
4945
 
@@ -4967,7 +5016,7 @@
4967
5016
  { type: i0.Component, args: [{
4968
5017
  selector: 'natural-icon',
4969
5018
  template: "<mat-icon *ngIf=\"icon?.font\" [class]=\"icon?.class\" data-nosnippet>{{ icon?.font }}</mat-icon>\n<mat-icon *ngIf=\"icon?.svg\" [class]=\"icon?.class\" [svgIcon]=\"icon.name\" class=\"svg-icon\"></mat-icon>\n\n<div *ngIf=\"label\" [ngClass]=\"labelColor + ' ' + labelPosition\" class=\"label\">{{ label }}</div>\n",
4970
- styles: [":host{position:relative}:host mat-icon{background-repeat:inherit;display:inherit;fill:inherit;height:inherit;width:inherit;font-family:inherit;font-weight:inherit;font-style:inherit;font-size:inherit;line-height:inherit;text-transform:inherit;letter-spacing:inherit;word-wrap:inherit;white-space:inherit;direction:inherit;-webkit-font-smoothing:inherit;text-rendering:inherit;-moz-osx-font-smoothing:inherit;font-feature-settings:inherit;min-height:inherit;min-width:inherit;vertical-align:unset}:host .label{position:absolute;padding:2px;border-radius:100%;font-family:Quicksand sans-serif;font-size:14px;line-height:1em;height:14px;min-width:14px;text-align:center}:host .label.top-left{top:0;left:0;transform:translateX(-50%)}:host .label.top-right{top:0;right:0;transform:translateX(50%)}:host .label.bottom-left{bottom:0;left:0;transform:translateX(-50%)}:host .label.bottom-right{bottom:0;right:0;transform:translateX(50%)}"]
5019
+ styles: [":host{position:relative}:host mat-icon{background-repeat:inherit;display:inherit;fill:inherit;height:inherit;width:inherit;font-family:inherit;font-weight:inherit;font-style:inherit;font-size:inherit;line-height:inherit;text-transform:inherit;letter-spacing:inherit;word-wrap:inherit;white-space:inherit;direction:inherit;-webkit-font-smoothing:inherit;text-rendering:inherit;-moz-osx-font-smoothing:inherit;font-feature-settings:inherit;min-height:inherit;min-width:inherit;vertical-align:unset}:host .label{position:absolute;padding:2px;border-radius:100%;font-family:Quicksand sans-serif;font-size:14px;line-height:1em;height:14px;min-width:14px;text-align:center}:host .label.top-left{top:0;left:0;transform:translate(-50%)}:host .label.top-right{top:0;right:0;transform:translate(50%)}:host .label.bottom-left{bottom:0;left:0;transform:translate(-50%)}:host .label.bottom-right{bottom:0;right:0;transform:translate(50%)}\n"]
4971
5020
  },] }
4972
5021
  ];
4973
5022
  NaturalIconComponent.ctorParameters = function () { return [
@@ -5519,7 +5568,7 @@
5519
5568
  { type: i0.Component, args: [{
5520
5569
  selector: 'natural-detail-header',
5521
5570
  template: "<div class=\"breadcrumb\">\n <a [routerLink]=\"isPanel ? [] : getRootLink()\" [fragment]=\"listFragment\" color=\"primary\" mat-button>{{\n rootLabel || label\n }}</a>\n <ng-container *ngFor=\"let parent of breadcrumbs\">\n /\n <a [routerLink]=\"isPanel ? [] : getLink(parent.id)\" color=\"primary\" mat-button>\n {{ parent?.fullName || parent?.name }}</a\n >\n </ng-container>\n</div>\n\n<div class=\"body\">\n <div *ngIf=\"icon\" style=\"width: 30px\">\n <natural-icon [name]=\"icon\"></natural-icon>\n </div>\n <div *ngIf=\"!model.id\" class=\"mat-headline no-margin newLabel\">{{ newLabel }}</div>\n <div *ngIf=\"model.id\" class=\"mat-headline no-margin label\">{{ model?.name || model?.fullName || label }}</div>\n <div>\n <ng-content></ng-content>\n </div>\n</div>\n",
5522
- styles: [":host{display:flex;flex-direction:column}:host .body,:host .breadcrumb{display:flex;flex-direction:row;align-items:center}:host .breadcrumb{position:relative;top:5px}:host .body{min-height:40px}:host .body>:not(:last-child){margin-right:5px}:host .body .label,:host .body .newLabel{flex:1}@media screen and (max-width:600px){:host .body{flex-direction:column;align-items:flex-start}:host .body>:not(:last-child){margin-bottom:10px!important}:host .body natural-icon{display:none}}"]
5571
+ styles: [":host{display:flex;flex-direction:column}:host .breadcrumb,:host .body{display:flex;flex-direction:row;align-items:center}:host .breadcrumb{position:relative;top:5px}:host .body{min-height:40px}:host .body>*:not(:last-child){margin-right:5px}:host .body .label,:host .body .newLabel{flex:1}@media screen and (max-width: 600px){:host .body{flex-direction:column;align-items:flex-start}:host .body>*:not(:last-child){margin-bottom:10px!important}:host .body natural-icon{display:none}}\n"]
5523
5572
  },] }
5524
5573
  ];
5525
5574
  NaturalDetailHeaderComponent.propDecorators = {
@@ -5668,7 +5717,7 @@
5668
5717
  encapsulation: i0.ViewEncapsulation.None,
5669
5718
  preserveWhitespaces: false,
5670
5719
  animations: [naturalDropdownAnimations.transformMenu, naturalDropdownAnimations.fadeInItems],
5671
- styles: [".natural-dropdown-container{display:flex;flex-direction:column;border-radius:2px;height:100%}.natural-dropdown-container-content{flex:1;padding:5px;overflow:auto}.natural-dropdown-container .natural-dropdown-validate-button{flex:none;display:flex;flex-direction:row;justify-content:flex-end;margin:5px}"]
5720
+ styles: [".natural-dropdown-container{display:flex;flex-direction:column;border-radius:2px;height:100%}.natural-dropdown-container-content{flex:1;padding:5px;overflow:auto}.natural-dropdown-container .natural-dropdown-validate-button{flex:none;display:flex;flex-direction:row;justify-content:flex-end;margin:5px}\n"]
5672
5721
  },] }
5673
5722
  ];
5674
5723
  NaturalDropdownContainerComponent.ctorParameters = function () { return [
@@ -6163,7 +6212,7 @@
6163
6212
  TypeTextComponent.decorators = [
6164
6213
  { type: i0.Component, args: [{
6165
6214
  template: "<mat-form-field>\n <mat-label i18n>Valeur</mat-label>\n <input\n (keydown.enter)=\"close()\"\n [errorStateMatcher]=\"matcher\"\n [formControl]=\"formCtrl\"\n [required]=\"true\"\n matInput\n type=\"text\"\n />\n <mat-error *ngIf=\"formCtrl.hasError('required')\">*</mat-error>\n</mat-form-field>\n",
6166
- styles: [":host input::-webkit-inner-spin-button,:host input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}"]
6215
+ styles: [":host input::-webkit-outer-spin-button,:host input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n"]
6167
6216
  },] }
6168
6217
  ];
6169
6218
  TypeTextComponent.ctorParameters = function () { return [
@@ -6268,7 +6317,7 @@
6268
6317
  TypeNumberComponent.decorators = [
6269
6318
  { type: i0.Component, args: [{
6270
6319
  template: "<form [formGroup]=\"form\">\n <mat-form-field style=\"max-width: 4em; margin-right: 1em\">\n <mat-label i18n=\"Mathematical operator < > =\">Op\u00E9rateur</mat-label>\n <mat-select [formControl]=\"operatorCtrl\" [required]=\"true\">\n <mat-option *ngFor=\"let item of operators\" [value]=\"item.key\">\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label i18n>Valeur</mat-label>\n <input\n (keydown.enter)=\"close()\"\n [errorStateMatcher]=\"matcher\"\n [formControl]=\"valueCtrl\"\n [attr.max]=\"configuration.max\"\n [attr.min]=\"configuration.min\"\n [required]=\"true\"\n [step]=\"configuration.step\"\n matInput\n type=\"number\"\n />\n <mat-error *ngIf=\"valueCtrl.hasError('min')\">< {{ configuration.min }}</mat-error>\n <mat-error *ngIf=\"valueCtrl.hasError('max')\">> {{ configuration.max }}</mat-error>\n </mat-form-field>\n</form>\n",
6271
- styles: [":host input::-webkit-inner-spin-button,:host input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}"]
6320
+ styles: [":host input::-webkit-outer-spin-button,:host input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n"]
6272
6321
  },] }
6273
6322
  ];
6274
6323
  TypeNumberComponent.ctorParameters = function () { return [
@@ -6668,7 +6717,7 @@
6668
6717
  FacetSelectorComponent.decorators = [
6669
6718
  { type: i0.Component, args: [{
6670
6719
  template: "<mat-nav-list>\n <mat-list-item (click)=\"selection = facet; close()\" *ngFor=\"let facet of facets\">\n <a matLine>{{ facet.display }}</a>\n </mat-list-item>\n</mat-nav-list>\n",
6671
- styles: [":host .mat-nav-list{padding:0}"]
6720
+ styles: [":host .mat-nav-list{padding:0}\n"]
6672
6721
  },] }
6673
6722
  ];
6674
6723
  FacetSelectorComponent.ctorParameters = function () { return [
@@ -6707,7 +6756,7 @@
6707
6756
  { type: i0.Component, args: [{
6708
6757
  selector: 'natural-group',
6709
6758
  template: "<natural-input\n (cleared)=\"removeInput(i)\"\n (selectionChange)=\"updateInput($event, i)\"\n *ngFor=\"let selection of innerSelections; let i = index\"\n [facets]=\"facets\"\n [selection]=\"selection\"\n></natural-input>\n\n<natural-input\n #newValueInput\n (selectionChange)=\"addInput($event)\"\n [facets]=\"facets\"\n [placeholder]=\"placeholder\"\n tabIndex=\"10\"\n cdkFocusInitial\n></natural-input>\n",
6710
- styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap}:host natural-input{flex:none;display:inline-flex;margin-right:10px}:host natural-input:last-of-type{flex:1;margin-right:0;min-width:250px}"]
6759
+ styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap}:host natural-input{flex:none;display:inline-flex;margin-right:10px}:host natural-input:last-of-type{flex:1;margin-right:0;min-width:250px}\n"]
6711
6760
  },] }
6712
6761
  ];
6713
6762
  NaturalGroupComponent.propDecorators = {
@@ -7014,7 +7063,7 @@
7014
7063
  { type: i0.Component, args: [{
7015
7064
  selector: 'natural-input',
7016
7065
  template: "<!-- click condition should match to allow click action only when no other button is visible -->\n<mat-form-field #field matRipple (click)=\"!selection && !(facet && !selection) ? openDropdown() : null\">\n <mat-label *ngIf=\"facet\">{{ facet.display }}</mat-label>\n <mat-label *ngIf=\"!facet\">{{ placeholder }}</mat-label>\n\n <input\n #input\n (blur)=\"search($event)\"\n (keydown.enter)=\"search($event)\"\n [attr.size]=\"length\"\n [errorStateMatcher]=\"errorMatcher\"\n [formControl]=\"formCtrl\"\n [readonly]=\"(isDropdown() && !!selection) || isFlag()\"\n autocomplete=\"off\"\n matInput\n type=\"text\"\n />\n\n <!-- TODO : replace this void button -->\n <div *ngIf=\"!facet && !selection\" class=\"search-icon\" matPrefix>\n <natural-icon name=\"search\"></natural-icon>\n </div>\n\n <button (click)=\"clear()\" *ngIf=\"selection\" mat-icon-button matSuffix>\n <natural-icon name=\"close\"></natural-icon>\n </button>\n\n <button (click)=\"clear()\" *ngIf=\"facet && !selection\" mat-icon-button matSuffix>\n <natural-icon name=\"undo\"></natural-icon>\n </button>\n</mat-form-field>\n<div class=\"hide\">{{ formCtrl.value ? formCtrl.value : facet ? facet.display : placeholder }}</div>\n",
7017
- styles: [":host{position:relative;overflow:hidden;border-top-left-radius:4px;border-top-right-radius:4px;display:flex;flex-direction:column}:host .mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}:host .hide{color:#0000;height:0;margin:0 50px 0 10px;font-size:inherit;white-space:nowrap;font-family:Roboto,Helvetica Neue,sans-serif}:host .search-icon{display:block;width:35px;height:35px}:host .search-icon natural-icon{margin:5px auto 0}"]
7066
+ styles: [":host{position:relative;overflow:hidden;border-top-left-radius:4px;border-top-right-radius:4px;display:flex;flex-direction:column}:host .mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}:host .hide{color:transparent;height:0;margin:0 50px 0 10px;font-size:inherit;white-space:nowrap;font-family:Roboto,\"Helvetica Neue\",sans-serif}:host .search-icon{display:block;width:35px;height:35px}:host .search-icon natural-icon{margin:5px auto 0}\n"]
7018
7067
  },] }
7019
7068
  ];
7020
7069
  NaturalInputComponent.ctorParameters = function () { return [
@@ -7099,7 +7148,7 @@
7099
7148
  { type: i0.Component, args: [{
7100
7149
  selector: 'natural-search',
7101
7150
  template: "<div class=\"natural-search\">\n <div class=\"groupsWrapper\">\n <div *ngFor=\"let groupSelections of innerSelections; let i = index; let last = last\" class=\"groupWrapper\">\n <natural-group\n (selectionChange)=\"updateGroup($event, i)\"\n [facets]=\"facets\"\n [placeholder]=\"placeholder\"\n [selections]=\"groupSelections\"\n ></natural-group>\n\n <div class=\"endOfRowButton\">\n <button (click)=\"removeGroup(i)\" *ngIf=\"innerSelections.length > 1\" mat-icon-button>\n <natural-icon name=\"remove\"></natural-icon>\n </button>\n </div>\n\n <div class=\"endOfRowButton\">\n <button (click)=\"addGroup()\" *ngIf=\"last && multipleGroups\" mat-icon-button>\n <natural-icon name=\"add\"></natural-icon>\n </button>\n </div>\n\n <!-- Spaceholder to keep fields alignment (prevent to push until end of line)--->\n <div *ngIf=\"!last\" class=\"spacer\"></div>\n </div>\n </div>\n\n <div class=\"endOfRowButton\">\n <button (click)=\"clear()\" mat-icon-button>\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <ng-content></ng-content>\n </div>\n</div>\n",
7102
- styles: [":host .natural-search{display:flex;flex-direction:row;align-items:flex-end}:host .natural-search .groupsWrapper{display:flex;flex-direction:column;flex:1}:host .natural-search .groupWrapper{display:flex;flex-direction:row;margin-bottom:10px}:host .natural-search .groupWrapper natural-group{flex:1}:host .natural-search .groupWrapper:last-of-type{margin-bottom:0}:host .natural-search .groupWrapper .spacer{width:40px;height:40px}:host .natural-search .endOfRowButton{height:53px;display:flex;flex-direction:row;align-items:center}"]
7151
+ styles: [":host .natural-search{display:flex;flex-direction:row;align-items:flex-end}:host .natural-search .groupsWrapper{display:flex;flex-direction:column;flex:1}:host .natural-search .groupWrapper{display:flex;flex-direction:row;margin-bottom:10px}:host .natural-search .groupWrapper natural-group{flex:1}:host .natural-search .groupWrapper:last-of-type{margin-bottom:0}:host .natural-search .groupWrapper .spacer{width:40px;height:40px}:host .natural-search .endOfRowButton{height:53px;display:flex;flex-direction:row;align-items:center}\n"]
7103
7152
  },] }
7104
7153
  ];
7105
7154
  NaturalSearchComponent.propDecorators = {
@@ -7166,7 +7215,7 @@
7166
7215
  NaturalHierarchicSelectorDialogComponent.decorators = [
7167
7216
  { type: i0.Component, args: [{
7168
7217
  template: "<h2 i18n mat-dialog-title>S\u00E9lection</h2>\n\n<mat-dialog-content>\n <natural-hierarchic-selector\n (selectionChange)=\"config.hierarchicSelection = $event\"\n [selected]=\"config.hierarchicSelection ?? {}\"\n [config]=\"config.hierarchicConfig\"\n [filters]=\"config.hierarchicFilters\"\n [multiple]=\"config.multiple ?? false\"\n [allowUnselect]=\"config.allowUnselect ?? true\"\n [searchFacets]=\"config.searchFacets ?? []\"\n [searchSelections]=\"config.searchSelections ?? []\"\n (searchSelectionChange)=\"searchSelectionsOutput = $event\"\n ></natural-hierarchic-selector>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button [mat-dialog-close] i18n mat-button>Annuler</button>\n <button (click)=\"close(config.hierarchicSelection)\" color=\"primary\" mat-raised-button\n ><span i18n>Valider</span>\n </button>\n</mat-dialog-actions>\n",
7169
- styles: [":host mat-dialog-actions{display:flex;flex-direction:row;justify-content:flex-end}"]
7218
+ styles: [":host mat-dialog-actions{display:flex;flex-direction:row;justify-content:flex-end}\n"]
7170
7219
  },] }
7171
7220
  ];
7172
7221
  NaturalHierarchicSelectorDialogComponent.ctorParameters = function () { return [
@@ -7895,7 +7944,7 @@
7895
7944
  selector: 'natural-hierarchic-selector',
7896
7945
  template: "<div [style.margin-bottom.px]=\"20\">\n <natural-search\n (selectionChange)=\"search($event)\"\n [facets]=\"searchFacets\"\n [selections]=\"searchSelections\"\n ></natural-search>\n</div>\n\n<div class=\"body\">\n <mat-progress-spinner\n *ngIf=\"loading\"\n [diameter]=\"36\"\n mode=\"indeterminate\"\n style=\"margin: 10px\"\n ></mat-progress-spinner>\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" [ngClass]=\"{leaf: !node.expandable}\" matTreeNodePadding>\n <button\n (click)=\"loadChildren(node)\"\n *ngIf=\"node.expandable\"\n [attr.aria-label]=\"'toggle ' + node.name\"\n mat-icon-button\n matTreeNodeToggle\n >\n <mat-progress-spinner\n *ngIf=\"node.loading\"\n [diameter]=\"24\"\n [strokeWidth]=\"5\"\n mode=\"indeterminate\"\n style=\"margin: 8px\"\n ></mat-progress-spinner>\n\n <natural-icon\n *ngIf=\"!node.loading\"\n [name]=\"treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\"\n >\n </natural-icon>\n </button>\n\n <mat-checkbox\n (change)=\"toggleFlatNode(node)\"\n [checked]=\"flatNodesSelection.isSelected(node)\"\n [disabled]=\"!isNodeTogglable(node)\"\n style=\"margin-right: 10px\"\n >\n <natural-icon\n *ngIf=\"node.node.config.icon\"\n [name]=\"node.node.config.icon\"\n style=\"margin-right: 10px\"\n ></natural-icon>\n <span>{{ node.name }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n\n <mat-chip-list aria-orientation=\"vertical\" class=\"mat-chip-list-stacked\">\n <mat-chip\n (removed)=\"unselectModelNode(node)\"\n *ngFor=\"let node of selectedNodes\"\n [removable]=\"true\"\n [selectable]=\"false\"\n >\n <natural-icon *ngIf=\"node.config.icon\" [name]=\"node.config.icon\"></natural-icon>\n <div class=\"mat-body chip-label\">{{ node.model.name || node.model.fullName }}</div>\n <natural-icon matChipRemove name=\"cancel\"></natural-icon>\n </mat-chip>\n </mat-chip-list>\n</div>\n\n<div *ngIf=\"!loading && !dataSource.data.length\" class=\"margin-v\" i18n>Aucun r\u00E9sultat</div>\n",
7897
7946
  providers: [NaturalHierarchicSelectorService],
7898
- styles: [":host{display:block}:host li,:host ul{-webkit-margin-before:0;-webkit-margin-after:0;list-style-type:none}:host natural-icon{width:18px;height:18px;font-size:18px;margin-right:5px}:host .mat-tree-node.leaf{margin-left:40px}:host .body{display:flex;flex-direction:row;justify-content:space-between}:host .body mat-tree{flex:66}:host .body mat-chip-list{flex:33}:host mat-tree{flex-shrink:0}:host mat-chip-list{margin-left:10px}:host mat-chip{display:flex;flex-direction:row;height:auto!important}:host mat-chip .chip-label{flex:1}"]
7947
+ styles: [":host{display:block}:host ul,:host li{-webkit-margin-before:0;-webkit-margin-after:0;list-style-type:none}:host natural-icon{width:18px;height:18px;font-size:18px;margin-right:5px}:host .mat-tree-node.leaf{margin-left:40px}:host .body{display:flex;flex-direction:row;justify-content:space-between}:host .body mat-tree{flex:66}:host .body mat-chip-list{flex:33}:host mat-tree{flex-shrink:0}:host mat-chip-list{margin-left:10px}:host mat-chip{display:flex;flex-direction:row;height:auto!important}:host mat-chip .chip-label{flex:1}\n"]
7899
7948
  },] }
7900
7949
  ];
7901
7950
  NaturalHierarchicSelectorComponent.ctorParameters = function () { return [
@@ -8260,7 +8309,7 @@
8260
8309
  { type: i0.Component, args: [{
8261
8310
  selector: 'natural-select-hierarchic',
8262
8311
  template: "<mat-form-field [floatLabel]=\"floatPlaceholder\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <!-- Input for hierarchical selector -->\n <input\n (blur)=\"blur.emit()\"\n (focus)=\"openDialog()\"\n (keydown.esc)=\"clear()\"\n [formControl]=\"internalCtrl\"\n [errorStateMatcher]=\"matcher\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n />\n\n <!-- Meta data -->\n <natural-icon *ngIf=\"showIcon\" [name]=\"icon\" matPrefix></natural-icon>\n\n <!-- Clear button -->\n <div class=\"suffix-buttons\" matSuffix>\n <button\n (click)=\"clear(); $event.stopPropagation()\"\n *ngIf=\"internalCtrl.value && internalCtrl.enabled && !clearLabel\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"D\u00E9s\u00E9lectionner\"\n >\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <button\n *ngIf=\"internalCtrl.value && navigateTo\"\n [routerLink]=\"navigateTo\"\n mat-button\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <natural-icon name=\"open_in_browser\"></natural-icon>\n </button>\n </div>\n\n <mat-error *ngIf=\"hasRequiredError()\" i18n>Ce champ est requis</mat-error>\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n<div *ngIf=\"showSelectButton() || showClearButton()\" class=\"external-buttons\">\n <button (click)=\"openDialog()\" *ngIf=\"showSelectButton()\" color=\"primary\" mat-flat-button>{{ selectLabel }}</button>\n <button (click)=\"clear()\" *ngIf=\"showClearButton()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n</div>\n",
8263
- styles: [":host{display:flex;flex-direction:column}:host>:not(:last-child){margin-bottom:20px}:host .external-buttons,:host .suffix-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>:not(:last-child){margin-right:10px}"]
8312
+ styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host .suffix-buttons,:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}\n"]
8264
8313
  },] }
8265
8314
  ];
8266
8315
  NaturalSelectHierarchicComponent.ctorParameters = function () { return [
@@ -8459,7 +8508,7 @@
8459
8508
  { type: i0.Component, args: [{
8460
8509
  selector: 'natural-select',
8461
8510
  template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event?.option?.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n <mat-option *ngFor=\"let item of items | async\" [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n ></ng-template>\n </mat-option>\n <div *ngIf=\"moreNbItems > 0\" class=\"mat-caption\" i18n style=\"padding: 5px 10px\"\n >{{ moreNbItems }} \u00E9l\u00E9ment(s) suppl\u00E9mentaire(s)</div\n >\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [floatLabel]=\"floatPlaceholder\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"touch(); blur.emit()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"clear()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n <!-- Meta data -->\n <natural-icon *ngIf=\"!loading && showIcon\" [name]=\"icon\" matPrefix></natural-icon>\n <mat-progress-spinner\n *ngIf=\"loading\"\n [diameter]=\"21\"\n [strokeWidth]=\"5\"\n matPrefix\n mode=\"indeterminate\"\n ></mat-progress-spinner>\n\n <!-- Clear button -->\n <div class=\"suffix-buttons\" matSuffix>\n <button\n (click)=\"clear(); $event.stopPropagation()\"\n *ngIf=\"internalCtrl.value && internalCtrl.enabled && !clearLabel\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"D\u00E9s\u00E9lectionner\"\n >\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <button\n *ngIf=\"internalCtrl.value && navigateTo\"\n [routerLink]=\"navigateTo\"\n mat-button\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <natural-icon name=\"open_in_browser\"></natural-icon>\n </button>\n </div>\n\n <mat-error *ngIf=\"hasRequiredError()\" i18n>Ce champ est requis</mat-error>\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n<div *ngIf=\"showClearButton()\" class=\"external-buttons\">\n <button (click)=\"clear()\" *ngIf=\"showClearButton()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n</div>\n",
8462
- styles: [":host{display:flex;flex-direction:column}:host>:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .external-buttons,:host .suffix-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>:not(:last-child){margin-right:10px}"]
8511
+ styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .suffix-buttons,:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}\n"]
8463
8512
  },] }
8464
8513
  ];
8465
8514
  NaturalSelectComponent.propDecorators = {
@@ -9033,9 +9082,7 @@
9033
9082
  this.closeDrags();
9034
9083
  };
9035
9084
  NaturalFileDropDirective.prototype.hasObservers = function () {
9036
- return (this.fileChange.observers.length > 0 ||
9037
- this.filesChange.observers.length > 0 ||
9038
- this.naturalFileService.filesChanged.observers.length > 0);
9085
+ return this.fileChange.observed || this.filesChange.observed || this.naturalFileService.filesChanged.observed;
9039
9086
  };
9040
9087
  return NaturalFileDropDirective;
9041
9088
  }(NaturalAbstractFile));
@@ -9190,7 +9237,7 @@
9190
9237
  { type: i0.Component, args: [{
9191
9238
  selector: 'natural-file',
9192
9239
  template: "<a\n (fileChange)=\"upload($event)\"\n naturalFileDrop\n [selectable]=\"true\"\n [accept]=\"accept\"\n [attr.href]=\"getDownloadLink()\"\n [class.has-action]=\"!!action\"\n [class.suggest-upload]=\"!model && action === 'upload'\"\n [fileSelectionDisabled]=\"action !== 'upload'\"\n [matRippleDisabled]=\"!action\"\n [style.backgroundImage]=\"imagePreview\"\n [style.backgroundSize]=\"backgroundSize\"\n matRipple\n target=\"_blank\"\n>\n <div *ngIf=\"filePreview\" class=\"file-preview\">\n <natural-icon [size]=\"height * 0.33\" name=\"attachment\"></natural-icon>\n {{ filePreview | uppercase }}\n </div>\n\n <div class=\"action-overlay\">\n <natural-icon *ngIf=\"action === 'upload'\" [size]=\"height * 0.66\" name=\"cloud_upload\"></natural-icon>\n <natural-icon *ngIf=\"action === 'download'\" [size]=\"height * 0.66\" name=\"get_app\"></natural-icon>\n {{ action | capitalize }}\n </div>\n</a>\n",
9193
- styles: [":host{display:flex;flex-direction:row;overflow:hidden;position:relative}:host>a{position:relative;flex:1;background-position:50%;background-repeat:no-repeat}:host>a.has-action{cursor:pointer}:host>a.has-action.suggest-upload .action-overlay{opacity:.66}:host>a.has-action.natural-file-over .action-overlay,:host>a.has-action:hover .action-overlay{opacity:1}:host .action-overlay,:host .file-preview{display:flex;flex-direction:column;position:absolute;top:0;left:0;right:0;bottom:0;justify-content:center;align-items:center;font-size:36px;line-height:1.3em;text-align:center}:host .action-overlay{opacity:0}:host .action-overlay>div{opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center}"]
9240
+ styles: [":host{display:flex;flex-direction:row;overflow:hidden;position:relative}:host>a{position:relative;flex:1;background-position:center;background-repeat:no-repeat}:host>a.has-action{cursor:pointer}:host>a.has-action.suggest-upload .action-overlay{opacity:.66}:host>a.has-action:hover .action-overlay,:host>a.has-action.natural-file-over .action-overlay{opacity:1}:host .action-overlay,:host .file-preview{display:flex;flex-direction:column;position:absolute;top:0;left:0;right:0;bottom:0;justify-content:center;align-items:center;font-size:36px;line-height:1.3em;text-align:center}:host .action-overlay{opacity:0}:host .action-overlay>div{opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center}\n"]
9194
9241
  },] }
9195
9242
  ];
9196
9243
  FileComponent.ctorParameters = function () { return [
@@ -9239,7 +9286,7 @@
9239
9286
  { type: i0.Component, args: [{
9240
9287
  selector: 'natural-fixed-button',
9241
9288
  template: "<button\n [color]=\"color\"\n [disabled]=\"disabled\"\n [routerLink]=\"link\"\n class=\"floating-button bottom-right\"\n mat-fab\n mat-raised-button\n>\n <natural-icon [name]=\"icon\"></natural-icon>\n</button>\n",
9242
- styles: [":host{position:fixed!important;z-index:999;bottom:32px;right:32px}"]
9289
+ styles: [":host{position:fixed!important;z-index:999;bottom:32px;right:32px}\n"]
9243
9290
  },] }
9244
9291
  ];
9245
9292
  NaturalFixedButtonComponent.ctorParameters = function () { return []; };
@@ -9981,7 +10028,7 @@
9981
10028
  { type: i0.Component, args: [{
9982
10029
  selector: 'natural-relations',
9983
10030
  template: "<div class=\"body\">\n <ng-template #defaultNameCell let-item=\"item\">\n {{ getDisplayFn()(item) }}\n </ng-template>\n\n <table *ngIf=\"dataSource\" [dataSource]=\"dataSource\" class=\"natural-row-click\" mat-table>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row style=\"display: none\"></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns\" mat-row></tr>\n\n <ng-container matColumnDef=\"name\">\n <th *matHeaderCellDef i18n mat-header-cell>Titre</th>\n <td *matCellDef=\"let item\" mat-cell>\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultNameCell\"\n ></ng-template>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"unlink\">\n <th *matHeaderCellDef mat-header-cell></th>\n <td *matCellDef=\"let element\" mat-cell>\n <button\n (click)=\"removeRelation(element)\"\n color=\"warn\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Dissocier\"\n >\n <natural-icon name=\"link_off\"></natural-icon>\n </button>\n </td>\n </ng-container>\n </table>\n\n <mat-paginator\n (page)=\"pagination($event)\"\n *ngIf=\"dataSource?.data && (dataSource?.data?.length || 0) > (dataSource?.data?.pageSize || 0)\"\n [length]=\"dataSource?.data?.length || 0\"\n [pageIndex]=\"dataSource?.data?.pageIndex || 0\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"dataSource?.data?.pageSize || 0\"\n ></mat-paginator>\n\n <div *ngIf=\"!loading && dataSource?.data?.length === 0\" class=\"margin-v mat-body\">\n <span i18n>Aucun r\u00E9sultat</span>\n </div>\n\n <mat-progress-spinner *ngIf=\"loading\" [diameter]=\"40\" class=\"loading\" mode=\"indeterminate\"></mat-progress-spinner>\n</div>\n\n<natural-select\n #select\n (selectionChange)=\"addRelations([$any($event)])\"\n *ngIf=\"!hierarchicSelectorConfig && service && !disabled\"\n [displayWith]=\"getDisplayFn()\"\n [filter]=\"autocompleteSelectorFilter\"\n [placeholder]=\"placeholder\"\n [service]=\"service\"\n [showIcon]=\"false\"\n></natural-select>\n\n<div *ngIf=\"hierarchicSelectorConfig && !disabled\">\n <button (click)=\"openNaturalHierarchicSelector()\" color=\"primary\" mat-flat-button>{{ placeholder }}</button>\n</div>\n",
9984
- styles: [":host{display:flex;flex-direction:column}:host>:not(:last-child){margin-bottom:20px}:host .body{display:flex;flex-direction:column}:host .loading{margin:20px auto}:host .mat-column-unlink{width:2.5em}"]
10031
+ styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host .body{display:flex;flex-direction:column}:host .loading{margin:20px auto}:host .mat-column-unlink{width:2.5em}\n"]
9985
10032
  },] }
9986
10033
  ];
9987
10034
  NaturalRelationsComponent.ctorParameters = function () { return [
@@ -10351,7 +10398,7 @@
10351
10398
  this.sidenavService = sidenavService;
10352
10399
  this.element = element;
10353
10400
  /**
10354
- * Unique identifier used for the local storage
10401
+ * The side that the drawer is attached to
10355
10402
  */
10356
10403
  this.position = 'start';
10357
10404
  /**
@@ -10414,7 +10461,7 @@
10414
10461
  selector: 'natural-sidenav-container',
10415
10462
  template: "<mat-sidenav-container>\n <mat-sidenav\n (openedChange)=\"sidenavService.setOpened($event)\"\n [mode]=\"sidenavService.activeMode\"\n [ngClass]=\"sidenavService.isMinimized ? 'menuMinimized' : ''\"\n [opened]=\"sidenavService.isOpened\"\n [style.min-width.px]=\"sidenavService.isMinimized && minimizedWidth ? minimizedWidth : null\"\n [style.width.px]=\"sidenavService.isMinimized && minimizedWidth ? minimizedWidth : null\"\n [position]=\"position\"\n >\n <ng-content select=\"natural-sidenav\"></ng-content>\n </mat-sidenav>\n\n <mat-sidenav-content>\n <div>\n <ng-content select=\"natural-sidenav-content\"></ng-content>\n </div>\n </mat-sidenav-content>\n</mat-sidenav-container>\n",
10416
10463
  providers: [NaturalSidenavService],
10417
- styles: [":host{display:flex;flex-direction:column}:host mat-sidenav-container{display:flex;flex-direction:column;flex:1}:host mat-sidenav-content>div{overflow:auto}:host .menuMinimized{overflow-x:hidden}:host .buttons{display:flex;flex-direction:row;justify-content:flex-end}"]
10464
+ styles: [":host{display:flex;flex-direction:column}:host mat-sidenav-container{display:flex;flex-direction:column;flex:1}:host mat-sidenav-content>div{overflow:auto}:host .menuMinimized{overflow-x:hidden}:host .buttons{display:flex;flex-direction:row;justify-content:flex-end}\n"]
10418
10465
  },] }
10419
10466
  ];
10420
10467
  NaturalSidenavContainerComponent.ctorParameters = function () { return [
@@ -10440,7 +10487,7 @@
10440
10487
  { type: i0.Component, args: [{
10441
10488
  selector: 'natural-sidenav-content',
10442
10489
  template: '<ng-content></ng-content>',
10443
- styles: [":host{flex:1;display:flex;flex-direction:column;overflow:auto}"]
10490
+ styles: [":host{flex:1;display:flex;flex-direction:column;overflow:auto}\n"]
10444
10491
  },] }
10445
10492
  ];
10446
10493
  NaturalSidenavContentComponent.ctorParameters = function () { return []; };
@@ -10529,7 +10576,7 @@
10529
10576
  selector: 'natural-table-button',
10530
10577
  template: "<!-- Because directives can't be applied conditionally (routerLink, mat-button and mat-icon-button), we have to use different elements -->\n\n<ng-container *ngIf=\"!raised\">\n <!-- App routed link with label... -->\n <a\n *ngIf=\"!href && label\"\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n mat-button\n >\n <natural-icon *ngIf=\"icon\" [name]=\"icon\"></natural-icon>\n <span>{{ label }}</span>\n </a>\n\n <!-- ... and without label -->\n <a\n *ngIf=\"!href && !label\"\n [color]=\"color\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [queryParams]=\"queryParams\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n mat-icon-button\n >\n <natural-icon *ngIf=\"icon\" [name]=\"icon\"></natural-icon>\n </a>\n\n <!-- External link with label... -->\n <a *ngIf=\"href && label\" [attr.href]=\"href\" [color]=\"color\" mat-button target=\"_blank\">\n <natural-icon *ngIf=\"icon\" [name]=\"icon\"></natural-icon>\n <span>{{ label }}</span>\n </a>\n\n <!-- ... and without label -->\n <a *ngIf=\"href && !label\" [attr.href]=\"href\" [color]=\"color\" mat-icon-button target=\"_blank\">\n <natural-icon *ngIf=\"icon\" [name]=\"icon\"></natural-icon>\n </a>\n</ng-container>\n\n<ng-container *ngIf=\"raised\">\n <!-- App routed link with label... -->\n <a\n *ngIf=\"!href && label\"\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n mat-raised-button\n >\n <natural-icon *ngIf=\"icon\" [name]=\"icon\"></natural-icon>\n <span>{{ label }}</span>\n </a>\n\n <!-- ... and without label -->\n <a\n *ngIf=\"!href && !label\"\n [color]=\"color\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [queryParams]=\"queryParams\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n mat-icon-button\n mat-raised-button\n >\n <natural-icon *ngIf=\"icon\" [name]=\"icon\"></natural-icon>\n </a>\n\n <!-- External link with label... -->\n <a *ngIf=\"href && label\" [attr.href]=\"href\" [color]=\"color\" mat-raised-button target=\"_blank\">\n <natural-icon *ngIf=\"icon\" [name]=\"icon\"></natural-icon>\n <span>{{ label }}</span>\n </a>\n\n <!-- ... and without label -->\n <a *ngIf=\"href && !label\" [attr.href]=\"href\" [color]=\"color\" mat-icon-button mat-raised-button target=\"_blank\">\n <natural-icon *ngIf=\"icon\" [name]=\"icon\"></natural-icon>\n </a>\n</ng-container>\n",
10531
10578
  encapsulation: i0.ViewEncapsulation.None,
10532
- styles: ["natural-table-button,natural-table-button a.mat-button{flex:1;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}natural-table-button a.mat-button .mat-button-wrapper,natural-table-button a.mat-button .mat-button-wrapper>*{display:flex;flex-direction:row;align-items:center}natural-table-button a.mat-button .mat-button-wrapper>:not(:last-child){margin-right:5px}"]
10579
+ styles: ["natural-table-button{flex:1;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}natural-table-button a.mat-button{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:flex-start}natural-table-button a.mat-button .mat-button-wrapper{display:flex;flex-direction:row;align-items:center}natural-table-button a.mat-button .mat-button-wrapper>*{display:flex;flex-direction:row;align-items:center}natural-table-button a.mat-button .mat-button-wrapper>:not(:last-child){margin-right:5px}\n"]
10533
10580
  },] }
10534
10581
  ];
10535
10582
  NaturalTableButtonComponent.ctorParameters = function () { return []; };
@@ -11185,9 +11232,11 @@
11185
11232
  exports.TypeNumberComponent = TypeNumberComponent;
11186
11233
  exports.TypeSelectComponent = TypeSelectComponent;
11187
11234
  exports.TypeTextComponent = TypeTextComponent;
11235
+ exports.available = available;
11188
11236
  exports.cancellableTimeout = cancellableTimeout;
11189
11237
  exports.cleanSameValues = cleanSameValues;
11190
11238
  exports.collectErrors = collectErrors;
11239
+ exports.debug = debug;
11191
11240
  exports.decimal = decimal;
11192
11241
  exports.deliverableEmail = deliverableEmail;
11193
11242
  exports.ensureHttpPrefix = ensureHttpPrefix;
@@ -11223,18 +11272,18 @@
11223
11272
  exports.validTlds = validTlds;
11224
11273
  exports.validateAllFormControls = validateAllFormControls;
11225
11274
  exports.wrapLike = wrapLike;
11226
- exports.ɵa = NaturalAbstractFile;
11227
- exports.ɵb = NaturalDropdownService;
11228
- exports.ɵc = AbstractAssociationSelectComponent;
11229
- exports.ɵd = NATURAL_DROPDOWN_CONTAINER_DATA;
11230
- exports.ɵe = NaturalDropdownContainerComponent;
11231
- exports.ɵf = naturalDropdownAnimations;
11232
- exports.ɵg = AbstractSelect;
11233
- exports.ɵh = NaturalGroupComponent;
11234
- exports.ɵi = NaturalInputComponent;
11235
- exports.ɵj = FacetSelectorComponent;
11275
+ exports["ɵa"] = NaturalAbstractFile;
11276
+ exports["ɵb"] = NaturalDropdownService;
11277
+ exports["ɵc"] = AbstractAssociationSelectComponent;
11278
+ exports["ɵd"] = NATURAL_DROPDOWN_CONTAINER_DATA;
11279
+ exports["ɵe"] = NaturalDropdownContainerComponent;
11280
+ exports["ɵf"] = naturalDropdownAnimations;
11281
+ exports["ɵg"] = AbstractSelect;
11282
+ exports["ɵh"] = NaturalGroupComponent;
11283
+ exports["ɵi"] = NaturalInputComponent;
11284
+ exports["ɵj"] = FacetSelectorComponent;
11236
11285
 
11237
11286
  Object.defineProperty(exports, '__esModule', { value: true });
11238
11287
 
11239
- })));
11288
+ }));
11240
11289
  //# sourceMappingURL=ecodev-natural.umd.js.map