@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,62 +1,62 @@
1
- <div [formGroup]="formGroup">
2
- <div class="pathGroup" *ngIf="formGroup.value.isPathConfigurable">
3
- <p>{{formGroup.value.description}}</p>
4
- <div class="pathGroupFields">
5
- <mat-form-field class="pathField" appearance="outline" floatLabel="always">
6
- <mat-label>SignalK Path</mat-label>
7
- <input type="text" matInput
8
- placeholder="Select path (note dropdown limited to 50, type to use autocomplete)"
9
- formControlName="path"
10
- required
11
- [matAutocomplete]="pathAutoComplete">
12
- <button mat-button *ngIf="formGroup.value.path" matSuffix mat-icon-button aria-label="Clear" (click)="formGroup.controls['path'].patchValue('')">
13
- <span class="fa fa-close"></span>
14
- </button>
15
- <mat-autocomplete #pathAutoComplete="matAutocomplete">
16
- <mat-option *ngFor="let pathAndMeta of filteredPaths | async" [value]="pathAndMeta.path" style="min-height: 48px; line-height: 1.15; height: auto; padding: 8px 16px; white-space: normal;">
17
- <ng-container *ngIf="(pathAndMeta.meta != undefined)">
18
- <span>{{pathAndMeta.path}}</span>
19
- <br>
20
- <small class="pathMetaDescription">{{pathAndMeta.meta.description}}</small>
21
- </ng-container>
22
- <ng-container *ngIf="(pathAndMeta.meta == undefined)">
23
- {{pathAndMeta.path}}
24
- </ng-container>
25
- </mat-option>
26
- </mat-autocomplete>
27
- <mat-error *ngIf="formGroup.controls['path'].hasError('required')">
28
- Path <strong>required</strong>
29
- </mat-error>
30
- <mat-error *ngIf="formGroup.controls['path'].hasError('requireMatch')">
31
- Please select an existing path
32
- </mat-error>
33
- </mat-form-field>
34
- <mat-form-field class="sourceField" appearance="outline" floatLabel="always">
35
- <mat-label>Data Source</mat-label>
36
- <mat-select
37
- placeholder="Select source"
38
- formControlName="source"
39
- Ripple
40
- required>
41
- <mat-option *ngFor="let source of availableSources" [value]="source">
42
- {{source}}
43
- </mat-option>
44
- </mat-select>
45
- </mat-form-field>
46
- <mat-form-field class="unitField" *ngIf="formGroup.value.pathType == 'number'" appearance="outline" floatLabel="always">
47
- <mat-label>Display Format</mat-label>
48
- <mat-select
49
- placeholder="Select unit"
50
- formControlName="convertUnitTo"
51
- disableRipple
52
- required>
53
- <mat-optgroup *ngFor="let group of unitList.conversions" [label]="group.group">
54
- <mat-option *ngFor="let unit of group.units" [value]="unit.measure">
55
- {{unit.description}}
56
- </mat-option>
57
- </mat-optgroup>
58
- </mat-select>
59
- </mat-form-field>
60
- </div>
61
- </div>
62
- </div>
1
+ <div [formGroup]="formGroup">
2
+ <div class="pathGroup" *ngIf="formGroup.value.isPathConfigurable">
3
+ <p>{{formGroup.value.description}}</p>
4
+ <div class="pathGroupFields">
5
+ <mat-form-field class="pathField" appearance="outline" floatLabel="always">
6
+ <mat-label>SignalK Path</mat-label>
7
+ <input type="text" matInput
8
+ placeholder="Select path (note dropdown limited to 50, type to use autocomplete)"
9
+ formControlName="path"
10
+ required
11
+ [matAutocomplete]="pathAutoComplete">
12
+ <button mat-button *ngIf="formGroup.value.path" matSuffix mat-icon-button aria-label="Clear" (click)="formGroup.controls['path'].patchValue('')">
13
+ <span class="fa-solid fa-close"></span>
14
+ </button>
15
+ <mat-autocomplete #pathAutoComplete="matAutocomplete">
16
+ <mat-option *ngFor="let pathAndMeta of filteredPaths | async" [value]="pathAndMeta.path" style="min-height: 48px; line-height: 1.15; height: auto; padding: 8px 16px; white-space: normal;">
17
+ <ng-container *ngIf="(pathAndMeta.meta != undefined)">
18
+ <span>{{pathAndMeta.path}}</span>
19
+ <br>
20
+ <small class="pathMetaDescription">{{pathAndMeta.meta.description}}</small>
21
+ </ng-container>
22
+ <ng-container *ngIf="(pathAndMeta.meta == undefined)">
23
+ {{pathAndMeta.path}}
24
+ </ng-container>
25
+ </mat-option>
26
+ </mat-autocomplete>
27
+ <mat-error *ngIf="formGroup.controls['path'].hasError('required')">
28
+ Path <strong>required</strong>
29
+ </mat-error>
30
+ <mat-error *ngIf="formGroup.controls['path'].hasError('requireMatch')">
31
+ Please select an existing path
32
+ </mat-error>
33
+ </mat-form-field>
34
+ <mat-form-field class="sourceField" appearance="outline" floatLabel="always">
35
+ <mat-label>Data Source</mat-label>
36
+ <mat-select
37
+ placeholder="Select source"
38
+ formControlName="source"
39
+ Ripple
40
+ required>
41
+ <mat-option *ngFor="let source of availableSources" [value]="source">
42
+ {{source}}
43
+ </mat-option>
44
+ </mat-select>
45
+ </mat-form-field>
46
+ <mat-form-field class="unitField" *ngIf="formGroup.value.pathType == 'number'" appearance="outline" floatLabel="always">
47
+ <mat-label>Display Format</mat-label>
48
+ <mat-select
49
+ placeholder="Select unit"
50
+ formControlName="convertUnitTo"
51
+ disableRipple
52
+ required>
53
+ <mat-optgroup *ngFor="let group of unitList.conversions" [label]="group.group">
54
+ <mat-option *ngFor="let unit of group.units" [value]="unit.measure">
55
+ {{unit.description}}
56
+ </mat-option>
57
+ </mat-optgroup>
58
+ </mat-select>
59
+ </mat-form-field>
60
+ </div>
61
+ </div>
62
+ </div>
@@ -1,39 +1,39 @@
1
- @import '~@angular/material/theming';
2
-
3
- @mixin modal-path-selector-theme($theme) {
4
-
5
- $themeForeground: map-get($theme, foreground);
6
-
7
- .pathMetaDescription {
8
- font: small-caption;
9
- color: mat-color($themeForeground, disabled-text);
10
- }
11
-
12
- }
13
-
14
- .pathGroup {
15
- display: inline-block;
16
- width: calc(100%);
17
- }
18
-
19
- .pathGroupFields {
20
- display: inline-block;
21
- padding-left: 15px;
22
- width: calc(100% - 30px);
23
- }
24
-
25
- .pathField {
26
- display: inline-block;
27
- width: 100%;
28
- }
29
-
30
- .sourceField {
31
- display: inline-block;
32
- width: calc(50% - 15px);
33
- padding-right: 30px;
34
- }
35
-
36
- .unitField {
37
- display: inline-block;
38
- width: calc(50% - 15px);
39
- }
1
+ @use '~@angular/material' as mat;
2
+
3
+ @mixin modal-path-selector-theme($theme) {
4
+
5
+ $themeForeground: map-get($theme, foreground);
6
+
7
+ .pathMetaDescription {
8
+ font: small-caption;
9
+ color: mat.get-color-from-palette($themeForeground, disabled-text);
10
+ }
11
+
12
+ }
13
+
14
+ .pathGroup {
15
+ display: inline-block;
16
+ width: calc(100%);
17
+ }
18
+
19
+ .pathGroupFields {
20
+ display: inline-block;
21
+ padding-left: 15px;
22
+ width: calc(100% - 30px);
23
+ }
24
+
25
+ .pathField {
26
+ display: inline-block;
27
+ width: 100%;
28
+ }
29
+
30
+ .sourceField {
31
+ display: inline-block;
32
+ width: calc(50% - 15px);
33
+ padding-right: 30px;
34
+ }
35
+
36
+ .unitField {
37
+ display: inline-block;
38
+ width: calc(50% - 15px);
39
+ }
@@ -1,25 +1,25 @@
1
- import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
2
-
3
- import { ModalPathSelectorComponent } from './modal-path-selector.component';
4
-
5
- describe('ModalPathSelectorComponent', () => {
6
- let component: ModalPathSelectorComponent;
7
- let fixture: ComponentFixture<ModalPathSelectorComponent>;
8
-
9
- beforeEach(waitForAsync(() => {
10
- TestBed.configureTestingModule({
11
- declarations: [ ModalPathSelectorComponent ]
12
- })
13
- .compileComponents();
14
- }));
15
-
16
- beforeEach(() => {
17
- fixture = TestBed.createComponent(ModalPathSelectorComponent);
18
- component = fixture.componentInstance;
19
- fixture.detectChanges();
20
- });
21
-
22
- it('should be created', () => {
23
- expect(component).toBeTruthy();
24
- });
25
- });
1
+ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
2
+
3
+ import { ModalPathSelectorComponent } from './modal-path-selector.component';
4
+
5
+ describe('ModalPathSelectorComponent', () => {
6
+ let component: ModalPathSelectorComponent;
7
+ let fixture: ComponentFixture<ModalPathSelectorComponent>;
8
+
9
+ beforeEach(waitForAsync(() => {
10
+ TestBed.configureTestingModule({
11
+ declarations: [ ModalPathSelectorComponent ]
12
+ })
13
+ .compileComponents();
14
+ }));
15
+
16
+ beforeEach(() => {
17
+ fixture = TestBed.createComponent(ModalPathSelectorComponent);
18
+ component = fixture.componentInstance;
19
+ fixture.detectChanges();
20
+ });
21
+
22
+ it('should be created', () => {
23
+ expect(component).toBeTruthy();
24
+ });
25
+ });
@@ -1,132 +1,132 @@
1
- import { Component, Input, OnInit, OnChanges, SimpleChange } from '@angular/core';
2
- import { SignalKService } from '../signalk.service';
3
- import { IPathAndMetaObjects } from "../signalk-interfaces";
4
- import { UnitsService, IUnitGroup } from '../units.service';
5
- import { FormGroup, FormControl,Validators } from '@angular/forms';
6
- import { map, startWith } from 'rxjs/operators';
7
- import { Observable } from 'rxjs'
8
-
9
-
10
- @Component({
11
- selector: 'modal-path-selector',
12
- templateUrl: './modal-path-selector.component.html',
13
- styleUrls: ['./modal-path-selector.component.scss']
14
- })
15
- export class ModalPathSelectorComponent implements OnInit, OnChanges {
16
- //path control
17
- @Input() formGroup: FormGroup;
18
- @Input() filterSelfPaths: boolean;
19
- availablePaths: IPathAndMetaObjects[];
20
- filteredPaths: Observable<IPathAndMetaObjects[]> = new Observable;
21
-
22
- //source control
23
- availableSources: Array<string>;
24
-
25
- //unit control
26
- unitList: {default?: string, conversions?: IUnitGroup[] };
27
- default: string;
28
-
29
- ////require-match validation for path
30
- requirePathMatch = (allPathsAndMeta: IPathAndMetaObjects[]) => {
31
- return (control: FormControl) => {
32
- const selection: any = control.value;
33
- if (allPathsAndMeta.some(pm => pm.path === selection)) {
34
- return null;
35
- }
36
- return { requireMatch: true };
37
- }
38
- }
39
-
40
- constructor(
41
- private signalKService: SignalKService,
42
- private unitsService: UnitsService
43
- ) { }
44
-
45
- ngOnInit() {
46
- this.unitList = {};
47
- //disable formControl if path is empty - a new, not configured widget...
48
- if (this.formGroup.value.path == null) {
49
- this.formGroup.controls['source'].disable();
50
- if (this.formGroup.value.pathType == "number") {
51
- this.formGroup.controls['convertUnitTo'].disable();
52
- }
53
- }
54
- //populate available paths
55
- this.getPaths(this.filterSelfPaths);
56
-
57
- //populate sources and units for this path (or just the current or default setting if we know nothing about the path)
58
- this.updateSourcesAndUnits();
59
-
60
- // autocomplete filtering
61
- this.filteredPaths = this.formGroup.controls['path'].valueChanges.pipe(startWith(''), map(value => this.filterPaths(value)))
62
-
63
-
64
-
65
- //subscribe to path formControl changes
66
- this.formGroup.controls['path'].valueChanges.subscribe(pathValue => {
67
-
68
- this.updateSourcesAndUnits();
69
- try {
70
- if (this.formGroup.controls['path'].valid) {
71
- this.formGroup.controls['source'].enable();
72
- this.formGroup.controls['source'].patchValue('default');
73
- this.formGroup.controls['convertUnitTo'].enable();
74
- this.formGroup.controls['convertUnitTo'].patchValue(this.unitList.default);
75
- } else {
76
- this.formGroup.controls['source'].disable();
77
- this.formGroup.controls['convertUnitTo'].disable();
78
- }
79
- } catch (error) {
80
- console.debug(error);
81
- }
82
- });
83
-
84
- }
85
-
86
- ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
87
- //subscribe to filterSelfPaths formControl changes
88
- if (changes['filterSelfPaths'] && !changes['filterSelfPaths'].firstChange) {
89
- this.getPaths(this.filterSelfPaths);
90
- this.formGroup.controls['path'].patchValue("");
91
- }
92
- }
93
-
94
- getPaths(isOnlySef: boolean) {
95
- this.availablePaths = this.signalKService.getPathsAndMetaByType(this.formGroup.value.pathType, isOnlySef).sort();
96
- // path validator (must be path in available) Need to reset validators when paths change
97
- this.formGroup.controls['path'].setValidators([Validators.required]); //, this.requirePathMatch(this.availablePaths)]); // allow non-existing paths, maybe new path?
98
- }
99
-
100
- filterPaths( value: string ): IPathAndMetaObjects[] {
101
- const filterValue = value.toLowerCase();
102
- return this.availablePaths.filter(pathAndMetaObj => pathAndMetaObj.path.toLowerCase().includes(filterValue)).slice(0,50);
103
- }
104
-
105
-
106
-
107
- updateSourcesAndUnits() {
108
- if (this.formGroup.controls['path'].value == undefined || this.formGroup.controls['path'].value == null || this.formGroup.controls['path'].value == "") {
109
- if (this.formGroup.value.source == undefined || this.formGroup.value.source == null || this.formGroup.value.source == "") {
110
- this.availableSources = ['default'];
111
- } else {
112
- this.availableSources = ['default'].concat([this.formGroup.value.source]);
113
- }
114
- } else {
115
- let pathObject = this.signalKService.getPathObject(this.formGroup.controls['path'].value);
116
- if (pathObject != null) {
117
- this.availableSources = ['default'].concat(Object.keys(pathObject.sources));
118
- } else {
119
- // the path cannot be found. It's probably coming from default fixed Widget config, or user changed server URL or SignalK server config. We need to disable the fields.
120
- try {
121
- this.formGroup.controls['source'].disable();
122
- this.formGroup.controls['convertUnitTo'].disable();
123
- } catch (error) {
124
- console.debug(error);
125
- }
126
-
127
- }
128
- }
129
- this.unitList = this.signalKService.getConversionsForPath(this.formGroup.controls['path'].value); // array of Group or Groups: "angle", "speed", etc...
130
- }
131
-
132
- }
1
+ import { Component, Input, OnInit, OnChanges, SimpleChange } from '@angular/core';
2
+ import { SignalKService } from '../signalk.service';
3
+ import { IPathAndMetaObjects } from "../signalk-interfaces";
4
+ import { UnitsService, IUnitGroup } from '../units.service';
5
+ import { FormGroup, FormControl,Validators } from '@angular/forms';
6
+ import { map, startWith } from 'rxjs/operators';
7
+ import { Observable } from 'rxjs'
8
+
9
+
10
+ @Component({
11
+ selector: 'modal-path-selector',
12
+ templateUrl: './modal-path-selector.component.html',
13
+ styleUrls: ['./modal-path-selector.component.scss']
14
+ })
15
+ export class ModalPathSelectorComponent implements OnInit, OnChanges {
16
+ //path control
17
+ @Input() formGroup: FormGroup;
18
+ @Input() filterSelfPaths: boolean;
19
+ availablePaths: IPathAndMetaObjects[];
20
+ filteredPaths: Observable<IPathAndMetaObjects[]> = new Observable;
21
+
22
+ //source control
23
+ availableSources: Array<string>;
24
+
25
+ //unit control
26
+ unitList: {default?: string, conversions?: IUnitGroup[] };
27
+ default: string;
28
+
29
+ ////require-match validation for path
30
+ requirePathMatch = (allPathsAndMeta: IPathAndMetaObjects[]) => {
31
+ return (control: FormControl) => {
32
+ const selection: any = control.value;
33
+ if (allPathsAndMeta.some(pm => pm.path === selection)) {
34
+ return null;
35
+ }
36
+ return { requireMatch: true };
37
+ }
38
+ }
39
+
40
+ constructor(
41
+ private signalKService: SignalKService,
42
+ private unitsService: UnitsService
43
+ ) { }
44
+
45
+ ngOnInit() {
46
+ this.unitList = {};
47
+ //disable formControl if path is empty - a new, not configured widget...
48
+ if (this.formGroup.value.path == null) {
49
+ this.formGroup.controls['source'].disable();
50
+ if (this.formGroup.value.pathType == "number") {
51
+ this.formGroup.controls['convertUnitTo'].disable();
52
+ }
53
+ }
54
+ //populate available paths
55
+ this.getPaths(this.filterSelfPaths);
56
+
57
+ //populate sources and units for this path (or just the current or default setting if we know nothing about the path)
58
+ this.updateSourcesAndUnits();
59
+
60
+ // autocomplete filtering
61
+ this.filteredPaths = this.formGroup.controls['path'].valueChanges.pipe(startWith(''), map(value => this.filterPaths(value)))
62
+
63
+
64
+
65
+ //subscribe to path formControl changes
66
+ this.formGroup.controls['path'].valueChanges.subscribe(pathValue => {
67
+
68
+ this.updateSourcesAndUnits();
69
+ try {
70
+ if (this.formGroup.controls['path'].valid) {
71
+ this.formGroup.controls['source'].enable();
72
+ this.formGroup.controls['source'].patchValue('default');
73
+ this.formGroup.controls['convertUnitTo'].enable();
74
+ this.formGroup.controls['convertUnitTo'].patchValue(this.unitList.default);
75
+ } else {
76
+ this.formGroup.controls['source'].disable();
77
+ this.formGroup.controls['convertUnitTo'].disable();
78
+ }
79
+ } catch (error) {
80
+ console.debug(error);
81
+ }
82
+ });
83
+
84
+ }
85
+
86
+ ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
87
+ //subscribe to filterSelfPaths formControl changes
88
+ if (changes['filterSelfPaths'] && !changes['filterSelfPaths'].firstChange) {
89
+ this.getPaths(this.filterSelfPaths);
90
+ this.formGroup.controls['path'].patchValue("");
91
+ }
92
+ }
93
+
94
+ getPaths(isOnlySef: boolean) {
95
+ this.availablePaths = this.signalKService.getPathsAndMetaByType(this.formGroup.value.pathType, isOnlySef).sort();
96
+ // path validator (must be path in available) Need to reset validators when paths change
97
+ this.formGroup.controls['path'].setValidators([Validators.required]); //, this.requirePathMatch(this.availablePaths)]); // allow non-existing paths, maybe new path?
98
+ }
99
+
100
+ filterPaths( value: string ): IPathAndMetaObjects[] {
101
+ const filterValue = value.toLowerCase();
102
+ return this.availablePaths.filter(pathAndMetaObj => pathAndMetaObj.path.toLowerCase().includes(filterValue)).slice(0,50);
103
+ }
104
+
105
+
106
+
107
+ updateSourcesAndUnits() {
108
+ if (this.formGroup.controls['path'].value == undefined || this.formGroup.controls['path'].value == null || this.formGroup.controls['path'].value == "") {
109
+ if (this.formGroup.value.source == undefined || this.formGroup.value.source == null || this.formGroup.value.source == "") {
110
+ this.availableSources = ['default'];
111
+ } else {
112
+ this.availableSources = ['default'].concat([this.formGroup.value.source]);
113
+ }
114
+ } else {
115
+ let pathObject = this.signalKService.getPathObject(this.formGroup.controls['path'].value);
116
+ if (pathObject != null) {
117
+ this.availableSources = ['default'].concat(Object.keys(pathObject.sources));
118
+ } else {
119
+ // the path cannot be found. It's probably coming from default fixed Widget config, or user changed server URL or SignalK server config. We need to disable the fields.
120
+ try {
121
+ this.formGroup.controls['source'].disable();
122
+ this.formGroup.controls['convertUnitTo'].disable();
123
+ } catch (error) {
124
+ console.debug(error);
125
+ }
126
+
127
+ }
128
+ }
129
+ this.unitList = this.signalKService.getConversionsForPath(this.formGroup.controls['path'].value); // array of Group or Groups: "angle", "speed", etc...
130
+ }
131
+
132
+ }
@@ -1,33 +1,33 @@
1
- .warning {
2
- color: red;
3
- }
4
-
5
- .full-width {
6
- width: 100%;
7
- }
8
- .half-width {
9
- width: 49%;
10
- }
11
- .mat-radio-button ~ .mat-radio-button {
12
- margin-left: 16px;
13
- }
14
-
15
- .minField {
16
- display: inline-block;
17
- width: calc(50% - 15px);
18
- padding-right: 30px;
19
- }
20
-
21
- .maxField {
22
- display: inline-block;
23
- width: calc(50% - 15px);
24
- }
25
-
26
- .radio-group {
27
- display: flex;
28
- flex-direction: column;
29
- margin: 15px 0;
30
- }
31
- .radio-button {
32
- margin-left: 16px;
1
+ .warning {
2
+ color: red;
3
+ }
4
+
5
+ .full-width {
6
+ width: 100%;
7
+ }
8
+ .half-width {
9
+ width: 49%;
10
+ }
11
+ .mat-radio-button ~ .mat-radio-button {
12
+ margin-left: 16px;
13
+ }
14
+
15
+ .minField {
16
+ display: inline-block;
17
+ width: calc(50% - 15px);
18
+ padding-right: 30px;
19
+ }
20
+
21
+ .maxField {
22
+ display: inline-block;
23
+ width: calc(50% - 15px);
24
+ }
25
+
26
+ .radio-group {
27
+ display: flex;
28
+ flex-direction: column;
29
+ margin: 15px 0;
30
+ }
31
+ .radio-button {
32
+ margin-left: 16px;
33
33
  }