@lenne.tech/ng-base 12.1.0 → 13.0.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 (203) hide show
  1. package/{esm2015/lenne.tech-ng-base.js → esm2020/lenne.tech-ng-base.mjs} +0 -0
  2. package/{esm2015/src/lib/base/base.module.js → esm2020/lib/base/base.module.mjs} +39 -8
  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} +238 -195
  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} +238 -195
  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 +10 -0
  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 +34 -14
  131. package/src/lib/base/base.module.d.ts +10 -0
  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/classes/graphql-meta.class.js +0 -156
  181. package/esm2015/src/lib/base/classes/helper.class.js +0 -290
  182. package/esm2015/src/lib/base/directives/context-menu.directive.js +0 -104
  183. package/esm2015/src/lib/base/directives/lazy-load.directive.js +0 -43
  184. package/esm2015/src/lib/base/directives/match-height.directive.js +0 -78
  185. package/esm2015/src/lib/base/directives/resizable.directive.js +0 -89
  186. package/esm2015/src/lib/base/guards/auth.guard.js +0 -61
  187. package/esm2015/src/lib/base/guards/can-deactivate.guard.js +0 -13
  188. package/esm2015/src/lib/base/guards/logout.guard.js +0 -33
  189. package/esm2015/src/lib/base/pipes/ellipses.pipe.js +0 -18
  190. package/esm2015/src/lib/base/pipes/safe-html.pipe.js +0 -20
  191. package/esm2015/src/lib/base/services/graphql-meta.service.js +0 -116
  192. package/esm2015/src/lib/base/services/graphql-plus.service.js +0 -90
  193. package/esm2015/src/lib/base/services/graphql.service.js +0 -423
  194. package/esm2015/src/lib/base/services/image.service.js +0 -99
  195. package/esm2015/src/lib/base/services/loader.service.js +0 -27
  196. package/esm2015/src/lib/base/services/scroll.service.js +0 -172
  197. package/esm2015/src/lib/base/services/seo.service.js +0 -100
  198. package/esm2015/src/lib/base/services/storage.service.js +0 -131
  199. package/esm2015/src/lib/base/services/ws.service.js +0 -16
  200. package/fesm2015/lenne.tech-ng-base-src-lib-base.js.map +0 -1
  201. package/fesm2015/lenne.tech-ng-base.js.map +0 -1
  202. package/lenne.tech-ng-base.metadata.json +0 -1
  203. package/src/lib/base/lenne.tech-ng-base-src-lib-base.metadata.json +0 -1
@@ -1,290 +0,0 @@
1
- /**
2
- * Helper class
3
- */
4
- export class Helper {
5
- /**
6
- * Simple filter function for plain objects
7
- */
8
- static filter(objects, filter) {
9
- return ((objects === null || objects === void 0 ? void 0 : objects.filter((element) => {
10
- for (const [key, value] of Object.entries(filter)) {
11
- if (Array.isArray(element[key])) {
12
- for (const item of element[key]) {
13
- if (!element[key].includs(value)) {
14
- return false;
15
- }
16
- }
17
- }
18
- else if (element[key] !== value) {
19
- return false;
20
- }
21
- }
22
- return true;
23
- })) || []);
24
- }
25
- /**
26
- * Convert to a url/uri conform string
27
- * Only:
28
- * - lower case
29
- * - chars, numbers and hyphens
30
- */
31
- static urlString(str, options = {}) {
32
- // Config
33
- const config = Object.assign({ allowAll: false }, options);
34
- // To string
35
- str = str + '';
36
- // Trim
37
- str = str.trim();
38
- // Lower case
39
- str = str.toLowerCase();
40
- if (!config.allowAll) {
41
- // Replace spaces
42
- str = str.trim().replace(/\s+/g, '-');
43
- // Replace some special chars
44
- str = str.replace('ä', 'ae');
45
- str = str.replace('ö', 'oe');
46
- str = str.replace('ü', 'ue');
47
- str = str.replace('ß', 'ss');
48
- // Remove other special chars
49
- str = str.replace(/[^a-zA-Z0-9-]/g, '');
50
- }
51
- // Return url conform string
52
- return encodeURI(str);
53
- }
54
- /**
55
- * Simple map function
56
- */
57
- static map(source, target, options = {}) {
58
- // Set config
59
- const config = Object.assign({ funcAllowed: false, dateStringToDate: true }, options);
60
- // Check source
61
- if (!source || typeof source !== 'object' || Array.isArray(source)) {
62
- return target;
63
- }
64
- // Update properties
65
- for (const key of Object.keys(target)) {
66
- if (source[key] !== undefined && (config.funcAllowed || typeof (source[key] !== 'function'))) {
67
- if (typeof source[key] === 'string' && config.dateStringToDate) {
68
- if (Array.isArray(config.dateStringToDate)) {
69
- if (config.dateStringToDate.includes(key)) {
70
- target[key] = Helper.parseDate(source[key]);
71
- }
72
- }
73
- else {
74
- target[key] = Helper.parseDate(source[key]);
75
- }
76
- }
77
- else {
78
- target[key] = source[key];
79
- }
80
- }
81
- }
82
- // Return target
83
- return target;
84
- }
85
- /**
86
- * Create Object or Objects of specified type with specified data
87
- */
88
- static maps(data, targetClass) {
89
- // Check data
90
- if (!data || typeof data !== 'object') {
91
- return undefined;
92
- }
93
- // Check array
94
- if (!Array.isArray(data)) {
95
- data = [data];
96
- }
97
- // Map
98
- return data.map((item) => {
99
- return targetClass.map(item);
100
- });
101
- }
102
- /**
103
- * Get plain parameter
104
- */
105
- static getPlainParameter(parameter) {
106
- var _a, _b, _c;
107
- if (!parameter) {
108
- return parameter;
109
- }
110
- return (_c = (_b = (_a = parameter === null || parameter === void 0 ? void 0 : parameter.split('?')) === null || _a === void 0 ? void 0 : _a.shift()) === null || _b === void 0 ? void 0 : _b.split('#')) === null || _c === void 0 ? void 0 : _c.shift();
111
- }
112
- /**
113
- * Get ID of an url parameter
114
- */
115
- static getParameterId(parameter) {
116
- var _a;
117
- if (!parameter) {
118
- return parameter;
119
- }
120
- return (_a = Helper.getPlainParameter(parameter)) === null || _a === void 0 ? void 0 : _a.split('-').pop();
121
- }
122
- /**
123
- * Delay
124
- */
125
- static delay(ms) {
126
- const promise = new Promise((resolve) => setTimeout(resolve, ms));
127
- return promise;
128
- }
129
- /**
130
- * Deep freeze
131
- * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze
132
- */
133
- static deepFreeze(object, preparedObjects = []) {
134
- // Prevent infinit regress
135
- if (preparedObjects.includes(object)) {
136
- return object;
137
- }
138
- preparedObjects.push(object);
139
- // Retrieve the property names defined on object
140
- const propNames = Object.getOwnPropertyNames(object);
141
- // Freeze properties before freezing self
142
- for (const name of propNames) {
143
- const value = object[name];
144
- if (value && typeof value === 'object') {
145
- Helper.deepFreeze(value, preparedObjects);
146
- }
147
- }
148
- return Object.freeze(object);
149
- }
150
- /**
151
- * Generates an unique identifier with 24 characters
152
- */
153
- static getUID() {
154
- let dt = new Date().getTime();
155
- const uuid = 'xxxxxxxxxxxxxxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
156
- // eslint-disable-next-line no-bitwise
157
- const r = (dt + Math.random() * 16) % 16 | 0;
158
- dt = Math.floor(dt / 16);
159
- // eslint-disable-next-line no-bitwise
160
- return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
161
- });
162
- return uuid;
163
- }
164
- /**
165
- * Parse date string to date object
166
- */
167
- static parseDate(dateString) {
168
- const reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
169
- const reMsAjax = /^\/Date\((d|-|.*)\)[\/|\\]$/;
170
- if (typeof dateString === 'string') {
171
- const isoExec = reISO.exec(dateString);
172
- if (isoExec) {
173
- return new Date(dateString);
174
- }
175
- const msAjaxExec = reMsAjax.exec(dateString);
176
- if (msAjaxExec) {
177
- const cleaned = msAjaxExec[1].split(/[-+,.]/);
178
- return new Date(cleaned[0] ? +cleaned[0] : 0 - +cleaned[1]);
179
- }
180
- }
181
- return dateString;
182
- }
183
- /**
184
- * Get browser name and version
185
- */
186
- static getBrowser() {
187
- const userAgent = navigator.userAgent;
188
- let data = userAgent.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
189
- let version;
190
- if (/trident/i.test(data[1])) {
191
- version = /\brv[ :]+(\d+)/g.exec(userAgent) || [];
192
- return { name: 'IE', version: version[1] || '' };
193
- }
194
- if (data[1] === 'Chrome') {
195
- version = userAgent.match(/\bOPR|Edge\/(\d+)/);
196
- if (version != null) {
197
- return { name: 'Opera', version: version[1] };
198
- }
199
- }
200
- data = data[2] ? [data[1], data[2]] : [navigator.appName, navigator.appVersion, '-?'];
201
- version = userAgent.match(/version\/(\d+)/i);
202
- if (version !== null) {
203
- data.splice(1, 1, version[1]);
204
- }
205
- return {
206
- name: data[0],
207
- version: data[1],
208
- };
209
- }
210
- /**
211
- * Whether first parameter is a deep subset of second parameter
212
- * Hint: functions will be ignored
213
- */
214
- static isSubset(a, b) {
215
- // Equal
216
- if (a === b) {
217
- return true;
218
- }
219
- // Different type
220
- if (typeof a !== typeof b) {
221
- return false;
222
- }
223
- // Process array
224
- if (Array.isArray(a)) {
225
- for (const [key, value] of Object.entries(a)) {
226
- if (Helper.isSubset(value, b[key])) {
227
- return false;
228
- }
229
- }
230
- return true;
231
- }
232
- // Process object
233
- if (typeof a === 'object') {
234
- const plain = JSON.parse(JSON.stringify(a));
235
- for (const [key, value] of Object.entries(plain)) {
236
- if (Helper.isSubset(value, b[key])) {
237
- return false;
238
- }
239
- }
240
- return true;
241
- }
242
- // Else
243
- return true;
244
- }
245
- /**
246
- * Whether parameters are equal (have equal properties)
247
- * Hint: functions will be ignored
248
- */
249
- static isEqual(a, b) {
250
- return Helper.isSubset(a, b) && Helper.isSubset(b, a);
251
- }
252
- /**
253
- * First level difference of two objects
254
- * Hint: functions will be ignored and when an array or an object is different the hole array or object will used as property value
255
- *
256
- * @returns Record<string, any> Object with properties from first object
257
- */
258
- static getDiff(a, b, clone = true) {
259
- const result = {};
260
- let firstObject = a;
261
- if (clone) {
262
- firstObject = JSON.parse(JSON.stringify(a));
263
- }
264
- for (const [key, value] of Object.entries(firstObject)) {
265
- if (!Helper.isSubset(value, b[key])) {
266
- result[key] = value;
267
- }
268
- }
269
- return result;
270
- }
271
- /**
272
- * Check if propertie is type of HTMLCollection or NodeList
273
- * See https://stackoverflow.com/a/7238344
274
- *
275
- * @param nodes
276
- */
277
- static isNodeList(nodes) {
278
- try {
279
- const stringRepr = Object.prototype.toString.call(nodes);
280
- return (typeof nodes === 'object' &&
281
- /^\[object (HTMLCollection|NodeList|Object)\]$/.test(stringRepr) &&
282
- typeof nodes.length === 'number' &&
283
- (nodes.length === 0 || (typeof nodes[0] === 'object' && nodes[0].nodeType > 0)));
284
- }
285
- catch (e) {
286
- return false;
287
- }
288
- }
289
- }
290
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zcmMvbGliL2Jhc2UvY2xhc3Nlcy9oZWxwZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8sTUFBTTtJQUNqQjs7T0FFRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQTZCLE9BQVksRUFBRSxNQUE4QjtRQUNwRixPQUFPLENBQUMsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2pELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDL0IsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUNoQyxPQUFPLEtBQUssQ0FBQzt5QkFDZDtxQkFDRjtpQkFDRjtxQkFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLEVBQUU7b0JBQ2pDLE9BQU8sS0FBSyxDQUFDO2lCQUNkO2FBQ0Y7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxLQUFJLEVBQUUsQ0FBVSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBUSxFQUFFLFVBQWtDLEVBQUU7UUFDN0QsU0FBUztRQUNULE1BQU0sTUFBTSxtQkFDVixRQUFRLEVBQUUsS0FBSyxJQUNaLE9BQU8sQ0FD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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNoRixDQUFDO1NBQ0g7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFuZGFyZCB9IGZyb20gJy4vc3RhbmRhcmQuY2xhc3MnO1xuXG4vKipcbiAqIEhlbHBlciBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgSGVscGVyIHtcbiAgLyoqXG4gICAqIFNpbXBsZSBmaWx0ZXIgZnVuY3Rpb24gZm9yIHBsYWluIG9iamVjdHNcbiAgICovXG4gIHN0YXRpYyBmaWx0ZXI8VCA9IHsgW2tleTogc3RyaW5nXTogYW55IH0+KG9iamVjdHM6IFRbXSwgZmlsdGVyOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogVFtdIHtcbiAgICByZXR1cm4gKG9iamVjdHM/LmZpbHRlcigoZWxlbWVudCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50W2tleV0pKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGVsZW1lbnRba2V5XSkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50W2tleV0uaW5jbHVkcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50W2tleV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KSB8fCBbXSkgYXMgYW55W107XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0byBhIHVybC91cmkgY29uZm9ybSBzdHJpbmdcbiAgICogT25seTpcbiAgICogLSBsb3dlciBjYXNlXG4gICAqIC0gY2hhcnMsIG51bWJlcnMgYW5kIGh5cGhlbnNcbiAgICovXG4gIHN0YXRpYyB1cmxTdHJpbmcoc3RyOiBhbnksIG9wdGlvbnM6IHsgYWxsb3dBbGw/OiBib29sZWFuIH0gPSB7fSk6IHN0cmluZyB7XG4gICAgLy8gQ29uZmlnXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgYWxsb3dBbGw6IGZhbHNlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8gVG8gc3RyaW5nXG4gICAgc3RyID0gc3RyICsgJyc7XG5cbiAgICAvLyBUcmltXG4gICAgc3RyID0gc3RyLnRyaW0oKTtcblxuICAgIC8vIExvd2VyIGNhc2VcbiAgICBzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghY29uZmlnLmFsbG93QWxsKSB7XG4gICAgICAvLyBSZXBsYWNlIHNwYWNlc1xuICAgICAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICctJyk7XG5cbiAgICAgIC8vIFJlcGxhY2Ugc29tZSBzcGVjaWFsIGNoYXJzXG4gICAgICBzdHIgPSBzdHIucmVwbGFjZSgnw6QnLCAnYWUnKTtcbiAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKCfDticsICdvZScpO1xuICAgICAgc3RyID0gc3RyLnJlcGxhY2UoJ8O8JywgJ3VlJyk7XG4gICAgICBzdHIgPSBzdHIucmVwbGFjZSgnw58nLCAnc3MnKTtcblxuICAgICAgLy8gUmVtb3ZlIG90aGVyIHNwZWNpYWwgY2hhcnNcbiAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bXmEtekEtWjAtOS1dL2csICcnKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdXJsIGNvbmZvcm0gc3RyaW5nXG4gICAgcmV0dXJuIGVuY29kZVVSSShzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXBsZSBtYXAgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFwPFQgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9PihcbiAgICBzb3VyY2U6IFBhcnRpYWw8VD4gfCB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICAgIHRhcmdldDogVCxcbiAgICBvcHRpb25zOiB7IGZ1bmNBbGxvd2VkPzogYm9vbGVhbjsgZGF0ZVN0cmluZ1RvRGF0ZT86IGJvb2xlYW4gfCBzdHJpbmdbXSB9ID0ge31cbiAgKTogVCB7XG4gICAgLy8gU2V0IGNvbmZpZ1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGZ1bmNBbGxvd2VkOiBmYWxzZSxcbiAgICAgIGRhdGVTdHJpbmdUb0RhdGU6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBzb3VyY2VcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHByb3BlcnRpZXNcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0YXJnZXQpKSB7XG4gICAgICBpZiAoc291cmNlW2tleV0gIT09IHVuZGVmaW5lZCAmJiAoY29uZmlnLmZ1bmNBbGxvd2VkIHx8IHR5cGVvZiAoc291cmNlW2tleV0gIT09ICdmdW5jdGlvbicpKSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtrZXldID09PSAnc3RyaW5nJyAmJiBjb25maWcuZGF0ZVN0cmluZ1RvRGF0ZSkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5kYXRlU3RyaW5nVG9EYXRlKSkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5kYXRlU3RyaW5nVG9EYXRlLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBIZWxwZXIucGFyc2VEYXRlKHNvdXJjZVtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBIZWxwZXIucGFyc2VEYXRlKHNvdXJjZVtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0YXJnZXRcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBPYmplY3Qgb3IgT2JqZWN0cyBvZiBzcGVjaWZpZWQgdHlwZSB3aXRoIHNwZWNpZmllZCBkYXRhXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hcHM8VCBleHRlbmRzIFN0YW5kYXJkPihcbiAgICBkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdIHwgeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IHsgW2tleTogc3RyaW5nXTogYW55IH1bXSxcbiAgICB0YXJnZXRDbGFzczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuICApOiBUW10ge1xuICAgIC8vIENoZWNrIGRhdGFcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBkYXRhID0gW2RhdGFdO1xuICAgIH1cblxuICAgIC8vIE1hcFxuICAgIHJldHVybiAoZGF0YSBhcyBhbnkpLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICByZXR1cm4gKHRhcmdldENsYXNzIGFzIGFueSkubWFwKGl0ZW0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwbGFpbiBwYXJhbWV0ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UGxhaW5QYXJhbWV0ZXIocGFyYW1ldGVyOiBzdHJpbmcpIHtcbiAgICBpZiAoIXBhcmFtZXRlcikge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtZXRlcj8uc3BsaXQoJz8nKT8uc2hpZnQoKT8uc3BsaXQoJyMnKT8uc2hpZnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgSUQgb2YgYW4gdXJsIHBhcmFtZXRlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRQYXJhbWV0ZXJJZChwYXJhbWV0ZXI6IHN0cmluZykge1xuICAgIGlmICghcGFyYW1ldGVyKSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyO1xuICAgIH1cbiAgICByZXR1cm4gSGVscGVyLmdldFBsYWluUGFyYW1ldGVyKHBhcmFtZXRlcik/LnNwbGl0KCctJykucG9wKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsYXlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVsYXkobXM6IG51bWJlcikge1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZXAgZnJlZXplXG4gICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvZnJlZXplI1doYXRfaXNfc2hhbGxvd19mcmVlemVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVlcEZyZWV6ZShvYmplY3Q6IGFueSwgcHJlcGFyZWRPYmplY3RzID0gW10pIHtcbiAgICAvLyBQcmV2ZW50IGluZmluaXQgcmVncmVzc1xuICAgIGlmIChwcmVwYXJlZE9iamVjdHMuaW5jbHVkZXMob2JqZWN0IGFzIG5ldmVyKSkge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gICAgcHJlcGFyZWRPYmplY3RzLnB1c2gob2JqZWN0IGFzIG5ldmVyKTtcblxuICAgIC8vIFJldHJpZXZlIHRoZSBwcm9wZXJ0eSBuYW1lcyBkZWZpbmVkIG9uIG9iamVjdFxuICAgIGNvbnN0IHByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG5cbiAgICAvLyBGcmVlemUgcHJvcGVydGllcyBiZWZvcmUgZnJlZXppbmcgc2VsZlxuICAgIGZvciAoY29uc3QgbmFtZSBvZiBwcm9wTmFtZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqZWN0W25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBIZWxwZXIuZGVlcEZyZWV6ZSh2YWx1ZSwgcHJlcGFyZWRPYmplY3RzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShvYmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiB1bmlxdWUgaWRlbnRpZmllciB3aXRoIDI0IGNoYXJhY3RlcnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0VUlEKCk6IHN0cmluZyB7XG4gICAgbGV0IGR0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgdXVpZCA9ICd4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgKGMpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICBjb25zdCByID0gKGR0ICsgTWF0aC5yYW5kb20oKSAqIDE2KSAlIDE2IHwgMDtcbiAgICAgIGR0ID0gTWF0aC5mbG9vcihkdCAvIDE2KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICByZXR1cm4gKGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDgpLnRvU3RyaW5nKDE2KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdXVpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBkYXRlIHN0cmluZyB0byBkYXRlIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwYXJzZURhdGUoZGF0ZVN0cmluZzogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVJU08gPSAvXihcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0oPzpcXC5cXGQqKSkoPzpafChcXCt8LSkoW1xcZHw6XSopKT8kLztcbiAgICBjb25zdCByZU1zQWpheCA9IC9eXFwvRGF0ZVxcKChkfC18LiopXFwpW1xcL3xcXFxcXSQvO1xuICAgIGlmICh0eXBlb2YgZGF0ZVN0cmluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGlzb0V4ZWMgPSByZUlTTy5leGVjKGRhdGVTdHJpbmcpO1xuICAgICAgaWYgKGlzb0V4ZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgfVxuICAgICAgY29uc3QgbXNBamF4RXhlYyA9IHJlTXNBamF4LmV4ZWMoZGF0ZVN0cmluZyk7XG4gICAgICBpZiAobXNBamF4RXhlYykge1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gbXNBamF4RXhlY1sxXS5zcGxpdCgvWy0rLC5dLyk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShjbGVhbmVkWzBdID8gK2NsZWFuZWRbMF0gOiAwIC0gK2NsZWFuZWRbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0ZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYnJvd3NlciBuYW1lIGFuZCB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEJyb3dzZXIoKSB7XG4gICAgY29uc3QgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICBsZXQgZGF0YSA9IHVzZXJBZ2VudC5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cXC8pKVxcLz9cXHMqKFxcZCspL2kpIHx8IFtdO1xuICAgIGxldCB2ZXJzaW9uO1xuICAgIGlmICgvdHJpZGVudC9pLnRlc3QoZGF0YVsxXSkpIHtcbiAgICAgIHZlcnNpb24gPSAvXFxicnZbIDpdKyhcXGQrKS9nLmV4ZWModXNlckFnZW50KSB8fCBbXTtcbiAgICAgIHJldHVybiB7IG5hbWU6ICdJRScsIHZlcnNpb246IHZlcnNpb25bMV0gfHwgJycgfTtcbiAgICB9XG4gICAgaWYgKGRhdGFbMV0gPT09ICdDaHJvbWUnKSB7XG4gICAgICB2ZXJzaW9uID0gdXNlckFnZW50Lm1hdGNoKC9cXGJPUFJ8RWRnZVxcLyhcXGQrKS8pO1xuICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyBuYW1lOiAnT3BlcmEnLCB2ZXJzaW9uOiB2ZXJzaW9uWzFdIH07XG4gICAgICB9XG4gICAgfVxuICAgIGRhdGEgPSBkYXRhWzJdID8gW2RhdGFbMV0sIGRhdGFbMl1dIDogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XG4gICAgdmVyc2lvbiA9IHVzZXJBZ2VudC5tYXRjaCgvdmVyc2lvblxcLyhcXGQrKS9pKTtcbiAgICBpZiAodmVyc2lvbiAhPT0gbnVsbCkge1xuICAgICAgZGF0YS5zcGxpY2UoMSwgMSwgdmVyc2lvblsxXSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBkYXRhWzBdLFxuICAgICAgdmVyc2lvbjogZGF0YVsxXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZmlyc3QgcGFyYW1ldGVyIGlzIGEgZGVlcCBzdWJzZXQgb2Ygc2Vjb25kIHBhcmFtZXRlclxuICAgKiBIaW50OiBmdW5jdGlvbnMgd2lsbCBiZSBpZ25vcmVkXG4gICAqL1xuICBzdGF0aWMgaXNTdWJzZXQoYTogYW55LCBiOiBhbnkpIHtcbiAgICAvLyBFcXVhbFxuICAgIGlmIChhID09PSBiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBEaWZmZXJlbnQgdHlwZVxuICAgIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGFycmF5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGEpKSB7XG4gICAgICAgIGlmIChIZWxwZXIuaXNTdWJzZXQodmFsdWUsIGJba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgcGxhaW4gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEpKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsYWluKSkge1xuICAgICAgICBpZiAoSGVscGVyLmlzU3Vic2V0KHZhbHVlLCBiW2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBFbHNlXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYXJhbWV0ZXJzIGFyZSBlcXVhbCAoaGF2ZSBlcXVhbCBwcm9wZXJ0aWVzKVxuICAgKiBIaW50OiBmdW5jdGlvbnMgd2lsbCBiZSBpZ25vcmVkXG4gICAqL1xuICBzdGF0aWMgaXNFcXVhbChhOiBhbnksIGI6IGFueSkge1xuICAgIHJldHVybiBIZWxwZXIuaXNTdWJzZXQoYSwgYikgJiYgSGVscGVyLmlzU3Vic2V0KGIsIGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcnN0IGxldmVsIGRpZmZlcmVuY2Ugb2YgdHdvIG9iamVjdHNcbiAgICogSGludDogZnVuY3Rpb25zIHdpbGwgYmUgaWdub3JlZCBhbmQgd2hlbiBhbiBhcnJheSBvciBhbiBvYmplY3QgaXMgZGlmZmVyZW50IHRoZSBob2xlIGFycmF5IG9yIG9iamVjdCB3aWxsIHVzZWQgYXMgcHJvcGVydHkgdmFsdWVcbiAgICpcbiAgICogQHJldHVybnMgUmVjb3JkPHN0cmluZywgYW55PiBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGZyb20gZmlyc3Qgb2JqZWN0XG4gICAqL1xuICBzdGF0aWMgZ2V0RGlmZihhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBiOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBjbG9uZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBsZXQgZmlyc3RPYmplY3QgPSBhO1xuICAgIGlmIChjbG9uZSkge1xuICAgICAgZmlyc3RPYmplY3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlyc3RPYmplY3QpKSB7XG4gICAgICBpZiAoIUhlbHBlci5pc1N1YnNldCh2YWx1ZSwgYltrZXldKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHByb3BlcnRpZSBpcyB0eXBlIG9mIEhUTUxDb2xsZWN0aW9uIG9yIE5vZGVMaXN0XG4gICAqIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNzIzODM0NFxuICAgKlxuICAgKiBAcGFyYW0gbm9kZXNcbiAgICovXG4gIHN0YXRpYyBpc05vZGVMaXN0KG5vZGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmluZ1JlcHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobm9kZXMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIG5vZGVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAvXlxcW29iamVjdCAoSFRNTENvbGxlY3Rpb258Tm9kZUxpc3R8T2JqZWN0KVxcXSQvLnRlc3Qoc3RyaW5nUmVwcikgJiZcbiAgICAgICAgdHlwZW9mIG5vZGVzLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgKG5vZGVzLmxlbmd0aCA9PT0gMCB8fCAodHlwZW9mIG5vZGVzWzBdID09PSAnb2JqZWN0JyAmJiBub2Rlc1swXS5ub2RlVHlwZSA+IDApKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,104 +0,0 @@
1
- import { Directive, ElementRef, Input, Output } from '@angular/core';
2
- /**
3
- * Directive vor context menu
4
- * See https://stackblitz.com/edit/angular-custom-context-menu
5
- */
6
- export class ContextMenuDirective {
7
- constructor(el) {
8
- this.el = el;
9
- this.xGap = 0;
10
- this.yGap = 0;
11
- this.overflowSpace = 10;
12
- this.selectors = '*';
13
- this.clickedElement = null;
14
- this.previousDisplayStatus = null;
15
- }
16
- ngOnInit() {
17
- if (this.ltContextMenu) {
18
- this.previousDisplayStatus = this.ltContextMenu.style.display;
19
- }
20
- // Add a click listener to the window,
21
- // so that we can close the context menu on left click
22
- window.addEventListener('click', () => {
23
- this.showContextMenu(null, false);
24
- });
25
- // Close context menu when escape is pressed
26
- window.addEventListener('keydown', (e) => {
27
- if (e.code === 'Escape') {
28
- this.showContextMenu(null, false);
29
- }
30
- });
31
- // Add an event listener to listen to the 'contextmenu' event
32
- this.el.nativeElement.addEventListener('contextmenu', (e) => {
33
- // Prevent the default context menu to popup
34
- if (e.preventDefault) {
35
- e.preventDefault();
36
- }
37
- // Shows our own context menu
38
- this.showContextMenu(e, true);
39
- });
40
- }
41
- // Shows or hides our custom context menu, which is specified as a input
42
- showContextMenu(event, show) {
43
- var _a;
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 = (_a = event === null || event === void 0 ? void 0 : event.target) === null || _a === void 0 ? void 0 : _a.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.decorators = [
87
- { type: Directive, args: [{
88
- selector: '[ltContextMenu]',
89
- exportAs: 'contextMenuData',
90
- },] }
91
- ];
92
- ContextMenuDirective.ctorParameters = () => [
93
- { type: ElementRef }
94
- ];
95
- ContextMenuDirective.propDecorators = {
96
- contextMenuData: [{ type: Input }],
97
- ltContextMenu: [{ type: Input }],
98
- xGap: [{ type: Input }],
99
- yGap: [{ type: Input }],
100
- overflowSpace: [{ type: Input }],
101
- selectors: [{ type: Input }],
102
- clickedElement: [{ type: Output }]
103
- };
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL2RpcmVjdGl2ZXMvY29udGV4dC1tZW51LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdFOzs7R0FHRztBQUtILE1BQU0sT0FBTyxvQkFBb0I7SUFVL0IsWUFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUFQekIsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixjQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ2YsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFDekMsMEJBQXFCLEdBQVcsSUFBSSxDQUFDO0lBRUEsQ0FBQztJQUV0QyxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDL0Q7UUFFRCxzQ0FBc0M7UUFDdEMsc0RBQXNEO1FBQ3RELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsNENBQTRDO1FBQzVDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUN2QixJQUFJLENBQUMsZUFBZSxDQUFD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QUM7U0FDckM7SUFDSCxDQUFDOzs7WUE5RkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLFFBQVEsRUFBRSxpQkFBaUI7YUFDNUI7OztZQVRtQixVQUFVOzs7OEJBVzNCLEtBQUs7NEJBQ0wsS0FBSzttQkFDTCxLQUFLO21CQUNMLEtBQUs7NEJBQ0wsS0FBSzt3QkFDTCxLQUFLOzZCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB2b3IgY29udGV4dCBtZW51XG4gKiBTZWUgaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2FuZ3VsYXItY3VzdG9tLWNvbnRleHQtbWVudVxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbHRDb250ZXh0TWVudV0nLFxuICBleHBvcnRBczogJ2NvbnRleHRNZW51RGF0YScsXG59KVxuZXhwb3J0IGNsYXNzIENvbnRleHRNZW51RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY29udGV4dE1lbnVEYXRhPzogYW55O1xuICBASW5wdXQoKSBsdENvbnRleHRNZW51OiBIVE1MRWxlbWVudDtcbiAgQElucHV0KCkgeEdhcCA9IDA7XG4gIEBJbnB1dCgpIHlHYXAgPSAwO1xuICBASW5wdXQoKSBvdmVyZmxvd1NwYWNlID0gMTA7XG4gIEBJbnB1dCgpIHNlbGVjdG9ycyA9ICcqJztcbiAgQE91dHB1dCgpIGNsaWNrZWRFbGVtZW50OiBFbGVtZW50ID0gbnVsbDtcbiAgcHJldmlvdXNEaXNwbGF5U3RhdHVzOiBzdHJpbmcgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMubHRDb250ZXh0TWVudSkge1xuICAgICAgdGhpcy5wcmV2aW91c0Rpc3BsYXlTdGF0dXMgPSB0aGlzLmx0Q29udGV4dE1lbnUuc3R5bGUuZGlzcGxheTtcbiAgICB9XG5cbiAgICAvLyBBZGQgYSBjbGljayBsaXN0ZW5lciB0byB0aGUgd2luZG93LFxuICAgIC8vIHNvIHRoYXQgd2UgY2FuIGNsb3NlIHRoZSBjb250ZXh0IG1lbnUgb24gbGVmdCBjbGlja1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0NvbnRleHRNZW51KG51bGwsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIENsb3NlIGNvbnRleHQgbWVudSB3aGVuIGVzY2FwZSBpcyBwcmVzc2VkXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUuY29kZSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5zaG93Q29udGV4dE1lbnUobnVsbCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGxpc3RlbiB0byB0aGUgJ2NvbnRleHRtZW51JyBldmVudFxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlKSA9PiB7XG4gICAgICAvLyBQcmV2ZW50IHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSB0byBwb3B1cFxuICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgLy8gU2hvd3Mgb3VyIG93biBjb250ZXh0IG1lbnVcbiAgICAgIHRoaXMuc2hvd0NvbnRleHRNZW51KGUsIHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU2hvd3Mgb3IgaGlkZXMgb3VyIGN1c3RvbSBjb250ZXh0IG1lbnUsIHdoaWNoIGlzIHNwZWNpZmllZCBhcyBhIGlucHV0XG4gIHNob3dDb250ZXh0TWVudShldmVudCwgc2hvdzogYm9vbGVhbikge1xuICAgIGNvbnN0IGNtID0gdGhpcy5sdENvbnRleHRNZW51O1xuICAgIGlmIChjbSkge1xuICAgICAgLy8gVHJ5IHRvIG9wZW4gY29udGV4dCBtZW51XG4gICAgICBpZiAoc2hvdyAmJiBldmVudCAmJiBldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gR2V0IHZhbGlkIGNsaWNrZWQgc3RydWN0dXJlRWxlbWVudFxuICAgICAgICBjb25zdCBjbGlja2VkRWxlbWVudCA9IChldmVudD8udGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8uY2xvc2VzdCh0aGlzLnNlbGVjdG9ycyk7XG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudCkge1xuICAgICAgICAgIC8vIFNldCBjbGlja2VkIHN0cnVjdHVyZUVsZW1lbnRcbiAgICAgICAgICB0aGlzLmNsaWNrZWRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQ7XG5cbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNldCBkaXNwbGF5IHN0YXR1c1xuICAgICAgICAgICAgY20uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3AgcG9zaXRpb25cbiAgICAgICAgICAgIGxldCB0b3AgPSBldmVudC55ICsgdGhpcy55R2FwO1xuICAgICAgICAgICAgaWYgKHRvcCArIGNtLm9mZnNldEhlaWdodCArIDEwID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgICB0b3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gY20ub2Zmc2V0SGVpZ2h0IC0gdGhpcy5vdmVyZmxvd1NwYWNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgbGVmdCBwb3NpdGlvblxuICAgICAgICAgICAgbGV0IGxlZnQgPSBldmVudC54ICsgdGhpcy54R2FwO1xuICAgICAgICAgICAgaWYgKGxlZnQgKyBjbS5vZmZzZXRXaWR0aCArIDEwID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSB7XG4gICAgICAgICAgICAgIGxlZnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggLSBjbS5vZmZzZXRXaWR0aCAtIHRoaXMub3ZlcmZsb3dTcGFjZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IHBvc2l0aW9uXG4gICAgICAgICAgICBjbS5zdHlsZS50b3AgPSB0b3AgKyAncHgnO1xuICAgICAgICAgICAgY20uc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnO1xuXG4gICAgICAgICAgICAvLyBTaG93XG4gICAgICAgICAgICBjbS5zdHlsZS5vcGFjaXR5ID0gJzEuMCc7XG4gICAgICAgICAgICBjbS5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdhdXRvJztcbiAgICAgICAgICB9LCAxKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbG9zZSBjb250ZXh0IG1lbnVcbiAgICAgIHRoaXMuY2xpY2tlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNEaXNwbGF5U3RhdHVzKSB7XG4gICAgICAgIGNtLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnByZXZpb3VzRGlzcGxheVN0YXR1cztcbiAgICAgIH1cbiAgICAgIGNtLnN0eWxlLm9wYWNpdHkgPSAnMC4wMSc7XG4gICAgICBjbS5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdub25lJztcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,43 +0,0 @@
1
- import { Directive, ElementRef, HostBinding, Input } from '@angular/core';
2
- /**
3
- * Directive for lazy loading images
4
- */
5
- export class LazyLoadDirective {
6
- constructor(el) {
7
- this.el = el;
8
- this.srcAttr = null;
9
- }
10
- ngAfterViewInit() {
11
- this.canLazyLoad() ? this.lazyLoadImage() : this.loadImage();
12
- }
13
- canLazyLoad() {
14
- return window && 'IntersectionObserver' in window;
15
- }
16
- lazyLoadImage() {
17
- const obs = new IntersectionObserver((entries) => {
18
- entries.forEach(({ isIntersecting }) => {
19
- if (isIntersecting) {
20
- this.loadImage();
21
- obs.unobserve(this.el.nativeElement);
22
- }
23
- });
24
- });
25
- obs.observe(this.el.nativeElement);
26
- }
27
- loadImage() {
28
- this.srcAttr = this.src;
29
- }
30
- }
31
- LazyLoadDirective.decorators = [
32
- { type: Directive, args: [{
33
- selector: 'img[ltLazyLoad]',
34
- },] }
35
- ];
36
- LazyLoadDirective.ctorParameters = () => [
37
- { type: ElementRef }
38
- ];
39
- LazyLoadDirective.propDecorators = {
40
- srcAttr: [{ type: HostBinding, args: ['attr.src',] }],
41
- src: [{ type: Input }]
42
- };
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1sb2FkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL2RpcmVjdGl2ZXMvbGF6eS1sb2FkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6Rjs7R0FFRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUFJNUIsWUFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUFIVCxZQUFPLEdBQUcsSUFBSSxDQUFDO0lBR0gsQ0FBQztJQUV0QyxlQUFlO1FBQ2IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRU8sV0FBVztRQUNqQixPQUFPLE1BQU0sSUFBSSxzQkFBc0IsSUFBSSxNQUFNLENBQUM7SUFDcEQsQ0FBQztJQUVPLGFBQWE7UUFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFDLGNBQWMsRUFBQyxFQUFFLEVBQUU7Z0JBQ25DLElBQUksY0FBYyxFQUFFO29CQUNsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDdEM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzFCLENBQUM7OztZQS9CRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjthQUM1Qjs7O1lBUGtDLFVBQVU7OztzQkFTMUMsV0FBVyxTQUFDLFVBQVU7a0JBQ3RCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgbGF6eSBsb2FkaW5nIGltYWdlc1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdpbWdbbHRMYXp5TG9hZF0nLFxufSlcbmV4cG9ydCBjbGFzcyBMYXp5TG9hZERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuc3JjJykgc3JjQXR0ciA9IG51bGw7XG4gIEBJbnB1dCgpIHNyYzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2FuTGF6eUxvYWQoKSA/IHRoaXMubGF6eUxvYWRJbWFnZSgpIDogdGhpcy5sb2FkSW1hZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuTGF6eUxvYWQoKSB7XG4gICAgcmV0dXJuIHdpbmRvdyAmJiAnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdztcbiAgfVxuXG4gIHByaXZhdGUgbGF6eUxvYWRJbWFnZSgpIHtcbiAgICBjb25zdCBvYnMgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoe2lzSW50ZXJzZWN0aW5nfSkgPT4ge1xuICAgICAgICBpZiAoaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLmxvYWRJbWFnZSgpO1xuICAgICAgICAgIG9icy51bm9ic2VydmUodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgb2JzLm9ic2VydmUodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEltYWdlKCkge1xuICAgIHRoaXMuc3JjQXR0ciA9IHRoaXMuc3JjO1xuICB9XG59XG4iXX0=
@@ -1,78 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Directive, ElementRef, HostListener, Inject, Input, PLATFORM_ID } from '@angular/core';
3
- import { ImageService } from '../services/image.service';
4
- import { isPlatformBrowser } from '@angular/common';
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
- matchHeight(parent, target) {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- if (!parent) {
25
- return;
26
- }
27
- let classNames;
28
- if (!Array.isArray(target)) {
29
- classNames = [target];
30
- }
31
- else {
32
- classNames = target;
33
- }
34
- for (const className of classNames) {
35
- // find all child structureElements with the selected class name
36
- const children = parent.getElementsByClassName(className);
37
- if (!children || children.length < 2) {
38
- continue;
39
- }
40
- // Load images of children
41
- if (this.loadImages) {
42
- yield this.imageService.preLoadImages({ elements: children });
43
- }
44
- // reset all children height
45
- Array.from(children).forEach((element) => {
46
- element.style.height = 'initial';
47
- });
48
- // get all the child structureElements heights
49
- const itemHeights = Array.from(children).map((element) => {
50
- if (element.getBoundingClientRect) {
51
- return element.getBoundingClientRect().height;
52
- }
53
- return 0;
54
- });
55
- // find out the tallest one
56
- const maxHeight = itemHeights.reduce((prev, curr) => (curr > prev ? curr : prev), 0);
57
- // update the child structureElements height to the tallest one
58
- Array.from(children).forEach((element) => (element.style.height = `${maxHeight}px`));
59
- }
60
- });
61
- }
62
- }
63
- MatchHeightDirective.decorators = [
64
- { type: Directive, args: [{
65
- selector: '[ltMatchHeight]',
66
- },] }
67
- ];
68
- MatchHeightDirective.ctorParameters = () => [
69
- { type: ElementRef },
70
- { type: ImageService },
71
- { type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
72
- ];
73
- MatchHeightDirective.propDecorators = {
74
- ltMatchHeight: [{ type: Input }],
75
- loadImages: [{ type: Input }],
76
- onResize: [{ type: HostListener, args: ['window:resize',] }]
77
- };
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtaGVpZ2h0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL2xpYi9iYXNlL2RpcmVjdGl2ZXMvbWF0Y2gtaGVpZ2h0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRDs7R0FFRztBQUlILE1BQU0sT0FBTyxvQkFBb0I7SUFZL0IsWUFBc0IsRUFBYyxFQUFZLFlBQTBCLEVBQXVCLFVBQWtCO1FBQTdGLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBWSxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQVAxRSw0REFBNEQ7UUFFNUQsZUFBVSxHQUFHLElBQUksQ0FBQztRQU1oQixJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFHRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUssV0FBVyxDQUFDLE1BQW1CLEVBQUUsTUFBeUI7O1lBQzlELElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsT0FBTzthQUNSO1lBRUQsSUFBSSxVQUFVLENBQUM7WUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDMUIsVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdkI7aUJBQU07Z0JBQ0wsVUFBVSxHQUFHLE1BQU0sQ0FBQzthQUNyQjtZQUVELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO2dCQUNsQyxnRUFBZ0U7Z0JBQ2hFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFMUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDcEMsU0FBUztpQkFDVjtnQkFFRCwwQkFBMEI7Z0JBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2lCQUMvRDtnQkFFRCw0QkFBNEI7Z0JBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBb0IsRUFBRSxFQUFFO29CQUNwRCxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7Z0JBQ25DLENBQUMsQ0FBQyxDQUFDO2dCQUVILDhDQUE4QztnQkFDOUMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDdkQsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7d0JBQ2pDLE9BQU8sT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxDQUFDO3FCQUMvQztvQkFDRCxPQUFPLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsQ0FBQztnQkFFSCwyQkFBMkI7Z0JBQzNCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRXJGLCtEQUErRDtnQkFDL0QsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ25HO1FBQ0gsQ0FBQztLQUFBOzs7WUF4RUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7YUFDNUI7OztZQVRtQixVQUFVO1lBQ3JCLFlBQVk7eUNBcUIwRCxNQUFNLFNBQUMsV0FBVzs7OzRCQVY5RixLQUFLO3lCQUlMLEtBQUs7dUJBVUwsWUFBWSxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW1hZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaW1hZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogU2V0IHNhbWUgaGVpZ2h0IChtYXhpbXVtKSB0byBkaWZmZXJlbnQgZWxlbWVudHNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2x0TWF0Y2hIZWlnaHRdJyxcbn0pXG5leHBvcnQgY2xhc3MgTWF0Y2hIZWlnaHREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyBjbGFzcyBuYW1lIHRvIG1hdGNoIGhlaWdodFxuICBASW5wdXQoKVxuICBsdE1hdGNoSGVpZ2h0OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvLyBSZXBsYWNlIGxhenkgbG9hZGluZyBpbWFnZXMgd2l0aCBpbW1lZGlhdGUgbG9hZGluZyBpbWFnZXNcbiAgQElucHV0KClcbiAgbG9hZEltYWdlcyA9IHRydWU7XG5cbiAgLy8gV2V0aGVyIGN1cnJlbnQgcGxhdGZvcm0gaXMgYSBicm93c2VyXG4gIHJlYWRvbmx5IGlzQnJvd3NlcjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWw6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBpbWFnZVNlcnZpY2U6IEltYWdlU2VydmljZSwgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogc3RyaW5nKSB7XG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBvblJlc2l6ZSgpIHtcbiAgICB0aGlzLm1hdGNoSGVpZ2h0KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5sdE1hdGNoSGVpZ2h0KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubWF0Y2hIZWlnaHQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmx0TWF0Y2hIZWlnaHQpO1xuICB9XG5cbiAgYXN5bmMgbWF0Y2hIZWlnaHQocGFyZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNsYXNzTmFtZXM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICAgIGNsYXNzTmFtZXMgPSBbdGFyZ2V0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xhc3NOYW1lcyA9IHRhcmdldDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBvZiBjbGFzc05hbWVzKSB7XG4gICAgICAvLyBmaW5kIGFsbCBjaGlsZCBzdHJ1Y3R1cmVFbGVtZW50cyB3aXRoIHRoZSBzZWxlY3RlZCBjbGFzcyBuYW1lXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSk7XG5cbiAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoIDwgMikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCBpbWFnZXMgb2YgY2hpbGRyZW5cbiAgICAgIGlmICh0aGlzLmxvYWRJbWFnZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbWFnZVNlcnZpY2UucHJlTG9hZEltYWdlcyh7IGVsZW1lbnRzOiBjaGlsZHJlbiB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVzZXQgYWxsIGNoaWxkcmVuIGhlaWdodFxuICAgICAgQXJyYXkuZnJvbShjaGlsZHJlbikuZm9yRWFjaCgoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnaW5pdGlhbCc7XG4gICAgICB9KTtcblxuICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGQgc3RydWN0dXJlRWxlbWVudHMgaGVpZ2h0c1xuICAgICAgY29uc3QgaXRlbUhlaWdodHMgPSBBcnJheS5mcm9tKGNoaWxkcmVuKS5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGZpbmQgb3V0IHRoZSB0YWxsZXN0IG9uZVxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gaXRlbUhlaWdodHMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoY3VyciA+IHByZXYgPyBjdXJyIDogcHJldiksIDApO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIGNoaWxkIHN0cnVjdHVyZUVsZW1lbnRzIGhlaWdodCB0byB0aGUgdGFsbGVzdCBvbmVcbiAgICAgIEFycmF5LmZyb20oY2hpbGRyZW4pLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiAoZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHttYXhIZWlnaHR9cHhgKSk7XG4gICAgfVxuICB9XG59XG4iXX0=