xt-store 0.4.1 → 0.4.4

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.
@@ -1,14 +1,15 @@
1
- import { Observable, Subscription } from "rxjs";
2
- import { HttpClient } from "@angular/common/http";
3
- import { OnDestroy } from "@angular/core";
1
+ import { Observable, Subscription } from 'rxjs';
2
+ import { OnDestroy } from '@angular/core';
4
3
  import { AbstractXtStoreProvider } from '../store-provider/xt-store-provider';
5
4
  import { XtStoreCriteria } from '../xt-store-parameters';
6
5
  import { UploadedDocumentInfo } from '../xt-document';
6
+ import { ManagedData } from 'xt-type';
7
+ import { HttpClient } from '@angular/common/http';
7
8
  import * as i0 from "@angular/core";
8
9
  /**
9
10
  * A Store Provider that uses the DontCode API to store / read application data
10
11
  */
11
- export declare class XtApiStoreProvider<T = never> extends AbstractXtStoreProvider<T> implements OnDestroy {
12
+ export declare class XtApiStoreProvider<T extends ManagedData = ManagedData> extends AbstractXtStoreProvider<T> implements OnDestroy {
12
13
  protected http: HttpClient;
13
14
  apiUrl: string;
14
15
  docUrl: string;
@@ -1,10 +1,12 @@
1
- import { map, of, throwError, Subscription, lastValueFrom } from 'rxjs';
2
- import { SpecialFields, Counters } from 'xt-type';
3
- import * as i1 from '@angular/common/http';
4
- import { HttpClient, HttpHeaders } from '@angular/common/http';
1
+ import { map, firstValueFrom, lastValueFrom, finalize, Subscription, of, from } from 'rxjs';
2
+ import { xtTypeManager, Counters, nonTemporaryId } from 'xt-type';
5
3
  import * as i0 from '@angular/core';
6
- import { inject, Injectable } from '@angular/core';
4
+ import { Injectable, inject } from '@angular/core';
5
+ import { type, signalStoreFeature, withState, withProps, withMethods, patchState, signalStore } from '@ngrx/signals';
6
+ import { entityConfig, withEntities, removeEntity, setEntity, setEntities } from '@ngrx/signals/entities';
7
7
  import { map as map$1, mergeAll } from 'rxjs/operators';
8
+ import * as i1 from '@angular/common/http';
9
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
8
10
 
9
11
  class XtStoreManager {
10
12
  static { this.testProvider = null; }
@@ -114,6 +116,11 @@ class XtStoreManager {
114
116
  this.testProvider = testProvider;
115
117
  }
116
118
  }
119
+ function xtStoreManager() {
120
+ return globalThis.XT_STORE_MGR;
121
+ }
122
+ globalThis.XT_STORE_MGR = new XtStoreManager();
123
+ globalThis.xtStoreManager = xtStoreManager;
117
124
 
118
125
  var XtStoreCriteriaOperator;
119
126
  (function (XtStoreCriteriaOperator) {
@@ -156,13 +163,7 @@ var XtGroupByOperation;
156
163
  * Helps handle metadata information about loaded items
157
164
  */
158
165
  class XtStoreProviderHelper {
159
- static { this.specialFieldsCache = new Map(); }
160
- /**
161
- * In case some entity definition has changed, clear the cache
162
- */
163
- static clearConfigCache() {
164
- this.specialFieldsCache.clear();
165
- }
166
+ static { this.typeManager = xtTypeManager(); }
166
167
  /**
167
168
  * In case the provider source doesn't support search criteria, they can be applied here
168
169
  * @param list
@@ -191,100 +192,33 @@ class XtStoreProviderHelper {
191
192
  }
192
193
  /** Returns any field who is a date, in order to convert it from json. Keep the result in a cache map
193
194
  *
194
- * @param name
195
- * @param entity
195
+ * @param typeName
196
+ * @param typeResolver
196
197
  * @protected
197
198
  */
198
- static findSpecialFields(name, entity) {
199
- let specialFields = XtStoreProviderHelper.specialFieldsCache.get(name);
200
- if (specialFields != null)
201
- return specialFields;
202
- const curScore = { score: -1, field: null };
203
- specialFields = new SpecialFields();
204
- const fields = entity.fields;
205
- if (fields != null) {
206
- let prop;
207
- for (prop in fields) {
208
- // Finds the date fields that will need to be converted from json to javascript Date
209
- if (fields[prop]?.type === 'Date' || fields[prop]?.type === 'Date & Time') {
210
- specialFields.addDateField(fields[prop]?.name);
211
- }
212
- else {
213
- XtStoreProviderHelper.scoreIdFieldFromEntityField(fields[prop], curScore);
214
- }
215
- }
216
- }
217
- if (curScore.score > 0) {
218
- specialFields.idField = curScore.field;
219
- }
220
- XtStoreProviderHelper.specialFieldsCache.set(name, specialFields);
221
- // eslint-disable-next-line no-restricted-syntax
222
- //console.debug("Found special fields for entity at position "+name, specialFields);
223
- return specialFields;
224
- }
225
- static findSpecialFieldsFromData(data, existingFields) {
226
- if ((existingFields.idField == null) && (data?.length > 0)) {
227
- // We must guess the id field from data
228
- const first = data[0];
229
- const curScore = { score: -1, field: null };
230
- let prop;
231
- for (prop in first) {
232
- XtStoreProviderHelper.scoreIdFieldFromProperty(prop, curScore);
233
- }
234
- if (curScore.score > 0) {
235
- const test = data.length > 1 ? data[Math.floor((data.length + 1) / 2)] : null;
236
- if ((test == null) || (test[curScore.field] != first[curScore.field])) // Just check that another element doesn't have the same value as an id should be unique
237
- existingFields.idField = curScore.field;
238
- }
239
- }
240
- }
241
- static scoreIdFieldFromEntityField(prop, score) {
242
- return XtStoreProviderHelper.scoreIdFieldFromProperty(prop?.name, score);
199
+ static findTypeHandler(typeName, subName, value) {
200
+ return XtStoreProviderHelper.typeManager?.findTypeHandler(typeName, subName, value);
243
201
  }
244
- static scoreIdFieldFromProperty(name, score) {
245
- if (name == null)
246
- return false;
247
- const propName = name.toLowerCase();
248
- // Finds if the element is the id field
249
- if (propName === "_id") {
250
- score.field = "_id"; // Don't need to process Id
251
- score.score = 100;
252
- return true;
253
- }
254
- else {
255
- if ((propName == "id") || (propName == "uniqueid") || (propName == "identifier") || (propName == 'key') || (propName == 'primaryKey') || (propName == 'uniqueKey')) {
256
- if (score.score < 80) {
257
- score.score = 80;
258
- score.field = name;
259
- }
260
- }
261
- else if (propName.includes("unique") || propName.includes("primary")) {
262
- if (score.score < 50) {
263
- score.score = 50;
264
- score.field = name;
265
- }
266
- }
267
- else if (propName.includes("id") || propName.includes('key')) {
268
- if (score.score < 30) {
269
- score.score = 30;
270
- score.field = name;
271
- }
202
+ /**
203
+ * Ensure _id is removed if necessary before saving the element
204
+ * @param listToConvert
205
+ * @param specialFields
206
+ * @protected
207
+ */
208
+ static cleanUpDataBeforeSaving(listToConvert, typeName, handler) {
209
+ if (handler == null)
210
+ handler = XtStoreProviderHelper.findTypeHandler(typeName, undefined, (listToConvert.length > 0) ? listToConvert[0] : undefined)
211
+ .handler;
212
+ if (handler != null) {
213
+ for (const toConvert of listToConvert) {
214
+ handler.toJson(toConvert);
272
215
  }
273
- return false;
274
216
  }
275
- }
276
- /**
277
- * Ensure _id is removed if necessary before saving the element
278
- * @param listToConvert
279
- * @param specialFields
280
- * @protected
281
- */
282
- static cleanUpDataBeforeSaving(listToConvert, specialFields) {
283
- if ((specialFields?.idField != null) && (specialFields?.idField != '_id')) {
284
- listToConvert.forEach(value => {
217
+ /* if ((specialFields?.idField!=null)&&(specialFields?.idField!='_id')) {
218
+ listToConvert.forEach(value => {
285
219
  delete value._id;
286
- });
287
- }
220
+ })
221
+ }*/
288
222
  }
289
223
  /**
290
224
  * Converts dates and dateTimes properties of each element of the array to Typescript format
@@ -293,37 +227,45 @@ class XtStoreProviderHelper {
293
227
  * @param specialFields
294
228
  * @protected
295
229
  */
296
- static cleanUpLoadedData(listToConvert, specialFields) {
297
- if (specialFields != null) {
298
- if (specialFields.idField == null) {
299
- XtStoreProviderHelper.findSpecialFieldsFromData(listToConvert, specialFields);
230
+ static cleanUpLoadedData(listToConvert, typeName, handler) {
231
+ if (handler == null)
232
+ handler = XtStoreProviderHelper.findTypeHandler(typeName, undefined, (listToConvert.length > 0) ? listToConvert[0] : undefined).handler;
233
+ if (handler != null) {
234
+ for (const toConvert of listToConvert) {
235
+ handler.fromJson(toConvert);
300
236
  }
301
- listToConvert.forEach((val) => {
302
- if ((specialFields.idField != null) && (specialFields.idField != "_id")) // We need to copy the id to the standard _id field
303
- {
304
- val._id = val[specialFields.idField];
305
- }
306
- specialFields.dateFields?.forEach(prop => {
307
- const toConvert = val[prop];
308
- if (toConvert != null) {
309
- let timeEpoch = Date.parse(toConvert);
310
- if (isNaN(timeEpoch)) {
311
- // Invalid date try to remove a possible TZ description in []
312
- const tzDescIndex = toConvert.lastIndexOf('[');
313
- if (tzDescIndex != -1) {
314
- timeEpoch = Date.parse(toConvert.substring(0, tzDescIndex));
315
- }
316
- }
317
- if (isNaN(timeEpoch)) {
318
- delete val[prop];
319
- }
320
- else {
321
- val[prop] = new Date(timeEpoch);
322
- }
323
- }
324
- });
325
- });
326
237
  }
238
+ /*
239
+ if( specialFields.idField==null) {
240
+ XtSpecialFieldsHelper.findSpecialFieldsFromData (listToConvert, specialFields);
241
+ }
242
+ listToConvert.forEach((val)=> {
243
+ if ((specialFields.idField!=null)&&(specialFields.idField!="_id")) // We need to copy the id to the standard _id field
244
+ {
245
+ val._id=val[specialFields.idField];
246
+ }
247
+ specialFields.dateFields?.forEach(prop => {
248
+ const toConvert = val[prop];
249
+ if (toConvert!=null) {
250
+ let timeEpoch =Date.parse(toConvert);
251
+ if( isNaN(timeEpoch)) {
252
+ // Invalid date try to remove a possible TZ description in []
253
+ const tzDescIndex = toConvert.lastIndexOf('[');
254
+ if (tzDescIndex!=-1) {
255
+ timeEpoch=Date.parse(toConvert.substring(0, tzDescIndex));
256
+ }
257
+ }
258
+ if (isNaN(timeEpoch)) {
259
+ delete val[prop];
260
+ }
261
+ else {
262
+ val[prop]=new Date(timeEpoch);
263
+
264
+ }
265
+ }
266
+ })
267
+ })
268
+ }*/
327
269
  }
328
270
  /**
329
271
  * Sort the array using the defined sort declarations across all properties.
@@ -611,6 +553,9 @@ class AbstractXtStoreProvider {
611
553
  return new DontCodeStorePreparedEntities(value, sort, groupedByValues);
612
554
  }));
613
555
  }
556
+ storeDocument(toStore) {
557
+ return firstValueFrom(this.storeDocuments([toStore]));
558
+ }
614
559
  calculateSortHierarchy(sort, groupBy) {
615
560
  // We must first sort by the groupBy, and then by the sort
616
561
  let rootSort;
@@ -624,50 +569,115 @@ class AbstractXtStoreProvider {
624
569
  }
625
570
  }
626
571
 
627
- class XtMemoryStoreProvider extends AbstractXtStoreProvider {
628
- constructor() {
629
- super(...arguments);
630
- this.storage = new Map();
631
- }
632
- canStoreDocument() {
633
- return false;
634
- }
635
- getSafeStore(name) {
636
- let ret = this.storage.get(name);
637
- if (ret == null) {
638
- ret = new Map();
639
- this.storage.set(name, ret);
572
+ const selectId = (data) => {
573
+ if (data._id == null)
574
+ throw new Error("ManagedData with no entity Id used in the store.", { cause: data });
575
+ return data._id;
576
+ };
577
+ const xtStoreEntityConfig = entityConfig({
578
+ entity: type(),
579
+ selectId: selectId
580
+ });
581
+ function withXtStoreProvider(entityName, storeProvider) {
582
+ return signalStoreFeature(withState({ entityName, loading: false }), withEntities(xtStoreEntityConfig), withProps(() => ({
583
+ _storeProvider: storeProvider
584
+ })), withMethods((store) => ({
585
+ async storeEntity(toStore) {
586
+ patchState(store, { loading: true });
587
+ return store._storeProvider.storeEntity(entityName, toStore).then((stored) => {
588
+ patchState(store, setEntity(stored, xtStoreEntityConfig));
589
+ return stored;
590
+ }).finally(() => {
591
+ patchState(store, { loading: false });
592
+ });
593
+ },
594
+ fetchEntities() {
595
+ patchState(store, { loading: true });
596
+ return lastValueFrom(store._storeProvider.searchEntities(entityName).pipe(map((entities) => {
597
+ patchState(store, setEntities(entities, xtStoreEntityConfig));
598
+ }), finalize(() => {
599
+ patchState(store, { loading: false });
600
+ })));
601
+ },
602
+ /* listEntities (): Observable<ManagedData[]> {
603
+ patchState(store, {loading:true});
604
+ return store._storeProvider.searchEntities(entityName).pipe (map( (entities: ManagedData[]) => {
605
+ patchState(store, setEntities (entities, xtStoreEntityConfig));
606
+ return entities;
607
+ }),finalize(() => {
608
+ patchState(store, {loading:false});
609
+ }));
610
+ },*/
611
+ async loadEntity(id) {
612
+ patchState(store, { loading: true });
613
+ return store._storeProvider.loadEntity(entityName, id).then((loaded) => {
614
+ if (loaded != null)
615
+ patchState(store, setEntity(loaded, xtStoreEntityConfig));
616
+ return loaded;
617
+ }).finally(() => {
618
+ patchState(store, { loading: false });
619
+ });
620
+ },
621
+ async safeLoadEntity(id) {
622
+ patchState(store, { loading: true });
623
+ return store._storeProvider.loadEntity(entityName, id).then((loaded) => {
624
+ if (loaded != null)
625
+ patchState(store, setEntity(loaded, xtStoreEntityConfig));
626
+ return loaded;
627
+ }).then((loaded) => {
628
+ if (loaded == null)
629
+ throw new Error("Entity " + entityName + " with id " + id + " not found");
630
+ return loaded;
631
+ }).finally(() => {
632
+ patchState(store, { loading: false });
633
+ });
634
+ },
635
+ async deleteEntity(id) {
636
+ patchState(store, { loading: true });
637
+ return store._storeProvider.deleteEntity(entityName, id).then((result) => {
638
+ if (result) {
639
+ patchState(store, removeEntity(id));
640
+ }
641
+ return result;
642
+ }).finally(() => {
643
+ patchState(store, { loading: false });
644
+ });
640
645
  }
641
- return ret;
642
- }
643
- deleteEntity(name, key) {
644
- const store = this.getSafeStore(name);
645
- return Promise.resolve(store.delete(key));
646
- }
647
- loadEntity(name, key) {
648
- const store = this.getSafeStore(name);
649
- return Promise.resolve(store.get(key));
650
- }
651
- listEntities(name) {
652
- const store = this.getSafeStore(name);
653
- //console.debug("Listing entities for "+name+" with ",store);
654
- return of(Array.from(store.values()));
655
- }
656
- storeEntity(name, entity) {
657
- const store = this.getSafeStore(name);
658
- if (entity._id == null) {
659
- entity._id = Math
660
- .random().toString(36).substring(2, 8);
646
+ })));
647
+ }
648
+
649
+ class StoreManagerService {
650
+ constructor() {
651
+ this.storeManager = xtStoreManager();
652
+ this.entityToStoreMap = new Map();
653
+ }
654
+ getStoreFor(entityName) {
655
+ let store = this.entityToStoreMap.get(entityName);
656
+ if (store == null) {
657
+ const provider = this.storeManager.getProvider(entityName);
658
+ if (provider == null) {
659
+ throw new Error('No provider found for entity ' + entityName);
660
+ }
661
+ else {
662
+ const res = signalStore(withXtStoreProvider(entityName, provider));
663
+ store = new res();
664
+ }
665
+ this.entityToStoreMap.set(entityName, store);
661
666
  }
662
- store.set(entity._id, entity);
663
- return Promise.resolve(entity);
667
+ return store;
664
668
  }
665
- storeDocuments(toStore) {
666
- return throwError(() => {
667
- throw new Error("Not implemented.");
668
- });
669
+ setDefaultStoreProvider(provider) {
670
+ this.storeManager.setDefaultProvider(provider);
669
671
  }
672
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: StoreManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
673
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: StoreManagerService, providedIn: 'root' }); }
670
674
  }
675
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: StoreManagerService, decorators: [{
676
+ type: Injectable,
677
+ args: [{
678
+ providedIn: 'root'
679
+ }]
680
+ }], ctorParameters: () => [] });
671
681
 
672
682
  /**
673
683
  * A Store Provider that uses the DontCode API to store / read application data
@@ -700,10 +710,9 @@ class XtApiStoreProvider extends AbstractXtStoreProvider {
700
710
  this.docUrl = newConfig.documentApiUrl;
701
711
  }*/
702
712
  storeEntity(name, data) {
703
- const id = data._id;
713
+ const id = nonTemporaryId(data);
704
714
  // Reconverts dates or Ids
705
- const specialFields = XtStoreProviderHelper.findSpecialFields(name, {});
706
- XtStoreProviderHelper.cleanUpDataBeforeSaving([data], specialFields);
715
+ XtStoreProviderHelper.cleanUpDataBeforeSaving([data], name);
707
716
  if (id != undefined) {
708
717
  return lastValueFrom(this.http.put(this.apiUrl + '/' + name + '/' + id, data, { observe: "body", responseType: "json" }));
709
718
  }
@@ -713,9 +722,8 @@ class XtApiStoreProvider extends AbstractXtStoreProvider {
713
722
  }
714
723
  loadEntity(name, key) {
715
724
  const obs = this.http.get(this.apiUrl + '/' + name + '/' + key, { observe: "body", responseType: "json" });
716
- const specialFields = XtStoreProviderHelper.findSpecialFields(name, {});
717
725
  return lastValueFrom(obs).then((value) => {
718
- XtStoreProviderHelper.cleanUpLoadedData([value], specialFields);
726
+ XtStoreProviderHelper.cleanUpLoadedData([value], name);
719
727
  return value;
720
728
  });
721
729
  }
@@ -725,9 +733,8 @@ class XtApiStoreProvider extends AbstractXtStoreProvider {
725
733
  });
726
734
  }
727
735
  searchEntities(name, ...criteria) {
728
- const specialFields = XtStoreProviderHelper.findSpecialFields(name, {});
729
736
  return this.http.get(this.apiUrl + '/' + name, { observe: "body", responseType: "json" }).pipe(map$1(value => {
730
- XtStoreProviderHelper.cleanUpLoadedData(value, specialFields);
737
+ XtStoreProviderHelper.cleanUpLoadedData(value, name);
731
738
  return value;
732
739
  }), map$1(value => {
733
740
  return XtStoreProviderHelper.applyFilters(value, ...criteria);
@@ -750,16 +757,67 @@ class XtApiStoreProvider extends AbstractXtStoreProvider {
750
757
  //HTTP Angular service, which will send call to Laravel API With headers and myformdata
751
758
  return this.http.post(this.docUrl, myFormData, { headers: headers }).pipe(mergeAll());
752
759
  }
753
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: XtApiStoreProvider, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
754
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: XtApiStoreProvider, providedIn: 'root' }); }
760
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: XtApiStoreProvider, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
761
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: XtApiStoreProvider, providedIn: 'root' }); }
755
762
  }
756
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: XtApiStoreProvider, decorators: [{
763
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: XtApiStoreProvider, decorators: [{
757
764
  type: Injectable,
758
765
  args: [{
759
766
  providedIn: 'root'
760
767
  }]
761
768
  }], ctorParameters: () => [{ type: i1.HttpClient }] });
762
769
 
770
+ class XtMemoryStoreProvider extends AbstractXtStoreProvider {
771
+ constructor() {
772
+ super(...arguments);
773
+ this.storage = new Map();
774
+ }
775
+ /**
776
+ * It supports storing documents in memory only, then use with care !
777
+ */
778
+ canStoreDocument() {
779
+ return true;
780
+ }
781
+ getSafeStore(name) {
782
+ let ret = this.storage.get(name);
783
+ if (ret == null) {
784
+ ret = new Map();
785
+ this.storage.set(name, ret);
786
+ }
787
+ return ret;
788
+ }
789
+ deleteEntity(name, key) {
790
+ const store = this.getSafeStore(name);
791
+ return Promise.resolve(store.delete(key));
792
+ }
793
+ loadEntity(name, key) {
794
+ const store = this.getSafeStore(name);
795
+ return Promise.resolve(store.get(key));
796
+ }
797
+ listEntities(name) {
798
+ const store = this.getSafeStore(name);
799
+ //console.debug("Listing entities for "+name+" with ",store);
800
+ return of(Array.from(store.values()));
801
+ }
802
+ storeEntity(name, entity) {
803
+ const store = this.getSafeStore(name);
804
+ if (entity._id == null) {
805
+ entity._id = Math
806
+ .random().toString(36).substring(2, 8);
807
+ }
808
+ store.set(entity._id, entity);
809
+ return Promise.resolve(entity);
810
+ }
811
+ storeDocuments(toStore) {
812
+ const toSend = new Array();
813
+ for (const file of toStore) {
814
+ const ret = { documentName: URL.createObjectURL(file), isUrl: true };
815
+ toSend.push(ret);
816
+ }
817
+ return from(toSend);
818
+ }
819
+ }
820
+
763
821
  class StoreTestBed {
764
822
  constructor() {
765
823
  this.storeManager = new XtStoreManager();
@@ -788,5 +846,5 @@ class StoreTestBed {
788
846
  * Generated bundle index. Do not edit.
789
847
  */
790
848
 
791
- export { AbstractXtStoreProvider, DontCodeStoreGroupedByEntities, DontCodeStoreGroupedByValues, DontCodeStorePreparedEntities, StoreTestBed, XtApiStoreProvider, XtGroupByOperation, XtGroupByShow, XtMemoryStoreProvider, XtSortByDirection, XtStoreCriteria, XtStoreCriteriaOperator, XtStoreGroupBy, XtStoreGroupByAggregate, XtStoreManager, XtStoreProviderHelper, XtStoreSortBy };
849
+ export { AbstractXtStoreProvider, DontCodeStoreGroupedByEntities, DontCodeStoreGroupedByValues, DontCodeStorePreparedEntities, StoreManagerService, StoreTestBed, XtApiStoreProvider, XtGroupByOperation, XtGroupByShow, XtMemoryStoreProvider, XtSortByDirection, XtStoreCriteria, XtStoreCriteriaOperator, XtStoreGroupBy, XtStoreGroupByAggregate, XtStoreManager, XtStoreProviderHelper, XtStoreSortBy, withXtStoreProvider, xtStoreManager };
792
850
  //# sourceMappingURL=xt-store.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"xt-store.mjs","sources":["../../../projects/store/src/store-manager/xt-store-manager.ts","../../../projects/store/src/xt-store-parameters.ts","../../../projects/store/src/store-provider/xt-store-provider-helper.ts","../../../projects/store/src/xt-reporting.ts","../../../projects/store/src/store-provider/xt-store-provider.ts","../../../projects/store/src/store-provider/xt-memory-store-provider.ts","../../../projects/store/src/api-provider/xt-api-store-provider.ts","../../../projects/store/src/test/store-test-bed.ts","../../../projects/store/src/public-api.ts","../../../projects/store/src/xt-store.ts"],"sourcesContent":["import { XtStoreProvider } from '../store-provider/xt-store-provider';\nimport { Observable } from 'rxjs';\nimport { UploadedDocumentInfo } from '../xt-document';\nimport { XtStoreCriteria, XtGroupBy, XtSortBy } from '../xt-store-parameters';\nimport { DontCodeStorePreparedEntities } from '../store-provider/xt-store-provider-helper';\nimport { XtDataTransformer } from '../store-provider/xt-data-transformer';\n\nexport class XtStoreManager {\n private _default?: XtStoreProvider<any>;\n private providerByPosition = new Map<string, XtStoreProvider<any>>();\n private providerByType = new Map<string, XtStoreProvider<any>>();\n\n protected static testProvider:XtStoreProvider<any>|null = null;\n\n constructor(\n provider?: XtStoreProvider<any>\n ) {\n this._default = provider;\n this.reset();\n }\n\n reset() {\n this.providerByPosition.clear();\n this.providerByType.clear();\n }\n\n getProvider<T=never>(name?: string): XtStoreProvider<T> | undefined {\n // Override for testing\n if( XtStoreManager.testProvider!=null) return XtStoreManager.testProvider;\n\n if (name == null) {\n return this._default;\n } else {\n let ret = null;\n // Try to find if the entity is loaded from a defined source\n /*const srcDefinition = this.modelMgr.findTargetOfProperty(\n DontCodeModel.APP_ENTITIES_FROM_NODE,\n position\n )?.value as DontCodeSourceType;\n if (srcDefinition) {\n ret = this.providerByType.get(srcDefinition.type);\n }\n if (!ret) {*/\n ret = this.providerByPosition.get(name);\n //}\n return ret ?? this._default;\n }\n }\n\n getProviderSafe<T=never>(name?: string): XtStoreProvider<T> {\n const ret = this.getProvider<T>(name);\n if (ret == null) {\n throw new Error('Trying to get an undefined or null provider');\n } else {\n return ret;\n }\n }\n\n getDefaultProvider<T=never>(): XtStoreProvider<T> | undefined {\n return this.getProvider();\n }\n\n getDefaultProviderSafe<T=never>(): XtStoreProvider<T> {\n return this.getProviderSafe();\n }\n\n setProvider<T=never>(value: XtStoreProvider<T>, name?: string): void {\n if (name == null) this._default = value;\n else {\n this.providerByPosition.set(name, value);\n }\n }\n\n setProviderForSourceType<T=never>(\n value: XtStoreProvider<T>,\n srcType: string\n ): void {\n this.providerByType.set(srcType, value);\n }\n\n setDefaultProvider<T=never>(value: XtStoreProvider<T>): void {\n this.setProvider(value);\n }\n\n removeProvider(name?: string): void {\n if (name == null) this._default = undefined;\n else {\n this.providerByPosition.delete(name);\n }\n }\n\n removeProviderForSourceType(srcType: string): void {\n this.providerByType.delete(srcType);\n }\n\n removeDefaultProvider(): void {\n this.removeProvider();\n }\n\n storeEntity<T=never>(name: string, entity: T): Promise<T> {\n return this.getProviderSafe<T>(name).storeEntity(name, entity);\n }\n\n loadEntity<T=never>(name: string, key: any): Promise<T|undefined> {\n return this.getProviderSafe<T>(name).loadEntity(name, key);\n }\n\n safeLoadEntity<T=never>(name: string, key: any): Promise<T> {\n return this.getProviderSafe<T>(name).safeLoadEntity(name, key);\n }\n\n deleteEntity(name: string, key: any): Promise<boolean> {\n return this.getProviderSafe(name).deleteEntity(name, key);\n }\n\n searchEntities<T=never>(\n name: string,\n ...criteria: XtStoreCriteria[]\n ): Observable<Array<T>> {\n return this.getProviderSafe<T>(name).searchEntities(name, ...criteria);\n }\n\n searchAndPrepareEntities<T=never>(\n name: string,\n sort?:XtSortBy,\n groupBy?:XtGroupBy,\n dataTransformer?:XtDataTransformer,\n ...criteria: XtStoreCriteria[]\n ): Observable<DontCodeStorePreparedEntities<T>> {\n return this.getProviderSafe<T>(name).searchAndPrepareEntities(name, sort, groupBy, dataTransformer, ...criteria);\n }\n\n\n canStoreDocument(name?: string): boolean {\n const res = this.getProvider(name)?.canStoreDocument();\n if (res) return res;\n else return false;\n }\n\n storeDocuments(\n toStore: File[],\n name?: string\n ): Observable<UploadedDocumentInfo> {\n return this.getProviderSafe(name).storeDocuments(toStore);\n }\n\n public static setTestMode (testProvider:XtStoreProvider<any>) {\n this.testProvider=testProvider;\n }\n\n}\n\n","\nexport enum XtStoreCriteriaOperator {\n EQUALS = '=',\n LESS_THAN = '<',\n LESS_THAN_EQUAL = '<=',\n}\n\nexport class XtStoreCriteria {\n name: string;\n value: any;\n operator: XtStoreCriteriaOperator;\n\n constructor(\n name: string,\n value: any,\n operator?: XtStoreCriteriaOperator\n ) {\n this.name = name;\n this.value = value;\n if (!operator) this.operator = XtStoreCriteriaOperator.EQUALS;\n else {\n this.operator = operator;\n }\n }\n}\n\nexport type XtSortBy ={\n by:string,\n direction: XtSortByDirection\n}\n\nexport enum XtSortByDirection {\n None = \"None\",\n Ascending = \"Ascending\",\n Descending = \"Descending\"\n}\n\nexport enum XtGroupByShow {\n OnlyLowest=\"OnlyLowest\",\n OnlyHighest=\"OnlyHighest\"\n}\n\nexport enum XtGroupByOperation {\n Count= \"Count\",\n Sum=\"Sum\",\n Average=\"Average\",\n Minimum=\"Minimum\",\n Maximum=\"Maximum\"\n}\n\nexport type XtGroupBy= {\n of: string,\n display:{[key:string]:XtGroupByAggregate};\n show?:XtGroupByShow,\n label?:string\n\n atLeastOneGroupIsRequested (): boolean;\n getRequiredListOfFields(): Set<string>;\n}\n\nexport type XtGroupByAggregate = {\n operation: XtGroupByOperation;\n of:string,\n label?:string\n}\n\n\n","import { SpecialFields, Counters } from 'xt-type';\nimport {\n XtGroupByAggregate,\n XtStoreCriteria,\n XtStoreCriteriaOperator,\n XtGroupBy,\n XtSortBy, XtGroupByOperation\n} from '../xt-store-parameters';\n\n/**\n * Helps handle metadata information about loaded items\n */\nexport class XtStoreProviderHelper {\n\n static specialFieldsCache = new Map<string, SpecialFields>();\n /**\n * In case some entity definition has changed, clear the cache\n */\n public static clearConfigCache (): void {\n this.specialFieldsCache.clear();\n }\n\n /**\n * In case the provider source doesn't support search criteria, they can be applied here\n * @param list\n * @param criteria\n */\n public static applyFilters<T> (list:Array<T>, ...criteria: XtStoreCriteria[]): Array<T> {\n if ((criteria==null)||(criteria.length==0)) return list;\n return list.filter(element => {\n for (const criterium of criteria) {\n const toTest = element[criterium.name as keyof T];\n switch (criterium.operator) {\n case XtStoreCriteriaOperator.EQUALS:\n return criterium.value==toTest;\n case XtStoreCriteriaOperator.LESS_THAN:\n return toTest < criterium.value;\n case XtStoreCriteriaOperator.LESS_THAN_EQUAL:\n return toTest <= criterium.value;\n default:\n throw new Error (\"Operator \"+criterium.operator+\" unknown\");\n }\n }\n return true;\n });\n return list;\n }\n\n /** Returns any field who is a date, in order to convert it from json. Keep the result in a cache map\n *\n * @param name\n * @param entity\n * @protected\n */\n public static findSpecialFields (name:string, entity:any):SpecialFields {\n let specialFields = XtStoreProviderHelper.specialFieldsCache.get(name);\n if (specialFields!=null) return specialFields;\n\n const curScore: {score:number, field:any} = {score:-1, field:null}\n\n specialFields = new SpecialFields();\n const fields = entity.fields;\n if( fields!=null) {\n let prop: keyof typeof fields;\n for (prop in fields) {\n // Finds the date fields that will need to be converted from json to javascript Date\n if (fields[prop]?.type==='Date' || fields[prop]?.type==='Date & Time') {\n specialFields.addDateField(fields[prop]?.name);\n } else {\n XtStoreProviderHelper.scoreIdFieldFromEntityField(fields[prop], curScore);\n }\n }\n }\n if (curScore.score>0) {\n specialFields.idField=curScore.field;\n }\n XtStoreProviderHelper.specialFieldsCache.set(name, specialFields);\n\n // eslint-disable-next-line no-restricted-syntax\n //console.debug(\"Found special fields for entity at position \"+name, specialFields);\n return specialFields;\n }\n\n protected static findSpecialFieldsFromData(data: Array<any>, existingFields: SpecialFields) {\n if( (existingFields.idField==null) && (data?.length>0)) {\n // We must guess the id field from data\n const first=data[0];\n const curScore: {score:number, field:any} = {score:-1, field:null}\n let prop: keyof typeof first;\n\n for (prop in first) {\n XtStoreProviderHelper.scoreIdFieldFromProperty(prop, curScore);\n }\n if (curScore.score>0) {\n const test=data.length>1?data[Math.floor((data.length+1)/2)]:null;\n if ((test==null) || (test[curScore.field]!=first[curScore.field])) // Just check that another element doesn't have the same value as an id should be unique\n existingFields.idField=curScore.field;\n }\n }\n }\n\n protected static scoreIdFieldFromEntityField (prop:any, score:{score:number, field:any}): boolean {\n return XtStoreProviderHelper.scoreIdFieldFromProperty(prop?.name, score);\n }\n\n protected static scoreIdFieldFromProperty (name:string, score:{score:number, field:any}): boolean {\n if( name==null)\n return false;\n const propName=name.toLowerCase();\n // Finds if the element is the id field\n if( propName === \"_id\") {\n score.field=\"_id\"; // Don't need to process Id\n score.score = 100;\n return true;\n } else {\n if ((propName == \"id\")||(propName==\"uniqueid\")||(propName==\"identifier\") || (propName=='key') || (propName=='primaryKey')||(propName=='uniqueKey')) {\n if (score.score<80) {\n score.score=80;\n score.field=name;\n }\n } else if (propName.includes(\"unique\")||propName.includes(\"primary\")) {\n if (score.score<50) {\n score.score = 50;\n score.field=name;\n }\n }else if (propName.includes(\"id\")||propName.includes('key')) {\n if (score.score<30) {\n score.score = 30;\n score.field=name;\n }\n }\n return false;\n }\n\n }\n /**\n * Ensure _id is removed if necessary before saving the element\n * @param listToConvert\n * @param specialFields\n * @protected\n */\n public static cleanUpDataBeforeSaving (listToConvert:Array<any>, specialFields:SpecialFields) : void {\n if ((specialFields?.idField!=null)&&(specialFields?.idField!='_id')) {\n listToConvert.forEach(value => {\n delete value._id;\n })\n }\n }\n\n /**\n * Converts dates and dateTimes properties of each element of the array to Typescript format\n * Ensure _id is set with the right id\n * @param listToConvert\n * @param specialFields\n * @protected\n */\n public static cleanUpLoadedData (listToConvert:Array<any>, specialFields:SpecialFields) : void {\n\n if (specialFields!=null) {\n if( specialFields.idField==null) {\n XtStoreProviderHelper.findSpecialFieldsFromData (listToConvert, specialFields);\n }\n listToConvert.forEach((val)=> {\n if ((specialFields.idField!=null)&&(specialFields.idField!=\"_id\")) // We need to copy the id to the standard _id field\n {\n val._id=val[specialFields.idField];\n }\n specialFields.dateFields?.forEach(prop => {\n const toConvert = val[prop];\n if (toConvert!=null) {\n let timeEpoch =Date.parse(toConvert);\n if( isNaN(timeEpoch)) {\n // Invalid date try to remove a possible TZ description in []\n const tzDescIndex = toConvert.lastIndexOf('[');\n if (tzDescIndex!=-1) {\n timeEpoch=Date.parse(toConvert.substring(0, tzDescIndex));\n }\n }\n if (isNaN(timeEpoch)) {\n delete val[prop];\n }\n else {\n val[prop]=new Date(timeEpoch);\n\n }\n }\n })\n })\n }\n }\n\n /**\n * Sort the array using the defined sort declarations across all properties.\n *\n * @param toSort\n * @param sortOptions\n */\n static multiSortArray<T>(toSort: T[], sortOptions?: XtSortBy): T[] {\n if( sortOptions==null)\n return toSort;\n return toSort;\n }\n\n /**\n * Calculates sum, avg, min or max values per group\n * @param values\n * @param groupBy\n * @param modelMgr\n * @param position\n * @param item\n */\n static calculateGroupedByValues<T>(name: string, values: T[], groupBy: XtGroupBy):DontCodeStoreGroupedByEntities|undefined {\n // We are counting per different value of the groupedBy Item\n if ((groupBy!=null) && (groupBy.display!=null)) {\n let fieldToGroupBy=groupBy.of as keyof T;\n if (groupBy.show!=null) fieldToGroupBy=groupBy.show.valueOf() as keyof T;\n\n const counters=new Map<any,Map<keyof T, Counters>> ();\n let lastGroupDelimiter:any;\n let oneGroupOfCounters=new Map<keyof T, Counters>();\n\n const fieldsRequired = groupBy.getRequiredListOfFields() as Set<keyof T>;\n for (const value of values) {\n if (value[fieldToGroupBy]!=lastGroupDelimiter) { // We change the group\n lastGroupDelimiter=value[fieldToGroupBy];\n const storedGroupOfCounters=counters.get(lastGroupDelimiter);\n if( storedGroupOfCounters==null) {\n oneGroupOfCounters = new Map<keyof T, Counters>();\n counters.set(lastGroupDelimiter, oneGroupOfCounters);\n }else {\n oneGroupOfCounters = storedGroupOfCounters;\n }\n }\n\n for (const field of fieldsRequired) {\n let counter=oneGroupOfCounters?.get(field);\n if( counter==null) {\n counter = new Counters();\n oneGroupOfCounters.set(field, counter);\n }\n\n const valSrc=value[field];\n const val=valSrc;\n if (valSrc!=null) {\n const modelMgr:any=null;\n // If it's an object, we need to set the calculated values as the object itself\n if ((typeof valSrc === 'object') && (!(valSrc instanceof Date)) && (modelMgr!=null)) {\n if( counter.sum==null) counter.sum=structuredClone(valSrc);\n else {\n counter.sum=modelMgr.modifyValues(counter.sum, valSrc, counter.metaData,\n (first: any, second: any) => {\n if ((first!=null) && (second!=null))\n return first + second;\n else if (first == null) {\n return second;\n } else if (second==null) {\n return first;\n }\n }/*,\n position, item*/);\n }\n const value=modelMgr.extractValue(valSrc, counter.metaData/*,position, item*/);\n if( counter.minimum==null) { counter.minimum=valSrc; counter.minAsValue=value}\n else {\n const minValue=counter.minAsValue;\n if ((value!=null) && ((minValue==null) || (value < minValue)) ) { counter.minimum = valSrc; counter.minAsValue=value }\n }\n\n if( counter.maximum==null) { counter.maximum=valSrc; counter.maxAsValue=value;}\n else {\n const maxValue=counter.maxAsValue;\n\n if ((value!=null) && ((maxValue==null) || (value > maxValue)))\n { counter.maximum = valSrc; counter.maxAsValue = value;}\n\n }\n\n if (value!=null) {\n counter.count++;\n }\n\n } else if (typeof val === 'number') {\n if( counter.sum==null) counter.sum=0;\n counter.sum=counter.sum+val;\n if( (counter.minimum==null) || (val < counter.minimum))\n { counter.minimum=valSrc; counter.minAsValue=valSrc as number;}\n if( (counter.maximum==null) || (val > counter.maximum))\n { counter.maximum=valSrc; counter.maxAsValue=valSrc as number;}\n counter.count++;\n } else if ((val instanceof Date) && (!isNaN(val.getTime()))) {\n counter.sum=null;\n if ((counter.minimum==null) || (val.valueOf() < counter.minimum.valueOf())) {\n counter.minimum=valSrc;\n }\n if ((counter.maximum==null) || (val.valueOf() > counter.maximum.valueOf())) {\n counter.maximum=valSrc;\n }\n counter.count++;\n } else { // strings\n counter.count++;\n }\n }\n }\n }\n\n // Now that we have all the counters, let's generate the GroupedFields\n let ret: DontCodeStoreGroupedByEntities|undefined;\n if (counters.size>0) {\n ret = new DontCodeStoreGroupedByEntities(groupBy, new Map<any,DontCodeStoreGroupedByValues[]>);\n for (const groupKey of counters.keys()) {\n const group=counters.get(groupKey)!;\n\n for (const aggregate of Object.values(groupBy.display)) {\n let value;\n const counter = group.get(aggregate.of as keyof T);\n if (counter != null) {\n switch (aggregate.operation) {\n case XtGroupByOperation.Count:\n value = counter.count;\n break;\n case XtGroupByOperation.Sum:\n value = counter.sum;\n break;\n case XtGroupByOperation.Average: {\n const modelMgr:any=null;\n if ((counter.sum==null) || (counter.count==0)) value=null;\n else if ((typeof counter.sum === 'object') && (!(counter.sum instanceof Date)) && (modelMgr!=null)) {\n value = modelMgr.applyValue(structuredClone(counter.sum),\n modelMgr.extractValue(counter.sum, counter.metaData/*, position, item*/)/counter.count,\n counter.metaData, undefined/*, position, item*/);\n } else value = counter.sum / counter.count;\n }\n break;\n case XtGroupByOperation.Minimum:\n value = counter.minimum;\n break;\n case XtGroupByOperation.Maximum:\n value = counter.maximum;\n break;\n }\n let listOfValues= ret.values?.get(groupKey);\n if (listOfValues==null) {\n listOfValues = new Array<DontCodeStoreGroupedByValues>();\n ret.values?.set(groupKey, listOfValues);\n }\n listOfValues.push(new DontCodeStoreGroupedByValues(aggregate, value));\n }\n }\n }\n return ret.values!.size>0?ret:undefined;\n }\n }\n return undefined;\n }\n}\n\n\nexport class DontCodeStorePreparedEntities<T> {\n constructor(public sortedData:T[], public sortInfo?:XtSortBy, public groupedByEntities?:DontCodeStoreGroupedByEntities) {\n }\n}\n\nexport class DontCodeStoreGroupedByEntities {\n constructor(public groupInfo:XtGroupBy, public values?:Map<any,DontCodeStoreGroupedByValues[]>) {\n if (values==null)\n this.values=new Map<any,DontCodeStoreGroupedByValues[]>();\n }\n}\n\nexport class DontCodeStoreGroupedByValues {\n constructor(public forAggregate:XtGroupByAggregate, public value:any) {\n }\n}\n\n","import {\n XtGroupBy,\n XtGroupByAggregate, XtGroupByOperation,\n XtGroupByShow,\n XtSortBy,\n XtSortByDirection\n} from './xt-store-parameters';\n\nexport interface DontCodeReportType {\n title: string;\n for: string;\n groupedBy?: {[key:string]:XtGroupBy};\n sortedBy?: {[key:string]:XtSortBy};\n as?: {[key:string]:DontCodeReportDisplayType};\n}\n\nexport interface DontCodeReportDisplayType {\n type: string;\n of: string;\n by?:string;\n title: string;\n}\n\nexport class XtStoreSortBy implements XtSortBy {\n\n direction: XtSortByDirection;\n\n constructor(public by: string, direction?:XtSortByDirection, public subSort?:XtSortBy) {\n if (direction==null) this.direction=XtSortByDirection.None;\n else this.direction=direction;\n }\n}\n\nexport class XtStoreGroupBy implements XtGroupBy {\n display:{[key:string]:XtStoreGroupByAggregate};\n\n constructor(public of:string, display?:{[key:string]:XtStoreGroupByAggregate}, public show?:XtGroupByShow) {\n if (display==null) this.display={};\n else this.display=display;\n }\n\n public atLeastOneGroupIsRequested (): boolean {\n if( (this.display!=null) && (Object.keys(this.display).length>0))\n return true;\n return false;\n }\n\n getRequiredListOfFields(): Set<string> {\n const ret = new Set<string>();\n if( this.display!=null) {\n for (const aggregate of Object.values(this.display)) {\n ret.add(aggregate.of);\n }\n }\n return ret;\n }\n}\n\nexport class XtStoreGroupByAggregate implements XtGroupByAggregate{\n constructor(public of:string, public operation:XtGroupByOperation) {\n }\n}\n\n","import {XtDataTransformer} from \"./xt-data-transformer\";\nimport { map, Observable } from 'rxjs';\nimport { XtStoreCriteria, XtGroupBy, XtSortBy } from '../xt-store-parameters';\nimport {\n DontCodeStoreGroupedByEntities,\n DontCodeStorePreparedEntities,\n XtStoreProviderHelper\n} from './xt-store-provider-helper';\nimport { UploadedDocumentInfo } from '../xt-document';\nimport { XtStoreSortBy } from '../xt-reporting';\n\n/**\n * The standard interface for any store provider\n */\nexport type XtStoreProvider<T=never>= {\n storeEntity( name:string, entity: T): Promise<T>;\n\n /**\n * Rejects the promise if the entity is not found\n * @param name\n * @param key\n */\n safeLoadEntity( name: string, key: any): Promise<T>;\n loadEntity( name: string, key: any): Promise<T|undefined>;\n\n deleteEntity(name:string, key: any): Promise<boolean>;\n\n searchEntities(\n name: string,\n ...criteria: XtStoreCriteria[]\n ): Observable<Array<T>>;\n\n searchAndPrepareEntities(\n name: string,\n sort?:XtSortBy,\n groupBy?:XtGroupBy,\n transformer?: XtDataTransformer<T>,\n ...criteria: XtStoreCriteria[]\n ): Observable<DontCodeStorePreparedEntities<T>>;\n\n canStoreDocument(): boolean;\n\n /**\n * Upload documents to a server store and returns the url or the id needed to retrieve them.\n * @param toStore\n * @param position\n */\n storeDocuments(\n toStore: File[]\n ): Observable<UploadedDocumentInfo>;\n}\n\nexport abstract class AbstractXtStoreProvider<T=never> implements XtStoreProvider<T> {\n abstract canStoreDocument(): boolean;\n\n abstract deleteEntity(name:string, key: any): Promise<boolean>;\n\n abstract loadEntity(name:string, key: any): Promise<T|undefined>;\n\n constructor () {\n }\n\n safeLoadEntity(name: string, key: any): Promise<T> {\n return this.loadEntity(name, key).then(value => {\n if (value==null)\n return Promise.reject(\"Not found\");\n else return value;\n })\n }\n\n /**\n * If the store supports queries with criteria, this function must be implemented, if not, listEntities must be implemented, and this function will apply filters\n * @param position\n * @param criteria\n */\n searchEntities(name: string, ...criteria: XtStoreCriteria[]): Observable<T[]> {\n return this.listEntities(name).pipe(\n map (value => {\n return XtStoreProviderHelper.applyFilters(value, ...criteria) as T[];\n })\n );\n }\n\n /**\n * Returns the list of entities at a given position in the model. Implements at least this function or searchEntities depending on the capability of the store\n * @param position\n * @protected\n */\n protected listEntities (name:string): Observable<T[]> {\n return this.searchEntities(name);\n }\n\n searchAndPrepareEntities(name: string, sort?: XtSortBy, groupBy?: XtGroupBy, transformer?: XtDataTransformer<T>, ...criteria: XtStoreCriteria[]): Observable<DontCodeStorePreparedEntities<T>> {\n return this.searchEntities(name, ...criteria).pipe(\n map (value => {\n // Run the transformation if any\n if (transformer!=null) return transformer.postLoadingTransformation(value);\n else return value;\n }),\n map (value => {\n let groupedByValues:DontCodeStoreGroupedByEntities|undefined;\n if((sort!=null) || (groupBy?.atLeastOneGroupIsRequested()===true)) {\n value = XtStoreProviderHelper.multiSortArray(value, this.calculateSortHierarchy(sort, groupBy)) as T[];\n if (groupBy!=null) {\n groupedByValues = XtStoreProviderHelper.calculateGroupedByValues(name, value, groupBy);\n }\n }\n return new DontCodeStorePreparedEntities<T> (value, sort, groupedByValues);\n })\n );\n }\n\n abstract storeDocuments(toStore: File[]): Observable<UploadedDocumentInfo>;\n\n abstract storeEntity(position: string, entity: T): Promise<T>;\n\n\n protected calculateSortHierarchy(sort?: XtSortBy, groupBy?: XtGroupBy ):XtSortBy|undefined {\n // We must first sort by the groupBy, and then by the sort\n let rootSort:XtSortBy|undefined;\n if (groupBy!=null) {\n rootSort=new XtStoreSortBy(groupBy.of, undefined, sort);\n } else {\n rootSort=sort;\n }\n return rootSort;\n }\n\n}\n","import { AbstractXtStoreProvider } from './xt-store-provider';\nimport { Observable, of, throwError } from 'rxjs';\nimport { UploadedDocumentInfo } from '../xt-document';\nimport { ManagedData } from 'xt-type/src';\n\nexport class XtMemoryStoreProvider<T extends ManagedData> extends AbstractXtStoreProvider<T> {\n protected storage=new Map<string, Map<string, T>>();\n\n override canStoreDocument(): boolean {\n return false;\n }\n\n getSafeStore (name:string):Map<string,T> {\n let ret = this.storage.get(name);\n if (ret==null) {\n ret = new Map<string, T>();\n this.storage.set(name, ret);\n }\n return ret;\n }\n\n deleteEntity(name: string, key: any): Promise<boolean> {\n const store = this.getSafeStore (name);\n return Promise.resolve(store.delete(key));\n }\n\n loadEntity(name: string, key: any): Promise<T | undefined> {\n const store = this.getSafeStore (name);\n return Promise.resolve(store.get(key));\n }\n\n override listEntities(name: string): Observable<T[]> {\n const store = this.getSafeStore (name);\n //console.debug(\"Listing entities for \"+name+\" with \",store);\n return of (Array.from(store.values()));\n }\n\n storeEntity(name: string, entity: T): Promise<T> {\n const store = this.getSafeStore (name);\n if (entity._id==null) {\n entity._id = Math\n .random().toString(36).substring(2, 8);\n }\n store.set(entity._id, entity);\n return Promise.resolve(entity);\n }\n\n override storeDocuments(toStore: File[]): Observable<UploadedDocumentInfo> {\n return throwError (() => {\n throw new Error (\"Not implemented.\");\n });\n }\n\n}\n","import {lastValueFrom, Observable, Subscription, throwError} from \"rxjs\";\nimport {HttpClient, HttpHeaders} from \"@angular/common/http\";\nimport {inject, Injectable, OnDestroy, Optional} from \"@angular/core\";\nimport {map, mergeAll} from \"rxjs/operators\";\nimport { AbstractXtStoreProvider } from '../store-provider/xt-store-provider';\nimport { XtStoreProviderHelper } from '../store-provider/xt-store-provider-helper';\nimport { XtStoreCriteria } from '../xt-store-parameters';\nimport { UploadedDocumentInfo } from '../xt-document';\n\n/**\n * A Store Provider that uses the DontCode API to store / read application data\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class XtApiStoreProvider<T=never> extends AbstractXtStoreProvider<T> implements OnDestroy {\n\n protected http: HttpClient = inject (HttpClient, {optional:true}) as any;\n\n apiUrl: string;\n docUrl: string;\n subscriptions = new Subscription();\n\n constructor(http?:HttpClient/* protected configService: CommonConfigService*/) {\n super();\n if (http!=null) {\n this.http=http;\n }\n\n if (this.http==null) {\n throw new Error (\"You must provide an HttpClient, either through constructor or injection.\");\n }\n this.apiUrl = 'https://test.dont-code.net/data';\n this.docUrl = 'https://test.dont-code.net/documents';\n\n /*this.updateConfig (this.configService.getConfig());\n this.subscriptions.add (this.configService.getUpdates ().pipe (map ((updatedConfig) => {\n this.updateConfig (updatedConfig);\n })).subscribe());*/\n\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n/* updateConfig(newConfig: Readonly<CommonLibConfig>) {\n if (newConfig.storeApiUrl!=null)\n this.apiUrl = newConfig.storeApiUrl;\n if (newConfig.documentApiUrl!=null)\n this.docUrl = newConfig.documentApiUrl;\n }*/\n\n storeEntity(name: string, data: T): Promise<T> {\n\n const id=(data as any)._id;\n // Reconverts dates or Ids\n const specialFields = XtStoreProviderHelper.findSpecialFields(name, { });\n XtStoreProviderHelper.cleanUpDataBeforeSaving([data], specialFields);\n\n if( id != undefined) {\n return lastValueFrom(this.http.put<T>(this.apiUrl+'/'+name+'/'+id, data, {observe:\"body\", responseType:\"json\"}));\n } else {\n return lastValueFrom(this.http.post<T>(this.apiUrl+'/'+name, data, {observe:\"body\", responseType:\"json\"}));\n }\n }\n\n loadEntity(name: string, key: any): Promise<T|undefined> {\n const obs = this.http.get<T>(this.apiUrl+'/'+name+'/'+key, {observe:\"body\", responseType:\"json\"});\n const specialFields = XtStoreProviderHelper.findSpecialFields(name, { });\n\n return lastValueFrom(obs).then((value) => {\n XtStoreProviderHelper.cleanUpLoadedData([value], specialFields);\n return value;\n });\n }\n\n deleteEntity(name: string, key: any): Promise<boolean> {\n return lastValueFrom(this.http.delete(this.apiUrl+'/'+name+'/'+key, {observe:\"body\", responseType:\"json\"})).then(value => {\n return true;\n });\n }\n\n override searchEntities(name: string, ...criteria: XtStoreCriteria[]): Observable<T[]> {\n\n const specialFields = XtStoreProviderHelper.findSpecialFields(name, { });\n return this.http.get(this.apiUrl+'/'+name, {observe:\"body\", responseType:\"json\"}).pipe(\n map(value => {\n XtStoreProviderHelper.cleanUpLoadedData(value as T [], specialFields);\n return value as T[];\n }),map(value => {\n return XtStoreProviderHelper.applyFilters( value, ...criteria);\n }\n )\n );\n }\n\n canStoreDocument(): boolean {\n return true;\n }\n\n storeDocuments(toStore: File[]): Observable<UploadedDocumentInfo> {\n const myFormData = new FormData();\n const headers = new HttpHeaders();\n headers.append('Content-Type', 'multipart/form-data');\n headers.append('Accept', 'application/json');\n let count=0;\n // store files details into formdata\n toStore.forEach( file => {\n myFormData.append('document#'+count, file);\n count++;\n });\n //HTTP Angular service, which will send call to Laravel API With headers and myformdata\n return this.http.post<UploadedDocumentInfo[]>(this.docUrl, myFormData, { headers: headers }).pipe(\n mergeAll ()\n );\n }\n\n}\n","import { XtStoreManager } from '../store-manager/xt-store-manager';\nimport { XtMemoryStoreProvider } from '../store-provider/xt-memory-store-provider';\nimport { ManagedData } from 'xt-type';\nimport { XtStoreProvider } from '../store-provider/xt-store-provider';\n\n\nexport class StoreTestBed {\n readonly storeManager = new XtStoreManager();\n\n public ensureMemoryProviderOnly () {\n XtStoreManager.setTestMode(new XtMemoryStoreProvider<ManagedData>());\n }\n\n public async defineTestDataFor (entityName:string, testData:ManagedData[]): Promise<void> {\n for (const testEntity of testData) {\n await this.storeManager.storeEntity(entityName, testEntity);\n }\n }\n\n public getStoreManager () {\n return this.storeManager;\n }\n\n public getStoreProviderFor (entityName:string):XtStoreProvider {\n return this.storeManager.getProviderSafe(entityName);\n }\n}\n","/*\n * Public API Surface of store\n */\n\nexport * from './store-manager/xt-store-manager';\nexport * from './store-provider/xt-store-provider';\nexport * from './store-provider/xt-store-provider-helper';\nexport * from './store-provider/xt-memory-store-provider';\n\nexport * from './api-provider/xt-api-store-provider';\n\nexport * from './xt-store-parameters';\nexport * from './xt-document';\nexport * from './xt-reporting';\n\nexport * from './test/store-test-bed';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map"],"mappings":"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"}
1
+ {"version":3,"file":"xt-store.mjs","sources":["../../../projects/store/src/store-manager/xt-store-manager.ts","../../../projects/store/src/xt-store-parameters.ts","../../../projects/store/src/store-provider/xt-store-provider-helper.ts","../../../projects/store/src/xt-reporting.ts","../../../projects/store/src/store-provider/xt-store-provider.ts","../../../projects/store/src/store-entity/store-entity-feature.ts","../../../projects/store/src/store-manager-service/store-manager.service.ts","../../../projects/store/src/api-provider/xt-api-store-provider.ts","../../../projects/store/src/store-provider/xt-memory-store-provider.ts","../../../projects/store/src/test/store-test-bed.ts","../../../projects/store/src/public-api.ts","../../../projects/store/src/xt-store.ts"],"sourcesContent":["import { XtStoreProvider } from '../store-provider/xt-store-provider';\nimport { Observable } from 'rxjs';\nimport { UploadedDocumentInfo } from '../xt-document';\nimport { XtStoreCriteria, XtGroupBy, XtSortBy } from '../xt-store-parameters';\nimport { DontCodeStorePreparedEntities } from '../store-provider/xt-store-provider-helper';\nimport { XtDataTransformer } from '../store-provider/xt-data-transformer';\nimport { ManagedData } from 'xt-type';\n\nexport class XtStoreManager {\n private _default?: XtStoreProvider<any>;\n private providerByPosition = new Map<string, XtStoreProvider<any>>();\n private providerByType = new Map<string, XtStoreProvider<any>>();\n\n protected static testProvider:XtStoreProvider<any>|null = null;\n\n constructor(\n provider?: XtStoreProvider<any>\n ) {\n this._default = provider;\n this.reset();\n }\n\n reset() {\n this.providerByPosition.clear();\n this.providerByType.clear();\n }\n\n getProvider<T extends ManagedData = ManagedData>(name?: string): XtStoreProvider<T> | undefined {\n // Override for testing\n if( XtStoreManager.testProvider!=null) return XtStoreManager.testProvider;\n\n if (name == null) {\n return this._default;\n } else {\n let ret = null;\n // Try to find if the entity is loaded from a defined source\n /*const srcDefinition = this.modelMgr.findTargetOfProperty(\n DontCodeModel.APP_ENTITIES_FROM_NODE,\n position\n )?.value as DontCodeSourceType;\n if (srcDefinition) {\n ret = this.providerByType.get(srcDefinition.type);\n }\n if (!ret) {*/\n ret = this.providerByPosition.get(name);\n //}\n return ret ?? this._default;\n }\n }\n\n getProviderSafe<T extends ManagedData = ManagedData>(name?: string): XtStoreProvider<T> {\n const ret = this.getProvider<T>(name);\n if (ret == null) {\n throw new Error('Trying to get an undefined or null provider');\n } else {\n return ret;\n }\n }\n\n getDefaultProvider<T extends ManagedData = ManagedData>(): XtStoreProvider<T> | undefined {\n return this.getProvider();\n }\n\n getDefaultProviderSafe<T extends ManagedData = ManagedData>(): XtStoreProvider<T> {\n return this.getProviderSafe();\n }\n\n setProvider<T extends ManagedData = ManagedData>(value: XtStoreProvider<T>, name?: string): void {\n if (name == null) this._default = value;\n else {\n this.providerByPosition.set(name, value);\n }\n }\n\n setProviderForSourceType<T extends ManagedData = ManagedData>(\n value: XtStoreProvider<T>,\n srcType: string\n ): void {\n this.providerByType.set(srcType, value);\n }\n\n setDefaultProvider<T extends ManagedData = ManagedData>(value: XtStoreProvider<T>): void {\n this.setProvider(value);\n }\n\n removeProvider(name?: string): void {\n if (name == null) this._default = undefined;\n else {\n this.providerByPosition.delete(name);\n }\n }\n\n removeProviderForSourceType(srcType: string): void {\n this.providerByType.delete(srcType);\n }\n\n removeDefaultProvider(): void {\n this.removeProvider();\n }\n\n storeEntity<T extends ManagedData = ManagedData>(name: string, entity: T): Promise<T> {\n return this.getProviderSafe<T>(name).storeEntity(name, entity);\n }\n\n loadEntity<T extends ManagedData = ManagedData>(name: string, key: any): Promise<T|undefined> {\n return this.getProviderSafe<T>(name).loadEntity(name, key);\n }\n\n safeLoadEntity<T extends ManagedData = ManagedData>(name: string, key: any): Promise<T> {\n return this.getProviderSafe<T>(name).safeLoadEntity(name, key);\n }\n\n deleteEntity(name: string, key: any): Promise<boolean> {\n return this.getProviderSafe(name).deleteEntity(name, key);\n }\n\n searchEntities<T extends ManagedData = ManagedData>(\n name: string,\n ...criteria: XtStoreCriteria[]\n ): Observable<Array<T>> {\n return this.getProviderSafe<T>(name).searchEntities(name, ...criteria);\n }\n\n searchAndPrepareEntities<T extends ManagedData = ManagedData>(\n name: string,\n sort?:XtSortBy,\n groupBy?:XtGroupBy,\n dataTransformer?:XtDataTransformer,\n ...criteria: XtStoreCriteria[]\n ): Observable<DontCodeStorePreparedEntities<T>> {\n return this.getProviderSafe<T>(name).searchAndPrepareEntities(name, sort, groupBy, dataTransformer, ...criteria);\n }\n\n\n canStoreDocument(name?: string): boolean {\n const res = this.getProvider(name)?.canStoreDocument();\n if (res) return res;\n else return false;\n }\n\n storeDocuments(\n toStore: File[],\n name?: string\n ): Observable<UploadedDocumentInfo> {\n return this.getProviderSafe(name).storeDocuments(toStore);\n }\n\n public static setTestMode (testProvider:XtStoreProvider<any>) {\n this.testProvider=testProvider;\n }\n\n}\n\n/**\n * The global store Mgr\n */\n\ndeclare global {\n var XT_STORE_MGR: XtStoreManager;\n var xtStoreManager: () => XtStoreManager;\n}\nexport function xtStoreManager (): XtStoreManager {\n return globalThis.XT_STORE_MGR;\n}\n\nglobalThis.XT_STORE_MGR = new XtStoreManager();\nglobalThis.xtStoreManager = xtStoreManager;\n","\nexport enum XtStoreCriteriaOperator {\n EQUALS = '=',\n LESS_THAN = '<',\n LESS_THAN_EQUAL = '<=',\n}\n\nexport class XtStoreCriteria {\n name: string;\n value: any;\n operator: XtStoreCriteriaOperator;\n\n constructor(\n name: string,\n value: any,\n operator?: XtStoreCriteriaOperator\n ) {\n this.name = name;\n this.value = value;\n if (!operator) this.operator = XtStoreCriteriaOperator.EQUALS;\n else {\n this.operator = operator;\n }\n }\n}\n\nexport type XtSortBy ={\n by:string,\n direction: XtSortByDirection\n}\n\nexport enum XtSortByDirection {\n None = \"None\",\n Ascending = \"Ascending\",\n Descending = \"Descending\"\n}\n\nexport enum XtGroupByShow {\n OnlyLowest=\"OnlyLowest\",\n OnlyHighest=\"OnlyHighest\"\n}\n\nexport enum XtGroupByOperation {\n Count= \"Count\",\n Sum=\"Sum\",\n Average=\"Average\",\n Minimum=\"Minimum\",\n Maximum=\"Maximum\"\n}\n\nexport type XtGroupBy= {\n of: string,\n display:{[key:string]:XtGroupByAggregate};\n show?:XtGroupByShow,\n label?:string\n\n atLeastOneGroupIsRequested (): boolean;\n getRequiredListOfFields(): Set<string>;\n}\n\nexport type XtGroupByAggregate = {\n operation: XtGroupByOperation;\n of:string,\n label?:string\n}\n\n\n","import { Counters, ManagedData, XtTypeHandler, xtTypeManager } from 'xt-type';\nimport {\n XtGroupBy,\n XtGroupByAggregate,\n XtGroupByOperation,\n XtSortBy,\n XtStoreCriteria,\n XtStoreCriteriaOperator\n} from '../xt-store-parameters';\n\n/**\n * Helps handle metadata information about loaded items\n */\nexport class XtStoreProviderHelper {\n\n protected static typeManager = xtTypeManager();\n /**\n * In case the provider source doesn't support search criteria, they can be applied here\n * @param list\n * @param criteria\n */\n public static applyFilters<T> (list:Array<T>, ...criteria: XtStoreCriteria[]): Array<T> {\n if ((criteria==null)||(criteria.length==0)) return list;\n return list.filter(element => {\n for (const criterium of criteria) {\n const toTest = element[criterium.name as keyof T];\n switch (criterium.operator) {\n case XtStoreCriteriaOperator.EQUALS:\n return criterium.value==toTest;\n case XtStoreCriteriaOperator.LESS_THAN:\n return toTest < criterium.value;\n case XtStoreCriteriaOperator.LESS_THAN_EQUAL:\n return toTest <= criterium.value;\n default:\n throw new Error (\"Operator \"+criterium.operator+\" unknown\");\n }\n }\n return true;\n });\n return list;\n }\n\n /** Returns any field who is a date, in order to convert it from json. Keep the result in a cache map\n *\n * @param typeName\n * @param typeResolver\n * @protected\n */\n public static findTypeHandler (typeName:string, subName?:string, value?:ManagedData): { typeName?:string | null, handler?:XtTypeHandler<any>} {\n return XtStoreProviderHelper.typeManager?.findTypeHandler(typeName, subName, value);\n }\n\n /**\n * Ensure _id is removed if necessary before saving the element\n * @param listToConvert\n * @param specialFields\n * @protected\n */\n public static cleanUpDataBeforeSaving (listToConvert:Array<ManagedData>, typeName:string, handler?:XtTypeHandler<any> | null) : void {\n if (handler==null) handler=XtStoreProviderHelper.findTypeHandler\n (typeName, undefined, (listToConvert.length>0)?listToConvert[0]:undefined)\n .handler;\n\n if (handler!=null) {\n for (const toConvert of listToConvert) {\n handler.toJson(toConvert)\n }\n }\n/* if ((specialFields?.idField!=null)&&(specialFields?.idField!='_id')) {\n listToConvert.forEach(value => {\n delete value._id;\n })\n }*/\n }\n\n /**\n * Converts dates and dateTimes properties of each element of the array to Typescript format\n * Ensure _id is set with the right id\n * @param listToConvert\n * @param specialFields\n * @protected\n */\n public static cleanUpLoadedData (listToConvert:Array<ManagedData>, typeName:string, handler?:XtTypeHandler<any> | null) : void {\n\n if (handler==null) handler=XtStoreProviderHelper.findTypeHandler(typeName, undefined, (listToConvert.length>0)?listToConvert[0]:undefined).handler;\n\n if (handler!=null) {\n for (const toConvert of listToConvert) {\n handler.fromJson(toConvert)\n }\n }\n /*\n if( specialFields.idField==null) {\n XtSpecialFieldsHelper.findSpecialFieldsFromData (listToConvert, specialFields);\n }\n listToConvert.forEach((val)=> {\n if ((specialFields.idField!=null)&&(specialFields.idField!=\"_id\")) // We need to copy the id to the standard _id field\n {\n val._id=val[specialFields.idField];\n }\n specialFields.dateFields?.forEach(prop => {\n const toConvert = val[prop];\n if (toConvert!=null) {\n let timeEpoch =Date.parse(toConvert);\n if( isNaN(timeEpoch)) {\n // Invalid date try to remove a possible TZ description in []\n const tzDescIndex = toConvert.lastIndexOf('[');\n if (tzDescIndex!=-1) {\n timeEpoch=Date.parse(toConvert.substring(0, tzDescIndex));\n }\n }\n if (isNaN(timeEpoch)) {\n delete val[prop];\n }\n else {\n val[prop]=new Date(timeEpoch);\n\n }\n }\n })\n })\n }*/\n }\n\n /**\n * Sort the array using the defined sort declarations across all properties.\n *\n * @param toSort\n * @param sortOptions\n */\n static multiSortArray<T>(toSort: T[], sortOptions?: XtSortBy): T[] {\n if( sortOptions==null)\n return toSort;\n return toSort;\n }\n\n /**\n * Calculates sum, avg, min or max values per group\n * @param values\n * @param groupBy\n * @param modelMgr\n * @param position\n * @param item\n */\n static calculateGroupedByValues<T>(name: string, values: T[], groupBy: XtGroupBy):DontCodeStoreGroupedByEntities|undefined {\n // We are counting per different value of the groupedBy Item\n if ((groupBy!=null) && (groupBy.display!=null)) {\n let fieldToGroupBy=groupBy.of as keyof T;\n if (groupBy.show!=null) fieldToGroupBy=groupBy.show.valueOf() as keyof T;\n\n const counters=new Map<any,Map<keyof T, Counters>> ();\n let lastGroupDelimiter:any;\n let oneGroupOfCounters=new Map<keyof T, Counters>();\n\n const fieldsRequired = groupBy.getRequiredListOfFields() as Set<keyof T>;\n for (const value of values) {\n if (value[fieldToGroupBy]!=lastGroupDelimiter) { // We change the group\n lastGroupDelimiter=value[fieldToGroupBy];\n const storedGroupOfCounters=counters.get(lastGroupDelimiter);\n if( storedGroupOfCounters==null) {\n oneGroupOfCounters = new Map<keyof T, Counters>();\n counters.set(lastGroupDelimiter, oneGroupOfCounters);\n }else {\n oneGroupOfCounters = storedGroupOfCounters;\n }\n }\n\n for (const field of fieldsRequired) {\n let counter=oneGroupOfCounters?.get(field);\n if( counter==null) {\n counter = new Counters();\n oneGroupOfCounters.set(field, counter);\n }\n\n const valSrc=value[field];\n const val=valSrc;\n if (valSrc!=null) {\n const modelMgr:any=null;\n // If it's an object, we need to set the calculated values as the object itself\n if ((typeof valSrc === 'object') && (!(valSrc instanceof Date)) && (modelMgr!=null)) {\n if( counter.sum==null) counter.sum=structuredClone(valSrc);\n else {\n counter.sum=modelMgr.modifyValues(counter.sum, valSrc, counter.metaData,\n (first: any, second: any) => {\n if ((first!=null) && (second!=null))\n return first + second;\n else if (first == null) {\n return second;\n } else if (second==null) {\n return first;\n }\n }/*,\n position, item*/);\n }\n const value=modelMgr.extractValue(valSrc, counter.metaData/*,position, item*/);\n if( counter.minimum==null) { counter.minimum=valSrc; counter.minAsValue=value}\n else {\n const minValue=counter.minAsValue;\n if ((value!=null) && ((minValue==null) || (value < minValue)) ) { counter.minimum = valSrc; counter.minAsValue=value }\n }\n\n if( counter.maximum==null) { counter.maximum=valSrc; counter.maxAsValue=value;}\n else {\n const maxValue=counter.maxAsValue;\n\n if ((value!=null) && ((maxValue==null) || (value > maxValue)))\n { counter.maximum = valSrc; counter.maxAsValue = value;}\n\n }\n\n if (value!=null) {\n counter.count++;\n }\n\n } else if (typeof val === 'number') {\n if( counter.sum==null) counter.sum=0;\n counter.sum=counter.sum+val;\n if( (counter.minimum==null) || (val < counter.minimum))\n { counter.minimum=valSrc; counter.minAsValue=valSrc as number;}\n if( (counter.maximum==null) || (val > counter.maximum))\n { counter.maximum=valSrc; counter.maxAsValue=valSrc as number;}\n counter.count++;\n } else if ((val instanceof Date) && (!isNaN(val.getTime()))) {\n counter.sum=null;\n if ((counter.minimum==null) || (val.valueOf() < counter.minimum.valueOf())) {\n counter.minimum=valSrc;\n }\n if ((counter.maximum==null) || (val.valueOf() > counter.maximum.valueOf())) {\n counter.maximum=valSrc;\n }\n counter.count++;\n } else { // strings\n counter.count++;\n }\n }\n }\n }\n\n // Now that we have all the counters, let's generate the GroupedFields\n let ret: DontCodeStoreGroupedByEntities|undefined;\n if (counters.size>0) {\n ret = new DontCodeStoreGroupedByEntities(groupBy, new Map<any,DontCodeStoreGroupedByValues[]>);\n for (const groupKey of counters.keys()) {\n const group=counters.get(groupKey)!;\n\n for (const aggregate of Object.values(groupBy.display)) {\n let value;\n const counter = group.get(aggregate.of as keyof T);\n if (counter != null) {\n switch (aggregate.operation) {\n case XtGroupByOperation.Count:\n value = counter.count;\n break;\n case XtGroupByOperation.Sum:\n value = counter.sum;\n break;\n case XtGroupByOperation.Average: {\n const modelMgr:any=null;\n if ((counter.sum==null) || (counter.count==0)) value=null;\n else if ((typeof counter.sum === 'object') && (!(counter.sum instanceof Date)) && (modelMgr!=null)) {\n value = modelMgr.applyValue(structuredClone(counter.sum),\n modelMgr.extractValue(counter.sum, counter.metaData/*, position, item*/)/counter.count,\n counter.metaData, undefined/*, position, item*/);\n } else value = counter.sum / counter.count;\n }\n break;\n case XtGroupByOperation.Minimum:\n value = counter.minimum;\n break;\n case XtGroupByOperation.Maximum:\n value = counter.maximum;\n break;\n }\n let listOfValues= ret.values?.get(groupKey);\n if (listOfValues==null) {\n listOfValues = new Array<DontCodeStoreGroupedByValues>();\n ret.values?.set(groupKey, listOfValues);\n }\n listOfValues.push(new DontCodeStoreGroupedByValues(aggregate, value));\n }\n }\n }\n return ret.values!.size>0?ret:undefined;\n }\n }\n return undefined;\n }\n}\n\n\nexport class DontCodeStorePreparedEntities<T> {\n constructor(public sortedData:T[], public sortInfo?:XtSortBy, public groupedByEntities?:DontCodeStoreGroupedByEntities) {\n }\n}\n\nexport class DontCodeStoreGroupedByEntities {\n constructor(public groupInfo:XtGroupBy, public values?:Map<any,DontCodeStoreGroupedByValues[]>) {\n if (values==null)\n this.values=new Map<any,DontCodeStoreGroupedByValues[]>();\n }\n}\n\nexport class DontCodeStoreGroupedByValues {\n constructor(public forAggregate:XtGroupByAggregate, public value:any) {\n }\n}\n\n","import {\n XtGroupBy,\n XtGroupByAggregate, XtGroupByOperation,\n XtGroupByShow,\n XtSortBy,\n XtSortByDirection\n} from './xt-store-parameters';\n\nexport interface DontCodeReportType {\n title: string;\n for: string;\n groupedBy?: {[key:string]:XtGroupBy};\n sortedBy?: {[key:string]:XtSortBy};\n as?: {[key:string]:DontCodeReportDisplayType};\n}\n\nexport interface DontCodeReportDisplayType {\n type: string;\n of: string;\n by?:string;\n title: string;\n}\n\nexport class XtStoreSortBy implements XtSortBy {\n\n direction: XtSortByDirection;\n\n constructor(public by: string, direction?:XtSortByDirection, public subSort?:XtSortBy) {\n if (direction==null) this.direction=XtSortByDirection.None;\n else this.direction=direction;\n }\n}\n\nexport class XtStoreGroupBy implements XtGroupBy {\n display:{[key:string]:XtStoreGroupByAggregate};\n\n constructor(public of:string, display?:{[key:string]:XtStoreGroupByAggregate}, public show?:XtGroupByShow) {\n if (display==null) this.display={};\n else this.display=display;\n }\n\n public atLeastOneGroupIsRequested (): boolean {\n if( (this.display!=null) && (Object.keys(this.display).length>0))\n return true;\n return false;\n }\n\n getRequiredListOfFields(): Set<string> {\n const ret = new Set<string>();\n if( this.display!=null) {\n for (const aggregate of Object.values(this.display)) {\n ret.add(aggregate.of);\n }\n }\n return ret;\n }\n}\n\nexport class XtStoreGroupByAggregate implements XtGroupByAggregate{\n constructor(public of:string, public operation:XtGroupByOperation) {\n }\n}\n\n","import { XtDataTransformer } from './xt-data-transformer';\nimport { firstValueFrom, map, Observable } from 'rxjs';\nimport { XtGroupBy, XtSortBy, XtStoreCriteria } from '../xt-store-parameters';\nimport {\n DontCodeStoreGroupedByEntities,\n DontCodeStorePreparedEntities,\n XtStoreProviderHelper\n} from './xt-store-provider-helper';\nimport { UploadedDocumentInfo } from '../xt-document';\nimport { XtStoreSortBy } from '../xt-reporting';\nimport { ManagedData } from 'xt-type';\nimport { Injectable } from '@angular/core';\n\n/**\n * The standard interface for any store provider\n */\nexport type XtStoreProvider<T extends ManagedData = ManagedData>= {\n storeEntity( name:string, entity: T): Promise<T>;\n\n /**\n * Rejects the promise if the entity is not found\n * @param name\n * @param key\n */\n safeLoadEntity( name: string, key: any): Promise<T>;\n loadEntity( name: string, key: any): Promise<T|undefined>;\n\n deleteEntity(name:string, key: any): Promise<boolean>;\n\n searchEntities(\n name: string,\n ...criteria: XtStoreCriteria[]\n ): Observable<Array<T>>;\n\n searchAndPrepareEntities(\n name: string,\n sort?:XtSortBy,\n groupBy?:XtGroupBy,\n transformer?: XtDataTransformer<T>,\n ...criteria: XtStoreCriteria[]\n ): Observable<DontCodeStorePreparedEntities<T>>;\n\n canStoreDocument(): boolean;\n\n /**\n * Upload one document to a server store and returns the url or the id needed to retrieve them.\n * @param toStore\n * @param position\n */\n storeDocument(\n toStore: File\n ): Promise<UploadedDocumentInfo>;\n\n /**\n * Upload documents to a server store and returns the url or the id needed to retrieve them.\n * @param toStore\n * @param position\n */\n storeDocuments(\n toStore: File[]\n ): Observable<UploadedDocumentInfo>;\n}\n\nexport abstract class AbstractXtStoreProvider<T extends ManagedData = ManagedData> implements XtStoreProvider<T> {\n abstract canStoreDocument(): boolean;\n\n abstract deleteEntity(name:string, key: any): Promise<boolean>;\n\n abstract loadEntity(name:string, key: any): Promise<T|undefined>;\n\n constructor () {\n }\n\n safeLoadEntity(name: string, key: any): Promise<T> {\n return this.loadEntity(name, key).then(value => {\n if (value==null)\n return Promise.reject(\"Not found\");\n else return value;\n })\n }\n\n /**\n * If the store supports queries with criteria, this function must be implemented, if not, listEntities must be implemented, and this function will apply filters\n * @param position\n * @param criteria\n */\n searchEntities(name: string, ...criteria: XtStoreCriteria[]): Observable<T[]> {\n return this.listEntities(name).pipe(\n map (value => {\n return XtStoreProviderHelper.applyFilters(value, ...criteria) as T[];\n })\n );\n }\n\n /**\n * Returns the list of entities at a given position in the model. Implements at least this function or searchEntities depending on the capability of the store\n * @param position\n * @protected\n */\n protected listEntities (name:string): Observable<T[]> {\n return this.searchEntities(name);\n }\n\n searchAndPrepareEntities(name: string, sort?: XtSortBy, groupBy?: XtGroupBy, transformer?: XtDataTransformer<T>, ...criteria: XtStoreCriteria[]): Observable<DontCodeStorePreparedEntities<T>> {\n return this.searchEntities(name, ...criteria).pipe(\n map (value => {\n // Run the transformation if any\n if (transformer!=null) return transformer.postLoadingTransformation(value);\n else return value;\n }),\n map (value => {\n let groupedByValues:DontCodeStoreGroupedByEntities|undefined;\n if((sort!=null) || (groupBy?.atLeastOneGroupIsRequested()===true)) {\n value = XtStoreProviderHelper.multiSortArray(value, this.calculateSortHierarchy(sort, groupBy)) as T[];\n if (groupBy!=null) {\n groupedByValues = XtStoreProviderHelper.calculateGroupedByValues(name, value, groupBy);\n }\n }\n return new DontCodeStorePreparedEntities<T> (value, sort, groupedByValues);\n })\n );\n }\n\n storeDocument(toStore: File):Promise<UploadedDocumentInfo> {\n return firstValueFrom(this.storeDocuments([toStore]));\n }\n\n abstract storeDocuments(toStore: File[]): Observable<UploadedDocumentInfo>;\n\n abstract storeEntity(position: string, entity: T): Promise<T>;\n\n\n protected calculateSortHierarchy(sort?: XtSortBy, groupBy?: XtGroupBy ):XtSortBy|undefined {\n // We must first sort by the groupBy, and then by the sort\n let rootSort:XtSortBy|undefined;\n if (groupBy!=null) {\n rootSort=new XtStoreSortBy(groupBy.of, undefined, sort);\n } else {\n rootSort=sort;\n }\n return rootSort;\n }\n\n}\n","import {\n entityConfig,\n EntityId,\n EntityMap,\n removeEntity,\n SelectEntityId,\n setEntities,\n setEntity,\n withEntities\n} from '@ngrx/signals/entities';\nimport { patchState, signalStoreFeature, type, withMethods, withProps, withState } from '@ngrx/signals';\nimport { XtStoreProvider } from '../store-provider/xt-store-provider';\nimport { finalize, lastValueFrom, map } from 'rxjs';\nimport { Signal } from '@angular/core';\nimport { ManagedData } from 'xt-type';\n\nconst selectId: SelectEntityId<ManagedData> = (data) => {\n if (data._id==null) throw new Error(\"ManagedData with no entity Id used in the store.\", { cause: data });\n return data._id;\n}\n\nconst xtStoreEntityConfig = entityConfig ({\n entity: type<ManagedData>(),\n selectId:selectId\n});\n\n\nexport type StoreState = {\n entityName: string,\n loading:boolean\n};\n\nexport type XtSignalStore<T> = {\n entityName: Signal<string>;\n loading: Signal<boolean>;\n entityMap: Signal<EntityMap<T>>;\n ids: Signal<EntityId[]>;\n entities: Signal<T[]>;\n\n //listEntities ():Observable<T[]>;\n fetchEntities (): Promise<void>;\n loadEntity (id:string): Promise<T|undefined>;\n safeLoadEntity (id:string): Promise<T>;\n storeEntity (toStore:T):Promise<T>;\n deleteEntity (id:string): Promise<boolean>;\n}\n\nexport function withXtStoreProvider (entityName:string, storeProvider:XtStoreProvider<ManagedData>) {\n return signalStoreFeature(\n withState ({ entityName, loading:false} as StoreState),\n withEntities(xtStoreEntityConfig),\n withProps ( () => ({\n _storeProvider:storeProvider\n })),\n withMethods ((store) => ({\n async storeEntity (toStore:ManagedData): Promise<ManagedData> {\n patchState(store, {loading:true});\n return store._storeProvider.storeEntity(entityName, toStore).then ( (stored)=> {\n patchState(store, setEntity(stored, xtStoreEntityConfig));\n return stored;\n }).finally(() => {\n patchState(store, {loading:false});\n });\n },\n\n fetchEntities (): Promise<void> {\n patchState(store, {loading:true});\n return lastValueFrom(store._storeProvider.searchEntities(entityName).pipe (map( (entities: ManagedData[]) => {\n patchState(store, setEntities (entities, xtStoreEntityConfig));\n }),finalize(() => {\n patchState(store, {loading:false});\n })));\n },\n\n /* listEntities (): Observable<ManagedData[]> {\n patchState(store, {loading:true});\n return store._storeProvider.searchEntities(entityName).pipe (map( (entities: ManagedData[]) => {\n patchState(store, setEntities (entities, xtStoreEntityConfig));\n return entities;\n }),finalize(() => {\n patchState(store, {loading:false});\n }));\n },*/\n\n async loadEntity (id:string): Promise<ManagedData|undefined> {\n patchState(store, {loading:true});\n return store._storeProvider.loadEntity(entityName, id).then ( (loaded)=> {\n if( loaded != null)\n patchState(store, setEntity(loaded, xtStoreEntityConfig));\n return loaded;\n }).finally(() => {\n patchState(store, {loading:false});\n });\n },\n async safeLoadEntity (id:string): Promise<ManagedData> {\n patchState(store, {loading:true});\n return store._storeProvider.loadEntity(entityName, id).then ( (loaded)=> {\n if( loaded != null)\n patchState(store, setEntity(loaded, xtStoreEntityConfig));\n return loaded;\n }).then((loaded)=> {\n if (loaded==null) throw new Error (\"Entity \"+entityName+\" with id \"+id+\" not found\");\n return loaded;\n }).finally(() => {\n patchState(store, {loading:false});\n });\n },\n async deleteEntity (id:string): Promise<boolean> {\n patchState(store, {loading:true});\n return store._storeProvider.deleteEntity(entityName, id).then((result)=> {\n if( result ) {\n patchState(store, removeEntity(id));\n }\n return result;\n }).finally(() => {\n patchState(store, {loading:false});\n });\n }\n }))\n\n);\n}\n","import { Injectable } from '@angular/core';\nimport { signalStore } from '@ngrx/signals';\nimport { ManagedData } from 'xt-type';\nimport { xtStoreManager } from '../store-manager/xt-store-manager';\nimport { withXtStoreProvider, XtSignalStore } from '../store-entity/store-entity-feature';\nimport { XtStoreProvider } from '../store-provider/xt-store-provider';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class StoreManagerService {\n\n protected storeManager = xtStoreManager();\n protected entityToStoreMap = new Map<string, XtSignalStore<ManagedData>>();\n\n constructor() {\n }\n\n getStoreFor(entityName: string): XtSignalStore<ManagedData> {\n let store = this.entityToStoreMap.get(entityName);\n if (store == null) {\n const provider = this.storeManager.getProvider<ManagedData>(entityName);\n if (provider == null) {\n throw new Error('No provider found for entity ' + entityName);\n } else {\n const res = signalStore(\n withXtStoreProvider(entityName, provider)\n );\n store= new res();\n }\n this.entityToStoreMap.set(entityName, store);\n }\n return store;\n }\n\nsetDefaultStoreProvider (provider: XtStoreProvider<ManagedData>) {\n this.storeManager.setDefaultProvider(provider);\n }\n}\n","import { lastValueFrom, Observable, Subscription } from 'rxjs';\nimport { inject, Injectable, OnDestroy } from '@angular/core';\nimport { map, mergeAll } from 'rxjs/operators';\nimport { AbstractXtStoreProvider } from '../store-provider/xt-store-provider';\nimport { XtStoreProviderHelper } from '../store-provider/xt-store-provider-helper';\nimport { XtStoreCriteria } from '../xt-store-parameters';\nimport { UploadedDocumentInfo } from '../xt-document';\nimport { ManagedData, nonTemporaryId } from 'xt-type';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\n\n/**\n * A Store Provider that uses the DontCode API to store / read application data\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class XtApiStoreProvider<T extends ManagedData = ManagedData> extends AbstractXtStoreProvider<T> implements OnDestroy {\n\n protected http: HttpClient = inject (HttpClient, {optional:true}) as any;\n\n apiUrl: string;\n docUrl: string;\n subscriptions = new Subscription();\n\n constructor(http?:HttpClient/* protected configService: CommonConfigService*/) {\n super();\n if (http!=null) {\n this.http=http;\n }\n\n if (this.http==null) {\n throw new Error (\"You must provide an HttpClient, either through constructor or injection.\");\n }\n this.apiUrl = 'https://test.dont-code.net/data';\n this.docUrl = 'https://test.dont-code.net/documents';\n\n /*this.updateConfig (this.configService.getConfig());\n this.subscriptions.add (this.configService.getUpdates ().pipe (map ((updatedConfig) => {\n this.updateConfig (updatedConfig);\n })).subscribe());*/\n\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n/* updateConfig(newConfig: Readonly<CommonLibConfig>) {\n if (newConfig.storeApiUrl!=null)\n this.apiUrl = newConfig.storeApiUrl;\n if (newConfig.documentApiUrl!=null)\n this.docUrl = newConfig.documentApiUrl;\n }*/\n\n storeEntity(name: string, data: T): Promise<T> {\n\n const id=nonTemporaryId(data);\n // Reconverts dates or Ids\n XtStoreProviderHelper.cleanUpDataBeforeSaving([data],name);\n\n if( id != undefined) {\n return lastValueFrom(this.http.put<T>(this.apiUrl+'/'+name+'/'+id, data, {observe:\"body\", responseType:\"json\"}));\n } else {\n return lastValueFrom(this.http.post<T>(this.apiUrl+'/'+name, data, {observe:\"body\", responseType:\"json\"}));\n }\n }\n\n loadEntity(name: string, key: any): Promise<T|undefined> {\n const obs = this.http.get<T>(this.apiUrl+'/'+name+'/'+key, {observe:\"body\", responseType:\"json\"});\n\n return lastValueFrom(obs).then((value) => {\n XtStoreProviderHelper.cleanUpLoadedData([value], name);\n return value;\n });\n }\n\n deleteEntity(name: string, key: any): Promise<boolean> {\n return lastValueFrom(this.http.delete(this.apiUrl+'/'+name+'/'+key, {observe:\"body\", responseType:\"json\"})).then(value => {\n return true;\n });\n }\n\n override searchEntities(name: string, ...criteria: XtStoreCriteria[]): Observable<T[]> {\n\n return this.http.get(this.apiUrl+'/'+name, {observe:\"body\", responseType:\"json\"}).pipe(\n map(value => {\n XtStoreProviderHelper.cleanUpLoadedData(value as T [], name);\n return value as T[];\n }),map(value => {\n return XtStoreProviderHelper.applyFilters( value, ...criteria);\n }\n )\n );\n }\n\n canStoreDocument(): boolean {\n return true;\n }\n\n storeDocuments(toStore: File[]): Observable<UploadedDocumentInfo> {\n const myFormData = new FormData();\n const headers = new HttpHeaders();\n headers.append('Content-Type', 'multipart/form-data');\n headers.append('Accept', 'application/json');\n let count=0;\n // store files details into formdata\n toStore.forEach( file => {\n myFormData.append('document#'+count, file);\n count++;\n });\n //HTTP Angular service, which will send call to Laravel API With headers and myformdata\n return this.http.post<UploadedDocumentInfo[]>(this.docUrl, myFormData, { headers: headers }).pipe(\n mergeAll ()\n );\n }\n\n}\n","import { AbstractXtStoreProvider } from './xt-store-provider';\nimport { from, Observable, of, Subject, throwError } from 'rxjs';\nimport { UploadedDocumentInfo } from '../xt-document';\nimport { ManagedData } from 'xt-type';\n\nexport class XtMemoryStoreProvider<T extends ManagedData> extends AbstractXtStoreProvider<T> {\n protected storage=new Map<string, Map<string, T>>();\n\n /**\n * It supports storing documents in memory only, then use with care !\n */\n override canStoreDocument(): boolean {\n return true;\n }\n\n getSafeStore (name:string):Map<string,T> {\n let ret = this.storage.get(name);\n if (ret==null) {\n ret = new Map<string, T>();\n this.storage.set(name, ret);\n }\n return ret;\n }\n\n deleteEntity(name: string, key: any): Promise<boolean> {\n const store = this.getSafeStore (name);\n return Promise.resolve(store.delete(key));\n }\n\n loadEntity(name: string, key: any): Promise<T | undefined> {\n const store = this.getSafeStore (name);\n return Promise.resolve(store.get(key));\n }\n\n override listEntities(name: string): Observable<T[]> {\n const store = this.getSafeStore (name);\n //console.debug(\"Listing entities for \"+name+\" with \",store);\n return of (Array.from(store.values()));\n }\n\n storeEntity(name: string, entity: T): Promise<T> {\n const store = this.getSafeStore (name);\n if (entity._id==null) {\n entity._id = Math\n .random().toString(36).substring(2, 8);\n }\n store.set(entity._id, entity);\n return Promise.resolve(entity);\n }\n\n override storeDocuments(toStore: File[]): Observable<UploadedDocumentInfo> {\n const toSend = new Array<UploadedDocumentInfo>();\n for (const file of toStore) {\n const ret: UploadedDocumentInfo = { documentName: URL.createObjectURL(file), isUrl: true };\n toSend.push(ret);\n }\n return from(toSend)\n }\n\n}\n","import { XtStoreManager } from '../store-manager/xt-store-manager';\nimport { XtMemoryStoreProvider } from '../store-provider/xt-memory-store-provider';\nimport { ManagedData } from 'xt-type';\nimport { XtStoreProvider } from '../store-provider/xt-store-provider';\n\n\nexport class StoreTestBed {\n readonly storeManager = new XtStoreManager();\n\n public ensureMemoryProviderOnly () {\n XtStoreManager.setTestMode(new XtMemoryStoreProvider<ManagedData>());\n }\n\n public async defineTestDataFor (entityName:string, testData:ManagedData[]): Promise<void> {\n for (const testEntity of testData) {\n await this.storeManager.storeEntity(entityName, testEntity);\n }\n }\n\n public getStoreManager () {\n return this.storeManager;\n }\n\n public getStoreProviderFor (entityName:string):XtStoreProvider {\n return this.storeManager.getProviderSafe(entityName);\n }\n}\n","/*\n * Public API Surface of store\n */\n\nexport * from './store-manager/xt-store-manager';\nexport * from './store-provider/xt-store-provider';\nexport * from './store-provider/xt-store-provider-helper';\nexport * from './store-manager-service/store-manager.service';\n\nexport * from './store-entity/store-entity-feature';\n\nexport * from './api-provider/xt-api-store-provider';\nexport * from './store-provider/xt-memory-store-provider';\n\nexport * from './xt-store-parameters';\nexport * from './xt-document';\nexport * from './xt-reporting';\n\nexport * from './test/store-test-bed';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xt-store",
3
- "version": "0.4.1",
3
+ "version": "0.4.4",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.1.0",
6
6
  "@angular/core": "^19.1.0"
package/public-api.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  export * from './store-manager/xt-store-manager';
2
2
  export * from './store-provider/xt-store-provider';
3
3
  export * from './store-provider/xt-store-provider-helper';
4
- export * from './store-provider/xt-memory-store-provider';
4
+ export * from './store-manager-service/store-manager.service';
5
+ export * from './store-entity/store-entity-feature';
5
6
  export * from './api-provider/xt-api-store-provider';
7
+ export * from './store-provider/xt-memory-store-provider';
6
8
  export * from './xt-store-parameters';
7
9
  export * from './xt-document';
8
10
  export * from './xt-reporting';
@@ -0,0 +1,39 @@
1
+ import { EntityId, EntityMap } from '@ngrx/signals/entities';
2
+ import { XtStoreProvider } from '../store-provider/xt-store-provider';
3
+ import { Signal } from '@angular/core';
4
+ import { ManagedData } from 'xt-type';
5
+ export type StoreState = {
6
+ entityName: string;
7
+ loading: boolean;
8
+ };
9
+ export type XtSignalStore<T> = {
10
+ entityName: Signal<string>;
11
+ loading: Signal<boolean>;
12
+ entityMap: Signal<EntityMap<T>>;
13
+ ids: Signal<EntityId[]>;
14
+ entities: Signal<T[]>;
15
+ fetchEntities(): Promise<void>;
16
+ loadEntity(id: string): Promise<T | undefined>;
17
+ safeLoadEntity(id: string): Promise<T>;
18
+ storeEntity(toStore: T): Promise<T>;
19
+ deleteEntity(id: string): Promise<boolean>;
20
+ };
21
+ export declare function withXtStoreProvider(entityName: string, storeProvider: XtStoreProvider<ManagedData>): import("@ngrx/signals").SignalStoreFeature<import("@ngrx/signals").EmptyFeatureResult, {
22
+ state: {
23
+ entityName: string;
24
+ loading: boolean;
25
+ entityMap: EntityMap<ManagedData>;
26
+ ids: EntityId[];
27
+ };
28
+ props: {
29
+ entities: Signal<ManagedData[]>;
30
+ _storeProvider: XtStoreProvider<ManagedData>;
31
+ };
32
+ methods: {
33
+ storeEntity: (toStore: ManagedData) => Promise<ManagedData>;
34
+ fetchEntities: () => Promise<void>;
35
+ loadEntity: (id: string) => Promise<ManagedData | undefined>;
36
+ safeLoadEntity: (id: string) => Promise<ManagedData>;
37
+ deleteEntity: (id: string) => Promise<boolean>;
38
+ };
39
+ }>;
@@ -4,6 +4,7 @@ import { UploadedDocumentInfo } from '../xt-document';
4
4
  import { XtStoreCriteria, XtGroupBy, XtSortBy } from '../xt-store-parameters';
5
5
  import { DontCodeStorePreparedEntities } from '../store-provider/xt-store-provider-helper';
6
6
  import { XtDataTransformer } from '../store-provider/xt-data-transformer';
7
+ import { ManagedData } from 'xt-type';
7
8
  export declare class XtStoreManager {
8
9
  private _default?;
9
10
  private providerByPosition;
@@ -11,23 +12,31 @@ export declare class XtStoreManager {
11
12
  protected static testProvider: XtStoreProvider<any> | null;
12
13
  constructor(provider?: XtStoreProvider<any>);
13
14
  reset(): void;
14
- getProvider<T = never>(name?: string): XtStoreProvider<T> | undefined;
15
- getProviderSafe<T = never>(name?: string): XtStoreProvider<T>;
16
- getDefaultProvider<T = never>(): XtStoreProvider<T> | undefined;
17
- getDefaultProviderSafe<T = never>(): XtStoreProvider<T>;
18
- setProvider<T = never>(value: XtStoreProvider<T>, name?: string): void;
19
- setProviderForSourceType<T = never>(value: XtStoreProvider<T>, srcType: string): void;
20
- setDefaultProvider<T = never>(value: XtStoreProvider<T>): void;
15
+ getProvider<T extends ManagedData = ManagedData>(name?: string): XtStoreProvider<T> | undefined;
16
+ getProviderSafe<T extends ManagedData = ManagedData>(name?: string): XtStoreProvider<T>;
17
+ getDefaultProvider<T extends ManagedData = ManagedData>(): XtStoreProvider<T> | undefined;
18
+ getDefaultProviderSafe<T extends ManagedData = ManagedData>(): XtStoreProvider<T>;
19
+ setProvider<T extends ManagedData = ManagedData>(value: XtStoreProvider<T>, name?: string): void;
20
+ setProviderForSourceType<T extends ManagedData = ManagedData>(value: XtStoreProvider<T>, srcType: string): void;
21
+ setDefaultProvider<T extends ManagedData = ManagedData>(value: XtStoreProvider<T>): void;
21
22
  removeProvider(name?: string): void;
22
23
  removeProviderForSourceType(srcType: string): void;
23
24
  removeDefaultProvider(): void;
24
- storeEntity<T = never>(name: string, entity: T): Promise<T>;
25
- loadEntity<T = never>(name: string, key: any): Promise<T | undefined>;
26
- safeLoadEntity<T = never>(name: string, key: any): Promise<T>;
25
+ storeEntity<T extends ManagedData = ManagedData>(name: string, entity: T): Promise<T>;
26
+ loadEntity<T extends ManagedData = ManagedData>(name: string, key: any): Promise<T | undefined>;
27
+ safeLoadEntity<T extends ManagedData = ManagedData>(name: string, key: any): Promise<T>;
27
28
  deleteEntity(name: string, key: any): Promise<boolean>;
28
- searchEntities<T = never>(name: string, ...criteria: XtStoreCriteria[]): Observable<Array<T>>;
29
- searchAndPrepareEntities<T = never>(name: string, sort?: XtSortBy, groupBy?: XtGroupBy, dataTransformer?: XtDataTransformer, ...criteria: XtStoreCriteria[]): Observable<DontCodeStorePreparedEntities<T>>;
29
+ searchEntities<T extends ManagedData = ManagedData>(name: string, ...criteria: XtStoreCriteria[]): Observable<Array<T>>;
30
+ searchAndPrepareEntities<T extends ManagedData = ManagedData>(name: string, sort?: XtSortBy, groupBy?: XtGroupBy, dataTransformer?: XtDataTransformer, ...criteria: XtStoreCriteria[]): Observable<DontCodeStorePreparedEntities<T>>;
30
31
  canStoreDocument(name?: string): boolean;
31
32
  storeDocuments(toStore: File[], name?: string): Observable<UploadedDocumentInfo>;
32
33
  static setTestMode(testProvider: XtStoreProvider<any>): void;
33
34
  }
35
+ /**
36
+ * The global store Mgr
37
+ */
38
+ declare global {
39
+ var XT_STORE_MGR: XtStoreManager;
40
+ var xtStoreManager: () => XtStoreManager;
41
+ }
42
+ export declare function xtStoreManager(): XtStoreManager;
@@ -0,0 +1,13 @@
1
+ import { ManagedData } from 'xt-type';
2
+ import { XtSignalStore } from '../store-entity/store-entity-feature';
3
+ import { XtStoreProvider } from '../store-provider/xt-store-provider';
4
+ import * as i0 from "@angular/core";
5
+ export declare class StoreManagerService {
6
+ protected storeManager: import("xt-store").XtStoreManager;
7
+ protected entityToStoreMap: Map<string, XtSignalStore<ManagedData>>;
8
+ constructor();
9
+ getStoreFor(entityName: string): XtSignalStore<ManagedData>;
10
+ setDefaultStoreProvider(provider: XtStoreProvider<ManagedData>): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<StoreManagerService, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<StoreManagerService>;
13
+ }
@@ -1,9 +1,12 @@
1
1
  import { AbstractXtStoreProvider } from './xt-store-provider';
2
2
  import { Observable } from 'rxjs';
3
3
  import { UploadedDocumentInfo } from '../xt-document';
4
- import { ManagedData } from 'xt-type/src';
4
+ import { ManagedData } from 'xt-type';
5
5
  export declare class XtMemoryStoreProvider<T extends ManagedData> extends AbstractXtStoreProvider<T> {
6
6
  protected storage: Map<string, Map<string, T>>;
7
+ /**
8
+ * It supports storing documents in memory only, then use with care !
9
+ */
7
10
  canStoreDocument(): boolean;
8
11
  getSafeStore(name: string): Map<string, T>;
9
12
  deleteEntity(name: string, key: any): Promise<boolean>;
@@ -1,14 +1,10 @@
1
- import { SpecialFields } from 'xt-type';
2
- import { XtGroupByAggregate, XtStoreCriteria, XtGroupBy, XtSortBy } from '../xt-store-parameters';
1
+ import { ManagedData, XtTypeHandler } from 'xt-type';
2
+ import { XtGroupBy, XtGroupByAggregate, XtSortBy, XtStoreCriteria } from '../xt-store-parameters';
3
3
  /**
4
4
  * Helps handle metadata information about loaded items
5
5
  */
6
6
  export declare class XtStoreProviderHelper {
7
- static specialFieldsCache: Map<string, SpecialFields>;
8
- /**
9
- * In case some entity definition has changed, clear the cache
10
- */
11
- static clearConfigCache(): void;
7
+ protected static typeManager: import("xt-type").XtUpdatableTypeResolver;
12
8
  /**
13
9
  * In case the provider source doesn't support search criteria, they can be applied here
14
10
  * @param list
@@ -17,27 +13,21 @@ export declare class XtStoreProviderHelper {
17
13
  static applyFilters<T>(list: Array<T>, ...criteria: XtStoreCriteria[]): Array<T>;
18
14
  /** Returns any field who is a date, in order to convert it from json. Keep the result in a cache map
19
15
  *
20
- * @param name
21
- * @param entity
16
+ * @param typeName
17
+ * @param typeResolver
22
18
  * @protected
23
19
  */
24
- static findSpecialFields(name: string, entity: any): SpecialFields;
25
- protected static findSpecialFieldsFromData(data: Array<any>, existingFields: SpecialFields): void;
26
- protected static scoreIdFieldFromEntityField(prop: any, score: {
27
- score: number;
28
- field: any;
29
- }): boolean;
30
- protected static scoreIdFieldFromProperty(name: string, score: {
31
- score: number;
32
- field: any;
33
- }): boolean;
20
+ static findTypeHandler(typeName: string, subName?: string, value?: ManagedData): {
21
+ typeName?: string | null;
22
+ handler?: XtTypeHandler<any>;
23
+ };
34
24
  /**
35
- * Ensure _id is removed if necessary before saving the element
36
- * @param listToConvert
37
- * @param specialFields
38
- * @protected
39
- */
40
- static cleanUpDataBeforeSaving(listToConvert: Array<any>, specialFields: SpecialFields): void;
25
+ * Ensure _id is removed if necessary before saving the element
26
+ * @param listToConvert
27
+ * @param specialFields
28
+ * @protected
29
+ */
30
+ static cleanUpDataBeforeSaving(listToConvert: Array<ManagedData>, typeName: string, handler?: XtTypeHandler<any> | null): void;
41
31
  /**
42
32
  * Converts dates and dateTimes properties of each element of the array to Typescript format
43
33
  * Ensure _id is set with the right id
@@ -45,7 +35,7 @@ export declare class XtStoreProviderHelper {
45
35
  * @param specialFields
46
36
  * @protected
47
37
  */
48
- static cleanUpLoadedData(listToConvert: Array<any>, specialFields: SpecialFields): void;
38
+ static cleanUpLoadedData(listToConvert: Array<ManagedData>, typeName: string, handler?: XtTypeHandler<any> | null): void;
49
39
  /**
50
40
  * Sort the array using the defined sort declarations across all properties.
51
41
  *
@@ -1,12 +1,13 @@
1
- import { XtDataTransformer } from "./xt-data-transformer";
1
+ import { XtDataTransformer } from './xt-data-transformer';
2
2
  import { Observable } from 'rxjs';
3
- import { XtStoreCriteria, XtGroupBy, XtSortBy } from '../xt-store-parameters';
3
+ import { XtGroupBy, XtSortBy, XtStoreCriteria } from '../xt-store-parameters';
4
4
  import { DontCodeStorePreparedEntities } from './xt-store-provider-helper';
5
5
  import { UploadedDocumentInfo } from '../xt-document';
6
+ import { ManagedData } from 'xt-type';
6
7
  /**
7
8
  * The standard interface for any store provider
8
9
  */
9
- export type XtStoreProvider<T = never> = {
10
+ export type XtStoreProvider<T extends ManagedData = ManagedData> = {
10
11
  storeEntity(name: string, entity: T): Promise<T>;
11
12
  /**
12
13
  * Rejects the promise if the entity is not found
@@ -19,6 +20,12 @@ export type XtStoreProvider<T = never> = {
19
20
  searchEntities(name: string, ...criteria: XtStoreCriteria[]): Observable<Array<T>>;
20
21
  searchAndPrepareEntities(name: string, sort?: XtSortBy, groupBy?: XtGroupBy, transformer?: XtDataTransformer<T>, ...criteria: XtStoreCriteria[]): Observable<DontCodeStorePreparedEntities<T>>;
21
22
  canStoreDocument(): boolean;
23
+ /**
24
+ * Upload one document to a server store and returns the url or the id needed to retrieve them.
25
+ * @param toStore
26
+ * @param position
27
+ */
28
+ storeDocument(toStore: File): Promise<UploadedDocumentInfo>;
22
29
  /**
23
30
  * Upload documents to a server store and returns the url or the id needed to retrieve them.
24
31
  * @param toStore
@@ -26,7 +33,7 @@ export type XtStoreProvider<T = never> = {
26
33
  */
27
34
  storeDocuments(toStore: File[]): Observable<UploadedDocumentInfo>;
28
35
  };
29
- export declare abstract class AbstractXtStoreProvider<T = never> implements XtStoreProvider<T> {
36
+ export declare abstract class AbstractXtStoreProvider<T extends ManagedData = ManagedData> implements XtStoreProvider<T> {
30
37
  abstract canStoreDocument(): boolean;
31
38
  abstract deleteEntity(name: string, key: any): Promise<boolean>;
32
39
  abstract loadEntity(name: string, key: any): Promise<T | undefined>;
@@ -45,6 +52,7 @@ export declare abstract class AbstractXtStoreProvider<T = never> implements XtSt
45
52
  */
46
53
  protected listEntities(name: string): Observable<T[]>;
47
54
  searchAndPrepareEntities(name: string, sort?: XtSortBy, groupBy?: XtGroupBy, transformer?: XtDataTransformer<T>, ...criteria: XtStoreCriteria[]): Observable<DontCodeStorePreparedEntities<T>>;
55
+ storeDocument(toStore: File): Promise<UploadedDocumentInfo>;
48
56
  abstract storeDocuments(toStore: File[]): Observable<UploadedDocumentInfo>;
49
57
  abstract storeEntity(position: string, entity: T): Promise<T>;
50
58
  protected calculateSortHierarchy(sort?: XtSortBy, groupBy?: XtGroupBy): XtSortBy | undefined;