@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,35 @@
|
|
|
1
|
+
import { CrudEntitiesActions, CrudEntitiesConfig } from './crud-entities.model';
|
|
2
|
+
/**
|
|
3
|
+
* Generates ngrx code to add, remove update, upsert entities on a list, it also
|
|
4
|
+
* tracks the changes made, helpful for implementing batch updates. The `storeChanges` (false by default),
|
|
5
|
+
* will store for add and update the changed entity props in the property `entityChanges` of the `Change` object.
|
|
6
|
+
* @param config
|
|
7
|
+
* @param config.storeChanges - Will store the changes made, default fals
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // The following trait config
|
|
11
|
+
*
|
|
12
|
+
* export interface TestState
|
|
13
|
+
* extends EntityAndStatusState<Todo>, CrudState<Todo>{}
|
|
14
|
+
*
|
|
15
|
+
* const traits = createEntityFeatureFactory(
|
|
16
|
+
* addLoadEntitiesTrait<Todo>(),
|
|
17
|
+
* addCrudEntitiesTrait<Todo>()
|
|
18
|
+
* )({
|
|
19
|
+
* actionsGroupKey: '[Todos]',
|
|
20
|
+
* featureSelector: createFeatureSelector<TestState>>(
|
|
21
|
+
* 'todos',
|
|
22
|
+
* ),
|
|
23
|
+
* });
|
|
24
|
+
* // will generate the following actions and selectors, plus the ones generated by other traits
|
|
25
|
+
* traits.actions.addTodos(entity1,entity2...)
|
|
26
|
+
* traits.actions.updateTodos({id: id1, changes:{prop1}},{id: id2, changes:{prop2}} ...)
|
|
27
|
+
* traits.actions.upsertTodos(entity1,entity2...)
|
|
28
|
+
* traits.actions.removeAllTodos()
|
|
29
|
+
* traits.actions.clearTodosChanges()
|
|
30
|
+
*
|
|
31
|
+
* traits.selectors.selectTodosChangesList()
|
|
32
|
+
* traits.selectors.selectFilteredTodosChangesList()
|
|
33
|
+
* traits.selectors.selectAllFilteredChanges()
|
|
34
|
+
*/
|
|
35
|
+
export declare function addCrudEntitiesTrait<Entity>({ storeChanges, }?: CrudEntitiesConfig): import("@ngrx-traits/core").TraitFactory<import("../load-entities/load-entities.model").LoadEntitiesState<Entity> & import("./crud-entities.model").CrudEntitiesState<Entity>, CrudEntitiesActions<Entity>, import("./crud-entities.model").CrudEntitiesSelectors<Entity>, import("./crud-entities.model").CrudEntitiesMutators<Entity>, "crud", CrudEntitiesConfig, import("@ngrx-traits/core").AllTraitConfigs>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { CrudEntitiesKeyedConfig, CrudEntitiesMutators } from './crud-entities.model';
|
|
2
|
+
import { LoadEntitiesKeyedConfig } from '../load-entities/load-entities.model';
|
|
3
|
+
export declare function createCrudTraitMutators<Entity>(allConfigs: CrudEntitiesKeyedConfig & LoadEntitiesKeyedConfig<Entity>): CrudEntitiesMutators<Entity>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FilterEntitiesActions, FilterEntitiesKeyedConfig } from '../filter-entities/filter-entities.model';
|
|
2
|
+
import { CrudEntitiesActions, CrudEntitiesKeyedConfig, CrudEntitiesMutators, CrudEntitiesState } from './crud-entities.model';
|
|
3
|
+
import { LoadEntitiesActions, LoadEntitiesKeyedConfig, LoadEntitiesState } from '../load-entities';
|
|
4
|
+
import { SortEntitiesActions, SortEntitiesKeyedConfig } from '../sort-entities';
|
|
5
|
+
import { EntitiesPaginationActions, EntitiesPaginationKeyedConfig } from '../entities-pagination';
|
|
6
|
+
export declare function createCrudInitialState<Entity>(previousInitialState: any): LoadEntitiesState<Entity> & CrudEntitiesState<Entity>;
|
|
7
|
+
export declare function createCrudTraitReducer<Entity, S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>>(initialState: S, allActions: CrudEntitiesActions<Entity> & LoadEntitiesActions<Entity> & SortEntitiesActions<Entity> & FilterEntitiesActions<any> & EntitiesPaginationActions, allMutators: CrudEntitiesMutators<Entity>, allConfigs: CrudEntitiesKeyedConfig & FilterEntitiesKeyedConfig<Entity, unknown> & LoadEntitiesKeyedConfig<Entity> & SortEntitiesKeyedConfig<Entity> & EntitiesPaginationKeyedConfig): import("@ngrx/store").ActionReducer<S, import("@ngrx/store").Action>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { CrudEntitiesSelectors } from './crud-entities.model';
|
|
2
|
+
import { LoadEntitiesSelectors } from '../load-entities/load-entities.model';
|
|
3
|
+
export declare function createCrudTraitSelectors<Entity>(previousSelectors: LoadEntitiesSelectors<Entity>): CrudEntitiesSelectors<Entity>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { LoadEntitiesState } from '../load-entities';
|
|
2
|
+
import { ActionCreator, TypedAction } from '@ngrx/store/src/models';
|
|
3
|
+
export declare type CacheType = 'full' | 'partial' | 'grow';
|
|
4
|
+
export interface EntitiesPaginationState {
|
|
5
|
+
pagination: {
|
|
6
|
+
currentPage: number;
|
|
7
|
+
requestPage: number;
|
|
8
|
+
pageSize: number;
|
|
9
|
+
total?: number;
|
|
10
|
+
pagesToCache: number;
|
|
11
|
+
cache: {
|
|
12
|
+
type: CacheType;
|
|
13
|
+
start: number;
|
|
14
|
+
end: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare type EntitiesPaginationActions = {
|
|
19
|
+
loadEntitiesPage: ActionCreator<string, (props: {
|
|
20
|
+
index: number;
|
|
21
|
+
forceLoad?: boolean;
|
|
22
|
+
}) => {
|
|
23
|
+
index: number;
|
|
24
|
+
forceLoad?: boolean;
|
|
25
|
+
} & TypedAction<string>>;
|
|
26
|
+
loadEntitiesPageSuccess: ActionCreator<string, () => TypedAction<string>>;
|
|
27
|
+
loadEntitiesPageFail: ActionCreator<string, () => TypedAction<string>>;
|
|
28
|
+
loadEntitiesNextPage: ActionCreator<string, () => TypedAction<string>>;
|
|
29
|
+
loadEntitiesPreviousPage: ActionCreator<string, () => TypedAction<string>>;
|
|
30
|
+
loadEntitiesFirstPage: ActionCreator<string, (forceLoad?: boolean) => {
|
|
31
|
+
forceLoad?: boolean;
|
|
32
|
+
} & TypedAction<string>>;
|
|
33
|
+
loadEntitiesLastPage: ActionCreator<string, () => TypedAction<string>>;
|
|
34
|
+
clearEntitiesPagesCache: ActionCreator<string, () => TypedAction<string>>;
|
|
35
|
+
};
|
|
36
|
+
export declare type EntitiesPaginationSelectors<T> = {
|
|
37
|
+
isEntitiesPageInCache: (state: LoadEntitiesState<T> & EntitiesPaginationState, props?: {
|
|
38
|
+
page?: number;
|
|
39
|
+
}) => boolean;
|
|
40
|
+
selectPageEntitiesList: (state: LoadEntitiesState<T> & EntitiesPaginationState, props?: {
|
|
41
|
+
page?: number;
|
|
42
|
+
}) => T[];
|
|
43
|
+
selectEntitiesPage: (state: LoadEntitiesState<T> & EntitiesPaginationState, props?: {
|
|
44
|
+
page?: number;
|
|
45
|
+
}) => PageModel<T>;
|
|
46
|
+
selectEntitiesPagedRequest: (state: LoadEntitiesState<T> & EntitiesPaginationState) => PagedRequest;
|
|
47
|
+
selectEntitiesPageInfo: (state: LoadEntitiesState<T> & EntitiesPaginationState) => PageInfoModel;
|
|
48
|
+
isLoadingEntitiesPage: (state: LoadEntitiesState<T> & EntitiesPaginationState) => boolean;
|
|
49
|
+
};
|
|
50
|
+
export declare type EntitiesPaginationMutators<T> = {
|
|
51
|
+
mergePaginatedEntities<S extends LoadEntitiesState<T> & EntitiesPaginationState>(entities: T[], total: number | undefined, state: S): S;
|
|
52
|
+
};
|
|
53
|
+
export interface PageModel<T> {
|
|
54
|
+
entities: T[];
|
|
55
|
+
pageIndex: number;
|
|
56
|
+
total: number | undefined;
|
|
57
|
+
pageSize: number;
|
|
58
|
+
}
|
|
59
|
+
export interface PageInfoModel {
|
|
60
|
+
pageIndex: number;
|
|
61
|
+
total: number | undefined;
|
|
62
|
+
pageSize: number;
|
|
63
|
+
pagesCount: number | undefined;
|
|
64
|
+
hasPrevious: boolean;
|
|
65
|
+
hasNext: boolean;
|
|
66
|
+
cacheType: CacheType;
|
|
67
|
+
}
|
|
68
|
+
export interface PagedRequest {
|
|
69
|
+
startIndex: number;
|
|
70
|
+
size: number;
|
|
71
|
+
page: number;
|
|
72
|
+
}
|
|
73
|
+
export declare const entitiesPaginationTraitKey = "pagination";
|
|
74
|
+
export interface EntitiesPaginationConfig {
|
|
75
|
+
cacheType?: CacheType;
|
|
76
|
+
pageSize?: number;
|
|
77
|
+
currentPage?: number;
|
|
78
|
+
pagesToCache?: number;
|
|
79
|
+
}
|
|
80
|
+
export interface EntitiesPaginationKeyedConfig {
|
|
81
|
+
pagination?: EntitiesPaginationConfig;
|
|
82
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ActionCreator, TypedAction } from '@ngrx/store/src/models';
|
|
2
|
+
import { EntitiesPaginationActions } from './entities-pagination.model';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare type ƟPaginationActions = EntitiesPaginationActions & {
|
|
7
|
+
setEntitiesRequestPage: ActionCreator<string, (props: {
|
|
8
|
+
index: number;
|
|
9
|
+
}) => {
|
|
10
|
+
index: number;
|
|
11
|
+
} & TypedAction<string>>;
|
|
12
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { EntitiesPaginationConfig, EntitiesPaginationSelectors } from './entities-pagination.model';
|
|
2
|
+
/**
|
|
3
|
+
* Generates ngrx code to paginate an list of entities, this has 3 cache `cacheType`
|
|
4
|
+
* - 'full': The full result is cache in memory and split in pages to render, useful
|
|
5
|
+
* for small result but not so small that requires been render in pages
|
|
6
|
+
* - 'partial': Backend returns partial results because is are to big, this has a cache a few pages forward
|
|
7
|
+
* to avoid calling the backend on each page, the cache is clean when a new loadEntities is required
|
|
8
|
+
* - 'grow': Similar to partial that the backend returns partial result, but in this case the cache grows,
|
|
9
|
+
* after each loadEntities the cache is appended to the previous cache, this mode is ideal for infinite scrolls,
|
|
10
|
+
* where you will only call loadNextPage.
|
|
11
|
+
* To make the pagination experience smoother the loadEntities to get new pages is done when the current page is change to
|
|
12
|
+
* the last cached page.
|
|
13
|
+
* @param config
|
|
14
|
+
* @param config.cacheType - Default to 'full', change the cache mode
|
|
15
|
+
* @param config.pageSize - Default to 20, number of entities on each page
|
|
16
|
+
* @param config.currentPage - Default to 0, starting page
|
|
17
|
+
* @param config.pagesToCache - Default to 3, used in partial and grow cache mode, is the number of
|
|
18
|
+
* extra pages kept in cache to avoid calling the backend on each page
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // The following trait config
|
|
22
|
+
*
|
|
23
|
+
* export interface TestState
|
|
24
|
+
* extends EntityAndStatusState<Todo>,SingleSelectionState{}
|
|
25
|
+
*
|
|
26
|
+
* const traits = createEntityFeatureFactory(
|
|
27
|
+
* addLoadEntitiesTrait<Todo>(),
|
|
28
|
+
* addEntitiesPaginationTrait<Todo>()
|
|
29
|
+
* )({
|
|
30
|
+
* actionsGroupKey: '[Todos]',
|
|
31
|
+
* featureSelector: createFeatureSelector<TestState>>(
|
|
32
|
+
* 'todos',
|
|
33
|
+
* ),
|
|
34
|
+
* });
|
|
35
|
+
* // will generate the following actions and selectors, plus the ones generated by other traits
|
|
36
|
+
* traits.actions.loadTodosPage({index})
|
|
37
|
+
* traits.actions.loadTodosPageSuccess()
|
|
38
|
+
* traits.actions.loadTodosPageFail()
|
|
39
|
+
* traits.actions.loadTodosNextPage()
|
|
40
|
+
* traits.actions.loadTodosPreviousPage()
|
|
41
|
+
* traits.actions.loadTodosFirstPage()
|
|
42
|
+
* traits.actions.loadTodosLastPage()
|
|
43
|
+
* traits.actions.clearTodosPagesCache()
|
|
44
|
+
*
|
|
45
|
+
* // page param is optional and defaults to current page
|
|
46
|
+
* traits.selectors.isTodosPageInCache({page})
|
|
47
|
+
* traits.selectors.selectPageTodosList({page})
|
|
48
|
+
* traits.selectors.isLoadingTodosPage({page})
|
|
49
|
+
* // prefer isLoadingTodosPage over isLoadingTodos which will return true even
|
|
50
|
+
* // if the page loading is not the current one
|
|
51
|
+
* traits.selectors.selectTodosPage({page})
|
|
52
|
+
* traits.selectors.selectTodosPagedRequest()// use in effects to get paging parameter
|
|
53
|
+
* traits.selectors.selectTodosPageInfo()
|
|
54
|
+
*/
|
|
55
|
+
export declare function addEntitiesPaginationTrait<Entity>({ cacheType, pageSize, currentPage, pagesToCache, }?: EntitiesPaginationConfig): import("@ngrx-traits/core").TraitFactory<import("../load-entities/load-entities.model").LoadEntitiesState<Entity> & import("./entities-pagination.model").EntitiesPaginationState, import("./entities-pagination.model").EntitiesPaginationActions, EntitiesPaginationSelectors<Entity>, {}, "pagination", EntitiesPaginationConfig, import("@ngrx-traits/core").AllTraitConfigs>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TraitEffect } from '@ngrx-traits/core';
|
|
2
|
+
import { FilterEntitiesActions } from '../filter-entities/filter-entities.model';
|
|
3
|
+
import { LoadEntitiesActions, LoadEntitiesSelectors } from '../load-entities';
|
|
4
|
+
import { CrudEntitiesActions } from '../crud-entities/crud-entities.model';
|
|
5
|
+
import { EntitiesPaginationSelectors } from './entities-pagination.model';
|
|
6
|
+
import { Type } from '@ngrx-traits/core';
|
|
7
|
+
import { ƟPaginationActions } from './entities-pagination.model.internal';
|
|
8
|
+
export declare function createPaginationTraitEffects<Entity>(allActions: ƟPaginationActions & FilterEntitiesActions<Entity> & LoadEntitiesActions<Entity> & CrudEntitiesActions<Entity>, allSelectors: LoadEntitiesSelectors<Entity> & EntitiesPaginationSelectors<Entity>): Type<TraitEffect>[];
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { EntitiesPaginationMutators, EntitiesPaginationSelectors } from './entities-pagination.model';
|
|
2
|
+
import { LoadEntitiesKeyedConfig } from '../load-entities';
|
|
3
|
+
export declare function createPaginationTraitMutators<Entity>(allSelectors: EntitiesPaginationSelectors<Entity>, allConfigs: LoadEntitiesKeyedConfig<Entity>): EntitiesPaginationMutators<Entity>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FilterEntitiesActions, FilterEntitiesKeyedConfig } from '../filter-entities/filter-entities.model';
|
|
2
|
+
import { LoadEntitiesActions, LoadEntitiesKeyedConfig, LoadEntitiesMutators, LoadEntitiesSelectors, LoadEntitiesState } from '../load-entities/load-entities.model';
|
|
3
|
+
import { EntitiesPaginationKeyedConfig, EntitiesPaginationMutators, EntitiesPaginationState } from './entities-pagination.model';
|
|
4
|
+
import { CrudEntitiesActions } from '../crud-entities';
|
|
5
|
+
import { ƟPaginationActions } from './entities-pagination.model.internal';
|
|
6
|
+
export declare function createPaginationInitialState<Entity>(previousInitialState: any, allConfigs: EntitiesPaginationKeyedConfig): LoadEntitiesState<Entity> & EntitiesPaginationState;
|
|
7
|
+
export declare function createPaginationTraitReducer<Entity, S extends LoadEntitiesState<Entity> & EntitiesPaginationState>(initialState: S, allActions: ƟPaginationActions & FilterEntitiesActions<Entity> & LoadEntitiesActions<Entity> & CrudEntitiesActions<Entity>, allSelectors: LoadEntitiesSelectors<Entity>, allMutators: EntitiesPaginationMutators<Entity> & LoadEntitiesMutators<Entity>, allConfigs: FilterEntitiesKeyedConfig<Entity, unknown> & LoadEntitiesKeyedConfig<Entity> & EntitiesPaginationKeyedConfig): import("@ngrx/store").ActionReducer<S, import("@ngrx/store").Action>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EntitiesPaginationSelectors } from './entities-pagination.model';
|
|
2
|
+
import { LoadEntitiesSelectors } from '../load-entities/load-entities.model';
|
|
3
|
+
import { FilterEntitiesKeyedConfig } from '../filter-entities/filter-entities.model';
|
|
4
|
+
export declare function createPaginationTraitSelectors<Entity>(previousSelectors: LoadEntitiesSelectors<Entity>, allConfigs: FilterEntitiesKeyedConfig<Entity, unknown>): EntitiesPaginationSelectors<Entity>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-action.model.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/async-action/async-action.model.ts"],"names":[],"mappings":"","sourcesContent":["import { PostfixProps, PrefixProps } from '@ngrx-traits/core';\nimport { ActionCreator, NotAllowedCheck } from '@ngrx/store';\nimport { TypedAction } from '@ngrx/store/src/models';\nimport { StatusState } from '../load-entities';\n\nexport type ActionCreatorWithOptionalProps<T> = T extends undefined\n ? ActionCreator<string, () => TypedAction<string>>\n : ActionCreator<\n string,\n (props: T & NotAllowedCheck<T & object>) => T & TypedAction<string>\n >;\n\ntype AsyncActions<Request, Response, Failure> = {\n '': ActionCreatorWithOptionalProps<Request>;\n Success: ActionCreatorWithOptionalProps<Response>;\n Fail: ActionCreatorWithOptionalProps<Failure>;\n};\n\ntype StatusSelectors<S extends StatusState> = {\n isLoading: (state: S) => boolean;\n isSuccess: (state: S) => boolean;\n isFail: (state: S) => boolean;\n};\n\nexport type AsyncActionState<J extends string> = PrefixProps<StatusState, J>;\n\nexport type AsyncActionSelectors<J extends string, S> = PostfixProps<\n StatusSelectors<S>,\n J\n>;\n\nexport type AsyncActionActions<\n Request,\n Response,\n Failure,\n J extends string\n> = PrefixProps<AsyncActions<Request, Response, Failure>, J>;\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { createAction, createReducer, on } from '@ngrx/store';
|
|
2
|
+
import { camelCaseToSentence, createTraitFactory } from '@ngrx-traits/core';
|
|
3
|
+
/**
|
|
4
|
+
* Generates the typical ngrx code need to make a async action with
|
|
5
|
+
* a request, success and failure actions, plus a status property to track its progress
|
|
6
|
+
* and selectors to query the status.
|
|
7
|
+
*
|
|
8
|
+
* @param options - Config object for the trait factory
|
|
9
|
+
* @param options.name - Name of the main request action, should be in camel case
|
|
10
|
+
* @param options.actionProps - Optional param for the main request action, use the props()
|
|
11
|
+
* function for its value, if not present action will have no params,
|
|
12
|
+
* @param options.actionSuccessProps - Optional param for the request success action,
|
|
13
|
+
* use the props() function for its value, if not present action success will have no params
|
|
14
|
+
* @param options.actionFailProps - Optional param for the request fail action,
|
|
15
|
+
* use the props() function for its value, if not present action fail will have no params
|
|
16
|
+
* @returns the trait factory
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // The following trait config
|
|
20
|
+
* const traits = createEntityFeatureFactory(
|
|
21
|
+
* {entityName: 'Todo'},
|
|
22
|
+
* addAsyncActionTrait({
|
|
23
|
+
* name: 'createClient',
|
|
24
|
+
* actionProps: props<{ name: string }>(),
|
|
25
|
+
* actionSuccessProps: props<{ id: string }>(),
|
|
26
|
+
* }),
|
|
27
|
+
* )({
|
|
28
|
+
* actionsGroupKey: 'Client',
|
|
29
|
+
* featureSelector: createFeatureSelector<AsyncActionState<'createClient'>>(
|
|
30
|
+
* 'client',
|
|
31
|
+
* ),
|
|
32
|
+
* });
|
|
33
|
+
* // will generate the actions and selectors
|
|
34
|
+
* traits.actions.createClient({name:'Pedro'})
|
|
35
|
+
* traits.actions.createClientSuccess({id:'123'})
|
|
36
|
+
* traits.actions.createClientFail();
|
|
37
|
+
* traits.selectors.isLoadingCreateClient
|
|
38
|
+
* traits.selectors.isSuccessCreateClient
|
|
39
|
+
* traits.selectors.isFailCreateClient
|
|
40
|
+
*/
|
|
41
|
+
export function addAsyncActionTrait({ name, actionProps, actionSuccessProps, actionFailProps, }) {
|
|
42
|
+
const nameAsSentence = camelCaseToSentence(name);
|
|
43
|
+
let internalActions;
|
|
44
|
+
return createTraitFactory({
|
|
45
|
+
key: name + '-call',
|
|
46
|
+
config: {
|
|
47
|
+
name,
|
|
48
|
+
actionProps,
|
|
49
|
+
actionSuccessProps,
|
|
50
|
+
actionFailProps,
|
|
51
|
+
},
|
|
52
|
+
actions: ({ actionsGroupKey, }) => {
|
|
53
|
+
internalActions = {
|
|
54
|
+
request: (actionProps
|
|
55
|
+
? createAction(`${actionsGroupKey} ${nameAsSentence}`, actionProps)
|
|
56
|
+
: createAction(`${actionsGroupKey} ${nameAsSentence}`)),
|
|
57
|
+
requestSuccess: (actionSuccessProps
|
|
58
|
+
? createAction(`${actionsGroupKey} ${nameAsSentence} Success`, actionSuccessProps)
|
|
59
|
+
: createAction(`${actionsGroupKey} ${nameAsSentence} Success`)),
|
|
60
|
+
requestFail: (actionFailProps
|
|
61
|
+
? createAction(`${actionsGroupKey} ${nameAsSentence} Failure`, actionFailProps)
|
|
62
|
+
: createAction(`${actionsGroupKey} ${nameAsSentence} Failure`)),
|
|
63
|
+
};
|
|
64
|
+
if (name) {
|
|
65
|
+
return {
|
|
66
|
+
[`${name}`]: internalActions.request,
|
|
67
|
+
[`${name}Success`]: internalActions.requestSuccess,
|
|
68
|
+
[`${name}Fail`]: internalActions.requestFail,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return internalActions;
|
|
72
|
+
},
|
|
73
|
+
selectors: () => {
|
|
74
|
+
function isLoadingEntity(state) {
|
|
75
|
+
return state[`${name}Status`] === 'loading';
|
|
76
|
+
}
|
|
77
|
+
function isSuccessEntity(state) {
|
|
78
|
+
return state[`${name}Status`] === 'success';
|
|
79
|
+
}
|
|
80
|
+
function isFailEntity(state) {
|
|
81
|
+
return state[`${name}Status`] === 'fail';
|
|
82
|
+
}
|
|
83
|
+
const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);
|
|
84
|
+
return {
|
|
85
|
+
[`isLoading${capitalizedName}`]: isLoadingEntity,
|
|
86
|
+
[`isSuccess${capitalizedName}`]: isSuccessEntity,
|
|
87
|
+
[`isFail${capitalizedName}`]: isFailEntity,
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
initialState: ({ previousInitialState }) => previousInitialState,
|
|
91
|
+
reducer: ({ initialState }) => {
|
|
92
|
+
return createReducer(initialState, on(internalActions.request, (state) => (Object.assign(Object.assign({}, state), { [`${name}Status`]: 'loading' }))), on(internalActions.requestFail, (state) => (Object.assign(Object.assign({}, state), { [`${name}Status`]: 'fail' }))), on(internalActions.requestSuccess, (state) => (Object.assign(Object.assign({}, state), { [`${name}Status`]: 'success' }))));
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=async-action.trait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-action.trait.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/async-action/async-action.trait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAY5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,UAAU,mBAAmB,CAKjC,EACA,IAAI,EACJ,WAAW,EACX,kBAAkB,EAClB,eAAe,GAMhB;IACC,MAAM,cAAc,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,eAKH,CAAC;IACF,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,IAAI,GAAG,OAAO;QACnB,MAAM,EAAE;YACN,IAAI;YACJ,WAAW;YACX,kBAAkB;YAClB,eAAe;SAChB;QACD,OAAO,EAAE,CAAC,EACR,eAAe,GACW,EAK1B,EAAE;YACF,eAAe,GAAG;gBAChB,OAAO,EAAE,CAAC,WAAW;oBACnB,CAAC,CAAC,YAAY,CACV,GAAG,eAAe,IAAI,cAAc,EAAE,EACtC,WAAkB,CACnB;oBACH,CAAC,CAAC,YAAY,CACV,GAAG,eAAe,IAAI,cAAc,EAAE,CACvC,CAA4C;gBACjD,cAAc,EAAE,CAAC,kBAAkB;oBACjC,CAAC,CAAC,YAAY,CACV,GAAG,eAAe,IAAI,cAAc,UAAU,EAC9C,kBAAyB,CAC1B;oBACH,CAAC,CAAC,YAAY,CACV,GAAG,eAAe,IAAI,cAAc,UAAU,CAC/C,CAA6C;gBAClD,WAAW,EAAE,CAAC,eAAe;oBAC3B,CAAC,CAAC,YAAY,CACV,GAAG,eAAe,IAAI,cAAc,UAAU,EAC9C,eAAsB,CACvB;oBACH,CAAC,CAAC,YAAY,CACV,GAAG,eAAe,IAAI,cAAc,UAAU,CAC/C,CAA4C;aAClD,CAAC;YACF,IAAI,IAAI,EAAE;gBACR,OAAO;oBACL,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,OAAO;oBACpC,CAAC,GAAG,IAAI,SAAS,CAAC,EAAE,eAAe,CAAC,cAAc;oBAClD,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,eAAe,CAAC,WAAW;iBACQ,CAAC;aACxD;YACD,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,SAAS,eAAe,CAAgC,KAAQ;gBAC9D,OAAQ,KAAa,CAAC,GAAG,IAAI,QAAQ,CAAC,KAAK,SAAS,CAAC;YACvD,CAAC;YACD,SAAS,eAAe,CAAgC,KAAQ;gBAC9D,OAAQ,KAAa,CAAC,GAAG,IAAI,QAAQ,CAAC,KAAK,SAAS,CAAC;YACvD,CAAC;YACD,SAAS,YAAY,CAAgC,KAAQ;gBAC3D,OAAQ,KAAa,CAAC,GAAG,IAAI,QAAQ,CAAC,KAAK,MAAM,CAAC;YACpD,CAAC;YACD,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrE,OAAO;gBACL,CAAC,YAAY,eAAe,EAAE,CAAC,EAAE,eAAe;gBAChD,CAAC,YAAY,eAAe,EAAE,CAAC,EAAE,eAAe;gBAChD,CAAC,SAAS,eAAe,EAAE,CAAC,EAAE,YAAY;aACK,CAAC;QACpD,CAAC;QACD,YAAY,EAAE,CAAC,EAAE,oBAAoB,EAAkC,EAAE,EAAE,CACzE,oBAA2C;QAC7C,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;YAC5B,OAAO,aAAa,CAClB,YAAY,EACZ,EAAE,CACA,eAAe,CAAC,OAAO,EACvB,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,gCACI,KAAK,KACR,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,SAAS,GACL,CAAA,CAC5B,EACD,EAAE,CACA,eAAe,CAAC,WAAW,EAC3B,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,gCACI,KAAK,KACR,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,MAAM,GACF,CAAA,CAC5B,EACD,EAAE,CACA,eAAe,CAAC,cAAc,EAC9B,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,gCACI,KAAK,KACR,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,SAAS,GACL,CAAA,CAC5B,CACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { createAction, createReducer, on } from '@ngrx/store';\nimport { ActionCreatorProps } from '@ngrx/store/src/models';\nimport { camelCaseToSentence, createTraitFactory } from '@ngrx-traits/core';\nimport {\n ActionCreatorWithOptionalProps,\n AsyncActionActions,\n AsyncActionSelectors,\n AsyncActionState,\n} from './async-action.model';\nimport {\n TraitActionsFactoryConfig,\n TraitInitialStateFactoryConfig,\n} from '@ngrx-traits/core';\n\n/**\n * Generates the typical ngrx code need to make a async action with\n * a request, success and failure actions, plus a status property to track its progress\n * and selectors to query the status.\n *\n * @param options - Config object for the trait factory\n * @param options.name - Name of the main request action, should be in camel case\n * @param options.actionProps - Optional param for the main request action, use the props()\n * function for its value, if not present action will have no params,\n * @param options.actionSuccessProps - Optional param for the request success action,\n * 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 * // The following trait config\n * const traits = createEntityFeatureFactory(\n * {entityName: 'Todo'},\n * addAsyncActionTrait({\n * name: 'createClient',\n * actionProps: props<{ name: string }>(),\n * actionSuccessProps: props<{ id: string }>(),\n * }),\n * )({\n * actionsGroupKey: 'Client',\n * featureSelector: createFeatureSelector<AsyncActionState<'createClient'>>(\n * 'client',\n * ),\n * });\n * // will generate the actions and selectors\n * traits.actions.createClient({name:'Pedro'})\n * traits.actions.createClientSuccess({id:'123'})\n * traits.actions.createClientFail();\n * traits.selectors.isLoadingCreateClient\n * traits.selectors.isSuccessCreateClient\n * traits.selectors.isFailCreateClient\n */\nexport function addAsyncActionTrait<\n J extends string,\n Request extends object | undefined = undefined,\n Response extends object | undefined = undefined,\n Failure extends object | undefined = undefined\n>({\n name,\n actionProps,\n actionSuccessProps,\n actionFailProps,\n}: {\n name: J;\n actionProps?: ActionCreatorProps<Request>;\n actionSuccessProps?: ActionCreatorProps<Response>;\n actionFailProps?: ActionCreatorProps<Failure>;\n}) {\n const nameAsSentence = camelCaseToSentence(name);\n\n let internalActions: AsyncActionActions<\n Request,\n Response,\n Failure,\n 'request'\n >;\n return createTraitFactory({\n key: name + '-call',\n config: {\n name,\n actionProps,\n actionSuccessProps,\n actionFailProps,\n },\n actions: ({\n actionsGroupKey,\n }: TraitActionsFactoryConfig): AsyncActionActions<\n Request,\n Response,\n Failure,\n J\n > => {\n internalActions = {\n request: (actionProps\n ? createAction(\n `${actionsGroupKey} ${nameAsSentence}`,\n actionProps as any\n )\n : createAction(\n `${actionsGroupKey} ${nameAsSentence}`\n )) as ActionCreatorWithOptionalProps<Request>,\n requestSuccess: (actionSuccessProps\n ? createAction(\n `${actionsGroupKey} ${nameAsSentence} Success`,\n actionSuccessProps as any\n )\n : createAction(\n `${actionsGroupKey} ${nameAsSentence} Success`\n )) as ActionCreatorWithOptionalProps<Response>,\n requestFail: (actionFailProps\n ? createAction(\n `${actionsGroupKey} ${nameAsSentence} Failure`,\n actionFailProps as any\n )\n : createAction(\n `${actionsGroupKey} ${nameAsSentence} Failure`\n )) as ActionCreatorWithOptionalProps<Failure>,\n };\n if (name) {\n return {\n [`${name}`]: internalActions.request,\n [`${name}Success`]: internalActions.requestSuccess,\n [`${name}Fail`]: internalActions.requestFail,\n } as AsyncActionActions<Request, Response, Failure, J>;\n }\n return internalActions;\n },\n selectors: () => {\n function isLoadingEntity<S extends AsyncActionState<J>>(state: S) {\n return (state as any)[`${name}Status`] === 'loading';\n }\n function isSuccessEntity<S extends AsyncActionState<J>>(state: S) {\n return (state as any)[`${name}Status`] === 'success';\n }\n function isFailEntity<S extends AsyncActionState<J>>(state: S) {\n return (state as any)[`${name}Status`] === 'fail';\n }\n const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);\n return {\n [`isLoading${capitalizedName}`]: isLoadingEntity,\n [`isSuccess${capitalizedName}`]: isSuccessEntity,\n [`isFail${capitalizedName}`]: isFailEntity,\n } as AsyncActionSelectors<J, AsyncActionState<J>>;\n },\n initialState: ({ previousInitialState }: TraitInitialStateFactoryConfig) =>\n previousInitialState as AsyncActionState<J>,\n reducer: ({ initialState }) => {\n return createReducer(\n initialState,\n on(\n internalActions.request,\n (state) =>\n ({\n ...state,\n [`${name}Status`]: 'loading',\n } as AsyncActionState<J>)\n ),\n on(\n internalActions.requestFail,\n (state) =>\n ({\n ...state,\n [`${name}Status`]: 'fail',\n } as AsyncActionState<J>)\n ),\n on(\n internalActions.requestSuccess,\n (state) =>\n ({\n ...state,\n [`${name}Status`]: 'success',\n } as AsyncActionState<J>)\n )\n );\n },\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/async-action/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC","sourcesContent":["export * from './async-action.model';\nexport * from './async-action.trait';\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export var ChangeType;
|
|
2
|
+
(function (ChangeType) {
|
|
3
|
+
ChangeType["CREATED"] = "c";
|
|
4
|
+
ChangeType["UPDATED"] = "u";
|
|
5
|
+
ChangeType["DELETED"] = "d";
|
|
6
|
+
})(ChangeType || (ChangeType = {}));
|
|
7
|
+
export const crudEntitiesTraitKey = 'crud';
|
|
8
|
+
//# sourceMappingURL=crud-entities.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud-entities.model.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/crud-entities/crud-entities.model.ts"],"names":[],"mappings":"AAKA,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,2BAAa,CAAA;IACb,2BAAa,CAAA;AACf,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAsID,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC","sourcesContent":["import { Predicate, Update } from '@ngrx/entity/src/models';\nimport { LoadEntitiesState } from '../load-entities/load-entities.model';\nimport { ActionCreator } from '@ngrx/store';\nimport { TypedAction } from '@ngrx/store/src/models';\n\nexport enum ChangeType {\n CREATED = 'c',\n UPDATED = 'u',\n DELETED = 'd',\n}\nexport interface Change<T> {\n id: string | number;\n changeType: ChangeType;\n entityChanges?: Partial<T>;\n}\nexport interface EntityChange<T> {\n entity: T;\n changeType: ChangeType;\n}\nexport interface CrudEntitiesState<T> {\n changes: Change<T>[];\n}\n\nexport type CrudEntitiesActions<T> = {\n addEntities: ActionCreator<\n string,\n (...entities: T[]) => { entities: T[] } & TypedAction<string>\n >;\n removeEntities: ActionCreator<\n string,\n (\n ...keys: string[] | number[]\n ) => { keys: string[] | number[] } & TypedAction<string>\n >;\n updateEntities: ActionCreator<\n string,\n (...updates: Update<T>[]) => { updates: Update<T>[] } & TypedAction<string>\n >;\n upsertEntities: ActionCreator<\n string,\n (...entities: T[]) => { entities: T[] } & TypedAction<string>\n >;\n\n removeAllEntities: ActionCreator<\n string,\n (\n predicate?: Predicate<T>\n ) => { predicate?: Predicate<T> } & TypedAction<string>\n >;\n clearEntitiesChanges: ActionCreator<string, () => TypedAction<string>>;\n};\n\nexport type CrudEntitiesSelectors<Entity> = {\n // /**\n // * Return all changes made to the list\n // * @param state\n // */\n // selectChanges: (state: EntityAndCrudState<T>) => Change<T>[];\n /**\n * Return all changes made to the list plus entities, and can be filtered\n * by change type\n * @param state\n * @param props\n */\n selectEntitiesChangesList: (\n state: LoadEntitiesState<Entity> & CrudEntitiesState<Entity>,\n props: { type: ChangeType }\n ) => EntityChange<Entity>[];\n // /**\n // * filters redundant changes ideal for a batch update\n // * if you add and remove the same and items this changes are remove from the list\n // * if you add and then update one or more times, the updates are discarded\n // * if you update one or more times and then remove, the updates are discarded\n // * @param state\n // */\n // selectFilteredChanges: (state: EntityAndCrudState<T>) => Change<T>[];\n /**\n * Returns the entities plus the kind of change,\n * filters redundant changes ideal for a batch update\n * if you add and remove the same and items this changes are remove from the list\n * if you add and then update one or more times, the updates are discarded\n * if you update one or more times and then remove, the updates are discarded\n * @param state\n */\n selectFilteredEntitiesChangesList: (\n state: LoadEntitiesState<Entity> & CrudEntitiesState<Entity>\n ) => EntityChange<Entity>[];\n};\n\nexport type CrudEntitiesMutators<Entity> = {\n addEntities<S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>>(\n entities: Entity[],\n state: S\n ): S;\n\n removeEntities<\n S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>\n >(\n keys: string[],\n state: S\n ): S;\n removeEntities<\n S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>\n >(\n keys: number[],\n state: S\n ): S;\n removeEntities<\n S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>\n >(\n predicate: Predicate<Entity>,\n state: S\n ): S;\n\n removeAllEntities<\n S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>\n >(\n state: S\n ): S;\n\n clearEntitiesChanges<\n S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>\n >(\n state: S\n ): S;\n\n updateEntities<\n S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>\n >(\n updates: Update<Entity>[],\n state: S\n ): S;\n upsertEntities<\n S extends LoadEntitiesState<Entity> & CrudEntitiesState<Entity>\n >(\n entities: Entity[],\n state: S\n ): S;\n};\n\nexport interface CrudEntitiesConfig {\n storeChanges?: boolean;\n}\nexport const crudEntitiesTraitKey = 'crud';\n\nexport interface CrudEntitiesKeyedConfig {\n crud?: CrudEntitiesConfig;\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createAction } from '@ngrx/store';
|
|
2
|
+
export function createCrudTraitActions(actionsGroupKey, entitiesName) {
|
|
3
|
+
return {
|
|
4
|
+
addEntities: createAction(`${actionsGroupKey} Add ${entitiesName}`, (...entities) => ({
|
|
5
|
+
entities,
|
|
6
|
+
})),
|
|
7
|
+
removeEntities: createAction(`${actionsGroupKey} Remove ${entitiesName}`, (...keys) => ({
|
|
8
|
+
keys,
|
|
9
|
+
})),
|
|
10
|
+
updateEntities: createAction(`${actionsGroupKey} Update ${entitiesName}`, (...updates) => ({
|
|
11
|
+
updates,
|
|
12
|
+
})),
|
|
13
|
+
upsertEntities: createAction(`${actionsGroupKey} Upsert ${entitiesName}`, (...entities) => ({
|
|
14
|
+
entities,
|
|
15
|
+
})),
|
|
16
|
+
removeAllEntities: createAction(`${actionsGroupKey} Remove All ${entitiesName}`, (predicate) => ({ predicate })),
|
|
17
|
+
clearEntitiesChanges: createAction(`${actionsGroupKey} Clear ${entitiesName} Changes`),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=crud-entities.trait.actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud-entities.trait.actions.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/crud-entities/crud-entities.trait.actions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,UAAU,sBAAsB,CACpC,eAAuB,EACvB,YAAoB;IAEpB,OAAO;QACL,WAAW,EAAE,YAAY,CACvB,GAAG,eAAe,QAAQ,YAAY,EAAE,EACxC,CAAC,GAAG,QAAkB,EAAE,EAAE,CAAC,CAAC;YAC1B,QAAQ;SACT,CAAC,CACH;QACD,cAAc,EAAE,YAAY,CAC1B,GAAG,eAAe,WAAW,YAAY,EAAE,EAC3C,CAAC,GAAG,IAAyB,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI;SACL,CAAC,CACH;QACD,cAAc,EAAE,YAAY,CAC1B,GAAG,eAAe,WAAW,YAAY,EAAE,EAC3C,CAAC,GAAG,OAAyB,EAAE,EAAE,CAAC,CAAC;YACjC,OAAO;SACR,CAAC,CACH;QACD,cAAc,EAAE,YAAY,CAC1B,GAAG,eAAe,WAAW,YAAY,EAAE,EAC3C,CAAC,GAAG,QAAkB,EAAE,EAAE,CAAC,CAAC;YAC1B,QAAQ;SACT,CAAC,CACH;QACD,iBAAiB,EAAE,YAAY,CAC7B,GAAG,eAAe,eAAe,YAAY,EAAE,EAC/C,CAAC,SAA6B,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CACnD;QACD,oBAAoB,EAAE,YAAY,CAChC,GAAG,eAAe,WAAW,YAAY,UAAU,CACpD;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { CrudEntitiesActions } from './crud-entities.model';\nimport { createAction } from '@ngrx/store';\nimport { Predicate, Update } from '@ngrx/entity';\n\nexport function createCrudTraitActions<Entity>(\n actionsGroupKey: string,\n entitiesName: string\n): CrudEntitiesActions<Entity> {\n return {\n addEntities: createAction(\n `${actionsGroupKey} Add ${entitiesName}`,\n (...entities: Entity[]) => ({\n entities,\n })\n ),\n removeEntities: createAction(\n `${actionsGroupKey} Remove ${entitiesName}`,\n (...keys: string[] | number[]) => ({\n keys,\n })\n ),\n updateEntities: createAction(\n `${actionsGroupKey} Update ${entitiesName}`,\n (...updates: Update<Entity>[]) => ({\n updates,\n })\n ),\n upsertEntities: createAction(\n `${actionsGroupKey} Upsert ${entitiesName}`,\n (...entities: Entity[]) => ({\n entities,\n })\n ),\n removeAllEntities: createAction(\n `${actionsGroupKey} Remove All ${entitiesName}`,\n (predicate?: Predicate<Entity>) => ({ predicate })\n ),\n clearEntitiesChanges: createAction(\n `${actionsGroupKey} Clear ${entitiesName} Changes`\n ),\n };\n}\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createTraitFactory, } from '@ngrx-traits/core';
|
|
2
|
+
import { createCrudTraitActions } from './crud-entities.trait.actions';
|
|
3
|
+
import { createCrudTraitSelectors } from './crud-entities.trait.selectors';
|
|
4
|
+
import { createCrudInitialState, createCrudTraitReducer, } from './crud-entities.trait.reducer';
|
|
5
|
+
import { crudEntitiesTraitKey, } from './crud-entities.model';
|
|
6
|
+
import { loadEntitiesTraitKey, } from '../load-entities/load-entities.model';
|
|
7
|
+
import { createCrudTraitMutators } from './crud-entities.trait.mutators';
|
|
8
|
+
/**
|
|
9
|
+
* Generates ngrx code to add, remove update, upsert entities on a list, it also
|
|
10
|
+
* tracks the changes made, helpful for implementing batch updates. The `storeChanges` (false by default),
|
|
11
|
+
* will store for add and update the changed entity props in the property `entityChanges` of the `Change` object.
|
|
12
|
+
* @param config
|
|
13
|
+
* @param config.storeChanges - Will store the changes made, default fals
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* // The following trait config
|
|
17
|
+
*
|
|
18
|
+
* export interface TestState
|
|
19
|
+
* extends EntityAndStatusState<Todo>, CrudState<Todo>{}
|
|
20
|
+
*
|
|
21
|
+
* const traits = createEntityFeatureFactory(
|
|
22
|
+
* addLoadEntitiesTrait<Todo>(),
|
|
23
|
+
* addCrudEntitiesTrait<Todo>()
|
|
24
|
+
* )({
|
|
25
|
+
* actionsGroupKey: '[Todos]',
|
|
26
|
+
* featureSelector: createFeatureSelector<TestState>>(
|
|
27
|
+
* 'todos',
|
|
28
|
+
* ),
|
|
29
|
+
* });
|
|
30
|
+
* // will generate the following actions and selectors, plus the ones generated by other traits
|
|
31
|
+
* traits.actions.addTodos(entity1,entity2...)
|
|
32
|
+
* traits.actions.updateTodos({id: id1, changes:{prop1}},{id: id2, changes:{prop2}} ...)
|
|
33
|
+
* traits.actions.upsertTodos(entity1,entity2...)
|
|
34
|
+
* traits.actions.removeAllTodos()
|
|
35
|
+
* traits.actions.clearTodosChanges()
|
|
36
|
+
*
|
|
37
|
+
* traits.selectors.selectTodosChangesList()
|
|
38
|
+
* traits.selectors.selectFilteredTodosChangesList()
|
|
39
|
+
* traits.selectors.selectAllFilteredChanges()
|
|
40
|
+
*/
|
|
41
|
+
export function addCrudEntitiesTrait({ storeChanges = false, } = {}) {
|
|
42
|
+
return createTraitFactory({
|
|
43
|
+
key: crudEntitiesTraitKey,
|
|
44
|
+
depends: [loadEntitiesTraitKey],
|
|
45
|
+
config: { storeChanges },
|
|
46
|
+
actions: ({ actionsGroupKey, entitiesName }) => createCrudTraitActions(actionsGroupKey, entitiesName),
|
|
47
|
+
selectors: ({ previousSelectors }) => createCrudTraitSelectors(previousSelectors),
|
|
48
|
+
mutators: ({ allConfigs }) => createCrudTraitMutators(allConfigs),
|
|
49
|
+
initialState: ({ previousInitialState }) => createCrudInitialState(previousInitialState),
|
|
50
|
+
reducer: ({ initialState, allActions, allMutators, allConfigs }) => createCrudTraitReducer(initialState, allActions, allMutators, allConfigs),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=crud-entities.trait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud-entities.trait.js","sourceRoot":"","sources":["../../../../../../libs/ngrx-traits/common/src/lib/crud-entities/crud-entities.trait.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAKnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AAKvC,OAAO,EAIL,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAIL,oBAAoB,GACrB,MAAM,sCAAsC,CAAC;AAK9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,oBAAoB,CAAS,EAC3C,YAAY,GAAG,KAAK,MACE,EAAE;IACxB,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,oBAAoB;QACzB,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,MAAM,EAAE,EAAE,YAAY,EAAwB;QAC9C,OAAO,EAAE,CAAC,EAAE,eAAe,EAAE,YAAY,EAA6B,EAAE,EAAE,CACxE,sBAAsB,CAAS,eAAe,EAAE,YAAY,CAAC;QAC/D,SAAS,EAAE,CAAC,EAAE,iBAAiB,EAA+B,EAAE,EAAE,CAChE,wBAAwB,CACtB,iBAAkD,CACnD;QACH,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAmC,EAAE,EAAE,CAC5D,uBAAuB,CACrB,UAAuE,CACxE;QACH,YAAY,EAAE,CAAC,EAAE,oBAAoB,EAAkC,EAAE,EAAE,CACzE,sBAAsB,CAAS,oBAAoB,CAAC;QACtD,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CACjE,sBAAsB,CACpB,YAAY,EACZ,UAI2B,EAC3B,WAAW,EACX,UAI+B,CAChC;KACJ,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n createTraitFactory,\n TraitActionsFactoryConfig,\n TraitInitialStateFactoryConfig,\n TraitSelectorsFactoryConfig,\n TraitStateMutatorsFactoryConfig,\n} from '@ngrx-traits/core';\nimport { createCrudTraitActions } from './crud-entities.trait.actions';\nimport { createCrudTraitSelectors } from './crud-entities.trait.selectors';\nimport {\n createCrudInitialState,\n createCrudTraitReducer,\n} from './crud-entities.trait.reducer';\nimport {\n SortEntitiesActions,\n SortEntitiesKeyedConfig,\n} from '../sort-entities/sort-entities.model';\nimport {\n CrudEntitiesActions,\n CrudEntitiesConfig,\n CrudEntitiesKeyedConfig,\n crudEntitiesTraitKey,\n} from './crud-entities.model';\nimport {\n FilterEntitiesActions,\n FilterEntitiesKeyedConfig,\n} from '../filter-entities/filter-entities.model';\nimport {\n LoadEntitiesActions,\n LoadEntitiesKeyedConfig,\n LoadEntitiesSelectors,\n loadEntitiesTraitKey,\n} from '../load-entities/load-entities.model';\nimport {\n EntitiesPaginationActions,\n EntitiesPaginationKeyedConfig,\n} from '../entities-pagination/entities-pagination.model';\nimport { createCrudTraitMutators } from './crud-entities.trait.mutators';\n\n/**\n * Generates ngrx code to add, remove update, upsert entities on a list, it also\n * tracks the changes made, helpful for implementing batch updates. The `storeChanges` (false by default),\n * will store for add and update the changed entity props in the property `entityChanges` of the `Change` object.\n * @param config\n * @param config.storeChanges - Will store the changes made, default fals\n *\n * @example\n * // The following trait config\n *\n * export interface TestState\n * extends EntityAndStatusState<Todo>, CrudState<Todo>{}\n *\n * const traits = createEntityFeatureFactory(\n * addLoadEntitiesTrait<Todo>(),\n * addCrudEntitiesTrait<Todo>()\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.addTodos(entity1,entity2...)\n * traits.actions.updateTodos({id: id1, changes:{prop1}},{id: id2, changes:{prop2}} ...)\n * traits.actions.upsertTodos(entity1,entity2...)\n * traits.actions.removeAllTodos()\n * traits.actions.clearTodosChanges()\n *\n * traits.selectors.selectTodosChangesList()\n * traits.selectors.selectFilteredTodosChangesList()\n * traits.selectors.selectAllFilteredChanges()\n */\nexport function addCrudEntitiesTrait<Entity>({\n storeChanges = false,\n}: CrudEntitiesConfig = {}) {\n return createTraitFactory({\n key: crudEntitiesTraitKey,\n depends: [loadEntitiesTraitKey],\n config: { storeChanges } as CrudEntitiesConfig,\n actions: ({ actionsGroupKey, entitiesName }: TraitActionsFactoryConfig) =>\n createCrudTraitActions<Entity>(actionsGroupKey, entitiesName),\n selectors: ({ previousSelectors }: TraitSelectorsFactoryConfig) =>\n createCrudTraitSelectors<Entity>(\n previousSelectors as LoadEntitiesSelectors<Entity>\n ),\n mutators: ({ allConfigs }: TraitStateMutatorsFactoryConfig) =>\n createCrudTraitMutators<Entity>(\n allConfigs as CrudEntitiesKeyedConfig & LoadEntitiesKeyedConfig<Entity>\n ),\n initialState: ({ previousInitialState }: TraitInitialStateFactoryConfig) =>\n createCrudInitialState<Entity>(previousInitialState),\n reducer: ({ initialState, allActions, allMutators, allConfigs }) =>\n createCrudTraitReducer(\n initialState,\n allActions as CrudEntitiesActions<Entity> &\n LoadEntitiesActions<Entity> &\n SortEntitiesActions<Entity> &\n FilterEntitiesActions<any> &\n EntitiesPaginationActions,\n allMutators,\n allConfigs as CrudEntitiesKeyedConfig &\n FilterEntitiesKeyedConfig<Entity, unknown> &\n LoadEntitiesKeyedConfig<Entity> &\n SortEntitiesKeyedConfig<Entity> &\n EntitiesPaginationKeyedConfig\n ),\n });\n}\n"]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ChangeType, } from './crud-entities.model';
|
|
2
|
+
export function createCrudTraitMutators(allConfigs) {
|
|
3
|
+
const { storeChanges } = allConfigs.crud || {};
|
|
4
|
+
const adapter = allConfigs.loadEntities.adapter;
|
|
5
|
+
function generateChangeEntry(entity, changeType, customId) {
|
|
6
|
+
return {
|
|
7
|
+
id: customId !== null && customId !== void 0 ? customId : adapter.selectId(entity),
|
|
8
|
+
changeType,
|
|
9
|
+
entityChanges: (storeChanges && entity) || undefined,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function addEntities(entities, state, addFirst = false) {
|
|
13
|
+
const changes = [
|
|
14
|
+
...state.changes,
|
|
15
|
+
...entities.map((entity) => generateChangeEntry(entity, ChangeType.CREATED)),
|
|
16
|
+
];
|
|
17
|
+
if (!addFirst)
|
|
18
|
+
return adapter.addMany(entities, Object.assign(Object.assign({}, state), { changes }));
|
|
19
|
+
const newIds = entities.map((e) => adapter.selectId(e));
|
|
20
|
+
const newEntities = Object.assign({}, state.entities);
|
|
21
|
+
entities.forEach((e) => {
|
|
22
|
+
const id = adapter.selectId(e);
|
|
23
|
+
newEntities[id] = e;
|
|
24
|
+
});
|
|
25
|
+
return Object.assign(Object.assign({}, state), { ids: [...newIds, ...state.ids], entities: newEntities, changes });
|
|
26
|
+
}
|
|
27
|
+
function upsertEntities(entities, state) {
|
|
28
|
+
const oldChanges = [...state.changes];
|
|
29
|
+
const existingIds = adapter.getSelectors().selectIds(state);
|
|
30
|
+
const [additions, updates] = entities.reduce(([a, u], entity) => existingIds.indexOf(adapter.selectId(entity)) !== -1
|
|
31
|
+
? [a, [...u, entity]]
|
|
32
|
+
: [[...a, entity], u], [new Array(), new Array()]);
|
|
33
|
+
return adapter.upsertMany(entities, Object.assign(Object.assign({}, state), { changes: [
|
|
34
|
+
...oldChanges,
|
|
35
|
+
...additions.map((entity) => generateChangeEntry(entity, ChangeType.CREATED)),
|
|
36
|
+
...updates.map((entity) => generateChangeEntry(entity, ChangeType.UPDATED)),
|
|
37
|
+
] }));
|
|
38
|
+
}
|
|
39
|
+
function removeEntities(keysOrPredicate, state) {
|
|
40
|
+
if (typeof keysOrPredicate === 'function') {
|
|
41
|
+
return adapter.removeMany(keysOrPredicate, Object.assign(Object.assign({}, state), { changes: [
|
|
42
|
+
...state.changes,
|
|
43
|
+
...state.ids.map((id) => ({
|
|
44
|
+
id,
|
|
45
|
+
changeType: ChangeType.DELETED,
|
|
46
|
+
})),
|
|
47
|
+
] }));
|
|
48
|
+
}
|
|
49
|
+
return adapter.removeMany(keysOrPredicate, Object.assign(Object.assign({}, state), { changes: [
|
|
50
|
+
...state.changes,
|
|
51
|
+
...keysOrPredicate.map((key) => ({
|
|
52
|
+
id: key,
|
|
53
|
+
changeType: ChangeType.DELETED,
|
|
54
|
+
})),
|
|
55
|
+
] }));
|
|
56
|
+
}
|
|
57
|
+
function removeAllEntities(state) {
|
|
58
|
+
return adapter.removeAll(Object.assign(Object.assign({}, state), { changes: [
|
|
59
|
+
...state.changes,
|
|
60
|
+
...state.ids.map((id) => ({
|
|
61
|
+
id,
|
|
62
|
+
changeType: ChangeType.DELETED,
|
|
63
|
+
})),
|
|
64
|
+
] }));
|
|
65
|
+
}
|
|
66
|
+
function clearEntitiesChanges(state) {
|
|
67
|
+
return Object.assign(Object.assign({}, state), { changes: [] });
|
|
68
|
+
}
|
|
69
|
+
function updateEntities(updates, state) {
|
|
70
|
+
const oldChanges = [...state.changes];
|
|
71
|
+
updates.forEach((updated) => {
|
|
72
|
+
const id = adapter.selectId(updated.changes);
|
|
73
|
+
if (id && id !== updated.id) {
|
|
74
|
+
// if the id changes update the id of pold changes
|
|
75
|
+
const index = oldChanges.findIndex((v) => v.id === updated.id);
|
|
76
|
+
const oldChange = oldChanges[index];
|
|
77
|
+
oldChanges[index] = Object.assign(Object.assign({}, oldChange), { id });
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
return adapter.updateMany(updates, Object.assign(Object.assign({}, state), { changes: [
|
|
81
|
+
...oldChanges,
|
|
82
|
+
...updates.map((updated) => {
|
|
83
|
+
var _a;
|
|
84
|
+
return ({
|
|
85
|
+
id: (_a = adapter.selectId(updated.changes)) !== null && _a !== void 0 ? _a : updated.id,
|
|
86
|
+
changeType: ChangeType.UPDATED,
|
|
87
|
+
entityChanges: (storeChanges && updated.changes) || undefined,
|
|
88
|
+
});
|
|
89
|
+
}),
|
|
90
|
+
] }));
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
addEntities,
|
|
94
|
+
removeEntities,
|
|
95
|
+
updateEntities,
|
|
96
|
+
removeAllEntities,
|
|
97
|
+
clearEntitiesChanges,
|
|
98
|
+
upsertEntities,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=crud-entities.trait.mutators.js.map
|