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.
Files changed (159) hide show
  1. package/README.md +23 -1
  2. package/esm2022/src/lib/base/core/base-data-page.facade.mjs +215 -0
  3. package/esm2022/src/lib/base/core/base-data-page.service.mjs +103 -0
  4. package/esm2022/src/lib/base/core/base-data-page.state.mjs +203 -0
  5. package/esm2022/src/lib/base/handlers/filter-handler.service.mjs +53 -0
  6. package/esm2022/src/lib/base/handlers/search-handler.service.mjs +31 -0
  7. package/esm2022/src/lib/base/handlers/sort-handler.service.mjs +49 -0
  8. package/esm2022/src/lib/base/models/api-payload.mjs +4 -0
  9. package/esm2022/src/lib/base/models/page-config.interface.mjs +2 -0
  10. package/esm2022/src/lib/base/public-api.mjs +14 -6
  11. package/esm2022/src/lib/base/utils/column-helpers.mjs +45 -0
  12. package/esm2022/src/lib/components/button/button.component.mjs +3 -3
  13. package/esm2022/src/lib/components/forgot-password/forgot-password.component.mjs +2 -2
  14. package/esm2022/src/lib/components/mail/mail.component.mjs +3 -3
  15. package/esm2022/src/lib/components/mail-validation/mail-validation.component.mjs +5 -5
  16. package/esm2022/src/lib/components/o-auth/o-auth.component.mjs +3 -3
  17. package/esm2022/src/lib/components/otp-input/otp-input.component.mjs +2 -2
  18. package/esm2022/src/lib/components/reset-password/reset-password.component.mjs +2 -2
  19. package/esm2022/src/lib/components/role-control/base-table-style.mjs +6 -6
  20. package/esm2022/src/lib/components/role-control/role-control.component.mjs +3 -3
  21. package/esm2022/src/lib/components/sign-in/sign-in.component.mjs +4 -4
  22. package/esm2022/src/lib/components/sign-up/sign-up.component.mjs +6 -6
  23. package/esm2022/src/lib/components/sso/base-table-style.mjs +6 -6
  24. package/esm2022/src/lib/components/sso/sso-form/sso-form.component.mjs +3 -3
  25. package/esm2022/src/lib/components/sso/sso.component.mjs +3 -3
  26. package/esm2022/src/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.mjs +4 -4
  27. package/esm2022/src/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.mjs +5 -5
  28. package/esm2022/src/lib/components/user-management/public-api.mjs +2 -1
  29. package/esm2022/src/lib/components/user-management/user-management-card/user-management-card.component.mjs +23 -0
  30. package/esm2022/src/lib/components/user-management/user-management-form/user-management-form.component.mjs +53 -91
  31. package/esm2022/src/lib/components/user-management/user-management-table/user-management-table.component.mjs +68 -0
  32. package/esm2022/src/lib/components/user-management/user-management.component.mjs +98 -509
  33. package/esm2022/src/lib/components/user-management/user-management.module.mjs +11 -80
  34. package/esm2022/src/lib/components/user-management/user-status-badge/user-status-badge.component.mjs +8 -6
  35. package/esm2022/src/lib/components/user-management/user.config.mjs +94 -0
  36. package/esm2022/src/lib/components/user-management/user.facade.mjs +118 -0
  37. package/esm2022/src/lib/components/user-management/user.service.mjs +60 -0
  38. package/esm2022/src/lib/components/user-management/user.state.mjs +33 -0
  39. package/esm2022/src/lib/components/user-request/user-request.component.mjs +8 -8
  40. package/esm2022/src/lib/components/user-request-approval/public-api.mjs +2 -2
  41. package/esm2022/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.mjs +8 -6
  42. package/esm2022/src/lib/components/user-request-approval/user-access-request.config.mjs +79 -0
  43. package/esm2022/src/lib/components/user-request-approval/user-access-request.facade.mjs +123 -0
  44. package/esm2022/src/lib/components/user-request-approval/user-access-request.service.mjs +74 -0
  45. package/esm2022/src/lib/components/user-request-approval/user-access-request.state.mjs +26 -0
  46. package/esm2022/src/lib/components/user-request-approval/user-request-approval-card/user-request-approval-card.component.mjs +23 -0
  47. package/esm2022/src/lib/components/user-request-approval/user-request-approval-form/user-request-approval-form.component.mjs +124 -0
  48. package/esm2022/src/lib/components/user-request-approval/user-request-approval-table/user-request-approval-table.component.mjs +44 -0
  49. package/esm2022/src/lib/components/user-request-approval/user-request-approval.component.mjs +101 -273
  50. package/esm2022/src/lib/components/user-request-approval/user-request-approval.module.mjs +10 -74
  51. package/fesm2022/verben-authentication-ui-src-lib-base.mjs +596 -214
  52. package/fesm2022/verben-authentication-ui-src-lib-base.mjs.map +1 -1
  53. package/fesm2022/verben-authentication-ui-src-lib-components-button.mjs +2 -2
  54. package/fesm2022/verben-authentication-ui-src-lib-components-button.mjs.map +1 -1
  55. package/fesm2022/verben-authentication-ui-src-lib-components-forgot-password.mjs +2 -2
  56. package/fesm2022/verben-authentication-ui-src-lib-components-forgot-password.mjs.map +1 -1
  57. package/fesm2022/verben-authentication-ui-src-lib-components-mail-validation.mjs +4 -4
  58. package/fesm2022/verben-authentication-ui-src-lib-components-mail-validation.mjs.map +1 -1
  59. package/fesm2022/verben-authentication-ui-src-lib-components-mail.mjs +2 -2
  60. package/fesm2022/verben-authentication-ui-src-lib-components-mail.mjs.map +1 -1
  61. package/fesm2022/verben-authentication-ui-src-lib-components-o-auth.mjs +2 -2
  62. package/fesm2022/verben-authentication-ui-src-lib-components-o-auth.mjs.map +1 -1
  63. package/fesm2022/verben-authentication-ui-src-lib-components-otp-input.mjs +2 -2
  64. package/fesm2022/verben-authentication-ui-src-lib-components-otp-input.mjs.map +1 -1
  65. package/fesm2022/verben-authentication-ui-src-lib-components-reset-password.mjs +2 -2
  66. package/fesm2022/verben-authentication-ui-src-lib-components-reset-password.mjs.map +1 -1
  67. package/fesm2022/verben-authentication-ui-src-lib-components-role-control.mjs +7 -7
  68. package/fesm2022/verben-authentication-ui-src-lib-components-role-control.mjs.map +1 -1
  69. package/fesm2022/verben-authentication-ui-src-lib-components-sign-in.mjs +3 -3
  70. package/fesm2022/verben-authentication-ui-src-lib-components-sign-in.mjs.map +1 -1
  71. package/fesm2022/verben-authentication-ui-src-lib-components-sign-up.mjs +5 -5
  72. package/fesm2022/verben-authentication-ui-src-lib-components-sign-up.mjs.map +1 -1
  73. package/fesm2022/verben-authentication-ui-src-lib-components-sso.mjs +9 -9
  74. package/fesm2022/verben-authentication-ui-src-lib-components-sso.mjs.map +1 -1
  75. package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-otp.mjs +3 -3
  76. package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-otp.mjs.map +1 -1
  77. package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-setup.mjs +4 -4
  78. package/fesm2022/verben-authentication-ui-src-lib-components-two-factor-auth-setup.mjs.map +1 -1
  79. package/fesm2022/verben-authentication-ui-src-lib-components-user-management.mjs +468 -831
  80. package/fesm2022/verben-authentication-ui-src-lib-components-user-management.mjs.map +1 -1
  81. package/fesm2022/verben-authentication-ui-src-lib-components-user-request-approval.mjs +509 -952
  82. package/fesm2022/verben-authentication-ui-src-lib-components-user-request-approval.mjs.map +1 -1
  83. package/fesm2022/verben-authentication-ui-src-lib-components-user-request.mjs +7 -7
  84. package/fesm2022/verben-authentication-ui-src-lib-components-user-request.mjs.map +1 -1
  85. package/package.json +36 -42
  86. package/src/lib/base/README.md +99 -0
  87. package/src/lib/base/core/base-data-page.facade.d.ts +65 -0
  88. package/src/lib/base/core/base-data-page.service.d.ts +43 -0
  89. package/src/lib/base/core/base-data-page.state.d.ts +68 -0
  90. package/src/lib/base/handlers/filter-handler.service.d.ts +13 -0
  91. package/src/lib/base/handlers/search-handler.service.d.ts +20 -0
  92. package/src/lib/base/handlers/sort-handler.service.d.ts +13 -0
  93. package/src/lib/base/models/api-payload.d.ts +2 -0
  94. package/src/lib/base/models/page-config.interface.d.ts +21 -0
  95. package/src/lib/base/public-api.d.ts +9 -5
  96. package/src/lib/base/utils/column-helpers.d.ts +16 -0
  97. package/src/lib/components/user-management/public-api.d.ts +1 -0
  98. package/src/lib/components/user-management/user-management-card/user-management-card.component.d.ts +11 -0
  99. package/src/lib/components/user-management/user-management-form/user-management-form.component.d.ts +12 -14
  100. package/src/lib/components/user-management/user-management-table/user-management-table.component.d.ts +30 -0
  101. package/src/lib/components/user-management/user-management.component.d.ts +28 -124
  102. package/src/lib/components/user-management/user-management.module.d.ts +8 -8
  103. package/src/lib/components/user-management/user-status-badge/user-status-badge.component.d.ts +1 -1
  104. package/src/lib/components/user-management/user.config.d.ts +13 -0
  105. package/src/lib/components/user-management/user.facade.d.ts +42 -0
  106. package/src/lib/components/user-management/user.service.d.ts +26 -0
  107. package/src/lib/components/user-management/user.state.d.ts +19 -0
  108. package/src/lib/components/user-request-approval/public-api.d.ts +1 -1
  109. package/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.d.ts +1 -1
  110. package/src/lib/components/user-request-approval/user-access-request.config.d.ts +13 -0
  111. package/src/lib/components/user-request-approval/user-access-request.facade.d.ts +36 -0
  112. package/src/lib/components/user-request-approval/user-access-request.service.d.ts +30 -0
  113. package/src/lib/components/user-request-approval/user-access-request.state.d.ts +16 -0
  114. package/src/lib/components/user-request-approval/user-request-approval-card/user-request-approval-card.component.d.ts +11 -0
  115. package/src/lib/components/user-request-approval/user-request-approval-form/user-request-approval-form.component.d.ts +47 -0
  116. package/src/lib/components/user-request-approval/user-request-approval-table/user-request-approval-table.component.d.ts +20 -0
  117. package/src/lib/components/user-request-approval/user-request-approval.component.d.ts +29 -68
  118. package/src/lib/components/user-request-approval/user-request-approval.module.d.ts +7 -6
  119. package/esm2022/src/lib/base/base-data.component.mjs +0 -80
  120. package/esm2022/src/lib/base/base-data.facade.mjs +0 -130
  121. package/esm2022/src/lib/base/base-data.service.mjs +0 -21
  122. package/esm2022/src/lib/base/base-data.state.mjs +0 -74
  123. package/esm2022/src/lib/base/models.mjs +0 -2
  124. package/esm2022/src/lib/components/user-management/base-table-style.mjs +0 -53
  125. package/esm2022/src/lib/components/user-management/services/user-management.service.mjs +0 -110
  126. package/esm2022/src/lib/components/user-management/user-management.columns.mjs +0 -53
  127. package/esm2022/src/lib/components/user-request-approval/access-request.columns.mjs +0 -29
  128. package/esm2022/src/lib/components/user-request-approval/base-table-style.mjs +0 -53
  129. package/esm2022/src/lib/components/user-request-approval/facades/user-access-request.facade.mjs +0 -260
  130. package/esm2022/src/lib/components/user-request-approval/helper.mjs +0 -56
  131. package/esm2022/src/lib/components/user-request-approval/services/user-access-request.service.mjs +0 -92
  132. package/esm2022/src/lib/components/user-request-approval/states/user-access-request.state.mjs +0 -92
  133. package/esm2022/src/lib/components/user-request-approval/user-request-form/user-request-form.component.mjs +0 -105
  134. package/esm2022/src/lib/components/user-request-process/index.mjs +0 -2
  135. package/esm2022/src/lib/components/user-request-process/public-api.mjs +0 -3
  136. package/esm2022/src/lib/components/user-request-process/user-request-process.component.mjs +0 -11
  137. package/esm2022/src/lib/components/user-request-process/user-request-process.module.mjs +0 -18
  138. package/esm2022/src/lib/components/user-request-process/verben-authentication-ui-src-lib-components-user-request-process.mjs +0 -5
  139. package/fesm2022/verben-authentication-ui-src-lib-components-user-request-process.mjs +0 -34
  140. package/fesm2022/verben-authentication-ui-src-lib-components-user-request-process.mjs.map +0 -1
  141. package/src/lib/base/base-data.component.d.ts +0 -32
  142. package/src/lib/base/base-data.facade.d.ts +0 -27
  143. package/src/lib/base/base-data.service.d.ts +0 -14
  144. package/src/lib/base/base-data.state.d.ts +0 -28
  145. package/src/lib/base/models.d.ts +0 -11
  146. package/src/lib/components/user-management/base-table-style.d.ts +0 -1
  147. package/src/lib/components/user-management/services/user-management.service.d.ts +0 -44
  148. package/src/lib/components/user-management/user-management.columns.d.ts +0 -3
  149. package/src/lib/components/user-request-approval/access-request.columns.d.ts +0 -3
  150. package/src/lib/components/user-request-approval/base-table-style.d.ts +0 -1
  151. package/src/lib/components/user-request-approval/facades/user-access-request.facade.d.ts +0 -39
  152. package/src/lib/components/user-request-approval/helper.d.ts +0 -7
  153. package/src/lib/components/user-request-approval/services/user-access-request.service.d.ts +0 -64
  154. package/src/lib/components/user-request-approval/states/user-access-request.state.d.ts +0 -35
  155. package/src/lib/components/user-request-approval/user-request-form/user-request-form.component.d.ts +0 -34
  156. package/src/lib/components/user-request-process/index.d.ts +0 -1
  157. package/src/lib/components/user-request-process/public-api.d.ts +0 -2
  158. package/src/lib/components/user-request-process/user-request-process.component.d.ts +0 -5
  159. package/src/lib/components/user-request-process/user-request-process.module.d.ts +0 -7
@@ -0,0 +1,74 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { ErrorResponse, } from 'verben-authentication-ui/src/lib/models';
3
+ import { BaseDataPageService, } from 'verben-authentication-ui/src/lib/base';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "verben-authentication-ui/src/lib/services";
6
+ import * as i2 from "verben-authentication-ui/src/lib/base";
7
+ /**
8
+ * Service for access-request API operations.
9
+ *
10
+ * The auth API pluralises names and appends a `/{sortParam}/{sortOrder}` suffix
11
+ * to every read, so the base URL seams are overridden accordingly. It also
12
+ * carries an approve/reject workflow and a bespoke delete-by-email endpoint that
13
+ * have no analog in the generic CRUD base.
14
+ *
15
+ * Kept publicly exported under its original name for backward compatibility.
16
+ */
17
+ export class UserAccessRequestService extends BaseDataPageService {
18
+ defaultSort = 'CreatedAt/Asc';
19
+ constructor(server, filterHandler, sortHandler) {
20
+ super(server, filterHandler, sortHandler);
21
+ }
22
+ getEndpoint() {
23
+ return 'UserAccessRequest';
24
+ }
25
+ // ===== URL seams =====
26
+ listUrl(skip, limit) {
27
+ return `GetUserAccessRequests/${skip}/${limit}/${this.defaultSort}`;
28
+ }
29
+ searchTermUrl(term, skip, limit) {
30
+ return `GetUserAccessRequestWithParam/${term}/${skip}/${limit}/${this.defaultSort}`;
31
+ }
32
+ filterSearchUrl(skip, limit) {
33
+ return `SearchUserAccessRequest/${skip}/${limit}/${this.defaultSort}`;
34
+ }
35
+ saveUrl() {
36
+ return 'SaveUserAccessRequests';
37
+ }
38
+ // ===== Delete (bespoke: by email, also removes the associated signup) =====
39
+ async deleteItems(emails) {
40
+ for (const email of emails) {
41
+ const res = await this.server.get(`DeleteUserRequestWithUser/${email}`, this.baseUrl);
42
+ if (res instanceof ErrorResponse) {
43
+ return res;
44
+ }
45
+ }
46
+ return true;
47
+ }
48
+ // ===== Workflow =====
49
+ /** Approve (isApproval=true) or reject (false) the given requests. */
50
+ processRequests(requests, isApproval) {
51
+ return this.server.post(`UserAccessRequestAction/${isApproval}`, requests);
52
+ }
53
+ // ===== Lookups =====
54
+ async getRoles() {
55
+ const res = await this.server.get('GetRoles/0/0');
56
+ if (res instanceof ErrorResponse) {
57
+ return [];
58
+ }
59
+ return res.Result ?? [];
60
+ }
61
+ async getTags() {
62
+ const res = await this.server.get('GetTags/0/0');
63
+ if (res instanceof ErrorResponse) {
64
+ return [];
65
+ }
66
+ return res.Result ?? [];
67
+ }
68
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserAccessRequestService, deps: [{ token: i1.HttpWebRequestService }, { token: i2.FilterHandlerService }, { token: i2.SortHandlerService }], target: i0.ɵɵFactoryTarget.Injectable });
69
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserAccessRequestService });
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserAccessRequestService, decorators: [{
72
+ type: Injectable
73
+ }], ctorParameters: () => [{ type: i1.HttpWebRequestService }, { type: i2.FilterHandlerService }, { type: i2.SortHandlerService }] });
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1hY2Nlc3MtcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLXJlcXVlc3QtYXBwcm92YWwvdXNlci1hY2Nlc3MtcmVxdWVzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUNMLGFBQWEsR0FLZCxNQUFNLHlDQUF5QyxDQUFDO0FBRWpELE9BQU8sRUFDTCxtQkFBbUIsR0FHcEIsTUFBTSx1Q0FBdUMsQ0FBQzs7OztBQUUvQzs7Ozs7Ozs7O0dBU0c7QUFFSCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsbUJBQXNDO0lBQ2pFLFdBQVcsR0FBRyxlQUFlLENBQUM7SUFFL0MsWUFDRSxNQUE2QixFQUM3QixhQUFtQyxFQUNuQyxXQUErQjtRQUUvQixLQUFLLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sbUJBQW1CLENBQUM7SUFDN0IsQ0FBQztJQUVELHdCQUF3QjtJQUVMLE9BQU8sQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUNwRCxPQUFPLHlCQUF5QixJQUFJLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRWtCLGFBQWEsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEtBQWE7UUFDeEUsT0FBTyxpQ0FBaUMsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RGLENBQUM7SUFFa0IsZUFBZSxDQUFDLElBQVksRUFBRSxLQUFhO1FBQzVELE9BQU8sMkJBQTJCLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hFLENBQUM7SUFFa0IsT0FBTztRQUN4QixPQUFPLHdCQUF3QixDQUFDO0lBQ2xDLENBQUM7SUFFRCw2RUFBNkU7SUFFcEUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFnQjtRQUN6QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQy9CLDZCQUE2QixLQUFLLEVBQUUsRUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FDYixDQUFDO1lBQ0YsSUFBSSxHQUFHLFlBQVksYUFBYSxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx1QkFBdUI7SUFFdkIsc0VBQXNFO0lBQ3RFLGVBQWUsQ0FDYixRQUE2QixFQUM3QixVQUFtQjtRQUVuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNyQiwyQkFBMkIsVUFBVSxFQUFFLEVBQ3ZDLFFBQVEsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVELHNCQUFzQjtJQUV0QixLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQW9CLGNBQWMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksR0FBRyxZQUFZLGFBQWEsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBbUIsYUFBYSxDQUFDLENBQUM7UUFDbkUsSUFBSSxHQUFHLFlBQVksYUFBYSxFQUFFLENBQUM7WUFDakMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO3dHQTdFVSx3QkFBd0I7NEdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEVycm9yUmVzcG9uc2UsXG4gIFBhZ2VkUmVzdWx0LFxuICBSb2xlLFxuICBUYWcsXG4gIFVzZXJBY2Nlc3NSZXF1ZXN0LFxufSBmcm9tICd2ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgSHR0cFdlYlJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAndmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgQmFzZURhdGFQYWdlU2VydmljZSxcbiAgRmlsdGVySGFuZGxlclNlcnZpY2UsXG4gIFNvcnRIYW5kbGVyU2VydmljZSxcbn0gZnJvbSAndmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvYmFzZSc7XG5cbi8qKlxuICogU2VydmljZSBmb3IgYWNjZXNzLXJlcXVlc3QgQVBJIG9wZXJhdGlvbnMuXG4gKlxuICogVGhlIGF1dGggQVBJIHBsdXJhbGlzZXMgbmFtZXMgYW5kIGFwcGVuZHMgYSBgL3tzb3J0UGFyYW19L3tzb3J0T3JkZXJ9YCBzdWZmaXhcbiAqIHRvIGV2ZXJ5IHJlYWQsIHNvIHRoZSBiYXNlIFVSTCBzZWFtcyBhcmUgb3ZlcnJpZGRlbiBhY2NvcmRpbmdseS4gSXQgYWxzb1xuICogY2FycmllcyBhbiBhcHByb3ZlL3JlamVjdCB3b3JrZmxvdyBhbmQgYSBiZXNwb2tlIGRlbGV0ZS1ieS1lbWFpbCBlbmRwb2ludCB0aGF0XG4gKiBoYXZlIG5vIGFuYWxvZyBpbiB0aGUgZ2VuZXJpYyBDUlVEIGJhc2UuXG4gKlxuICogS2VwdCBwdWJsaWNseSBleHBvcnRlZCB1bmRlciBpdHMgb3JpZ2luYWwgbmFtZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVzZXJBY2Nlc3NSZXF1ZXN0U2VydmljZSBleHRlbmRzIEJhc2VEYXRhUGFnZVNlcnZpY2U8VXNlckFjY2Vzc1JlcXVlc3Q+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0U29ydCA9ICdDcmVhdGVkQXQvQXNjJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzZXJ2ZXI6IEh0dHBXZWJSZXF1ZXN0U2VydmljZSxcbiAgICBmaWx0ZXJIYW5kbGVyOiBGaWx0ZXJIYW5kbGVyU2VydmljZSxcbiAgICBzb3J0SGFuZGxlcjogU29ydEhhbmRsZXJTZXJ2aWNlLFxuICApIHtcbiAgICBzdXBlcihzZXJ2ZXIsIGZpbHRlckhhbmRsZXIsIHNvcnRIYW5kbGVyKTtcbiAgfVxuXG4gIGdldEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdVc2VyQWNjZXNzUmVxdWVzdCc7XG4gIH1cblxuICAvLyA9PT09PSBVUkwgc2VhbXMgPT09PT1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbGlzdFVybChza2lwOiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgR2V0VXNlckFjY2Vzc1JlcXVlc3RzLyR7c2tpcH0vJHtsaW1pdH0vJHt0aGlzLmRlZmF1bHRTb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2VhcmNoVGVybVVybCh0ZXJtOiBzdHJpbmcsIHNraXA6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBHZXRVc2VyQWNjZXNzUmVxdWVzdFdpdGhQYXJhbS8ke3Rlcm19LyR7c2tpcH0vJHtsaW1pdH0vJHt0aGlzLmRlZmF1bHRTb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlsdGVyU2VhcmNoVXJsKHNraXA6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTZWFyY2hVc2VyQWNjZXNzUmVxdWVzdC8ke3NraXB9LyR7bGltaXR9LyR7dGhpcy5kZWZhdWx0U29ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNhdmVVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1NhdmVVc2VyQWNjZXNzUmVxdWVzdHMnO1xuICB9XG5cbiAgLy8gPT09PT0gRGVsZXRlIChiZXNwb2tlOiBieSBlbWFpbCwgYWxzbyByZW1vdmVzIHRoZSBhc3NvY2lhdGVkIHNpZ251cCkgPT09PT1cblxuICBvdmVycmlkZSBhc3luYyBkZWxldGVJdGVtcyhlbWFpbHM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuIHwgRXJyb3JSZXNwb25zZT4ge1xuICAgIGZvciAoY29uc3QgZW1haWwgb2YgZW1haWxzKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgIGBEZWxldGVVc2VyUmVxdWVzdFdpdGhVc2VyLyR7ZW1haWx9YCxcbiAgICAgICAgdGhpcy5iYXNlVXJsLFxuICAgICAgKTtcbiAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT0gV29ya2Zsb3cgPT09PT1cblxuICAvKiogQXBwcm92ZSAoaXNBcHByb3ZhbD10cnVlKSBvciByZWplY3QgKGZhbHNlKSB0aGUgZ2l2ZW4gcmVxdWVzdHMuICovXG4gIHByb2Nlc3NSZXF1ZXN0cyhcbiAgICByZXF1ZXN0czogVXNlckFjY2Vzc1JlcXVlc3RbXSxcbiAgICBpc0FwcHJvdmFsOiBib29sZWFuLFxuICApOiBQcm9taXNlPFVzZXJBY2Nlc3NSZXF1ZXN0W10gfCBFcnJvclJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmVyLnBvc3Q8VXNlckFjY2Vzc1JlcXVlc3RbXT4oXG4gICAgICBgVXNlckFjY2Vzc1JlcXVlc3RBY3Rpb24vJHtpc0FwcHJvdmFsfWAsXG4gICAgICByZXF1ZXN0cyxcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT0gTG9va3VwcyA9PT09PVxuXG4gIGFzeW5jIGdldFJvbGVzKCk6IFByb21pc2U8Um9sZVtdPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0PFBhZ2VkUmVzdWx0PFJvbGU+PignR2V0Um9sZXMvMC8wJyk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5SZXN1bHQgPz8gW107XG4gIH1cblxuICBhc3luYyBnZXRUYWdzKCk6IFByb21pc2U8VGFnW10+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5nZXQ8UGFnZWRSZXN1bHQ8VGFnPj4oJ0dldFRhZ3MvMC8wJyk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5SZXN1bHQgPz8gW107XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { BaseDataPageState } from 'verben-authentication-ui/src/lib/base';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * State for the access-request approval page.
7
+ * Adds the roles list used by the form's role dropdown.
8
+ */
9
+ export class UserAccessRequestState extends BaseDataPageState {
10
+ roles$ = new BehaviorSubject([]);
11
+ getRoles$() {
12
+ return this.roles$.asObservable();
13
+ }
14
+ getRolesValue() {
15
+ return this.roles$.getValue();
16
+ }
17
+ setRoles(roles) {
18
+ this.roles$.next(roles);
19
+ }
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserAccessRequestState, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
21
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserAccessRequestState });
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserAccessRequestState, decorators: [{
24
+ type: Injectable
25
+ }] });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1hY2Nlc3MtcmVxdWVzdC5zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvdXNlci1yZXF1ZXN0LWFwcHJvdmFsL3VzZXItYWNjZXNzLXJlcXVlc3Quc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOztBQUUxRTs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsaUJBQW9DO0lBQ3RFLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUVqRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO3dHQWJVLHNCQUFzQjs0R0FBdEIsc0JBQXNCOzs0RkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSb2xlLCBVc2VyQWNjZXNzUmVxdWVzdCB9IGZyb20gJ3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBCYXNlRGF0YVBhZ2VTdGF0ZSB9IGZyb20gJ3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL2Jhc2UnO1xuXG4vKipcbiAqIFN0YXRlIGZvciB0aGUgYWNjZXNzLXJlcXVlc3QgYXBwcm92YWwgcGFnZS5cbiAqIEFkZHMgdGhlIHJvbGVzIGxpc3QgdXNlZCBieSB0aGUgZm9ybSdzIHJvbGUgZHJvcGRvd24uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBVc2VyQWNjZXNzUmVxdWVzdFN0YXRlIGV4dGVuZHMgQmFzZURhdGFQYWdlU3RhdGU8VXNlckFjY2Vzc1JlcXVlc3Q+IHtcbiAgcHJpdmF0ZSByb2xlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvbGVbXT4oW10pO1xuXG4gIGdldFJvbGVzJCgpOiBPYnNlcnZhYmxlPFJvbGVbXT4ge1xuICAgIHJldHVybiB0aGlzLnJvbGVzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFJvbGVzVmFsdWUoKTogUm9sZVtdIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlcyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHNldFJvbGVzKHJvbGVzOiBSb2xlW10pOiB2b2lkIHtcbiAgICB0aGlzLnJvbGVzJC5uZXh0KHJvbGVzKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,23 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input } from '@angular/core';
3
+ import { UserAccessRequestStatusBadgeComponent } from '../user-access-request-status-badge/user-access-request-status-badge.component';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ /**
7
+ * Presentational card for a single access request in the card view.
8
+ */
9
+ export class UserRequestApprovalCardComponent {
10
+ request;
11
+ selected = false;
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRequestApprovalCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserRequestApprovalCardComponent, isStandalone: true, selector: "lib-user-request-approval-card", inputs: { request: "request", selected: "selected" }, ngImport: i0, template: "<div class=\"flex cursor-pointer w-full bg-secondary rounded-xl\">\n <div class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"selected ? 'bg-primary' : 'bg-secondary-200'\"></div>\n <div class=\"flex-1 flex items-end gap-y-2 gap-x-4 p-4\">\n <div class=\"flex-1 space-y-2\">\n <span class=\"font-semibold text-[var(--vbn-color-text)] flex-1 truncate\">\n {{ request.FirstName }} {{ request.LastName }}\n </span>\n <p class=\"flex items-center my-1 gap-1\">\n <label class=\"text-[10px] font-light\">Medium:</label>\n <span class=\"text-sm truncate\">{{ request.SignupType }}</span>\n </p>\n </div>\n <div class=\"grid gap-y-1\">\n <lib-user-access-request-status-badge [status]=\"request.RequestStatus\"></lib-user-access-request-status-badge>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: UserAccessRequestStatusBadgeComponent, selector: "lib-user-access-request-status-badge", inputs: ["status"] }] });
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRequestApprovalCardComponent, decorators: [{
16
+ type: Component,
17
+ args: [{ selector: 'lib-user-request-approval-card', standalone: true, imports: [CommonModule, UserAccessRequestStatusBadgeComponent], template: "<div class=\"flex cursor-pointer w-full bg-secondary rounded-xl\">\n <div class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"selected ? 'bg-primary' : 'bg-secondary-200'\"></div>\n <div class=\"flex-1 flex items-end gap-y-2 gap-x-4 p-4\">\n <div class=\"flex-1 space-y-2\">\n <span class=\"font-semibold text-[var(--vbn-color-text)] flex-1 truncate\">\n {{ request.FirstName }} {{ request.LastName }}\n </span>\n <p class=\"flex items-center my-1 gap-1\">\n <label class=\"text-[10px] font-light\">Medium:</label>\n <span class=\"text-sm truncate\">{{ request.SignupType }}</span>\n </p>\n </div>\n <div class=\"grid gap-y-1\">\n <lib-user-access-request-status-badge [status]=\"request.RequestStatus\"></lib-user-access-request-status-badge>\n </div>\n </div>\n</div>\n", styles: [":host{display:block}\n"] }]
18
+ }], propDecorators: { request: [{
19
+ type: Input
20
+ }], selected: [{
21
+ type: Input
22
+ }] } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1yZXF1ZXN0LWFwcHJvdmFsLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLXJlcXVlc3QtYXBwcm92YWwvdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWNhcmQvdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLXJlcXVlc3QtYXBwcm92YWwvdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWNhcmQvdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLGdGQUFnRixDQUFDOzs7QUFFdkk7O0dBRUc7QUFRSCxNQUFNLE9BQU8sZ0NBQWdDO0lBQ2xDLE9BQU8sQ0FBcUI7SUFDNUIsUUFBUSxHQUFHLEtBQUssQ0FBQzt3R0FGZixnQ0FBZ0M7NEZBQWhDLGdDQUFnQyxnSkNmN0MsdzFCQWtCQSwrRURQWSxZQUFZLDZIQUFFLHFDQUFxQzs7NEZBSWxELGdDQUFnQztrQkFQNUMsU0FBUzsrQkFDRSxnQ0FBZ0MsY0FDOUIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHFDQUFxQyxDQUFDOzhCQUtyRCxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVc2VyQWNjZXNzUmVxdWVzdCB9IGZyb20gJ3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL21vZGVscyc7XG5pbXBvcnQgeyBVc2VyQWNjZXNzUmVxdWVzdFN0YXR1c0JhZGdlQ29tcG9uZW50IH0gZnJvbSAnLi4vdXNlci1hY2Nlc3MtcmVxdWVzdC1zdGF0dXMtYmFkZ2UvdXNlci1hY2Nlc3MtcmVxdWVzdC1zdGF0dXMtYmFkZ2UuY29tcG9uZW50JztcblxuLyoqXG4gKiBQcmVzZW50YXRpb25hbCBjYXJkIGZvciBhIHNpbmdsZSBhY2Nlc3MgcmVxdWVzdCBpbiB0aGUgY2FyZCB2aWV3LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWNhcmQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBVc2VyQWNjZXNzUmVxdWVzdFN0YXR1c0JhZGdlQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItcmVxdWVzdC1hcHByb3ZhbC1jYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWNhcmQuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyUmVxdWVzdEFwcHJvdmFsQ2FyZENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHJlcXVlc3QhOiBVc2VyQWNjZXNzUmVxdWVzdDtcbiAgQElucHV0KCkgc2VsZWN0ZWQgPSBmYWxzZTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGN1cnNvci1wb2ludGVyIHctZnVsbCBiZy1zZWNvbmRhcnkgcm91bmRlZC14bFwiPlxuICA8ZGl2IGNsYXNzPVwidy0zIHJvdW5kZWQteGwgcm91bmRlZC10ci1ub25lIHJvdW5kZWQtYnItbm9uZVwiXG4gICAgW25nQ2xhc3NdPVwic2VsZWN0ZWQgPyAnYmctcHJpbWFyeScgOiAnYmctc2Vjb25kYXJ5LTIwMCdcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4IGl0ZW1zLWVuZCBnYXAteS0yIGdhcC14LTQgcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtMSBzcGFjZS15LTJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LVt2YXIoLS12Ym4tY29sb3ItdGV4dCldIGZsZXgtMSB0cnVuY2F0ZVwiPlxuICAgICAgICB7eyByZXF1ZXN0LkZpcnN0TmFtZSB9fSB7eyByZXF1ZXN0Lkxhc3ROYW1lIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8cCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG15LTEgZ2FwLTFcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1bMTBweF0gZm9udC1saWdodFwiPk1lZGl1bTo8L2xhYmVsPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gdHJ1bmNhdGVcIj57eyByZXF1ZXN0LlNpZ251cFR5cGUgfX08L3NwYW4+XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImdyaWQgZ2FwLXktMVwiPlxuICAgICAgPGxpYi11c2VyLWFjY2Vzcy1yZXF1ZXN0LXN0YXR1cy1iYWRnZSBbc3RhdHVzXT1cInJlcXVlc3QuUmVxdWVzdFN0YXR1c1wiPjwvbGliLXVzZXItYWNjZXNzLXJlcXVlc3Qtc3RhdHVzLWJhZGdlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,124 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, effect, input, Output } from '@angular/core';
3
+ import { FormControl, ReactiveFormsModule, Validators, } from '@angular/forms';
4
+ import { UserAccessRequestStatus, } from 'verben-authentication-ui/src/lib/models';
5
+ import { DropDownModule, VerbenaButtonModule, VerbenaInputModule, VerbenaTextareaModule, VerbenDialogueModule, } from 'verben-ng-ui';
6
+ import { USER_ACCESS_REQUEST_CONFIG } from '../user-access-request.config';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "verben-ng-ui";
11
+ /**
12
+ * Form for approving/rejecting a single access request.
13
+ * Identity fields are read-only; the role must be chosen before approval.
14
+ */
15
+ export class UserRequestApprovalFormComponent {
16
+ fb;
17
+ request = input();
18
+ roles = input([]);
19
+ showDelete = input(false);
20
+ approve = new EventEmitter();
21
+ reject = new EventEmitter();
22
+ deleteRequest = new EventEmitter();
23
+ switchToTable = new EventEmitter();
24
+ form;
25
+ showDeleteDialogue = false;
26
+ showRejectDialogue = false;
27
+ /**
28
+ * Rejection reason. Deliberately outside `form` — that group's validity gates
29
+ * Approve, and a required comment there would gate Approve too.
30
+ */
31
+ rejectComment = new FormControl('', [Validators.required]);
32
+ constructor(fb) {
33
+ this.fb = fb;
34
+ this.form = this.fb.group(USER_ACCESS_REQUEST_CONFIG.formGroupConfig.controls);
35
+ effect(() => {
36
+ const request = this.request();
37
+ if (request && this.form) {
38
+ this.form.patchValue({
39
+ MailAddress: request.MailAddress || '',
40
+ FirstName: request.FirstName || '',
41
+ LastName: request.LastName || '',
42
+ OtherName: request.OtherName || '',
43
+ PhoneNumber: request.PhoneNumber || '',
44
+ RoleID: request.RoleID || '',
45
+ });
46
+ }
47
+ });
48
+ }
49
+ isPending() {
50
+ return this.request()?.RequestStatus === UserAccessRequestStatus.Pending;
51
+ }
52
+ canProcess() {
53
+ return this.isPending() && this.form.valid;
54
+ }
55
+ canReject() {
56
+ return this.isPending();
57
+ }
58
+ canDelete() {
59
+ return this.showDelete() && this.isPending();
60
+ }
61
+ onApprove() {
62
+ const request = this.request();
63
+ if (request && this.canProcess()) {
64
+ this.approve.emit({ request, roleId: this.form.get('RoleID')?.value });
65
+ }
66
+ }
67
+ onDelete() {
68
+ const request = this.request();
69
+ if (request) {
70
+ this.deleteRequest.emit(request);
71
+ }
72
+ this.closeDeleteDialogue();
73
+ }
74
+ toggleDeleteDialogue() {
75
+ this.showDeleteDialogue = !this.showDeleteDialogue;
76
+ }
77
+ closeDeleteDialogue() {
78
+ this.showDeleteDialogue = false;
79
+ }
80
+ // ===== Reject (requires a reason) =====
81
+ openRejectDialogue() {
82
+ if (!this.canReject())
83
+ return;
84
+ this.rejectComment.setValue('');
85
+ this.rejectComment.markAsUntouched();
86
+ this.showRejectDialogue = true;
87
+ }
88
+ closeRejectDialogue() {
89
+ this.showRejectDialogue = false;
90
+ }
91
+ canConfirmReject() {
92
+ return !!this.rejectComment.value?.trim();
93
+ }
94
+ confirmReject() {
95
+ const request = this.request();
96
+ if (!request || !this.canReject() || !this.canConfirmReject())
97
+ return;
98
+ this.reject.emit({ request, comment: this.rejectComment.value.trim() });
99
+ this.closeRejectDialogue();
100
+ }
101
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRequestApprovalFormComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
102
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: UserRequestApprovalFormComponent, isStandalone: true, selector: "lib-user-request-approval-form", inputs: { request: { classPropertyName: "request", publicName: "request", isSignal: true, isRequired: false, transformFunction: null }, roles: { classPropertyName: "roles", publicName: "roles", isSignal: true, isRequired: false, transformFunction: null }, showDelete: { classPropertyName: "showDelete", publicName: "showDelete", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { approve: "approve", reject: "reject", deleteRequest: "deleteRequest", switchToTable: "switchToTable" }, ngImport: i0, template: "<form [formGroup]=\"form\" class=\"flex flex-col px-3 pb-3 rounded-xl h-full w-full relative space-y-4\">\n <verbena-input name=\"MailAddress\" label=\"Mail Address:\" formControlName=\"MailAddress\" [readOnly]=\"true\" />\n <verbena-input label=\"First Name:\" name=\"FirstName\" type=\"text\" formControlName=\"FirstName\" [readOnly]=\"true\" />\n <verbena-input label=\"Last Name:\" name=\"LastName\" type=\"text\" formControlName=\"LastName\" [readOnly]=\"true\" />\n <verbena-input label=\"Other Name:\" name=\"OtherName\" type=\"text\" formControlName=\"OtherName\" [readOnly]=\"true\" />\n\n <div class=\"space-y-1\">\n <label for=\"role\">Role</label>\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"true\" [showClear]=\"true\"\n placeholder=\"\" [options]=\"roles()\" id=\"role\" optionLabel=\"Name\" optionValue=\"Code\" formControlName=\"RoleID\"\n class=\"form-control\">\n </verben-drop-down>\n </div>\n\n <!-- buttons -->\n <div class=\"flex justify-between my-2 overflow-auto\">\n <div class=\"flex gap-2\">\n <verbena-button (click)=\"switchToTable.emit()\" text=\"Switch To Table\" styleType=\"ylw-outline\"></verbena-button>\n\n <verbena-button *ngIf=\"showDelete()\" width=\"114px\" height=\"39px\" (click)=\"toggleDeleteDialogue()\" text=\"Delete\"\n styleType=\"danger\" borderRadius=\"10px\" [disable]=\"!canDelete()\"></verbena-button>\n </div>\n\n <div class=\"flex gap-2\">\n <verbena-button width=\"114px\" height=\"39px\" text=\"Reject\" styleType=\"danger\" borderRadius=\"10px\"\n (click)=\"openRejectDialogue()\" [disable]=\"!canReject()\"></verbena-button>\n\n <verbena-button (click)=\"onApprove()\" text=\"Approve\" bgColor=\"var(--vbn-color-success)\" textColor=\"white\"\n border=\"1px solid var(--vbn-color-success)\" borderRadius=\"10px\" pd=\"10px 20px\" width=\"114px\" height=\"39px\"\n [disable]=\"!canProcess()\"></verbena-button>\n </div>\n </div>\n</form>\n\n<verben-dialogue [showCloseIcon]=\"false\" [dismissOutsideClick]=\"false\" [closeOnEscape]=\"true\" [size]=\"'medium'\"\n [mode]=\"'dialogue'\" [customClass]=\"'show-revert-dialogue'\" [disableFooter]=\"true\" [isVisible]=\"showDeleteDialogue\"\n [bodyTemplate]=\"deleteBodyTemplate\" (closeModal)=\"closeDeleteDialogue()\">\n <ng-template #deleteBodyTemplate>\n <div class=\"dialog-body flex flex-col gap-4\">\n <div class=\"header font-bold text-2xl\">Delete User Request</div>\n <div class=\"form-container-dialogue flex flex-col gap-2\">\n Are you sure you want to proceed?\n </div>\n <div class=\"dialog-button-container flex gap-2\">\n <div class=\"flex-1\">\n <verbena-button width=\"100%\" [fontWeight]=\"'bold'\" [bgColor]=\"'var(--vbn-color-surface)'\"\n [borderRadius]=\"'4px'\" [textColor]=\"'var(--vbn-color-text)'\" [border]=\"'1px solid var(--vbn-color-text)'\"\n [text]=\"'Close'\" (click)=\"closeDeleteDialogue()\">\n </verbena-button>\n </div>\n <div class=\"flex-1\">\n <verbena-button width=\"100%\" class=\"verben-primary-button\" [text]=\"'Proceed'\" (click)=\"onDelete()\">\n </verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n\n<verben-dialogue [showCloseIcon]=\"false\" [dismissOutsideClick]=\"false\" [closeOnEscape]=\"true\" [size]=\"'medium'\"\n [mode]=\"'dialogue'\" [customClass]=\"'show-revert-dialogue'\" [disableFooter]=\"true\" [isVisible]=\"showRejectDialogue\"\n [bodyTemplate]=\"rejectBodyTemplate\" (closeModal)=\"closeRejectDialogue()\">\n <ng-template #rejectBodyTemplate>\n <div class=\"dialog-body flex flex-col gap-4\">\n <div class=\"header font-bold text-2xl\">Reject User Request</div>\n <div class=\"form-container-dialogue flex flex-col gap-2\">\n Please provide a reason for rejecting this request.\n <verbena-textarea label=\"Reason\" [required]=\"true\" [rows]=\"4\" width=\"100%\" [formControl]=\"rejectComment\"\n errorMessageColor=\"var(--vbn-color-danger)\">\n </verbena-textarea>\n </div>\n <div class=\"dialog-button-container flex gap-2\">\n <div class=\"flex-1\">\n <verbena-button width=\"100%\" [fontWeight]=\"'bold'\" [bgColor]=\"'var(--vbn-color-surface)'\"\n [borderRadius]=\"'4px'\" [textColor]=\"'var(--vbn-color-text)'\" [border]=\"'1px solid var(--vbn-color-text)'\"\n [text]=\"'Close'\" (click)=\"closeRejectDialogue()\">\n </verbena-button>\n </div>\n <div class=\"flex-1\">\n <verbena-button width=\"100%\" class=\"verben-primary-button\" [text]=\"'Proceed'\" (click)=\"confirmReject()\"\n [disable]=\"!canConfirmReject()\">\n </verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: VerbenaInputModule }, { kind: "component", type: i3.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "ngmodule", type: VerbenaButtonModule }, { kind: "component", type: i3.VerbenaButtonComponent, selector: "verbena-button", inputs: ["type", "text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "ngmodule", type: VerbenaTextareaModule }, { kind: "component", type: i3.VerbenaTextareaComponent, selector: "verbena-textarea", inputs: ["disabled", "label", "required", "rows", "cols", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "value", "errorMessageColor"], outputs: ["valueChange"] }, { kind: "ngmodule", type: DropDownModule }, { kind: "component", type: i3.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "ngmodule", type: VerbenDialogueModule }, { kind: "component", type: i3.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }] });
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRequestApprovalFormComponent, decorators: [{
105
+ type: Component,
106
+ args: [{ selector: 'lib-user-request-approval-form', standalone: true, imports: [
107
+ CommonModule,
108
+ ReactiveFormsModule,
109
+ VerbenaInputModule,
110
+ VerbenaButtonModule,
111
+ VerbenaTextareaModule,
112
+ DropDownModule,
113
+ VerbenDialogueModule,
114
+ ], template: "<form [formGroup]=\"form\" class=\"flex flex-col px-3 pb-3 rounded-xl h-full w-full relative space-y-4\">\n <verbena-input name=\"MailAddress\" label=\"Mail Address:\" formControlName=\"MailAddress\" [readOnly]=\"true\" />\n <verbena-input label=\"First Name:\" name=\"FirstName\" type=\"text\" formControlName=\"FirstName\" [readOnly]=\"true\" />\n <verbena-input label=\"Last Name:\" name=\"LastName\" type=\"text\" formControlName=\"LastName\" [readOnly]=\"true\" />\n <verbena-input label=\"Other Name:\" name=\"OtherName\" type=\"text\" formControlName=\"OtherName\" [readOnly]=\"true\" />\n\n <div class=\"space-y-1\">\n <label for=\"role\">Role</label>\n <verben-drop-down styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" [filter]=\"true\" [showClear]=\"true\"\n placeholder=\"\" [options]=\"roles()\" id=\"role\" optionLabel=\"Name\" optionValue=\"Code\" formControlName=\"RoleID\"\n class=\"form-control\">\n </verben-drop-down>\n </div>\n\n <!-- buttons -->\n <div class=\"flex justify-between my-2 overflow-auto\">\n <div class=\"flex gap-2\">\n <verbena-button (click)=\"switchToTable.emit()\" text=\"Switch To Table\" styleType=\"ylw-outline\"></verbena-button>\n\n <verbena-button *ngIf=\"showDelete()\" width=\"114px\" height=\"39px\" (click)=\"toggleDeleteDialogue()\" text=\"Delete\"\n styleType=\"danger\" borderRadius=\"10px\" [disable]=\"!canDelete()\"></verbena-button>\n </div>\n\n <div class=\"flex gap-2\">\n <verbena-button width=\"114px\" height=\"39px\" text=\"Reject\" styleType=\"danger\" borderRadius=\"10px\"\n (click)=\"openRejectDialogue()\" [disable]=\"!canReject()\"></verbena-button>\n\n <verbena-button (click)=\"onApprove()\" text=\"Approve\" bgColor=\"var(--vbn-color-success)\" textColor=\"white\"\n border=\"1px solid var(--vbn-color-success)\" borderRadius=\"10px\" pd=\"10px 20px\" width=\"114px\" height=\"39px\"\n [disable]=\"!canProcess()\"></verbena-button>\n </div>\n </div>\n</form>\n\n<verben-dialogue [showCloseIcon]=\"false\" [dismissOutsideClick]=\"false\" [closeOnEscape]=\"true\" [size]=\"'medium'\"\n [mode]=\"'dialogue'\" [customClass]=\"'show-revert-dialogue'\" [disableFooter]=\"true\" [isVisible]=\"showDeleteDialogue\"\n [bodyTemplate]=\"deleteBodyTemplate\" (closeModal)=\"closeDeleteDialogue()\">\n <ng-template #deleteBodyTemplate>\n <div class=\"dialog-body flex flex-col gap-4\">\n <div class=\"header font-bold text-2xl\">Delete User Request</div>\n <div class=\"form-container-dialogue flex flex-col gap-2\">\n Are you sure you want to proceed?\n </div>\n <div class=\"dialog-button-container flex gap-2\">\n <div class=\"flex-1\">\n <verbena-button width=\"100%\" [fontWeight]=\"'bold'\" [bgColor]=\"'var(--vbn-color-surface)'\"\n [borderRadius]=\"'4px'\" [textColor]=\"'var(--vbn-color-text)'\" [border]=\"'1px solid var(--vbn-color-text)'\"\n [text]=\"'Close'\" (click)=\"closeDeleteDialogue()\">\n </verbena-button>\n </div>\n <div class=\"flex-1\">\n <verbena-button width=\"100%\" class=\"verben-primary-button\" [text]=\"'Proceed'\" (click)=\"onDelete()\">\n </verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n\n<verben-dialogue [showCloseIcon]=\"false\" [dismissOutsideClick]=\"false\" [closeOnEscape]=\"true\" [size]=\"'medium'\"\n [mode]=\"'dialogue'\" [customClass]=\"'show-revert-dialogue'\" [disableFooter]=\"true\" [isVisible]=\"showRejectDialogue\"\n [bodyTemplate]=\"rejectBodyTemplate\" (closeModal)=\"closeRejectDialogue()\">\n <ng-template #rejectBodyTemplate>\n <div class=\"dialog-body flex flex-col gap-4\">\n <div class=\"header font-bold text-2xl\">Reject User Request</div>\n <div class=\"form-container-dialogue flex flex-col gap-2\">\n Please provide a reason for rejecting this request.\n <verbena-textarea label=\"Reason\" [required]=\"true\" [rows]=\"4\" width=\"100%\" [formControl]=\"rejectComment\"\n errorMessageColor=\"var(--vbn-color-danger)\">\n </verbena-textarea>\n </div>\n <div class=\"dialog-button-container flex gap-2\">\n <div class=\"flex-1\">\n <verbena-button width=\"100%\" [fontWeight]=\"'bold'\" [bgColor]=\"'var(--vbn-color-surface)'\"\n [borderRadius]=\"'4px'\" [textColor]=\"'var(--vbn-color-text)'\" [border]=\"'1px solid var(--vbn-color-text)'\"\n [text]=\"'Close'\" (click)=\"closeRejectDialogue()\">\n </verbena-button>\n </div>\n <div class=\"flex-1\">\n <verbena-button width=\"100%\" class=\"verben-primary-button\" [text]=\"'Proceed'\" (click)=\"confirmReject()\"\n [disable]=\"!canConfirmReject()\">\n </verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n</verben-dialogue>\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
115
+ }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { approve: [{
116
+ type: Output
117
+ }], reject: [{
118
+ type: Output
119
+ }], deleteRequest: [{
120
+ type: Output
121
+ }], switchToTable: [{
122
+ type: Output
123
+ }] } });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1yZXF1ZXN0LWFwcHJvdmFsLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLXJlcXVlc3QtYXBwcm92YWwvdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWZvcm0vdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLXJlcXVlc3QtYXBwcm92YWwvdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWZvcm0vdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFFTCxXQUFXLEVBRVgsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFHTCx1QkFBdUIsR0FDeEIsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7QUFFM0U7OztHQUdHO0FBZ0JILE1BQU0sT0FBTyxnQ0FBZ0M7SUFvQnZCO0lBbkJwQixPQUFPLEdBQUcsS0FBSyxFQUFxQixDQUFDO0lBQ3JDLEtBQUssR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDMUIsVUFBVSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV6QixPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWtELENBQUM7SUFDN0UsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFtRCxDQUFDO0lBQzdFLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztJQUN0RCxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUVuRCxJQUFJLENBQVk7SUFDaEIsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQzNCLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUUzQjs7O09BR0c7SUFDSCxhQUFhLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFM0QsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxlQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWhGLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDbkIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTtvQkFDdEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRTtvQkFDbEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRTtvQkFDaEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRTtvQkFDbEMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTtvQkFDdEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRTtpQkFDN0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLEtBQUssdUJBQXVCLENBQUMsT0FBTyxDQUFDO0lBQzNFLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDN0MsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNyRCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELHlDQUF5QztJQUV6QyxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFBRSxPQUFPO1FBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQzt3R0FuR1UsZ0NBQWdDOzRGQUFoQyxnQ0FBZ0Msc2xCQzFDN0MsNDBKQXVGQSxzR0R4REksWUFBWSxrSUFDWixtQkFBbUIsNGtDQUNuQixrQkFBa0Isb3FCQUNsQixtQkFBbUIsa2VBQ25CLHFCQUFxQixvVEFDckIsY0FBYyxnbUJBQ2Qsb0JBQW9COzs0RkFLWCxnQ0FBZ0M7a0JBZjVDLFNBQVM7K0JBQ0UsZ0NBQWdDLGNBQzlCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLHFCQUFxQjt3QkFDckIsY0FBYzt3QkFDZCxvQkFBb0I7cUJBQ3JCO2dGQVNTLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZWZmZWN0LCBpbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGb3JtQnVpbGRlcixcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgUm9sZSxcbiAgVXNlckFjY2Vzc1JlcXVlc3QsXG4gIFVzZXJBY2Nlc3NSZXF1ZXN0U3RhdHVzLFxufSBmcm9tICd2ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgRHJvcERvd25Nb2R1bGUsXG4gIFZlcmJlbmFCdXR0b25Nb2R1bGUsXG4gIFZlcmJlbmFJbnB1dE1vZHVsZSxcbiAgVmVyYmVuYVRleHRhcmVhTW9kdWxlLFxuICBWZXJiZW5EaWFsb2d1ZU1vZHVsZSxcbn0gZnJvbSAndmVyYmVuLW5nLXVpJztcbmltcG9ydCB7IFVTRVJfQUNDRVNTX1JFUVVFU1RfQ09ORklHIH0gZnJvbSAnLi4vdXNlci1hY2Nlc3MtcmVxdWVzdC5jb25maWcnO1xuXG4vKipcbiAqIEZvcm0gZm9yIGFwcHJvdmluZy9yZWplY3RpbmcgYSBzaW5nbGUgYWNjZXNzIHJlcXVlc3QuXG4gKiBJZGVudGl0eSBmaWVsZHMgYXJlIHJlYWQtb25seTsgdGhlIHJvbGUgbXVzdCBiZSBjaG9zZW4gYmVmb3JlIGFwcHJvdmFsLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmVyYmVuYUlucHV0TW9kdWxlLFxuICAgIFZlcmJlbmFCdXR0b25Nb2R1bGUsXG4gICAgVmVyYmVuYVRleHRhcmVhTW9kdWxlLFxuICAgIERyb3BEb3duTW9kdWxlLFxuICAgIFZlcmJlbkRpYWxvZ3VlTW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1yZXF1ZXN0LWFwcHJvdmFsLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLXJlcXVlc3QtYXBwcm92YWwtZm9ybS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJSZXF1ZXN0QXBwcm92YWxGb3JtQ29tcG9uZW50IHtcbiAgcmVxdWVzdCA9IGlucHV0PFVzZXJBY2Nlc3NSZXF1ZXN0PigpO1xuICByb2xlcyA9IGlucHV0PFJvbGVbXT4oW10pO1xuICBzaG93RGVsZXRlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIEBPdXRwdXQoKSBhcHByb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlcXVlc3Q6IFVzZXJBY2Nlc3NSZXF1ZXN0OyByb2xlSWQ6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgcmVqZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlcXVlc3Q6IFVzZXJBY2Nlc3NSZXF1ZXN0OyBjb21tZW50OiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPFVzZXJBY2Nlc3NSZXF1ZXN0PigpO1xuICBAT3V0cHV0KCkgc3dpdGNoVG9UYWJsZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBmb3JtOiBGb3JtR3JvdXA7XG4gIHNob3dEZWxldGVEaWFsb2d1ZSA9IGZhbHNlO1xuICBzaG93UmVqZWN0RGlhbG9ndWUgPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVqZWN0aW9uIHJlYXNvbi4gRGVsaWJlcmF0ZWx5IG91dHNpZGUgYGZvcm1gIOKAlCB0aGF0IGdyb3VwJ3MgdmFsaWRpdHkgZ2F0ZXNcbiAgICogQXBwcm92ZSwgYW5kIGEgcmVxdWlyZWQgY29tbWVudCB0aGVyZSB3b3VsZCBnYXRlIEFwcHJvdmUgdG9vLlxuICAgKi9cbiAgcmVqZWN0Q29tbWVudCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoVVNFUl9BQ0NFU1NfUkVRVUVTVF9DT05GSUcuZm9ybUdyb3VwQ29uZmlnIS5jb250cm9scyk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCgpO1xuICAgICAgaWYgKHJlcXVlc3QgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBNYWlsQWRkcmVzczogcmVxdWVzdC5NYWlsQWRkcmVzcyB8fCAnJyxcbiAgICAgICAgICBGaXJzdE5hbWU6IHJlcXVlc3QuRmlyc3ROYW1lIHx8ICcnLFxuICAgICAgICAgIExhc3ROYW1lOiByZXF1ZXN0Lkxhc3ROYW1lIHx8ICcnLFxuICAgICAgICAgIE90aGVyTmFtZTogcmVxdWVzdC5PdGhlck5hbWUgfHwgJycsXG4gICAgICAgICAgUGhvbmVOdW1iZXI6IHJlcXVlc3QuUGhvbmVOdW1iZXIgfHwgJycsXG4gICAgICAgICAgUm9sZUlEOiByZXF1ZXN0LlJvbGVJRCB8fCAnJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzUGVuZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCk/LlJlcXVlc3RTdGF0dXMgPT09IFVzZXJBY2Nlc3NSZXF1ZXN0U3RhdHVzLlBlbmRpbmc7XG4gIH1cblxuICBjYW5Qcm9jZXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGVuZGluZygpICYmIHRoaXMuZm9ybS52YWxpZDtcbiAgfVxuXG4gIGNhblJlamVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BlbmRpbmcoKTtcbiAgfVxuXG4gIGNhbkRlbGV0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93RGVsZXRlKCkgJiYgdGhpcy5pc1BlbmRpbmcoKTtcbiAgfVxuXG4gIG9uQXBwcm92ZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0KCk7XG4gICAgaWYgKHJlcXVlc3QgJiYgdGhpcy5jYW5Qcm9jZXNzKCkpIHtcbiAgICAgIHRoaXMuYXBwcm92ZS5lbWl0KHsgcmVxdWVzdCwgcm9sZUlkOiB0aGlzLmZvcm0uZ2V0KCdSb2xlSUQnKT8udmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCgpO1xuICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICB0aGlzLmRlbGV0ZVJlcXVlc3QuZW1pdChyZXF1ZXN0KTtcbiAgICB9XG4gICAgdGhpcy5jbG9zZURlbGV0ZURpYWxvZ3VlKCk7XG4gIH1cblxuICB0b2dnbGVEZWxldGVEaWFsb2d1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEZWxldGVEaWFsb2d1ZSA9ICF0aGlzLnNob3dEZWxldGVEaWFsb2d1ZTtcbiAgfVxuXG4gIGNsb3NlRGVsZXRlRGlhbG9ndWUoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGVsZXRlRGlhbG9ndWUgPSBmYWxzZTtcbiAgfVxuXG4gIC8vID09PT09IFJlamVjdCAocmVxdWlyZXMgYSByZWFzb24pID09PT09XG5cbiAgb3BlblJlamVjdERpYWxvZ3VlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5SZWplY3QoKSkgcmV0dXJuO1xuICAgIHRoaXMucmVqZWN0Q29tbWVudC5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5yZWplY3RDb21tZW50Lm1hcmtBc1VudG91Y2hlZCgpO1xuICAgIHRoaXMuc2hvd1JlamVjdERpYWxvZ3VlID0gdHJ1ZTtcbiAgfVxuXG4gIGNsb3NlUmVqZWN0RGlhbG9ndWUoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93UmVqZWN0RGlhbG9ndWUgPSBmYWxzZTtcbiAgfVxuXG4gIGNhbkNvbmZpcm1SZWplY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZWplY3RDb21tZW50LnZhbHVlPy50cmltKCk7XG4gIH1cblxuICBjb25maXJtUmVqZWN0KCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3QoKTtcbiAgICBpZiAoIXJlcXVlc3QgfHwgIXRoaXMuY2FuUmVqZWN0KCkgfHwgIXRoaXMuY2FuQ29uZmlybVJlamVjdCgpKSByZXR1cm47XG4gICAgdGhpcy5yZWplY3QuZW1pdCh7IHJlcXVlc3QsIGNvbW1lbnQ6IHRoaXMucmVqZWN0Q29tbWVudC52YWx1ZSEudHJpbSgpIH0pO1xuICAgIHRoaXMuY2xvc2VSZWplY3REaWFsb2d1ZSgpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImZsZXggZmxleC1jb2wgcHgtMyBwYi0zIHJvdW5kZWQteGwgaC1mdWxsIHctZnVsbCByZWxhdGl2ZSBzcGFjZS15LTRcIj5cbiAgPHZlcmJlbmEtaW5wdXQgbmFtZT1cIk1haWxBZGRyZXNzXCIgbGFiZWw9XCJNYWlsIEFkZHJlc3M6XCIgZm9ybUNvbnRyb2xOYW1lPVwiTWFpbEFkZHJlc3NcIiBbcmVhZE9ubHldPVwidHJ1ZVwiIC8+XG4gIDx2ZXJiZW5hLWlucHV0IGxhYmVsPVwiRmlyc3QgTmFtZTpcIiBuYW1lPVwiRmlyc3ROYW1lXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJGaXJzdE5hbWVcIiBbcmVhZE9ubHldPVwidHJ1ZVwiIC8+XG4gIDx2ZXJiZW5hLWlucHV0IGxhYmVsPVwiTGFzdCBOYW1lOlwiIG5hbWU9XCJMYXN0TmFtZVwiIHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiTGFzdE5hbWVcIiBbcmVhZE9ubHldPVwidHJ1ZVwiIC8+XG4gIDx2ZXJiZW5hLWlucHV0IGxhYmVsPVwiT3RoZXIgTmFtZTpcIiBuYW1lPVwiT3RoZXJOYW1lXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJPdGhlck5hbWVcIiBbcmVhZE9ubHldPVwidHJ1ZVwiIC8+XG5cbiAgPGRpdiBjbGFzcz1cInNwYWNlLXktMVwiPlxuICAgIDxsYWJlbCBmb3I9XCJyb2xlXCI+Um9sZTwvbGFiZWw+XG4gICAgPHZlcmJlbi1kcm9wLWRvd24gc3R5bGVDbGFzcz1cInctZnVsbFwiIHdpZHRoPVwiMTAwJVwiIFttdWx0aXNlbGVjdF09XCJmYWxzZVwiIFtmaWx0ZXJdPVwidHJ1ZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICBwbGFjZWhvbGRlcj1cIlwiIFtvcHRpb25zXT1cInJvbGVzKClcIiBpZD1cInJvbGVcIiBvcHRpb25MYWJlbD1cIk5hbWVcIiBvcHRpb25WYWx1ZT1cIkNvZGVcIiBmb3JtQ29udHJvbE5hbWU9XCJSb2xlSURcIlxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cbiAgICA8L3ZlcmJlbi1kcm9wLWRvd24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gYnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIG15LTIgb3ZlcmZsb3ctYXV0b1wiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XG4gICAgICA8dmVyYmVuYS1idXR0b24gKGNsaWNrKT1cInN3aXRjaFRvVGFibGUuZW1pdCgpXCIgdGV4dD1cIlN3aXRjaCBUbyBUYWJsZVwiIHN0eWxlVHlwZT1cInlsdy1vdXRsaW5lXCI+PC92ZXJiZW5hLWJ1dHRvbj5cblxuICAgICAgPHZlcmJlbmEtYnV0dG9uICpuZ0lmPVwic2hvd0RlbGV0ZSgpXCIgd2lkdGg9XCIxMTRweFwiIGhlaWdodD1cIjM5cHhcIiAoY2xpY2spPVwidG9nZ2xlRGVsZXRlRGlhbG9ndWUoKVwiIHRleHQ9XCJEZWxldGVcIlxuICAgICAgICBzdHlsZVR5cGU9XCJkYW5nZXJcIiBib3JkZXJSYWRpdXM9XCIxMHB4XCIgW2Rpc2FibGVdPVwiIWNhbkRlbGV0ZSgpXCI+PC92ZXJiZW5hLWJ1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XG4gICAgICA8dmVyYmVuYS1idXR0b24gd2lkdGg9XCIxMTRweFwiIGhlaWdodD1cIjM5cHhcIiB0ZXh0PVwiUmVqZWN0XCIgc3R5bGVUeXBlPVwiZGFuZ2VyXCIgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgIChjbGljayk9XCJvcGVuUmVqZWN0RGlhbG9ndWUoKVwiIFtkaXNhYmxlXT1cIiFjYW5SZWplY3QoKVwiPjwvdmVyYmVuYS1idXR0b24+XG5cbiAgICAgIDx2ZXJiZW5hLWJ1dHRvbiAoY2xpY2spPVwib25BcHByb3ZlKClcIiB0ZXh0PVwiQXBwcm92ZVwiIGJnQ29sb3I9XCJ2YXIoLS12Ym4tY29sb3Itc3VjY2VzcylcIiB0ZXh0Q29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgIGJvcmRlcj1cIjFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3Itc3VjY2VzcylcIiBib3JkZXJSYWRpdXM9XCIxMHB4XCIgcGQ9XCIxMHB4IDIwcHhcIiB3aWR0aD1cIjExNHB4XCIgaGVpZ2h0PVwiMzlweFwiXG4gICAgICAgIFtkaXNhYmxlXT1cIiFjYW5Qcm9jZXNzKClcIj48L3ZlcmJlbmEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZm9ybT5cblxuPHZlcmJlbi1kaWFsb2d1ZSBbc2hvd0Nsb3NlSWNvbl09XCJmYWxzZVwiIFtkaXNtaXNzT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2Nsb3NlT25Fc2NhcGVdPVwidHJ1ZVwiIFtzaXplXT1cIidtZWRpdW0nXCJcbiAgW21vZGVdPVwiJ2RpYWxvZ3VlJ1wiIFtjdXN0b21DbGFzc109XCInc2hvdy1yZXZlcnQtZGlhbG9ndWUnXCIgW2Rpc2FibGVGb290ZXJdPVwidHJ1ZVwiIFtpc1Zpc2libGVdPVwic2hvd0RlbGV0ZURpYWxvZ3VlXCJcbiAgW2JvZHlUZW1wbGF0ZV09XCJkZWxldGVCb2R5VGVtcGxhdGVcIiAoY2xvc2VNb2RhbCk9XCJjbG9zZURlbGV0ZURpYWxvZ3VlKClcIj5cbiAgPG5nLXRlbXBsYXRlICNkZWxldGVCb2R5VGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy1ib2R5IGZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgZm9udC1ib2xkIHRleHQtMnhsXCI+RGVsZXRlIFVzZXIgUmVxdWVzdDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyLWRpYWxvZ3VlIGZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQ/XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGdhcC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICA8dmVyYmVuYS1idXR0b24gd2lkdGg9XCIxMDAlXCIgW2ZvbnRXZWlnaHRdPVwiJ2JvbGQnXCIgW2JnQ29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1zdXJmYWNlKSdcIlxuICAgICAgICAgICAgW2JvcmRlclJhZGl1c109XCInNHB4J1wiIFt0ZXh0Q29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci10ZXh0KSdcIiBbYm9yZGVyXT1cIicxcHggc29saWQgdmFyKC0tdmJuLWNvbG9yLXRleHQpJ1wiXG4gICAgICAgICAgICBbdGV4dF09XCInQ2xvc2UnXCIgKGNsaWNrKT1cImNsb3NlRGVsZXRlRGlhbG9ndWUoKVwiPlxuICAgICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgPHZlcmJlbmEtYnV0dG9uIHdpZHRoPVwiMTAwJVwiIGNsYXNzPVwidmVyYmVuLXByaW1hcnktYnV0dG9uXCIgW3RleHRdPVwiJ1Byb2NlZWQnXCIgKGNsaWNrKT1cIm9uRGVsZXRlKClcIj5cbiAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC92ZXJiZW4tZGlhbG9ndWU+XG5cbjx2ZXJiZW4tZGlhbG9ndWUgW3Nob3dDbG9zZUljb25dPVwiZmFsc2VcIiBbZGlzbWlzc091dHNpZGVDbGlja109XCJmYWxzZVwiIFtjbG9zZU9uRXNjYXBlXT1cInRydWVcIiBbc2l6ZV09XCInbWVkaXVtJ1wiXG4gIFttb2RlXT1cIidkaWFsb2d1ZSdcIiBbY3VzdG9tQ2xhc3NdPVwiJ3Nob3ctcmV2ZXJ0LWRpYWxvZ3VlJ1wiIFtkaXNhYmxlRm9vdGVyXT1cInRydWVcIiBbaXNWaXNpYmxlXT1cInNob3dSZWplY3REaWFsb2d1ZVwiXG4gIFtib2R5VGVtcGxhdGVdPVwicmVqZWN0Qm9keVRlbXBsYXRlXCIgKGNsb3NlTW9kYWwpPVwiY2xvc2VSZWplY3REaWFsb2d1ZSgpXCI+XG4gIDxuZy10ZW1wbGF0ZSAjcmVqZWN0Qm9keVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm9keSBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyIGZvbnQtYm9sZCB0ZXh0LTJ4bFwiPlJlamVjdCBVc2VyIFJlcXVlc3Q8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lci1kaWFsb2d1ZSBmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgIFBsZWFzZSBwcm92aWRlIGEgcmVhc29uIGZvciByZWplY3RpbmcgdGhpcyByZXF1ZXN0LlxuICAgICAgICA8dmVyYmVuYS10ZXh0YXJlYSBsYWJlbD1cIlJlYXNvblwiIFtyZXF1aXJlZF09XCJ0cnVlXCIgW3Jvd3NdPVwiNFwiIHdpZHRoPVwiMTAwJVwiIFtmb3JtQ29udHJvbF09XCJyZWplY3RDb21tZW50XCJcbiAgICAgICAgICBlcnJvck1lc3NhZ2VDb2xvcj1cInZhcigtLXZibi1jb2xvci1kYW5nZXIpXCI+XG4gICAgICAgIDwvdmVyYmVuYS10ZXh0YXJlYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1idXR0b24tY29udGFpbmVyIGZsZXggZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvbiB3aWR0aD1cIjEwMCVcIiBbZm9udFdlaWdodF09XCInYm9sZCdcIiBbYmdDb2xvcl09XCIndmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UpJ1wiXG4gICAgICAgICAgICBbYm9yZGVyUmFkaXVzXT1cIic0cHgnXCIgW3RleHRDb2xvcl09XCIndmFyKC0tdmJuLWNvbG9yLXRleHQpJ1wiIFtib3JkZXJdPVwiJzFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItdGV4dCknXCJcbiAgICAgICAgICAgIFt0ZXh0XT1cIidDbG9zZSdcIiAoY2xpY2spPVwiY2xvc2VSZWplY3REaWFsb2d1ZSgpXCI+XG4gICAgICAgICAgPC92ZXJiZW5hLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICA8dmVyYmVuYS1idXR0b24gd2lkdGg9XCIxMDAlXCIgY2xhc3M9XCJ2ZXJiZW4tcHJpbWFyeS1idXR0b25cIiBbdGV4dF09XCInUHJvY2VlZCdcIiAoY2xpY2spPVwiY29uZmlybVJlamVjdCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cIiFjYW5Db25maXJtUmVqZWN0KClcIj5cbiAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC92ZXJiZW4tZGlhbG9ndWU+XG4iXX0=
@@ -0,0 +1,44 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { DataTableModule, SvgModule } from 'verben-ng-ui';
4
+ import { UserAccessRequestStatusBadgeComponent } from '../user-access-request-status-badge/user-access-request-status-badge.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "verben-ng-ui";
8
+ /**
9
+ * Table view for access requests. Row actions open the form (to approve/reject
10
+ * with a role) or delete the request.
11
+ */
12
+ export class UserRequestApprovalTableComponent {
13
+ requests = [];
14
+ columns = [];
15
+ isLoading = false;
16
+ showDelete = false;
17
+ view = new EventEmitter();
18
+ delete = new EventEmitter();
19
+ onView(request) {
20
+ this.view.emit(request);
21
+ }
22
+ onDelete(request) {
23
+ this.delete.emit(request);
24
+ }
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRequestApprovalTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserRequestApprovalTableComponent, isStandalone: true, selector: "lib-user-request-approval-table", inputs: { requests: "requests", columns: "columns", isLoading: "isLoading", showDelete: "showDelete" }, outputs: { view: "view", delete: "delete" }, ngImport: i0, template: "<div class=\"table-container\" [class.loading]=\"isLoading\">\n <lib-data-table [data]=\"requests\" [columns]=\"columns\" dataKey=\"MailAddress\">\n <!-- Select -->\n <ng-container libColumn=\"select\">\n <ng-template #cell let-isSelected=\"isSelected\" let-toggleRowSelection=\"toggleRowSelection\">\n <input type=\"checkbox\" [checked]=\"isSelected\" (change)=\"toggleRowSelection()\" />\n </ng-template>\n </ng-container>\n\n <!-- Created -->\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>{{ value | date }}</ng-template>\n </ng-container>\n\n <!-- Status -->\n <ng-container libColumn=\"status\">\n <ng-template #cell let-value>\n <lib-user-access-request-status-badge [status]=\"value\"></lib-user-access-request-status-badge>\n </ng-template>\n </ng-container>\n\n <!-- Actions -->\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-row=\"row\">\n <div class=\"flex gap-6\">\n <verben-svg (click)=\"onView(row)\" icon=\"edit\" [width]=\"15\" [height]=\"15\" class=\"cursor-pointer\"></verben-svg>\n <verben-svg *ngIf=\"showDelete\" (click)=\"onDelete(row)\" icon=\"delete\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n\n <div *ngIf=\"requests.length === 0 && !isLoading\" class=\"empty-state\">\n <p>No access requests found</p>\n </div>\n</div>\n", styles: [".table-container{width:100%}.table-container.loading{opacity:.6;pointer-events:none}.empty-state{padding:2rem;text-align:center;color:var(--vbn-color-text-muted)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "ngmodule", type: DataTableModule }, { kind: "component", type: i2.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i2.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "ngmodule", type: SvgModule }, { kind: "component", type: i2.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: UserAccessRequestStatusBadgeComponent, selector: "lib-user-access-request-status-badge", inputs: ["status"] }] });
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserRequestApprovalTableComponent, decorators: [{
29
+ type: Component,
30
+ args: [{ selector: 'lib-user-request-approval-table', standalone: true, imports: [CommonModule, DataTableModule, SvgModule, UserAccessRequestStatusBadgeComponent], template: "<div class=\"table-container\" [class.loading]=\"isLoading\">\n <lib-data-table [data]=\"requests\" [columns]=\"columns\" dataKey=\"MailAddress\">\n <!-- Select -->\n <ng-container libColumn=\"select\">\n <ng-template #cell let-isSelected=\"isSelected\" let-toggleRowSelection=\"toggleRowSelection\">\n <input type=\"checkbox\" [checked]=\"isSelected\" (change)=\"toggleRowSelection()\" />\n </ng-template>\n </ng-container>\n\n <!-- Created -->\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>{{ value | date }}</ng-template>\n </ng-container>\n\n <!-- Status -->\n <ng-container libColumn=\"status\">\n <ng-template #cell let-value>\n <lib-user-access-request-status-badge [status]=\"value\"></lib-user-access-request-status-badge>\n </ng-template>\n </ng-container>\n\n <!-- Actions -->\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-row=\"row\">\n <div class=\"flex gap-6\">\n <verben-svg (click)=\"onView(row)\" icon=\"edit\" [width]=\"15\" [height]=\"15\" class=\"cursor-pointer\"></verben-svg>\n <verben-svg *ngIf=\"showDelete\" (click)=\"onDelete(row)\" icon=\"delete\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n\n <div *ngIf=\"requests.length === 0 && !isLoading\" class=\"empty-state\">\n <p>No access requests found</p>\n </div>\n</div>\n", styles: [".table-container{width:100%}.table-container.loading{opacity:.6;pointer-events:none}.empty-state{padding:2rem;text-align:center;color:var(--vbn-color-text-muted)}\n"] }]
31
+ }], propDecorators: { requests: [{
32
+ type: Input
33
+ }], columns: [{
34
+ type: Input
35
+ }], isLoading: [{
36
+ type: Input
37
+ }], showDelete: [{
38
+ type: Input
39
+ }], view: [{
40
+ type: Output
41
+ }], delete: [{
42
+ type: Output
43
+ }] } });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1yZXF1ZXN0LWFwcHJvdmFsLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvdXNlci1yZXF1ZXN0LWFwcHJvdmFsL3VzZXItcmVxdWVzdC1hcHByb3ZhbC10YWJsZS91c2VyLXJlcXVlc3QtYXBwcm92YWwtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvY29tcG9uZW50cy91c2VyLXJlcXVlc3QtYXBwcm92YWwvdXNlci1yZXF1ZXN0LWFwcHJvdmFsLXRhYmxlL3VzZXItcmVxdWVzdC1hcHByb3ZhbC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RSxPQUFPLEVBQW9CLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUUsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sZ0ZBQWdGLENBQUM7Ozs7QUFFdkk7OztHQUdHO0FBUUgsTUFBTSxPQUFPLGlDQUFpQztJQUNuQyxRQUFRLEdBQXdCLEVBQUUsQ0FBQztJQUNuQyxPQUFPLEdBQTBDLEVBQUUsQ0FBQztJQUNwRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFFbEIsSUFBSSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO0lBQzdDLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztJQUV6RCxNQUFNLENBQUMsT0FBMEI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUEwQjtRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QixDQUFDO3dHQWZVLGlDQUFpQzs0RkFBakMsaUNBQWlDLGdQQ2pCOUMsay9DQXFDQSw2TkR4QlksWUFBWSxxTEFBRSxlQUFlLCtaQUFFLFNBQVMsNEtBQUUscUNBQXFDOzs0RkFJOUUsaUNBQWlDO2tCQVA3QyxTQUFTOytCQUNFLGlDQUFpQyxjQUMvQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxxQ0FBcUMsQ0FBQzs4QkFLakYsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVzZXJBY2Nlc3NSZXF1ZXN0IH0gZnJvbSAndmVyYmVuLWF1dGhlbnRpY2F0aW9uLXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24sIERhdGFUYWJsZU1vZHVsZSwgU3ZnTW9kdWxlIH0gZnJvbSAndmVyYmVuLW5nLXVpJztcbmltcG9ydCB7IFVzZXJBY2Nlc3NSZXF1ZXN0U3RhdHVzQmFkZ2VDb21wb25lbnQgfSBmcm9tICcuLi91c2VyLWFjY2Vzcy1yZXF1ZXN0LXN0YXR1cy1iYWRnZS91c2VyLWFjY2Vzcy1yZXF1ZXN0LXN0YXR1cy1iYWRnZS5jb21wb25lbnQnO1xuXG4vKipcbiAqIFRhYmxlIHZpZXcgZm9yIGFjY2VzcyByZXF1ZXN0cy4gUm93IGFjdGlvbnMgb3BlbiB0aGUgZm9ybSAodG8gYXBwcm92ZS9yZWplY3RcbiAqIHdpdGggYSByb2xlKSBvciBkZWxldGUgdGhlIHJlcXVlc3QuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi11c2VyLXJlcXVlc3QtYXBwcm92YWwtdGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEYXRhVGFibGVNb2R1bGUsIFN2Z01vZHVsZSwgVXNlckFjY2Vzc1JlcXVlc3RTdGF0dXNCYWRnZUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLXJlcXVlc3QtYXBwcm92YWwtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLXJlcXVlc3QtYXBwcm92YWwtdGFibGUuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyUmVxdWVzdEFwcHJvdmFsVGFibGVDb21wb25lbnQge1xuICBASW5wdXQoKSByZXF1ZXN0czogVXNlckFjY2Vzc1JlcXVlc3RbXSA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zOiBDb2x1bW5EZWZpbml0aW9uPFVzZXJBY2Nlc3NSZXF1ZXN0PltdID0gW107XG4gIEBJbnB1dCgpIGlzTG9hZGluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RGVsZXRlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPFVzZXJBY2Nlc3NSZXF1ZXN0PigpO1xuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVc2VyQWNjZXNzUmVxdWVzdD4oKTtcblxuICBvblZpZXcocmVxdWVzdDogVXNlckFjY2Vzc1JlcXVlc3QpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXcuZW1pdChyZXF1ZXN0KTtcbiAgfVxuXG4gIG9uRGVsZXRlKHJlcXVlc3Q6IFVzZXJBY2Nlc3NSZXF1ZXN0KTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUuZW1pdChyZXF1ZXN0KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiIFtjbGFzcy5sb2FkaW5nXT1cImlzTG9hZGluZ1wiPlxuICA8bGliLWRhdGEtdGFibGUgW2RhdGFdPVwicmVxdWVzdHNcIiBbY29sdW1uc109XCJjb2x1bW5zXCIgZGF0YUtleT1cIk1haWxBZGRyZXNzXCI+XG4gICAgPCEtLSBTZWxlY3QgLS0+XG4gICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzZWxlY3RcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbCBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIiBsZXQtdG9nZ2xlUm93U2VsZWN0aW9uPVwidG9nZ2xlUm93U2VsZWN0aW9uXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkXCIgKGNoYW5nZSk9XCJ0b2dnbGVSb3dTZWxlY3Rpb24oKVwiIC8+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBDcmVhdGVkIC0tPlxuICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiY3JlYXRlZEF0XCI+XG4gICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPnt7IHZhbHVlIHwgZGF0ZSB9fTwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFN0YXR1cyAtLT5cbiAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cInN0YXR1c1wiPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT5cbiAgICAgICAgPGxpYi11c2VyLWFjY2Vzcy1yZXF1ZXN0LXN0YXR1cy1iYWRnZSBbc3RhdHVzXT1cInZhbHVlXCI+PC9saWItdXNlci1hY2Nlc3MtcmVxdWVzdC1zdGF0dXMtYmFkZ2U+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBBY3Rpb25zIC0tPlxuICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiYWN0aW9uc1wiPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTZcIj5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyAoY2xpY2spPVwib25WaWV3KHJvdylcIiBpY29uPVwiZWRpdFwiIFt3aWR0aF09XCIxNVwiIFtoZWlnaHRdPVwiMTVcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDx2ZXJiZW4tc3ZnICpuZ0lmPVwic2hvd0RlbGV0ZVwiIChjbGljayk9XCJvbkRlbGV0ZShyb3cpXCIgaWNvbj1cImRlbGV0ZVwiIFt3aWR0aF09XCIxNVwiIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2xpYi1kYXRhLXRhYmxlPlxuXG4gIDxkaXYgKm5nSWY9XCJyZXF1ZXN0cy5sZW5ndGggPT09IDAgJiYgIWlzTG9hZGluZ1wiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICA8cD5ObyBhY2Nlc3MgcmVxdWVzdHMgZm91bmQ8L3A+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=