@unifylib/ui-lib 1.0.3 → 1.1.4

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 (259) hide show
  1. package/esm2022/iq-ui-lib.mjs +5 -0
  2. package/esm2022/lib/base-model/SearchStrConfig.mjs +11 -0
  3. package/esm2022/lib/base-model/api-response.mjs +2 -0
  4. package/esm2022/lib/base-model/audit-log-entry.mjs +3 -0
  5. package/esm2022/lib/base-model/button-action-settings.mjs +16 -0
  6. package/esm2022/lib/base-model/column-def.model.mjs +28 -0
  7. package/esm2022/lib/base-model/do-action-request.mjs +8 -0
  8. package/esm2022/lib/base-model/field-action.mjs +6 -0
  9. package/esm2022/lib/base-model/field-filter.model.mjs +3 -0
  10. package/esm2022/lib/base-model/field-info.mjs +57 -0
  11. package/esm2022/lib/base-model/field-predicate.model.mjs +10 -0
  12. package/esm2022/lib/base-model/filter-request.mjs +13 -0
  13. package/esm2022/lib/base-model/filter.model.mjs +25 -0
  14. package/esm2022/lib/base-model/get-items-list.mjs +10 -0
  15. package/esm2022/lib/base-model/index.mjs +12 -0
  16. package/esm2022/lib/base-model/items-total.model.mjs +8 -0
  17. package/esm2022/lib/base-model/line-item.model.mjs +11 -0
  18. package/esm2022/lib/base-model/lookupItem.mjs +16 -0
  19. package/esm2022/lib/base-model/page-info.mjs +17 -0
  20. package/esm2022/lib/base-model/report-request.model.mjs +17 -0
  21. package/esm2022/lib/base-model/response-envelop.model.mjs +10 -0
  22. package/esm2022/lib/base-model/snack-message.model.mjs +11 -0
  23. package/esm2022/lib/base-model/table-column.interface.mjs +2 -0
  24. package/esm2022/lib/base-model/table-page-user-action.interface.mjs +21 -0
  25. package/esm2022/lib/base-model/workflow/workflow-steps.model.mjs +9 -0
  26. package/esm2022/lib/base-model/workflow/workflow.model.mjs +42 -0
  27. package/esm2022/lib/components/action-comment/action-comment.component.mjs +101 -0
  28. package/esm2022/lib/components/action-confirmation/action-confirmation.component.mjs +55 -0
  29. package/esm2022/lib/components/activity-report-form/activity-report-form.component.mjs +499 -0
  30. package/esm2022/lib/components/advanced-filter/field-filter/field-filter.component.mjs +41 -0
  31. package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +162 -0
  32. package/esm2022/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.mjs +70 -0
  33. package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +99 -0
  34. package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +292 -0
  35. package/esm2022/lib/components/base-form/base-form.component.mjs +297 -0
  36. package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +591 -0
  37. package/esm2022/lib/components/base-input-dialog/base-input-dialog.component.mjs +72 -0
  38. package/esm2022/lib/components/base-table/base-table.component.mjs +514 -0
  39. package/esm2022/lib/components/button-actions/button-actions.component.mjs +70 -0
  40. package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +496 -0
  41. package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +112 -0
  42. package/esm2022/lib/components/item-line-editor/item-line-editor.component.mjs +299 -0
  43. package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +278 -0
  44. package/esm2022/lib/components/paginator/paginator.component.mjs +91 -0
  45. package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +102 -0
  46. package/esm2022/lib/components/report-form/report-form.component.mjs +498 -0
  47. package/esm2022/lib/components/search-bar/search-bar.component.mjs +62 -0
  48. package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +81 -0
  49. package/esm2022/lib/components/shared/action-button/action-button.component.mjs +59 -0
  50. package/esm2022/lib/components/shared/action-card/action-card.component.mjs +93 -0
  51. package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +70 -0
  52. package/esm2022/lib/components/shared-list/shared-list.component.mjs +47 -0
  53. package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +43 -0
  54. package/esm2022/lib/components/title-bar/title-bar.component.mjs +119 -0
  55. package/esm2022/lib/services/backend-service.mjs +240 -0
  56. package/esm2022/lib/services/index.mjs +4 -0
  57. package/esm2022/lib/services/top-panel.mjs +22 -0
  58. package/esm2022/lib/services/trigger-form.service.mjs +17 -0
  59. package/esm2022/lib/utils/base-utils.mjs +97 -0
  60. package/esm2022/lib/validators/date-range-validator.mjs +27 -0
  61. package/esm2022/lib/validators/index.mjs +4 -0
  62. package/esm2022/lib/validators/match-list.validator.mjs +9 -0
  63. package/esm2022/lib/validators/multi-email-validator.mjs +13 -0
  64. package/esm2022/public-api.mjs +29 -0
  65. package/esm2022/q-btech-ui-lib.mjs +5 -0
  66. package/esm2022/unifylib-ui-lib.mjs +5 -0
  67. package/fesm2022/iq-ui-lib.mjs +5625 -0
  68. package/fesm2022/iq-ui-lib.mjs.map +1 -0
  69. package/fesm2022/q-btech-ui-lib.mjs +5619 -0
  70. package/fesm2022/q-btech-ui-lib.mjs.map +1 -0
  71. package/fesm2022/unifylib-ui-lib.mjs +5625 -0
  72. package/fesm2022/unifylib-ui-lib.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/base-model/SearchStrConfig.d.ts +8 -0
  75. package/{src/lib/base-model/api-response.ts → lib/base-model/api-response.d.ts} +5 -7
  76. package/lib/base-model/audit-log-entry.d.ts +7 -0
  77. package/lib/base-model/button-action-settings.d.ts +15 -0
  78. package/lib/base-model/column-def.model.d.ts +11 -0
  79. package/lib/base-model/do-action-request.d.ts +10 -0
  80. package/lib/base-model/field-action.d.ts +6 -0
  81. package/lib/base-model/field-filter.model.d.ts +7 -0
  82. package/lib/base-model/field-info.d.ts +53 -0
  83. package/lib/base-model/field-predicate.model.d.ts +7 -0
  84. package/lib/base-model/filter-request.d.ts +15 -0
  85. package/lib/base-model/filter.model.d.ts +22 -0
  86. package/lib/base-model/get-items-list.d.ts +21 -0
  87. package/lib/base-model/index.d.ts +11 -0
  88. package/lib/base-model/items-total.model.d.ts +6 -0
  89. package/lib/base-model/line-item.model.d.ts +9 -0
  90. package/lib/base-model/lookupItem.d.ts +13 -0
  91. package/{src/lib/base-model/page-info.ts → lib/base-model/page-info.d.ts} +25 -24
  92. package/lib/base-model/report-request.model.d.ts +18 -0
  93. package/lib/base-model/response-envelop.model.d.ts +8 -0
  94. package/lib/base-model/snack-message.model.d.ts +7 -0
  95. package/lib/base-model/table-column.interface.d.ts +28 -0
  96. package/lib/base-model/table-page-user-action.interface.d.ts +14 -0
  97. package/lib/base-model/workflow/workflow-steps.model.d.ts +7 -0
  98. package/lib/base-model/workflow/workflow.model.d.ts +13 -0
  99. package/lib/components/action-comment/action-comment.component.d.ts +32 -0
  100. package/lib/components/action-confirmation/action-confirmation.component.d.ts +19 -0
  101. package/lib/components/activity-report-form/activity-report-form.component.d.ts +93 -0
  102. package/lib/components/advanced-filter/field-filter/field-filter.component.d.ts +20 -0
  103. package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +28 -0
  104. package/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.d.ts +25 -0
  105. package/lib/components/audit-log-list/audit-log.component.d.ts +36 -0
  106. package/lib/components/auto-complete/auto-complete.component.d.ts +51 -0
  107. package/lib/components/base-form/base-form.component.d.ts +59 -0
  108. package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +124 -0
  109. package/lib/components/base-input-dialog/base-input-dialog.component.d.ts +23 -0
  110. package/lib/components/base-table/base-table.component.d.ts +128 -0
  111. package/lib/components/button-actions/button-actions.component.d.ts +17 -0
  112. package/lib/components/editable-base-table/editable-base-table.component.d.ts +106 -0
  113. package/lib/components/equation-builder/equation-builder.component.d.ts +23 -0
  114. package/lib/components/item-line-editor/item-line-editor.component.d.ts +64 -0
  115. package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +51 -0
  116. package/lib/components/paginator/paginator.component.d.ts +26 -0
  117. package/lib/components/report-details-dialog/report-details-dialog.component.d.ts +34 -0
  118. package/lib/components/report-form/report-form.component.d.ts +92 -0
  119. package/lib/components/search-bar/search-bar.component.d.ts +29 -0
  120. package/lib/components/section-form-canvas/section-form-canvas.component.d.ts +27 -0
  121. package/lib/components/shared/action-button/action-button.component.d.ts +17 -0
  122. package/lib/components/shared/action-card/action-card.component.d.ts +37 -0
  123. package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +16 -0
  124. package/lib/components/shared-list/shared-list.component.d.ts +21 -0
  125. package/lib/components/snackbar-static/snackbar-static.component.d.ts +15 -0
  126. package/lib/components/title-bar/title-bar.component.d.ts +42 -0
  127. package/lib/services/backend-service.d.ts +59 -0
  128. package/{src/lib/services/index.ts → lib/services/index.d.ts} +1 -1
  129. package/lib/services/top-panel.d.ts +8 -0
  130. package/lib/services/trigger-form.service.d.ts +7 -0
  131. package/lib/utils/base-utils.d.ts +13 -0
  132. package/lib/validators/date-range-validator.d.ts +2 -0
  133. package/lib/validators/match-list.validator.d.ts +4 -0
  134. package/lib/validators/multi-email-validator.d.ts +6 -0
  135. package/package.json +19 -4
  136. package/{src/public-api.ts → public-api.d.ts} +22 -18
  137. package/ng-package.json +0 -7
  138. package/src/lib/base-model/SearchStrConfig.ts +0 -12
  139. package/src/lib/base-model/audit-log-entry.ts +0 -7
  140. package/src/lib/base-model/button-action-settings.ts +0 -25
  141. package/src/lib/base-model/column-def.model.ts +0 -34
  142. package/src/lib/base-model/do-action-request.ts +0 -11
  143. package/src/lib/base-model/field-action.ts +0 -7
  144. package/src/lib/base-model/field-filter.model.ts +0 -14
  145. package/src/lib/base-model/field-info.ts +0 -98
  146. package/src/lib/base-model/field-predicate.model.ts +0 -7
  147. package/src/lib/base-model/filter-request.ts +0 -27
  148. package/src/lib/base-model/filter.model.ts +0 -49
  149. package/src/lib/base-model/get-items-list.ts +0 -24
  150. package/src/lib/base-model/index.ts +0 -11
  151. package/src/lib/base-model/lookupItem.ts +0 -21
  152. package/src/lib/base-model/null-snackmessage.ts +0 -9
  153. package/src/lib/base-model/report-request.model.ts +0 -33
  154. package/src/lib/base-model/response-envelop.model.ts +0 -15
  155. package/src/lib/base-model/snack-message.model.ts +0 -14
  156. package/src/lib/base-model/snackmessage-interface.ts +0 -7
  157. package/src/lib/base-model/table-column.interface.ts +0 -29
  158. package/src/lib/base-model/table-page-user-action.interface.ts +0 -33
  159. package/src/lib/base-model/workflow/workflow-steps.model.ts +0 -9
  160. package/src/lib/base-model/workflow/workflow.model.ts +0 -52
  161. package/src/lib/components/action-confirmation/action-confirmation.component.css +0 -34
  162. package/src/lib/components/action-confirmation/action-confirmation.component.html +0 -18
  163. package/src/lib/components/action-confirmation/action-confirmation.component.spec.ts +0 -23
  164. package/src/lib/components/action-confirmation/action-confirmation.component.ts +0 -58
  165. package/src/lib/components/activity-report-form/activity-report-form.component.html +0 -109
  166. package/src/lib/components/activity-report-form/activity-report-form.component.scss +0 -0
  167. package/src/lib/components/activity-report-form/activity-report-form.component.spec.ts +0 -25
  168. package/src/lib/components/activity-report-form/activity-report-form.component.ts +0 -605
  169. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.css +0 -51
  170. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.html +0 -23
  171. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.spec.ts +0 -23
  172. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.ts +0 -69
  173. package/src/lib/components/audit-log-list/audit-log.component.html +0 -23
  174. package/src/lib/components/audit-log-list/audit-log.component.scss +0 -0
  175. package/src/lib/components/audit-log-list/audit-log.component.spec.ts +0 -25
  176. package/src/lib/components/audit-log-list/audit-log.component.ts +0 -116
  177. package/src/lib/components/auto-complete/auto-complete.component.css +0 -14
  178. package/src/lib/components/auto-complete/auto-complete.component.html +0 -29
  179. package/src/lib/components/auto-complete/auto-complete.component.spec.ts +0 -23
  180. package/src/lib/components/auto-complete/auto-complete.component.ts +0 -330
  181. package/src/lib/components/base-form/base-form.component.html +0 -58
  182. package/src/lib/components/base-form/base-form.component.scss +0 -0
  183. package/src/lib/components/base-form/base-form.component.spec.ts +0 -25
  184. package/src/lib/components/base-form/base-form.component.ts +0 -305
  185. package/src/lib/components/base-form-canvas/base-form-canvas.component.css +0 -22
  186. package/src/lib/components/base-form-canvas/base-form-canvas.component.html +0 -1006
  187. package/src/lib/components/base-form-canvas/base-form-canvas.component.spec.ts +0 -23
  188. package/src/lib/components/base-form-canvas/base-form-canvas.component.ts +0 -573
  189. package/src/lib/components/base-input-dialog/base-input-dialog.component.css +0 -0
  190. package/src/lib/components/base-input-dialog/base-input-dialog.component.html +0 -42
  191. package/src/lib/components/base-input-dialog/base-input-dialog.component.spec.ts +0 -23
  192. package/src/lib/components/base-input-dialog/base-input-dialog.component.ts +0 -78
  193. package/src/lib/components/base-table/base-table.component.html +0 -242
  194. package/src/lib/components/base-table/base-table.component.scss +0 -31
  195. package/src/lib/components/base-table/base-table.component.spec.ts +0 -25
  196. package/src/lib/components/base-table/base-table.component.ts +0 -568
  197. package/src/lib/components/button-actions/button-actions.component.html +0 -28
  198. package/src/lib/components/button-actions/button-actions.component.scss +0 -6
  199. package/src/lib/components/button-actions/button-actions.component.spec.ts +0 -23
  200. package/src/lib/components/button-actions/button-actions.component.ts +0 -72
  201. package/src/lib/components/editable-base-table/editable-base-table.component.html +0 -372
  202. package/src/lib/components/editable-base-table/editable-base-table.component.scss +0 -44
  203. package/src/lib/components/editable-base-table/editable-base-table.component.spec.ts +0 -25
  204. package/src/lib/components/editable-base-table/editable-base-table.component.ts +0 -570
  205. package/src/lib/components/equation-builder/equation-builder.component.css +0 -0
  206. package/src/lib/components/equation-builder/equation-builder.component.html +0 -31
  207. package/src/lib/components/equation-builder/equation-builder.component.spec.ts +0 -23
  208. package/src/lib/components/equation-builder/equation-builder.component.ts +0 -121
  209. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.css +0 -11
  210. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.html +0 -38
  211. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.spec.ts +0 -23
  212. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.ts +0 -317
  213. package/src/lib/components/paginator/paginator.component.css +0 -25
  214. package/src/lib/components/paginator/paginator.component.html +0 -34
  215. package/src/lib/components/paginator/paginator.component.ts +0 -94
  216. package/src/lib/components/rejection-comment/action-comment.component.css +0 -33
  217. package/src/lib/components/rejection-comment/action-comment.component.html +0 -46
  218. package/src/lib/components/rejection-comment/action-comment.component.spec.ts +0 -23
  219. package/src/lib/components/rejection-comment/action-comment.component.ts +0 -86
  220. package/src/lib/components/report-details-dialog/report-details-dialog.component.css +0 -17
  221. package/src/lib/components/report-details-dialog/report-details-dialog.component.html +0 -16
  222. package/src/lib/components/report-details-dialog/report-details-dialog.component.spec.ts +0 -23
  223. package/src/lib/components/report-details-dialog/report-details-dialog.component.ts +0 -113
  224. package/src/lib/components/report-form/report-form.component.html +0 -94
  225. package/src/lib/components/report-form/report-form.component.scss +0 -0
  226. package/src/lib/components/report-form/report-form.component.spec.ts +0 -25
  227. package/src/lib/components/report-form/report-form.component.ts +0 -588
  228. package/src/lib/components/search-bar/search-bar.component.html +0 -62
  229. package/src/lib/components/search-bar/search-bar.component.scss +0 -8
  230. package/src/lib/components/search-bar/search-bar.component.spec.ts +0 -25
  231. package/src/lib/components/search-bar/search-bar.component.ts +0 -70
  232. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.css +0 -54
  233. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.html +0 -22
  234. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.spec.ts +0 -23
  235. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.ts +0 -45
  236. package/src/lib/components/shared-list/shared-list.component.css +0 -0
  237. package/src/lib/components/shared-list/shared-list.component.html +0 -17
  238. package/src/lib/components/shared-list/shared-list.component.spec.ts +0 -23
  239. package/src/lib/components/shared-list/shared-list.component.ts +0 -53
  240. package/src/lib/components/title-bar/title-bar.component.css +0 -0
  241. package/src/lib/components/title-bar/title-bar.component.css.map +0 -1
  242. package/src/lib/components/title-bar/title-bar.component.html +0 -31
  243. package/src/lib/components/title-bar/title-bar.component.scss +0 -23
  244. package/src/lib/components/title-bar/title-bar.component.spec.ts +0 -23
  245. package/src/lib/components/title-bar/title-bar.component.ts +0 -119
  246. package/src/lib/services/backend-service.ts +0 -286
  247. package/src/lib/services/top-panel.ts +0 -17
  248. package/src/lib/services/trigger-form.service.ts +0 -11
  249. package/src/lib/share-module/shared-module.ts +0 -10
  250. package/src/lib/styles/invoiceq-theme.scss +0 -252
  251. package/src/lib/styles/styles.scss +0 -1723
  252. package/src/lib/utils/base-utils.ts +0 -102
  253. package/src/lib/validators/date-range-validator.ts +0 -31
  254. package/src/lib/validators/match-list.validator.ts +0 -10
  255. package/src/lib/validators/multi-email-validator.ts +0 -15
  256. package/tsconfig.lib.json +0 -15
  257. package/tsconfig.lib.prod.json +0 -11
  258. package/tsconfig.spec.json +0 -15
  259. /package/{src/lib/validators/index.ts → lib/validators/index.d.ts} +0 -0
@@ -0,0 +1,278 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { ALL_ITEM, LookupItem } from "../../base-model";
3
+ import { MatAutocomplete, MatAutocompleteTrigger, MatOption } from "@angular/material/autocomplete";
4
+ import { of } from "rxjs";
5
+ import { FormControl, ReactiveFormsModule, Validators } from "@angular/forms";
6
+ import { MatFormField } from "@angular/material/form-field";
7
+ import { MatChip, MatChipGrid, MatChipInput, MatChipListbox } from "@angular/material/chips";
8
+ import { AsyncPipe, NgForOf, NgIf } from "@angular/common";
9
+ import { MatIcon } from "@angular/material/icon";
10
+ import { MatInput } from "@angular/material/input";
11
+ import { MatLabel } from '@angular/material/form-field';
12
+ import { buildItemsList } from "../../utils/base-utils";
13
+ import { FilterRequest } from "../../base-model";
14
+ import { Filter } from "../../base-model";
15
+ import { RequireMatch } from "../../validators";
16
+ import { MatChipsModule } from '@angular/material/chips';
17
+ import { MatIconModule } from '@angular/material/icon';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "../../services";
20
+ import * as i2 from "@ngx-translate/core";
21
+ import * as i3 from "@angular/material/icon";
22
+ import * as i4 from "@angular/material/chips";
23
+ import * as i5 from "@angular/forms";
24
+ export class MultiAutoCompleteComponent {
25
+ constructor(backendService, translateService) {
26
+ this.backendService = backendService;
27
+ this.translateService = translateService;
28
+ this.lookupItems = [];
29
+ this.selectedItems = [];
30
+ this.cascadedIdz = [];
31
+ this.isRequired = false;
32
+ this.readonly = false;
33
+ this.selectedValue = new EventEmitter();
34
+ this.question = 'Would you like to add ?"';
35
+ this.multiControl = new FormControl();
36
+ this._columns = ['id', 'code', 'englishName', 'arabicName'];
37
+ }
38
+ ngOnInit() {
39
+ // this.form = this.rootFormGroup.control;
40
+ this.selectedItems = [];
41
+ this.multiControl = new FormControl(this.form?.controls[this.field?.property]);
42
+ this.multiControl.enable();
43
+ this.updateFieldAttributes();
44
+ if (!this.field.acceptNewItem) {
45
+ // @ts-ignore
46
+ this.multiControl.setValidators([RequireMatch]);
47
+ }
48
+ this.multiControl.setValue(this.form?.controls[this.field?.property]?.value);
49
+ this.multiControl.valueChanges.subscribe(v => {
50
+ if (typeof v === 'string') {
51
+ clearTimeout(this.timer);
52
+ this.timer = setTimeout(() => {
53
+ this.filterLookupItems(v, null);
54
+ }, 700);
55
+ }
56
+ });
57
+ // this.multiControl.valueChanges.subscribe(v => {
58
+ // if (typeof v === 'string') this.filterLookupItems(v, null);
59
+ // })
60
+ // this.filterAutoCompleteData(this.field.property);
61
+ this.getLookupData();
62
+ if (this.field.cascadedBy) {
63
+ this.form?.get(this.field.cascadedBy)?.valueChanges.subscribe(v => {
64
+ this.removeChildItemsIfCascadedByRemoved(v);
65
+ });
66
+ }
67
+ }
68
+ updateFieldAttributes() {
69
+ if (this.field.readonly) {
70
+ this.multiControl.disable();
71
+ this.isRequired = false;
72
+ }
73
+ else if (this.field.required) {
74
+ this.form?.controls[this.field?.property].setValidators([Validators.required]);
75
+ this.form?.controls[this.field?.property].updateValueAndValidity();
76
+ this.multiControl.setValidators([Validators.required]);
77
+ this.isRequired = true;
78
+ }
79
+ this.multiControl.updateValueAndValidity();
80
+ }
81
+ removeChildItemsIfCascadedByRemoved(v) {
82
+ this.cascadedIdz = [];
83
+ v.forEach(a => {
84
+ this.cascadedIdz.push(a.id);
85
+ });
86
+ let toDeleteIdz = [];
87
+ this.selectedItems?.forEach(x => {
88
+ const del = this.cascadedIdz.findIndex(y => y === x[this.field.cascadedBy]?.id);
89
+ if (del < 0) {
90
+ toDeleteIdz.push(x['id']);
91
+ }
92
+ });
93
+ if (toDeleteIdz) {
94
+ this.selectedItems = this.selectedItems.filter(s => !toDeleteIdz.includes(s.id));
95
+ this.form.get(this.field.property).patchValue(this.selectedItems, { emitEvent: true });
96
+ }
97
+ }
98
+ ngOnChanges({ defaultValue, field }) {
99
+ this.patchLookupValue(defaultValue?.currentValue);
100
+ if (field?.currentValue) {
101
+ this.field = field.currentValue;
102
+ this.updateFieldAttributes();
103
+ }
104
+ }
105
+ getLookupData() {
106
+ const listItems = buildItemsList('', this.field.lookupApiPath);
107
+ const filterRequest = new FilterRequest();
108
+ filterRequest.filters = [];
109
+ this.cascadedIdz = [];
110
+ if (this.field.cascadedBy) {
111
+ this.form.get(this.field.cascadedBy)?.value?.forEach(a => {
112
+ this.cascadedIdz.push(a.id);
113
+ });
114
+ }
115
+ if (this.field.cascadedBy && this.cascadedIdz?.length > 0) {
116
+ filterRequest.filters.push(new Filter({
117
+ key: 'id', fieldName: this.field.cascadedBy, label: '',
118
+ filterType: 'FILED_FILTER', operator: 'IN',
119
+ valueObject: this.cascadedIdz
120
+ }));
121
+ }
122
+ filterRequest.columns = ['id', 'code', 'englishName', 'arabicName'];
123
+ this.backendService.getLookupItemsByMultiFilter(listItems, filterRequest).subscribe((resp => {
124
+ if (resp.valid) {
125
+ this.lookupItems = this.field.includeAllOption ? [ALL_ITEM].concat(resp.body) : resp.body;
126
+ if (!this.form.get('id')?.value) {
127
+ this.patchLookupValue(this.lookupItems?.find(l => l.defaultValue));
128
+ }
129
+ this.patchLookupValue(this.multiControl.value);
130
+ }
131
+ }));
132
+ }
133
+ selected(value) {
134
+ if (value.id !== -1 && this.selectedItems.findIndex(i => i.id === value.id) === -1) {
135
+ this.selectedItems?.push(value);
136
+ this.itemInput.nativeElement.value = '';
137
+ this.form.get(this.field.property)?.setValue(this.selectedItems);
138
+ // @ts-ignore
139
+ this.selectedValue.emit(this.selectedItems);
140
+ this.multiControl.setValue(null);
141
+ }
142
+ }
143
+ displayFn(selected) {
144
+ return selected ? selected.englishName : undefined;
145
+ }
146
+ isSelected(item) {
147
+ return this.selectedItems?.some(selected => selected.id === item.id); // Use your unique identifier
148
+ }
149
+ _allowSelection(option) {
150
+ return {
151
+ 'prevent-selection': option.id === -1,
152
+ };
153
+ }
154
+ itemNameByLag(item) {
155
+ // return item.arabicName;
156
+ return this.translateService.getDefaultLang() === 'en' ? item.englishName : item.arabicName;
157
+ }
158
+ filterLookupItems(name, trigger) {
159
+ if (trigger) {
160
+ trigger.openPanel();
161
+ }
162
+ if (name === undefined) {
163
+ name = '';
164
+ }
165
+ const listItems = buildItemsList(name, this.field.lookupApiPath);
166
+ const filterRequest = new FilterRequest();
167
+ filterRequest.filters = this.field.lookupFilterList || [];
168
+ filterRequest.searchStr = name;
169
+ this.cascadedIdz = [];
170
+ if (this.field.cascadedBy) {
171
+ this.form.get(this.field.cascadedBy)?.value?.forEach(a => {
172
+ this.cascadedIdz.push(a.id);
173
+ });
174
+ }
175
+ if (this.field.cascadedBy && this.cascadedIdz?.length > 0) {
176
+ filterRequest.filters.push(new Filter({
177
+ key: 'id', joinObjectName: this.field.cascadedBy, fieldName: this.field.cascadedBy, label: '',
178
+ filterType: 'FILED_FILTER', operator: 'IN',
179
+ valueObject: this.cascadedIdz
180
+ }));
181
+ }
182
+ filterRequest.columns = [...this._columns, ...(this.field.extraLookupsColumns ?? [])];
183
+ this.backendService.getLookupItemsByMultiFilter(listItems, filterRequest).subscribe(resp => {
184
+ // console.log('result -->', resp);
185
+ let items = [];
186
+ if (resp.valid) {
187
+ // resp.body.forEach(r => items.push(r));
188
+ items = resp.body.filter(item =>
189
+ // (item.englishName.toLowerCase().includes(name.toLowerCase()) ||
190
+ // item.arabicName.toLowerCase().includes(name.toLowerCase())) &&
191
+ this.selectedItems?.findIndex(i => i.id === item.id) === -1);
192
+ if (!items?.length) {
193
+ this.field.acceptNewItem ?
194
+ items?.push(new LookupItem({ id: -2, englishName: this.question + name, arabicName: this.question + name })) :
195
+ items?.push(new LookupItem({ id: -1, englishName: 'No match ...', arabicName: 'غير موجود ... ' }));
196
+ }
197
+ }
198
+ else {
199
+ this.field.acceptNewItem ?
200
+ items?.push(new LookupItem({ id: -2, englishName: this.question + name, arabicName: this.question + name })) :
201
+ items?.push(new LookupItem({ id: -1, englishName: 'No match ...', arabicName: 'غير موجود ... ' }));
202
+ }
203
+ this.lookupItems$ = of(items);
204
+ });
205
+ return;
206
+ }
207
+ patchLookupValue(defaultValue) {
208
+ if (defaultValue) {
209
+ // this.form?.get(this.field.property)?.patchValue(defaultValue);
210
+ this.selectedItems = defaultValue;
211
+ this.multiControl.setValue(defaultValue);
212
+ this.multiControl.patchValue(defaultValue, { emitEvent: true });
213
+ }
214
+ }
215
+ remove(item) {
216
+ const index = this.selectedItems.indexOf(item);
217
+ if (index >= 0) {
218
+ this.selectedItems.splice(index, 1);
219
+ this.form.get(this.field.property).patchValue(this.selectedItems, { emitEvent: true });
220
+ }
221
+ }
222
+ getLabel() {
223
+ return this.translateService.instant(this.field.label);
224
+ }
225
+ onKeydown(event, autocompleteTrigger) {
226
+ if (event.key === 'Enter') {
227
+ this.filterLookupItems('', autocompleteTrigger);
228
+ autocompleteTrigger.openPanel();
229
+ event.preventDefault();
230
+ }
231
+ }
232
+ getId() {
233
+ return this.field.property;
234
+ }
235
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiAutoCompleteComponent, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
236
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiAutoCompleteComponent, isStandalone: true, selector: "app-multi-auto-complete", inputs: { field: "field", form: "form", defaultValue: "defaultValue", pathParam: "pathParam", readonly: "readonly" }, outputs: { selectedValue: "selectedValue" }, viewQueries: [{ propertyName: "itemInput", first: true, predicate: ["itemInput"], descendants: true }, { propertyName: "matACTrigger", first: true, predicate: ["autocompleteTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"this.field\" class=\"main-multi-auto\">\r\n <div class=\"matField\" (click)=\"this.filterLookupItems('', autocompleteTrigger)\">\r\n <mat-form-field class=\"full-width\" appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{ getLabel() }}</mat-label>\r\n <mat-chip-listbox #chipList [selectable]=\"true\">\r\n <mat-chip\r\n *ngFor=\"let item of selectedItems\"\r\n [removable]=\"true\"\r\n (removed)=\"remove(item)\">\r\n {{ itemNameByLag(item) }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n <input class=\"chip-input\" type=\"text\"\r\n [id]=\"getId()\" #itemInput\r\n [formControl]=\"multiControl\"\r\n [matAutocomplete]=\"auto\" matInput\r\n [readonly]=\"readonly\"\r\n [required]=\"isRequired\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [disabled]=\"field.readonly\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n >\r\n </mat-chip-listbox>\r\n\r\n <mat-icon class=\"arrow_drop_down_autocomplete\">arrow_drop_down</mat-icon>\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption [displayWith]=\"displayFn\"\r\n (optionSelected)=\"selected($event.option.value)\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option *ngFor=\"let item of lookupItems$ | async\" [value]=\"item\"\r\n [disabled]=\"field.readonly || isSelected(item)\"\r\n (click)=\"$event.stopPropagation(); autocompleteTrigger.openPanel()\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n</ng-container>\r\n", styles: [":is() .matField{margin-bottom:24px!important}:is() .matField .mat-form-field-wrapper{padding:0!important;margin-bottom:0!important}.full-width{width:100%}.chip-input{flex:1 1 auto}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "directive", type: i4.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }] }); }
237
+ }
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiAutoCompleteComponent, decorators: [{
239
+ type: Component,
240
+ args: [{ selector: 'app-multi-auto-complete', standalone: true, imports: [
241
+ MatFormField,
242
+ MatChip,
243
+ MatIconModule,
244
+ MatChipsModule,
245
+ NgForOf,
246
+ MatIcon,
247
+ ReactiveFormsModule,
248
+ MatAutocompleteTrigger,
249
+ MatChipInput,
250
+ MatInput,
251
+ MatAutocomplete,
252
+ MatOption,
253
+ AsyncPipe,
254
+ NgIf,
255
+ MatChipGrid,
256
+ MatChipListbox,
257
+ MatLabel
258
+ ], template: "<ng-container *ngIf=\"this.field\" class=\"main-multi-auto\">\r\n <div class=\"matField\" (click)=\"this.filterLookupItems('', autocompleteTrigger)\">\r\n <mat-form-field class=\"full-width\" appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>{{ getLabel() }}</mat-label>\r\n <mat-chip-listbox #chipList [selectable]=\"true\">\r\n <mat-chip\r\n *ngFor=\"let item of selectedItems\"\r\n [removable]=\"true\"\r\n (removed)=\"remove(item)\">\r\n {{ itemNameByLag(item) }}\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n <input class=\"chip-input\" type=\"text\"\r\n [id]=\"getId()\" #itemInput\r\n [formControl]=\"multiControl\"\r\n [matAutocomplete]=\"auto\" matInput\r\n [readonly]=\"readonly\"\r\n [required]=\"isRequired\"\r\n (keydown)=\"onKeydown($event, autocompleteTrigger)\"\r\n [disabled]=\"field.readonly\"\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n >\r\n </mat-chip-listbox>\r\n\r\n <mat-icon class=\"arrow_drop_down_autocomplete\">arrow_drop_down</mat-icon>\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption [displayWith]=\"displayFn\"\r\n (optionSelected)=\"selected($event.option.value)\">\r\n <ng-container *ngIf=\"!field.readonly\">\r\n <mat-option *ngFor=\"let item of lookupItems$ | async\" [value]=\"item\"\r\n [disabled]=\"field.readonly || isSelected(item)\"\r\n (click)=\"$event.stopPropagation(); autocompleteTrigger.openPanel()\">\r\n {{ itemNameByLag(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n</ng-container>\r\n", styles: [":is() .matField{margin-bottom:24px!important}:is() .matField .mat-form-field-wrapper{padding:0!important;margin-bottom:0!important}.full-width{width:100%}.chip-input{flex:1 1 auto}\n"] }]
259
+ }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }], propDecorators: { itemInput: [{
260
+ type: ViewChild,
261
+ args: ['itemInput']
262
+ }], matACTrigger: [{
263
+ type: ViewChild,
264
+ args: ['autocompleteTrigger']
265
+ }], field: [{
266
+ type: Input
267
+ }], form: [{
268
+ type: Input
269
+ }], defaultValue: [{
270
+ type: Input
271
+ }], pathParam: [{
272
+ type: Input
273
+ }], readonly: [{
274
+ type: Input
275
+ }], selectedValue: [{
276
+ type: Output
277
+ }] } });
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLWF1dG8tY29tcGxldGUvbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLWF1dG8tY29tcGxldGUvbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xHLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFDLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUl2RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzNGLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsUUFBUSxFQUFD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c0JBREosS0FBSztnQkFJTixJQUFJO3NCQURILEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sYUFBYTtzQkFEWixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBTExfSVRFTSwgTG9va3VwSXRlbX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsIE1hdE9wdGlvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZVwiO1xyXG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0ZpZWxkSW5mb30gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtCYWNrZW5kU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHtHZXRJdGVtc0xpc3R9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2dldC1pdGVtcy1saXN0XCI7XHJcbmltcG9ydCB7TWF0Rm9ybUZpZWxkfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQge01hdENoaXAsIE1hdENoaXBHcmlkLCBNYXRDaGlwSW5wdXQsIE1hdENoaXBMaXN0Ym94fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHNcIjtcclxuaW1wb3J0IHtBc3luY1BpcGUsIE5nRm9yT2YsIE5nSWZ9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge01hdElucHV0fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcclxuaW1wb3J0IHsgTWF0TGFiZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHtidWlsZEl0ZW1zTGlzdH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtGaWx0ZXJSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbFwiO1xyXG5pbXBvcnQge0ZpbHRlcn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtSZXF1aXJlTWF0Y2h9IGZyb20gXCIuLi8uLi92YWxpZGF0b3JzXCI7XHJcbmltcG9ydCB7IE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtbXVsdGktYXV0by1jb21wbGV0ZScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBNYXRGb3JtRmllbGQsXHJcbiAgICBNYXRDaGlwLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdENoaXBzTW9kdWxlLFxyXG4gICAgTmdGb3JPZixcclxuICAgIE1hdEljb24sXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcixcclxuICAgIE1hdENoaXBJbnB1dCxcclxuICAgIE1hdElucHV0LFxyXG4gICAgTWF0QXV0b2NvbXBsZXRlLFxyXG4gICAgTWF0T3B0aW9uLFxyXG4gICAgQXN5bmNQaXBlLFxyXG4gICAgTmdJZixcclxuICAgIE1hdENoaXBHcmlkLFxyXG4gICAgTWF0Q2hpcExpc3Rib3gsXHJcbiAgICBNYXRMYWJlbFxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWF1dG8tY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9tdWx0aS1hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNdWx0aUF1dG9Db21wbGV0ZUNvbXBvbmVudCB7XHJcbi8vIEB0cy1pZ25vcmVcclxuICBAVmlld0NoaWxkKCdpdGVtSW5wdXQnKSBpdGVtSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnYXV0b2NvbXBsZXRlVHJpZ2dlcicpIG1hdEFDVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuXHJcbiAgbG9va3VwSXRlbXMkOiBPYnNlcnZhYmxlPExvb2t1cEl0ZW1bXT4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBsb29rdXBJdGVtczogTG9va3VwSXRlbVtdID0gW107XHJcblxyXG4gIHNlbGVjdGVkSXRlbXM6IExvb2t1cEl0ZW1bXSA9IFtdO1xyXG4gIGNhc2NhZGVkSWR6OiBudW1iZXJbXSA9IFtdO1xyXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW49IGZhbHNlO1xyXG4gIHByaXZhdGUgdGltZXI6IGFueTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgZmllbGQ6IEZpZWxkSW5mbztcclxuICAvL1xyXG4gIEBJbnB1dCgpLy8gQHRzLWlnbm9yZVxyXG4gIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgZGVmYXVsdFZhbHVlOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcGF0aFBhcmFtOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcmVhZG9ubHkgOiBib29sZWFuPWZhbHNlO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBzZWxlY3RlZFZhbHVlOiBFdmVudEVtaXR0ZXI8TG9va3VwSXRlbVtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgcXVlc3Rpb24gPSAnV291bGQgeW91IGxpa2UgdG8gYWRkID9cIic7XHJcblxyXG4gIG11bHRpQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhY2tlbmRTZXJ2aWNlOiBCYWNrZW5kU2VydmljZSwgcHJpdmF0ZSAgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyB0aGlzLmZvcm0gPSB0aGlzLnJvb3RGb3JtR3JvdXAuY29udHJvbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgdGhpcy5tdWx0aUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5mb3JtPy5jb250cm9sc1t0aGlzLmZpZWxkPy5wcm9wZXJ0eV0pO1xyXG5cclxuICAgIHRoaXMubXVsdGlDb250cm9sLmVuYWJsZSgpO1xyXG4gICAgdGhpcy51cGRhdGVGaWVsZEF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZmllbGQuYWNjZXB0TmV3SXRlbSl7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgdGhpcy5tdWx0aUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbUmVxdWlyZU1hdGNoXSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tdWx0aUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtPy5jb250cm9sc1t0aGlzLmZpZWxkPy5wcm9wZXJ0eV0/LnZhbHVlKTtcclxuXHJcbiAgICB0aGlzLm11bHRpQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCB2ID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XHJcbiAgICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyTG9va3VwSXRlbXModiwgbnVsbCk7fSwgNzAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgLy8gdGhpcy5tdWx0aUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2ID0+IHtcclxuICAgIC8vICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB0aGlzLmZpbHRlckxvb2t1cEl0ZW1zKHYsIG51bGwpO1xyXG4gICAgLy8gfSlcclxuICAgIC8vIHRoaXMuZmlsdGVyQXV0b0NvbXBsZXRlRGF0YSh0aGlzLmZpZWxkLnByb3BlcnR5KTtcclxuXHJcbiAgICB0aGlzLmdldExvb2t1cERhdGEoKTtcclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkpIHtcclxuICAgICAgdGhpcy5mb3JtPy5nZXQodGhpcy5maWVsZC5jYXNjYWRlZEJ5KT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2ID0+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZUNoaWxkSXRlbXNJZkNhc2NhZGVkQnlSZW1vdmVkKHYpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpZWxkQXR0cmlidXRlcygpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLnJlYWRvbmx5KSB7XHJcbiAgICAgIHRoaXMubXVsdGlDb250cm9sLmRpc2FibGUoKTtcclxuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGQucmVxdWlyZWQpIHtcclxuICAgICAgdGhpcy5mb3JtPy5jb250cm9sc1t0aGlzLmZpZWxkPy5wcm9wZXJ0eV0uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG4gICAgICB0aGlzLmZvcm0/LmNvbnRyb2xzW3RoaXMuZmllbGQ/LnByb3BlcnR5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMubXVsdGlDb250cm9sLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMubXVsdGlDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlQ2hpbGRJdGVtc0lmQ2FzY2FkZWRCeVJlbW92ZWQodikge1xyXG4gICAgdGhpcy5jYXNjYWRlZElkeiA9IFtdO1xyXG4gICAgdi5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICB0aGlzLmNhc2NhZGVkSWR6LnB1c2goYS5pZCk7XHJcbiAgICB9KTtcclxuICAgIGxldCB0b0RlbGV0ZUlkeiA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zPy5mb3JFYWNoKHggPT4ge1xyXG4gICAgICBjb25zdCBkZWwgPSB0aGlzLmNhc2NhZGVkSWR6LmZpbmRJbmRleCh5ID0+IHkgPT09IHhbdGhpcy5maWVsZC5jYXNjYWRlZEJ5XT8uaWQpO1xyXG4gICAgICBpZiAoZGVsIDwgMCkge1xyXG4gICAgICAgIHRvRGVsZXRlSWR6LnB1c2goeFsnaWQnXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0b0RlbGV0ZUlkeikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKHMgPT4gIXRvRGVsZXRlSWR6LmluY2x1ZGVzKHMuaWQpKTtcclxuICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLnByb3BlcnR5KS5wYXRjaFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcywge2VtaXRFdmVudDogdHJ1ZX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoe2RlZmF1bHRWYWx1ZSwgZmllbGR9OiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUoZGVmYXVsdFZhbHVlPy5jdXJyZW50VmFsdWUpO1xyXG4gICAgaWYgKGZpZWxkPy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5maWVsZCA9IGZpZWxkLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGaWVsZEF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TG9va3VwRGF0YSgpIHtcclxuICAgIGNvbnN0IGxpc3RJdGVtczogR2V0SXRlbXNMaXN0ID0gYnVpbGRJdGVtc0xpc3QoJycsIHRoaXMuZmllbGQubG9va3VwQXBpUGF0aCk7XHJcblxyXG4gICAgY29uc3QgZmlsdGVyUmVxdWVzdDogRmlsdGVyUmVxdWVzdCA9IG5ldyBGaWx0ZXJSZXF1ZXN0KCk7XHJcbiAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnMgPSBbXTtcclxuICAgIHRoaXMuY2FzY2FkZWRJZHogPSBbXTtcclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkpIHtcclxuICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmNhc2NhZGVkQnkpPy52YWx1ZT8uZm9yRWFjaChhID0+IHtcclxuICAgICAgICB0aGlzLmNhc2NhZGVkSWR6LnB1c2goYS5pZCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWVsZC5jYXNjYWRlZEJ5ICYmIHRoaXMuY2FzY2FkZWRJZHo/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgZmlsdGVyUmVxdWVzdC5maWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7XHJcbiAgICAgICAga2V5OiAnaWQnLCBmaWVsZE5hbWU6IHRoaXMuZmllbGQuY2FzY2FkZWRCeSwgbGFiZWw6ICcnLFxyXG4gICAgICAgIGZpbHRlclR5cGU6ICdGSUxFRF9GSUxURVInLCBvcGVyYXRvcjogJ0lOJyxcclxuICAgICAgICB2YWx1ZU9iamVjdDogdGhpcy5jYXNjYWRlZElkelxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyUmVxdWVzdC5jb2x1bW5zID0gWydpZCcsJ2NvZGUnLCdlbmdsaXNoTmFtZScsJ2FyYWJpY05hbWUnXTtcclxuICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuZ2V0TG9va3VwSXRlbXNCeU11bHRpRmlsdGVyKGxpc3RJdGVtcywgZmlsdGVyUmVxdWVzdCkuc3Vic2NyaWJlKChyZXNwID0+IHtcclxuICAgICAgaWYgKHJlc3AudmFsaWQpIHtcclxuICAgICAgICB0aGlzLmxvb2t1cEl0ZW1zID0gdGhpcy5maWVsZC5pbmNsdWRlQWxsT3B0aW9uID8gW0FMTF9JVEVNXS5jb25jYXQocmVzcC5ib2R5KSA6IHJlc3AuYm9keTtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5nZXQoJ2lkJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLnBhdGNoTG9va3VwVmFsdWUodGhpcy5sb29rdXBJdGVtcz8uZmluZChsID0+IGwuZGVmYXVsdFZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGF0Y2hMb29rdXBWYWx1ZSh0aGlzLm11bHRpQ29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdGVkKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh2YWx1ZS5pZCAhPT0gLTEgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbmRJbmRleChpID0+IGkuaWQgPT09IHZhbHVlLmlkKSA9PT0gLTEpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zPy5wdXNoKHZhbHVlKTtcclxuICAgICAgdGhpcy5pdGVtSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZS5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIHRoaXMubXVsdGlDb250cm9sLnNldFZhbHVlKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcGxheUZuKHNlbGVjdGVkOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWQuZW5nbGlzaE5hbWUgOiB1bmRlZmluZWQ7XHJcblxyXG4gIH1cclxuICBpc1NlbGVjdGVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcz8uc29tZShzZWxlY3RlZCA9PiBzZWxlY3RlZC5pZCA9PT0gaXRlbS5pZCk7IC8vIFVzZSB5b3VyIHVuaXF1ZSBpZGVudGlmaWVyXHJcbiAgfVxyXG5cclxuICBfYWxsb3dTZWxlY3Rpb24ob3B0aW9uOiBMb29rdXBJdGVtKTogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ3ByZXZlbnQtc2VsZWN0aW9uJzogb3B0aW9uLmlkID09PSAtMSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGl0ZW1OYW1lQnlMYWcoaXRlbTogYW55KTogc3RyaW5nIHtcclxuICAgIC8vIHJldHVybiBpdGVtLmFyYWJpY05hbWU7XHJcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldERlZmF1bHRMYW5nKCkgPT09ICdlbicgPyBpdGVtLmVuZ2xpc2hOYW1lIDogaXRlbS5hcmFiaWNOYW1lXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jb2x1bW5zID0gWydpZCcsJ2NvZGUnLCdlbmdsaXNoTmFtZScsJ2FyYWJpY05hbWUnXTtcclxuXHJcbiAgZmlsdGVyTG9va3VwSXRlbXMobmFtZTogYW55LCB0cmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyKSB7XHJcbiAgICBpZiAodHJpZ2dlcikge1xyXG4gICAgICB0cmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBuYW1lID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGlzdEl0ZW1zOiBHZXRJdGVtc0xpc3QgPSBidWlsZEl0ZW1zTGlzdChuYW1lLCB0aGlzLmZpZWxkLmxvb2t1cEFwaVBhdGgpO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xyXG4gICAgZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gdGhpcy5maWVsZC5sb29rdXBGaWx0ZXJMaXN0IHx8IFtdO1xyXG4gICAgZmlsdGVyUmVxdWVzdC5zZWFyY2hTdHIgPSBuYW1lO1xyXG4gICAgdGhpcy5jYXNjYWRlZElkeiA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuY2FzY2FkZWRCeSkge1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuY2FzY2FkZWRCeSk/LnZhbHVlPy5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FzY2FkZWRJZHoucHVzaChhLmlkKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLmNhc2NhZGVkQnkgJiYgdGhpcy5jYXNjYWRlZElkej8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICBrZXk6ICdpZCcsam9pbk9iamVjdE5hbWU6IHRoaXMuZmllbGQuY2FzY2FkZWRCeSwgZmllbGROYW1lOiB0aGlzLmZpZWxkLmNhc2NhZGVkQnksIGxhYmVsOiAnJyxcclxuICAgICAgICBmaWx0ZXJUeXBlOiAnRklMRURfRklMVEVSJywgb3BlcmF0b3I6ICdJTicsXHJcbiAgICAgICAgdmFsdWVPYmplY3Q6IHRoaXMuY2FzY2FkZWRJZHpcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlclJlcXVlc3QuY29sdW1ucyA9IFsuLi50aGlzLl9jb2x1bW5zLCAuLi4odGhpcy5maWVsZC5leHRyYUxvb2t1cHNDb2x1bW5zID8/IFtdKV07XHJcblxyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRMb29rdXBJdGVtc0J5TXVsdGlGaWx0ZXIobGlzdEl0ZW1zLCBmaWx0ZXJSZXF1ZXN0KS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXN1bHQgLS0+JywgcmVzcCk7XHJcbiAgICAgIGxldCBpdGVtczogTG9va3VwSXRlbVtdID0gW107XHJcbiAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgLy8gcmVzcC5ib2R5LmZvckVhY2gociA9PiBpdGVtcy5wdXNoKHIpKTtcclxuICAgICAgICBpdGVtcyA9IHJlc3AuYm9keS5maWx0ZXIoaXRlbSA9PlxyXG4gICAgICAgICAgLy8gKGl0ZW0uZW5nbGlzaE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgICAgICAvLyBpdGVtLmFyYWJpY05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSAmJlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zPy5maW5kSW5kZXgoIGk9PiBpLmlkID09PWl0ZW0uaWQgKSA9PT0tMSApO1xyXG4gICAgICAgIGlmICghaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5maWVsZC5hY2NlcHROZXdJdGVtID9cclxuICAgICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMiwgZW5nbGlzaE5hbWU6IHRoaXMucXVlc3Rpb24gKyBuYW1lLCBhcmFiaWNOYW1lOiB0aGlzLnF1ZXN0aW9uICsgbmFtZX0pKTpcclxuICAgICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMSwgZW5nbGlzaE5hbWU6ICdObyBtYXRjaCAuLi4nLCBhcmFiaWNOYW1lOiAn2LrZitixINmF2YjYrNmI2K8gIC4uLiAnfSkpIDtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmllbGQuYWNjZXB0TmV3SXRlbSA/XHJcbiAgICAgICAgICBpdGVtcz8ucHVzaChuZXcgTG9va3VwSXRlbSh7aWQ6IC0yLCBlbmdsaXNoTmFtZTogdGhpcy5xdWVzdGlvbiArIG5hbWUsIGFyYWJpY05hbWU6IHRoaXMucXVlc3Rpb24gKyBuYW1lfSkpOlxyXG4gICAgICAgICAgaXRlbXM/LnB1c2gobmV3IExvb2t1cEl0ZW0oe2lkOiAtMSwgZW5nbGlzaE5hbWU6ICdObyBtYXRjaCAuLi4nLCBhcmFiaWNOYW1lOiAn2LrZitixINmF2YjYrNmI2K8gIC4uLiAnfSkpIDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxvb2t1cEl0ZW1zJCA9IG9mKGl0ZW1zKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRjaExvb2t1cFZhbHVlKGRlZmF1bHRWYWx1ZTogYW55KSB7XHJcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgIC8vIHRoaXMuZm9ybT8uZ2V0KHRoaXMuZmllbGQucHJvcGVydHkpPy5wYXRjaFZhbHVlKGRlZmF1bHRWYWx1ZSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRyb2wuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRyb2wucGF0Y2hWYWx1ZShkZWZhdWx0VmFsdWUsIHtlbWl0RXZlbnQ6IHRydWV9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZShpdGVtOiBMb29rdXBJdGVtKSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5wcm9wZXJ0eSkucGF0Y2hWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbXMsIHtlbWl0RXZlbnQ6IHRydWV9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldExhYmVsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuZmllbGQubGFiZWwpO1xyXG4gIH1cclxuICBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGF1dG9jb21wbGV0ZVRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgdGhpcy5maWx0ZXJMb29rdXBJdGVtcygnJywgYXV0b2NvbXBsZXRlVHJpZ2dlcik7XHJcbiAgICAgIGF1dG9jb21wbGV0ZVRyaWdnZXIub3BlblBhbmVsKCk7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldElkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcGVydHk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ0aGlzLmZpZWxkXCIgY2xhc3M9XCJtYWluLW11bHRpLWF1dG9cIj5cclxuICA8ZGl2IGNsYXNzPVwibWF0RmllbGRcIiAoY2xpY2spPVwidGhpcy5maWx0ZXJMb29rdXBJdGVtcygnJywgYXV0b2NvbXBsZXRlVHJpZ2dlcilcIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGZsb2F0TGFiZWw9XCJhbHdheXNcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eyBnZXRMYWJlbCgpIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtY2hpcC1saXN0Ym94ICNjaGlwTGlzdCBbc2VsZWN0YWJsZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgPG1hdC1jaGlwXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zXCJcclxuICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUoaXRlbSlcIj5cclxuICAgICAgICAgIHt7IGl0ZW1OYW1lQnlMYWcoaXRlbSkgfX1cclxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9tYXQtY2hpcD5cclxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJjaGlwLWlucHV0XCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICBbaWRdPVwiZ2V0SWQoKVwiICNpdGVtSW5wdXRcclxuICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm11bHRpQ29udHJvbFwiXHJcbiAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudCwgYXV0b2NvbXBsZXRlVHJpZ2dlcilcIlxyXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAjYXV0b2NvbXBsZXRlVHJpZ2dlcj1cIm1hdEF1dG9jb21wbGV0ZVRyaWdnZXJcIlxyXG4gICAgICAgID5cclxuICAgICAgPC9tYXQtY2hpcC1saXN0Ym94PlxyXG5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYXJyb3dfZHJvcF9kb3duX2F1dG9jb21wbGV0ZVwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCIgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwic2VsZWN0ZWQoJGV2ZW50Lm9wdGlvbi52YWx1ZSlcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLnJlYWRvbmx5XCI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiAgbG9va3VwSXRlbXMkIHwgYXN5bmNcIiBbdmFsdWVdPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucmVhZG9ubHkgfHwgaXNTZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBhdXRvY29tcGxldGVUcmlnZ2VyLm9wZW5QYW5lbCgpXCI+XHJcbiAgICAgICAgICAgIHt7IGl0ZW1OYW1lQnlMYWcoaXRlbSkgfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbiJdfQ==
@@ -0,0 +1,91 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { MatIconModule } from '@angular/material/icon';
3
+ import { MatButtonModule } from '@angular/material/button';
4
+ import { NgIf, NgForOf, NgClass } from '@angular/common';
5
+ import { MatOption, MatSelect } from '@angular/material/select';
6
+ import { TranslateModule } from "@ngx-translate/core";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/cdk/bidi";
9
+ import * as i2 from "@angular/material/icon";
10
+ import * as i3 from "@angular/material/button";
11
+ import * as i4 from "@ngx-translate/core";
12
+ export class PaginatorComponent {
13
+ constructor(directionality) {
14
+ this.directionality = directionality;
15
+ this.currentPage = 1;
16
+ this.totalItems = 0;
17
+ this.pageSize = 10;
18
+ this.pageSizeOptions = [5, 10, 25, 50];
19
+ this.pageChange = new EventEmitter();
20
+ this.pageSizeChange = new EventEmitter();
21
+ this.currentDirection = 'ltr';
22
+ this.Math = Math;
23
+ }
24
+ ngOnInit() {
25
+ this.currentDirection = this.directionality.value;
26
+ this.directionality.change?.subscribe((value) => {
27
+ this.currentDirection = value;
28
+ });
29
+ if (!this.pageSizeOptions.includes(this.pageSize)) {
30
+ Promise.resolve().then(() => {
31
+ this.pageSize = this.pageSizeOptions[1];
32
+ this.pageSizeChange.emit(this.pageSize);
33
+ });
34
+ }
35
+ }
36
+ ngOnChanges() {
37
+ if (this.currentPage > this.totalPages) {
38
+ this.currentPage = this.totalPages || 1;
39
+ }
40
+ }
41
+ get totalPages() {
42
+ return Math.ceil(this.totalItems / this.pageSize);
43
+ }
44
+ get startIndex() {
45
+ return this.totalItems === 0 ? 0 : (this.currentPage - 1) * this.pageSize + 1;
46
+ }
47
+ get endIndex() {
48
+ return Math.min(this.currentPage * this.pageSize, this.totalItems);
49
+ }
50
+ goToPage(page) {
51
+ if (page >= 1 && page <= this.totalPages) {
52
+ this.currentPage = page;
53
+ this.pageChange.emit(this.currentPage);
54
+ }
55
+ }
56
+ nextPage() {
57
+ if (this.currentPage < this.totalPages) {
58
+ this.goToPage(this.currentPage + 1);
59
+ }
60
+ }
61
+ previousPage() {
62
+ if (this.currentPage > 1) {
63
+ this.goToPage(this.currentPage - 1);
64
+ }
65
+ }
66
+ onPageSizeChange(size) {
67
+ this.pageSize = size;
68
+ this.currentPage = 1;
69
+ this.pageSizeChange.emit(this.pageSize);
70
+ this.pageChange.emit(this.currentPage);
71
+ }
72
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginatorComponent, deps: [{ token: i1.Directionality }], target: i0.ɵɵFactoryTarget.Component }); }
73
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PaginatorComponent, isStandalone: true, selector: "app-paginator", inputs: { currentPage: "currentPage", totalItems: "totalItems", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"custom-paginator\" [dir]=\"currentDirection\">\r\n <span class=\"range-label\">\r\n {{ (currentPage - 1) * pageSize + 1 }} -\r\n {{ Math.min(currentPage * pageSize, totalItems) }}\r\n {{'PAGINATION.of' | translate}} {{ totalItems }}\r\n </span>\r\n\r\n <div class=\"right-section\">\r\n <div class=\"rows-per-page\">\r\n {{'PAGINATION.rowsPerPage' | translate}}:\r\n <mat-select [(value)]=\"pageSize\" (selectionChange)=\"onPageSizeChange($event.value)\">\r\n <mat-option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n <div class=\"nav-buttons\">\r\n <button mat-icon-button (click)=\"previousPage()\" [disabled]=\"currentPage === 1\" id=\"paginator-prev-btn\">\r\n <mat-icon>{{ currentDirection === 'rtl' ? 'chevron_right' : 'chevron_left' }}</mat-icon>\r\n </button>\r\n <span><span style=\"color: var(--primary-color)\">{{ currentPage }}</span> / {{ totalPages }}</span>\r\n <button mat-icon-button\r\n (click)=\"nextPage()\"\r\n [disabled]=\"currentPage === totalPages\"\r\n [ngClass]=\"{'active-chevron': currentPage !== totalPages, 'disabled-chevron': currentPage === totalPages}\"\r\n id=\"paginator-next-btn\">\r\n <mat-icon>{{ currentDirection === 'rtl' ? 'chevron_left' : 'chevron_right' }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".custom-paginator{display:flex;justify-content:space-between;align-items:center;padding:4px 8px;border:1px solid #f0f0f0;border-radius:6px;background:#fff;font-size:14px;color:#555!important;gap:16px;margin-top:4px}.custom-paginator .range-label{color:#6b7280;font-size:13px}.custom-paginator .right-section{display:flex;align-items:center;gap:16px}.custom-paginator .right-section .rows-per-page{display:flex;align-items:center;gap:4px}.custom-paginator .right-section .rows-per-page mat-select{width:60px;font-size:13px;color:#555}.custom-paginator .right-section .nav-buttons{display:flex;align-items:center;gap:8px}.custom-paginator .right-section .nav-buttons span{min-width:40px;text-align:center;font-size:13px}.custom-paginator button{border:1px solid #dbdbdb;border-radius:5px!important;width:28px;height:28px;padding:0!important;font-size:18px}.custom-paginator button.active-chevron mat-icon{color:var(--primary-color)}.custom-paginator button.disabled-chevron mat-icon{color:#555}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] }); }
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginatorComponent, decorators: [{
76
+ type: Component,
77
+ args: [{ selector: 'app-paginator', standalone: true, imports: [MatIconModule, MatButtonModule, NgIf, NgForOf, MatSelect, MatOption, NgClass, TranslateModule], template: "<div class=\"custom-paginator\" [dir]=\"currentDirection\">\r\n <span class=\"range-label\">\r\n {{ (currentPage - 1) * pageSize + 1 }} -\r\n {{ Math.min(currentPage * pageSize, totalItems) }}\r\n {{'PAGINATION.of' | translate}} {{ totalItems }}\r\n </span>\r\n\r\n <div class=\"right-section\">\r\n <div class=\"rows-per-page\">\r\n {{'PAGINATION.rowsPerPage' | translate}}:\r\n <mat-select [(value)]=\"pageSize\" (selectionChange)=\"onPageSizeChange($event.value)\">\r\n <mat-option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n <div class=\"nav-buttons\">\r\n <button mat-icon-button (click)=\"previousPage()\" [disabled]=\"currentPage === 1\" id=\"paginator-prev-btn\">\r\n <mat-icon>{{ currentDirection === 'rtl' ? 'chevron_right' : 'chevron_left' }}</mat-icon>\r\n </button>\r\n <span><span style=\"color: var(--primary-color)\">{{ currentPage }}</span> / {{ totalPages }}</span>\r\n <button mat-icon-button\r\n (click)=\"nextPage()\"\r\n [disabled]=\"currentPage === totalPages\"\r\n [ngClass]=\"{'active-chevron': currentPage !== totalPages, 'disabled-chevron': currentPage === totalPages}\"\r\n id=\"paginator-next-btn\">\r\n <mat-icon>{{ currentDirection === 'rtl' ? 'chevron_left' : 'chevron_right' }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".custom-paginator{display:flex;justify-content:space-between;align-items:center;padding:4px 8px;border:1px solid #f0f0f0;border-radius:6px;background:#fff;font-size:14px;color:#555!important;gap:16px;margin-top:4px}.custom-paginator .range-label{color:#6b7280;font-size:13px}.custom-paginator .right-section{display:flex;align-items:center;gap:16px}.custom-paginator .right-section .rows-per-page{display:flex;align-items:center;gap:4px}.custom-paginator .right-section .rows-per-page mat-select{width:60px;font-size:13px;color:#555}.custom-paginator .right-section .nav-buttons{display:flex;align-items:center;gap:8px}.custom-paginator .right-section .nav-buttons span{min-width:40px;text-align:center;font-size:13px}.custom-paginator button{border:1px solid #dbdbdb;border-radius:5px!important;width:28px;height:28px;padding:0!important;font-size:18px}.custom-paginator button.active-chevron mat-icon{color:var(--primary-color)}.custom-paginator button.disabled-chevron mat-icon{color:#555}\n"] }]
78
+ }], ctorParameters: () => [{ type: i1.Directionality }], propDecorators: { currentPage: [{
79
+ type: Input
80
+ }], totalItems: [{
81
+ type: Input
82
+ }], pageSize: [{
83
+ type: Input
84
+ }], pageSizeOptions: [{
85
+ type: Input
86
+ }], pageChange: [{
87
+ type: Output
88
+ }], pageSizeChange: [{
89
+ type: Output
90
+ }] } });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludm9pY2VxL3VpLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdG9yL3BhZ2luYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBU3BELE1BQU0sT0FBTyxrQkFBa0I7SUFXN0IsWUFBb0IsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBVnpDLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2Qsb0JBQWUsR0FBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRTNDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3hDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUs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QzsrR0FwRVUsa0JBQWtCO21HQUFsQixrQkFBa0IsbVNDZi9CLDQ4Q0E4QkEsMmhDRGpCWSxhQUFhLHVTQUFFLGVBQWUsNElBQVEsT0FBTyxtSEFBRSxTQUFTLHdlQUFFLFNBQVMscUpBQUUsT0FBTyxtRkFBRSxlQUFlOzs0RkFFNUYsa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLGVBQWUsY0FHYixJQUFJLFdBQ1AsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDO21GQUcvRixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7TmdJZiwgTmdGb3JPZiwgTmdDbGFzc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XHJcbmltcG9ydCB7IE1hdE9wdGlvbiwgTWF0U2VsZWN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGV9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1wYWdpbmF0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3BhZ2luYXRvci5jb21wb25lbnQuY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTWF0SWNvbk1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBOZ0lmLCBOZ0Zvck9mLCBNYXRTZWxlY3QsIE1hdE9wdGlvbiwgTmdDbGFzcywgVHJhbnNsYXRlTW9kdWxlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2luYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBjdXJyZW50UGFnZSA9IDE7XHJcbiAgQElucHV0KCkgdG90YWxJdGVtcyA9IDA7XHJcbiAgQElucHV0KCkgcGFnZVNpemUgPSAxMDtcclxuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gWzUsIDEwLCAyNSwgNTBdO1xyXG5cclxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICBjdXJyZW50RGlyZWN0aW9uOiAnbHRyJyB8ICdydGwnID0gJ2x0cic7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5KSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY3VycmVudERpcmVjdGlvbiA9IHRoaXMuZGlyZWN0aW9uYWxpdHkudmFsdWU7XHJcbiAgICB0aGlzLmRpcmVjdGlvbmFsaXR5LmNoYW5nZT8uc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXJlY3Rpb24gPSB2YWx1ZTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCF0aGlzLnBhZ2VTaXplT3B0aW9ucy5pbmNsdWRlcyh0aGlzLnBhZ2VTaXplKSkge1xyXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZU9wdGlvbnNbMV07XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMucGFnZVNpemUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLnRvdGFsUGFnZXMpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMudG90YWxQYWdlcyB8fCAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy50b3RhbEl0ZW1zIC8gdGhpcy5wYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhcnRJbmRleCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG90YWxJdGVtcyA9PT0gMCA/IDAgOiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDE7XHJcbiAgfVxyXG5cclxuICBnZXQgZW5kSW5kZXgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSwgdGhpcy50b3RhbEl0ZW1zKTtcclxuICB9XHJcblxyXG4gIGdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgaWYgKHBhZ2UgPj0gMSAmJiBwYWdlIDw9IHRoaXMudG90YWxQYWdlcykge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5jdXJyZW50UGFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZXh0UGFnZSgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlIDwgdGhpcy50b3RhbFBhZ2VzKSB7XHJcbiAgICAgIHRoaXMuZ29Ub1BhZ2UodGhpcy5jdXJyZW50UGFnZSArIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJldmlvdXNQYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPiAxKSB7XHJcbiAgICAgIHRoaXMuZ29Ub1BhZ2UodGhpcy5jdXJyZW50UGFnZSAtIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBzaXplO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy5wYWdlU2l6ZSk7XHJcbiAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLmN1cnJlbnRQYWdlKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSBNYXRoID0gTWF0aDtcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY3VzdG9tLXBhZ2luYXRvclwiIFtkaXJdPVwiY3VycmVudERpcmVjdGlvblwiPlxyXG4gIDxzcGFuIGNsYXNzPVwicmFuZ2UtbGFiZWxcIj5cclxuICAgIHt7IChjdXJyZW50UGFnZSAtIDEpICogcGFnZVNpemUgKyAxIH19IC1cclxuICAgIHt7IE1hdGgubWluKGN1cnJlbnRQYWdlICogcGFnZVNpemUsIHRvdGFsSXRlbXMpIH19XHJcbiAgICB7eydQQUdJTkFUSU9OLm9mJyB8IHRyYW5zbGF0ZX19IHt7IHRvdGFsSXRlbXMgfX1cclxuICA8L3NwYW4+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJyaWdodC1zZWN0aW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93cy1wZXItcGFnZVwiPlxyXG4gICAgICB7eydQQUdJTkFUSU9OLnJvd3NQZXJQYWdlJyB8IHRyYW5zbGF0ZX19OlxyXG4gICAgICA8bWF0LXNlbGVjdCBbKHZhbHVlKV09XCJwYWdlU2l6ZVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQudmFsdWUpXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHNpemUgb2YgcGFnZVNpemVPcHRpb25zXCIgW3ZhbHVlXT1cInNpemVcIj57eyBzaXplIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibmF2LWJ1dHRvbnNcIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInByZXZpb3VzUGFnZSgpXCIgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSAxXCIgaWQ9XCJwYWdpbmF0b3ItcHJldi1idG5cIj5cclxuICAgICAgICA8bWF0LWljb24+e3sgY3VycmVudERpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnY2hldnJvbl9yaWdodCcgOiAnY2hldnJvbl9sZWZ0JyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8c3Bhbj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKVwiPnt7IGN1cnJlbnRQYWdlIH19PC9zcGFuPiAvIHt7IHRvdGFsUGFnZXMgfX08L3NwYW4+XHJcbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm5leHRQYWdlKClcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gdG90YWxQYWdlc1wiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUtY2hldnJvbic6IGN1cnJlbnRQYWdlICE9PSB0b3RhbFBhZ2VzLCAnZGlzYWJsZWQtY2hldnJvbic6IGN1cnJlbnRQYWdlID09PSB0b3RhbFBhZ2VzfVwiXHJcbiAgICAgICAgICAgICAgaWQ9XCJwYWdpbmF0b3ItbmV4dC1idG5cIj5cclxuICAgICAgICA8bWF0LWljb24+e3sgY3VycmVudERpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnY2hldnJvbl9sZWZ0JyA6ICdjaGV2cm9uX3JpZ2h0JyB9fTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -0,0 +1,102 @@
1
+ import { Component, HostListener, Inject } from '@angular/core';
2
+ import { MAT_DIALOG_DATA, MatDialogContent, MatDialogTitle, } from "@angular/material/dialog";
3
+ import { FormsModule } from "@angular/forms";
4
+ import { TranslateModule } from "@ngx-translate/core";
5
+ import { BaseTableComponent } from "../base-table/base-table.component";
6
+ import { MatIconButton } from "@angular/material/button";
7
+ import { MatIcon } from "@angular/material/icon";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/material/dialog";
10
+ import * as i2 from "@ngx-translate/core";
11
+ import * as i3 from "../../services";
12
+ export class ReportDetailsDialogComponent {
13
+ constructor(dialogRef, data, translateService, backendService, elRef) {
14
+ this.dialogRef = dialogRef;
15
+ this.data = data;
16
+ this.translateService = translateService;
17
+ this.backendService = backendService;
18
+ this.elRef = elRef;
19
+ this.dialogDirection = 'ltr';
20
+ this.fields = [];
21
+ this.isTermination = false;
22
+ this.comment = '';
23
+ this.external = false;
24
+ this.signingRequired = false;
25
+ this.tokenReference = "";
26
+ this.warningMsg = false;
27
+ this.item = {};
28
+ dialogRef.disableClose = true;
29
+ }
30
+ onKeyUp() {
31
+ this.dialogRef.close();
32
+ }
33
+ ngOnInit() {
34
+ this.pageInfo = this.data.pageInfo;
35
+ this.pageInfo.hideTitle = true;
36
+ this.item = this.data.item;
37
+ this.pageInfo.hideExtractButton = false;
38
+ this.columns = this.data.columns;
39
+ this.reportRequest = this.data.request;
40
+ this.warningMsg = this.data.warningMsg || false;
41
+ }
42
+ ngAfterViewInit() {
43
+ const container = this.elRef.nativeElement.closest('mat-dialog-container');
44
+ if (container && container.getAttribute('dir')) {
45
+ this.dialogDirection = container.getAttribute('dir');
46
+ }
47
+ }
48
+ cancel() {
49
+ this.reportRequest.filterRequest.filters = [];
50
+ this.backendService.isEmptyItems = false;
51
+ this.dialogRef.close();
52
+ }
53
+ onBackdropClick(event) {
54
+ const target = event.target;
55
+ if (target.classList.contains('cdk-overlay-backdrop')) {
56
+ this.reportRequest.filterRequest.filters = [];
57
+ this.backendService.isEmptyItems = false;
58
+ this.dialogRef.close();
59
+ }
60
+ }
61
+ getTitle() {
62
+ if (this.item?.isec_value_ar) {
63
+ const isecLabel = this.translateService.instant('ISEC');
64
+ return `<strong>${isecLabel} ${this.item.isec_value_ar}</strong>`;
65
+ }
66
+ const sectorLabel = this.translateService.instant('SECTOR');
67
+ const periodLabel = this.translateService.instant('FOR_PERIOD');
68
+ const directorateLabel = this.translateService.instant('DIRECTORATE');
69
+ const sectorText = this.item.sector ? `${sectorLabel} ${this.item.sector}` : '';
70
+ const periodText = this.item.period ? ` ${periodLabel} ${this.item.period}` : '';
71
+ const yearText = this.item.year ? ` - ${this.item.year}` : '';
72
+ const directorateLine = this.item.directorate ? `<br><strong>${directorateLabel} - ${this.item.directorate}</strong>` : '';
73
+ const mainLine = (sectorText || periodText || yearText)
74
+ ? `<strong>${[sectorText, periodText, yearText].filter(Boolean).join('')}</strong>`
75
+ : '';
76
+ return `${mainLine}${directorateLine}`;
77
+ }
78
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReportDetailsDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.TranslateService }, { token: i3.BackendService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
79
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReportDetailsDialogComponent, isStandalone: true, selector: "app-audit-log-details-dialog", host: { listeners: { "window:keyup.esc": "onKeyUp()", "document:click": "onBackdropClick($event)" } }, ngImport: i0, template: "<mat-dialog-content style=\"max-height: 70vh; overflow: auto; position: relative;\">\r\n <button mat-icon-button class=\"close-button\" (click)=\"cancel()\" [attr.dir]=\"dialogDirection\" id=\"report-details-close-btn\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n\r\n <h1 mat-dialog-title [innerHTML]=\"getTitle()\"></h1>\r\n\r\n <app-base-table\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n id=\"junior\"\r\n [enforceRefresh]=\"true\"\r\n [reportRequest]=\"reportRequest\">\r\n </app-base-table>\r\n</mat-dialog-content>\r\n\r\n", styles: ["::ng-deep .mat-dialog-actions{justify-content:flex-end!important}.close-button{position:absolute;right:8px;top:8px;z-index:10;background-color:#fff;border-radius:50%}:host-context([dir=\"rtl\"]) .close-button{right:auto;left:8px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: BaseTableComponent, selector: "app-base-table", inputs: ["filterFields", "noDataFoundIcon", "noDataFoundTitle", "noDataFoundSubtitle", "pageInfo", "enablePagination", "data", "listAction", "columns", "filters", "pathParam", "extraButton", "enforceRefresh", "isPending", "trigger", "reportRequest", "separateEndpointData", "manageablePages", "totalPagesCount", "currentPageIndex", "customizedData"], outputs: ["pageChange", "userAction", "hyperLinkAction", "extraAction", "selectedColumn", "listActionClicked", "showDialog", "clickRoutePage"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
80
+ }
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReportDetailsDialogComponent, decorators: [{
82
+ type: Component,
83
+ args: [{ selector: 'app-audit-log-details-dialog', standalone: true, imports: [
84
+ FormsModule,
85
+ TranslateModule,
86
+ BaseTableComponent,
87
+ MatDialogContent,
88
+ MatDialogTitle,
89
+ MatIconButton,
90
+ MatIcon
91
+ ], template: "<mat-dialog-content style=\"max-height: 70vh; overflow: auto; position: relative;\">\r\n <button mat-icon-button class=\"close-button\" (click)=\"cancel()\" [attr.dir]=\"dialogDirection\" id=\"report-details-close-btn\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n\r\n <h1 mat-dialog-title [innerHTML]=\"getTitle()\"></h1>\r\n\r\n <app-base-table\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n id=\"junior\"\r\n [enforceRefresh]=\"true\"\r\n [reportRequest]=\"reportRequest\">\r\n </app-base-table>\r\n</mat-dialog-content>\r\n\r\n", styles: ["::ng-deep .mat-dialog-actions{justify-content:flex-end!important}.close-button{position:absolute;right:8px;top:8px;z-index:10;background-color:#fff;border-radius:50%}:host-context([dir=\"rtl\"]) .close-button{right:auto;left:8px}\n"] }]
92
+ }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
93
+ type: Inject,
94
+ args: [MAT_DIALOG_DATA]
95
+ }] }, { type: i2.TranslateService }, { type: i3.BackendService }, { type: i0.ElementRef }], propDecorators: { onKeyUp: [{
96
+ type: HostListener,
97
+ args: ['window:keyup.esc']
98
+ }], onBackdropClick: [{
99
+ type: HostListener,
100
+ args: ['document:click', ['$event']]
101
+ }] } });
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWRldGFpbHMtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludm9pY2VxL3VpLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvcmVwb3J0LWRldGFpbHMtZGlhbG9nL3JlcG9ydC1kZXRhaWxzLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3JlcG9ydC1kZXRhaWxzLWRpYWxvZy9yZXBvcnQtZGV0YWlscy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQ0wsZUFBZSxFQUFvQixnQkFBZ0IsRUFDckMsY0FBYyxHQUM3QixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBRXRFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBWSxhQUFhLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0FBaUIvQyxNQUFNLE9BQU8sNEJBQTRCO0lBZXZDLFlBQW1CLFNBQXFELEVBQzVCLElBQVMsRUFDakMsZ0JBQWtDLEVBQ25DLGNBQTZCLEVBQzVCLEtBQWlCO1FBSmxCLGNBQVMsR0FBVCxTQUFTLENBQTRDO1FBQzVCLFNBQUksR0FBSixJQUFJLENBQUs7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNuQyxtQkFBYyxHQUFk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QUFXLDhCQUNYLGVBQWUsK0JBQ2Ysa0JBQWtCLDBpQkFDbEIsZ0JBQWdCLHlHQUNoQixjQUFjLCtIQUNkLGFBQWEsNkZBQ2IsT0FBTzs7NEZBS0UsNEJBQTRCO2tCQWZ4QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsT0FBTztxQkFDUjs7MEJBb0JZLE1BQU07MkJBQUMsZUFBZTs4SEFNRCxPQUFPO3NCQUF4QyxZQUFZO3VCQUFDLGtCQUFrQjtnQkEyQmhDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0NvbnRlbnQsXHJcbiAgTWF0RGlhbG9nUmVmLCBNYXREaWFsb2dUaXRsZSxcclxufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHtGaWVsZEluZm8sIFBhZ2VJbmZvLCBSZXBvcnRSZXF1ZXN0LCBUYWJsZUNvbHVtbn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtCYXNlVGFibGVDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLXRhYmxlL2Jhc2UtdGFibGUuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0QnV0dG9uLCBNYXRJY29uQnV0dG9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7QmFja2VuZFNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlc1wiO1xyXG5pbXBvcnQge01hdEljb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1hdWRpdC1sb2ctZGV0YWlscy1kaWFsb2cnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBCYXNlVGFibGVDb21wb25lbnQsXHJcbiAgICBNYXREaWFsb2dDb250ZW50LFxyXG4gICAgTWF0RGlhbG9nVGl0bGUsXHJcbiAgICBNYXRJY29uQnV0dG9uLFxyXG4gICAgTWF0SWNvblxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1kZXRhaWxzLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3JlcG9ydC1kZXRhaWxzLWRpYWxvZy5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwb3J0RGV0YWlsc0RpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCAsIEFmdGVyVmlld0luaXR7XHJcbiAgZGlhbG9nRGlyZWN0aW9uOiAnbHRyJyB8ICdydGwnID0gJ2x0cic7XHJcblxyXG4gIHBhZ2VJbmZvOiBQYWdlSW5mbztcclxuICBmaWVsZHM6IEZpZWxkSW5mb1tdID0gW107XHJcblxyXG4gIGlzVGVybWluYXRpb24gOiBib29sZWFuPWZhbHNlO1xyXG4gIGNvbW1lbnQ6IHN0cmluZyA9ICcnO1xyXG4gIGV4dGVybmFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2lnbmluZ1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdG9rZW5SZWZlcmVuY2U6IHN0cmluZyA9IFwiXCI7XHJcbiAgd2FybmluZ01zZyA9IGZhbHNlO1xyXG4gIGl0ZW06IGFueSA9IHt9O1xyXG4gIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3Q7XHJcbiAgY29sdW1uczogVGFibGVDb2x1bW48YW55PltdO1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxSZXBvcnREZXRhaWxzRGlhbG9nQ29tcG9uZW50PixcclxuICAgICAgICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHVibGljIGJhY2tlbmRTZXJ2aWNlOkJhY2tlbmRTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgIGRpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAuZXNjJykgb25LZXlVcCgpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlSW5mbyA9IHRoaXMuZGF0YS5wYWdlSW5mbztcclxuICAgIHRoaXMucGFnZUluZm8uaGlkZVRpdGxlID0gdHJ1ZTtcclxuICAgIHRoaXMuaXRlbSA9IHRoaXMuZGF0YS5pdGVtO1xyXG4gICAgdGhpcy5wYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kYXRhLmNvbHVtbnM7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QgPSB0aGlzLmRhdGEucmVxdWVzdDtcclxuICAgIHRoaXMud2FybmluZ01zZyA9IHRoaXMuZGF0YS53YXJuaW5nTXNnIHx8IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnbWF0LWRpYWxvZy1jb250YWluZXInKTtcclxuICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGlyJykpIHtcclxuICAgICAgdGhpcy5kaWFsb2dEaXJlY3Rpb24gPSBjb250YWluZXIuZ2V0QXR0cmlidXRlKCdkaXInKSBhcyAnbHRyJyB8ICdydGwnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtdO1xyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgPSBmYWxzZTtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25CYWNrZHJvcENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnY2RrLW92ZXJsYXktYmFja2Ryb3AnKSkge1xyXG4gICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gW107XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuaXNFbXB0eUl0ZW1zID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUaXRsZSgpIHtcclxuICAgIGlmICh0aGlzLml0ZW0/LmlzZWNfdmFsdWVfYXIpIHtcclxuICAgICAgY29uc3QgaXNlY0xhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0lTRUMnKTtcclxuICAgICAgcmV0dXJuIGA8c3Ryb25nPiR7aXNlY0xhYmVsfSAke3RoaXMuaXRlbS5pc2VjX3ZhbHVlX2FyfTwvc3Ryb25nPmA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VjdG9yTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnU0VDVE9SJyk7XHJcbiAgICBjb25zdCBwZXJpb2RMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdGT1JfUEVSSU9EJyk7XHJcbiAgICBjb25zdCBkaXJlY3RvcmF0ZUxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0RJUkVDVE9SQVRFJyk7XHJcblxyXG4gICAgY29uc3Qgc2VjdG9yVGV4dCA9IHRoaXMuaXRlbS5zZWN0b3IgPyBgJHtzZWN0b3JMYWJlbH0gJHt0aGlzLml0ZW0uc2VjdG9yfWAgOiAnJztcclxuICAgIGNvbnN0IHBlcmlvZFRleHQgPSB0aGlzLml0ZW0ucGVyaW9kID8gYCAke3BlcmlvZExhYmVsfSAke3RoaXMuaXRlbS5wZXJpb2R9YCA6ICcnO1xyXG4gICAgY29uc3QgeWVhclRleHQgPSB0aGlzLml0ZW0ueWVhciA/IGAgLSAke3RoaXMuaXRlbS55ZWFyfWAgOiAnJztcclxuICAgIGNvbnN0IGRpcmVjdG9yYXRlTGluZSA9IHRoaXMuaXRlbS5kaXJlY3RvcmF0ZSA/IGA8YnI+PHN0cm9uZz4ke2RpcmVjdG9yYXRlTGFiZWx9IC0gJHt0aGlzLml0ZW0uZGlyZWN0b3JhdGV9PC9zdHJvbmc+YCA6ICcnO1xyXG5cclxuICAgIGNvbnN0IG1haW5MaW5lID0gKHNlY3RvclRleHQgfHwgcGVyaW9kVGV4dCB8fCB5ZWFyVGV4dClcclxuICAgICAgPyBgPHN0cm9uZz4ke1tzZWN0b3JUZXh0LCBwZXJpb2RUZXh0LCB5ZWFyVGV4dF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJycpfTwvc3Ryb25nPmBcclxuICAgICAgOiAnJztcclxuXHJcbiAgICByZXR1cm4gYCR7bWFpbkxpbmV9JHtkaXJlY3RvcmF0ZUxpbmV9YDtcclxuICB9XHJcblxyXG5cclxuXHJcbn1cclxuIiwiPG1hdC1kaWFsb2ctY29udGVudCBzdHlsZT1cIm1heC1oZWlnaHQ6IDcwdmg7IG92ZXJmbG93OiBhdXRvOyBwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiAoY2xpY2spPVwiY2FuY2VsKClcIiBbYXR0ci5kaXJdPVwiZGlhbG9nRGlyZWN0aW9uXCIgaWQ9XCJyZXBvcnQtZGV0YWlscy1jbG9zZS1idG5cIj5cclxuICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcblxyXG4gICAgPGgxIG1hdC1kaWFsb2ctdGl0bGUgW2lubmVySFRNTF09XCJnZXRUaXRsZSgpXCI+PC9oMT5cclxuXHJcbiAgICA8YXBwLWJhc2UtdGFibGVcclxuICAgICAgICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcclxuICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgIGlkPVwianVuaW9yXCJcclxuICAgICAgICAgICAgW2VuZm9yY2VSZWZyZXNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbcmVwb3J0UmVxdWVzdF09XCJyZXBvcnRSZXF1ZXN0XCI+XHJcbiAgICA8L2FwcC1iYXNlLXRhYmxlPlxyXG48L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcbiJdfQ==