verben-authentication-ui 1.0.37 → 1.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/README.md +23 -1
- package/esm2022/src/lib/base/core/base-data-page.facade.mjs +215 -0
- package/esm2022/src/lib/base/core/base-data-page.service.mjs +103 -0
- package/esm2022/src/lib/base/core/base-data-page.state.mjs +203 -0
- package/esm2022/src/lib/base/handlers/filter-handler.service.mjs +53 -0
- package/esm2022/src/lib/base/handlers/search-handler.service.mjs +31 -0
- package/esm2022/src/lib/base/handlers/sort-handler.service.mjs +49 -0
- package/esm2022/src/lib/base/models/api-payload.mjs +4 -0
- package/esm2022/src/lib/base/models/page-config.interface.mjs +2 -0
- package/esm2022/src/lib/base/public-api.mjs +14 -6
- package/esm2022/src/lib/base/utils/column-helpers.mjs +45 -0
- package/esm2022/src/lib/components/button/button.component.mjs +3 -3
- package/esm2022/src/lib/components/forgot-password/forgot-password.component.mjs +2 -2
- package/esm2022/src/lib/components/mail/mail.component.mjs +3 -3
- package/esm2022/src/lib/components/mail-validation/mail-validation.component.mjs +5 -5
- package/esm2022/src/lib/components/o-auth/o-auth.component.mjs +3 -3
- package/esm2022/src/lib/components/otp-input/otp-input.component.mjs +2 -2
- package/esm2022/src/lib/components/reset-password/reset-password.component.mjs +2 -2
- package/esm2022/src/lib/components/role-control/base-table-style.mjs +6 -6
- package/esm2022/src/lib/components/role-control/role-control.component.mjs +3 -3
- package/esm2022/src/lib/components/sign-in/sign-in.component.mjs +4 -4
- package/esm2022/src/lib/components/sign-up/sign-up.component.mjs +6 -6
- package/esm2022/src/lib/components/sso/base-table-style.mjs +6 -6
- package/esm2022/src/lib/components/sso/sso-form/sso-form.component.mjs +3 -3
- package/esm2022/src/lib/components/sso/sso.component.mjs +3 -3
- package/esm2022/src/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.mjs +4 -4
- package/esm2022/src/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.mjs +5 -5
- package/esm2022/src/lib/components/user-management/public-api.mjs +2 -1
- package/esm2022/src/lib/components/user-management/user-management-card/user-management-card.component.mjs +23 -0
- package/esm2022/src/lib/components/user-management/user-management-form/user-management-form.component.mjs +53 -91
- package/esm2022/src/lib/components/user-management/user-management-table/user-management-table.component.mjs +68 -0
- package/esm2022/src/lib/components/user-management/user-management.component.mjs +98 -509
- package/esm2022/src/lib/components/user-management/user-management.module.mjs +11 -80
- package/esm2022/src/lib/components/user-management/user-status-badge/user-status-badge.component.mjs +8 -6
- package/esm2022/src/lib/components/user-management/user.config.mjs +94 -0
- package/esm2022/src/lib/components/user-management/user.facade.mjs +118 -0
- package/esm2022/src/lib/components/user-management/user.service.mjs +60 -0
- package/esm2022/src/lib/components/user-management/user.state.mjs +33 -0
- package/esm2022/src/lib/components/user-request/user-request.component.mjs +8 -8
- package/esm2022/src/lib/components/user-request-approval/public-api.mjs +2 -2
- package/esm2022/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.mjs +8 -6
- package/esm2022/src/lib/components/user-request-approval/user-access-request.config.mjs +79 -0
- package/esm2022/src/lib/components/user-request-approval/user-access-request.facade.mjs +123 -0
- package/esm2022/src/lib/components/user-request-approval/user-access-request.service.mjs +74 -0
- package/esm2022/src/lib/components/user-request-approval/user-access-request.state.mjs +26 -0
- package/esm2022/src/lib/components/user-request-approval/user-request-approval-card/user-request-approval-card.component.mjs +23 -0
- package/esm2022/src/lib/components/user-request-approval/user-request-approval-form/user-request-approval-form.component.mjs +124 -0
- package/esm2022/src/lib/components/user-request-approval/user-request-approval-table/user-request-approval-table.component.mjs +44 -0
- package/esm2022/src/lib/components/user-request-approval/user-request-approval.component.mjs +101 -273
- package/esm2022/src/lib/components/user-request-approval/user-request-approval.module.mjs +10 -74
- package/fesm2022/verben-authentication-ui-src-lib-base.mjs +596 -214
- package/fesm2022/verben-authentication-ui-src-lib-base.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-button.mjs +2 -2
- package/fesm2022/verben-authentication-ui-src-lib-components-button.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-forgot-password.mjs +2 -2
- package/fesm2022/verben-authentication-ui-src-lib-components-forgot-password.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-mail-validation.mjs +4 -4
- package/fesm2022/verben-authentication-ui-src-lib-components-mail-validation.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-mail.mjs +2 -2
- package/fesm2022/verben-authentication-ui-src-lib-components-mail.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-o-auth.mjs +2 -2
- package/fesm2022/verben-authentication-ui-src-lib-components-o-auth.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-otp-input.mjs +2 -2
- package/fesm2022/verben-authentication-ui-src-lib-components-otp-input.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-reset-password.mjs +2 -2
- package/fesm2022/verben-authentication-ui-src-lib-components-reset-password.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-role-control.mjs +7 -7
- package/fesm2022/verben-authentication-ui-src-lib-components-role-control.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-sign-in.mjs +3 -3
- package/fesm2022/verben-authentication-ui-src-lib-components-sign-in.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-sign-up.mjs +5 -5
- package/fesm2022/verben-authentication-ui-src-lib-components-sign-up.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-sso.mjs +9 -9
- package/fesm2022/verben-authentication-ui-src-lib-components-sso.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-otp.mjs +3 -3
- package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-otp.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-setup.mjs +4 -4
- package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-setup.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-user-management.mjs +468 -831
- package/fesm2022/verben-authentication-ui-src-lib-components-user-management.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-user-request-approval.mjs +509 -952
- package/fesm2022/verben-authentication-ui-src-lib-components-user-request-approval.mjs.map +1 -1
- package/fesm2022/verben-authentication-ui-src-lib-components-user-request.mjs +7 -7
- package/fesm2022/verben-authentication-ui-src-lib-components-user-request.mjs.map +1 -1
- package/package.json +36 -42
- package/src/lib/base/README.md +99 -0
- package/src/lib/base/core/base-data-page.facade.d.ts +65 -0
- package/src/lib/base/core/base-data-page.service.d.ts +43 -0
- package/src/lib/base/core/base-data-page.state.d.ts +68 -0
- package/src/lib/base/handlers/filter-handler.service.d.ts +13 -0
- package/src/lib/base/handlers/search-handler.service.d.ts +20 -0
- package/src/lib/base/handlers/sort-handler.service.d.ts +13 -0
- package/src/lib/base/models/api-payload.d.ts +2 -0
- package/src/lib/base/models/page-config.interface.d.ts +21 -0
- package/src/lib/base/public-api.d.ts +9 -5
- package/src/lib/base/utils/column-helpers.d.ts +16 -0
- package/src/lib/components/user-management/public-api.d.ts +1 -0
- package/src/lib/components/user-management/user-management-card/user-management-card.component.d.ts +11 -0
- package/src/lib/components/user-management/user-management-form/user-management-form.component.d.ts +12 -14
- package/src/lib/components/user-management/user-management-table/user-management-table.component.d.ts +30 -0
- package/src/lib/components/user-management/user-management.component.d.ts +28 -124
- package/src/lib/components/user-management/user-management.module.d.ts +8 -8
- package/src/lib/components/user-management/user-status-badge/user-status-badge.component.d.ts +1 -1
- package/src/lib/components/user-management/user.config.d.ts +13 -0
- package/src/lib/components/user-management/user.facade.d.ts +42 -0
- package/src/lib/components/user-management/user.service.d.ts +26 -0
- package/src/lib/components/user-management/user.state.d.ts +19 -0
- package/src/lib/components/user-request-approval/public-api.d.ts +1 -1
- package/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.d.ts +1 -1
- package/src/lib/components/user-request-approval/user-access-request.config.d.ts +13 -0
- package/src/lib/components/user-request-approval/user-access-request.facade.d.ts +36 -0
- package/src/lib/components/user-request-approval/user-access-request.service.d.ts +30 -0
- package/src/lib/components/user-request-approval/user-access-request.state.d.ts +16 -0
- package/src/lib/components/user-request-approval/user-request-approval-card/user-request-approval-card.component.d.ts +11 -0
- package/src/lib/components/user-request-approval/user-request-approval-form/user-request-approval-form.component.d.ts +47 -0
- package/src/lib/components/user-request-approval/user-request-approval-table/user-request-approval-table.component.d.ts +20 -0
- package/src/lib/components/user-request-approval/user-request-approval.component.d.ts +29 -68
- package/src/lib/components/user-request-approval/user-request-approval.module.d.ts +7 -6
- package/esm2022/src/lib/base/base-data.component.mjs +0 -80
- package/esm2022/src/lib/base/base-data.facade.mjs +0 -130
- package/esm2022/src/lib/base/base-data.service.mjs +0 -21
- package/esm2022/src/lib/base/base-data.state.mjs +0 -74
- package/esm2022/src/lib/base/models.mjs +0 -2
- package/esm2022/src/lib/components/user-management/base-table-style.mjs +0 -53
- package/esm2022/src/lib/components/user-management/services/user-management.service.mjs +0 -110
- package/esm2022/src/lib/components/user-management/user-management.columns.mjs +0 -53
- package/esm2022/src/lib/components/user-request-approval/access-request.columns.mjs +0 -29
- package/esm2022/src/lib/components/user-request-approval/base-table-style.mjs +0 -53
- package/esm2022/src/lib/components/user-request-approval/facades/user-access-request.facade.mjs +0 -260
- package/esm2022/src/lib/components/user-request-approval/helper.mjs +0 -56
- package/esm2022/src/lib/components/user-request-approval/services/user-access-request.service.mjs +0 -92
- package/esm2022/src/lib/components/user-request-approval/states/user-access-request.state.mjs +0 -92
- package/esm2022/src/lib/components/user-request-approval/user-request-form/user-request-form.component.mjs +0 -105
- package/esm2022/src/lib/components/user-request-process/index.mjs +0 -2
- package/esm2022/src/lib/components/user-request-process/public-api.mjs +0 -3
- package/esm2022/src/lib/components/user-request-process/user-request-process.component.mjs +0 -11
- package/esm2022/src/lib/components/user-request-process/user-request-process.module.mjs +0 -18
- package/esm2022/src/lib/components/user-request-process/verben-authentication-ui-src-lib-components-user-request-process.mjs +0 -5
- package/fesm2022/verben-authentication-ui-src-lib-components-user-request-process.mjs +0 -34
- package/fesm2022/verben-authentication-ui-src-lib-components-user-request-process.mjs.map +0 -1
- package/src/lib/base/base-data.component.d.ts +0 -32
- package/src/lib/base/base-data.facade.d.ts +0 -27
- package/src/lib/base/base-data.service.d.ts +0 -14
- package/src/lib/base/base-data.state.d.ts +0 -28
- package/src/lib/base/models.d.ts +0 -11
- package/src/lib/components/user-management/base-table-style.d.ts +0 -1
- package/src/lib/components/user-management/services/user-management.service.d.ts +0 -44
- package/src/lib/components/user-management/user-management.columns.d.ts +0 -3
- package/src/lib/components/user-request-approval/access-request.columns.d.ts +0 -3
- package/src/lib/components/user-request-approval/base-table-style.d.ts +0 -1
- package/src/lib/components/user-request-approval/facades/user-access-request.facade.d.ts +0 -39
- package/src/lib/components/user-request-approval/helper.d.ts +0 -7
- package/src/lib/components/user-request-approval/services/user-access-request.service.d.ts +0 -64
- package/src/lib/components/user-request-approval/states/user-access-request.state.d.ts +0 -35
- package/src/lib/components/user-request-approval/user-request-form/user-request-form.component.d.ts +0 -34
- package/src/lib/components/user-request-process/index.d.ts +0 -1
- package/src/lib/components/user-request-process/public-api.d.ts +0 -2
- package/src/lib/components/user-request-process/user-request-process.component.d.ts +0 -5
- package/src/lib/components/user-request-process/user-request-process.module.d.ts +0 -7
package/README.md
CHANGED
|
@@ -1,7 +1,29 @@
|
|
|
1
|
-
#
|
|
1
|
+
# VerbenAuthenticationUi
|
|
2
2
|
|
|
3
3
|
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0.
|
|
4
4
|
|
|
5
|
+
## Theming
|
|
6
|
+
|
|
7
|
+
This library is theme-aware: its component styles read the `verben-ng-ui`
|
|
8
|
+
`--vbn-*` CSS custom properties instead of hardcoded colors, so it automatically
|
|
9
|
+
follows whatever theme the host application configures. It ships **no** theme
|
|
10
|
+
config of its own (no `theme.css`, no `forRoot()`) — that is the host app's job.
|
|
11
|
+
|
|
12
|
+
**Host requirement:** the consuming application must load
|
|
13
|
+
`node_modules/verben-ng-ui/styles/theme.css` (which requires `verben-ng-ui@>=1.3.0`,
|
|
14
|
+
matching this library's peer dependency) and call `VerbenUiModule.forRoot({...})`
|
|
15
|
+
once. See that package's `INTEGRATION.md` for the full multi-layer setup.
|
|
16
|
+
|
|
17
|
+
Translucent greys and tints (e.g. `#66666680`, `rgba(0, 0, 0, 0.25)`) are
|
|
18
|
+
intentionally left as literals — mapping them onto solid tokens would drop their
|
|
19
|
+
alpha channel.
|
|
20
|
+
|
|
21
|
+
**Two files here are generated, not hand-written:**
|
|
22
|
+
`src/theme/tailwind.css` is Tailwind output built by `npm run build:lib:tailwind`
|
|
23
|
+
and `@import`ed by the user-management and user-request-approval component styles.
|
|
24
|
+
Never hand-edit it — change the templates and regenerate, or you will produce
|
|
25
|
+
malformed escaped selectors that silently match nothing.
|
|
26
|
+
|
|
5
27
|
## Code scaffolding
|
|
6
28
|
|
|
7
29
|
Run `ng generate component component-name --project verben-authentication-ui` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project verben-authentication-ui`.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import { ErrorResponse } from 'verben-authentication-ui/src/lib/models';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./base-data-page.state";
|
|
6
|
+
import * as i2 from "./base-data-page.service";
|
|
7
|
+
import * as i3 from "../handlers/search-handler.service";
|
|
8
|
+
import * as i4 from "verben-authentication-ui/src/lib/services";
|
|
9
|
+
/**
|
|
10
|
+
* Abstract facade for base data pages.
|
|
11
|
+
* Orchestrates state, service, and search handler, and surfaces the host app's
|
|
12
|
+
* busy indicator / toasts through UtilService.
|
|
13
|
+
*/
|
|
14
|
+
export class BaseDataPageFacade {
|
|
15
|
+
state;
|
|
16
|
+
service;
|
|
17
|
+
searchHandler;
|
|
18
|
+
utilService;
|
|
19
|
+
config;
|
|
20
|
+
destroy$ = new Subject();
|
|
21
|
+
cardSelectionCleared = new Subject();
|
|
22
|
+
constructor(state, service, searchHandler, utilService, config) {
|
|
23
|
+
this.state = state;
|
|
24
|
+
this.service = service;
|
|
25
|
+
this.searchHandler = searchHandler;
|
|
26
|
+
this.utilService = utilService;
|
|
27
|
+
this.config = config;
|
|
28
|
+
this.initializeSearchHandler();
|
|
29
|
+
this.state.setVisibleColumns(this.config.columns);
|
|
30
|
+
if (this.config.cardDataMapper) {
|
|
31
|
+
this.state.setCardDataMapper(this.config.cardDataMapper);
|
|
32
|
+
}
|
|
33
|
+
// Drive the host busy indicator from the shared loading flag.
|
|
34
|
+
this.state
|
|
35
|
+
.isUpdating$()
|
|
36
|
+
.pipe(takeUntil(this.destroy$))
|
|
37
|
+
.subscribe((loading) => this.utilService.sendBI(loading));
|
|
38
|
+
}
|
|
39
|
+
// ===== Configuration =====
|
|
40
|
+
getConfig() {
|
|
41
|
+
return this.config;
|
|
42
|
+
}
|
|
43
|
+
getColumns() {
|
|
44
|
+
return this.config.columns;
|
|
45
|
+
}
|
|
46
|
+
// ===== Observables =====
|
|
47
|
+
get items$() {
|
|
48
|
+
return this.state.getItems$();
|
|
49
|
+
}
|
|
50
|
+
get isLoading$() {
|
|
51
|
+
return this.state.isUpdating$();
|
|
52
|
+
}
|
|
53
|
+
get totalCount$() {
|
|
54
|
+
return this.state.getTotalCount$();
|
|
55
|
+
}
|
|
56
|
+
get filters$() {
|
|
57
|
+
return this.state.getFilters$();
|
|
58
|
+
}
|
|
59
|
+
get sorts$() {
|
|
60
|
+
return this.state.getSorts$();
|
|
61
|
+
}
|
|
62
|
+
get searchTerm$() {
|
|
63
|
+
return this.state.getSearchTerm$();
|
|
64
|
+
}
|
|
65
|
+
get visibleColumns$() {
|
|
66
|
+
return this.state.getVisibleColumns$();
|
|
67
|
+
}
|
|
68
|
+
get cardData() {
|
|
69
|
+
return this.state.getCardData();
|
|
70
|
+
}
|
|
71
|
+
get currentCardData() {
|
|
72
|
+
return this.state.getCurrentCardData();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Emits when a refetch invalidates the current card selection.
|
|
76
|
+
* Card views listen to this to clear their own selection state.
|
|
77
|
+
*/
|
|
78
|
+
get cardSelectionCleared$() {
|
|
79
|
+
return this.cardSelectionCleared.asObservable();
|
|
80
|
+
}
|
|
81
|
+
// ===== Data Loading =====
|
|
82
|
+
async loadData() {
|
|
83
|
+
this.clearCardSelection();
|
|
84
|
+
this.state.setUpdating(true);
|
|
85
|
+
this.state.clearItems();
|
|
86
|
+
this.state.resetPagination();
|
|
87
|
+
const params = this.state.getQueryParamsValue();
|
|
88
|
+
const filters = this.state.getFiltersValue();
|
|
89
|
+
const sorts = this.state.getSortsValue();
|
|
90
|
+
const searchTerm = this.state.getSearchTermValue();
|
|
91
|
+
const result = await this.service.getData(params.skip, params.limit, filters, sorts, searchTerm, this.config.columns);
|
|
92
|
+
this.state.setUpdating(false);
|
|
93
|
+
if (result instanceof ErrorResponse) {
|
|
94
|
+
this.utilService.showError(result.ErrorMsg);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.state.setItems(result.Result || []);
|
|
98
|
+
this.state.setTotalCount(result.Total || 0);
|
|
99
|
+
}
|
|
100
|
+
addItem(item) {
|
|
101
|
+
this.state.addItem(item);
|
|
102
|
+
}
|
|
103
|
+
async loadMore() {
|
|
104
|
+
this.state.setUpdating(true);
|
|
105
|
+
this.state.incrementPagination();
|
|
106
|
+
const params = this.state.getQueryParamsValue();
|
|
107
|
+
const filters = this.state.getFiltersValue();
|
|
108
|
+
const sorts = this.state.getSortsValue();
|
|
109
|
+
const searchTerm = this.state.getSearchTermValue();
|
|
110
|
+
const result = await this.service.getData(params.skip, params.limit, filters, sorts, searchTerm, this.config.columns);
|
|
111
|
+
this.state.setUpdating(false);
|
|
112
|
+
if (result instanceof ErrorResponse) {
|
|
113
|
+
this.utilService.showError(result.ErrorMsg);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.state.appendItems(result.Result || []);
|
|
117
|
+
}
|
|
118
|
+
async refresh() {
|
|
119
|
+
await this.loadData();
|
|
120
|
+
}
|
|
121
|
+
// ===== Search =====
|
|
122
|
+
onSearch(term) {
|
|
123
|
+
this.searchHandler.search(term);
|
|
124
|
+
}
|
|
125
|
+
initializeSearchHandler() {
|
|
126
|
+
if (this.config.searchDebounceTime) {
|
|
127
|
+
this.searchHandler.setDebounceTime(this.config.searchDebounceTime);
|
|
128
|
+
}
|
|
129
|
+
this.searchHandler.search$.pipe(takeUntil(this.destroy$)).subscribe((term) => {
|
|
130
|
+
this.state.setSearchTerm(term);
|
|
131
|
+
this.loadData();
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// ===== Filters / Sorts =====
|
|
135
|
+
async applyFilters(filters) {
|
|
136
|
+
this.state.setFilters(filters);
|
|
137
|
+
await this.loadData();
|
|
138
|
+
}
|
|
139
|
+
async clearFilters() {
|
|
140
|
+
this.state.clearFilters();
|
|
141
|
+
await this.loadData();
|
|
142
|
+
}
|
|
143
|
+
async applySorts(sorts) {
|
|
144
|
+
this.state.setSorts(sorts);
|
|
145
|
+
await this.loadData();
|
|
146
|
+
}
|
|
147
|
+
async clearSorts() {
|
|
148
|
+
this.state.clearSorts();
|
|
149
|
+
await this.loadData();
|
|
150
|
+
}
|
|
151
|
+
// ===== Visible Columns =====
|
|
152
|
+
updateVisibleColumns(columns) {
|
|
153
|
+
this.state.setVisibleColumns(columns);
|
|
154
|
+
}
|
|
155
|
+
// ===== Card Data =====
|
|
156
|
+
selectCard(cardData) {
|
|
157
|
+
this.state.setCurrentCardData(cardData);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Drop the current card selection because the data it referred to is being
|
|
161
|
+
* replaced. Called by loadData(); deliberately not by loadMore(), which only
|
|
162
|
+
* appends and leaves an existing selection valid.
|
|
163
|
+
*/
|
|
164
|
+
clearCardSelection() {
|
|
165
|
+
this.state.setCurrentCardData(null);
|
|
166
|
+
this.cardSelectionCleared.next();
|
|
167
|
+
}
|
|
168
|
+
// ===== CRUD =====
|
|
169
|
+
async saveItems(items) {
|
|
170
|
+
this.state.setUpdating(true);
|
|
171
|
+
const result = await this.service.saveItems(items);
|
|
172
|
+
this.state.setUpdating(false);
|
|
173
|
+
if (result instanceof ErrorResponse) {
|
|
174
|
+
this.utilService.showError(result.ErrorMsg);
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
this.utilService.showSuccess('Record(s) saved successfully');
|
|
178
|
+
result.forEach((savedItem) => this.state.upsertItem(savedItem));
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
async deleteItems(itemIds) {
|
|
182
|
+
this.state.setUpdating(true);
|
|
183
|
+
const result = await this.service.deleteItems(itemIds);
|
|
184
|
+
this.state.setUpdating(false);
|
|
185
|
+
if (result instanceof ErrorResponse) {
|
|
186
|
+
this.utilService.showError(result.ErrorMsg);
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
itemIds.forEach((id) => this.state.removeItem(id));
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
// ===== Export =====
|
|
193
|
+
async exportData() {
|
|
194
|
+
const filters = this.state.getFiltersValue();
|
|
195
|
+
const sorts = this.state.getSortsValue();
|
|
196
|
+
const searchTerm = this.state.getSearchTermValue();
|
|
197
|
+
const result = await this.service.exportData(filters, sorts, searchTerm, this.config.columns);
|
|
198
|
+
if (result instanceof ErrorResponse) {
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
// ===== Cleanup =====
|
|
204
|
+
ngOnDestroy() {
|
|
205
|
+
this.destroy$.next();
|
|
206
|
+
this.destroy$.complete();
|
|
207
|
+
this.cardSelectionCleared.complete();
|
|
208
|
+
}
|
|
209
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseDataPageFacade, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable });
|
|
210
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseDataPageFacade });
|
|
211
|
+
}
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseDataPageFacade, decorators: [{
|
|
213
|
+
type: Injectable
|
|
214
|
+
}], ctorParameters: () => [{ type: i1.BaseDataPageState }, { type: i2.BaseDataPageService }, { type: i3.SearchHandlerService }, { type: i4.UtilService }, { type: undefined }] });
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYXRhLXBhZ2UuZmFjYWRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvYmFzZS9jb3JlL2Jhc2UtZGF0YS1wYWdlLmZhY2FkZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQWMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7OztBQVFuRjs7OztHQUlHO0FBRUgsTUFBTSxPQUFnQixrQkFBa0I7SUFLMUI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQVJKLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQy9CLG9CQUFvQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFbkQsWUFDWSxLQUEyQixFQUMzQixPQUErQixFQUMvQixhQUFtQyxFQUNuQyxXQUF3QixFQUN4QixNQUF5QjtRQUp6QixVQUFLLEdBQUwsS0FBSyxDQUFzQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQUMvQixrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbkMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFFbkMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7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QUMsT0FBTyxDQUFDLFVBQVUsQ0FDMUMsT0FBTyxFQUNQLEtBQUssRUFDTCxVQUFVLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ3BCLENBQUM7UUFFRixJQUFJLE1BQU0sWUFBWSxhQUFhLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsc0JBQXNCO0lBRXRCLFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7d0dBN1FtQixrQkFBa0I7NEdBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEdkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQmFzZU1vZGVsLCBFcnJvclJlc3BvbnNlIH0gZnJvbSAndmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFV0aWxTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvc2VydmljZXMnO1xuaW1wb3J0IHsgQ2FyZERhdGEsIENvbHVtbkRlZmluaXRpb24sIEZpbHRlckNvbmRpdGlvbiwgU29ydENvbmRpdGlvbiB9IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBTZWFyY2hIYW5kbGVyU2VydmljZSB9IGZyb20gJy4uL2hhbmRsZXJzL3NlYXJjaC1oYW5kbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVBhZ2VDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvcGFnZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEJhc2VEYXRhUGFnZVNlcnZpY2UgfSBmcm9tICcuL2Jhc2UtZGF0YS1wYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZURhdGFQYWdlU3RhdGUgfSBmcm9tICcuL2Jhc2UtZGF0YS1wYWdlLnN0YXRlJztcblxuLyoqXG4gKiBBYnN0cmFjdCBmYWNhZGUgZm9yIGJhc2UgZGF0YSBwYWdlcy5cbiAqIE9yY2hlc3RyYXRlcyBzdGF0ZSwgc2VydmljZSwgYW5kIHNlYXJjaCBoYW5kbGVyLCBhbmQgc3VyZmFjZXMgdGhlIGhvc3QgYXBwJ3NcbiAqIGJ1c3kgaW5kaWNhdG9yIC8gdG9hc3RzIHRocm91Z2ggVXRpbFNlcnZpY2UuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRGF0YVBhZ2VGYWNhZGU8VCBleHRlbmRzIEJhc2VNb2RlbD4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBjYXJkU2VsZWN0aW9uQ2xlYXJlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHN0YXRlOiBCYXNlRGF0YVBhZ2VTdGF0ZTxUPixcbiAgICBwcm90ZWN0ZWQgc2VydmljZTogQmFzZURhdGFQYWdlU2VydmljZTxUPixcbiAgICBwcm90ZWN0ZWQgc2VhcmNoSGFuZGxlcjogU2VhcmNoSGFuZGxlclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBCYXNlUGFnZUNvbmZpZzxUPixcbiAgKSB7XG4gICAgdGhpcy5pbml0aWFsaXplU2VhcmNoSGFuZGxlcigpO1xuICAgIHRoaXMuc3RhdGUuc2V0VmlzaWJsZUNvbHVtbnModGhpcy5jb25maWcuY29sdW1ucyk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuY2FyZERhdGFNYXBwZXIpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2V0Q2FyZERhdGFNYXBwZXIodGhpcy5jb25maWcuY2FyZERhdGFNYXBwZXIpO1xuICAgIH1cblxuICAgIC8vIERyaXZlIHRoZSBob3N0IGJ1c3kgaW5kaWNhdG9yIGZyb20gdGhlIHNoYXJlZCBsb2FkaW5nIGZsYWcuXG4gICAgdGhpcy5zdGF0ZVxuICAgICAgLmlzVXBkYXRpbmckKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGxvYWRpbmcpID0+IHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGxvYWRpbmcpKTtcbiAgfVxuXG4gIC8vID09PT09IENvbmZpZ3VyYXRpb24gPT09PT1cblxuICBnZXRDb25maWcoKTogQmFzZVBhZ2VDb25maWc8VD4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIGdldENvbHVtbnMoKTogQ29sdW1uRGVmaW5pdGlvbjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuY29sdW1ucztcbiAgfVxuXG4gIC8vID09PT09IE9ic2VydmFibGVzID09PT09XG5cbiAgZ2V0IGl0ZW1zJCgpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldEl0ZW1zJCgpO1xuICB9XG5cbiAgZ2V0IGlzTG9hZGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNVcGRhdGluZyQoKTtcbiAgfVxuXG4gIGdldCB0b3RhbENvdW50JCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldFRvdGFsQ291bnQkKCk7XG4gIH1cblxuICBnZXQgZmlsdGVycyQoKTogT2JzZXJ2YWJsZTxGaWx0ZXJDb25kaXRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldEZpbHRlcnMkKCk7XG4gIH1cblxuICBnZXQgc29ydHMkKCk6IE9ic2VydmFibGU8U29ydENvbmRpdGlvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZ2V0U29ydHMkKCk7XG4gIH1cblxuICBnZXQgc2VhcmNoVGVybSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nZXRTZWFyY2hUZXJtJCgpO1xuICB9XG5cbiAgZ2V0IHZpc2libGVDb2x1bW5zJCgpOiBPYnNlcnZhYmxlPENvbHVtbkRlZmluaXRpb248VD5bXT4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldFZpc2libGVDb2x1bW5zJCgpO1xuICB9XG5cbiAgZ2V0IGNhcmREYXRhKCk6IFdyaXRhYmxlU2lnbmFsPENhcmREYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nZXRDYXJkRGF0YSgpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRDYXJkRGF0YSgpOiBXcml0YWJsZVNpZ25hbDxDYXJkRGF0YSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5nZXRDdXJyZW50Q2FyZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIGEgcmVmZXRjaCBpbnZhbGlkYXRlcyB0aGUgY3VycmVudCBjYXJkIHNlbGVjdGlvbi5cbiAgICogQ2FyZCB2aWV3cyBsaXN0ZW4gdG8gdGhpcyB0byBjbGVhciB0aGVpciBvd24gc2VsZWN0aW9uIHN0YXRlLlxuICAgKi9cbiAgZ2V0IGNhcmRTZWxlY3Rpb25DbGVhcmVkJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jYXJkU2VsZWN0aW9uQ2xlYXJlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vID09PT09IERhdGEgTG9hZGluZyA9PT09PVxuXG4gIGFzeW5jIGxvYWREYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2xlYXJDYXJkU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5zdGF0ZS5zZXRVcGRhdGluZyh0cnVlKTtcbiAgICB0aGlzLnN0YXRlLmNsZWFySXRlbXMoKTtcbiAgICB0aGlzLnN0YXRlLnJlc2V0UGFnaW5hdGlvbigpO1xuXG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5zdGF0ZS5nZXRRdWVyeVBhcmFtc1ZhbHVlKCk7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuc3RhdGUuZ2V0RmlsdGVyc1ZhbHVlKCk7XG4gICAgY29uc3Qgc29ydHMgPSB0aGlzLnN0YXRlLmdldFNvcnRzVmFsdWUoKTtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zdGF0ZS5nZXRTZWFyY2hUZXJtVmFsdWUoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXREYXRhKFxuICAgICAgcGFyYW1zLnNraXAsXG4gICAgICBwYXJhbXMubGltaXQsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgc29ydHMsXG4gICAgICBzZWFyY2hUZXJtLFxuICAgICAgdGhpcy5jb25maWcuY29sdW1ucyxcbiAgICApO1xuXG4gICAgdGhpcy5zdGF0ZS5zZXRVcGRhdGluZyhmYWxzZSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93RXJyb3IocmVzdWx0LkVycm9yTXNnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLnNldEl0ZW1zKHJlc3VsdC5SZXN1bHQgfHwgW10pO1xuICAgIHRoaXMuc3RhdGUuc2V0VG90YWxDb3VudChyZXN1bHQuVG90YWwgfHwgMCk7XG4gIH1cblxuICBhZGRJdGVtKGl0ZW06IFQpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLmFkZEl0ZW0oaXRlbSk7XG4gIH1cblxuICBhc3luYyBsb2FkTW9yZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLnNldFVwZGF0aW5nKHRydWUpO1xuICAgIHRoaXMuc3RhdGUuaW5jcmVtZW50UGFnaW5hdGlvbigpO1xuXG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5zdGF0ZS5nZXRRdWVyeVBhcmFtc1ZhbHVlKCk7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuc3RhdGUuZ2V0RmlsdGVyc1ZhbHVlKCk7XG4gICAgY29uc3Qgc29ydHMgPSB0aGlzLnN0YXRlLmdldFNvcnRzVmFsdWUoKTtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zdGF0ZS5nZXRTZWFyY2hUZXJtVmFsdWUoKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXREYXRhKFxuICAgICAgcGFyYW1zLnNraXAsXG4gICAgICBwYXJhbXMubGltaXQsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgc29ydHMsXG4gICAgICBzZWFyY2hUZXJtLFxuICAgICAgdGhpcy5jb25maWcuY29sdW1ucyxcbiAgICApO1xuXG4gICAgdGhpcy5zdGF0ZS5zZXRVcGRhdGluZyhmYWxzZSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93RXJyb3IocmVzdWx0LkVycm9yTXNnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmFwcGVuZEl0ZW1zKHJlc3VsdC5SZXN1bHQgfHwgW10pO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICAvLyA9PT09PSBTZWFyY2ggPT09PT1cblxuICBvblNlYXJjaCh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaEhhbmRsZXIuc2VhcmNoKHRlcm0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2VhcmNoSGFuZGxlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcuc2VhcmNoRGVib3VuY2VUaW1lKSB7XG4gICAgICB0aGlzLnNlYXJjaEhhbmRsZXIuc2V0RGVib3VuY2VUaW1lKHRoaXMuY29uZmlnLnNlYXJjaERlYm91bmNlVGltZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWFyY2hIYW5kbGVyLnNlYXJjaCQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgodGVybSkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRTZWFyY2hUZXJtKHRlcm0pO1xuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT0gRmlsdGVycyAvIFNvcnRzID09PT09XG5cbiAgYXN5bmMgYXBwbHlGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlckNvbmRpdGlvbltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS5zZXRGaWx0ZXJzKGZpbHRlcnMpO1xuICAgIGF3YWl0IHRoaXMubG9hZERhdGEoKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyRmlsdGVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXRlLmNsZWFyRmlsdGVycygpO1xuICAgIGF3YWl0IHRoaXMubG9hZERhdGEoKTtcbiAgfVxuXG4gIGFzeW5jIGFwcGx5U29ydHMoc29ydHM6IFNvcnRDb25kaXRpb25bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdGUuc2V0U29ydHMoc29ydHMpO1xuICAgIGF3YWl0IHRoaXMubG9hZERhdGEoKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyU29ydHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZS5jbGVhclNvcnRzKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgLy8gPT09PT0gVmlzaWJsZSBDb2x1bW5zID09PT09XG5cbiAgdXBkYXRlVmlzaWJsZUNvbHVtbnMoY29sdW1uczogQ29sdW1uRGVmaW5pdGlvbjxUPltdKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZXRWaXNpYmxlQ29sdW1ucyhjb2x1bW5zKTtcbiAgfVxuXG4gIC8vID09PT09IENhcmQgRGF0YSA9PT09PVxuXG4gIHNlbGVjdENhcmQoY2FyZERhdGE6IENhcmREYXRhIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUuc2V0Q3VycmVudENhcmREYXRhKGNhcmREYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wIHRoZSBjdXJyZW50IGNhcmQgc2VsZWN0aW9uIGJlY2F1c2UgdGhlIGRhdGEgaXQgcmVmZXJyZWQgdG8gaXMgYmVpbmdcbiAgICogcmVwbGFjZWQuIENhbGxlZCBieSBsb2FkRGF0YSgpOyBkZWxpYmVyYXRlbHkgbm90IGJ5IGxvYWRNb3JlKCksIHdoaWNoIG9ubHlcbiAgICogYXBwZW5kcyBhbmQgbGVhdmVzIGFuIGV4aXN0aW5nIHNlbGVjdGlvbiB2YWxpZC5cbiAgICovXG4gIHByb3RlY3RlZCBjbGVhckNhcmRTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZXRDdXJyZW50Q2FyZERhdGEobnVsbCk7XG4gICAgdGhpcy5jYXJkU2VsZWN0aW9uQ2xlYXJlZC5uZXh0KCk7XG4gIH1cblxuICAvLyA9PT09PSBDUlVEID09PT09XG5cbiAgYXN5bmMgc2F2ZUl0ZW1zKGl0ZW1zOiBUW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLnN0YXRlLnNldFVwZGF0aW5nKHRydWUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VydmljZS5zYXZlSXRlbXMoaXRlbXMpO1xuICAgIHRoaXMuc3RhdGUuc2V0VXBkYXRpbmcoZmFsc2UpO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0Vycm9yKHJlc3VsdC5FcnJvck1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnUmVjb3JkKHMpIHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIHJlc3VsdC5mb3JFYWNoKChzYXZlZEl0ZW0pID0+IHRoaXMuc3RhdGUudXBzZXJ0SXRlbShzYXZlZEl0ZW0pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUl0ZW1zKGl0ZW1JZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5zdGF0ZS5zZXRVcGRhdGluZyh0cnVlKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlcnZpY2UuZGVsZXRlSXRlbXMoaXRlbUlkcyk7XG4gICAgdGhpcy5zdGF0ZS5zZXRVcGRhdGluZyhmYWxzZSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93RXJyb3IocmVzdWx0LkVycm9yTXNnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpdGVtSWRzLmZvckVhY2goKGlkKSA9PiB0aGlzLnN0YXRlLnJlbW92ZUl0ZW0oaWQpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vID09PT09IEV4cG9ydCA9PT09PVxuXG4gIGFzeW5jIGV4cG9ydERhdGEoKTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5zdGF0ZS5nZXRGaWx0ZXJzVmFsdWUoKTtcbiAgICBjb25zdCBzb3J0cyA9IHRoaXMuc3RhdGUuZ2V0U29ydHNWYWx1ZSgpO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnN0YXRlLmdldFNlYXJjaFRlcm1WYWx1ZSgpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmV4cG9ydERhdGEoXG4gICAgICBmaWx0ZXJzLFxuICAgICAgc29ydHMsXG4gICAgICBzZWFyY2hUZXJtLFxuICAgICAgdGhpcy5jb25maWcuY29sdW1ucyxcbiAgICApO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gPT09PT0gQ2xlYW51cCA9PT09PVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmNhcmRTZWxlY3Rpb25DbGVhcmVkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { lastValueFrom } from 'rxjs';
|
|
3
|
+
import { ErrorResponse, } from 'verben-authentication-ui/src/lib/models';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "verben-authentication-ui/src/lib/services";
|
|
6
|
+
import * as i2 from "../handlers/filter-handler.service";
|
|
7
|
+
import * as i3 from "../handlers/sort-handler.service";
|
|
8
|
+
/**
|
|
9
|
+
* Abstract base service for data pages.
|
|
10
|
+
* Handles list/search/save/delete with filter and sort support.
|
|
11
|
+
*
|
|
12
|
+
* The concrete URLs are built by the protected `*Url` seams below so that
|
|
13
|
+
* services whose API does not follow the default `Get{Endpoint}/{skip}/{limit}`
|
|
14
|
+
* conventions (e.g. plural names or a trailing sort suffix) can override just
|
|
15
|
+
* the URL without reimplementing the request-selection logic in `getData()`.
|
|
16
|
+
* When `baseUrl` is omitted, HttpWebRequestService falls back to the
|
|
17
|
+
* AuthenticationAPI base.
|
|
18
|
+
*/
|
|
19
|
+
export class BaseDataPageService {
|
|
20
|
+
server;
|
|
21
|
+
filterHandler;
|
|
22
|
+
sortHandler;
|
|
23
|
+
baseUrl;
|
|
24
|
+
constructor(server, filterHandler, sortHandler, baseUrl) {
|
|
25
|
+
this.server = server;
|
|
26
|
+
this.filterHandler = filterHandler;
|
|
27
|
+
this.sortHandler = sortHandler;
|
|
28
|
+
this.baseUrl = baseUrl;
|
|
29
|
+
}
|
|
30
|
+
// ===== URL seams (override in child services when the API deviates) =====
|
|
31
|
+
listUrl(skip, limit) {
|
|
32
|
+
return `Get${this.getEndpoint()}/${skip}/${limit}`;
|
|
33
|
+
}
|
|
34
|
+
searchTermUrl(term, skip, limit) {
|
|
35
|
+
return `Get${this.getEndpoint()}WithParam/${term}/${skip}/${limit}`;
|
|
36
|
+
}
|
|
37
|
+
filterSearchUrl(skip, limit) {
|
|
38
|
+
return `Search${this.getEndpoint()}/${skip}/${limit}`;
|
|
39
|
+
}
|
|
40
|
+
saveUrl() {
|
|
41
|
+
return `Save${this.getEndpoint()}`;
|
|
42
|
+
}
|
|
43
|
+
deleteUrl(itemIds) {
|
|
44
|
+
return `${this.getEndpoint()}/${itemIds.join(',')}`;
|
|
45
|
+
}
|
|
46
|
+
// ===== Payload =====
|
|
47
|
+
buildPayload(filters, sorts, columns) {
|
|
48
|
+
const filterPayload = this.filterHandler.buildFilterPayload(filters, columns);
|
|
49
|
+
const sortPayload = this.sortHandler.buildSortPayload(sorts, columns);
|
|
50
|
+
return [...filterPayload, ...sortPayload];
|
|
51
|
+
}
|
|
52
|
+
// ===== Reads =====
|
|
53
|
+
/**
|
|
54
|
+
* Fetch data, automatically choosing the endpoint based on parameters:
|
|
55
|
+
* search-only -> GET WithParam, filters/sorts -> POST Search, otherwise plain GET.
|
|
56
|
+
*/
|
|
57
|
+
async getData(skip, limit, filters, sorts, searchTerm, columns) {
|
|
58
|
+
const hasFilters = !!filters && filters.length > 0;
|
|
59
|
+
const hasSorts = !!sorts && sorts.length > 0;
|
|
60
|
+
if (searchTerm && !hasFilters && !hasSorts) {
|
|
61
|
+
return this.server.get(this.searchTermUrl(searchTerm, skip, limit), this.baseUrl);
|
|
62
|
+
}
|
|
63
|
+
if (hasFilters || hasSorts) {
|
|
64
|
+
if (!columns) {
|
|
65
|
+
throw new Error('Columns required for filter/sort operations');
|
|
66
|
+
}
|
|
67
|
+
const payload = this.buildPayload(filters || [], sorts || [], columns);
|
|
68
|
+
return this.server.post(this.filterSearchUrl(skip, limit), payload, this.baseUrl);
|
|
69
|
+
}
|
|
70
|
+
return this.server.get(this.listUrl(skip, limit), this.baseUrl);
|
|
71
|
+
}
|
|
72
|
+
// ===== Writes =====
|
|
73
|
+
async saveItems(items) {
|
|
74
|
+
return this.server.post(this.saveUrl(), items, this.baseUrl);
|
|
75
|
+
}
|
|
76
|
+
async deleteItems(itemIds) {
|
|
77
|
+
// HttpWebRequestService.delete returns a raw observable that rejects on HTTP
|
|
78
|
+
// error (unlike get/post, which resolve an ErrorResponse), so normalize here
|
|
79
|
+
// to keep the facade's error-handling contract uniform.
|
|
80
|
+
try {
|
|
81
|
+
const result = await lastValueFrom(this.server.delete(this.deleteUrl(itemIds), this.baseUrl));
|
|
82
|
+
return result ?? false;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
const msg = err?.error?.ErrorMsg || err?.ErrorMsg || err?.message || 'Delete failed';
|
|
86
|
+
return new ErrorResponse(msg);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ===== Export =====
|
|
90
|
+
async exportData(filters, sorts, searchTerm, columns) {
|
|
91
|
+
const result = await this.getData(0, 999999, filters, sorts, searchTerm, columns);
|
|
92
|
+
if (result instanceof ErrorResponse) {
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
return result.Result || [];
|
|
96
|
+
}
|
|
97
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseDataPageService, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable });
|
|
98
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseDataPageService });
|
|
99
|
+
}
|
|
100
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BaseDataPageService, decorators: [{
|
|
101
|
+
type: Injectable
|
|
102
|
+
}], ctorParameters: () => [{ type: i1.HttpWebRequestService }, { type: i2.FilterHandlerService }, { type: i3.SortHandlerService }, { type: undefined }] });
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYXRhLXBhZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL2Jhc2UvY29yZS9iYXNlLWRhdGEtcGFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEVBRUwsYUFBYSxHQUVkLE1BQU0seUNBQXlDLENBQUM7Ozs7O0FBT2pEOzs7Ozs7Ozs7O0dBVUc7QUFFSCxNQUFNLE9BQWdCLG1CQUFtQjtJQUUzQjtJQUNBO0lBQ0E7SUFDQTtJQUpaLFlBQ1ksTUFBNkIsRUFDN0IsYUFBbUMsRUFDbkMsV0FBK0IsRUFDL0IsT0FBZ0I7UUFIaEIsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFDN0Isa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBQ25DLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixZQUFPLEdBQVAsT0FBTyxDQUFTO0lBQ3pCLENBQUM7SUFLSiwyRUFBMkU7SUFFakUsT0FBTyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQzNDLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFUyxhQUFhLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxLQUFhO1FBQy9ELE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRVMsZUFBZSxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ25ELE9BQU8sU0FBUyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxJQUFJLEtBQUssRUFB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UUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sR0FBRyxHQUNQLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLEdBQUcsRUFBRSxRQUFRLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxlQUFlLENBQUM7WUFDM0UsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtJQUVyQixLQUFLLENBQUMsVUFBVSxDQUNkLE9BQTJCLEVBQzNCLEtBQXVCLEVBQ3ZCLFVBQW1CLEVBQ25CLE9BQStCO1FBRS9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xGLElBQUksTUFBTSxZQUFZLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7d0dBdkhtQixtQkFBbUI7NEdBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgRXJyb3JSZXNwb25zZSxcbiAgUGFnZWRSZXN1bHQsXG59IGZyb20gJ3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBIdHRwV2ViUmVxdWVzdFNlcnZpY2UgfSBmcm9tICd2ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uLCBGaWx0ZXJDb25kaXRpb24sIFNvcnRDb25kaXRpb24gfSBmcm9tICd2ZXJiZW4tbmctdWknO1xuaW1wb3J0IHsgRmlsdGVySGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi9oYW5kbGVycy9maWx0ZXItaGFuZGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNvcnRIYW5kbGVyU2VydmljZSB9IGZyb20gJy4uL2hhbmRsZXJzL3NvcnQtaGFuZGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5VmFsdWUgfSBmcm9tICcuLi9tb2RlbHMvYXBpLXBheWxvYWQnO1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2Ugc2VydmljZSBmb3IgZGF0YSBwYWdlcy5cbiAqIEhhbmRsZXMgbGlzdC9zZWFyY2gvc2F2ZS9kZWxldGUgd2l0aCBmaWx0ZXIgYW5kIHNvcnQgc3VwcG9ydC5cbiAqXG4gKiBUaGUgY29uY3JldGUgVVJMcyBhcmUgYnVpbHQgYnkgdGhlIHByb3RlY3RlZCBgKlVybGAgc2VhbXMgYmVsb3cgc28gdGhhdFxuICogc2VydmljZXMgd2hvc2UgQVBJIGRvZXMgbm90IGZvbGxvdyB0aGUgZGVmYXVsdCBgR2V0e0VuZHBvaW50fS97c2tpcH0ve2xpbWl0fWBcbiAqIGNvbnZlbnRpb25zIChlLmcuIHBsdXJhbCBuYW1lcyBvciBhIHRyYWlsaW5nIHNvcnQgc3VmZml4KSBjYW4gb3ZlcnJpZGUganVzdFxuICogdGhlIFVSTCB3aXRob3V0IHJlaW1wbGVtZW50aW5nIHRoZSByZXF1ZXN0LXNlbGVjdGlvbiBsb2dpYyBpbiBgZ2V0RGF0YSgpYC5cbiAqIFdoZW4gYGJhc2VVcmxgIGlzIG9taXR0ZWQsIEh0dHBXZWJSZXF1ZXN0U2VydmljZSBmYWxscyBiYWNrIHRvIHRoZVxuICogQXV0aGVudGljYXRpb25BUEkgYmFzZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEYXRhUGFnZVNlcnZpY2U8VCBleHRlbmRzIEJhc2VNb2RlbD4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc2VydmVyOiBIdHRwV2ViUmVxdWVzdFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGZpbHRlckhhbmRsZXI6IEZpbHRlckhhbmRsZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzb3J0SGFuZGxlcjogU29ydEhhbmRsZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBiYXNlVXJsPzogc3RyaW5nLFxuICApIHt9XG5cbiAgLyoqIEFQSSBlbmRwb2ludCBuYW1lIChlLmcuICdVc2VyJykuIE11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY2hpbGQgY2xhc3Nlcy4gKi9cbiAgYWJzdHJhY3QgZ2V0RW5kcG9pbnQoKTogc3RyaW5nO1xuXG4gIC8vID09PT09IFVSTCBzZWFtcyAob3ZlcnJpZGUgaW4gY2hpbGQgc2VydmljZXMgd2hlbiB0aGUgQVBJIGRldmlhdGVzKSA9PT09PVxuXG4gIHByb3RlY3RlZCBsaXN0VXJsKHNraXA6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBHZXQke3RoaXMuZ2V0RW5kcG9pbnQoKX0vJHtza2lwfS8ke2xpbWl0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VhcmNoVGVybVVybCh0ZXJtOiBzdHJpbmcsIHNraXA6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBHZXQke3RoaXMuZ2V0RW5kcG9pbnQoKX1XaXRoUGFyYW0vJHt0ZXJtfS8ke3NraXB9LyR7bGltaXR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWx0ZXJTZWFyY2hVcmwoc2tpcDogbnVtYmVyLCBsaW1pdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNlYXJjaCR7dGhpcy5nZXRFbmRwb2ludCgpfS8ke3NraXB9LyR7bGltaXR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzYXZlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTYXZlJHt0aGlzLmdldEVuZHBvaW50KCl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWxldGVVcmwoaXRlbUlkczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldEVuZHBvaW50KCl9LyR7aXRlbUlkcy5qb2luKCcsJyl9YDtcbiAgfVxuXG4gIC8vID09PT09IFBheWxvYWQgPT09PT1cblxuICBidWlsZFBheWxvYWQoXG4gICAgZmlsdGVyczogRmlsdGVyQ29uZGl0aW9uW10sXG4gICAgc29ydHM6IFNvcnRDb25kaXRpb25bXSxcbiAgICBjb2x1bW5zOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10sXG4gICk6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSB7XG4gICAgY29uc3QgZmlsdGVyUGF5bG9hZCA9IHRoaXMuZmlsdGVySGFuZGxlci5idWlsZEZpbHRlclBheWxvYWQoZmlsdGVycywgY29sdW1ucyk7XG4gICAgY29uc3Qgc29ydFBheWxvYWQgPSB0aGlzLnNvcnRIYW5kbGVyLmJ1aWxkU29ydFBheWxvYWQoc29ydHMsIGNvbHVtbnMpO1xuICAgIHJldHVybiBbLi4uZmlsdGVyUGF5bG9hZCwgLi4uc29ydFBheWxvYWRdO1xuICB9XG5cbiAgLy8gPT09PT0gUmVhZHMgPT09PT1cblxuICAvKipcbiAgICogRmV0Y2ggZGF0YSwgYXV0b21hdGljYWxseSBjaG9vc2luZyB0aGUgZW5kcG9pbnQgYmFzZWQgb24gcGFyYW1ldGVyczpcbiAgICogc2VhcmNoLW9ubHkgLT4gR0VUIFdpdGhQYXJhbSwgZmlsdGVycy9zb3J0cyAtPiBQT1NUIFNlYXJjaCwgb3RoZXJ3aXNlIHBsYWluIEdFVC5cbiAgICovXG4gIGFzeW5jIGdldERhdGEoXG4gICAgc2tpcDogbnVtYmVyLFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICAgZmlsdGVycz86IEZpbHRlckNvbmRpdGlvbltdLFxuICAgIHNvcnRzPzogU29ydENvbmRpdGlvbltdLFxuICAgIHNlYXJjaFRlcm0/OiBzdHJpbmcsXG4gICAgY29sdW1ucz86IENvbHVtbkRlZmluaXRpb248VD5bXSxcbiAgKTogUHJvbWlzZTxQYWdlZFJlc3VsdDxUPiB8IEVycm9yUmVzcG9uc2U+IHtcbiAgICBjb25zdCBoYXNGaWx0ZXJzID0gISFmaWx0ZXJzICYmIGZpbHRlcnMubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoYXNTb3J0cyA9ICEhc29ydHMgJiYgc29ydHMubGVuZ3RoID4gMDtcblxuICAgIGlmIChzZWFyY2hUZXJtICYmICFoYXNGaWx0ZXJzICYmICFoYXNTb3J0cykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmdldDxQYWdlZFJlc3VsdDxUPj4oXG4gICAgICAgIHRoaXMuc2VhcmNoVGVybVVybChzZWFyY2hUZXJtLCBza2lwLCBsaW1pdCksXG4gICAgICAgIHRoaXMuYmFzZVVybCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0ZpbHRlcnMgfHwgaGFzU29ydHMpIHtcbiAgICAgIGlmICghY29sdW1ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbnMgcmVxdWlyZWQgZm9yIGZpbHRlci9zb3J0IG9wZXJhdGlvbnMnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmJ1aWxkUGF5bG9hZChmaWx0ZXJzIHx8IFtdLCBzb3J0cyB8fCBbXSwgY29sdW1ucyk7XG4gICAgICByZXR1cm4gdGhpcy5zZXJ2ZXIucG9zdDxQYWdlZFJlc3VsdDxUPj4oXG4gICAgICAgIHRoaXMuZmlsdGVyU2VhcmNoVXJsKHNraXAsIGxpbWl0KSxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgdGhpcy5iYXNlVXJsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXJ2ZXIuZ2V0PFBhZ2VkUmVzdWx0PFQ+Pih0aGlzLmxpc3RVcmwoc2tpcCwgbGltaXQpLCB0aGlzLmJhc2VVcmwpO1xuICB9XG5cbiAgLy8gPT09PT0gV3JpdGVzID09PT09XG5cbiAgYXN5bmMgc2F2ZUl0ZW1zKGl0ZW1zOiBUW10pOiBQcm9taXNlPFRbXSB8IEVycm9yUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2ZXIucG9zdDxUW10+KHRoaXMuc2F2ZVVybCgpLCBpdGVtcywgdGhpcy5iYXNlVXJsKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUl0ZW1zKGl0ZW1JZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuIHwgRXJyb3JSZXNwb25zZT4ge1xuICAgIC8vIEh0dHBXZWJSZXF1ZXN0U2VydmljZS5kZWxldGUgcmV0dXJucyBhIHJhdyBvYnNlcnZhYmxlIHRoYXQgcmVqZWN0cyBvbiBIVFRQXG4gICAgLy8gZXJyb3IgKHVubGlrZSBnZXQvcG9zdCwgd2hpY2ggcmVzb2x2ZSBhbiBFcnJvclJlc3BvbnNlKSwgc28gbm9ybWFsaXplIGhlcmVcbiAgICAvLyB0byBrZWVwIHRoZSBmYWNhZGUncyBlcnJvci1oYW5kbGluZyBjb250cmFjdCB1bmlmb3JtLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLnNlcnZlci5kZWxldGU8Ym9vbGVhbj4odGhpcy5kZWxldGVVcmwoaXRlbUlkcyksIHRoaXMuYmFzZVVybCksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3VsdCA/PyBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc3QgbXNnID1cbiAgICAgICAgZXJyPy5lcnJvcj8uRXJyb3JNc2cgfHwgZXJyPy5FcnJvck1zZyB8fCBlcnI/Lm1lc3NhZ2UgfHwgJ0RlbGV0ZSBmYWlsZWQnO1xuICAgICAgcmV0dXJuIG5ldyBFcnJvclJlc3BvbnNlKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gRXhwb3J0ID09PT09XG5cbiAgYXN5bmMgZXhwb3J0RGF0YShcbiAgICBmaWx0ZXJzPzogRmlsdGVyQ29uZGl0aW9uW10sXG4gICAgc29ydHM/OiBTb3J0Q29uZGl0aW9uW10sXG4gICAgc2VhcmNoVGVybT86IHN0cmluZyxcbiAgICBjb2x1bW5zPzogQ29sdW1uRGVmaW5pdGlvbjxUPltdLFxuICApOiBQcm9taXNlPFRbXSB8IEVycm9yUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERhdGEoMCwgOTk5OTk5LCBmaWx0ZXJzLCBzb3J0cywgc2VhcmNoVGVybSwgY29sdW1ucyk7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuUmVzdWx0IHx8IFtdO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { signal } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { SortDirection, } from 'verben-authentication-ui/src/lib/models';
|
|
4
|
+
/**
|
|
5
|
+
* Abstract state management for base data pages.
|
|
6
|
+
* Tracks items, loading state, query params, filters, sorts, search, and
|
|
7
|
+
* visible columns. Card data is held in signals for cheap change detection.
|
|
8
|
+
*/
|
|
9
|
+
export class BaseDataPageState {
|
|
10
|
+
updating$ = new BehaviorSubject(false);
|
|
11
|
+
items$ = new BehaviorSubject([]);
|
|
12
|
+
totalCount$ = new BehaviorSubject(0);
|
|
13
|
+
queryParams$ = new BehaviorSubject({
|
|
14
|
+
skip: 0,
|
|
15
|
+
limit: 20,
|
|
16
|
+
sortOrder: SortDirection.Asc,
|
|
17
|
+
});
|
|
18
|
+
searchTerm$ = new BehaviorSubject('');
|
|
19
|
+
filters$ = new BehaviorSubject([]);
|
|
20
|
+
sorts$ = new BehaviorSubject([]);
|
|
21
|
+
visibleColumns$ = new BehaviorSubject([]);
|
|
22
|
+
cardData = signal([]);
|
|
23
|
+
currentCardData = signal(null);
|
|
24
|
+
cardDataMapper;
|
|
25
|
+
/**
|
|
26
|
+
* Stable identity for a record. The auth models key on uppercase `Id`/`Code`
|
|
27
|
+
* and only sometimes carry a lowercase `id`, so match across all three rather
|
|
28
|
+
* than assuming one is populated.
|
|
29
|
+
*/
|
|
30
|
+
getItemKey(item) {
|
|
31
|
+
return item.Id || item.id || item.Code;
|
|
32
|
+
}
|
|
33
|
+
updateCardDataFromItems(items) {
|
|
34
|
+
if (this.cardDataMapper) {
|
|
35
|
+
this.cardData.set(items.map((item) => this.cardDataMapper(item)));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// ===== Loading State =====
|
|
39
|
+
isUpdating$() {
|
|
40
|
+
return this.updating$.asObservable();
|
|
41
|
+
}
|
|
42
|
+
setUpdating(isUpdating) {
|
|
43
|
+
this.updating$.next(isUpdating);
|
|
44
|
+
}
|
|
45
|
+
// ===== Items =====
|
|
46
|
+
getItems$() {
|
|
47
|
+
return this.items$.asObservable();
|
|
48
|
+
}
|
|
49
|
+
getItemsValue() {
|
|
50
|
+
return this.items$.getValue();
|
|
51
|
+
}
|
|
52
|
+
setItems(items) {
|
|
53
|
+
this.items$.next(items);
|
|
54
|
+
this.updateCardDataFromItems(items);
|
|
55
|
+
}
|
|
56
|
+
appendItems(newItems) {
|
|
57
|
+
const allItems = [...this.items$.getValue(), ...newItems];
|
|
58
|
+
this.items$.next(allItems);
|
|
59
|
+
this.updateCardDataFromItems(allItems);
|
|
60
|
+
}
|
|
61
|
+
addItem(item) {
|
|
62
|
+
const allItems = [item, ...this.items$.getValue()];
|
|
63
|
+
this.items$.next(allItems);
|
|
64
|
+
this.updateCardDataFromItems(allItems);
|
|
65
|
+
}
|
|
66
|
+
updateItem(updatedItem) {
|
|
67
|
+
const items = this.items$.getValue();
|
|
68
|
+
const key = this.getItemKey(updatedItem);
|
|
69
|
+
const index = items.findIndex((item) => this.getItemKey(item) === key);
|
|
70
|
+
if (index !== -1) {
|
|
71
|
+
items[index] = updatedItem;
|
|
72
|
+
const allItems = [...items];
|
|
73
|
+
this.items$.next(allItems);
|
|
74
|
+
this.updateCardDataFromItems(allItems);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Update the item when its key already exists, otherwise prepend it. */
|
|
78
|
+
upsertItem(item) {
|
|
79
|
+
const key = this.getItemKey(item);
|
|
80
|
+
const exists = this.items$
|
|
81
|
+
.getValue()
|
|
82
|
+
.some((existing) => this.getItemKey(existing) === key);
|
|
83
|
+
if (exists) {
|
|
84
|
+
this.updateItem(item);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.addItem(item);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
removeItem(itemKey) {
|
|
91
|
+
const filteredItems = this.items$
|
|
92
|
+
.getValue()
|
|
93
|
+
.filter((item) => this.getItemKey(item) !== itemKey);
|
|
94
|
+
this.items$.next(filteredItems);
|
|
95
|
+
this.updateCardDataFromItems(filteredItems);
|
|
96
|
+
}
|
|
97
|
+
clearItems() {
|
|
98
|
+
this.items$.next([]);
|
|
99
|
+
this.updateCardDataFromItems([]);
|
|
100
|
+
}
|
|
101
|
+
// ===== Total Count =====
|
|
102
|
+
getTotalCount$() {
|
|
103
|
+
return this.totalCount$.asObservable();
|
|
104
|
+
}
|
|
105
|
+
setTotalCount(count) {
|
|
106
|
+
this.totalCount$.next(count);
|
|
107
|
+
}
|
|
108
|
+
// ===== Query Parameters =====
|
|
109
|
+
getQueryParams$() {
|
|
110
|
+
return this.queryParams$.asObservable();
|
|
111
|
+
}
|
|
112
|
+
getQueryParamsValue() {
|
|
113
|
+
return this.queryParams$.getValue();
|
|
114
|
+
}
|
|
115
|
+
updateQueryParams(params) {
|
|
116
|
+
this.queryParams$.next({ ...this.queryParams$.getValue(), ...params });
|
|
117
|
+
}
|
|
118
|
+
resetPagination() {
|
|
119
|
+
this.queryParams$.next({ ...this.queryParams$.getValue(), skip: 0 });
|
|
120
|
+
}
|
|
121
|
+
incrementPagination() {
|
|
122
|
+
const currentParams = this.queryParams$.getValue();
|
|
123
|
+
this.queryParams$.next({
|
|
124
|
+
...currentParams,
|
|
125
|
+
skip: currentParams.skip + currentParams.limit,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// ===== Search =====
|
|
129
|
+
getSearchTerm$() {
|
|
130
|
+
return this.searchTerm$.asObservable();
|
|
131
|
+
}
|
|
132
|
+
getSearchTermValue() {
|
|
133
|
+
return this.searchTerm$.getValue();
|
|
134
|
+
}
|
|
135
|
+
setSearchTerm(term) {
|
|
136
|
+
this.searchTerm$.next(term);
|
|
137
|
+
}
|
|
138
|
+
// ===== Filters =====
|
|
139
|
+
getFilters$() {
|
|
140
|
+
return this.filters$.asObservable();
|
|
141
|
+
}
|
|
142
|
+
getFiltersValue() {
|
|
143
|
+
return this.filters$.getValue();
|
|
144
|
+
}
|
|
145
|
+
setFilters(filters) {
|
|
146
|
+
this.filters$.next(filters);
|
|
147
|
+
}
|
|
148
|
+
clearFilters() {
|
|
149
|
+
this.filters$.next([]);
|
|
150
|
+
}
|
|
151
|
+
// ===== Sorts =====
|
|
152
|
+
getSorts$() {
|
|
153
|
+
return this.sorts$.asObservable();
|
|
154
|
+
}
|
|
155
|
+
getSortsValue() {
|
|
156
|
+
return this.sorts$.getValue();
|
|
157
|
+
}
|
|
158
|
+
setSorts(sorts) {
|
|
159
|
+
this.sorts$.next(sorts);
|
|
160
|
+
}
|
|
161
|
+
clearSorts() {
|
|
162
|
+
this.sorts$.next([]);
|
|
163
|
+
}
|
|
164
|
+
// ===== Visible Columns =====
|
|
165
|
+
getVisibleColumns$() {
|
|
166
|
+
return this.visibleColumns$.asObservable();
|
|
167
|
+
}
|
|
168
|
+
getVisibleColumnsValue() {
|
|
169
|
+
return this.visibleColumns$.getValue();
|
|
170
|
+
}
|
|
171
|
+
setVisibleColumns(columns) {
|
|
172
|
+
this.visibleColumns$.next(columns);
|
|
173
|
+
}
|
|
174
|
+
// ===== Card Data =====
|
|
175
|
+
setCardDataMapper(mapper) {
|
|
176
|
+
this.cardDataMapper = mapper;
|
|
177
|
+
}
|
|
178
|
+
getCardData() {
|
|
179
|
+
return this.cardData;
|
|
180
|
+
}
|
|
181
|
+
setCardData(data) {
|
|
182
|
+
this.cardData.set(data);
|
|
183
|
+
}
|
|
184
|
+
getCurrentCardData() {
|
|
185
|
+
return this.currentCardData;
|
|
186
|
+
}
|
|
187
|
+
setCurrentCardData(data) {
|
|
188
|
+
this.currentCardData.set(data);
|
|
189
|
+
}
|
|
190
|
+
// ===== Reset All =====
|
|
191
|
+
reset() {
|
|
192
|
+
this.clearItems();
|
|
193
|
+
this.setSearchTerm('');
|
|
194
|
+
this.clearFilters();
|
|
195
|
+
this.clearSorts();
|
|
196
|
+
this.setVisibleColumns([]);
|
|
197
|
+
this.cardData.set([]);
|
|
198
|
+
this.currentCardData.set(null);
|
|
199
|
+
this.resetPagination();
|
|
200
|
+
this.setTotalCount(0);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYXRhLXBhZ2Uuc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9iYXNlL2NvcmUvYmFzZS1kYXRhLXBhZ2Uuc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBR0wsYUFBYSxHQUNkLE1BQU0seUNBQXlDLENBQUM7QUFHakQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBZ0IsaUJBQWlCO0lBQzNCLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUVoRCxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7SUFDdEMsV0FBVyxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBRTdDLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBaUI7UUFDM0QsSUFBSSxFQUFFLENBQUM7UUFDUCxLQUFLLEVBQUUsRUFBRTtRQUNULFNBQVMsRUFBRSxhQUFhLENBQUMsR0FBRztLQUM3QixDQUFDLENBQUM7SUFFTyxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7SUFFOUMsUUFBUSxHQUFHLElBQUksZUFBZSxDQUFvQixFQUFFLENBQUMsQ0FBQztJQUN0RCxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRWxELGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsRUFBRSxDQUFDLENBQUM7SUFFakUsUUFBUSxHQUFHLE1BQU0sQ0FBYSxFQUFFLENBQUMsQ0FBQztJQUNsQyxlQUFlLEdBQUcsTUFBTSxDQUFrQixJQUFJLENBQUMsQ0FBQztJQUVoRCxjQUFjLENBQXlC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TyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFxQjtRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsd0JBQXdCO0lBRXhCLEtBQUs7UUFDSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaWduYWwsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEJhc2VNb2RlbCxcbiAgUXVlcnlQYXJhbXMsXG4gIFNvcnREaXJlY3Rpb24sXG59IGZyb20gJ3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBDYXJkRGF0YSwgQ29sdW1uRGVmaW5pdGlvbiwgRmlsdGVyQ29uZGl0aW9uLCBTb3J0Q29uZGl0aW9uIH0gZnJvbSAndmVyYmVuLW5nLXVpJztcblxuLyoqXG4gKiBBYnN0cmFjdCBzdGF0ZSBtYW5hZ2VtZW50IGZvciBiYXNlIGRhdGEgcGFnZXMuXG4gKiBUcmFja3MgaXRlbXMsIGxvYWRpbmcgc3RhdGUsIHF1ZXJ5IHBhcmFtcywgZmlsdGVycywgc29ydHMsIHNlYXJjaCwgYW5kXG4gKiB2aXNpYmxlIGNvbHVtbnMuIENhcmQgZGF0YSBpcyBoZWxkIGluIHNpZ25hbHMgZm9yIGNoZWFwIGNoYW5nZSBkZXRlY3Rpb24uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRGF0YVBhZ2VTdGF0ZTxUIGV4dGVuZHMgQmFzZU1vZGVsPiB7XG4gIHByb3RlY3RlZCB1cGRhdGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgaXRlbXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KFtdKTtcbiAgcHJvdGVjdGVkIHRvdGFsQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG4gIHByb3RlY3RlZCBxdWVyeVBhcmFtcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5UGFyYW1zPFQ+Pih7XG4gICAgc2tpcDogMCxcbiAgICBsaW1pdDogMjAsXG4gICAgc29ydE9yZGVyOiBTb3J0RGlyZWN0aW9uLkFzYyxcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHNlYXJjaFRlcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcblxuICBwcm90ZWN0ZWQgZmlsdGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZpbHRlckNvbmRpdGlvbltdPihbXSk7XG4gIHByb3RlY3RlZCBzb3J0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNvcnRDb25kaXRpb25bXT4oW10pO1xuXG4gIHByb3RlY3RlZCB2aXNpYmxlQ29sdW1ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvbHVtbkRlZmluaXRpb248VD5bXT4oW10pO1xuXG4gIHByb3RlY3RlZCBjYXJkRGF0YSA9IHNpZ25hbDxDYXJkRGF0YVtdPihbXSk7XG4gIHByb3RlY3RlZCBjdXJyZW50Q2FyZERhdGEgPSBzaWduYWw8Q2FyZERhdGEgfCBudWxsPihudWxsKTtcblxuICBwcm90ZWN0ZWQgY2FyZERhdGFNYXBwZXI/OiAoaXRlbTogVCkgPT4gQ2FyZERhdGE7XG5cbiAgLyoqXG4gICAqIFN0YWJsZSBpZGVudGl0eSBmb3IgYSByZWNvcmQuIFRoZSBhdXRoIG1vZGVscyBrZXkgb24gdXBwZXJjYXNlIGBJZGAvYENvZGVgXG4gICAqIGFuZCBvbmx5IHNvbWV0aW1lcyBjYXJyeSBhIGxvd2VyY2FzZSBgaWRgLCBzbyBtYXRjaCBhY3Jvc3MgYWxsIHRocmVlIHJhdGhlclxuICAgKiB0aGFuIGFzc3VtaW5nIG9uZSBpcyBwb3B1bGF0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0SXRlbUtleShpdGVtOiBUKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbS5JZCB8fCBpdGVtLmlkIHx8IGl0ZW0uQ29kZTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDYXJkRGF0YUZyb21JdGVtcyhpdGVtczogVFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FyZERhdGFNYXBwZXIpIHtcbiAgICAgIHRoaXMuY2FyZERhdGEuc2V0KGl0ZW1zLm1hcCgoaXRlbSkgPT4gdGhpcy5jYXJkRGF0YU1hcHBlciEoaXRlbSkpKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBMb2FkaW5nIFN0YXRlID09PT09XG5cbiAgaXNVcGRhdGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgc2V0VXBkYXRpbmcoaXNVcGRhdGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudXBkYXRpbmckLm5leHQoaXNVcGRhdGluZyk7XG4gIH1cblxuICAvLyA9PT09PSBJdGVtcyA9PT09PVxuXG4gIGdldEl0ZW1zJCgpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldEl0ZW1zVmFsdWUoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHNldEl0ZW1zKGl0ZW1zOiBUW10pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zJC5uZXh0KGl0ZW1zKTtcbiAgICB0aGlzLnVwZGF0ZUNhcmREYXRhRnJvbUl0ZW1zKGl0ZW1zKTtcbiAgfVxuXG4gIGFwcGVuZEl0ZW1zKG5ld0l0ZW1zOiBUW10pOiB2b2lkIHtcbiAgICBjb25zdCBhbGxJdGVtcyA9IFsuLi50aGlzLml0ZW1zJC5nZXRWYWx1ZSgpLCAuLi5uZXdJdGVtc107XG4gICAgdGhpcy5pdGVtcyQubmV4dChhbGxJdGVtcyk7XG4gICAgdGhpcy51cGRhdGVDYXJkRGF0YUZyb21JdGVtcyhhbGxJdGVtcyk7XG4gIH1cblxuICBhZGRJdGVtKGl0ZW06IFQpOiB2b2lkIHtcbiAgICBjb25zdCBhbGxJdGVtcyA9IFtpdGVtLCAuLi50aGlzLml0ZW1zJC5nZXRWYWx1ZSgpXTtcbiAgICB0aGlzLml0ZW1zJC5uZXh0KGFsbEl0ZW1zKTtcbiAgICB0aGlzLnVwZGF0ZUNhcmREYXRhRnJvbUl0ZW1zKGFsbEl0ZW1zKTtcbiAgfVxuXG4gIHVwZGF0ZUl0ZW0odXBkYXRlZEl0ZW06IFQpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXMkLmdldFZhbHVlKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRJdGVtS2V5KHVwZGF0ZWRJdGVtKTtcbiAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gdGhpcy5nZXRJdGVtS2V5KGl0ZW0pID09PSBrZXkpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGl0ZW1zW2luZGV4XSA9IHVwZGF0ZWRJdGVtO1xuICAgICAgY29uc3QgYWxsSXRlbXMgPSBbLi4uaXRlbXNdO1xuICAgICAgdGhpcy5pdGVtcyQubmV4dChhbGxJdGVtcyk7XG4gICAgICB0aGlzLnVwZGF0ZUNhcmREYXRhRnJvbUl0ZW1zKGFsbEl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICAvKiogVXBkYXRlIHRoZSBpdGVtIHdoZW4gaXRzIGtleSBhbHJlYWR5IGV4aXN0cywgb3RoZXJ3aXNlIHByZXBlbmQgaXQuICovXG4gIHVwc2VydEl0ZW0oaXRlbTogVCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0SXRlbUtleShpdGVtKTtcbiAgICBjb25zdCBleGlzdHMgPSB0aGlzLml0ZW1zJFxuICAgICAgLmdldFZhbHVlKClcbiAgICAgIC5zb21lKChleGlzdGluZykgPT4gdGhpcy5nZXRJdGVtS2V5KGV4aXN0aW5nKSA9PT0ga2V5KTtcbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICB0aGlzLnVwZGF0ZUl0ZW0oaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkSXRlbShpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVJdGVtKGl0ZW1LZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSB0aGlzLml0ZW1zJFxuICAgICAgLmdldFZhbHVlKClcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuZ2V0SXRlbUtleShpdGVtKSAhPT0gaXRlbUtleSk7XG4gICAgdGhpcy5pdGVtcyQubmV4dChmaWx0ZXJlZEl0ZW1zKTtcbiAgICB0aGlzLnVwZGF0ZUNhcmREYXRhRnJvbUl0ZW1zKGZpbHRlcmVkSXRlbXMpO1xuICB9XG5cbiAgY2xlYXJJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zJC5uZXh0KFtdKTtcbiAgICB0aGlzLnVwZGF0ZUNhcmREYXRhRnJvbUl0ZW1zKFtdKTtcbiAgfVxuXG4gIC8vID09PT09IFRvdGFsIENvdW50ID09PT09XG5cbiAgZ2V0VG90YWxDb3VudCQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy50b3RhbENvdW50JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNldFRvdGFsQ291bnQoY291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG90YWxDb3VudCQubmV4dChjb3VudCk7XG4gIH1cblxuICAvLyA9PT09PSBRdWVyeSBQYXJhbWV0ZXJzID09PT09XG5cbiAgZ2V0UXVlcnlQYXJhbXMkKCk6IE9ic2VydmFibGU8UXVlcnlQYXJhbXM8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVBhcmFtcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRRdWVyeVBhcmFtc1ZhbHVlKCk6IFF1ZXJ5UGFyYW1zPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVBhcmFtcyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHVwZGF0ZVF1ZXJ5UGFyYW1zKHBhcmFtczogUGFydGlhbDxRdWVyeVBhcmFtczxUPj4pOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zJC5uZXh0KHsgLi4udGhpcy5xdWVyeVBhcmFtcyQuZ2V0VmFsdWUoKSwgLi4ucGFyYW1zIH0pO1xuICB9XG5cbiAgcmVzZXRQYWdpbmF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMucXVlcnlQYXJhbXMkLm5leHQoeyAuLi50aGlzLnF1ZXJ5UGFyYW1zJC5nZXRWYWx1ZSgpLCBza2lwOiAwIH0pO1xuICB9XG5cbiAgaW5jcmVtZW50UGFnaW5hdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50UGFyYW1zID0gdGhpcy5xdWVyeVBhcmFtcyQuZ2V0VmFsdWUoKTtcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zJC5uZXh0KHtcbiAgICAgIC4uLmN1cnJlbnRQYXJhbXMsXG4gICAgICBza2lwOiBjdXJyZW50UGFyYW1zLnNraXAgKyBjdXJyZW50UGFyYW1zLmxpbWl0LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT0gU2VhcmNoID09PT09XG5cbiAgZ2V0U2VhcmNoVGVybSQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hUZXJtJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFNlYXJjaFRlcm1WYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFRlcm0kLmdldFZhbHVlKCk7XG4gIH1cblxuICBzZXRTZWFyY2hUZXJtKHRlcm06IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybSQubmV4dCh0ZXJtKTtcbiAgfVxuXG4gIC8vID09PT09IEZpbHRlcnMgPT09PT1cblxuICBnZXRGaWx0ZXJzJCgpOiBPYnNlcnZhYmxlPEZpbHRlckNvbmRpdGlvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRGaWx0ZXJzVmFsdWUoKTogRmlsdGVyQ29uZGl0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnMkLmdldFZhbHVlKCk7XG4gIH1cblxuICBzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlckNvbmRpdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJzJC5uZXh0KGZpbHRlcnMpO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVycyQubmV4dChbXSk7XG4gIH1cblxuICAvLyA9PT09PSBTb3J0cyA9PT09PVxuXG4gIGdldFNvcnRzJCgpOiBPYnNlcnZhYmxlPFNvcnRDb25kaXRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnNvcnRzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFNvcnRzVmFsdWUoKTogU29ydENvbmRpdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0cyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHNldFNvcnRzKHNvcnRzOiBTb3J0Q29uZGl0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLnNvcnRzJC5uZXh0KHNvcnRzKTtcbiAgfVxuXG4gIGNsZWFyU29ydHMoKTogdm9pZCB7XG4gICAgdGhpcy5zb3J0cyQubmV4dChbXSk7XG4gIH1cblxuICAvLyA9PT09PSBWaXNpYmxlIENvbHVtbnMgPT09PT1cblxuICBnZXRWaXNpYmxlQ29sdW1ucyQoKTogT2JzZXJ2YWJsZTxDb2x1bW5EZWZpbml0aW9uPFQ+W10+IHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1ucyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRWaXNpYmxlQ29sdW1uc1ZhbHVlKCk6IENvbHVtbkRlZmluaXRpb248VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbHVtbnMkLmdldFZhbHVlKCk7XG4gIH1cblxuICBzZXRWaXNpYmxlQ29sdW1ucyhjb2x1bW5zOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10pOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zJC5uZXh0KGNvbHVtbnMpO1xuICB9XG5cbiAgLy8gPT09PT0gQ2FyZCBEYXRhID09PT09XG5cbiAgc2V0Q2FyZERhdGFNYXBwZXIobWFwcGVyOiAoaXRlbTogVCkgPT4gQ2FyZERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmNhcmREYXRhTWFwcGVyID0gbWFwcGVyO1xuICB9XG5cbiAgZ2V0Q2FyZERhdGEoKTogV3JpdGFibGVTaWduYWw8Q2FyZERhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLmNhcmREYXRhO1xuICB9XG5cbiAgc2V0Q2FyZERhdGEoZGF0YTogQ2FyZERhdGFbXSk6IHZvaWQge1xuICAgIHRoaXMuY2FyZERhdGEuc2V0KGRhdGEpO1xuICB9XG5cbiAgZ2V0Q3VycmVudENhcmREYXRhKCk6IFdyaXRhYmxlU2lnbmFsPENhcmREYXRhIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRDYXJkRGF0YTtcbiAgfVxuXG4gIHNldEN1cnJlbnRDYXJkRGF0YShkYXRhOiBDYXJkRGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRDYXJkRGF0YS5zZXQoZGF0YSk7XG4gIH1cblxuICAvLyA9PT09PSBSZXNldCBBbGwgPT09PT1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFySXRlbXMoKTtcbiAgICB0aGlzLnNldFNlYXJjaFRlcm0oJycpO1xuICAgIHRoaXMuY2xlYXJGaWx0ZXJzKCk7XG4gICAgdGhpcy5jbGVhclNvcnRzKCk7XG4gICAgdGhpcy5zZXRWaXNpYmxlQ29sdW1ucyhbXSk7XG4gICAgdGhpcy5jYXJkRGF0YS5zZXQoW10pO1xuICAgIHRoaXMuY3VycmVudENhcmREYXRhLnNldChudWxsKTtcbiAgICB0aGlzLnJlc2V0UGFnaW5hdGlvbigpO1xuICAgIHRoaXMuc2V0VG90YWxDb3VudCgwKTtcbiAgfVxufVxuIl19
|