@annalib/anna-core 0.0.7 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +6 -6
  2. package/esm2020/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +35 -0
  3. package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +6 -6
  4. package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +6 -6
  5. package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +6 -6
  6. package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +4 -4
  7. package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +6 -6
  8. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +3 -2
  9. package/esm2020/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +281 -0
  10. package/esm2020/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +27 -0
  11. package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
  12. package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
  13. package/esm2020/lib/anna-core-shared-lib/models/anna-manage-users.model.mjs +8 -0
  14. package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +11 -3
  15. package/esm2020/lib/anna-core-shared-lib/models/anna-sort.model.mjs +7 -0
  16. package/esm2020/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +9 -5
  17. package/esm2020/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +26 -0
  18. package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +23 -8
  19. package/esm2020/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +25 -0
  20. package/esm2020/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +16 -0
  21. package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +52 -34
  22. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +238 -281
  23. package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +98 -15
  24. package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +4 -5
  25. package/esm2020/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +41 -0
  26. package/esm2020/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +60 -0
  27. package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +91 -125
  28. package/esm2020/lib/anna-core.module.mjs +178 -0
  29. package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +38 -13
  30. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +27 -23
  31. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +1419 -499
  32. package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +46 -107
  33. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +7 -7
  34. package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +5 -5
  35. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +3 -3
  36. package/esm2020/public-api.mjs +48 -4
  37. package/fesm2015/annalib-anna-core.mjs +4498 -3079
  38. package/fesm2015/annalib-anna-core.mjs.map +1 -1
  39. package/fesm2020/annalib-anna-core.mjs +4694 -3279
  40. package/fesm2020/annalib-anna-core.mjs.map +1 -1
  41. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +1 -1
  42. package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +16 -0
  43. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +1 -1
  44. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +1 -1
  45. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +1 -1
  46. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +1 -1
  47. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +1 -1
  48. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +2 -1
  49. package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -0
  50. package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +9 -0
  51. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +8 -0
  52. package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +1 -0
  53. package/lib/anna-core-shared-lib/models/anna-manage-users.model.d.ts +6 -0
  54. package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +52 -10
  55. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -0
  56. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +8 -4
  57. package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -0
  58. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +1 -1
  59. package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -0
  60. package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -0
  61. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +2 -0
  62. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +26 -20
  63. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +21 -5
  64. package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +7 -0
  65. package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +8 -0
  66. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +7 -14
  67. package/lib/anna-core.module.d.ts +36 -0
  68. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +12 -7
  69. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +5 -2
  70. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +165 -40
  71. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +12 -22
  72. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +3 -3
  73. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +1 -1
  74. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +1 -1
  75. package/package.json +11 -34
  76. package/public-api.d.ts +35 -3
  77. package/src/lib/anna-assets/images/bg-heads.png +0 -0
  78. package/src/lib/anna-common-scss/_animate.scss +27 -0
  79. package/src/lib/anna-common-scss/_application-spacing.scss +6 -0
  80. package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +25 -0
  81. package/src/lib/anna-common-scss/_colors.scss +107 -0
  82. package/src/lib/anna-common-scss/_customDropdown.scss +129 -0
  83. package/src/lib/anna-common-scss/_dashboard-partials.scss +104 -0
  84. package/src/lib/anna-common-scss/_date-picker-form.scss +87 -0
  85. package/src/lib/anna-common-scss/_filters.scss +641 -0
  86. package/src/lib/anna-common-scss/_font.scss +10 -0
  87. package/src/lib/anna-common-scss/_fonts.scss +86 -0
  88. package/src/lib/anna-common-scss/_generic-table-common.scss +112 -0
  89. package/src/lib/anna-common-scss/_legend.scss +11 -0
  90. package/src/lib/anna-common-scss/_mixins.scss +188 -0
  91. package/src/lib/anna-common-scss/_modal.scss +37 -0
  92. package/src/lib/anna-common-scss/_ng-select.scss +176 -0
  93. package/src/lib/anna-common-scss/_sort.scss +30 -0
  94. package/src/lib/anna-common-scss/_toggle.scss +84 -0
  95. package/src/lib/anna-common-scss/style.scss +1 -0
  96. package/esm2020/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +0 -59
  97. package/esm2020/lib/anna-core-shared-lib/index.mjs +0 -2
  98. package/esm2020/lib/anna-core-shared-lib/public-api.mjs +0 -25
  99. package/esm2020/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +0 -43
  100. package/esm2020/lib/anna-dropdown-lib/index.mjs +0 -2
  101. package/esm2020/lib/anna-dropdown-lib/public-api.mjs +0 -6
  102. package/esm2020/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +0 -86
  103. package/esm2020/lib/anna-generic-table-lib/index.mjs +0 -2
  104. package/esm2020/lib/anna-generic-table-lib/public-api.mjs +0 -10
  105. package/esm2020/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.mjs +0 -59
  106. package/esm2020/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -5
  107. package/esm2020/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -15
  108. package/esm2020/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -15
  109. package/esm2020/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
  110. package/esm2020/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -15
  111. package/esm2020/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -21
  112. package/esm2020/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -15
  113. package/esm2020/src/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -34
  114. package/esm2020/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +0 -2
  115. package/esm2020/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +0 -2
  116. package/esm2020/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +0 -3
  117. package/esm2020/src/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +0 -26
  118. package/esm2020/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +0 -31
  119. package/esm2020/src/lib/anna-core-shared-lib/public-api.mjs +0 -25
  120. package/esm2020/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +0 -180
  121. package/esm2020/src/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -536
  122. package/esm2020/src/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +0 -52
  123. package/esm2020/src/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +0 -133
  124. package/esm2020/src/lib/anna-core-shared-lib/services/anna-sort.service.mjs +0 -185
  125. package/esm2020/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.mjs +0 -43
  126. package/esm2020/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -5
  127. package/esm2020/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -76
  128. package/esm2020/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -360
  129. package/esm2020/src/lib/anna-dropdown-lib/public-api.mjs +0 -6
  130. package/esm2020/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.mjs +0 -86
  131. package/esm2020/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -5
  132. package/esm2020/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -997
  133. package/esm2020/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -125
  134. package/esm2020/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
  135. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +0 -189
  136. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +0 -2
  137. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
  138. package/esm2020/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +0 -2
  139. package/esm2020/src/lib/anna-generic-table-lib/public-api.mjs +0 -10
  140. package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -1294
  141. package/fesm2015/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +0 -1
  142. package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -474
  143. package/fesm2015/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +0 -1
  144. package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -1895
  145. package/fesm2015/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +0 -1
  146. package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs +0 -1294
  147. package/fesm2020/annalib-anna-core-src-lib-anna-core-shared-lib.mjs.map +0 -1
  148. package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs +0 -472
  149. package/fesm2020/annalib-anna-core-src-lib-anna-dropdown-lib.mjs.map +0 -1
  150. package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs +0 -1894
  151. package/fesm2020/annalib-anna-core-src-lib-anna-generic-table-lib.mjs.map +0 -1
  152. package/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +0 -14
  153. package/lib/anna-core-shared-lib/index.d.ts +0 -1
  154. package/lib/anna-core-shared-lib/public-api.d.ts +0 -18
  155. package/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +0 -11
  156. package/lib/anna-dropdown-lib/index.d.ts +0 -1
  157. package/lib/anna-dropdown-lib/public-api.d.ts +0 -3
  158. package/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +0 -21
  159. package/lib/anna-generic-table-lib/index.d.ts +0 -1
  160. package/lib/anna-generic-table-lib/public-api.d.ts +0 -6
  161. package/src/lib/anna-core-shared-lib/anna-core-shared-lib.module.d.ts +0 -14
  162. package/src/lib/anna-core-shared-lib/annalib-anna-core-src-lib-anna-core-shared-lib.d.ts +0 -5
  163. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +0 -8
  164. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +0 -8
  165. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +0 -11
  166. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +0 -8
  167. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +0 -11
  168. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +0 -8
  169. package/src/lib/anna-core-shared-lib/constants/shared.constant.d.ts +0 -32
  170. package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +0 -8
  171. package/src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +0 -95
  172. package/src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +0 -70
  173. package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +0 -21
  174. package/src/lib/anna-core-shared-lib/package.json +0 -10
  175. package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +0 -9
  176. package/src/lib/anna-core-shared-lib/public-api.d.ts +0 -18
  177. package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +0 -25
  178. package/src/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +0 -68
  179. package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +0 -14
  180. package/src/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +0 -21
  181. package/src/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +0 -23
  182. package/src/lib/anna-dropdown-lib/anna-dropdown-lib.module.d.ts +0 -11
  183. package/src/lib/anna-dropdown-lib/annalib-anna-core-src-lib-anna-dropdown-lib.d.ts +0 -5
  184. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +0 -29
  185. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +0 -67
  186. package/src/lib/anna-dropdown-lib/package.json +0 -10
  187. package/src/lib/anna-dropdown-lib/public-api.d.ts +0 -3
  188. package/src/lib/anna-generic-table-lib/anna-generic-table-lib.module.d.ts +0 -21
  189. package/src/lib/anna-generic-table-lib/annalib-anna-core-src-lib-anna-generic-table-lib.d.ts +0 -5
  190. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +0 -173
  191. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +0 -27
  192. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +0 -141
  193. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +0 -89
  194. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +0 -1
  195. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +0 -45
  196. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +0 -1
  197. package/src/lib/anna-generic-table-lib/package.json +0 -10
  198. package/src/lib/anna-generic-table-lib/public-api.d.ts +0 -6
  199. /package/{annalib-anna-core.d.ts → index.d.ts} +0 -0
@@ -1,125 +0,0 @@
1
- // Angular import statements
2
- import { Component, EventEmitter, Input, Output } from '@angular/core';
3
- // Third party import statements
4
- import { cloneDeep } from "lodash-es";
5
- // User defined import statements
6
- //sub-entries of anna lib import statement
7
- import { AnnaSortService } from "@annalib/anna-core/src/lib/anna-core-shared-lib";
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@annalib/anna-core/src/lib/anna-core-shared-lib";
10
- import * as i2 from "@angular/common";
11
- import * as i3 from "@ng-bootstrap/ng-bootstrap";
12
- import * as i4 from "@angular/forms";
13
- ;
14
- export class AnnaSortComponent {
15
- constructor(annaSortService) {
16
- this.annaSortService = annaSortService;
17
- this.firstSortApplied = false;
18
- this.sortedData = new EventEmitter();
19
- }
20
- ngOnChanges(changes) {
21
- if (!this.firstSortApplied && changes['data'] && changes['data'].currentValue) {
22
- this.clonedData = cloneDeep(this.data);
23
- }
24
- }
25
- isFirstTimeSorting() {
26
- this.firstSortApplied = true;
27
- this.clonedData = cloneDeep(this.data);
28
- }
29
- sortByAscending() {
30
- if (!this.firstSortApplied) {
31
- this.isFirstTimeSorting();
32
- }
33
- const isAsc = true;
34
- if (this.sortBy === "dates") {
35
- this.sortBy = "startDate";
36
- }
37
- this.setAscState();
38
- this.setDescState();
39
- this.annaSortService.sortByAsc.set(this.sortBy, true);
40
- this.annaSortService.isAsc = true;
41
- this.annaSortService.keySorted = this.sortBy;
42
- this.sortedData.emit(this.annaSortService.sort(isAsc, this.data, this.sortBy));
43
- this.closeTooltip();
44
- }
45
- sortByDescending() {
46
- if (!this.firstSortApplied) {
47
- this.isFirstTimeSorting();
48
- }
49
- const isAsc = false;
50
- if (this.sortBy === "dates") {
51
- this.sortBy = "endDate";
52
- }
53
- this.setDescState();
54
- this.setAscState();
55
- this.annaSortService.sortByDesc.set(this.sortBy, true);
56
- this.annaSortService.isAsc = false;
57
- this.annaSortService.keySorted = this.sortBy;
58
- this.sortedData.emit(this.annaSortService.sort(isAsc, this.data, this.sortBy));
59
- this.closeTooltip();
60
- }
61
- setAscState() {
62
- this.annaSortService.sortByAsc.forEach((value, key) => {
63
- this.annaSortService.sortByAsc.set(key, false);
64
- });
65
- }
66
- setDescState() {
67
- this.annaSortService.sortByDesc.forEach((value, key) => {
68
- this.annaSortService.sortByDesc.set(key, false);
69
- });
70
- }
71
- removeSorting() {
72
- this.firstSortApplied = false;
73
- this.annaSortService.sortByAsc = new Map();
74
- this.annaSortService.sortByDesc = new Map();
75
- this.sortedData.emit({ data: this.clonedData, type: "none" });
76
- this.closeTooltip();
77
- }
78
- bindTheValueToToolTip(tooltip) {
79
- if (this.annaSortService.tooltip == tooltip) {
80
- this.closeTooltip();
81
- }
82
- else {
83
- this.closeTooltip();
84
- this.annaSortService.tooltip = tooltip;
85
- this.annaSortService.tooltip.open();
86
- this.selectRadioButton();
87
- }
88
- }
89
- selectRadioButton() {
90
- if (this.annaSortService.sortByAsc.has(this.sortBy) && this.annaSortService.sortByAsc.get(this.sortBy)) {
91
- this.selectedRadio = "ascending";
92
- }
93
- else if (this.annaSortService.sortByDesc.has(this.sortBy) && this.annaSortService.sortByDesc.get(this.sortBy)) {
94
- this.selectedRadio = "descending";
95
- }
96
- else {
97
- this.selectedRadio = "none";
98
- }
99
- }
100
- closeTooltip() {
101
- if (this.annaSortService.tooltip && this.annaSortService.tooltip.isOpen()) {
102
- this.annaSortService.tooltip.close();
103
- }
104
- this.annaSortService.tooltip = null;
105
- }
106
- }
107
- AnnaSortComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaSortComponent, deps: [{ token: i1.AnnaSortService }], target: i0.ɵɵFactoryTarget.Component });
108
- AnnaSortComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AnnaSortComponent, selector: "anna-core-sort-lib", inputs: { data: "data", sortBy: "sortBy", disableSort: "disableSort", placement: "placement" }, outputs: { sortedData: "sort" }, usesOnChanges: true, ngImport: i0, template: "<p class=\"sort\">\r\n <i\r\n class=\"mdi mdi-sort\"\r\n [ngClass]=\"{\r\n active: this.annaSortService.sortByDesc.get(this.sortBy) || this.annaSortService.sortByAsc.get(this.sortBy),\r\n disable: disableSort\r\n }\"\r\n [ngbTooltip]=\"sortTooltip\"\r\n placement=\"{{ placement != undefined ? 'auto' : 'bottom' }}\"\r\n container=\"body\"\r\n [autoClose]=\"true\"\r\n triggers=\"manual\"\r\n #sort=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(sort)\"\r\n ></i>\r\n</p>\r\n\r\n<ng-template #sortTooltip>\r\n <section class=\"sort-container\">\r\n <div>\r\n <input\r\n type=\"radio\"\r\n id=\"ascending\"\r\n [ngModel]=\"selectedRadio\"\r\n name=\"sortToolTip\"\r\n value=\"ascending\"\r\n (click)=\"sortByAscending()\"\r\n />\r\n <label for=\"ascending\">Ascending</label>\r\n </div>\r\n <div>\r\n <input\r\n type=\"radio\"\r\n id=\"descending\"\r\n [ngModel]=\"selectedRadio\"\r\n name=\"sortToolTip\"\r\n value=\"descending\"\r\n (click)=\"sortByDescending()\"\r\n />\r\n <label for=\"descending\">Descending</label>\r\n </div>\r\n <div>\r\n <input type=\"radio\" id=\"none\" [ngModel]=\"selectedRadio\" name=\"sortToolTip\" value=\"none\" (click)=\"removeSorting()\" />\r\n <label for=\"none\">None</label>\r\n </div>\r\n </section>\r\n</ng-template>\r\n", styles: [".sort{display:inline-block;margin:0!important;position:relative;top:1px}.mdi-sort{padding-top:5px;padding-bottom:2.5px;line-height:0;font-size:1rem;cursor:pointer;color:#000;opacity:.24}.mdi-sort.active{opacity:1}.mdi-sort-descending{padding-top:2.5px;padding-bottom:5px;line-height:0;font-size:1rem;cursor:pointer;color:#000;opacity:.24}.mdi-sort-descending.active{opacity:1}.disable{cursor:not-allowed;pointer-events:none;opacity:.17}.sort-container{color:#000;padding:.25rem;text-align:left}.sort-container input{position:relative;top:.125rem;margin-right:.188rem}.sort-container input:hover,.sort-container label:hover{cursor:pointer}.sort-container div:last-of-type{line-height:.2}input[type=radio]{-webkit-appearance:none;appearance:none;display:inline-block;width:.9375rem;height:.9375rem;padding:.125rem;background-clip:content-box;border:.125rem solid #268bff;background-color:transparent;border-radius:50%}input[type=radio]:checked{background-color:#268bff}input[type=radio]:focus{outline-offset:-10px}\n"], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
109
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaSortComponent, decorators: [{
110
- type: Component,
111
- args: [{ selector: "anna-core-sort-lib", template: "<p class=\"sort\">\r\n <i\r\n class=\"mdi mdi-sort\"\r\n [ngClass]=\"{\r\n active: this.annaSortService.sortByDesc.get(this.sortBy) || this.annaSortService.sortByAsc.get(this.sortBy),\r\n disable: disableSort\r\n }\"\r\n [ngbTooltip]=\"sortTooltip\"\r\n placement=\"{{ placement != undefined ? 'auto' : 'bottom' }}\"\r\n container=\"body\"\r\n [autoClose]=\"true\"\r\n triggers=\"manual\"\r\n #sort=\"ngbTooltip\"\r\n (click)=\"bindTheValueToToolTip(sort)\"\r\n ></i>\r\n</p>\r\n\r\n<ng-template #sortTooltip>\r\n <section class=\"sort-container\">\r\n <div>\r\n <input\r\n type=\"radio\"\r\n id=\"ascending\"\r\n [ngModel]=\"selectedRadio\"\r\n name=\"sortToolTip\"\r\n value=\"ascending\"\r\n (click)=\"sortByAscending()\"\r\n />\r\n <label for=\"ascending\">Ascending</label>\r\n </div>\r\n <div>\r\n <input\r\n type=\"radio\"\r\n id=\"descending\"\r\n [ngModel]=\"selectedRadio\"\r\n name=\"sortToolTip\"\r\n value=\"descending\"\r\n (click)=\"sortByDescending()\"\r\n />\r\n <label for=\"descending\">Descending</label>\r\n </div>\r\n <div>\r\n <input type=\"radio\" id=\"none\" [ngModel]=\"selectedRadio\" name=\"sortToolTip\" value=\"none\" (click)=\"removeSorting()\" />\r\n <label for=\"none\">None</label>\r\n </div>\r\n </section>\r\n</ng-template>\r\n", styles: [".sort{display:inline-block;margin:0!important;position:relative;top:1px}.mdi-sort{padding-top:5px;padding-bottom:2.5px;line-height:0;font-size:1rem;cursor:pointer;color:#000;opacity:.24}.mdi-sort.active{opacity:1}.mdi-sort-descending{padding-top:2.5px;padding-bottom:5px;line-height:0;font-size:1rem;cursor:pointer;color:#000;opacity:.24}.mdi-sort-descending.active{opacity:1}.disable{cursor:not-allowed;pointer-events:none;opacity:.17}.sort-container{color:#000;padding:.25rem;text-align:left}.sort-container input{position:relative;top:.125rem;margin-right:.188rem}.sort-container input:hover,.sort-container label:hover{cursor:pointer}.sort-container div:last-of-type{line-height:.2}input[type=radio]{-webkit-appearance:none;appearance:none;display:inline-block;width:.9375rem;height:.9375rem;padding:.125rem;background-clip:content-box;border:.125rem solid #268bff;background-color:transparent;border-radius:50%}input[type=radio]:checked{background-color:#268bff}input[type=radio]:focus{outline-offset:-10px}\n"] }]
112
- }], ctorParameters: function () { return [{ type: i1.AnnaSortService }]; }, propDecorators: { data: [{
113
- type: Input
114
- }], sortBy: [{
115
- type: Input
116
- }], disableSort: [{
117
- type: Input
118
- }], placement: [{
119
- type: Input,
120
- args: ["placement"]
121
- }], sortedData: [{
122
- type: Output,
123
- args: ["sort"]
124
- }] } });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1zb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUV0RixnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxpQ0FBaUM7QUFFakMsMENBQTBDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7Ozs7O0FBQUEsQ0FBQztBQVNuRixNQUFNLE9BQU8saUJBQWlCO0lBVTFCLFlBQW1CLGVBQWdDO1FBQWhDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUhuRCxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFTSxDQUFDO0lBRXZELFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFDO1lBQzNFLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QztJQUNMLENBQUM7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QUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1NBQy9CO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDUixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3ZFLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLENBQUM7OzhHQTFHUSxpQkFBaUI7a0dBQWpCLGlCQUFpQixnTkNsQjlCLCtvREErQ0E7MkZEN0JhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDSSxvQkFBb0I7c0dBS3JCLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDYyxTQUFTO3NCQUE1QixLQUFLO3VCQUFDLFdBQVc7Z0JBSUYsVUFBVTtzQkFBekIsTUFBTTt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5cclxuLy8gVXNlciBkZWZpbmVkIGltcG9ydCBzdGF0ZW1lbnRzXHJcblxyXG4vL3N1Yi1lbnRyaWVzIG9mIGFubmEgbGliIGltcG9ydCBzdGF0ZW1lbnRcclxuaW1wb3J0IHsgQW5uYVNvcnRTZXJ2aWNlIH0gZnJvbSBcIkBhbm5hbGliL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliXCI7O1xyXG5cclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBcImFubmEtY29yZS1zb3J0LWxpYlwiLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9hbm5hLXNvcnQuY29tcG9uZW50Lmh0bWxcIixcclxuICAgIHN0eWxlVXJsczogW1wiLi9hbm5hLXNvcnQuY29tcG9uZW50LnNjc3NcIl1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFTb3J0Q29tcG9uZW50IHtcclxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcclxuICAgIEBJbnB1dCgpIHNvcnRCeTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgZGlzYWJsZVNvcnQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoXCJwbGFjZW1lbnRcIikgcGxhY2VtZW50OiBzdHJpbmc7XHJcbiAgICBzZWxlY3RlZFJhZGlvOiBzdHJpbmc7XHJcbiAgICBjbG9uZWREYXRhOiBhbnlbXTtcclxuICAgIGZpcnN0U29ydEFwcGxpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBPdXRwdXQoXCJzb3J0XCIpIHNvcnRlZERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlKSB7fVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBpZighdGhpcy5maXJzdFNvcnRBcHBsaWVkICYmIGNoYW5nZXNbJ2RhdGEnXSAmJiBjaGFuZ2VzWydkYXRhJ10uY3VycmVudFZhbHVlKXtcclxuICAgICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9IGNsb25lRGVlcCh0aGlzLmRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0ZpcnN0VGltZVNvcnRpbmcoKXtcclxuICAgICAgICB0aGlzLmZpcnN0U29ydEFwcGxpZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9IGNsb25lRGVlcCh0aGlzLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHNvcnRCeUFzY2VuZGluZygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZmlyc3RTb3J0QXBwbGllZCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlyc3RUaW1lU29ydGluZygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaXNBc2MgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zb3J0QnkgPT09IFwiZGF0ZXNcIikge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRCeSA9IFwic3RhcnREYXRlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0QXNjU3RhdGUoKTtcclxuICAgICAgICB0aGlzLnNldERlc2NTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnRCeUFzYy5zZXQodGhpcy5zb3J0QnksIHRydWUpO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmlzQXNjID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5rZXlTb3J0ZWQgPSB0aGlzLnNvcnRCeTtcclxuICAgICAgICB0aGlzLnNvcnRlZERhdGEuZW1pdCh0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0KGlzQXNjLCB0aGlzLmRhdGEsIHRoaXMuc29ydEJ5KSk7XHJcbiAgICAgICAgdGhpcy5jbG9zZVRvb2x0aXAoKTtcclxuICAgIH1cclxuXHJcbiAgICBzb3J0QnlEZXNjZW5kaW5nKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5maXJzdFNvcnRBcHBsaWVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNGaXJzdFRpbWVTb3J0aW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlzQXNjID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuc29ydEJ5ID09PSBcImRhdGVzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0QnkgPSBcImVuZERhdGVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGVzY1N0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRBc2NTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnRCeURlc2Muc2V0KHRoaXMuc29ydEJ5LCB0cnVlKTtcclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5pc0FzYyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmtleVNvcnRlZCA9IHRoaXMuc29ydEJ5O1xyXG4gICAgICAgIHRoaXMuc29ydGVkRGF0YS5lbWl0KHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnQoaXNBc2MsIHRoaXMuZGF0YSwgdGhpcy5zb3J0QnkpKTtcclxuICAgICAgICB0aGlzLmNsb3NlVG9vbHRpcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEFzY1N0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnRCeUFzYy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnRCeUFzYy5zZXQoa2V5LCBmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGVzY1N0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnRCeURlc2MuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0QnlEZXNjLnNldChrZXksIGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVTb3J0aW5nKCkge1xyXG4gICAgICAgIHRoaXMuZmlyc3RTb3J0QXBwbGllZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnRCeUFzYyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0QnlEZXNjID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuc29ydGVkRGF0YS5lbWl0KHsgZGF0YTogdGhpcy5jbG9uZWREYXRhLCB0eXBlOiBcIm5vbmVcIiB9KTtcclxuICAgICAgICB0aGlzLmNsb3NlVG9vbHRpcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmRUaGVWYWx1ZVRvVG9vbFRpcCh0b29sdGlwOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5hbm5hU29ydFNlcnZpY2UudG9vbHRpcCA9PSB0b29sdGlwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VUb29sdGlwKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZVRvb2x0aXAoKTtcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UudG9vbHRpcCA9IHRvb2x0aXA7XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnRvb2x0aXAub3BlbigpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdFJhZGlvQnV0dG9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFJhZGlvQnV0dG9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0QnlBc2MuaGFzKHRoaXMuc29ydEJ5KSAmJiB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0QnlBc2MuZ2V0KHRoaXMuc29ydEJ5KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPSBcImFzY2VuZGluZ1wiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydEJ5RGVzYy5oYXModGhpcy5zb3J0QnkpICYmIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnRCeURlc2MuZ2V0KHRoaXMuc29ydEJ5KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPSBcImRlc2NlbmRpbmdcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPSBcIm5vbmVcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VUb29sdGlwKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmFubmFTb3J0U2VydmljZS50b29sdGlwICYmIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnRvb2x0aXAuaXNPcGVuKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UudG9vbHRpcC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS50b29sdGlwID0gbnVsbDtcclxuICAgIH1cclxufVxyXG4iLCI8cCBjbGFzcz1cInNvcnRcIj5cclxuICAgIDxpXHJcbiAgICAgICAgY2xhc3M9XCJtZGkgbWRpLXNvcnRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgYWN0aXZlOiB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0QnlEZXNjLmdldCh0aGlzLnNvcnRCeSkgfHwgdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydEJ5QXNjLmdldCh0aGlzLnNvcnRCeSksXHJcbiAgICAgICAgICAgIGRpc2FibGU6IGRpc2FibGVTb3J0XHJcbiAgICAgICAgfVwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwic29ydFRvb2x0aXBcIlxyXG4gICAgICAgIHBsYWNlbWVudD1cInt7IHBsYWNlbWVudCAhPSB1bmRlZmluZWQgPyAnYXV0bycgOiAnYm90dG9tJyB9fVwiXHJcbiAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXHJcbiAgICAgICAgW2F1dG9DbG9zZV09XCJ0cnVlXCJcclxuICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXHJcbiAgICAgICAgI3NvcnQ9XCJuZ2JUb29sdGlwXCJcclxuICAgICAgICAoY2xpY2spPVwiYmluZFRoZVZhbHVlVG9Ub29sVGlwKHNvcnQpXCJcclxuICAgID48L2k+XHJcbjwvcD5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjc29ydFRvb2x0aXA+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cInNvcnQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgaWQ9XCJhc2NlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRSYWRpb1wiXHJcbiAgICAgICAgICAgICAgICBuYW1lPVwic29ydFRvb2xUaXBcIlxyXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJhc2NlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRCeUFzY2VuZGluZygpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFzY2VuZGluZ1wiPkFzY2VuZGluZzwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgaWQ9XCJkZXNjZW5kaW5nXCJcclxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkUmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgbmFtZT1cInNvcnRUb29sVGlwXCJcclxuICAgICAgICAgICAgICAgIHZhbHVlPVwiZGVzY2VuZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic29ydEJ5RGVzY2VuZGluZygpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlc2NlbmRpbmdcIj5EZXNjZW5kaW5nPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgaWQ9XCJub25lXCIgW25nTW9kZWxdPVwic2VsZWN0ZWRSYWRpb1wiIG5hbWU9XCJzb3J0VG9vbFRpcFwiIHZhbHVlPVwibm9uZVwiIChjbGljayk9XCJyZW1vdmVTb3J0aW5nKClcIiAvPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwibm9uZVwiPk5vbmU8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9zZWN0aW9uPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
@@ -1,357 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { Directionality } from "@angular/cdk/bidi";
9
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Input, NgZone, Optional, Output, ViewChild, ViewEncapsulation } from "@angular/core";
10
- import { animationFrameScheduler, asapScheduler, Observable, Subject, Subscription } from "rxjs";
11
- import { auditTime, startWith, takeUntil } from "rxjs/operators";
12
- import { CdkVirtualScrollViewport, CdkScrollable, VIRTUAL_SCROLL_STRATEGY, ScrollDispatcher, ViewportRuler } from "@angular/cdk/scrolling";
13
- import { AnnaGenericTableService } from "@annalib/anna-core/src/lib/anna-core-shared-lib";
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "@angular/cdk/bidi";
16
- import * as i2 from "@angular/cdk/scrolling";
17
- import * as i3 from "@annalib/anna-core/src/lib/anna-core-shared-lib";
18
- /** Checks if the given ranges are equal. */
19
- function rangesEqual(r1, r2) {
20
- return r1.start == r2.start && r1.end == r2.end;
21
- }
22
- /**
23
- * Scheduler to be used for scroll events. Needs to fall back to
24
- * something that doesn't rely on requestAnimationFrame on environments
25
- * that don't support it (e.g. server-side rendering).
26
- */
27
- const SCROLL_SCHEDULER = typeof requestAnimationFrame !== "undefined"
28
- ? animationFrameScheduler
29
- : asapScheduler;
30
- /**
31
- * A viewport that virtualizes its scrolling with the help of `CdkVirtualForOf`.
32
- * Uses `top: #px` instead of `transform: translateY(#px)` like the cdk virtual scroll viewport does
33
- * which avoids flickering of elements in the transformed container with `position: sticky`.
34
- */
35
- export class AnnaTableVirtualScrollViewportComponent extends CdkScrollable {
36
- constructor(elementRef, _changeDetectorRef, ngZone, _scrollStrategy, dir, scrollDispatcher, viewportRuler, annaGtService) {
37
- super(elementRef, scrollDispatcher, ngZone, dir);
38
- this.elementRef = elementRef;
39
- this._changeDetectorRef = _changeDetectorRef;
40
- this._scrollStrategy = _scrollStrategy;
41
- this.annaGtService = annaGtService;
42
- /** Emits when the viewport is detached from a CdkVirtualForOf. */
43
- this._detachedSubject = new Subject();
44
- /** Emits when the rendered range changes. */
45
- this._renderedRangeSubject = new Subject();
46
- this._orientation = "vertical";
47
- // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll
48
- // strategy lazily (i.e. only if the user is actually listening to the events). We do this because
49
- // depending on how the strategy calculates the scrolled index, it may come at a cost to
50
- // performance.
51
- /** Emits when the index of the first element visible in the viewport changes. */
52
- this.scrolledIndexChange = new Observable((observer) => this._scrollStrategy.scrolledIndexChange.subscribe(index => Promise.resolve().then(() => this.ngZone.run(() => observer.next(index)))));
53
- /** A stream that emits whenever the rendered range changes. */
54
- this.renderedRangeStream = this._renderedRangeSubject;
55
- /**
56
- * The total size of all content (in pixels), including content that is not currently rendered.
57
- */
58
- this._totalContentSize = 0;
59
- /** A string representing the `style.width` property value to be used for the spacer element. */
60
- this._totalContentWidth = "";
61
- /** A string representing the `style.height` property value to be used for the spacer element. */
62
- this._totalContentHeight = "";
63
- /** The currently rendered range of indices. */
64
- this._renderedRange = { start: 0, end: 0 };
65
- /** The length of the data bound to this viewport (in number of items). */
66
- this._dataLength = 0;
67
- /** The size of the viewport (in pixels). */
68
- this._viewportSize = 0;
69
- /** The last rendered content offset that was set. */
70
- this._renderedContentOffset = 0;
71
- /**
72
- * Whether the last rendered content offset was to the end of the content (and therefore needs to
73
- * be rewritten as an offset to the start of the content).
74
- */
75
- this._renderedContentOffsetNeedsRewrite = false;
76
- /** Whether there is a pending change detection cycle. */
77
- this._isChangeDetectionPending = false;
78
- /** A list of functions to run after the next change detection cycle. */
79
- this._runAfterChangeDetection = [];
80
- /** Subscription to changes in the viewport size. */
81
- this._viewportChanges = Subscription.EMPTY;
82
- if (!_scrollStrategy) {
83
- throw Error('Error: cdk-virtual-scroll-viewport requires the "itemSize" property to be set.');
84
- }
85
- this._viewportChanges = viewportRuler.change().subscribe(() => {
86
- this.checkViewportSize();
87
- });
88
- }
89
- /** The direction the viewport scrolls. */
90
- get orientation() {
91
- return this._orientation;
92
- }
93
- set orientation(orientation) {
94
- if (this._orientation !== orientation) {
95
- this._orientation = orientation;
96
- this._calculateSpacerSize();
97
- }
98
- }
99
- ngOnInit() {
100
- super.ngOnInit();
101
- // It's still too early to measure the viewport at this point. Deferring with a promise allows
102
- // the Viewport to be rendered with the correct size before we measure. We run this outside the
103
- // zone to avoid causing more change detection cycles. We handle the change detection loop
104
- // ourselves instead.
105
- this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {
106
- this._measureViewportSize();
107
- this._scrollStrategy.attach(this);
108
- this.elementScrolled()
109
- .pipe(
110
- // Start off with a fake scroll event so we properly detect our initial position.
111
- startWith(null),
112
- // Collect multiple events into one until the next animation frame. This way if
113
- // there are multiple scroll events in the same frame we only need to recheck
114
- // our layout once.
115
- auditTime(0, SCROLL_SCHEDULER))
116
- .subscribe(() => { this._scrollStrategy.onContentScrolled(); this.annaGtService.virtualScrollSubject.next(true); });
117
- this._markChangeDetectionNeeded();
118
- }));
119
- }
120
- ngOnDestroy() {
121
- this.detach();
122
- this._scrollStrategy.detach();
123
- // Complete all subjects
124
- this._renderedRangeSubject.complete();
125
- this._detachedSubject.complete();
126
- this._viewportChanges.unsubscribe();
127
- super.ngOnDestroy();
128
- }
129
- /** Attaches a `CdkVirtualScrollRepeater` to this viewport. */
130
- attach(forOf) {
131
- if (this._forOf) {
132
- throw Error("CdkVirtualScrollViewport is already attached.");
133
- }
134
- // Subscribe to the data stream of the CdkVirtualForOf to keep track of when the data length
135
- // changes. Run outside the zone to avoid triggering change detection, since we're managing the
136
- // change detection loop ourselves.
137
- this.ngZone.runOutsideAngular(() => {
138
- this._forOf = forOf;
139
- this._forOf.dataStream
140
- .pipe(takeUntil(this._detachedSubject))
141
- .subscribe(data => {
142
- const newLength = data.length;
143
- if (newLength !== this._dataLength) {
144
- this._dataLength = newLength;
145
- this._scrollStrategy.onDataLengthChanged();
146
- }
147
- this._doChangeDetection();
148
- });
149
- });
150
- }
151
- /** Detaches the current `CdkVirtualForOf`. */
152
- detach() {
153
- this._forOf = null;
154
- this._detachedSubject.next();
155
- }
156
- /** Gets the length of the data bound to this viewport (in number of items). */
157
- getDataLength() {
158
- return this._dataLength;
159
- }
160
- /** Gets the size of the viewport (in pixels). */
161
- getViewportSize() {
162
- return this._viewportSize;
163
- }
164
- // TODO(mmalerba): This is technically out of sync with what's really rendered until a render
165
- // cycle happens. I'm being careful to only call it after the render cycle is complete and before
166
- // setting it to something else, but its error prone and should probably be split into
167
- // `pendingRange` and `renderedRange`, the latter reflecting whats actually in the DOM.
168
- /** Get the current rendered range of items. */
169
- getRenderedRange() {
170
- return this._renderedRange;
171
- }
172
- /**
173
- * Sets the total size of all content (in pixels), including content that is not currently
174
- * rendered.
175
- */
176
- setTotalContentSize(size) {
177
- if (this._totalContentSize !== size) {
178
- this._totalContentSize = size;
179
- this._calculateSpacerSize();
180
- this._markChangeDetectionNeeded();
181
- }
182
- }
183
- /** Sets the currently rendered range of indices. */
184
- setRenderedRange(range) {
185
- if (!rangesEqual(this._renderedRange, range)) {
186
- this._renderedRangeSubject.next((this._renderedRange = range));
187
- this._markChangeDetectionNeeded(() => this._scrollStrategy.onContentRendered());
188
- }
189
- }
190
- /**
191
- * Gets the offset from the start of the viewport to the start of the rendered data (in pixels).
192
- */
193
- getOffsetToRenderedContentStart() {
194
- return this._renderedContentOffsetNeedsRewrite
195
- ? null
196
- : this._renderedContentOffset;
197
- }
198
- /**
199
- * Sets the offset from the start of the viewport to either the start or end of the rendered data
200
- * (in pixels).
201
- */
202
- setRenderedContentOffset(offset) {
203
- let top = `${Number(offset)}px`;
204
- this._renderedContentOffset = offset;
205
- if (this._renderedContentTransform != top) {
206
- // We know this value is safe because we parse `offset` with `Number()` before passing it
207
- // into the string.
208
- this._renderedContentTransform = top;
209
- this._markChangeDetectionNeeded(() => {
210
- if (this._renderedContentOffsetNeedsRewrite) {
211
- this._renderedContentOffset -= this.measureRenderedContentSize();
212
- this._renderedContentOffsetNeedsRewrite = false;
213
- this.setRenderedContentOffset(this._renderedContentOffset);
214
- }
215
- else {
216
- this._scrollStrategy.onRenderedOffsetChanged();
217
- }
218
- });
219
- }
220
- }
221
- /**
222
- * Scrolls to the given offset from the start of the viewport. Please note that this is not always
223
- * the same as setting `scrollTop` or `scrollLeft`. In a horizontal viewport with right-to-left
224
- * direction, this would be the equivalent of setting a fictional `scrollRight` property.
225
- * @param offset The offset to scroll to.
226
- * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.
227
- */
228
- scrollToOffset(offset, behavior = "auto") {
229
- const options = { behavior, top: offset };
230
- this.scrollTo(options);
231
- }
232
- /**
233
- * Scrolls to the offset for the given index.
234
- * @param index The index of the element to scroll to.
235
- * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.
236
- */
237
- scrollToIndex(index, behavior = "auto") {
238
- this._scrollStrategy.scrollToIndex(index, behavior);
239
- }
240
- /**
241
- * Gets the current scroll offset from the start of the viewport (in pixels).
242
- * @param from The edge to measure the offset from. Defaults to 'top' in vertical mode and 'start'
243
- * in horizontal mode.
244
- */
245
- // CHANGES@ANNALIB added override to functions
246
- measureScrollOffset(from) {
247
- return from
248
- ? super.measureScrollOffset(from)
249
- : super.measureScrollOffset("top");
250
- }
251
- /** Measure the combined size of all of the rendered items. */
252
- measureRenderedContentSize() {
253
- const contentEl = this._contentWrapper.nativeElement;
254
- return contentEl.offsetHeight;
255
- }
256
- /**
257
- * Measure the total combined size of the given range. Throws if the range includes items that are
258
- * not rendered.
259
- */
260
- measureRangeSize(range) {
261
- if (!this._forOf) {
262
- return 0;
263
- }
264
- return this._forOf.measureRangeSize(range, this.orientation);
265
- }
266
- /** Update the viewport dimensions and re-render. */
267
- checkViewportSize() {
268
- // TODO: Cleanup later when add logic for handling content resize
269
- this._measureViewportSize();
270
- this._scrollStrategy.onDataLengthChanged();
271
- }
272
- /** Measure the viewport size. */
273
- _measureViewportSize() {
274
- const viewportEl = this.elementRef.nativeElement;
275
- this._viewportSize = viewportEl.clientHeight;
276
- }
277
- /** Queue up change detection to run. */
278
- _markChangeDetectionNeeded(runAfter) {
279
- if (runAfter) {
280
- this._runAfterChangeDetection.push(runAfter);
281
- }
282
- // Use a Promise to batch together calls to `_doChangeDetection`. This way if we set a bunch of
283
- // properties sequentially we only have to run `_doChangeDetection` once at the end.
284
- if (!this._isChangeDetectionPending) {
285
- this._isChangeDetectionPending = true;
286
- this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {
287
- this._doChangeDetection();
288
- }));
289
- }
290
- }
291
- /** Run change detection. */
292
- _doChangeDetection() {
293
- this._isChangeDetectionPending = false;
294
- // Apply the content transform. The transform can't be set via an Angular binding because
295
- // bypassSecurityTrustStyle is banned in Google. However the value is safe, it's composed of
296
- // string literals, a variable that can only be 'X' or 'Y', and user input that is run through
297
- // the `Number` function first to coerce it to a numeric value.
298
- this._contentWrapper.nativeElement.style.top = this._renderedContentTransform;
299
- // Apply changes to Angular bindings. Note: We must call `markForCheck` to run change detection
300
- // from the root, since the repeated items are content projected in. Calling `detectChanges`
301
- // instead does not properly check the projected content.
302
- this.ngZone.run(() => this._changeDetectorRef.markForCheck());
303
- const runAfterChangeDetection = this._runAfterChangeDetection;
304
- this._runAfterChangeDetection = [];
305
- for (const fn of runAfterChangeDetection) {
306
- fn();
307
- }
308
- }
309
- /** Calculates the `style.width` and `style.height` for the spacer element. */
310
- _calculateSpacerSize() {
311
- this._totalContentHeight = `${this._totalContentSize}px`;
312
- this._totalContentWidth = "";
313
- }
314
- }
315
- AnnaTableVirtualScrollViewportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaTableVirtualScrollViewportComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: VIRTUAL_SCROLL_STRATEGY, optional: true }, { token: i1.Directionality, optional: true }, { token: i2.ScrollDispatcher }, { token: i2.ViewportRuler }, { token: i3.AnnaGenericTableService }], target: i0.ɵɵFactoryTarget.Component });
316
- AnnaTableVirtualScrollViewportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AnnaTableVirtualScrollViewportComponent, selector: "anna-table-virtual-scroll-viewport", inputs: { orientation: "orientation" }, outputs: { scrolledIndexChange: "scrolledIndexChange" }, host: { properties: { "class.anna-table-virtual-scroll-orientation-horizontal": "orientation === \"horizontal\"", "class.anna-table-virtual-scroll-orientation-vertical": "orientation !== \"horizontal\"" }, classAttribute: "anna-table-virtual-scroll-viewport" }, providers: [
317
- {
318
- provide: CdkScrollable,
319
- useExisting: AnnaTableVirtualScrollViewportComponent
320
- },
321
- {
322
- provide: CdkVirtualScrollViewport,
323
- useExisting: AnnaTableVirtualScrollViewportComponent
324
- }
325
- ], viewQueries: [{ propertyName: "_contentWrapper", first: true, predicate: ["contentWrapper"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n Wrap the rendered content in an element that will be used to offset it based on the scroll\r\n position.\r\n-->\r\n<div #contentWrapper class=\"anna-table-virtual-scroll-content-wrapper\">\r\n\t<ng-content></ng-content>\r\n</div>\r\n<!--\r\n Spacer used to force the scrolling container to the correct size for the *total* number of items\r\n so that the scrollbar captures the size of the entire data set.\r\n-->\r\n<div class=\"app-table-virtual-scroll-spacer\" [style.width]=\"_totalContentWidth\" [style.height]=\"_totalContentHeight\">\r\n</div>", styles: ["anna-table-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict;will-change:scroll-position;-webkit-overflow-scrolling:touch}.anna-table-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .anna-table-virtual-scroll-content-wrapper{right:0;left:auto}.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper{min-height:100%}.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper{min-width:100%}.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.app-table-virtual-scroll-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0}[dir=rtl] .app-table-virtual-scroll-spacer{right:0;left:auto;transform-origin:100% 0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
326
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaTableVirtualScrollViewportComponent, decorators: [{
327
- type: Component,
328
- args: [{ selector: "anna-table-virtual-scroll-viewport", host: {
329
- class: "anna-table-virtual-scroll-viewport",
330
- "[class.anna-table-virtual-scroll-orientation-horizontal]": 'orientation === "horizontal"',
331
- "[class.anna-table-virtual-scroll-orientation-vertical]": 'orientation !== "horizontal"'
332
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
333
- {
334
- provide: CdkScrollable,
335
- useExisting: AnnaTableVirtualScrollViewportComponent
336
- },
337
- {
338
- provide: CdkVirtualScrollViewport,
339
- useExisting: AnnaTableVirtualScrollViewportComponent
340
- }
341
- ], template: "<!--\r\n Wrap the rendered content in an element that will be used to offset it based on the scroll\r\n position.\r\n-->\r\n<div #contentWrapper class=\"anna-table-virtual-scroll-content-wrapper\">\r\n\t<ng-content></ng-content>\r\n</div>\r\n<!--\r\n Spacer used to force the scrolling container to the correct size for the *total* number of items\r\n so that the scrollbar captures the size of the entire data set.\r\n-->\r\n<div class=\"app-table-virtual-scroll-spacer\" [style.width]=\"_totalContentWidth\" [style.height]=\"_totalContentHeight\">\r\n</div>", styles: ["anna-table-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict;will-change:scroll-position;-webkit-overflow-scrolling:touch}.anna-table-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .anna-table-virtual-scroll-content-wrapper{right:0;left:auto}.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper{min-height:100%}.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper{min-width:100%}.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.app-table-virtual-scroll-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0}[dir=rtl] .app-table-virtual-scroll-spacer{right:0;left:auto;transform-origin:100% 0}\n"] }]
342
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
343
- type: Optional
344
- }, {
345
- type: Inject,
346
- args: [VIRTUAL_SCROLL_STRATEGY]
347
- }] }, { type: i1.Directionality, decorators: [{
348
- type: Optional
349
- }] }, { type: i2.ScrollDispatcher }, { type: i2.ViewportRuler }, { type: i3.AnnaGenericTableService }]; }, propDecorators: { orientation: [{
350
- type: Input
351
- }], scrolledIndexChange: [{
352
- type: Output
353
- }], _contentWrapper: [{
354
- type: ViewChild,
355
- args: ["contentWrapper", { static: true }]
356
- }] } });
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWdlbmVyaWMtdGFibGUtbGliL2NvbXBvbmVudHMvYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC9hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0L2FubmEtdGFibGUtdmlydHVhbC1zY3JvbGwtdmlld3BvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsYUFBYSxFQUNiLFVBQVUsRUFDVixPQUFPLEVBRVAsWUFBWSxFQUNiLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixhQUFhLEVBRWIsdUJBQXVCLEVBRXZCLGdCQUFnQixFQUNoQixhQUFhLEVBRWQsTUFBTSx3QkFB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QVh2QztRQUNUO1lBQ0UsT0FBTyxFQUFFLGFBQWE7WUFDdEIsV0FBVyxFQUFFLHVDQUF1QztTQUNyRDtRQUNEO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxXQUFXLEVBQUUsdUNBQXVDO1NBQ3JEO0tBQ0Ysa0xDeEZKLHFqQkFZTTsyRkQ4RVEsdUNBQXVDO2tCQXhCbkQsU0FBUzsrQkFDRSxvQ0FBb0MsUUFHeEM7d0JBQ0osS0FBSyxFQUFFLG9DQUFvQzt3QkFDM0MsMERBQTBELEVBQ3hELDhCQUE4Qjt3QkFDaEMsd0RBQXdELEVBQ3RELDhCQUE4QjtxQkFDakMsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyx5Q0FBeUM7eUJBQ3JEO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSx3QkFBd0I7NEJBQ2pDLFdBQVcseUNBQXlDO3lCQUNyRDtxQkFDRjs7MEJBZ0dFLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsdUJBQXVCOzswQkFFOUIsUUFBUTs2SUF2RlAsV0FBVztzQkFEZCxLQUFLO2dCQWlCSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBVXdDLGVBQWU7c0JBQTdELFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXHJcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcclxuICovXHJcblxyXG4gaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2JpZGlcIjtcclxuIGltcG9ydCB7IExpc3RSYW5nZSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuIGltcG9ydCB7XHJcbiAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgQ29tcG9uZW50LFxyXG4gICBFbGVtZW50UmVmLFxyXG4gICBJbmplY3QsXHJcbiAgIElucHV0LFxyXG4gICBOZ1pvbmUsXHJcbiAgIE9uRGVzdHJveSxcclxuICAgT25Jbml0LFxyXG4gICBPcHRpb25hbCxcclxuICAgT3V0cHV0LFxyXG4gICBWaWV3Q2hpbGQsXHJcbiAgIFZpZXdFbmNhcHN1bGF0aW9uXHJcbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbiBpbXBvcnQge1xyXG4gICBhbmltYXRpb25GcmFtZVNjaGVkdWxlcixcclxuICAgYXNhcFNjaGVkdWxlcixcclxuICAgT2JzZXJ2YWJsZSxcclxuICAgU3ViamVjdCxcclxuICAgT2JzZXJ2ZXIsXHJcbiAgIFN1YnNjcmlwdGlvblxyXG4gfSBmcm9tIFwicnhqc1wiO1xyXG4gaW1wb3J0IHsgYXVkaXRUaW1lLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG4gaW1wb3J0IHtcclxuICAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LFxyXG4gICBDZGtTY3JvbGxhYmxlLFxyXG4gICBDZGtWaXJ0dWFsU2Nyb2xsUmVwZWF0ZXIsXHJcbiAgIFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLFxyXG4gICBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3ksXHJcbiAgIFNjcm9sbERpc3BhdGNoZXIsXHJcbiAgIFZpZXdwb3J0UnVsZXIsXHJcbiAgIEV4dGVuZGVkU2Nyb2xsVG9PcHRpb25zXHJcbiB9IGZyb20gXCJAYW5ndWxhci9jZGsvc2Nyb2xsaW5nXCI7XHJcbmltcG9ydCB7IEFubmFHZW5lcmljVGFibGVTZXJ2aWNlIH0gZnJvbSBcIkBhbm5hbGliL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliXCI7XHJcbiBcclxuIC8qKiBDaGVja3MgaWYgdGhlIGdpdmVuIHJhbmdlcyBhcmUgZXF1YWwuICovXHJcbiBmdW5jdGlvbiByYW5nZXNFcXVhbChyMTogTGlzdFJhbmdlLCByMjogTGlzdFJhbmdlKTogYm9vbGVhbiB7XHJcbiAgIHJldHVybiByMS5zdGFydCA9PSByMi5zdGFydCAmJiByMS5lbmQgPT0gcjIuZW5kO1xyXG4gfVxyXG4gXHJcbiAvKipcclxuICAqIFNjaGVkdWxlciB0byBiZSB1c2VkIGZvciBzY3JvbGwgZXZlbnRzLiBOZWVkcyB0byBmYWxsIGJhY2sgdG9cclxuICAqIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgcmVseSBvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgb24gZW52aXJvbm1lbnRzXHJcbiAgKiB0aGF0IGRvbid0IHN1cHBvcnQgaXQgKGUuZy4gc2VydmVyLXNpZGUgcmVuZGVyaW5nKS5cclxuICAqL1xyXG4gY29uc3QgU0NST0xMX1NDSEVEVUxFUiA9XHJcbiAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09IFwidW5kZWZpbmVkXCJcclxuICAgICA/IGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyXHJcbiAgICAgOiBhc2FwU2NoZWR1bGVyO1xyXG4gXHJcbiAvKipcclxuICAqIEEgdmlld3BvcnQgdGhhdCB2aXJ0dWFsaXplcyBpdHMgc2Nyb2xsaW5nIHdpdGggdGhlIGhlbHAgb2YgYENka1ZpcnR1YWxGb3JPZmAuXHJcbiAgKiBVc2VzIGB0b3A6ICNweGAgaW5zdGVhZCBvZiBgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKCNweClgIGxpa2UgdGhlIGNkayB2aXJ0dWFsIHNjcm9sbCB2aWV3cG9ydCBkb2VzXHJcbiAgKiB3aGljaCBhdm9pZHMgZmxpY2tlcmluZyBvZiBlbGVtZW50cyBpbiB0aGUgdHJhbnNmb3JtZWQgY29udGFpbmVyIHdpdGggYHBvc2l0aW9uOiBzdGlja3lgLlxyXG4gICovXHJcbiBAQ29tcG9uZW50KHtcclxuICAgc2VsZWN0b3I6IFwiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFwiLFxyXG4gICB0ZW1wbGF0ZVVybDogXCJhbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgIHN0eWxlVXJsczogW1wiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICAgaG9zdDoge1xyXG4gICAgIGNsYXNzOiBcImFubmEtdGFibGUtdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcIixcclxuICAgICBcIltjbGFzcy5hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWxdXCI6XHJcbiAgICAgICAnb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiJyxcclxuICAgICBcIltjbGFzcy5hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsXVwiOlxyXG4gICAgICAgJ29yaWVudGF0aW9uICE9PSBcImhvcml6b250YWxcIidcclxuICAgfSxcclxuICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgIHByb3ZpZGVyczogW1xyXG4gICAgIHtcclxuICAgICAgIHByb3ZpZGU6IENka1Njcm9sbGFibGUsXHJcbiAgICAgICB1c2VFeGlzdGluZzogQW5uYVRhYmxlVmlydHVhbFNjcm9sbFZpZXdwb3J0Q29tcG9uZW50XHJcbiAgICAgfSxcclxuICAgICB7XHJcbiAgICAgICBwcm92aWRlOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsXHJcbiAgICAgICB1c2VFeGlzdGluZzogQW5uYVRhYmxlVmlydHVhbFNjcm9sbFZpZXdwb3J0Q29tcG9uZW50XHJcbiAgICAgfVxyXG4gICBdXHJcbiB9KVxyXG4gZXhwb3J0IGNsYXNzIEFubmFUYWJsZVZpcnR1YWxTY3JvbGxWaWV3cG9ydENvbXBvbmVudCBleHRlbmRzIENka1Njcm9sbGFibGVcclxuICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgIC8qKiBFbWl0cyB3aGVuIHRoZSB2aWV3cG9ydCBpcyBkZXRhY2hlZCBmcm9tIGEgQ2RrVmlydHVhbEZvck9mLiAqL1xyXG4gICBwcml2YXRlIF9kZXRhY2hlZFN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gXHJcbiAgIC8qKiBFbWl0cyB3aGVuIHRoZSByZW5kZXJlZCByYW5nZSBjaGFuZ2VzLiAqL1xyXG4gICBwcml2YXRlIF9yZW5kZXJlZFJhbmdlU3ViamVjdCA9IG5ldyBTdWJqZWN0PExpc3RSYW5nZT4oKTtcclxuIFxyXG4gICAvKiogVGhlIGRpcmVjdGlvbiB0aGUgdmlld3BvcnQgc2Nyb2xscy4gKi9cclxuICAgQElucHV0KClcclxuICAgZ2V0IG9yaWVudGF0aW9uKCkge1xyXG4gICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjtcclxuICAgfVxyXG4gICBzZXQgb3JpZW50YXRpb24ob3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiKSB7XHJcbiAgICAgaWYgKHRoaXMuX29yaWVudGF0aW9uICE9PSBvcmllbnRhdGlvbikge1xyXG4gICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcclxuICAgICAgIHRoaXMuX2NhbGN1bGF0ZVNwYWNlclNpemUoKTtcclxuICAgICB9XHJcbiAgIH1cclxuICAgcHJpdmF0ZSBfb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiID0gXCJ2ZXJ0aWNhbFwiO1xyXG4gXHJcbiAgIC8vIE5vdGU6IHdlIGRvbid0IHVzZSB0aGUgdHlwaWNhbCBFdmVudEVtaXR0ZXIgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gc3Vic2NyaWJlIHRvIHRoZSBzY3JvbGxcclxuICAgLy8gc3RyYXRlZ3kgbGF6aWx5IChpLmUuIG9ubHkgaWYgdGhlIHVzZXIgaXMgYWN0dWFsbHkgbGlzdGVuaW5nIHRvIHRoZSBldmVudHMpLiBXZSBkbyB0aGlzIGJlY2F1c2VcclxuICAgLy8gZGVwZW5kaW5nIG9uIGhvdyB0aGUgc3RyYXRlZ3kgY2FsY3VsYXRlcyB0aGUgc2Nyb2xsZWQgaW5kZXgsIGl0IG1heSBjb21lIGF0IGEgY29zdCB0b1xyXG4gICAvLyBwZXJmb3JtYW5jZS5cclxuICAgLyoqIEVtaXRzIHdoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0IGNoYW5nZXMuICovXHJcbiAgIEBPdXRwdXQoKSBzY3JvbGxlZEluZGV4Q2hhbmdlOiBPYnNlcnZhYmxlPG51bWJlcj4gPSBuZXcgT2JzZXJ2YWJsZShcclxuICAgICAob2JzZXJ2ZXI6IE9ic2VydmVyPG51bWJlcj4pID0+XHJcbiAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5zY3JvbGxlZEluZGV4Q2hhbmdlLnN1YnNjcmliZShpbmRleCA9PlxyXG4gICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+XHJcbiAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IG9ic2VydmVyLm5leHQoaW5kZXgpKVxyXG4gICAgICAgICApXHJcbiAgICAgICApXHJcbiAgICk7XHJcbiBcclxuICAgLyoqIFRoZSBlbGVtZW50IHRoYXQgd3JhcHMgdGhlIHJlbmRlcmVkIGNvbnRlbnQuICovXHJcbiAgIEBWaWV3Q2hpbGQoXCJjb250ZW50V3JhcHBlclwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBfY29udGVudFdyYXBwZXI6IEVsZW1lbnRSZWY8XHJcbiAgICAgSFRNTEVsZW1lbnRcclxuICAgPjtcclxuIFxyXG4gICAvKiogQSBzdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcmVuZGVyZWQgcmFuZ2UgY2hhbmdlcy4gKi9cclxuICAgcmVuZGVyZWRSYW5nZVN0cmVhbTogT2JzZXJ2YWJsZTxMaXN0UmFuZ2U+ID0gdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3Q7XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIFRoZSB0b3RhbCBzaXplIG9mIGFsbCBjb250ZW50IChpbiBwaXhlbHMpLCBpbmNsdWRpbmcgY29udGVudCB0aGF0IGlzIG5vdCBjdXJyZW50bHkgcmVuZGVyZWQuXHJcbiAgICAqL1xyXG4gICBwcml2YXRlIF90b3RhbENvbnRlbnRTaXplID0gMDtcclxuIFxyXG4gICAvKiogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBgc3R5bGUud2lkdGhgIHByb3BlcnR5IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGFjZXIgZWxlbWVudC4gKi9cclxuICAgX3RvdGFsQ29udGVudFdpZHRoID0gXCJcIjtcclxuIFxyXG4gICAvKiogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBgc3R5bGUuaGVpZ2h0YCBwcm9wZXJ0eSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgc3BhY2VyIGVsZW1lbnQuICovXHJcbiAgIF90b3RhbENvbnRlbnRIZWlnaHQgPSBcIlwiO1xyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBUaGUgQ1NTIHRyYW5zZm9ybSBhcHBsaWVkIHRvIHRoZSByZW5kZXJlZCBzdWJzZXQgb2YgaXRlbXMgc28gdGhhdCB0aGV5IGFwcGVhciB3aXRoaW4gdGhlIGJvdW5kc1xyXG4gICAgKiBvZiB0aGUgdmlzaWJsZSB2aWV3cG9ydC5cclxuICAgICovXHJcbiAgIHByaXZhdGUgX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybTogc3RyaW5nO1xyXG4gXHJcbiAgIC8qKiBUaGUgY3VycmVudGx5IHJlbmRlcmVkIHJhbmdlIG9mIGluZGljZXMuICovXHJcbiAgIHByaXZhdGUgX3JlbmRlcmVkUmFuZ2U6IExpc3RSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xyXG4gXHJcbiAgIC8qKiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGJvdW5kIHRvIHRoaXMgdmlld3BvcnQgKGluIG51bWJlciBvZiBpdGVtcykuICovXHJcbiAgIHByaXZhdGUgX2RhdGFMZW5ndGggPSAwO1xyXG4gXHJcbiAgIC8qKiBUaGUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuICovXHJcbiAgIHByaXZhdGUgX3ZpZXdwb3J0U2l6ZSA9IDA7XHJcbiBcclxuICAgLyoqIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgQ2RrVmlydHVhbFNjcm9sbFJlcGVhdGVyLiAqL1xyXG4gICBwcml2YXRlIF9mb3JPZjogQ2RrVmlydHVhbFNjcm9sbFJlcGVhdGVyPGFueT4gfCBudWxsO1xyXG4gXHJcbiAgIC8qKiBUaGUgbGFzdCByZW5kZXJlZCBjb250ZW50IG9mZnNldCB0aGF0IHdhcyBzZXQuICovXHJcbiAgIHByaXZhdGUgX3JlbmRlcmVkQ29udGVudE9mZnNldCA9IDA7XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIFdoZXRoZXIgdGhlIGxhc3QgcmVuZGVyZWQgY29udGVudCBvZmZzZXQgd2FzIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgKGFuZCB0aGVyZWZvcmUgbmVlZHMgdG9cclxuICAgICogYmUgcmV3cml0dGVuIGFzIGFuIG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQpLlxyXG4gICAgKi9cclxuICAgcHJpdmF0ZSBfcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlID0gZmFsc2U7XHJcbiBcclxuICAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYSBwZW5kaW5nIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUuICovXHJcbiAgIHByaXZhdGUgX2lzQ2hhbmdlRGV0ZWN0aW9uUGVuZGluZyA9IGZhbHNlO1xyXG4gXHJcbiAgIC8qKiBBIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHJ1biBhZnRlciB0aGUgbmV4dCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLiAqL1xyXG4gICBwcml2YXRlIF9ydW5BZnRlckNoYW5nZURldGVjdGlvbjogRnVuY3Rpb25bXSA9IFtdO1xyXG4gXHJcbiAgIC8qKiBTdWJzY3JpcHRpb24gdG8gY2hhbmdlcyBpbiB0aGUgdmlld3BvcnQgc2l6ZS4gKi9cclxuICAgcHJpdmF0ZSBfdmlld3BvcnRDaGFuZ2VzID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xyXG4gXHJcbiAgIGNvbnN0cnVjdG9yKFxyXG4gICAgIHB1YmxpYyBvdmVycmlkZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgbmdab25lOiBOZ1pvbmUsXHJcbiAgICAgQE9wdGlvbmFsKClcclxuICAgICBASW5qZWN0KFZJUlRVQUxfU0NST0xMX1NUUkFURUdZKVxyXG4gICAgIHByaXZhdGUgX3Njcm9sbFN0cmF0ZWd5OiBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3ksXHJcbiAgICAgQE9wdGlvbmFsKCkgZGlyOiBEaXJlY3Rpb25hbGl0eSxcclxuICAgICBzY3JvbGxEaXNwYXRjaGVyOiBTY3JvbGxEaXNwYXRjaGVyLFxyXG4gICAgIHZpZXdwb3J0UnVsZXI6IFZpZXdwb3J0UnVsZXIsXHJcbiAgICAgcHJpdmF0ZSBhbm5hR3RTZXJ2aWNlOiBBbm5hR2VuZXJpY1RhYmxlU2VydmljZVxyXG4gICApIHtcclxuICAgICBzdXBlcihlbGVtZW50UmVmLCBzY3JvbGxEaXNwYXRjaGVyLCBuZ1pvbmUsIGRpcik7XHJcbiBcclxuICAgICBpZiAoIV9zY3JvbGxTdHJhdGVneSkge1xyXG4gICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgICdFcnJvcjogY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IHJlcXVpcmVzIHRoZSBcIml0ZW1TaXplXCIgcHJvcGVydHkgdG8gYmUgc2V0LidcclxuICAgICAgICk7XHJcbiAgICAgfVxyXG4gXHJcbiAgICAgdGhpcy5fdmlld3BvcnRDaGFuZ2VzID0gdmlld3BvcnRSdWxlci5jaGFuZ2UoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xyXG4gICAgIH0pO1xyXG4gICB9XHJcbiBcclxuICAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XHJcbiAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuIFxyXG4gICAgIC8vIEl0J3Mgc3RpbGwgdG9vIGVhcmx5IHRvIG1lYXN1cmUgdGhlIHZpZXdwb3J0IGF0IHRoaXMgcG9pbnQuIERlZmVycmluZyB3aXRoIGEgcHJvbWlzZSBhbGxvd3NcclxuICAgICAvLyB0aGUgVmlld3BvcnQgdG8gYmUgcmVuZGVyZWQgd2l0aCB0aGUgY29ycmVjdCBzaXplIGJlZm9yZSB3ZSBtZWFzdXJlLiBXZSBydW4gdGhpcyBvdXRzaWRlIHRoZVxyXG4gICAgIC8vIHpvbmUgdG8gYXZvaWQgY2F1c2luZyBtb3JlIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLiBXZSBoYW5kbGUgdGhlIGNoYW5nZSBkZXRlY3Rpb24gbG9vcFxyXG4gICAgIC8vIG91cnNlbHZlcyBpbnN0ZWFkLlxyXG4gICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XHJcbiAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgdGhpcy5fbWVhc3VyZVZpZXdwb3J0U2l6ZSgpO1xyXG4gICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5hdHRhY2godGhpcyBhcyBhbnkpO1xyXG4gXHJcbiAgICAgICAgIHRoaXMuZWxlbWVudFNjcm9sbGVkKClcclxuICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgIC8vIFN0YXJ0IG9mZiB3aXRoIGEgZmFrZSBzY3JvbGwgZXZlbnQgc28gd2UgcHJvcGVybHkgZGV0ZWN0IG91ciBpbml0aWFsIHBvc2l0aW9uLlxyXG4gICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxyXG4gICAgICAgICAgICAgLy8gQ29sbGVjdCBtdWx0aXBsZSBldmVudHMgaW50byBvbmUgdW50aWwgdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lLiBUaGlzIHdheSBpZlxyXG4gICAgICAgICAgICAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIHNjcm9sbCBldmVudHMgaW4gdGhlIHNhbWUgZnJhbWUgd2Ugb25seSBuZWVkIHRvIHJlY2hlY2tcclxuICAgICAgICAgICAgIC8vIG91ciBsYXlvdXQgb25jZS5cclxuICAgICAgICAgICAgIGF1ZGl0VGltZSgwLCBTQ1JPTExfU0NIRURVTEVSKVxyXG4gICAgICAgICAgIClcclxuICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25Db250ZW50U2Nyb2xsZWQoKTsgdGhpcy5hbm5hR3RTZXJ2aWNlLnZpcnR1YWxTY3JvbGxTdWJqZWN0Lm5leHQodHJ1ZSk7fSk7XHJcbiBcclxuICAgICAgICAgdGhpcy5fbWFya0NoYW5nZURldGVjdGlvbk5lZWRlZCgpO1xyXG4gICAgICAgfSlcclxuICAgICApO1xyXG4gICB9XHJcbiBcclxuICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgdGhpcy5kZXRhY2goKTtcclxuICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5kZXRhY2goKTtcclxuIFxyXG4gICAgIC8vIENvbXBsZXRlIGFsbCBzdWJqZWN0c1xyXG4gICAgIHRoaXMuX3JlbmRlcmVkUmFuZ2VTdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICAgdGhpcy5fZGV0YWNoZWRTdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICAgdGhpcy5fdmlld3BvcnRDaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XHJcbiBcclxuICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICB9XHJcbiBcclxuICAgLyoqIEF0dGFjaGVzIGEgYENka1ZpcnR1YWxTY3JvbGxSZXBlYXRlcmAgdG8gdGhpcyB2aWV3cG9ydC4gKi9cclxuICAgYXR0YWNoKGZvck9mOiBDZGtWaXJ0dWFsU2Nyb2xsUmVwZWF0ZXI8YW55Pikge1xyXG4gICAgIGlmICh0aGlzLl9mb3JPZikge1xyXG4gICAgICAgdGhyb3cgRXJyb3IoXCJDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgaXMgYWxyZWFkeSBhdHRhY2hlZC5cIik7XHJcbiAgICAgfVxyXG4gXHJcbiAgICAgLy8gU3Vic2NyaWJlIHRvIHRoZSBkYXRhIHN0cmVhbSBvZiB0aGUgQ2RrVmlydHVhbEZvck9mIHRvIGtlZXAgdHJhY2sgb2Ygd2hlbiB0aGUgZGF0YSBsZW5ndGhcclxuICAgICAvLyBjaGFuZ2VzLiBSdW4gb3V0c2lkZSB0aGUgem9uZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGNoYW5nZSBkZXRlY3Rpb24sIHNpbmNlIHdlJ3JlIG1hbmFnaW5nIHRoZVxyXG4gICAgIC8vIGNoYW5nZSBkZXRlY3Rpb24gbG9vcCBvdXJzZWx2ZXMuXHJcbiAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgdGhpcy5fZm9yT2YgPSBmb3JPZjtcclxuICAgICAgIHRoaXMuX2Zvck9mLmRhdGFTdHJlYW1cclxuICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2RldGFjaGVkU3ViamVjdCkpXHJcbiAgICAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgaWYgKG5ld0xlbmd0aCAhPT0gdGhpcy5fZGF0YUxlbmd0aCkge1xyXG4gICAgICAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCA9IG5ld0xlbmd0aDtcclxuICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5Lm9uRGF0YUxlbmd0aENoYW5nZWQoKTtcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgICAgdGhpcy5fZG9DaGFuZ2VEZXRlY3Rpb24oKTtcclxuICAgICAgICAgfSk7XHJcbiAgICAgfSk7XHJcbiAgIH1cclxuIFxyXG4gICAvKiogRGV0YWNoZXMgdGhlIGN1cnJlbnQgYENka1ZpcnR1YWxGb3JPZmAuICovXHJcbiAgIGRldGFjaCgpIHtcclxuICAgICB0aGlzLl9mb3JPZiA9IG51bGw7XHJcbiAgICAgdGhpcy5fZGV0YWNoZWRTdWJqZWN0Lm5leHQoKTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYm91bmQgdG8gdGhpcyB2aWV3cG9ydCAoaW4gbnVtYmVyIG9mIGl0ZW1zKS4gKi9cclxuICAgZ2V0RGF0YUxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgIHJldHVybiB0aGlzLl9kYXRhTGVuZ3RoO1xyXG4gICB9XHJcbiBcclxuICAgLyoqIEdldHMgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0IChpbiBwaXhlbHMpLiAqL1xyXG4gICBnZXRWaWV3cG9ydFNpemUoKTogbnVtYmVyIHtcclxuICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRTaXplO1xyXG4gICB9XHJcbiBcclxuICAgLy8gVE9ETyhtbWFsZXJiYSk6IFRoaXMgaXMgdGVjaG5pY2FsbHkgb3V0IG9mIHN5bmMgd2l0aCB3aGF0J3MgcmVhbGx5IHJlbmRlcmVkIHVudGlsIGEgcmVuZGVyXHJcbiAgIC8vIGN5Y2xlIGhhcHBlbnMuIEknbSBiZWluZyBjYXJlZnVsIHRvIG9ubHkgY2FsbCBpdCBhZnRlciB0aGUgcmVuZGVyIGN5Y2xlIGlzIGNvbXBsZXRlIGFuZCBiZWZvcmVcclxuICAgLy8gc2V0dGluZyBpdCB0byBzb21ldGhpbmcgZWxzZSwgYnV0IGl0cyBlcnJvciBwcm9uZSBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIHNwbGl0IGludG9cclxuICAgLy8gYHBlbmRpbmdSYW5nZWAgYW5kIGByZW5kZXJlZFJhbmdlYCwgdGhlIGxhdHRlciByZWZsZWN0aW5nIHdoYXRzIGFjdHVhbGx5IGluIHRoZSBET00uXHJcbiBcclxuICAgLyoqIEdldCB0aGUgY3VycmVudCByZW5kZXJlZCByYW5nZSBvZiBpdGVtcy4gKi9cclxuICAgZ2V0UmVuZGVyZWRSYW5nZSgpOiBMaXN0UmFuZ2Uge1xyXG4gICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZFJhbmdlO1xyXG4gICB9XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIFNldHMgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGNvbnRlbnQgKGluIHBpeGVscyksIGluY2x1ZGluZyBjb250ZW50IHRoYXQgaXMgbm90IGN1cnJlbnRseVxyXG4gICAgKiByZW5kZXJlZC5cclxuICAgICovXHJcbiAgIHNldFRvdGFsQ29udGVudFNpemUoc2l6ZTogbnVtYmVyKSB7XHJcbiAgICAgaWYgKHRoaXMuX3RvdGFsQ29udGVudFNpemUgIT09IHNpemUpIHtcclxuICAgICAgIHRoaXMuX3RvdGFsQ29udGVudFNpemUgPSBzaXplO1xyXG4gICAgICAgdGhpcy5fY2FsY3VsYXRlU3BhY2VyU2l6ZSgpO1xyXG4gICAgICAgdGhpcy5fbWFya0NoYW5nZURldGVjdGlvbk5lZWRlZCgpO1xyXG4gICAgIH1cclxuICAgfVxyXG4gXHJcbiAgIC8qKiBTZXRzIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgcmFuZ2Ugb2YgaW5kaWNlcy4gKi9cclxuICAgc2V0UmVuZGVyZWRSYW5nZShyYW5nZTogTGlzdFJhbmdlKSB7XHJcbiAgICAgaWYgKCFyYW5nZXNFcXVhbCh0aGlzLl9yZW5kZXJlZFJhbmdlLCByYW5nZSkpIHtcclxuICAgICAgIHRoaXMuX3JlbmRlcmVkUmFuZ2VTdWJqZWN0Lm5leHQoKHRoaXMuX3JlbmRlcmVkUmFuZ2UgPSByYW5nZSkpO1xyXG4gICAgICAgdGhpcy5fbWFya0NoYW5nZURldGVjdGlvbk5lZWRlZCgoKSA9PlxyXG4gICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkNvbnRlbnRSZW5kZXJlZCgpXHJcbiAgICAgICApO1xyXG4gICAgIH1cclxuICAgfVxyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBHZXRzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0IHRvIHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyZWQgZGF0YSAoaW4gcGl4ZWxzKS5cclxuICAgICovXHJcbiAgIGdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldE5lZWRzUmV3cml0ZVxyXG4gICAgICAgPyBudWxsXHJcbiAgICAgICA6IHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldDtcclxuICAgfVxyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBTZXRzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0IHRvIGVpdGhlciB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSByZW5kZXJlZCBkYXRhXHJcbiAgICAqIChpbiBwaXhlbHMpLlxyXG4gICAgKi9cclxuICAgc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICAgbGV0IHRvcCA9IGAke051bWJlcihvZmZzZXQpfXB4YDtcclxuICAgICB0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQgPSBvZmZzZXQ7XHJcbiAgICAgaWYgKHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybSAhPSB0b3ApIHtcclxuICAgICAgIC8vIFdlIGtub3cgdGhpcyB2YWx1ZSBpcyBzYWZlIGJlY2F1c2Ugd2UgcGFyc2UgYG9mZnNldGAgd2l0aCBgTnVtYmVyKClgIGJlZm9yZSBwYXNzaW5nIGl0XHJcbiAgICAgICAvLyBpbnRvIHRoZSBzdHJpbmcuXHJcbiAgICAgICB0aGlzLl9yZW5kZXJlZENvbnRlbnRUcmFuc2Zvcm0gPSB0b3A7XHJcbiAgICAgICB0aGlzLl9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKCgpID0+IHtcclxuICAgICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldE5lZWRzUmV3cml0ZSkge1xyXG4gICAgICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldCAtPSB0aGlzLm1lYXN1cmVSZW5kZXJlZENvbnRlbnRTaXplKCk7XHJcbiAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJlZENvbnRlbnRPZmZzZXQodGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0KTtcclxuICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5vblJlbmRlcmVkT2Zmc2V0Q2hhbmdlZCgpO1xyXG4gICAgICAgICB9XHJcbiAgICAgICB9KTtcclxuICAgICB9XHJcbiAgIH1cclxuIFxyXG4gICAvKipcclxuICAgICogU2Nyb2xscyB0byB0aGUgZ2l2ZW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB2aWV3cG9ydC4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhbHdheXNcclxuICAgICogdGhlIHNhbWUgYXMgc2V0dGluZyBgc2Nyb2xsVG9wYCBvciBgc2Nyb2xsTGVmdGAuIEluIGEgaG9yaXpvbnRhbCB2aWV3cG9ydCB3aXRoIHJpZ2h0LXRvLWxlZnRcclxuICAgICogZGlyZWN0aW9uLCB0aGlzIHdvdWxkIGJlIHRoZSBlcXVpdmFsZW50IG9mIHNldHRpbmcgYSBmaWN0aW9uYWwgYHNjcm9sbFJpZ2h0YCBwcm9wZXJ0eS5cclxuICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHRvIHNjcm9sbCB0by5cclxuICAgICogQHBhcmFtIGJlaGF2aW9yIFRoZSBTY3JvbGxCZWhhdmlvciB0byB1c2Ugd2hlbiBzY3JvbGxpbmcuIERlZmF1bHQgaXMgYmVoYXZpb3IgaXMgYGF1dG9gLlxyXG4gICAgKi9cclxuICAgc2Nyb2xsVG9PZmZzZXQob2Zmc2V0OiBudW1iZXIsIGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9IFwiYXV0b1wiKSB7XHJcbiAgICAgY29uc3Qgb3B0aW9uczogRXh0ZW5kZWRTY3JvbGxUb09wdGlvbnMgPSB7IGJlaGF2aW9yLCB0b3A6IG9mZnNldCB9O1xyXG4gICAgIHRoaXMuc2Nyb2xsVG8ob3B0aW9ucyk7XHJcbiAgIH1cclxuIFxyXG4gICAvKipcclxuICAgICogU2Nyb2xscyB0byB0aGUgb2Zmc2V0IGZvciB0aGUgZ2l2ZW4gaW5kZXguXHJcbiAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gc2Nyb2xsIHRvLlxyXG4gICAgKiBAcGFyYW0gYmVoYXZpb3IgVGhlIFNjcm9sbEJlaGF2aW9yIHRvIHVzZSB3aGVuIHNjcm9sbGluZy4gRGVmYXVsdCBpcyBiZWhhdmlvciBpcyBgYXV0b2AuXHJcbiAgICAqL1xyXG4gICBzY3JvbGxUb0luZGV4KGluZGV4OiBudW1iZXIsIGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9IFwiYXV0b1wiKSB7XHJcbiAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsVG9JbmRleChpbmRleCwgYmVoYXZpb3IpO1xyXG4gICB9XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Nyb2xsIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuXHJcbiAgICAqIEBwYXJhbSBmcm9tIFRoZSBlZGdlIHRvIG1lYXN1cmUgdGhlIG9mZnNldCBmcm9tLiBEZWZhdWx0cyB0byAndG9wJyBpbiB2ZXJ0aWNhbCBtb2RlIGFuZCAnc3RhcnQnXHJcbiAgICAqICAgICBpbiBob3Jpem9udGFsIG1vZGUuXHJcbiAgICAqL1xyXG4gIC8vICBDSEFOR0VTQEFOTkFMSUIgYWRkZWQgb3ZlcnJpZGUgdG8gZnVuY3Rpb25zXHJcbiAgIG92ZXJyaWRlIG1lYXN1cmVTY3JvbGxPZmZzZXQoXHJcbiAgICAgZnJvbT86IFwidG9wXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwiYm90dG9tXCIgfCBcInN0YXJ0XCIgfCBcImVuZFwiXHJcbiAgICk6IG51bWJlciB7XHJcbiAgICAgcmV0dXJuIGZyb21cclxuICAgICAgID8gc3VwZXIubWVhc3VyZVNjcm9sbE9mZnNldChmcm9tKVxyXG4gICAgICAgOiBzdXBlci5tZWFzdXJlU2Nyb2xsT2Zmc2V0KFwidG9wXCIpO1xyXG4gICB9XHJcbiBcclxuICAgLyoqIE1lYXN1cmUgdGhlIGNvbWJpbmVkIHNpemUgb2YgYWxsIG9mIHRoZSByZW5kZXJlZCBpdGVtcy4gKi9cclxuICAgbWVhc3VyZVJlbmRlcmVkQ29udGVudFNpemUoKTogbnVtYmVyIHtcclxuICAgICBjb25zdCBjb250ZW50RWwgPSB0aGlzLl9jb250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50O1xyXG4gICAgIHJldHVybiBjb250ZW50RWwub2Zmc2V0SGVpZ2h0O1xyXG4gICB9XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIE1lYXN1cmUgdGhlIHRvdGFsIGNvbWJpbmVkIHNpemUgb2YgdGhlIGdpdmVuIHJhbmdlLiBUaHJvd3MgaWYgdGhlIHJhbmdlIGluY2x1ZGVzIGl0ZW1zIHRoYXQgYXJlXHJcbiAgICAqIG5vdCByZW5kZXJlZC5cclxuICAgICovXHJcbiAgIG1lYXN1cmVSYW5nZVNpemUocmFuZ2U6IExpc3RSYW5nZSk6IG51bWJlciB7XHJcbiAgICAgaWYgKCF0aGlzLl9mb3JPZikge1xyXG4gICAgICAgcmV0dXJuIDA7XHJcbiAgICAgfVxyXG4gICAgIHJldHVybiB0aGlzLl9mb3JPZi5tZWFzdXJlUmFuZ2VTaXplKHJhbmdlLCB0aGlzLm9yaWVudGF0aW9uKTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKiBVcGRhdGUgdGhlIHZpZXdwb3J0IGRpbWVuc2lvbnMgYW5kIHJlLXJlbmRlci4gKi9cclxuICAgY2hlY2tWaWV3cG9ydFNpemUoKSB7XHJcbiAgICAgLy8gVE9ETzogQ2xlYW51cCBsYXRlciB3aGVuIGFkZCBsb2dpYyBmb3IgaGFuZGxpbmcgY29udGVudCByZXNpemVcclxuICAgICB0aGlzLl9tZWFzdXJlVmlld3BvcnRTaXplKCk7XHJcbiAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25EYXRhTGVuZ3RoQ2hhbmdlZCgpO1xyXG4gICB9XHJcbiBcclxuICAgLyoqIE1lYXN1cmUgdGhlIHZpZXdwb3J0IHNpemUuICovXHJcbiAgIHByaXZhdGUgX21lYXN1cmVWaWV3cG9ydFNpemUoKSB7XHJcbiAgICAgY29uc3Qgdmlld3BvcnRFbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgIHRoaXMuX3ZpZXdwb3J0U2l6ZSA9IHZpZXdwb3J0RWwuY2xpZW50SGVpZ2h0O1xyXG4gICB9XHJcbiBcclxuICAgLyoqIFF1ZXVlIHVwIGNoYW5nZSBkZXRlY3Rpb24gdG8gcnVuLiAqL1xyXG4gICBwcml2YXRlIF9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKHJ1bkFmdGVyPzogRnVuY3Rpb24pIHtcclxuICAgICBpZiAocnVuQWZ0ZXIpIHtcclxuICAgICAgIHRoaXMuX3J1bkFmdGVyQ2hhbmdlRGV0ZWN0aW9uLnB1c2gocnVuQWZ0ZXIpO1xyXG4gICAgIH1cclxuIFxyXG4gICAgIC8vIFVzZSBhIFByb21pc2UgdG8gYmF0Y2ggdG9nZXRoZXIgY2FsbHMgdG8gYF9kb0NoYW5nZURldGVjdGlvbmAuIFRoaXMgd2F5IGlmIHdlIHNldCBhIGJ1bmNoIG9mXHJcbiAgICAgLy8gcHJvcGVydGllcyBzZXF1ZW50aWFsbHkgd2Ugb25seSBoYXZlIHRvIHJ1biBgX2RvQ2hhbmdlRGV0ZWN0aW9uYCBvbmNlIGF0IHRoZSBlbmQuXHJcbiAgICAgaWYgKCF0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmcpIHtcclxuICAgICAgIHRoaXMuX2lzQ2hhbmdlRGV0ZWN0aW9uUGVuZGluZyA9IHRydWU7XHJcbiAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PlxyXG4gICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICB0aGlzLl9kb0NoYW5nZURldGVjdGlvbigpO1xyXG4gICAgICAgICB9KVxyXG4gICAgICAgKTtcclxuICAgICB9XHJcbiAgIH1cclxuIFxyXG4gICAvKiogUnVuIGNoYW5nZSBkZXRlY3Rpb24uICovXHJcbiAgIHByaXZhdGUgX2RvQ2hhbmdlRGV0ZWN0aW9uKCkge1xyXG4gICAgIHRoaXMuX2lzQ2hhbmdlRGV0ZWN0aW9uUGVuZGluZyA9IGZhbHNlO1xyXG4gXHJcbiAgICAgLy8gQXBwbHkgdGhlIGNvbnRlbnQgdHJhbnNmb3JtLiBUaGUgdHJhbnNmb3JtIGNhbid0IGJlIHNldCB2aWEgYW4gQW5ndWxhciBiaW5kaW5nIGJlY2F1c2VcclxuICAgICAvLyBieXBhc3NTZWN1cml0eVRydXN0U3R5bGUgaXMgYmFubmVkIGluIEdvb2dsZS4gSG93ZXZlciB0aGUgdmFsdWUgaXMgc2FmZSwgaXQncyBjb21wb3NlZCBvZlxyXG4gICAgIC8vIHN0cmluZyBsaXRlcmFscywgYSB2YXJpYWJsZSB0aGF0IGNhbiBvbmx5IGJlICdYJyBvciAnWScsIGFuZCB1c2VyIGlucHV0IHRoYXQgaXMgcnVuIHRocm91Z2hcclxuICAgICAvLyB0aGUgYE51bWJlcmAgZnVuY3Rpb24gZmlyc3QgdG8gY29lcmNlIGl0IHRvIGEgbnVtZXJpYyB2YWx1ZS5cclxuICAgICB0aGlzLl9jb250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybTtcclxuICAgICAvLyBBcHBseSBjaGFuZ2VzIHRvIEFuZ3VsYXIgYmluZGluZ3MuIE5vdGU6IFdlIG11c3QgY2FsbCBgbWFya0ZvckNoZWNrYCB0byBydW4gY2hhbmdlIGRldGVjdGlvblxyXG4gICAgIC8vIGZyb20gdGhlIHJvb3QsIHNpbmNlIHRoZSByZXBlYXRlZCBpdGVtcyBhcmUgY29udGVudCBwcm9qZWN0ZWQgaW4uIENhbGxpbmcgYGRldGVjdENoYW5nZXNgXHJcbiAgICAgLy8gaW5zdGVhZCBkb2VzIG5vdCBwcm9wZXJseSBjaGVjayB0aGUgcHJvamVjdGVkIGNvbnRlbnQuXHJcbiAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKTtcclxuIFxyXG4gICAgIGNvbnN0IHJ1bkFmdGVyQ2hhbmdlRGV0ZWN0aW9uID0gdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb247XHJcbiAgICAgdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24gPSBbXTtcclxuICAgICBmb3IgKGNvbnN0IGZuIG9mIHJ1bkFmdGVyQ2hhbmdlRGV0ZWN0aW9uKSB7XHJcbiAgICAgICBmbigpO1xyXG4gICAgIH1cclxuICAgfVxyXG4gXHJcbiAgIC8qKiBDYWxjdWxhdGVzIHRoZSBgc3R5bGUud2lkdGhgIGFuZCBgc3R5bGUuaGVpZ2h0YCBmb3IgdGhlIHNwYWNlciBlbGVtZW50LiAqL1xyXG4gICBwcml2YXRlIF9jYWxjdWxhdGVTcGFjZXJTaXplKCkge1xyXG4gICAgIHRoaXMuX3RvdGFsQ29udGVudEhlaWdodCA9IGAke3RoaXMuX3RvdGFsQ29udGVudFNpemV9cHhgO1xyXG4gICAgIHRoaXMuX3RvdGFsQ29udGVudFdpZHRoID0gXCJcIjtcclxuICAgfVxyXG4gfVxyXG4gIiwiPCEtLVxyXG4gIFdyYXAgdGhlIHJlbmRlcmVkIGNvbnRlbnQgaW4gYW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgdXNlZCB0byBvZmZzZXQgaXQgYmFzZWQgb24gdGhlIHNjcm9sbFxyXG4gIHBvc2l0aW9uLlxyXG4tLT5cclxuPGRpdiAjY29udGVudFdyYXBwZXIgY2xhc3M9XCJhbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlclwiPlxyXG5cdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuPC9kaXY+XHJcbjwhLS1cclxuICBTcGFjZXIgdXNlZCB0byBmb3JjZSB0aGUgc2Nyb2xsaW5nIGNvbnRhaW5lciB0byB0aGUgY29ycmVjdCBzaXplIGZvciB0aGUgKnRvdGFsKiBudW1iZXIgb2YgaXRlbXNcclxuICBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgY2FwdHVyZXMgdGhlIHNpemUgb2YgdGhlIGVudGlyZSBkYXRhIHNldC5cclxuLS0+XHJcbjxkaXYgY2xhc3M9XCJhcHAtdGFibGUtdmlydHVhbC1zY3JvbGwtc3BhY2VyXCIgW3N0eWxlLndpZHRoXT1cIl90b3RhbENvbnRlbnRXaWR0aFwiIFtzdHlsZS5oZWlnaHRdPVwiX3RvdGFsQ29udGVudEhlaWdodFwiPlxyXG48L2Rpdj4iXX0=