@ngrx-traits/common 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/async-action/async-action.model.d.ts +19 -0
- package/async-action/async-action.trait.d.ts +59 -0
- package/async-action/index.d.ts +2 -0
- package/bundles/ngrx-traits-common.umd.js +2126 -0
- package/bundles/ngrx-traits-common.umd.js.map +1 -0
- package/crud-entities/crud-entities.model.d.ts +76 -0
- package/crud-entities/crud-entities.trait.actions.d.ts +2 -0
- package/crud-entities/crud-entities.trait.d.ts +35 -0
- package/crud-entities/crud-entities.trait.mutators.d.ts +3 -0
- package/crud-entities/crud-entities.trait.reducer.d.ts +7 -0
- package/crud-entities/crud-entities.trait.selectors.d.ts +3 -0
- package/crud-entities/index.d.ts +2 -0
- package/entities-pagination/entities-pagination.model.d.ts +82 -0
- package/entities-pagination/entities-pagination.model.internal.d.ts +12 -0
- package/entities-pagination/entities-pagination.trait.actions.d.ts +2 -0
- package/entities-pagination/entities-pagination.trait.d.ts +55 -0
- package/entities-pagination/entities-pagination.trait.effects.d.ts +8 -0
- package/entities-pagination/entities-pagination.trait.mutators.d.ts +3 -0
- package/entities-pagination/entities-pagination.trait.reducer.d.ts +7 -0
- package/entities-pagination/entities-pagination.trait.selectors.d.ts +4 -0
- package/entities-pagination/index.d.ts +2 -0
- package/esm2015/async-action/async-action.model.js +2 -0
- package/esm2015/async-action/async-action.model.js.map +1 -0
- package/esm2015/async-action/async-action.trait.js +96 -0
- package/esm2015/async-action/async-action.trait.js.map +1 -0
- package/esm2015/async-action/index.js +3 -0
- package/esm2015/async-action/index.js.map +1 -0
- package/esm2015/crud-entities/crud-entities.model.js +8 -0
- package/esm2015/crud-entities/crud-entities.model.js.map +1 -0
- package/esm2015/crud-entities/crud-entities.trait.actions.js +20 -0
- package/esm2015/crud-entities/crud-entities.trait.actions.js.map +1 -0
- package/esm2015/crud-entities/crud-entities.trait.js +53 -0
- package/esm2015/crud-entities/crud-entities.trait.js.map +1 -0
- package/esm2015/crud-entities/crud-entities.trait.mutators.js +101 -0
- package/esm2015/crud-entities/crud-entities.trait.mutators.js.map +1 -0
- package/esm2015/crud-entities/crud-entities.trait.reducer.js +15 -0
- package/esm2015/crud-entities/crud-entities.trait.reducer.js.map +1 -0
- package/esm2015/crud-entities/crud-entities.trait.selectors.js +70 -0
- package/esm2015/crud-entities/crud-entities.trait.selectors.js.map +1 -0
- package/esm2015/crud-entities/index.js +3 -0
- package/esm2015/crud-entities/index.js.map +1 -0
- package/esm2015/entities-pagination/entities-pagination.model.internal.js +2 -0
- package/esm2015/entities-pagination/entities-pagination.model.internal.js.map +1 -0
- package/esm2015/entities-pagination/entities-pagination.model.js +2 -0
- package/esm2015/entities-pagination/entities-pagination.model.js.map +1 -0
- package/esm2015/entities-pagination/entities-pagination.trait.actions.js +20 -0
- package/esm2015/entities-pagination/entities-pagination.trait.actions.js.map +1 -0
- package/esm2015/entities-pagination/entities-pagination.trait.effects.js +54 -0
- package/esm2015/entities-pagination/entities-pagination.trait.effects.js.map +1 -0
- package/esm2015/entities-pagination/entities-pagination.trait.js +80 -0
- package/esm2015/entities-pagination/entities-pagination.trait.js.map +1 -0
- package/esm2015/entities-pagination/entities-pagination.trait.mutators.js +23 -0
- package/esm2015/entities-pagination/entities-pagination.trait.mutators.js.map +1 -0
- package/esm2015/entities-pagination/entities-pagination.trait.reducer.js +33 -0
- package/esm2015/entities-pagination/entities-pagination.trait.reducer.js.map +1 -0
- package/esm2015/entities-pagination/entities-pagination.trait.selectors.js +65 -0
- package/esm2015/entities-pagination/entities-pagination.trait.selectors.js.map +1 -0
- package/esm2015/entities-pagination/index.js +3 -0
- package/esm2015/entities-pagination/index.js.map +1 -0
- package/esm2015/filter-entities/filter-entities.model.internal.js +2 -0
- package/esm2015/filter-entities/filter-entities.model.internal.js.map +1 -0
- package/esm2015/filter-entities/filter-entities.model.js +2 -0
- package/esm2015/filter-entities/filter-entities.model.js.map +1 -0
- package/esm2015/filter-entities/filter-entities.trait.actions.js +16 -0
- package/esm2015/filter-entities/filter-entities.trait.actions.js.map +1 -0
- package/esm2015/filter-entities/filter-entities.trait.effect.js +56 -0
- package/esm2015/filter-entities/filter-entities.trait.effect.js.map +1 -0
- package/esm2015/filter-entities/filter-entities.trait.js +68 -0
- package/esm2015/filter-entities/filter-entities.trait.js.map +1 -0
- package/esm2015/filter-entities/filter-entities.trait.mutators.js +7 -0
- package/esm2015/filter-entities/filter-entities.trait.mutators.js.map +1 -0
- package/esm2015/filter-entities/filter-entities.trait.reducer.js +9 -0
- package/esm2015/filter-entities/filter-entities.trait.reducer.js.map +1 -0
- package/esm2015/filter-entities/filter-entities.trait.selectors.js +9 -0
- package/esm2015/filter-entities/filter-entities.trait.selectors.js.map +1 -0
- package/esm2015/filter-entities/index.js +3 -0
- package/esm2015/filter-entities/index.js.map +1 -0
- package/esm2015/index.js +12 -0
- package/esm2015/index.js.map +1 -0
- package/esm2015/load-entities/index.js +3 -0
- package/esm2015/load-entities/index.js.map +1 -0
- package/esm2015/load-entities/load-entities.model.js +2 -0
- package/esm2015/load-entities/load-entities.model.js.map +1 -0
- package/esm2015/load-entities/load-entities.mutators.js +8 -0
- package/esm2015/load-entities/load-entities.mutators.js.map +1 -0
- package/esm2015/load-entities/load-entities.trait.actions.js +10 -0
- package/esm2015/load-entities/load-entities.trait.actions.js.map +1 -0
- package/esm2015/load-entities/load-entities.trait.js +57 -0
- package/esm2015/load-entities/load-entities.trait.js.map +1 -0
- package/esm2015/load-entities/load-entities.trait.reducer.js +12 -0
- package/esm2015/load-entities/load-entities.trait.reducer.js.map +1 -0
- package/esm2015/load-entities/load-entities.trait.selectors.js +33 -0
- package/esm2015/load-entities/load-entities.trait.selectors.js.map +1 -0
- package/esm2015/load-entities/load-entities.utils.js +10 -0
- package/esm2015/load-entities/load-entities.utils.js.map +1 -0
- package/esm2015/load-entity/index.js +3 -0
- package/esm2015/load-entity/index.js.map +1 -0
- package/esm2015/load-entity/load-entity.model.js +2 -0
- package/esm2015/load-entity/load-entity.model.js.map +1 -0
- package/esm2015/load-entity/load-entity.traits.js +65 -0
- package/esm2015/load-entity/load-entity.traits.js.map +1 -0
- package/esm2015/ngrx-traits-common.js +5 -0
- package/esm2015/ngrx-traits-common.js.map +1 -0
- package/esm2015/public_api.js +2 -0
- package/esm2015/public_api.js.map +1 -0
- package/esm2015/reset/index.js +2 -0
- package/esm2015/reset/index.js.map +1 -0
- package/esm2015/reset/reset.trait.js +66 -0
- package/esm2015/reset/reset.trait.js.map +1 -0
- package/esm2015/select-entities/index.js +4 -0
- package/esm2015/select-entities/index.js.map +1 -0
- package/esm2015/select-entities/select-entities.model.js +2 -0
- package/esm2015/select-entities/select-entities.model.js.map +1 -0
- package/esm2015/select-entities/select-entities.trait.actions.js +11 -0
- package/esm2015/select-entities/select-entities.trait.actions.js.map +1 -0
- package/esm2015/select-entities/select-entities.trait.js +50 -0
- package/esm2015/select-entities/select-entities.trait.js.map +1 -0
- package/esm2015/select-entities/select-entities.trait.mutators.js +21 -0
- package/esm2015/select-entities/select-entities.trait.mutators.js.map +1 -0
- package/esm2015/select-entities/select-entities.trait.reducer.js +40 -0
- package/esm2015/select-entities/select-entities.trait.reducer.js.map +1 -0
- package/esm2015/select-entities/select-entities.trait.selectors.js +28 -0
- package/esm2015/select-entities/select-entities.trait.selectors.js.map +1 -0
- package/esm2015/select-entities/select-entities.utils.js +25 -0
- package/esm2015/select-entities/select-entities.utils.js.map +1 -0
- package/esm2015/select-entity/index.js +3 -0
- package/esm2015/select-entity/index.js.map +1 -0
- package/esm2015/select-entity/select-entity.model.js +2 -0
- package/esm2015/select-entity/select-entity.model.js.map +1 -0
- package/esm2015/select-entity/select-entity.trait.actions.js +9 -0
- package/esm2015/select-entity/select-entity.trait.actions.js.map +1 -0
- package/esm2015/select-entity/select-entity.trait.js +47 -0
- package/esm2015/select-entity/select-entity.trait.js.map +1 -0
- package/esm2015/select-entity/select-entity.trait.mutators.js +17 -0
- package/esm2015/select-entity/select-entity.trait.mutators.js.map +1 -0
- package/esm2015/select-entity/select-entity.trait.reducer.js +26 -0
- package/esm2015/select-entity/select-entity.trait.reducer.js.map +1 -0
- package/esm2015/select-entity/select-entity.trait.selectors.js +13 -0
- package/esm2015/select-entity/select-entity.trait.selectors.js.map +1 -0
- package/esm2015/set-entity/index.js +3 -0
- package/esm2015/set-entity/index.js.map +1 -0
- package/esm2015/set-entity/set-entity.model.js +2 -0
- package/esm2015/set-entity/set-entity.model.js.map +1 -0
- package/esm2015/set-entity/set-entity.trait.js +52 -0
- package/esm2015/set-entity/set-entity.trait.js.map +1 -0
- package/esm2015/sort-entities/index.js +4 -0
- package/esm2015/sort-entities/index.js.map +1 -0
- package/esm2015/sort-entities/sort-entities.model.js +2 -0
- package/esm2015/sort-entities/sort-entities.model.js.map +1 -0
- package/esm2015/sort-entities/sort-entities.trait.actions.js +8 -0
- package/esm2015/sort-entities/sort-entities.trait.actions.js.map +1 -0
- package/esm2015/sort-entities/sort-entities.trait.effect.js +28 -0
- package/esm2015/sort-entities/sort-entities.trait.effect.js.map +1 -0
- package/esm2015/sort-entities/sort-entities.trait.js +53 -0
- package/esm2015/sort-entities/sort-entities.trait.js.map +1 -0
- package/esm2015/sort-entities/sort-entities.trait.mutators.js +13 -0
- package/esm2015/sort-entities/sort-entities.trait.mutators.js.map +1 -0
- package/esm2015/sort-entities/sort-entities.trait.reducer.js +22 -0
- package/esm2015/sort-entities/sort-entities.trait.reducer.js.map +1 -0
- package/esm2015/sort-entities/sort-entities.trait.selectors.js +10 -0
- package/esm2015/sort-entities/sort-entities.trait.selectors.js.map +1 -0
- package/esm2015/sort-entities/sort-entities.utils.js +61 -0
- package/esm2015/sort-entities/sort-entities.utils.js.map +1 -0
- package/fesm2015/ngrx-traits-common.js +1511 -0
- package/fesm2015/ngrx-traits-common.js.map +1 -0
- package/filter-entities/filter-entities.model.d.ts +57 -0
- package/filter-entities/filter-entities.model.internal.d.ts +14 -0
- package/filter-entities/filter-entities.trait.actions.d.ts +2 -0
- package/filter-entities/filter-entities.trait.d.ts +42 -0
- package/filter-entities/filter-entities.trait.effect.d.ts +6 -0
- package/filter-entities/filter-entities.trait.mutators.d.ts +2 -0
- package/filter-entities/filter-entities.trait.reducer.d.ts +5 -0
- package/filter-entities/filter-entities.trait.selectors.d.ts +4 -0
- package/filter-entities/index.d.ts +2 -0
- package/index.d.ts +11 -0
- package/load-entities/index.d.ts +2 -0
- package/load-entities/load-entities.model.d.ts +97 -0
- package/load-entities/load-entities.mutators.d.ts +3 -0
- package/load-entities/load-entities.trait.actions.d.ts +2 -0
- package/load-entities/load-entities.trait.d.ts +39 -0
- package/load-entities/load-entities.trait.reducer.d.ts +4 -0
- package/load-entities/load-entities.trait.selectors.d.ts +3 -0
- package/load-entities/load-entities.utils.d.ts +4 -0
- package/load-entity/index.d.ts +2 -0
- package/load-entity/load-entity.model.d.ts +9 -0
- package/load-entity/load-entity.traits.d.ts +64 -0
- package/ngrx-traits-common.d.ts +5 -0
- package/package.json +28 -0
- package/public_api.d.ts +1 -0
- package/reset/index.d.ts +1 -0
- package/reset/reset.trait.d.ts +32 -0
- package/select-entities/index.d.ts +3 -0
- package/select-entities/select-entities.model.d.ts +41 -0
- package/select-entities/select-entities.trait.actions.d.ts +2 -0
- package/select-entities/select-entities.trait.d.ts +34 -0
- package/select-entities/select-entities.trait.mutators.d.ts +2 -0
- package/select-entities/select-entities.trait.reducer.d.ts +8 -0
- package/select-entities/select-entities.trait.selectors.d.ts +3 -0
- package/select-entities/select-entities.utils.d.ts +7 -0
- package/select-entity/index.d.ts +2 -0
- package/select-entity/select-entity.model.d.ts +33 -0
- package/select-entity/select-entity.trait.actions.d.ts +2 -0
- package/select-entity/select-entity.trait.d.ts +30 -0
- package/select-entity/select-entity.trait.mutators.d.ts +2 -0
- package/select-entity/select-entity.trait.reducer.d.ts +8 -0
- package/select-entity/select-entity.trait.selectors.d.ts +2 -0
- package/set-entity/index.d.ts +2 -0
- package/set-entity/set-entity.model.d.ts +16 -0
- package/set-entity/set-entity.trait.d.ts +39 -0
- package/sort-entities/index.d.ts +3 -0
- package/sort-entities/sort-entities.model.d.ts +35 -0
- package/sort-entities/sort-entities.trait.actions.d.ts +2 -0
- package/sort-entities/sort-entities.trait.d.ts +33 -0
- package/sort-entities/sort-entities.trait.effect.d.ts +6 -0
- package/sort-entities/sort-entities.trait.mutators.d.ts +3 -0
- package/sort-entities/sort-entities.trait.reducer.d.ts +4 -0
- package/sort-entities/sort-entities.trait.selectors.d.ts +2 -0
- package/sort-entities/sort-entities.utils.d.ts +8 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createAction } from '@ngrx/store';
|
|
2
|
+
export function createFilterTraitActions(actionsGroupKey, entitiesName) {
|
|
3
|
+
const actions = {
|
|
4
|
+
filterEntities: createAction(`${actionsGroupKey} Filter ${entitiesName}`, (props) => ({
|
|
5
|
+
filters: props === null || props === void 0 ? void 0 : props.filters,
|
|
6
|
+
forceLoad: props === null || props === void 0 ? void 0 : props.forceLoad,
|
|
7
|
+
patch: props === null || props === void 0 ? void 0 : props.patch,
|
|
8
|
+
})),
|
|
9
|
+
storeEntitiesFilter: createAction(`${actionsGroupKey} Store ${entitiesName} Filter`, (props) => ({
|
|
10
|
+
filters: props === null || props === void 0 ? void 0 : props.filters,
|
|
11
|
+
patch: props === null || props === void 0 ? void 0 : props.patch,
|
|
12
|
+
})),
|
|
13
|
+
};
|
|
14
|
+
return actions;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=filter-entities.trait.actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-entities.trait.actions.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/filter-entities/filter-entities.trait.actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,UAAU,wBAAwB,CACtC,eAAuB,EACvB,YAAoB;IAEpB,MAAM,OAAO,GAA8B;QACzC,cAAc,EAAE,YAAY,CAC1B,GAAG,eAAe,WAAW,YAAY,EAAE,EAC3C,CAAC,KAIA,EAAE,EAAE,CAAC,CAAC;YACL,OAAO,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO;YACvB,SAAS,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS;YAC3B,KAAK,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK;SACpB,CAAC,CAC+C;QACnD,mBAAmB,EAAE,YAAY,CAC/B,GAAG,eAAe,UAAU,YAAY,SAAS,EACjD,CAAC,KAAuC,EAAE,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO;YACvB,KAAK,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK;SACpB,CAAC,CACH;KACF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { createAction } from '@ngrx/store';\nimport {\n FilterActionOverload,\n FilterEntitiesActions,\n} from './filter-entities.model';\nimport { ActionCreator } from '@ngrx/store/src/models';\nimport { ƟFilterEntitiesActions } from './filter-entities.model.internal';\n\nexport function createFilterTraitActions<F>(\n actionsGroupKey: string,\n entitiesName: string\n): FilterEntitiesActions<F> {\n const actions: ƟFilterEntitiesActions<F> = {\n filterEntities: createAction(\n `${actionsGroupKey} Filter ${entitiesName}`,\n (props?: {\n filters: F | Partial<F>;\n forceLoad?: boolean;\n patch?: boolean;\n }) => ({\n filters: props?.filters,\n forceLoad: props?.forceLoad,\n patch: props?.patch,\n })\n ) as ActionCreator<string, FilterActionOverload<F>>,\n storeEntitiesFilter: createAction(\n `${actionsGroupKey} Store ${entitiesName} Filter`,\n (props: { filters?: F; patch?: boolean }) => ({\n filters: props?.filters,\n patch: props?.patch,\n })\n ),\n };\n return actions;\n}\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { TraitEffect } from '@ngrx-traits/core';
|
|
3
|
+
import { asyncScheduler, EMPTY, of, pipe, timer } from 'rxjs';
|
|
4
|
+
import { concatMap, debounce, distinctUntilChanged, first, map, pairwise, startWith, } from 'rxjs/operators';
|
|
5
|
+
import { createEffect, ofType } from '@ngrx/effects';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export function createFilterTraitEffects(allActions, allSelectors, allConfigs) {
|
|
8
|
+
const traitConfig = allConfigs.filter;
|
|
9
|
+
class FilterEffect extends TraitEffect {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.storeFilter$ = createEffect(() => ({ debounce: debounceTime = traitConfig.defaultDebounceTime, scheduler = asyncScheduler, } = {}) => this.actions$.pipe(ofType(allActions.filterEntities), debounce((value) => (value === null || value === void 0 ? void 0 : value.forceLoad) ? EMPTY : timer(debounceTime, scheduler)), concatMap((payload) => payload.patch
|
|
13
|
+
? this.store.select(allSelectors.selectEntitiesFilter).pipe(first(), map((storedFilters) => (Object.assign(Object.assign({}, payload), { filters: Object.assign(Object.assign({}, storedFilters), payload === null || payload === void 0 ? void 0 : payload.filters) }))))
|
|
14
|
+
: of(payload)), distinctUntilChanged((previous, current) => !(current === null || current === void 0 ? void 0 : current.forceLoad) &&
|
|
15
|
+
JSON.stringify(previous === null || previous === void 0 ? void 0 : previous.filters) ===
|
|
16
|
+
JSON.stringify(current === null || current === void 0 ? void 0 : current.filters)), (traitConfig === null || traitConfig === void 0 ? void 0 : traitConfig.isRemoteFilter)
|
|
17
|
+
? pipe(startWith({
|
|
18
|
+
filters: traitConfig.defaultFilter,
|
|
19
|
+
patch: false,
|
|
20
|
+
}), pairwise(), concatMap(([previous, current]) => (traitConfig === null || traitConfig === void 0 ? void 0 : traitConfig.isRemoteFilter(previous === null || previous === void 0 ? void 0 : previous.filters, current === null || current === void 0 ? void 0 : current.filters))
|
|
21
|
+
? [
|
|
22
|
+
allActions.storeEntitiesFilter({
|
|
23
|
+
filters: current === null || current === void 0 ? void 0 : current.filters,
|
|
24
|
+
patch: current === null || current === void 0 ? void 0 : current.patch,
|
|
25
|
+
}),
|
|
26
|
+
allActions.loadEntities(),
|
|
27
|
+
]
|
|
28
|
+
: [
|
|
29
|
+
allActions.storeEntitiesFilter({
|
|
30
|
+
filters: current === null || current === void 0 ? void 0 : current.filters,
|
|
31
|
+
patch: current === null || current === void 0 ? void 0 : current.patch,
|
|
32
|
+
}),
|
|
33
|
+
]))
|
|
34
|
+
: map((action) => allActions.storeEntitiesFilter({
|
|
35
|
+
filters: action === null || action === void 0 ? void 0 : action.filters,
|
|
36
|
+
patch: action === null || action === void 0 ? void 0 : action.patch,
|
|
37
|
+
}))));
|
|
38
|
+
this.loadEntities$ = (!(traitConfig === null || traitConfig === void 0 ? void 0 : traitConfig.filterFn) || (traitConfig === null || traitConfig === void 0 ? void 0 : traitConfig.isRemoteFilter)) &&
|
|
39
|
+
createEffect(() => {
|
|
40
|
+
return this.actions$.pipe(ofType(allActions['storeEntitiesFilter']), concatMap(() => (allActions === null || allActions === void 0 ? void 0 : allActions.loadEntitiesFirstPage)
|
|
41
|
+
? [
|
|
42
|
+
allActions.clearEntitiesPagesCache(),
|
|
43
|
+
allActions.loadEntitiesFirstPage(),
|
|
44
|
+
]
|
|
45
|
+
: [allActions.loadEntities()]));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
FilterEffect.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: FilterEffect, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
50
|
+
FilterEffect.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: FilterEffect });
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.2", ngImport: i0, type: FilterEffect, decorators: [{
|
|
52
|
+
type: Injectable
|
|
53
|
+
}] });
|
|
54
|
+
return [FilterEffect];
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=filter-entities.trait.effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-entities.trait.effect.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/filter-entities/filter-entities.trait.effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAQ,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC9D,OAAO,EACL,SAAS,EACT,QAAQ,EACR,oBAAoB,EACpB,KAAK,EACL,GAAG,EACH,QAAQ,EACR,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;AAYrD,MAAM,UAAU,wBAAwB,CACtC,UAE2B,EAC3B,YAC+B,EAC/B,UAAgD;IAEhD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC;IACtC,MACM,YAAa,SAAQ,WAAW;QADtC;;YAEE,iBAAY,GAAG,YAAY,CACzB,GAAG,EAAE,CACH,CAAC,EACC,QAAQ,EAAE,YAAY,GAAG,WAAY,CAAC,mBAAmB,EACzD,SAAS,GAAG,cAAc,MACxB,EAAE,EAAE,EAAE,CACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,EACjC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAC1D,EACD,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CACpB,OAAO,CAAC,KAAK;gBACX,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,IAAI,CACvD,KAAK,EAAE,EACP,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,iCAClB,OAAO,KACV,OAAO,kCAAO,aAAa,GAAK,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,KAChD,CAAC,CACJ;gBACH,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAChB,EACD,oBAAoB,CAClB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACpB,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,CAAA;gBACnB,IAAI,CAAC,SAAS,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC;oBAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CACrC,EACD,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc;gBACzB,CAAC,CAAC,IAAI,CACF,SAAS,CAAC;oBACR,OAAO,EAAE,WAAW,CAAC,aAAkB;oBACvC,KAAK,EAAE,KAAK;iBACb,CAAC,EACF,QAAQ,EAAE,EACV,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAChC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,CACzB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,EACjB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CACjB;oBACC,CAAC,CAAC;wBACE,UAAU,CAAC,mBAAmB,CAAC;4BAC7B,OAAO,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO;4BACzB,KAAK,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK;yBACtB,CAAC;wBACF,UAAU,CAAC,YAAY,EAAE;qBAC1B;oBACH,CAAC,CAAC;wBACE,UAAU,CAAC,mBAAmB,CAAC;4BAC7B,OAAO,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO;4BACzB,KAAK,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK;yBACtB,CAAC;qBACH,CACN,CACF;gBACH,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACb,UAAU,CAAC,mBAAmB,CAAC;oBAC7B,OAAO,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO;oBACxB,KAAK,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK;iBACrB,CAAC,CACH,CACN,CACN,CAAC;YAEF,kBAAa,GACX,CAAC,CAAC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,CAAA,KAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,CAAA,CAAC;gBACvD,YAAY,CAAC,GAAG,EAAE;oBAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,EACzC,SAAS,CAAC,GAAG,EAAE,CACb,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,qBAAqB;wBAC/B,CAAC,CAAC;4BACE,UAAU,CAAC,uBAAuB,EAAE;4BACpC,UAAU,CAAC,qBAAqB,EAAE;yBACnC;wBACH,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAChC,CACF,CAAC;gBACJ,CAAC,CAAC,CAAC;SACN;;6GAhFK,YAAY;iHAAZ,YAAY;+FAAZ,YAAY;sBADjB,UAAU;;IAmFX,OAAO,CAAC,YAAY,CAAC,CAAC;CACvB","sourcesContent":["import { Injectable } from '@angular/core';\nimport { TraitEffect, Type } from '@ngrx-traits/core';\nimport { asyncScheduler, EMPTY, of, pipe, timer } from 'rxjs';\nimport {\n concatMap,\n debounce,\n distinctUntilChanged,\n first,\n map,\n pairwise,\n startWith,\n} from 'rxjs/operators';\nimport { createEffect, ofType } from '@ngrx/effects';\nimport {\n FilterEntitiesKeyedConfig,\n FilterEntitiesSelectors,\n} from './filter-entities.model';\nimport {\n LoadEntitiesActions,\n LoadEntitiesSelectors,\n} from '../load-entities/load-entities.model';\nimport { ƟFilterEntitiesActions } from './filter-entities.model.internal';\nimport { EntitiesPaginationActions } from '../entities-pagination';\n\nexport function createFilterTraitEffects<Entity, F>(\n allActions: ƟFilterEntitiesActions<F> &\n LoadEntitiesActions<Entity> &\n EntitiesPaginationActions,\n allSelectors: FilterEntitiesSelectors<Entity, F> &\n LoadEntitiesSelectors<Entity>,\n allConfigs: FilterEntitiesKeyedConfig<Entity, F>\n): Type<TraitEffect>[] {\n const traitConfig = allConfigs.filter;\n @Injectable()\n class FilterEffect extends TraitEffect {\n storeFilter$ = createEffect(\n () =>\n ({\n debounce: debounceTime = traitConfig!.defaultDebounceTime,\n scheduler = asyncScheduler,\n } = {}) =>\n this.actions$.pipe(\n ofType(allActions.filterEntities),\n debounce((value) =>\n value?.forceLoad ? EMPTY : timer(debounceTime, scheduler)\n ),\n concatMap((payload) =>\n payload.patch\n ? this.store.select(allSelectors.selectEntitiesFilter).pipe(\n first(),\n map((storedFilters) => ({\n ...payload,\n filters: { ...storedFilters, ...payload?.filters },\n }))\n )\n : of(payload)\n ),\n distinctUntilChanged(\n (previous, current) =>\n !current?.forceLoad &&\n JSON.stringify(previous?.filters) ===\n JSON.stringify(current?.filters)\n ),\n traitConfig?.isRemoteFilter\n ? pipe(\n startWith({\n filters: traitConfig.defaultFilter as F,\n patch: false,\n }),\n pairwise(),\n concatMap(([previous, current]) =>\n traitConfig?.isRemoteFilter!(\n previous?.filters,\n current?.filters\n )\n ? [\n allActions.storeEntitiesFilter({\n filters: current?.filters,\n patch: current?.patch,\n }),\n allActions.loadEntities(),\n ]\n : [\n allActions.storeEntitiesFilter({\n filters: current?.filters,\n patch: current?.patch,\n }),\n ]\n )\n )\n : map((action) =>\n allActions.storeEntitiesFilter({\n filters: action?.filters,\n patch: action?.patch,\n })\n )\n )\n );\n\n loadEntities$ =\n (!traitConfig?.filterFn || traitConfig?.isRemoteFilter) &&\n createEffect(() => {\n return this.actions$.pipe(\n ofType(allActions['storeEntitiesFilter']),\n concatMap(() =>\n allActions?.loadEntitiesFirstPage\n ? [\n allActions.clearEntitiesPagesCache(),\n allActions.loadEntitiesFirstPage(),\n ]\n : [allActions.loadEntities()]\n )\n );\n });\n }\n\n return [FilterEffect];\n}\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { entitiesPaginationTraitKey, } from '../entities-pagination/entities-pagination.model';
|
|
2
|
+
import { createFilterTraitEffects } from './filter-entities.trait.effect';
|
|
3
|
+
import { createFilterInitialState, createFilterTraitReducer, } from './filter-entities.trait.reducer';
|
|
4
|
+
import { filterEntitiesTraitKey, } from './filter-entities.model';
|
|
5
|
+
import { createFilterTraitSelectors } from './filter-entities.trait.selectors';
|
|
6
|
+
import { loadEntitiesTraitKey, } from '../load-entities/load-entities.model';
|
|
7
|
+
import { createFilterTraitMutators } from './filter-entities.trait.mutators';
|
|
8
|
+
import { createTraitFactory } from '@ngrx-traits/core';
|
|
9
|
+
import { createFilterTraitActions } from './filter-entities.trait.actions';
|
|
10
|
+
/**
|
|
11
|
+
* Generates the ngrx code needed to filter a list of entities locally or remotely, adds a filter
|
|
12
|
+
* action and a selectFilter selector, the filter action is debounced and the filter will only
|
|
13
|
+
* call the loadEntities action if the params have changed, so there is no need to implement that in
|
|
14
|
+
* the components. The filter action has a `forceLoad` param which can
|
|
15
|
+
* be use to skip that restriction for one call or setting the `defaultDebounceTime` to 0 for all calls.
|
|
16
|
+
* Calling the filter action will also replace the `filters` param in the store, if the `patch` param is set
|
|
17
|
+
* the filters are merged with the previous value in the store.
|
|
18
|
+
* @param traitConfig - Config object fot the trait factory
|
|
19
|
+
* @param traitConfig.defaultFilter - Initial value for the filter
|
|
20
|
+
* @param traitConfig.filterFn - Function to filter entities in memory, if not present then its expected
|
|
21
|
+
* is filtered by the backend unless isRemoteFilter is defned
|
|
22
|
+
* @param traitConfig.defaultDebounceTime - Value in milliseconds. Default to 400ms
|
|
23
|
+
* @param traitConfig.isRemoteFilter - Function to when it returns true it fires loadEntities so a remote
|
|
24
|
+
* backend filtering can run, otherwise it uses filterFn to do a local filtering
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // The following trait config
|
|
28
|
+
*
|
|
29
|
+
* export interface TestState
|
|
30
|
+
* extends EntityAndStatusState<Todo>,FilterState<TodoFilter>{}
|
|
31
|
+
*
|
|
32
|
+
* const traits = createEntityFeatureFactory(
|
|
33
|
+
* addLoadEntitiesTrait<Todo>(),
|
|
34
|
+
* //addFilterEntitiesTrait<Todo,TodoFilter>() // no params uses remote filtering
|
|
35
|
+
* addFilterEntitiesTrait<Todo,TodoFilter>({filterFn: (filter, entity) => // local filtering
|
|
36
|
+
* filter?.content && entity.content?.includes(filter?.content) || false})
|
|
37
|
+
* // or use the following function to switch between remote search and local
|
|
38
|
+
* // depending on which properties have changed in the filter
|
|
39
|
+
* // isRemoteFilter: (previous, current) => previous?.someRemoteParam !== current?.someRemoteParam,
|
|
40
|
+
* )({
|
|
41
|
+
* actionsGroupKey: '[Todos]',
|
|
42
|
+
* featureSelector: createFeatureSelector<TestState>>(
|
|
43
|
+
* 'todos',
|
|
44
|
+
* ),
|
|
45
|
+
* });
|
|
46
|
+
* // will generate the following actions and selectors, plus the ones generated by other traits
|
|
47
|
+
* traits.actions.filterTodos()
|
|
48
|
+
* traits.selectors.selectTodosFilter()
|
|
49
|
+
*/
|
|
50
|
+
export function addFilterEntitiesTrait({ defaultDebounceTime = 400, defaultFilter, filterFn, isRemoteFilter, } = {}) {
|
|
51
|
+
return createTraitFactory({
|
|
52
|
+
key: filterEntitiesTraitKey,
|
|
53
|
+
depends: [entitiesPaginationTraitKey, loadEntitiesTraitKey],
|
|
54
|
+
config: {
|
|
55
|
+
defaultDebounceTime,
|
|
56
|
+
defaultFilter,
|
|
57
|
+
filterFn,
|
|
58
|
+
isRemoteFilter,
|
|
59
|
+
},
|
|
60
|
+
actions: ({ actionsGroupKey, entitiesName }) => createFilterTraitActions(actionsGroupKey, entitiesName),
|
|
61
|
+
selectors: () => createFilterTraitSelectors(),
|
|
62
|
+
mutators: () => createFilterTraitMutators(),
|
|
63
|
+
initialState: ({ previousInitialState, allConfigs, }) => createFilterInitialState(previousInitialState, allConfigs),
|
|
64
|
+
reducer: ({ initialState, allActions, allMutators }) => createFilterTraitReducer(initialState, allActions, allMutators),
|
|
65
|
+
effects: ({ allActions, allSelectors, allConfigs }) => createFilterTraitEffects(allActions, allSelectors, allConfigs),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=filter-entities.trait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-entities.trait.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/filter-entities/filter-entities.trait.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,0BAA0B,GAC3B,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAIL,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAGL,oBAAoB,GACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAO3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,UAAU,sBAAsB,CAAY,EAChD,mBAAmB,GAAG,GAAG,EACzB,aAAa,EACb,QAAQ,EACR,cAAc,MACqB,EAAE;IACrC,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,sBAAsB;QAC3B,OAAO,EAAE,CAAC,0BAA0B,EAAE,oBAAoB,CAAC;QAC3D,MAAM,EAAE;YACN,mBAAmB;YACnB,aAAa;YACb,QAAQ;YACR,cAAc;SACoB;QACpC,OAAO,EAAE,CAAC,EAAE,eAAe,EAAE,YAAY,EAA6B,EAAE,EAAE,CACxE,wBAAwB,CAAI,eAAe,EAAE,YAAY,CAAC;QAC5D,SAAS,EAAE,GAAG,EAAE,CAAC,0BAA0B,EAAa;QACxD,QAAQ,EAAE,GAAG,EAAE,CAAC,yBAAyB,EAAa;QACtD,YAAY,EAAE,CAAC,EACb,oBAAoB,EACpB,UAAU,GACqB,EAAE,EAAE,CACnC,wBAAwB,CACtB,oBAAoB,EACpB,UAAkD,CACnD;QACH,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,CACrD,wBAAwB,CACtB,YAAY,EACZ,UAAqE,EACrE,WAAW,CACZ;QACH,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,CACpD,wBAAwB,CACtB,UAE2B,EAC3B,YAC+B,EAC/B,UAAU,CACX;KACJ,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n EntitiesPaginationActions,\n entitiesPaginationTraitKey,\n} from '../entities-pagination/entities-pagination.model';\nimport { createFilterTraitEffects } from './filter-entities.trait.effect';\nimport {\n createFilterInitialState,\n createFilterTraitReducer,\n} from './filter-entities.trait.reducer';\nimport {\n FilterEntitiesConfig,\n FilterEntitiesKeyedConfig,\n FilterEntitiesSelectors,\n filterEntitiesTraitKey,\n} from './filter-entities.model';\nimport { createFilterTraitSelectors } from './filter-entities.trait.selectors';\nimport {\n LoadEntitiesActions,\n LoadEntitiesSelectors,\n loadEntitiesTraitKey,\n} from '../load-entities/load-entities.model';\nimport { createFilterTraitMutators } from './filter-entities.trait.mutators';\nimport { createTraitFactory } from '@ngrx-traits/core';\nimport { createFilterTraitActions } from './filter-entities.trait.actions';\nimport { ƟFilterEntitiesActions } from './filter-entities.model.internal';\nimport {\n TraitActionsFactoryConfig,\n TraitInitialStateFactoryConfig,\n} from '@ngrx-traits/core';\n\n/**\n * Generates the ngrx code needed to filter a list of entities locally or remotely, adds a filter\n * action and a selectFilter selector, the filter action is debounced and the filter will only\n * call the loadEntities action if the params have changed, so there is no need to implement that in\n * the components. The filter action has a `forceLoad` param which can\n * be use to skip that restriction for one call or setting the `defaultDebounceTime` to 0 for all calls.\n * Calling the filter action will also replace the `filters` param in the store, if the `patch` param is set\n * the filters are merged with the previous value in the store.\n * @param traitConfig - Config object fot the trait factory\n * @param traitConfig.defaultFilter - Initial value for the filter\n * @param traitConfig.filterFn - Function to filter entities in memory, if not present then its expected\n * is filtered by the backend unless isRemoteFilter is defned\n * @param traitConfig.defaultDebounceTime - Value in milliseconds. Default to 400ms\n * @param traitConfig.isRemoteFilter - Function to when it returns true it fires loadEntities so a remote\n * backend filtering can run, otherwise it uses filterFn to do a local filtering\n *\n * @example\n * // The following trait config\n *\n * export interface TestState\n * extends EntityAndStatusState<Todo>,FilterState<TodoFilter>{}\n *\n * const traits = createEntityFeatureFactory(\n * addLoadEntitiesTrait<Todo>(),\n * //addFilterEntitiesTrait<Todo,TodoFilter>() // no params uses remote filtering\n * addFilterEntitiesTrait<Todo,TodoFilter>({filterFn: (filter, entity) => // local filtering\n * filter?.content && entity.content?.includes(filter?.content) || false})\n * // or use the following function to switch between remote search and local\n * // depending on which properties have changed in the filter\n * // isRemoteFilter: (previous, current) => previous?.someRemoteParam !== current?.someRemoteParam,\n * )({\n * actionsGroupKey: '[Todos]',\n * featureSelector: createFeatureSelector<TestState>>(\n * 'todos',\n * ),\n * });\n * // will generate the following actions and selectors, plus the ones generated by other traits\n * traits.actions.filterTodos()\n * traits.selectors.selectTodosFilter()\n */\nexport function addFilterEntitiesTrait<Entity, F>({\n defaultDebounceTime = 400,\n defaultFilter,\n filterFn,\n isRemoteFilter,\n}: FilterEntitiesConfig<Entity, F> = {}) {\n return createTraitFactory({\n key: filterEntitiesTraitKey,\n depends: [entitiesPaginationTraitKey, loadEntitiesTraitKey],\n config: {\n defaultDebounceTime,\n defaultFilter,\n filterFn,\n isRemoteFilter,\n } as FilterEntitiesConfig<Entity, F>,\n actions: ({ actionsGroupKey, entitiesName }: TraitActionsFactoryConfig) =>\n createFilterTraitActions<F>(actionsGroupKey, entitiesName),\n selectors: () => createFilterTraitSelectors<Entity, F>(),\n mutators: () => createFilterTraitMutators<Entity, F>(),\n initialState: ({\n previousInitialState,\n allConfigs,\n }: TraitInitialStateFactoryConfig) =>\n createFilterInitialState<Entity, F>(\n previousInitialState,\n allConfigs as FilterEntitiesKeyedConfig<Entity, F>\n ),\n reducer: ({ initialState, allActions, allMutators }) =>\n createFilterTraitReducer(\n initialState,\n allActions as ƟFilterEntitiesActions<F> & LoadEntitiesActions<Entity>,\n allMutators\n ),\n effects: ({ allActions, allSelectors, allConfigs }) =>\n createFilterTraitEffects(\n allActions as ƟFilterEntitiesActions<F> &\n LoadEntitiesActions<Entity> &\n EntitiesPaginationActions,\n allSelectors as FilterEntitiesSelectors<Entity, F> &\n LoadEntitiesSelectors<Entity>,\n allConfigs\n ),\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-entities.trait.mutators.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/filter-entities/filter-entities.trait.mutators.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,yBAAyB;IAIvC,SAAS,kBAAkB,CAEzB,OAAU,EAAE,KAAQ;QACpB,uCACK,KAAK,KACR,OAAO,IACP;IACJ,CAAC;IACD,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAChC,CAAC","sourcesContent":["import {\n FilterEntitiesMutators,\n FilterEntitiesState,\n} from './filter-entities.model';\nimport { LoadEntitiesState } from '../load-entities';\n\nexport function createFilterTraitMutators<Entity, F>(): FilterEntitiesMutators<\n Entity,\n F\n> {\n function setEntitiesFilters<\n S extends LoadEntitiesState<Entity> & FilterEntitiesState<F>\n >(filters: F, state: S) {\n return {\n ...state,\n filters,\n };\n }\n return { setEntitiesFilters };\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createReducer, on } from '@ngrx/store';
|
|
2
|
+
export function createFilterInitialState(previousInitialState, allConfigs) {
|
|
3
|
+
var _a;
|
|
4
|
+
return Object.assign(Object.assign({}, previousInitialState), { filters: (_a = allConfigs === null || allConfigs === void 0 ? void 0 : allConfigs.filter) === null || _a === void 0 ? void 0 : _a.defaultFilter });
|
|
5
|
+
}
|
|
6
|
+
export function createFilterTraitReducer(initialState, allActions, allMutators) {
|
|
7
|
+
return createReducer(initialState, on(allActions.storeEntitiesFilter, (state, { filters }) => allMutators.setEntitiesFilters(filters, state)));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=filter-entities.trait.reducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-entities.trait.reducer.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/filter-entities/filter-entities.trait.reducer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAYhD,MAAM,UAAU,wBAAwB,CACtC,oBAAyB,EACzB,UAAgD;;IAEhD,uCACK,oBAAoB,KACvB,OAAO,EAAE,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,0CAAE,aAAa,IAC1C;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAKtC,YAAe,EACf,UAA8D,EAC9D,WAAyC;IAEzC,OAAO,aAAa,CAClB,YAAY,EACZ,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CACxD,WAAW,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAC/C,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { createReducer, on } from '@ngrx/store';\nimport {\n LoadEntitiesActions,\n LoadEntitiesState,\n} from '../load-entities/load-entities.model';\nimport {\n FilterEntitiesKeyedConfig,\n FilterEntitiesMutators,\n FilterEntitiesState,\n} from './filter-entities.model';\nimport { ƟFilterEntitiesActions } from './filter-entities.model.internal';\n\nexport function createFilterInitialState<Entity, F>(\n previousInitialState: any,\n allConfigs: FilterEntitiesKeyedConfig<Entity, F>\n): LoadEntitiesState<Entity> & FilterEntitiesState<F> {\n return {\n ...previousInitialState,\n filters: allConfigs?.filter?.defaultFilter,\n };\n}\n\nexport function createFilterTraitReducer<\n T,\n F,\n S extends LoadEntitiesState<T> & FilterEntitiesState<F>\n>(\n initialState: S,\n allActions: ƟFilterEntitiesActions<F> & LoadEntitiesActions<T>,\n allMutators: FilterEntitiesMutators<T, F>\n) {\n return createReducer(\n initialState,\n on(allActions.storeEntitiesFilter, (state, { filters }) =>\n allMutators.setEntitiesFilters(filters, state)\n )\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-entities.trait.selectors.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/filter-entities/filter-entities.trait.selectors.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,oBAAoB,CAClC,KAAyD;IAEzD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,0BAA0B;IAIxC,OAAO;QACL,oBAAoB;KACrB,CAAC;AACJ,CAAC","sourcesContent":["import {\n FilterEntitiesSelectors,\n FilterEntitiesState,\n} from './filter-entities.model';\nimport { LoadEntitiesState } from '../load-entities';\nexport function selectEntitiesFilter<Entity, F>(\n state: LoadEntitiesState<Entity> & FilterEntitiesState<F>\n) {\n return state.filters;\n}\n\nexport function createFilterTraitSelectors<\n Entity,\n F\n>(): FilterEntitiesSelectors<Entity, F> {\n return {\n selectEntitiesFilter,\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/filter-entities/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC","sourcesContent":["export * from './filter-entities.trait';\nexport * from './filter-entities.model';\n"]}
|
package/esm2015/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './load-entities';
|
|
2
|
+
export * from './filter-entities';
|
|
3
|
+
export * from './entities-pagination';
|
|
4
|
+
export * from './select-entities';
|
|
5
|
+
export * from './select-entity';
|
|
6
|
+
export * from './crud-entities';
|
|
7
|
+
export * from './sort-entities';
|
|
8
|
+
export * from './reset';
|
|
9
|
+
export * from './load-entity';
|
|
10
|
+
export * from './async-action';
|
|
11
|
+
export * from './set-entity';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/ngrx-traits/common/src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC","sourcesContent":["export * from './load-entities';\nexport * from './filter-entities';\nexport * from './entities-pagination';\nexport * from './select-entities';\nexport * from './select-entity';\nexport * from './crud-entities';\nexport * from './sort-entities';\nexport * from './reset';\nexport * from './load-entity';\nexport * from './async-action';\nexport * from './set-entity';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entities/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC","sourcesContent":["export * from './load-entities.model';\nexport * from './load-entities.trait';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entities.model.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entities/load-entities.model.ts"],"names":[],"mappings":"AA0FA,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC","sourcesContent":["import { Comparer, EntityAdapter, EntityState, IdSelector } from '@ngrx/entity';\n\nimport { ActionCreator, TypedAction } from '@ngrx/store/src/models';\nimport { Dictionary } from '@ngrx/entity/src/models';\nimport { KeyedConfig } from '@ngrx-traits/core';\n\nexport type Status = 'loading' | 'success' | 'fail';\n\nexport interface StatusState {\n status?: Status;\n}\n\nexport interface LoadEntitiesState<T> extends EntityState<T>, StatusState {}\n\nexport type LoadEntitiesActions<T> = {\n /**\n * load entities from backend\n */\n loadEntities: ActionCreator<string, () => TypedAction<string>>;\n /**\n * entities where loaded successfully\n */\n loadEntitiesSuccess: ActionCreator<\n string,\n (props: {\n entities: T[];\n total?: number;\n }) => { entities: T[]; total?: number } & TypedAction<string>\n >;\n /**\n * entities failed loading\n */\n loadEntitiesFail: ActionCreator<\n string,\n (props?: { error?: string }) => { error?: string } & TypedAction<string>\n >;\n};\n\nexport type LoadEntitiesSelectors<T> = {\n /**\n * returns all ids of the entities in an array\n * @param state\n */\n selectEntitiesIdsList: (state: LoadEntitiesState<T>) => string[] | number[];\n /**\n * returns all entities in a map with the id as key of the map\n * @param state\n */\n selectEntitiesMap: (state: LoadEntitiesState<T>) => Dictionary<T>;\n /**\n * returns all entities in an array\n * @param state\n */\n selectEntitiesList: (state: LoadEntitiesState<T>) => T[];\n /**\n * returns the total number of entities\n * @param state\n */\n selectEntitiesTotal: (state: LoadEntitiesState<T>) => number;\n /**\n * is currently loading entities\n * @param state\n */\n isEntitiesLoading: (state: LoadEntitiesState<T>) => boolean;\n /**\n * were the entities loaded successfully\n * @param state\n */\n isEntitiesLoadingSuccess: (state: LoadEntitiesState<T>) => boolean;\n /**\n * did the entities fail loading\n * @param state\n */\n isEntitiesLoadingFail: (state: LoadEntitiesState<T>) => boolean;\n};\n\nexport type LoadEntitiesMutators<T> = {\n /**\n * set or replace all entities currently in store\n * @param entities\n * @param state\n */\n setEntitiesList<S extends LoadEntitiesState<T>>(entities: T[], state: S): S;\n};\n\nexport type GenericActionCreator = ActionCreator<\n string,\n (...args: unknown[]) => TypedAction<string>\n>;\n\nexport const loadEntitiesTraitKey = 'loadEntities';\n\nexport type LoadEntitiesConfig<T = unknown> = {\n /**\n * Function that returns the id of an entity if not set it attempts to return the values\n * of a property call id, this is pass to @ngrx/entity EntityAdapter\n */\n selectId?: IdSelector<T>;\n /**\n * Default sort function for to @ngrx/entity EntityAdapter\n */\n sortComparer?: false | Comparer<T>;\n /**\n * @ngrx/entity EntityAdapter\n */\n adapter: EntityAdapter<T>;\n};\n\nexport type LoadEntitiesKeyedConfig<T> = KeyedConfig<\n typeof loadEntitiesTraitKey,\n LoadEntitiesConfig<T>\n>;\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function createLoadEntitiesTraitMutators(allConfigs) {
|
|
2
|
+
var _a;
|
|
3
|
+
const adapter = (_a = allConfigs === null || allConfigs === void 0 ? void 0 : allConfigs.loadEntities) === null || _a === void 0 ? void 0 : _a.adapter;
|
|
4
|
+
return {
|
|
5
|
+
setEntitiesList: adapter === null || adapter === void 0 ? void 0 : adapter.setAll,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=load-entities.mutators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entities.mutators.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entities/load-entities.mutators.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,+BAA+B,CAC7C,UAA2E;;IAE3E,MAAM,OAAO,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,YAAY,0CAAE,OAAO,CAAC;IAElD,OAAO;QACL,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM;KACD,CAAC;AACpC,CAAC","sourcesContent":["import {\n LoadEntitiesKeyedConfig,\n LoadEntitiesMutators,\n} from './load-entities.model';\nimport { EntitiesPaginationKeyedConfig } from '../entities-pagination';\n\nexport function createLoadEntitiesTraitMutators<Entity>(\n allConfigs: LoadEntitiesKeyedConfig<Entity> & EntitiesPaginationKeyedConfig\n) {\n const adapter = allConfigs?.loadEntities?.adapter;\n\n return {\n setEntitiesList: adapter?.setAll,\n } as LoadEntitiesMutators<Entity>;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createAction, props } from '@ngrx/store';
|
|
2
|
+
export function createLoadEntitiesTraitActions(actionsGroupKey, entitiesName) {
|
|
3
|
+
const actions = {
|
|
4
|
+
loadEntities: createAction(`${actionsGroupKey} Load ${entitiesName}`),
|
|
5
|
+
loadEntitiesSuccess: createAction(`${actionsGroupKey} Load ${entitiesName} Success`, props()),
|
|
6
|
+
loadEntitiesFail: createAction(`${actionsGroupKey} Load ${entitiesName} Fail`, (props) => ({ error: props === null || props === void 0 ? void 0 : props.error })),
|
|
7
|
+
};
|
|
8
|
+
return actions;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=load-entities.trait.actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entities.trait.actions.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entities/load-entities.trait.actions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,8BAA8B,CAC5C,eAAuB,EACvB,YAAoB;IAEpB,MAAM,OAAO,GAAG;QACd,YAAY,EAAE,YAAY,CAAC,GAAG,eAAe,SAAS,YAAY,EAAE,CAAC;QACrE,mBAAmB,EAAE,YAAY,CAC/B,GAAG,eAAe,SAAS,YAAY,UAAU,EACjD,KAAK,EAA0C,CAChD;QACD,gBAAgB,EAAE,YAAY,CAC5B,GAAG,eAAe,SAAS,YAAY,OAAO,EAC9C,CAAC,KAA0B,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,EAAE,CAAC,CAC1D;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { LoadEntitiesActions } from './load-entities.model';\nimport { createAction, props } from '@ngrx/store';\n\nexport function createLoadEntitiesTraitActions<Entity>(\n actionsGroupKey: string,\n entitiesName: string\n): LoadEntitiesActions<Entity> {\n const actions = {\n loadEntities: createAction(`${actionsGroupKey} Load ${entitiesName}`),\n loadEntitiesSuccess: createAction(\n `${actionsGroupKey} Load ${entitiesName} Success`,\n props<{ entities: Entity[]; total?: number }>()\n ),\n loadEntitiesFail: createAction(\n `${actionsGroupKey} Load ${entitiesName} Fail`,\n (props?: { error?: string }) => ({ error: props?.error })\n ),\n };\n\n return actions;\n}\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createLoadEntitiesInitialState, createLoadEntitiesTraitReducer, } from './load-entities.trait.reducer';
|
|
2
|
+
import { loadEntitiesTraitKey, } from './load-entities.model';
|
|
3
|
+
import { createLoadEntitiesTraitMutators } from './load-entities.mutators';
|
|
4
|
+
import { createTraitFactory } from '@ngrx-traits/core';
|
|
5
|
+
import { createEntityAdapter } from '@ngrx/entity';
|
|
6
|
+
import { createLoadEntitiesTraitActions } from './load-entities.trait.actions';
|
|
7
|
+
import { createLoadEntitiesTraitSelectors } from './load-entities.trait.selectors';
|
|
8
|
+
/**
|
|
9
|
+
* Generates the ngrx code needed to load a list of entities from the backend
|
|
10
|
+
* with a load[EntitiesName], load[EntitiesName]Success, load[EntitiesName]Fail actions, and selectors to query the
|
|
11
|
+
* entities like selectEntity[EntitiesName]List, selectEntity[EntitiesName]Ids, selectEntity[EntitiesName]Map, and its progress loading
|
|
12
|
+
* with isLoading[EntitiesName],isLoading[EntitiesName]Success, isLoading[EntitiesName]Fail. This trait is the base for all other traits related
|
|
13
|
+
* to a list of entities, the other will call loadEntities when needing data.
|
|
14
|
+
* @param traitConfig - Config object fot the trait factory
|
|
15
|
+
* @param traitConfig.selectId - Function that returns the id of an entity
|
|
16
|
+
* @param traitConfig.sortComparer - Default sort function for to @ngrx/entity EntityAdapter
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // The following trait config
|
|
20
|
+
*
|
|
21
|
+
* export interface TestState
|
|
22
|
+
* extends LoadEntitiesState<Todo>{}
|
|
23
|
+
*
|
|
24
|
+
* const traits = createEntityFeatureFactory(
|
|
25
|
+
* {entityName: 'Todo'},
|
|
26
|
+
* addLoadEntitiesTrait<Todo>(),
|
|
27
|
+
* )({
|
|
28
|
+
* actionsGroupKey: '[Todos]',
|
|
29
|
+
* featureSelector: createFeatureSelector<TestState>>(
|
|
30
|
+
* 'todos',
|
|
31
|
+
* ),
|
|
32
|
+
* });
|
|
33
|
+
* // will generate the actions and selectors
|
|
34
|
+
* traits.actions.loadTodos()
|
|
35
|
+
* traits.actions.loadTodosSuccess({entities: todos})
|
|
36
|
+
* traits.actions.loadTodosFail();
|
|
37
|
+
* traits.selectors.selectTodosList
|
|
38
|
+
* traits.selectors.selectTodosMap
|
|
39
|
+
* traits.selectors.selectTodosIds
|
|
40
|
+
* traits.selectors.selectTodosTotal
|
|
41
|
+
* traits.selectors.isLoadingTodos
|
|
42
|
+
* traits.selectors.isSuccessTodosSuccess
|
|
43
|
+
* traits.selectors.isFailTodosFail
|
|
44
|
+
*/
|
|
45
|
+
export function addLoadEntitiesTrait(traitConfig) {
|
|
46
|
+
const adapter = createEntityAdapter(traitConfig);
|
|
47
|
+
return createTraitFactory({
|
|
48
|
+
key: loadEntitiesTraitKey,
|
|
49
|
+
config: Object.assign(Object.assign({}, traitConfig), { adapter }),
|
|
50
|
+
actions: ({ actionsGroupKey, entitiesName }) => createLoadEntitiesTraitActions(actionsGroupKey, entitiesName),
|
|
51
|
+
selectors: ({ allConfigs }) => createLoadEntitiesTraitSelectors(allConfigs),
|
|
52
|
+
mutators: ({ allConfigs }) => createLoadEntitiesTraitMutators(allConfigs),
|
|
53
|
+
initialState: ({ previousInitialState, allConfigs, }) => createLoadEntitiesInitialState(previousInitialState, allConfigs),
|
|
54
|
+
reducer: ({ initialState, allActions, allMutators, allConfigs }) => createLoadEntitiesTraitReducer(initialState, allActions, allMutators, allConfigs),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=load-entities.trait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entities.trait.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entities/load-entities.trait.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAIL,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAiB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAyD;IAEzD,MAAM,OAAO,GAA0B,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAExE,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,oBAAoB;QACzB,MAAM,EAAE,gCAAK,WAAW,KAAE,OAAO,GAAgC;QACjE,OAAO,EAAE,CAAC,EAAE,eAAe,EAAE,YAAY,EAA6B,EAAE,EAAE,CACxE,8BAA8B,CAAS,eAAe,EAAE,YAAY,CAAC;QACvE,SAAS,EAAE,CAAC,EAAE,UAAU,EAA+B,EAAE,EAAE,CACzD,gCAAgC,CAC9B,UAC+B,CAChC;QACH,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAmC,EAAE,EAAE,CAC5D,+BAA+B,CAC7B,UAC+B,CAChC;QACH,YAAY,EAAE,CAAC,EACb,oBAAoB,EACpB,UAAU,GACqB,EAAE,EAAE,CACnC,8BAA8B,CAAS,oBAAoB,EAAE,UAAU,CAAC;QAC1E,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CACjE,8BAA8B,CAC5B,YAAY,EACZ,UAAU,EACV,WAAW,EACX,UAC+B,CAChC;KACJ,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n createLoadEntitiesInitialState,\n createLoadEntitiesTraitReducer,\n} from './load-entities.trait.reducer';\nimport {\n LoadEntitiesState,\n LoadEntitiesConfig,\n LoadEntitiesKeyedConfig,\n loadEntitiesTraitKey,\n} from './load-entities.model';\nimport {\n TraitActionsFactoryConfig,\n TraitInitialStateFactoryConfig,\n TraitSelectorsFactoryConfig,\n TraitStateMutatorsFactoryConfig,\n} from '@ngrx-traits/core';\nimport { EntitiesPaginationKeyedConfig } from '../entities-pagination';\nimport { createLoadEntitiesTraitMutators } from './load-entities.mutators';\nimport { createTraitFactory } from '@ngrx-traits/core';\nimport { createEntityAdapter, EntityAdapter } from '@ngrx/entity';\nimport { createLoadEntitiesTraitActions } from './load-entities.trait.actions';\nimport { createLoadEntitiesTraitSelectors } from './load-entities.trait.selectors';\n\n/**\n * Generates the ngrx code needed to load a list of entities from the backend\n * with a load[EntitiesName], load[EntitiesName]Success, load[EntitiesName]Fail actions, and selectors to query the\n * entities like selectEntity[EntitiesName]List, selectEntity[EntitiesName]Ids, selectEntity[EntitiesName]Map, and its progress loading\n * with isLoading[EntitiesName],isLoading[EntitiesName]Success, isLoading[EntitiesName]Fail. This trait is the base for all other traits related\n * to a list of entities, the other will call loadEntities when needing data.\n * @param traitConfig - Config object fot the trait factory\n * @param traitConfig.selectId - Function that returns the id of an entity\n * @param traitConfig.sortComparer - Default sort function for to @ngrx/entity EntityAdapter\n *\n * @example\n * // The following trait config\n *\n * export interface TestState\n * extends LoadEntitiesState<Todo>{}\n *\n * const traits = createEntityFeatureFactory(\n * {entityName: 'Todo'},\n * addLoadEntitiesTrait<Todo>(),\n * )({\n * actionsGroupKey: '[Todos]',\n * featureSelector: createFeatureSelector<TestState>>(\n * 'todos',\n * ),\n * });\n * // will generate the actions and selectors\n * traits.actions.loadTodos()\n * traits.actions.loadTodosSuccess({entities: todos})\n * traits.actions.loadTodosFail();\n * traits.selectors.selectTodosList\n * traits.selectors.selectTodosMap\n * traits.selectors.selectTodosIds\n * traits.selectors.selectTodosTotal\n * traits.selectors.isLoadingTodos\n * traits.selectors.isSuccessTodosSuccess\n * traits.selectors.isFailTodosFail\n */\nexport function addLoadEntitiesTrait<Entity>(\n traitConfig?: Omit<LoadEntitiesConfig<Entity>, 'adapter'>\n) {\n const adapter: EntityAdapter<Entity> = createEntityAdapter(traitConfig);\n\n return createTraitFactory({\n key: loadEntitiesTraitKey,\n config: { ...traitConfig, adapter } as LoadEntitiesConfig<Entity>,\n actions: ({ actionsGroupKey, entitiesName }: TraitActionsFactoryConfig) =>\n createLoadEntitiesTraitActions<Entity>(actionsGroupKey, entitiesName),\n selectors: ({ allConfigs }: TraitSelectorsFactoryConfig) =>\n createLoadEntitiesTraitSelectors<Entity>(\n allConfigs as LoadEntitiesKeyedConfig<Entity> &\n EntitiesPaginationKeyedConfig\n ),\n mutators: ({ allConfigs }: TraitStateMutatorsFactoryConfig) =>\n createLoadEntitiesTraitMutators<Entity>(\n allConfigs as LoadEntitiesKeyedConfig<Entity> &\n EntitiesPaginationKeyedConfig\n ),\n initialState: ({\n previousInitialState,\n allConfigs,\n }: TraitInitialStateFactoryConfig) =>\n createLoadEntitiesInitialState<Entity>(previousInitialState, allConfigs),\n reducer: ({ initialState, allActions, allMutators, allConfigs }) =>\n createLoadEntitiesTraitReducer<Entity, LoadEntitiesState<Entity>>(\n initialState,\n allActions,\n allMutators,\n allConfigs as LoadEntitiesKeyedConfig<Entity> &\n EntitiesPaginationKeyedConfig\n ),\n });\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createReducer, on } from '@ngrx/store';
|
|
2
|
+
import { insertIf } from '@ngrx-traits/core';
|
|
3
|
+
export function createLoadEntitiesInitialState(previousInitialState = {}, allConfigs) {
|
|
4
|
+
const traitConfig = allConfigs.loadEntities;
|
|
5
|
+
const adapter = traitConfig.adapter;
|
|
6
|
+
return Object.assign(Object.assign(Object.assign({}, previousInitialState), adapter.getInitialState()), { status: undefined });
|
|
7
|
+
}
|
|
8
|
+
export function createLoadEntitiesTraitReducer(initialState, actions, allMutators, allConfigs) {
|
|
9
|
+
const handleEntitiesMerge = !(allConfigs === null || allConfigs === void 0 ? void 0 : allConfigs.pagination);
|
|
10
|
+
return createReducer(initialState, on(actions.loadEntities, (state) => (Object.assign(Object.assign({}, state), { status: 'loading' }))), on(actions.loadEntitiesFail, (state) => (Object.assign(Object.assign({}, state), { status: 'fail' }))), on(actions.loadEntitiesSuccess, (state) => (Object.assign(Object.assign({}, state), { status: 'success' }))), ...insertIf(handleEntitiesMerge, () => on(actions.loadEntitiesSuccess, (state, { entities }) => allMutators.setEntitiesList(entities, Object.assign({}, state)))));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=load-entities.trait.reducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entities.trait.reducer.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entities/load-entities.trait.reducer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,UAAU,8BAA8B,CAC5C,oBAAoB,GAAG,EAAE,EACzB,UAA2C;IAE3C,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC;IAC5C,MAAM,OAAO,GAAG,WAAY,CAAC,OAAO,CAAC;IAErC,qDACK,oBAAoB,GACpB,OAAQ,CAAC,eAAe,EAAE,KAC7B,MAAM,EAAE,SAAS,IACjB;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAI5C,YAAe,EACf,OAA+B,EAC/B,WAAoC,EACpC,UAAsE;IAEtE,MAAM,mBAAmB,GAAG,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,CAAA,CAAC;IAEpD,OAAO,aAAa,CAClB,YAAY,EACZ,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iCAC/B,KAAK,KACR,MAAM,EAAE,SAAS,IACjB,CAAC,EACH,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iCACnC,KAAK,KACR,MAAM,EAAE,MAAM,IACd,CAAC,EACH,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iCACtC,KAAK,KACR,MAAM,EAAE,SAAS,IACjB,CAAC,EACH,GAAG,QAAQ,CAAI,mBAAmB,EAAE,GAAG,EAAE,CACvC,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CACtD,WAAW,CAAC,eAAe,CAAC,QAAQ,oBAC/B,KAAK,EACR,CACH,CACF,CACF,CAAC;AACJ,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport {\n LoadEntitiesState,\n LoadEntitiesActions,\n LoadEntitiesKeyedConfig,\n LoadEntitiesMutators,\n} from './load-entities.model';\nimport { createReducer, on } from '@ngrx/store';\nimport { EntitiesPaginationKeyedConfig } from '../entities-pagination';\nimport { insertIf } from '@ngrx-traits/core';\n\nexport function createLoadEntitiesInitialState<Entity>(\n previousInitialState = {},\n allConfigs: LoadEntitiesKeyedConfig<Entity>\n): LoadEntitiesState<Entity> {\n const traitConfig = allConfigs.loadEntities;\n const adapter = traitConfig!.adapter;\n\n return {\n ...previousInitialState,\n ...adapter!.getInitialState(),\n status: undefined,\n };\n}\n\nexport function createLoadEntitiesTraitReducer<\n T,\n S extends LoadEntitiesState<T>\n>(\n initialState: S,\n actions: LoadEntitiesActions<T>,\n allMutators: LoadEntitiesMutators<T>,\n allConfigs: LoadEntitiesKeyedConfig<T> & EntitiesPaginationKeyedConfig\n) {\n const handleEntitiesMerge = !allConfigs?.pagination;\n\n return createReducer(\n initialState,\n on(actions.loadEntities, (state) => ({\n ...state,\n status: 'loading',\n })),\n on(actions.loadEntitiesFail, (state) => ({\n ...state,\n status: 'fail',\n })),\n on(actions.loadEntitiesSuccess, (state) => ({\n ...state,\n status: 'success',\n })),\n ...insertIf<S>(handleEntitiesMerge, () =>\n on(actions.loadEntitiesSuccess, (state, { entities }) =>\n allMutators.setEntitiesList(entities, {\n ...state,\n })\n )\n )\n );\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { isFail, isLoading, isSuccess } from './load-entities.utils';
|
|
2
|
+
import { createSelector } from '@ngrx/store';
|
|
3
|
+
import { selectEntitiesFilter } from '../filter-entities/filter-entities.trait.selectors';
|
|
4
|
+
export function createLoadEntitiesTraitSelectors(allConfigs) {
|
|
5
|
+
var _a, _b;
|
|
6
|
+
const adapter = (_a = allConfigs === null || allConfigs === void 0 ? void 0 : allConfigs.loadEntities) === null || _a === void 0 ? void 0 : _a.adapter;
|
|
7
|
+
const entitySelectors = adapter.getSelectors();
|
|
8
|
+
const filterFunction = (_b = allConfigs === null || allConfigs === void 0 ? void 0 : allConfigs.filter) === null || _b === void 0 ? void 0 : _b.filterFn;
|
|
9
|
+
let selectors = {
|
|
10
|
+
selectEntitiesList: entitySelectors.selectAll,
|
|
11
|
+
selectEntitiesMap: entitySelectors.selectEntities,
|
|
12
|
+
selectEntitiesIdsList: entitySelectors.selectIds,
|
|
13
|
+
selectEntitiesTotal: entitySelectors.selectTotal,
|
|
14
|
+
isEntitiesLoadingFail: isFail,
|
|
15
|
+
isEntitiesLoading: isLoading,
|
|
16
|
+
isEntitiesLoadingSuccess: isSuccess,
|
|
17
|
+
};
|
|
18
|
+
if (filterFunction && entitySelectors) {
|
|
19
|
+
const selectEntitiesList = createSelector(entitySelectors.selectAll, selectEntitiesFilter, (entities, filters) => filters ? entities.filter((e) => filterFunction(filters, e)) : entities);
|
|
20
|
+
selectors = Object.assign(Object.assign({}, selectors), { selectEntitiesList, selectEntitiesMap: createSelector(selectors.selectEntitiesMap, selectEntitiesFilter, (entities, filters) => {
|
|
21
|
+
const result = {};
|
|
22
|
+
for (const id in entities) {
|
|
23
|
+
const e = entities[id];
|
|
24
|
+
if (filterFunction(filters, e)) {
|
|
25
|
+
result[id] = e;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}), selectEntitiesTotal: createSelector(selectEntitiesList, (entities) => entities.length), selectEntitiesIdsList: createSelector(selectEntitiesList, (entities) => entities.map((e) => adapter === null || adapter === void 0 ? void 0 : adapter.selectId(e))) });
|
|
30
|
+
}
|
|
31
|
+
return selectors;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=load-entities.trait.selectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entities.trait.selectors.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entities/load-entities.trait.selectors.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAE1F,MAAM,UAAU,gCAAgC,CAC9C,UAC4C;;IAE5C,MAAM,OAAO,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,YAAY,0CAAE,OAAO,CAAC;IAClD,MAAM,eAAe,GAAG,OAAQ,CAAC,YAAY,EAAE,CAAC;IAEhD,MAAM,cAAc,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,0CAAE,QAAQ,CAAC;IACpD,IAAI,SAAS,GAAkC;QAC7C,kBAAkB,EAAE,eAAe,CAAC,SAAS;QAC7C,iBAAiB,EAAE,eAAe,CAAC,cAAc;QACjD,qBAAqB,EAAE,eAAe,CAAC,SAAS;QAChD,mBAAmB,EAAE,eAAe,CAAC,WAAW;QAChD,qBAAqB,EAAE,MAAM;QAC7B,iBAAiB,EAAE,SAAS;QAC5B,wBAAwB,EAAE,SAAS;KACpC,CAAC;IACF,IAAI,cAAc,IAAI,eAAe,EAAE;QACrC,MAAM,kBAAkB,GAAG,cAAc,CACvC,eAAe,CAAC,SAAS,EACzB,oBAAoB,EACpB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CACpB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAC1E,CAAC;QAEF,SAAS,mCACJ,SAAS,KACZ,kBAAkB,EAClB,iBAAiB,EAAE,cAAc,CAC/B,SAAS,CAAC,iBAAiB,EAC3B,oBAAoB,EACpB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;gBACpB,MAAM,MAAM,GAAuB,EAAE,CAAC;gBACtC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE;oBACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACvB,IAAI,cAAc,CAAC,OAAO,EAAE,CAAE,CAAC,EAAE;wBAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;qBAChB;iBACF;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,CACF,EACD,mBAAmB,EAAE,cAAc,CACjC,kBAAkB,EAClB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAC9B,EACD,qBAAqB,EAAE,cAAc,CACnC,kBAAkB,EAClB,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAC,CAAC,CAAC,CAAwB,CACnE,GACF,CAAC;KACH;IACD,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import { Dictionary } from '@ngrx/entity';\nimport {\n LoadEntitiesKeyedConfig,\n LoadEntitiesSelectors,\n} from './load-entities.model';\nimport { FilterEntitiesKeyedConfig } from '../filter-entities';\nimport { isFail, isLoading, isSuccess } from './load-entities.utils';\nimport { createSelector } from '@ngrx/store';\nimport { selectEntitiesFilter } from '../filter-entities/filter-entities.trait.selectors';\n\nexport function createLoadEntitiesTraitSelectors<Entity>(\n allConfigs?: LoadEntitiesKeyedConfig<Entity> &\n FilterEntitiesKeyedConfig<Entity, unknown>\n) {\n const adapter = allConfigs?.loadEntities?.adapter;\n const entitySelectors = adapter!.getSelectors();\n\n const filterFunction = allConfigs?.filter?.filterFn;\n let selectors: LoadEntitiesSelectors<Entity> = {\n selectEntitiesList: entitySelectors.selectAll,\n selectEntitiesMap: entitySelectors.selectEntities,\n selectEntitiesIdsList: entitySelectors.selectIds,\n selectEntitiesTotal: entitySelectors.selectTotal,\n isEntitiesLoadingFail: isFail,\n isEntitiesLoading: isLoading,\n isEntitiesLoadingSuccess: isSuccess,\n };\n if (filterFunction && entitySelectors) {\n const selectEntitiesList = createSelector(\n entitySelectors.selectAll,\n selectEntitiesFilter,\n (entities, filters) =>\n filters ? entities.filter((e) => filterFunction(filters, e)) : entities\n );\n\n selectors = {\n ...selectors,\n selectEntitiesList,\n selectEntitiesMap: createSelector(\n selectors.selectEntitiesMap,\n selectEntitiesFilter,\n (entities, filters) => {\n const result: Dictionary<Entity> = {};\n for (const id in entities) {\n const e = entities[id];\n if (filterFunction(filters, e!)) {\n result[id] = e;\n }\n }\n return result;\n }\n ),\n selectEntitiesTotal: createSelector(\n selectEntitiesList,\n (entities) => entities.length\n ),\n selectEntitiesIdsList: createSelector(\n selectEntitiesList,\n (entities) =>\n entities.map((e) => adapter?.selectId(e)) as string[] | number[]\n ),\n };\n }\n return selectors;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function isLoading(state) {
|
|
2
|
+
return state.status === 'loading';
|
|
3
|
+
}
|
|
4
|
+
export function isSuccess(state) {
|
|
5
|
+
return state.status === 'success';
|
|
6
|
+
}
|
|
7
|
+
export function isFail(state) {
|
|
8
|
+
return state.status === 'fail';
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=load-entities.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entities.utils.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entities/load-entities.utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAwB,KAAQ;IACvD,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;AACpC,CAAC;AACD,MAAM,UAAU,SAAS,CAAwB,KAAQ;IACvD,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;AACpC,CAAC;AACD,MAAM,UAAU,MAAM,CAAwB,KAAQ;IACpD,OAAO,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC;AACjC,CAAC","sourcesContent":["import { StatusState } from './load-entities.model';\n\nexport function isLoading<S extends StatusState>(state: S) {\n return state.status === 'loading';\n}\nexport function isSuccess<S extends StatusState>(state: S) {\n return state.status === 'success';\n}\nexport function isFail<S extends StatusState>(state: S) {\n return state.status === 'fail';\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entity/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC","sourcesContent":["export * from './load-entity.traits';\nexport * from './load-entity.model';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entity.model.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entity/load-entity.model.ts"],"names":[],"mappings":"","sourcesContent":["import { PostfixProps, PrefixProps, TraitActions } from '@ngrx-traits/core';\nimport {\n AsyncActionActions,\n AsyncActionState,\n} from '../async-action/async-action.model';\n\nexport type LoadEntityActions<\n J extends string,\n Request extends object,\n Response extends object,\n Failure extends object\n> = PrefixProps<AsyncActionActions<Request, Response, Failure, J>, 'load'> &\n TraitActions;\n\nexport type LoadEntityState<\n T,\n J extends string\n> = AsyncActionState<`load${Capitalize<J & string>}`> &\n PrefixProps<{ ''?: T }, J>;\n\nexport type LoadEntitySelectors<T, J extends string> = PostfixProps<\n {\n select: (state: LoadEntityState<T, J>) => T;\n },\n J\n>;\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { capitalize, createTraitFactory } from '@ngrx-traits/core';
|
|
2
|
+
import { createReducer, on } from '@ngrx/store';
|
|
3
|
+
import { addAsyncActionTrait } from '../async-action/async-action.trait';
|
|
4
|
+
/**
|
|
5
|
+
* Generates ngrx code needed to load and entity and store it in a state
|
|
6
|
+
* @param entityName - Entity name, should be in camel case
|
|
7
|
+
* @param options.actionProps - Optional param for the main request action,
|
|
8
|
+
* use the props() function for its value, if not present action will have no params,
|
|
9
|
+
* @param options.actionSuccessProps - Optional param for the request success
|
|
10
|
+
* action, use the props() function for its value, if not present action success will have no params
|
|
11
|
+
* @param options.actionFailProps - Optional param for the request fail action,
|
|
12
|
+
* use the props() function for its value, if not present action fail will have no params
|
|
13
|
+
* @returns the trait factory
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const traits = createEntityFeatureFactory(
|
|
17
|
+
* ...addLoadEntityTraits({
|
|
18
|
+
* entityName: 'client',
|
|
19
|
+
* requestProps: props<{ id: string }>(),
|
|
20
|
+
* responseProps: props<{ client: Client }>(),
|
|
21
|
+
* }),
|
|
22
|
+
* )({
|
|
23
|
+
* actionsGroupKey: 'Client',
|
|
24
|
+
* featureSelector: createFeatureSelector<
|
|
25
|
+
* LoadEntityState<Client, 'client'>
|
|
26
|
+
* >('client'),
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // will generate
|
|
30
|
+
* traits.actions.loadClient({id:123});
|
|
31
|
+
* traits.actions.loadClientSuccess({client: {id: '123', name: 'gabs'}});
|
|
32
|
+
* traits.actions.loadClientFail();
|
|
33
|
+
* traits.selectors.selectClient
|
|
34
|
+
* traits.selectors.isLoadingLoadClient
|
|
35
|
+
* traits.selectors.isSuccessLoadClient
|
|
36
|
+
* traits.selectors.isFailLoadClient
|
|
37
|
+
*/
|
|
38
|
+
export function addLoadEntityTraits({ entityName, actionProps, actionSuccessProps, actionFailProps, }) {
|
|
39
|
+
const capitalizedName = capitalize(entityName);
|
|
40
|
+
return [
|
|
41
|
+
addAsyncActionTrait({
|
|
42
|
+
name: ('load' + capitalizedName),
|
|
43
|
+
actionProps,
|
|
44
|
+
actionSuccessProps,
|
|
45
|
+
actionFailProps,
|
|
46
|
+
}),
|
|
47
|
+
createTraitFactory({
|
|
48
|
+
key: `load${capitalizedName}`,
|
|
49
|
+
config: { entityName, actionProps, actionSuccessProps, actionFailProps },
|
|
50
|
+
selectors: () => {
|
|
51
|
+
function selectEntity(state) {
|
|
52
|
+
return state[`${entityName}`];
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
[`select${capitalizedName}`]: selectEntity,
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
initialState: ({ previousInitialState, }) => previousInitialState,
|
|
59
|
+
reducer: ({ initialState, allActions }) => {
|
|
60
|
+
return createReducer(initialState, on(allActions[`load${capitalizedName}Success`], (state, action) => (Object.assign(Object.assign({}, state), { [entityName]: action[entityName] }))));
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=load-entity.traits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-entity.traits.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/load-entity/load-entity.traits.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAMzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,mBAAmB,CAOjC,EACA,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,GAMhB;IACC,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAI/C,OAAO;QACL,mBAAmB,CAAgC;YACjD,IAAI,EAAE,CAAC,MAAM,GAAG,eAAe,CAAM;YACrC,WAAW;YACX,kBAAkB;YAClB,eAAe;SAChB,CAAC;QACF,kBAAkB,CAAC;YACjB,GAAG,EAAE,OAAO,eAAe,EAAE;YAC7B,MAAM,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE;YACxE,SAAS,EAAE,GAAG,EAAE;gBACd,SAAS,YAAY,CAAC,KAAY;oBAChC,OAAQ,KAAa,CAAC,GAAG,UAAU,EAAE,CAAW,CAAC;gBACnD,CAAC;gBAED,OAAO;oBACL,CAAC,SAAS,eAAe,EAAE,CAAC,EAAE,YAAY;iBACT,CAAC;YACtC,CAAC;YACD,YAAY,EAAE,CAAC,EACb,oBAAoB,GACW,EAAE,EAAE,CAAC,oBAA6B;YACnE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE;gBACxC,OAAO,aAAa,CAClB,YAAY,EACZ,EAAE,CACC,UAAkB,CAAC,OAAO,eAAe,SAAS,CAAC,EACpD,CAAC,KAAU,EAAE,MAAW,EAAE,EAAE,CAAC,iCACxB,KAAK,KACR,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,IAChC,CACH,CACF,CAAC;YACJ,CAAC;SACF,CAAC;KACM,CAAC;AACb,CAAC","sourcesContent":["import { ActionCreatorProps } from '@ngrx/store/src/models';\nimport { capitalize, createTraitFactory } from '@ngrx-traits/core';\nimport { createReducer, on } from '@ngrx/store';\n\nimport { addAsyncActionTrait } from '../async-action/async-action.trait';\nimport { LoadEntitySelectors, LoadEntityState } from './load-entity.model';\nimport { TraitInitialStateFactoryConfig } from '@ngrx-traits/core';\n\ntype RecordEntity<T> = T extends Record<string, infer J> ? J : never;\n\n/**\n * Generates ngrx code needed to load and entity and store it in a state\n * @param entityName - Entity name, should be in camel case\n * @param options.actionProps - Optional param for the main request action,\n * use the props() function for its value, if not present action will have no params,\n * @param options.actionSuccessProps - Optional param for the request success\n * action, use the props() function for its value, if not present action success will have no params\n * @param options.actionFailProps - Optional param for the request fail action,\n * use the props() function for its value, if not present action fail will have no params\n * @returns the trait factory\n *\n * @example\n * const traits = createEntityFeatureFactory(\n * ...addLoadEntityTraits({\n * entityName: 'client',\n * requestProps: props<{ id: string }>(),\n * responseProps: props<{ client: Client }>(),\n * }),\n * )({\n * actionsGroupKey: 'Client',\n * featureSelector: createFeatureSelector<\n * LoadEntityState<Client, 'client'>\n * >('client'),\n * });\n *\n * // will generate\n * traits.actions.loadClient({id:123});\n * traits.actions.loadClientSuccess({client: {id: '123', name: 'gabs'}});\n * traits.actions.loadClientFail();\n * traits.selectors.selectClient\n * traits.selectors.isLoadingLoadClient\n * traits.selectors.isSuccessLoadClient\n * traits.selectors.isFailLoadClient\n */\nexport function addLoadEntityTraits<\n J extends string,\n Request extends object | undefined = undefined,\n Response extends Record<J, any> | undefined = undefined,\n Failure extends object | undefined = undefined,\n Entity = RecordEntity<Response>,\n State = LoadEntityState<Entity, J>\n>({\n entityName,\n actionProps,\n actionSuccessProps,\n actionFailProps,\n}: {\n entityName: J;\n actionProps?: ActionCreatorProps<Request>;\n actionSuccessProps?: ActionCreatorProps<Response>;\n actionFailProps?: ActionCreatorProps<Failure>;\n}) {\n const capitalizedName = capitalize(entityName);\n\n type K = `load${Capitalize<J & string>}`;\n\n return [\n addAsyncActionTrait<K, Request, Response, Failure>({\n name: ('load' + capitalizedName) as K,\n actionProps,\n actionSuccessProps,\n actionFailProps,\n }),\n createTraitFactory({\n key: `load${capitalizedName}`,\n config: { entityName, actionProps, actionSuccessProps, actionFailProps },\n selectors: () => {\n function selectEntity(state: State) {\n return (state as any)[`${entityName}`] as Entity;\n }\n\n return {\n [`select${capitalizedName}`]: selectEntity,\n } as LoadEntitySelectors<Entity, J>;\n },\n initialState: ({\n previousInitialState,\n }: TraitInitialStateFactoryConfig) => previousInitialState as State,\n reducer: ({ initialState, allActions }) => {\n return createReducer(\n initialState,\n on(\n (allActions as any)[`load${capitalizedName}Success`],\n (state: any, action: any) => ({\n ...state,\n [entityName]: action[entityName],\n })\n )\n );\n },\n }),\n ] as const;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngrx-traits-common.js","sourceRoot":"","sources":["../../../../../libs/ngrx-traits/common/src/lib/ngrx-traits-common.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC","sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public_api.js","sourceRoot":"","sources":["../../../../../libs/ngrx-traits/common/src/lib/public_api.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC","sourcesContent":["export * from './index';\n"]}
|