@elderbyte/ngx-starter 12.12.1 → 12.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/bundles/elderbyte-ngx-starter.umd.js +364 -107
  2. package/bundles/elderbyte-ngx-starter.umd.js.map +1 -1
  3. package/elderbyte-ngx-starter.d.ts +7 -6
  4. package/elderbyte-ngx-starter.metadata.json +1 -1
  5. package/esm2015/elderbyte-ngx-starter.js +8 -7
  6. package/esm2015/lib/common/data/data-context/data-context-active-page.js +1 -1
  7. package/esm2015/lib/common/data/data-context/data-context-auto-starter.js +74 -0
  8. package/esm2015/lib/common/data/data-context/data-context-base.js +10 -2
  9. package/esm2015/lib/common/data/data-context/data-context-builder.js +32 -5
  10. package/esm2015/lib/common/data/data-context/data-context-continuable-base.js +1 -1
  11. package/esm2015/lib/common/data/data-context/data-context-continuable-paged.js +1 -1
  12. package/esm2015/lib/common/data/data-context/data-context-continuable-token.js +2 -2
  13. package/esm2015/lib/common/data/data-context/data-context-life-cycle-binding.js +30 -0
  14. package/esm2015/lib/common/data/data-context/data-context-simple.js +1 -1
  15. package/esm2015/lib/common/data/data-context/data-context-source-auto-reloader.js +12 -0
  16. package/esm2015/lib/common/data/data-context/data-context.js +1 -1
  17. package/esm2015/lib/common/data/data-context/public_api.js +4 -2
  18. package/esm2015/lib/common/data/required-filter-evaluator.js +70 -0
  19. package/esm2015/lib/components/auditing/audited-entity/elder-audited-entity.component.js +2 -2
  20. package/esm2015/lib/components/data-view/base/elder-data-view-base.js +46 -3
  21. package/esm2015/lib/components/data-view/common/data-context-state-indicator/data-context-state-indicator.component.js +45 -0
  22. package/esm2015/lib/components/data-view/common/elder-data-common.module.js +6 -3
  23. package/esm2015/lib/components/data-view/grid/elder-grid/elder-grid.component.js +3 -22
  24. package/esm2015/lib/components/data-view/table/elder-table/elder-table.component.js +5 -48
  25. package/esm2015/lib/components/files/blob-viewer/elder-blob-viewer.component.js +4 -3
  26. package/fesm2015/elderbyte-ngx-starter.js +305 -84
  27. package/fesm2015/elderbyte-ngx-starter.js.map +1 -1
  28. package/lib/common/data/data-context/data-context-auto-starter.d.ts +41 -0
  29. package/lib/common/data/data-context/data-context-base.d.ts +7 -1
  30. package/lib/common/data/data-context/data-context-builder.d.ts +9 -1
  31. package/lib/common/data/data-context/data-context-continuable-token.d.ts +1 -1
  32. package/lib/common/data/data-context/data-context-life-cycle-binding.d.ts +33 -0
  33. package/lib/common/data/data-context/data-context-source-auto-reloader.d.ts +8 -0
  34. package/lib/common/data/data-context/data-context.d.ts +4 -0
  35. package/lib/common/data/data-context/public_api.d.ts +3 -1
  36. package/lib/common/data/required-filter-evaluator.d.ts +46 -0
  37. package/lib/components/data-view/base/elder-data-view-base.d.ts +11 -1
  38. package/lib/components/data-view/common/data-context-state-indicator/data-context-state-indicator.component.d.ts +29 -0
  39. package/lib/components/data-view/grid/elder-grid/elder-grid.component.d.ts +0 -5
  40. package/lib/components/data-view/table/elder-table/elder-table.component.d.ts +5 -10
  41. package/package.json +1 -1
  42. package/src/lib/components/data-view/common/data-context-state-indicator/data-context-state-indicator.component.scss +0 -0
  43. package/esm2015/lib/common/data/data-context/data-source-to-data-context-binding.js +0 -20
  44. package/lib/common/data/data-context/data-source-to-data-context-binding.d.ts +0 -12
@@ -3339,8 +3339,8 @@
3339
3339
  _this._started = new rxjs.BehaviorSubject(false);
3340
3340
  _this._closed = new rxjs.BehaviorSubject(false);
3341
3341
  _this._primaryIndex = new Map();
3342
- _this.unsubscribe$ = new rxjs.Subject();
3343
3342
  _this._reloadQueue = new rxjs.Subject();
3343
+ _this.unsubscribe$ = new rxjs.Subject();
3344
3344
  _this._dataSource = dataSource;
3345
3345
  _this._loading = _this._status.pipe(operators.map(function (status) { return status.loading; }));
3346
3346
  _this._filter.filters.pipe(operators.filter(function () { return _this.started; }), operators.takeUntil(_this.unsubscribe$)).subscribe(function (filters) { return _this.onFiltersChanged(filters); });
@@ -3467,6 +3467,13 @@
3467
3467
  enumerable: false,
3468
3468
  configurable: true
3469
3469
  });
3470
+ Object.defineProperty(DataContextBase.prototype, "isStarted$", {
3471
+ get: function () {
3472
+ return this._started.asObservable();
3473
+ },
3474
+ enumerable: false,
3475
+ configurable: true
3476
+ });
3470
3477
  Object.defineProperty(DataContextBase.prototype, "isClosed", {
3471
3478
  get: function () {
3472
3479
  return this._closed.getValue();
@@ -3645,6 +3652,11 @@
3645
3652
  DataContextBase.prototype.onStatus = function (status) {
3646
3653
  this._status.next(status);
3647
3654
  };
3655
+ /***************************************************************************
3656
+ * *
3657
+ * Private methods *
3658
+ * *
3659
+ **************************************************************************/
3648
3660
  DataContextBase.prototype.clearIndex = function () {
3649
3661
  this._primaryIndex.clear();
3650
3662
  };
@@ -3954,7 +3966,7 @@
3954
3966
  // protected nextContinuationToken?: string;
3955
3967
  /***************************************************************************
3956
3968
  * *
3957
- * Constructors *
3969
+ * Constructor *
3958
3970
  * *
3959
3971
  **************************************************************************/
3960
3972
  function DataContextContinuableToken(dataSource, chunkSize, indexFn, localApply, localSort) {
@@ -4376,28 +4388,215 @@
4376
4388
  return MatTableDataContextBinding;
4377
4389
  }());
4378
4390
 
4379
- var DataSourceToDataContextBinding = /** @class */ (function () {
4380
- function DataSourceToDataContextBinding(_dataContext, _dataApi) {
4391
+ /**
4392
+ * Allows making any kind of subscription which will be automatically unsubscribed
4393
+ * upon data context closing/cleanup.
4394
+ */
4395
+ var DataContextLifeCycleBinding = /** @class */ (function () {
4396
+ /***************************************************************************
4397
+ * *
4398
+ * Constructor *
4399
+ * *
4400
+ **************************************************************************/
4401
+ function DataContextLifeCycleBinding(_dataContext) {
4381
4402
  var _this = this;
4382
4403
  this._dataContext = _dataContext;
4383
- this._dataApi = _dataApi;
4384
- this.logger = tsLogger.LoggerFactory.getLogger(this.constructor.name);
4385
- this.subscribe();
4404
+ if (_dataContext == null) {
4405
+ throw new Error('dataContext must not be null!');
4406
+ }
4386
4407
  this._dataContext.data.subscribe(function (changed) { }, function (err) { }, function () { return _this.unsubscribe(); });
4387
4408
  }
4388
- DataSourceToDataContextBinding.prototype.unsubscribe = function () {
4409
+ /***************************************************************************
4410
+ * *
4411
+ * Public API *
4412
+ * *
4413
+ **************************************************************************/
4414
+ DataContextLifeCycleBinding.prototype.unsubscribe = function () {
4389
4415
  if (this._subscription) {
4390
4416
  this._subscription.unsubscribe();
4391
4417
  this._subscription = null;
4392
4418
  }
4393
4419
  };
4394
- DataSourceToDataContextBinding.prototype.subscribe = function () {
4420
+ return DataContextLifeCycleBinding;
4421
+ }());
4422
+
4423
+ var RequiredFilterContextChangedEvent = /** @class */ (function () {
4424
+ function RequiredFilterContextChangedEvent(requiredFilters, currentFilters, isValid) {
4425
+ this.requiredFilters = requiredFilters;
4426
+ this.currentFilters = currentFilters;
4427
+ this.isValid = isValid;
4428
+ }
4429
+ return RequiredFilterContextChangedEvent;
4430
+ }());
4431
+ var RequiredFilterEvaluator = /** @class */ (function () {
4432
+ /***************************************************************************
4433
+ * *
4434
+ * Fields *
4435
+ * *
4436
+ **************************************************************************/
4437
+ function RequiredFilterEvaluator(filterContext, requiredFilters) {
4438
+ var _this = this;
4439
+ this._requiredFilters = new rxjs.BehaviorSubject([]);
4440
+ if (filterContext == null) {
4441
+ throw new Error('filterContext must not be null!');
4442
+ }
4443
+ this._filterContext = filterContext;
4444
+ if (requiredFilters) {
4445
+ this._requiredFilters.next(requiredFilters);
4446
+ }
4447
+ this.context$ = rxjs.combineLatest([
4448
+ this._requiredFilters,
4449
+ this._filterContext.filters
4450
+ ]).pipe(operators.map(function (_a) {
4451
+ var _b = __read(_a, 2), required = _b[0], currentFilters = _b[1];
4452
+ return _this.createEvent(requiredFilters, currentFilters);
4453
+ }));
4454
+ }
4455
+ Object.defineProperty(RequiredFilterEvaluator.prototype, "filterContext", {
4456
+ /***************************************************************************
4457
+ * *
4458
+ * Properties *
4459
+ * *
4460
+ **************************************************************************/
4461
+ get: function () {
4462
+ return this._filterContext;
4463
+ },
4464
+ enumerable: false,
4465
+ configurable: true
4466
+ });
4467
+ Object.defineProperty(RequiredFilterEvaluator.prototype, "requiredFilters$", {
4468
+ get: function () {
4469
+ return this._requiredFilters.asObservable();
4470
+ },
4471
+ enumerable: false,
4472
+ configurable: true
4473
+ });
4474
+ Object.defineProperty(RequiredFilterEvaluator.prototype, "requiredFilters", {
4475
+ get: function () {
4476
+ return this._requiredFilters.getValue();
4477
+ },
4478
+ enumerable: false,
4479
+ configurable: true
4480
+ });
4481
+ /***************************************************************************
4482
+ * *
4483
+ * Public API *
4484
+ * *
4485
+ **************************************************************************/
4486
+ /***************************************************************************
4487
+ * *
4488
+ * Private methods *
4489
+ * *
4490
+ **************************************************************************/
4491
+ RequiredFilterEvaluator.prototype.createEvent = function (requiredFilters, currentFilters) {
4492
+ return new RequiredFilterContextChangedEvent(requiredFilters, currentFilters, this.allRequiredFiltersPresent(requiredFilters, currentFilters));
4493
+ };
4494
+ RequiredFilterEvaluator.prototype.allRequiredFiltersPresent = function (requiredFilters, currentFilters) {
4395
4495
  var _this = this;
4396
- this._subscription = this._dataApi.dataChanged.subscribe(function (change) { return _this._dataContext.reload(); });
4496
+ if (requiredFilters) {
4497
+ var validatedFilterGroups = requiredFilters.map(function (filterGroup) { return _this.hasAllFilters(filterGroup, currentFilters); });
4498
+ return validatedFilterGroups.find(function (validGroup) { return !!validGroup; });
4499
+ }
4500
+ return true;
4397
4501
  };
4398
- return DataSourceToDataContextBinding;
4502
+ RequiredFilterEvaluator.prototype.hasAllFilters = function (requiredFilters, currentFilters) {
4503
+ var currentFilterKeys = currentFilters.map(function (f) { return f.key; });
4504
+ var currentFilterKeySet = new Set(currentFilterKeys);
4505
+ return requiredFilters.every(function (required) { return currentFilterKeySet.has(required); });
4506
+ };
4507
+ return RequiredFilterEvaluator;
4399
4508
  }());
4400
4509
 
4510
+ var AutoStartSpec = /** @class */ (function () {
4511
+ function AutoStartSpec(requiredFilters, initialSort) {
4512
+ this.requiredFilters = requiredFilters;
4513
+ this.initialSort = initialSort;
4514
+ }
4515
+ AutoStartSpec.asap = function (sort) {
4516
+ return new AutoStartSpec(null, sort);
4517
+ };
4518
+ AutoStartSpec.requireFiltersAll = function (filters, sort) {
4519
+ return AutoStartSpec.requireFilters([filters], sort);
4520
+ };
4521
+ AutoStartSpec.requireFiltersAny = function (filters, sort) {
4522
+ var separateFilterArrays = filters.map(function (singleFilter) { return [singleFilter]; });
4523
+ return AutoStartSpec.requireFilters(separateFilterArrays, sort);
4524
+ };
4525
+ AutoStartSpec.requireFilters = function (filters, sort) {
4526
+ return new AutoStartSpec(filters, sort);
4527
+ };
4528
+ return AutoStartSpec;
4529
+ }());
4530
+ var DataContextAutoStarter = /** @class */ (function (_super) {
4531
+ __extends(DataContextAutoStarter, _super);
4532
+ /***************************************************************************
4533
+ * *
4534
+ * Constructor *
4535
+ * *
4536
+ **************************************************************************/
4537
+ function DataContextAutoStarter(dataContext, _autoStartSpec) {
4538
+ var _this = _super.call(this, dataContext) || this;
4539
+ _this._autoStartSpec = _autoStartSpec;
4540
+ /***************************************************************************
4541
+ * *
4542
+ * Fields *
4543
+ * *
4544
+ **************************************************************************/
4545
+ _this.logger = tsLogger.LoggerFactory.getLogger(_this.constructor.name);
4546
+ if (_autoStartSpec == null) {
4547
+ throw new Error('autoStartSpec must not be null!');
4548
+ }
4549
+ if (_autoStartSpec.requiredFilters) {
4550
+ _this._autoStartConditionFulfilled$ = _this.buildRequiredFilterConditionObservable();
4551
+ }
4552
+ else {
4553
+ // no condition defined, try to start immediately
4554
+ _this.startDataContext();
4555
+ }
4556
+ _this.subscribe();
4557
+ return _this;
4558
+ }
4559
+ /***************************************************************************
4560
+ * *
4561
+ * Public API *
4562
+ * *
4563
+ **************************************************************************/
4564
+ DataContextAutoStarter.prototype.subscribe = function () {
4565
+ var _this = this;
4566
+ if (this._autoStartConditionFulfilled$) {
4567
+ this._subscription = this._autoStartConditionFulfilled$.pipe(operators.filter(function (fulfilled) { return !!fulfilled; })).subscribe(function () { return _this.startDataContext(); });
4568
+ }
4569
+ };
4570
+ /***************************************************************************
4571
+ * *
4572
+ * Private methods *
4573
+ * *
4574
+ **************************************************************************/
4575
+ DataContextAutoStarter.prototype.buildRequiredFilterConditionObservable = function () {
4576
+ return new RequiredFilterEvaluator(this._dataContext.filter, this._autoStartSpec.requiredFilters).context$.pipe(operators.map(function (event) { return event.isValid; }));
4577
+ };
4578
+ DataContextAutoStarter.prototype.startDataContext = function () {
4579
+ this.logger.debug('Auto starting data context...');
4580
+ this._dataContext.start(this._autoStartSpec.initialSort);
4581
+ };
4582
+ return DataContextAutoStarter;
4583
+ }(DataContextLifeCycleBinding));
4584
+
4585
+ var DataContextSourceAutoReloader = /** @class */ (function (_super) {
4586
+ __extends(DataContextSourceAutoReloader, _super);
4587
+ function DataContextSourceAutoReloader(dataContext, dataApi) {
4588
+ var _this = _super.call(this, dataContext) || this;
4589
+ _this.dataApi = dataApi;
4590
+ _this.subscribe();
4591
+ return _this;
4592
+ }
4593
+ DataContextSourceAutoReloader.prototype.subscribe = function () {
4594
+ var _this = this;
4595
+ this._subscription = this.dataApi.dataChanged.subscribe(function () { return _this._dataContext.reload(); });
4596
+ };
4597
+ return DataContextSourceAutoReloader;
4598
+ }(DataContextLifeCycleBinding));
4599
+
4401
4600
  var EntityIdUtil = /** @class */ (function () {
4402
4601
  function EntityIdUtil() {
4403
4602
  }
@@ -4869,6 +5068,22 @@
4869
5068
  this._reloadOnLocalChanges = true;
4870
5069
  return this;
4871
5070
  };
5071
+ DataContextBuilder.prototype.autoStartAsap = function (sort) {
5072
+ return this.autoStartOn(AutoStartSpec.asap(sort));
5073
+ };
5074
+ DataContextBuilder.prototype.autoStartOnFilters = function (filters, sort) {
5075
+ return this.autoStartOn(AutoStartSpec.requireFilters(filters, sort));
5076
+ };
5077
+ DataContextBuilder.prototype.autoStartOnFiltersAll = function (filters, sort) {
5078
+ return this.autoStartOn(AutoStartSpec.requireFiltersAll(filters, sort));
5079
+ };
5080
+ DataContextBuilder.prototype.autoStartOnFiltersAny = function (filters, sort) {
5081
+ return this.autoStartOn(AutoStartSpec.requireFiltersAny(filters, sort));
5082
+ };
5083
+ DataContextBuilder.prototype.autoStartOn = function (spec) {
5084
+ this._autoStartSpec = spec;
5085
+ return this;
5086
+ };
4872
5087
  /***************************************************************************
4873
5088
  * *
4874
5089
  * DataSource Builder *
@@ -4966,7 +5181,10 @@
4966
5181
  else {
4967
5182
  throw new Error('Unsupported IDataSource type: ' + typeof (ds));
4968
5183
  }
4969
- return this.bindToDataSource(dataContext, ds);
5184
+ if (this._autoStartSpec) {
5185
+ this.setupDataContextAutoStart(dataContext, this._autoStartSpec);
5186
+ }
5187
+ return this.setupDataContextAutoReload(dataContext, ds);
4970
5188
  };
4971
5189
  DataContextBuilder.prototype.fromListSource = function (listSource) {
4972
5190
  return new DataContextSimple(listSource, this._indexFn, this._localApply, this._localSort);
@@ -4980,9 +5198,16 @@
4980
5198
  DataContextBuilder.prototype.fromActivePageSource = function (pageSource) {
4981
5199
  return new DataContextActivePage(pageSource, this._pageSize, this._indexFn, this._localApply, this._skipLocalSort ? null : this._localSort);
4982
5200
  };
4983
- DataContextBuilder.prototype.bindToDataSource = function (dc, dataSource) {
5201
+ DataContextBuilder.prototype.setupDataContextAutoReload = function (dc, dataSource) {
4984
5202
  if (this._reloadOnLocalChanges) {
4985
- var binding = new DataSourceToDataContextBinding(dc, dataSource);
5203
+ var binding = new DataContextSourceAutoReloader(dc, dataSource);
5204
+ }
5205
+ return dc;
5206
+ };
5207
+ DataContextBuilder.prototype.setupDataContextAutoStart = function (dc, autoStartSpec) {
5208
+ if (this._autoStartSpec) {
5209
+ this.logger.debug('Setting up data context auto start with spec:', this._autoStartSpec);
5210
+ var binding = new DataContextAutoStarter(dc, autoStartSpec);
4986
5211
  }
4987
5212
  return dc;
4988
5213
  };
@@ -9273,7 +9498,6 @@
9273
9498
  * *
9274
9499
  **************************************************************************/
9275
9500
  function ElderBlobViewerComponent(httpPristine, domSanitizer, toastService) {
9276
- var _this = this;
9277
9501
  this.httpPristine = httpPristine;
9278
9502
  this.domSanitizer = domSanitizer;
9279
9503
  this.toastService = toastService;
@@ -9288,6 +9512,14 @@
9288
9512
  this._mimeType$ = new rxjs.BehaviorSubject(null);
9289
9513
  this.destroy$ = new rxjs.Subject();
9290
9514
  this._displayUnknownAsText = false;
9515
+ }
9516
+ /***************************************************************************
9517
+ * *
9518
+ * Life Cycle *
9519
+ * *
9520
+ **************************************************************************/
9521
+ ElderBlobViewerComponent.prototype.ngOnInit = function () {
9522
+ var _this = this;
9291
9523
  rxjs.combineLatest([this._url$, this._mimeType$]).pipe(operators.takeUntil(this.destroy$), operators.filter(function (_a) {
9292
9524
  var _b = __read(_a, 2), url = _b[0], mimeType = _b[1];
9293
9525
  return !!url;
@@ -9295,13 +9527,7 @@
9295
9527
  var _b = __read(_a, 2), url = _b[0], mimeType = _b[1];
9296
9528
  return BlobUrl.from(url, mimeType);
9297
9529
  })).subscribe(function (blobUrl) { return _this.blobUrl = blobUrl; });
9298
- }
9299
- /***************************************************************************
9300
- * *
9301
- * Life Cycle *
9302
- * *
9303
- **************************************************************************/
9304
- ElderBlobViewerComponent.prototype.ngOnInit = function () { };
9530
+ };
9305
9531
  ElderBlobViewerComponent.prototype.ngOnDestroy = function () {
9306
9532
  this.destroy$.next();
9307
9533
  this.destroy$.complete();
@@ -11094,6 +11320,54 @@
11094
11320
  { type: DataContextSelectionDirective }
11095
11321
  ]; };
11096
11322
 
11323
+ var DataContextStateIndicatorComponent = /** @class */ (function () {
11324
+ /***************************************************************************
11325
+ * *
11326
+ * Constructor *
11327
+ * *
11328
+ **************************************************************************/
11329
+ function DataContextStateIndicatorComponent() {
11330
+ /***************************************************************************
11331
+ * *
11332
+ * Fields *
11333
+ * *
11334
+ **************************************************************************/
11335
+ this.dataContext$ = new rxjs.BehaviorSubject(null);
11336
+ }
11337
+ /***************************************************************************
11338
+ * *
11339
+ * Life Cycle *
11340
+ * *
11341
+ **************************************************************************/
11342
+ DataContextStateIndicatorComponent.prototype.ngOnInit = function () {
11343
+ };
11344
+ Object.defineProperty(DataContextStateIndicatorComponent.prototype, "dataContext", {
11345
+ /***************************************************************************
11346
+ * *
11347
+ * Properties *
11348
+ * *
11349
+ **************************************************************************/
11350
+ set: function (dataContext) {
11351
+ this.dataContext$.next(dataContext);
11352
+ },
11353
+ enumerable: false,
11354
+ configurable: true
11355
+ });
11356
+ return DataContextStateIndicatorComponent;
11357
+ }());
11358
+ DataContextStateIndicatorComponent.decorators = [
11359
+ { type: i0.Component, args: [{
11360
+ selector: 'elder-data-context-state-indicator',
11361
+ template: "<ng-container *ngIf=\"dataContext$ | async as dataContext\">\n\n <ng-container *ngIf=\"dataContext else noDataContext\">\n\n <ng-container *ngIf=\"(dataContext.isStarted$ | async) else dataContextNotStarted\">\n\n <ng-container *ngIf=\"!(dataContext?.status | async)?.hasError else dataContextHasError\">\n\n <ng-container *ngIf=\"(dataContext?.data | async)?.length === 0\">\n <ng-template [ngTemplateOutlet]=\"dataContextNoData\"></ng-template>\n </ng-container>\n\n </ng-container>\n\n </ng-container>\n\n </ng-container>\n\n</ng-container>\n\n<ng-template #noDataContext>\n <ng-container *ngTemplateOutlet=\"indicator; context:{icon: 'warning', text: 'No data context'}\">\n </ng-container>\n</ng-template>\n\n<ng-template #dataContextNotStarted>\n <ng-container *ngTemplateOutlet=\"indicator; context:{icon: 'warning', text: 'Data context not started'}\">\n </ng-container>\n</ng-template>\n\n<ng-template #dataContextHasError>\n <ng-container *ngTemplateOutlet=\"indicator; context:{icon: 'warning', iconColor: 'warn', text: 'Error while loading data'}\">\n </ng-container>\n</ng-template>\n\n<ng-template #dataContextNoData>\n <ng-container *ngTemplateOutlet=\"indicator; context:{icon: 'info', text: 'No data available'}\">\n </ng-container>\n</ng-template>\n\n<ng-template #indicator let-icon=\"icon\" let-iconColor=\"iconColor\" let-text=\"text\">\n\n <div fxFill\n fxLayout=\"column\"\n fxLayoutAlign=\"center center\"\n class=\"elder-table-hint mat-body-1\">\n\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <mat-icon [color]=\"iconColor\">{{icon}}</mat-icon>\n <span class=\"hint mat-body-1\">{{text | translate}}</span>\n </div>\n\n </div>\n\n</ng-template>\n",
11362
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
11363
+ styles: [""]
11364
+ },] }
11365
+ ];
11366
+ DataContextStateIndicatorComponent.ctorParameters = function () { return []; };
11367
+ DataContextStateIndicatorComponent.propDecorators = {
11368
+ dataContext: [{ type: i0.Input }]
11369
+ };
11370
+
11097
11371
  var ElderDataCommonModule = /** @class */ (function () {
11098
11372
  function ElderDataCommonModule() {
11099
11373
  }
@@ -11117,14 +11391,16 @@
11117
11391
  ElderToolbarContentDirective,
11118
11392
  ElderSingleSortComponent,
11119
11393
  ElderSelectionMasterCheckboxComponent,
11120
- DataContextSelectionDirective
11394
+ DataContextSelectionDirective,
11395
+ DataContextStateIndicatorComponent
11121
11396
  ],
11122
11397
  exports: [
11123
11398
  ElderDataToolbarComponent,
11124
11399
  ElderToolbarContentDirective,
11125
11400
  ElderSingleSortComponent,
11126
11401
  ElderSelectionMasterCheckboxComponent,
11127
- DataContextSelectionDirective
11402
+ DataContextSelectionDirective,
11403
+ DataContextStateIndicatorComponent
11128
11404
  ],
11129
11405
  },] }
11130
11406
  ];
@@ -11657,6 +11933,7 @@
11657
11933
  * Underlying data context.
11658
11934
  */
11659
11935
  this.dataContext$ = new rxjs.BehaviorSubject(null);
11936
+ this.interactionMode = 'open';
11660
11937
  /**
11661
11938
  * If true, this table is in dense mode.
11662
11939
  * Heights are generally reduced.
@@ -11672,6 +11949,7 @@
11672
11949
  * No borders / floating visible so that the table can be embedded into another container
11673
11950
  */
11674
11951
  this._embedded = false;
11952
+ this._itemClickSubject = new rxjs.Subject();
11675
11953
  if (!selectionModel) {
11676
11954
  this.selectionModel = new SelectionModel(false, [], function (entity) { return entity ? _this.getId(entity) : 0; });
11677
11955
  }
@@ -11778,6 +12056,18 @@
11778
12056
  enumerable: false,
11779
12057
  configurable: true
11780
12058
  });
12059
+ Object.defineProperty(ElderDataViewBaseComponent.prototype, "itemClick", {
12060
+ /***************************************************************************
12061
+ * *
12062
+ * On click properties *
12063
+ * *
12064
+ **************************************************************************/
12065
+ get: function () {
12066
+ return this._itemClickSubject;
12067
+ },
12068
+ enumerable: false,
12069
+ configurable: true
12070
+ });
11781
12071
  Object.defineProperty(ElderDataViewBaseComponent.prototype, "dense", {
11782
12072
  get: function () {
11783
12073
  return this._dense;
@@ -11824,7 +12114,38 @@
11824
12114
  * @param data
11825
12115
  * @protected
11826
12116
  */
11827
- ElderDataViewBaseComponent.prototype.onDataContextSet = function (data) { };
12117
+ ElderDataViewBaseComponent.prototype.onDataContextSet = function (data) {
12118
+ };
12119
+ ElderDataViewBaseComponent.prototype.onItemClick = function (entity) {
12120
+ if (entity) {
12121
+ switch (this.interactionMode) {
12122
+ case 'open':
12123
+ if (this.selectionModel.hasValue) {
12124
+ this.selectionModel.toggle(entity);
12125
+ }
12126
+ else {
12127
+ this._itemClickSubject.next(entity);
12128
+ }
12129
+ break;
12130
+ case 'selection':
12131
+ this.selectionModel.toggle(entity);
12132
+ break;
12133
+ }
12134
+ }
12135
+ };
12136
+ ElderDataViewBaseComponent.prototype.onItemDoubleClick = function (entity) {
12137
+ if (entity) {
12138
+ switch (this.interactionMode) {
12139
+ // double click in open mode not supported
12140
+ case 'open':
12141
+ break;
12142
+ // double click in selection mode triggers normal item click
12143
+ case 'selection':
12144
+ this._itemClickSubject.next(entity);
12145
+ break;
12146
+ }
12147
+ }
12148
+ };
11828
12149
  /***************************************************************************
11829
12150
  * *
11830
12151
  * Private Methods *
@@ -11844,11 +12165,13 @@
11844
12165
  { type: ElderDataViewSelectionMode }
11845
12166
  ]; };
11846
12167
  ElderDataViewBaseComponent.propDecorators = {
12168
+ interactionMode: [{ type: i0.Input }],
11847
12169
  selectableEvaluatorFn: [{ type: i0.Input }],
11848
12170
  selection: [{ type: i0.Input }],
11849
12171
  selectionChange: [{ type: i0.Output }],
11850
12172
  selectionSingleChange: [{ type: i0.Output }],
11851
12173
  selectionMultiEnabled: [{ type: i0.Input }],
12174
+ itemClick: [{ type: i0.Output }],
11852
12175
  dense: [{ type: i0.Input }],
11853
12176
  float: [{ type: i0.Input }],
11854
12177
  embedded: [{ type: i0.Input }]
@@ -12316,7 +12639,6 @@
12316
12639
  **************************************************************************/
12317
12640
  _this.logger = tsLogger.LoggerFactory.getLogger(_this.constructor.name);
12318
12641
  _this.destroy$ = new rxjs.Subject();
12319
- _this._itemClickSubject = new rxjs.Subject();
12320
12642
  /**
12321
12643
  * Load next chunk after current is done
12322
12644
  */
@@ -12347,7 +12669,6 @@
12347
12669
  _this.cleanUp = true;
12348
12670
  _this.keepSelection = true;
12349
12671
  _this.showFooter = false;
12350
- _this.interactionMode = 'open';
12351
12672
  _this.toolbarRowTemplates$ = new rxjs.BehaviorSubject([]);
12352
12673
  /**
12353
12674
  * Gets the current rows of this table.
@@ -12434,7 +12755,7 @@
12434
12755
  if (data instanceof Array) {
12435
12756
  dc = DataContextBuilder.start()
12436
12757
  .localSort()
12437
- .buildLocal(data); // Potential Memory leak (See autoCleanUp)
12758
+ .buildLocal(data, this.idField); // Potential Memory leak (See autoCleanUp)
12438
12759
  dc.start();
12439
12760
  }
12440
12761
  else if (isDataSource(data)) {
@@ -12493,13 +12814,6 @@
12493
12814
  enumerable: false,
12494
12815
  configurable: true
12495
12816
  });
12496
- Object.defineProperty(ElderTableComponent.prototype, "itemClick", {
12497
- get: function () {
12498
- return this._itemClickSubject;
12499
- },
12500
- enumerable: false,
12501
- configurable: true
12502
- });
12503
12817
  /*
12504
12818
  @Output()
12505
12819
  public get activeItem(): Observable<any> {
@@ -12540,42 +12854,6 @@
12540
12854
  enumerable: false,
12541
12855
  configurable: true
12542
12856
  });
12543
- /**
12544
- * Occurs when the user clicks on a row
12545
- */
12546
- ElderTableComponent.prototype.onItemClick = function (entity) {
12547
- switch (this.interactionMode) {
12548
- case 'open':
12549
- if (this.selectionModel.hasValue) {
12550
- this.selectionModel.toggle(entity);
12551
- }
12552
- else {
12553
- this._itemClickSubject.next(entity);
12554
- }
12555
- break;
12556
- case 'selection':
12557
- this.selectionModel.toggle(entity);
12558
- break;
12559
- // TODO improve onItemDoubleClick behavior with Observable
12560
- /*
12561
- clickStream
12562
- .bufferTime(250)
12563
- .map(arr => arr.length)
12564
- .filter(len => len === 2);
12565
- */
12566
- }
12567
- };
12568
- ElderTableComponent.prototype.onItemDoubleClick = function (entity) {
12569
- switch (this.interactionMode) {
12570
- // double click in open mode not supported
12571
- case 'open':
12572
- break;
12573
- // double click in selection mode triggers normal item click
12574
- case 'selection':
12575
- this._itemClickSubject.next(entity);
12576
- break;
12577
- }
12578
- };
12579
12857
  /***************************************************************************
12580
12858
  * *
12581
12859
  * Private Methods *
@@ -12618,7 +12896,7 @@
12618
12896
  ElderTableComponent.decorators = [
12619
12897
  { type: i0.Component, args: [{
12620
12898
  selector: 'elder-table, ebs-table',
12621
- template: "\n<div fxLayout=\"column\" fxFlex\n class=\"elder-table\"\n [class.elder-mat-table-container]=\"!embedded\"\n [class.mat-elevation-z5]=\"float\"\n [class.elder-mat-table-flat]=\"!embedded && !float\"\n>\n\n <!-- Toolbar Rows -->\n <ng-container *ngFor=\"let toolbarRowTemplate of toolbarRowTemplates$ | async\">\n <ng-template *ngTemplateOutlet=\"toolbarRowTemplate; context: {$implicit: this}\">\n </ng-template>\n </ng-container>\n\n <!-- Scrollable Table -->\n <div fxLayout=\"column\" class=\"scrollable elder-table-scroll\"\n infiniteScroll\n [eventThrottle]=\"150\"\n [offsetFactor]=\"2\"\n [ignoreScrollEvent]=\"!isContinuable || !(canLoadMore$ | async)\"\n (closeToEnd)=\"requestMoreDataZoned($event)\"\n >\n <table\n mat-table\n class=\"elder-mat-inner-table\"\n [trackBy]=\"trackByFn\"\n [dataSource]=\"dataContext$ | async\"\n [elderDataContextSelection]=\"dataContext$ | async\" #dataSelection=\"elderDataContextSelection\"\n [elderDataContextSelectionModel]=\"selectionModel\"\n >\n\n <!-- selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef>\n <elder-selection-master-checkbox></elder-selection-master-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selectionModel.toggle(entity) : null\"\n [checked]=\"selectionModel.observeSelection(entity) | async\"\n [disabled]=\"!selectionModel.isSelectable(entity)\"\n class=\"elder-table-checkbox\"\n [class.elder-table-checkbox-visible]=\"(dataSelection.selectionState$ | async).anySelected\"\n >\n </mat-checkbox>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container *ngIf=\"(tableModel.displayedColumnsInner$ | async) as displayedColumnsInner\">\n <tr mat-header-row *matHeaderRowDef=\"displayedColumnsInner; sticky: true\"></tr>\n <tr mat-row class=\"elder-table-row\"\n *matRowDef=\"let entity; columns: displayedColumnsInner;\"\n [elderTableRow]=\"entity\"\n [class.dense]=\"dense\"\n [class.elder-row-hidden]=\"hiddenField && entity[hiddenField]\"\n [class.elder-row-removing]=\"removingField && entity[removingField]\"\n [class.elder-table-row-selected]=\"interactionMode == 'selection' && selectionModel.observeSelection(entity) | async\"\n (click)=\"$event ? onItemClick(entity) : null\"\n (dblclick)=\"$event ? onItemDoubleClick(entity) : null\"\n >\n </tr>\n <ng-container *ngIf=\"showFooter\">\n <tr mat-footer-row *matFooterRowDef=\"displayedColumnsInner; sticky: true\"></tr>\n </ng-container>\n </ng-container>\n </table>\n </div>\n\n <div fxLayout=\"column\" fxFlex fxLayoutAlign=\"center center\">\n\n <span class=\"elder-table-hint mat-body-1\" *ngIf=\"(dataContext?.data | async)?.length === 0 && !(dataContext?.status | async)?.hasError\">\n {{'No data available' | translate}}\n </span>\n\n <div *ngIf=\"(dataContext?.status | async)?.hasError\"\n fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"20px\">\n <mat-icon color=\"warn\">warning</mat-icon>\n <span class=\"hint mat-body-1\">{{'Error while loading data' | translate}}</span>\n </div>\n\n </div>\n\n <mat-progress-bar fxFlex=\"none\"\n [mode]=\"(dataContext?.loading | async) ? 'indeterminate' : 'determinate'\"\n [color]=\"((dataContext?.status | async)?.hasError) ? 'warn' : 'primary'\">\n </mat-progress-bar>\n\n <!-- Optional Paginator Toolbar -->\n <mat-paginator #matPaginator *ngIf=\"isActivePaged && (dataActivePaged.page | async) as page\"\n fxFlex=\"none\"\n [length]=\"dataContext?.total | async\"\n [pageIndex]=\"page?.index\"\n [pageSize]=\"page?.size\"\n [pageSizeOptions]=\"pageSizeOptions\">\n </mat-paginator>\n\n <!-- Optional Continuation Footer -->\n <div *ngIf=\"isContinuable\" class=\"elder-table-footer\"\n fxLayout=\"row\" fxFlex=\"none\" fxLayoutAlign=\"end center\" fxLayoutGap=\"10px\"\n style=\"padding-right: 10px\" >\n\n <span class=\"mat-caption noselect\" style=\"color: gray\">\n {{(dataContext?.data | async)?.length}} / {{total$ | async}}\n </span>\n\n <button mat-icon-button type=\"button\" color=\"primary\"\n [disabled]=\"!(canLoadMore$ | async)\"\n (click)=\"dataContinuable.loadMore()\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n </div>\n\n</div>\n",
12899
+ template: "\n<div fxLayout=\"column\" fxFlex\n class=\"elder-table\"\n [class.elder-mat-table-container]=\"!embedded\"\n [class.mat-elevation-z5]=\"float\"\n [class.elder-mat-table-flat]=\"!embedded && !float\"\n>\n\n <!-- Toolbar Rows -->\n <ng-container *ngFor=\"let toolbarRowTemplate of toolbarRowTemplates$ | async\">\n <ng-template *ngTemplateOutlet=\"toolbarRowTemplate; context: {$implicit: this}\">\n </ng-template>\n </ng-container>\n\n <!-- Scrollable Table -->\n <div fxLayout=\"column\" class=\"scrollable elder-table-scroll\"\n infiniteScroll\n [eventThrottle]=\"150\"\n [offsetFactor]=\"2\"\n [ignoreScrollEvent]=\"!isContinuable || !(canLoadMore$ | async)\"\n (closeToEnd)=\"requestMoreDataZoned($event)\"\n >\n <table\n mat-table\n class=\"elder-mat-inner-table\"\n [trackBy]=\"trackByFn\"\n [dataSource]=\"dataContext$ | async\"\n [elderDataContextSelection]=\"dataContext$ | async\" #dataSelection=\"elderDataContextSelection\"\n [elderDataContextSelectionModel]=\"selectionModel\"\n >\n\n <!-- selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef>\n <elder-selection-master-checkbox></elder-selection-master-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selectionModel.toggle(entity) : null\"\n [checked]=\"selectionModel.observeSelection(entity) | async\"\n [disabled]=\"!selectionModel.isSelectable(entity)\"\n class=\"elder-table-checkbox\"\n [class.elder-table-checkbox-visible]=\"(dataSelection.selectionState$ | async).anySelected\"\n >\n </mat-checkbox>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container *ngIf=\"(tableModel.displayedColumnsInner$ | async) as displayedColumnsInner\">\n <tr mat-header-row *matHeaderRowDef=\"displayedColumnsInner; sticky: true\"></tr>\n <tr mat-row class=\"elder-table-row\"\n *matRowDef=\"let entity; columns: displayedColumnsInner;\"\n [elderTableRow]=\"entity\"\n [class.dense]=\"dense\"\n [class.elder-row-hidden]=\"hiddenField && entity[hiddenField]\"\n [class.elder-row-removing]=\"removingField && entity[removingField]\"\n [class.elder-table-row-selected]=\"interactionMode == 'selection' && selectionModel.observeSelection(entity) | async\"\n (click)=\"onItemClick(entity)\"\n (dblclick)=\"onItemDoubleClick(entity)\"\n >\n </tr>\n <ng-container *ngIf=\"showFooter\">\n <tr mat-footer-row *matFooterRowDef=\"displayedColumnsInner; sticky: true\"></tr>\n </ng-container>\n </ng-container>\n </table>\n </div>\n\n <elder-data-context-state-indicator fxFlex [dataContext]=\"dataContext\">\n </elder-data-context-state-indicator>\n\n <mat-progress-bar fxFlex=\"none\"\n [mode]=\"(dataContext?.loading | async) ? 'indeterminate' : 'determinate'\"\n [color]=\"((dataContext?.status | async)?.hasError) ? 'warn' : 'primary'\">\n </mat-progress-bar>\n\n <!-- Optional Paginator Toolbar -->\n <mat-paginator #matPaginator *ngIf=\"isActivePaged && (dataActivePaged.page | async) as page\"\n fxFlex=\"none\"\n [length]=\"dataContext?.total | async\"\n [pageIndex]=\"page?.index\"\n [pageSize]=\"page?.size\"\n [pageSizeOptions]=\"pageSizeOptions\">\n </mat-paginator>\n\n <!-- Optional Continuation Footer -->\n <div *ngIf=\"isContinuable\" class=\"elder-table-footer\"\n fxLayout=\"row\" fxFlex=\"none\" fxLayoutAlign=\"end center\" fxLayoutGap=\"10px\"\n style=\"padding-right: 10px\" >\n\n <span class=\"mat-caption noselect\" style=\"color: gray\">\n {{(dataContext?.data | async)?.length}} / {{total$ | async}}\n </span>\n\n <button mat-icon-button type=\"button\" color=\"primary\"\n [disabled]=\"!(canLoadMore$ | async)\"\n (click)=\"dataContinuable.loadMore()\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n </div>\n\n</div>\n",
12622
12900
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
12623
12901
  providers: [
12624
12902
  ElderTableProviders.ExistingOrNewTableModel,
@@ -12652,14 +12930,12 @@
12652
12930
  cleanUp: [{ type: i0.Input }],
12653
12931
  keepSelection: [{ type: i0.Input }],
12654
12932
  showFooter: [{ type: i0.Input }],
12655
- interactionMode: [{ type: i0.Input }],
12656
12933
  toolbarRowTemplateQuery: [{ type: i0.ContentChildren, args: [ElderTableToolbarDirective, { read: i0.TemplateRef },] }],
12657
12934
  rowsQuery: [{ type: i0.ViewChildren, args: [ElderTableRowDirective,] }],
12658
12935
  toolbarTemplate: [{ type: i0.Input }],
12659
12936
  data: [{ type: i0.Input }],
12660
12937
  displayedColumns: [{ type: i0.Input }],
12661
- selectionVisible: [{ type: i0.Input }],
12662
- itemClick: [{ type: i0.Output }]
12938
+ selectionVisible: [{ type: i0.Input }]
12663
12939
  };
12664
12940
 
12665
12941
  var ElderInfiniteScrollDirective = /** @class */ (function () {
@@ -14634,19 +14910,10 @@
14634
14910
  */
14635
14911
  _this.idField = 'id';
14636
14912
  _this.selectionVisible = true;
14637
- _this.interactionMode = 'open';
14638
14913
  _this.pageSizeOptions = [30, 50, 100, 150, 200];
14639
14914
  _this.destroy$ = new rxjs.Subject();
14640
- _this._itemClickSubject = new rxjs.Subject();
14641
14915
  return _this;
14642
14916
  }
14643
- Object.defineProperty(ElderGridComponent.prototype, "itemClick", {
14644
- get: function () {
14645
- return this._itemClickSubject;
14646
- },
14647
- enumerable: false,
14648
- configurable: true
14649
- });
14650
14917
  /***************************************************************************
14651
14918
  * *
14652
14919
  * Lifecycle *
@@ -14749,18 +15016,6 @@
14749
15016
  * Public API *
14750
15017
  * *
14751
15018
  **************************************************************************/
14752
- ElderGridComponent.prototype.onItemClick = function (entity) {
14753
- switch (this.interactionMode) {
14754
- case 'open':
14755
- if (this.selectionModel.hasValue) {
14756
- this.selectionModel.toggle(entity);
14757
- }
14758
- else {
14759
- this._itemClickSubject.next(entity);
14760
- }
14761
- break;
14762
- }
14763
- };
14764
15019
  ElderGridComponent.prototype.inSelectionMode = function (currentSelection) {
14765
15020
  if (this.interactionMode === 'selection') {
14766
15021
  return true;
@@ -14844,7 +15099,7 @@
14844
15099
  ElderGridComponent.decorators = [
14845
15100
  { type: i0.Component, args: [{
14846
15101
  selector: 'elder-grid',
14847
- template: "<div fxLayout=\"column\" class=\"scroll-fix\" fxFill>\n\n <!-- Grid Browser -->\n <div fxLayout=\"column\" fxFlex\n class=\"scroll-fix elder-grid-container\"\n *ngIf=\"dataContext$ | async as data\"\n [class.elder-mat-table-container]=\"!embedded\"\n [class.mat-elevation-z5]=\"float\"\n [class.elder-mat-table-flat]=\"!embedded && !float\"\n\n [elderDataContextSelection]=\"data\" #dataSelection=\"elderDataContextSelection\"\n [elderDataContextSelectionModel]=\"selectionModel\"\n >\n\n <!-- Toolbar Row -->\n <div *ngIf=\"toolbarVisible\"\n fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"none\" class=\"elder-grid-toolbar\">\n\n <div fxLayout=\"column\" fxFlex=\"none\" style=\"padding-left: 8px; padding-right: 8px\" *ngIf=\"selectionVisible\">\n <elder-selection-master-checkbox fxFlex=\"none\" style=\"padding-left: 12px\"></elder-selection-master-checkbox>\n </div>\n\n <!-- Toolbar -->\n <ng-container *ngIf=\"toolbarTemplate\">\n <ng-template *ngTemplateOutlet=\"toolbarTemplate; context: {$implicit: this}\"></ng-template>\n </ng-container>\n\n <elder-single-sort *ngIf=\"availableSorts && availableSorts.length > 0 && data.sort.sorts | async as sorts\"\n fxFlex=\"none\"\n [availableSorts]=\"availableSorts\"\n [translationPrefix]=\"sortTranslationPrefix\"\n [sort]=\"sorts[0]\"\n (sortChange)=\"updateSort($event)\">\n </elder-single-sort>\n\n </div>\n\n <mat-divider *ngIf=\"toolbarVisible\"></mat-divider>\n\n <span class=\"elder-table-hint mat-body-1\" fxFlex fxLayoutAlign=\"center center\"\n *ngIf=\"!dataContext?.isStarted\">\n {{'Datacontext not started' | translate}}\n </span>\n\n <div *ngIf=\"(dataContext?.data | async)?.isStarted\" fxFlex fxLayoutAlign=\"center center\">\n\n <span class=\"elder-table-hint mat-body-1\"\n *ngIf=\"(dataContext?.data | async)?.length === 0 && !(dataContext?.status | async)?.hasError\">\n {{'No data available' | translate}}\n </span>\n\n <div *ngIf=\"(dataContext?.status | async)?.hasError\"\n fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"20px\">\n <mat-icon color=\"warn\">warning</mat-icon>\n <span class=\"hint mat-body-1\">{{'Error while loading data' | translate}}</span>\n </div>\n\n </div>\n\n <!-- [cdkDropListSortingDisabled]=\"true\" -->\n <!-- cdkDropList -->\n <cdk-virtual-scroll-viewport\n class=\"elder-grid-browser\" fxLayout=\"column\" fxFlex\n id=\"documents-container\"\n [itemSize]=\"itemHeight\"\n [minBufferPx]=\"itemHeight * 2\"\n [maxBufferPx]=\"itemHeight * 3\"\n #virtualScrollViewPort\n infiniteScroll\n [eventThrottle]=\"200\"\n [offsetFactor]=\"2\"\n [ignoreScrollEvent]=\"data.loading | async\"\n [containerId]=\"'documents-container'\" [listenToHost]=\"false\"\n (closeToEnd)=\"requestMoreDataZoned($event)\">\n\n <!-- (scrolling)=\"onScrolling($event)\" -->\n\n <div\n *cdkVirtualFor=\"let row of dataRows$; trackBy: trackByIndex; templateCacheSize: 50\"\n class=\"elder-grid-tile-row\"\n [style.height]=\"itemHeight + 'px'\">\n\n <ng-container *ngFor=\"let tile of row; trackBy: trackByFn\">\n\n <!-- Tile Cell -->\n <div *ngIf=\"showTile(tile)\" class=\"elder-grid-tile\"\n (click)=\"$event ? onItemClick(tile) : null\">\n <!-- cdkDrag [cdkDragDisabled]=\"true\" [cdkDragData]=\"tile\" -->\n <!-- <div class=\"tile-placeholder\" *cdkDragPlaceholder></div> -->\n <div class=\"elder-grid-tile-content\">\n <ng-container\n *ngTemplateOutlet=\"tileTemplate || simpleTileTemplate; context: {$implicit: tile}\">\n </ng-container>\n\n <!-- Overlay (Selection) -->\n <ng-container *ngIf=\"selectionVisible\">\n <div *ngIf=\"selectionModel.selection | async as selection\"\n class=\"elder-grid-tile-overlay\"\n [class.elder-grid-tile-overlay-hidden]=\"!inSelectionMode(selection)\"\n [class.elder-grid-tile-overlay-visible]=\"inSelectionMode(selection)\"\n [class.elder-click-through]=\"!inSelectionMode(selection)\"\n (click)=\"selectionModel.toggle(tile)\"\n >\n <button mat-icon-button type=\"button\"\n (click)=\"selectionModel.toggle(tile)\" elderStopEventPropagation\n class=\"elder-grid-tile-check\">\n <mat-icon\n [class.elder-selected]=\"(selectionModel.observeSelection(tile) | async)\"\n >\n {{(selectionModel.observeSelection(tile) | async) ? 'check_circle' : 'radio_button_unchecked'}}\n </mat-icon>\n </button>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n <div *ngIf=\"!showTile(tile)\" class=\"elder-grid-tile-hidden\"></div>\n </ng-container>\n\n </div>\n\n </cdk-virtual-scroll-viewport>\n\n\n <mat-progress-bar fxFlex=\"none\"\n [mode]=\"(data?.loading | async) ? 'indeterminate' : 'determinate'\"\n [color]=\"(data && (data.status | async)?.hasError) ? 'warn' : 'primary'\">\n </mat-progress-bar>\n\n <!-- Footer -->\n <div class=\"elder-grid-footer\" *ngIf=\"footerVisible\"\n fxLayout=\"row\" fxFlex=\"none\" fxLayoutAlign=\"end center\" fxLayoutGap=\"10px\"\n style=\"padding-right: 10px\">\n\n <!-- Continuable -->\n <ng-container *ngIf=\"isContinuable\">\n <span class=\"mat-caption noselect\" style=\"color: gray\">\n {{(dataSnapshot?.data | async)?.length}} / {{total$ | async}}\n </span>\n\n <button mat-icon-button type=\"button\"\n color=\"primary\"\n [disabled]=\"!(canLoadMore$ | async)\"\n (click)=\"dataSnapshot.loadMore()\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n </ng-container>\n\n <!-- Paged -->\n <mat-paginator #matPaginator *ngIf=\"isActivePaged && (dataActivePaged.page | async) as page\"\n fxFlex=\"none\"\n [length]=\"dataContext?.total | async\"\n [pageIndex]=\"page?.index\"\n [pageSize]=\"page?.size\"\n [pageSizeOptions]=\"pageSizeOptions\">\n </mat-paginator>\n\n <!-- Local Source -->\n <ng-container *ngIf=\"!isActivePaged && !isContinuable\">\n <span class=\"mat-caption noselect\" style=\"color: gray\">\n {{(dataSnapshot?.data | async)?.length}}\n </span>\n </ng-container>\n\n </div>\n\n\n </div>\n</div>\n\n<ng-template #simpleTileTemplate let-tile>\n <div *ngIf=\"tile\" fxLayout=\"column\" fxFlex fxLayoutAlign=\"center center\" style=\"background-color: lightblue\">\n <p class=\"noselect\">Tile: {{tile}}</p>\n </div>\n</ng-template>\n",
15102
+ template: "<div fxLayout=\"column\" class=\"scroll-fix\" fxFill>\n\n <!-- Grid Browser -->\n <div fxLayout=\"column\" fxFlex\n class=\"scroll-fix elder-grid-container\"\n *ngIf=\"dataContext$ | async as data\"\n [class.elder-mat-table-container]=\"!embedded\"\n [class.mat-elevation-z5]=\"float\"\n [class.elder-mat-table-flat]=\"!embedded && !float\"\n\n [elderDataContextSelection]=\"data\" #dataSelection=\"elderDataContextSelection\"\n [elderDataContextSelectionModel]=\"selectionModel\"\n >\n\n <!-- Toolbar Row -->\n <div *ngIf=\"toolbarVisible\"\n fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"none\" class=\"elder-grid-toolbar\">\n\n <div fxLayout=\"column\" fxFlex=\"none\" style=\"padding-left: 8px; padding-right: 8px\" *ngIf=\"selectionVisible\">\n <elder-selection-master-checkbox fxFlex=\"none\" style=\"padding-left: 12px\"></elder-selection-master-checkbox>\n </div>\n\n <!-- Toolbar -->\n <ng-container *ngIf=\"toolbarTemplate\">\n <ng-template *ngTemplateOutlet=\"toolbarTemplate; context: {$implicit: this}\"></ng-template>\n </ng-container>\n\n <elder-single-sort *ngIf=\"availableSorts && availableSorts.length > 0 && data.sort.sorts | async as sorts\"\n fxFlex=\"none\"\n [availableSorts]=\"availableSorts\"\n [translationPrefix]=\"sortTranslationPrefix\"\n [sort]=\"sorts[0]\"\n (sortChange)=\"updateSort($event)\">\n </elder-single-sort>\n\n </div>\n\n <mat-divider *ngIf=\"toolbarVisible\"></mat-divider>\n\n <span class=\"elder-table-hint mat-body-1\" fxFlex fxLayoutAlign=\"center center\"\n *ngIf=\"!dataContext?.isStarted\">\n {{'Datacontext not started' | translate}}\n </span>\n\n <div *ngIf=\"(dataContext?.data | async)?.isStarted\" fxFlex fxLayoutAlign=\"center center\">\n\n <span class=\"elder-table-hint mat-body-1\"\n *ngIf=\"(dataContext?.data | async)?.length === 0 && !(dataContext?.status | async)?.hasError\">\n {{'No data available' | translate}}\n </span>\n\n <div *ngIf=\"(dataContext?.status | async)?.hasError\"\n fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"20px\">\n <mat-icon color=\"warn\">warning</mat-icon>\n <span class=\"hint mat-body-1\">{{'Error while loading data' | translate}}</span>\n </div>\n\n </div>\n\n <!-- [cdkDropListSortingDisabled]=\"true\" -->\n <!-- cdkDropList -->\n <cdk-virtual-scroll-viewport\n class=\"elder-grid-browser\" fxLayout=\"column\" fxFlex\n id=\"documents-container\"\n [itemSize]=\"itemHeight\"\n [minBufferPx]=\"itemHeight * 2\"\n [maxBufferPx]=\"itemHeight * 3\"\n #virtualScrollViewPort\n infiniteScroll\n [eventThrottle]=\"200\"\n [offsetFactor]=\"2\"\n [ignoreScrollEvent]=\"data.loading | async\"\n [containerId]=\"'documents-container'\" [listenToHost]=\"false\"\n (closeToEnd)=\"requestMoreDataZoned($event)\">\n\n <!-- (scrolling)=\"onScrolling($event)\" -->\n\n <div\n *cdkVirtualFor=\"let row of dataRows$; trackBy: trackByIndex; templateCacheSize: 50\"\n class=\"elder-grid-tile-row\"\n [style.height]=\"itemHeight + 'px'\">\n\n <ng-container *ngFor=\"let tile of row; trackBy: trackByFn\">\n\n <!-- Tile Cell -->\n <div *ngIf=\"showTile(tile)\" class=\"elder-grid-tile\">\n <!-- cdkDrag [cdkDragDisabled]=\"true\" [cdkDragData]=\"tile\" -->\n <!-- <div class=\"tile-placeholder\" *cdkDragPlaceholder></div> -->\n <div class=\"elder-grid-tile-content\"\n (click)=\"onItemClick(tile)\"\n (dblclick)=\"onItemDoubleClick(tile)\">\n <ng-container\n *ngTemplateOutlet=\"tileTemplate || simpleTileTemplate; context: {$implicit: tile}\">\n </ng-container>\n\n <!-- Overlay (Selection) -->\n <ng-container *ngIf=\"selectionVisible\">\n <div *ngIf=\"selectionModel.selection | async as selection\"\n class=\"elder-grid-tile-overlay\"\n [class.elder-grid-tile-overlay-hidden]=\"!inSelectionMode(selection)\"\n [class.elder-grid-tile-overlay-visible]=\"inSelectionMode(selection)\"\n [class.elder-click-through]=\"true\"\n >\n <button mat-icon-button type=\"button\"\n (click)=\"selectionModel.toggle(tile)\" elderStopEventPropagation\n class=\"elder-grid-tile-check\">\n <mat-icon\n [class.elder-selected]=\"(selectionModel.observeSelection(tile) | async)\"\n >\n {{(selectionModel.observeSelection(tile) | async) ? 'check_circle' : 'radio_button_unchecked'}}\n </mat-icon>\n </button>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n <div *ngIf=\"!showTile(tile)\" class=\"elder-grid-tile-hidden\"></div>\n </ng-container>\n\n </div>\n\n </cdk-virtual-scroll-viewport>\n\n\n <mat-progress-bar fxFlex=\"none\"\n [mode]=\"(data?.loading | async) ? 'indeterminate' : 'determinate'\"\n [color]=\"(data && (data.status | async)?.hasError) ? 'warn' : 'primary'\">\n </mat-progress-bar>\n\n <!-- Footer -->\n <div class=\"elder-grid-footer\" *ngIf=\"footerVisible\"\n fxLayout=\"row\" fxFlex=\"none\" fxLayoutAlign=\"end center\" fxLayoutGap=\"10px\"\n style=\"padding-right: 10px\">\n\n <!-- Continuable -->\n <ng-container *ngIf=\"isContinuable\">\n <span class=\"mat-caption noselect\" style=\"color: gray\">\n {{(dataSnapshot?.data | async)?.length}} / {{total$ | async}}\n </span>\n\n <button mat-icon-button type=\"button\"\n color=\"primary\"\n [disabled]=\"!(canLoadMore$ | async)\"\n (click)=\"dataSnapshot.loadMore()\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n </ng-container>\n\n <!-- Paged -->\n <mat-paginator #matPaginator *ngIf=\"isActivePaged && (dataActivePaged.page | async) as page\"\n fxFlex=\"none\"\n [length]=\"dataContext?.total | async\"\n [pageIndex]=\"page?.index\"\n [pageSize]=\"page?.size\"\n [pageSizeOptions]=\"pageSizeOptions\">\n </mat-paginator>\n\n <!-- Local Source -->\n <ng-container *ngIf=\"!isActivePaged && !isContinuable\">\n <span class=\"mat-caption noselect\" style=\"color: gray\">\n {{(dataSnapshot?.data | async)?.length}}\n </span>\n </ng-container>\n\n </div>\n\n\n </div>\n</div>\n\n<ng-template #simpleTileTemplate let-tile>\n <div *ngIf=\"tile\" fxLayout=\"column\" fxFlex fxLayoutAlign=\"center center\" style=\"background-color: lightblue\">\n <p class=\"noselect\">Tile: {{tile}}</p>\n </div>\n</ng-template>\n",
14848
15103
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
14849
15104
  providers: [
14850
15105
  {
@@ -14872,11 +15127,9 @@
14872
15127
  hiddenField: [{ type: i0.Input }],
14873
15128
  idField: [{ type: i0.Input }],
14874
15129
  selectionVisible: [{ type: i0.Input }],
14875
- interactionMode: [{ type: i0.Input }],
14876
15130
  pageSizeOptions: [{ type: i0.Input }],
14877
15131
  matPaginator: [{ type: i0.ViewChild, args: [paginator.MatPaginator,] }],
14878
15132
  toolbarTemplateQuery: [{ type: i0.ContentChild, args: [ElderGridToolbarDirective, { read: i0.TemplateRef, static: true },] }],
14879
- itemClick: [{ type: i0.Output }],
14880
15133
  tileTemplate: [{ type: i0.Input }],
14881
15134
  toolbarTemplate: [{ type: i0.Input }],
14882
15135
  data: [{ type: i0.Input }],
@@ -24632,7 +24885,7 @@
24632
24885
  ElderAuditedEntityComponent.decorators = [
24633
24886
  { type: i0.Component, args: [{
24634
24887
  selector: 'elder-audited-entity',
24635
- template: "<section [fxLayout]=\"layout\" fxLayoutGap=\"8px\" *ngIf=\"auditedCtx$ | async as ctx\">\n\n <mat-form-field class=\"elder-std-form-field\" [appearance]=\"appearance\">\n <mat-icon class=\"decent noselect\" matSuffix>add_circle_outline</mat-icon>\n <mat-label>{{'context.createdAt' | translate}} {{ctx.audited?.createdAt | timeAgo}}</mat-label>\n <input matInput name=\"created\"\n [value]=\"ctx.audited?.createdAt | date:'dd.MM.yyyy hh:mm'\"\n readonly>\n <mat-hint>{{ctx.audited?.createdBy}}</mat-hint>\n </mat-form-field>\n\n <mat-form-field class=\"elder-std-form-field\" [appearance]=\"appearance\">\n <mat-icon class=\"decent noselect\" matSuffix>mode_edit_outline</mat-icon>\n <mat-label>{{'context.modifiedAt' | translate}} {{ctx.audited?.modifiedAt | timeAgo}}</mat-label>\n <input matInput name=\"modified\"\n [value]=\"ctx.audited?.modifiedAt | date:'dd.MM.yyyy hh:mm'\"\n readonly>\n <mat-hint>{{ctx.audited?.modifiedBy}}</mat-hint>\n </mat-form-field>\n\n</section>\n",
24888
+ template: "<section [fxLayout]=\"layout\" fxLayoutGap=\"8px\" *ngIf=\"auditedCtx$ | async as ctx\">\n\n <mat-form-field class=\"elder-std-form-field\" [appearance]=\"appearance\">\n <mat-label fxLayoutAlign=\"start center\" fxLayoutGap=\"4px\">\n <mat-icon class=\"decent noselect\" inline>add_circle_outline</mat-icon>\n <span>{{'context.createdAt' | translate}} {{ctx.audited?.createdAt | timeAgo}}</span>\n </mat-label>\n <input matInput name=\"created\"\n [value]=\"ctx.audited?.createdAt | date:'dd.MM.yyyy hh:mm'\"\n readonly>\n <mat-hint>{{ctx.audited?.createdBy}}</mat-hint>\n </mat-form-field>\n\n <mat-form-field class=\"elder-std-form-field\" [appearance]=\"appearance\">\n <mat-label fxLayoutAlign=\"start center\" fxLayoutGap=\"4px\">\n <mat-icon class=\"decent noselect\">mode_edit_outline</mat-icon>\n <span>{{'context.modifiedAt' | translate}} {{ctx.audited?.modifiedAt | timeAgo}}</span>\n </mat-label>\n <input matInput name=\"modified\"\n [value]=\"ctx.audited?.modifiedAt | date:'dd.MM.yyyy hh:mm'\"\n readonly>\n <mat-hint>{{ctx.audited?.modifiedBy}}</mat-hint>\n </mat-form-field>\n\n</section>\n",
24636
24889
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
24637
24890
  styles: [".decent{opacity:.5}\n"]
24638
24891
  },] }
@@ -25404,6 +25657,7 @@
25404
25657
  */
25405
25658
 
25406
25659
  exports.AuditedEntity = AuditedEntity;
25660
+ exports.AutoStartSpec = AutoStartSpec;
25407
25661
  exports.BlobUrl = BlobUrl;
25408
25662
  exports.BytesFormat = BytesFormat;
25409
25663
  exports.BytesPerSecondFormat = BytesPerSecondFormat;
@@ -25426,18 +25680,20 @@
25426
25680
  exports.CurrencyUnitRegistry = CurrencyUnitRegistry;
25427
25681
  exports.CustomDateAdapter = CustomDateAdapter;
25428
25682
  exports.DataContextActivePage = DataContextActivePage;
25683
+ exports.DataContextAutoStarter = DataContextAutoStarter;
25429
25684
  exports.DataContextBase = DataContextBase;
25430
25685
  exports.DataContextBuilder = DataContextBuilder;
25431
25686
  exports.DataContextContinuableBase = DataContextContinuableBase;
25432
25687
  exports.DataContextContinuablePaged = DataContextContinuablePaged;
25433
25688
  exports.DataContextContinuableToken = DataContextContinuableToken;
25689
+ exports.DataContextLifeCycleBinding = DataContextLifeCycleBinding;
25434
25690
  exports.DataContextSelectionDirective = DataContextSelectionDirective;
25435
25691
  exports.DataContextSimple = DataContextSimple;
25436
25692
  exports.DataContextSnapshot = DataContextSnapshot;
25693
+ exports.DataContextSourceAutoReloader = DataContextSourceAutoReloader;
25437
25694
  exports.DataContextStatus = DataContextStatus;
25438
25695
  exports.DataSourceAdapter = DataSourceAdapter;
25439
25696
  exports.DataSourceProcessor = DataSourceProcessor;
25440
- exports.DataSourceToDataContextBinding = DataSourceToDataContextBinding;
25441
25697
  exports.DataTransferFactory = DataTransferFactory;
25442
25698
  exports.DataTransferProgress = DataTransferProgress;
25443
25699
  exports.DataTransferProgressAggregate = DataTransferProgressAggregate;
@@ -25785,12 +26041,13 @@
25785
26041
  exports.ɵd = createSelectionModel;
25786
26042
  exports.ɵe = createDataViewSelection;
25787
26043
  exports.ɵf = ELDER_DATA_VIEW;
25788
- exports.ɵh = ElderTripleStateCheckboxDirective;
25789
- exports.ɵi = ElderTableColumnDirective;
25790
- exports.ɵj = ElderTableRowDirective;
25791
- exports.ɵk = ElderPaginatorIntl;
25792
- exports.ɵl = StandardToastComponent;
25793
- exports.ɵm = ElderSelectBase;
26044
+ exports.ɵh = DataContextStateIndicatorComponent;
26045
+ exports.ɵi = ElderTripleStateCheckboxDirective;
26046
+ exports.ɵj = ElderTableColumnDirective;
26047
+ exports.ɵk = ElderTableRowDirective;
26048
+ exports.ɵl = ElderPaginatorIntl;
26049
+ exports.ɵm = StandardToastComponent;
26050
+ exports.ɵn = ElderSelectBase;
25794
26051
 
25795
26052
  Object.defineProperty(exports, '__esModule', { value: true });
25796
26053