@rws-framework/client 2.13.1 → 2.13.3

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 (288) hide show
  1. package/.bin/add-v.sh +9 -9
  2. package/.bin/emerge.sh +15 -15
  3. package/.emerge-fast.yaml +46 -46
  4. package/.emerge-typescript-template.yaml +23 -23
  5. package/.emerge-vis-output/fast-element/emerge-file_result_dependency_graph.graphml +693 -693
  6. package/.emerge-vis-output/fast-element/emerge-filesystem_graph.graphml +705 -705
  7. package/.emerge-vis-output/fast-element/emerge-statistics-metrics.txt +440 -440
  8. package/.emerge-vis-output/fast-element/html/emerge.html +500 -500
  9. package/.emerge-vis-output/fast-element/html/jsconfig.json +8 -8
  10. package/.emerge-vis-output/fast-element/html/resources/css/custom.css +211 -211
  11. package/.emerge-vis-output/fast-element/html/resources/js/emerge_common.js +44 -44
  12. package/.emerge-vis-output/fast-element/html/resources/js/emerge_data.js +13 -13
  13. package/.emerge-vis-output/fast-element/html/resources/js/emerge_git.js +1413 -1413
  14. package/.emerge-vis-output/fast-element/html/resources/js/emerge_graph.js +539 -539
  15. package/.emerge-vis-output/fast-element/html/resources/js/emerge_heatmap.js +219 -219
  16. package/.emerge-vis-output/fast-element/html/resources/js/emerge_hull.js +179 -179
  17. package/.emerge-vis-output/fast-element/html/resources/js/emerge_main.js +1002 -1002
  18. package/.emerge-vis-output/fast-element/html/resources/js/emerge_search.js +71 -71
  19. package/.emerge-vis-output/fast-element/html/resources/js/emerge_ui.js +199 -199
  20. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-grid.css +4123 -4123
  21. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-grid.min.css +6 -6
  22. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-grid.rtl.css +4122 -4122
  23. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-grid.rtl.min.css +6 -6
  24. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-reboot.css +487 -487
  25. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-reboot.min.css +6 -6
  26. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-reboot.rtl.css +484 -484
  27. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-reboot.rtl.min.css +6 -6
  28. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-utilities.css +4265 -4265
  29. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-utilities.min.css +6 -6
  30. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-utilities.rtl.css +4256 -4256
  31. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap-utilities.rtl.min.css +6 -6
  32. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap.css +10877 -10877
  33. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap.min.css +6 -6
  34. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap.rtl.css +10841 -10841
  35. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/css/bootstrap.rtl.min.css +6 -6
  36. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/js/bootstrap.bundle.js +7075 -7075
  37. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/js/bootstrap.bundle.min.js +6 -6
  38. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/js/bootstrap.esm.js +5202 -5202
  39. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/js/bootstrap.esm.min.js +6 -6
  40. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/js/bootstrap.js +5249 -5249
  41. package/.emerge-vis-output/fast-element/html/vendors/bootstrap/js/bootstrap.min.js +6 -6
  42. package/.emerge-vis-output/fast-element/html/vendors/d3/d3.v7.8.4.min.js +2 -2
  43. package/.emerge-vis-output/fast-element/html/vendors/d3/d3.v7.min.js +2 -2
  44. package/.emerge-vis-output/fast-element/html/vendors/dark-mode-switch/css/dark-mode.css +148 -148
  45. package/.emerge-vis-output/fast-element/html/vendors/daterangepicker/daterangepicker.min.js +7 -7
  46. package/.emerge-vis-output/fast-element/html/vendors/daterangepicker/moment.min.js +6 -6
  47. package/.emerge-vis-output/fast-element/html/vendors/hull/hull.js +373 -373
  48. package/.emerge-vis-output/fast-element/html/vendors/jquery/jquery-3.6.0.min.js +2 -2
  49. package/.emerge-vis-output/fast-element/html/vendors/popper/popper.min.js +6 -6
  50. package/.emerge-vis-output/fast-element/html/vendors/simpleheat/simpleheat.js +141 -141
  51. package/.emerge-vis-output/fast-foundation/emerge-file_result_dependency_graph.graphml +4043 -4043
  52. package/.emerge-vis-output/fast-foundation/emerge-filesystem_graph.graphml +4538 -4538
  53. package/.emerge-vis-output/fast-foundation/emerge-statistics-metrics.txt +2510 -2510
  54. package/.emerge-vis-output/fast-foundation/html/emerge.html +500 -500
  55. package/.emerge-vis-output/fast-foundation/html/jsconfig.json +8 -8
  56. package/.emerge-vis-output/fast-foundation/html/resources/css/custom.css +211 -211
  57. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_common.js +44 -44
  58. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_data.js +13 -13
  59. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_git.js +1413 -1413
  60. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_graph.js +539 -539
  61. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_heatmap.js +219 -219
  62. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_hull.js +179 -179
  63. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_main.js +1002 -1002
  64. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_search.js +71 -71
  65. package/.emerge-vis-output/fast-foundation/html/resources/js/emerge_ui.js +199 -199
  66. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-grid.css +4123 -4123
  67. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-grid.min.css +6 -6
  68. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-grid.rtl.css +4122 -4122
  69. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-grid.rtl.min.css +6 -6
  70. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-reboot.css +487 -487
  71. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-reboot.min.css +6 -6
  72. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-reboot.rtl.css +484 -484
  73. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-reboot.rtl.min.css +6 -6
  74. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-utilities.css +4265 -4265
  75. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-utilities.min.css +6 -6
  76. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-utilities.rtl.css +4256 -4256
  77. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap-utilities.rtl.min.css +6 -6
  78. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap.css +10877 -10877
  79. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap.min.css +6 -6
  80. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap.rtl.css +10841 -10841
  81. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/css/bootstrap.rtl.min.css +6 -6
  82. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/js/bootstrap.bundle.js +7075 -7075
  83. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/js/bootstrap.bundle.min.js +6 -6
  84. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/js/bootstrap.esm.js +5202 -5202
  85. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/js/bootstrap.esm.min.js +6 -6
  86. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/js/bootstrap.js +5249 -5249
  87. package/.emerge-vis-output/fast-foundation/html/vendors/bootstrap/js/bootstrap.min.js +6 -6
  88. package/.emerge-vis-output/fast-foundation/html/vendors/d3/d3.v7.8.4.min.js +2 -2
  89. package/.emerge-vis-output/fast-foundation/html/vendors/d3/d3.v7.min.js +2 -2
  90. package/.emerge-vis-output/fast-foundation/html/vendors/dark-mode-switch/css/dark-mode.css +148 -148
  91. package/.emerge-vis-output/fast-foundation/html/vendors/daterangepicker/daterangepicker.min.js +7 -7
  92. package/.emerge-vis-output/fast-foundation/html/vendors/daterangepicker/moment.min.js +6 -6
  93. package/.emerge-vis-output/fast-foundation/html/vendors/hull/hull.js +373 -373
  94. package/.emerge-vis-output/fast-foundation/html/vendors/jquery/jquery-3.6.0.min.js +2 -2
  95. package/.emerge-vis-output/fast-foundation/html/vendors/popper/popper.min.js +6 -6
  96. package/.emerge-vis-output/fast-foundation/html/vendors/simpleheat/simpleheat.js +141 -141
  97. package/.emerge-vis-output/rws-client/emerge-file_result_dependency_graph.graphml +1143 -1143
  98. package/.emerge-vis-output/rws-client/emerge-filesystem_graph.graphml +1003 -1003
  99. package/.emerge-vis-output/rws-client/emerge-statistics-metrics.txt +655 -655
  100. package/.emerge-vis-output/rws-client/html/emerge.html +500 -500
  101. package/.emerge-vis-output/rws-client/html/jsconfig.json +8 -8
  102. package/.emerge-vis-output/rws-client/html/resources/css/custom.css +211 -211
  103. package/.emerge-vis-output/rws-client/html/resources/js/emerge_common.js +44 -44
  104. package/.emerge-vis-output/rws-client/html/resources/js/emerge_data.js +13 -13
  105. package/.emerge-vis-output/rws-client/html/resources/js/emerge_git.js +1413 -1413
  106. package/.emerge-vis-output/rws-client/html/resources/js/emerge_graph.js +539 -539
  107. package/.emerge-vis-output/rws-client/html/resources/js/emerge_heatmap.js +219 -219
  108. package/.emerge-vis-output/rws-client/html/resources/js/emerge_hull.js +179 -179
  109. package/.emerge-vis-output/rws-client/html/resources/js/emerge_main.js +1002 -1002
  110. package/.emerge-vis-output/rws-client/html/resources/js/emerge_search.js +71 -71
  111. package/.emerge-vis-output/rws-client/html/resources/js/emerge_ui.js +199 -199
  112. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-grid.css +4123 -4123
  113. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-grid.min.css +6 -6
  114. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-grid.rtl.css +4122 -4122
  115. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-grid.rtl.min.css +6 -6
  116. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-reboot.css +487 -487
  117. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-reboot.min.css +6 -6
  118. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-reboot.rtl.css +484 -484
  119. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-reboot.rtl.min.css +6 -6
  120. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-utilities.css +4265 -4265
  121. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-utilities.min.css +6 -6
  122. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-utilities.rtl.css +4256 -4256
  123. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap-utilities.rtl.min.css +6 -6
  124. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap.css +10877 -10877
  125. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap.min.css +6 -6
  126. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap.rtl.css +10841 -10841
  127. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/css/bootstrap.rtl.min.css +6 -6
  128. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/js/bootstrap.bundle.js +7075 -7075
  129. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/js/bootstrap.bundle.min.js +6 -6
  130. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/js/bootstrap.esm.js +5202 -5202
  131. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/js/bootstrap.esm.min.js +6 -6
  132. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/js/bootstrap.js +5249 -5249
  133. package/.emerge-vis-output/rws-client/html/vendors/bootstrap/js/bootstrap.min.js +6 -6
  134. package/.emerge-vis-output/rws-client/html/vendors/d3/d3.v7.8.4.min.js +2 -2
  135. package/.emerge-vis-output/rws-client/html/vendors/d3/d3.v7.min.js +2 -2
  136. package/.emerge-vis-output/rws-client/html/vendors/dark-mode-switch/css/dark-mode.css +148 -148
  137. package/.emerge-vis-output/rws-client/html/vendors/daterangepicker/daterangepicker.min.js +7 -7
  138. package/.emerge-vis-output/rws-client/html/vendors/daterangepicker/moment.min.js +6 -6
  139. package/.emerge-vis-output/rws-client/html/vendors/hull/hull.js +373 -373
  140. package/.emerge-vis-output/rws-client/html/vendors/jquery/jquery-3.6.0.min.js +2 -2
  141. package/.emerge-vis-output/rws-client/html/vendors/popper/popper.min.js +6 -6
  142. package/.emerge-vis-output/rws-client/html/vendors/simpleheat/simpleheat.js +141 -141
  143. package/.eslintrc.json +51 -51
  144. package/.gitmodules +2 -2
  145. package/.setup/.eslintrc.json +11 -11
  146. package/.setup/_base.eslintrc.json +48 -48
  147. package/.setup/tsconfig.json +28 -28
  148. package/PLUGINS.MD +188 -188
  149. package/README.md +1023 -1023
  150. package/_tools.js +396 -396
  151. package/builder/vite/index.ts +4 -4
  152. package/{cfg/build_steps → builder}/vite/loaders/html.ts +11 -11
  153. package/{cfg/build_steps → builder}/vite/loaders/index.ts +8 -8
  154. package/{cfg/build_steps → builder}/vite/loaders/loader.type.ts +27 -27
  155. package/{cfg/build_steps → builder}/vite/loaders/scss.ts +32 -32
  156. package/{cfg/build_steps → builder}/vite/loaders/ts.ts +309 -312
  157. package/builder/vite/rws.vite.config.ts +56 -49
  158. package/{cfg/build_steps → builder}/vite/rws_scss_plugin.ts +61 -60
  159. package/{cfg/build_steps → builder}/vite/scss/_compiler.ts +95 -94
  160. package/{cfg/build_steps → builder}/vite/scss/_fonts.ts +80 -80
  161. package/{cfg/build_steps → builder}/vite/scss/_fs.ts +83 -81
  162. package/{cfg/build_steps → builder}/vite/scss/_import.ts +191 -184
  163. package/builder/webpack/after/copy.js +78 -78
  164. package/builder/webpack/after/sw.js +13 -13
  165. package/builder/webpack/index.js +10 -10
  166. package/builder/webpack/loaders/rws_fast_html_loader.js +17 -17
  167. package/builder/webpack/loaders/rws_fast_scss_loader.js +43 -43
  168. package/builder/webpack/loaders/rws_fast_ts_loader.js +96 -96
  169. package/builder/webpack/loaders/ts/html_error.js +19 -19
  170. package/builder/webpack/rws.webpack.config.js +169 -169
  171. package/builder/webpack/rws_scss_plugin.js +62 -62
  172. package/builder/webpack/rws_webpack_plugin.js +137 -137
  173. package/builder/webpack/scss/_compiler.js +97 -97
  174. package/builder/webpack/scss/_fonts.js +80 -80
  175. package/builder/webpack/scss/_fs.js +84 -84
  176. package/builder/webpack/scss/_import.js +186 -186
  177. package/cfg/_default.cfg.js +26 -26
  178. package/cfg/_storage.d.ts +22 -22
  179. package/cfg/_storage.js +42 -42
  180. package/cfg/build_steps/vite/_build_config.ts +105 -105
  181. package/cfg/build_steps/vite/_env_defines.ts +17 -17
  182. package/cfg/build_steps/vite/_loaders.ts +187 -184
  183. package/cfg/build_steps/vite/index.ts +2 -2
  184. package/cfg/build_steps/vite/types.ts +7 -7
  185. package/cfg/build_steps/webpack/_actions.js +85 -85
  186. package/cfg/build_steps/webpack/_aliases.js +9 -9
  187. package/cfg/build_steps/webpack/_build_config.js +76 -76
  188. package/cfg/build_steps/webpack/_cache.js +98 -98
  189. package/cfg/build_steps/webpack/_component_handling.js +60 -60
  190. package/cfg/build_steps/webpack/_dev_servers.js +14 -14
  191. package/cfg/build_steps/webpack/_env_defines.js +18 -18
  192. package/cfg/build_steps/webpack/_info.js +18 -18
  193. package/cfg/build_steps/webpack/_loaders.js +223 -223
  194. package/cfg/build_steps/webpack/_plugins.js +102 -102
  195. package/cfg/build_steps/webpack/_production.js +37 -37
  196. package/cfg/build_steps/webpack/_rws_externals.js +68 -68
  197. package/cfg/build_steps/webpack/_timing.js +52 -52
  198. package/cfg/build_steps/webpack/_webpack_config.js +58 -58
  199. package/cfg/tsconfigSetup.js +150 -150
  200. package/console.js +86 -86
  201. package/docs/assets/26e93147f10415a0ed4a.svg +6 -6
  202. package/docs/assets/75c9471662e97ee24f29.svg +7 -7
  203. package/docs/assets/db90e4df2373980c497d.svg +9 -9
  204. package/docs/assets/highlight.css +127 -127
  205. package/docs/assets/main.js +59 -59
  206. package/docs/assets/style.css +1414 -1414
  207. package/docs/classes/ApiServiceInstance.html +25 -25
  208. package/docs/classes/ConfigServiceInstance.html +21 -21
  209. package/docs/classes/DOMServiceInstance.html +17 -17
  210. package/docs/classes/NotifyServiceInstance.html +15 -15
  211. package/docs/classes/RWSClientInstance.html +45 -45
  212. package/docs/classes/RWSPlugin.html +13 -13
  213. package/docs/classes/RWSService.html +10 -10
  214. package/docs/classes/RWSViewComponent.html +1022 -1022
  215. package/docs/classes/ServiceWorkerServiceInstance.html +13 -13
  216. package/docs/classes/UtilsServiceInstance.html +13 -13
  217. package/docs/functions/attr.html +5 -5
  218. package/docs/functions/observable.html +3 -3
  219. package/docs/index.html +179 -179
  220. package/docs/interfaces/HTMLTag.html +3 -3
  221. package/docs/interfaces/IRWSConfig.html +20 -20
  222. package/docs/interfaces/IRWSDecoratorOptions.html +5 -5
  223. package/docs/interfaces/IRWSHttpRoute.html +2 -2
  224. package/docs/interfaces/IRWSPrefixedHTTProutes.html +2 -2
  225. package/docs/interfaces/IRWSUser.html +5 -5
  226. package/docs/modules.html +45 -45
  227. package/foundation/index.js +1 -1
  228. package/foundation/rws-foundation.d.ts +7 -7
  229. package/foundation/rws-foundation.js +7 -7
  230. package/package.json +108 -108
  231. package/service_worker/src/_service_worker.ts +83 -83
  232. package/service_worker/tsconfig.json +20 -20
  233. package/service_worker/webpack.config.js +66 -66
  234. package/src/client/components.ts +67 -67
  235. package/src/client/config.ts +165 -165
  236. package/src/client/services.ts +27 -27
  237. package/src/client.ts +212 -212
  238. package/src/components/_attrs/_default_observable_accessor.ts +8 -8
  239. package/src/components/_attrs/_extended_accessor.ts +40 -40
  240. package/src/components/_attrs/_external_handler.ts +7 -7
  241. package/src/components/_attrs/_external_observable_accessor.ts +8 -8
  242. package/src/components/_attrs/angular-attr.ts +34 -34
  243. package/src/components/_attrs/external-attr.ts +59 -59
  244. package/src/components/_attrs/external-observable.ts +52 -52
  245. package/src/components/_attrs/sanitize-html.ts +80 -80
  246. package/src/components/_component.ts +245 -245
  247. package/src/components/_container.ts +15 -15
  248. package/src/components/_decorator.ts +122 -122
  249. package/src/components/_decorators/RWSFillBuild.ts +54 -54
  250. package/src/components/_decorators/RWSInject.ts +49 -49
  251. package/src/components/_decorators/RWSService.ts +11 -11
  252. package/src/components/_decorators/_di.ts +15 -15
  253. package/src/components/_definitions.ts +64 -64
  254. package/src/components/_event_handling.ts +40 -40
  255. package/src/components/index.ts +14 -14
  256. package/src/components/loader/component.ts +12 -12
  257. package/src/components/loader/styles/layout.scss +13 -13
  258. package/src/components/progress/component.ts +54 -54
  259. package/src/components/progress/styles/layout.scss +90 -90
  260. package/src/components/progress/template.html +24 -24
  261. package/src/components/uploader/component.ts +83 -83
  262. package/src/components/uploader/styles/layout.scss +130 -130
  263. package/src/components/uploader/template.html +16 -16
  264. package/src/index.ts +93 -93
  265. package/src/plugins/_builder.js +31 -31
  266. package/src/plugins/_plugin.ts +63 -63
  267. package/src/services/ApiService.ts +242 -242
  268. package/src/services/ConfigService.ts +134 -134
  269. package/src/services/DOMService.ts +100 -100
  270. package/src/services/NotifyService.ts +47 -47
  271. package/src/services/ServiceWorkerService.ts +60 -60
  272. package/src/services/UtilsService.ts +60 -60
  273. package/src/services/_service.ts +64 -64
  274. package/src/styles/_darkreader.scss +30 -30
  275. package/src/styles/_grid.scss +75 -75
  276. package/src/styles/_misc.scss +8 -8
  277. package/src/styles/_scrollbars.scss +40 -40
  278. package/src/styles/includes.scss +4 -4
  279. package/src/types/IRWSConfig.ts +30 -30
  280. package/src/types/IRWSPlugin.ts +18 -18
  281. package/src/types/IRWSUser.ts +6 -6
  282. package/src/types/IRWSViewComponent.ts +36 -36
  283. package/src/types/RWSNotify.ts +6 -6
  284. package/src/types/RWSWindow.ts +41 -41
  285. package/tsconfig.json +30 -30
  286. package/typedoc.json +13 -13
  287. package/types/declarations.d.ts +8 -8
  288. package/types/docs-typings.d.ts +15 -15
@@ -1,539 +1,539 @@
1
- /**
2
- * * MARK: - Drawing on canvas
3
- */
4
- function drawEdges(context) {
5
- currentGraph.links.forEach(function(d) {
6
-
7
- context.beginPath();
8
- context.moveTo(d.source.x, d.source.y);
9
- context.lineTo(d.target.x, d.target.y);
10
-
11
- if (closeNode == null) { // not hovering over any node
12
- if (isSearching == false) { // not searching
13
- context.fillStyle = context.strokeStyle = nodeSourceColor = nodeColorByModularity(d.source, 0.7)
14
-
15
- } else { // node search is active
16
-
17
- if (addSemanticSearch == true) {
18
-
19
- // the edge is between two nodes that are included in the search OR the edge is between two nodes that includes the search in one of their semantic keywords
20
- if ( edgeBetweenSearchTerms(d.source, d.target) || searchTermsIncludedInNodeTags(d.source, d.target) )
21
- {
22
- context.strokeStyle = currentActiveEdgeColor
23
- context.fillStyle = currentActiveEdgeColor
24
- } else { // the edge is not connected to a node which is included in the search
25
- context.fillStyle = context.strokeStyle = currentPassiveEdgeColor
26
- }
27
-
28
-
29
- } else { // normal search without semantic
30
- // the edge is between two nodes that are included in the search
31
- if (edgeBetweenSearchTerms(d.source, d.target))
32
- {
33
- context.strokeStyle = currentActiveEdgeColor
34
- context.fillStyle = currentActiveEdgeColor
35
- } else { // the edge is not connected to a node which is included in the search
36
- context.fillStyle = context.strokeStyle = currentPassiveEdgeColor
37
- }
38
- }
39
-
40
- if (addContributorSearch == true ) {
41
- // the edge is between two nodes that are included in the search OR the edge is between two nodes that includes the search in one of their semantic keywords
42
- if ( searchTermsIncludedInNodeContributors(d.source, d.target) )
43
- {
44
- context.strokeStyle = currentActiveEdgeColor
45
- context.fillStyle = currentActiveEdgeColor
46
- }
47
- }
48
-
49
- }
50
-
51
- } else {
52
- if ((d.target.id == closeNode.id) || (d.source.id == closeNode.id)) { // there is an edge that contains our hovered node
53
- context.strokeStyle = currentActiveEdgeColor
54
- context.fillStyle = currentActiveEdgeColor
55
-
56
- } else { // node is not included in the edge
57
- context.fillStyle = context.strokeStyle = nodeColorByModularity(d.source, 0.2)
58
- }
59
- }
60
-
61
- // highlight edge if the corresponding nodes are selected
62
- if (d.source.id.toLowerCase() in selectedNodesMap && d.target.id.toLowerCase() in selectedNodesMap) {
63
- context.strokeStyle = activeSelectionColor
64
- context.fillStyle = currentActiveEdgeColor
65
- context.lineWidth = 2.0;
66
- } else {
67
- if (fadeUnselectedNodes == true || normalHeatmapIsActive() || churnHeatmapIsActive() || hotspotHeatmapIsActive()) { // also fade away non-relevant egdes
68
- context.fillStyle = context.strokeStyle = nodeColorByModularity(d.source, unselectedNodesOpacity)
69
- }
70
- context.lineWidth = 1.0;
71
- }
72
-
73
- context.stroke();
74
-
75
- if (closeNode != null && ((d.target.id == closeNode.id) || (d.source.id == closeNode.id))) { // draw an arrow if there is an edge that contains our hovered node
76
- drawArrowhead(context, d.source, d.target, 5)
77
-
78
- } else if (isSearching && ( (searchTermIncludedInNode(d.target) ) && ( searchTermIncludedInNode(d.source)) )) { // draw an arrow if searching is enabled and there's an egde between searched nodes
79
- drawArrowhead(context, d.source, d.target, 5)
80
- }
81
-
82
- else if (d.source.id.toLowerCase() in selectedNodesMap && d.target.id.toLowerCase() in selectedNodesMap) {
83
- drawArrowhead(context, d.source, d.target, 5)
84
- }
85
-
86
- });
87
- }
88
-
89
- function drawNodes(context) {
90
- currentGraph.nodes.forEach(function(d, i) {
91
-
92
- context.beginPath();
93
-
94
- //render outer circle if node was selected
95
- if (d.id.toLowerCase() in selectedNodesMap) {
96
-
97
- context.arc(d.x, d.y, d.radius + 2.0, 0, TWO_TIMES_PI);
98
- context.fillStyle = '#FF0000' //activeSelectionColor
99
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
100
- context.fill();
101
- }
102
-
103
- context.arc(d.x, d.y, d.radius, 0, TWO_TIMES_PI, true);
104
-
105
- if (fadeUnselectedNodes == true || normalHeatmapIsActive() || churnHeatmapIsActive() || hotspotHeatmapIsActive()) {
106
- context.strokeStyle = nodeStrokeStyle
107
- context.fillStyle = hexToRGB(nodeStrokeStyle, unselectedNodesOpacity)
108
- context.stroke();
109
-
110
- if (nodeLabelsEnabled) {
111
- context.fillStyle = currentPassiveNodeLabelColor;
112
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
113
- context.fillStyle = nodeColorByModularity(d, unselectedNodesOpacity)
114
- }
115
-
116
- } else {
117
-
118
- if (closeNode == null) { // not hovering over any node
119
- if (isSearching == false) {
120
-
121
- context.fillStyle = nodeColorByModularity(d)
122
- context.strokeStyle = nodeStrokeStyle;
123
- context.stroke();
124
-
125
- if (nodeLabelsEnabled) {
126
- context.fillStyle = currentActiveNodeLabelColor;
127
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
128
- context.fillStyle = nodeColorByModularity(d)
129
- }
130
-
131
- } else { // searching for nodes
132
-
133
- // normal (non-semantic) search
134
- if ( addSemanticSearch == false && normalSearch(d)) {
135
-
136
- context.fillStyle = nodeColorByModularity(d)
137
- context.strokeStyle = nodeStrokeStyle;
138
- context.stroke();
139
-
140
- context.fillStyle = currentActiveNodeLabelColor;
141
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
142
- context.fillStyle = nodeColorByModularity(d)
143
-
144
- searchResults += 1
145
-
146
- } else if ( addSemanticSearch == true && (searchTermIncludedInNode(d) || searchTermIncludedInNodeTags(d)) )
147
- // add semantic search
148
- // the node is included in the current search OR if the search in included in one of the node's semantic tags
149
- // draw a highlight circle behind the found node due to semantic search
150
- {
151
- if ( searchTermIncludedInNodeTags(d) )
152
- {
153
- context.fillStyle = currentActiveNodeLabelColor;
154
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
155
-
156
- drawNodeHighlight(d, nodeColorByModularity(d, 1.0))
157
- context.strokeStyle = nodeStrokeStyle;
158
- context.stroke();
159
-
160
- drawNodeHighlight(d, semanticHeaderYellow, 2)
161
- context.strokeStyle = nodeStrokeStyle;
162
- context.stroke();
163
-
164
- searchResults += 1
165
-
166
- } else {
167
-
168
- context.fillStyle = nodeColorByModularity(d)
169
- context.strokeStyle = nodeStrokeStyle;
170
- context.stroke();
171
-
172
- context.fillStyle = currentActiveNodeLabelColor;
173
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
174
- context.fillStyle = nodeColorByModularity(d)
175
-
176
- searchResults += 1
177
- }
178
-
179
- } else {
180
- context.fillStyle = nodeColorByModularity(d, 0.2)
181
- context.strokeStyle = hexToRGB(nodeStrokeStyle, 0.2)
182
- context.stroke();
183
-
184
- if (nodeLabelsEnabled) {
185
- context.fillStyle = currentPassiveNodeLabelColor;
186
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
187
- context.fillStyle = nodeColorByModularity(d, 0.2)
188
- }
189
- }
190
- }
191
-
192
- // contributors search
193
- if (addContributorSearch == true && searchTermIncludedInNodeContributors(d)) {
194
-
195
- context.fillStyle = currentActiveNodeLabelColor;
196
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
197
-
198
- drawNodeHighlight(d, nodeColorByModularity(d, 1.0))
199
- context.strokeStyle = nodeStrokeStyle;
200
- context.stroke();
201
-
202
- drawNodeHighlight(d, contributorsPurple, 2)
203
- context.strokeStyle = nodeStrokeStyle;
204
- context.stroke();
205
-
206
- searchResults += 1
207
- }
208
-
209
- } else { // hovering over a node
210
- if (isConnected(d, closeNode)) { // node is connected to hovered node
211
- context.fillStyle = nodeColorByModularity(d)
212
- context.strokeStyle = nodeStrokeStyle;
213
- context.stroke();
214
-
215
- // show/highlight node label of every connected node from the hovered node
216
- context.fillStyle = currentActiveNodeLabelColor;
217
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
218
- context.fillStyle = nodeColorByModularity(d)
219
-
220
- } else if ( hoverCoupling == true && nodeNamesHaveChangeCoupling(d.id, closeNode.id) ) {
221
-
222
- context.fillStyle = currentActiveNodeLabelColor;
223
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
224
-
225
- drawNodeHighlight(d, nodeColorByModularity(d, 1.0))
226
- context.strokeStyle = nodeStrokeStyle;
227
- context.stroke();
228
-
229
- drawNodeHighlight(d, changeCouplingColor, 2)
230
- context.strokeStyle = nodeStrokeStyle;
231
- context.stroke();
232
-
233
- } else { // node is not connected
234
-
235
- if (d.id.toLowerCase() in selectedNodesMap) {
236
- context.strokeStyle = nodeStrokeStyle
237
- context.fillStyle = nodeColorByModularity(d)
238
- context.stroke();
239
- } else {
240
- context.strokeStyle = hexToRGB(nodeStrokeStyle, 0.2)
241
- context.fillStyle = nodeColorByModularity(d, 0.2)
242
- context.stroke();
243
- }
244
-
245
- if (nodeLabelsEnabled) {
246
- context.fillStyle = currentPassiveNodeLabelColor;
247
- drawNodeLabel(d.id, d.x + 14, d.y - 7)
248
- context.fillStyle = nodeColorByModularity(d, 0.2)
249
- }
250
- }
251
- }
252
-
253
- } // else not fade away unselected nodes
254
-
255
- context.fill();
256
-
257
- if (i == currentGraph.nodes.length - 1) { // dont call this to often due to performance
258
-
259
- if (closeNode) {
260
- context.beginPath();
261
- drawNode(closeNode)
262
-
263
- if (closeNode.id.toLowerCase() in selectedNodesMap) {
264
- context.fillStyle = activeSelectionColor
265
- } else {
266
- context.fillStyle = nodeColorByModularity(closeNode)
267
- }
268
-
269
- context.fill();
270
- context.strokeStyle = "#000000";
271
- context.lineWidth = 1.0;
272
- context.stroke();
273
-
274
- drawNodeToolTip(closeNode.id, closeNode.x + 14, closeNode.y - 7, closeNode.metrics)
275
- }
276
- }
277
- });
278
- }
279
-
280
- /**
281
- * * MARK: - Connectivity checks
282
- */
283
- let linkedByIndex = {};
284
-
285
- function isConnected(a, b) {
286
- return isConnectedAsTarget(a, b) || isConnectedAsSource(a, b) || a.id === b.id;
287
- }
288
-
289
- function isConnectedAsSource(a, b) {
290
- return linkedByIndex[`${a.id},${b.id}`];
291
- }
292
-
293
- function isConnectedAsTarget(a, b) {
294
- return linkedByIndex[`${b.id},${a.id}`];
295
- }
296
-
297
-
298
-
299
- function drawLink(d) {
300
- context.moveTo(d.source.x, d.source.y);
301
- context.lineTo(d.target.x, d.target.y);
302
- }
303
-
304
- function drawNode(d) {
305
- context.arc(d.x, d.y, d.radius, 0, TWO_TIMES_PI);
306
- }
307
-
308
- function drawNodeHighlight(node, color, radiusOffset) {
309
- context.arc(node.x, node.y, node.radius + radiusOffset, 0, TWO_TIMES_PI);
310
- context.fillStyle = color
311
- context.strokeStyle = color;
312
- context.stroke();
313
- context.fill();
314
- }
315
-
316
- function drawNodeLabel(text, xPos, yPos) {
317
- const fontSize = 8
318
- context.font = fontSize + 'px Helvetica';
319
- context.fillText(text, xPos, yPos);
320
- }
321
-
322
- function stringIncludedInNodeTags(string, node) {
323
- let propertyNames = Object.getOwnPropertyNames(node.metrics)
324
- let searchedTag = 'metric_tag_' + string
325
- let found = false
326
-
327
- let tagProperties = propertyNames.filter(function(property) {
328
- return property.startsWith('metric_tag_')
329
- })
330
-
331
- tagProperties.forEach(function(propertyName) {
332
- if (propertyName.toLowerCase().includes(string.toLowerCase())) {
333
- found = true
334
- }
335
- })
336
-
337
- return found
338
- }
339
-
340
- function stringIncludedInNodeContributors(string, node) {
341
- let found = false
342
- if (node.hasOwnProperty('metrics')) {
343
- let metrics = node['metrics']
344
- if ('metric_git_contributors' in metrics) {
345
- const contributors = metrics['metric_git_contributors']
346
- contributors.forEach(function(name) {
347
- if (name.toLowerCase().includes(string.toLowerCase())) {
348
- found = true
349
- }
350
- })
351
- }
352
- }
353
-
354
- return found
355
- }
356
-
357
- function drawNodeToolTip(text, xPos, yPos, nodeMetrics) {
358
-
359
- // $('#overallStatisticsModal').modal('show');
360
-
361
- const fontSize = 14
362
- context.font = fontSize + 'px Helvetica';
363
-
364
- // determine the maximum label width
365
- let maxLineWidth = 0
366
- for (metricKey in nodeMetrics) {
367
- const val = nodeMetrics[metricKey]
368
- let human_readable_metric_name = metricKey.replace('metric_', '').replace(/_/gi, " ")
369
- const w = context.measureText(human_readable_metric_name + ": " + val).width;
370
- if (maxLineWidth < w) {
371
- maxLineWidth = w
372
- }
373
- }
374
-
375
- // check if actually the title line width if bigger than any metric label line width?
376
- const nodeTitleLineWidth = context.measureText(text).width
377
- if (nodeTitleLineWidth > maxLineWidth)
378
- maxLineWidth = nodeTitleLineWidth
379
-
380
- // draw the header/title of the toolip
381
- let lineHeight = fontSize * 1.286;
382
- context.fillStyle = hexToRGB("#0069d9", 1.0);
383
- context.fillRect(xPos - 6, (yPos - lineHeight) + 2, maxLineWidth + 10, lineHeight + 4);
384
- context.strokeStyle = hexToRGB("#333333", 1.0);
385
- context.strokeRect(xPos - 6, (yPos - lineHeight) + 2, maxLineWidth + 10, lineHeight + 4)
386
-
387
- context.fillStyle = hexToRGB("#FFFFFF", 0.8);
388
- context.fillText(text, xPos, yPos);
389
-
390
- // now draw the second tooltip box with all metric labels
391
- let metricItem = 1
392
- const metricFontSize = 14
393
- const metricLineHeight = (metricFontSize * 1.286);
394
- let yPosOffset = yPos + 10
395
- let newYPos = 0
396
- let renderWithTags = false
397
-
398
- context.font = metricFontSize + 'px Helvetica';
399
-
400
- for (metricKey in nodeMetrics) {
401
-
402
- // do not include any tag/tfidf metric in the primary metric section
403
- if (metricKey.includes('metric_tag')) {
404
- renderWithTags = true
405
- continue
406
- }
407
-
408
- let val = nodeMetrics[metricKey]
409
- let human_readable_metric_name = metricKey.replace('metric_', '').replace(/_/gi, " ")
410
- let metricItemText = human_readable_metric_name + ": " + val
411
-
412
- newYPos = yPosOffset + (metricLineHeight * metricItem)
413
-
414
- // Interesting bug: on Safari it seems to cause random lags if you do fillStyle/fillRect BEFORE strokeStyle/strokeRect
415
- context.strokeStyle = toolTipMetricItemBoxColor
416
- context.strokeRect(xPos - 6, (newYPos - metricLineHeight), maxLineWidth + 10, metricLineHeight)
417
-
418
- context.fillStyle = toolTipMetricItemBoxFillColor
419
- context.fillRect(xPos - 6, (newYPos - metricLineHeight), maxLineWidth + 10, metricLineHeight);
420
-
421
- context.fillStyle = toolTipMetricItemTextColor;
422
- context.fillText(metricItemText, xPos, newYPos - 4);
423
-
424
- metricItem = metricItem + 1
425
- }
426
-
427
- // render tag/tfidf metric section
428
- if (renderWithTags) {
429
- let metricItem = 1
430
- newYPos += 20
431
-
432
- // draw the header/title of the toolip
433
- context.fillStyle = hexToRGB("#f5bc42", 1.0);
434
- context.fillRect(xPos - 6, (newYPos - lineHeight) + 2, maxLineWidth + 10, lineHeight + 4);
435
- context.strokeStyle = hexToRGB("#333333", 1.0);
436
- context.strokeRect(xPos - 6, (newYPos - lineHeight) + 2, maxLineWidth + 10, lineHeight + 4)
437
- context.fillStyle = hexToRGB("#333333", 0.8);
438
- context.fillText('Semantic keywords', xPos, newYPos);
439
-
440
- let yTagPosOffset = newYPos + 10
441
-
442
- // render tag/tfidf metrics
443
- for (metricKey in nodeMetrics) {
444
-
445
- // do not include any tag/tfidf metric in the primary metric section
446
- if (!metricKey.includes('metric_tag')) {
447
- continue
448
- }
449
-
450
- let val = nodeMetrics[metricKey]
451
- let human_readable_metric_name = metricKey.replace('metric_tag', '').replace(/_/gi, "")
452
- let metricItemText = human_readable_metric_name // + ": " + val
453
-
454
- newYPos = yTagPosOffset + (metricLineHeight * metricItem)
455
-
456
- // Interesting bug: on Safari it seems to cause random lags if you do fillStyle/fillRect BEFORE strokeStyle/strokeRect
457
- context.strokeStyle = toolTipMetricItemBoxColor
458
- context.strokeRect(xPos - 6, (newYPos - metricLineHeight), maxLineWidth + 10, metricLineHeight)
459
-
460
- context.fillStyle = toolTipMetricItemBoxFillColor
461
- context.fillRect(xPos - 6, (newYPos - metricLineHeight), maxLineWidth + 10, metricLineHeight);
462
-
463
- context.fillStyle = toolTipMetricItemTextColor;
464
- context.fillText(metricItemText, xPos, newYPos - 4);
465
-
466
- metricItem = metricItem + 1
467
- }
468
- }
469
- }
470
-
471
- // borrowed from Scott Johnson / https://gist.github.com/jwir3/d797037d2e1bf78a9b04838d73436197 with minor adjustments
472
- function drawArrowhead(context, from, to, radius) {
473
- const x_center = 0.5 * (from.x + to.x)
474
- const y_center = 0.5 * (from.y + to.y)
475
-
476
- let angle;
477
- let x;
478
- let y;
479
-
480
- context.beginPath();
481
-
482
- angle = Math.atan2(to.y - from.y, to.x - from.x)
483
- x = radius * Math.cos(angle) + x_center;
484
- y = radius * Math.sin(angle) + y_center;
485
-
486
- context.moveTo(x, y);
487
-
488
- angle += ONE_THIRD_TWO_TIMES_PI
489
- x = radius * Math.cos(angle) + x_center;
490
- y = radius * Math.sin(angle) + y_center;
491
-
492
- context.lineTo(x, y);
493
-
494
- angle += ONE_THIRD_TWO_TIMES_PI
495
- x = radius * Math.cos(angle) + x_center;
496
- y = radius * Math.sin(angle) + y_center;
497
-
498
- context.lineTo(x, y);
499
- context.closePath();
500
- context.fill();
501
- }
502
-
503
- function initNodeColorMap() {
504
- currentGraph.nodes.forEach(function(node, i) {
505
- nodeColorMap[node.id] = hexToRGB(color(node.metric_file_result_dependency_graph_louvain_modularity_in_file), 1.0)
506
- })
507
- }
508
-
509
- function nodeColorByModularity(node, alpha = 1.0) {
510
- if (currentGraphType.includes('file_result') || currentGraphType.includes('filesystem')) {
511
- if ('metric_file_result_dependency_graph_louvain_modularity_in_file' in node) {
512
- return hexToRGB(color(node.metric_file_result_dependency_graph_louvain_modularity_in_file), alpha)
513
- } else if ('directory' in node) {
514
- if (node.directory == true) {
515
- return hexToRGB(directoryNodeColor)
516
- }
517
- }
518
- } else {
519
- if (currentGraphType.includes('entity_result_dependency_graph')) {
520
- if ('metric_entity_result_dependency_graph_louvain_modularity_in_entity' in node) {
521
- return hexToRGB(color(node.metric_entity_result_dependency_graph_louvain_modularity_in_entity), alpha)
522
- }
523
- }
524
- if (currentGraphType.includes('entity_result_inheritance_graph')) {
525
- if ('metric_entity_result_inheritance_graph_louvain_modularity_in_entity' in node) {
526
- return hexToRGB(color(node.metric_entity_result_inheritance_graph_louvain_modularity_in_entity), alpha)
527
- }
528
- }
529
-
530
- if (currentGraphType.includes('entity_result_complete_graph')) {
531
- if ('metric_entity_result_complete_graph_louvain_modularity_in_entity' in node) {
532
- return hexToRGB(color(node.metric_entity_result_complete_graph_louvain_modularity_in_entity), alpha)
533
- }
534
- }
535
- }
536
-
537
- return hexToRGB(defaultNodeColor)
538
- }
539
-
1
+ /**
2
+ * * MARK: - Drawing on canvas
3
+ */
4
+ function drawEdges(context) {
5
+ currentGraph.links.forEach(function(d) {
6
+
7
+ context.beginPath();
8
+ context.moveTo(d.source.x, d.source.y);
9
+ context.lineTo(d.target.x, d.target.y);
10
+
11
+ if (closeNode == null) { // not hovering over any node
12
+ if (isSearching == false) { // not searching
13
+ context.fillStyle = context.strokeStyle = nodeSourceColor = nodeColorByModularity(d.source, 0.7)
14
+
15
+ } else { // node search is active
16
+
17
+ if (addSemanticSearch == true) {
18
+
19
+ // the edge is between two nodes that are included in the search OR the edge is between two nodes that includes the search in one of their semantic keywords
20
+ if ( edgeBetweenSearchTerms(d.source, d.target) || searchTermsIncludedInNodeTags(d.source, d.target) )
21
+ {
22
+ context.strokeStyle = currentActiveEdgeColor
23
+ context.fillStyle = currentActiveEdgeColor
24
+ } else { // the edge is not connected to a node which is included in the search
25
+ context.fillStyle = context.strokeStyle = currentPassiveEdgeColor
26
+ }
27
+
28
+
29
+ } else { // normal search without semantic
30
+ // the edge is between two nodes that are included in the search
31
+ if (edgeBetweenSearchTerms(d.source, d.target))
32
+ {
33
+ context.strokeStyle = currentActiveEdgeColor
34
+ context.fillStyle = currentActiveEdgeColor
35
+ } else { // the edge is not connected to a node which is included in the search
36
+ context.fillStyle = context.strokeStyle = currentPassiveEdgeColor
37
+ }
38
+ }
39
+
40
+ if (addContributorSearch == true ) {
41
+ // the edge is between two nodes that are included in the search OR the edge is between two nodes that includes the search in one of their semantic keywords
42
+ if ( searchTermsIncludedInNodeContributors(d.source, d.target) )
43
+ {
44
+ context.strokeStyle = currentActiveEdgeColor
45
+ context.fillStyle = currentActiveEdgeColor
46
+ }
47
+ }
48
+
49
+ }
50
+
51
+ } else {
52
+ if ((d.target.id == closeNode.id) || (d.source.id == closeNode.id)) { // there is an edge that contains our hovered node
53
+ context.strokeStyle = currentActiveEdgeColor
54
+ context.fillStyle = currentActiveEdgeColor
55
+
56
+ } else { // node is not included in the edge
57
+ context.fillStyle = context.strokeStyle = nodeColorByModularity(d.source, 0.2)
58
+ }
59
+ }
60
+
61
+ // highlight edge if the corresponding nodes are selected
62
+ if (d.source.id.toLowerCase() in selectedNodesMap && d.target.id.toLowerCase() in selectedNodesMap) {
63
+ context.strokeStyle = activeSelectionColor
64
+ context.fillStyle = currentActiveEdgeColor
65
+ context.lineWidth = 2.0;
66
+ } else {
67
+ if (fadeUnselectedNodes == true || normalHeatmapIsActive() || churnHeatmapIsActive() || hotspotHeatmapIsActive()) { // also fade away non-relevant egdes
68
+ context.fillStyle = context.strokeStyle = nodeColorByModularity(d.source, unselectedNodesOpacity)
69
+ }
70
+ context.lineWidth = 1.0;
71
+ }
72
+
73
+ context.stroke();
74
+
75
+ if (closeNode != null && ((d.target.id == closeNode.id) || (d.source.id == closeNode.id))) { // draw an arrow if there is an edge that contains our hovered node
76
+ drawArrowhead(context, d.source, d.target, 5)
77
+
78
+ } else if (isSearching && ( (searchTermIncludedInNode(d.target) ) && ( searchTermIncludedInNode(d.source)) )) { // draw an arrow if searching is enabled and there's an egde between searched nodes
79
+ drawArrowhead(context, d.source, d.target, 5)
80
+ }
81
+
82
+ else if (d.source.id.toLowerCase() in selectedNodesMap && d.target.id.toLowerCase() in selectedNodesMap) {
83
+ drawArrowhead(context, d.source, d.target, 5)
84
+ }
85
+
86
+ });
87
+ }
88
+
89
+ function drawNodes(context) {
90
+ currentGraph.nodes.forEach(function(d, i) {
91
+
92
+ context.beginPath();
93
+
94
+ //render outer circle if node was selected
95
+ if (d.id.toLowerCase() in selectedNodesMap) {
96
+
97
+ context.arc(d.x, d.y, d.radius + 2.0, 0, TWO_TIMES_PI);
98
+ context.fillStyle = '#FF0000' //activeSelectionColor
99
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
100
+ context.fill();
101
+ }
102
+
103
+ context.arc(d.x, d.y, d.radius, 0, TWO_TIMES_PI, true);
104
+
105
+ if (fadeUnselectedNodes == true || normalHeatmapIsActive() || churnHeatmapIsActive() || hotspotHeatmapIsActive()) {
106
+ context.strokeStyle = nodeStrokeStyle
107
+ context.fillStyle = hexToRGB(nodeStrokeStyle, unselectedNodesOpacity)
108
+ context.stroke();
109
+
110
+ if (nodeLabelsEnabled) {
111
+ context.fillStyle = currentPassiveNodeLabelColor;
112
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
113
+ context.fillStyle = nodeColorByModularity(d, unselectedNodesOpacity)
114
+ }
115
+
116
+ } else {
117
+
118
+ if (closeNode == null) { // not hovering over any node
119
+ if (isSearching == false) {
120
+
121
+ context.fillStyle = nodeColorByModularity(d)
122
+ context.strokeStyle = nodeStrokeStyle;
123
+ context.stroke();
124
+
125
+ if (nodeLabelsEnabled) {
126
+ context.fillStyle = currentActiveNodeLabelColor;
127
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
128
+ context.fillStyle = nodeColorByModularity(d)
129
+ }
130
+
131
+ } else { // searching for nodes
132
+
133
+ // normal (non-semantic) search
134
+ if ( addSemanticSearch == false && normalSearch(d)) {
135
+
136
+ context.fillStyle = nodeColorByModularity(d)
137
+ context.strokeStyle = nodeStrokeStyle;
138
+ context.stroke();
139
+
140
+ context.fillStyle = currentActiveNodeLabelColor;
141
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
142
+ context.fillStyle = nodeColorByModularity(d)
143
+
144
+ searchResults += 1
145
+
146
+ } else if ( addSemanticSearch == true && (searchTermIncludedInNode(d) || searchTermIncludedInNodeTags(d)) )
147
+ // add semantic search
148
+ // the node is included in the current search OR if the search in included in one of the node's semantic tags
149
+ // draw a highlight circle behind the found node due to semantic search
150
+ {
151
+ if ( searchTermIncludedInNodeTags(d) )
152
+ {
153
+ context.fillStyle = currentActiveNodeLabelColor;
154
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
155
+
156
+ drawNodeHighlight(d, nodeColorByModularity(d, 1.0))
157
+ context.strokeStyle = nodeStrokeStyle;
158
+ context.stroke();
159
+
160
+ drawNodeHighlight(d, semanticHeaderYellow, 2)
161
+ context.strokeStyle = nodeStrokeStyle;
162
+ context.stroke();
163
+
164
+ searchResults += 1
165
+
166
+ } else {
167
+
168
+ context.fillStyle = nodeColorByModularity(d)
169
+ context.strokeStyle = nodeStrokeStyle;
170
+ context.stroke();
171
+
172
+ context.fillStyle = currentActiveNodeLabelColor;
173
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
174
+ context.fillStyle = nodeColorByModularity(d)
175
+
176
+ searchResults += 1
177
+ }
178
+
179
+ } else {
180
+ context.fillStyle = nodeColorByModularity(d, 0.2)
181
+ context.strokeStyle = hexToRGB(nodeStrokeStyle, 0.2)
182
+ context.stroke();
183
+
184
+ if (nodeLabelsEnabled) {
185
+ context.fillStyle = currentPassiveNodeLabelColor;
186
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
187
+ context.fillStyle = nodeColorByModularity(d, 0.2)
188
+ }
189
+ }
190
+ }
191
+
192
+ // contributors search
193
+ if (addContributorSearch == true && searchTermIncludedInNodeContributors(d)) {
194
+
195
+ context.fillStyle = currentActiveNodeLabelColor;
196
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
197
+
198
+ drawNodeHighlight(d, nodeColorByModularity(d, 1.0))
199
+ context.strokeStyle = nodeStrokeStyle;
200
+ context.stroke();
201
+
202
+ drawNodeHighlight(d, contributorsPurple, 2)
203
+ context.strokeStyle = nodeStrokeStyle;
204
+ context.stroke();
205
+
206
+ searchResults += 1
207
+ }
208
+
209
+ } else { // hovering over a node
210
+ if (isConnected(d, closeNode)) { // node is connected to hovered node
211
+ context.fillStyle = nodeColorByModularity(d)
212
+ context.strokeStyle = nodeStrokeStyle;
213
+ context.stroke();
214
+
215
+ // show/highlight node label of every connected node from the hovered node
216
+ context.fillStyle = currentActiveNodeLabelColor;
217
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
218
+ context.fillStyle = nodeColorByModularity(d)
219
+
220
+ } else if ( hoverCoupling == true && nodeNamesHaveChangeCoupling(d.id, closeNode.id) ) {
221
+
222
+ context.fillStyle = currentActiveNodeLabelColor;
223
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
224
+
225
+ drawNodeHighlight(d, nodeColorByModularity(d, 1.0))
226
+ context.strokeStyle = nodeStrokeStyle;
227
+ context.stroke();
228
+
229
+ drawNodeHighlight(d, changeCouplingColor, 2)
230
+ context.strokeStyle = nodeStrokeStyle;
231
+ context.stroke();
232
+
233
+ } else { // node is not connected
234
+
235
+ if (d.id.toLowerCase() in selectedNodesMap) {
236
+ context.strokeStyle = nodeStrokeStyle
237
+ context.fillStyle = nodeColorByModularity(d)
238
+ context.stroke();
239
+ } else {
240
+ context.strokeStyle = hexToRGB(nodeStrokeStyle, 0.2)
241
+ context.fillStyle = nodeColorByModularity(d, 0.2)
242
+ context.stroke();
243
+ }
244
+
245
+ if (nodeLabelsEnabled) {
246
+ context.fillStyle = currentPassiveNodeLabelColor;
247
+ drawNodeLabel(d.id, d.x + 14, d.y - 7)
248
+ context.fillStyle = nodeColorByModularity(d, 0.2)
249
+ }
250
+ }
251
+ }
252
+
253
+ } // else not fade away unselected nodes
254
+
255
+ context.fill();
256
+
257
+ if (i == currentGraph.nodes.length - 1) { // dont call this to often due to performance
258
+
259
+ if (closeNode) {
260
+ context.beginPath();
261
+ drawNode(closeNode)
262
+
263
+ if (closeNode.id.toLowerCase() in selectedNodesMap) {
264
+ context.fillStyle = activeSelectionColor
265
+ } else {
266
+ context.fillStyle = nodeColorByModularity(closeNode)
267
+ }
268
+
269
+ context.fill();
270
+ context.strokeStyle = "#000000";
271
+ context.lineWidth = 1.0;
272
+ context.stroke();
273
+
274
+ drawNodeToolTip(closeNode.id, closeNode.x + 14, closeNode.y - 7, closeNode.metrics)
275
+ }
276
+ }
277
+ });
278
+ }
279
+
280
+ /**
281
+ * * MARK: - Connectivity checks
282
+ */
283
+ let linkedByIndex = {};
284
+
285
+ function isConnected(a, b) {
286
+ return isConnectedAsTarget(a, b) || isConnectedAsSource(a, b) || a.id === b.id;
287
+ }
288
+
289
+ function isConnectedAsSource(a, b) {
290
+ return linkedByIndex[`${a.id},${b.id}`];
291
+ }
292
+
293
+ function isConnectedAsTarget(a, b) {
294
+ return linkedByIndex[`${b.id},${a.id}`];
295
+ }
296
+
297
+
298
+
299
+ function drawLink(d) {
300
+ context.moveTo(d.source.x, d.source.y);
301
+ context.lineTo(d.target.x, d.target.y);
302
+ }
303
+
304
+ function drawNode(d) {
305
+ context.arc(d.x, d.y, d.radius, 0, TWO_TIMES_PI);
306
+ }
307
+
308
+ function drawNodeHighlight(node, color, radiusOffset) {
309
+ context.arc(node.x, node.y, node.radius + radiusOffset, 0, TWO_TIMES_PI);
310
+ context.fillStyle = color
311
+ context.strokeStyle = color;
312
+ context.stroke();
313
+ context.fill();
314
+ }
315
+
316
+ function drawNodeLabel(text, xPos, yPos) {
317
+ const fontSize = 8
318
+ context.font = fontSize + 'px Helvetica';
319
+ context.fillText(text, xPos, yPos);
320
+ }
321
+
322
+ function stringIncludedInNodeTags(string, node) {
323
+ let propertyNames = Object.getOwnPropertyNames(node.metrics)
324
+ let searchedTag = 'metric_tag_' + string
325
+ let found = false
326
+
327
+ let tagProperties = propertyNames.filter(function(property) {
328
+ return property.startsWith('metric_tag_')
329
+ })
330
+
331
+ tagProperties.forEach(function(propertyName) {
332
+ if (propertyName.toLowerCase().includes(string.toLowerCase())) {
333
+ found = true
334
+ }
335
+ })
336
+
337
+ return found
338
+ }
339
+
340
+ function stringIncludedInNodeContributors(string, node) {
341
+ let found = false
342
+ if (node.hasOwnProperty('metrics')) {
343
+ let metrics = node['metrics']
344
+ if ('metric_git_contributors' in metrics) {
345
+ const contributors = metrics['metric_git_contributors']
346
+ contributors.forEach(function(name) {
347
+ if (name.toLowerCase().includes(string.toLowerCase())) {
348
+ found = true
349
+ }
350
+ })
351
+ }
352
+ }
353
+
354
+ return found
355
+ }
356
+
357
+ function drawNodeToolTip(text, xPos, yPos, nodeMetrics) {
358
+
359
+ // $('#overallStatisticsModal').modal('show');
360
+
361
+ const fontSize = 14
362
+ context.font = fontSize + 'px Helvetica';
363
+
364
+ // determine the maximum label width
365
+ let maxLineWidth = 0
366
+ for (metricKey in nodeMetrics) {
367
+ const val = nodeMetrics[metricKey]
368
+ let human_readable_metric_name = metricKey.replace('metric_', '').replace(/_/gi, " ")
369
+ const w = context.measureText(human_readable_metric_name + ": " + val).width;
370
+ if (maxLineWidth < w) {
371
+ maxLineWidth = w
372
+ }
373
+ }
374
+
375
+ // check if actually the title line width if bigger than any metric label line width?
376
+ const nodeTitleLineWidth = context.measureText(text).width
377
+ if (nodeTitleLineWidth > maxLineWidth)
378
+ maxLineWidth = nodeTitleLineWidth
379
+
380
+ // draw the header/title of the toolip
381
+ let lineHeight = fontSize * 1.286;
382
+ context.fillStyle = hexToRGB("#0069d9", 1.0);
383
+ context.fillRect(xPos - 6, (yPos - lineHeight) + 2, maxLineWidth + 10, lineHeight + 4);
384
+ context.strokeStyle = hexToRGB("#333333", 1.0);
385
+ context.strokeRect(xPos - 6, (yPos - lineHeight) + 2, maxLineWidth + 10, lineHeight + 4)
386
+
387
+ context.fillStyle = hexToRGB("#FFFFFF", 0.8);
388
+ context.fillText(text, xPos, yPos);
389
+
390
+ // now draw the second tooltip box with all metric labels
391
+ let metricItem = 1
392
+ const metricFontSize = 14
393
+ const metricLineHeight = (metricFontSize * 1.286);
394
+ let yPosOffset = yPos + 10
395
+ let newYPos = 0
396
+ let renderWithTags = false
397
+
398
+ context.font = metricFontSize + 'px Helvetica';
399
+
400
+ for (metricKey in nodeMetrics) {
401
+
402
+ // do not include any tag/tfidf metric in the primary metric section
403
+ if (metricKey.includes('metric_tag')) {
404
+ renderWithTags = true
405
+ continue
406
+ }
407
+
408
+ let val = nodeMetrics[metricKey]
409
+ let human_readable_metric_name = metricKey.replace('metric_', '').replace(/_/gi, " ")
410
+ let metricItemText = human_readable_metric_name + ": " + val
411
+
412
+ newYPos = yPosOffset + (metricLineHeight * metricItem)
413
+
414
+ // Interesting bug: on Safari it seems to cause random lags if you do fillStyle/fillRect BEFORE strokeStyle/strokeRect
415
+ context.strokeStyle = toolTipMetricItemBoxColor
416
+ context.strokeRect(xPos - 6, (newYPos - metricLineHeight), maxLineWidth + 10, metricLineHeight)
417
+
418
+ context.fillStyle = toolTipMetricItemBoxFillColor
419
+ context.fillRect(xPos - 6, (newYPos - metricLineHeight), maxLineWidth + 10, metricLineHeight);
420
+
421
+ context.fillStyle = toolTipMetricItemTextColor;
422
+ context.fillText(metricItemText, xPos, newYPos - 4);
423
+
424
+ metricItem = metricItem + 1
425
+ }
426
+
427
+ // render tag/tfidf metric section
428
+ if (renderWithTags) {
429
+ let metricItem = 1
430
+ newYPos += 20
431
+
432
+ // draw the header/title of the toolip
433
+ context.fillStyle = hexToRGB("#f5bc42", 1.0);
434
+ context.fillRect(xPos - 6, (newYPos - lineHeight) + 2, maxLineWidth + 10, lineHeight + 4);
435
+ context.strokeStyle = hexToRGB("#333333", 1.0);
436
+ context.strokeRect(xPos - 6, (newYPos - lineHeight) + 2, maxLineWidth + 10, lineHeight + 4)
437
+ context.fillStyle = hexToRGB("#333333", 0.8);
438
+ context.fillText('Semantic keywords', xPos, newYPos);
439
+
440
+ let yTagPosOffset = newYPos + 10
441
+
442
+ // render tag/tfidf metrics
443
+ for (metricKey in nodeMetrics) {
444
+
445
+ // do not include any tag/tfidf metric in the primary metric section
446
+ if (!metricKey.includes('metric_tag')) {
447
+ continue
448
+ }
449
+
450
+ let val = nodeMetrics[metricKey]
451
+ let human_readable_metric_name = metricKey.replace('metric_tag', '').replace(/_/gi, "")
452
+ let metricItemText = human_readable_metric_name // + ": " + val
453
+
454
+ newYPos = yTagPosOffset + (metricLineHeight * metricItem)
455
+
456
+ // Interesting bug: on Safari it seems to cause random lags if you do fillStyle/fillRect BEFORE strokeStyle/strokeRect
457
+ context.strokeStyle = toolTipMetricItemBoxColor
458
+ context.strokeRect(xPos - 6, (newYPos - metricLineHeight), maxLineWidth + 10, metricLineHeight)
459
+
460
+ context.fillStyle = toolTipMetricItemBoxFillColor
461
+ context.fillRect(xPos - 6, (newYPos - metricLineHeight), maxLineWidth + 10, metricLineHeight);
462
+
463
+ context.fillStyle = toolTipMetricItemTextColor;
464
+ context.fillText(metricItemText, xPos, newYPos - 4);
465
+
466
+ metricItem = metricItem + 1
467
+ }
468
+ }
469
+ }
470
+
471
+ // borrowed from Scott Johnson / https://gist.github.com/jwir3/d797037d2e1bf78a9b04838d73436197 with minor adjustments
472
+ function drawArrowhead(context, from, to, radius) {
473
+ const x_center = 0.5 * (from.x + to.x)
474
+ const y_center = 0.5 * (from.y + to.y)
475
+
476
+ let angle;
477
+ let x;
478
+ let y;
479
+
480
+ context.beginPath();
481
+
482
+ angle = Math.atan2(to.y - from.y, to.x - from.x)
483
+ x = radius * Math.cos(angle) + x_center;
484
+ y = radius * Math.sin(angle) + y_center;
485
+
486
+ context.moveTo(x, y);
487
+
488
+ angle += ONE_THIRD_TWO_TIMES_PI
489
+ x = radius * Math.cos(angle) + x_center;
490
+ y = radius * Math.sin(angle) + y_center;
491
+
492
+ context.lineTo(x, y);
493
+
494
+ angle += ONE_THIRD_TWO_TIMES_PI
495
+ x = radius * Math.cos(angle) + x_center;
496
+ y = radius * Math.sin(angle) + y_center;
497
+
498
+ context.lineTo(x, y);
499
+ context.closePath();
500
+ context.fill();
501
+ }
502
+
503
+ function initNodeColorMap() {
504
+ currentGraph.nodes.forEach(function(node, i) {
505
+ nodeColorMap[node.id] = hexToRGB(color(node.metric_file_result_dependency_graph_louvain_modularity_in_file), 1.0)
506
+ })
507
+ }
508
+
509
+ function nodeColorByModularity(node, alpha = 1.0) {
510
+ if (currentGraphType.includes('file_result') || currentGraphType.includes('filesystem')) {
511
+ if ('metric_file_result_dependency_graph_louvain_modularity_in_file' in node) {
512
+ return hexToRGB(color(node.metric_file_result_dependency_graph_louvain_modularity_in_file), alpha)
513
+ } else if ('directory' in node) {
514
+ if (node.directory == true) {
515
+ return hexToRGB(directoryNodeColor)
516
+ }
517
+ }
518
+ } else {
519
+ if (currentGraphType.includes('entity_result_dependency_graph')) {
520
+ if ('metric_entity_result_dependency_graph_louvain_modularity_in_entity' in node) {
521
+ return hexToRGB(color(node.metric_entity_result_dependency_graph_louvain_modularity_in_entity), alpha)
522
+ }
523
+ }
524
+ if (currentGraphType.includes('entity_result_inheritance_graph')) {
525
+ if ('metric_entity_result_inheritance_graph_louvain_modularity_in_entity' in node) {
526
+ return hexToRGB(color(node.metric_entity_result_inheritance_graph_louvain_modularity_in_entity), alpha)
527
+ }
528
+ }
529
+
530
+ if (currentGraphType.includes('entity_result_complete_graph')) {
531
+ if ('metric_entity_result_complete_graph_louvain_modularity_in_entity' in node) {
532
+ return hexToRGB(color(node.metric_entity_result_complete_graph_louvain_modularity_in_entity), alpha)
533
+ }
534
+ }
535
+ }
536
+
537
+ return hexToRGB(defaultNodeColor)
538
+ }
539
+