@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,55 +1,55 @@
1
- <button [matMenuTriggerFor]="alarmMenu" color="accent" mat-flat-button class="menuBarAlarmsButton"
2
- [class.alarmCrit]="blinkCrit"
3
- [class.alarmWarning]="blinkWarn"
4
- [disabled]="alarmCount == 0 || notificationConfig.disableNotifications">
5
- <span *ngIf="!notificationConfig.disableNotifications" [matBadgeHidden]="!unAckAlarms"
6
- [matBadge]="unAckAlarms"
7
- matBadgeSize="medium"
8
- matBadgePosition="after"
9
- matBadgeOverlap="false"
10
- matBadgeColor="warn"
11
- class="fa fa-envelope fa-2x matBadge">
12
- </span>
13
- <span *ngIf="notificationConfig.disableNotifications" class="fa-stack fa-lg">
14
- <i class="fa fa-bell fa-1x" aria-hidden="true"></i>
15
- <i class="fa fa-ban fa-stack-2x text-danger" aria-hidden="true"></i>
16
- </span>
17
- </button>
18
- <mat-menu #alarmMenu="matMenu" focusFirstItem>
19
- <div *ngFor="let alarm of alarms | keyvalue; index as i; trackBy:trackAlarmPath">
20
- <button mat-menu-item [matMenuTriggerFor]="actions" [matTooltip]="alarm.value.notification.message">
21
- <span *ngIf="alarm.value.isAck" class="fa fa-lg fa-check"></span>
22
- <span *ngIf="!alarm.value.isAck" class="fa fa-lg fa-exclamation"></span>
23
- {{ alarm.value.notification.message.replace("self.", "") }}
24
- </button>
25
- <mat-menu #actions="matMenu">
26
- <button
27
- mat-menu-item
28
- (click)="ackAlarm(alarm.key)"
29
-
30
- matTooltip="Silence Alarm (until state change)"
31
- >
32
- Acknowledge
33
- </button>
34
- <button
35
- mat-menu-item
36
- (click)="ackAlarm(alarm.key, 300000)"
37
-
38
- matTooltip="Silence Alarm for 5 minutes(state change can re-trigger)"
39
- >
40
- Acknowledge (5 Min)
41
- </button>
42
- </mat-menu>
43
- </div>
44
- <mat-action-list>
45
- <mat-divider></mat-divider>
46
- <button mat-list-item class="muteSoundButton" matTooltip="Mute notification sounds" (click)="mutePlayer(isMuted ? false : true)">
47
- <span *ngIf="!isMuted">
48
- <i class="fa fa-bell" aria-hidden="true"></i> Mute Alarm Audio
49
- </span>
50
- <span *ngIf="isMuted">
51
- <i class="fa fa-bell-slash" aria-hidden="true"></i> Unmute Alarm Audio
52
- </span>
53
- </button>
54
- </mat-action-list>
55
- </mat-menu>
1
+ <button [matMenuTriggerFor]="alarmMenu" color="accent" mat-flat-button class="menuBarAlarmsButton"
2
+ [class.alarmCrit]="blinkCrit"
3
+ [class.alarmWarning]="blinkWarn"
4
+ [disabled]="alarmCount == 0 || notificationConfig.disableNotifications">
5
+ <span *ngIf="!notificationConfig.disableNotifications" [matBadgeHidden]="!unAckAlarms"
6
+ [matBadge]="unAckAlarms"
7
+ matBadgeSize="medium"
8
+ matBadgePosition="after"
9
+ matBadgeOverlap="false"
10
+ matBadgeColor="warn"
11
+ class="fa-solid fa-envelope fa-2x matBadge">
12
+ </span>
13
+ <span *ngIf="notificationConfig.disableNotifications" class="fa-stack fa-lg">
14
+ <i class="fa-solid fa-bell fa-1x" aria-hidden="true"></i>
15
+ <i class="fa-solid fa-ban fa-stack-2x text-danger" aria-hidden="true"></i>
16
+ </span>
17
+ </button>
18
+ <mat-menu #alarmMenu="matMenu" focusFirstItem>
19
+ <div *ngFor="let alarm of alarms | keyvalue; index as i; trackBy:trackAlarmPath">
20
+ <button mat-menu-item [matMenuTriggerFor]="actions" [matTooltip]="alarm.value.notification.message">
21
+ <span *ngIf="alarm.value.isAck" class="fa-solid fa-lg fa-check"></span>
22
+ <span *ngIf="!alarm.value.isAck" class="fa-solid fa-lg fa-exclamation"></span>
23
+ {{ alarm.value.notification.message.replace("self.", "") }}
24
+ </button>
25
+ <mat-menu #actions="matMenu">
26
+ <button
27
+ mat-menu-item
28
+ (click)="ackAlarm(alarm.key)"
29
+
30
+ matTooltip="Silence Alarm (until state change)"
31
+ >
32
+ Acknowledge
33
+ </button>
34
+ <button
35
+ mat-menu-item
36
+ (click)="ackAlarm(alarm.key, 300000)"
37
+
38
+ matTooltip="Silence Alarm for 5 minutes(state change can re-trigger)"
39
+ >
40
+ Acknowledge (5 Min)
41
+ </button>
42
+ </mat-menu>
43
+ </div>
44
+ <mat-action-list>
45
+ <mat-divider></mat-divider>
46
+ <button mat-list-item class="muteSoundButton" matTooltip="Mute notification sounds" (click)="mutePlayer(isMuted ? false : true)">
47
+ <span *ngIf="!isMuted">
48
+ <i class="fa-solid fa-bell" aria-hidden="true"></i> Mute Alarm Audio
49
+ </span>
50
+ <span *ngIf="isMuted">
51
+ <i class="fa-solid fa-bell-slash" aria-hidden="true"></i> Unmute Alarm Audio
52
+ </span>
53
+ </button>
54
+ </mat-action-list>
55
+ </mat-menu>
@@ -1,53 +1,52 @@
1
- @import '~@angular/material/theming';
2
-
3
-
4
- @mixin alarm-menu-theme($theme) {
5
-
6
- $primary: map-get($theme, primary);
7
- $warn: map-get($theme, warn);
8
- $background: map-get($theme, background);
9
- $foreground: map-get($theme, foreground);
10
-
11
- .matBadge {
12
- z-index: 1000;
13
- }
14
-
15
- // Alarm button when warning
16
- .alarmWarning {
17
- animation:blinkingAlarmWarning 1.5s infinite;
18
- background-color: #FFA500 !important
19
- }
20
- @keyframes blinkingAlarmWarning{
21
- 0%{ color: rgb(179, 0, 0); }
22
- 50%{ color: transparent; }
23
- 100%{ color: rgb(179, 0, 0); }
24
- }
25
- // Alarm button when crit
26
- .alarmCrit {
27
- animation:blinkingAlarmCrit 0.25s infinite;
28
-
29
- }
30
- @keyframes blinkingAlarmCrit{
31
- 0%{
32
- color: rgb(255, 232, 232);
33
- background-color: rgb(179, 0, 0);
34
- }
35
- 50%{
36
-
37
- color: rgb(179, 0, 0);
38
- background-color: rgb(255, 232, 232);
39
- }
40
- 100%{
41
- color: rgb(255, 232, 232);
42
- background-color: rgb(179, 0, 0);
43
- }
44
- }
45
- .muteSoundButton:hover {
46
- background: rgba(255, 255, 255, 0.04); // mat-list hover bug fixed in recent versions.
47
- }
48
-
49
- }
50
-
51
- ::ng-deep.mat-menu-panel {
52
- max-width:fit-content !important;
53
- }
1
+ @use '~@angular/material' as mat;
2
+
3
+ @mixin alarm-menu-theme($theme) {
4
+
5
+ $primary: map-get($theme, primary);
6
+ $warn: map-get($theme, warn);
7
+ $background: map-get($theme, background);
8
+ $foreground: map-get($theme, foreground);
9
+
10
+ .matBadge {
11
+ z-index: 1000;
12
+ }
13
+
14
+ // Alarm button when warning
15
+ .alarmWarning {
16
+ animation:blinkingAlarmWarning 1.5s infinite;
17
+ background-color: #FFA500 !important
18
+ }
19
+ @keyframes blinkingAlarmWarning{
20
+ 0%{ color: rgb(179, 0, 0); }
21
+ 50%{ color: transparent; }
22
+ 100%{ color: rgb(179, 0, 0); }
23
+ }
24
+ // Alarm button when crit
25
+ .alarmCrit {
26
+ animation:blinkingAlarmCrit 0.25s infinite;
27
+
28
+ }
29
+ @keyframes blinkingAlarmCrit{
30
+ 0%{
31
+ color: rgb(255, 232, 232);
32
+ background-color: rgb(179, 0, 0);
33
+ }
34
+ 50%{
35
+
36
+ color: rgb(179, 0, 0);
37
+ background-color: rgb(255, 232, 232);
38
+ }
39
+ 100%{
40
+ color: rgb(255, 232, 232);
41
+ background-color: rgb(179, 0, 0);
42
+ }
43
+ }
44
+ .muteSoundButton:hover {
45
+ background: rgba(255, 255, 255, 0.04); // mat-list hover bug fixed in recent versions.
46
+ }
47
+
48
+ }
49
+
50
+ ::ng-deep.mat-menu-panel {
51
+ max-width:fit-content !important;
52
+ }
@@ -1,25 +1,25 @@
1
- import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
2
-
3
- import { AlarmMenuComponent } from './alarm-menu.component';
4
-
5
- describe('AlarmMenuComponent', () => {
6
- let component: AlarmMenuComponent;
7
- let fixture: ComponentFixture<AlarmMenuComponent>;
8
-
9
- beforeEach(waitForAsync(() => {
10
- TestBed.configureTestingModule({
11
- declarations: [ AlarmMenuComponent ]
12
- })
13
- .compileComponents();
14
- }));
15
-
16
- beforeEach(() => {
17
- fixture = TestBed.createComponent(AlarmMenuComponent);
18
- component = fixture.componentInstance;
19
- fixture.detectChanges();
20
- });
21
-
22
- it('should create', () => {
23
- expect(component).toBeTruthy();
24
- });
25
- });
1
+ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
2
+
3
+ import { AlarmMenuComponent } from './alarm-menu.component';
4
+
5
+ describe('AlarmMenuComponent', () => {
6
+ let component: AlarmMenuComponent;
7
+ let fixture: ComponentFixture<AlarmMenuComponent>;
8
+
9
+ beforeEach(waitForAsync(() => {
10
+ TestBed.configureTestingModule({
11
+ declarations: [ AlarmMenuComponent ]
12
+ })
13
+ .compileComponents();
14
+ }));
15
+
16
+ beforeEach(() => {
17
+ fixture = TestBed.createComponent(AlarmMenuComponent);
18
+ component = fixture.componentInstance;
19
+ fixture.detectChanges();
20
+ });
21
+
22
+ it('should create', () => {
23
+ expect(component).toBeTruthy();
24
+ });
25
+ });
@@ -1,186 +1,186 @@
1
- import { Component, OnInit, OnDestroy } from '@angular/core';
2
- import { NotificationsService, Alarm, IAlarmInfo } from '../notifications.service';
3
- import { AppSettingsService, INotificationConfig } from '../app-settings.service';
4
- import { Subscription } from 'rxjs';
5
-
6
-
7
-
8
- interface IMenuNode {
9
- [key: string]: any;
10
- label: string;
11
- childNode?: [IMenuItem | IMenuNode];
12
- }
13
- interface IMenuItem {
14
- [key: string]: any;
15
- label: string;
16
- Alarm?: Alarm;
17
- }
18
-
19
-
20
- @Component({
21
- selector: 'app-alarm-menu',
22
- templateUrl: './alarm-menu.component.html',
23
- styleUrls: ['./alarm-menu.component.scss']
24
- })
25
- export class AlarmMenuComponent implements OnInit, OnDestroy {
26
-
27
- private alarmSub: Subscription;
28
- private notificationServiceSettings: Subscription;
29
-
30
- alarms: { [path: string]: Alarm };
31
- notificationAlarms: { [path: string]: Alarm };
32
- alarmMenu: { [key: string]: string | IMenuItem | IMenuItem } = {}; // local menu array with string key
33
-
34
- // Menu properties
35
- alarmCount: number = 0;
36
- unAckAlarms: number = 0;
37
- blinkWarn: boolean = false;
38
- blinkCrit: boolean = false;
39
-
40
- isMuted: boolean = false;
41
-
42
- notificationConfig: INotificationConfig;
43
-
44
- constructor(
45
- private notificationsService: NotificationsService,
46
- private appSettingsService: AppSettingsService,
47
- ) {
48
- this.notificationServiceSettings = appSettingsService.getNotificationConfigService().subscribe(config => {
49
- this.notificationConfig = config;
50
- });
51
- }
52
-
53
- ngOnInit() {
54
- // init Alarm stream
55
- this.alarmSub = this.notificationsService.getAlarms().subscribe(
56
- message => {
57
- this.notificationAlarms = message;
58
- // Disabling notifications is done at the service level. No need to handle it here
59
- this.buildAlarmMenu();
60
- }
61
- );
62
-
63
- // init alarm info
64
- this.notificationsService.getAlarmInfoAsO().subscribe(info => {
65
- this.unAckAlarms = info.unackCount;
66
- this.isMuted = info.isMuted;
67
- this.alarmCount = info.alarmCount;
68
- switch(info.visualSev) {
69
- case 0:
70
- this.blinkWarn = false;
71
- this.blinkCrit = false;
72
- break;
73
- case 1:
74
- this.blinkWarn = true;
75
- this.blinkCrit = false;
76
- break;
77
- case 2:
78
- this.blinkCrit = true;
79
- this.blinkWarn = false;
80
- }
81
- });
82
- }
83
-
84
- mutePlayer(state) {
85
- this.notificationsService.mutePlayer(state);
86
- }
87
-
88
- // we use this as a staging area to limit menu update events we build the menu from Alarms record
89
- buildAlarmMenu() {
90
- // clean notificationAlarms based on App Notification settings
91
- if (!this.notificationConfig.devices.showNormalState) {
92
- for (const [path, thealarm] of Object.entries(this.notificationAlarms)) {
93
- let alarm = this.notificationAlarms[path];
94
-
95
- if (alarm.notification['state'] == 'normal' && alarm['type'] == 'device') {
96
- delete this.notificationAlarms[path];
97
- break;
98
- }
99
- }
100
- }
101
- this.alarms = this.notificationAlarms;
102
- }
103
-
104
- createMenuRootItem(itemLabel: string): IMenuNode | null {
105
- let item: IMenuNode = {
106
- label: itemLabel
107
- }
108
-
109
- if(Object.entries(this.alarmMenu).length) {
110
- let i = Object.keys(this.alarmMenu).indexOf(itemLabel);
111
- if(i == -1) {
112
- console.log("Root: " + itemLabel + " not found. Search index: " + i);
113
- return item;
114
- } else {
115
- console.log("Root: " + itemLabel + " found. Search index: " + i);
116
- console.log(JSON.stringify(Object.values(this.alarmMenu)));
117
- return null;
118
- }
119
- }
120
- console.log(JSON.stringify(Object.values(this.alarmMenu)));
121
- return item;
122
- }
123
-
124
- createMenuChildItem(itemLabel: string, pathPositionIndex: number, pathArray: string[], alarm: Alarm): IMenuItem | IMenuNode {
125
- let item;
126
-
127
- const lastPosition = pathArray.length - 1;
128
- let parentLabel = pathArray[pathPositionIndex - 1];
129
- let indexParentNode = Object.keys(this.alarmMenu).indexOf(pathArray[parentLabel]);
130
-
131
- if (pathPositionIndex != lastPosition) {
132
- item = {
133
- label: pathArray[pathPositionIndex],
134
- }
135
- } else {
136
- item = {
137
- label: pathArray[pathPositionIndex],
138
- Alarm: alarm,
139
- }
140
- }
141
-
142
- for (const [label, menuNode] of Object.entries(this.alarmMenu)) {
143
- if (label == parentLabel) {
144
- console.log(JSON.stringify(menuNode));
145
- menuNode['childNode'] = item;
146
-
147
- if (pathPositionIndex != lastPosition) {
148
- pathPositionIndex++;
149
- if (pathPositionIndex != (lastPosition)) {
150
- item = {
151
- label: pathArray[pathPositionIndex]
152
- }
153
- } else {
154
- item = {
155
- label: pathArray[pathPositionIndex],
156
- Alarm: alarm,
157
- }
158
- }
159
- menuNode['childNode'][0].childNode = item;
160
- }
161
- }
162
- }
163
-
164
- return null;
165
- }
166
-
167
-
168
- ackAlarm(path: string, timeout: number = 0) {
169
- this.notificationsService.acknowledgeAlarm(path, timeout);
170
- }
171
-
172
-
173
- /**
174
- * Used by ngFor to tracks alarm items by key for menu optimization
175
- * @param alarm object in question
176
- */
177
- trackAlarmPath(index, alarm) {
178
- return alarm ? alarm.value.path : undefined;
179
- }
180
-
181
- ngOnDestroy() {
182
- this.notificationServiceSettings.unsubscribe();
183
- this.alarmSub.unsubscribe();
184
- }
185
-
186
- }
1
+ import { Component, OnInit, OnDestroy } from '@angular/core';
2
+ import { NotificationsService, Alarm, IAlarmInfo } from '../notifications.service';
3
+ import { AppSettingsService, INotificationConfig } from '../app-settings.service';
4
+ import { Subscription } from 'rxjs';
5
+
6
+
7
+
8
+ interface IMenuNode {
9
+ [key: string]: any;
10
+ label: string;
11
+ childNode?: [IMenuItem | IMenuNode];
12
+ }
13
+ interface IMenuItem {
14
+ [key: string]: any;
15
+ label: string;
16
+ Alarm?: Alarm;
17
+ }
18
+
19
+
20
+ @Component({
21
+ selector: 'app-alarm-menu',
22
+ templateUrl: './alarm-menu.component.html',
23
+ styleUrls: ['./alarm-menu.component.scss']
24
+ })
25
+ export class AlarmMenuComponent implements OnInit, OnDestroy {
26
+
27
+ private alarmSub: Subscription;
28
+ private notificationServiceSettings: Subscription;
29
+
30
+ alarms: { [path: string]: Alarm };
31
+ notificationAlarms: { [path: string]: Alarm };
32
+ alarmMenu: { [key: string]: string | IMenuItem | IMenuItem } = {}; // local menu array with string key
33
+
34
+ // Menu properties
35
+ alarmCount: number = 0;
36
+ unAckAlarms: number = 0;
37
+ blinkWarn: boolean = false;
38
+ blinkCrit: boolean = false;
39
+
40
+ isMuted: boolean = false;
41
+
42
+ notificationConfig: INotificationConfig;
43
+
44
+ constructor(
45
+ private notificationsService: NotificationsService,
46
+ private appSettingsService: AppSettingsService,
47
+ ) {
48
+ this.notificationServiceSettings = appSettingsService.getNotificationConfigService().subscribe(config => {
49
+ this.notificationConfig = config;
50
+ });
51
+ }
52
+
53
+ ngOnInit() {
54
+ // init Alarm stream
55
+ this.alarmSub = this.notificationsService.getAlarms().subscribe(
56
+ message => {
57
+ this.notificationAlarms = message;
58
+ // Disabling notifications is done at the service level. No need to handle it here
59
+ this.buildAlarmMenu();
60
+ }
61
+ );
62
+
63
+ // init alarm info
64
+ this.notificationsService.getAlarmInfoAsO().subscribe(info => {
65
+ this.unAckAlarms = info.unackCount;
66
+ this.isMuted = info.isMuted;
67
+ this.alarmCount = info.alarmCount;
68
+ switch(info.visualSev) {
69
+ case 0:
70
+ this.blinkWarn = false;
71
+ this.blinkCrit = false;
72
+ break;
73
+ case 1:
74
+ this.blinkWarn = true;
75
+ this.blinkCrit = false;
76
+ break;
77
+ case 2:
78
+ this.blinkCrit = true;
79
+ this.blinkWarn = false;
80
+ }
81
+ });
82
+ }
83
+
84
+ mutePlayer(state) {
85
+ this.notificationsService.mutePlayer(state);
86
+ }
87
+
88
+ // we use this as a staging area to limit menu update events we build the menu from Alarms record
89
+ buildAlarmMenu() {
90
+ // clean notificationAlarms based on App Notification settings
91
+ if (!this.notificationConfig.devices.showNormalState) {
92
+ for (const [path, thealarm] of Object.entries(this.notificationAlarms)) {
93
+ let alarm = this.notificationAlarms[path];
94
+
95
+ if (alarm.notification['state'] == 'normal' && alarm['type'] == 'device') {
96
+ delete this.notificationAlarms[path];
97
+ break;
98
+ }
99
+ }
100
+ }
101
+ this.alarms = this.notificationAlarms;
102
+ }
103
+
104
+ createMenuRootItem(itemLabel: string): IMenuNode | null {
105
+ let item: IMenuNode = {
106
+ label: itemLabel
107
+ }
108
+
109
+ if(Object.entries(this.alarmMenu).length) {
110
+ let i = Object.keys(this.alarmMenu).indexOf(itemLabel);
111
+ if(i == -1) {
112
+ console.log("Root: " + itemLabel + " not found. Search index: " + i);
113
+ return item;
114
+ } else {
115
+ console.log("Root: " + itemLabel + " found. Search index: " + i);
116
+ console.log(JSON.stringify(Object.values(this.alarmMenu)));
117
+ return null;
118
+ }
119
+ }
120
+ console.log(JSON.stringify(Object.values(this.alarmMenu)));
121
+ return item;
122
+ }
123
+
124
+ createMenuChildItem(itemLabel: string, pathPositionIndex: number, pathArray: string[], alarm: Alarm): IMenuItem | IMenuNode {
125
+ let item;
126
+
127
+ const lastPosition = pathArray.length - 1;
128
+ let parentLabel = pathArray[pathPositionIndex - 1];
129
+ let indexParentNode = Object.keys(this.alarmMenu).indexOf(pathArray[parentLabel]);
130
+
131
+ if (pathPositionIndex != lastPosition) {
132
+ item = {
133
+ label: pathArray[pathPositionIndex],
134
+ }
135
+ } else {
136
+ item = {
137
+ label: pathArray[pathPositionIndex],
138
+ Alarm: alarm,
139
+ }
140
+ }
141
+
142
+ for (const [label, menuNode] of Object.entries(this.alarmMenu)) {
143
+ if (label == parentLabel) {
144
+ console.log(JSON.stringify(menuNode));
145
+ menuNode['childNode'] = item;
146
+
147
+ if (pathPositionIndex != lastPosition) {
148
+ pathPositionIndex++;
149
+ if (pathPositionIndex != (lastPosition)) {
150
+ item = {
151
+ label: pathArray[pathPositionIndex]
152
+ }
153
+ } else {
154
+ item = {
155
+ label: pathArray[pathPositionIndex],
156
+ Alarm: alarm,
157
+ }
158
+ }
159
+ menuNode['childNode'][0].childNode = item;
160
+ }
161
+ }
162
+ }
163
+
164
+ return null;
165
+ }
166
+
167
+
168
+ ackAlarm(path: string, timeout: number = 0) {
169
+ this.notificationsService.acknowledgeAlarm(path, timeout);
170
+ }
171
+
172
+
173
+ /**
174
+ * Used by ngFor to tracks alarm items by key for menu optimization
175
+ * @param alarm object in question
176
+ */
177
+ trackAlarmPath(index, alarm) {
178
+ return alarm ? alarm.value.path : undefined;
179
+ }
180
+
181
+ ngOnDestroy() {
182
+ this.notificationServiceSettings.unsubscribe();
183
+ this.alarmSub.unsubscribe();
184
+ }
185
+
186
+ }
@@ -1,4 +1,4 @@
1
- .tabGroup {
2
- display: block;
3
- padding: 3px;
4
- }
1
+ .tabGroup {
2
+ display: block;
3
+ padding: 3px;
4
+ }