@elderbyte/ngx-starter 15.3.4 → 15.4.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 (41) hide show
  1. package/_index.scss +6 -3
  2. package/esm2020/lib/common/data/data-context/data-context-active-page.mjs +2 -2
  3. package/esm2020/lib/common/data/data-context/data-context-base.mjs +46 -27
  4. package/esm2020/lib/common/data/data-context/data-context-builder.mjs +9 -8
  5. package/esm2020/lib/common/data/data-context/data-context-continuable-paged.mjs +7 -8
  6. package/esm2020/lib/common/data/data-context/data-context-continuable-token.mjs +2 -2
  7. package/esm2020/lib/common/data/data-context/data-context-life-cycle-binding.mjs +4 -2
  8. package/esm2020/lib/common/data/data-context/data-context-source-event-binding.mjs +46 -0
  9. package/esm2020/lib/common/data/data-context/data-context.mjs +1 -1
  10. package/esm2020/lib/common/data/data-context/indexed-entities.mjs +143 -0
  11. package/esm2020/lib/common/data/data-context/public_api.mjs +3 -2
  12. package/esm2020/lib/common/data/datasource/data-source-base.mjs +38 -0
  13. package/esm2020/lib/common/data/datasource/data-source-change-event.mjs +24 -0
  14. package/esm2020/lib/common/data/datasource/data-source.mjs +1 -1
  15. package/esm2020/lib/common/data/datasource/local/local-list-data-source.mjs +11 -19
  16. package/esm2020/lib/common/data/datasource/local/local-paged-data-source.mjs +8 -8
  17. package/esm2020/lib/common/data/datasource/public_api.mjs +3 -1
  18. package/esm2020/lib/common/data/datasource/rest/rest-client.mjs +23 -38
  19. package/fesm2015/elderbyte-ngx-starter.mjs +408 -178
  20. package/fesm2015/elderbyte-ngx-starter.mjs.map +1 -1
  21. package/fesm2020/elderbyte-ngx-starter.mjs +407 -178
  22. package/fesm2020/elderbyte-ngx-starter.mjs.map +1 -1
  23. package/lib/common/data/data-context/data-context-base.d.ts +12 -3
  24. package/lib/common/data/data-context/data-context-builder.d.ts +2 -1
  25. package/lib/common/data/data-context/data-context-source-event-binding.d.ts +31 -0
  26. package/lib/common/data/data-context/data-context.d.ts +14 -2
  27. package/lib/common/data/data-context/indexed-entities.d.ts +72 -0
  28. package/lib/common/data/data-context/public_api.d.ts +2 -1
  29. package/lib/common/data/datasource/data-source-base.d.ts +38 -0
  30. package/lib/common/data/datasource/data-source-change-event.d.ts +13 -0
  31. package/lib/common/data/datasource/data-source.d.ts +2 -1
  32. package/lib/common/data/datasource/local/local-list-data-source.d.ts +3 -7
  33. package/lib/common/data/datasource/local/local-paged-data-source.d.ts +5 -3
  34. package/lib/common/data/datasource/public_api.d.ts +2 -0
  35. package/lib/common/data/datasource/rest/rest-client.d.ts +10 -18
  36. package/package.json +1 -1
  37. package/theming/_elder-common.scss +14 -8
  38. package/theming/_elder-config.scss +37 -0
  39. package/theming/_elder-flex-layout.scss +231 -8
  40. package/esm2020/lib/common/data/data-context/data-context-source-auto-reloader.mjs +0 -12
  41. package/lib/common/data/data-context/data-context-source-auto-reloader.d.ts +0 -8
@@ -3001,6 +3001,220 @@ class TokenChunkRequest {
3001
3001
  }
3002
3002
  }
3003
3003
 
3004
+ class SortContext {
3005
+ constructor() {
3006
+ /***************************************************************************
3007
+ * *
3008
+ * Fields *
3009
+ * *
3010
+ **************************************************************************/
3011
+ this._sorts = new BehaviorSubject([]);
3012
+ /***************************************************************************
3013
+ * *
3014
+ * Private methods *
3015
+ * *
3016
+ **************************************************************************/
3017
+ }
3018
+ /***************************************************************************
3019
+ * *
3020
+ * Read API *
3021
+ * *
3022
+ **************************************************************************/
3023
+ get sorts() {
3024
+ return this._sorts.asObservable();
3025
+ }
3026
+ get sortsSnapshot() {
3027
+ return this._sorts.getValue();
3028
+ }
3029
+ findSortDirection(prop) {
3030
+ const f = this.findSort(prop);
3031
+ return f ? f.dir : undefined;
3032
+ }
3033
+ findSort(prop) {
3034
+ return this.sortsSnapshot
3035
+ .filter(f => f.prop === prop)
3036
+ .find(first => true);
3037
+ }
3038
+ /***************************************************************************
3039
+ * *
3040
+ * Public API *
3041
+ * *
3042
+ **************************************************************************/
3043
+ /**
3044
+ * This method updatees / adds the given sort, leaving
3045
+ * existing ones untouched.
3046
+ * @param updatedSort
3047
+ */
3048
+ updateSort(updatedSort) {
3049
+ if (updatedSort) {
3050
+ this.updateSorts([updatedSort]);
3051
+ }
3052
+ }
3053
+ /**
3054
+ * This method updates / adds the given filters, leaving
3055
+ * existing ones untouched.
3056
+ * @param updatedSorts
3057
+ */
3058
+ updateSorts(updatedSorts) {
3059
+ if (updatedSorts && updatedSorts.length > 0) {
3060
+ const sortMap = new Map();
3061
+ this.sortsSnapshot.forEach(s => sortMap.set(s.prop, s));
3062
+ updatedSorts.forEach(s => sortMap.set(s.prop, s));
3063
+ this.replaceSorts(Array.from(updatedSorts.values()));
3064
+ }
3065
+ }
3066
+ /**
3067
+ * Replace all existing filters with the given new ones.
3068
+ * @param newSorts
3069
+ */
3070
+ replaceSorts(newSorts) {
3071
+ this._sorts.next(newSorts || []);
3072
+ }
3073
+ clear() {
3074
+ this.replaceSorts([]);
3075
+ }
3076
+ }
3077
+
3078
+ class IndexedEntities {
3079
+ /***************************************************************************
3080
+ * *
3081
+ * Constructor *
3082
+ * *
3083
+ **************************************************************************/
3084
+ constructor(idFn, localSortFn, sortContext = new SortContext()) {
3085
+ this.idFn = idFn;
3086
+ this.localSortFn = localSortFn;
3087
+ this.sortContext = sortContext;
3088
+ /***************************************************************************
3089
+ * *
3090
+ * Fields *
3091
+ * *
3092
+ **************************************************************************/
3093
+ this.log = LoggerFactory.getLogger('IndexedEntities');
3094
+ this._entities$ = new BehaviorSubject([]);
3095
+ this._idToArrayIndex = new Map();
3096
+ }
3097
+ /***************************************************************************
3098
+ * *
3099
+ * Properties *
3100
+ * *
3101
+ **************************************************************************/
3102
+ get entities$() {
3103
+ return this._entities$.asObservable();
3104
+ }
3105
+ get entitiesSnapshot() {
3106
+ return this._entities$.getValue();
3107
+ }
3108
+ /***************************************************************************
3109
+ * *
3110
+ * Public API *
3111
+ * *
3112
+ **************************************************************************/
3113
+ /**
3114
+ * Replaces all existing entities with the new ones.
3115
+ * The index is rebuilt. O(n)
3116
+ */
3117
+ replaceAll(newEntities = []) {
3118
+ if (this.localSortFn) {
3119
+ newEntities = this.localSortFn(newEntities, this.sortContext.sortsSnapshot);
3120
+ }
3121
+ this.rebuildIndex(newEntities);
3122
+ this.setEntities(newEntities);
3123
+ }
3124
+ /**
3125
+ * Keeps all existing entities, but replaces those which are updated with the new data.
3126
+ * Provided updated entities which are currently not in this index are ignored.
3127
+ * @param updated
3128
+ */
3129
+ updateSome(updated) {
3130
+ const newData = [...this.entitiesSnapshot];
3131
+ updated.forEach(update => {
3132
+ const id = this.getItemId(update);
3133
+ const index = this.indexById(id);
3134
+ if (index != -1) {
3135
+ newData[index] = update;
3136
+ }
3137
+ });
3138
+ this.setEntities(newData);
3139
+ }
3140
+ append(append) {
3141
+ this.insert(append, this.entitiesSnapshot.length);
3142
+ }
3143
+ /**
3144
+ * Appends the given entities to this index.
3145
+ * The new appended entities are included in the index.
3146
+ * O(n) where n = number of appended entities
3147
+ * @param inserted
3148
+ * @param offset
3149
+ */
3150
+ insert(inserted, offset) {
3151
+ if (inserted && inserted.length > 0) {
3152
+ const entities = this.entitiesSnapshot;
3153
+ const newData = [...entities];
3154
+ for (let i = 0; i < inserted.length; i++) {
3155
+ newData[i + offset] = inserted[i];
3156
+ }
3157
+ if (this.localSortFn) {
3158
+ // local sort can re-order all items
3159
+ this.replaceAll(newData);
3160
+ }
3161
+ else {
3162
+ // Without a sort, we can optimize indexing
3163
+ this.reIndexFrom(newData, offset);
3164
+ this.setEntities(newData);
3165
+ }
3166
+ }
3167
+ }
3168
+ /**
3169
+ * Lookup an entity by its id.
3170
+ * This will use an index O(1)
3171
+ * @param id
3172
+ */
3173
+ getById(id) {
3174
+ const entities = this.entitiesSnapshot;
3175
+ const index = this.indexById(id);
3176
+ if (index != -1) {
3177
+ return entities[index];
3178
+ }
3179
+ }
3180
+ notify() {
3181
+ this._entities$.next(this._entities$.getValue());
3182
+ }
3183
+ destroy() {
3184
+ this._entities$.complete();
3185
+ this._idToArrayIndex.clear();
3186
+ }
3187
+ /***************************************************************************
3188
+ * *
3189
+ * Private methods *
3190
+ * *
3191
+ **************************************************************************/
3192
+ rebuildIndex(entities) {
3193
+ this._idToArrayIndex.clear();
3194
+ this.reIndexFrom(entities, 0);
3195
+ }
3196
+ reIndexFrom(entities, startIndex) {
3197
+ for (let i = startIndex; i < entities.length; i++) {
3198
+ const entity = entities[i];
3199
+ if (entity) {
3200
+ this._idToArrayIndex.set(this.getItemId(entity), i);
3201
+ }
3202
+ }
3203
+ }
3204
+ indexById(id) {
3205
+ return this._idToArrayIndex.get(id) ?? -1;
3206
+ }
3207
+ getItemId(item) {
3208
+ return this.idFn(item);
3209
+ }
3210
+ setEntities(entities) {
3211
+ if (!(this.entitiesSnapshot.length === 0 && entities.length === 0)) {
3212
+ this.log.debug('Entities changed: ' + entities.length, entities);
3213
+ this._entities$.next(entities);
3214
+ }
3215
+ }
3216
+ }
3217
+
3004
3218
  /**
3005
3219
  * Represents the status of a data-context
3006
3220
  */
@@ -3077,80 +3291,6 @@ function isActivePagedDataContext(object) {
3077
3291
  return object.setActivePage !== undefined;
3078
3292
  }
3079
3293
 
3080
- class SortContext {
3081
- constructor() {
3082
- /***************************************************************************
3083
- * *
3084
- * Fields *
3085
- * *
3086
- **************************************************************************/
3087
- this._sorts = new BehaviorSubject([]);
3088
- /***************************************************************************
3089
- * *
3090
- * Private methods *
3091
- * *
3092
- **************************************************************************/
3093
- }
3094
- /***************************************************************************
3095
- * *
3096
- * Read API *
3097
- * *
3098
- **************************************************************************/
3099
- get sorts() {
3100
- return this._sorts.asObservable();
3101
- }
3102
- get sortsSnapshot() {
3103
- return this._sorts.getValue();
3104
- }
3105
- findSortDirection(prop) {
3106
- const f = this.findSort(prop);
3107
- return f ? f.dir : undefined;
3108
- }
3109
- findSort(prop) {
3110
- return this.sortsSnapshot
3111
- .filter(f => f.prop === prop)
3112
- .find(first => true);
3113
- }
3114
- /***************************************************************************
3115
- * *
3116
- * Public API *
3117
- * *
3118
- **************************************************************************/
3119
- /**
3120
- * This method updatees / adds the given sort, leaving
3121
- * existing ones untouched.
3122
- * @param updatedSort
3123
- */
3124
- updateSort(updatedSort) {
3125
- if (updatedSort) {
3126
- this.updateSorts([updatedSort]);
3127
- }
3128
- }
3129
- /**
3130
- * This method updates / adds the given filters, leaving
3131
- * existing ones untouched.
3132
- * @param updatedSorts
3133
- */
3134
- updateSorts(updatedSorts) {
3135
- if (updatedSorts && updatedSorts.length > 0) {
3136
- const sortMap = new Map();
3137
- this.sortsSnapshot.forEach(s => sortMap.set(s.prop, s));
3138
- updatedSorts.forEach(s => sortMap.set(s.prop, s));
3139
- this.replaceSorts(Array.from(updatedSorts.values()));
3140
- }
3141
- }
3142
- /**
3143
- * Replace all existing filters with the given new ones.
3144
- * @param newSorts
3145
- */
3146
- replaceSorts(newSorts) {
3147
- this._sorts.next(newSorts || []);
3148
- }
3149
- clear() {
3150
- this.replaceSorts([]);
3151
- }
3152
- }
3153
-
3154
3294
  class DataContextBase extends DataSource {
3155
3295
  /***************************************************************************
3156
3296
  * *
@@ -3170,15 +3310,15 @@ class DataContextBase extends DataSource {
3170
3310
  this.baselog = LoggerFactory.getLogger('DataContextBase');
3171
3311
  this._filter = new FilterContext();
3172
3312
  this._sort = new SortContext();
3173
- this._data = new BehaviorSubject([]);
3174
3313
  this._total = new BehaviorSubject(undefined);
3175
3314
  this._status = new BehaviorSubject(DataContextStatus.idle());
3176
3315
  this._started = new BehaviorSubject(false);
3177
3316
  this._closed = new BehaviorSubject(false);
3178
- this._primaryIndex = new Map();
3317
+ this._customIndex = new Map();
3179
3318
  this._reloadQueue = new Subject();
3180
3319
  this.unsubscribe$ = new Subject();
3181
3320
  this._dataSource = dataSource;
3321
+ this._data = new IndexedEntities(e => dataSource.getId(e), _localSort);
3182
3322
  this._loading = this._status.pipe(map(status => status.loading));
3183
3323
  this._filter.filters.pipe(filter(() => this.started), takeUntil(this.unsubscribe$)).subscribe(filters => this.onFiltersChanged(filters));
3184
3324
  this._sort.sorts.pipe(filter(() => this.started), takeUntil(this.unsubscribe$)).subscribe(sorts => this.onSortsChanged(sorts));
@@ -3229,10 +3369,10 @@ class DataContextBase extends DataSource {
3229
3369
  return this.statusSnapshot?.loading;
3230
3370
  }
3231
3371
  get data() {
3232
- return this._data.asObservable();
3372
+ return this._data.entities$;
3233
3373
  }
3234
3374
  get dataSnapshot() {
3235
- return this._data.getValue();
3375
+ return this._data.entitiesSnapshot;
3236
3376
  }
3237
3377
  get status() {
3238
3378
  return this._status;
@@ -3275,13 +3415,17 @@ class DataContextBase extends DataSource {
3275
3415
  return this.reloadNow();
3276
3416
  }
3277
3417
  reload() {
3418
+ this.baselog.debug('Requesting a reload of the DataContext from the DataSource.');
3278
3419
  this._reloadQueue.next();
3279
3420
  }
3280
3421
  findByIndex(key) {
3281
3422
  if (!this._indexFn) {
3282
3423
  throw new Error('findByIndex requires you to pass a index function!');
3283
3424
  }
3284
- return this._primaryIndex.get(key);
3425
+ return this._customIndex.get(key);
3426
+ }
3427
+ findById(id) {
3428
+ return this._data.getById(id);
3285
3429
  }
3286
3430
  /**
3287
3431
  * Closes this DataContext and cleans up all used resources.
@@ -3291,15 +3435,17 @@ class DataContextBase extends DataSource {
3291
3435
  this.unsubscribe$.next();
3292
3436
  this.unsubscribe$.complete();
3293
3437
  this._closed.next(true);
3294
- this._data.complete();
3438
+ this._data.destroy();
3295
3439
  this._total.complete();
3296
3440
  this._status.complete();
3297
3441
  this.clearAll();
3298
3442
  this.baselog.debug('DataContext has been closed and resources cleaned up!');
3299
3443
  }
3300
3444
  refresh() {
3301
- const current = this._data.getValue();
3302
- this._data.next(current);
3445
+ this._data.notify();
3446
+ }
3447
+ update(entities) {
3448
+ this._data.updateSome(entities);
3303
3449
  }
3304
3450
  /***************************************************************************
3305
3451
  * *
@@ -3310,14 +3456,20 @@ class DataContextBase extends DataSource {
3310
3456
  return this.reloadInternal(); // TODO This should actually return the real (http) request
3311
3457
  }
3312
3458
  /**
3313
- * Append the given rows to to existing ones.
3459
+ * Append the given rows to the existing ones.
3314
3460
  */
3315
3461
  appendData(additionalData) {
3316
- // We had previous chunks so append to current data.
3317
- const newData = [...this.dataSnapshot];
3318
- newData.push(...additionalData);
3462
+ additionalData = this.localApply(additionalData);
3319
3463
  this.indexAll(additionalData);
3320
- this.setData(newData, true);
3464
+ this._data.append(additionalData);
3465
+ }
3466
+ /**
3467
+ * Insert the given rows at the given location.
3468
+ */
3469
+ insertData(additionalData, offset) {
3470
+ additionalData = this.localApply(additionalData);
3471
+ this.indexAll(additionalData);
3472
+ this._data.insert(additionalData, offset);
3321
3473
  }
3322
3474
  /**
3323
3475
  * Replaces the existing data with the new set.
@@ -3325,19 +3477,22 @@ class DataContextBase extends DataSource {
3325
3477
  * @param alreadyIndexed The rows will be indexed unless they already have been.
3326
3478
  */
3327
3479
  setData(newData, alreadyIndexed = false) {
3328
- if (this._localApply) {
3329
- newData = this._localApply(newData);
3330
- }
3331
- if (this._localSort) {
3332
- newData = this._localSort(newData, this._sort.sortsSnapshot);
3333
- }
3480
+ newData = this.localApply(newData);
3334
3481
  if (!alreadyIndexed) {
3482
+ this.clearIndex();
3335
3483
  this.indexAll(newData);
3336
3484
  }
3337
- const current = this.dataSnapshot;
3338
- if (!(current.length === 0 && newData.length === 0)) {
3339
- this.baselog.debug('Data has changed: ' + newData.length);
3340
- this._data.next(newData);
3485
+ this._data.replaceAll(newData);
3486
+ }
3487
+ clearData() {
3488
+ this.setData([]);
3489
+ }
3490
+ localApply(data) {
3491
+ if (this._localApply) {
3492
+ return this._localApply(data);
3493
+ }
3494
+ else {
3495
+ return data;
3341
3496
  }
3342
3497
  }
3343
3498
  setTotal(total) {
@@ -3351,7 +3506,7 @@ class DataContextBase extends DataSource {
3351
3506
  this.clearIndex();
3352
3507
  if (!silent) {
3353
3508
  this.setTotal(0);
3354
- this.setData([]);
3509
+ this.clearData();
3355
3510
  }
3356
3511
  this.onIdle();
3357
3512
  }
@@ -3365,7 +3520,7 @@ class DataContextBase extends DataSource {
3365
3520
  indexItem(item) {
3366
3521
  const key = this.getItemKey(item);
3367
3522
  if (key) {
3368
- this._primaryIndex.set(key, item);
3523
+ this._customIndex.set(key, item);
3369
3524
  }
3370
3525
  }
3371
3526
  /**
@@ -3382,6 +3537,9 @@ class DataContextBase extends DataSource {
3382
3537
  }
3383
3538
  return null;
3384
3539
  }
3540
+ getItemId(item) {
3541
+ return this.dataSource.getId(item);
3542
+ }
3385
3543
  /***************************************************************************
3386
3544
  * *
3387
3545
  * Event handler *
@@ -3422,7 +3580,7 @@ class DataContextBase extends DataSource {
3422
3580
  * *
3423
3581
  **************************************************************************/
3424
3582
  clearIndex() {
3425
- this._primaryIndex.clear();
3583
+ this._customIndex.clear();
3426
3584
  }
3427
3585
  }
3428
3586
 
@@ -3656,7 +3814,7 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3656
3814
  this.onIdle();
3657
3815
  }, err => {
3658
3816
  this.onError(err);
3659
- this.setData([]);
3817
+ this.clearData();
3660
3818
  this.setTotal(0);
3661
3819
  this.logger.error('Failed to query data', err);
3662
3820
  subject.error(err);
@@ -3671,13 +3829,12 @@ class DataContextContinuablePaged extends DataContextContinuableBase {
3671
3829
  try {
3672
3830
  this.setTotal(page.totalElements);
3673
3831
  const start = page.number * page.size;
3674
- const newData = clear ? [] : [...this.dataSnapshot];
3675
- for (let i = 0; i < page.content.length; i++) {
3676
- const item = page.content[i];
3677
- newData[i + start] = item;
3678
- this.indexItem(item);
3832
+ if (clear) {
3833
+ this.setData(page.content);
3834
+ }
3835
+ else {
3836
+ this.insertData(page.content, start);
3679
3837
  }
3680
- this.setData(newData, true);
3681
3838
  }
3682
3839
  catch (err) {
3683
3840
  this.onError(err);
@@ -3776,7 +3933,7 @@ class DataContextContinuableToken extends DataContextContinuableBase {
3776
3933
  }, err => {
3777
3934
  this.onError(err);
3778
3935
  this.logger.error('Failed to query data', err);
3779
- this.setData([]);
3936
+ this.clearData();
3780
3937
  this.setTotal(0);
3781
3938
  subject.error(err);
3782
3939
  });
@@ -3912,7 +4069,7 @@ class DataContextActivePage extends DataContextBase {
3912
4069
  subject.next(success);
3913
4070
  this.onIdle();
3914
4071
  }, err => {
3915
- this.setData([]);
4072
+ this.clearData();
3916
4073
  this.actlogger.error('Failed to query data', err);
3917
4074
  subject.error(err);
3918
4075
  this.onError(err);
@@ -4090,7 +4247,9 @@ class DataContextLifeCycleBinding {
4090
4247
  if (_dataContext == null) {
4091
4248
  throw new Error('dataContext must not be null!');
4092
4249
  }
4093
- this._dataContext.data.subscribe(changed => { }, err => { }, () => this.unsubscribe());
4250
+ this._dataContext.data.subscribe({
4251
+ complete: () => this.unsubscribe()
4252
+ });
4094
4253
  }
4095
4254
  /***************************************************************************
4096
4255
  * *
@@ -4243,14 +4402,72 @@ class DataContextAutoStarter extends DataContextLifeCycleBinding {
4243
4402
  }
4244
4403
  }
4245
4404
 
4246
- class DataContextSourceAutoReloader extends DataContextLifeCycleBinding {
4247
- constructor(dataContext, dataApi) {
4405
+ class DataContextSourceEventBinding extends DataContextLifeCycleBinding {
4406
+ /***************************************************************************
4407
+ * *
4408
+ * Fields *
4409
+ * *
4410
+ **************************************************************************/
4411
+ /***************************************************************************
4412
+ * *
4413
+ * Constructor *
4414
+ * *
4415
+ **************************************************************************/
4416
+ constructor(dataContext, dataApi, reloadOnChanges) {
4248
4417
  super(dataContext);
4249
4418
  this.dataApi = dataApi;
4419
+ this.reloadOnChanges = reloadOnChanges;
4250
4420
  this.subscribe();
4251
4421
  }
4422
+ /***************************************************************************
4423
+ * *
4424
+ * Internal Impl *
4425
+ * *
4426
+ **************************************************************************/
4252
4427
  subscribe() {
4253
- this._subscription = this.dataApi.dataChanged.subscribe(() => this._dataContext.reload());
4428
+ this._subscription = this.dataApi.dataChanged.subscribe(event => this.handleDataChangeEvent(event));
4429
+ }
4430
+ /***************************************************************************
4431
+ * *
4432
+ * Private methods *
4433
+ * *
4434
+ **************************************************************************/
4435
+ handleDataChangeEvent(event) {
4436
+ if (this.reloadOnChanges && this.isReloadDesirable(event)) {
4437
+ this._dataContext.reload();
4438
+ return;
4439
+ }
4440
+ // We might also be able to perform deletions locally, and avoid reload data
4441
+ if (event.modified) {
4442
+ this._dataContext.update(event.modified);
4443
+ }
4444
+ }
4445
+ isReloadDesirable(event) {
4446
+ return event.unknownChanges || event.created || event.deletedIds;
4447
+ }
4448
+ }
4449
+
4450
+ var DataSourceChangeType;
4451
+ (function (DataSourceChangeType) {
4452
+ })(DataSourceChangeType || (DataSourceChangeType = {}));
4453
+ class DataSourceChangeEvent {
4454
+ constructor(deletedIds, modified, created) {
4455
+ this.deletedIds = deletedIds;
4456
+ this.modified = modified;
4457
+ this.created = created;
4458
+ this.unknownChanges = !deletedIds && !modified && !created;
4459
+ }
4460
+ static unknownChanges() {
4461
+ return new DataSourceChangeEvent(null, null, null);
4462
+ }
4463
+ static deleted(ids) {
4464
+ return new DataSourceChangeEvent(ids, null, null);
4465
+ }
4466
+ static modified(modified) {
4467
+ return new DataSourceChangeEvent(null, modified, null);
4468
+ }
4469
+ static created(created) {
4470
+ return new DataSourceChangeEvent(null, null, created);
4254
4471
  }
4255
4472
  }
4256
4473
 
@@ -4265,13 +4482,50 @@ class EntityIdUtil {
4265
4482
  }
4266
4483
  }
4267
4484
 
4268
- class LocalListDataSource {
4485
+ class DataSourceBase {
4486
+ /***************************************************************************
4487
+ * *
4488
+ * Constructor *
4489
+ * *
4490
+ **************************************************************************/
4491
+ constructor(idProperty) {
4492
+ this.idProperty = idProperty;
4493
+ /***************************************************************************
4494
+ * *
4495
+ * Fields *
4496
+ * *
4497
+ **************************************************************************/
4498
+ this.dataChangeEvents$ = new Subject();
4499
+ }
4500
+ /***************************************************************************
4501
+ * *
4502
+ * Properties *
4503
+ * *
4504
+ **************************************************************************/
4505
+ get dataChanged() {
4506
+ return this.dataChangeEvents$.asObservable();
4507
+ }
4508
+ /***************************************************************************
4509
+ * *
4510
+ * Public API *
4511
+ * *
4512
+ **************************************************************************/
4513
+ publishChangeEvent(e) {
4514
+ this.dataChangeEvents$.next(e);
4515
+ }
4516
+ getId(entity) {
4517
+ return EntityIdUtil.getId(entity, this.idProperty);
4518
+ }
4519
+ }
4520
+
4521
+ class LocalListDataSource extends DataSourceBase {
4269
4522
  /***************************************************************************
4270
4523
  * *
4271
4524
  * Constructor *
4272
4525
  * *
4273
4526
  **************************************************************************/
4274
4527
  constructor(localData, localSort, localFilter, idProperty) {
4528
+ super(idProperty || LocalListDataSource.guessIdProperty(localData));
4275
4529
  /***************************************************************************
4276
4530
  * *
4277
4531
  * Fields *
@@ -4279,13 +4533,11 @@ class LocalListDataSource {
4279
4533
  **************************************************************************/
4280
4534
  this.logger = LoggerFactory.getLogger(this.constructor.name);
4281
4535
  this.data$ = new BehaviorSubject([]);
4282
- this.dataChange$ = new Subject();
4283
4536
  if (!localData) {
4284
4537
  throw new Error('localData must not be null!');
4285
4538
  }
4286
4539
  this.localSort = localSort || ((data, sort) => data);
4287
4540
  this.localFilter = localFilter || ((data, sort) => data);
4288
- this.idProperty = idProperty || this.guessIdProperty(localData);
4289
4541
  this.data = localData;
4290
4542
  }
4291
4543
  /***************************************************************************
@@ -4311,9 +4563,6 @@ class LocalListDataSource {
4311
4563
  * IDataSource API *
4312
4564
  * *
4313
4565
  **************************************************************************/
4314
- get dataChanged() {
4315
- return this.dataChange$.asObservable();
4316
- }
4317
4566
  findById(id) {
4318
4567
  return of(this.data.find(d => this.getId(d) === id));
4319
4568
  }
@@ -4323,9 +4572,6 @@ class LocalListDataSource {
4323
4572
  findAllFiltered(filters, sorts) {
4324
4573
  return of(this.data).pipe(map(data => this.localFilter(data, filters)), map(data => this.localSort(data, sorts)));
4325
4574
  }
4326
- getId(entity) {
4327
- return EntityIdUtil.getId(entity, this.idProperty);
4328
- }
4329
4575
  /***************************************************************************
4330
4576
  * *
4331
4577
  * Public API *
@@ -4333,7 +4579,7 @@ class LocalListDataSource {
4333
4579
  **************************************************************************/
4334
4580
  set data(data) {
4335
4581
  this.data$.next(data);
4336
- this.onLocalDataChanges(data);
4582
+ this.publishChangeEvent(DataSourceChangeEvent.unknownChanges());
4337
4583
  }
4338
4584
  get data() {
4339
4585
  return this.data$.getValue();
@@ -4343,19 +4589,17 @@ class LocalListDataSource {
4343
4589
  * Private methods *
4344
4590
  * *
4345
4591
  **************************************************************************/
4346
- onLocalDataChanges(data) {
4347
- this.dataChange$.next(data);
4348
- }
4349
- guessIdProperty(localData) {
4592
+ static guessIdProperty(localData) {
4593
+ const log = LoggerFactory.getLogger('LocalListDataSource');
4350
4594
  if (localData && localData.length > 0) {
4351
4595
  const sample = localData[0];
4352
4596
  if (typeof sample === 'object') {
4353
4597
  if (sample.hasOwnProperty('id')) {
4354
- this.logger.warn('DataSource without defined id-property => autodetected property id-property as "id"');
4598
+ log.warn('DataSource without defined id-property => autodetected property id-property as "id"');
4355
4599
  return 'id'; // Use id
4356
4600
  }
4357
4601
  else {
4358
- this.logger.warn('Local DataSource created without defined id-property and objects. Using object equality!');
4602
+ log.warn('Local DataSource created without defined id-property and objects. Using object equality!');
4359
4603
  }
4360
4604
  }
4361
4605
  }
@@ -4369,11 +4613,11 @@ class LocalPagedDataSource {
4369
4613
  * Constructor *
4370
4614
  * *
4371
4615
  **************************************************************************/
4372
- constructor(localData, idProperty, localSort, localFilter) {
4373
- if (!localData) {
4374
- throw new Error('localData must not be null!');
4616
+ constructor(listDataSource) {
4617
+ if (!listDataSource) {
4618
+ throw new Error('listDataSource must not be null!');
4375
4619
  }
4376
- this.localListFetcher = new LocalListDataSource(localData, localSort, localFilter, idProperty);
4620
+ this.localListFetcher = listDataSource;
4377
4621
  }
4378
4622
  /***************************************************************************
4379
4623
  * *
@@ -4388,10 +4632,10 @@ class LocalPagedDataSource {
4388
4632
  * @param localFilter
4389
4633
  */
4390
4634
  static empty(idProperty, localSort, localFilter) {
4391
- return LocalPagedDataSource.from([], idProperty, localSort, localFilter);
4635
+ return LocalPagedDataSource.of(LocalListDataSource.empty(idProperty, localSort, localFilter));
4392
4636
  }
4393
- static from(localData, idProperty, localSort, localFilter) {
4394
- return new LocalPagedDataSource(localData, idProperty, localSort, localFilter);
4637
+ static of(listDataSource) {
4638
+ return new LocalPagedDataSource(listDataSource);
4395
4639
  }
4396
4640
  /***************************************************************************
4397
4641
  * *
@@ -4786,12 +5030,15 @@ class DataContextBuilder {
4786
5030
  * *
4787
5031
  **************************************************************************/
4788
5032
  buildLocal(items, idProperty) {
4789
- return this.build(LocalListDataSource.from(items, idProperty, this._localSort, FilterUtil.filterData));
5033
+ return this.build(this.localListSource(items, idProperty));
4790
5034
  }
4791
- buildLocalActivePaged(data, idProperty) {
5035
+ buildLocalActivePaged(items, idProperty) {
4792
5036
  this._skipLocalSort = true;
4793
5037
  this.activePaged();
4794
- return this.build(LocalPagedDataSource.from(data, idProperty, this._localSort, FilterUtil.filterData));
5038
+ return this.build(LocalPagedDataSource.of(this.localListSource(items, idProperty)));
5039
+ }
5040
+ localListSource(items, idProperty) {
5041
+ return LocalListDataSource.from(items, idProperty, this._localSort, FilterUtil.filterData);
4795
5042
  }
4796
5043
  /***************************************************************************
4797
5044
  * *
@@ -4880,9 +5127,7 @@ class DataContextBuilder {
4880
5127
  return new DataContextActivePage(pageSource, this._pageSize, this._indexFn, this._localApply, this._skipLocalSort ? null : this._localSort);
4881
5128
  }
4882
5129
  setupDataContextAutoReload(dc, dataSource) {
4883
- if (this._reloadOnLocalChanges) {
4884
- const binding = new DataContextSourceAutoReloader(dc, dataSource);
4885
- }
5130
+ const binding = new DataContextSourceEventBinding(dc, dataSource, this._reloadOnLocalChanges);
4886
5131
  return dc;
4887
5132
  }
4888
5133
  setupDataContextAutoStart(dc, autoStartSpec) {
@@ -5192,13 +5437,14 @@ class InternalRestClientConfig {
5192
5437
  */
5193
5438
  class RestClientConfig {
5194
5439
  }
5195
- class RestClient {
5440
+ class RestClient extends DataSourceBase {
5196
5441
  /***************************************************************************
5197
5442
  * *
5198
5443
  * Constructor *
5199
5444
  * *
5200
5445
  **************************************************************************/
5201
5446
  constructor(restEndpoint, http, config) {
5447
+ super(config.idField);
5202
5448
  this.restEndpoint = restEndpoint;
5203
5449
  this.http = http;
5204
5450
  /***************************************************************************
@@ -5207,22 +5453,7 @@ class RestClient {
5207
5453
  * *
5208
5454
  **************************************************************************/
5209
5455
  this._logger = LoggerFactory.getLogger(this.constructor.name);
5210
- this.localChangeSubject = new Subject();
5211
- this.config = new InternalRestClientConfig(config);
5212
- }
5213
- /***************************************************************************
5214
- * *
5215
- * Properties *
5216
- * *
5217
- **************************************************************************/
5218
- get dataChanged() {
5219
- return this.localChangeSubject.asObservable();
5220
- }
5221
- /**
5222
- * @deprecated Use dataChanged
5223
- */
5224
- get localChanged() {
5225
- return this.dataChanged;
5456
+ this.config = config;
5226
5457
  }
5227
5458
  /***************************************************************************
5228
5459
  * *
@@ -5247,26 +5478,24 @@ class RestClient {
5247
5478
  create(newEntity, params) {
5248
5479
  return this.http.post(this.restEndpoint, newEntity, {
5249
5480
  params: params
5250
- })
5251
- .pipe(tap(e => this.onLocalChanged(e)));
5481
+ }).pipe(tap(e => this.publishChangeEvent(DataSourceChangeEvent.created([e]))));
5252
5482
  }
5253
- update(updatedEntity, params) {
5254
- return this.http.put(this.getEntityUrlBy(updatedEntity), updatedEntity, {
5483
+ update(update, params) {
5484
+ return this.http.put(this.getEntityUrlBy(update), update, {
5255
5485
  params: params
5256
- })
5257
- .pipe(tap(e => this.onLocalChanged(e)));
5486
+ }).pipe(tap(e => this.publishChangeEvent(DataSourceChangeEvent.modified([e]))));
5258
5487
  }
5259
5488
  updateAll(updatedEntities, params) {
5260
5489
  return this.http.put(this.restEndpoint, updatedEntities, {
5261
5490
  params: params
5262
5491
  })
5263
- .pipe(tap(e => this.onLocalChanged()));
5492
+ .pipe(tap(entities => this.publishChangeEvent(DataSourceChangeEvent.modified(entities))));
5264
5493
  }
5265
5494
  delete(entity, params) {
5266
5495
  return this.http.delete(this.getEntityUrlBy(entity), {
5267
5496
  responseType: 'text',
5268
5497
  params: params
5269
- }).pipe(tap(() => this.onLocalChanged(entity)));
5498
+ }).pipe(tap(() => this.publishChangeEvent(DataSourceChangeEvent.deleted([this.getId(entity)]))));
5270
5499
  }
5271
5500
  deleteAll(entities, params) {
5272
5501
  const ids = entities.map(e => String(this.getId(e)));
@@ -5275,9 +5504,6 @@ class RestClient {
5275
5504
  this._logger.debug('Deleting ' + entities.length + ' in ' + deleteRequests.length + ' batches: ', deleteRequests);
5276
5505
  return forkJoin(deleteRequests);
5277
5506
  }
5278
- getId(entity) {
5279
- return EntityIdUtil.getId(entity, this.config.idField);
5280
- }
5281
5507
  /***************************************************************************
5282
5508
  * *
5283
5509
  * Sub Resource Builder *
@@ -5300,15 +5526,18 @@ class RestClient {
5300
5526
  patchInternal(id, entityPatch, params) {
5301
5527
  return this.http.patch(this.getEntityUrl(id), entityPatch, {
5302
5528
  params: params
5303
- }).pipe(tap(e => this.onLocalChanged()));
5529
+ }).pipe(tap(e => this.publishChangeEvent(DataSourceChangeEvent.modified([e]))));
5304
5530
  }
5305
5531
  patchAllInternal(entityPatches, params) {
5306
5532
  return this.http.patch(this.restEndpoint, entityPatches, {
5307
5533
  params: params
5308
- }).pipe(tap(e => this.onLocalChanged()));
5534
+ }).pipe(tap(e => this.publishChangeEvent(DataSourceChangeEvent.modified(e))));
5309
5535
  }
5536
+ /**
5537
+ * @deprecated Switch to publishChangeEvent
5538
+ */
5310
5539
  onLocalChanged(entity) {
5311
- this.localChangeSubject.next(entity);
5540
+ this.publishChangeEvent(DataSourceChangeEvent.unknownChanges());
5312
5541
  }
5313
5542
  getEntityUrlBy(entity) {
5314
5543
  return this.getEntityUrl(this.getId(entity));
@@ -5335,7 +5564,7 @@ class RestClient {
5335
5564
  params: builder.build(),
5336
5565
  responseType: 'text'
5337
5566
  })
5338
- .pipe(tap(() => this.onLocalChanged()));
5567
+ .pipe(tap(() => DataSourceChangeEvent.deleted(ids)));
5339
5568
  }
5340
5569
  }
5341
5570
  class RestClientList extends RestClient {
@@ -5345,7 +5574,7 @@ class RestClientList extends RestClient {
5345
5574
  * *
5346
5575
  **************************************************************************/
5347
5576
  constructor(restEndpoint, http, config) {
5348
- super(restEndpoint, http, config);
5577
+ super(restEndpoint, http, new InternalRestClientConfig(config));
5349
5578
  }
5350
5579
  /***************************************************************************
5351
5580
  * *
@@ -5379,7 +5608,7 @@ class RestClientPaged extends RestClient {
5379
5608
  * *
5380
5609
  **************************************************************************/
5381
5610
  constructor(restEndpoint, http, config) {
5382
- super(restEndpoint, http, config);
5611
+ super(restEndpoint, http, new InternalRestClientConfig(config));
5383
5612
  }
5384
5613
  /***************************************************************************
5385
5614
  * *
@@ -5424,7 +5653,7 @@ class RestClientContinuable extends RestClient {
5424
5653
  * *
5425
5654
  **************************************************************************/
5426
5655
  constructor(restEndpoint, http, config) {
5427
- super(restEndpoint, http, config);
5656
+ super(restEndpoint, http, new InternalRestClientConfig(config));
5428
5657
  }
5429
5658
  /***************************************************************************
5430
5659
  * *
@@ -28503,5 +28732,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImpor
28503
28732
  * Generated bundle index. Do not edit.
28504
28733
  */
28505
28734
 
28506
- export { AuditedEntity, AutoStartSpec, BlobUrl, BytesFormat, BytesPerSecondFormat, BytesPipe, CardDropEvent, CardOrganizerData, CardStack, CollectionUtil, ComparatorBuilder, ConfirmDialogConfig, ContinuableListing, CsvColumnSpec, CsvSerializer, CsvSpec, CsvStreamExporter, CsvStreamExporterBuilder, CsvStreamExporterBuilderService, Currency, CurrencyCode, CurrencyUnit, CurrencyUnitRegistry, CustomDateAdapter, DataContextActivePage, DataContextAutoStarter, DataContextBase, DataContextBuilder, DataContextContinuableBase, DataContextContinuablePaged, DataContextContinuableToken, DataContextLifeCycleBinding, DataContextSelectionDirective, DataContextSimple, DataContextSnapshot, DataContextSourceAutoReloader, DataContextStateIndicatorComponent, DataContextStatus, DataSourceAdapter, DataSourceProcessor, DataTransferFactory, DataTransferProgress, DataTransferProgressAggregate, DataTransferState, DataTransferStatus, DataViewIframeAdapterDirective, DataViewIframeComponent, DataViewMessage, DataViewOptionsProviderBinding, DataViewSelection, DataViewSelectionInit, DateUtil, DelegateContinuableDataSource, DelegateDataSource, DelegateListDataSource, DelegatePagedDataSource, Dimensions, DrawerOutletBinding, DurationBucket, DurationFormat, ELDER_DATA_VIEW, ELDER_SELECT_BASE, ElderAccessDeniedComponent, ElderAccessDeniedModule, ElderAppHeaderComponent, ElderAuditModule, ElderAuditedEntityComponent, ElderAutoSelectFirstDirective, ElderAutocompleteComponent, ElderAutocompleteDirective, ElderAutocompleteManyDirective, ElderAutocompleteModule, ElderBlobViewerComponent, ElderBreadCrumbsComponent, ElderBreadCrumbsModule, ElderButtonGroupComponent, ElderButtonGroupModule, ElderCardComponent, ElderCardContentDirective, ElderCardHeaderActionsDirective, ElderCardHeaderComponent, ElderCardModule, ElderCardOrganizerComponent, ElderCardOrganizerModule, ElderCardPanelComponent, ElderCardStackComponent, ElderCardSubtitleDirective, ElderCardTitleDirective, ElderCheckboxState, ElderChipLabelDirective, ElderChipListSelectComponent, ElderChipListSelectModule, ElderChipsModule, ElderClearSelectDirective, ElderClipboardPutDirective, ElderClipboardService, ElderConfirmDialogComponent, ElderConnectivityModule, ElderConnectivityService, ElderContainersModule, ElderCsvExportBtnComponent, ElderCsvModule, ElderCurrencyModule, ElderCurrencyPipe, ElderDataCommonModule, ElderDataToolbarComponent, ElderDataTransferModule, ElderDataTransferService, ElderDataViewBaseComponent, ElderDataViewOptions, ElderDataViewOptionsProvider, ElderDateSwitcherComponent, ElderDateTimeInputComponent, ElderDatesModule, ElderDelayedFocusDirective, ElderDialogConfig, ElderDialogModule, ElderDialogPanelComponent, ElderDialogService, ElderDimensionsInputComponent, ElderDurationInputComponent, ElderEntityValueAccessorUtil, ElderEnumTranslationService, ElderErrorModule, ElderEventSourceService, ElderExceptionDetailComponent, ElderExpandToggleButtonComponent, ElderExpandToggleButtonModule, ElderFileDropZoneDirective, ElderFileModule, ElderFileSelectComponent, ElderFileSelectDirective, ElderFileUploadComponent, ElderFormFieldControlBase, ElderFormFieldDenseDirective, ElderFormFieldLabelDirective, ElderFormFieldNoHintDirective, ElderFormFieldNoSpinnerDirective, ElderFormsDirectivesModule, ElderFormsModule, ElderFromFieldBase, ElderFromFieldEntityBase, ElderFromFieldMultiEntityBase, ElderGlobalSearchComponent, ElderGlobalSearchModule, ElderGlobalSearchService, ElderGridComponent, ElderGridModule, ElderGridTileDirective, ElderGridToolbarDirective, ElderHeaderComponent, ElderHeaderModule, ElderHttpClient, ElderI18nEntitiesModule, ElderIFrameModule, ElderInfiniteAutocompleteDirective, ElderInfiniteScrollDirective, ElderInfiniteScrollLegacyDirective, ElderInfiniteScrollModule, ElderInputPatternDirective, ElderIntervalInputComponent, ElderKeyEventDirective, ElderLabelInputComponent, ElderLabelsModule, ElderLanguageConfig, ElderLanguageInterceptor, ElderLanguageModule, ElderLanguageService, ElderLanguageSwitcherComponent, ElderLocalDateInputComponent, ElderLocalTimeInputComponent, ElderLocalesDeChModule, ElderLocalizedInputComponent, ElderLocalizedInputDialogComponent, ElderLocalizedInputDialogService, ElderLocalizedInputTableComponent, ElderLocalizedTextColumnDirective, ElderLocalizedTextsDirective, ElderMaxValidator, ElderMeasuresModule, ElderMinValidator, ElderMultiEntityValueAccessorUtil, ElderMultiSelectBase, ElderMultiSelectChipsComponent, ElderMultiSelectFormField, ElderMultipleOfUtil, ElderMultipleOfValidator, ElderNavGroupComponent, ElderNavLinkComponent, ElderNavListComponent, ElderNavModule, ElderNextFocusableDirective, ElderNumberCellDirective, ElderOfflineIndicatorComponent, ElderOverlayComponent, ElderOverlayModule, ElderOverlayOriginDirective, ElderOverlayTriggerDirective, ElderPaddingDirective, ElderPanelComponent, ElderPanelModule, ElderPeriodInputComponent, ElderPipesModule, ElderPlugParentFormDirective, ElderProgressBarComponent, ElderProgressBarModule, ElderQuantityFormFieldComponent, ElderQuantityInputControlComponent, ElderQuantityModule, ElderQuantityPipe, ElderQuantityRangeValidator, ElderQuantityService, ElderQuantityTransformPipe, ElderQuestionDialogComponent, ElderRepeatPipe, ElderRepeatPipeLegacy, ElderRequiredDimensionsValidator, ElderRequiredIgnoreZeroValidator, ElderRequiredQuantityValidator, ElderRoundPipe, ElderRouteOutletDrawerService, ElderRouterOutletService, ElderRouterService, ElderSafeUrlPipe, ElderScrollContainerComponent, ElderSearchBoxComponent, ElderSearchContextDirective, ElderSearchInputDirective, ElderSearchModule, ElderSearchPanelComponent, ElderSelectBase, ElderSelectChipAvatarDirective, ElderSelectChipDirective, ElderSelectComponent, ElderSelectComponentState, ElderSelectCustomInputDirective, ElderSelectFormField, ElderSelectModule, ElderSelectOnTabDirective, ElderSelectValueDirective, ElderSelectionDialogComponent, ElderSelectionDialogDirective, ElderSelectionMasterCheckboxComponent, ElderSelectionPopupTriggerAdapterDirective, ElderShellCenterDirective, ElderShellComponent, ElderShellModule, ElderShellNavigationToggleComponent, ElderShellService, ElderShellSideLeftDirective, ElderShellSideRightDirective, ElderShellSlotDirective, ElderSimpleSelectionViewComponent, ElderSimpleSelectionViewModule, ElderSingleSortComponent, ElderStackCardDirective, ElderStopEventPropagationDirective, ElderSvgViewerComponent, ElderTabDirective, ElderTabFocusTrapDirective, ElderTabGroupRoutingDirective, ElderTabModule, ElderTableActivationDirective, ElderTableComponent, ElderTableExtensionDirective, ElderTableGroup, ElderTableModel, ElderTableModelCdkTableBinding, ElderTableModelQueryGroup, ElderTableModule, ElderTableProviders, ElderTableRootDirective, ElderTableSortDirective, ElderTableToolbarDirective, ElderThemeApplierDirective, ElderThemeDirective, ElderThemeModule, ElderThemePreferenceService, ElderThemeService, ElderThemeToggleComponent, ElderTimeModule, ElderToastModule, ElderToastService, ElderTogglePanelComponent, ElderTogglePanelPrimaryDirective, ElderTogglePanelSecondaryDirective, ElderTogglePanelTriggerDirective, ElderToolbarColumnDirective, ElderToolbarComponent, ElderToolbarContentDirective, ElderToolbarModule, ElderToolbarService, ElderToolbarTitleComponent, ElderToolbarTitleService, ElderTouchedDirective, ElderTrimPipe, ElderTripleStateCheckboxDirective, ElderTruncatePipe, ElderUnitSelectDirective, ElderUnitService, ElderUrlFragment, ElderUrlFragmentModule, ElderUrlFragmentParamsService, ElderUrlFragmentSwitcherComponent, ElderValidationErrorDirective, ElderViewersModule, EntitySetPatch, ErrorUtil, ExceptionDetailCtx, FileUploadClient, Filter, FilterContext, FilterUtil, FormFieldBaseComponent, HttpClientBuilder, HttpClientPristine, HttpDataTransfer, HttpDataTransferAggregateComponent, HttpDataTransferComponent, HttpDataTransferIndicatorComponent, HttpDataTransferOverviewComponent, HttpParamsBuilder, I18nBase, I18nPickAsyncPipe, I18nPickPipe, I18nText, IFrameState, IframeCloseDirective, IframeDialogComponent, IframeHostComponent, IframeService, IframeSideContentComponent, InternalRestClientConfig, Interval, IsoDurationPipe, IsoIntervalParsePipe, IsoIntervalPipe, JsonMapUtil, KafentConfig, KafentEvent, KafentEventService, KafentEventStream, KafentEventStreamDisabled, KafentEventStreamSse, KafentEventTransport, KafentModule, KafentSseEventChannel, KafentTokenProvider, KafentTokenProviderSessionStorage, KafentTopicSse, KnownElderThemes, KnownLocaleType, LocalListDataSource, LocalPagedDataSource, LocalisationPickerService, MasterSelectionState, MatTableDataContextBinding, MatTableDataContextBindingBuilder, MultiModelBaseComponent, NextNumberUtil, Objects, OnlineStatus, Page, PageRequest, Pageable, ParseUtil, Path, PathNode, PeriodBucket, PeriodDuration, PeriodFormat, ProcessIterationContext, ProcessState, PropertyPathUtil, Quantity, QueryListBinding, QuestionDialogConfig, ReactiveEventSource, ReactiveMap, RefreshingEntity, RestClient, RestClientConfig, RestClientContinuable, RestClientList, RestClientPaged, SearchQuery, SelectionModel, SelectionModelPopupDirective, Sets, SimpleLocalisationPicker, Sort, SortOption, SortUtil, SubBar, SuggestionProvider, TemplateCompositeControl, TemplatedSelectionDialogComponent, ThemeSpec, TimeAgoPipe, TimeDurationPipe, TimeUtil, ToastType, TokenChunkRequest, ToolbarHeader, TranslatedEnumValue, TypedEventMessage, Unit, UnitDimension, UnitDimensionInfo, UnitInfo, UnitRegistry, UrlBuilder, UrlQueryParams, UuidUtil, ValueAccessorBase, ValueWrapper, ViewProviders, WeightPipe, alphaNumStringComparator, buildFormIntegrationProviders, createDataOptionsProvider, createSelectionModel, existingOrNewElderTableModel, isActivePagedDataContext, isContinuableDataContext, isContinuableDataSource, isDataContext, isDataSource, isElderEntityValueAccessor, isElderMultiEntityValueAccessor, isListDataSource, isPagedDataSource, naturalValueComparator, newElderTableModel, proxyControlContainer, registerLocale, runInZone, themeInit };
28735
+ export { AuditedEntity, AutoStartSpec, BlobUrl, BytesFormat, BytesPerSecondFormat, BytesPipe, CardDropEvent, CardOrganizerData, CardStack, CollectionUtil, ComparatorBuilder, ConfirmDialogConfig, ContinuableListing, CsvColumnSpec, CsvSerializer, CsvSpec, CsvStreamExporter, CsvStreamExporterBuilder, CsvStreamExporterBuilderService, Currency, CurrencyCode, CurrencyUnit, CurrencyUnitRegistry, CustomDateAdapter, DataContextActivePage, DataContextAutoStarter, DataContextBase, DataContextBuilder, DataContextContinuableBase, DataContextContinuablePaged, DataContextContinuableToken, DataContextLifeCycleBinding, DataContextSelectionDirective, DataContextSimple, DataContextSnapshot, DataContextSourceEventBinding, DataContextStateIndicatorComponent, DataContextStatus, DataSourceAdapter, DataSourceBase, DataSourceChangeEvent, DataSourceChangeType, DataSourceProcessor, DataTransferFactory, DataTransferProgress, DataTransferProgressAggregate, DataTransferState, DataTransferStatus, DataViewIframeAdapterDirective, DataViewIframeComponent, DataViewMessage, DataViewOptionsProviderBinding, DataViewSelection, DataViewSelectionInit, DateUtil, DelegateContinuableDataSource, DelegateDataSource, DelegateListDataSource, DelegatePagedDataSource, Dimensions, DrawerOutletBinding, DurationBucket, DurationFormat, ELDER_DATA_VIEW, ELDER_SELECT_BASE, ElderAccessDeniedComponent, ElderAccessDeniedModule, ElderAppHeaderComponent, ElderAuditModule, ElderAuditedEntityComponent, ElderAutoSelectFirstDirective, ElderAutocompleteComponent, ElderAutocompleteDirective, ElderAutocompleteManyDirective, ElderAutocompleteModule, ElderBlobViewerComponent, ElderBreadCrumbsComponent, ElderBreadCrumbsModule, ElderButtonGroupComponent, ElderButtonGroupModule, ElderCardComponent, ElderCardContentDirective, ElderCardHeaderActionsDirective, ElderCardHeaderComponent, ElderCardModule, ElderCardOrganizerComponent, ElderCardOrganizerModule, ElderCardPanelComponent, ElderCardStackComponent, ElderCardSubtitleDirective, ElderCardTitleDirective, ElderCheckboxState, ElderChipLabelDirective, ElderChipListSelectComponent, ElderChipListSelectModule, ElderChipsModule, ElderClearSelectDirective, ElderClipboardPutDirective, ElderClipboardService, ElderConfirmDialogComponent, ElderConnectivityModule, ElderConnectivityService, ElderContainersModule, ElderCsvExportBtnComponent, ElderCsvModule, ElderCurrencyModule, ElderCurrencyPipe, ElderDataCommonModule, ElderDataToolbarComponent, ElderDataTransferModule, ElderDataTransferService, ElderDataViewBaseComponent, ElderDataViewOptions, ElderDataViewOptionsProvider, ElderDateSwitcherComponent, ElderDateTimeInputComponent, ElderDatesModule, ElderDelayedFocusDirective, ElderDialogConfig, ElderDialogModule, ElderDialogPanelComponent, ElderDialogService, ElderDimensionsInputComponent, ElderDurationInputComponent, ElderEntityValueAccessorUtil, ElderEnumTranslationService, ElderErrorModule, ElderEventSourceService, ElderExceptionDetailComponent, ElderExpandToggleButtonComponent, ElderExpandToggleButtonModule, ElderFileDropZoneDirective, ElderFileModule, ElderFileSelectComponent, ElderFileSelectDirective, ElderFileUploadComponent, ElderFormFieldControlBase, ElderFormFieldDenseDirective, ElderFormFieldLabelDirective, ElderFormFieldNoHintDirective, ElderFormFieldNoSpinnerDirective, ElderFormsDirectivesModule, ElderFormsModule, ElderFromFieldBase, ElderFromFieldEntityBase, ElderFromFieldMultiEntityBase, ElderGlobalSearchComponent, ElderGlobalSearchModule, ElderGlobalSearchService, ElderGridComponent, ElderGridModule, ElderGridTileDirective, ElderGridToolbarDirective, ElderHeaderComponent, ElderHeaderModule, ElderHttpClient, ElderI18nEntitiesModule, ElderIFrameModule, ElderInfiniteAutocompleteDirective, ElderInfiniteScrollDirective, ElderInfiniteScrollLegacyDirective, ElderInfiniteScrollModule, ElderInputPatternDirective, ElderIntervalInputComponent, ElderKeyEventDirective, ElderLabelInputComponent, ElderLabelsModule, ElderLanguageConfig, ElderLanguageInterceptor, ElderLanguageModule, ElderLanguageService, ElderLanguageSwitcherComponent, ElderLocalDateInputComponent, ElderLocalTimeInputComponent, ElderLocalesDeChModule, ElderLocalizedInputComponent, ElderLocalizedInputDialogComponent, ElderLocalizedInputDialogService, ElderLocalizedInputTableComponent, ElderLocalizedTextColumnDirective, ElderLocalizedTextsDirective, ElderMaxValidator, ElderMeasuresModule, ElderMinValidator, ElderMultiEntityValueAccessorUtil, ElderMultiSelectBase, ElderMultiSelectChipsComponent, ElderMultiSelectFormField, ElderMultipleOfUtil, ElderMultipleOfValidator, ElderNavGroupComponent, ElderNavLinkComponent, ElderNavListComponent, ElderNavModule, ElderNextFocusableDirective, ElderNumberCellDirective, ElderOfflineIndicatorComponent, ElderOverlayComponent, ElderOverlayModule, ElderOverlayOriginDirective, ElderOverlayTriggerDirective, ElderPaddingDirective, ElderPanelComponent, ElderPanelModule, ElderPeriodInputComponent, ElderPipesModule, ElderPlugParentFormDirective, ElderProgressBarComponent, ElderProgressBarModule, ElderQuantityFormFieldComponent, ElderQuantityInputControlComponent, ElderQuantityModule, ElderQuantityPipe, ElderQuantityRangeValidator, ElderQuantityService, ElderQuantityTransformPipe, ElderQuestionDialogComponent, ElderRepeatPipe, ElderRepeatPipeLegacy, ElderRequiredDimensionsValidator, ElderRequiredIgnoreZeroValidator, ElderRequiredQuantityValidator, ElderRoundPipe, ElderRouteOutletDrawerService, ElderRouterOutletService, ElderRouterService, ElderSafeUrlPipe, ElderScrollContainerComponent, ElderSearchBoxComponent, ElderSearchContextDirective, ElderSearchInputDirective, ElderSearchModule, ElderSearchPanelComponent, ElderSelectBase, ElderSelectChipAvatarDirective, ElderSelectChipDirective, ElderSelectComponent, ElderSelectComponentState, ElderSelectCustomInputDirective, ElderSelectFormField, ElderSelectModule, ElderSelectOnTabDirective, ElderSelectValueDirective, ElderSelectionDialogComponent, ElderSelectionDialogDirective, ElderSelectionMasterCheckboxComponent, ElderSelectionPopupTriggerAdapterDirective, ElderShellCenterDirective, ElderShellComponent, ElderShellModule, ElderShellNavigationToggleComponent, ElderShellService, ElderShellSideLeftDirective, ElderShellSideRightDirective, ElderShellSlotDirective, ElderSimpleSelectionViewComponent, ElderSimpleSelectionViewModule, ElderSingleSortComponent, ElderStackCardDirective, ElderStopEventPropagationDirective, ElderSvgViewerComponent, ElderTabDirective, ElderTabFocusTrapDirective, ElderTabGroupRoutingDirective, ElderTabModule, ElderTableActivationDirective, ElderTableComponent, ElderTableExtensionDirective, ElderTableGroup, ElderTableModel, ElderTableModelCdkTableBinding, ElderTableModelQueryGroup, ElderTableModule, ElderTableProviders, ElderTableRootDirective, ElderTableSortDirective, ElderTableToolbarDirective, ElderThemeApplierDirective, ElderThemeDirective, ElderThemeModule, ElderThemePreferenceService, ElderThemeService, ElderThemeToggleComponent, ElderTimeModule, ElderToastModule, ElderToastService, ElderTogglePanelComponent, ElderTogglePanelPrimaryDirective, ElderTogglePanelSecondaryDirective, ElderTogglePanelTriggerDirective, ElderToolbarColumnDirective, ElderToolbarComponent, ElderToolbarContentDirective, ElderToolbarModule, ElderToolbarService, ElderToolbarTitleComponent, ElderToolbarTitleService, ElderTouchedDirective, ElderTrimPipe, ElderTripleStateCheckboxDirective, ElderTruncatePipe, ElderUnitSelectDirective, ElderUnitService, ElderUrlFragment, ElderUrlFragmentModule, ElderUrlFragmentParamsService, ElderUrlFragmentSwitcherComponent, ElderValidationErrorDirective, ElderViewersModule, EntitySetPatch, ErrorUtil, ExceptionDetailCtx, FileUploadClient, Filter, FilterContext, FilterUtil, FormFieldBaseComponent, HttpClientBuilder, HttpClientPristine, HttpDataTransfer, HttpDataTransferAggregateComponent, HttpDataTransferComponent, HttpDataTransferIndicatorComponent, HttpDataTransferOverviewComponent, HttpParamsBuilder, I18nBase, I18nPickAsyncPipe, I18nPickPipe, I18nText, IFrameState, IframeCloseDirective, IframeDialogComponent, IframeHostComponent, IframeService, IframeSideContentComponent, IndexedEntities, InternalRestClientConfig, Interval, IsoDurationPipe, IsoIntervalParsePipe, IsoIntervalPipe, JsonMapUtil, KafentConfig, KafentEvent, KafentEventService, KafentEventStream, KafentEventStreamDisabled, KafentEventStreamSse, KafentEventTransport, KafentModule, KafentSseEventChannel, KafentTokenProvider, KafentTokenProviderSessionStorage, KafentTopicSse, KnownElderThemes, KnownLocaleType, LocalListDataSource, LocalPagedDataSource, LocalisationPickerService, MasterSelectionState, MatTableDataContextBinding, MatTableDataContextBindingBuilder, MultiModelBaseComponent, NextNumberUtil, Objects, OnlineStatus, Page, PageRequest, Pageable, ParseUtil, Path, PathNode, PeriodBucket, PeriodDuration, PeriodFormat, ProcessIterationContext, ProcessState, PropertyPathUtil, Quantity, QueryListBinding, QuestionDialogConfig, ReactiveEventSource, ReactiveMap, RefreshingEntity, RestClient, RestClientConfig, RestClientContinuable, RestClientList, RestClientPaged, SearchQuery, SelectionModel, SelectionModelPopupDirective, Sets, SimpleLocalisationPicker, Sort, SortOption, SortUtil, SubBar, SuggestionProvider, TemplateCompositeControl, TemplatedSelectionDialogComponent, ThemeSpec, TimeAgoPipe, TimeDurationPipe, TimeUtil, ToastType, TokenChunkRequest, ToolbarHeader, TranslatedEnumValue, TypedEventMessage, Unit, UnitDimension, UnitDimensionInfo, UnitInfo, UnitRegistry, UrlBuilder, UrlQueryParams, UuidUtil, ValueAccessorBase, ValueWrapper, ViewProviders, WeightPipe, alphaNumStringComparator, buildFormIntegrationProviders, createDataOptionsProvider, createSelectionModel, existingOrNewElderTableModel, isActivePagedDataContext, isContinuableDataContext, isContinuableDataSource, isDataContext, isDataSource, isElderEntityValueAccessor, isElderMultiEntityValueAccessor, isListDataSource, isPagedDataSource, naturalValueComparator, newElderTableModel, proxyControlContainer, registerLocale, runInZone, themeInit };
28507
28736
  //# sourceMappingURL=elderbyte-ngx-starter.mjs.map