ngx-edu-sharing-ui 0.7.0 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/assets/scss/mixins.scss +4 -1
  2. package/assets/scss/variables.scss +3 -0
  3. package/esm2022/lib/actionbar/actionbar.component.mjs +188 -0
  4. package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +134 -0
  5. package/esm2022/lib/directives/border-box-observer.directive.mjs +71 -0
  6. package/esm2022/lib/directives/check-text-overflow.directive.mjs +65 -0
  7. package/esm2022/lib/directives/drag-nodes/drag-nodes.mjs +14 -0
  8. package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +79 -0
  9. package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +49 -0
  10. package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +105 -0
  11. package/esm2022/lib/directives/focus-state.directive.mjs +44 -0
  12. package/esm2022/lib/directives/icon.directive.mjs +139 -0
  13. package/esm2022/lib/dropdown/dropdown.component.mjs +70 -0
  14. package/esm2022/lib/edu-sharing-ui-configuration.mjs +41 -0
  15. package/esm2022/lib/edu-sharing-ui.module.mjs +78 -0
  16. package/esm2022/lib/list-items/available-widgets.mjs +27 -0
  17. package/esm2022/lib/list-items/format-duration.pipe.mjs +20 -0
  18. package/esm2022/lib/list-items/list-base/list-base.component.mjs +46 -0
  19. package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +29 -0
  20. package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +54 -0
  21. package/esm2022/lib/list-items/list-items.module.mjs +50 -0
  22. package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +41 -0
  23. package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +47 -0
  24. package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +24 -0
  25. package/esm2022/lib/list-items/list-text/list-text.component.mjs +106 -0
  26. package/esm2022/lib/list-items/list-widget.mjs +49 -0
  27. package/esm2022/lib/list-items/node-row/node-row.component.mjs +24 -0
  28. package/esm2022/lib/list-items/node-source.pipe.mjs +49 -0
  29. package/esm2022/lib/node-entries/combined-data-source.mjs +41 -0
  30. package/esm2022/lib/node-entries/custom-templates-data-source.mjs +7 -0
  31. package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +21 -0
  32. package/esm2022/lib/node-entries/entries-model.mjs +23 -0
  33. package/esm2022/lib/node-entries/items-cap.mjs +47 -0
  34. package/esm2022/lib/node-entries/list-item-label.pipe.mjs +34 -0
  35. package/esm2022/lib/node-entries/node-cache.mjs +65 -0
  36. package/esm2022/lib/node-entries/node-data-source-remote.mjs +4 -0
  37. package/esm2022/lib/node-entries/node-data-source.mjs +115 -0
  38. package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +131 -0
  39. package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +307 -0
  40. package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +45 -0
  41. package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +23 -0
  42. package/esm2022/lib/node-entries/node-entries-global.service.mjs +58 -0
  43. package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +42 -0
  44. package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +290 -0
  45. package/esm2022/lib/node-entries/node-entries-templates.service.mjs +11 -0
  46. package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +324 -0
  47. package/esm2022/lib/node-entries/node-entries.component.mjs +131 -0
  48. package/esm2022/lib/node-entries/node-entries.module.mjs +161 -0
  49. package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +102 -0
  50. package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +48 -0
  51. package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +36 -0
  52. package/esm2022/lib/node-entries/option-button/option-button.component.mjs +62 -0
  53. package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +53 -0
  54. package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +41 -0
  55. package/esm2022/lib/node-url/node-url.component.mjs +128 -0
  56. package/esm2022/lib/pipes/file-size.pipe.mjs +31 -0
  57. package/esm2022/lib/pipes/format-date.pipe.mjs +38 -0
  58. package/esm2022/lib/pipes/node-icon.pipe.mjs +18 -0
  59. package/esm2022/lib/pipes/node-image-size.pipe.mjs +24 -0
  60. package/esm2022/lib/pipes/node-image.pipe.mjs +55 -0
  61. package/esm2022/lib/pipes/node-person-name.pipe.mjs +50 -0
  62. package/esm2022/lib/pipes/node-title.pipe.mjs +19 -0
  63. package/esm2022/lib/pipes/option-tooltip.pipe.mjs +33 -0
  64. package/esm2022/lib/pipes/replace-chars.pipe.mjs +29 -0
  65. package/esm2022/lib/pipes/vcard-name.pipe.mjs +19 -0
  66. package/esm2022/lib/services/abstract/app.service.mjs +3 -0
  67. package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +10 -0
  68. package/esm2022/lib/services/abstract/options-helper.service.mjs +3 -0
  69. package/esm2022/lib/services/abstract/toast.service.mjs +3 -0
  70. package/esm2022/lib/services/accessibility.service.mjs +73 -0
  71. package/esm2022/lib/services/local-events.service.mjs +36 -0
  72. package/esm2022/lib/services/node-entries.service.mjs +137 -0
  73. package/esm2022/lib/services/node-helper.service.mjs +234 -0
  74. package/esm2022/lib/services/nodes-drag-drop.service.mjs +155 -0
  75. package/esm2022/lib/services/options-helper-data.service.mjs +134 -0
  76. package/esm2022/lib/services/repo-url.service.mjs +49 -0
  77. package/esm2022/lib/services/temporary-storage.service.mjs +48 -0
  78. package/esm2022/lib/services/ui.service.mjs +162 -0
  79. package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +50 -0
  80. package/esm2022/lib/spinner/spinner.component.mjs +18 -0
  81. package/esm2022/lib/translations/fallback-translation-handler.mjs +6 -0
  82. package/esm2022/lib/translations/languages.mjs +5 -0
  83. package/esm2022/lib/translations/translation-loader.mjs +149 -0
  84. package/esm2022/lib/translations/translation-source.mjs +11 -0
  85. package/esm2022/lib/translations/translations.module.mjs +67 -0
  86. package/esm2022/lib/translations/translations.service.mjs +171 -0
  87. package/esm2022/lib/types/accessibillity.mjs +19 -0
  88. package/esm2022/lib/types/api-models.mjs +2 -0
  89. package/esm2022/lib/types/drag-drop.mjs +2 -0
  90. package/esm2022/lib/types/keyboard-shortcuts.mjs +11 -0
  91. package/esm2022/lib/types/list-item.mjs +41 -0
  92. package/esm2022/lib/types/option-item.mjs +174 -0
  93. package/esm2022/lib/types/workflow.mjs +25 -0
  94. package/esm2022/lib/util/DateHelper.mjs +200 -0
  95. package/esm2022/lib/util/VCard.mjs +278 -0
  96. package/esm2022/lib/util/color-helper.mjs +124 -0
  97. package/esm2022/lib/util/duration-helper.mjs +102 -0
  98. package/esm2022/lib/util/functions.mjs +13 -0
  99. package/esm2022/lib/util/helper.mjs +64 -0
  100. package/esm2022/lib/util/isNumeric.mjs +11 -0
  101. package/esm2022/lib/util/rest-helper.mjs +33 -0
  102. package/esm2022/lib/util/ui-animation.mjs +146 -0
  103. package/esm2022/lib/util/ui-constants.mjs +21 -0
  104. package/esm2022/module.mjs +76 -0
  105. package/esm2022/ngx-edu-sharing-ui.mjs +5 -0
  106. package/fesm2022/ngx-edu-sharing-ui.mjs +6509 -0
  107. package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -0
  108. package/index.d.ts +5 -0
  109. package/lib/actionbar/actionbar.component.d.ts +74 -0
  110. package/lib/common/edu-sharing-ui-common.module.d.ts +32 -0
  111. package/lib/directives/border-box-observer.directive.d.ts +31 -0
  112. package/lib/directives/check-text-overflow.directive.d.ts +20 -0
  113. package/lib/directives/drag-nodes/drag-nodes.d.ts +16 -0
  114. package/lib/directives/drag-nodes/nodes-drag-source.directive.d.ts +37 -0
  115. package/lib/directives/drag-nodes/nodes-drag.directive.d.ts +17 -0
  116. package/lib/directives/drag-nodes/nodes-drop-target.directive.d.ts +22 -0
  117. package/lib/directives/focus-state.directive.d.ts +14 -0
  118. package/lib/directives/icon.directive.d.ts +46 -0
  119. package/lib/dropdown/dropdown.component.d.ts +40 -0
  120. package/lib/edu-sharing-ui-configuration.d.ts +11 -0
  121. package/lib/edu-sharing-ui.module.d.ts +19 -0
  122. package/lib/list-items/available-widgets.d.ts +13 -0
  123. package/lib/list-items/format-duration.pipe.d.ts +10 -0
  124. package/lib/list-items/list-base/list-base.component.d.ts +18 -0
  125. package/lib/list-items/list-collection-info/list-collection-info.component.d.ts +14 -0
  126. package/lib/list-items/list-counts/list-counts.component.d.ts +13 -0
  127. package/lib/list-items/list-items.module.d.ts +20 -0
  128. package/lib/list-items/list-node-license/list-node-license.component.d.ts +20 -0
  129. package/lib/list-items/list-node-replication-source/list-node-replication-source.component.d.ts +22 -0
  130. package/lib/list-items/list-node-workflow/list-node-workflow.component.d.ts +12 -0
  131. package/lib/list-items/list-text/list-text.component.d.ts +28 -0
  132. package/lib/list-items/list-widget.d.ts +32 -0
  133. package/lib/list-items/node-row/node-row.component.d.ts +12 -0
  134. package/lib/list-items/node-source.pipe.d.ts +16 -0
  135. package/lib/node-entries/combined-data-source.d.ts +19 -0
  136. package/{src/lib/node-entries/custom-templates-data-source.ts → lib/node-entries/custom-templates-data-source.d.ts} +2 -2
  137. package/lib/node-entries/drag-preview/drag-preview.component.d.ts +11 -0
  138. package/{src/lib/node-entries/entries-model.ts → lib/node-entries/entries-model.d.ts} +19 -47
  139. package/lib/node-entries/items-cap.d.ts +17 -0
  140. package/lib/node-entries/list-item-label.pipe.d.ts +14 -0
  141. package/lib/node-entries/node-cache.d.ts +17 -0
  142. package/{src/lib/node-entries/node-data-source-remote.ts → lib/node-entries/node-data-source-remote.d.ts} +2 -12
  143. package/lib/node-entries/node-data-source.d.ts +42 -0
  144. package/lib/node-entries/node-entries-card/node-entries-card.component.d.ts +45 -0
  145. package/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.d.ts +92 -0
  146. package/lib/node-entries/node-entries-card-small/node-entries-card-small.component.d.ts +23 -0
  147. package/lib/node-entries/node-entries-global-options/node-entries-global-options.component.d.ts +12 -0
  148. package/lib/node-entries/node-entries-global.service.d.ts +50 -0
  149. package/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.d.ts +17 -0
  150. package/lib/node-entries/node-entries-table/node-entries-table.component.d.ts +76 -0
  151. package/{src/lib/node-entries/node-entries-templates.service.ts → lib/node-entries/node-entries-templates.service.d.ts} +6 -9
  152. package/lib/node-entries/node-entries-wrapper.component.d.ts +129 -0
  153. package/lib/node-entries/node-entries.component.d.ts +32 -0
  154. package/lib/node-entries/node-entries.module.d.ts +43 -0
  155. package/lib/node-entries/node-rating/node-rating.component.d.ts +26 -0
  156. package/lib/node-entries/node-stats-badges/node-stats-badges.component.d.ts +17 -0
  157. package/lib/node-entries/node-type-badge/node-type-badge.component.d.ts +21 -0
  158. package/lib/node-entries/option-button/option-button.component.d.ts +11 -0
  159. package/lib/node-entries/preview-image/preview-image.component.d.ts +22 -0
  160. package/lib/node-entries/sort-select-panel/sort-select-panel.component.d.ts +16 -0
  161. package/lib/node-url/node-url.component.d.ts +51 -0
  162. package/lib/pipes/file-size.pipe.d.ts +10 -0
  163. package/lib/pipes/format-date.pipe.d.ts +21 -0
  164. package/lib/pipes/node-icon.pipe.d.ts +11 -0
  165. package/lib/pipes/node-image-size.pipe.d.ts +8 -0
  166. package/lib/pipes/node-image.pipe.d.ts +28 -0
  167. package/lib/pipes/node-person-name.pipe.d.ts +10 -0
  168. package/lib/pipes/node-title.pipe.d.ts +11 -0
  169. package/lib/pipes/option-tooltip.pipe.d.ts +12 -0
  170. package/lib/pipes/replace-chars.pipe.d.ts +10 -0
  171. package/lib/pipes/vcard-name.pipe.d.ts +10 -0
  172. package/{src/lib/services/abstract/app.service.ts → lib/services/abstract/app.service.d.ts} +1 -1
  173. package/lib/services/abstract/keyboard-shortcuts.service.d.ts +11 -0
  174. package/lib/services/abstract/options-helper.service.d.ts +10 -0
  175. package/{src/lib/services/abstract/toast.service.ts → lib/services/abstract/toast.service.d.ts} +1 -2
  176. package/lib/services/accessibility.service.d.ts +18 -0
  177. package/{src/lib/services/local-events.service.ts → lib/services/local-events.service.d.ts} +7 -10
  178. package/lib/services/node-entries.service.d.ts +69 -0
  179. package/lib/services/node-helper.service.d.ts +56 -0
  180. package/lib/services/nodes-drag-drop.service.d.ts +41 -0
  181. package/lib/services/options-helper-data.service.d.ts +75 -0
  182. package/lib/services/repo-url.service.d.ts +25 -0
  183. package/lib/services/temporary-storage.service.d.ts +35 -0
  184. package/lib/services/ui.service.d.ts +41 -0
  185. package/lib/sort-dropdown/sort-dropdown.component.d.ts +15 -0
  186. package/lib/spinner/spinner.component.d.ts +7 -0
  187. package/lib/translations/fallback-translation-handler.d.ts +4 -0
  188. package/lib/translations/languages.d.ts +4 -0
  189. package/lib/translations/translation-loader.d.ts +51 -0
  190. package/{src/lib/translations/translation-source.ts → lib/translations/translation-source.d.ts} +4 -4
  191. package/lib/translations/translations.module.d.ts +15 -0
  192. package/lib/translations/translations.service.d.ts +30 -0
  193. package/lib/types/accessibillity.d.ts +15 -0
  194. package/{src/lib/types/drag-drop.ts → lib/types/drag-drop.d.ts} +0 -3
  195. package/lib/types/keyboard-shortcuts.d.ts +10 -0
  196. package/lib/types/list-item.d.ts +55 -0
  197. package/lib/types/option-item.d.ts +236 -0
  198. package/lib/types/workflow.d.ts +14 -0
  199. package/lib/util/DateHelper.d.ts +44 -0
  200. package/lib/util/VCard.d.ts +66 -0
  201. package/lib/util/color-helper.d.ts +25 -0
  202. package/lib/util/duration-helper.d.ts +14 -0
  203. package/lib/util/functions.d.ts +4 -0
  204. package/lib/util/helper.d.ts +20 -0
  205. package/lib/util/isNumeric.d.ts +5 -0
  206. package/lib/util/rest-helper.d.ts +10 -0
  207. package/lib/util/ui-animation.d.ts +39 -0
  208. package/lib/util/ui-constants.d.ts +18 -0
  209. package/{src/module.ts → module.d.ts} +0 -4
  210. package/package.json +23 -9
  211. package/.browserslistrc +0 -16
  212. package/.eslintrc.json +0 -44
  213. package/karma.conf.js +0 -42
  214. package/ng-package.json +0 -10
  215. package/src/lib/actionbar/actionbar.component.html +0 -59
  216. package/src/lib/actionbar/actionbar.component.scss +0 -123
  217. package/src/lib/actionbar/actionbar.component.ts +0 -174
  218. package/src/lib/common/edu-sharing-ui-common.module.ts +0 -80
  219. package/src/lib/directives/border-box-observer.directive.ts +0 -75
  220. package/src/lib/directives/check-text-overflow.directive.ts +0 -61
  221. package/src/lib/directives/drag-nodes/drag-nodes.ts +0 -32
  222. package/src/lib/directives/drag-nodes/nodes-drag-source.directive.ts +0 -79
  223. package/src/lib/directives/drag-nodes/nodes-drag.directive.ts +0 -43
  224. package/src/lib/directives/drag-nodes/nodes-drop-target.directive.ts +0 -116
  225. package/src/lib/directives/focus-state.directive.ts +0 -34
  226. package/src/lib/directives/icon.directive.ts +0 -142
  227. package/src/lib/directives/nodes-drop-target-legacy.directive.ts +0 -155
  228. package/src/lib/dropdown/dropdown.component.html +0 -32
  229. package/src/lib/dropdown/dropdown.component.scss +0 -67
  230. package/src/lib/dropdown/dropdown.component.ts +0 -71
  231. package/src/lib/edu-sharing-ui-configuration.ts +0 -47
  232. package/src/lib/edu-sharing-ui.module.ts +0 -49
  233. package/src/lib/list-items/available-widgets.ts +0 -30
  234. package/src/lib/list-items/format-duration.pipe.ts +0 -17
  235. package/src/lib/list-items/list-base/list-base.component.html +0 -52
  236. package/src/lib/list-items/list-base/list-base.component.ts +0 -44
  237. package/src/lib/list-items/list-collection-info/list-collection-info.component.html +0 -48
  238. package/src/lib/list-items/list-collection-info/list-collection-info.component.scss +0 -8
  239. package/src/lib/list-items/list-collection-info/list-collection-info.component.ts +0 -24
  240. package/src/lib/list-items/list-counts/list-counts.component.html +0 -1
  241. package/src/lib/list-items/list-counts/list-counts.component.scss +0 -3
  242. package/src/lib/list-items/list-counts/list-counts.component.ts +0 -59
  243. package/src/lib/list-items/list-items.module.ts +0 -33
  244. package/src/lib/list-items/list-node-license/list-node-license.component.html +0 -8
  245. package/src/lib/list-items/list-node-license/list-node-license.component.ts +0 -47
  246. package/src/lib/list-items/list-node-replication-source/list-node-replication-source.component.html +0 -11
  247. package/src/lib/list-items/list-node-replication-source/list-node-replication-source.component.ts +0 -60
  248. package/src/lib/list-items/list-node-workflow/list-node-workflow.component.html +0 -3
  249. package/src/lib/list-items/list-node-workflow/list-node-workflow.component.ts +0 -21
  250. package/src/lib/list-items/list-text/list-text.component.html +0 -176
  251. package/src/lib/list-items/list-text/list-text.component.scss +0 -3
  252. package/src/lib/list-items/list-text/list-text.component.ts +0 -107
  253. package/src/lib/list-items/list-widget.ts +0 -52
  254. package/src/lib/list-items/node-row/node-row.component.html +0 -31
  255. package/src/lib/list-items/node-row/node-row.component.scss +0 -50
  256. package/src/lib/list-items/node-row/node-row.component.ts +0 -16
  257. package/src/lib/list-items/node-source.pipe.ts +0 -48
  258. package/src/lib/node-entries/combined-data-source.ts +0 -51
  259. package/src/lib/node-entries/drag-preview/drag-preview.component.html +0 -6
  260. package/src/lib/node-entries/drag-preview/drag-preview.component.scss +0 -35
  261. package/src/lib/node-entries/drag-preview/drag-preview.component.ts +0 -15
  262. package/src/lib/node-entries/items-cap.ts +0 -54
  263. package/src/lib/node-entries/list-item-label.pipe.ts +0 -28
  264. package/src/lib/node-entries/mixins.scss +0 -23
  265. package/src/lib/node-entries/node-cache.spec.ts +0 -199
  266. package/src/lib/node-entries/node-cache.ts +0 -81
  267. package/src/lib/node-entries/node-data-source.ts +0 -148
  268. package/src/lib/node-entries/node-entries-card/node-entries-card.component.html +0 -167
  269. package/src/lib/node-entries/node-entries-card/node-entries-card.component.scss +0 -28
  270. package/src/lib/node-entries/node-entries-card/node-entries-card.component.ts +0 -132
  271. package/src/lib/node-entries/node-entries-card/node-entries-card.main.scss +0 -261
  272. package/src/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.html +0 -205
  273. package/src/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.scss +0 -181
  274. package/src/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.ts +0 -361
  275. package/src/lib/node-entries/node-entries-card-small/node-entries-card-small.component.html +0 -100
  276. package/src/lib/node-entries/node-entries-card-small/node-entries-card-small.component.scss +0 -46
  277. package/src/lib/node-entries/node-entries-card-small/node-entries-card-small.component.ts +0 -40
  278. package/src/lib/node-entries/node-entries-global-options/node-entries-global-options.component.html +0 -23
  279. package/src/lib/node-entries/node-entries-global-options/node-entries-global-options.component.scss +0 -58
  280. package/src/lib/node-entries/node-entries-global-options/node-entries-global-options.component.ts +0 -16
  281. package/src/lib/node-entries/node-entries-global.service.ts +0 -79
  282. package/src/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.html +0 -25
  283. package/src/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.scss +0 -32
  284. package/src/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.ts +0 -31
  285. package/src/lib/node-entries/node-entries-table/node-entries-table.component.html +0 -270
  286. package/src/lib/node-entries/node-entries-table/node-entries-table.component.scss +0 -169
  287. package/src/lib/node-entries/node-entries-table/node-entries-table.component.ts +0 -333
  288. package/src/lib/node-entries/node-entries-wrapper.component.ts +0 -363
  289. package/src/lib/node-entries/node-entries.component.html +0 -33
  290. package/src/lib/node-entries/node-entries.component.scss +0 -13
  291. package/src/lib/node-entries/node-entries.component.ts +0 -151
  292. package/src/lib/node-entries/node-entries.module.ts +0 -93
  293. package/src/lib/node-entries/node-rating/node-rating.component.html +0 -53
  294. package/src/lib/node-entries/node-rating/node-rating.component.scss +0 -31
  295. package/src/lib/node-entries/node-rating/node-rating.component.ts +0 -105
  296. package/src/lib/node-entries/node-stats-badges/node-stats-badges.component.html +0 -39
  297. package/src/lib/node-entries/node-stats-badges/node-stats-badges.component.scss +0 -44
  298. package/src/lib/node-entries/node-stats-badges/node-stats-badges.component.ts +0 -43
  299. package/src/lib/node-entries/node-type-badge/node-type-badge.component.html +0 -31
  300. package/src/lib/node-entries/node-type-badge/node-type-badge.component.scss +0 -5
  301. package/src/lib/node-entries/node-type-badge/node-type-badge.component.ts +0 -36
  302. package/src/lib/node-entries/option-button/option-button.component.ts +0 -42
  303. package/src/lib/node-entries/preview-image/preview-image.component.html +0 -19
  304. package/src/lib/node-entries/preview-image/preview-image.component.scss +0 -31
  305. package/src/lib/node-entries/preview-image/preview-image.component.ts +0 -47
  306. package/src/lib/node-entries/sort-select-panel/sort-select-panel.component.html +0 -27
  307. package/src/lib/node-entries/sort-select-panel/sort-select-panel.component.scss +0 -9
  308. package/src/lib/node-entries/sort-select-panel/sort-select-panel.component.ts +0 -26
  309. package/src/lib/node-url/node-url.component.html +0 -66
  310. package/src/lib/node-url/node-url.component.scss +0 -32
  311. package/src/lib/node-url/node-url.component.ts +0 -136
  312. package/src/lib/pipes/file-size.pipe.ts +0 -24
  313. package/src/lib/pipes/format-date.pipe.ts +0 -39
  314. package/src/lib/pipes/node-icon.pipe.ts +0 -11
  315. package/src/lib/pipes/node-image-size.pipe.ts +0 -18
  316. package/src/lib/pipes/node-image.pipe.ts +0 -71
  317. package/src/lib/pipes/node-person-name.pipe.ts +0 -41
  318. package/src/lib/pipes/node-title.pipe.ts +0 -12
  319. package/src/lib/pipes/option-tooltip.pipe.ts +0 -32
  320. package/src/lib/pipes/replace-chars.pipe.ts +0 -21
  321. package/src/lib/pipes/vcard-name.pipe.ts +0 -11
  322. package/src/lib/services/abstract/keyboard-shortcuts.service.ts +0 -10
  323. package/src/lib/services/abstract/options-helper.service.ts +0 -29
  324. package/src/lib/services/accessibility.service.ts +0 -101
  325. package/src/lib/services/node-entries.service.ts +0 -172
  326. package/src/lib/services/node-helper.service.ts +0 -239
  327. package/src/lib/services/nodes-drag-drop.service.ts +0 -165
  328. package/src/lib/services/options-helper-data.service.ts +0 -186
  329. package/src/lib/services/repo-url.service.ts +0 -46
  330. package/src/lib/services/temporary-storage.service.ts +0 -58
  331. package/src/lib/services/ui.service.ts +0 -182
  332. package/src/lib/sort-dropdown/sort-dropdown.component.html +0 -22
  333. package/src/lib/sort-dropdown/sort-dropdown.component.scss +0 -47
  334. package/src/lib/sort-dropdown/sort-dropdown.component.ts +0 -42
  335. package/src/lib/spinner/spinner.component.html +0 -14
  336. package/src/lib/spinner/spinner.component.scss +0 -141
  337. package/src/lib/spinner/spinner.component.ts +0 -12
  338. package/src/lib/translations/README.md +0 -44
  339. package/src/lib/translations/fallback-translation-handler.ts +0 -7
  340. package/src/lib/translations/languages.ts +0 -6
  341. package/src/lib/translations/translation-loader.spec.ts +0 -352
  342. package/src/lib/translations/translation-loader.ts +0 -189
  343. package/src/lib/translations/translations.module.ts +0 -49
  344. package/src/lib/translations/translations.service.spec.ts +0 -152
  345. package/src/lib/translations/translations.service.ts +0 -188
  346. package/src/lib/types/accessibillity.ts +0 -15
  347. package/src/lib/types/keyboard-shortcuts.ts +0 -29
  348. package/src/lib/types/list-item.ts +0 -67
  349. package/src/lib/types/option-item.ts +0 -247
  350. package/src/lib/types/workflow.ts +0 -35
  351. package/src/lib/util/DateHelper.spec.ts +0 -112
  352. package/src/lib/util/DateHelper.ts +0 -197
  353. package/src/lib/util/VCard.ts +0 -277
  354. package/src/lib/util/color-helper.ts +0 -125
  355. package/src/lib/util/duration-helper.spec.ts +0 -35
  356. package/src/lib/util/duration-helper.ts +0 -98
  357. package/src/lib/util/functions.ts +0 -15
  358. package/src/lib/util/helper.ts +0 -60
  359. package/src/lib/util/isNumeric.ts +0 -13
  360. package/src/lib/util/rest-helper.ts +0 -28
  361. package/src/lib/util/ui-animation.ts +0 -154
  362. package/src/lib/util/ui-constants.ts +0 -20
  363. package/src/test.ts +0 -28
  364. package/tsconfig.lib.json +0 -15
  365. package/tsconfig.lib.prod.json +0 -10
  366. package/tsconfig.spec.json +0 -17
  367. /package/{src/lib/types/api-models.ts → lib/types/api-models.d.ts} +0 -0
@@ -0,0 +1,10 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class KeyboardShortcutsService {
4
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: KeyboardShortcutsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: KeyboardShortcutsService }); }
6
+ }
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: KeyboardShortcutsService, decorators: [{
8
+ type: Injectable
9
+ }] });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQtc2hvcnRjdXRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL3NlcnZpY2VzL2Fic3RyYWN0L2tleWJvYXJkLXNob3J0Y3V0cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBZ0Isd0JBQXdCOzhHQUF4Qix3QkFBd0I7a0hBQXhCLHdCQUF3Qjs7MkZBQXhCLHdCQUF3QjtrQkFEN0MsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtleWJvYXJkU2hvcnRjdXQgfSBmcm9tICcuLi8uLi90eXBlcy9rZXlib2FyZC1zaG9ydGN1dHMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgS2V5Ym9hcmRTaG9ydGN1dHNTZXJ2aWNlIHtcbiAgICBhYnN0cmFjdCByZWdpc3RlcihzaG9ydGN1dHM6IEtleWJvYXJkU2hvcnRjdXRbXSwgeyB1bnRpbCB9OiB7IHVudGlsOiBPYnNlcnZhYmxlPHZvaWQ+IH0pOiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc2hvdWxkSWdub3JlU2hvcnRjdXQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ export class OptionsHelperService {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy1oZWxwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvc2VydmljZXMvYWJzdHJhY3Qvb3B0aW9ucy1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLE9BQWdCLG9CQUFvQjtDQXdCekMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb25EYXRhLCBPcHRpb25zSGVscGVyQ29tcG9uZW50cyB9IGZyb20gJy4uL29wdGlvbnMtaGVscGVyLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBPcHRpb25JdGVtLCBUYXJnZXQgfSBmcm9tICcuLi8uLi90eXBlcy9vcHRpb24taXRlbSc7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLWFwaSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPcHRpb25zSGVscGVyU2VydmljZSB7XG4gICAgYWJzdHJhY3Qgd3JhcE9wdGlvbkNhbGxiYWNrcyhkYXRhOiBPcHRpb25EYXRhKTogT3B0aW9uRGF0YTtcblxuICAgIGFic3RyYWN0IHJlZnJlc2hDb21wb25lbnRzKFxuICAgICAgICBjb21wb25lbnRzOiBPcHRpb25zSGVscGVyQ29tcG9uZW50cyxcbiAgICAgICAgZGF0YTogT3B0aW9uRGF0YSxcbiAgICAgICAgcmVmcmVzaExpc3RPcHRpb25zOiBib29sZWFuLFxuICAgICk6IHZvaWQ7XG5cbiAgICBhYnN0cmFjdCBnZXRBdmFpbGFibGVPcHRpb25zKFxuICAgICAgICB0YXJnZXQ6IFRhcmdldCxcbiAgICAgICAgb2JqZWN0czogTm9kZVtdLFxuICAgICAgICBjb21wb25lbnRzOiBPcHRpb25zSGVscGVyQ29tcG9uZW50cyxcbiAgICAgICAgZGF0YTogT3B0aW9uRGF0YSxcbiAgICApOiBPcHRpb25JdGVtW107XG5cbiAgICBhYnN0cmFjdCBwYXN0ZU5vZGUoY29tcG9uZW50czogT3B0aW9uc0hlbHBlckNvbXBvbmVudHMsIGRhdGE6IE9wdGlvbkRhdGEsIG5vZGVzOiBOb2RlW10pOiB2b2lkO1xuXG4gICAgYWJzdHJhY3QgZmlsdGVyT3B0aW9ucyhcbiAgICAgICAgb3B0aW9uczogT3B0aW9uSXRlbVtdLFxuICAgICAgICB0YXJnZXQ6IFRhcmdldCxcbiAgICAgICAgZGF0YTogT3B0aW9uRGF0YSxcbiAgICAgICAgb2JqZWN0czogTm9kZVtdIHwgYW55LFxuICAgICk6IE9wdGlvbkl0ZW1bXTtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export class Toast {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvc2VydmljZXMvYWJzdHJhY3QvdG9hc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQWdCLEtBQUs7Q0FJMUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYWJzdHJhY3QgY2xhc3MgVG9hc3Qge1xuICAgIGFic3RyYWN0IHRvYXN0KG1lc3NhZ2U6IHN0cmluZywgdHJhbnNsYXRpb25QYXJhbWV0ZXJzPzogYW55KTogdm9pZDtcblxuICAgIGFic3RyYWN0IGVycm9yKGVycm9yT2JqZWN0OiBhbnksIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkO1xufVxuIl19
@@ -0,0 +1,73 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as rxjs from 'rxjs';
3
+ import { first, map } from 'rxjs/operators';
4
+ import { AccessibilitySettings } from '../types/accessibillity';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "ngx-edu-sharing-api";
7
+ export class AccessibilityService {
8
+ static { this.STORAGE_PREFIX = 'accessibility_'; }
9
+ constructor(storage) {
10
+ this.storage = storage;
11
+ }
12
+ async set(accessibilitySettings) {
13
+ const currentValues = await this.observeAll().pipe(first()).toPromise();
14
+ const values = Object.entries(accessibilitySettings)
15
+ .filter(([key, value]) =>
16
+ // check if value has been modified
17
+ currentValues[key] !== value)
18
+ .reduce((acc, [key, value]) => {
19
+ acc[AccessibilityService.STORAGE_PREFIX + key] = value;
20
+ return acc;
21
+ }, {});
22
+ if (Object.keys(values).length > 0) {
23
+ return this.storage.setValues(values);
24
+ }
25
+ }
26
+ observe(keyOrKeys) {
27
+ if (typeof keyOrKeys === 'string') {
28
+ return this.observeSingle(keyOrKeys);
29
+ }
30
+ else if (Array.isArray(keyOrKeys)) {
31
+ return this.observeMultiple(keyOrKeys);
32
+ }
33
+ else {
34
+ return this.observeAll();
35
+ }
36
+ }
37
+ observeSingle(key) {
38
+ const defaultValues = new AccessibilitySettings();
39
+ return this.storage.observe(AccessibilityService.STORAGE_PREFIX + key, defaultValues[key]);
40
+ }
41
+ observeMultiple(keys) {
42
+ const defaultValues = new AccessibilitySettings();
43
+ return combineLatest(keys.reduce((acc, key) => {
44
+ acc[key] = this.storage.observe(AccessibilityService.STORAGE_PREFIX + key, defaultValues[key]);
45
+ return acc;
46
+ }, {}));
47
+ }
48
+ observeAll() {
49
+ return this.observeMultiple(Object.keys(new AccessibilitySettings()));
50
+ }
51
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AccessibilityService, deps: [{ token: i1.SessionStorageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
52
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AccessibilityService, providedIn: 'root' }); }
53
+ }
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AccessibilityService, decorators: [{
55
+ type: Injectable,
56
+ args: [{
57
+ providedIn: 'root',
58
+ }]
59
+ }], ctorParameters: function () { return [{ type: i1.SessionStorageService }]; } });
60
+ /**
61
+ * Rxjs.combineLatest on objects instead of arrays.
62
+ *
63
+ * This is a standard function in Rxjs 7, but we wrap it here for Rxjs 6.
64
+ */
65
+ function combineLatest(sources) {
66
+ return rxjs
67
+ .combineLatest(Object.entries(sources).map(([key, source]) => source.pipe(map((result) => ({ key, result })))))
68
+ .pipe(map((results) => results.reduce((acc, { key, result }) => {
69
+ acc[key] = result;
70
+ return acc;
71
+ }, {})));
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzaWJpbGl0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9zZXJ2aWNlcy9hY2Nlc3NpYmlsaXR5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7QUFNaEUsTUFBTSxPQUFPLG9CQUFvQjthQUNMLG1CQUFjLEdBQUcsZ0JBQWdCLENBQUM7SUFFMUQsWUFBb0IsT0FBOEI7UUFBOUIsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7SUFBRyxDQUFDO0lBRXRELEtBQUssQ0FBQyxHQUFHLENBQUMscUJBQXFEO1FBQzNELE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUM7YUFDL0MsTUFBTSxDQUNILENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtRQUNiLG1DQUFtQztRQUNsQyxhQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FDNUM7YUFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMxQixHQUFHLENBQUMsb0JBQW9CLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN2RCxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUMsRUFBRSxFQUE0QixDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN6QztJQUNMLENBQUM7SUFPRCxPQUFPLENBQ0gsU0FBbUI7UUFFbkIsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3hDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMxQzthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDNUI7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUNqQixHQUFNO1FBRU4sTUFBTSxhQUFhLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsY0FBYyxHQUFHLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8sZUFBZSxDQUNuQixJQUFTO1FBRVQsTUFBTSxhQUFhLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ2xELE9BQU8sYUFBYSxDQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3JCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDM0Isb0JBQW9CLENBQUMsY0FBYyxHQUFHLEdBQUcsRUFDekMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUNyQixDQUFDO1lBQ0YsT0FBTyxHQUFHLENBQUM7UUFDZixDQUFDLEVBQUUsRUFBc0YsQ0FBQyxDQUM3RixDQUFDO0lBQ04sQ0FBQztJQUVPLFVBQVU7UUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxxQkFBcUIsRUFBRSxDQUF1QyxDQUNqRixDQUFDO0lBQ04sQ0FBQzs4R0FqRVEsb0JBQW9CO2tIQUFwQixvQkFBb0IsY0FGakIsTUFBTTs7MkZBRVQsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7QUFxRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUF1QixPQUU1QztJQUNHLE9BQU8sSUFBSTtTQUNOLGFBQWEsQ0FDVixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FDekMsTUFBMkIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUN4RSxDQUNKO1NBQ0EsSUFBSSxDQUNELEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ1osT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQ3BDLEdBQUcsQ0FBQyxHQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDLEVBQUUsRUFBTyxDQUFDLENBQ2QsQ0FDSixDQUFDO0FBQ1YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIHJ4anMgZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNldHRpbmdzIH0gZnJvbSAnLi4vdHlwZXMvYWNjZXNzaWJpbGxpdHknO1xuaW1wb3J0IHsgU2Vzc2lvblN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnbmd4LWVkdS1zaGFyaW5nLWFwaSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1BSRUZJWCA9ICdhY2Nlc3NpYmlsaXR5Xyc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2U6IFNlc3Npb25TdG9yYWdlU2VydmljZSkge31cblxuICAgIGFzeW5jIHNldChhY2Nlc3NpYmlsaXR5U2V0dGluZ3M6IFBhcnRpYWw8QWNjZXNzaWJpbGl0eVNldHRpbmdzPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gYXdhaXQgdGhpcy5vYnNlcnZlQWxsKCkucGlwZShmaXJzdCgpKS50b1Byb21pc2UoKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmVudHJpZXMoYWNjZXNzaWJpbGl0eVNldHRpbmdzKVxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB2YWx1ZSBoYXMgYmVlbiBtb2RpZmllZFxuICAgICAgICAgICAgICAgICAgICAoY3VycmVudFZhbHVlcyBhcyBhbnkpW2tleV0gIT09IHZhbHVlLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBhY2NbQWNjZXNzaWJpbGl0eVNlcnZpY2UuU1RPUkFHRV9QUkVGSVggKyBrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIHt9IGFzIHsgW2tleTogc3RyaW5nXTogYW55IH0pO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnNldFZhbHVlcyh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb2JzZXJ2ZTxLIGV4dGVuZHMga2V5b2YgQWNjZXNzaWJpbGl0eVNldHRpbmdzPihrZXk6IEspOiBPYnNlcnZhYmxlPEFjY2Vzc2liaWxpdHlTZXR0aW5nc1tLXT47XG4gICAgb2JzZXJ2ZTxLIGV4dGVuZHMga2V5b2YgQWNjZXNzaWJpbGl0eVNldHRpbmdzPihcbiAgICAgICAga2V5czogS1tdLFxuICAgICk6IE9ic2VydmFibGU8UGljazxBY2Nlc3NpYmlsaXR5U2V0dGluZ3MsIEs+PjtcbiAgICBvYnNlcnZlKCk6IE9ic2VydmFibGU8QWNjZXNzaWJpbGl0eVNldHRpbmdzPjtcbiAgICBvYnNlcnZlPEsgZXh0ZW5kcyBrZXlvZiBBY2Nlc3NpYmlsaXR5U2V0dGluZ3M+KFxuICAgICAgICBrZXlPcktleXM/OiBLIHwgS1tdLFxuICAgICk6IE9ic2VydmFibGU8QWNjZXNzaWJpbGl0eVNldHRpbmdzW0tdIHwgUGljazxBY2Nlc3NpYmlsaXR5U2V0dGluZ3MsIEs+PiB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5T3JLZXlzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZVNpbmdsZShrZXlPcktleXMpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoa2V5T3JLZXlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZU11bHRpcGxlKGtleU9yS2V5cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlQWxsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9ic2VydmVTaW5nbGU8SyBleHRlbmRzIGtleW9mIEFjY2Vzc2liaWxpdHlTZXR0aW5ncz4oXG4gICAgICAgIGtleTogSyxcbiAgICApOiBPYnNlcnZhYmxlPEFjY2Vzc2liaWxpdHlTZXR0aW5nc1tLXT4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0gbmV3IEFjY2Vzc2liaWxpdHlTZXR0aW5ncygpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLm9ic2VydmUoQWNjZXNzaWJpbGl0eVNlcnZpY2UuU1RPUkFHRV9QUkVGSVggKyBrZXksIGRlZmF1bHRWYWx1ZXNba2V5XSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlTXVsdGlwbGU8SyBleHRlbmRzIGtleW9mIEFjY2Vzc2liaWxpdHlTZXR0aW5ncz4oXG4gICAgICAgIGtleXM6IEtbXSxcbiAgICApOiBPYnNlcnZhYmxlPFBpY2s8QWNjZXNzaWJpbGl0eVNldHRpbmdzLCBLPj4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0gbmV3IEFjY2Vzc2liaWxpdHlTZXR0aW5ncygpO1xuICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChcbiAgICAgICAgICAgIGtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGFjY1trZXldID0gdGhpcy5zdG9yYWdlLm9ic2VydmUoXG4gICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLlNUT1JBR0VfUFJFRklYICsga2V5LFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVzW2tleV0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwge30gYXMgeyBba2V5IGluIGtleW9mIEFjY2Vzc2liaWxpdHlTZXR0aW5nc106IE9ic2VydmFibGU8QWNjZXNzaWJpbGl0eVNldHRpbmdzW2tleV0+IH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb2JzZXJ2ZUFsbCgpOiBPYnNlcnZhYmxlPEFjY2Vzc2liaWxpdHlTZXR0aW5ncz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlTXVsdGlwbGUoXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhuZXcgQWNjZXNzaWJpbGl0eVNldHRpbmdzKCkpIGFzIEFycmF5PGtleW9mIEFjY2Vzc2liaWxpdHlTZXR0aW5ncz4sXG4gICAgICAgICk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJ4anMuY29tYmluZUxhdGVzdCBvbiBvYmplY3RzIGluc3RlYWQgb2YgYXJyYXlzLlxuICpcbiAqIFRoaXMgaXMgYSBzdGFuZGFyZCBmdW5jdGlvbiBpbiBSeGpzIDcsIGJ1dCB3ZSB3cmFwIGl0IGhlcmUgZm9yIFJ4anMgNi5cbiAqL1xuZnVuY3Rpb24gY29tYmluZUxhdGVzdDxULCBLIGV4dGVuZHMga2V5b2YgVD4oc291cmNlczoge1xuICAgIFtrZXkgaW4gS106IE9ic2VydmFibGU8VFtrZXldPjtcbn0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gcnhqc1xuICAgICAgICAuY29tYmluZUxhdGVzdChcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHNvdXJjZXMpLm1hcCgoW2tleSwgc291cmNlXSkgPT5cbiAgICAgICAgICAgICAgICAoc291cmNlIGFzIE9ic2VydmFibGU8VFtLXT4pLnBpcGUobWFwKChyZXN1bHQpID0+ICh7IGtleSwgcmVzdWx0IH0pKSksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXN1bHRzKSA9PlxuICAgICAgICAgICAgICAgIHJlc3VsdHMucmVkdWNlKChhY2MsIHsga2V5LCByZXN1bHQgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhY2Nba2V5IGFzIEtdID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgIH0sIHt9IGFzIFQpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbn1cbiJdfQ==
@@ -0,0 +1,36 @@
1
+ import { EventEmitter, Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * An application-wide event broker.
5
+ */
6
+ export class LocalEventsService {
7
+ constructor() {
8
+ /**
9
+ * The metadata of one or more nodes have been updated.
10
+ *
11
+ * The emitted value is the array of updated nodes.
12
+ *
13
+ * The emitter should not be triggered with an empty array or null.
14
+ */
15
+ this.nodesChanged = new EventEmitter();
16
+ /**
17
+ * One or more nodes have been moved to the recycle bin.
18
+ *
19
+ * The emitted value is the array of former nodes.
20
+ *
21
+ * The emitter should not be triggered with an empty array or null.
22
+ */
23
+ // FIXME: Maybe a `nodesMoved` emitter would make for sense for updating lists that used to
24
+ // include a node and lists that the node was moved to.
25
+ this.nodesDeleted = new EventEmitter();
26
+ }
27
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: LocalEventsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
28
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: LocalEventsService, providedIn: 'root' }); }
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: LocalEventsService, decorators: [{
31
+ type: Injectable,
32
+ args: [{
33
+ providedIn: 'root',
34
+ }]
35
+ }] });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZXZlbnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL3NlcnZpY2VzL2xvY2FsLWV2ZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUd6RDs7R0FFRztBQUlILE1BQU0sT0FBTyxrQkFBa0I7SUFIL0I7UUFJSTs7Ozs7O1dBTUc7UUFDTSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDbkQ7Ozs7OztXQU1HO1FBQ0gsMkZBQTJGO1FBQzNGLHVEQUF1RDtRQUM5QyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7S0FDdEQ7OEdBbkJZLGtCQUFrQjtrSEFBbEIsa0JBQWtCLGNBRmYsTUFBTTs7MkZBRVQsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuXG4vKipcbiAqIEFuIGFwcGxpY2F0aW9uLXdpZGUgZXZlbnQgYnJva2VyLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMb2NhbEV2ZW50c1NlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXRhZGF0YSBvZiBvbmUgb3IgbW9yZSBub2RlcyBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICAgKlxuICAgICAqIFRoZSBlbWl0dGVkIHZhbHVlIGlzIHRoZSBhcnJheSBvZiB1cGRhdGVkIG5vZGVzLlxuICAgICAqXG4gICAgICogVGhlIGVtaXR0ZXIgc2hvdWxkIG5vdCBiZSB0cmlnZ2VyZWQgd2l0aCBhbiBlbXB0eSBhcnJheSBvciBudWxsLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5vZGVzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Tm9kZVtdPigpO1xuICAgIC8qKlxuICAgICAqIE9uZSBvciBtb3JlIG5vZGVzIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgcmVjeWNsZSBiaW4uXG4gICAgICpcbiAgICAgKiBUaGUgZW1pdHRlZCB2YWx1ZSBpcyB0aGUgYXJyYXkgb2YgZm9ybWVyIG5vZGVzLlxuICAgICAqXG4gICAgICogVGhlIGVtaXR0ZXIgc2hvdWxkIG5vdCBiZSB0cmlnZ2VyZWQgd2l0aCBhbiBlbXB0eSBhcnJheSBvciBudWxsLlxuICAgICAqL1xuICAgIC8vIEZJWE1FOiBNYXliZSBhIGBub2Rlc01vdmVkYCBlbWl0dGVyIHdvdWxkIG1ha2UgZm9yIHNlbnNlIGZvciB1cGRhdGluZyBsaXN0cyB0aGF0IHVzZWQgdG9cbiAgICAvLyBpbmNsdWRlIGEgbm9kZSBhbmQgbGlzdHMgdGhhdCB0aGUgbm9kZSB3YXMgbW92ZWQgdG8uXG4gICAgcmVhZG9ubHkgbm9kZXNEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlW10+KCk7XG59XG4iXX0=
@@ -0,0 +1,137 @@
1
+ import { SelectionModel } from '@angular/cdk/collections';
2
+ import { Injectable } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { NodeDataSourceRemote } from '../node-entries/node-data-source-remote';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./ui.service";
7
+ import * as i2 from "../node-entries/node-entries-global.service";
8
+ export class NodeEntriesService {
9
+ get dataSource() {
10
+ return this.dataSource$.value;
11
+ }
12
+ set dataSource(value) {
13
+ this.dataSource$.next(value);
14
+ }
15
+ get paginationStrategy() {
16
+ return this.entriesGlobal.getPaginationStrategy(this.scope);
17
+ }
18
+ get columns() {
19
+ return this.columnsSubject.value;
20
+ }
21
+ set columns(value) {
22
+ this.columnsSubject.next(value);
23
+ }
24
+ get options() {
25
+ return this.options$.value;
26
+ }
27
+ set options(options) {
28
+ this.options$.next(options);
29
+ }
30
+ get sort() {
31
+ return this.sortSubject.value;
32
+ }
33
+ set sort(value) {
34
+ this.sortSubject.next(value);
35
+ }
36
+ get gridConfig() {
37
+ return this.gridConfig$.value;
38
+ }
39
+ set gridConfig(value) {
40
+ this.gridConfig$.next(value);
41
+ }
42
+ constructor(uiService, entriesGlobal) {
43
+ this.uiService = uiService;
44
+ this.entriesGlobal = entriesGlobal;
45
+ this.dataSource$ = new BehaviorSubject(null);
46
+ /**
47
+ * Subject that reflects the current columns configuration.
48
+ *
49
+ * Updated when loading configuration and through user interaction.
50
+ */
51
+ this.columnsSubject = new BehaviorSubject(null);
52
+ this.selection = new SelectionModel(true, []);
53
+ this.options$ = new BehaviorSubject(null);
54
+ this.sortSubject = new BehaviorSubject(void 0);
55
+ this.gridConfig$ = new BehaviorSubject(null);
56
+ }
57
+ onClicked({ event, ...data }) {
58
+ if (event.ctrlKey || event.metaKey) {
59
+ this.selection.toggle(data.element);
60
+ }
61
+ else if (event.shiftKey) {
62
+ this.expandSelectionTo(data.element);
63
+ }
64
+ else {
65
+ this.clickItem.emit(data);
66
+ }
67
+ }
68
+ onCheckboxChanged(node, checked) {
69
+ console.log(node, checked, this.uiService.shiftKeyPressed);
70
+ if (this.uiService.shiftKeyPressed) {
71
+ this.expandSelectionTo(node);
72
+ }
73
+ if (checked !== this.selection.isSelected(node)) {
74
+ this.selection.toggle(node);
75
+ }
76
+ }
77
+ toggleSelectAll() {
78
+ if (this.isAllSelected()) {
79
+ this.selection.clear();
80
+ }
81
+ else {
82
+ this.selectAll();
83
+ }
84
+ }
85
+ loadMore(source) {
86
+ if (this.paginationStrategy !== 'infinite-scroll') {
87
+ return false;
88
+ }
89
+ if (source === 'scroll' && this.disableInfiniteScroll) {
90
+ return false;
91
+ }
92
+ // TODO: focus next item when triggered via button.
93
+ if (this.dataSource instanceof NodeDataSourceRemote) {
94
+ return this.dataSource.loadMore();
95
+ }
96
+ else {
97
+ if (this.dataSource.hasMore()) {
98
+ this.fetchData.emit({
99
+ offset: this.dataSource.getData().length,
100
+ reset: false,
101
+ });
102
+ return true;
103
+ }
104
+ else {
105
+ return false;
106
+ }
107
+ }
108
+ }
109
+ selectAll() {
110
+ this.selection.select(...this.dataSource.getData());
111
+ }
112
+ isAllSelected() {
113
+ return this.dataSource.getData().every((node) => this.selection.isSelected(node));
114
+ }
115
+ expandSelectionTo(node) {
116
+ const nodeIndex = this.dataSource.getData().indexOf(node);
117
+ const selectionIndexes = this.selection.selected
118
+ .map((node) => this.dataSource.getData().indexOf(node))
119
+ .filter((index) => index >= 0);
120
+ if (Math.min(...selectionIndexes) < nodeIndex) {
121
+ for (let i = Math.min(...selectionIndexes) + 1; i <= nodeIndex; i++) {
122
+ this.selection.select(this.dataSource.getData()[i]);
123
+ }
124
+ }
125
+ else if (Math.max(...selectionIndexes) > nodeIndex) {
126
+ for (let i = nodeIndex; i < Math.max(...selectionIndexes); i++) {
127
+ this.selection.select(this.dataSource.getData()[i]);
128
+ }
129
+ }
130
+ }
131
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeEntriesService, deps: [{ token: i1.UIService }, { token: i2.NodeEntriesGlobalService }], target: i0.ɵɵFactoryTarget.Injectable }); }
132
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeEntriesService }); }
133
+ }
134
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeEntriesService, decorators: [{
135
+ type: Injectable
136
+ }], ctorParameters: function () { return [{ type: i1.UIService }, { type: i2.NodeEntriesGlobalService }]; } });
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lZHUtc2hhcmluZy11aS9zcmMvbGliL3NlcnZpY2VzL25vZGUtZW50cmllcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBc0J2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7OztBQUcvRSxNQUFNLE9BQU8sa0JBQWtCO0lBUTNCLElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLEtBQXdCO1FBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxJQUFJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFPRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFpQjtRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBUUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsT0FBb0I7UUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJ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LENBQUMsR0FBRyxTQUFTLEVBQUU7WUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZEO1NBQ0o7YUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLFNBQVMsRUFBRTtZQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RDtTQUNKO0lBQ0wsQ0FBQzs4R0EvSVEsa0JBQWtCO2tIQUFsQixrQkFBa0I7OzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBGZXRjaEV2ZW50LFxuICAgIEdyaWRDb25maWcsXG4gICAgSW50ZXJhY3Rpb25UeXBlLFxuICAgIExpc3REcmFnR3JvcENvbmZpZyxcbiAgICBMaXN0RXZlbnRJbnRlcmZhY2UsXG4gICAgTGlzdE9wdGlvbnMsXG4gICAgTGlzdFNvcnRDb25maWcsXG4gICAgTm9kZUNsaWNrRXZlbnQsXG4gICAgTm9kZUVudHJpZXNEYXRhVHlwZSxcbiAgICBOb2RlRW50cmllc0Rpc3BsYXlUeXBlLFxufSBmcm9tICcuLi9ub2RlLWVudHJpZXMvZW50cmllcy1tb2RlbCc7XG5pbXBvcnQgeyBOb2RlRGF0YVNvdXJjZSB9IGZyb20gJy4uL25vZGUtZW50cmllcy9ub2RlLWRhdGEtc291cmNlJztcbmltcG9ydCB7XG4gICAgTm9kZUVudHJpZXNHbG9iYWxTZXJ2aWNlLFxuICAgIFBhZ2luYXRpb25TdHJhdGVneSxcbn0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzL25vZGUtZW50cmllcy1nbG9iYWwuc2VydmljZSc7XG5cbmltcG9ydCB7IE9wdGlvbkl0ZW0sIFNjb3BlIH0gZnJvbSAnLi4vdHlwZXMvb3B0aW9uLWl0ZW0nO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuLi90eXBlcy9saXN0LWl0ZW0nO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi91aS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVEYXRhU291cmNlUmVtb3RlIH0gZnJvbSAnLi4vbm9kZS1lbnRyaWVzL25vZGUtZGF0YS1zb3VyY2UtcmVtb3RlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5vZGVFbnRyaWVzU2VydmljZTxUIGV4dGVuZHMgTm9kZUVudHJpZXNEYXRhVHlwZT4ge1xuICAgIGxpc3Q6IExpc3RFdmVudEludGVyZmFjZTxUPjtcbiAgICByZWFkb25seSBkYXRhU291cmNlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Tm9kZURhdGFTb3VyY2U8VD4gfCBudWxsPihudWxsKTtcbiAgICAvKipcbiAgICAgKiBzY29wZSB0aGUgY3VycmVudCBsaXN0IGlzIGluLCBlLmcuIHdvcmtzcGFjZVxuICAgICAqIFRoaXMgaXMgdXNlZCBmb3IgYWRkaXRpb25hbCBjb25maWcgaW5qZWN0aW9uIGJhc2VkIG9uIHRoZSBzY29wZVxuICAgICAqL1xuICAgIHNjb3BlOiBTY29wZTtcbiAgICBnZXQgZGF0YVNvdXJjZSgpOiBOb2RlRGF0YVNvdXJjZTxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UkLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgZGF0YVNvdXJjZSh2YWx1ZTogTm9kZURhdGFTb3VyY2U8VD4pIHtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlJC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IHBhZ2luYXRpb25TdHJhdGVneSgpOiBQYWdpbmF0aW9uU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzR2xvYmFsLmdldFBhZ2luYXRpb25TdHJhdGVneSh0aGlzLnNjb3BlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3ViamVjdCB0aGF0IHJlZmxlY3RzIHRoZSBjdXJyZW50IGNvbHVtbnMgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFVwZGF0ZWQgd2hlbiBsb2FkaW5nIGNvbmZpZ3VyYXRpb24gYW5kIHRocm91Z2ggdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKi9cbiAgICBjb2x1bW5zU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGlzdEl0ZW1bXT4obnVsbCk7XG4gICAgZ2V0IGNvbHVtbnMoKTogTGlzdEl0ZW1bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNTdWJqZWN0LnZhbHVlO1xuICAgIH1cbiAgICBzZXQgY29sdW1ucyh2YWx1ZTogTGlzdEl0ZW1bXSkge1xuICAgICAgICB0aGlzLmNvbHVtbnNTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cbiAgICBjb25maWd1cmVDb2x1bW5zOiBib29sZWFuO1xuICAgIC8qKiBFbWl0cyB3aGVuIHRoZSBjb2x1bW5zIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB0aHJvdWdoIHVzZXIgaW50ZXJhY3Rpb24uICovXG4gICAgY29sdW1uc0NoYW5nZTogRXZlbnRFbWl0dGVyPExpc3RJdGVtW10+O1xuICAgIGRpc3BsYXlUeXBlOiBOb2RlRW50cmllc0Rpc3BsYXlUeXBlO1xuICAgIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUPih0cnVlLCBbXSk7XG4gICAgZWxlbWVudEludGVyYWN0aW9uVHlwZTogSW50ZXJhY3Rpb25UeXBlO1xuICAgIG9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0T3B0aW9ucz4obnVsbCk7XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMkLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgb3B0aW9ucyhvcHRpb25zOiBMaXN0T3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMkLm5leHQob3B0aW9ucyk7XG4gICAgfVxuICAgIGNoZWNrYm94OiBib29sZWFuO1xuICAgIGdsb2JhbE9wdGlvbnM6IE9wdGlvbkl0ZW1bXTtcbiAgICBzb3J0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGlzdFNvcnRDb25maWc+KHZvaWQgMCk7XG4gICAgZ2V0IHNvcnQoKTogTGlzdFNvcnRDb25maWcge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0U3ViamVjdC52YWx1ZTtcbiAgICB9XG4gICAgc2V0IHNvcnQodmFsdWU6IExpc3RTb3J0Q29uZmlnKSB7XG4gICAgICAgIHRoaXMuc29ydFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuICAgIHNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxMaXN0U29ydENvbmZpZz47XG4gICAgZHJhZ0Ryb3A6IExpc3REcmFnR3JvcENvbmZpZzxUPjtcbiAgICBjbGlja0l0ZW06IEV2ZW50RW1pdHRlcjxOb2RlQ2xpY2tFdmVudDxUPj47XG4gICAgZGJsQ2xpY2tJdGVtOiBFdmVudEVtaXR0ZXI8Tm9kZUNsaWNrRXZlbnQ8VD4+O1xuICAgIGZldGNoRGF0YTogRXZlbnRFbWl0dGVyPEZldGNoRXZlbnQ+O1xuICAgIHJlYWRvbmx5IGdyaWRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxHcmlkQ29uZmlnIHwgbnVsbD4obnVsbCk7XG4gICAgZ2V0IGdyaWRDb25maWcoKTogR3JpZENvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRDb25maWckLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgZ3JpZENvbmZpZyh2YWx1ZTogR3JpZENvbmZpZykge1xuICAgICAgICB0aGlzLmdyaWRDb25maWckLm5leHQodmFsdWUpO1xuICAgIH1cbiAgICBwcmltYXJ5SW5zdGFuY2U6IGJvb2xlYW47XG4gICAgc2luZ2xlQ2xpY2tIaW50OiAnZHluYW1pYycgfCAnc3RhdGljJztcbiAgICBkaXNhYmxlSW5maW5pdGVTY3JvbGw6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVpU2VydmljZTogVUlTZXJ2aWNlLCBwcml2YXRlIGVudHJpZXNHbG9iYWw6IE5vZGVFbnRyaWVzR2xvYmFsU2VydmljZSkge31cblxuICAgIG9uQ2xpY2tlZCh7IGV2ZW50LCAuLi5kYXRhIH06IE5vZGVDbGlja0V2ZW50PFQ+ICYgeyBldmVudDogTW91c2VFdmVudCB9KSB7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShkYXRhLmVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZFNlbGVjdGlvblRvKGRhdGEuZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsaWNrSXRlbS5lbWl0KGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGVja2JveENoYW5nZWQobm9kZTogVCwgY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgICBjb25zb2xlLmxvZyhub2RlLCBjaGVja2VkLCB0aGlzLnVpU2VydmljZS5zaGlmdEtleVByZXNzZWQpO1xuICAgICAgICBpZiAodGhpcy51aVNlcnZpY2Uuc2hpZnRLZXlQcmVzc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZFNlbGVjdGlvblRvKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRNb3JlKHNvdXJjZTogJ2J1dHRvbicgfCAnc2Nyb2xsJyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0aW9uU3RyYXRlZ3kgIT09ICdpbmZpbml0ZS1zY3JvbGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gJ3Njcm9sbCcgJiYgdGhpcy5kaXNhYmxlSW5maW5pdGVTY3JvbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBmb2N1cyBuZXh0IGl0ZW0gd2hlbiB0cmlnZ2VyZWQgdmlhIGJ1dHRvbi5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIE5vZGVEYXRhU291cmNlUmVtb3RlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZGF0YVNvdXJjZSBhcyBOb2RlRGF0YVNvdXJjZVJlbW90ZSkubG9hZE1vcmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuaGFzTW9yZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaERhdGEuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5kYXRhU291cmNlLmdldERhdGEoKS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHJlc2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBbGwoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpLmV2ZXJ5KChub2RlKSA9PiB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGFuZFNlbGVjdGlvblRvKG5vZGU6IFQpIHtcbiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gdGhpcy5kYXRhU291cmNlLmdldERhdGEoKS5pbmRleE9mKG5vZGUpO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25JbmRleGVzID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRcbiAgICAgICAgICAgIC5tYXAoKG5vZGUpID0+IHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKCkuaW5kZXhPZihub2RlKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiBpbmRleCA+PSAwKTtcbiAgICAgICAgaWYgKE1hdGgubWluKC4uLnNlbGVjdGlvbkluZGV4ZXMpIDwgbm9kZUluZGV4KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gTWF0aC5taW4oLi4uc2VsZWN0aW9uSW5kZXhlcykgKyAxOyBpIDw9IG5vZGVJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhKClbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKE1hdGgubWF4KC4uLnNlbGVjdGlvbkluZGV4ZXMpID4gbm9kZUluZGV4KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbm9kZUluZGV4OyBpIDwgTWF0aC5tYXgoLi4uc2VsZWN0aW9uSW5kZXhlcyk7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCh0aGlzLmRhdGFTb3VyY2UuZ2V0RGF0YSgpW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,234 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { RestConstants, } from 'ngx-edu-sharing-api';
3
+ import * as Workflow from '../types/workflow';
4
+ import { UIConstants } from '../util/ui-constants';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@ngx-translate/core";
7
+ import * as i2 from "ngx-edu-sharing-api";
8
+ import * as i3 from "./repo-url.service";
9
+ export class NodeHelperService {
10
+ constructor(translate, apiHelpersService, networkService, configService, repoUrlService) {
11
+ this.translate = translate;
12
+ this.apiHelpersService = apiHelpersService;
13
+ this.networkService = networkService;
14
+ this.configService = configService;
15
+ this.repoUrlService = repoUrlService;
16
+ }
17
+ getCollectionScopeInfo(node) {
18
+ const scope = node.collection ? node.collection.scope : null;
19
+ let icon = 'help';
20
+ let scopeName = 'UNKNOWN';
21
+ if (scope === RestConstants.COLLECTIONSCOPE_MY) {
22
+ icon = 'lock';
23
+ scopeName = 'MY';
24
+ }
25
+ if (scope === RestConstants.COLLECTIONSCOPE_ORGA ||
26
+ scope === RestConstants.COLLECTIONSCOPE_CUSTOM) {
27
+ icon = 'group';
28
+ scopeName = 'SHARED';
29
+ }
30
+ if (scope === RestConstants.COLLECTIONSCOPE_ALL ||
31
+ scope === RestConstants.COLLECTIONSCOPE_CUSTOM_PUBLIC) {
32
+ icon = 'language';
33
+ scopeName = 'PUBLIC';
34
+ }
35
+ if (node.collection?.type === RestConstants.COLLECTIONTYPE_EDITORIAL) {
36
+ icon = 'star';
37
+ scopeName = 'TYPE_EDITORIAL';
38
+ }
39
+ if (node.collection?.type === RestConstants.COLLECTIONTYPE_MEDIA_CENTER) {
40
+ icon = 'business';
41
+ scopeName = 'TYPE_MEDIA_CENTER';
42
+ }
43
+ return { icon, scopeName };
44
+ }
45
+ /**
46
+ * Return the license icon of a node
47
+ */
48
+ async getLicenseIcon(node) {
49
+ // prefer manual mapping instead of backend data to support custom states from local edits
50
+ const license = node.properties?.[RestConstants.CCM_PROP_LICENSE]?.[0];
51
+ if (license) {
52
+ return this.getLicenseIconByString(license);
53
+ }
54
+ return node.license ? this.repoUrlService.getRepoUrl(node.license.icon, node) : null;
55
+ }
56
+ /**
57
+ * Get a license icon by using the property value string
58
+ */
59
+ getLicenseIconByString(string, useNoneAsFallback = true) {
60
+ let icon = string.replace(/_/g, '-').toLowerCase();
61
+ if (icon == '')
62
+ icon = 'none';
63
+ const LICENSE_ICONS = [
64
+ 'cc-0',
65
+ 'cc-by-nc',
66
+ 'cc-by-nc-nd',
67
+ 'cc-by-nc-sa',
68
+ 'cc-by-nd',
69
+ 'cc-by-sa',
70
+ 'cc-by',
71
+ 'copyright-free',
72
+ 'copyright-license',
73
+ 'custom',
74
+ 'edu-nc-nd-noDo',
75
+ 'edu-nc-nd',
76
+ 'edu-p-nr-nd-noDo',
77
+ 'edu-p-nr-nd',
78
+ 'none',
79
+ 'pdm',
80
+ 'schulfunk',
81
+ 'unterrichts-und-lehrmedien',
82
+ ];
83
+ if (LICENSE_ICONS.indexOf(icon) == -1 && !useNoneAsFallback)
84
+ return null; // icon='none';
85
+ if (icon == 'none' && !useNoneAsFallback)
86
+ return null;
87
+ const result = this.apiHelpersService.getServerUrl() + '/../ccimages/licenses/' + icon + '.svg';
88
+ return this.repoUrlService.withCurrentOrigin(result);
89
+ }
90
+ /**
91
+ * Return a translated name of a license name for a node
92
+ * @param node
93
+ * @param translate
94
+ * @returns {string|any|string|any|string|any|string|any|string|any|string}
95
+ */
96
+ getLicenseName(node) {
97
+ let prop = node.properties[RestConstants.CCM_PROP_LICENSE]?.[0];
98
+ if (!prop)
99
+ prop = '';
100
+ return this.getLicenseNameByString(prop);
101
+ }
102
+ /**
103
+ * Return a translated name for a license string
104
+ * @param string
105
+ * @param translate
106
+ * @returns {any}
107
+ */
108
+ getLicenseNameByString(name) {
109
+ if (name == '') {
110
+ name = 'NONE';
111
+ }
112
+ return this.translate.instant('LICENSE.NAMES.' + name);
113
+ // return name.replace(/_/g,"-");
114
+ }
115
+ /**
116
+ * return the License URL (e.g. for CC_BY licenses) for a license string and version
117
+ * @param licenseProperty
118
+ * @param licenseVersion
119
+ */
120
+ getLicenseUrlByString(licenseProperty, licenseVersion) {
121
+ const url = RestConstants.LICENSE_URLS[licenseProperty];
122
+ if (!url)
123
+ return null;
124
+ return url.replace('#version', licenseVersion);
125
+ }
126
+ getWorkflowStatusById(id) {
127
+ const workflows = this.getWorkflows();
128
+ return workflows.filter((w) => w.id === id)?.[0];
129
+ }
130
+ getWorkflowStatus(node, useFromConfig = false) {
131
+ let value = node.properties[RestConstants.CCM_PROP_WF_STATUS]?.[0];
132
+ if (!value) {
133
+ return this.getDefaultWorkflowStatus(useFromConfig);
134
+ }
135
+ return {
136
+ current: this.getWorkflowStatusById(value),
137
+ initial: this.getWorkflowStatusById(value),
138
+ };
139
+ }
140
+ getDefaultWorkflowStatus(useFromConfig = false) {
141
+ const result = {
142
+ current: null,
143
+ initial: null,
144
+ };
145
+ result.initial = this.getWorkflows()[0];
146
+ let defaultStatus = null;
147
+ if (useFromConfig) {
148
+ defaultStatus = this.configService.instant('workflow.defaultStatus');
149
+ }
150
+ if (defaultStatus) {
151
+ result.current = this.getWorkflows().find((w) => w.id === defaultStatus);
152
+ }
153
+ else {
154
+ result.current = result.initial;
155
+ }
156
+ return result;
157
+ }
158
+ getWorkflows() {
159
+ return this.configService.instant('workflow.workflows', [
160
+ Workflow.WORKFLOW_STATUS_UNCHECKED,
161
+ Workflow.WORKFLOW_STATUS_TO_CHECK,
162
+ Workflow.WORKFLOW_STATUS_HASFLAWS,
163
+ Workflow.WORKFLOW_STATUS_CHECKED,
164
+ ]);
165
+ }
166
+ copyDataToNode(target, source) {
167
+ target.properties = source.properties;
168
+ target.name = source.name;
169
+ target.title = source.title;
170
+ }
171
+ isNodeCollection(node) {
172
+ return node.aspects?.includes(RestConstants.CCM_ASPECT_COLLECTION) || !!node.collection;
173
+ }
174
+ getSourceIconPath(src) {
175
+ return 'assets/images/sources/' + src.toLowerCase() + '.png';
176
+ }
177
+ getNodeLink(mode, node) {
178
+ if (!node?.ref) {
179
+ return null;
180
+ }
181
+ let data = null;
182
+ if (this.isNodeCollection(node)) {
183
+ data = {
184
+ routerLink: UIConstants.ROUTER_PREFIX + 'collections',
185
+ queryParams: { id: node.ref.id },
186
+ };
187
+ }
188
+ else {
189
+ if (node.isDirectory) {
190
+ let path;
191
+ if (node.properties?.[RestConstants.CCM_PROP_EDUSCOPENAME]?.[0] ===
192
+ RestConstants.SAFE_SCOPE) {
193
+ path = UIConstants.ROUTER_PREFIX + 'workspace/safe';
194
+ }
195
+ else {
196
+ path = UIConstants.ROUTER_PREFIX + 'workspace';
197
+ }
198
+ data = {
199
+ routerLink: path,
200
+ queryParams: { id: node.ref.id },
201
+ };
202
+ }
203
+ else if (node.ref) {
204
+ const fromHome = this.networkService.isFromHomeRepository(node);
205
+ data = {
206
+ routerLink: UIConstants.ROUTER_PREFIX + 'render/' + node.ref.id,
207
+ queryParams: {
208
+ repository: fromHome ? null : node.ref.repo,
209
+ proposal: node.proposal?.ref.id,
210
+ proposalCollection: node.proposalCollection?.ref.id,
211
+ },
212
+ };
213
+ }
214
+ }
215
+ if (data === null) {
216
+ return '';
217
+ }
218
+ if (mode === 'routerLink') {
219
+ return '/' + data.routerLink;
220
+ }
221
+ // enforce clearing of parameters which should only be consumed once
222
+ data.queryParams.redirectFromSSO = null;
223
+ return data.queryParams;
224
+ }
225
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeHelperService, deps: [{ token: i1.TranslateService }, { token: i2.ApiHelpersService }, { token: i2.NetworkService }, { token: i2.ConfigService }, { token: i3.RepoUrlService }], target: i0.ɵɵFactoryTarget.Injectable }); }
226
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeHelperService, providedIn: 'root' }); }
227
+ }
228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: NodeHelperService, decorators: [{
229
+ type: Injectable,
230
+ args: [{
231
+ providedIn: 'root',
232
+ }]
233
+ }], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i2.ApiHelpersService }, { type: i2.NetworkService }, { type: i2.ConfigService }, { type: i3.RepoUrlService }]; } });
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1oZWxwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvc2VydmljZXMvbm9kZS1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFNSCxhQUFhLEdBQ2hCLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7O0FBSW5ELE1BQU0sT0FBTyxpQkFBaUI7SUFDMUIsWUFDYyxTQUEyQixFQUMzQixpQkFBb0MsRUFDcEMsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsY0FBOEI7UUFKOUIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO0lBQ3pDLENBQUM7SUFFRyxzQkFBc0IsQ0FBQyxJQUFVO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDN0QsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMxQixJQUFJLEtBQUssS0FBSyxhQUFhLENBQUMsa0JBQWtCLEVBQUU7WUFDNUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztZQUNkLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDcEI7UUFDRCxJQUNJLEtBQUssS0FBSyxhQUFhLENB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bmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBcGlIZWxwZXJzU2VydmljZSxcbiAgICBDb25maWdTZXJ2aWNlLFxuICAgIE5ldHdvcmtTZXJ2aWNlLFxuICAgIE5vZGUsXG4gICAgUHJvcG9zYWxOb2RlLFxuICAgIFJlc3RDb25zdGFudHMsXG59IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0ICogYXMgV29ya2Zsb3cgZnJvbSAnLi4vdHlwZXMvd29ya2Zsb3cnO1xuaW1wb3J0IHsgUmVwb1VybFNlcnZpY2UgfSBmcm9tICcuL3JlcG8tdXJsLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFVJQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbC91aS1jb25zdGFudHMnO1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUhlbHBlclNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYXBpSGVscGVyc1NlcnZpY2U6IEFwaUhlbHBlcnNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgbmV0d29ya1NlcnZpY2U6IE5ldHdvcmtTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIHJlcG9VcmxTZXJ2aWNlOiBSZXBvVXJsU2VydmljZSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgZ2V0Q29sbGVjdGlvblNjb3BlSW5mbyhub2RlOiBOb2RlKTogeyBpY29uOiBzdHJpbmc7IHNjb3BlTmFtZTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBzY29wZSA9IG5vZGUuY29sbGVjdGlvbiA/IG5vZGUuY29sbGVjdGlvbi5zY29wZSA6IG51bGw7XG4gICAgICAgIGxldCBpY29uID0gJ2hlbHAnO1xuICAgICAgICBsZXQgc2NvcGVOYW1lID0gJ1VOS05PV04nO1xuICAgICAgICBpZiAoc2NvcGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX01ZKSB7XG4gICAgICAgICAgICBpY29uID0gJ2xvY2snO1xuICAgICAgICAgICAgc2NvcGVOYW1lID0gJ01ZJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzY29wZSA9PT0gUmVzdENvbnN0YW50cy5DT0xMRUNUSU9OU0NPUEVfT1JHQSB8fFxuICAgICAgICAgICAgc2NvcGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX0NVU1RPTVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGljb24gPSAnZ3JvdXAnO1xuICAgICAgICAgICAgc2NvcGVOYW1lID0gJ1NIQVJFRCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2NvcGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX0FMTCB8fFxuICAgICAgICAgICAgc2NvcGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlNDT1BFX0NVU1RPTV9QVUJMSUNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpY29uID0gJ2xhbmd1YWdlJztcbiAgICAgICAgICAgIHNjb3BlTmFtZSA9ICdQVUJMSUMnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNvbGxlY3Rpb24/LnR5cGUgPT09IFJlc3RDb25zdGFudHMuQ09MTEVDVElPTlRZUEVfRURJVE9SSUFMKSB7XG4gICAgICAgICAgICBpY29uID0gJ3N0YXInO1xuICAgICAgICAgICAgc2NvcGVOYW1lID0gJ1RZUEVfRURJVE9SSUFMJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jb2xsZWN0aW9uPy50eXBlID09PSBSZXN0Q29uc3RhbnRzLkNPTExFQ1RJT05UWVBFX01FRElBX0NFTlRFUikge1xuICAgICAgICAgICAgaWNvbiA9ICdidXNpbmVzcyc7XG4gICAgICAgICAgICBzY29wZU5hbWUgPSAnVFlQRV9NRURJQV9DRU5URVInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGljb24sIHNjb3BlTmFtZSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGxpY2Vuc2UgaWNvbiBvZiBhIG5vZGVcbiAgICAgKi9cbiAgICBhc3luYyBnZXRMaWNlbnNlSWNvbihub2RlOiBOb2RlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gcHJlZmVyIG1hbnVhbCBtYXBwaW5nIGluc3RlYWQgb2YgYmFja2VuZCBkYXRhIHRvIHN1cHBvcnQgY3VzdG9tIHN0YXRlcyBmcm9tIGxvY2FsIGVkaXRzXG4gICAgICAgIGNvbnN0IGxpY2Vuc2UgPSBub2RlLnByb3BlcnRpZXM/LltSZXN0Q29uc3RhbnRzLkNDTV9QUk9QX0xJQ0VOU0VdPy5bMF07XG4gICAgICAgIGlmIChsaWNlbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMaWNlbnNlSWNvbkJ5U3RyaW5nKGxpY2Vuc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlLmxpY2Vuc2UgPyB0aGlzLnJlcG9VcmxTZXJ2aWNlLmdldFJlcG9Vcmwobm9kZS5saWNlbnNlLmljb24sIG5vZGUpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsaWNlbnNlIGljb24gYnkgdXNpbmcgdGhlIHByb3BlcnR5IHZhbHVlIHN0cmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaWNlbnNlSWNvbkJ5U3RyaW5nKHN0cmluZzogU3RyaW5nLCB1c2VOb25lQXNGYWxsYmFjayA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICBsZXQgaWNvbiA9IHN0cmluZy5yZXBsYWNlKC9fL2csICctJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGljb24gPT0gJycpIGljb24gPSAnbm9uZSc7XG5cbiAgICAgICAgY29uc3QgTElDRU5TRV9JQ09OUyA9IFtcbiAgICAgICAgICAgICdjYy0wJyxcbiAgICAgICAgICAgICdjYy1ieS1uYycsXG4gICAgICAgICAgICAnY2MtYnktbmMtbmQnLFxuICAgICAgICAgICAgJ2NjLWJ5LW5jLXNhJyxcbiAgICAgICAgICAgICdjYy1ieS1uZCcsXG4gICAgICAgICAgICAnY2MtYnktc2EnLFxuICAgICAgICAgICAgJ2NjLWJ5JyxcbiAgICAgICAgICAgICdjb3B5cmlnaHQtZnJlZScsXG4gICAgICAgICAgICAnY29weXJpZ2h0LWxpY2Vuc2UnLFxuICAgICAgICAgICAgJ2N1c3RvbScsXG4gICAgICAgICAgICAnZWR1LW5jLW5kLW5vRG8nLFxuICAgICAgICAgICAgJ2VkdS1uYy1uZCcsXG4gICAgICAgICAgICAnZWR1LXAtbnItbmQtbm9EbycsXG4gICAgICAgICAgICAnZWR1LXAtbnItbmQnLFxuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ3BkbScsXG4gICAgICAgICAgICAnc2NodWxmdW5rJyxcbiAgICAgICAgICAgICd1bnRlcnJpY2h0cy11bmQtbGVocm1lZGllbicsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChMSUNFTlNFX0lDT05TLmluZGV4T2YoaWNvbikgPT0gLTEgJiYgIXVzZU5vbmVBc0ZhbGxiYWNrKSByZXR1cm4gbnVsbDsgLy8gaWNvbj0nbm9uZSc7XG4gICAgICAgIGlmIChpY29uID09ICdub25lJyAmJiAhdXNlTm9uZUFzRmFsbGJhY2spIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgICAgdGhpcy5hcGlIZWxwZXJzU2VydmljZS5nZXRTZXJ2ZXJVcmwoKSArICcvLi4vY2NpbWFnZXMvbGljZW5zZXMvJyArIGljb24gKyAnLnN2Zyc7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcG9VcmxTZXJ2aWNlLndpdGhDdXJyZW50T3JpZ2luKHJlc3VsdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHRyYW5zbGF0ZWQgbmFtZSBvZiBhIGxpY2Vuc2UgbmFtZSBmb3IgYSBub2RlXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKiBAcGFyYW0gdHJhbnNsYXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ3xhbnl8c3RyaW5nfGFueXxzdHJpbmd8YW55fHN0cmluZ3xhbnl8c3RyaW5nfGFueXxzdHJpbmd9XG4gICAgICovXG4gICAgcHVibGljIGdldExpY2Vuc2VOYW1lKG5vZGU6IE5vZGUpIHtcbiAgICAgICAgbGV0IHByb3AgPSBub2RlLnByb3BlcnRpZXNbUmVzdENvbnN0YW50cy5DQ01fUFJPUF9MSUNFTlNFXT8uWzBdO1xuICAgICAgICBpZiAoIXByb3ApIHByb3AgPSAnJztcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGljZW5zZU5hbWVCeVN0cmluZyhwcm9wKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB0cmFuc2xhdGVkIG5hbWUgZm9yIGEgbGljZW5zZSBzdHJpbmdcbiAgICAgKiBAcGFyYW0gc3RyaW5nXG4gICAgICogQHBhcmFtIHRyYW5zbGF0ZVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgcHVibGljIGdldExpY2Vuc2VOYW1lQnlTdHJpbmcobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09ICcnKSB7XG4gICAgICAgICAgICBuYW1lID0gJ05PTkUnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdMSUNFTlNFLk5BTUVTLicgKyBuYW1lKTtcbiAgICAgICAgLy8gcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLFwiLVwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIExpY2Vuc2UgVVJMIChlLmcuIGZvciBDQ19CWSBsaWNlbnNlcykgZm9yIGEgbGljZW5zZSBzdHJpbmcgYW5kIHZlcnNpb25cbiAgICAgKiBAcGFyYW0gbGljZW5zZVByb3BlcnR5XG4gICAgICogQHBhcmFtIGxpY2Vuc2VWZXJzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldExpY2Vuc2VVcmxCeVN0cmluZyhsaWNlbnNlUHJvcGVydHk6IHN0cmluZywgbGljZW5zZVZlcnNpb246IHN0cmluZykge1xuICAgICAgICBjb25zdCB1cmwgPSAoUmVzdENvbnN0YW50cy5MSUNFTlNFX1VSTFMgYXMgYW55KVtsaWNlbnNlUHJvcGVydHldO1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB1cmwucmVwbGFjZSgnI3ZlcnNpb24nLCBsaWNlbnNlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFdvcmtmbG93U3RhdHVzQnlJZChpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93cyA9IHRoaXMuZ2V0V29ya2Zsb3dzKCk7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd3MuZmlsdGVyKCh3KSA9PiB3LmlkID09PSBpZCk/LlswXTtcbiAgICB9XG4gICAgcHVibGljIGdldFdvcmtmbG93U3RhdHVzKG5vZGU6IE5vZGUsIHVzZUZyb21Db25maWcgPSBmYWxzZSk6IFdvcmtmbG93LldvcmtmbG93RGVmaW5pdGlvblN0YXR1cyB7XG4gICAgICAgIGxldCB2YWx1ZSA9IG5vZGUucHJvcGVydGllc1tSZXN0Q29uc3RhbnRzLkNDTV9QUk9QX1dGX1NUQVRVU10/LlswXTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFdvcmtmbG93U3RhdHVzKHVzZUZyb21Db25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJyZW50OiB0aGlzLmdldFdvcmtmbG93U3RhdHVzQnlJZCh2YWx1ZSksXG4gICAgICAgICAgICBpbml0aWFsOiB0aGlzLmdldFdvcmtmbG93U3RhdHVzQnlJZCh2YWx1ZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldERlZmF1bHRXb3JrZmxvd1N0YXR1cyh1c2VGcm9tQ29uZmlnID0gZmFsc2UpOiBXb3JrZmxvdy5Xb3JrZmxvd0RlZmluaXRpb25TdGF0dXMge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBjdXJyZW50OiBudWxsIGFzIFdvcmtmbG93LldvcmtmbG93RGVmaW5pdGlvbixcbiAgICAgICAgICAgIGluaXRpYWw6IG51bGwgYXMgV29ya2Zsb3cuV29ya2Zsb3dEZWZpbml0aW9uLFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHQuaW5pdGlhbCA9IHRoaXMuZ2V0V29ya2Zsb3dzKClbMF07XG4gICAgICAgIGxldCBkZWZhdWx0U3RhdHVzOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICBpZiAodXNlRnJvbUNvbmZpZykge1xuICAgICAgICAgICAgZGVmYXVsdFN0YXR1cyA9IHRoaXMuY29uZmlnU2VydmljZS5pbnN0YW50KCd3b3JrZmxvdy5kZWZhdWx0U3RhdHVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRTdGF0dXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jdXJyZW50ID0gdGhpcy5nZXRXb3JrZmxvd3MoKS5maW5kKCh3KSA9PiB3LmlkID09PSBkZWZhdWx0U3RhdHVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5jdXJyZW50ID0gcmVzdWx0LmluaXRpYWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0V29ya2Zsb3dzKCk6IFdvcmtmbG93LldvcmtmbG93RGVmaW5pdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnU2VydmljZS5pbnN0YW50KCd3b3JrZmxvdy53b3JrZmxvd3MnLCBbXG4gICAgICAgICAgICBXb3JrZmxvdy5XT1JLRkxPV19TVEFUVVNfVU5DSEVDS0VELFxuICAgICAgICAgICAgV29ya2Zsb3cuV09SS0ZMT1dfU1RBVFVTX1RPX0NIRUNLLFxuICAgICAgICAgICAgV29ya2Zsb3cuV09SS0ZMT1dfU1RBVFVTX0hBU0ZMQVdTLFxuICAgICAgICAgICAgV29ya2Zsb3cuV09SS0ZMT1dfU1RBVFVTX0NIRUNLRUQsXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjb3B5RGF0YVRvTm9kZTxUIGV4dGVuZHMgTm9kZT4odGFyZ2V0OiBULCBzb3VyY2U6IFQpIHtcbiAgICAgICAgdGFyZ2V0LnByb3BlcnRpZXMgPSBzb3VyY2UucHJvcGVydGllcztcbiAgICAgICAgdGFyZ2V0Lm5hbWUgPSBzb3VyY2UubmFtZTtcbiAgICAgICAgdGFyZ2V0LnRpdGxlID0gc291cmNlLnRpdGxlO1xuICAgIH1cbiAgICBpc05vZGVDb2xsZWN0aW9uKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuYXNwZWN0cz8uaW5jbHVkZXMoUmVzdENvbnN0YW50cy5DQ01fQVNQRUNUX0NPTExFQ1RJT04pIHx8ICEhbm9kZS5jb2xsZWN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0U291cmNlSWNvblBhdGgoc3JjOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdhc3NldHMvaW1hZ2VzL3NvdXJjZXMvJyArIHNyYy50b0xvd2VyQ2FzZSgpICsgJy5wbmcnO1xuICAgIH1cblxuICAgIGdldE5vZGVMaW5rKG1vZGU6ICdyb3V0ZXJMaW5rJyB8ICdxdWVyeVBhcmFtcycsIG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlPy5yZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRhOiB7IHJvdXRlckxpbms6IHN0cmluZzsgcXVlcnlQYXJhbXM6IFBhcmFtcyB9ID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNOb2RlQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICByb3V0ZXJMaW5rOiBVSUNvbnN0YW50cy5ST1VURVJfUFJFRklYICsgJ2NvbGxlY3Rpb25zJyxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBpZDogbm9kZS5yZWYuaWQgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5wcm9wZXJ0aWVzPy5bUmVzdENvbnN0YW50cy5DQ01fUFJPUF9FRFVTQ09QRU5BTUVdPy5bMF0gPT09XG4gICAgICAgICAgICAgICAgICAgIFJlc3RDb25zdGFudHMuU0FGRV9TQ09QRVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gVUlDb25zdGFudHMuUk9VVEVSX1BSRUZJWCArICd3b3Jrc3BhY2Uvc2FmZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFVJQ29uc3RhbnRzLlJPVVRFUl9QUkVGSVggKyAnd29ya3NwYWNlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVyTGluazogcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgaWQ6IG5vZGUucmVmLmlkIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5yZWYpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tSG9tZSA9IHRoaXMubmV0d29ya1NlcnZpY2UuaXNGcm9tSG9tZVJlcG9zaXRvcnkobm9kZSk7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVyTGluazogVUlDb25zdGFudHMuUk9VVEVSX1BSRUZJWCArICdyZW5kZXIvJyArIG5vZGUucmVmLmlkLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeTogZnJvbUhvbWUgPyBudWxsIDogbm9kZS5yZWYucmVwbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3Bvc2FsOiAobm9kZSBhcyBQcm9wb3NhbE5vZGUpLnByb3Bvc2FsPy5yZWYuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbENvbGxlY3Rpb246IChub2RlIGFzIFByb3Bvc2FsTm9kZSkucHJvcG9zYWxDb2xsZWN0aW9uPy5yZWYuaWQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlID09PSAncm91dGVyTGluaycpIHtcbiAgICAgICAgICAgIHJldHVybiAnLycgKyBkYXRhLnJvdXRlckxpbms7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZW5mb3JjZSBjbGVhcmluZyBvZiBwYXJhbWV0ZXJzIHdoaWNoIHNob3VsZCBvbmx5IGJlIGNvbnN1bWVkIG9uY2VcbiAgICAgICAgZGF0YS5xdWVyeVBhcmFtcy5yZWRpcmVjdEZyb21TU08gPSBudWxsO1xuICAgICAgICByZXR1cm4gZGF0YS5xdWVyeVBhcmFtcztcbiAgICB9XG59XG4iXX0=