@verisoft/store 20.0.0 → 20.1.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/.eslintrc.json +43 -0
- package/jest.config.ts +22 -0
- package/ng-package.json +7 -0
- package/package.json +3 -17
- package/project.json +36 -0
- package/src/index.ts +12 -0
- package/src/lib/binding-state/binding.actions.ts +76 -0
- package/src/lib/binding-state/binding.effects.ts +472 -0
- package/src/lib/detail-state/detail.actions.ts +89 -0
- package/src/lib/detail-state/detail.effects.ts +283 -0
- package/src/lib/detail-state/detail.models.ts +42 -0
- package/src/lib/detail-state/detail.reducer.ts +147 -0
- package/src/lib/table-state/actions.ts +93 -0
- package/src/lib/table-state/effects.ts +99 -0
- package/src/lib/table-state/models.ts +20 -0
- package/src/lib/table-state/reducers.ts +126 -0
- package/src/test-setup.ts +8 -0
- package/tsconfig.json +29 -0
- package/tsconfig.lib.json +17 -0
- package/tsconfig.lib.prod.json +9 -0
- package/tsconfig.spec.json +16 -0
- package/fesm2022/verisoft-store.mjs +0 -602
- package/fesm2022/verisoft-store.mjs.map +0 -1
- package/index.d.ts +0 -312
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": ["../../../.eslintrc.base.json"],
|
|
3
|
+
"ignorePatterns": ["!**/*"],
|
|
4
|
+
"overrides": [
|
|
5
|
+
{
|
|
6
|
+
"files": ["*.ts"],
|
|
7
|
+
"extends": [
|
|
8
|
+
"plugin:@nx/angular",
|
|
9
|
+
"plugin:@angular-eslint/template/process-inline-templates"
|
|
10
|
+
],
|
|
11
|
+
"rules": {
|
|
12
|
+
"@angular-eslint/directive-selector": [
|
|
13
|
+
"error",
|
|
14
|
+
{
|
|
15
|
+
"type": "attribute",
|
|
16
|
+
"prefix": "lib",
|
|
17
|
+
"style": "camelCase"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"@angular-eslint/component-selector": [
|
|
21
|
+
"error",
|
|
22
|
+
{
|
|
23
|
+
"type": "element",
|
|
24
|
+
"prefix": "lib",
|
|
25
|
+
"style": "kebab-case"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"files": ["*.html"],
|
|
32
|
+
"extends": ["plugin:@nx/angular-template"],
|
|
33
|
+
"rules": {}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"files": ["*.json"],
|
|
37
|
+
"parser": "jsonc-eslint-parser",
|
|
38
|
+
"rules": {
|
|
39
|
+
"@nx/dependency-checks": "error"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
package/jest.config.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
export default {
|
|
3
|
+
displayName: 'store',
|
|
4
|
+
preset: '../../../jest.preset.js',
|
|
5
|
+
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
|
|
6
|
+
coverageDirectory: '../../../coverage/src/libs/store',
|
|
7
|
+
transform: {
|
|
8
|
+
'^.+\\.(ts|mjs|js|html)$': [
|
|
9
|
+
'jest-preset-angular',
|
|
10
|
+
{
|
|
11
|
+
tsconfig: '<rootDir>/tsconfig.spec.json',
|
|
12
|
+
stringifyContentPathRegex: '\\.(html|svg)$',
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
|
|
17
|
+
snapshotSerializers: [
|
|
18
|
+
'jest-preset-angular/build/serializers/no-ng-attributes',
|
|
19
|
+
'jest-preset-angular/build/serializers/ng-snapshot',
|
|
20
|
+
'jest-preset-angular/build/serializers/html-comment',
|
|
21
|
+
],
|
|
22
|
+
};
|
package/ng-package.json
ADDED
package/package.json
CHANGED
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verisoft/store",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.1.1",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/router": "~20.2.0",
|
|
6
6
|
"@ngrx/effects": "~20.0.0",
|
|
7
7
|
"@ngrx/store": "~20.0.0",
|
|
8
|
-
"@verisoft/core": "~20.
|
|
8
|
+
"@verisoft/core": "~20.1.1",
|
|
9
9
|
"rxjs": "~7.8.0"
|
|
10
10
|
},
|
|
11
11
|
"sideEffects": false,
|
|
12
12
|
"publishConfig": {
|
|
13
13
|
"access": "public"
|
|
14
|
-
},
|
|
15
|
-
"module": "fesm2022/verisoft-store.mjs",
|
|
16
|
-
"typings": "index.d.ts",
|
|
17
|
-
"exports": {
|
|
18
|
-
"./package.json": {
|
|
19
|
-
"default": "./package.json"
|
|
20
|
-
},
|
|
21
|
-
".": {
|
|
22
|
-
"types": "./index.d.ts",
|
|
23
|
-
"default": "./fesm2022/verisoft-store.mjs"
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
"dependencies": {
|
|
27
|
-
"tslib": "^2.3.0"
|
|
28
14
|
}
|
|
29
|
-
}
|
|
15
|
+
}
|
package/project.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "store",
|
|
3
|
+
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "src/libs/store/src",
|
|
5
|
+
"prefix": "lib",
|
|
6
|
+
"projectType": "library",
|
|
7
|
+
"tags": [],
|
|
8
|
+
"targets": {
|
|
9
|
+
"build": {
|
|
10
|
+
"executor": "@nx/angular:package",
|
|
11
|
+
"outputs": ["{workspaceRoot}/dist/{projectRoot}"],
|
|
12
|
+
"options": {
|
|
13
|
+
"project": "src/libs/store/ng-package.json"
|
|
14
|
+
},
|
|
15
|
+
"configurations": {
|
|
16
|
+
"production": {
|
|
17
|
+
"tsConfig": "src/libs/store/tsconfig.lib.prod.json"
|
|
18
|
+
},
|
|
19
|
+
"development": {
|
|
20
|
+
"tsConfig": "src/libs/store/tsconfig.lib.json"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"defaultConfiguration": "production"
|
|
24
|
+
},
|
|
25
|
+
"test": {
|
|
26
|
+
"executor": "@nx/jest:jest",
|
|
27
|
+
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
|
|
28
|
+
"options": {
|
|
29
|
+
"jestConfig": "src/libs/store/jest.config.ts"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"lint": {
|
|
33
|
+
"executor": "@nx/eslint:lint"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './lib/detail-state/detail.actions';
|
|
2
|
+
export * from './lib/detail-state/detail.reducer';
|
|
3
|
+
export * from './lib/detail-state/detail.effects';
|
|
4
|
+
export * from './lib/detail-state/detail.models';
|
|
5
|
+
|
|
6
|
+
export * from './lib/table-state/actions';
|
|
7
|
+
export * from './lib/table-state/reducers';
|
|
8
|
+
export * from './lib/table-state/effects';
|
|
9
|
+
export * from './lib/table-state/models';
|
|
10
|
+
|
|
11
|
+
export * from './lib/binding-state/binding.actions';
|
|
12
|
+
export * from './lib/binding-state/binding.effects';
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createAction, props } from '@ngrx/store';
|
|
2
|
+
|
|
3
|
+
export function createAddBindingAction<TCreate>(bindingsRepository: string) {
|
|
4
|
+
return createAction(
|
|
5
|
+
`[${bindingsRepository}/API] Add bindings`,
|
|
6
|
+
props<{ binding: TCreate }>()
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function createAddBindingsAction<TCreate>(bindingsRepository: string) {
|
|
11
|
+
return createAction(
|
|
12
|
+
`[${bindingsRepository}/API] Add bindings`,
|
|
13
|
+
props<{ bindings: TCreate[] }>()
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function createAddBindingsFailureAction(bindingsRepository: string) {
|
|
18
|
+
return createAction(
|
|
19
|
+
`[${bindingsRepository}/API] Add bindings failure`,
|
|
20
|
+
props<{ error: any }>()
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function createAddBindingsSuccessAction(bindingsRepository: string) {
|
|
25
|
+
return createAction(
|
|
26
|
+
`[${bindingsRepository}/API] Add bindings success`
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function createEditBindingAction<TEdit>(bindingsRepository: string) {
|
|
31
|
+
return createAction(
|
|
32
|
+
`[${bindingsRepository}/API] Edit binding`,
|
|
33
|
+
props<{ binding: TEdit }>()
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function createEditBindingFailureAction(bindingsRepository: string) {
|
|
38
|
+
return createAction(
|
|
39
|
+
`[${bindingsRepository}/API] Edit binding failure`,
|
|
40
|
+
props<{ error: any }>()
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function createEditBindingSuccessAction(bindingsRepository: string) {
|
|
45
|
+
return createAction(
|
|
46
|
+
`[${bindingsRepository}/API] Edit binding success`
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function createDeleteBindingAction(bindingsRepository: string) {
|
|
51
|
+
return createAction(
|
|
52
|
+
`[${bindingsRepository}/API] Delete binding`,
|
|
53
|
+
props<{ id: number | string }>()
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function createDeleteBindingsAction(bindingsRepository: string) {
|
|
58
|
+
return createAction(
|
|
59
|
+
`[${bindingsRepository}/API] Delete bindings`,
|
|
60
|
+
props<{ bindingIds: number[] }>()
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function createDeleteBindingsFailureAction(bindingsRepository: string) {
|
|
65
|
+
return createAction(
|
|
66
|
+
`[${bindingsRepository}/API] Delete bindings failure`,
|
|
67
|
+
props<{ error: any }>()
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function createDeleteBindingsSuccessAction(bindingsRepository: string) {
|
|
72
|
+
return createAction(
|
|
73
|
+
`[${bindingsRepository}/API] Delete bindings success`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
|
2
|
+
import {
|
|
3
|
+
catchError,
|
|
4
|
+
map,
|
|
5
|
+
Observable,
|
|
6
|
+
of,
|
|
7
|
+
switchMap,
|
|
8
|
+
tap,
|
|
9
|
+
withLatestFrom,
|
|
10
|
+
} from 'rxjs';
|
|
11
|
+
import {
|
|
12
|
+
createAddBindingAction,
|
|
13
|
+
createAddBindingsAction,
|
|
14
|
+
createAddBindingsFailureAction,
|
|
15
|
+
createAddBindingsSuccessAction,
|
|
16
|
+
createDeleteBindingAction,
|
|
17
|
+
createDeleteBindingsAction,
|
|
18
|
+
createDeleteBindingsFailureAction,
|
|
19
|
+
createDeleteBindingsSuccessAction,
|
|
20
|
+
createEditBindingAction,
|
|
21
|
+
createEditBindingFailureAction,
|
|
22
|
+
createEditBindingSuccessAction,
|
|
23
|
+
} from './binding.actions';
|
|
24
|
+
|
|
25
|
+
export function createSingleBindingEffectsWithEdit<
|
|
26
|
+
T extends { id: number | string },
|
|
27
|
+
TCreate,
|
|
28
|
+
TEdit extends { id?: number | string }
|
|
29
|
+
>(
|
|
30
|
+
bindingsRepository: string,
|
|
31
|
+
actions$: Actions,
|
|
32
|
+
detail$: Observable<T | undefined>,
|
|
33
|
+
bindingSingularName: string,
|
|
34
|
+
bindingPluralName: string,
|
|
35
|
+
addFunction: (
|
|
36
|
+
bindings: TCreate,
|
|
37
|
+
) => Observable<any>,
|
|
38
|
+
editFunction: (binding: TEdit, detailId: number | string) => Observable<any>,
|
|
39
|
+
deleteFunction: (
|
|
40
|
+
bindingIds: string | number,
|
|
41
|
+
detailId: number | string
|
|
42
|
+
) => Observable<any>,
|
|
43
|
+
snackbar: any,
|
|
44
|
+
translateService: any,
|
|
45
|
+
tableService: any,
|
|
46
|
+
overrideDetailWithBinding = false,
|
|
47
|
+
) {
|
|
48
|
+
const addEffect = createAddBindingEffect(
|
|
49
|
+
bindingsRepository,
|
|
50
|
+
actions$,
|
|
51
|
+
detail$,
|
|
52
|
+
bindingPluralName,
|
|
53
|
+
addFunction,
|
|
54
|
+
snackbar,
|
|
55
|
+
translateService,
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const editEffect = createEditBindingEffect(
|
|
59
|
+
bindingsRepository,
|
|
60
|
+
actions$,
|
|
61
|
+
detail$,
|
|
62
|
+
bindingSingularName,
|
|
63
|
+
editFunction,
|
|
64
|
+
snackbar,
|
|
65
|
+
translateService,
|
|
66
|
+
overrideDetailWithBinding
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const deleteEffect = createDeleteBindingEffect(
|
|
70
|
+
bindingsRepository,
|
|
71
|
+
actions$,
|
|
72
|
+
detail$,
|
|
73
|
+
bindingPluralName,
|
|
74
|
+
deleteFunction,
|
|
75
|
+
snackbar,
|
|
76
|
+
translateService
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const modifiedSuccessEffect = createBindingModifiedSuccessEffect(
|
|
80
|
+
bindingsRepository,
|
|
81
|
+
actions$,
|
|
82
|
+
tableService
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
return { addEffect, editEffect, deleteEffect, modifiedSuccessEffect };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function createBindingsEffectsWithEdit<
|
|
89
|
+
T extends { id: number | string },
|
|
90
|
+
TCreate,
|
|
91
|
+
TEdit extends { id?: number | string }
|
|
92
|
+
>(
|
|
93
|
+
bindingsRepository: string,
|
|
94
|
+
actions$: Actions,
|
|
95
|
+
detail$: Observable<T | undefined>,
|
|
96
|
+
bindingSingularName: string,
|
|
97
|
+
bindingPluralName: string,
|
|
98
|
+
addFunction: (
|
|
99
|
+
bindings: TCreate[],
|
|
100
|
+
detailId: number | string
|
|
101
|
+
) => Observable<any>,
|
|
102
|
+
editFunction: (binding: TEdit, detailId: number | string) => Observable<any>,
|
|
103
|
+
deleteFunction: (
|
|
104
|
+
bindingIds: number[],
|
|
105
|
+
detailId: number | string
|
|
106
|
+
) => Observable<any>,
|
|
107
|
+
snackbar: any,
|
|
108
|
+
translateService: any,
|
|
109
|
+
tableService: any,
|
|
110
|
+
overrideDetailWithBinding = false,
|
|
111
|
+
) {
|
|
112
|
+
const addEffect = createAddBindingsEffect(
|
|
113
|
+
bindingsRepository,
|
|
114
|
+
actions$,
|
|
115
|
+
detail$,
|
|
116
|
+
bindingPluralName,
|
|
117
|
+
addFunction,
|
|
118
|
+
snackbar,
|
|
119
|
+
translateService
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const editEffect = createEditBindingEffect(
|
|
123
|
+
bindingsRepository,
|
|
124
|
+
actions$,
|
|
125
|
+
detail$,
|
|
126
|
+
bindingSingularName,
|
|
127
|
+
editFunction,
|
|
128
|
+
snackbar,
|
|
129
|
+
translateService,
|
|
130
|
+
overrideDetailWithBinding
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
const deleteEffect = createDeleteBindingsEffect(
|
|
134
|
+
bindingsRepository,
|
|
135
|
+
actions$,
|
|
136
|
+
detail$,
|
|
137
|
+
bindingPluralName,
|
|
138
|
+
deleteFunction,
|
|
139
|
+
snackbar,
|
|
140
|
+
translateService
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
const modifiedSuccessEffect = createBindingModifiedSuccessEffect(
|
|
144
|
+
bindingsRepository,
|
|
145
|
+
actions$,
|
|
146
|
+
tableService
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
return { addEffect, editEffect, deleteEffect, modifiedSuccessEffect };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function createBindingsEffects<
|
|
153
|
+
T extends { id: number | string },
|
|
154
|
+
TCreate
|
|
155
|
+
>(
|
|
156
|
+
bindingsRepository: string,
|
|
157
|
+
actions$: Actions,
|
|
158
|
+
detail$: Observable<T | undefined>,
|
|
159
|
+
bindingPluralName: string,
|
|
160
|
+
addFunction: (
|
|
161
|
+
bindings: TCreate[],
|
|
162
|
+
detailId: number | string
|
|
163
|
+
) => Observable<any>,
|
|
164
|
+
deleteFunction: (
|
|
165
|
+
bindingIds: number[],
|
|
166
|
+
detailId: number | string
|
|
167
|
+
) => Observable<any>,
|
|
168
|
+
snackbar: any,
|
|
169
|
+
translateService: any,
|
|
170
|
+
tableService: any
|
|
171
|
+
) {
|
|
172
|
+
const addEffect = createAddBindingsEffect(
|
|
173
|
+
bindingsRepository,
|
|
174
|
+
actions$,
|
|
175
|
+
detail$,
|
|
176
|
+
bindingPluralName,
|
|
177
|
+
addFunction,
|
|
178
|
+
snackbar,
|
|
179
|
+
translateService
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
const deleteEffect = createDeleteBindingsEffect(
|
|
183
|
+
bindingsRepository,
|
|
184
|
+
actions$,
|
|
185
|
+
detail$,
|
|
186
|
+
bindingPluralName,
|
|
187
|
+
deleteFunction,
|
|
188
|
+
snackbar,
|
|
189
|
+
translateService
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
const modifiedSuccessEffect = createBindingModifiedSuccessEffect(
|
|
193
|
+
bindingsRepository,
|
|
194
|
+
actions$,
|
|
195
|
+
tableService
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
return { addEffect, deleteEffect, modifiedSuccessEffect };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function createAddBindingEffect<T extends { id: number | string }, TCreate>(
|
|
202
|
+
bindingsRepository: string,
|
|
203
|
+
actions$: Actions,
|
|
204
|
+
detail$: Observable<T | undefined>,
|
|
205
|
+
bindingPluralName: string,
|
|
206
|
+
addFunction: (
|
|
207
|
+
bindings: TCreate,
|
|
208
|
+
) => Observable<any>,
|
|
209
|
+
snackbar: any,
|
|
210
|
+
translateService: any,
|
|
211
|
+
) {
|
|
212
|
+
return createEffect(() =>
|
|
213
|
+
actions$.pipe(
|
|
214
|
+
ofType(createAddBindingAction<TCreate>(bindingsRepository)),
|
|
215
|
+
withLatestFrom(detail$),
|
|
216
|
+
switchMap(([{ binding }, detail]) => {
|
|
217
|
+
const translatedPluralName =
|
|
218
|
+
translateService.instant(bindingPluralName);
|
|
219
|
+
const successMessage = `${translateService.instant(
|
|
220
|
+
'BINDINGS_EFFECTS.SUCCESS_ADD'
|
|
221
|
+
)} ${translatedPluralName}!`;
|
|
222
|
+
const failureMessage = `${translateService.instant(
|
|
223
|
+
'BINDINGS_EFFECTS.FAILURE_ADD'
|
|
224
|
+
)} ${translatedPluralName}!`;
|
|
225
|
+
|
|
226
|
+
return addFunction(binding).pipe(
|
|
227
|
+
map(() => {
|
|
228
|
+
snackbar.showSuccess(successMessage);
|
|
229
|
+
return createAddBindingsSuccessAction(bindingsRepository)();
|
|
230
|
+
}),
|
|
231
|
+
catchError((error) => {
|
|
232
|
+
snackbar.showError(failureMessage);
|
|
233
|
+
return of(
|
|
234
|
+
createAddBindingsFailureAction(bindingsRepository)({ error })
|
|
235
|
+
);
|
|
236
|
+
})
|
|
237
|
+
);
|
|
238
|
+
})
|
|
239
|
+
)
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function createAddBindingsEffect<T extends { id: number | string }, TCreate>(
|
|
244
|
+
bindingsRepository: string,
|
|
245
|
+
actions$: Actions,
|
|
246
|
+
detail$: Observable<T | undefined>,
|
|
247
|
+
bindingPluralName: string,
|
|
248
|
+
addFunction: (
|
|
249
|
+
bindings: TCreate[],
|
|
250
|
+
detailId: number | string
|
|
251
|
+
) => Observable<any>,
|
|
252
|
+
snackbar: any,
|
|
253
|
+
translateService: any
|
|
254
|
+
) {
|
|
255
|
+
return createEffect(() =>
|
|
256
|
+
actions$.pipe(
|
|
257
|
+
ofType(createAddBindingsAction<TCreate>(bindingsRepository)),
|
|
258
|
+
withLatestFrom(detail$),
|
|
259
|
+
switchMap(([{ bindings }, detail]) => {
|
|
260
|
+
const translatedPluralName =
|
|
261
|
+
translateService.instant(bindingPluralName);
|
|
262
|
+
const successMessage = `${translateService.instant(
|
|
263
|
+
'BINDINGS_EFFECTS.SUCCESS_ADD'
|
|
264
|
+
)} ${translatedPluralName}!`;
|
|
265
|
+
const failureMessage = `${translateService.instant(
|
|
266
|
+
'BINDINGS_EFFECTS.FAILURE_ADD'
|
|
267
|
+
)} ${translatedPluralName}!`;
|
|
268
|
+
|
|
269
|
+
if (!detail?.id) {
|
|
270
|
+
snackbar.showError(failureMessage);
|
|
271
|
+
return of(
|
|
272
|
+
createAddBindingsFailureAction(bindingsRepository)({
|
|
273
|
+
error: failureMessage,
|
|
274
|
+
})
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return addFunction(bindings, detail.id).pipe(
|
|
279
|
+
map(() => {
|
|
280
|
+
snackbar.showSuccess(successMessage);
|
|
281
|
+
return createAddBindingsSuccessAction(bindingsRepository)();
|
|
282
|
+
}),
|
|
283
|
+
catchError((error) => {
|
|
284
|
+
snackbar.showError(failureMessage);
|
|
285
|
+
return of(
|
|
286
|
+
createAddBindingsFailureAction(bindingsRepository)({ error })
|
|
287
|
+
);
|
|
288
|
+
})
|
|
289
|
+
);
|
|
290
|
+
})
|
|
291
|
+
)
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function createEditBindingEffect<
|
|
296
|
+
T extends { id: number | string },
|
|
297
|
+
TEdit extends { id?: number | string }
|
|
298
|
+
>(
|
|
299
|
+
bindingsRepository: string,
|
|
300
|
+
actions$: Actions,
|
|
301
|
+
detail$: Observable<T | undefined>,
|
|
302
|
+
bindingSingularName: string,
|
|
303
|
+
editFunction: (binding: TEdit, detailId: number | string) => Observable<any>,
|
|
304
|
+
snackbar: any,
|
|
305
|
+
translateService: any,
|
|
306
|
+
overrideDetailWithBinding = false,
|
|
307
|
+
) {
|
|
308
|
+
return createEffect(() =>
|
|
309
|
+
actions$.pipe(
|
|
310
|
+
ofType(createEditBindingAction<TEdit>(bindingsRepository)),
|
|
311
|
+
withLatestFrom(detail$),
|
|
312
|
+
switchMap(([{ binding }, detail]) => {
|
|
313
|
+
const translatedPluralName =
|
|
314
|
+
translateService.instant(bindingSingularName);
|
|
315
|
+
const successMessage = `${translateService.instant(
|
|
316
|
+
'BINDINGS_EFFECTS.SUCCESS_EDIT'
|
|
317
|
+
)} ${translatedPluralName}!`;
|
|
318
|
+
const failureMessage = `${translateService.instant(
|
|
319
|
+
'BINDINGS_EFFECTS.FAILURE_EDIT'
|
|
320
|
+
)} ${translatedPluralName}!`;
|
|
321
|
+
|
|
322
|
+
const id = overrideDetailWithBinding ? binding?.id : detail?.id;
|
|
323
|
+
if (!id) {
|
|
324
|
+
snackbar.showError(failureMessage);
|
|
325
|
+
return of(
|
|
326
|
+
createEditBindingFailureAction(bindingsRepository)({
|
|
327
|
+
error: failureMessage,
|
|
328
|
+
})
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return editFunction(binding, id).pipe(
|
|
333
|
+
map(() => {
|
|
334
|
+
snackbar.showSuccess(successMessage);
|
|
335
|
+
return createEditBindingSuccessAction(bindingsRepository)();
|
|
336
|
+
}),
|
|
337
|
+
catchError((error) => {
|
|
338
|
+
snackbar.showError(failureMessage);
|
|
339
|
+
return of(
|
|
340
|
+
createEditBindingFailureAction(bindingsRepository)({ error })
|
|
341
|
+
);
|
|
342
|
+
})
|
|
343
|
+
);
|
|
344
|
+
})
|
|
345
|
+
)
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function createDeleteBindingEffect<T extends { id: number | string }>(
|
|
350
|
+
bindingsRepository: string,
|
|
351
|
+
actions$: Actions,
|
|
352
|
+
detail$: Observable<T | undefined>,
|
|
353
|
+
bindingPluralName: string,
|
|
354
|
+
deleteFunction: (
|
|
355
|
+
bindingIds: string | number,
|
|
356
|
+
detailId: string | number
|
|
357
|
+
) => Observable<any>,
|
|
358
|
+
snackbar: any,
|
|
359
|
+
translateService: any
|
|
360
|
+
) {
|
|
361
|
+
return createEffect(() =>
|
|
362
|
+
actions$.pipe(
|
|
363
|
+
ofType(createDeleteBindingAction(bindingsRepository)),
|
|
364
|
+
withLatestFrom(detail$),
|
|
365
|
+
switchMap(([{ id }, detail]) => {
|
|
366
|
+
const translatedPluralName =
|
|
367
|
+
translateService.instant(bindingPluralName);
|
|
368
|
+
const successMessage = `${translateService.instant(
|
|
369
|
+
'BINDINGS_EFFECTS.SUCCESS_DELETE'
|
|
370
|
+
)} ${translatedPluralName}!`;
|
|
371
|
+
const failureMessage = `${translateService.instant(
|
|
372
|
+
'BINDINGS_EFFECTS.FAILURE_DELETE'
|
|
373
|
+
)} ${translatedPluralName}!`;
|
|
374
|
+
|
|
375
|
+
if (!id && !detail?.id) {
|
|
376
|
+
snackbar.showError(failureMessage);
|
|
377
|
+
return of(
|
|
378
|
+
createDeleteBindingsFailureAction(bindingsRepository)({
|
|
379
|
+
error: failureMessage,
|
|
380
|
+
})
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
return deleteFunction(id, id ?? detail?.id).pipe(
|
|
385
|
+
map(() => {
|
|
386
|
+
snackbar.showSuccess(successMessage);
|
|
387
|
+
return createDeleteBindingsSuccessAction(bindingsRepository)();
|
|
388
|
+
}),
|
|
389
|
+
catchError((error) => {
|
|
390
|
+
snackbar.showError(failureMessage);
|
|
391
|
+
return of(
|
|
392
|
+
createDeleteBindingsFailureAction(bindingsRepository)({ error })
|
|
393
|
+
);
|
|
394
|
+
})
|
|
395
|
+
);
|
|
396
|
+
})
|
|
397
|
+
)
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function createDeleteBindingsEffect<T extends { id: number | string }>(
|
|
402
|
+
bindingsRepository: string,
|
|
403
|
+
actions$: Actions,
|
|
404
|
+
detail$: Observable<T | undefined>,
|
|
405
|
+
bindingPluralName: string,
|
|
406
|
+
deleteFunction: (
|
|
407
|
+
bindingIds: number[],
|
|
408
|
+
detailId: string | number
|
|
409
|
+
) => Observable<any>,
|
|
410
|
+
snackbar: any,
|
|
411
|
+
translateService: any
|
|
412
|
+
) {
|
|
413
|
+
return createEffect(() =>
|
|
414
|
+
actions$.pipe(
|
|
415
|
+
ofType(createDeleteBindingsAction(bindingsRepository)),
|
|
416
|
+
withLatestFrom(detail$),
|
|
417
|
+
switchMap(([{ bindingIds }, detail]) => {
|
|
418
|
+
const translatedPluralName =
|
|
419
|
+
translateService.instant(bindingPluralName);
|
|
420
|
+
const successMessage = `${translateService.instant(
|
|
421
|
+
'BINDINGS_EFFECTS.SUCCESS_DELETE'
|
|
422
|
+
)} ${translatedPluralName}!`;
|
|
423
|
+
const failureMessage = `${translateService.instant(
|
|
424
|
+
'BINDINGS_EFFECTS.FAILURE_DELETE'
|
|
425
|
+
)} ${translatedPluralName}!`;
|
|
426
|
+
|
|
427
|
+
if (!detail?.id) {
|
|
428
|
+
snackbar.showError(failureMessage);
|
|
429
|
+
return of(
|
|
430
|
+
createDeleteBindingsFailureAction(bindingsRepository)({
|
|
431
|
+
error: failureMessage,
|
|
432
|
+
})
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
return deleteFunction(bindingIds, detail.id).pipe(
|
|
437
|
+
map(() => {
|
|
438
|
+
snackbar.showSuccess(successMessage);
|
|
439
|
+
return createDeleteBindingsSuccessAction(bindingsRepository)();
|
|
440
|
+
}),
|
|
441
|
+
catchError((error) => {
|
|
442
|
+
snackbar.showError(failureMessage);
|
|
443
|
+
return of(
|
|
444
|
+
createDeleteBindingsFailureAction(bindingsRepository)({ error })
|
|
445
|
+
);
|
|
446
|
+
})
|
|
447
|
+
);
|
|
448
|
+
})
|
|
449
|
+
)
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function createBindingModifiedSuccessEffect(
|
|
454
|
+
bindingsRepository: string,
|
|
455
|
+
actions$: Actions,
|
|
456
|
+
tableService: any
|
|
457
|
+
) {
|
|
458
|
+
return createEffect(
|
|
459
|
+
() =>
|
|
460
|
+
actions$.pipe(
|
|
461
|
+
ofType(
|
|
462
|
+
createAddBindingsSuccessAction(bindingsRepository),
|
|
463
|
+
createEditBindingSuccessAction(bindingsRepository),
|
|
464
|
+
createDeleteBindingsSuccessAction(bindingsRepository)
|
|
465
|
+
),
|
|
466
|
+
tap(() => {
|
|
467
|
+
tableService.forceReload();
|
|
468
|
+
})
|
|
469
|
+
),
|
|
470
|
+
{ dispatch: false }
|
|
471
|
+
);
|
|
472
|
+
}
|