@verisoft/store 20.1.1 → 20.1.2

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.
@@ -0,0 +1,602 @@
1
+ import { createAction, props, createReducer, on, createSelector, createFeatureSelector } from '@ngrx/store';
2
+ import { createEffect, ofType } from '@ngrx/effects';
3
+ import { switchMap, EMPTY, map, catchError, of, withLatestFrom, tap } from 'rxjs';
4
+ import { DEFAULT_SEARCH_PARAMS, DEFAULT_SEARCH_LIMIT } from '@verisoft/core';
5
+
6
+ function createInitDetailAction(detailsRepository) {
7
+ return createAction(`[${detailsRepository} Page] Init`, props());
8
+ }
9
+ function createInitNewDetailAction(detailsRepository) {
10
+ return createAction(`[${detailsRepository} Page] Init New`);
11
+ }
12
+ function createLoadDetailSuccessAction(detailsRepository) {
13
+ return createAction(`[${detailsRepository}/API] Load ${detailsRepository} Success`, props());
14
+ }
15
+ function createLoadDetailFailureAction(detailsRepository) {
16
+ return createAction(`[${detailsRepository}/API] Load ${detailsRepository} Failure`, props());
17
+ }
18
+ function createUpdateDetailAction(detailsRepository) {
19
+ return createAction(`[${detailsRepository}/API] Update ${detailsRepository}`, props());
20
+ }
21
+ function createUpdateDetailSetErrorsAction(detailsRepository) {
22
+ return createAction(`[${detailsRepository}/API] Update Validation Errors ${detailsRepository}`, props());
23
+ }
24
+ function createUpdateFormStateAction(detailsRepository) {
25
+ return createAction(`[${detailsRepository}/API] Update Form State`, props());
26
+ }
27
+ function createSaveDetailAction(detailsRepository) {
28
+ return createAction(`[${detailsRepository}/API] Save Detail `);
29
+ }
30
+ function createSaveDetailSuccessAction(detailsRepository) {
31
+ return createAction(`[${detailsRepository}/API] Save Detail Success`, props());
32
+ }
33
+ function createSaveDetailFailureAction(detailsRepository) {
34
+ return createAction(`[${detailsRepository}/API] Save Detail Failure`, props());
35
+ }
36
+ function createUpdateSaveDetailAction(detailsRepository) {
37
+ return createAction(`[${detailsRepository}/API] Update Detail `);
38
+ }
39
+ function createResetStateAction(detailsRepository) {
40
+ return createAction(`[${detailsRepository}/API] Reset State`);
41
+ }
42
+ function createDeleteDetailAction(detailsRepository) {
43
+ return createAction(`[${detailsRepository}/API] Delete Detail`);
44
+ }
45
+ function createDeleteDetailSuccessAction(detailsRepository) {
46
+ return createAction(`[${detailsRepository}/API] Delete Detail Success`);
47
+ }
48
+ function createDeleteDetailFailureAction(detailsRepository) {
49
+ return createAction(`[${detailsRepository}/API] Delete Detail Failure`, props());
50
+ }
51
+
52
+ const INITIAL_SAVE_ITEM_STATE = {
53
+ saveInProgress: false,
54
+ };
55
+ const INITIAL_CHOSEN_ROW_STATE = {
56
+ rows: []
57
+ };
58
+ const INITIAL_DETAIL_STATE = {
59
+ loaded: false,
60
+ saveItemState: INITIAL_SAVE_ITEM_STATE,
61
+ backendValidationErrors: [],
62
+ };
63
+
64
+ function createDetailReducers(detailRepository, initialState = INITIAL_DETAIL_STATE, ...ons) {
65
+ return createReducer(initialState, on(createInitDetailAction(detailRepository), (state) => {
66
+ return {
67
+ ...state,
68
+ loaded: false,
69
+ error: null,
70
+ };
71
+ }), on(createInitNewDetailAction(detailRepository), (state) => {
72
+ return {
73
+ ...state,
74
+ loaded: false,
75
+ error: null,
76
+ };
77
+ }), on(createLoadDetailSuccessAction(detailRepository), (state, { item }) => {
78
+ return {
79
+ ...state,
80
+ loaded: true,
81
+ item,
82
+ };
83
+ }), on(createLoadDetailFailureAction(detailRepository), (state, { error }) => {
84
+ return {
85
+ ...state,
86
+ loaded: true,
87
+ error,
88
+ };
89
+ }), on(createUpdateDetailAction(detailRepository), (state, { item }) => {
90
+ return {
91
+ ...state,
92
+ item,
93
+ formState: {
94
+ dirty: true,
95
+ valid: state.formState?.valid ?? true,
96
+ },
97
+ };
98
+ }), on(createUpdateDetailSetErrorsAction(detailRepository), (state, { error }) => {
99
+ return {
100
+ ...state,
101
+ backendValidationErrors: error
102
+ };
103
+ }), on(createUpdateFormStateAction(detailRepository), (state, { formState }) => {
104
+ return {
105
+ ...state,
106
+ formState,
107
+ };
108
+ }), on(createSaveDetailSuccessAction(detailRepository), (state) => {
109
+ return {
110
+ ...state,
111
+ formState: {
112
+ dirty: false,
113
+ valid: state.formState?.valid ?? true,
114
+ },
115
+ };
116
+ }), on(createResetStateAction(detailRepository), () => {
117
+ return {
118
+ ...initialState,
119
+ };
120
+ }), on(createSaveDetailFailureAction(detailRepository), (state, { error }) => {
121
+ return {
122
+ ...state,
123
+ backendValidationErrors: error.error
124
+ };
125
+ }), ...ons);
126
+ }
127
+ function createSaveDetailReducers(detailRepository, initialState = INITIAL_SAVE_ITEM_STATE) {
128
+ return createReducer(initialState, on(createSaveDetailAction(detailRepository), (state) => {
129
+ return {
130
+ ...state,
131
+ saveInProgress: true,
132
+ };
133
+ }), on(createSaveDetailSuccessAction(detailRepository), (state, { item }) => {
134
+ return {
135
+ ...state,
136
+ item,
137
+ saveInProgress: false,
138
+ };
139
+ }), on(createSaveDetailFailureAction(detailRepository), (state, { error }) => {
140
+ return {
141
+ ...state,
142
+ error,
143
+ saveInProgress: false,
144
+ };
145
+ }));
146
+ }
147
+
148
+ function createInitDetailEffect(detailsRepository, actions$, config) {
149
+ return createEffect(() => {
150
+ return actions$.pipe(ofType(createInitDetailAction(detailsRepository)), switchMap(({ obj }) => {
151
+ const get$ = (config?.service?.get(obj) ??
152
+ config?.get?.(obj));
153
+ if (!get$)
154
+ return EMPTY;
155
+ return get$?.pipe(map((item) => {
156
+ return createLoadDetailSuccessAction(detailsRepository)({ item });
157
+ }), catchError((error) => {
158
+ if (error.status === 404) {
159
+ config?.snackbar?.showError(config?.notFoundMessage ?? error);
160
+ }
161
+ else {
162
+ config?.snackbar?.showError(config?.errorMessage ?? error);
163
+ }
164
+ console.error('Error', error);
165
+ return of(createLoadDetailFailureAction(detailsRepository)({ error }));
166
+ }));
167
+ }));
168
+ });
169
+ }
170
+ function createInitNewDetailEffect(detailsRepository, actions$) {
171
+ return createEffect(() => actions$.pipe(ofType(createInitNewDetailAction(detailsRepository)), map(() => {
172
+ return createLoadDetailSuccessAction(detailsRepository)({ item: null });
173
+ })));
174
+ }
175
+ function createSaveDetailEffect(detailsRepository, actions$, service, config) {
176
+ return createEffect(() => actions$.pipe(ofType(createSaveDetailAction(detailsRepository)), withLatestFrom(config.detail$), switchMap(([, savedItem]) => {
177
+ const isNew = !savedItem?.id;
178
+ const saveAction = isNew
179
+ ? service.post(savedItem)
180
+ : service.put(savedItem.id, savedItem);
181
+ return saveAction.pipe(map((item) => {
182
+ if (isNew && config?.router && config?.redirectPath) {
183
+ const suffix = config?.useItemId ? '/' + item.id : '';
184
+ config.router.navigateByUrl(config.redirectPath + suffix);
185
+ }
186
+ if (isNew && config?.router && config?.navigationMap) {
187
+ const url = constructUrlFromNavigationMap(item, config.navigationMap);
188
+ config.router.navigateByUrl(url);
189
+ }
190
+ return createSaveDetailSuccessAction(detailsRepository)({
191
+ item: item,
192
+ });
193
+ }), catchError((error) => {
194
+ console.error('Error', error);
195
+ return of(createSaveDetailFailureAction(detailsRepository)({ error }));
196
+ }));
197
+ })));
198
+ }
199
+ function createSaveDetailSuccessEffect(detailsRepository, actions$, config) {
200
+ return createEffect(() => actions$.pipe(ofType(createSaveDetailSuccessAction(detailsRepository)), map((data) => {
201
+ config?.snackbar?.showSuccess(config?.successMessge ?? `Item successfully saved.`);
202
+ return createInitDetailAction(detailsRepository)({ obj: data.item.id });
203
+ })));
204
+ }
205
+ function createSaveDetailFailureEffect(detailsRepository, actions$, config) {
206
+ return createEffect(() => actions$.pipe(ofType(createSaveDetailFailureAction(detailsRepository)), tap(({ error }) => {
207
+ config?.snackbar?.showError(config.errorMessage ?? `Error saving item. ${error.message}`);
208
+ })), {
209
+ dispatch: false,
210
+ });
211
+ }
212
+ function createDeleteDetailEffect(detailsRepository, actions$, service, config) {
213
+ return createEffect(() => actions$.pipe(ofType(createDeleteDetailAction(detailsRepository)), withLatestFrom(config.detail$), switchMap(([, savedItem]) => {
214
+ const id = savedItem?.id;
215
+ if (!id) {
216
+ return of(createSaveDetailFailureAction(detailsRepository)({
217
+ error: 'Item has no id',
218
+ }));
219
+ }
220
+ return service.delete(id).pipe(map(() => {
221
+ if (config?.router && config?.redirectPath) {
222
+ config.router.navigateByUrl(`${config.redirectPath}`);
223
+ }
224
+ if (config?.router && config?.navigationMap) {
225
+ const url = constructUrlFromNavigationMap(savedItem, config.navigationMap);
226
+ config.router.navigateByUrl(url);
227
+ }
228
+ return createDeleteDetailSuccessAction(detailsRepository)();
229
+ }), catchError((error) => {
230
+ console.error('Error', error);
231
+ config.snackbar?.showError('Failed to delete item.');
232
+ return of(createDeleteDetailFailureAction(detailsRepository)({ error }));
233
+ }));
234
+ })));
235
+ }
236
+ function createDeleteDetailSuccessEffect(detailsRepository, actions$, config) {
237
+ return createEffect(() => actions$.pipe(ofType(createDeleteDetailSuccessAction(detailsRepository)), tap(() => {
238
+ config?.snackbar?.showSuccess(config.successMessge ?? `Item successfully deleted.`);
239
+ })), {
240
+ dispatch: false,
241
+ });
242
+ }
243
+ function createDeleteDetailFailureEffect(detailsRepository, actions$, config) {
244
+ return createEffect(() => actions$.pipe(ofType(createDeleteDetailFailureAction(detailsRepository)), tap(({ error }) => {
245
+ config?.snackbar?.showError(config.errorMessage ?? `Error deleting item. ${error.message}`);
246
+ })), {
247
+ dispatch: false,
248
+ });
249
+ }
250
+ function constructUrlFromNavigationMap(item, navigationMap) {
251
+ let url = '';
252
+ navigationMap.forEach((urlPartValue, suffixPropertyKey) => {
253
+ const suffix = item[suffixPropertyKey];
254
+ if (suffix) {
255
+ url += `${urlPartValue}/${suffix}`;
256
+ }
257
+ });
258
+ return url;
259
+ }
260
+
261
+ var TablePageAction;
262
+ (function (TablePageAction) {
263
+ TablePageAction["GET_PAGE"] = "Get page";
264
+ TablePageAction["CREATE_STATIC_FILTER"] = "Create static filter";
265
+ TablePageAction["DATA_LOAD_SUCCESS"] = "Data load success";
266
+ TablePageAction["DATA_LOAD_ERROR"] = "Data load error";
267
+ TablePageAction["REFRESH_PAGE"] = "Refresh page";
268
+ TablePageAction["FILTER_PAGE"] = "Filter page";
269
+ TablePageAction["CHANGE_PAGE_SIZE"] = "Change page size";
270
+ TablePageAction["SORT_PAGE"] = "Sort page";
271
+ TablePageAction["DESTROY"] = "Destroy";
272
+ TablePageAction["SELECT_ITEMS"] = "Select items";
273
+ TablePageAction["REMOVE_RANGE"] = "Remove range";
274
+ })(TablePageAction || (TablePageAction = {}));
275
+ function createGetPageTableAction(tableRepository) {
276
+ return createAction(`${tableRepository} ${TablePageAction.GET_PAGE}`, props());
277
+ }
278
+ function createStaticFilterTableAction(tableRepository) {
279
+ return createAction(`${tableRepository} ${TablePageAction.CREATE_STATIC_FILTER}`, props());
280
+ }
281
+ function createDataLoadSuccessTableAction(tableRepository) {
282
+ return createAction(`${tableRepository} ${TablePageAction.DATA_LOAD_SUCCESS}`, props());
283
+ }
284
+ function createDataLoadErrorTableAction(tableRepository) {
285
+ return createAction(`${tableRepository} ${TablePageAction.DATA_LOAD_ERROR}`, props());
286
+ }
287
+ function createChangePageSizeTableAction(tableRepository) {
288
+ return createAction(`${tableRepository} ${TablePageAction.CHANGE_PAGE_SIZE}`, props());
289
+ }
290
+ // TODO: use action in delete item effect
291
+ function createRefreshPageTableAction(tableRepository) {
292
+ return createAction(`${tableRepository} ${TablePageAction.REFRESH_PAGE}`);
293
+ }
294
+ function createFilterPageTableAction(tableRepository) {
295
+ return createAction(`${tableRepository} ${TablePageAction.REFRESH_PAGE}`, props());
296
+ }
297
+ function createResetTableFilterAction(tableRepository) {
298
+ return createAction(`${tableRepository} ${TablePageAction.REFRESH_PAGE}`);
299
+ }
300
+ function createDestroyTableAction(tableRepository) {
301
+ return createAction(`${tableRepository} ${TablePageAction.DESTROY}`);
302
+ }
303
+ function createSelectItemsTableAction(tableRepository) {
304
+ return createAction(`${tableRepository} ${TablePageAction.SELECT_ITEMS}`, props());
305
+ }
306
+ function createRemoveRangeTableAction(tableRepository) {
307
+ return createAction(`${tableRepository} ${TablePageAction.REMOVE_RANGE}`);
308
+ }
309
+
310
+ const INITIAL_TABLE_STATE = {
311
+ gPage: {
312
+ data: [],
313
+ size: DEFAULT_SEARCH_LIMIT,
314
+ total: 0.
315
+ },
316
+ dataLoading: false,
317
+ requestParams: DEFAULT_SEARCH_PARAMS,
318
+ selectedItems: []
319
+ };
320
+
321
+ /* eslint-disable @typescript-eslint/no-explicit-any */
322
+ function createTablePageReducers(tableRepository, initialState = INITIAL_TABLE_STATE, ...ons) {
323
+ return createReducer(initialState, on(createGetPageTableAction(tableRepository), (state, { page, id, filter, sort }) => {
324
+ return {
325
+ ...state,
326
+ requestParams: {
327
+ ...state.requestParams,
328
+ filter: filter ?? state.requestParams.filter,
329
+ sort: sort ?? state.requestParams.sort,
330
+ id: id ?? state.requestParams.id,
331
+ page,
332
+ },
333
+ dataLoading: true,
334
+ submitted: true,
335
+ };
336
+ }), on(createStaticFilterTableAction(tableRepository), (state, { filter }) => {
337
+ return {
338
+ ...state,
339
+ requestParams: {
340
+ ...state.requestParams,
341
+ filter: {
342
+ ...state.requestParams?.filter,
343
+ filter,
344
+ },
345
+ },
346
+ };
347
+ }), on(createResetTableFilterAction(tableRepository), (state) => {
348
+ return {
349
+ ...state,
350
+ requestParams: {
351
+ ...state.requestParams,
352
+ filter: undefined,
353
+ page: 1
354
+ },
355
+ };
356
+ }), on(createDataLoadSuccessTableAction(tableRepository), (state, { gPage }) => {
357
+ return {
358
+ ...state,
359
+ gPage,
360
+ dataLoading: false,
361
+ };
362
+ }), on(createDataLoadErrorTableAction(tableRepository), (state, { error }) => {
363
+ return {
364
+ ...state,
365
+ error,
366
+ dataLoading: false,
367
+ };
368
+ }), on(createFilterPageTableAction(tableRepository), (state, { filter }) => {
369
+ return {
370
+ ...state,
371
+ requestParams: {
372
+ ...state.requestParams,
373
+ filter: filter,
374
+ page: 1,
375
+ },
376
+ dataLoading: true,
377
+ };
378
+ }), on(createDestroyTableAction(tableRepository), () => {
379
+ return {
380
+ ...initialState,
381
+ };
382
+ }), on(createSelectItemsTableAction(tableRepository), (state, { selectedItems }) => {
383
+ return {
384
+ ...state,
385
+ selectedItems,
386
+ };
387
+ }), on(createChangePageSizeTableAction(tableRepository), (state, { size }) => {
388
+ return {
389
+ ...state,
390
+ requestParams: {
391
+ ...state.requestParams,
392
+ size,
393
+ }
394
+ };
395
+ }), ...ons);
396
+ }
397
+
398
+ function createGetPageTableEffect(tableRepository, actions$, config) {
399
+ return createEffect(() => {
400
+ return actions$.pipe(ofType(createGetPageTableAction(tableRepository)), switchMap(({ page, filter, sort, size }) => {
401
+ const requestParams = {
402
+ offset: page * size,
403
+ limit: size,
404
+ sort,
405
+ filter,
406
+ };
407
+ const params = config.service?.createParams(requestParams) ?? requestParams;
408
+ const fetchList$ = (config.service?.fetchList(params) ?? config.fetchList?.(params));
409
+ if (!fetchList$) {
410
+ throw new Error('Service or fetchList$ must by defined.');
411
+ }
412
+ return fetchList$.pipe(map((gPage) => {
413
+ const p = { ...gPage, number: page };
414
+ return createDataLoadSuccessTableAction(tableRepository)({
415
+ gPage: p,
416
+ });
417
+ }), catchError((error) => {
418
+ config.snackbar?.showError(error.message);
419
+ return of(createDataLoadErrorTableAction(tableRepository)({ error }));
420
+ }));
421
+ }));
422
+ });
423
+ }
424
+ function createRemoveRangeTableEffect(tableRepository, ngrxFeatureKey, actions$, store$, config) {
425
+ return createEffect(() => {
426
+ if (!config?.service) {
427
+ throw new Error('Service must be defined!');
428
+ }
429
+ const selectedItems = createSelector(createFeatureSelector(ngrxFeatureKey), (state) => {
430
+ return state?.[tableRepository]?.selectedItems;
431
+ });
432
+ return actions$.pipe(ofType(createRemoveRangeTableAction(tableRepository)), withLatestFrom(selectedItems), switchMap(([, { selectedItems }]) => {
433
+ return config.service.removeRange(selectedItems).pipe(map(() => {
434
+ return createGetPageTableAction(tableRepository)({ page: 0, size: DEFAULT_SEARCH_LIMIT });
435
+ }), catchError(error => {
436
+ return of(createDataLoadErrorTableAction(tableRepository)({ error }));
437
+ }));
438
+ }));
439
+ });
440
+ }
441
+
442
+ function createAddBindingAction(bindingsRepository) {
443
+ return createAction(`[${bindingsRepository}/API] Add bindings`, props());
444
+ }
445
+ function createAddBindingsAction(bindingsRepository) {
446
+ return createAction(`[${bindingsRepository}/API] Add bindings`, props());
447
+ }
448
+ function createAddBindingsFailureAction(bindingsRepository) {
449
+ return createAction(`[${bindingsRepository}/API] Add bindings failure`, props());
450
+ }
451
+ function createAddBindingsSuccessAction(bindingsRepository) {
452
+ return createAction(`[${bindingsRepository}/API] Add bindings success`);
453
+ }
454
+ function createEditBindingAction(bindingsRepository) {
455
+ return createAction(`[${bindingsRepository}/API] Edit binding`, props());
456
+ }
457
+ function createEditBindingFailureAction(bindingsRepository) {
458
+ return createAction(`[${bindingsRepository}/API] Edit binding failure`, props());
459
+ }
460
+ function createEditBindingSuccessAction(bindingsRepository) {
461
+ return createAction(`[${bindingsRepository}/API] Edit binding success`);
462
+ }
463
+ function createDeleteBindingAction(bindingsRepository) {
464
+ return createAction(`[${bindingsRepository}/API] Delete binding`, props());
465
+ }
466
+ function createDeleteBindingsAction(bindingsRepository) {
467
+ return createAction(`[${bindingsRepository}/API] Delete bindings`, props());
468
+ }
469
+ function createDeleteBindingsFailureAction(bindingsRepository) {
470
+ return createAction(`[${bindingsRepository}/API] Delete bindings failure`, props());
471
+ }
472
+ function createDeleteBindingsSuccessAction(bindingsRepository) {
473
+ return createAction(`[${bindingsRepository}/API] Delete bindings success`);
474
+ }
475
+
476
+ function createSingleBindingEffectsWithEdit(bindingsRepository, actions$, detail$, bindingSingularName, bindingPluralName, addFunction, editFunction, deleteFunction, snackbar, translateService, tableService, overrideDetailWithBinding = false) {
477
+ const addEffect = createAddBindingEffect(bindingsRepository, actions$, detail$, bindingPluralName, addFunction, snackbar, translateService);
478
+ const editEffect = createEditBindingEffect(bindingsRepository, actions$, detail$, bindingSingularName, editFunction, snackbar, translateService, overrideDetailWithBinding);
479
+ const deleteEffect = createDeleteBindingEffect(bindingsRepository, actions$, detail$, bindingPluralName, deleteFunction, snackbar, translateService);
480
+ const modifiedSuccessEffect = createBindingModifiedSuccessEffect(bindingsRepository, actions$, tableService);
481
+ return { addEffect, editEffect, deleteEffect, modifiedSuccessEffect };
482
+ }
483
+ function createBindingsEffectsWithEdit(bindingsRepository, actions$, detail$, bindingSingularName, bindingPluralName, addFunction, editFunction, deleteFunction, snackbar, translateService, tableService, overrideDetailWithBinding = false) {
484
+ const addEffect = createAddBindingsEffect(bindingsRepository, actions$, detail$, bindingPluralName, addFunction, snackbar, translateService);
485
+ const editEffect = createEditBindingEffect(bindingsRepository, actions$, detail$, bindingSingularName, editFunction, snackbar, translateService, overrideDetailWithBinding);
486
+ const deleteEffect = createDeleteBindingsEffect(bindingsRepository, actions$, detail$, bindingPluralName, deleteFunction, snackbar, translateService);
487
+ const modifiedSuccessEffect = createBindingModifiedSuccessEffect(bindingsRepository, actions$, tableService);
488
+ return { addEffect, editEffect, deleteEffect, modifiedSuccessEffect };
489
+ }
490
+ function createBindingsEffects(bindingsRepository, actions$, detail$, bindingPluralName, addFunction, deleteFunction, snackbar, translateService, tableService) {
491
+ const addEffect = createAddBindingsEffect(bindingsRepository, actions$, detail$, bindingPluralName, addFunction, snackbar, translateService);
492
+ const deleteEffect = createDeleteBindingsEffect(bindingsRepository, actions$, detail$, bindingPluralName, deleteFunction, snackbar, translateService);
493
+ const modifiedSuccessEffect = createBindingModifiedSuccessEffect(bindingsRepository, actions$, tableService);
494
+ return { addEffect, deleteEffect, modifiedSuccessEffect };
495
+ }
496
+ function createAddBindingEffect(bindingsRepository, actions$, detail$, bindingPluralName, addFunction, snackbar, translateService) {
497
+ return createEffect(() => actions$.pipe(ofType(createAddBindingAction(bindingsRepository)), withLatestFrom(detail$), switchMap(([{ binding }, detail]) => {
498
+ const translatedPluralName = translateService.instant(bindingPluralName);
499
+ const successMessage = `${translateService.instant('BINDINGS_EFFECTS.SUCCESS_ADD')} ${translatedPluralName}!`;
500
+ const failureMessage = `${translateService.instant('BINDINGS_EFFECTS.FAILURE_ADD')} ${translatedPluralName}!`;
501
+ return addFunction(binding).pipe(map(() => {
502
+ snackbar.showSuccess(successMessage);
503
+ return createAddBindingsSuccessAction(bindingsRepository)();
504
+ }), catchError((error) => {
505
+ snackbar.showError(failureMessage);
506
+ return of(createAddBindingsFailureAction(bindingsRepository)({ error }));
507
+ }));
508
+ })));
509
+ }
510
+ function createAddBindingsEffect(bindingsRepository, actions$, detail$, bindingPluralName, addFunction, snackbar, translateService) {
511
+ return createEffect(() => actions$.pipe(ofType(createAddBindingsAction(bindingsRepository)), withLatestFrom(detail$), switchMap(([{ bindings }, detail]) => {
512
+ const translatedPluralName = translateService.instant(bindingPluralName);
513
+ const successMessage = `${translateService.instant('BINDINGS_EFFECTS.SUCCESS_ADD')} ${translatedPluralName}!`;
514
+ const failureMessage = `${translateService.instant('BINDINGS_EFFECTS.FAILURE_ADD')} ${translatedPluralName}!`;
515
+ if (!detail?.id) {
516
+ snackbar.showError(failureMessage);
517
+ return of(createAddBindingsFailureAction(bindingsRepository)({
518
+ error: failureMessage,
519
+ }));
520
+ }
521
+ return addFunction(bindings, detail.id).pipe(map(() => {
522
+ snackbar.showSuccess(successMessage);
523
+ return createAddBindingsSuccessAction(bindingsRepository)();
524
+ }), catchError((error) => {
525
+ snackbar.showError(failureMessage);
526
+ return of(createAddBindingsFailureAction(bindingsRepository)({ error }));
527
+ }));
528
+ })));
529
+ }
530
+ function createEditBindingEffect(bindingsRepository, actions$, detail$, bindingSingularName, editFunction, snackbar, translateService, overrideDetailWithBinding = false) {
531
+ return createEffect(() => actions$.pipe(ofType(createEditBindingAction(bindingsRepository)), withLatestFrom(detail$), switchMap(([{ binding }, detail]) => {
532
+ const translatedPluralName = translateService.instant(bindingSingularName);
533
+ const successMessage = `${translateService.instant('BINDINGS_EFFECTS.SUCCESS_EDIT')} ${translatedPluralName}!`;
534
+ const failureMessage = `${translateService.instant('BINDINGS_EFFECTS.FAILURE_EDIT')} ${translatedPluralName}!`;
535
+ const id = overrideDetailWithBinding ? binding?.id : detail?.id;
536
+ if (!id) {
537
+ snackbar.showError(failureMessage);
538
+ return of(createEditBindingFailureAction(bindingsRepository)({
539
+ error: failureMessage,
540
+ }));
541
+ }
542
+ return editFunction(binding, id).pipe(map(() => {
543
+ snackbar.showSuccess(successMessage);
544
+ return createEditBindingSuccessAction(bindingsRepository)();
545
+ }), catchError((error) => {
546
+ snackbar.showError(failureMessage);
547
+ return of(createEditBindingFailureAction(bindingsRepository)({ error }));
548
+ }));
549
+ })));
550
+ }
551
+ function createDeleteBindingEffect(bindingsRepository, actions$, detail$, bindingPluralName, deleteFunction, snackbar, translateService) {
552
+ return createEffect(() => actions$.pipe(ofType(createDeleteBindingAction(bindingsRepository)), withLatestFrom(detail$), switchMap(([{ id }, detail]) => {
553
+ const translatedPluralName = translateService.instant(bindingPluralName);
554
+ const successMessage = `${translateService.instant('BINDINGS_EFFECTS.SUCCESS_DELETE')} ${translatedPluralName}!`;
555
+ const failureMessage = `${translateService.instant('BINDINGS_EFFECTS.FAILURE_DELETE')} ${translatedPluralName}!`;
556
+ if (!id && !detail?.id) {
557
+ snackbar.showError(failureMessage);
558
+ return of(createDeleteBindingsFailureAction(bindingsRepository)({
559
+ error: failureMessage,
560
+ }));
561
+ }
562
+ return deleteFunction(id, id ?? detail?.id).pipe(map(() => {
563
+ snackbar.showSuccess(successMessage);
564
+ return createDeleteBindingsSuccessAction(bindingsRepository)();
565
+ }), catchError((error) => {
566
+ snackbar.showError(failureMessage);
567
+ return of(createDeleteBindingsFailureAction(bindingsRepository)({ error }));
568
+ }));
569
+ })));
570
+ }
571
+ function createDeleteBindingsEffect(bindingsRepository, actions$, detail$, bindingPluralName, deleteFunction, snackbar, translateService) {
572
+ return createEffect(() => actions$.pipe(ofType(createDeleteBindingsAction(bindingsRepository)), withLatestFrom(detail$), switchMap(([{ bindingIds }, detail]) => {
573
+ const translatedPluralName = translateService.instant(bindingPluralName);
574
+ const successMessage = `${translateService.instant('BINDINGS_EFFECTS.SUCCESS_DELETE')} ${translatedPluralName}!`;
575
+ const failureMessage = `${translateService.instant('BINDINGS_EFFECTS.FAILURE_DELETE')} ${translatedPluralName}!`;
576
+ if (!detail?.id) {
577
+ snackbar.showError(failureMessage);
578
+ return of(createDeleteBindingsFailureAction(bindingsRepository)({
579
+ error: failureMessage,
580
+ }));
581
+ }
582
+ return deleteFunction(bindingIds, detail.id).pipe(map(() => {
583
+ snackbar.showSuccess(successMessage);
584
+ return createDeleteBindingsSuccessAction(bindingsRepository)();
585
+ }), catchError((error) => {
586
+ snackbar.showError(failureMessage);
587
+ return of(createDeleteBindingsFailureAction(bindingsRepository)({ error }));
588
+ }));
589
+ })));
590
+ }
591
+ function createBindingModifiedSuccessEffect(bindingsRepository, actions$, tableService) {
592
+ return createEffect(() => actions$.pipe(ofType(createAddBindingsSuccessAction(bindingsRepository), createEditBindingSuccessAction(bindingsRepository), createDeleteBindingsSuccessAction(bindingsRepository)), tap(() => {
593
+ tableService.forceReload();
594
+ })), { dispatch: false });
595
+ }
596
+
597
+ /**
598
+ * Generated bundle index. Do not edit.
599
+ */
600
+
601
+ export { INITIAL_CHOSEN_ROW_STATE, INITIAL_DETAIL_STATE, INITIAL_SAVE_ITEM_STATE, INITIAL_TABLE_STATE, createAddBindingAction, createAddBindingsAction, createAddBindingsFailureAction, createAddBindingsSuccessAction, createBindingsEffects, createBindingsEffectsWithEdit, createChangePageSizeTableAction, createDataLoadErrorTableAction, createDataLoadSuccessTableAction, createDeleteBindingAction, createDeleteBindingsAction, createDeleteBindingsFailureAction, createDeleteBindingsSuccessAction, createDeleteDetailAction, createDeleteDetailEffect, createDeleteDetailFailureAction, createDeleteDetailFailureEffect, createDeleteDetailSuccessAction, createDeleteDetailSuccessEffect, createDestroyTableAction, createDetailReducers, createEditBindingAction, createEditBindingFailureAction, createEditBindingSuccessAction, createFilterPageTableAction, createGetPageTableAction, createGetPageTableEffect, createInitDetailAction, createInitDetailEffect, createInitNewDetailAction, createInitNewDetailEffect, createLoadDetailFailureAction, createLoadDetailSuccessAction, createRefreshPageTableAction, createRemoveRangeTableAction, createRemoveRangeTableEffect, createResetStateAction, createResetTableFilterAction, createSaveDetailAction, createSaveDetailEffect, createSaveDetailFailureAction, createSaveDetailFailureEffect, createSaveDetailReducers, createSaveDetailSuccessAction, createSaveDetailSuccessEffect, createSelectItemsTableAction, createSingleBindingEffectsWithEdit, createStaticFilterTableAction, createTablePageReducers, createUpdateDetailAction, createUpdateDetailSetErrorsAction, createUpdateFormStateAction, createUpdateSaveDetailAction };
602
+ //# sourceMappingURL=verisoft-store.mjs.map