@lenne.tech/ng-base 0.3.13 → 13.1.0

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 (204) hide show
  1. package/{esm2015/lenne.tech-ng-base.js → esm2020/lenne.tech-ng-base.mjs} +0 -0
  2. package/esm2020/lib/base/base.module.mjs +97 -0
  3. package/{esm2015/lib/base/classes/basic-user.class.js → esm2020/lib/base/classes/basic-user.class.mjs} +0 -0
  4. package/{esm2015/lib/base/classes/graphql-enum.class.js → esm2020/lib/base/classes/graphql-enum.class.mjs} +0 -0
  5. package/esm2020/lib/base/classes/graphql-meta.class.mjs +171 -0
  6. package/{esm2015/lib/base/classes/graphql-type.class.js → esm2020/lib/base/classes/graphql-type.class.mjs} +0 -0
  7. package/esm2020/lib/base/classes/helper.class.mjs +295 -0
  8. package/{esm2015/lib/base/classes/standard.class.js → esm2020/lib/base/classes/standard.class.mjs} +0 -0
  9. package/esm2020/lib/base/directives/context-menu.directive.mjs +109 -0
  10. package/esm2020/lib/base/directives/lazy-load.directive.mjs +45 -0
  11. package/esm2020/lib/base/directives/match-height.directive.mjs +79 -0
  12. package/esm2020/lib/base/directives/resizable.directive.mjs +90 -0
  13. package/{esm2015/lib/base/enums/comparison-operator.enum.js → esm2020/lib/base/enums/comparison-operator.enum.mjs} +0 -0
  14. package/{esm2015/lib/base/enums/graphql-request-type.enum.js → esm2020/lib/base/enums/graphql-request-type.enum.mjs} +0 -0
  15. package/{esm2015/lib/base/enums/logical-operator.enum.js → esm2020/lib/base/enums/logical-operator.enum.mjs} +0 -0
  16. package/{esm2015/lib/base/enums/sort-order.enum.js → esm2020/lib/base/enums/sort-order.enum.mjs} +0 -0
  17. package/{esm2015/lib/base/factories/apollo-options.factory.js → esm2020/lib/base/factories/apollo-options.factory.mjs} +0 -0
  18. package/esm2020/lib/base/guards/auth.guard.mjs +61 -0
  19. package/esm2020/lib/base/guards/can-deactivate.guard.mjs +16 -0
  20. package/esm2020/lib/base/guards/logout.guard.mjs +32 -0
  21. package/{esm2015/lib/base/index.js → esm2020/lib/base/index.mjs} +0 -0
  22. package/{esm2015/lib/base/interfaces/base-module-config.interface.js → esm2020/lib/base/interfaces/base-module-config.interface.mjs} +0 -0
  23. package/{esm2015/lib/base/interfaces/can-component-deactivate.interface.js → esm2020/lib/base/interfaces/can-component-deactivate.interface.mjs} +0 -0
  24. package/{esm2015/lib/base/interfaces/combined-filter-input.interface.js → esm2020/lib/base/interfaces/combined-filter-input.interface.mjs} +0 -0
  25. package/{esm2015/lib/base/interfaces/field-object.interface.js → esm2020/lib/base/interfaces/field-object.interface.mjs} +0 -0
  26. package/{esm2015/lib/base/interfaces/field.interface.js → esm2020/lib/base/interfaces/field.interface.mjs} +0 -0
  27. package/{esm2015/lib/base/interfaces/filter-input.interface.js → esm2020/lib/base/interfaces/filter-input.interface.mjs} +0 -0
  28. package/{esm2015/lib/base/interfaces/find-args.interface.js → esm2020/lib/base/interfaces/find-args.interface.mjs} +0 -0
  29. package/{esm2015/lib/base/interfaces/graphql-options.interface.js → esm2020/lib/base/interfaces/graphql-options.interface.mjs} +0 -0
  30. package/{esm2015/lib/base/interfaces/graphql-plus-options.interfacen.js → esm2020/lib/base/interfaces/graphql-plus-options.interfacen.mjs} +0 -0
  31. package/{esm2015/lib/base/interfaces/graphql-type-collection.interface.js → esm2020/lib/base/interfaces/graphql-type-collection.interface.mjs} +0 -0
  32. package/{esm2015/lib/base/interfaces/single-filter-input.interface.js → esm2020/lib/base/interfaces/single-filter-input.interface.mjs} +0 -0
  33. package/{esm2015/lib/base/interfaces/sort-input.interface.js → esm2020/lib/base/interfaces/sort-input.interface.mjs} +0 -0
  34. package/esm2020/lib/base/pipes/ellipses.pipe.mjs +22 -0
  35. package/esm2020/lib/base/pipes/safe-html.pipe.mjs +21 -0
  36. package/{esm2015/lib/base/public-api.js → esm2020/lib/base/public-api.mjs} +0 -0
  37. package/{esm2015/lib/base/services/auth.service.js → esm2020/lib/base/services/auth.service.mjs} +14 -17
  38. package/{esm2015/lib/base/services/fullscreen.service.js → esm2020/lib/base/services/fullscreen.service.mjs} +9 -8
  39. package/esm2020/lib/base/services/graphql-meta.service.mjs +123 -0
  40. package/esm2020/lib/base/services/graphql-plus.service.mjs +84 -0
  41. package/esm2020/lib/base/services/graphql.service.mjs +441 -0
  42. package/esm2020/lib/base/services/image.service.mjs +102 -0
  43. package/esm2020/lib/base/services/loader.service.mjs +29 -0
  44. package/esm2020/lib/base/services/scroll.service.mjs +179 -0
  45. package/esm2020/lib/base/services/seo.service.mjs +97 -0
  46. package/esm2020/lib/base/services/storage.service.mjs +132 -0
  47. package/esm2020/lib/base/services/ws.service.mjs +17 -0
  48. package/{esm2015/lib/base/types/storage.type.js → esm2020/lib/base/types/storage.type.mjs} +0 -0
  49. package/{esm2015/lib/base/validators/must-match.validator.js → esm2020/lib/base/validators/must-match.validator.mjs} +0 -0
  50. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  51. package/esm2020/src/lib/base/base.module.mjs +97 -0
  52. package/{esm2015/src/lib/base/classes/basic-user.class.js → esm2020/src/lib/base/classes/basic-user.class.mjs} +0 -0
  53. package/{esm2015/src/lib/base/classes/graphql-enum.class.js → esm2020/src/lib/base/classes/graphql-enum.class.mjs} +0 -0
  54. package/esm2020/src/lib/base/classes/graphql-meta.class.mjs +171 -0
  55. package/{esm2015/src/lib/base/classes/graphql-type.class.js → esm2020/src/lib/base/classes/graphql-type.class.mjs} +0 -0
  56. package/esm2020/src/lib/base/classes/helper.class.mjs +295 -0
  57. package/{esm2015/src/lib/base/classes/standard.class.js → esm2020/src/lib/base/classes/standard.class.mjs} +0 -0
  58. package/esm2020/src/lib/base/directives/context-menu.directive.mjs +109 -0
  59. package/esm2020/src/lib/base/directives/lazy-load.directive.mjs +45 -0
  60. package/esm2020/src/lib/base/directives/match-height.directive.mjs +79 -0
  61. package/esm2020/src/lib/base/directives/resizable.directive.mjs +90 -0
  62. package/{esm2015/src/lib/base/enums/comparison-operator.enum.js → esm2020/src/lib/base/enums/comparison-operator.enum.mjs} +0 -0
  63. package/{esm2015/src/lib/base/enums/graphql-request-type.enum.js → esm2020/src/lib/base/enums/graphql-request-type.enum.mjs} +0 -0
  64. package/{esm2015/src/lib/base/enums/logical-operator.enum.js → esm2020/src/lib/base/enums/logical-operator.enum.mjs} +0 -0
  65. package/{esm2015/src/lib/base/enums/sort-order.enum.js → esm2020/src/lib/base/enums/sort-order.enum.mjs} +0 -0
  66. package/{esm2015/src/lib/base/factories/apollo-options.factory.js → esm2020/src/lib/base/factories/apollo-options.factory.mjs} +0 -0
  67. package/esm2020/src/lib/base/guards/auth.guard.mjs +61 -0
  68. package/esm2020/src/lib/base/guards/can-deactivate.guard.mjs +16 -0
  69. package/esm2020/src/lib/base/guards/logout.guard.mjs +32 -0
  70. package/{esm2015/src/lib/base/interfaces/base-module-config.interface.js → esm2020/src/lib/base/interfaces/base-module-config.interface.mjs} +0 -0
  71. package/{esm2015/src/lib/base/interfaces/can-component-deactivate.interface.js → esm2020/src/lib/base/interfaces/can-component-deactivate.interface.mjs} +0 -0
  72. package/{esm2015/src/lib/base/interfaces/combined-filter-input.interface.js → esm2020/src/lib/base/interfaces/combined-filter-input.interface.mjs} +0 -0
  73. package/{esm2015/src/lib/base/interfaces/field-object.interface.js → esm2020/src/lib/base/interfaces/field-object.interface.mjs} +0 -0
  74. package/{esm2015/src/lib/base/interfaces/field.interface.js → esm2020/src/lib/base/interfaces/field.interface.mjs} +0 -0
  75. package/{esm2015/src/lib/base/interfaces/filter-input.interface.js → esm2020/src/lib/base/interfaces/filter-input.interface.mjs} +0 -0
  76. package/{esm2015/src/lib/base/interfaces/find-args.interface.js → esm2020/src/lib/base/interfaces/find-args.interface.mjs} +0 -0
  77. package/{esm2015/src/lib/base/interfaces/graphql-options.interface.js → esm2020/src/lib/base/interfaces/graphql-options.interface.mjs} +0 -0
  78. package/{esm2015/src/lib/base/interfaces/graphql-plus-options.interfacen.js → esm2020/src/lib/base/interfaces/graphql-plus-options.interfacen.mjs} +0 -0
  79. package/{esm2015/src/lib/base/interfaces/graphql-type-collection.interface.js → esm2020/src/lib/base/interfaces/graphql-type-collection.interface.mjs} +0 -0
  80. package/{esm2015/src/lib/base/interfaces/single-filter-input.interface.js → esm2020/src/lib/base/interfaces/single-filter-input.interface.mjs} +0 -0
  81. package/{esm2015/src/lib/base/interfaces/sort-input.interface.js → esm2020/src/lib/base/interfaces/sort-input.interface.mjs} +0 -0
  82. package/{esm2015/src/lib/base/lenne.tech-ng-base-src-lib-base.js → esm2020/src/lib/base/lenne.tech-ng-base-src-lib-base.mjs} +0 -0
  83. package/esm2020/src/lib/base/pipes/ellipses.pipe.mjs +22 -0
  84. package/esm2020/src/lib/base/pipes/safe-html.pipe.mjs +21 -0
  85. package/{esm2015/src/lib/base/public-api.js → esm2020/src/lib/base/public-api.mjs} +0 -0
  86. package/{esm2015/src/lib/base/services/auth.service.js → esm2020/src/lib/base/services/auth.service.mjs} +14 -17
  87. package/{esm2015/src/lib/base/services/fullscreen.service.js → esm2020/src/lib/base/services/fullscreen.service.mjs} +9 -8
  88. package/esm2020/src/lib/base/services/graphql-meta.service.mjs +123 -0
  89. package/esm2020/src/lib/base/services/graphql-plus.service.mjs +84 -0
  90. package/esm2020/src/lib/base/services/graphql.service.mjs +441 -0
  91. package/esm2020/src/lib/base/services/image.service.mjs +102 -0
  92. package/esm2020/src/lib/base/services/loader.service.mjs +29 -0
  93. package/esm2020/src/lib/base/services/scroll.service.mjs +179 -0
  94. package/esm2020/src/lib/base/services/seo.service.mjs +97 -0
  95. package/esm2020/src/lib/base/services/storage.service.mjs +132 -0
  96. package/esm2020/src/lib/base/services/ws.service.mjs +17 -0
  97. package/{esm2015/src/lib/base/types/storage.type.js → esm2020/src/lib/base/types/storage.type.mjs} +0 -0
  98. package/{esm2015/src/lib/base/validators/must-match.validator.js → esm2020/src/lib/base/validators/must-match.validator.mjs} +0 -0
  99. package/fesm2015/{lenne.tech-ng-base-src-lib-base.js → lenne.tech-ng-base-src-lib-base.mjs} +240 -197
  100. package/fesm2015/lenne.tech-ng-base-src-lib-base.mjs.map +1 -0
  101. package/fesm2015/{lenne.tech-ng-base.js → lenne.tech-ng-base.mjs} +240 -197
  102. package/fesm2015/lenne.tech-ng-base.mjs.map +1 -0
  103. package/fesm2020/lenne.tech-ng-base-src-lib-base.mjs +2524 -0
  104. package/fesm2020/lenne.tech-ng-base-src-lib-base.mjs.map +1 -0
  105. package/fesm2020/lenne.tech-ng-base.mjs +2526 -0
  106. package/fesm2020/lenne.tech-ng-base.mjs.map +1 -0
  107. package/lenne.tech-ng-base.d.ts +1 -0
  108. package/lib/base/base.module.d.ts +11 -1
  109. package/lib/base/classes/graphql-meta.class.d.ts +2 -4
  110. package/lib/base/directives/context-menu.directive.d.ts +3 -0
  111. package/lib/base/directives/lazy-load.directive.d.ts +3 -0
  112. package/lib/base/directives/match-height.directive.d.ts +3 -0
  113. package/lib/base/directives/resizable.directive.d.ts +3 -0
  114. package/lib/base/guards/auth.guard.d.ts +3 -0
  115. package/lib/base/guards/can-deactivate.guard.d.ts +3 -0
  116. package/lib/base/guards/logout.guard.d.ts +3 -0
  117. package/lib/base/pipes/ellipses.pipe.d.ts +3 -0
  118. package/lib/base/pipes/safe-html.pipe.d.ts +3 -0
  119. package/lib/base/services/auth.service.d.ts +3 -0
  120. package/lib/base/services/fullscreen.service.d.ts +3 -0
  121. package/lib/base/services/graphql-meta.service.d.ts +3 -0
  122. package/lib/base/services/graphql-plus.service.d.ts +3 -0
  123. package/lib/base/services/graphql.service.d.ts +3 -0
  124. package/lib/base/services/image.service.d.ts +3 -0
  125. package/lib/base/services/loader.service.d.ts +3 -0
  126. package/lib/base/services/scroll.service.d.ts +3 -0
  127. package/lib/base/services/seo.service.d.ts +3 -0
  128. package/lib/base/services/storage.service.d.ts +3 -0
  129. package/lib/base/services/ws.service.d.ts +3 -0
  130. package/package.json +38 -18
  131. package/src/lib/base/base.module.d.ts +11 -1
  132. package/src/lib/base/classes/graphql-meta.class.d.ts +2 -4
  133. package/src/lib/base/directives/context-menu.directive.d.ts +3 -0
  134. package/src/lib/base/directives/lazy-load.directive.d.ts +3 -0
  135. package/src/lib/base/directives/match-height.directive.d.ts +3 -0
  136. package/src/lib/base/directives/resizable.directive.d.ts +3 -0
  137. package/src/lib/base/guards/auth.guard.d.ts +3 -0
  138. package/src/lib/base/guards/can-deactivate.guard.d.ts +3 -0
  139. package/src/lib/base/guards/logout.guard.d.ts +3 -0
  140. package/src/lib/base/lenne.tech-ng-base-src-lib-base.d.ts +1 -0
  141. package/src/lib/base/package.json +5 -6
  142. package/src/lib/base/pipes/ellipses.pipe.d.ts +3 -0
  143. package/src/lib/base/pipes/safe-html.pipe.d.ts +3 -0
  144. package/src/lib/base/services/auth.service.d.ts +3 -0
  145. package/src/lib/base/services/fullscreen.service.d.ts +3 -0
  146. package/src/lib/base/services/graphql-meta.service.d.ts +3 -0
  147. package/src/lib/base/services/graphql-plus.service.d.ts +3 -0
  148. package/src/lib/base/services/graphql.service.d.ts +3 -0
  149. package/src/lib/base/services/image.service.d.ts +3 -0
  150. package/src/lib/base/services/loader.service.d.ts +3 -0
  151. package/src/lib/base/services/scroll.service.d.ts +3 -0
  152. package/src/lib/base/services/seo.service.d.ts +3 -0
  153. package/src/lib/base/services/storage.service.d.ts +3 -0
  154. package/src/lib/base/services/ws.service.d.ts +3 -0
  155. package/bundles/lenne.tech-ng-base-src-lib-base.umd.js +0 -3152
  156. package/bundles/lenne.tech-ng-base-src-lib-base.umd.js.map +0 -1
  157. package/bundles/lenne.tech-ng-base.umd.js +0 -3154
  158. package/bundles/lenne.tech-ng-base.umd.js.map +0 -1
  159. package/esm2015/lib/base/base.module.js +0 -66
  160. package/esm2015/lib/base/classes/graphql-meta.class.js +0 -156
  161. package/esm2015/lib/base/classes/helper.class.js +0 -290
  162. package/esm2015/lib/base/directives/context-menu.directive.js +0 -104
  163. package/esm2015/lib/base/directives/lazy-load.directive.js +0 -43
  164. package/esm2015/lib/base/directives/match-height.directive.js +0 -78
  165. package/esm2015/lib/base/directives/resizable.directive.js +0 -89
  166. package/esm2015/lib/base/guards/auth.guard.js +0 -61
  167. package/esm2015/lib/base/guards/can-deactivate.guard.js +0 -13
  168. package/esm2015/lib/base/guards/logout.guard.js +0 -33
  169. package/esm2015/lib/base/pipes/ellipses.pipe.js +0 -18
  170. package/esm2015/lib/base/pipes/safe-html.pipe.js +0 -20
  171. package/esm2015/lib/base/services/graphql-meta.service.js +0 -116
  172. package/esm2015/lib/base/services/graphql-plus.service.js +0 -90
  173. package/esm2015/lib/base/services/graphql.service.js +0 -423
  174. package/esm2015/lib/base/services/image.service.js +0 -99
  175. package/esm2015/lib/base/services/loader.service.js +0 -27
  176. package/esm2015/lib/base/services/scroll.service.js +0 -172
  177. package/esm2015/lib/base/services/seo.service.js +0 -100
  178. package/esm2015/lib/base/services/storage.service.js +0 -131
  179. package/esm2015/lib/base/services/ws.service.js +0 -16
  180. package/esm2015/src/lib/base/base.module.js +0 -66
  181. package/esm2015/src/lib/base/classes/graphql-meta.class.js +0 -156
  182. package/esm2015/src/lib/base/classes/helper.class.js +0 -290
  183. package/esm2015/src/lib/base/directives/context-menu.directive.js +0 -104
  184. package/esm2015/src/lib/base/directives/lazy-load.directive.js +0 -43
  185. package/esm2015/src/lib/base/directives/match-height.directive.js +0 -78
  186. package/esm2015/src/lib/base/directives/resizable.directive.js +0 -89
  187. package/esm2015/src/lib/base/guards/auth.guard.js +0 -61
  188. package/esm2015/src/lib/base/guards/can-deactivate.guard.js +0 -13
  189. package/esm2015/src/lib/base/guards/logout.guard.js +0 -33
  190. package/esm2015/src/lib/base/pipes/ellipses.pipe.js +0 -18
  191. package/esm2015/src/lib/base/pipes/safe-html.pipe.js +0 -20
  192. package/esm2015/src/lib/base/services/graphql-meta.service.js +0 -116
  193. package/esm2015/src/lib/base/services/graphql-plus.service.js +0 -90
  194. package/esm2015/src/lib/base/services/graphql.service.js +0 -423
  195. package/esm2015/src/lib/base/services/image.service.js +0 -99
  196. package/esm2015/src/lib/base/services/loader.service.js +0 -27
  197. package/esm2015/src/lib/base/services/scroll.service.js +0 -172
  198. package/esm2015/src/lib/base/services/seo.service.js +0 -100
  199. package/esm2015/src/lib/base/services/storage.service.js +0 -131
  200. package/esm2015/src/lib/base/services/ws.service.js +0 -16
  201. package/fesm2015/lenne.tech-ng-base-src-lib-base.js.map +0 -1
  202. package/fesm2015/lenne.tech-ng-base.js.map +0 -1
  203. package/lenne.tech-ng-base.metadata.json +0 -1
  204. package/src/lib/base/lenne.tech-ng-base-src-lib-base.metadata.json +0 -1
@@ -0,0 +1,109 @@
1
+ import { Directive, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Directive vor context menu
5
+ * See https://stackblitz.com/edit/angular-custom-context-menu
6
+ */
7
+ export class ContextMenuDirective {
8
+ constructor(el) {
9
+ this.el = el;
10
+ this.xGap = 0;
11
+ this.yGap = 0;
12
+ this.overflowSpace = 10;
13
+ this.selectors = '*';
14
+ this.clickedElement = null;
15
+ this.previousDisplayStatus = null;
16
+ }
17
+ ngOnInit() {
18
+ if (this.ltContextMenu) {
19
+ this.previousDisplayStatus = this.ltContextMenu.style.display;
20
+ }
21
+ // Add a click listener to the window,
22
+ // so that we can close the context menu on left click
23
+ window.addEventListener('click', () => {
24
+ this.showContextMenu(null, false);
25
+ });
26
+ // Close context menu when escape is pressed
27
+ window.addEventListener('keydown', (e) => {
28
+ if (e.code === 'Escape') {
29
+ this.showContextMenu(null, false);
30
+ }
31
+ });
32
+ // Add an event listener to listen to the 'contextmenu' event
33
+ this.el.nativeElement.addEventListener('contextmenu', (e) => {
34
+ // Prevent the default context menu to popup
35
+ if (e.preventDefault) {
36
+ e.preventDefault();
37
+ }
38
+ // Shows our own context menu
39
+ this.showContextMenu(e, true);
40
+ });
41
+ }
42
+ // Shows or hides our custom context menu, which is specified as a input
43
+ showContextMenu(event, show) {
44
+ const cm = this.ltContextMenu;
45
+ if (cm) {
46
+ // Try to open context menu
47
+ if (show && event && event instanceof MouseEvent) {
48
+ // Get valid clicked structureElement
49
+ const clickedElement = event?.target?.closest(this.selectors);
50
+ if (clickedElement) {
51
+ // Set clicked structureElement
52
+ this.clickedElement = clickedElement;
53
+ setTimeout(() => {
54
+ // Set display status
55
+ cm.style.display = 'block';
56
+ // Calculate top position
57
+ let top = event.y + this.yGap;
58
+ if (top + cm.offsetHeight + 10 > document.documentElement.clientHeight) {
59
+ top = document.documentElement.clientHeight - cm.offsetHeight - this.overflowSpace;
60
+ }
61
+ // Calculate left position
62
+ let left = event.x + this.xGap;
63
+ if (left + cm.offsetWidth + 10 > document.documentElement.clientWidth) {
64
+ left = document.documentElement.clientWidth - cm.offsetWidth - this.overflowSpace;
65
+ }
66
+ // Set position
67
+ cm.style.top = top + 'px';
68
+ cm.style.left = left + 'px';
69
+ // Show
70
+ cm.style.opacity = '1.0';
71
+ cm.style['pointer-events'] = 'auto';
72
+ }, 1);
73
+ return;
74
+ }
75
+ }
76
+ // Close context menu
77
+ this.clickedElement = null;
78
+ if (this.previousDisplayStatus) {
79
+ cm.style.display = this.previousDisplayStatus;
80
+ }
81
+ cm.style.opacity = '0.01';
82
+ cm.style['pointer-events'] = 'none';
83
+ }
84
+ }
85
+ }
86
+ ContextMenuDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ContextMenuDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
87
+ ContextMenuDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: ContextMenuDirective, selector: "[ltContextMenu]", inputs: { contextMenuData: "contextMenuData", ltContextMenu: "ltContextMenu", xGap: "xGap", yGap: "yGap", overflowSpace: "overflowSpace", selectors: "selectors" }, outputs: { clickedElement: "clickedElement" }, exportAs: ["contextMenuData"], ngImport: i0 });
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ContextMenuDirective, decorators: [{
89
+ type: Directive,
90
+ args: [{
91
+ selector: '[ltContextMenu]',
92
+ exportAs: 'contextMenuData',
93
+ }]
94
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { contextMenuData: [{
95
+ type: Input
96
+ }], ltContextMenu: [{
97
+ type: Input
98
+ }], xGap: [{
99
+ type: Input
100
+ }], yGap: [{
101
+ type: Input
102
+ }], overflowSpace: [{
103
+ type: Input
104
+ }], selectors: [{
105
+ type: Input
106
+ }], clickedElement: [{
107
+ type: Output
108
+ }] } });
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL2RpcmVjdGl2ZXMvY29udGV4dC1tZW51LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTdFOzs7R0FHRztBQUtILE1BQU0sT0FBTyxvQkFBb0I7SUFVL0IsWUFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUFQekIsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixjQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ2YsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFDekMsMEJBQXFCLEdBQVcsSUFBSSxDQUFDO0lBRUEsQ0FBQztJQUV0QyxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDL0Q7UUFFRCxzQ0FBc0M7UUFDdEMsc0RBQXNEO1FBQ3RELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsNENBQTRDO1FBQzVDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNuQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzFELDRDQUE0QztZQUM1QyxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3BCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUNwQjtZQUNELDZCQUE2QjtZQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFhO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDOUIsSUFBSSxFQUFFLEVBQUU7WUFDTiwyQkFBMkI7WUFDM0IsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUU7Z0JBQ2hELHFDQUFxQztnQkFDckMsTUFBTSxjQUFjLEdBQUksS0FBSyxFQUFFLE1BQXNCLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxjQUFjLEVBQUU7b0JBQ2xCLCtCQUErQjtvQkFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7b0JBRXJDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ2QscUJBQXFCO3dCQUNyQixFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7d0JBRTNCLHlCQUF5Qjt3QkFDekIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO3dCQUM5QixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRTs0QkFDdEUsR0FBRyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzt5QkFDcEY7d0JBRUQsMEJBQTBCO3dCQUMxQixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQy9CLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFOzRCQUNyRSxJQUFJLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO3lCQUNuRjt3QkFFRCxlQUFlO3dCQUNmLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7d0JBQzFCLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7d0JBRTVCLE9BQU87d0JBQ1AsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO3dCQUN6QixFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsTUFBTSxDQUFDO29CQUN0QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBRU4sT0FBTztpQkFDUjthQUNGO1lBRUQscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUM5QixFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7YUFDL0M7WUFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDMUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLE1BQU0sQ0FBQztTQUNyQztJQUNILENBQUM7O2lIQTFGVSxvQkFBb0I7cUdBQXBCLG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQUpoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCO2lHQUVVLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgdm9yIGNvbnRleHQgbWVudVxuICogU2VlIGh0dHBzOi8vc3RhY2tibGl0ei5jb20vZWRpdC9hbmd1bGFyLWN1c3RvbS1jb250ZXh0LW1lbnVcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2x0Q29udGV4dE1lbnVdJyxcbiAgZXhwb3J0QXM6ICdjb250ZXh0TWVudURhdGEnLFxufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0TWVudURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbnRleHRNZW51RGF0YT86IGFueTtcbiAgQElucHV0KCkgbHRDb250ZXh0TWVudTogSFRNTEVsZW1lbnQ7XG4gIEBJbnB1dCgpIHhHYXAgPSAwO1xuICBASW5wdXQoKSB5R2FwID0gMDtcbiAgQElucHV0KCkgb3ZlcmZsb3dTcGFjZSA9IDEwO1xuICBASW5wdXQoKSBzZWxlY3RvcnMgPSAnKic7XG4gIEBPdXRwdXQoKSBjbGlja2VkRWxlbWVudDogRWxlbWVudCA9IG51bGw7XG4gIHByZXZpb3VzRGlzcGxheVN0YXR1czogc3RyaW5nID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLmx0Q29udGV4dE1lbnUpIHtcbiAgICAgIHRoaXMucHJldmlvdXNEaXNwbGF5U3RhdHVzID0gdGhpcy5sdENvbnRleHRNZW51LnN0eWxlLmRpc3BsYXk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgY2xpY2sgbGlzdGVuZXIgdG8gdGhlIHdpbmRvdyxcbiAgICAvLyBzbyB0aGF0IHdlIGNhbiBjbG9zZSB0aGUgY29udGV4dCBtZW51IG9uIGxlZnQgY2xpY2tcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLnNob3dDb250ZXh0TWVudShudWxsLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbG9zZSBjb250ZXh0IG1lbnUgd2hlbiBlc2NhcGUgaXMgcHJlc3NlZFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIHRoaXMuc2hvd0NvbnRleHRNZW51KG51bGwsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBsaXN0ZW4gdG8gdGhlICdjb250ZXh0bWVudScgZXZlbnRcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4ge1xuICAgICAgLy8gUHJldmVudCB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgdG8gcG9wdXBcbiAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIC8vIFNob3dzIG91ciBvd24gY29udGV4dCBtZW51XG4gICAgICB0aGlzLnNob3dDb250ZXh0TWVudShlLCB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNob3dzIG9yIGhpZGVzIG91ciBjdXN0b20gY29udGV4dCBtZW51LCB3aGljaCBpcyBzcGVjaWZpZWQgYXMgYSBpbnB1dFxuICBzaG93Q29udGV4dE1lbnUoZXZlbnQsIHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjbSA9IHRoaXMubHRDb250ZXh0TWVudTtcbiAgICBpZiAoY20pIHtcbiAgICAgIC8vIFRyeSB0byBvcGVuIGNvbnRleHQgbWVudVxuICAgICAgaWYgKHNob3cgJiYgZXZlbnQgJiYgZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIEdldCB2YWxpZCBjbGlja2VkIHN0cnVjdHVyZUVsZW1lbnRcbiAgICAgICAgY29uc3QgY2xpY2tlZEVsZW1lbnQgPSAoZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LmNsb3Nlc3QodGhpcy5zZWxlY3RvcnMpO1xuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBTZXQgY2xpY2tlZCBzdHJ1Y3R1cmVFbGVtZW50XG4gICAgICAgICAgdGhpcy5jbGlja2VkRWxlbWVudCA9IGNsaWNrZWRFbGVtZW50O1xuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBTZXQgZGlzcGxheSBzdGF0dXNcbiAgICAgICAgICAgIGNtLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG9wIHBvc2l0aW9uXG4gICAgICAgICAgICBsZXQgdG9wID0gZXZlbnQueSArIHRoaXMueUdhcDtcbiAgICAgICAgICAgIGlmICh0b3AgKyBjbS5vZmZzZXRIZWlnaHQgKyAxMCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgdG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCAtIGNtLm9mZnNldEhlaWdodCAtIHRoaXMub3ZlcmZsb3dTcGFjZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGxlZnQgcG9zaXRpb25cbiAgICAgICAgICAgIGxldCBsZWZ0ID0gZXZlbnQueCArIHRoaXMueEdhcDtcbiAgICAgICAgICAgIGlmIChsZWZ0ICsgY20ub2Zmc2V0V2lkdGggKyAxMCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgICBsZWZ0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gY20ub2Zmc2V0V2lkdGggLSB0aGlzLm92ZXJmbG93U3BhY2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCBwb3NpdGlvblxuICAgICAgICAgICAgY20uc3R5bGUudG9wID0gdG9wICsgJ3B4JztcbiAgICAgICAgICAgIGNtLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4JztcblxuICAgICAgICAgICAgLy8gU2hvd1xuICAgICAgICAgICAgY20uc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xuICAgICAgICAgICAgY20uc3R5bGVbJ3BvaW50ZXItZXZlbnRzJ10gPSAnYXV0byc7XG4gICAgICAgICAgfSwgMSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xvc2UgY29udGV4dCBtZW51XG4gICAgICB0aGlzLmNsaWNrZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnByZXZpb3VzRGlzcGxheVN0YXR1cykge1xuICAgICAgICBjbS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5wcmV2aW91c0Rpc3BsYXlTdGF0dXM7XG4gICAgICB9XG4gICAgICBjbS5zdHlsZS5vcGFjaXR5ID0gJzAuMDEnO1xuICAgICAgY20uc3R5bGVbJ3BvaW50ZXItZXZlbnRzJ10gPSAnbm9uZSc7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,45 @@
1
+ import { Directive, HostBinding, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Directive for lazy loading images
5
+ */
6
+ export class LazyLoadDirective {
7
+ constructor(el) {
8
+ this.el = el;
9
+ this.srcAttr = null;
10
+ }
11
+ ngAfterViewInit() {
12
+ this.canLazyLoad() ? this.lazyLoadImage() : this.loadImage();
13
+ }
14
+ canLazyLoad() {
15
+ return window && 'IntersectionObserver' in window;
16
+ }
17
+ lazyLoadImage() {
18
+ const obs = new IntersectionObserver((entries) => {
19
+ entries.forEach(({ isIntersecting }) => {
20
+ if (isIntersecting) {
21
+ this.loadImage();
22
+ obs.unobserve(this.el.nativeElement);
23
+ }
24
+ });
25
+ });
26
+ obs.observe(this.el.nativeElement);
27
+ }
28
+ loadImage() {
29
+ this.srcAttr = this.src;
30
+ }
31
+ }
32
+ LazyLoadDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: LazyLoadDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
33
+ LazyLoadDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: LazyLoadDirective, selector: "img[ltLazyLoad]", inputs: { src: "src" }, host: { properties: { "attr.src": "this.srcAttr" } }, ngImport: i0 });
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: LazyLoadDirective, decorators: [{
35
+ type: Directive,
36
+ args: [{
37
+ selector: 'img[ltLazyLoad]',
38
+ }]
39
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { srcAttr: [{
40
+ type: HostBinding,
41
+ args: ['attr.src']
42
+ }], src: [{
43
+ type: Input
44
+ }] } });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1sb2FkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL2RpcmVjdGl2ZXMvbGF6eS1sb2FkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUV6Rjs7R0FFRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUFJNUIsWUFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUFIVCxZQUFPLEdBQUcsSUFBSSxDQUFDO0lBR0gsQ0FBQztJQUV0QyxlQUFlO1FBQ2IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRU8sV0FBVztRQUNqQixPQUFPLE1BQU0sSUFBSSxzQkFBc0IsSUFBSSxNQUFNLENBQUM7SUFDcEQsQ0FBQztJQUVPLGFBQWE7UUFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFDLGNBQWMsRUFBQyxFQUFFLEVBQUU7Z0JBQ25DLElBQUksY0FBYyxFQUFFO29CQUNsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDdEM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzFCLENBQUM7OzhHQTVCVSxpQkFBaUI7a0dBQWpCLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUg3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCO2lHQUUwQixPQUFPO3NCQUEvQixXQUFXO3VCQUFDLFVBQVU7Z0JBQ2QsR0FBRztzQkFBWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGxhenkgbG9hZGluZyBpbWFnZXNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW1nW2x0TGF6eUxvYWRdJyxcbn0pXG5leHBvcnQgY2xhc3MgTGF6eUxvYWREaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnNyYycpIHNyY0F0dHIgPSBudWxsO1xuICBASW5wdXQoKSBzcmM6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNhbkxhenlMb2FkKCkgPyB0aGlzLmxhenlMb2FkSW1hZ2UoKSA6IHRoaXMubG9hZEltYWdlKCk7XG4gIH1cblxuICBwcml2YXRlIGNhbkxhenlMb2FkKCkge1xuICAgIHJldHVybiB3aW5kb3cgJiYgJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3c7XG4gIH1cblxuICBwcml2YXRlIGxhenlMb2FkSW1hZ2UoKSB7XG4gICAgY29uc3Qgb2JzID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBlbnRyaWVzLmZvckVhY2goKHtpc0ludGVyc2VjdGluZ30pID0+IHtcbiAgICAgICAgaWYgKGlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5sb2FkSW1hZ2UoKTtcbiAgICAgICAgICBvYnMudW5vYnNlcnZlKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIG9icy5vYnNlcnZlKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRJbWFnZSgpIHtcbiAgICB0aGlzLnNyY0F0dHIgPSB0aGlzLnNyYztcbiAgfVxufVxuIl19
@@ -0,0 +1,79 @@
1
+ import { Directive, HostListener, Inject, Input, PLATFORM_ID } from '@angular/core';
2
+ import { isPlatformBrowser } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../services/image.service";
5
+ /**
6
+ * Set same height (maximum) to different elements
7
+ */
8
+ export class MatchHeightDirective {
9
+ constructor(el, imageService, platformId) {
10
+ this.el = el;
11
+ this.imageService = imageService;
12
+ // Replace lazy loading images with immediate loading images
13
+ this.loadImages = true;
14
+ this.isBrowser = isPlatformBrowser(platformId);
15
+ }
16
+ onResize() {
17
+ this.matchHeight(this.el.nativeElement, this.ltMatchHeight);
18
+ }
19
+ ngOnInit() {
20
+ this.matchHeight(this.el.nativeElement, this.ltMatchHeight);
21
+ }
22
+ async matchHeight(parent, target) {
23
+ if (!parent) {
24
+ return;
25
+ }
26
+ let classNames;
27
+ if (!Array.isArray(target)) {
28
+ classNames = [target];
29
+ }
30
+ else {
31
+ classNames = target;
32
+ }
33
+ for (const className of classNames) {
34
+ // find all child structureElements with the selected class name
35
+ const children = parent.getElementsByClassName(className);
36
+ if (!children || children.length < 2) {
37
+ continue;
38
+ }
39
+ // Load images of children
40
+ if (this.loadImages) {
41
+ await this.imageService.preLoadImages({ elements: children });
42
+ }
43
+ // reset all children height
44
+ Array.from(children).forEach((element) => {
45
+ element.style.height = 'initial';
46
+ });
47
+ // get all the child structureElements heights
48
+ const itemHeights = Array.from(children).map((element) => {
49
+ if (element.getBoundingClientRect) {
50
+ return element.getBoundingClientRect().height;
51
+ }
52
+ return 0;
53
+ });
54
+ // find out the tallest one
55
+ const maxHeight = itemHeights.reduce((prev, curr) => (curr > prev ? curr : prev), 0);
56
+ // update the child structureElements height to the tallest one
57
+ Array.from(children).forEach((element) => (element.style.height = `${maxHeight}px`));
58
+ }
59
+ }
60
+ }
61
+ MatchHeightDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: MatchHeightDirective, deps: [{ token: i0.ElementRef }, { token: i1.ImageService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Directive });
62
+ MatchHeightDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: MatchHeightDirective, selector: "[ltMatchHeight]", inputs: { ltMatchHeight: "ltMatchHeight", loadImages: "loadImages" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0 });
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: MatchHeightDirective, decorators: [{
64
+ type: Directive,
65
+ args: [{
66
+ selector: '[ltMatchHeight]',
67
+ }]
68
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ImageService }, { type: undefined, decorators: [{
69
+ type: Inject,
70
+ args: [PLATFORM_ID]
71
+ }] }]; }, propDecorators: { ltMatchHeight: [{
72
+ type: Input
73
+ }], loadImages: [{
74
+ type: Input
75
+ }], onResize: [{
76
+ type: HostListener,
77
+ args: ['window:resize']
78
+ }] } });
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtaGVpZ2h0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL2RpcmVjdGl2ZXMvbWF0Y2gtaGVpZ2h0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBRXBEOztHQUVHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQVkvQixZQUFzQixFQUFjLEVBQVksWUFBMEIsRUFBdUIsVUFBa0I7UUFBN0YsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFZLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBUDFFLDREQUE0RDtRQUU1RCxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBTWhCLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUdELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQW1CLEVBQUUsTUFBeUI7UUFDOUQsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE9BQU87U0FDUjtRQUVELElBQUksVUFBVSxDQUFDO1FBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDMUIsVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkI7YUFBTTtZQUNMLFVBQVUsR0FBRyxNQUFNLENBQUM7U0FDckI7UUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtZQUNsQyxnRUFBZ0U7WUFDaEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTFELElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLFNBQVM7YUFDVjtZQUVELDBCQUEwQjtZQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUMvRDtZQUVELDRCQUE0QjtZQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQW9CLEVBQUUsRUFBRTtnQkFDcEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1lBRUgsOENBQThDO1lBQzlDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3ZELElBQUksT0FBTyxDQUFDLHFCQUFxQixFQUFFO29CQUNqQyxPQUFPLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztpQkFDL0M7Z0JBQ0QsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztZQUVILDJCQUEyQjtZQUMzQixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXJGLCtEQUErRDtZQUMvRCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQW9CLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDbkc7SUFDSCxDQUFDOztpSEFyRVUsb0JBQW9CLHdFQVlxRCxXQUFXO3FHQVpwRixvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFIaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2lCQUM1Qjs7MEJBYThFLE1BQU07MkJBQUMsV0FBVzs0Q0FUL0YsYUFBYTtzQkFEWixLQUFLO2dCQUtOLFVBQVU7c0JBRFQsS0FBSztnQkFXTixRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbWFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9pbWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBTZXQgc2FtZSBoZWlnaHQgKG1heGltdW0pIHRvIGRpZmZlcmVudCBlbGVtZW50c1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbHRNYXRjaEhlaWdodF0nLFxufSlcbmV4cG9ydCBjbGFzcyBNYXRjaEhlaWdodERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vIGNsYXNzIG5hbWUgdG8gbWF0Y2ggaGVpZ2h0XG4gIEBJbnB1dCgpXG4gIGx0TWF0Y2hIZWlnaHQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8vIFJlcGxhY2UgbGF6eSBsb2FkaW5nIGltYWdlcyB3aXRoIGltbWVkaWF0ZSBsb2FkaW5nIGltYWdlc1xuICBASW5wdXQoKVxuICBsb2FkSW1hZ2VzID0gdHJ1ZTtcblxuICAvLyBXZXRoZXIgY3VycmVudCBwbGF0Zm9ybSBpcyBhIGJyb3dzZXJcbiAgcmVhZG9ubHkgaXNCcm93c2VyOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlbDogRWxlbWVudFJlZiwgcHJvdGVjdGVkIGltYWdlU2VydmljZTogSW1hZ2VTZXJ2aWNlLCBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uUmVzaXplKCkge1xuICAgIHRoaXMubWF0Y2hIZWlnaHQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmx0TWF0Y2hIZWlnaHQpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5tYXRjaEhlaWdodCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMubHRNYXRjaEhlaWdodCk7XG4gIH1cblxuICBhc3luYyBtYXRjaEhlaWdodChwYXJlbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgY2xhc3NOYW1lcztcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgY2xhc3NOYW1lcyA9IFt0YXJnZXRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc05hbWVzID0gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2xhc3NOYW1lIG9mIGNsYXNzTmFtZXMpIHtcbiAgICAgIC8vIGZpbmQgYWxsIGNoaWxkIHN0cnVjdHVyZUVsZW1lbnRzIHdpdGggdGhlIHNlbGVjdGVkIGNsYXNzIG5hbWVcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKTtcblxuICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPCAyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIGltYWdlcyBvZiBjaGlsZHJlblxuICAgICAgaWYgKHRoaXMubG9hZEltYWdlcykge1xuICAgICAgICBhd2FpdCB0aGlzLmltYWdlU2VydmljZS5wcmVMb2FkSW1hZ2VzKHsgZWxlbWVudHM6IGNoaWxkcmVuIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZXNldCBhbGwgY2hpbGRyZW4gaGVpZ2h0XG4gICAgICBBcnJheS5mcm9tKGNoaWxkcmVuKS5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICdpbml0aWFsJztcbiAgICAgIH0pO1xuXG4gICAgICAvLyBnZXQgYWxsIHRoZSBjaGlsZCBzdHJ1Y3R1cmVFbGVtZW50cyBoZWlnaHRzXG4gICAgICBjb25zdCBpdGVtSGVpZ2h0cyA9IEFycmF5LmZyb20oY2hpbGRyZW4pLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgLy8gZmluZCBvdXQgdGhlIHRhbGxlc3Qgb25lXG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSBpdGVtSGVpZ2h0cy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IChjdXJyID4gcHJldiA/IGN1cnIgOiBwcmV2KSwgMCk7XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgY2hpbGQgc3RydWN0dXJlRWxlbWVudHMgaGVpZ2h0IHRvIHRoZSB0YWxsZXN0IG9uZVxuICAgICAgQXJyYXkuZnJvbShjaGlsZHJlbikuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IChlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke21heEhlaWdodH1weGApKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,90 @@
1
+ import { Directive, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Reszise detection
5
+ * (inpsired by: https://stackblitz.com/edit/angular-resizable)
6
+ */
7
+ export class ResizableDirective {
8
+ constructor(el) {
9
+ this.el = el;
10
+ this.resizableGrabWidth = 8;
11
+ this.resizableMinWidth = 10;
12
+ this.dragging = false;
13
+ }
14
+ ngOnInit() {
15
+ this.addListenerToDocument();
16
+ this.addListenerToElement();
17
+ }
18
+ mouseMoveG(evt) {
19
+ if (!this.dragging) {
20
+ return;
21
+ }
22
+ this.newWidth(evt.clientX - this.el.nativeElement.offsetLeft);
23
+ evt.stopPropagation();
24
+ }
25
+ newWidth(wid) {
26
+ const result = Math.max(this.resizableMinWidth, wid);
27
+ this.el.nativeElement.style.width = result + 'px';
28
+ }
29
+ mouseDown(evt) {
30
+ if (this.inDragRegion(evt)) {
31
+ this.dragging = true;
32
+ this.preventGlobalMouseEvents();
33
+ evt.stopPropagation();
34
+ }
35
+ }
36
+ restoreGlobalMouseEvents() {
37
+ document.body.style['pointer-events'] = 'auto';
38
+ }
39
+ mouseUpG(evt) {
40
+ if (!this.dragging) {
41
+ return;
42
+ }
43
+ this.restoreGlobalMouseEvents();
44
+ this.dragging = false;
45
+ evt.stopPropagation();
46
+ }
47
+ mouseMove(evt) {
48
+ if (this.inDragRegion(evt) || this.dragging) {
49
+ this.el.nativeElement.style.cursor = 'col-resize';
50
+ }
51
+ else {
52
+ this.el.nativeElement.style.cursor = 'default';
53
+ }
54
+ }
55
+ preventGlobalMouseEvents() {
56
+ document.body.style['pointer-events'] = 'none';
57
+ }
58
+ inDragRegion(evt) {
59
+ return this.el.nativeElement.clientWidth - evt.clientX + this.el.nativeElement.offsetLeft < this.resizableGrabWidth;
60
+ }
61
+ addListenerToDocument() {
62
+ document.addEventListener('mousemove', (e) => {
63
+ this.mouseMoveG(e);
64
+ }, true);
65
+ document.addEventListener('mouseup', (e) => {
66
+ this.mouseUpG(e);
67
+ }, true);
68
+ }
69
+ addListenerToElement() {
70
+ this.el.nativeElement.addEventListener('mousedown', (e) => {
71
+ this.mouseDown(e);
72
+ }, true);
73
+ this.el.nativeElement.addEventListener('mousemove', (e) => {
74
+ this.mouseMove(e);
75
+ }, true);
76
+ }
77
+ }
78
+ ResizableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ResizableDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
79
+ ResizableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.0", type: ResizableDirective, selector: "[ltResizable]", inputs: { resizableGrabWidth: "resizableGrabWidth", resizableMinWidth: "resizableMinWidth" }, ngImport: i0 });
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ResizableDirective, decorators: [{
81
+ type: Directive,
82
+ args: [{
83
+ selector: '[ltResizable]',
84
+ }]
85
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { resizableGrabWidth: [{
86
+ type: Input
87
+ }], resizableMinWidth: [{
88
+ type: Input
89
+ }] } });
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL2RpcmVjdGl2ZXMvcmVzaXphYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7QUFFckU7OztHQUdHO0FBSUgsTUFBTSxPQUFPLGtCQUFrQjtJQU03QixZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUx6Qix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBRWhDLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFFb0IsQ0FBQztJQUV0QyxRQUFRO1FBQ04sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFHO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlELEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQUc7UUFDVixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDcEQsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFHO1FBQ1gsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2hDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFVO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQUc7UUFDWCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMzQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztTQUNuRDthQUFNO1lBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2pELENBQUM7SUFFRCxZQUFZLENBQUMsR0FBRztRQUNkLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUN0SCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDdkIsV0FBVyxFQUNYLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLENBQUMsRUFDRCxJQUFJLENBQ0wsQ0FBQztRQUVGLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDdkIsU0FBUyxFQUNULENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUMsRUFDRCxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQ3BDLFdBQVcsRUFDWCxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDLEVBQ0QsSUFBSSxDQUNMLENBQUM7UUFFRixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDcEMsV0FBVyxFQUNYLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsRUFDRCxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7OytHQWpHVSxrQkFBa0I7bUdBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUg5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO2lCQUMxQjtpR0FFVSxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogUmVzemlzZSBkZXRlY3Rpb25cbiAqIChpbnBzaXJlZCBieTogaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2FuZ3VsYXItcmVzaXphYmxlKVxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbHRSZXNpemFibGVdJyxcbn0pXG5leHBvcnQgY2xhc3MgUmVzaXphYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcmVzaXphYmxlR3JhYldpZHRoID0gODtcbiAgQElucHV0KCkgcmVzaXphYmxlTWluV2lkdGggPSAxMDtcblxuICBkcmFnZ2luZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRMaXN0ZW5lclRvRG9jdW1lbnQoKTtcbiAgICB0aGlzLmFkZExpc3RlbmVyVG9FbGVtZW50KCk7XG4gIH1cblxuICBtb3VzZU1vdmVHKGV2dCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5ld1dpZHRoKGV2dC5jbGllbnRYIC0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQpO1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIG5ld1dpZHRoKHdpZCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IE1hdGgubWF4KHRoaXMucmVzaXphYmxlTWluV2lkdGgsIHdpZCk7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gcmVzdWx0ICsgJ3B4JztcbiAgfVxuXG4gIG1vdXNlRG93bihldnQpIHtcbiAgICBpZiAodGhpcy5pbkRyYWdSZWdpb24oZXZ0KSkge1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLnByZXZlbnRHbG9iYWxNb3VzZUV2ZW50cygpO1xuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmVHbG9iYWxNb3VzZUV2ZW50cygpIHtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlWydwb2ludGVyLWV2ZW50cyddID0gJ2F1dG8nO1xuICB9XG5cbiAgbW91c2VVcEcoZXZ0OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3RvcmVHbG9iYWxNb3VzZUV2ZW50cygpO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBtb3VzZU1vdmUoZXZ0KSB7XG4gICAgaWYgKHRoaXMuaW5EcmFnUmVnaW9uKGV2dCkgfHwgdGhpcy5kcmFnZ2luZykge1xuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjb2wtcmVzaXplJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB9XG4gIH1cblxuICBwcmV2ZW50R2xvYmFsTW91c2VFdmVudHMoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdub25lJztcbiAgfVxuXG4gIGluRHJhZ1JlZ2lvbihldnQpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIC0gZXZ0LmNsaWVudFggKyB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCA8IHRoaXMucmVzaXphYmxlR3JhYldpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRMaXN0ZW5lclRvRG9jdW1lbnQoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdtb3VzZW1vdmUnLFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgdGhpcy5tb3VzZU1vdmVHKGUpO1xuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdtb3VzZXVwJyxcbiAgICAgIChlKSA9PiB7XG4gICAgICAgIHRoaXMubW91c2VVcEcoZSk7XG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZExpc3RlbmVyVG9FbGVtZW50KCkge1xuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ21vdXNlZG93bicsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICB0aGlzLm1vdXNlRG93bihlKTtcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ21vdXNlbW92ZScsXG4gICAgICAoZSkgPT4ge1xuICAgICAgICB0aGlzLm1vdXNlTW92ZShlKTtcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,61 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { BASE_MODULE_CONFIG } from '../interfaces/base-module-config.interface';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/router";
6
+ import * as i2 from "../services/auth.service";
7
+ /**
8
+ * Authentication guard
9
+ */
10
+ export class AuthGuard {
11
+ /**
12
+ * Imports
13
+ */
14
+ constructor(router, authService, moduleConfig) {
15
+ this.router = router;
16
+ this.authService = authService;
17
+ this.moduleConfig = moduleConfig;
18
+ }
19
+ /**
20
+ * Can activate main route
21
+ */
22
+ canActivate(route, state) {
23
+ return new Observable((subscriber) => {
24
+ let allowed = false;
25
+ const opposite = route?.data?.opposite ? route?.data?.opposite : false;
26
+ const redirectUrl = route?.data?.redirectUrl ? route.data.redirectUrl : this.moduleConfig.authGuardRedirectUrl;
27
+ if (this.authService.token && !opposite) {
28
+ if (route.data.allowedRole) {
29
+ const user = this.authService.currentUser;
30
+ allowed = user?.roles?.includes(route.data.allowedRole);
31
+ }
32
+ else {
33
+ allowed = true;
34
+ }
35
+ }
36
+ else if (!this.authService.token && opposite) {
37
+ allowed = true;
38
+ }
39
+ if (!allowed) {
40
+ this.router.navigate([redirectUrl]);
41
+ }
42
+ subscriber.next(allowed);
43
+ subscriber.complete();
44
+ });
45
+ }
46
+ /**
47
+ * Can activate child route
48
+ */
49
+ canActivateChild(route, state) {
50
+ return this.canActivate(route, state);
51
+ }
52
+ }
53
+ AuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: AuthGuard, deps: [{ token: i1.Router }, { token: i2.AuthService }, { token: BASE_MODULE_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
54
+ AuthGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: AuthGuard });
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: AuthGuard, decorators: [{
56
+ type: Injectable
57
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }, { type: undefined, decorators: [{
58
+ type: Inject,
59
+ args: [BASE_MODULE_CONFIG]
60
+ }] }]; } });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL2d1YXJkcy9hdXRoLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEMsT0FBTyxFQUFFLGtCQUFrQixFQUFvQixNQUFNLDRDQUE0QyxDQUFDOzs7O0FBRWxHOztHQUVHO0FBRUgsTUFBTSxPQUFPLFNBQVM7SUFFcEI7O09BRUc7SUFDSCxZQUNVLE1BQWMsRUFDZCxXQUF3QixFQUNJLFlBQThCO1FBRjFELFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNJLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtJQUNqRSxDQUFDO0lBRUo7O09BRUc7SUFDSCxXQUFXLENBQUMsS0FBNkIsRUFBRSxLQUEwQjtRQUNuRSxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDbkMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3ZFLE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQztZQUUvRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztvQkFDMUMsT0FBTyxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ3pEO3FCQUFNO29CQUNMLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ2hCO2FBQ0Y7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTtnQkFDOUMsT0FBTyxHQUFHLElBQUksQ0FBQzthQUNoQjtZQUVELElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO1lBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQzs7c0dBN0NVLFNBQVMsbUVBUVYsa0JBQWtCOzBHQVJqQixTQUFTOzJGQUFULFNBQVM7a0JBRHJCLFVBQVU7OzBCQVNOLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZSwgQ2FuQWN0aXZhdGVDaGlsZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEJBU0VfTU9EVUxFX0NPTkZJRywgQmFzZU1vZHVsZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYmFzZS1tb2R1bGUtY29uZmlnLmludGVyZmFjZSc7XG5cbi8qKlxuICogQXV0aGVudGljYXRpb24gZ3VhcmRcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcblxuICAvKipcbiAgICogSW1wb3J0c1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICBASW5qZWN0KEJBU0VfTU9EVUxFX0NPTkZJRykgcHJpdmF0ZSBtb2R1bGVDb25maWc6IEJhc2VNb2R1bGVDb25maWdcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDYW4gYWN0aXZhdGUgbWFpbiByb3V0ZVxuICAgKi9cbiAgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBsZXQgYWxsb3dlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgb3Bwb3NpdGUgPSByb3V0ZT8uZGF0YT8ub3Bwb3NpdGUgPyByb3V0ZT8uZGF0YT8ub3Bwb3NpdGUgOiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gcm91dGU/LmRhdGE/LnJlZGlyZWN0VXJsID8gcm91dGUuZGF0YS5yZWRpcmVjdFVybCA6IHRoaXMubW9kdWxlQ29uZmlnLmF1dGhHdWFyZFJlZGlyZWN0VXJsO1xuXG4gICAgICBpZiAodGhpcy5hdXRoU2VydmljZS50b2tlbiAmJiAhb3Bwb3NpdGUpIHtcbiAgICAgICAgaWYgKHJvdXRlLmRhdGEuYWxsb3dlZFJvbGUpIHtcbiAgICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoU2VydmljZS5jdXJyZW50VXNlcjtcbiAgICAgICAgICBhbGxvd2VkID0gdXNlcj8ucm9sZXM/LmluY2x1ZGVzKHJvdXRlLmRhdGEuYWxsb3dlZFJvbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFsbG93ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLnRva2VuICYmIG9wcG9zaXRlKSB7XG4gICAgICAgIGFsbG93ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3JlZGlyZWN0VXJsXSk7XG4gICAgICB9XG5cbiAgICAgIHN1YnNjcmliZXIubmV4dChhbGxvd2VkKTtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW4gYWN0aXZhdGUgY2hpbGQgcm91dGVcbiAgICovXG4gIGNhbkFjdGl2YXRlQ2hpbGQocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuQWN0aXZhdGUocm91dGUsIHN0YXRlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,16 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Guard to check if a component can be deactivated
5
+ */
6
+ export class CanDeactivateGuard {
7
+ canDeactivate(component) {
8
+ return component.canDeactivate ? component.canDeactivate() : true;
9
+ }
10
+ }
11
+ CanDeactivateGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: CanDeactivateGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
12
+ CanDeactivateGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: CanDeactivateGuard });
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: CanDeactivateGuard, decorators: [{
14
+ type: Injectable
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuLWRlYWN0aXZhdGUuZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NyYy9saWIvYmFzZS9ndWFyZHMvY2FuLWRlYWN0aXZhdGUuZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFJM0M7O0dBRUc7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLGFBQWEsQ0FBQyxTQUFrQztRQUM5QyxPQUFPLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3BFLENBQUM7OytHQUhVLGtCQUFrQjttSEFBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYW5EZWFjdGl2YXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElDYW5Db21wb25lbnREZWFjdGl2YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYW4tY29tcG9uZW50LWRlYWN0aXZhdGUuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBHdWFyZCB0byBjaGVjayBpZiBhIGNvbXBvbmVudCBjYW4gYmUgZGVhY3RpdmF0ZWRcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENhbkRlYWN0aXZhdGVHdWFyZCBpbXBsZW1lbnRzIENhbkRlYWN0aXZhdGU8SUNhbkNvbXBvbmVudERlYWN0aXZhdGU+IHtcbiAgY2FuRGVhY3RpdmF0ZShjb21wb25lbnQ6IElDYW5Db21wb25lbnREZWFjdGl2YXRlKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudC5jYW5EZWFjdGl2YXRlID8gY29tcG9uZW50LmNhbkRlYWN0aXZhdGUoKSA6IHRydWU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,32 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/router";
5
+ import * as i2 from "../services/auth.service";
6
+ /**
7
+ * Logout guard
8
+ */
9
+ export class LogoutGuard {
10
+ constructor(router, authService) {
11
+ this.router = router;
12
+ this.authService = authService;
13
+ }
14
+ canActivate(route, state) {
15
+ return new Observable((subscriber) => {
16
+ if (this.authService.token) {
17
+ this.authService.logout();
18
+ }
19
+ subscriber.next(true);
20
+ subscriber.complete();
21
+ });
22
+ }
23
+ canActivateChild(route, state) {
24
+ return this.canActivate(route, state);
25
+ }
26
+ }
27
+ LogoutGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: LogoutGuard, deps: [{ token: i1.Router }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Injectable });
28
+ LogoutGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: LogoutGuard });
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: LogoutGuard, decorators: [{
30
+ type: Injectable
31
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }]; } });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nb3V0Lmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zcmMvbGliL2Jhc2UvZ3VhcmRzL2xvZ291dC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFHbEM7O0dBRUc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQUN0QixZQUFvQixNQUFjLEVBQVUsV0FBd0I7UUFBaEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUcsQ0FBQztJQUV4RSxXQUFXLENBQUMsS0FBNkIsRUFBRSxLQUEwQjtRQUNuRSxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDbkMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUMzQjtZQUVELFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQTZCLEVBQUUsS0FBMEI7UUFDeEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDOzt3R0FoQlUsV0FBVzs0R0FBWCxXQUFXOzJGQUFYLFdBQVc7a0JBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZSwgQ2FuQWN0aXZhdGVDaGlsZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcblxuLyoqXG4gKiBMb2dvdXQgZ3VhcmRcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExvZ291dEd1YXJkIGltcGxlbWVudHMgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSkge31cblxuICBjYW5BY3RpdmF0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLnRva2VuKSB7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nb3V0KCk7XG4gICAgICB9XG5cbiAgICAgIHN1YnNjcmliZXIubmV4dCh0cnVlKTtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNhbkFjdGl2YXRlQ2hpbGQocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuQWN0aXZhdGUocm91dGUsIHN0YXRlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,22 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Truncate string with ellipses
5
+ */
6
+ export class EllipsesPipe {
7
+ transform(value, limit) {
8
+ if (!value) {
9
+ return null;
10
+ }
11
+ return value.length > limit ? value.substring(0, limit) + '...' : value;
12
+ }
13
+ }
14
+ EllipsesPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: EllipsesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
15
+ EllipsesPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: EllipsesPipe, name: "ltEllipses" });
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: EllipsesPipe, decorators: [{
17
+ type: Pipe,
18
+ args: [{
19
+ name: 'ltEllipses',
20
+ }]
21
+ }] });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxsaXBzZXMucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL3BpcGVzL2VsbGlwc2VzLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBRXBEOztHQUVHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFDdkIsU0FBUyxDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUUsQ0FBQzs7eUdBUFUsWUFBWTt1R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBSHhCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLFlBQVk7aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFRydW5jYXRlIHN0cmluZyB3aXRoIGVsbGlwc2VzXG4gKi9cbkBQaXBlKHtcbiAgbmFtZTogJ2x0RWxsaXBzZXMnLFxufSlcbmV4cG9ydCBjbGFzcyBFbGxpcHNlc1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsaW1pdCA/IHZhbHVlLnN1YnN0cmluZygwLCBsaW1pdCkgKyAnLi4uJyA6IHZhbHVlO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/platform-browser";
4
+ /**
5
+ * Declarate html as safe
6
+ */
7
+ export class SafeHtmlPipe {
8
+ constructor(sanitized) {
9
+ this.sanitized = sanitized;
10
+ }
11
+ transform(value) {
12
+ return this.sanitized.bypassSecurityTrustHtml(value);
13
+ }
14
+ }
15
+ SafeHtmlPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: SafeHtmlPipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
16
+ SafeHtmlPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: SafeHtmlPipe, name: "ltSafeHtml" });
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: SafeHtmlPipe, decorators: [{
18
+ type: Pipe,
19
+ args: [{ name: 'ltSafeHtml' }]
20
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS1odG1sLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NyYy9saWIvYmFzZS9waXBlcy9zYWZlLWh0bWwucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7O0FBRXBEOztHQUVHO0FBRUgsTUFBTSxPQUFPLFlBQVk7SUFDdkIsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztJQUFHLENBQUM7SUFFL0MsU0FBUyxDQUFDLEtBQUs7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQzs7eUdBTFUsWUFBWTt1R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLElBQUk7bUJBQUMsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogRGVjbGFyYXRlIGh0bWwgYXMgc2FmZVxuICovXG5AUGlwZSh7bmFtZTogJ2x0U2FmZUh0bWwnfSlcbmV4cG9ydCBjbGFzcyBTYWZlSHRtbFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZWQ6IERvbVNhbml0aXplcikge31cblxuICB0cmFuc2Zvcm0odmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZWQuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodmFsdWUpO1xuICB9XG59XG4iXX0=