@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.
Files changed (219) hide show
  1. package/README.md +7 -0
  2. package/async-action/async-action.model.d.ts +19 -0
  3. package/async-action/async-action.trait.d.ts +59 -0
  4. package/async-action/index.d.ts +2 -0
  5. package/bundles/ngrx-traits-common.umd.js +2126 -0
  6. package/bundles/ngrx-traits-common.umd.js.map +1 -0
  7. package/crud-entities/crud-entities.model.d.ts +76 -0
  8. package/crud-entities/crud-entities.trait.actions.d.ts +2 -0
  9. package/crud-entities/crud-entities.trait.d.ts +35 -0
  10. package/crud-entities/crud-entities.trait.mutators.d.ts +3 -0
  11. package/crud-entities/crud-entities.trait.reducer.d.ts +7 -0
  12. package/crud-entities/crud-entities.trait.selectors.d.ts +3 -0
  13. package/crud-entities/index.d.ts +2 -0
  14. package/entities-pagination/entities-pagination.model.d.ts +82 -0
  15. package/entities-pagination/entities-pagination.model.internal.d.ts +12 -0
  16. package/entities-pagination/entities-pagination.trait.actions.d.ts +2 -0
  17. package/entities-pagination/entities-pagination.trait.d.ts +55 -0
  18. package/entities-pagination/entities-pagination.trait.effects.d.ts +8 -0
  19. package/entities-pagination/entities-pagination.trait.mutators.d.ts +3 -0
  20. package/entities-pagination/entities-pagination.trait.reducer.d.ts +7 -0
  21. package/entities-pagination/entities-pagination.trait.selectors.d.ts +4 -0
  22. package/entities-pagination/index.d.ts +2 -0
  23. package/esm2015/async-action/async-action.model.js +2 -0
  24. package/esm2015/async-action/async-action.model.js.map +1 -0
  25. package/esm2015/async-action/async-action.trait.js +96 -0
  26. package/esm2015/async-action/async-action.trait.js.map +1 -0
  27. package/esm2015/async-action/index.js +3 -0
  28. package/esm2015/async-action/index.js.map +1 -0
  29. package/esm2015/crud-entities/crud-entities.model.js +8 -0
  30. package/esm2015/crud-entities/crud-entities.model.js.map +1 -0
  31. package/esm2015/crud-entities/crud-entities.trait.actions.js +20 -0
  32. package/esm2015/crud-entities/crud-entities.trait.actions.js.map +1 -0
  33. package/esm2015/crud-entities/crud-entities.trait.js +53 -0
  34. package/esm2015/crud-entities/crud-entities.trait.js.map +1 -0
  35. package/esm2015/crud-entities/crud-entities.trait.mutators.js +101 -0
  36. package/esm2015/crud-entities/crud-entities.trait.mutators.js.map +1 -0
  37. package/esm2015/crud-entities/crud-entities.trait.reducer.js +15 -0
  38. package/esm2015/crud-entities/crud-entities.trait.reducer.js.map +1 -0
  39. package/esm2015/crud-entities/crud-entities.trait.selectors.js +70 -0
  40. package/esm2015/crud-entities/crud-entities.trait.selectors.js.map +1 -0
  41. package/esm2015/crud-entities/index.js +3 -0
  42. package/esm2015/crud-entities/index.js.map +1 -0
  43. package/esm2015/entities-pagination/entities-pagination.model.internal.js +2 -0
  44. package/esm2015/entities-pagination/entities-pagination.model.internal.js.map +1 -0
  45. package/esm2015/entities-pagination/entities-pagination.model.js +2 -0
  46. package/esm2015/entities-pagination/entities-pagination.model.js.map +1 -0
  47. package/esm2015/entities-pagination/entities-pagination.trait.actions.js +20 -0
  48. package/esm2015/entities-pagination/entities-pagination.trait.actions.js.map +1 -0
  49. package/esm2015/entities-pagination/entities-pagination.trait.effects.js +54 -0
  50. package/esm2015/entities-pagination/entities-pagination.trait.effects.js.map +1 -0
  51. package/esm2015/entities-pagination/entities-pagination.trait.js +80 -0
  52. package/esm2015/entities-pagination/entities-pagination.trait.js.map +1 -0
  53. package/esm2015/entities-pagination/entities-pagination.trait.mutators.js +23 -0
  54. package/esm2015/entities-pagination/entities-pagination.trait.mutators.js.map +1 -0
  55. package/esm2015/entities-pagination/entities-pagination.trait.reducer.js +33 -0
  56. package/esm2015/entities-pagination/entities-pagination.trait.reducer.js.map +1 -0
  57. package/esm2015/entities-pagination/entities-pagination.trait.selectors.js +65 -0
  58. package/esm2015/entities-pagination/entities-pagination.trait.selectors.js.map +1 -0
  59. package/esm2015/entities-pagination/index.js +3 -0
  60. package/esm2015/entities-pagination/index.js.map +1 -0
  61. package/esm2015/filter-entities/filter-entities.model.internal.js +2 -0
  62. package/esm2015/filter-entities/filter-entities.model.internal.js.map +1 -0
  63. package/esm2015/filter-entities/filter-entities.model.js +2 -0
  64. package/esm2015/filter-entities/filter-entities.model.js.map +1 -0
  65. package/esm2015/filter-entities/filter-entities.trait.actions.js +16 -0
  66. package/esm2015/filter-entities/filter-entities.trait.actions.js.map +1 -0
  67. package/esm2015/filter-entities/filter-entities.trait.effect.js +56 -0
  68. package/esm2015/filter-entities/filter-entities.trait.effect.js.map +1 -0
  69. package/esm2015/filter-entities/filter-entities.trait.js +68 -0
  70. package/esm2015/filter-entities/filter-entities.trait.js.map +1 -0
  71. package/esm2015/filter-entities/filter-entities.trait.mutators.js +7 -0
  72. package/esm2015/filter-entities/filter-entities.trait.mutators.js.map +1 -0
  73. package/esm2015/filter-entities/filter-entities.trait.reducer.js +9 -0
  74. package/esm2015/filter-entities/filter-entities.trait.reducer.js.map +1 -0
  75. package/esm2015/filter-entities/filter-entities.trait.selectors.js +9 -0
  76. package/esm2015/filter-entities/filter-entities.trait.selectors.js.map +1 -0
  77. package/esm2015/filter-entities/index.js +3 -0
  78. package/esm2015/filter-entities/index.js.map +1 -0
  79. package/esm2015/index.js +12 -0
  80. package/esm2015/index.js.map +1 -0
  81. package/esm2015/load-entities/index.js +3 -0
  82. package/esm2015/load-entities/index.js.map +1 -0
  83. package/esm2015/load-entities/load-entities.model.js +2 -0
  84. package/esm2015/load-entities/load-entities.model.js.map +1 -0
  85. package/esm2015/load-entities/load-entities.mutators.js +8 -0
  86. package/esm2015/load-entities/load-entities.mutators.js.map +1 -0
  87. package/esm2015/load-entities/load-entities.trait.actions.js +10 -0
  88. package/esm2015/load-entities/load-entities.trait.actions.js.map +1 -0
  89. package/esm2015/load-entities/load-entities.trait.js +57 -0
  90. package/esm2015/load-entities/load-entities.trait.js.map +1 -0
  91. package/esm2015/load-entities/load-entities.trait.reducer.js +12 -0
  92. package/esm2015/load-entities/load-entities.trait.reducer.js.map +1 -0
  93. package/esm2015/load-entities/load-entities.trait.selectors.js +33 -0
  94. package/esm2015/load-entities/load-entities.trait.selectors.js.map +1 -0
  95. package/esm2015/load-entities/load-entities.utils.js +10 -0
  96. package/esm2015/load-entities/load-entities.utils.js.map +1 -0
  97. package/esm2015/load-entity/index.js +3 -0
  98. package/esm2015/load-entity/index.js.map +1 -0
  99. package/esm2015/load-entity/load-entity.model.js +2 -0
  100. package/esm2015/load-entity/load-entity.model.js.map +1 -0
  101. package/esm2015/load-entity/load-entity.traits.js +65 -0
  102. package/esm2015/load-entity/load-entity.traits.js.map +1 -0
  103. package/esm2015/ngrx-traits-common.js +5 -0
  104. package/esm2015/ngrx-traits-common.js.map +1 -0
  105. package/esm2015/public_api.js +2 -0
  106. package/esm2015/public_api.js.map +1 -0
  107. package/esm2015/reset/index.js +2 -0
  108. package/esm2015/reset/index.js.map +1 -0
  109. package/esm2015/reset/reset.trait.js +66 -0
  110. package/esm2015/reset/reset.trait.js.map +1 -0
  111. package/esm2015/select-entities/index.js +4 -0
  112. package/esm2015/select-entities/index.js.map +1 -0
  113. package/esm2015/select-entities/select-entities.model.js +2 -0
  114. package/esm2015/select-entities/select-entities.model.js.map +1 -0
  115. package/esm2015/select-entities/select-entities.trait.actions.js +11 -0
  116. package/esm2015/select-entities/select-entities.trait.actions.js.map +1 -0
  117. package/esm2015/select-entities/select-entities.trait.js +50 -0
  118. package/esm2015/select-entities/select-entities.trait.js.map +1 -0
  119. package/esm2015/select-entities/select-entities.trait.mutators.js +21 -0
  120. package/esm2015/select-entities/select-entities.trait.mutators.js.map +1 -0
  121. package/esm2015/select-entities/select-entities.trait.reducer.js +40 -0
  122. package/esm2015/select-entities/select-entities.trait.reducer.js.map +1 -0
  123. package/esm2015/select-entities/select-entities.trait.selectors.js +28 -0
  124. package/esm2015/select-entities/select-entities.trait.selectors.js.map +1 -0
  125. package/esm2015/select-entities/select-entities.utils.js +25 -0
  126. package/esm2015/select-entities/select-entities.utils.js.map +1 -0
  127. package/esm2015/select-entity/index.js +3 -0
  128. package/esm2015/select-entity/index.js.map +1 -0
  129. package/esm2015/select-entity/select-entity.model.js +2 -0
  130. package/esm2015/select-entity/select-entity.model.js.map +1 -0
  131. package/esm2015/select-entity/select-entity.trait.actions.js +9 -0
  132. package/esm2015/select-entity/select-entity.trait.actions.js.map +1 -0
  133. package/esm2015/select-entity/select-entity.trait.js +47 -0
  134. package/esm2015/select-entity/select-entity.trait.js.map +1 -0
  135. package/esm2015/select-entity/select-entity.trait.mutators.js +17 -0
  136. package/esm2015/select-entity/select-entity.trait.mutators.js.map +1 -0
  137. package/esm2015/select-entity/select-entity.trait.reducer.js +26 -0
  138. package/esm2015/select-entity/select-entity.trait.reducer.js.map +1 -0
  139. package/esm2015/select-entity/select-entity.trait.selectors.js +13 -0
  140. package/esm2015/select-entity/select-entity.trait.selectors.js.map +1 -0
  141. package/esm2015/set-entity/index.js +3 -0
  142. package/esm2015/set-entity/index.js.map +1 -0
  143. package/esm2015/set-entity/set-entity.model.js +2 -0
  144. package/esm2015/set-entity/set-entity.model.js.map +1 -0
  145. package/esm2015/set-entity/set-entity.trait.js +52 -0
  146. package/esm2015/set-entity/set-entity.trait.js.map +1 -0
  147. package/esm2015/sort-entities/index.js +4 -0
  148. package/esm2015/sort-entities/index.js.map +1 -0
  149. package/esm2015/sort-entities/sort-entities.model.js +2 -0
  150. package/esm2015/sort-entities/sort-entities.model.js.map +1 -0
  151. package/esm2015/sort-entities/sort-entities.trait.actions.js +8 -0
  152. package/esm2015/sort-entities/sort-entities.trait.actions.js.map +1 -0
  153. package/esm2015/sort-entities/sort-entities.trait.effect.js +28 -0
  154. package/esm2015/sort-entities/sort-entities.trait.effect.js.map +1 -0
  155. package/esm2015/sort-entities/sort-entities.trait.js +53 -0
  156. package/esm2015/sort-entities/sort-entities.trait.js.map +1 -0
  157. package/esm2015/sort-entities/sort-entities.trait.mutators.js +13 -0
  158. package/esm2015/sort-entities/sort-entities.trait.mutators.js.map +1 -0
  159. package/esm2015/sort-entities/sort-entities.trait.reducer.js +22 -0
  160. package/esm2015/sort-entities/sort-entities.trait.reducer.js.map +1 -0
  161. package/esm2015/sort-entities/sort-entities.trait.selectors.js +10 -0
  162. package/esm2015/sort-entities/sort-entities.trait.selectors.js.map +1 -0
  163. package/esm2015/sort-entities/sort-entities.utils.js +61 -0
  164. package/esm2015/sort-entities/sort-entities.utils.js.map +1 -0
  165. package/fesm2015/ngrx-traits-common.js +1511 -0
  166. package/fesm2015/ngrx-traits-common.js.map +1 -0
  167. package/filter-entities/filter-entities.model.d.ts +57 -0
  168. package/filter-entities/filter-entities.model.internal.d.ts +14 -0
  169. package/filter-entities/filter-entities.trait.actions.d.ts +2 -0
  170. package/filter-entities/filter-entities.trait.d.ts +42 -0
  171. package/filter-entities/filter-entities.trait.effect.d.ts +6 -0
  172. package/filter-entities/filter-entities.trait.mutators.d.ts +2 -0
  173. package/filter-entities/filter-entities.trait.reducer.d.ts +5 -0
  174. package/filter-entities/filter-entities.trait.selectors.d.ts +4 -0
  175. package/filter-entities/index.d.ts +2 -0
  176. package/index.d.ts +11 -0
  177. package/load-entities/index.d.ts +2 -0
  178. package/load-entities/load-entities.model.d.ts +97 -0
  179. package/load-entities/load-entities.mutators.d.ts +3 -0
  180. package/load-entities/load-entities.trait.actions.d.ts +2 -0
  181. package/load-entities/load-entities.trait.d.ts +39 -0
  182. package/load-entities/load-entities.trait.reducer.d.ts +4 -0
  183. package/load-entities/load-entities.trait.selectors.d.ts +3 -0
  184. package/load-entities/load-entities.utils.d.ts +4 -0
  185. package/load-entity/index.d.ts +2 -0
  186. package/load-entity/load-entity.model.d.ts +9 -0
  187. package/load-entity/load-entity.traits.d.ts +64 -0
  188. package/ngrx-traits-common.d.ts +5 -0
  189. package/package.json +28 -0
  190. package/public_api.d.ts +1 -0
  191. package/reset/index.d.ts +1 -0
  192. package/reset/reset.trait.d.ts +32 -0
  193. package/select-entities/index.d.ts +3 -0
  194. package/select-entities/select-entities.model.d.ts +41 -0
  195. package/select-entities/select-entities.trait.actions.d.ts +2 -0
  196. package/select-entities/select-entities.trait.d.ts +34 -0
  197. package/select-entities/select-entities.trait.mutators.d.ts +2 -0
  198. package/select-entities/select-entities.trait.reducer.d.ts +8 -0
  199. package/select-entities/select-entities.trait.selectors.d.ts +3 -0
  200. package/select-entities/select-entities.utils.d.ts +7 -0
  201. package/select-entity/index.d.ts +2 -0
  202. package/select-entity/select-entity.model.d.ts +33 -0
  203. package/select-entity/select-entity.trait.actions.d.ts +2 -0
  204. package/select-entity/select-entity.trait.d.ts +30 -0
  205. package/select-entity/select-entity.trait.mutators.d.ts +2 -0
  206. package/select-entity/select-entity.trait.reducer.d.ts +8 -0
  207. package/select-entity/select-entity.trait.selectors.d.ts +2 -0
  208. package/set-entity/index.d.ts +2 -0
  209. package/set-entity/set-entity.model.d.ts +16 -0
  210. package/set-entity/set-entity.trait.d.ts +39 -0
  211. package/sort-entities/index.d.ts +3 -0
  212. package/sort-entities/sort-entities.model.d.ts +35 -0
  213. package/sort-entities/sort-entities.trait.actions.d.ts +2 -0
  214. package/sort-entities/sort-entities.trait.d.ts +33 -0
  215. package/sort-entities/sort-entities.trait.effect.d.ts +6 -0
  216. package/sort-entities/sort-entities.trait.mutators.d.ts +3 -0
  217. package/sort-entities/sort-entities.trait.reducer.d.ts +4 -0
  218. package/sort-entities/sort-entities.trait.selectors.d.ts +2 -0
  219. 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,2 @@
1
+ export * from './crud-entities.model';
2
+ export * from './crud-entities.trait';
@@ -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,2 @@
1
+ import { EntitiesPaginationActions } from './entities-pagination.model';
2
+ export declare function createPaginationTraitActions(actionsGroupKey: string, entitiesName: string): EntitiesPaginationActions;
@@ -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,2 @@
1
+ export * from './entities-pagination.model';
2
+ export * from './entities-pagination.trait';
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=async-action.model.js.map
@@ -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,3 @@
1
+ export * from './async-action.model';
2
+ export * from './async-action.trait';
3
+ //# sourceMappingURL=index.js.map
@@ -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