@ngutil/data 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/esm2022/index.mjs +6 -3
  2. package/esm2022/provider/array.mjs +9 -0
  3. package/esm2022/provider/index.mjs +5 -0
  4. package/esm2022/provider/local.mjs +29 -0
  5. package/esm2022/provider/observable.mjs +8 -0
  6. package/esm2022/provider/provider.mjs +17 -0
  7. package/esm2022/query/index.mjs +1 -1
  8. package/esm2022/query/sorter.mjs +1 -1
  9. package/esm2022/source/index.mjs +3 -0
  10. package/esm2022/source/properties/abstract.mjs +33 -0
  11. package/esm2022/source/properties/filter.mjs +16 -0
  12. package/esm2022/source/properties/grouper.mjs +16 -0
  13. package/esm2022/source/properties/index.mjs +5 -0
  14. package/esm2022/source/properties/slimer.mjs +16 -0
  15. package/esm2022/source/properties/sorter.mjs +16 -0
  16. package/esm2022/source/proxy.directive.mjs +152 -0
  17. package/esm2022/source/source.mjs +109 -0
  18. package/esm2022/store/collection-store.mjs +3 -0
  19. package/esm2022/store/index.mjs +3 -0
  20. package/esm2022/store/memory-store.mjs +79 -0
  21. package/fesm2022/ngutil-data.mjs +967 -166
  22. package/fesm2022/ngutil-data.mjs.map +1 -1
  23. package/index.d.ts +5 -2
  24. package/package.json +2 -2
  25. package/provider/array.d.ts +7 -0
  26. package/provider/index.d.ts +4 -0
  27. package/provider/local.d.ts +16 -0
  28. package/provider/observable.d.ts +7 -0
  29. package/provider/provider.d.ts +35 -0
  30. package/query/index.d.ts +1 -1
  31. package/query/sorter.d.ts +4 -4
  32. package/source/index.d.ts +2 -0
  33. package/source/properties/abstract.d.ts +17 -0
  34. package/source/properties/filter.d.ts +11 -0
  35. package/source/properties/grouper.d.ts +11 -0
  36. package/source/properties/index.d.ts +4 -0
  37. package/source/properties/slimer.d.ts +11 -0
  38. package/source/properties/sorter.d.ts +11 -0
  39. package/source/proxy.directive.d.ts +57 -0
  40. package/source/source.d.ts +36 -0
  41. package/store/collection-store.d.ts +49 -0
  42. package/store/index.d.ts +2 -0
  43. package/store/memory-store.d.ts +16 -0
@@ -0,0 +1,57 @@
1
+ import { DataSource as CdkDataSource, CollectionViewer } from "@angular/cdk/collections";
2
+ import { OnDestroy } from "@angular/core";
3
+ import { Observable, ReplaySubject } from "rxjs";
4
+ import { Busy, ConnectProtocol } from "@ngutil/common";
5
+ import { Model } from "../model";
6
+ import { Filter, Grouper, Slimer, Sorter } from "../query";
7
+ import { DataSource } from "./source";
8
+ import * as i0 from "@angular/core";
9
+ export type DataSourceInput<T extends Model> = any;
10
+ /**
11
+ * @example
12
+ * ```html
13
+ * <table [nuDataSource]="..." [filter]="{isActive: true}" [sorter]="[{name: 'asc'}]"></table>
14
+ * ```
15
+ *
16
+ * ```ts
17
+ * @Component({
18
+ * template: `<table [nuDataSource]="users$"></table>`
19
+ * })
20
+ * class UserTable {
21
+ * readonly userService = inject(UserService)
22
+ * readonly users$ = UserService.all()
23
+ * }
24
+ * ```
25
+ *
26
+ * ```ts
27
+ * @Component({
28
+ * selector: "table.my-table",
29
+ * template: `
30
+ * <cdk-virtual-scroll-viewport itemSize="50" class="example-viewport">
31
+ * <div *cdkVirtualFor="let item of dataSource" class="example-item">{{item}}</div>
32
+ * </cdk-virtual-scroll-viewport>
33
+ * `
34
+ * })
35
+ * class TableComponent {
36
+ * readonly dataSource = inject(DataSourceProxy)
37
+ * }
38
+ * ```
39
+ */
40
+ export declare class DataSourceProxy<T extends Model = Model> extends CdkDataSource<T | undefined> implements OnDestroy, ConnectProtocol {
41
+ #private;
42
+ set source(value: DataSourceInput<T>);
43
+ readonly source$: ReplaySubject<DataSource<T>>;
44
+ readonly items$: Observable<import("@ngutil/data").PartialCollection<T>>;
45
+ readonly busy$: Observable<boolean>;
46
+ readonly isBusy: import("@angular/core").Signal<boolean>;
47
+ set filter(value: Filter<T>);
48
+ set sorter(value: Sorter<T>);
49
+ set grouper(value: Grouper<T>);
50
+ set slimer(value: Slimer<T>);
51
+ constructor(busy?: Busy<any>);
52
+ connect(collectionViewer: CollectionViewer): Observable<readonly (T | undefined)[]>;
53
+ disconnect(collectionViewer: CollectionViewer): void;
54
+ ngOnDestroy(): void;
55
+ static ɵfac: i0.ɵɵFactoryDeclaration<DataSourceProxy<any>, [{ optional: true; }]>;
56
+ static ɵdir: i0.ɵɵDirectiveDeclaration<DataSourceProxy<any>, "[nuDataSource]", ["nuDataSource"], { "source": { "alias": "nuDataSource"; "required": true; }; "filter": { "alias": "filter"; "required": false; }; "sorter": { "alias": "sorter"; "required": false; }; "grouper": { "alias": "grouper"; "required": false; }; "slimer": { "alias": "slimer"; "required": false; }; }, {}, never, never, true, never>;
57
+ }
@@ -0,0 +1,36 @@
1
+ import { DataSource as CdkDataSource, CollectionViewer } from "@angular/cdk/collections";
2
+ import { BehaviorSubject, Observable } from "rxjs";
3
+ import { ConnectProtocol, DeepReadonly } from "@ngutil/common";
4
+ import type { Model, ModelRef } from "../model";
5
+ import type { DataProvider } from "../provider/provider";
6
+ import type { Filter, Query, Slice, Sorter } from "../query";
7
+ import { type CollectionStore, type PartialCollection } from "../store";
8
+ import { FilterCombined, GrouperCombined, SlimerCombined, SorterCombined } from "./properties";
9
+ type DSQuery<T extends Model> = Query<T> & {
10
+ slice: DeepReadonly<Slice>;
11
+ };
12
+ export declare class DataSource<T extends Model> extends CdkDataSource<T | undefined> implements ConnectProtocol {
13
+ #private;
14
+ readonly provider: DataProvider<T>;
15
+ readonly busy$: BehaviorSubject<boolean>;
16
+ readonly total$: BehaviorSubject<number | undefined>;
17
+ readonly filter: FilterCombined<Filter<T>>;
18
+ readonly sorter: SorterCombined<Sorter<T>>;
19
+ readonly slimer: SlimerCombined<any>;
20
+ readonly grouper: GrouperCombined<any>;
21
+ readonly slice$: Observable<Slice>;
22
+ readonly reset$: Observable<unknown>;
23
+ readonly query$: Observable<DSQuery<T>>;
24
+ readonly items$: Observable<PartialCollection<T>>;
25
+ readonly store: CollectionStore<T>;
26
+ constructor(provider: DataProvider<T>, store?: CollectionStore<T>);
27
+ setSlice(slice: Slice): this;
28
+ all(): this;
29
+ realod(): void;
30
+ getItem(ref: ModelRef): Observable<T | undefined>;
31
+ getItemPosition(ref: ModelRef): Observable<number | undefined>;
32
+ realodItem(ref: ModelRef, insertPosition?: number): Observable<T | undefined>;
33
+ connect(collectionViewer: CollectionViewer): Observable<readonly (T | undefined)[]>;
34
+ disconnect(collectionViewer: CollectionViewer): void;
35
+ }
36
+ export {};
@@ -0,0 +1,49 @@
1
+ import { Observable } from "rxjs";
2
+ import { DeepReadonly } from "@ngutil/common";
3
+ import { Model, ModelRefNorm } from "../model";
4
+ import { Slice } from "../query";
5
+ export type PartialCollection<T> = readonly (T | undefined)[];
6
+ export declare abstract class CollectionStore<T extends Model> {
7
+ /**
8
+ * Update the given slice, and return all items observable
9
+ */
10
+ abstract insertSlice(slice: DeepReadonly<Slice>, items: readonly T[]): Observable<PartialCollection<T>>;
11
+ /**
12
+ * @returns `true` when the given slice is available in the cache
13
+ */
14
+ abstract hasSlice(slice: DeepReadonly<Slice>): Observable<boolean>;
15
+ /**
16
+ * @returns items by the given slice
17
+ */
18
+ abstract getSlice(slice: DeepReadonly<Slice>): Observable<PartialCollection<T>>;
19
+ /**
20
+ * Get item from collection
21
+ */
22
+ abstract get(ref: ModelRefNorm): Observable<T | undefined>;
23
+ /**
24
+ * Get index of item in collection, -1 if not found
25
+ */
26
+ abstract indexOf(ref: ModelRefNorm): Observable<number>;
27
+ /**
28
+ * Update item in collection
29
+ *
30
+ * @returns the updated index, or -1 if not found
31
+ */
32
+ abstract update(ref: ModelRefNorm, item: T): Observable<number>;
33
+ /**
34
+ * Update item if exists in collection, or insert at the given position
35
+ *
36
+ * @param position If positon is negative, insert at the end of collection
37
+ * @returns the updated index or index of where to insert
38
+ */
39
+ abstract updateOrInsert(ref: ModelRefNorm, item: T, position?: number): Observable<number>;
40
+ /**
41
+ * Remove item from collection
42
+ * @returns the index of deleted item, -1 if not found
43
+ */
44
+ abstract del(ref: ModelRefNorm): Observable<number>;
45
+ /**
46
+ * Removes all items from collection
47
+ */
48
+ abstract clear(): Observable<void>;
49
+ }
@@ -0,0 +1,2 @@
1
+ export { CollectionStore, PartialCollection } from "./collection-store";
2
+ export { MemoryStore } from "./memory-store";
@@ -0,0 +1,16 @@
1
+ import { Observable } from "rxjs";
2
+ import { Model, ModelRefNorm } from "../model";
3
+ import { Slice } from "../query";
4
+ import { CollectionStore, PartialCollection } from "./collection-store";
5
+ export declare class MemoryStore<T extends Model> extends CollectionStore<T> {
6
+ #private;
7
+ insertSlice(slice: Slice, items: readonly T[]): Observable<PartialCollection<T>>;
8
+ hasSlice(slice: Slice): Observable<boolean>;
9
+ getSlice(slice: Slice): Observable<PartialCollection<T>>;
10
+ get(ref: ModelRefNorm): Observable<T | undefined>;
11
+ indexOf(ref: ModelRefNorm): Observable<number>;
12
+ update(ref: ModelRefNorm, item: T): Observable<number>;
13
+ updateOrInsert(ref: ModelRefNorm, item: T, position?: number): Observable<number>;
14
+ del(ref: ModelRefNorm): Observable<number>;
15
+ clear(): Observable<void>;
16
+ }