@mxtommy/kip 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/.angulardoc.json +3 -3
  2. package/CHANGELOG.md +145 -135
  3. package/CONTRIBUTORS.md +16 -16
  4. package/README.md +102 -102
  5. package/angular.json +162 -153
  6. package/karma.conf.js +31 -31
  7. package/package.json +87 -84
  8. package/public/3rdpartylicenses.txt +301 -21
  9. package/public/assets/NoSleep.min.js +1 -1
  10. package/public/assets/fontawesome6/css/all.min.css +6 -0
  11. package/public/assets/fontawesome6/webfonts/fa-brands-400.ttf +0 -0
  12. package/public/assets/fontawesome6/webfonts/fa-brands-400.woff2 +0 -0
  13. package/public/assets/fontawesome6/webfonts/fa-regular-400.ttf +0 -0
  14. package/public/assets/fontawesome6/webfonts/fa-regular-400.woff2 +0 -0
  15. package/public/assets/fontawesome6/webfonts/fa-solid-900.ttf +0 -0
  16. package/public/assets/fontawesome6/webfonts/fa-solid-900.woff2 +0 -0
  17. package/public/assets/fontawesome6/webfonts/fa-v4compatibility.ttf +0 -0
  18. package/public/assets/fontawesome6/webfonts/fa-v4compatibility.woff2 +0 -0
  19. package/public/assets/icon-192x192.png +0 -0
  20. package/public/assets/icon-256x256.png +0 -0
  21. package/public/assets/icon-384x384.png +0 -0
  22. package/public/assets/icon-512x512.png +0 -0
  23. package/public/assets/steelseries-min.js +25 -25
  24. package/public/assets/steelseries-min.js.map +8 -8
  25. package/public/assets/steelseries.js +15834 -15834
  26. package/public/assets/svg-autopilot-inkscape-plain.svg +983 -983
  27. package/public/assets/svg-wind-inkscape.svg +1358 -1358
  28. package/public/assets/tween.js +381 -381
  29. package/public/index.html +19 -20
  30. package/public/main-es2018.98175eb4c61ccaf7eb17.js +1 -0
  31. package/public/main-es5.98175eb4c61ccaf7eb17.js +1 -0
  32. package/public/manifest.json +33 -0
  33. package/public/polyfills-es2018.3a61665863c173cd6ba3.js +1 -0
  34. package/public/polyfills-es5.44827ae4ff4e41de51fb.js +1 -0
  35. package/public/runtime-es2018.baedb88c6d2abacae2b8.js +1 -0
  36. package/public/runtime-es5.baedb88c6d2abacae2b8.js +1 -0
  37. package/public/styles.b92ae2c466c89712209d.css +5 -0
  38. package/src/app/alarm-menu/alarm-menu.component.html +55 -55
  39. package/src/app/alarm-menu/alarm-menu.component.scss +52 -53
  40. package/src/app/alarm-menu/alarm-menu.component.spec.ts +25 -25
  41. package/src/app/alarm-menu/alarm-menu.component.ts +186 -186
  42. package/src/app/app-help/app-help.component.css +4 -4
  43. package/src/app/app-help/app-help.component.html +135 -135
  44. package/src/app/app-help/app-help.component.ts +45 -45
  45. package/src/app/app.component.css +39 -39
  46. package/src/app/app.component.html +93 -93
  47. package/src/app/app.component.scss +79 -79
  48. package/src/app/app.component.spec.ts +32 -32
  49. package/src/app/app.component.ts +191 -192
  50. package/src/app/app.module.ts +200 -200
  51. package/src/app/config.blank.const.ts +51 -51
  52. package/src/app/config.blank.notification.const.ts +19 -19
  53. package/src/app/config.blank.units.const.ts +23 -23
  54. package/src/app/config.demo.const.ts +383 -383
  55. package/src/app/data-browser/data-browser.component.css +29 -29
  56. package/src/app/data-browser/data-browser.component.html +44 -44
  57. package/src/app/data-browser/data-browser.component.spec.ts +25 -25
  58. package/src/app/data-browser/data-browser.component.ts +91 -91
  59. package/src/app/data-browser-row/data-browser-row-unit-modal.html +17 -17
  60. package/src/app/data-browser-row/data-browser-row.component.css +9 -9
  61. package/src/app/data-browser-row/data-browser-row.component.html +4 -4
  62. package/src/app/data-browser-row/data-browser-row.component.ts +78 -78
  63. package/src/app/data-set.service.ts +273 -273
  64. package/src/app/dynamic-widget.directive.ts +11 -11
  65. package/src/app/gauge-steel/gauge-steel.component.css +4 -4
  66. package/src/app/gauge-steel/gauge-steel.component.html +4 -4
  67. package/src/app/gauge-steel/gauge-steel.component.spec.ts +25 -25
  68. package/src/app/gauge-steel/gauge-steel.component.ts +282 -282
  69. package/src/app/gauges-module/base-gauge.ts +300 -300
  70. package/src/app/gauges-module/linear-gauge.ts +49 -49
  71. package/src/app/gauges-module/radial-gauge.ts +47 -47
  72. package/src/app/layout-split/layout-split.component.html +30 -30
  73. package/src/app/layout-split/layout-split.component.scss +33 -33
  74. package/src/app/layout-split/layout-split.component.spec.ts +25 -25
  75. package/src/app/layout-split/layout-split.component.ts +59 -59
  76. package/src/app/layout-splits.service.ts +284 -284
  77. package/src/app/modal-path-selector/modal-path-selector.component.html +62 -62
  78. package/src/app/modal-path-selector/modal-path-selector.component.scss +39 -39
  79. package/src/app/modal-path-selector/modal-path-selector.component.spec.ts +25 -25
  80. package/src/app/modal-path-selector/modal-path-selector.component.ts +132 -132
  81. package/src/app/modal-widget/modal-widget.component.css +32 -32
  82. package/src/app/modal-widget/modal-widget.component.html +341 -341
  83. package/src/app/modal-widget/modal-widget.component.spec.ts +25 -25
  84. package/src/app/modal-widget/modal-widget.component.ts +84 -84
  85. package/src/app/notifications.service.ts +392 -392
  86. package/src/app/object-keys.pipe.spec.ts +8 -8
  87. package/src/app/object-keys.pipe.ts +13 -13
  88. package/src/app/reset-config/reset-config.component.html +3 -3
  89. package/src/app/reset-config/reset-config.component.spec.ts +25 -25
  90. package/src/app/reset-config/reset-config.component.ts +31 -31
  91. package/src/app/root-display/root-display.component.html +4 -4
  92. package/src/app/root-display/root-display.component.spec.ts +25 -25
  93. package/src/app/root-display/root-display.component.ts +57 -57
  94. package/src/app/safe.pipe.ts +15 -15
  95. package/src/app/settings/settings.component.css +9 -9
  96. package/src/app/settings/settings.component.html +25 -25
  97. package/src/app/settings/settings.component.spec.ts +25 -25
  98. package/src/app/settings/settings.component.ts +22 -22
  99. package/src/app/settings-config/settings-config.component.css +38 -38
  100. package/src/app/settings-config/settings-config.component.spec.ts +25 -25
  101. package/src/app/settings-config/settings-config.component.ts +161 -161
  102. package/src/app/settings-datasets/settings-datasets.component.html +43 -43
  103. package/src/app/settings-datasets/settings-datasets.component.scss +39 -39
  104. package/src/app/settings-datasets/settings-datasets.component.spec.ts +25 -25
  105. package/src/app/settings-datasets/settings-datasets.component.ts +98 -98
  106. package/src/app/settings-datasets/settings-datasets.modal.html +54 -54
  107. package/src/app/settings-notifications/settings-notifications.component.html +65 -65
  108. package/src/app/settings-notifications/settings-notifications.component.spec.ts +25 -25
  109. package/src/app/settings-notifications/settings-notifications.component.ts +29 -29
  110. package/src/app/settings-signalk/settings-signalk.component.html +8 -8
  111. package/src/app/settings-signalk/settings-signalk.component.spec.ts +25 -25
  112. package/src/app/settings-signalk/settings-signalk.component.ts +174 -174
  113. package/src/app/settings-units/settings-units.component.css +4 -4
  114. package/src/app/settings-units/settings-units.component.html +19 -19
  115. package/src/app/settings-units/settings-units.component.spec.ts +25 -25
  116. package/src/app/settings-units/settings-units.component.ts +62 -62
  117. package/src/app/settings-zones/settings-zones.component.css +21 -21
  118. package/src/app/settings-zones/settings-zones.component.html +70 -70
  119. package/src/app/settings-zones/settings-zones.modal.html +38 -38
  120. package/src/app/signalk-connection.service.ts +344 -344
  121. package/src/app/signalk-delta.service.spec.ts +15 -15
  122. package/src/app/signalk-delta.service.ts +97 -97
  123. package/src/app/signalk-full.service.ts +99 -99
  124. package/src/app/signalk-interfaces.ts +129 -129
  125. package/src/app/signalk-requests.service.spec.ts +12 -12
  126. package/src/app/signalk-requests.service.ts +180 -180
  127. package/src/app/svg-autopilot/svg-autopilot.component.html +1036 -1036
  128. package/src/app/svg-autopilot/svg-autopilot.component.spec.ts +25 -25
  129. package/src/app/svg-autopilot/svg-autopilot.component.ts +174 -174
  130. package/src/app/svg-simple-linear-gauge/svg-simple-linear-gauge.component.html +119 -119
  131. package/src/app/svg-simple-linear-gauge/svg-simple-linear-gauge.component.spec.ts +25 -25
  132. package/src/app/svg-simple-linear-gauge/svg-simple-linear-gauge.component.ts +49 -49
  133. package/src/app/svg-wind/svg-wind.component.html +969 -969
  134. package/src/app/svg-wind/svg-wind.component.scss +76 -76
  135. package/src/app/svg-wind/svg-wind.component.spec.ts +25 -25
  136. package/src/app/svg-wind/svg-wind.component.ts +280 -280
  137. package/src/app/unit-window/unit-window.component.css +37 -37
  138. package/src/app/unit-window/unit-window.component.html +8 -8
  139. package/src/app/unit-window/unit-window.component.spec.ts +25 -25
  140. package/src/app/unit-window/unit-window.component.ts +134 -134
  141. package/src/app/unit-window/unit-window.modal.html +24 -24
  142. package/src/app/units.service.ts +300 -300
  143. package/src/app/widget-autopilot/widget-autopilot.component.html +78 -85
  144. package/src/app/widget-autopilot/widget-autopilot.component.scss +191 -191
  145. package/src/app/widget-autopilot/widget-autopilot.component.spec.ts +25 -25
  146. package/src/app/widget-autopilot/widget-autopilot.component.ts +774 -781
  147. package/src/app/widget-blank/widget-blank.component.scss +21 -22
  148. package/src/app/widget-blank/widget-blank.component.spec.ts +25 -25
  149. package/src/app/widget-blank/widget-blank.component.ts +17 -17
  150. package/src/app/widget-gauge/widget-gauge.component.css +25 -25
  151. package/src/app/widget-gauge/widget-gauge.component.html +29 -29
  152. package/src/app/widget-gauge/widget-gauge.component.spec.ts +25 -25
  153. package/src/app/widget-gauge/widget-gauge.component.ts +120 -120
  154. package/src/app/widget-gauge-ng-linear/widget-gauge-ng-linear.component.html +126 -126
  155. package/src/app/widget-gauge-ng-linear/widget-gauge-ng-linear.component.scss +94 -93
  156. package/src/app/widget-gauge-ng-linear/widget-gauge-ng-linear.component.spec.ts +25 -25
  157. package/src/app/widget-gauge-ng-linear/widget-gauge-ng-linear.component.ts +424 -424
  158. package/src/app/widget-gauge-ng-radial/widget-gauge-ng-radial.component.html +1 -1
  159. package/src/app/widget-gauge-ng-radial/widget-gauge-ng-radial.component.scss +69 -69
  160. package/src/app/widget-gauge-ng-radial/widget-gauge-ng-radial.component.spec.ts +25 -25
  161. package/src/app/widget-gauge-ng-radial/widget-gauge-ng-radial.component.ts +553 -553
  162. package/src/app/widget-historical/widget-historical.component.html +14 -14
  163. package/src/app/widget-historical/widget-historical.component.spec.ts +25 -25
  164. package/src/app/widget-historical/widget-historical.component.ts +306 -306
  165. package/src/app/widget-iframe/widget-iframe.component.css +11 -11
  166. package/src/app/widget-iframe/widget-iframe.component.html +21 -21
  167. package/src/app/widget-iframe/widget-iframe.component.spec.ts +25 -25
  168. package/src/app/widget-iframe/widget-iframe.component.ts +63 -63
  169. package/src/app/widget-list.service.ts +135 -135
  170. package/src/app/widget-manager.service.ts +141 -141
  171. package/src/app/widget-numeric/widget-numeric.component.html +1 -1
  172. package/src/app/widget-numeric/widget-numeric.component.scss +3 -3
  173. package/src/app/widget-numeric/widget-numeric.component.spec.ts +25 -25
  174. package/src/app/widget-simple-linear/widget-simple-linear.component.html +28 -28
  175. package/src/app/widget-simple-linear/widget-simple-linear.component.scss +64 -64
  176. package/src/app/widget-simple-linear/widget-simple-linear.component.spec.ts +25 -25
  177. package/src/app/widget-simple-linear/widget-simple-linear.component.ts +199 -199
  178. package/src/app/widget-state/widget-state.component.html +27 -27
  179. package/src/app/widget-state/widget-state.component.scss +68 -68
  180. package/src/app/widget-state/widget-state.component.spec.ts +25 -25
  181. package/src/app/widget-state/widget-state.component.ts +178 -178
  182. package/src/app/widget-switch/widget-switch.component.css +69 -69
  183. package/src/app/widget-switch/widget-switch.component.html +17 -17
  184. package/src/app/widget-switch/widget-switch.component.spec.ts +25 -25
  185. package/src/app/widget-switch/widget-switch.component.ts +134 -134
  186. package/src/app/widget-text-generic/widget-text-generic.component.html +9 -9
  187. package/src/app/widget-text-generic/widget-text-generic.component.spec.ts +25 -25
  188. package/src/app/widget-tutorial/widget-tutorial.component.html +34 -34
  189. package/src/app/widget-tutorial/widget-tutorial.component.spec.ts +25 -25
  190. package/src/app/widget-tutorial/widget-tutorial.component.ts +18 -18
  191. package/src/app/widget-unknown/widget-unknown.component.spec.ts +25 -25
  192. package/src/app/widget-wind/widget-wind.component.css +23 -23
  193. package/src/app/widget-wind/widget-wind.component.html +20 -20
  194. package/src/app/widget-wind/widget-wind.component.spec.ts +25 -25
  195. package/src/app/widget-wind/widget-wind.component.ts +369 -369
  196. package/src/assets/NoSleep.min.js +1 -1
  197. package/src/assets/fontawesome6/css/all.min.css +6 -0
  198. package/src/assets/fontawesome6/webfonts/fa-brands-400.ttf +0 -0
  199. package/src/assets/fontawesome6/webfonts/fa-brands-400.woff2 +0 -0
  200. package/src/assets/fontawesome6/webfonts/fa-regular-400.ttf +0 -0
  201. package/src/assets/fontawesome6/webfonts/fa-regular-400.woff2 +0 -0
  202. package/src/assets/fontawesome6/webfonts/fa-solid-900.ttf +0 -0
  203. package/src/assets/fontawesome6/webfonts/fa-solid-900.woff2 +0 -0
  204. package/src/assets/fontawesome6/webfonts/fa-v4compatibility.ttf +0 -0
  205. package/src/assets/fontawesome6/webfonts/fa-v4compatibility.woff2 +0 -0
  206. package/src/assets/icon-192x192.png +0 -0
  207. package/src/assets/icon-256x256.png +0 -0
  208. package/src/assets/icon-384x384.png +0 -0
  209. package/src/assets/icon-512x512.png +0 -0
  210. package/src/assets/steelseries-min.js +25 -25
  211. package/src/assets/steelseries-min.js.map +8 -8
  212. package/src/assets/steelseries.js +15834 -15834
  213. package/src/assets/svg-autopilot-inkscape-plain.svg +983 -983
  214. package/src/assets/svg-wind-inkscape.svg +1358 -1358
  215. package/src/assets/tween.js +381 -381
  216. package/src/index.html +20 -20
  217. package/src/main.ts +11 -11
  218. package/src/manifest.json +33 -0
  219. package/src/polyfills.ts +80 -76
  220. package/src/styles.scss +11 -11
  221. package/src/themes/darkBlueTheme.scss +117 -116
  222. package/src/themes/defaultTheme.scss +50 -49
  223. package/src/themes/highContrastTheme.scss +47 -46
  224. package/src/themes/modernTheme.scss +143 -142
  225. package/src/themes/nightMode.scss +185 -184
  226. package/src/themes/platypusTheme.scss +80 -79
  227. package/src/themes/signalkTheme.scss +112 -111
  228. package/src/tsconfig.app.json +15 -15
  229. package/src/tsconfig.spec.json +20 -20
  230. package/tsconfig.json +23 -23
  231. package/tslint.json +143 -143
  232. package/public/assets/font-awesome/HELP-US-OUT.txt +0 -7
  233. package/public/assets/font-awesome/css/font-awesome.css +0 -2337
  234. package/public/assets/font-awesome/css/font-awesome.min.css +0 -4
  235. package/public/assets/font-awesome/desktop.ini +0 -4
  236. package/public/assets/font-awesome/fonts/FontAwesome.otf +0 -0
  237. package/public/assets/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  238. package/public/assets/font-awesome/fonts/fontawesome-webfont.svg +0 -2671
  239. package/public/assets/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  240. package/public/assets/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  241. package/public/assets/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  242. package/public/assets/font-awesome/less/animated.less +0 -34
  243. package/public/assets/font-awesome/less/bordered-pulled.less +0 -25
  244. package/public/assets/font-awesome/less/core.less +0 -12
  245. package/public/assets/font-awesome/less/fixed-width.less +0 -6
  246. package/public/assets/font-awesome/less/font-awesome.less +0 -18
  247. package/public/assets/font-awesome/less/icons.less +0 -789
  248. package/public/assets/font-awesome/less/larger.less +0 -13
  249. package/public/assets/font-awesome/less/list.less +0 -19
  250. package/public/assets/font-awesome/less/mixins.less +0 -60
  251. package/public/assets/font-awesome/less/path.less +0 -15
  252. package/public/assets/font-awesome/less/rotated-flipped.less +0 -20
  253. package/public/assets/font-awesome/less/screen-reader.less +0 -5
  254. package/public/assets/font-awesome/less/stacked.less +0 -20
  255. package/public/assets/font-awesome/less/variables.less +0 -800
  256. package/public/assets/font-awesome/scss/_animated.scss +0 -34
  257. package/public/assets/font-awesome/scss/_bordered-pulled.scss +0 -25
  258. package/public/assets/font-awesome/scss/_core.scss +0 -12
  259. package/public/assets/font-awesome/scss/_fixed-width.scss +0 -6
  260. package/public/assets/font-awesome/scss/_icons.scss +0 -789
  261. package/public/assets/font-awesome/scss/_larger.scss +0 -13
  262. package/public/assets/font-awesome/scss/_list.scss +0 -19
  263. package/public/assets/font-awesome/scss/_mixins.scss +0 -60
  264. package/public/assets/font-awesome/scss/_path.scss +0 -15
  265. package/public/assets/font-awesome/scss/_rotated-flipped.scss +0 -20
  266. package/public/assets/font-awesome/scss/_screen-reader.scss +0 -5
  267. package/public/assets/font-awesome/scss/_stacked.scss +0 -20
  268. package/public/assets/font-awesome/scss/_variables.scss +0 -800
  269. package/public/assets/font-awesome/scss/font-awesome.scss +0 -18
  270. package/public/main-es2018.ab0adc5af3ab3e70c849.js +0 -1
  271. package/public/main-es5.ab0adc5af3ab3e70c849.js +0 -1
  272. package/public/polyfills-es2018.713f95af1f028e444854.js +0 -1
  273. package/public/polyfills-es5.c78877945523541d2597.js +0 -1
  274. package/public/runtime-es2018.a4dadbc03350107420a4.js +0 -1
  275. package/public/runtime-es5.a4dadbc03350107420a4.js +0 -1
  276. package/public/styles.71bb0d04cad96b5efbe1.css +0 -19
  277. package/src/assets/font-awesome/HELP-US-OUT.txt +0 -7
  278. package/src/assets/font-awesome/css/font-awesome.css +0 -2337
  279. package/src/assets/font-awesome/css/font-awesome.min.css +0 -4
  280. package/src/assets/font-awesome/desktop.ini +0 -4
  281. package/src/assets/font-awesome/fonts/FontAwesome.otf +0 -0
  282. package/src/assets/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  283. package/src/assets/font-awesome/fonts/fontawesome-webfont.svg +0 -2671
  284. package/src/assets/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  285. package/src/assets/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  286. package/src/assets/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  287. package/src/assets/font-awesome/less/animated.less +0 -34
  288. package/src/assets/font-awesome/less/bordered-pulled.less +0 -25
  289. package/src/assets/font-awesome/less/core.less +0 -12
  290. package/src/assets/font-awesome/less/fixed-width.less +0 -6
  291. package/src/assets/font-awesome/less/font-awesome.less +0 -18
  292. package/src/assets/font-awesome/less/icons.less +0 -789
  293. package/src/assets/font-awesome/less/larger.less +0 -13
  294. package/src/assets/font-awesome/less/list.less +0 -19
  295. package/src/assets/font-awesome/less/mixins.less +0 -60
  296. package/src/assets/font-awesome/less/path.less +0 -15
  297. package/src/assets/font-awesome/less/rotated-flipped.less +0 -20
  298. package/src/assets/font-awesome/less/screen-reader.less +0 -5
  299. package/src/assets/font-awesome/less/stacked.less +0 -20
  300. package/src/assets/font-awesome/less/variables.less +0 -800
  301. package/src/assets/font-awesome/scss/_animated.scss +0 -34
  302. package/src/assets/font-awesome/scss/_bordered-pulled.scss +0 -25
  303. package/src/assets/font-awesome/scss/_core.scss +0 -12
  304. package/src/assets/font-awesome/scss/_fixed-width.scss +0 -6
  305. package/src/assets/font-awesome/scss/_icons.scss +0 -789
  306. package/src/assets/font-awesome/scss/_larger.scss +0 -13
  307. package/src/assets/font-awesome/scss/_list.scss +0 -19
  308. package/src/assets/font-awesome/scss/_mixins.scss +0 -60
  309. package/src/assets/font-awesome/scss/_path.scss +0 -15
  310. package/src/assets/font-awesome/scss/_rotated-flipped.scss +0 -20
  311. package/src/assets/font-awesome/scss/_screen-reader.scss +0 -5
  312. package/src/assets/font-awesome/scss/_stacked.scss +0 -20
  313. package/src/assets/font-awesome/scss/_variables.scss +0 -800
  314. package/src/assets/font-awesome/scss/font-awesome.scss +0 -18
@@ -1,284 +1,284 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { Router } from '@angular/router';
4
-
5
- import { AppSettingsService } from './app-settings.service';
6
- import { WidgetManagerService } from './widget-manager.service';
7
-
8
-
9
- interface ISplitArea {
10
- uuid: string; // uuid of widget of splitset, depending on type.
11
- type: string; //(widget|splitSet)
12
- size: number;
13
- }
14
-
15
- export interface ISplitSet {
16
- uuid: string;
17
- parentUUID?: string;
18
- direction: string;
19
- splitAreas: Array<ISplitArea>;
20
- }
21
-
22
- interface ISplitSetObs {
23
- uuid: string;
24
- observable: BehaviorSubject<ISplitSet>;
25
- }
26
-
27
- @Injectable()
28
- export class LayoutSplitsService {
29
-
30
- splitSets: Array<ISplitSet> = [];
31
- splitSetObs: Array<ISplitSetObs> = [];
32
- rootUUIDs: Array<string> = [];
33
- activeRoot: BehaviorSubject<string> = new BehaviorSubject<string>(null);
34
-
35
- constructor(
36
- private AppSettingsService: AppSettingsService,
37
- private WidgetManagerService: WidgetManagerService,
38
- private router: Router) {
39
- this.splitSets = this.AppSettingsService.getSplitSets();
40
- // prepare subs
41
- for (let i=0; i<this.splitSets.length; i++) {
42
- this.splitSetObs.push({uuid: this.splitSets[i].uuid, observable: new BehaviorSubject(this.splitSets[i])} );
43
- }
44
-
45
- this.rootUUIDs = this.AppSettingsService.getRootSplits();
46
- //this.activeRoot.next(this.rootUUIDs[0]);
47
- }
48
-
49
- private newUuid() {
50
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
51
- var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
52
- return v.toString(16);
53
- });
54
- }
55
-
56
- getActiveRootSub() {
57
- return this.activeRoot.asObservable();
58
- }
59
-
60
- setActiveRootIndex(index: number) {
61
- if (this.rootUUIDs[index]) {
62
- this.activeRoot.next(this.rootUUIDs[index]);
63
- } else {
64
- this.activeRoot.next(this.rootUUIDs[0]);
65
- }
66
- }
67
-
68
- nextRoot() {
69
- let currentIndex = this.rootUUIDs.indexOf(this.activeRoot.getValue());
70
- if (currentIndex == -1) {
71
- this.router.navigate(['/page', 0]);
72
- } else if (this.router.url != "/settings") {
73
- this.router.navigate(['/page', currentIndex + 1]);
74
- } else {
75
- this.router.navigate(['/page', currentIndex]);
76
- }
77
- }
78
-
79
- previousRoot() {
80
- let currentIndex = this.rootUUIDs.indexOf(this.activeRoot.getValue());
81
- if (currentIndex == -1) {
82
- this.router.navigate(['/page', 0]);
83
- } else if (this.router.url != "/settings") {
84
- if (currentIndex == 0) {
85
- this.router.navigate(['/page', this.rootUUIDs.length - 1]);
86
- } else {
87
- this.router.navigate(['/page', currentIndex - 1]);
88
- }
89
- } else {
90
- this.router.navigate(['/page', currentIndex]);
91
- }
92
- }
93
-
94
- getSplitObs(uuid:string) {
95
- let splitIndex = this.splitSetObs.findIndex(sSet => sSet.uuid == uuid);
96
- if (splitIndex < 0) { return null; }
97
- return this.splitSetObs[splitIndex].observable.asObservable();
98
- }
99
-
100
- getSplit(uuid:string) {
101
- let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == uuid);
102
- if (splitIndex < 0) { return null; }
103
- return this.splitSets[splitIndex];
104
- }
105
-
106
- //should only ever be called when changing directions. widgetUUID of area we're splitting
107
- // becomes first area of new split
108
- newSplit(parentUUID: string, direction: string, widget1UUID: string, widget2UUID) {
109
- let uuid = this.newUuid();
110
- let newSplit: ISplitSet = {
111
- uuid: uuid,
112
- parentUUID: parentUUID,
113
- direction: direction,
114
- splitAreas: [
115
- {
116
- uuid: widget1UUID,
117
- type: 'widget',
118
- size: 50
119
- },
120
- {
121
- uuid: widget2UUID,
122
- type: 'widget',
123
- size: 50
124
- }
125
- ]
126
- }
127
- this.splitSets.push(newSplit);
128
- this.splitSetObs.push({uuid: uuid, observable: new BehaviorSubject(newSplit)})
129
- return uuid;
130
- }
131
-
132
- newRootSplit() {
133
- //create new root split
134
- let uuid = this.newUuid();
135
- let newWidget = this.WidgetManagerService.newWidget();
136
- let newRootSplit: ISplitSet = {
137
- uuid: uuid,
138
- direction: 'horizontal',
139
- splitAreas: [ {uuid: newWidget, type: 'widget', size: 100}]
140
- }
141
- this.splitSets.push(newRootSplit);
142
-
143
- this.splitSetObs.push({uuid: uuid, observable: new BehaviorSubject(newRootSplit)});
144
-
145
- this.rootUUIDs.push(uuid);
146
- this.saveRootUUIDs();
147
-
148
- //get index of our new split
149
- this.router.navigate(['/page', this.rootUUIDs.indexOf(uuid)]);
150
- }
151
-
152
- splitArea(splitSetUUID: string, areaUUID: string, direction: string) {
153
- let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == splitSetUUID);
154
- if (splitIndex < 0) { return null; }
155
- let areaIndex = this.splitSets[splitIndex].splitAreas.findIndex(
156
- area => area.uuid == areaUUID
157
- );
158
- if (areaIndex < 0) { return; } // not found....
159
-
160
- // get current size so we can split it in two
161
- let currentSize = this.splitSets[splitIndex].splitAreas[areaIndex].size;
162
- let area1Size = currentSize / 2;
163
- let area2Size = currentSize - area1Size;
164
-
165
- let newWidgetUUID = this.WidgetManagerService.newWidget();
166
- let newArea = {
167
- uuid: newWidgetUUID,
168
- type: 'widget',
169
- size: area2Size
170
- };
171
-
172
- // test currect direction. If we're splitting in same direction, we just add another
173
- // area. If we're splitting in other direction, we need a new splitSet...
174
- if (this.splitSets[splitIndex].direction == direction) {
175
-
176
- // same direction, add new area after specified area
177
-
178
- this.splitSets[splitIndex].splitAreas[areaIndex].size = area1Size;
179
- this.splitSets[splitIndex].splitAreas.splice(areaIndex+1, 0, newArea);
180
-
181
- } else {
182
- let newSplitUUID = this.newSplit(splitSetUUID, direction, areaUUID, newWidgetUUID);
183
- this.splitSets[splitIndex].splitAreas[areaIndex].uuid = newSplitUUID;
184
- this.splitSets[splitIndex].splitAreas[areaIndex].type = 'splitSet';
185
- }
186
- this.updateSplit(splitSetUUID);
187
- }
188
-
189
- updateSplitSizes(splitSetUUID: string, sizesArray: Array<number>) {
190
- let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == splitSetUUID);
191
- if (splitIndex < 0) { return null; }
192
- for (let i=0; i < sizesArray.length; i++) {
193
- this.splitSets[splitIndex].splitAreas[i].size = sizesArray[i];
194
- }
195
- this.updateSplit(splitSetUUID);
196
- }
197
-
198
-
199
- deleteArea(splitSetUUID, areaUUID) {
200
-
201
- let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == splitSetUUID);
202
- if (splitIndex < 0) { return null; }
203
- // if num of areas in split > 1, delete the area from the splitset.
204
- // delete widget too! :P
205
- if (this.splitSets[splitIndex].splitAreas.length > 1) {
206
- // delete widget
207
- this.WidgetManagerService.deleteWidget(areaUUID);
208
-
209
- //delete Area
210
- let areaIndex = this.splitSets[splitIndex].splitAreas.findIndex(w => w.uuid == areaUUID)
211
- if (areaIndex < 0) { return null; } // not found?
212
- //delete area
213
- this.splitSets[splitIndex].splitAreas.splice(areaIndex,1);
214
- this.updateSplit(splitSetUUID);
215
-
216
- } else {
217
- // We're the last area in the splitset, so delete the whole splitset
218
- this.WidgetManagerService.deleteWidget(areaUUID);
219
-
220
- if (this.isRootSplit(splitSetUUID)) {
221
- // We're the rootsplit, bye bye page
222
- console.log('Deleting last split in root');
223
-
224
- //delete this splitset...
225
- this.splitSets.splice(splitIndex, 1);
226
-
227
- //remove from rootUUIDs
228
- let rootIndex = this.rootUUIDs.findIndex( uuid => uuid == splitSetUUID);
229
- this.rootUUIDs.splice(rootIndex,1);
230
- this.saveRootUUIDs();
231
-
232
- if (this.rootUUIDs.length <= 0) {
233
- // no more roots, we need at least one
234
- console.log("deleted last page");
235
- this.newRootSplit();
236
- this.setActiveRootIndex(0);
237
- }
238
-
239
- this.nextRoot();
240
- } else {
241
- // we're not the root, so find parent split and clear there.
242
-
243
- // find parent split,
244
- let parentIndex = this.splitSets.findIndex( sSet => sSet.uuid == this.splitSets[splitIndex].parentUUID);
245
- let parentUUID = this.splitSets[parentIndex].uuid;
246
-
247
- //delete this splitset...
248
- this.splitSets.splice(splitIndex, 1);
249
- // we don't delete the sub, otherwise might get areas
250
-
251
- this.deleteArea(parentUUID, splitSetUUID);
252
- }
253
-
254
-
255
- }
256
-
257
-
258
-
259
- }
260
-
261
- updateSplit(splitSetUUID: string) {
262
- let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == splitSetUUID);
263
- if (splitIndex < 0) { return null; }
264
-
265
- let subIndex = this.splitSetObs.findIndex(sSet => sSet.uuid == splitSetUUID);
266
- if (subIndex < 0) { return null; }
267
-
268
- this.splitSetObs[subIndex].observable.next(this.splitSets[splitIndex]);
269
- this.saveSplits();
270
- }
271
-
272
- isRootSplit(uuid: string) {
273
- return this.rootUUIDs.includes(uuid);
274
- }
275
-
276
- saveRootUUIDs() {
277
- this.AppSettingsService.saveRootUUIDs(this.rootUUIDs);
278
- }
279
-
280
- saveSplits() {
281
- this.AppSettingsService.saveSplitSets(this.splitSets);
282
- }
283
-
284
- }
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { Router } from '@angular/router';
4
+
5
+ import { AppSettingsService } from './app-settings.service';
6
+ import { WidgetManagerService } from './widget-manager.service';
7
+
8
+
9
+ interface ISplitArea {
10
+ uuid: string; // uuid of widget of splitset, depending on type.
11
+ type: string; //(widget|splitSet)
12
+ size: number;
13
+ }
14
+
15
+ export interface ISplitSet {
16
+ uuid: string;
17
+ parentUUID?: string;
18
+ direction: string;
19
+ splitAreas: Array<ISplitArea>;
20
+ }
21
+
22
+ interface ISplitSetObs {
23
+ uuid: string;
24
+ observable: BehaviorSubject<ISplitSet>;
25
+ }
26
+
27
+ @Injectable()
28
+ export class LayoutSplitsService {
29
+
30
+ splitSets: Array<ISplitSet> = [];
31
+ splitSetObs: Array<ISplitSetObs> = [];
32
+ rootUUIDs: Array<string> = [];
33
+ activeRoot: BehaviorSubject<string> = new BehaviorSubject<string>(null);
34
+
35
+ constructor(
36
+ private AppSettingsService: AppSettingsService,
37
+ private WidgetManagerService: WidgetManagerService,
38
+ private router: Router) {
39
+ this.splitSets = this.AppSettingsService.getSplitSets();
40
+ // prepare subs
41
+ for (let i=0; i<this.splitSets.length; i++) {
42
+ this.splitSetObs.push({uuid: this.splitSets[i].uuid, observable: new BehaviorSubject(this.splitSets[i])} );
43
+ }
44
+
45
+ this.rootUUIDs = this.AppSettingsService.getRootSplits();
46
+ //this.activeRoot.next(this.rootUUIDs[0]);
47
+ }
48
+
49
+ private newUuid() {
50
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
51
+ var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
52
+ return v.toString(16);
53
+ });
54
+ }
55
+
56
+ getActiveRootSub() {
57
+ return this.activeRoot.asObservable();
58
+ }
59
+
60
+ setActiveRootIndex(index: number) {
61
+ if (this.rootUUIDs[index]) {
62
+ this.activeRoot.next(this.rootUUIDs[index]);
63
+ } else {
64
+ this.activeRoot.next(this.rootUUIDs[0]);
65
+ }
66
+ }
67
+
68
+ nextRoot() {
69
+ let currentIndex = this.rootUUIDs.indexOf(this.activeRoot.getValue());
70
+ if (currentIndex == -1) {
71
+ this.router.navigate(['/page', 0]);
72
+ } else if (this.router.url != "/settings") {
73
+ this.router.navigate(['/page', currentIndex + 1]);
74
+ } else {
75
+ this.router.navigate(['/page', currentIndex]);
76
+ }
77
+ }
78
+
79
+ previousRoot() {
80
+ let currentIndex = this.rootUUIDs.indexOf(this.activeRoot.getValue());
81
+ if (currentIndex == -1) {
82
+ this.router.navigate(['/page', 0]);
83
+ } else if (this.router.url != "/settings") {
84
+ if (currentIndex == 0) {
85
+ this.router.navigate(['/page', this.rootUUIDs.length - 1]);
86
+ } else {
87
+ this.router.navigate(['/page', currentIndex - 1]);
88
+ }
89
+ } else {
90
+ this.router.navigate(['/page', currentIndex]);
91
+ }
92
+ }
93
+
94
+ getSplitObs(uuid:string) {
95
+ let splitIndex = this.splitSetObs.findIndex(sSet => sSet.uuid == uuid);
96
+ if (splitIndex < 0) { return null; }
97
+ return this.splitSetObs[splitIndex].observable.asObservable();
98
+ }
99
+
100
+ getSplit(uuid:string) {
101
+ let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == uuid);
102
+ if (splitIndex < 0) { return null; }
103
+ return this.splitSets[splitIndex];
104
+ }
105
+
106
+ //should only ever be called when changing directions. widgetUUID of area we're splitting
107
+ // becomes first area of new split
108
+ newSplit(parentUUID: string, direction: string, widget1UUID: string, widget2UUID) {
109
+ let uuid = this.newUuid();
110
+ let newSplit: ISplitSet = {
111
+ uuid: uuid,
112
+ parentUUID: parentUUID,
113
+ direction: direction,
114
+ splitAreas: [
115
+ {
116
+ uuid: widget1UUID,
117
+ type: 'widget',
118
+ size: 50
119
+ },
120
+ {
121
+ uuid: widget2UUID,
122
+ type: 'widget',
123
+ size: 50
124
+ }
125
+ ]
126
+ }
127
+ this.splitSets.push(newSplit);
128
+ this.splitSetObs.push({uuid: uuid, observable: new BehaviorSubject(newSplit)})
129
+ return uuid;
130
+ }
131
+
132
+ newRootSplit() {
133
+ //create new root split
134
+ let uuid = this.newUuid();
135
+ let newWidget = this.WidgetManagerService.newWidget();
136
+ let newRootSplit: ISplitSet = {
137
+ uuid: uuid,
138
+ direction: 'horizontal',
139
+ splitAreas: [ {uuid: newWidget, type: 'widget', size: 100}]
140
+ }
141
+ this.splitSets.push(newRootSplit);
142
+
143
+ this.splitSetObs.push({uuid: uuid, observable: new BehaviorSubject(newRootSplit)});
144
+
145
+ this.rootUUIDs.push(uuid);
146
+ this.saveRootUUIDs();
147
+
148
+ //get index of our new split
149
+ this.router.navigate(['/page', this.rootUUIDs.indexOf(uuid)]);
150
+ }
151
+
152
+ splitArea(splitSetUUID: string, areaUUID: string, direction: string) {
153
+ let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == splitSetUUID);
154
+ if (splitIndex < 0) { return null; }
155
+ let areaIndex = this.splitSets[splitIndex].splitAreas.findIndex(
156
+ area => area.uuid == areaUUID
157
+ );
158
+ if (areaIndex < 0) { return; } // not found....
159
+
160
+ // get current size so we can split it in two
161
+ let currentSize = this.splitSets[splitIndex].splitAreas[areaIndex].size;
162
+ let area1Size = currentSize / 2;
163
+ let area2Size = currentSize - area1Size;
164
+
165
+ let newWidgetUUID = this.WidgetManagerService.newWidget();
166
+ let newArea = {
167
+ uuid: newWidgetUUID,
168
+ type: 'widget',
169
+ size: area2Size
170
+ };
171
+
172
+ // test currect direction. If we're splitting in same direction, we just add another
173
+ // area. If we're splitting in other direction, we need a new splitSet...
174
+ if (this.splitSets[splitIndex].direction == direction) {
175
+
176
+ // same direction, add new area after specified area
177
+
178
+ this.splitSets[splitIndex].splitAreas[areaIndex].size = area1Size;
179
+ this.splitSets[splitIndex].splitAreas.splice(areaIndex+1, 0, newArea);
180
+
181
+ } else {
182
+ let newSplitUUID = this.newSplit(splitSetUUID, direction, areaUUID, newWidgetUUID);
183
+ this.splitSets[splitIndex].splitAreas[areaIndex].uuid = newSplitUUID;
184
+ this.splitSets[splitIndex].splitAreas[areaIndex].type = 'splitSet';
185
+ }
186
+ this.updateSplit(splitSetUUID);
187
+ }
188
+
189
+ updateSplitSizes(splitSetUUID: string, sizesArray: Array<number>) {
190
+ let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == splitSetUUID);
191
+ if (splitIndex < 0) { return null; }
192
+ for (let i=0; i < sizesArray.length; i++) {
193
+ this.splitSets[splitIndex].splitAreas[i].size = sizesArray[i];
194
+ }
195
+ this.updateSplit(splitSetUUID);
196
+ }
197
+
198
+
199
+ deleteArea(splitSetUUID, areaUUID) {
200
+
201
+ let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == splitSetUUID);
202
+ if (splitIndex < 0) { return null; }
203
+ // if num of areas in split > 1, delete the area from the splitset.
204
+ // delete widget too! :P
205
+ if (this.splitSets[splitIndex].splitAreas.length > 1) {
206
+ // delete widget
207
+ this.WidgetManagerService.deleteWidget(areaUUID);
208
+
209
+ //delete Area
210
+ let areaIndex = this.splitSets[splitIndex].splitAreas.findIndex(w => w.uuid == areaUUID)
211
+ if (areaIndex < 0) { return null; } // not found?
212
+ //delete area
213
+ this.splitSets[splitIndex].splitAreas.splice(areaIndex,1);
214
+ this.updateSplit(splitSetUUID);
215
+
216
+ } else {
217
+ // We're the last area in the splitset, so delete the whole splitset
218
+ this.WidgetManagerService.deleteWidget(areaUUID);
219
+
220
+ if (this.isRootSplit(splitSetUUID)) {
221
+ // We're the rootsplit, bye bye page
222
+ console.log('Deleting last split in root');
223
+
224
+ //delete this splitset...
225
+ this.splitSets.splice(splitIndex, 1);
226
+
227
+ //remove from rootUUIDs
228
+ let rootIndex = this.rootUUIDs.findIndex( uuid => uuid == splitSetUUID);
229
+ this.rootUUIDs.splice(rootIndex,1);
230
+ this.saveRootUUIDs();
231
+
232
+ if (this.rootUUIDs.length <= 0) {
233
+ // no more roots, we need at least one
234
+ console.log("deleted last page");
235
+ this.newRootSplit();
236
+ this.setActiveRootIndex(0);
237
+ }
238
+
239
+ this.nextRoot();
240
+ } else {
241
+ // we're not the root, so find parent split and clear there.
242
+
243
+ // find parent split,
244
+ let parentIndex = this.splitSets.findIndex( sSet => sSet.uuid == this.splitSets[splitIndex].parentUUID);
245
+ let parentUUID = this.splitSets[parentIndex].uuid;
246
+
247
+ //delete this splitset...
248
+ this.splitSets.splice(splitIndex, 1);
249
+ // we don't delete the sub, otherwise might get areas
250
+
251
+ this.deleteArea(parentUUID, splitSetUUID);
252
+ }
253
+
254
+
255
+ }
256
+
257
+
258
+
259
+ }
260
+
261
+ updateSplit(splitSetUUID: string) {
262
+ let splitIndex = this.splitSets.findIndex(sSet => sSet.uuid == splitSetUUID);
263
+ if (splitIndex < 0) { return null; }
264
+
265
+ let subIndex = this.splitSetObs.findIndex(sSet => sSet.uuid == splitSetUUID);
266
+ if (subIndex < 0) { return null; }
267
+
268
+ this.splitSetObs[subIndex].observable.next(this.splitSets[splitIndex]);
269
+ this.saveSplits();
270
+ }
271
+
272
+ isRootSplit(uuid: string) {
273
+ return this.rootUUIDs.includes(uuid);
274
+ }
275
+
276
+ saveRootUUIDs() {
277
+ this.AppSettingsService.saveRootUUIDs(this.rootUUIDs);
278
+ }
279
+
280
+ saveSplits() {
281
+ this.AppSettingsService.saveSplitSets(this.splitSets);
282
+ }
283
+
284
+ }