@ngdux/form 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 ADDED
@@ -0,0 +1,7 @@
1
+ # shared-util-store-form
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test shared-util-store-form` to execute the unit tests.
@@ -0,0 +1,7 @@
1
+ export * from './lib/+state/abstract-form-effects';
2
+ export * from './lib/+state/form-actions';
3
+ export * from './lib/+state/form-reducer';
4
+ export * from './lib/+state/form-selectors';
5
+ export * from './lib/common/request-state.model';
6
+ export * from './lib/models/form.model';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NoYXJlZC91dGlsLXN0b3JlLWZvcm0vc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvK3N0YXRlL2Fic3RyYWN0LWZvcm0tZWZmZWN0cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi8rc3RhdGUvZm9ybS1hY3Rpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbGliLytzdGF0ZS9mb3JtLXJlZHVjZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvK3N0YXRlL2Zvcm0tc2VsZWN0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbW1vbi9yZXF1ZXN0LXN0YXRlLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy9mb3JtLm1vZGVsJztcbiJdfQ==
@@ -0,0 +1,35 @@
1
+ import { createEffect, ofType } from '@ngrx/effects';
2
+ import { of } from 'rxjs';
3
+ import { catchError, exhaustMap, map, switchMap, tap } from 'rxjs/operators';
4
+ export class AbstractFormEffects {
5
+ constructor(router, actions$, store, service, formActions, notificationService) {
6
+ this.router = router;
7
+ this.actions$ = actions$;
8
+ this.store = store;
9
+ this.service = service;
10
+ this.formActions = formActions;
11
+ this.notificationService = notificationService;
12
+ this.load$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.load), switchMap(({ id }) => this.service.loadResource(id).pipe(map(resource => this.formActions.loadSuccess({ resource })), catchError((errors) => of(this.formActions.loadFailure({ errors })))))));
13
+ this.create$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.create), switchMap(action => this.service.createResource(action.resource).pipe(map(resource => this.formActions.createSuccess({ resource })), catchError((errors) => of(this.formActions.createFailure({ errors })))))));
14
+ this.update$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.save), switchMap(({ resource }) => this.service.saveResource(resource).pipe(map(response => this.formActions.saveSuccess({ resource: response })), catchError((errors) => of(this.formActions.saveFailure({ errors })))))));
15
+ this.delete$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.delete), exhaustMap(action => this.service.deleteResource(action.id).pipe(map(() => this.formActions.deleteSuccess({ id: action.id })), catchError((errors) => of(this.formActions.deleteFailure({ errors })))))));
16
+ this.deleteSuccess$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.deleteSuccess), tap(({ id }) => {
17
+ this.notificationService.onDelete(id);
18
+ this.router.navigate(['..']);
19
+ })));
20
+ this.createSuccess$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.createSuccess), tap(() => {
21
+ this.router.navigate(['..']);
22
+ })));
23
+ this.navigateToCreateResource$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.navigateToCreate), map(() => this.formActions.reset()), tap(() => {
24
+ this.router.navigate(['..']);
25
+ })));
26
+ this.copy$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.copy), tap(() => {
27
+ this.router.navigate(['..']);
28
+ })), { dispatch: false });
29
+ this.copySelected$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.copySelected), map(({ id }) => this.formActions.load({ id }))));
30
+ this.errorsHandler$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.saveFailure, this.formActions.loadFailure, this.formActions.deleteFailure, this.formActions.createFailure), tap(({ errors }) => {
31
+ this.notificationService.onErrors(errors);
32
+ })), { dispatch: false });
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZm9ybS1lZmZlY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zaGFyZWQvdXRpbC1zdG9yZS1mb3JtL3NyYy9saWIvK3N0YXRlL2Fic3RyYWN0LWZvcm0tZWZmZWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQVcsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFCLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHN0UsTUFBTSxPQUFnQixtQkFBbUI7SUFnSHZDLFlBQ21CLE1BQWMsRUFDWixRQUFpQixFQUNqQixLQUFZLEVBQ2QsT0FBdUIsRUFDdkIsV0FBOEIsRUFDOUIsbUJBQW9EO1FBTHBELFdBQU0sR0FBTixNQUFNLENBQVE7UUFDWixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLFVBQUssR0FBTCxLQUFLLENBQU87UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFpQztRQXJIdkUsVUFBSyxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUM3QixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUNoQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdB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LENBQUMsWUFBWSxDQUFDLEVBQ3JDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUMvQyxDQUNGLENBQUM7UUFFRixtQkFBYyxHQUFHLFlBQVksQ0FDM0IsR0FBRyxFQUFFLENBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLE1BQU0sQ0FDSixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FDL0IsRUFDRCxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FDSCxFQUNILEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUNwQixDQUFDO0lBU0MsQ0FBQztDQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQWN0aW9ucywgY3JlYXRlRWZmZWN0LCBvZlR5cGUgfSBmcm9tICdAbmdyeC9lZmZlY3RzJztcclxuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGV4aGF1c3RNYXAsIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEZvcm1BY3Rpb25zLCBGb3JtU2VydmljZSwgTmdEdXhGb3JtTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL21vZGVscy9mb3JtLm1vZGVsJztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZvcm1FZmZlY3RzPFQsIEU+IHtcclxuICBsb2FkJCA9IGNyZWF0ZUVmZmVjdCgoKSA9PlxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgICBvZlR5cGUodGhpcy5mb3JtQWN0aW9ucy5sb2FkKSxcclxuICAgICAgc3dpdGNoTWFwKCh7IGlkIH0pID0+XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmxvYWRSZXNvdXJjZShpZCkucGlwZShcclxuICAgICAgICAgIG1hcChyZXNvdXJjZSA9PiB0aGlzLmZvcm1BY3Rpb25zLmxvYWRTdWNjZXNzKHsgcmVzb3VyY2UgfSkpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JzOiBFKSA9PiBvZih0aGlzLmZvcm1BY3Rpb25zLmxvYWRGYWlsdXJlKHsgZXJyb3JzIH0pKSlcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgIClcclxuICApO1xyXG5cclxuICBjcmVhdGUkID0gY3JlYXRlRWZmZWN0KCgpID0+XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgIG9mVHlwZSh0aGlzLmZvcm1BY3Rpb25zLmNyZWF0ZSksXHJcbiAgICAgIHN3aXRjaE1hcChhY3Rpb24gPT5cclxuICAgICAgICB0aGlzLnNlcnZpY2UuY3JlYXRlUmVzb3VyY2UoYWN0aW9uLnJlc291cmNlKS5waXBlKFxyXG4gICAgICAgICAgbWFwKHJlc291cmNlID0+IHRoaXMuZm9ybUFjdGlvbnMuY3JlYXRlU3VjY2Vzcyh7IHJlc291cmNlIH0pKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yczogRSkgPT4gb2YodGhpcy5mb3JtQWN0aW9ucy5jcmVhdGVGYWlsdXJlKHsgZXJyb3JzIH0pKSlcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgIClcclxuICApO1xyXG5cclxuICB1cGRhdGUkID0gY3JlYXRlRWZmZWN0KCgpID0+XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgIG9mVHlwZSh0aGlzLmZvcm1BY3Rpb25zLnNhdmUpLFxyXG4gICAgICBzd2l0Y2hNYXAoKHsgcmVzb3VyY2UgfSkgPT5cclxuICAgICAgICB0aGlzLnNlcnZpY2Uuc2F2ZVJlc291cmNlKHJlc291cmNlKS5waXBlKFxyXG4gICAgICAgICAgbWFwKHJlc3BvbnNlID0+IHRoaXMuZm9ybUFjdGlvbnMuc2F2ZVN1Y2Nlc3MoeyByZXNvdXJjZTogcmVzcG9uc2UgfSkpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3JzOiBFKSA9PiBvZih0aGlzLmZvcm1BY3Rpb25zLnNhdmVGYWlsdXJlKHsgZXJyb3JzIH0pKSlcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgIClcclxuICApO1xyXG5cclxuICBkZWxldGUkID0gY3JlYXRlRWZmZWN0KCgpID0+XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgIG9mVHlwZSh0aGlzLmZvcm1BY3Rpb25zLmRlbGV0ZSksXHJcbiAgICAgIGV4aGF1c3RNYXAoYWN0aW9uID0+XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmRlbGV0ZVJlc291cmNlKGFjdGlvbi5pZCkucGlwZShcclxuICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLmZvcm1BY3Rpb25zLmRlbGV0ZVN1Y2Nlc3MoeyBpZDogYWN0aW9uLmlkIH0pKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yczogRSkgPT4gb2YodGhpcy5mb3JtQWN0aW9ucy5kZWxldGVGYWlsdXJlKHsgZXJyb3JzIH0pKSlcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgIClcclxuICApO1xyXG5cclxuICBkZWxldGVTdWNjZXNzJCA9IGNyZWF0ZUVmZmVjdCgoKSA9PlxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgICBvZlR5cGUodGhpcy5mb3JtQWN0aW9ucy5kZWxldGVTdWNjZXNzKSxcclxuICAgICAgdGFwKCh7IGlkIH0pID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uub25EZWxldGUoaWQpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi4nXSk7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgKTtcclxuXHJcbiAgY3JlYXRlU3VjY2VzcyQgPSBjcmVhdGVFZmZlY3QoKCkgPT5cclxuICAgIHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgICAgb2ZUeXBlKHRoaXMuZm9ybUFjdGlvbnMuY3JlYXRlU3VjY2VzcyksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLiddKTtcclxuICAgICAgfSlcclxuICAgIClcclxuICApO1xyXG5cclxuICBuYXZpZ2F0ZVRvQ3JlYXRlUmVzb3VyY2UkID0gY3JlYXRlRWZmZWN0KCgpID0+XHJcbiAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgIG9mVHlwZSh0aGlzLmZvcm1BY3Rpb25zLm5hdmlnYXRlVG9DcmVhdGUpLFxyXG4gICAgICBtYXAoKCkgPT4gdGhpcy5mb3JtQWN0aW9ucy5yZXNldCgpKSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uJ10pO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIGNvcHkkID0gY3JlYXRlRWZmZWN0KFxyXG4gICAgKCkgPT5cclxuICAgICAgdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgICAgIG9mVHlwZSh0aGlzLmZvcm1BY3Rpb25zLmNvcHkpLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uJ10pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICB7IGRpc3BhdGNoOiBmYWxzZSB9XHJcbiAgKTtcclxuXHJcbiAgY29weVNlbGVjdGVkJCA9IGNyZWF0ZUVmZmVjdCgoKSA9PlxyXG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgICBvZlR5cGUodGhpcy5mb3JtQWN0aW9ucy5jb3B5U2VsZWN0ZWQpLFxyXG4gICAgICBtYXAoKHsgaWQgfSkgPT4gdGhpcy5mb3JtQWN0aW9ucy5sb2FkKHsgaWQgfSkpXHJcbiAgICApXHJcbiAgKTtcclxuXHJcbiAgZXJyb3JzSGFuZGxlciQgPSBjcmVhdGVFZmZlY3QoXHJcbiAgICAoKSA9PlxyXG4gICAgICB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICAgICAgb2ZUeXBlKFxyXG4gICAgICAgICAgdGhpcy5mb3JtQWN0aW9ucy5zYXZlRmFpbHVyZSxcclxuICAgICAgICAgIHRoaXMuZm9ybUFjdGlvbnMubG9hZEZhaWx1cmUsXHJcbiAgICAgICAgICB0aGlzLmZvcm1BY3Rpb25zLmRlbGV0ZUZhaWx1cmUsXHJcbiAgICAgICAgICB0aGlzLmZvcm1BY3Rpb25zLmNyZWF0ZUZhaWx1cmVcclxuICAgICAgICApLFxyXG4gICAgICAgIHRhcCgoeyBlcnJvcnMgfSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLm9uRXJyb3JzKGVycm9ycyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKSxcclxuICAgIHsgZGlzcGF0Y2g6IGZhbHNlIH1cclxuICApO1xyXG5cclxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFjdGlvbnMkOiBBY3Rpb25zLFxyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JlOiBTdG9yZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogRm9ybVNlcnZpY2U8VD4sXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1BY3Rpb25zOiBGb3JtQWN0aW9uczxULCBFPixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZTogTmdEdXhGb3JtTm90aWZpY2F0aW9uU2VydmljZTxFPlxyXG4gICkge31cclxufVxyXG4iXX0=
@@ -0,0 +1,38 @@
1
+ import { createAction, props } from '@ngrx/store';
2
+ export function createFormActions(featureName) {
3
+ const load = createAction(`[${featureName} API] Load ${featureName}`, props());
4
+ const loadSuccess = createAction(`[${featureName} API] Load ${featureName} Success`, props());
5
+ const loadFailure = createAction(`[${featureName} API] Load ${featureName} Failure`, props());
6
+ const save = createAction(`[${featureName} API] Save ${featureName}`, props());
7
+ const saveSuccess = createAction(`[${featureName} API] Save ${featureName} Success`, props());
8
+ const saveFailure = createAction(`[${featureName} API] Save ${featureName} Failure`, props());
9
+ const deleteAction = createAction(`[${featureName} API] Delete ${featureName}`, props());
10
+ const deleteSuccess = createAction(`[${featureName} API] Delete ${featureName} Success`, props());
11
+ const deleteFailure = createAction(`[${featureName} API] Delete ${featureName} Failure`, props());
12
+ const navigateToCreate = createAction(`[${featureName} Page] Navigate to Create ${featureName}`);
13
+ const create = createAction(`[${featureName} API] Create ${featureName}`, props());
14
+ const createSuccess = createAction(`[${featureName} API] Create ${featureName} Success`, props());
15
+ const createFailure = createAction(`[${featureName} API] Create ${featureName} Failure`, props());
16
+ const reset = createAction(`[${featureName} API] Reset ${featureName}`);
17
+ const copy = createAction(`[${featureName} Page] Copy ${featureName}`);
18
+ const copySelected = createAction(`[${featureName} Page] Copy Selected ${featureName}`, props());
19
+ return {
20
+ load,
21
+ loadSuccess,
22
+ loadFailure,
23
+ save,
24
+ saveSuccess,
25
+ saveFailure,
26
+ delete: deleteAction,
27
+ deleteSuccess,
28
+ deleteFailure,
29
+ navigateToCreate,
30
+ create,
31
+ createSuccess,
32
+ createFailure,
33
+ reset,
34
+ copy,
35
+ copySelected
36
+ };
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zaGFyZWQvdXRpbC1zdG9yZS1mb3JtL3NyYy9saWIvK3N0YXRlL2Zvcm0tYWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdsRCxNQUFNLFVBQVUsaUJBQWlCLENBQU8sV0FBbUI7SUFDekQsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksV0FBVyxjQUFjLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBa0IsQ0FBQyxDQUFDO0lBQy9GLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxJQUFJLFdBQVcsY0FBYyxXQUFXLFVBQVUsRUFBRSxLQUFLLEVBQW1CLENBQUMsQ0FBQztJQUMvRyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxXQUFXLGNBQWMsV0FBVyxVQUFVLEVBQUUsS0FBSyxFQUFpQixDQUFDLENBQUM7SUFFN0csTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksV0FBVyxjQUFjLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBbUIsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxJQUFJLFdBQVcsY0FBYyxXQUFXLFVBQVUsRUFBRSxLQUFLLEVBQW1CLENBQUMsQ0FBQztJQUMvRyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsSUFBSSxXQUFXLGNBQWMsV0FBVyxVQUFVLEVBQUUsS0FBSyxFQUFpQixDQUFDLENBQUM7SUFFN0csTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLElBQUksV0FBVyxnQkFBZ0IsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFrQixDQUFDLENBQUM7SUFDekcsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLElBQUksV0FBVyxnQkFBZ0IsV0FBVyxVQUFVLEVBQUUsS0FBSyxFQUFrQixDQUFDLENBQUM7SUFDbEgsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLElBQUksV0FBVyxnQkFBZ0IsV0FBVyxVQUFVLEVBQUUsS0FBSyxFQUFpQixDQUFDLENBQUM7SUFFakgsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsSUFBSSxXQUFXLDZCQUE2QixXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLFdBQVcsZ0JBQWdCLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBbUIsQ0FBQyxDQUFDO0lBQ3BHLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxJQUFJLFdBQVcsZ0JBQWdCLFdBQVcsVUFBVSxFQUFFLEtBQUssRUFBbUIsQ0FBQyxDQUFDO0lBQ25ILE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxJQUFJLFdBQVcsZ0JBQWdCLFdBQVcsVUFBVSxFQUFFLEtBQUssRUFBaUIsQ0FBQyxDQUFDO0lBRWpILE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLFdBQVcsZUFBZSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRXhFLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLFdBQVcsZUFBZSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxJQUFJLFdBQVcsd0JBQXdCLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBa0IsQ0FBQyxDQUFDO0lBRWpILE9BQU87UUFDTCxJQUFJO1FBQ0osV0FBVztRQUNYLFdBQVc7UUFDWCxJQUFJO1FBQ0osV0FBVztRQUNYLFdBQVc7UUFDWCxNQUFNLEVBQUUsWUFBWTtRQUNwQixhQUFhO1FBQ2IsYUFBYTtRQUNiLGdCQUFnQjtRQUNoQixNQUFNO1FBQ04sYUFBYTtRQUNiLGFBQWE7UUFDYixLQUFLO1FBQ0wsSUFBSTtRQUNKLFlBQVk7S0FDYixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUFjdGlvbiwgcHJvcHMgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IEZvcm1BY3Rpb25zIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1BY3Rpb25zPFQsIEU+KGZlYXR1cmVOYW1lOiBzdHJpbmcpOiBGb3JtQWN0aW9uczxULCBFPiB7XHJcbiAgY29uc3QgbG9hZCA9IGNyZWF0ZUFjdGlvbihgWyR7ZmVhdHVyZU5hbWV9IEFQSV0gTG9hZCAke2ZlYXR1cmVOYW1lfWAsIHByb3BzPHsgaWQ6IHN0cmluZyB9PigpKTtcclxuICBjb25zdCBsb2FkU3VjY2VzcyA9IGNyZWF0ZUFjdGlvbihgWyR7ZmVhdHVyZU5hbWV9IEFQSV0gTG9hZCAke2ZlYXR1cmVOYW1lfSBTdWNjZXNzYCwgcHJvcHM8eyByZXNvdXJjZTogVCB9PigpKTtcclxuICBjb25zdCBsb2FkRmFpbHVyZSA9IGNyZWF0ZUFjdGlvbihgWyR7ZmVhdHVyZU5hbWV9IEFQSV0gTG9hZCAke2ZlYXR1cmVOYW1lfSBGYWlsdXJlYCwgcHJvcHM8eyBlcnJvcnM6IEUgfT4oKSk7XHJcblxyXG4gIGNvbnN0IHNhdmUgPSBjcmVhdGVBY3Rpb24oYFske2ZlYXR1cmVOYW1lfSBBUEldIFNhdmUgJHtmZWF0dXJlTmFtZX1gLCBwcm9wczx7IHJlc291cmNlOiBUIH0+KCkpO1xyXG4gIGNvbnN0IHNhdmVTdWNjZXNzID0gY3JlYXRlQWN0aW9uKGBbJHtmZWF0dXJlTmFtZX0gQVBJXSBTYXZlICR7ZmVhdHVyZU5hbWV9IFN1Y2Nlc3NgLCBwcm9wczx7IHJlc291cmNlOiBUIH0+KCkpO1xyXG4gIGNvbnN0IHNhdmVGYWlsdXJlID0gY3JlYXRlQWN0aW9uKGBbJHtmZWF0dXJlTmFtZX0gQVBJXSBTYXZlICR7ZmVhdHVyZU5hbWV9IEZhaWx1cmVgLCBwcm9wczx7IGVycm9yczogRSB9PigpKTtcclxuXHJcbiAgY29uc3QgZGVsZXRlQWN0aW9uID0gY3JlYXRlQWN0aW9uKGBbJHtmZWF0dXJlTmFtZX0gQVBJXSBEZWxldGUgJHtmZWF0dXJlTmFtZX1gLCBwcm9wczx7IGlkOiBzdHJpbmcgfT4oKSk7XHJcbiAgY29uc3QgZGVsZXRlU3VjY2VzcyA9IGNyZWF0ZUFjdGlvbihgWyR7ZmVhdHVyZU5hbWV9IEFQSV0gRGVsZXRlICR7ZmVhdHVyZU5hbWV9IFN1Y2Nlc3NgLCBwcm9wczx7IGlkOiBzdHJpbmcgfT4oKSk7XHJcbiAgY29uc3QgZGVsZXRlRmFpbHVyZSA9IGNyZWF0ZUFjdGlvbihgWyR7ZmVhdHVyZU5hbWV9IEFQSV0gRGVsZXRlICR7ZmVhdHVyZU5hbWV9IEZhaWx1cmVgLCBwcm9wczx7IGVycm9yczogRSB9PigpKTtcclxuXHJcbiAgY29uc3QgbmF2aWdhdGVUb0NyZWF0ZSA9IGNyZWF0ZUFjdGlvbihgWyR7ZmVhdHVyZU5hbWV9IFBhZ2VdIE5hdmlnYXRlIHRvIENyZWF0ZSAke2ZlYXR1cmVOYW1lfWApO1xyXG4gIGNvbnN0IGNyZWF0ZSA9IGNyZWF0ZUFjdGlvbihgWyR7ZmVhdHVyZU5hbWV9IEFQSV0gQ3JlYXRlICR7ZmVhdHVyZU5hbWV9YCwgcHJvcHM8eyByZXNvdXJjZTogVCB9PigpKTtcclxuICBjb25zdCBjcmVhdGVTdWNjZXNzID0gY3JlYXRlQWN0aW9uKGBbJHtmZWF0dXJlTmFtZX0gQVBJXSBDcmVhdGUgJHtmZWF0dXJlTmFtZX0gU3VjY2Vzc2AsIHByb3BzPHsgcmVzb3VyY2U6IFQgfT4oKSk7XHJcbiAgY29uc3QgY3JlYXRlRmFpbHVyZSA9IGNyZWF0ZUFjdGlvbihgWyR7ZmVhdHVyZU5hbWV9IEFQSV0gQ3JlYXRlICR7ZmVhdHVyZU5hbWV9IEZhaWx1cmVgLCBwcm9wczx7IGVycm9yczogRSB9PigpKTtcclxuXHJcbiAgY29uc3QgcmVzZXQgPSBjcmVhdGVBY3Rpb24oYFske2ZlYXR1cmVOYW1lfSBBUEldIFJlc2V0ICR7ZmVhdHVyZU5hbWV9YCk7XHJcblxyXG4gIGNvbnN0IGNvcHkgPSBjcmVhdGVBY3Rpb24oYFske2ZlYXR1cmVOYW1lfSBQYWdlXSBDb3B5ICR7ZmVhdHVyZU5hbWV9YCk7XHJcbiAgY29uc3QgY29weVNlbGVjdGVkID0gY3JlYXRlQWN0aW9uKGBbJHtmZWF0dXJlTmFtZX0gUGFnZV0gQ29weSBTZWxlY3RlZCAke2ZlYXR1cmVOYW1lfWAsIHByb3BzPHsgaWQ6IHN0cmluZyB9PigpKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGxvYWQsXHJcbiAgICBsb2FkU3VjY2VzcyxcclxuICAgIGxvYWRGYWlsdXJlLFxyXG4gICAgc2F2ZSxcclxuICAgIHNhdmVTdWNjZXNzLFxyXG4gICAgc2F2ZUZhaWx1cmUsXHJcbiAgICBkZWxldGU6IGRlbGV0ZUFjdGlvbixcclxuICAgIGRlbGV0ZVN1Y2Nlc3MsXHJcbiAgICBkZWxldGVGYWlsdXJlLFxyXG4gICAgbmF2aWdhdGVUb0NyZWF0ZSxcclxuICAgIGNyZWF0ZSxcclxuICAgIGNyZWF0ZVN1Y2Nlc3MsXHJcbiAgICBjcmVhdGVGYWlsdXJlLFxyXG4gICAgcmVzZXQsXHJcbiAgICBjb3B5LFxyXG4gICAgY29weVNlbGVjdGVkXHJcbiAgfTtcclxufVxyXG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { createReducer, on } from '@ngrx/store';
2
+ import { RequestState } from '../common/request-state.model';
3
+ import { createLoadingStateActionHandlers, createRequestStateActionHandlers } from '../common/utils/action-handlers';
4
+ export function createFormReducer(actions, actionHandlers, initialFormState) {
5
+ const initialState = { ...createInitialFormState(), ...initialFormState };
6
+ return createReducer(initialState, ...createFormActionHandlers(initialState, actions), ...(actionHandlers || []));
7
+ }
8
+ function createInitialFormState() {
9
+ return {
10
+ resource: undefined,
11
+ loadingState: RequestState.IDLE,
12
+ requestState: RequestState.IDLE,
13
+ errors: undefined
14
+ };
15
+ }
16
+ function createFormActionHandlers(initialFormState, actions) {
17
+ return [
18
+ on(actions.reset, () => initialFormState),
19
+ on(actions.loadSuccess, actions.createSuccess, actions.saveSuccess, (state, { resource }) => ({ ...state, resource })),
20
+ on(actions.deleteSuccess, (state) => ({
21
+ ...state,
22
+ resource: undefined
23
+ })),
24
+ on(actions.copy, (state) => ({
25
+ ...state,
26
+ loadingState: RequestState.IDLE,
27
+ requestState: RequestState.IDLE
28
+ })),
29
+ ...createRequestStateActionHandlers(actions.load, actions.save, actions.saveSuccess, actions.saveFailure),
30
+ ...createRequestStateActionHandlers(undefined, actions.create, actions.createSuccess, actions.createFailure),
31
+ ...createRequestStateActionHandlers(undefined, actions.delete, actions.deleteSuccess, actions.deleteFailure),
32
+ ...createLoadingStateActionHandlers(actions.load, actions.loadSuccess, actions.loadFailure)
33
+ ];
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1yZWR1Y2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zaGFyZWQvdXRpbC1zdG9yZS1mb3JtL3NyYy9saWIvK3N0YXRlL2Zvcm0tcmVkdWNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdDLGFBQWEsRUFBVyxFQUFFLEVBQWdCLE1BQU0sYUFBYSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUdySCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE9BQTBCLEVBQzFCLGNBQWlFLEVBQ2pFLGdCQUF5QjtJQUV6QixNQUFNLFlBQVksR0FBb0IsRUFBRSxHQUFHLHNCQUFzQixFQUFRLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ2pHLE9BQU8sYUFBYSxDQUNsQixZQUFZLEVBQ1osR0FBRyx3QkFBd0IsQ0FBTyxZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQ3hELEdBQUcsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQzFCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxzQkFBc0I7SUFDN0IsT0FBTztRQUNMLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSTtRQUMvQixZQUFZLEVBQUUsWUFBWSxDQUFDLElBQUk7UUFDL0IsTUFBTSxFQUFFLFNBQVM7S0FDbEIsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUMvQixnQkFBaUMsRUFDakMsT0FBMEI7SUFFMUIsT0FBTztRQUNMLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMxRCxFQUFFLENBQ0EsT0FBTyxDQUFDLFdBQVcsRUFDbkIsT0FBTyxDQUFDLGFBQWEsRUFDckIsT0FBTyxDQUFDLFdBQVcsRUFDbkIsQ0FBQyxLQUFzQixFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQW1CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FDcEY7UUFDRCxFQUFFLENBQ0EsT0FBTyxDQUFDLGFBQWEsRUFDckIsQ0FBQyxLQUFzQixFQUFtQixFQUFFLENBQUMsQ0FBQztZQUM1QyxHQUFHLEtBQUs7WUFDUixRQUFRLEVBQUUsU0FBUztTQUNwQixDQUFDLENBQ0g7UUFDRCxFQUFFLENBQ0EsT0FBTyxDQUFDLElBQUksRUFDWixDQUFDLEtBQXNCLEVBQW1CLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLEdBQUcsS0FBSztZQUNSLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSTtZQUMvQixZQUFZLEVBQUUsWUFBWSxDQUFDLElBQUk7U0FDaEMsQ0FBQyxDQUNIO1FBQ0QsR0FBRyxnQ0FBZ0MsQ0FDakMsT0FBTyxDQUFDLElBQUksRUFDWixPQUFPLENBQUMsSUFBSSxFQUNaLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLE9BQU8sQ0FBQyxXQUFXLENBQ3BCO1FBQ0QsR0FBRyxnQ0FBZ0MsQ0FDakMsU0FBUyxFQUNULE9BQU8sQ0FBQyxNQUFNLEVBQ2QsT0FBTyxDQUFDLGFBQWEsRUFDckIsT0FBTyxDQUFDLGFBQWEsQ0FDdEI7UUFDRCxHQUFHLGdDQUFnQyxDQUNqQyxTQUFTLEVBQ1QsT0FBTyxDQUFDLE1BQU0sRUFDZCxPQUFPLENBQUMsYUFBYSxFQUNyQixPQUFPLENBQUMsYUFBYSxDQUN0QjtRQUNELEdBQUcsZ0NBQWdDLENBQWtCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDO0tBQzdHLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aW9uQ3JlYXRvciwgQWN0aW9uUmVkdWNlciwgY3JlYXRlUmVkdWNlciwgQ3JlYXRvciwgb24sIFJlZHVjZXJUeXBlcyB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcclxuaW1wb3J0IHsgUmVxdWVzdFN0YXRlIH0gZnJvbSAnLi4vY29tbW9uL3JlcXVlc3Qtc3RhdGUubW9kZWwnO1xyXG5pbXBvcnQgeyBjcmVhdGVMb2FkaW5nU3RhdGVBY3Rpb25IYW5kbGVycywgY3JlYXRlUmVxdWVzdFN0YXRlQWN0aW9uSGFuZGxlcnMgfSBmcm9tICcuLi9jb21tb24vdXRpbHMvYWN0aW9uLWhhbmRsZXJzJztcclxuaW1wb3J0IHsgRm9ybUFjdGlvbnMsIEZvcm1TdGF0ZSB9IGZyb20gJy4uL21vZGVscy9mb3JtLm1vZGVsJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtUmVkdWNlcjxULCBFPihcclxuICBhY3Rpb25zOiBGb3JtQWN0aW9uczxULCBFPixcclxuICBhY3Rpb25IYW5kbGVycz86IFJlZHVjZXJUeXBlczxGb3JtU3RhdGU8VCwgRT4sIEFjdGlvbkNyZWF0b3JbXT5bXSxcclxuICBpbml0aWFsRm9ybVN0YXRlPzogb2JqZWN0XHJcbik6IEFjdGlvblJlZHVjZXI8Rm9ybVN0YXRlPFQsIEU+PiB7XHJcbiAgY29uc3QgaW5pdGlhbFN0YXRlOiBGb3JtU3RhdGU8VCwgRT4gPSB7IC4uLmNyZWF0ZUluaXRpYWxGb3JtU3RhdGU8VCwgRT4oKSwgLi4uaW5pdGlhbEZvcm1TdGF0ZSB9O1xyXG4gIHJldHVybiBjcmVhdGVSZWR1Y2VyPEZvcm1TdGF0ZTxULCBFPj4oXHJcbiAgICBpbml0aWFsU3RhdGUsXHJcbiAgICAuLi5jcmVhdGVGb3JtQWN0aW9uSGFuZGxlcnM8VCwgRT4oaW5pdGlhbFN0YXRlLCBhY3Rpb25zKSxcclxuICAgIC4uLihhY3Rpb25IYW5kbGVycyB8fCBbXSlcclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVJbml0aWFsRm9ybVN0YXRlPFQsIEU+KCk6IEZvcm1TdGF0ZTxULCBFPiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJlc291cmNlOiB1bmRlZmluZWQsXHJcbiAgICBsb2FkaW5nU3RhdGU6IFJlcXVlc3RTdGF0ZS5JRExFLFxyXG4gICAgcmVxdWVzdFN0YXRlOiBSZXF1ZXN0U3RhdGUuSURMRSxcclxuICAgIGVycm9yczogdW5kZWZpbmVkXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRm9ybUFjdGlvbkhhbmRsZXJzPFQsIEU+KFxyXG4gIGluaXRpYWxGb3JtU3RhdGU6IEZvcm1TdGF0ZTxULCBFPixcclxuICBhY3Rpb25zOiBGb3JtQWN0aW9uczxULCBFPlxyXG4pOiBSZWR1Y2VyVHlwZXM8Rm9ybVN0YXRlPFQsIEU+LCBBY3Rpb25DcmVhdG9yPHN0cmluZywgQ3JlYXRvcjxhbnlbXSwgb2JqZWN0Pj5bXT5bXSB7XHJcbiAgcmV0dXJuIFtcclxuICAgIG9uKGFjdGlvbnMucmVzZXQsICgpOiBGb3JtU3RhdGU8VCwgRT4gPT4gaW5pdGlhbEZvcm1TdGF0ZSksXHJcbiAgICBvbihcclxuICAgICAgYWN0aW9ucy5sb2FkU3VjY2VzcyxcclxuICAgICAgYWN0aW9ucy5jcmVhdGVTdWNjZXNzLFxyXG4gICAgICBhY3Rpb25zLnNhdmVTdWNjZXNzLFxyXG4gICAgICAoc3RhdGU6IEZvcm1TdGF0ZTxULCBFPiwgeyByZXNvdXJjZSB9KTogRm9ybVN0YXRlPFQsIEU+ID0+ICh7IC4uLnN0YXRlLCByZXNvdXJjZSB9KVxyXG4gICAgKSxcclxuICAgIG9uKFxyXG4gICAgICBhY3Rpb25zLmRlbGV0ZVN1Y2Nlc3MsXHJcbiAgICAgIChzdGF0ZTogRm9ybVN0YXRlPFQsIEU+KTogRm9ybVN0YXRlPFQsIEU+ID0+ICh7XHJcbiAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgcmVzb3VyY2U6IHVuZGVmaW5lZFxyXG4gICAgICB9KVxyXG4gICAgKSxcclxuICAgIG9uKFxyXG4gICAgICBhY3Rpb25zLmNvcHksXHJcbiAgICAgIChzdGF0ZTogRm9ybVN0YXRlPFQsIEU+KTogRm9ybVN0YXRlPFQsIEU+ID0+ICh7XHJcbiAgICAgICAgLi4uc3RhdGUsXHJcbiAgICAgICAgbG9hZGluZ1N0YXRlOiBSZXF1ZXN0U3RhdGUuSURMRSxcclxuICAgICAgICByZXF1ZXN0U3RhdGU6IFJlcXVlc3RTdGF0ZS5JRExFXHJcbiAgICAgIH0pXHJcbiAgICApLFxyXG4gICAgLi4uY3JlYXRlUmVxdWVzdFN0YXRlQWN0aW9uSGFuZGxlcnM8Rm9ybVN0YXRlPFQsIEU+LCBFPihcclxuICAgICAgYWN0aW9ucy5sb2FkLFxyXG4gICAgICBhY3Rpb25zLnNhdmUsXHJcbiAgICAgIGFjdGlvbnMuc2F2ZVN1Y2Nlc3MsXHJcbiAgICAgIGFjdGlvbnMuc2F2ZUZhaWx1cmVcclxuICAgICksXHJcbiAgICAuLi5jcmVhdGVSZXF1ZXN0U3RhdGVBY3Rpb25IYW5kbGVyczxGb3JtU3RhdGU8VCwgRT4sIEU+KFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgIGFjdGlvbnMuY3JlYXRlLFxyXG4gICAgICBhY3Rpb25zLmNyZWF0ZVN1Y2Nlc3MsXHJcbiAgICAgIGFjdGlvbnMuY3JlYXRlRmFpbHVyZVxyXG4gICAgKSxcclxuICAgIC4uLmNyZWF0ZVJlcXVlc3RTdGF0ZUFjdGlvbkhhbmRsZXJzPEZvcm1TdGF0ZTxULCBFPiwgRT4oXHJcbiAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgYWN0aW9ucy5kZWxldGUsXHJcbiAgICAgIGFjdGlvbnMuZGVsZXRlU3VjY2VzcyxcclxuICAgICAgYWN0aW9ucy5kZWxldGVGYWlsdXJlXHJcbiAgICApLFxyXG4gICAgLi4uY3JlYXRlTG9hZGluZ1N0YXRlQWN0aW9uSGFuZGxlcnM8Rm9ybVN0YXRlPFQsIEU+PihhY3Rpb25zLmxvYWQsIGFjdGlvbnMubG9hZFN1Y2Nlc3MsIGFjdGlvbnMubG9hZEZhaWx1cmUpXHJcbiAgXTtcclxufVxyXG4iXX0=
@@ -0,0 +1,17 @@
1
+ import { createSelector } from '@ngrx/store';
2
+ import { RequestState } from '../common/request-state.model';
3
+ export function createFormSelectors(getFormState) {
4
+ const getRequestState = createSelector(getFormState, state => state.requestState);
5
+ const getLoadingState = createSelector(getFormState, state => state.loadingState);
6
+ const getErrors = createSelector(getFormState, state => state.errors);
7
+ const getResource = createSelector(getFormState, state => state.resource);
8
+ const isReady = createSelector(getResource, getLoadingState, (resource, loadingState) => !!resource && loadingState === RequestState.SUCCESS);
9
+ return {
10
+ getRequestState,
11
+ getLoadingState,
12
+ getErrors,
13
+ getResource,
14
+ isReady
15
+ };
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zZWxlY3RvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NoYXJlZC91dGlsLXN0b3JlLWZvcm0vc3JjL2xpYi8rc3RhdGUvZm9ybS1zZWxlY3RvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBd0MsTUFBTSxhQUFhLENBQUM7QUFDbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzdELE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsWUFBNEY7SUFFNUYsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRixNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEUsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUxRSxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQzVCLFdBQVcsRUFDWCxlQUFlLEVBQ2YsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLFlBQVksS0FBSyxZQUFZLENBQUMsT0FBTyxDQUNoRixDQUFDO0lBRUYsT0FBTztRQUNMLGVBQWU7UUFDZixlQUFlO1FBQ2YsU0FBUztRQUNULFdBQVc7UUFDWCxPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVTZWxlY3RvciwgRGVmYXVsdFByb2plY3RvckZuLCBNZW1vaXplZFNlbGVjdG9yIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBSZXF1ZXN0U3RhdGUgfSBmcm9tICcuLi9jb21tb24vcmVxdWVzdC1zdGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1TZWxlY3RvcnMsIEZvcm1TdGF0ZSB9IGZyb20gJy4uL21vZGVscy9mb3JtLm1vZGVsJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtU2VsZWN0b3JzPFQsIEU+KFxyXG4gIGdldEZvcm1TdGF0ZTogTWVtb2l6ZWRTZWxlY3RvcjxvYmplY3QsIEZvcm1TdGF0ZTxULCBFPiwgRGVmYXVsdFByb2plY3RvckZuPEZvcm1TdGF0ZTxULCBFPj4+XHJcbik6IEZvcm1TZWxlY3RvcnM8VCwgRT4ge1xyXG4gIGNvbnN0IGdldFJlcXVlc3RTdGF0ZSA9IGNyZWF0ZVNlbGVjdG9yKGdldEZvcm1TdGF0ZSwgc3RhdGUgPT4gc3RhdGUucmVxdWVzdFN0YXRlKTtcclxuICBjb25zdCBnZXRMb2FkaW5nU3RhdGUgPSBjcmVhdGVTZWxlY3RvcihnZXRGb3JtU3RhdGUsIHN0YXRlID0+IHN0YXRlLmxvYWRpbmdTdGF0ZSk7XHJcbiAgY29uc3QgZ2V0RXJyb3JzID0gY3JlYXRlU2VsZWN0b3IoZ2V0Rm9ybVN0YXRlLCBzdGF0ZSA9PiBzdGF0ZS5lcnJvcnMpO1xyXG4gIGNvbnN0IGdldFJlc291cmNlID0gY3JlYXRlU2VsZWN0b3IoZ2V0Rm9ybVN0YXRlLCBzdGF0ZSA9PiBzdGF0ZS5yZXNvdXJjZSk7XHJcblxyXG4gIGNvbnN0IGlzUmVhZHkgPSBjcmVhdGVTZWxlY3RvcihcclxuICAgIGdldFJlc291cmNlLFxyXG4gICAgZ2V0TG9hZGluZ1N0YXRlLFxyXG4gICAgKHJlc291cmNlLCBsb2FkaW5nU3RhdGUpID0+ICEhcmVzb3VyY2UgJiYgbG9hZGluZ1N0YXRlID09PSBSZXF1ZXN0U3RhdGUuU1VDQ0VTU1xyXG4gICk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZXRSZXF1ZXN0U3RhdGUsXHJcbiAgICBnZXRMb2FkaW5nU3RhdGUsXHJcbiAgICBnZXRFcnJvcnMsXHJcbiAgICBnZXRSZXNvdXJjZSxcclxuICAgIGlzUmVhZHlcclxuICB9O1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,9 @@
1
+ // TODO: move to a common lib
2
+ export var RequestState;
3
+ (function (RequestState) {
4
+ RequestState["IDLE"] = "IDLE";
5
+ RequestState["IN_PROGRESS"] = "IN_PROGRESS";
6
+ RequestState["FAILURE"] = "FAILURE";
7
+ RequestState["SUCCESS"] = "SUCCESS";
8
+ })(RequestState || (RequestState = {}));
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1zdGF0ZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2hhcmVkL3V0aWwtc3RvcmUtZm9ybS9zcmMvbGliL2NvbW1vbi9yZXF1ZXN0LXN0YXRlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZCQUE2QjtBQUM3QixNQUFNLENBQU4sSUFBWSxZQUtYO0FBTEQsV0FBWSxZQUFZO0lBQ3RCLDZCQUFhLENBQUE7SUFDYiwyQ0FBMkIsQ0FBQTtJQUMzQixtQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsWUFBWSxLQUFaLFlBQVksUUFLdkIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUT0RPOiBtb3ZlIHRvIGEgY29tbW9uIGxpYlxyXG5leHBvcnQgZW51bSBSZXF1ZXN0U3RhdGUge1xyXG4gIElETEUgPSAnSURMRScsXHJcbiAgSU5fUFJPR1JFU1MgPSAnSU5fUFJPR1JFU1MnLFxyXG4gIEZBSUxVUkUgPSAnRkFJTFVSRScsXHJcbiAgU1VDQ0VTUyA9ICdTVUNDRVNTJ1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import { createAction, on } from '@ngrx/store';
2
+ import { RequestState } from '../request-state.model';
3
+ export function createRequestStateActionHandlers(loadAction, saveAction, saveSuccessAction, saveFailureAction) {
4
+ if (!loadAction) {
5
+ loadAction = createAction('DummyRequestStateLoadAction');
6
+ }
7
+ return [
8
+ on(loadAction, state => ({ ...state, requestState: RequestState.IDLE })),
9
+ on(saveAction, state => ({
10
+ ...state,
11
+ requestState: RequestState.IN_PROGRESS,
12
+ errors: undefined
13
+ })),
14
+ on(saveSuccessAction, state => ({ ...state, requestState: RequestState.SUCCESS })),
15
+ on(saveFailureAction, (state, { errors }) => ({
16
+ ...state,
17
+ requestState: RequestState.FAILURE,
18
+ errors
19
+ }))
20
+ ];
21
+ }
22
+ export function createLoadingStateActionHandlers(loadAction, loadSuccessAction, loadFailureAction) {
23
+ return [
24
+ on(loadAction, state => ({ ...state, loadingState: RequestState.IN_PROGRESS })),
25
+ on(loadSuccessAction, state => ({ ...state, loadingState: RequestState.SUCCESS })),
26
+ on(loadFailureAction, state => ({ ...state, loadingState: RequestState.FAILURE }))
27
+ ];
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWhhbmRsZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zaGFyZWQvdXRpbC1zdG9yZS1mb3JtL3NyYy9saWIvY29tbW9uL3V0aWxzL2FjdGlvbi1oYW5kbGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFlBQVksRUFBRSxFQUFFLEVBQWdCLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVd0RCxNQUFNLFVBQVUsZ0NBQWdDLENBQzlDLFVBQXlCLEVBQ3pCLFVBQXlCLEVBQ3pCLGlCQUFnQyxFQUNoQyxpQkFBaUY7SUFFakYsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNmLFVBQVUsR0FBRyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztLQUMxRDtJQUVELE9BQU87UUFDTCxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RSxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QixHQUFHLEtBQUs7WUFDUixZQUFZLEVBQUUsWUFBWSxDQUFDLFdBQVc7WUFDdEMsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRixFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QyxHQUFHLEtBQUs7WUFDUixZQUFZLEVBQUUsWUFBWSxDQUFDLE9BQU87WUFDbEMsTUFBTTtTQUNQLENBQUMsQ0FBQztLQUNKLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGdDQUFnQyxDQUM5QyxVQUF5QixFQUN6QixpQkFBZ0MsRUFDaEMsaUJBQWdDO0lBRWhDLE9BQU87UUFDTCxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMvRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7S0FDbkYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb25DcmVhdG9yLCBjcmVhdGVBY3Rpb24sIG9uLCBSZWR1Y2VyVHlwZXMgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4uL3JlcXVlc3Qtc3RhdGUubW9kZWwnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBcGlSZXF1ZXN0U3RhdGU8RT4ge1xyXG4gIHJlcXVlc3RTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG4gIGVycm9yczogRTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMb2FkaW5nU3RhdGUge1xyXG4gIGxvYWRpbmdTdGF0ZTogUmVxdWVzdFN0YXRlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdFN0YXRlQWN0aW9uSGFuZGxlcnM8VCBleHRlbmRzIEFwaVJlcXVlc3RTdGF0ZTxFPiwgRT4oXHJcbiAgbG9hZEFjdGlvbjogQWN0aW9uQ3JlYXRvcixcclxuICBzYXZlQWN0aW9uOiBBY3Rpb25DcmVhdG9yLFxyXG4gIHNhdmVTdWNjZXNzQWN0aW9uOiBBY3Rpb25DcmVhdG9yLFxyXG4gIHNhdmVGYWlsdXJlQWN0aW9uOiBBY3Rpb25DcmVhdG9yPHN0cmluZywgKHByb3BzOiB7IGVycm9yczogRSB9KSA9PiB7IGVycm9yczogRSB9PlxyXG4pOiBSZWR1Y2VyVHlwZXM8VCwgQWN0aW9uQ3JlYXRvcltdPltdIHtcclxuICBpZiAoIWxvYWRBY3Rpb24pIHtcclxuICAgIGxvYWRBY3Rpb24gPSBjcmVhdGVBY3Rpb24oJ0R1bW15UmVxdWVzdFN0YXRlTG9hZEFjdGlvbicpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIFtcclxuICAgIG9uKGxvYWRBY3Rpb24sIHN0YXRlID0+ICh7IC4uLnN0YXRlLCByZXF1ZXN0U3RhdGU6IFJlcXVlc3RTdGF0ZS5JRExFIH0pKSxcclxuICAgIG9uKHNhdmVBY3Rpb24sIHN0YXRlID0+ICh7XHJcbiAgICAgIC4uLnN0YXRlLFxyXG4gICAgICByZXF1ZXN0U3RhdGU6IFJlcXVlc3RTdGF0ZS5JTl9QUk9HUkVTUyxcclxuICAgICAgZXJyb3JzOiB1bmRlZmluZWRcclxuICAgIH0pKSxcclxuICAgIG9uKHNhdmVTdWNjZXNzQWN0aW9uLCBzdGF0ZSA9PiAoeyAuLi5zdGF0ZSwgcmVxdWVzdFN0YXRlOiBSZXF1ZXN0U3RhdGUuU1VDQ0VTUyB9KSksXHJcbiAgICBvbihzYXZlRmFpbHVyZUFjdGlvbiwgKHN0YXRlLCB7IGVycm9ycyB9KSA9PiAoe1xyXG4gICAgICAuLi5zdGF0ZSxcclxuICAgICAgcmVxdWVzdFN0YXRlOiBSZXF1ZXN0U3RhdGUuRkFJTFVSRSxcclxuICAgICAgZXJyb3JzXHJcbiAgICB9KSlcclxuICBdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9hZGluZ1N0YXRlQWN0aW9uSGFuZGxlcnM8VCBleHRlbmRzIExvYWRpbmdTdGF0ZT4oXHJcbiAgbG9hZEFjdGlvbjogQWN0aW9uQ3JlYXRvcixcclxuICBsb2FkU3VjY2Vzc0FjdGlvbjogQWN0aW9uQ3JlYXRvcixcclxuICBsb2FkRmFpbHVyZUFjdGlvbjogQWN0aW9uQ3JlYXRvclxyXG4pOiBSZWR1Y2VyVHlwZXM8VCwgQWN0aW9uQ3JlYXRvcltdPltdIHtcclxuICByZXR1cm4gW1xyXG4gICAgb24obG9hZEFjdGlvbiwgc3RhdGUgPT4gKHsgLi4uc3RhdGUsIGxvYWRpbmdTdGF0ZTogUmVxdWVzdFN0YXRlLklOX1BST0dSRVNTIH0pKSxcclxuICAgIG9uKGxvYWRTdWNjZXNzQWN0aW9uLCBzdGF0ZSA9PiAoeyAuLi5zdGF0ZSwgbG9hZGluZ1N0YXRlOiBSZXF1ZXN0U3RhdGUuU1VDQ0VTUyB9KSksXHJcbiAgICBvbihsb2FkRmFpbHVyZUFjdGlvbiwgc3RhdGUgPT4gKHsgLi4uc3RhdGUsIGxvYWRpbmdTdGF0ZTogUmVxdWVzdFN0YXRlLkZBSUxVUkUgfSkpXHJcbiAgXTtcclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2hhcmVkL3V0aWwtc3RvcmUtZm9ybS9zcmMvbGliL21vZGVscy9mb3JtLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb25DcmVhdG9yLCBNZW1vaXplZFNlbGVjdG9yIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBUeXBlZEFjdGlvbiB9IGZyb20gJ0BuZ3J4L3N0b3JlL3NyYy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJlcXVlc3RTdGF0ZSB9IGZyb20gJy4uL2NvbW1vbi9yZXF1ZXN0LXN0YXRlLm1vZGVsJztcclxuaW1wb3J0IHsgQXBpUmVxdWVzdFN0YXRlLCBMb2FkaW5nU3RhdGUgfSBmcm9tICcuLi9jb21tb24vdXRpbHMvYWN0aW9uLWhhbmRsZXJzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVN0YXRlPFQsIEU+IGV4dGVuZHMgQXBpUmVxdWVzdFN0YXRlPEU+LCBMb2FkaW5nU3RhdGUge1xyXG4gIHJlc291cmNlOiBUO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TZWxlY3RvcnM8VCwgRT4ge1xyXG4gIGdldFJlcXVlc3RTdGF0ZTogTWVtb2l6ZWRTZWxlY3RvcjxvYmplY3QsIFJlcXVlc3RTdGF0ZT47XHJcbiAgZ2V0TG9hZGluZ1N0YXRlOiBNZW1vaXplZFNlbGVjdG9yPG9iamVjdCwgUmVxdWVzdFN0YXRlPjtcclxuICBnZXRFcnJvcnM6IE1lbW9pemVkU2VsZWN0b3I8b2JqZWN0LCBFPjtcclxuICBnZXRSZXNvdXJjZTogTWVtb2l6ZWRTZWxlY3RvcjxvYmplY3QsIFQ+O1xyXG4gIGlzUmVhZHk6IE1lbW9pemVkU2VsZWN0b3I8b2JqZWN0LCBib29sZWFuPjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGb3JtQWN0aW9uczxULCBFPiB7XHJcbiAgbG9hZDogQWN0aW9uQ3JlYXRvcjxzdHJpbmcsIChwcm9wczogeyBpZDogc3RyaW5nIH0pID0+IHsgaWQ6IHN0cmluZyB9ICYgVHlwZWRBY3Rpb248c3RyaW5nPj47XHJcbiAgbG9hZFN1Y2Nlc3M6IEFjdGlvbkNyZWF0b3I8c3RyaW5nLCAocHJvcHM6IHsgcmVzb3VyY2U6IFQgfSkgPT4geyByZXNvdXJjZTogVCB9ICYgVHlwZWRBY3Rpb248c3RyaW5nPj47XHJcbiAgbG9hZEZhaWx1cmU6IEFjdGlvbkNyZWF0b3I8c3RyaW5nLCAocHJvcHM6IHsgZXJyb3JzOiBFIH0pID0+IHsgZXJyb3JzOiBFIH0gJiBUeXBlZEFjdGlvbjxzdHJpbmc+PjtcclxuXHJcbiAgc2F2ZTogQWN0aW9uQ3JlYXRvcjxzdHJpbmcsIChwcm9wczogeyByZXNvdXJjZTogVCB9KSA9PiB7IHJlc291cmNlOiBUIH0gJiBUeXBlZEFjdGlvbjxzdHJpbmc+PjtcclxuICBzYXZlU3VjY2VzczogQWN0aW9uQ3JlYXRvcjxzdHJpbmcsIChwcm9wczogeyByZXNvdXJjZTogVCB9KSA9PiB7IHJlc291cmNlOiBUIH0gJiBUeXBlZEFjdGlvbjxzdHJpbmc+PjtcclxuICBzYXZlRmFpbHVyZTogQWN0aW9uQ3JlYXRvcjxzdHJpbmcsIChwcm9wczogeyBlcnJvcnM6IEUgfSkgPT4geyBlcnJvcnM6IEUgfSAmIFR5cGVkQWN0aW9uPHN0cmluZz4+O1xyXG5cclxuICBkZWxldGU6IEFjdGlvbkNyZWF0b3I8c3RyaW5nLCAocHJvcHM6IHsgaWQ6IHN0cmluZyB9KSA9PiB7IGlkOiBzdHJpbmcgfSAmIFR5cGVkQWN0aW9uPHN0cmluZz4+O1xyXG4gIGRlbGV0ZVN1Y2Nlc3M6IEFjdGlvbkNyZWF0b3I8c3RyaW5nLCAocHJvcHM6IHsgaWQ6IHN0cmluZyB9KSA9PiB7IGlkOiBzdHJpbmcgfSAmIFR5cGVkQWN0aW9uPHN0cmluZz4+O1xyXG4gIGRlbGV0ZUZhaWx1cmU6IEFjdGlvbkNyZWF0b3I8c3RyaW5nLCAocHJvcHM6IHsgZXJyb3JzOiBFIH0pID0+IHsgZXJyb3JzOiBFIH0gJiBUeXBlZEFjdGlvbjxzdHJpbmc+PjtcclxuXHJcbiAgbmF2aWdhdGVUb0NyZWF0ZTogQWN0aW9uQ3JlYXRvcjxzdHJpbmcsICgpID0+IFR5cGVkQWN0aW9uPHN0cmluZz4+O1xyXG4gIGNyZWF0ZTogQWN0aW9uQ3JlYXRvcjxzdHJpbmcsIChwcm9wczogeyByZXNvdXJjZTogVCB9KSA9PiB7IHJlc291cmNlOiBUIH0gJiBUeXBlZEFjdGlvbjxzdHJpbmc+PjtcclxuICBjcmVhdGVTdWNjZXNzOiBBY3Rpb25DcmVhdG9yPHN0cmluZywgKHByb3BzOiB7IHJlc291cmNlOiBUIH0pID0+IHsgcmVzb3VyY2U6IFQgfSAmIFR5cGVkQWN0aW9uPHN0cmluZz4+O1xyXG4gIGNyZWF0ZUZhaWx1cmU6IEFjdGlvbkNyZWF0b3I8c3RyaW5nLCAocHJvcHM6IHsgZXJyb3JzOiBFIH0pID0+IHsgZXJyb3JzOiBFIH0gJiBUeXBlZEFjdGlvbjxzdHJpbmc+PjtcclxuXHJcbiAgcmVzZXQ6IEFjdGlvbkNyZWF0b3I8c3RyaW5nLCAoKSA9PiBUeXBlZEFjdGlvbjxzdHJpbmc+PjtcclxuXHJcbiAgY29weTogQWN0aW9uQ3JlYXRvcjxzdHJpbmcsICgpID0+IFR5cGVkQWN0aW9uPHN0cmluZz4+O1xyXG4gIGNvcHlTZWxlY3RlZDogQWN0aW9uQ3JlYXRvcjxzdHJpbmcsIChwcm9wczogeyBpZDogc3RyaW5nIH0pID0+IHsgaWQ6IHN0cmluZyB9ICYgVHlwZWRBY3Rpb248c3RyaW5nPj47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdEdXhGb3JtTm90aWZpY2F0aW9uU2VydmljZTxFPiB7XHJcbiAgb25FcnJvcnM6IChlcnJvcnM6IEUpID0+IHZvaWQ7XHJcbiAgb25EZWxldGU6IChpZDogc3RyaW5nKSA9PiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TZXJ2aWNlPFQ+IHtcclxuICBsb2FkUmVzb3VyY2UoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8VD47XHJcblxyXG4gIHNhdmVSZXNvdXJjZT8ocmVzb3VyY2U6IFQpOiBPYnNlcnZhYmxlPFQ+O1xyXG5cclxuICBkZWxldGVSZXNvdXJjZT8oaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD47XHJcblxyXG4gIGNyZWF0ZVJlc291cmNlPyhyZXNvdXJjZTogVCk6IE9ic2VydmFibGU8VD47XHJcbn1cclxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdkdXgtZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvc2hhcmVkL3V0aWwtc3RvcmUtZm9ybS9zcmMvbmdkdXgtZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,148 @@
1
+ import { createEffect, ofType } from '@ngrx/effects';
2
+ import { of } from 'rxjs';
3
+ import { switchMap, map, catchError, exhaustMap, tap } from 'rxjs/operators';
4
+ import { createAction, props, on, createReducer, createSelector } from '@ngrx/store';
5
+
6
+ class AbstractFormEffects {
7
+ constructor(router, actions$, store, service, formActions, notificationService) {
8
+ this.router = router;
9
+ this.actions$ = actions$;
10
+ this.store = store;
11
+ this.service = service;
12
+ this.formActions = formActions;
13
+ this.notificationService = notificationService;
14
+ this.load$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.load), switchMap(({ id }) => this.service.loadResource(id).pipe(map(resource => this.formActions.loadSuccess({ resource })), catchError((errors) => of(this.formActions.loadFailure({ errors })))))));
15
+ this.create$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.create), switchMap(action => this.service.createResource(action.resource).pipe(map(resource => this.formActions.createSuccess({ resource })), catchError((errors) => of(this.formActions.createFailure({ errors })))))));
16
+ this.update$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.save), switchMap(({ resource }) => this.service.saveResource(resource).pipe(map(response => this.formActions.saveSuccess({ resource: response })), catchError((errors) => of(this.formActions.saveFailure({ errors })))))));
17
+ this.delete$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.delete), exhaustMap(action => this.service.deleteResource(action.id).pipe(map(() => this.formActions.deleteSuccess({ id: action.id })), catchError((errors) => of(this.formActions.deleteFailure({ errors })))))));
18
+ this.deleteSuccess$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.deleteSuccess), tap(({ id }) => {
19
+ this.notificationService.onDelete(id);
20
+ this.router.navigate(['..']);
21
+ })));
22
+ this.createSuccess$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.createSuccess), tap(() => {
23
+ this.router.navigate(['..']);
24
+ })));
25
+ this.navigateToCreateResource$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.navigateToCreate), map(() => this.formActions.reset()), tap(() => {
26
+ this.router.navigate(['..']);
27
+ })));
28
+ this.copy$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.copy), tap(() => {
29
+ this.router.navigate(['..']);
30
+ })), { dispatch: false });
31
+ this.copySelected$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.copySelected), map(({ id }) => this.formActions.load({ id }))));
32
+ this.errorsHandler$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.saveFailure, this.formActions.loadFailure, this.formActions.deleteFailure, this.formActions.createFailure), tap(({ errors }) => {
33
+ this.notificationService.onErrors(errors);
34
+ })), { dispatch: false });
35
+ }
36
+ }
37
+
38
+ function createFormActions(featureName) {
39
+ const load = createAction(`[${featureName} API] Load ${featureName}`, props());
40
+ const loadSuccess = createAction(`[${featureName} API] Load ${featureName} Success`, props());
41
+ const loadFailure = createAction(`[${featureName} API] Load ${featureName} Failure`, props());
42
+ const save = createAction(`[${featureName} API] Save ${featureName}`, props());
43
+ const saveSuccess = createAction(`[${featureName} API] Save ${featureName} Success`, props());
44
+ const saveFailure = createAction(`[${featureName} API] Save ${featureName} Failure`, props());
45
+ const deleteAction = createAction(`[${featureName} API] Delete ${featureName}`, props());
46
+ const deleteSuccess = createAction(`[${featureName} API] Delete ${featureName} Success`, props());
47
+ const deleteFailure = createAction(`[${featureName} API] Delete ${featureName} Failure`, props());
48
+ const navigateToCreate = createAction(`[${featureName} Page] Navigate to Create ${featureName}`);
49
+ const create = createAction(`[${featureName} API] Create ${featureName}`, props());
50
+ const createSuccess = createAction(`[${featureName} API] Create ${featureName} Success`, props());
51
+ const createFailure = createAction(`[${featureName} API] Create ${featureName} Failure`, props());
52
+ const reset = createAction(`[${featureName} API] Reset ${featureName}`);
53
+ const copy = createAction(`[${featureName} Page] Copy ${featureName}`);
54
+ const copySelected = createAction(`[${featureName} Page] Copy Selected ${featureName}`, props());
55
+ return {
56
+ load,
57
+ loadSuccess,
58
+ loadFailure,
59
+ save,
60
+ saveSuccess,
61
+ saveFailure,
62
+ delete: deleteAction,
63
+ deleteSuccess,
64
+ deleteFailure,
65
+ navigateToCreate,
66
+ create,
67
+ createSuccess,
68
+ createFailure,
69
+ reset,
70
+ copy,
71
+ copySelected
72
+ };
73
+ }
74
+
75
+ // TODO: move to a common lib
76
+ var RequestState;
77
+ (function (RequestState) {
78
+ RequestState["IDLE"] = "IDLE";
79
+ RequestState["IN_PROGRESS"] = "IN_PROGRESS";
80
+ RequestState["FAILURE"] = "FAILURE";
81
+ RequestState["SUCCESS"] = "SUCCESS";
82
+ })(RequestState || (RequestState = {}));
83
+
84
+ function createRequestStateActionHandlers(loadAction, saveAction, saveSuccessAction, saveFailureAction) {
85
+ if (!loadAction) {
86
+ loadAction = createAction('DummyRequestStateLoadAction');
87
+ }
88
+ return [
89
+ on(loadAction, state => (Object.assign(Object.assign({}, state), { requestState: RequestState.IDLE }))),
90
+ on(saveAction, state => (Object.assign(Object.assign({}, state), { requestState: RequestState.IN_PROGRESS, errors: undefined }))),
91
+ on(saveSuccessAction, state => (Object.assign(Object.assign({}, state), { requestState: RequestState.SUCCESS }))),
92
+ on(saveFailureAction, (state, { errors }) => (Object.assign(Object.assign({}, state), { requestState: RequestState.FAILURE, errors })))
93
+ ];
94
+ }
95
+ function createLoadingStateActionHandlers(loadAction, loadSuccessAction, loadFailureAction) {
96
+ return [
97
+ on(loadAction, state => (Object.assign(Object.assign({}, state), { loadingState: RequestState.IN_PROGRESS }))),
98
+ on(loadSuccessAction, state => (Object.assign(Object.assign({}, state), { loadingState: RequestState.SUCCESS }))),
99
+ on(loadFailureAction, state => (Object.assign(Object.assign({}, state), { loadingState: RequestState.FAILURE })))
100
+ ];
101
+ }
102
+
103
+ function createFormReducer(actions, actionHandlers, initialFormState) {
104
+ const initialState = Object.assign(Object.assign({}, createInitialFormState()), initialFormState);
105
+ return createReducer(initialState, ...createFormActionHandlers(initialState, actions), ...(actionHandlers || []));
106
+ }
107
+ function createInitialFormState() {
108
+ return {
109
+ resource: undefined,
110
+ loadingState: RequestState.IDLE,
111
+ requestState: RequestState.IDLE,
112
+ errors: undefined
113
+ };
114
+ }
115
+ function createFormActionHandlers(initialFormState, actions) {
116
+ return [
117
+ on(actions.reset, () => initialFormState),
118
+ on(actions.loadSuccess, actions.createSuccess, actions.saveSuccess, (state, { resource }) => (Object.assign(Object.assign({}, state), { resource }))),
119
+ on(actions.deleteSuccess, (state) => (Object.assign(Object.assign({}, state), { resource: undefined }))),
120
+ on(actions.copy, (state) => (Object.assign(Object.assign({}, state), { loadingState: RequestState.IDLE, requestState: RequestState.IDLE }))),
121
+ ...createRequestStateActionHandlers(actions.load, actions.save, actions.saveSuccess, actions.saveFailure),
122
+ ...createRequestStateActionHandlers(undefined, actions.create, actions.createSuccess, actions.createFailure),
123
+ ...createRequestStateActionHandlers(undefined, actions.delete, actions.deleteSuccess, actions.deleteFailure),
124
+ ...createLoadingStateActionHandlers(actions.load, actions.loadSuccess, actions.loadFailure)
125
+ ];
126
+ }
127
+
128
+ function createFormSelectors(getFormState) {
129
+ const getRequestState = createSelector(getFormState, state => state.requestState);
130
+ const getLoadingState = createSelector(getFormState, state => state.loadingState);
131
+ const getErrors = createSelector(getFormState, state => state.errors);
132
+ const getResource = createSelector(getFormState, state => state.resource);
133
+ const isReady = createSelector(getResource, getLoadingState, (resource, loadingState) => !!resource && loadingState === RequestState.SUCCESS);
134
+ return {
135
+ getRequestState,
136
+ getLoadingState,
137
+ getErrors,
138
+ getResource,
139
+ isReady
140
+ };
141
+ }
142
+
143
+ /**
144
+ * Generated bundle index. Do not edit.
145
+ */
146
+
147
+ export { AbstractFormEffects, RequestState, createFormActions, createFormReducer, createFormSelectors };
148
+ //# sourceMappingURL=ngdux-form.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngdux-form.mjs","sources":["../../../../../libs/shared/util-store-form/src/lib/+state/abstract-form-effects.ts","../../../../../libs/shared/util-store-form/src/lib/+state/form-actions.ts","../../../../../libs/shared/util-store-form/src/lib/common/request-state.model.ts","../../../../../libs/shared/util-store-form/src/lib/common/utils/action-handlers.ts","../../../../../libs/shared/util-store-form/src/lib/+state/form-reducer.ts","../../../../../libs/shared/util-store-form/src/lib/+state/form-selectors.ts","../../../../../libs/shared/util-store-form/src/ngdux-form.ts"],"sourcesContent":["import { Router } from '@angular/router';\r\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\r\nimport { Store } from '@ngrx/store';\r\nimport { of } from 'rxjs';\r\nimport { catchError, exhaustMap, map, switchMap, tap } from 'rxjs/operators';\r\nimport { FormActions, FormService, NgDuxFormNotificationService } from '../models/form.model';\r\n\r\nexport abstract class AbstractFormEffects<T, E> {\r\n load$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.load),\r\n switchMap(({ id }) =>\r\n this.service.loadResource(id).pipe(\r\n map(resource => this.formActions.loadSuccess({ resource })),\r\n catchError((errors: E) => of(this.formActions.loadFailure({ errors })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n create$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.create),\r\n switchMap(action =>\r\n this.service.createResource(action.resource).pipe(\r\n map(resource => this.formActions.createSuccess({ resource })),\r\n catchError((errors: E) => of(this.formActions.createFailure({ errors })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n update$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.save),\r\n switchMap(({ resource }) =>\r\n this.service.saveResource(resource).pipe(\r\n map(response => this.formActions.saveSuccess({ resource: response })),\r\n catchError((errors: E) => of(this.formActions.saveFailure({ errors })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n delete$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.delete),\r\n exhaustMap(action =>\r\n this.service.deleteResource(action.id).pipe(\r\n map(() => this.formActions.deleteSuccess({ id: action.id })),\r\n catchError((errors: E) => of(this.formActions.deleteFailure({ errors })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n deleteSuccess$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.deleteSuccess),\r\n tap(({ id }) => {\r\n this.notificationService.onDelete(id);\r\n this.router.navigate(['..']);\r\n })\r\n )\r\n );\r\n\r\n createSuccess$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.createSuccess),\r\n tap(() => {\r\n this.router.navigate(['..']);\r\n })\r\n )\r\n );\r\n\r\n navigateToCreateResource$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.navigateToCreate),\r\n map(() => this.formActions.reset()),\r\n tap(() => {\r\n this.router.navigate(['..']);\r\n })\r\n )\r\n );\r\n\r\n copy$ = createEffect(\r\n () =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.copy),\r\n tap(() => {\r\n this.router.navigate(['..']);\r\n })\r\n ),\r\n { dispatch: false }\r\n );\r\n\r\n copySelected$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.copySelected),\r\n map(({ id }) => this.formActions.load({ id }))\r\n )\r\n );\r\n\r\n errorsHandler$ = createEffect(\r\n () =>\r\n this.actions$.pipe(\r\n ofType(\r\n this.formActions.saveFailure,\r\n this.formActions.loadFailure,\r\n this.formActions.deleteFailure,\r\n this.formActions.createFailure\r\n ),\r\n tap(({ errors }) => {\r\n this.notificationService.onErrors(errors);\r\n })\r\n ),\r\n { dispatch: false }\r\n );\r\n\r\n protected constructor(\r\n private readonly router: Router,\r\n protected readonly actions$: Actions,\r\n protected readonly store: Store,\r\n private readonly service: FormService<T>,\r\n private readonly formActions: FormActions<T, E>,\r\n private readonly notificationService: NgDuxFormNotificationService<E>\r\n ) {}\r\n}\r\n","import { createAction, props } from '@ngrx/store';\r\nimport { FormActions } from '../models/form.model';\r\n\r\nexport function createFormActions<T, E>(featureName: string): FormActions<T, E> {\r\n const load = createAction(`[${featureName} API] Load ${featureName}`, props<{ id: string }>());\r\n const loadSuccess = createAction(`[${featureName} API] Load ${featureName} Success`, props<{ resource: T }>());\r\n const loadFailure = createAction(`[${featureName} API] Load ${featureName} Failure`, props<{ errors: E }>());\r\n\r\n const save = createAction(`[${featureName} API] Save ${featureName}`, props<{ resource: T }>());\r\n const saveSuccess = createAction(`[${featureName} API] Save ${featureName} Success`, props<{ resource: T }>());\r\n const saveFailure = createAction(`[${featureName} API] Save ${featureName} Failure`, props<{ errors: E }>());\r\n\r\n const deleteAction = createAction(`[${featureName} API] Delete ${featureName}`, props<{ id: string }>());\r\n const deleteSuccess = createAction(`[${featureName} API] Delete ${featureName} Success`, props<{ id: string }>());\r\n const deleteFailure = createAction(`[${featureName} API] Delete ${featureName} Failure`, props<{ errors: E }>());\r\n\r\n const navigateToCreate = createAction(`[${featureName} Page] Navigate to Create ${featureName}`);\r\n const create = createAction(`[${featureName} API] Create ${featureName}`, props<{ resource: T }>());\r\n const createSuccess = createAction(`[${featureName} API] Create ${featureName} Success`, props<{ resource: T }>());\r\n const createFailure = createAction(`[${featureName} API] Create ${featureName} Failure`, props<{ errors: E }>());\r\n\r\n const reset = createAction(`[${featureName} API] Reset ${featureName}`);\r\n\r\n const copy = createAction(`[${featureName} Page] Copy ${featureName}`);\r\n const copySelected = createAction(`[${featureName} Page] Copy Selected ${featureName}`, props<{ id: string }>());\r\n\r\n return {\r\n load,\r\n loadSuccess,\r\n loadFailure,\r\n save,\r\n saveSuccess,\r\n saveFailure,\r\n delete: deleteAction,\r\n deleteSuccess,\r\n deleteFailure,\r\n navigateToCreate,\r\n create,\r\n createSuccess,\r\n createFailure,\r\n reset,\r\n copy,\r\n copySelected\r\n };\r\n}\r\n","// TODO: move to a common lib\r\nexport enum RequestState {\r\n IDLE = 'IDLE',\r\n IN_PROGRESS = 'IN_PROGRESS',\r\n FAILURE = 'FAILURE',\r\n SUCCESS = 'SUCCESS'\r\n}\r\n","import { ActionCreator, createAction, on, ReducerTypes } from '@ngrx/store';\r\nimport { RequestState } from '../request-state.model';\r\n\r\nexport interface ApiRequestState<E> {\r\n requestState: RequestState;\r\n errors: E;\r\n}\r\n\r\nexport interface LoadingState {\r\n loadingState: RequestState;\r\n}\r\n\r\nexport function createRequestStateActionHandlers<T extends ApiRequestState<E>, E>(\r\n loadAction: ActionCreator,\r\n saveAction: ActionCreator,\r\n saveSuccessAction: ActionCreator,\r\n saveFailureAction: ActionCreator<string, (props: { errors: E }) => { errors: E }>\r\n): ReducerTypes<T, ActionCreator[]>[] {\r\n if (!loadAction) {\r\n loadAction = createAction('DummyRequestStateLoadAction');\r\n }\r\n\r\n return [\r\n on(loadAction, state => ({ ...state, requestState: RequestState.IDLE })),\r\n on(saveAction, state => ({\r\n ...state,\r\n requestState: RequestState.IN_PROGRESS,\r\n errors: undefined\r\n })),\r\n on(saveSuccessAction, state => ({ ...state, requestState: RequestState.SUCCESS })),\r\n on(saveFailureAction, (state, { errors }) => ({\r\n ...state,\r\n requestState: RequestState.FAILURE,\r\n errors\r\n }))\r\n ];\r\n}\r\n\r\nexport function createLoadingStateActionHandlers<T extends LoadingState>(\r\n loadAction: ActionCreator,\r\n loadSuccessAction: ActionCreator,\r\n loadFailureAction: ActionCreator\r\n): ReducerTypes<T, ActionCreator[]>[] {\r\n return [\r\n on(loadAction, state => ({ ...state, loadingState: RequestState.IN_PROGRESS })),\r\n on(loadSuccessAction, state => ({ ...state, loadingState: RequestState.SUCCESS })),\r\n on(loadFailureAction, state => ({ ...state, loadingState: RequestState.FAILURE }))\r\n ];\r\n}\r\n","import { ActionCreator, ActionReducer, createReducer, Creator, on, ReducerTypes } from '@ngrx/store';\r\nimport { RequestState } from '../common/request-state.model';\r\nimport { createLoadingStateActionHandlers, createRequestStateActionHandlers } from '../common/utils/action-handlers';\r\nimport { FormActions, FormState } from '../models/form.model';\r\n\r\nexport function createFormReducer<T, E>(\r\n actions: FormActions<T, E>,\r\n actionHandlers?: ReducerTypes<FormState<T, E>, ActionCreator[]>[],\r\n initialFormState?: object\r\n): ActionReducer<FormState<T, E>> {\r\n const initialState: FormState<T, E> = { ...createInitialFormState<T, E>(), ...initialFormState };\r\n return createReducer<FormState<T, E>>(\r\n initialState,\r\n ...createFormActionHandlers<T, E>(initialState, actions),\r\n ...(actionHandlers || [])\r\n );\r\n}\r\n\r\nfunction createInitialFormState<T, E>(): FormState<T, E> {\r\n return {\r\n resource: undefined,\r\n loadingState: RequestState.IDLE,\r\n requestState: RequestState.IDLE,\r\n errors: undefined\r\n };\r\n}\r\n\r\nfunction createFormActionHandlers<T, E>(\r\n initialFormState: FormState<T, E>,\r\n actions: FormActions<T, E>\r\n): ReducerTypes<FormState<T, E>, ActionCreator<string, Creator<any[], object>>[]>[] {\r\n return [\r\n on(actions.reset, (): FormState<T, E> => initialFormState),\r\n on(\r\n actions.loadSuccess,\r\n actions.createSuccess,\r\n actions.saveSuccess,\r\n (state: FormState<T, E>, { resource }): FormState<T, E> => ({ ...state, resource })\r\n ),\r\n on(\r\n actions.deleteSuccess,\r\n (state: FormState<T, E>): FormState<T, E> => ({\r\n ...state,\r\n resource: undefined\r\n })\r\n ),\r\n on(\r\n actions.copy,\r\n (state: FormState<T, E>): FormState<T, E> => ({\r\n ...state,\r\n loadingState: RequestState.IDLE,\r\n requestState: RequestState.IDLE\r\n })\r\n ),\r\n ...createRequestStateActionHandlers<FormState<T, E>, E>(\r\n actions.load,\r\n actions.save,\r\n actions.saveSuccess,\r\n actions.saveFailure\r\n ),\r\n ...createRequestStateActionHandlers<FormState<T, E>, E>(\r\n undefined,\r\n actions.create,\r\n actions.createSuccess,\r\n actions.createFailure\r\n ),\r\n ...createRequestStateActionHandlers<FormState<T, E>, E>(\r\n undefined,\r\n actions.delete,\r\n actions.deleteSuccess,\r\n actions.deleteFailure\r\n ),\r\n ...createLoadingStateActionHandlers<FormState<T, E>>(actions.load, actions.loadSuccess, actions.loadFailure)\r\n ];\r\n}\r\n","import { createSelector, DefaultProjectorFn, MemoizedSelector } from '@ngrx/store';\r\nimport { RequestState } from '../common/request-state.model';\r\nimport { FormSelectors, FormState } from '../models/form.model';\r\n\r\nexport function createFormSelectors<T, E>(\r\n getFormState: MemoizedSelector<object, FormState<T, E>, DefaultProjectorFn<FormState<T, E>>>\r\n): FormSelectors<T, E> {\r\n const getRequestState = createSelector(getFormState, state => state.requestState);\r\n const getLoadingState = createSelector(getFormState, state => state.loadingState);\r\n const getErrors = createSelector(getFormState, state => state.errors);\r\n const getResource = createSelector(getFormState, state => state.resource);\r\n\r\n const isReady = createSelector(\r\n getResource,\r\n getLoadingState,\r\n (resource, loadingState) => !!resource && loadingState === RequestState.SUCCESS\r\n );\r\n\r\n return {\r\n getRequestState,\r\n getLoadingState,\r\n getErrors,\r\n getResource,\r\n isReady\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ import { createEffect, ofType } from '@ngrx/effects';
2
+ import { of } from 'rxjs';
3
+ import { switchMap, map, catchError, exhaustMap, tap } from 'rxjs/operators';
4
+ import { createAction, props, on, createReducer, createSelector } from '@ngrx/store';
5
+
6
+ class AbstractFormEffects {
7
+ constructor(router, actions$, store, service, formActions, notificationService) {
8
+ this.router = router;
9
+ this.actions$ = actions$;
10
+ this.store = store;
11
+ this.service = service;
12
+ this.formActions = formActions;
13
+ this.notificationService = notificationService;
14
+ this.load$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.load), switchMap(({ id }) => this.service.loadResource(id).pipe(map(resource => this.formActions.loadSuccess({ resource })), catchError((errors) => of(this.formActions.loadFailure({ errors })))))));
15
+ this.create$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.create), switchMap(action => this.service.createResource(action.resource).pipe(map(resource => this.formActions.createSuccess({ resource })), catchError((errors) => of(this.formActions.createFailure({ errors })))))));
16
+ this.update$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.save), switchMap(({ resource }) => this.service.saveResource(resource).pipe(map(response => this.formActions.saveSuccess({ resource: response })), catchError((errors) => of(this.formActions.saveFailure({ errors })))))));
17
+ this.delete$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.delete), exhaustMap(action => this.service.deleteResource(action.id).pipe(map(() => this.formActions.deleteSuccess({ id: action.id })), catchError((errors) => of(this.formActions.deleteFailure({ errors })))))));
18
+ this.deleteSuccess$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.deleteSuccess), tap(({ id }) => {
19
+ this.notificationService.onDelete(id);
20
+ this.router.navigate(['..']);
21
+ })));
22
+ this.createSuccess$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.createSuccess), tap(() => {
23
+ this.router.navigate(['..']);
24
+ })));
25
+ this.navigateToCreateResource$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.navigateToCreate), map(() => this.formActions.reset()), tap(() => {
26
+ this.router.navigate(['..']);
27
+ })));
28
+ this.copy$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.copy), tap(() => {
29
+ this.router.navigate(['..']);
30
+ })), { dispatch: false });
31
+ this.copySelected$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.copySelected), map(({ id }) => this.formActions.load({ id }))));
32
+ this.errorsHandler$ = createEffect(() => this.actions$.pipe(ofType(this.formActions.saveFailure, this.formActions.loadFailure, this.formActions.deleteFailure, this.formActions.createFailure), tap(({ errors }) => {
33
+ this.notificationService.onErrors(errors);
34
+ })), { dispatch: false });
35
+ }
36
+ }
37
+
38
+ function createFormActions(featureName) {
39
+ const load = createAction(`[${featureName} API] Load ${featureName}`, props());
40
+ const loadSuccess = createAction(`[${featureName} API] Load ${featureName} Success`, props());
41
+ const loadFailure = createAction(`[${featureName} API] Load ${featureName} Failure`, props());
42
+ const save = createAction(`[${featureName} API] Save ${featureName}`, props());
43
+ const saveSuccess = createAction(`[${featureName} API] Save ${featureName} Success`, props());
44
+ const saveFailure = createAction(`[${featureName} API] Save ${featureName} Failure`, props());
45
+ const deleteAction = createAction(`[${featureName} API] Delete ${featureName}`, props());
46
+ const deleteSuccess = createAction(`[${featureName} API] Delete ${featureName} Success`, props());
47
+ const deleteFailure = createAction(`[${featureName} API] Delete ${featureName} Failure`, props());
48
+ const navigateToCreate = createAction(`[${featureName} Page] Navigate to Create ${featureName}`);
49
+ const create = createAction(`[${featureName} API] Create ${featureName}`, props());
50
+ const createSuccess = createAction(`[${featureName} API] Create ${featureName} Success`, props());
51
+ const createFailure = createAction(`[${featureName} API] Create ${featureName} Failure`, props());
52
+ const reset = createAction(`[${featureName} API] Reset ${featureName}`);
53
+ const copy = createAction(`[${featureName} Page] Copy ${featureName}`);
54
+ const copySelected = createAction(`[${featureName} Page] Copy Selected ${featureName}`, props());
55
+ return {
56
+ load,
57
+ loadSuccess,
58
+ loadFailure,
59
+ save,
60
+ saveSuccess,
61
+ saveFailure,
62
+ delete: deleteAction,
63
+ deleteSuccess,
64
+ deleteFailure,
65
+ navigateToCreate,
66
+ create,
67
+ createSuccess,
68
+ createFailure,
69
+ reset,
70
+ copy,
71
+ copySelected
72
+ };
73
+ }
74
+
75
+ // TODO: move to a common lib
76
+ var RequestState;
77
+ (function (RequestState) {
78
+ RequestState["IDLE"] = "IDLE";
79
+ RequestState["IN_PROGRESS"] = "IN_PROGRESS";
80
+ RequestState["FAILURE"] = "FAILURE";
81
+ RequestState["SUCCESS"] = "SUCCESS";
82
+ })(RequestState || (RequestState = {}));
83
+
84
+ function createRequestStateActionHandlers(loadAction, saveAction, saveSuccessAction, saveFailureAction) {
85
+ if (!loadAction) {
86
+ loadAction = createAction('DummyRequestStateLoadAction');
87
+ }
88
+ return [
89
+ on(loadAction, state => ({ ...state, requestState: RequestState.IDLE })),
90
+ on(saveAction, state => ({
91
+ ...state,
92
+ requestState: RequestState.IN_PROGRESS,
93
+ errors: undefined
94
+ })),
95
+ on(saveSuccessAction, state => ({ ...state, requestState: RequestState.SUCCESS })),
96
+ on(saveFailureAction, (state, { errors }) => ({
97
+ ...state,
98
+ requestState: RequestState.FAILURE,
99
+ errors
100
+ }))
101
+ ];
102
+ }
103
+ function createLoadingStateActionHandlers(loadAction, loadSuccessAction, loadFailureAction) {
104
+ return [
105
+ on(loadAction, state => ({ ...state, loadingState: RequestState.IN_PROGRESS })),
106
+ on(loadSuccessAction, state => ({ ...state, loadingState: RequestState.SUCCESS })),
107
+ on(loadFailureAction, state => ({ ...state, loadingState: RequestState.FAILURE }))
108
+ ];
109
+ }
110
+
111
+ function createFormReducer(actions, actionHandlers, initialFormState) {
112
+ const initialState = { ...createInitialFormState(), ...initialFormState };
113
+ return createReducer(initialState, ...createFormActionHandlers(initialState, actions), ...(actionHandlers || []));
114
+ }
115
+ function createInitialFormState() {
116
+ return {
117
+ resource: undefined,
118
+ loadingState: RequestState.IDLE,
119
+ requestState: RequestState.IDLE,
120
+ errors: undefined
121
+ };
122
+ }
123
+ function createFormActionHandlers(initialFormState, actions) {
124
+ return [
125
+ on(actions.reset, () => initialFormState),
126
+ on(actions.loadSuccess, actions.createSuccess, actions.saveSuccess, (state, { resource }) => ({ ...state, resource })),
127
+ on(actions.deleteSuccess, (state) => ({
128
+ ...state,
129
+ resource: undefined
130
+ })),
131
+ on(actions.copy, (state) => ({
132
+ ...state,
133
+ loadingState: RequestState.IDLE,
134
+ requestState: RequestState.IDLE
135
+ })),
136
+ ...createRequestStateActionHandlers(actions.load, actions.save, actions.saveSuccess, actions.saveFailure),
137
+ ...createRequestStateActionHandlers(undefined, actions.create, actions.createSuccess, actions.createFailure),
138
+ ...createRequestStateActionHandlers(undefined, actions.delete, actions.deleteSuccess, actions.deleteFailure),
139
+ ...createLoadingStateActionHandlers(actions.load, actions.loadSuccess, actions.loadFailure)
140
+ ];
141
+ }
142
+
143
+ function createFormSelectors(getFormState) {
144
+ const getRequestState = createSelector(getFormState, state => state.requestState);
145
+ const getLoadingState = createSelector(getFormState, state => state.loadingState);
146
+ const getErrors = createSelector(getFormState, state => state.errors);
147
+ const getResource = createSelector(getFormState, state => state.resource);
148
+ const isReady = createSelector(getResource, getLoadingState, (resource, loadingState) => !!resource && loadingState === RequestState.SUCCESS);
149
+ return {
150
+ getRequestState,
151
+ getLoadingState,
152
+ getErrors,
153
+ getResource,
154
+ isReady
155
+ };
156
+ }
157
+
158
+ /**
159
+ * Generated bundle index. Do not edit.
160
+ */
161
+
162
+ export { AbstractFormEffects, RequestState, createFormActions, createFormReducer, createFormSelectors };
163
+ //# sourceMappingURL=ngdux-form.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngdux-form.mjs","sources":["../../../../../libs/shared/util-store-form/src/lib/+state/abstract-form-effects.ts","../../../../../libs/shared/util-store-form/src/lib/+state/form-actions.ts","../../../../../libs/shared/util-store-form/src/lib/common/request-state.model.ts","../../../../../libs/shared/util-store-form/src/lib/common/utils/action-handlers.ts","../../../../../libs/shared/util-store-form/src/lib/+state/form-reducer.ts","../../../../../libs/shared/util-store-form/src/lib/+state/form-selectors.ts","../../../../../libs/shared/util-store-form/src/ngdux-form.ts"],"sourcesContent":["import { Router } from '@angular/router';\r\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\r\nimport { Store } from '@ngrx/store';\r\nimport { of } from 'rxjs';\r\nimport { catchError, exhaustMap, map, switchMap, tap } from 'rxjs/operators';\r\nimport { FormActions, FormService, NgDuxFormNotificationService } from '../models/form.model';\r\n\r\nexport abstract class AbstractFormEffects<T, E> {\r\n load$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.load),\r\n switchMap(({ id }) =>\r\n this.service.loadResource(id).pipe(\r\n map(resource => this.formActions.loadSuccess({ resource })),\r\n catchError((errors: E) => of(this.formActions.loadFailure({ errors })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n create$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.create),\r\n switchMap(action =>\r\n this.service.createResource(action.resource).pipe(\r\n map(resource => this.formActions.createSuccess({ resource })),\r\n catchError((errors: E) => of(this.formActions.createFailure({ errors })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n update$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.save),\r\n switchMap(({ resource }) =>\r\n this.service.saveResource(resource).pipe(\r\n map(response => this.formActions.saveSuccess({ resource: response })),\r\n catchError((errors: E) => of(this.formActions.saveFailure({ errors })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n delete$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.delete),\r\n exhaustMap(action =>\r\n this.service.deleteResource(action.id).pipe(\r\n map(() => this.formActions.deleteSuccess({ id: action.id })),\r\n catchError((errors: E) => of(this.formActions.deleteFailure({ errors })))\r\n )\r\n )\r\n )\r\n );\r\n\r\n deleteSuccess$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.deleteSuccess),\r\n tap(({ id }) => {\r\n this.notificationService.onDelete(id);\r\n this.router.navigate(['..']);\r\n })\r\n )\r\n );\r\n\r\n createSuccess$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.createSuccess),\r\n tap(() => {\r\n this.router.navigate(['..']);\r\n })\r\n )\r\n );\r\n\r\n navigateToCreateResource$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.navigateToCreate),\r\n map(() => this.formActions.reset()),\r\n tap(() => {\r\n this.router.navigate(['..']);\r\n })\r\n )\r\n );\r\n\r\n copy$ = createEffect(\r\n () =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.copy),\r\n tap(() => {\r\n this.router.navigate(['..']);\r\n })\r\n ),\r\n { dispatch: false }\r\n );\r\n\r\n copySelected$ = createEffect(() =>\r\n this.actions$.pipe(\r\n ofType(this.formActions.copySelected),\r\n map(({ id }) => this.formActions.load({ id }))\r\n )\r\n );\r\n\r\n errorsHandler$ = createEffect(\r\n () =>\r\n this.actions$.pipe(\r\n ofType(\r\n this.formActions.saveFailure,\r\n this.formActions.loadFailure,\r\n this.formActions.deleteFailure,\r\n this.formActions.createFailure\r\n ),\r\n tap(({ errors }) => {\r\n this.notificationService.onErrors(errors);\r\n })\r\n ),\r\n { dispatch: false }\r\n );\r\n\r\n protected constructor(\r\n private readonly router: Router,\r\n protected readonly actions$: Actions,\r\n protected readonly store: Store,\r\n private readonly service: FormService<T>,\r\n private readonly formActions: FormActions<T, E>,\r\n private readonly notificationService: NgDuxFormNotificationService<E>\r\n ) {}\r\n}\r\n","import { createAction, props } from '@ngrx/store';\r\nimport { FormActions } from '../models/form.model';\r\n\r\nexport function createFormActions<T, E>(featureName: string): FormActions<T, E> {\r\n const load = createAction(`[${featureName} API] Load ${featureName}`, props<{ id: string }>());\r\n const loadSuccess = createAction(`[${featureName} API] Load ${featureName} Success`, props<{ resource: T }>());\r\n const loadFailure = createAction(`[${featureName} API] Load ${featureName} Failure`, props<{ errors: E }>());\r\n\r\n const save = createAction(`[${featureName} API] Save ${featureName}`, props<{ resource: T }>());\r\n const saveSuccess = createAction(`[${featureName} API] Save ${featureName} Success`, props<{ resource: T }>());\r\n const saveFailure = createAction(`[${featureName} API] Save ${featureName} Failure`, props<{ errors: E }>());\r\n\r\n const deleteAction = createAction(`[${featureName} API] Delete ${featureName}`, props<{ id: string }>());\r\n const deleteSuccess = createAction(`[${featureName} API] Delete ${featureName} Success`, props<{ id: string }>());\r\n const deleteFailure = createAction(`[${featureName} API] Delete ${featureName} Failure`, props<{ errors: E }>());\r\n\r\n const navigateToCreate = createAction(`[${featureName} Page] Navigate to Create ${featureName}`);\r\n const create = createAction(`[${featureName} API] Create ${featureName}`, props<{ resource: T }>());\r\n const createSuccess = createAction(`[${featureName} API] Create ${featureName} Success`, props<{ resource: T }>());\r\n const createFailure = createAction(`[${featureName} API] Create ${featureName} Failure`, props<{ errors: E }>());\r\n\r\n const reset = createAction(`[${featureName} API] Reset ${featureName}`);\r\n\r\n const copy = createAction(`[${featureName} Page] Copy ${featureName}`);\r\n const copySelected = createAction(`[${featureName} Page] Copy Selected ${featureName}`, props<{ id: string }>());\r\n\r\n return {\r\n load,\r\n loadSuccess,\r\n loadFailure,\r\n save,\r\n saveSuccess,\r\n saveFailure,\r\n delete: deleteAction,\r\n deleteSuccess,\r\n deleteFailure,\r\n navigateToCreate,\r\n create,\r\n createSuccess,\r\n createFailure,\r\n reset,\r\n copy,\r\n copySelected\r\n };\r\n}\r\n","// TODO: move to a common lib\r\nexport enum RequestState {\r\n IDLE = 'IDLE',\r\n IN_PROGRESS = 'IN_PROGRESS',\r\n FAILURE = 'FAILURE',\r\n SUCCESS = 'SUCCESS'\r\n}\r\n","import { ActionCreator, createAction, on, ReducerTypes } from '@ngrx/store';\r\nimport { RequestState } from '../request-state.model';\r\n\r\nexport interface ApiRequestState<E> {\r\n requestState: RequestState;\r\n errors: E;\r\n}\r\n\r\nexport interface LoadingState {\r\n loadingState: RequestState;\r\n}\r\n\r\nexport function createRequestStateActionHandlers<T extends ApiRequestState<E>, E>(\r\n loadAction: ActionCreator,\r\n saveAction: ActionCreator,\r\n saveSuccessAction: ActionCreator,\r\n saveFailureAction: ActionCreator<string, (props: { errors: E }) => { errors: E }>\r\n): ReducerTypes<T, ActionCreator[]>[] {\r\n if (!loadAction) {\r\n loadAction = createAction('DummyRequestStateLoadAction');\r\n }\r\n\r\n return [\r\n on(loadAction, state => ({ ...state, requestState: RequestState.IDLE })),\r\n on(saveAction, state => ({\r\n ...state,\r\n requestState: RequestState.IN_PROGRESS,\r\n errors: undefined\r\n })),\r\n on(saveSuccessAction, state => ({ ...state, requestState: RequestState.SUCCESS })),\r\n on(saveFailureAction, (state, { errors }) => ({\r\n ...state,\r\n requestState: RequestState.FAILURE,\r\n errors\r\n }))\r\n ];\r\n}\r\n\r\nexport function createLoadingStateActionHandlers<T extends LoadingState>(\r\n loadAction: ActionCreator,\r\n loadSuccessAction: ActionCreator,\r\n loadFailureAction: ActionCreator\r\n): ReducerTypes<T, ActionCreator[]>[] {\r\n return [\r\n on(loadAction, state => ({ ...state, loadingState: RequestState.IN_PROGRESS })),\r\n on(loadSuccessAction, state => ({ ...state, loadingState: RequestState.SUCCESS })),\r\n on(loadFailureAction, state => ({ ...state, loadingState: RequestState.FAILURE }))\r\n ];\r\n}\r\n","import { ActionCreator, ActionReducer, createReducer, Creator, on, ReducerTypes } from '@ngrx/store';\r\nimport { RequestState } from '../common/request-state.model';\r\nimport { createLoadingStateActionHandlers, createRequestStateActionHandlers } from '../common/utils/action-handlers';\r\nimport { FormActions, FormState } from '../models/form.model';\r\n\r\nexport function createFormReducer<T, E>(\r\n actions: FormActions<T, E>,\r\n actionHandlers?: ReducerTypes<FormState<T, E>, ActionCreator[]>[],\r\n initialFormState?: object\r\n): ActionReducer<FormState<T, E>> {\r\n const initialState: FormState<T, E> = { ...createInitialFormState<T, E>(), ...initialFormState };\r\n return createReducer<FormState<T, E>>(\r\n initialState,\r\n ...createFormActionHandlers<T, E>(initialState, actions),\r\n ...(actionHandlers || [])\r\n );\r\n}\r\n\r\nfunction createInitialFormState<T, E>(): FormState<T, E> {\r\n return {\r\n resource: undefined,\r\n loadingState: RequestState.IDLE,\r\n requestState: RequestState.IDLE,\r\n errors: undefined\r\n };\r\n}\r\n\r\nfunction createFormActionHandlers<T, E>(\r\n initialFormState: FormState<T, E>,\r\n actions: FormActions<T, E>\r\n): ReducerTypes<FormState<T, E>, ActionCreator<string, Creator<any[], object>>[]>[] {\r\n return [\r\n on(actions.reset, (): FormState<T, E> => initialFormState),\r\n on(\r\n actions.loadSuccess,\r\n actions.createSuccess,\r\n actions.saveSuccess,\r\n (state: FormState<T, E>, { resource }): FormState<T, E> => ({ ...state, resource })\r\n ),\r\n on(\r\n actions.deleteSuccess,\r\n (state: FormState<T, E>): FormState<T, E> => ({\r\n ...state,\r\n resource: undefined\r\n })\r\n ),\r\n on(\r\n actions.copy,\r\n (state: FormState<T, E>): FormState<T, E> => ({\r\n ...state,\r\n loadingState: RequestState.IDLE,\r\n requestState: RequestState.IDLE\r\n })\r\n ),\r\n ...createRequestStateActionHandlers<FormState<T, E>, E>(\r\n actions.load,\r\n actions.save,\r\n actions.saveSuccess,\r\n actions.saveFailure\r\n ),\r\n ...createRequestStateActionHandlers<FormState<T, E>, E>(\r\n undefined,\r\n actions.create,\r\n actions.createSuccess,\r\n actions.createFailure\r\n ),\r\n ...createRequestStateActionHandlers<FormState<T, E>, E>(\r\n undefined,\r\n actions.delete,\r\n actions.deleteSuccess,\r\n actions.deleteFailure\r\n ),\r\n ...createLoadingStateActionHandlers<FormState<T, E>>(actions.load, actions.loadSuccess, actions.loadFailure)\r\n ];\r\n}\r\n","import { createSelector, DefaultProjectorFn, MemoizedSelector } from '@ngrx/store';\r\nimport { RequestState } from '../common/request-state.model';\r\nimport { FormSelectors, FormState } from '../models/form.model';\r\n\r\nexport function createFormSelectors<T, E>(\r\n getFormState: MemoizedSelector<object, FormState<T, E>, DefaultProjectorFn<FormState<T, E>>>\r\n): FormSelectors<T, E> {\r\n const getRequestState = createSelector(getFormState, state => state.requestState);\r\n const getLoadingState = createSelector(getFormState, state => state.loadingState);\r\n const getErrors = createSelector(getFormState, state => state.errors);\r\n const getResource = createSelector(getFormState, state => state.resource);\r\n\r\n const isReady = createSelector(\r\n getResource,\r\n getLoadingState,\r\n (resource, loadingState) => !!resource && loadingState === RequestState.SUCCESS\r\n );\r\n\r\n return {\r\n getRequestState,\r\n getLoadingState,\r\n getErrors,\r\n getResource,\r\n isReady\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from './lib/+state/abstract-form-effects';
2
+ export * from './lib/+state/form-actions';
3
+ export * from './lib/+state/form-reducer';
4
+ export * from './lib/+state/form-selectors';
5
+ export * from './lib/common/request-state.model';
6
+ export * from './lib/models/form.model';
@@ -0,0 +1,53 @@
1
+ import { Router } from '@angular/router';
2
+ import { Actions } from '@ngrx/effects';
3
+ import { Store } from '@ngrx/store';
4
+ import { FormActions, FormService, NgDuxFormNotificationService } from '../models/form.model';
5
+ export declare abstract class AbstractFormEffects<T, E> {
6
+ private readonly router;
7
+ protected readonly actions$: Actions;
8
+ protected readonly store: Store;
9
+ private readonly service;
10
+ private readonly formActions;
11
+ private readonly notificationService;
12
+ load$: import("rxjs").Observable<({
13
+ resource: T;
14
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
15
+ errors: E;
16
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
17
+ create$: import("rxjs").Observable<({
18
+ resource: T;
19
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
20
+ errors: E;
21
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
22
+ update$: import("rxjs").Observable<({
23
+ resource: T;
24
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
25
+ errors: E;
26
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
27
+ delete$: import("rxjs").Observable<({
28
+ id: string;
29
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
30
+ errors: E;
31
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
32
+ deleteSuccess$: import("rxjs").Observable<{
33
+ id: string;
34
+ } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
35
+ createSuccess$: import("rxjs").Observable<{
36
+ resource: T;
37
+ } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
38
+ navigateToCreateResource$: import("rxjs").Observable<import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
39
+ copy$: import("rxjs").Observable<import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
40
+ copySelected$: import("rxjs").Observable<{
41
+ id: string;
42
+ } & import("@ngrx/store/src/models").TypedAction<string>> & import("@ngrx/effects").CreateEffectMetadata;
43
+ errorsHandler$: import("rxjs").Observable<({
44
+ errors: E;
45
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
46
+ errors: E;
47
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
48
+ errors: E;
49
+ } & import("@ngrx/store/src/models").TypedAction<string>) | ({
50
+ errors: E;
51
+ } & import("@ngrx/store/src/models").TypedAction<string>)> & import("@ngrx/effects").CreateEffectMetadata;
52
+ protected constructor(router: Router, actions$: Actions, store: Store, service: FormService<T>, formActions: FormActions<T, E>, notificationService: NgDuxFormNotificationService<E>);
53
+ }
@@ -0,0 +1,2 @@
1
+ import { FormActions } from '../models/form.model';
2
+ export declare function createFormActions<T, E>(featureName: string): FormActions<T, E>;
@@ -0,0 +1,3 @@
1
+ import { ActionCreator, ActionReducer, ReducerTypes } from '@ngrx/store';
2
+ import { FormActions, FormState } from '../models/form.model';
3
+ export declare function createFormReducer<T, E>(actions: FormActions<T, E>, actionHandlers?: ReducerTypes<FormState<T, E>, ActionCreator[]>[], initialFormState?: object): ActionReducer<FormState<T, E>>;
@@ -0,0 +1,3 @@
1
+ import { DefaultProjectorFn, MemoizedSelector } from '@ngrx/store';
2
+ import { FormSelectors, FormState } from '../models/form.model';
3
+ export declare function createFormSelectors<T, E>(getFormState: MemoizedSelector<object, FormState<T, E>, DefaultProjectorFn<FormState<T, E>>>): FormSelectors<T, E>;
@@ -0,0 +1,6 @@
1
+ export declare enum RequestState {
2
+ IDLE = "IDLE",
3
+ IN_PROGRESS = "IN_PROGRESS",
4
+ FAILURE = "FAILURE",
5
+ SUCCESS = "SUCCESS"
6
+ }
@@ -0,0 +1,15 @@
1
+ import { ActionCreator, ReducerTypes } from '@ngrx/store';
2
+ import { RequestState } from '../request-state.model';
3
+ export interface ApiRequestState<E> {
4
+ requestState: RequestState;
5
+ errors: E;
6
+ }
7
+ export interface LoadingState {
8
+ loadingState: RequestState;
9
+ }
10
+ export declare function createRequestStateActionHandlers<T extends ApiRequestState<E>, E>(loadAction: ActionCreator, saveAction: ActionCreator, saveSuccessAction: ActionCreator, saveFailureAction: ActionCreator<string, (props: {
11
+ errors: E;
12
+ }) => {
13
+ errors: E;
14
+ }>): ReducerTypes<T, ActionCreator[]>[];
15
+ export declare function createLoadingStateActionHandlers<T extends LoadingState>(loadAction: ActionCreator, loadSuccessAction: ActionCreator, loadFailureAction: ActionCreator): ReducerTypes<T, ActionCreator[]>[];
@@ -0,0 +1,95 @@
1
+ import { ActionCreator, MemoizedSelector } from '@ngrx/store';
2
+ import { TypedAction } from '@ngrx/store/src/models';
3
+ import { Observable } from 'rxjs';
4
+ import { RequestState } from '../common/request-state.model';
5
+ import { ApiRequestState, LoadingState } from '../common/utils/action-handlers';
6
+ export interface FormState<T, E> extends ApiRequestState<E>, LoadingState {
7
+ resource: T;
8
+ }
9
+ export interface FormSelectors<T, E> {
10
+ getRequestState: MemoizedSelector<object, RequestState>;
11
+ getLoadingState: MemoizedSelector<object, RequestState>;
12
+ getErrors: MemoizedSelector<object, E>;
13
+ getResource: MemoizedSelector<object, T>;
14
+ isReady: MemoizedSelector<object, boolean>;
15
+ }
16
+ export interface FormActions<T, E> {
17
+ load: ActionCreator<string, (props: {
18
+ id: string;
19
+ }) => {
20
+ id: string;
21
+ } & TypedAction<string>>;
22
+ loadSuccess: ActionCreator<string, (props: {
23
+ resource: T;
24
+ }) => {
25
+ resource: T;
26
+ } & TypedAction<string>>;
27
+ loadFailure: ActionCreator<string, (props: {
28
+ errors: E;
29
+ }) => {
30
+ errors: E;
31
+ } & TypedAction<string>>;
32
+ save: ActionCreator<string, (props: {
33
+ resource: T;
34
+ }) => {
35
+ resource: T;
36
+ } & TypedAction<string>>;
37
+ saveSuccess: ActionCreator<string, (props: {
38
+ resource: T;
39
+ }) => {
40
+ resource: T;
41
+ } & TypedAction<string>>;
42
+ saveFailure: ActionCreator<string, (props: {
43
+ errors: E;
44
+ }) => {
45
+ errors: E;
46
+ } & TypedAction<string>>;
47
+ delete: ActionCreator<string, (props: {
48
+ id: string;
49
+ }) => {
50
+ id: string;
51
+ } & TypedAction<string>>;
52
+ deleteSuccess: ActionCreator<string, (props: {
53
+ id: string;
54
+ }) => {
55
+ id: string;
56
+ } & TypedAction<string>>;
57
+ deleteFailure: ActionCreator<string, (props: {
58
+ errors: E;
59
+ }) => {
60
+ errors: E;
61
+ } & TypedAction<string>>;
62
+ navigateToCreate: ActionCreator<string, () => TypedAction<string>>;
63
+ create: ActionCreator<string, (props: {
64
+ resource: T;
65
+ }) => {
66
+ resource: T;
67
+ } & TypedAction<string>>;
68
+ createSuccess: ActionCreator<string, (props: {
69
+ resource: T;
70
+ }) => {
71
+ resource: T;
72
+ } & TypedAction<string>>;
73
+ createFailure: ActionCreator<string, (props: {
74
+ errors: E;
75
+ }) => {
76
+ errors: E;
77
+ } & TypedAction<string>>;
78
+ reset: ActionCreator<string, () => TypedAction<string>>;
79
+ copy: ActionCreator<string, () => TypedAction<string>>;
80
+ copySelected: ActionCreator<string, (props: {
81
+ id: string;
82
+ }) => {
83
+ id: string;
84
+ } & TypedAction<string>>;
85
+ }
86
+ export interface NgDuxFormNotificationService<E> {
87
+ onErrors: (errors: E) => void;
88
+ onDelete: (id: string) => void;
89
+ }
90
+ export interface FormService<T> {
91
+ loadResource(id: string): Observable<T>;
92
+ saveResource?(resource: T): Observable<T>;
93
+ deleteResource?(id: string): Observable<void>;
94
+ createResource?(resource: T): Observable<T>;
95
+ }
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@ngdux/form",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^14.2.0",
6
+ "@angular/core": "^14.2.0",
7
+ "@angular/router": "14.2.6",
8
+ "@ngrx/effects": "14.0.2",
9
+ "@ngrx/store": "14.0.2",
10
+ "rxjs": "~6.6.0"
11
+ },
12
+ "dependencies": {
13
+ "tslib": "^2.3.0"
14
+ },
15
+ "module": "fesm2015/ngdux-form.mjs",
16
+ "es2020": "fesm2020/ngdux-form.mjs",
17
+ "esm2020": "esm2020/ngdux-form.mjs",
18
+ "fesm2020": "fesm2020/ngdux-form.mjs",
19
+ "fesm2015": "fesm2015/ngdux-form.mjs",
20
+ "typings": "index.d.ts",
21
+ "exports": {
22
+ "./package.json": {
23
+ "default": "./package.json"
24
+ },
25
+ ".": {
26
+ "types": "./index.d.ts",
27
+ "esm2020": "./esm2020/ngdux-form.mjs",
28
+ "es2020": "./fesm2020/ngdux-form.mjs",
29
+ "es2015": "./fesm2015/ngdux-form.mjs",
30
+ "node": "./fesm2015/ngdux-form.mjs",
31
+ "default": "./fesm2020/ngdux-form.mjs"
32
+ }
33
+ },
34
+ "sideEffects": false
35
+ }