@openc3/vue-common 7.0.0 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ArrayWidget-BsAUsmBz.cjs → ArrayWidget-BHjh3qLF.cjs} +2 -2
- package/dist/{ArrayWidget-BsAUsmBz.cjs.map → ArrayWidget-BHjh3qLF.cjs.map} +1 -1
- package/dist/{ArrayWidget-D2UrA5Db.js → ArrayWidget-Dh6zDiC7.js} +6 -6
- package/dist/{ArrayWidget-D2UrA5Db.js.map → ArrayWidget-Dh6zDiC7.js.map} +1 -1
- package/dist/{ArrayplotWidget-ChHMy5_L.cjs → ArrayplotWidget-BHD-TGQO.cjs} +2 -2
- package/dist/{ArrayplotWidget-ChHMy5_L.cjs.map → ArrayplotWidget-BHD-TGQO.cjs.map} +1 -1
- package/dist/{ArrayplotWidget-CDNRxI2F.js → ArrayplotWidget-CSc_TqNm.js} +6 -6
- package/dist/{ArrayplotWidget-CDNRxI2F.js.map → ArrayplotWidget-CSc_TqNm.js.map} +1 -1
- package/dist/{BarColumn-nSFR2LZF.js → BarColumn-DmjMnw5l.js} +3 -3
- package/dist/{BarColumn-nSFR2LZF.js.map → BarColumn-DmjMnw5l.js.map} +1 -1
- package/dist/{BarColumn-e-sSkSvE.cjs → BarColumn-Ym4P8YHC.cjs} +2 -2
- package/dist/{BarColumn-e-sSkSvE.cjs.map → BarColumn-Ym4P8YHC.cjs.map} +1 -1
- package/dist/{BlockWidget-C-WB0Q2m.js → BlockWidget-BdR_HCVc.js} +6 -6
- package/dist/{BlockWidget-C-WB0Q2m.js.map → BlockWidget-BdR_HCVc.js.map} +1 -1
- package/dist/{BlockWidget-DJpyQiec.cjs → BlockWidget-Bi1PfS1k.cjs} +2 -2
- package/dist/{BlockWidget-DJpyQiec.cjs.map → BlockWidget-Bi1PfS1k.cjs.map} +1 -1
- package/dist/{ButtonWidget-rkOE5b8G.cjs → ButtonWidget-70hNWuEy.cjs} +2 -2
- package/dist/{ButtonWidget-rkOE5b8G.cjs.map → ButtonWidget-70hNWuEy.cjs.map} +1 -1
- package/dist/{ButtonWidget-rS7sVb7m.js → ButtonWidget-DZ4VCNWU.js} +6 -6
- package/dist/{ButtonWidget-rS7sVb7m.js.map → ButtonWidget-DZ4VCNWU.js.map} +1 -1
- package/dist/{CanvasWidget-Dv7_QUJY.cjs → CanvasWidget-DTEx-DpZ.cjs} +2 -2
- package/dist/{CanvasWidget-Dv7_QUJY.cjs.map → CanvasWidget-DTEx-DpZ.cjs.map} +1 -1
- package/dist/{CanvasWidget-DuWolVCW.js → CanvasWidget-DuXOo3jG.js} +4 -4
- package/dist/{CanvasWidget-DuWolVCW.js.map → CanvasWidget-DuXOo3jG.js.map} +1 -1
- package/dist/{CanvasdotWidget-B42YizA1.js → CanvasdotWidget-WoLpxI1u.js} +5 -5
- package/dist/{CanvasdotWidget-B42YizA1.js.map → CanvasdotWidget-WoLpxI1u.js.map} +1 -1
- package/dist/{CanvasdotWidget-E1OgFBVZ.cjs → CanvasdotWidget-bbOquK8B.cjs} +2 -2
- package/dist/{CanvasdotWidget-E1OgFBVZ.cjs.map → CanvasdotWidget-bbOquK8B.cjs.map} +1 -1
- package/dist/{CanvasimageWidget-ysw78z4C.cjs → CanvasimageWidget-D2EqsK7w.cjs} +2 -2
- package/dist/{CanvasimageWidget-ysw78z4C.cjs.map → CanvasimageWidget-D2EqsK7w.cjs.map} +1 -1
- package/dist/{CanvasimageWidget-DMHdDTSs.js → CanvasimageWidget-tWpK5rsv.js} +8 -8
- package/dist/{CanvasimageWidget-DMHdDTSs.js.map → CanvasimageWidget-tWpK5rsv.js.map} +1 -1
- package/dist/{CanvasimagevalueWidget-ns-5S1HA.js → CanvasimagevalueWidget-BVzJYz3l.js} +9 -9
- package/dist/{CanvasimagevalueWidget-ns-5S1HA.js.map → CanvasimagevalueWidget-BVzJYz3l.js.map} +1 -1
- package/dist/{CanvasimagevalueWidget-Bc-VYXe7.cjs → CanvasimagevalueWidget-By_DiQ75.cjs} +2 -2
- package/dist/{CanvasimagevalueWidget-Bc-VYXe7.cjs.map → CanvasimagevalueWidget-By_DiQ75.cjs.map} +1 -1
- package/dist/{CanvaslabelWidget-DElES3gU.js → CanvaslabelWidget-CDFf8Vll.js} +5 -5
- package/dist/{CanvaslabelWidget-DElES3gU.js.map → CanvaslabelWidget-CDFf8Vll.js.map} +1 -1
- package/dist/{CanvaslabelWidget-6h59qJY8.cjs → CanvaslabelWidget-DiPxyXoX.cjs} +2 -2
- package/dist/{CanvaslabelWidget-6h59qJY8.cjs.map → CanvaslabelWidget-DiPxyXoX.cjs.map} +1 -1
- package/dist/{CanvaslabelvalueWidget-BLIgF8xi.cjs → CanvaslabelvalueWidget-Cw5CCQTi.cjs} +2 -2
- package/dist/{CanvaslabelvalueWidget-BLIgF8xi.cjs.map → CanvaslabelvalueWidget-Cw5CCQTi.cjs.map} +1 -1
- package/dist/{CanvaslabelvalueWidget-B2B5KlUm.js → CanvaslabelvalueWidget-DzJKD6qs.js} +5 -5
- package/dist/{CanvaslabelvalueWidget-B2B5KlUm.js.map → CanvaslabelvalueWidget-DzJKD6qs.js.map} +1 -1
- package/dist/{CanvaslineWidget-CxZGCwVF.cjs → CanvaslineWidget-BECtKTPL.cjs} +2 -2
- package/dist/{CanvaslineWidget-CxZGCwVF.cjs.map → CanvaslineWidget-BECtKTPL.cjs.map} +1 -1
- package/dist/{CanvaslineWidget-DaHxgGyM.js → CanvaslineWidget-BttTXCZq.js} +5 -5
- package/dist/{CanvaslineWidget-DaHxgGyM.js.map → CanvaslineWidget-BttTXCZq.js.map} +1 -1
- package/dist/{CanvaslinevalueWidget-BljeuN4S.cjs → CanvaslinevalueWidget-5duJ98qu.cjs} +2 -2
- package/dist/{CanvaslinevalueWidget-BljeuN4S.cjs.map → CanvaslinevalueWidget-5duJ98qu.cjs.map} +1 -1
- package/dist/{CanvaslinevalueWidget-CrtDsSOP.js → CanvaslinevalueWidget-i6G0JfnZ.js} +5 -5
- package/dist/{CanvaslinevalueWidget-CrtDsSOP.js.map → CanvaslinevalueWidget-i6G0JfnZ.js.map} +1 -1
- package/dist/{CheckbuttonWidget-BK4SgIu7.js → CheckbuttonWidget-18jtf7sh.js} +5 -5
- package/dist/{CheckbuttonWidget-BK4SgIu7.js.map → CheckbuttonWidget-18jtf7sh.js.map} +1 -1
- package/dist/{CheckbuttonWidget-By46VH2e.cjs → CheckbuttonWidget-CTMObPhX.cjs} +2 -2
- package/dist/{CheckbuttonWidget-By46VH2e.cjs.map → CheckbuttonWidget-CTMObPhX.cjs.map} +1 -1
- package/dist/{ClassificationBanners-DGl2HUKd.js → ClassificationBanners-BmnQODLn.js} +2 -2
- package/dist/{ClassificationBanners-DGl2HUKd.js.map → ClassificationBanners-BmnQODLn.js.map} +1 -1
- package/dist/{ClassificationBanners-CHQX3t7t.cjs → ClassificationBanners-DjGCuH-4.cjs} +2 -2
- package/dist/{ClassificationBanners-CHQX3t7t.cjs.map → ClassificationBanners-DjGCuH-4.cjs.map} +1 -1
- package/dist/{ComboboxWidget-CciRWuKq.js → ComboboxWidget-BjaVFbD4.js} +5 -5
- package/dist/{ComboboxWidget-CciRWuKq.js.map → ComboboxWidget-BjaVFbD4.js.map} +1 -1
- package/dist/{ComboboxWidget-CHFTOmhZ.cjs → ComboboxWidget-Cc0Acq9q.cjs} +2 -2
- package/dist/{ComboboxWidget-CHFTOmhZ.cjs.map → ComboboxWidget-Cc0Acq9q.cjs.map} +1 -1
- package/dist/{CriticalCmdDialog-C5EZDRSZ.js → CriticalCmdDialog-CO-nvphS.js} +8 -8
- package/dist/{CriticalCmdDialog-C5EZDRSZ.js.map → CriticalCmdDialog-CO-nvphS.js.map} +1 -1
- package/dist/{CriticalCmdDialog-BWrwpTNK.cjs → CriticalCmdDialog-eytxCQto.cjs} +2 -2
- package/dist/{CriticalCmdDialog-BWrwpTNK.cjs.map → CriticalCmdDialog-eytxCQto.cjs.map} +1 -1
- package/dist/{CustomIcon-Cg3jCA_l.js → CustomIcon-DTR361si.js} +4 -4
- package/dist/{CustomIcon-Cg3jCA_l.js.map → CustomIcon-DTR361si.js.map} +1 -1
- package/dist/{DateWidget-Bb6juAYs.cjs → DateWidget-Cle8FY8Q.cjs} +2 -2
- package/dist/{DateWidget-Bb6juAYs.cjs.map → DateWidget-Cle8FY8Q.cjs.map} +1 -1
- package/dist/{DateWidget-DwgQ3Jik.js → DateWidget-DkFAFlc8.js} +5 -5
- package/dist/{DateWidget-DwgQ3Jik.js.map → DateWidget-DkFAFlc8.js.map} +1 -1
- package/dist/{DetailsDialog-D_my0nhs.cjs → DetailsDialog-BcMaTfuQ.cjs} +2 -2
- package/dist/{DetailsDialog-D_my0nhs.cjs.map → DetailsDialog-BcMaTfuQ.cjs.map} +1 -1
- package/dist/{DetailsDialog-CspQjoR5.js → DetailsDialog-sqja4Lzq.js} +5 -5
- package/dist/{DetailsDialog-CspQjoR5.js.map → DetailsDialog-sqja4Lzq.js.map} +1 -1
- package/dist/{DynamicWidget-Bym87woV.js → DynamicWidget-BuSbQVhf.js} +4 -4
- package/dist/{DynamicWidget-Bym87woV.js.map → DynamicWidget-BuSbQVhf.js.map} +1 -1
- package/dist/{EventListDialog-DL2HHNQG.js → EventListDialog-DjCQAwGl.js} +12 -12
- package/dist/{EventListDialog-DL2HHNQG.js.map → EventListDialog-DjCQAwGl.js.map} +1 -1
- package/dist/{EventListDialog-DO32zY2U.cjs → EventListDialog-EmC7YW60.cjs} +2 -2
- package/dist/{EventListDialog-DO32zY2U.cjs.map → EventListDialog-EmC7YW60.cjs.map} +1 -1
- package/dist/{FilechecksumWidget-DMpuLZJ5.cjs → FilechecksumWidget-2ta-UvLp.cjs} +2 -2
- package/dist/{FilechecksumWidget-DMpuLZJ5.cjs.map → FilechecksumWidget-2ta-UvLp.cjs.map} +1 -1
- package/dist/{FilechecksumWidget-BS281Q0h.js → FilechecksumWidget-DqJ_hvN4.js} +8 -8
- package/dist/{FilechecksumWidget-BS281Q0h.js.map → FilechecksumWidget-DqJ_hvN4.js.map} +1 -1
- package/dist/{FiledisplayWidget-BoD7LuLP.cjs → FiledisplayWidget-BUKXIQir.cjs} +2 -2
- package/dist/{FiledisplayWidget-BoD7LuLP.cjs.map → FiledisplayWidget-BUKXIQir.cjs.map} +1 -1
- package/dist/{FiledisplayWidget-C9YdXDdv.js → FiledisplayWidget-CYznG_tf.js} +6 -6
- package/dist/{FiledisplayWidget-C9YdXDdv.js.map → FiledisplayWidget-CYznG_tf.js.map} +1 -1
- package/dist/{FormatvalueWidget-dfmQfrNA.js → FormatvalueWidget-BnVu4YGx.js} +6 -6
- package/dist/{FormatvalueWidget-dfmQfrNA.js.map → FormatvalueWidget-BnVu4YGx.js.map} +1 -1
- package/dist/{FormatvalueWidget-DfvTVSs-.cjs → FormatvalueWidget-BpFXnA_U.cjs} +2 -2
- package/dist/{FormatvalueWidget-DfvTVSs-.cjs.map → FormatvalueWidget-BpFXnA_U.cjs.map} +1 -1
- package/dist/{Graph-BTtGIbYG.js → Graph-CUFzx8Ti.js} +284 -280
- package/dist/Graph-CUFzx8Ti.js.map +1 -0
- package/dist/{Graph-Cy2LrwoK.cjs → Graph-qxF4224c.cjs} +2 -2
- package/dist/Graph-qxF4224c.cjs.map +1 -0
- package/dist/{GraphWidget-XjxjI3og.cjs → GraphWidget-BvCQHVxQ.cjs} +2 -2
- package/dist/{GraphWidget-XjxjI3og.cjs.map → GraphWidget-BvCQHVxQ.cjs.map} +1 -1
- package/dist/{GraphWidget-CWJ4Yb26.js → GraphWidget-DO5XbOGy.js} +2 -2
- package/dist/{GraphWidget-CWJ4Yb26.js.map → GraphWidget-DO5XbOGy.js.map} +1 -1
- package/dist/{HorizontalWidget-DFAqF95S.js → HorizontalWidget-BA9PiP3d.js} +4 -4
- package/dist/{HorizontalWidget-DFAqF95S.js.map → HorizontalWidget-BA9PiP3d.js.map} +1 -1
- package/dist/{HorizontalWidget-BeW4b13V.cjs → HorizontalWidget-BBQE-dP-.cjs} +2 -2
- package/dist/{HorizontalWidget-BeW4b13V.cjs.map → HorizontalWidget-BBQE-dP-.cjs.map} +1 -1
- package/dist/{HorizontalboxWidget-CL1xEhDj.js → HorizontalboxWidget-B-7HOqgl.js} +7 -7
- package/dist/{HorizontalboxWidget-CL1xEhDj.js.map → HorizontalboxWidget-B-7HOqgl.js.map} +1 -1
- package/dist/{HorizontalboxWidget-DdPv_6qb.cjs → HorizontalboxWidget-CX7J8RdA.cjs} +2 -2
- package/dist/{HorizontalboxWidget-DdPv_6qb.cjs.map → HorizontalboxWidget-CX7J8RdA.cjs.map} +1 -1
- package/dist/HorizontallineWidget-D-o9MGo0.js +16 -0
- package/dist/{HorizontallineWidget-DPiADCAy.js.map → HorizontallineWidget-D-o9MGo0.js.map} +1 -1
- package/dist/{HorizontallineWidget-BdWOnioI.cjs → HorizontallineWidget-odTFoB8u.cjs} +2 -2
- package/dist/{HorizontallineWidget-BdWOnioI.cjs.map → HorizontallineWidget-odTFoB8u.cjs.map} +1 -1
- package/dist/{IframeWidget-BsDu4b17.js → IframeWidget-BzOka-fX.js} +5 -5
- package/dist/{IframeWidget-BsDu4b17.js.map → IframeWidget-BzOka-fX.js.map} +1 -1
- package/dist/{IframeWidget-Z12pG6JT.cjs → IframeWidget-cTHu_Rmp.cjs} +2 -2
- package/dist/{IframeWidget-Z12pG6JT.cjs.map → IframeWidget-cTHu_Rmp.cjs.map} +1 -1
- package/dist/{ImageLoader-CZ0Wx_Ua.cjs → ImageLoader-BTEOukIw.cjs} +2 -2
- package/dist/{ImageLoader-CZ0Wx_Ua.cjs.map → ImageLoader-BTEOukIw.cjs.map} +1 -1
- package/dist/{ImageLoader-CT4rnwWn.js → ImageLoader-CstmWFM4.js} +2 -2
- package/dist/{ImageLoader-CT4rnwWn.js.map → ImageLoader-CstmWFM4.js.map} +1 -1
- package/dist/{ImageviewerWidget-BQbrz2WL.js → ImageviewerWidget-BA9uOM1q.js} +5 -5
- package/dist/{ImageviewerWidget-BQbrz2WL.js.map → ImageviewerWidget-BA9uOM1q.js.map} +1 -1
- package/dist/{ImageviewerWidget-CtJzQn0e.cjs → ImageviewerWidget-CLAFwmaB.cjs} +2 -2
- package/dist/{ImageviewerWidget-CtJzQn0e.cjs.map → ImageviewerWidget-CLAFwmaB.cjs.map} +1 -1
- package/dist/{InterfacesTab-COKNyeUu.js → InterfacesTab-C3mDLkGC.js} +9 -9
- package/dist/{InterfacesTab-COKNyeUu.js.map → InterfacesTab-C3mDLkGC.js.map} +1 -1
- package/dist/{InterfacesTab-A0g0y1n1.cjs → InterfacesTab-CM0CGFVS.cjs} +2 -2
- package/dist/{InterfacesTab-A0g0y1n1.cjs.map → InterfacesTab-CM0CGFVS.cjs.map} +1 -1
- package/dist/{LabelWidget-rH3SsItK.cjs → LabelWidget-CMmVq1mx.cjs} +2 -2
- package/dist/{LabelWidget-rH3SsItK.cjs.map → LabelWidget-CMmVq1mx.cjs.map} +1 -1
- package/dist/{LabelWidget-D5-IFUYW.js → LabelWidget-Da2howZF.js} +5 -5
- package/dist/{LabelWidget-D5-IFUYW.js.map → LabelWidget-Da2howZF.js.map} +1 -1
- package/dist/{LabelledWidget-Dt9miRtB.js → LabelledWidget-BH8y3OXT.js} +7 -7
- package/dist/{LabelledWidget-Dt9miRtB.js.map → LabelledWidget-BH8y3OXT.js.map} +1 -1
- package/dist/{LabelledWidget-Bca_qNSP.cjs → LabelledWidget-CAqH0oWs.cjs} +2 -2
- package/dist/{LabelledWidget-Bca_qNSP.cjs.map → LabelledWidget-CAqH0oWs.cjs.map} +1 -1
- package/dist/{LabelprogressbarWidget-BNFgTq4D.js → LabelprogressbarWidget-Brl24F4c.js} +7 -7
- package/dist/{LabelprogressbarWidget-BNFgTq4D.js.map → LabelprogressbarWidget-Brl24F4c.js.map} +1 -1
- package/dist/{LabelprogressbarWidget-hyK9Vqsl.cjs → LabelprogressbarWidget-BxLGmW9T.cjs} +2 -2
- package/dist/{LabelprogressbarWidget-hyK9Vqsl.cjs.map → LabelprogressbarWidget-BxLGmW9T.cjs.map} +1 -1
- package/dist/{LabelsparklineWidget-BxkxEVwQ.cjs → LabelsparklineWidget-BUXOpBeB.cjs} +2 -2
- package/dist/{LabelsparklineWidget-BxkxEVwQ.cjs.map → LabelsparklineWidget-BUXOpBeB.cjs.map} +1 -1
- package/dist/{LabelsparklineWidget-BByxev6X.js → LabelsparklineWidget-D22MB7-4.js} +7 -7
- package/dist/{LabelsparklineWidget-BByxev6X.js.map → LabelsparklineWidget-D22MB7-4.js.map} +1 -1
- package/dist/{LabelvalueWidget-BM6L9bVw.js → LabelvalueWidget-_1JPbK-K.js} +7 -7
- package/dist/{LabelvalueWidget-BM6L9bVw.js.map → LabelvalueWidget-_1JPbK-K.js.map} +1 -1
- package/dist/{LabelvalueWidget-DEGmbKMG.cjs → LabelvalueWidget-bYqqgIGE.cjs} +2 -2
- package/dist/{LabelvalueWidget-DEGmbKMG.cjs.map → LabelvalueWidget-bYqqgIGE.cjs.map} +1 -1
- package/dist/{LabelvaluedescWidget-B7bGqqeO.cjs → LabelvaluedescWidget-B2dFZoDE.cjs} +2 -2
- package/dist/{LabelvaluedescWidget-B7bGqqeO.cjs.map → LabelvaluedescWidget-B2dFZoDE.cjs.map} +1 -1
- package/dist/{LabelvaluedescWidget-DeBRjYXs.js → LabelvaluedescWidget-BgduSJJb.js} +8 -8
- package/dist/{LabelvaluedescWidget-DeBRjYXs.js.map → LabelvaluedescWidget-BgduSJJb.js.map} +1 -1
- package/dist/{LabelvaluelimitsbarWidget-DzEc9ZZr.cjs → LabelvaluelimitsbarWidget-BGag8V6k.cjs} +2 -2
- package/dist/{LabelvaluelimitsbarWidget-DzEc9ZZr.cjs.map → LabelvaluelimitsbarWidget-BGag8V6k.cjs.map} +1 -1
- package/dist/{LabelvaluelimitsbarWidget-CqV0-c3G.js → LabelvaluelimitsbarWidget-C9PlEhWo.js} +7 -7
- package/dist/{LabelvaluelimitsbarWidget-CqV0-c3G.js.map → LabelvaluelimitsbarWidget-C9PlEhWo.js.map} +1 -1
- package/dist/{LabelvaluelimitscolumnWidget-Bz0PKTIV.js → LabelvaluelimitscolumnWidget-Cay6AhoZ.js} +8 -8
- package/dist/{LabelvaluelimitscolumnWidget-Bz0PKTIV.js.map → LabelvaluelimitscolumnWidget-Cay6AhoZ.js.map} +1 -1
- package/dist/{LabelvaluelimitscolumnWidget-C0-v0q7a.cjs → LabelvaluelimitscolumnWidget-SHVJIgGJ.cjs} +2 -2
- package/dist/{LabelvaluelimitscolumnWidget-C0-v0q7a.cjs.map → LabelvaluelimitscolumnWidget-SHVJIgGJ.cjs.map} +1 -1
- package/dist/{LabelvaluerangebarWidget-CWhsb5gm.cjs → LabelvaluerangebarWidget-Dbibpimv.cjs} +2 -2
- package/dist/{LabelvaluerangebarWidget-CWhsb5gm.cjs.map → LabelvaluerangebarWidget-Dbibpimv.cjs.map} +1 -1
- package/dist/{LabelvaluerangebarWidget-DKuAJHLm.js → LabelvaluerangebarWidget-s_8IgY-C.js} +7 -7
- package/dist/{LabelvaluerangebarWidget-DKuAJHLm.js.map → LabelvaluerangebarWidget-s_8IgY-C.js.map} +1 -1
- package/dist/{Layout-LSeXBY_W.js → Layout-D7RGn0Fe.js} +2 -2
- package/dist/{Layout-LSeXBY_W.js.map → Layout-D7RGn0Fe.js.map} +1 -1
- package/dist/{Layout-QcVHlWPp.cjs → Layout-DwWEea79.cjs} +2 -2
- package/dist/{Layout-QcVHlWPp.cjs.map → Layout-DwWEea79.cjs.map} +1 -1
- package/dist/{LedWidget-CJwBssHl.cjs → LedWidget-BaiKDozd.cjs} +2 -2
- package/dist/{LedWidget-CJwBssHl.cjs.map → LedWidget-BaiKDozd.cjs.map} +1 -1
- package/dist/{LedWidget-CH4Il9R7.js → LedWidget-DgMtvsiv.js} +6 -6
- package/dist/{LedWidget-CH4Il9R7.js.map → LedWidget-DgMtvsiv.js.map} +1 -1
- package/dist/{LimitsBar-B0O6RMrG.cjs → LimitsBar-BFM38vQL.cjs} +2 -2
- package/dist/{LimitsBar-B0O6RMrG.cjs.map → LimitsBar-BFM38vQL.cjs.map} +1 -1
- package/dist/{LimitsBar-BelAQFD0.js → LimitsBar-CcOaAw0C.js} +7 -7
- package/dist/{LimitsBar-BelAQFD0.js.map → LimitsBar-CcOaAw0C.js.map} +1 -1
- package/dist/{LimitsbarWidget--AwjBbtb.cjs → LimitsbarWidget-ConP3qI5.cjs} +2 -2
- package/dist/{LimitsbarWidget--AwjBbtb.cjs.map → LimitsbarWidget-ConP3qI5.cjs.map} +1 -1
- package/dist/{LimitsbarWidget-PkPqlyxL.js → LimitsbarWidget-DpmJn1Lo.js} +7 -7
- package/dist/{LimitsbarWidget-PkPqlyxL.js.map → LimitsbarWidget-DpmJn1Lo.js.map} +1 -1
- package/dist/{LimitscolorWidget-BlA15g4A.js → LimitscolorWidget-BMXiEaDm.js} +20 -20
- package/dist/{LimitscolorWidget-BlA15g4A.js.map → LimitscolorWidget-BMXiEaDm.js.map} +1 -1
- package/dist/{LimitscolorWidget-1D2myv8a.cjs → LimitscolorWidget-veWQ4NXl.cjs} +2 -2
- package/dist/{LimitscolorWidget-1D2myv8a.cjs.map → LimitscolorWidget-veWQ4NXl.cjs.map} +1 -1
- package/dist/{LimitscolumnWidget-_QPf3cUQ.cjs → LimitscolumnWidget-CJABAor8.cjs} +2 -2
- package/dist/{LimitscolumnWidget-_QPf3cUQ.cjs.map → LimitscolumnWidget-CJABAor8.cjs.map} +1 -1
- package/dist/{LimitscolumnWidget-PT917BA0.js → LimitscolumnWidget-ufFMz6R-.js} +5 -5
- package/dist/{LimitscolumnWidget-PT917BA0.js.map → LimitscolumnWidget-ufFMz6R-.js.map} +1 -1
- package/dist/{LinegraphWidget-DfXd3959.cjs → LinegraphWidget-3E8L5CvM.cjs} +2 -2
- package/dist/{LinegraphWidget-DfXd3959.cjs.map → LinegraphWidget-3E8L5CvM.cjs.map} +1 -1
- package/dist/{LinegraphWidget-BW7kS_6G.js → LinegraphWidget-BC2wVOny.js} +7 -7
- package/dist/{LinegraphWidget-BW7kS_6G.js.map → LinegraphWidget-BC2wVOny.js.map} +1 -1
- package/dist/{MatrixbycolumnsWidget-oRYGFSEt.cjs → MatrixbycolumnsWidget-DICgiNQo.cjs} +2 -2
- package/dist/{MatrixbycolumnsWidget-oRYGFSEt.cjs.map → MatrixbycolumnsWidget-DICgiNQo.cjs.map} +1 -1
- package/dist/{MatrixbycolumnsWidget-BGNsZvjv.js → MatrixbycolumnsWidget-DfUAeBnO.js} +5 -5
- package/dist/{MatrixbycolumnsWidget-BGNsZvjv.js.map → MatrixbycolumnsWidget-DfUAeBnO.js.map} +1 -1
- package/dist/{MicroservicesTab-CiEGGavF.js → MicroservicesTab-B0SZVty3.js} +67 -62
- package/dist/MicroservicesTab-B0SZVty3.js.map +1 -0
- package/dist/MicroservicesTab-snXJDoYq.cjs +4 -0
- package/dist/MicroservicesTab-snXJDoYq.cjs.map +1 -0
- package/dist/{OpenC3TimePicker-CkaALgy9.js → OpenC3TimePicker-DpkbfbgC.js} +5 -5
- package/dist/{OpenC3TimePicker-CkaALgy9.js.map → OpenC3TimePicker-DpkbfbgC.js.map} +1 -1
- package/dist/{OpenC3TimePicker-bbdbKTv_.cjs → OpenC3TimePicker-Yl1jVi7p.cjs} +2 -2
- package/dist/{OpenC3TimePicker-bbdbKTv_.cjs.map → OpenC3TimePicker-Yl1jVi7p.cjs.map} +1 -1
- package/dist/{Openc3Screen-DoOAFAlJ.cjs → Openc3Screen-D1RLlBgQ.cjs} +4 -4
- package/dist/Openc3Screen-D1RLlBgQ.cjs.map +1 -0
- package/dist/{Openc3Screen-BnM1bNOB.js → Openc3Screen-DbUvz-3B.js} +246 -245
- package/dist/Openc3Screen-DbUvz-3B.js.map +1 -0
- package/dist/{OutputDialog-R3Xj3_yw.cjs → OutputDialog-ChPCaQAE.cjs} +2 -2
- package/dist/{OutputDialog-R3Xj3_yw.cjs.map → OutputDialog-ChPCaQAE.cjs.map} +1 -1
- package/dist/{OutputDialog-BY-TZNRl.js → OutputDialog-Ds-GdGyI.js} +5 -5
- package/dist/{OutputDialog-BY-TZNRl.js.map → OutputDialog-Ds-GdGyI.js.map} +1 -1
- package/dist/PackagesTab-BgQsbXRo.cjs +2 -0
- package/dist/PackagesTab-BgQsbXRo.cjs.map +1 -0
- package/dist/{PackagesTab-DGrqIo_Z.js → PackagesTab-CWplBp_I.js} +70 -66
- package/dist/PackagesTab-CWplBp_I.js.map +1 -0
- package/dist/{PluginsTab-BXjVe_81.js → PluginsTab-BiiL622n.js} +89 -88
- package/dist/PluginsTab-BiiL622n.js.map +1 -0
- package/dist/PluginsTab-RgIMk-F7.cjs +6 -0
- package/dist/PluginsTab-RgIMk-F7.cjs.map +1 -0
- package/dist/{ProgressbarWidget-Cy_ad8mb.js → ProgressbarWidget-D3ndYnq_.js} +5 -5
- package/dist/{ProgressbarWidget-Cy_ad8mb.js.map → ProgressbarWidget-D3ndYnq_.js.map} +1 -1
- package/dist/{ProgressbarWidget-XAy4iHgC.cjs → ProgressbarWidget-DludJVUf.cjs} +2 -2
- package/dist/{ProgressbarWidget-XAy4iHgC.cjs.map → ProgressbarWidget-DludJVUf.cjs.map} +1 -1
- package/dist/{RadiobuttonWidget-aJBIz45y.js → RadiobuttonWidget-CP0S9nWW.js} +5 -5
- package/dist/{RadiobuttonWidget-aJBIz45y.js.map → RadiobuttonWidget-CP0S9nWW.js.map} +1 -1
- package/dist/{RadiobuttonWidget-fAqkUUTb.cjs → RadiobuttonWidget-DX4h94p1.cjs} +2 -2
- package/dist/{RadiobuttonWidget-fAqkUUTb.cjs.map → RadiobuttonWidget-DX4h94p1.cjs.map} +1 -1
- package/dist/{RadiogroupWidget-DNRlJnPE.js → RadiogroupWidget-BXHfA21T.js} +4 -4
- package/dist/{RadiogroupWidget-DNRlJnPE.js.map → RadiogroupWidget-BXHfA21T.js.map} +1 -1
- package/dist/{RadiogroupWidget-BuYMyBQd.cjs → RadiogroupWidget-NqjBNUH6.cjs} +2 -2
- package/dist/{RadiogroupWidget-BuYMyBQd.cjs.map → RadiogroupWidget-NqjBNUH6.cjs.map} +1 -1
- package/dist/{RangebarWidget-h4YItqPF.js → RangebarWidget-Bv2DqkPo.js} +5 -5
- package/dist/{RangebarWidget-h4YItqPF.js.map → RangebarWidget-Bv2DqkPo.js.map} +1 -1
- package/dist/{RangebarWidget-gcukfXnM.cjs → RangebarWidget-CRq2zpvw.cjs} +2 -2
- package/dist/{RangebarWidget-gcukfXnM.cjs.map → RangebarWidget-CRq2zpvw.cjs.map} +1 -1
- package/dist/{RedisTab-BmZWA0OG.js → RedisTab-7TbOXFA_.js} +9 -9
- package/dist/{RedisTab-BmZWA0OG.js.map → RedisTab-7TbOXFA_.js.map} +1 -1
- package/dist/{RedisTab-0V8f-hs1.cjs → RedisTab-DpWPY1P0.cjs} +2 -2
- package/dist/{RedisTab-0V8f-hs1.cjs.map → RedisTab-DpWPY1P0.cjs.map} +1 -1
- package/dist/{RollupWidget-ZerASRD3.cjs → RollupWidget-B7_Q_boi.cjs} +2 -2
- package/dist/{RollupWidget-ZerASRD3.cjs.map → RollupWidget-B7_Q_boi.cjs.map} +1 -1
- package/dist/{RollupWidget-CnxDQRQ0.js → RollupWidget-o_huYU0x.js} +5 -5
- package/dist/{RollupWidget-CnxDQRQ0.js.map → RollupWidget-o_huYU0x.js.map} +1 -1
- package/dist/{RoutersTab-CY-SmZd4.cjs → RoutersTab-CAbnSGHy.cjs} +2 -2
- package/dist/{RoutersTab-CY-SmZd4.cjs.map → RoutersTab-CAbnSGHy.cjs.map} +1 -1
- package/dist/{RoutersTab-Db28gKLP.js → RoutersTab-DN17iBBi.js} +9 -9
- package/dist/{RoutersTab-Db28gKLP.js.map → RoutersTab-DN17iBBi.js.map} +1 -1
- package/dist/{ScriptChooser-CI4lAYZ1.cjs → ScriptChooser-CggwstfT.cjs} +2 -2
- package/dist/{ScriptChooser-CI4lAYZ1.cjs.map → ScriptChooser-CggwstfT.cjs.map} +1 -1
- package/dist/{ScriptChooser-Bl0wisob.js → ScriptChooser-CzzUJ1Zj.js} +6 -6
- package/dist/{ScriptChooser-Bl0wisob.js.map → ScriptChooser-CzzUJ1Zj.js.map} +1 -1
- package/dist/{ScrollwindowWidget-DFkTJ2Ue.js → ScrollwindowWidget-DdjaML6D.js} +4 -4
- package/dist/{ScrollwindowWidget-DFkTJ2Ue.js.map → ScrollwindowWidget-DdjaML6D.js.map} +1 -1
- package/dist/{ScrollwindowWidget-BJkQ5uX_.cjs → ScrollwindowWidget-kS5QjP-v.cjs} +2 -2
- package/dist/{ScrollwindowWidget-BJkQ5uX_.cjs.map → ScrollwindowWidget-kS5QjP-v.cjs.map} +1 -1
- package/dist/{SecretsTab-B8YTrfQ2.cjs → SecretsTab-Cn6-o85L.cjs} +2 -2
- package/dist/{SecretsTab-B8YTrfQ2.cjs.map → SecretsTab-Cn6-o85L.cjs.map} +1 -1
- package/dist/{SecretsTab-DTdVLi0I.js → SecretsTab-Cu3sx2OA.js} +4 -4
- package/dist/{SecretsTab-DTdVLi0I.js.map → SecretsTab-Cu3sx2OA.js.map} +1 -1
- package/dist/{SettingsTab-CnybxvVj.js → SettingsTab-B_vvSLvt.js} +6 -6
- package/dist/{SettingsTab-CnybxvVj.js.map → SettingsTab-B_vvSLvt.js.map} +1 -1
- package/dist/{SettingsTab-_SJLhuk0.cjs → SettingsTab-C6zIL2D6.cjs} +2 -2
- package/dist/{SettingsTab-_SJLhuk0.cjs.map → SettingsTab-C6zIL2D6.cjs.map} +1 -1
- package/dist/{SignalWidget-DC7-NIOj.cjs → SignalWidget-BagcB92r.cjs} +2 -2
- package/dist/{SignalWidget-DC7-NIOj.cjs.map → SignalWidget-BagcB92r.cjs.map} +1 -1
- package/dist/{SignalWidget-jYpXSIfD.js → SignalWidget-Dd54y28I.js} +5 -5
- package/dist/{SignalWidget-jYpXSIfD.js.map → SignalWidget-Dd54y28I.js.map} +1 -1
- package/dist/{SimpleTextDialog-DLdHGmmb.cjs → SimpleTextDialog-BJ50TbWh.cjs} +2 -2
- package/dist/{SimpleTextDialog-DLdHGmmb.cjs.map → SimpleTextDialog-BJ50TbWh.cjs.map} +1 -1
- package/dist/{SimpleTextDialog-Dd3BoNG-.js → SimpleTextDialog-DZv9n_kJ.js} +5 -5
- package/dist/{SimpleTextDialog-Dd3BoNG-.js.map → SimpleTextDialog-DZv9n_kJ.js.map} +1 -1
- package/dist/{SpacerWidget-BwwxG8k3.cjs → SpacerWidget-DWjBns9r.cjs} +2 -2
- package/dist/{SpacerWidget-BwwxG8k3.cjs.map → SpacerWidget-DWjBns9r.cjs.map} +1 -1
- package/dist/{SpacerWidget-CUqvml6o.js → SpacerWidget-GPFYtIG1.js} +5 -5
- package/dist/{SpacerWidget-CUqvml6o.js.map → SpacerWidget-GPFYtIG1.js.map} +1 -1
- package/dist/{SparklineWidget-CVf1TtjV.js → SparklineWidget-f11nrlLS.js} +7 -7
- package/dist/{SparklineWidget-CVf1TtjV.js.map → SparklineWidget-f11nrlLS.js.map} +1 -1
- package/dist/{SparklineWidget-05TlKC-x.cjs → SparklineWidget-xdPgolp3.cjs} +2 -2
- package/dist/{SparklineWidget-05TlKC-x.cjs.map → SparklineWidget-xdPgolp3.cjs.map} +1 -1
- package/dist/{TabbookWidget-oZre4A6Y.cjs → TabbookWidget-CUIYWHRH.cjs} +2 -2
- package/dist/{TabbookWidget-oZre4A6Y.cjs.map → TabbookWidget-CUIYWHRH.cjs.map} +1 -1
- package/dist/{TabbookWidget-CTUEpDnn.js → TabbookWidget-DeaC27yC.js} +4 -4
- package/dist/{TabbookWidget-CTUEpDnn.js.map → TabbookWidget-DeaC27yC.js.map} +1 -1
- package/dist/{TargetPacketItemChooser-CS2Vvi2U.js → TargetPacketItemChooser-BoBqvs3T.js} +4 -4
- package/dist/{TargetPacketItemChooser-CS2Vvi2U.js.map → TargetPacketItemChooser-BoBqvs3T.js.map} +1 -1
- package/dist/{TargetPacketItemChooser-BvXBVNLj.cjs → TargetPacketItemChooser-C0Z90rss.cjs} +2 -2
- package/dist/{TargetPacketItemChooser-BvXBVNLj.cjs.map → TargetPacketItemChooser-C0Z90rss.cjs.map} +1 -1
- package/dist/{TargetsTab-Bc7-iav6.cjs → TargetsTab-BMcWjrZ_.cjs} +2 -2
- package/dist/{TargetsTab-Bc7-iav6.cjs.map → TargetsTab-BMcWjrZ_.cjs.map} +1 -1
- package/dist/{TargetsTab-CGv0GwAF.js → TargetsTab-CjVaBN9O.js} +11 -11
- package/dist/{TargetsTab-CGv0GwAF.js.map → TargetsTab-CjVaBN9O.js.map} +1 -1
- package/dist/{TextBoxDialog-BRwZOtzT.js → TextBoxDialog-R6GC8pMa.js} +4 -4
- package/dist/{TextBoxDialog-BRwZOtzT.js.map → TextBoxDialog-R6GC8pMa.js.map} +1 -1
- package/dist/{TextboxWidget-qSbx4xxD.cjs → TextboxWidget-CXA9rR02.cjs} +2 -2
- package/dist/{TextboxWidget-qSbx4xxD.cjs.map → TextboxWidget-CXA9rR02.cjs.map} +1 -1
- package/dist/{TextboxWidget-B0Y1W7GP.js → TextboxWidget-tL41zWUX.js} +6 -6
- package/dist/{TextboxWidget-B0Y1W7GP.js.map → TextboxWidget-tL41zWUX.js.map} +1 -1
- package/dist/{TextfieldWidget-cCG7BQ25.cjs → TextfieldWidget-D-H2fOZG.cjs} +2 -2
- package/dist/{TextfieldWidget-cCG7BQ25.cjs.map → TextfieldWidget-D-H2fOZG.cjs.map} +1 -1
- package/dist/{TextfieldWidget-B8TAf9oU.js → TextfieldWidget-D1qj14Qi.js} +5 -5
- package/dist/{TextfieldWidget-B8TAf9oU.js.map → TextfieldWidget-D1qj14Qi.js.map} +1 -1
- package/dist/{TimeWidget-DNkhFoZO.cjs → TimeWidget-CGk8Ze_I.cjs} +2 -2
- package/dist/{TimeWidget-DNkhFoZO.cjs.map → TimeWidget-CGk8Ze_I.cjs.map} +1 -1
- package/dist/{TimeWidget-DewVXks0.js → TimeWidget-CSVGNong.js} +6 -6
- package/dist/{TimeWidget-DewVXks0.js.map → TimeWidget-CSVGNong.js.map} +1 -1
- package/dist/{TitleWidget-BAq2LGJF.js → TitleWidget-CLx-tuYT.js} +5 -5
- package/dist/{TitleWidget-BAq2LGJF.js.map → TitleWidget-CLx-tuYT.js.map} +1 -1
- package/dist/{TitleWidget-ChGb6BJW.cjs → TitleWidget-ClhWhUf3.cjs} +2 -2
- package/dist/{TitleWidget-ChGb6BJW.cjs.map → TitleWidget-ClhWhUf3.cjs.map} +1 -1
- package/dist/{ToolsTab-CB_6hFQF.cjs → ToolsTab-DTHap-Nq.cjs} +2 -2
- package/dist/{ToolsTab-CB_6hFQF.cjs.map → ToolsTab-DTHap-Nq.cjs.map} +1 -1
- package/dist/{ToolsTab-USmbUvDq.js → ToolsTab-lBB_KhmA.js} +10 -10
- package/dist/{ToolsTab-USmbUvDq.js.map → ToolsTab-lBB_KhmA.js.map} +1 -1
- package/dist/{TopBar-B4RDkLs-.js → TopBar-C810rP_B.js} +4 -4
- package/dist/{TopBar-B4RDkLs-.js.map → TopBar-C810rP_B.js.map} +1 -1
- package/dist/{TopBar-DzL3L4ih.cjs → TopBar-Ctzx7o2k.cjs} +2 -2
- package/dist/{TopBar-DzL3L4ih.cjs.map → TopBar-Ctzx7o2k.cjs.map} +1 -1
- package/dist/{TsdbTab-0aYlysh5.js → TsdbTab-7F4mRKDo.js} +6 -6
- package/dist/{TsdbTab-0aYlysh5.js.map → TsdbTab-7F4mRKDo.js.map} +1 -1
- package/dist/{TsdbTab-H64XGfOO.cjs → TsdbTab-DVF6n9mq.cjs} +2 -2
- package/dist/{TsdbTab-H64XGfOO.cjs.map → TsdbTab-DVF6n9mq.cjs.map} +1 -1
- package/dist/{UpgradeToEnterpriseDialog-DTmnp8xy.js → UpgradeToEnterpriseDialog-D_S574Zb.js} +6 -6
- package/dist/{UpgradeToEnterpriseDialog-DTmnp8xy.js.map → UpgradeToEnterpriseDialog-D_S574Zb.js.map} +1 -1
- package/dist/{UpgradeToEnterpriseDialog-BBRXrLrL.cjs → UpgradeToEnterpriseDialog-XJb6gVCY.cjs} +2 -2
- package/dist/{UpgradeToEnterpriseDialog-BBRXrLrL.cjs.map → UpgradeToEnterpriseDialog-XJb6gVCY.cjs.map} +1 -1
- package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-CDTSzdb-.js → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-BJxLUZhh.js} +11973 -11975
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-BJxLUZhh.js.map +1 -0
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-eKtA_EtD.cjs +1485 -0
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-eKtA_EtD.cjs.map +1 -0
- package/dist/{VWidget-0KwtSssI.js → VWidget-CxnaMF0w.js} +3 -3
- package/dist/{VWidget-0KwtSssI.js.map → VWidget-CxnaMF0w.js.map} +1 -1
- package/dist/{VWidget-SWmlQP30.cjs → VWidget-dEHSEvZx.cjs} +2 -2
- package/dist/{VWidget-SWmlQP30.cjs.map → VWidget-dEHSEvZx.cjs.map} +1 -1
- package/dist/{ValueWidget-BGNqaaRs.js → ValueWidget-BYgpXfDo.js} +6 -6
- package/dist/{ValueWidget-BGNqaaRs.js.map → ValueWidget-BYgpXfDo.js.map} +1 -1
- package/dist/{ValueWidget-BfxZq1LD.cjs → ValueWidget-Bws1qOEI.cjs} +2 -2
- package/dist/{ValueWidget-BfxZq1LD.cjs.map → ValueWidget-Bws1qOEI.cjs.map} +1 -1
- package/dist/{ValuelimitsbarWidget-m5fBewLy.cjs → ValuelimitsbarWidget-BoZSJvuq.cjs} +2 -2
- package/dist/{ValuelimitsbarWidget-m5fBewLy.cjs.map → ValuelimitsbarWidget-BoZSJvuq.cjs.map} +1 -1
- package/dist/{ValuelimitsbarWidget-B6mH4PdF.js → ValuelimitsbarWidget-Dc9-VNZ3.js} +7 -7
- package/dist/{ValuelimitsbarWidget-B6mH4PdF.js.map → ValuelimitsbarWidget-Dc9-VNZ3.js.map} +1 -1
- package/dist/{ValuelimitscolumnWidget-DlX90_-6.js → ValuelimitscolumnWidget-b7W8K3mR.js} +7 -7
- package/dist/{ValuelimitscolumnWidget-DlX90_-6.js.map → ValuelimitscolumnWidget-b7W8K3mR.js.map} +1 -1
- package/dist/{ValuelimitscolumnWidget-D_5XZhiD.cjs → ValuelimitscolumnWidget-ta9i_tiy.cjs} +2 -2
- package/dist/{ValuelimitscolumnWidget-D_5XZhiD.cjs.map → ValuelimitscolumnWidget-ta9i_tiy.cjs.map} +1 -1
- package/dist/{ValuerangebarWidget-C9xyLOJO.js → ValuerangebarWidget-DmhczZQb.js} +7 -7
- package/dist/{ValuerangebarWidget-C9xyLOJO.js.map → ValuerangebarWidget-DmhczZQb.js.map} +1 -1
- package/dist/{ValuerangebarWidget-C3XFFRhf.cjs → ValuerangebarWidget-Ips-beG6.cjs} +2 -2
- package/dist/{ValuerangebarWidget-C3XFFRhf.cjs.map → ValuerangebarWidget-Ips-beG6.cjs.map} +1 -1
- package/dist/{VerticalWidget-D-U8cue6.cjs → VerticalWidget-BVt7QPjO.cjs} +2 -2
- package/dist/{VerticalWidget-D-U8cue6.cjs.map → VerticalWidget-BVt7QPjO.cjs.map} +1 -1
- package/dist/{VerticalWidget-0UbbE2g3.js → VerticalWidget-BvsVh0Ob.js} +4 -4
- package/dist/{VerticalWidget-0UbbE2g3.js.map → VerticalWidget-BvsVh0Ob.js.map} +1 -1
- package/dist/{VerticalboxWidget-C4nkJhEd.cjs → VerticalboxWidget-CNoXT3YW.cjs} +2 -2
- package/dist/{VerticalboxWidget-C4nkJhEd.cjs.map → VerticalboxWidget-CNoXT3YW.cjs.map} +1 -1
- package/dist/{VerticalboxWidget-efbeOAKE.js → VerticalboxWidget-ClTCDCQN.js} +7 -7
- package/dist/{VerticalboxWidget-efbeOAKE.js.map → VerticalboxWidget-ClTCDCQN.js.map} +1 -1
- package/dist/{Widget-D0drYWOT.cjs → Widget-CB_BtOFw.cjs} +2 -2
- package/dist/{Widget-D0drYWOT.cjs.map → Widget-CB_BtOFw.cjs.map} +1 -1
- package/dist/{Widget-CGePksBA.js → Widget-DRhVdCLP.js} +2 -2
- package/dist/{Widget-CGePksBA.js.map → Widget-DRhVdCLP.js.map} +1 -1
- package/dist/components.cjs +1 -1
- package/dist/components.js +19 -19
- package/dist/icons.js +2 -2
- package/dist/{index-Cmp6oZpm.cjs → index-3sXOEKCU.cjs} +4 -4
- package/dist/{index-Cmp6oZpm.cjs.map → index-3sXOEKCU.cjs.map} +1 -1
- package/dist/{index-DqKiZufS.cjs → index-B34azWgs.cjs} +4 -4
- package/dist/index-B34azWgs.cjs.map +1 -0
- package/dist/{index-C7Uj4U87.js → index-CJcL4_a4.js} +6 -6
- package/dist/index-CJcL4_a4.js.map +1 -0
- package/dist/{index-BJrYCoCB.js → index-GYAZJDxn.js} +70 -70
- package/dist/{index-BJrYCoCB.js.map → index-GYAZJDxn.js.map} +1 -1
- package/dist/plugins.cjs.map +1 -1
- package/dist/plugins.js +2 -2
- package/dist/plugins.js.map +1 -1
- package/dist/{settings-l1j_GGzu.cjs → settings-B0AhztTk.cjs} +2 -2
- package/dist/{settings-l1j_GGzu.cjs.map → settings-B0AhztTk.cjs.map} +1 -1
- package/dist/{settings-CjmDHCpE.js → settings-C2auUQwX.js} +2 -2
- package/dist/{settings-CjmDHCpE.js.map → settings-C2auUQwX.js.map} +1 -1
- package/dist/tools/admin.cjs +1 -1
- package/dist/tools/admin.js +1 -1
- package/dist/tools/base.cjs +1 -1
- package/dist/tools/base.js +8 -8
- package/dist/tools/calendar.cjs +1 -1
- package/dist/tools/calendar.js +1 -1
- package/dist/tools/scriptrunner.cjs +8 -8
- package/dist/tools/scriptrunner.cjs.map +1 -1
- package/dist/tools/scriptrunner.js +2984 -3195
- package/dist/tools/scriptrunner.js.map +1 -1
- package/dist/vue-common.css +1 -1
- package/dist/widgets.cjs +1 -1
- package/dist/widgets.js +65 -65
- package/package.json +7 -7
- package/dist/Graph-BTtGIbYG.js.map +0 -1
- package/dist/Graph-Cy2LrwoK.cjs.map +0 -1
- package/dist/HorizontallineWidget-DPiADCAy.js +0 -16
- package/dist/MicroservicesTab-CiEGGavF.js.map +0 -1
- package/dist/MicroservicesTab-DvDK2hPW.cjs +0 -4
- package/dist/MicroservicesTab-DvDK2hPW.cjs.map +0 -1
- package/dist/Openc3Screen-BnM1bNOB.js.map +0 -1
- package/dist/Openc3Screen-DoOAFAlJ.cjs.map +0 -1
- package/dist/PackagesTab-2Mu7yvxU.cjs +0 -2
- package/dist/PackagesTab-2Mu7yvxU.cjs.map +0 -1
- package/dist/PackagesTab-DGrqIo_Z.js.map +0 -1
- package/dist/PluginsTab-BXjVe_81.js.map +0 -1
- package/dist/PluginsTab-R6i60Pih.cjs +0 -6
- package/dist/PluginsTab-R6i60Pih.cjs.map +0 -1
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-CDTSzdb-.js.map +0 -1
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-MfH160rD.cjs +0 -1485
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-MfH160rD.cjs.map +0 -1
- package/dist/index-C7Uj4U87.js.map +0 -1
- package/dist/index-DqKiZufS.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Graph-Cy2LrwoK.cjs","sources":["../src/components/GraphEditDialog.vue","../src/components/GraphEditItemDialog.vue","../src/components/Graph.vue"],"sourcesContent":["<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <!-- Edit Item dialog -->\n <v-dialog\n v-model=\"show\"\n persistent\n max-width=\"700\"\n @keydown.esc=\"$emit('cancel')\"\n >\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Edit Graph </span>\n <v-spacer />\n </v-toolbar>\n <v-card class=\"pa-3\">\n <v-tabs v-model=\"tab\" class=\"ml-3\">\n <v-tab value=\"0\"> Settings </v-tab>\n <v-tab value=\"1\"> Scale / Lines </v-tab>\n <v-tab value=\"2\"> Items </v-tab>\n </v-tabs>\n <v-tabs-window v-model=\"tab\">\n <v-tabs-window-item value=\"0\" eager>\n <div class=\"edit-box\">\n <v-row>\n <v-col>\n <v-card-text class=\"pa-0\">\n <v-text-field\n v-model=\"graph.title\"\n class=\"pb-2\"\n label=\"Title\"\n hide-details\n />\n </v-card-text>\n </v-col>\n <v-col>\n <v-select\n v-model=\"graph.legendPosition\"\n label=\"Legend Position\"\n hide-details\n :items=\"legendPositions\"\n style=\"max-width: 280px\"\n />\n </v-col>\n </v-row>\n </div>\n <div class=\"edit-box\">\n <v-card-text class=\"pa-0\">\n Select a start date/time for the graph. Leave blank for start now.\n </v-card-text>\n <v-row>\n <v-col>\n <v-text-field\n v-model=\"startDate\"\n label=\"Start Date\"\n :name=\"`date${Date.now()}`\"\n :rules=\"[rules.date]\"\n type=\"date\"\n />\n </v-col>\n <v-col>\n <OpenC3TimePicker\n v-model=\"startTime\"\n label=\"Start Time\"\n :rules=\"[rules.time]\"\n />\n </v-col>\n </v-row>\n <v-card-text class=\"pa-0\">\n Select a end date/time for the graph. Leave blank for continuous\n real-time graphing.\n </v-card-text>\n <v-row>\n <v-col>\n <v-text-field\n v-model=\"endDate\"\n label=\"End Date\"\n :name=\"`date${Date.now()}`\"\n :rules=\"[rules.date]\"\n type=\"date\"\n />\n </v-col>\n <v-col>\n <OpenC3TimePicker\n v-model=\"endTime\"\n label=\"End Time\"\n :rules=\"[rules.time]\"\n />\n </v-col>\n </v-row>\n </div>\n </v-tabs-window-item>\n <v-tabs-window-item value=\"1\" eager>\n <div class=\"edit-box\">\n <v-card-text class=\"pa-0\">\n Set a min or max Y value to override automatic scaling\n </v-card-text>\n <v-row dense>\n <v-col class=\"px-2\">\n <v-text-field\n v-model=\"graph.graphMinY\"\n hide-details\n label=\"Min Y Axis (Optional)\"\n type=\"number\"\n />\n </v-col>\n <v-col class=\"px-2\">\n <v-text-field\n v-model=\"graph.graphMaxY\"\n hide-details\n label=\"Max Y Axis (Optional)\"\n type=\"number\"\n />\n </v-col>\n </v-row>\n </div>\n <div class=\"edit-box\">\n <v-list density=\"compact\" class=\"horizontal-lines\">\n <v-list-item>\n <span style=\"padding-top: 5px\">\n Add horizontal lines to the graph\n </span>\n <v-spacer />\n <v-btn @click=\"addLine()\"> New Line </v-btn>\n </v-list-item>\n <v-list-item\n v-for=\"(item, i) in graph.lines\"\n :key=\"i\"\n :value=\"item\"\n color=\"primary\"\n >\n <v-row>\n <v-col>\n <v-text-field v-model=\"item.yValue\" label=\"Y Value\" />\n </v-col>\n <v-col>\n <v-select\n v-model=\"item.color\"\n label=\"Color\"\n hide-details\n :items=\"colors\"\n />\n </v-col>\n <v-col>\n <v-btn\n style=\"padding: 30px\"\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Remove Line\"\n @click=\"removeLine(item)\"\n />\n </v-col>\n </v-row>\n </v-list-item>\n </v-list>\n </div>\n <div class=\"edit-box\">\n <v-card-text class=\"pa-0 text-medium-emphasis\">\n Choose a different item to use for the graph's X axis. If\n unchecked, the graph will use the packet's PACKET_TIMESECONDS item\n if it exists, otherwise it will use RECEIVED_TIMESECONDS.\n <br />\n <span class=\"font-italic\">\n Note that the graph may not work correctly if you choose an item\n that does not strictly increase in value. It is recommended to\n use a counter or timestamp.\n </span>\n </v-card-text>\n <v-checkbox\n v-model=\"customXAxisEnabled\"\n :disabled=\"!xAxisItemPacket\"\n label=\"Custom X axis item\"\n density=\"compact\"\n hide-details\n @update:model-value=\"customXAxisToggled\"\n />\n <v-card-text\n v-if=\"!xAxisItemPacket\"\n class=\"pa-0 text-medium-emphasis\"\n >\n All items on the graph must be in the same packet to enable this\n feature.\n </v-card-text>\n <target-packet-item-chooser\n v-if=\"customXAxisEnabled && xAxisItemPacket\"\n :initial-target-name=\"xAxisItemPacket.targetName\"\n :initial-packet-name=\"xAxisItemPacket.packetName\"\n :initial-item-name=\"initialXAxisItem\"\n choose-item\n lock-target\n lock-packet\n button-text=\"Set\"\n @on-set=\"xAxisItemChanged\"\n @add-item=\"xAxisItemSelected\"\n />\n </div>\n </v-tabs-window-item>\n <v-tabs-window-item value=\"2\" eager>\n <v-data-table\n item-key=\"itemId\"\n class=\"elevation-1 my-2\"\n data-test=\"edit-graph-items\"\n :headers=\"itemHeaders\"\n :items=\"editItems\"\n :items-per-page=\"5\"\n :footer-props=\"{\n 'items-per-page-options': [5],\n }\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Remove Item\"\n @click=\"$emit('remove', item)\"\n />\n </template>\n <template #no-data>\n <span> Currently no items on this graph </span>\n </template>\n </v-data-table>\n </v-tabs-window-item>\n </v-tabs-window>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"outlined\" @click=\"$emit('cancel')\"> Cancel </v-btn>\n <v-btn variant=\"flat\" @click=\"closeOk\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { TimeFilters } from '@/util'\nimport OpenC3TimePicker from './OpenC3TimePicker.vue'\nimport TargetPacketItemChooser from './TargetPacketItemChooser.vue'\nimport { isValid, parse, toDate } from 'date-fns'\nexport default {\n components: {\n OpenC3TimePicker,\n TargetPacketItemChooser,\n },\n mixins: [TimeFilters],\n props: {\n modelValue: Boolean, // modelValue is the default prop when using v-model\n title: {\n type: String,\n required: true,\n },\n legendPosition: {\n type: String,\n required: true,\n },\n items: {\n type: Array,\n required: true,\n },\n graphMinY: {\n type: Number,\n required: true,\n },\n graphMaxY: {\n type: Number,\n required: true,\n },\n lines: {\n type: Array,\n required: true,\n },\n colors: {\n type: Array,\n required: true,\n },\n startDateTime: {\n type: Number,\n default: null,\n },\n endDateTime: {\n type: Number,\n default: null,\n },\n timeZone: {\n type: String,\n required: true,\n },\n xAxisItemPacket: {\n type: Object,\n default: undefined,\n },\n xAxisItem: {\n type: String,\n default: '__time',\n },\n },\n emits: ['cancel', 'ok', 'remove', 'update:modelValue', 'update:xAxisItem'],\n data: function () {\n return {\n tab: 0,\n graph: {},\n customXAxisEnabled: false,\n selectedXAxisItem: null,\n pendingXAxisSelection: null,\n legendPositions: ['top', 'bottom', 'left', 'right'],\n startDate: null,\n startTime: null,\n endDate: null,\n endTime: null,\n lineHeaders: [\n { title: 'Y Value', value: 'yValue' },\n { title: 'Color', value: 'color' },\n { title: 'Actions', value: 'actions', sortable: false },\n ],\n itemHeaders: [\n { title: 'Target Name', value: 'targetName' },\n { title: 'Packet Name', value: 'packetName' },\n { title: 'Item Name', value: 'itemName' },\n { title: 'Actions', value: 'actions', sortable: false },\n ],\n rules: {\n date: (value) => {\n if (!value) return true\n try {\n return (\n isValid(parse(value, 'yyyy-MM-dd', new Date())) ||\n 'Invalid date (YYYY-MM-DD)'\n )\n } catch (e) {\n return 'Invalid date (YYYY-MM-DD)'\n }\n },\n time: (value) => {\n if (!value) return true\n try {\n return (\n isValid(parse(value, 'HH:mm:ss', new Date())) ||\n 'Invalid time (HH:MM:SS)'\n )\n } catch (e) {\n return 'Invalid time (HH:MM:SS)'\n }\n },\n },\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value) // update is the default event when using v-model\n },\n },\n editItems: function () {\n if (!this.items) return []\n let itemId = 0\n return this.items.map((item) => {\n itemId += 1\n return { ...item, itemId }\n })\n },\n initialXAxisItem: function () {\n // Just for TargetPacketItemChooser\n if (this.xAxisItem === '__time') {\n return\n }\n return this.xAxisItem.split('__').at(4)\n },\n },\n created() {\n this.graph = {\n title: this.title,\n legendPosition: this.legendPosition,\n items: this.items,\n graphMinY: this.graphMinY,\n graphMaxY: this.graphMaxY,\n lines: [...this.lines],\n }\n this.customXAxisEnabled = this.xAxisItem && this.xAxisItem !== '__time'\n this.selectedXAxisItem = this.xAxisItem\n // Set the date and time if they pass a dateTime or set a default\n // Start needs a default because if the timeZone is UTC the time will still be local time\n if (this.startDateTime) {\n // Use the passed dateTime as is\n let date = toDate(this.startDateTime / 1000000)\n this.startDate = this.formatDate(date, this.timeZone)\n this.startTime = this.formatTimeHMS(date, this.timeZone)\n } else {\n // Create a new date 1 hr in the past as a default\n let date = new Date() - 3600000\n this.startDate = this.formatDate(date, this.timeZone)\n this.startTime = this.formatTimeHMS(date, this.timeZone)\n }\n // Only set end date / time if it is explicitly passed\n if (this.endDateTime) {\n let date = toDate(this.endDateTime / 1000000)\n this.endDate = this.formatDate(date, this.timeZone)\n this.endTime = this.formatTimeHMS(date, this.timeZone)\n }\n },\n methods: {\n closeOk() {\n if (!!this.startDate && !!this.startTime) {\n this.graph.startDateTime = this.startDate + ' ' + this.startTime\n } else {\n this.graph.startDateTime = null\n }\n if (!!this.endDate && !!this.endTime) {\n this.graph.endDateTime = this.endDate + ' ' + this.endTime\n } else {\n this.graph.endDateTime = null\n }\n this.$emit('ok', this.graph)\n },\n addLine() {\n this.graph.lines.push({ yValue: 0, color: 'white' })\n },\n removeLine(dline) {\n let i = this.graph.lines.indexOf(dline)\n this.graph.lines.splice(i, 1)\n },\n customXAxisToggled(enabled) {\n if (!enabled) {\n this.selectedXAxisItem = '__time'\n this.$emit('update:xAxisItem', '__time')\n }\n },\n xAxisItemChanged(selection) {\n this.pendingXAxisSelection = selection\n },\n xAxisItemSelected(selection) {\n if (selection.targetName && selection.packetName && selection.itemName) {\n const xAxisItemKey = `DECOM__TLM__${selection.targetName}__${selection.packetName}__${selection.itemName}__CONVERTED`\n this.selectedXAxisItem = xAxisItemKey\n this.$emit('update:xAxisItem', xAxisItemKey)\n }\n },\n },\n}\n</script>\n\n<style>\n.edit-box {\n color: hsla(0, 0%, 100%, 0.7);\n background-color: var(--color-background-surface-default);\n padding: 10px;\n margin-top: 10px;\n}\n\n/* For the Y Axis item editor within the Edit Dialog */\n.v-small-dialog__content {\n background-color: var(--color-background-surface-selected);\n padding: 5px 5px;\n}\n\n.horizontal-lines {\n background-color: var(--color-background-surface-default);\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2023, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <!-- Edit Item dialog -->\n <v-dialog\n v-model=\"show\"\n persistent\n width=\"400\"\n @keydown.enter=\"success()\"\n @keydown.esc=\"$emit('cancel')\"\n >\n <v-card>\n <v-card-title class=\"mb-2\">Edit Item</v-card-title>\n <v-card-text>\n <v-select\n v-model=\"editItem.valueType\"\n variant=\"outlined\"\n hide-details\n label=\"Value Type\"\n :items=\"valueTypes\"\n class=\"mb-2\"\n />\n <v-select\n v-model=\"editItem.reduced\"\n variant=\"outlined\"\n hide-details\n label=\"Reduction\"\n :items=\"reduction\"\n class=\"mb-2\"\n />\n <v-select\n v-model=\"editItem.reducedType\"\n variant=\"outlined\"\n hide-details\n label=\"Reduced Type\"\n :items=\"reducedTypes\"\n :disabled=\"editItem.reduced === 'DECOM'\"\n class=\"mb-2\"\n />\n <v-select\n v-model=\"editItem.color\"\n variant=\"outlined\"\n hide-details\n label=\"Color\"\n :items=\"colors\"\n class=\"mb-2\"\n @update:model-value=\"$emit('changeColor', $event)\"\n />\n <div v-if=\"limitsNames.length > 1\">\n <v-select\n v-model=\"limitsName\"\n variant=\"outlined\"\n hide-details\n label=\"Display Limits\"\n :items=\"limitsNames\"\n @update:model-value=\"$emit('changeLimits', limits[limitsName])\"\n />\n <div class=\"pa-3\">{{ limitsName }}: {{ limits[limitsName] }}</div>\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"outlined\" @click=\"$emit('cancel')\"> Cancel </v-btn>\n <v-btn variant=\"flat\" @click=\"$emit('close', editItem)\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { OpenC3Api } from '@openc3/js-common/services'\nexport default {\n props: {\n modelValue: Boolean,\n item: {\n type: Object,\n required: true,\n },\n colors: {\n type: Array,\n required: true,\n },\n },\n emits: [\n 'cancel',\n 'changeColor',\n 'changeLimits',\n 'close',\n 'update:modelValue',\n ],\n data: function () {\n return {\n editItem: null,\n limitsName: 'NONE',\n // NONE: [] matches the default limits assigned in Graph addItems\n limits: { NONE: [] },\n valueTypes: ['CONVERTED', 'RAW'],\n reduction: [\n // Map NONE to DECOM for clarity\n { title: 'NONE', value: 'DECOM' },\n { title: 'REDUCED_MINUTE', value: 'REDUCED_MINUTE' },\n { title: 'REDUCED_HOUR', value: 'REDUCED_HOUR' },\n { title: 'REDUCED_DAY', value: 'REDUCED_DAY' },\n ],\n reducedTypes: ['MIN', 'MAX', 'AVG', 'STDDEV'],\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n limitsNames() {\n return Object.keys(this.limits)\n },\n },\n async created() {\n this.editItem = { ...this.item }\n new OpenC3Api()\n .get_item(this.item.targetName, this.item.packetName, this.item.itemName)\n .then((details) => {\n for (const [key, value] of Object.entries(details.limits)) {\n if (Object.keys(value).includes('red_low')) {\n this.limits[key] = Object.values(value)\n }\n }\n // Locate the key for the value array that we pass in\n this.limitsName = Object.keys(this.limits).find(\n // Little hack to compare arrays you convert them to strings\n (key) => this.limits[key] + '' === this.editItem.limits + '',\n )\n })\n },\n}\n</script>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2026, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n#\n# A portion of this file was funded by Blue Origin Enterprises, L.P.\n# See https://github.com/OpenC3/cosmos/pull/1957\n-->\n\n<template>\n <div @click.prevent=\"$emit('click')\">\n <v-card>\n <v-toolbar\n v-show=\"!hideToolbarData\"\n height=\"24\"\n class=\"pl-2 pr-2\"\n :class=\"selectedGraphId === id ? 'active' : ''\"\n >\n <v-btn\n v-show=\"errors.length !== 0\"\n class=\"mx-2\"\n icon=\"mdi-alert\"\n density=\"compact\"\n variant=\"text\"\n aria-label=\"Show Errors\"\n @click=\"\n () => {\n errorDialog = true\n }\n \"\n />\n\n <v-btn\n icon=\"mdi-pencil\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"edit-graph-icon\"\n aria-label=\"Edit Graph\"\n @click=\"\n () => {\n editGraph = true\n }\n \"\n />\n\n <v-tooltip\n v-if=\"legendHidden\"\n text=\"Legend hidden. Restore via Graph > Settings dialog.\"\n location=\"bottom\"\n >\n <template #activator=\"{ props }\">\n <v-icon v-bind=\"props\" size=\"small\" class=\"mx-1\">\n mdi-information-outline\n </v-icon>\n </template>\n </v-tooltip>\n\n <v-spacer />\n <span> {{ title }} </span>\n <v-spacer />\n\n <template v-if=\"expand\">\n <v-btn\n v-if=\"calcFullSize\"\n icon=\"mdi-arrow-collapse\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"collapse-all\"\n @click=\"collapseAll\"\n />\n <v-btn\n v-else\n icon=\"mdi-arrow-expand\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"expand-all\"\n @click=\"expandAll\"\n />\n\n <v-btn\n v-if=\"fullWidth\"\n icon=\"mdi-arrow-collapse-horizontal\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"collapse-width\"\n @click=\"collapseWidth\"\n />\n <v-btn\n v-else\n icon=\"mdi-arrow-expand-horizontal\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"expand-width\"\n @click=\"expandWidth\"\n />\n\n <v-btn\n v-if=\"fullHeight\"\n icon=\"mdi-arrow-collapse-vertical\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"collapse-height\"\n @click=\"collapseHeight\"\n />\n <v-btn\n v-else\n icon=\"mdi-arrow-expand-vertical\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"expand-height\"\n @click=\"expandHeight\"\n />\n </template>\n\n <v-btn\n v-if=\"expand\"\n icon=\"mdi-window-minimize\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"minimize-screen-icon\"\n @click=\"minMaxTransition\"\n />\n <v-btn\n v-else\n icon=\"mdi-window-maximize\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"maximize-screen-icon\"\n @click=\"minMaxTransition\"\n />\n\n <v-btn\n icon=\"mdi-close-box\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"close-graph-icon\"\n @click.stop=\"$emit('close-graph')\"\n />\n </v-toolbar>\n\n <v-expand-transition @after-enter=\"resize\">\n <div v-show=\"expand\" id=\"chart\" ref=\"chart\" class=\"pa-1\">\n <div :id=\"`chart${id}`\"></div>\n <div id=\"betweenCharts\"></div>\n <div v-show=\"showOverview\" :id=\"`overview${id}`\"></div>\n </div>\n </v-expand-transition>\n </v-card>\n\n <!-- Edit graph dialog -->\n <graph-edit-dialog\n v-if=\"editGraph\"\n v-model=\"editGraph\"\n v-model:x-axis-item=\"xAxisItem\"\n :title=\"title\"\n :legend-position=\"legendPosition\"\n :items=\"items\"\n :graph-min-y=\"graphMinY\"\n :graph-max-y=\"graphMaxY\"\n :lines=\"lines\"\n :colors=\"colors\"\n :start-date-time=\"graphStartDateTime\"\n :end-date-time=\"graphEndDateTime\"\n :time-zone=\"timeZone\"\n :x-axis-item-packet=\"allowableXAxisItemPacket\"\n @remove=\"removeItems([$event])\"\n @ok=\"editGraphClose\"\n @cancel=\"editGraph = false\"\n />\n\n <!-- Error dialog -->\n <v-dialog v-model=\"errorDialog\" max-width=\"600\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Errors </span>\n <v-spacer />\n </v-toolbar>\n <v-card class=\"pa-3\">\n <v-row dense>\n <v-text-field\n v-model=\"title\"\n readonly\n hide-details\n class=\"pb-2\"\n label=\"Graph Title\"\n />\n </v-row>\n <v-row class=\"my-3\">\n <v-textarea readonly rows=\"8\" :model-value=\"error\" />\n </v-row>\n <v-row>\n <v-btn block @click=\"clearErrors\"> Clear </v-btn>\n </v-row>\n </v-card>\n </v-dialog>\n\n <!-- Edit right click context menu -->\n <v-menu\n v-if=\"editGraphMenu\"\n v-model=\"editGraphMenu\"\n :target=\"[editGraphMenuX, editGraphMenuY]\"\n absolute\n >\n <v-list>\n <v-list-item @click=\"editGraph = true\">\n <v-list-item-title style=\"cursor: pointer\">\n Edit {{ title }}\n </v-list-item-title>\n </v-list-item>\n </v-list>\n </v-menu>\n\n <graph-edit-item-dialog\n v-if=\"editItem\"\n v-model=\"editItem\"\n :colors=\"colors\"\n :item=\"selectedItem\"\n @change-color=\"changeColor\"\n @change-limits=\"changeLimits\"\n @cancel=\"editItem = false\"\n @close=\"closeEditItem\"\n />\n\n <!-- Edit Item right click context menu -->\n <v-menu\n v-if=\"itemMenu\"\n v-model=\"itemMenu\"\n :target=\"[itemMenuX, itemMenuY]\"\n absolute\n >\n <v-list nav density=\"compact\">\n <v-list-subheader>\n {{ selectedItem.targetName }}\n {{ selectedItem.packetName }}\n {{ selectedItem.itemName }}\n </v-list-subheader>\n <v-list-item @click=\"editItem = true\">\n <template #prepend>\n <v-icon icon=\"mdi-pencil\" />\n </template>\n <v-list-item-title> Edit </v-list-item-title>\n </v-list-item>\n <v-list-item @click=\"clearData([selectedItem])\">\n <template #prepend>\n <v-icon icon=\"mdi-eraser\" />\n </template>\n <v-list-item-title> Clear </v-list-item-title>\n </v-list-item>\n <v-list-item @click=\"removeItems([selectedItem])\">\n <template #prepend>\n <v-icon icon=\"mdi-delete\" />\n </template>\n <v-list-item-title> Delete </v-list-item-title>\n </v-list-item>\n </v-list>\n </v-menu>\n\n <!-- Edit Legend right click context menu -->\n <v-menu\n v-if=\"legendMenu\"\n v-model=\"legendMenu\"\n :target=\"[legendMenuX, legendMenuY]\"\n absolute\n >\n <v-list>\n <v-list-item @click=\"moveLegend('top')\">\n <v-list-item-title style=\"cursor: pointer\">\n Legend Top\n </v-list-item-title>\n </v-list-item>\n <v-list-item @click=\"moveLegend('bottom')\">\n <v-list-item-title style=\"cursor: pointer\">\n Legend Bottom\n </v-list-item-title>\n </v-list-item>\n <v-list-item @click=\"moveLegend('left')\">\n <v-list-item-title style=\"cursor: pointer\">\n Legend Left\n </v-list-item-title>\n </v-list-item>\n <v-list-item @click=\"moveLegend('right')\">\n <v-list-item-title style=\"cursor: pointer\">\n Legend Right\n </v-list-item-title>\n </v-list-item>\n <v-divider />\n <v-list-item @click=\"legendHide\">\n <v-list-item-title style=\"cursor: pointer\">\n Hide Legend\n </v-list-item-title>\n </v-list-item>\n </v-list>\n </v-menu>\n\n <div v-if=\"!sparkline\" ref=\"info\" class=\"u-series\">\n <v-tooltip\n text=\"Click item to toggle, Right click to edit\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-icon v-bind=\"props\"> mdi-information-variant-circle </v-icon>\n </template>\n </v-tooltip>\n </div>\n </div>\n</template>\n\n<script>\nimport GraphEditDialog from './GraphEditDialog.vue'\nimport GraphEditItemDialog from './GraphEditItemDialog.vue'\nimport uPlot from 'uplot'\nimport bs from 'binary-search'\nimport { OpenC3Api, Cable } from '@openc3/js-common/services'\nimport { useStore } from '@/plugins/store'\nimport { TimeFilters } from '@/util'\nimport 'uplot/dist/uPlot.min.css'\n\nconst DEFAULT_X_AXIS_ITEM = '__time'\n// Max milliseconds to spend processing buffered data per animation frame\n// before yielding back to the browser for rendering\n// We're calling requestAnimationFrame which is typically 60Hz or every 16.667ms\n// A good rule of thumb is to stay within roughly half the frame budget, so 8–10ms.\n// This leaves the other ~7–8ms for the browser to do layout, paint, compositing, and GC.\nconst MAX_PROCESSING_MS = 10\n\nexport default {\n components: {\n GraphEditDialog,\n GraphEditItemDialog,\n },\n mixins: [TimeFilters],\n props: {\n id: {\n type: Number,\n required: true,\n },\n selectedGraphId: {\n type: Number,\n default: null,\n },\n state: {\n type: String,\n required: true,\n },\n // start time in nanoseconds to start the graph\n // this allows multiple graphs to be synchronized\n startTime: {\n type: Number,\n default: null,\n },\n secondsGraphed: {\n type: Number,\n required: true,\n },\n pointsSaved: {\n type: Number,\n required: true,\n },\n pointsGraphed: {\n type: Number,\n required: true,\n },\n refreshIntervalMs: {\n type: Number,\n default: 200,\n },\n hideToolbar: {\n type: Boolean,\n default: false,\n },\n hideOverview: {\n type: Boolean,\n default: false,\n },\n hideLegend: {\n type: Boolean,\n default: false,\n },\n sparkline: {\n type: Boolean,\n default: false,\n },\n initialItems: {\n type: Array,\n default: () => [],\n },\n initialXAxisItem: {\n type: String,\n default: DEFAULT_X_AXIS_ITEM,\n },\n // These allow the parent to force a specific height and/or width\n height: {\n type: Number,\n default: null,\n },\n width: {\n type: Number,\n default: null,\n },\n timeZone: {\n type: String,\n default: 'local',\n },\n },\n emits: [\n 'click',\n 'close-graph',\n 'edit',\n 'min-max-graph',\n 'pause',\n 'resize',\n 'start',\n 'started',\n 'hide-legend',\n ],\n setup() {\n const store = useStore()\n return { store }\n },\n data() {\n return {\n api: null,\n lines: [],\n active: true,\n expand: true,\n fullWidth: true,\n fullHeight: true,\n graph: null,\n editGraph: false,\n editGraphMenu: false,\n editGraphMenuX: 0,\n editGraphMenuY: 0,\n editItem: false,\n itemMenu: false,\n itemMenuX: 0,\n itemMenuY: 0,\n legendMenu: false,\n legendMenuX: 0,\n legendMenuY: 0,\n legendHidden: this.hideLegend,\n legendPosition: 'bottom',\n selectedItem: null,\n hideToolbarData: this.hideToolbar,\n showOverview: !this.hideOverview,\n hideOverviewData: this.hideOverview,\n title: '',\n overview: null,\n data: [[]],\n dataChanged: false,\n interval: null,\n graphMinY: null,\n graphMaxY: null,\n graphStartDateTime: null,\n graphEndDateTime: null,\n xAxisItem: this.initialXAxisItem, // '__time' or something like 'DECOM__TLM__INST__ADCS__RECEIVED_COUNT__CONVERTED'\n indexes: {},\n items: this.initialItems,\n graphItems: [],\n lastPlaybackDateTime: null,\n limitsValues: [],\n drawInterval: null,\n zoomChart: false,\n zoomOverview: false,\n cable: new Cable(),\n subscription: null,\n needToUpdate: false,\n pendingData: [],\n processingRAF: null,\n lastRenderTime: 0,\n errorDialog: false,\n errors: [],\n colorIndex: 0,\n colors: [\n // The first 3 are taken from the Astro css definitions for\n // --color-data-visualization-1 through 3\n '#00c7cb',\n '#938bdb',\n '#4dacff',\n 'lime',\n 'darkorange',\n 'red',\n 'gold',\n 'hotpink',\n 'tan',\n 'cyan',\n 'maroon',\n 'blue',\n 'teal',\n 'purple',\n 'green',\n 'brown',\n 'lightblue',\n 'white',\n 'black',\n ],\n }\n },\n computed: {\n calcFullSize: function () {\n return this.fullWidth || this.fullHeight\n },\n error: function () {\n if (this.errorDialog && this.errors.length > 0) {\n return JSON.stringify(this.errors, null, 4)\n }\n return null\n },\n itemSubscriptionKeys: function () {\n return this.items.map(this.subscriptionKey)\n },\n allowableXAxisItemPacket: function () {\n if (!this.canUseCustomXAxisItem || this.items.length === 0) {\n return undefined\n }\n const { targetName, packetName } = this.items[0]\n return { targetName, packetName }\n },\n canUseCustomXAxisItem: function () {\n // Make sure we're not mixing packets, because items from different packets will be received at different times.\n // If it was mixed, e.g. `xAxisItem` is 'INST__ADCS__RECEIVED_COUNT' and you were graphing\n // 'INST__HEALTH_STATUS__TEMP1', then the `received` handler wouldn't know which x-axis values to apply to the\n // received TEMP1 data points.\n if (this.items.length === 0) {\n return true\n }\n const { targetName, packetName } = this.items[0]\n return this.items.every(\n (item) =>\n item.targetName === targetName && item.packetName === packetName,\n )\n },\n actualXAxisItem: function () {\n if (this.canUseCustomXAxisItem && this.xAxisItem) {\n return this.xAxisItem\n } else {\n return DEFAULT_X_AXIS_ITEM\n }\n },\n xAxisConverter: function () {\n if (this.xAxisIsDefault) {\n return (val) => val / 1_000_000_000.0 // nsec to sec\n }\n return (val) => val\n },\n xAxisFormatter: function () {\n return (val) => {\n if (val == null) {\n return '--'\n } else if (this.xAxisIsTime) {\n // Convert the unix timestamp into a formatted date / time\n return this.formatSeconds(val, this.timeZone)\n }\n return val\n }\n },\n xAxisLabel: function () {\n return this.xAxisIsTime ? 'Time' : this.actualXAxisItem.split('__').at(-2)\n },\n xAxisIsDefault: function () {\n return this.actualXAxisItem === DEFAULT_X_AXIS_ITEM\n },\n xAxisIsTime: function () {\n const timeItems = ['PACKET_TIMESECONDS', 'RECEIVED_TIMESECONDS']\n return (\n this.xAxisIsDefault ||\n timeItems.includes(this.actualXAxisItem.split('__').at(4))\n )\n },\n xAxisIsAlsoGraphedItem: function () {\n return this.itemSubscriptionKeys.includes(this.actualXAxisItem)\n },\n playbackMode: function () {\n return this.store.playback.playbackMode\n },\n playbackDateTime: function () {\n return this.store.playback.playbackDateTime\n },\n playbackStep: function () {\n return this.store.playback.playbackStep\n },\n },\n watch: {\n hideLegend: function (newVal) {\n this.legendHidden = newVal\n },\n legendHidden: function (newVal) {\n this.applyHideLegend(newVal)\n },\n state: function (newState, oldState) {\n switch (newState) {\n case 'start':\n // Only subscribe if we were previously stopped\n // If we were paused we do nothing ... see the data function\n if (oldState === 'stop') {\n this.startGraph()\n }\n break\n // case 'pause': Nothing to do ... see the data function\n case 'stop':\n this.stopGraph()\n break\n }\n },\n playbackMode: function (_newState, _oldState) {\n if (this.playbackMode === 'playback') {\n this.setupPlaybackMode()\n } else {\n // realtime\n this.lastPlaybackDateTime = null\n this.clearAllData()\n this.startGraph()\n }\n },\n playbackDateTime: function (_newState, _oldState) {\n if (this.playbackMode === 'playback') {\n if (\n this.lastPlaybackDateTime === null ||\n this.lastPlaybackDateTime > this.playbackDateTime\n ) {\n // If we are going backwards in time we need to clear the data\n this.clearAllData()\n } else {\n // Track that we're waiting for playback data\n // Increment store counter so skip buttons are disabled until all graphs finish loading\n this.store.updatePlayback({\n playbackLoading: this.store.playback.playbackLoading + 1,\n })\n this.api\n .get_tlm_values(\n this.graphItems,\n 30, // stale timeout\n null, // no cache timeout\n this.lastPlaybackDateTime, // start time\n this.playbackDateTime, // end time\n )\n .then((data) => {\n if (data.length > 0) {\n if (Array.isArray(data[0]) && Array.isArray(data[0][0])) {\n // data is array of array of arrays\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].length; j++) {\n if (j === 0) {\n let dateStr = data[i][j][0]\n let dateObj = new Date(dateStr)\n this.data[0].push(dateObj.getTime() / 1000.0) // Convert to seconds\n } else {\n this.data[j].push(data[i][j][0])\n }\n }\n }\n } else if (Array.isArray(data) && data.length >= 2) {\n for (let i = 0; i < data.length; i++) {\n if (i === 0) {\n let dateStr = data[i][0]\n let dateObj = new Date(dateStr)\n this.data[0].push(dateObj.getTime() / 1000.0) // Convert to seconds\n } else {\n this.data[i].push(data[i][0])\n }\n }\n }\n }\n this.dataChanged = true\n this.updateGraphData()\n })\n .catch((error) => {\n // eslint-disable-next-line no-console\n console.error('Error fetching playback telemetry:', error)\n })\n .finally(() => {\n // Decrement store counter now that playback request has completed\n this.store.updatePlayback({\n playbackLoading: Math.max(\n 0,\n this.store.playback.playbackLoading - 1,\n ),\n })\n })\n }\n this.lastPlaybackDateTime = this.playbackDateTime\n }\n },\n data: function (newData, oldData) {\n this.dataChanged = true\n },\n graphMinY: function (newVal, oldVal) {\n let val = Number.parseFloat(newVal)\n if (Number.isFinite(val)) {\n this.graphMinY = val\n }\n this.setGraphRange()\n },\n graphMaxY: function (newVal, oldVal) {\n let val = Number.parseFloat(newVal)\n if (Number.isFinite(val)) {\n this.graphMaxY = val\n }\n this.setGraphRange()\n },\n graphStartDateTime: function (newVal, oldVal) {\n if (newVal && typeof newVal === 'string') {\n this.graphStartDateTime =\n this.parseDateTime(this.graphStartDateTime, this.timeZone) * 1000000\n if (this.graphStartDateTime !== oldVal) {\n this.needToUpdate = true\n }\n } else if (newVal === null && oldVal) {\n // If they clear the start date time we need to update\n this.graphStartDateTime = null\n this.needToUpdate = true\n }\n },\n graphEndDateTime: function (newVal, oldVal) {\n if (newVal && typeof newVal === 'string') {\n this.graphEndDateTime =\n this.parseDateTime(this.graphEndDateTime, this.timeZone) * 1000000\n if (this.graphEndDateTime !== oldVal) {\n this.needToUpdate = true\n }\n } else if (newVal === null && oldVal) {\n // If they clear the end date time we need to update\n this.graphEndDateTime = null\n this.needToUpdate = true\n }\n },\n actualXAxisItem: function (newVal, oldVal) {\n let clonedItems = JSON.parse(JSON.stringify(this.items))\n this.removeItems(clonedItems)\n this.graph.destroy()\n this.chartOpts.series[0].label = this.xAxisLabel\n this.chartOpts.scales.x.time = this.xAxisIsTime\n this.graph = new uPlot(\n this.chartOpts,\n this.data,\n document.getElementById(`chart${this.id}`),\n )\n if (!this.hideOverview) {\n this.overview.destroy()\n this.overviewOpts.scales.x.time = this.xAxisIsTime\n this.overview = new uPlot(\n this.overviewOpts,\n this.data,\n document.getElementById(`overview${this.id}`),\n )\n }\n this.addItems(clonedItems)\n // Don't need to $emit('edit') because addItems() does that\n },\n refreshIntervalMs: function (val) {\n if (this.interval) {\n clearInterval(this.interval)\n this.interval = setInterval(() => {\n this.updateGraphData()\n }, val)\n }\n },\n },\n created() {\n this.api = new OpenC3Api()\n this.title = `Graph ${this.id}`\n for (const [index, item] of this.items.entries()) {\n this.data.push([]) // initialize the empty data arrays\n this.indexes[this.subscriptionKey(item)] = index + 1\n if (item.color === undefined) {\n item.color = this.colors[this.colorIndex]\n }\n this.colorIndex++\n if (this.colorIndex === this.colors.length) {\n this.colorIndex = 0\n }\n }\n },\n mounted() {\n // This code allows for temporary pulling in a patched uPlot\n // Also note you need to add 'async' before the mounted method for await\n // const plugin = document.createElement('script')\n // plugin.setAttribute(\n // 'src',\n // 'https://leeoniya.github.io/uPlot/dist/uPlot.iife.min.js'\n // )\n // plugin.async = true\n // document.head.appendChild(plugin)\n // await new Promise(r => setTimeout(r, 500)) // Allow the js to load\n\n // TODO: This is demo / performance code of multiple items with many data points\n // 10 items at 500,000 each renders immediately and uses 180MB in Chrome\n // Refresh still works, chrome is sluggish but once you pause it is very performant\n // 500,000 pts at 1Hz is 138.9hrs .. almost 6 days\n //\n // 10 items at 100,000 each is very performant ... 1,000,000 pts is Qt TlmGrapher default\n // 100,000 pts at 1Hz is 27.8hrs\n //\n // 100,000 takes 40ms, Chrome uses 160MB\n // this.data = []\n // const dataPoints = 100000\n // const items = 10\n // let pts = new Array(dataPoints)\n // let times = new Array(dataPoints)\n // let time = 1589398007\n // let series = [{}]\n // for (let i = 0; i < dataPoints; i++) {\n // times[i] = time\n // pts[i] = i\n // time += 1\n // }\n // this.data.push(times)\n // for (let i = 0; i < items; i++) {\n // this.data.push(pts.map(x => x + i))\n // series.push({\n // label: 'Item' + i,\n // stroke: this.colors[i]\n // })\n // }\n\n // NOTE: These are just initial settings ... actual series are added by this.graph.addSeries\n const { chartSeries, overviewSeries } = this.items.reduce(\n (seriesObj, item) => {\n const commonProps = {\n spanGaps: true,\n }\n seriesObj.chartSeries.push({\n ...commonProps,\n item: item,\n label: this.formatLabel(item),\n stroke: (u, seriesIdx) => {\n return this.items[seriesIdx - 1].color\n },\n width: 2,\n value: (self, rawValue) => {\n if (typeof rawValue === 'string' || Number.isNaN(rawValue)) {\n return 'NaN'\n } else {\n return rawValue == null ? '--' : rawValue.toFixed(3)\n }\n },\n })\n seriesObj.overviewSeries.push({\n ...commonProps,\n })\n return seriesObj\n },\n { chartSeries: [], overviewSeries: [] },\n )\n\n this.chartOpts = {}\n if (this.sparkline) {\n this.hideToolbarData = true\n this.hideOverviewData = true\n this.showOverview = false\n this.chartOpts = {\n width: this.width,\n height: this.height,\n pxAlign: false,\n cursor: {\n show: false,\n },\n select: {\n show: false,\n },\n legend: {\n show: false,\n },\n scales: {\n x: {\n time: false,\n },\n },\n axes: [\n {\n show: false,\n },\n {\n show: false,\n },\n ],\n series: [\n {},\n {\n stroke: 'white', // TODO: Light / dark theme\n },\n ],\n }\n this.graph = new uPlot(\n this.chartOpts,\n this.data,\n document.getElementById(`chart${this.id}`),\n )\n } else {\n // Uplot wants the real timezone name ('local' doesn't work)\n let timeZoneName = Intl.DateTimeFormat().resolvedOptions().timeZone\n if (this.timeZone && this.timeZone !== 'local') {\n timeZoneName = this.timeZone\n }\n this.chartOpts = {\n ...this.getSize('chart'),\n ...this.getScales(),\n ...this.getAxes('chart'),\n // series: series, // TODO: Uncomment with the performance code\n plugins: [this.linesPlugin()],\n tzDate: (ts) => uPlot.tzDate(new Date(ts * 1e3), timeZoneName),\n series: [\n {\n label: this.xAxisLabel,\n value: (u, v) => this.xAxisFormatter(v),\n },\n ...chartSeries,\n ],\n cursor: {\n drag: {\n x: true,\n y: false,\n },\n // Sync the cursor across graphs so mouseovers are synced\n sync: {\n key: 'openc3',\n // setSeries links graphs so clicking an item to hide it also hides the other graph item\n // setSeries: true,\n },\n bind: {\n mouseup: (self, targ, handler) => {\n return (e) => {\n // Single click while paused will resume the graph\n // This makes it possible to resume in TlmViewer widgets\n if (this.state === 'pause' && self.select.width === 0) {\n this.$emit('start')\n }\n handler(e)\n }\n },\n },\n },\n hooks: {\n setScale: [\n (chart, key) => {\n if (key === 'x' && !this.zoomOverview && this.overview) {\n this.zoomChart = true\n let left = Math.round(\n this.overview.valToPos(chart.scales.x.min, 'x'),\n )\n let right = Math.round(\n this.overview.valToPos(chart.scales.x.max, 'x'),\n )\n this.overview.setSelect({ left, width: right - left })\n this.zoomChart = false\n }\n },\n ],\n setSelect: [\n (chart) => {\n // Pause the graph while selecting a range to zoom\n if (this.state === 'start' && chart.select.width > 0) {\n this.$emit('pause')\n }\n },\n ],\n ready: [\n (u) => {\n let canvas = u.root.querySelector('.u-over')\n canvas.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.itemMenu = false\n this.legendMenu = false\n this.editGraphMenuX = e.clientX\n this.editGraphMenuY = e.clientY\n this.editGraphMenu = true\n })\n let legend = u.root.querySelector('.u-legend')\n legend.addEventListener('contextmenu', (e) => {\n e.preventDefault()\n this.editGraphMenu = false\n this.legendMenu = false\n this.itemMenuX = e.clientX\n this.itemMenuY = e.clientY\n // Grab the closest series and then figure out which index it is\n let seriesEl = e.target.closest('.u-series')\n let seriesIdx = Array.prototype.slice\n .call(legend.childNodes[0].childNodes)\n .indexOf(seriesEl)\n let series = u.series[seriesIdx]\n if (series.item) {\n this.selectedItem = series.item\n this.itemMenu = true\n } else {\n this.itemMenu = false\n this.legendMenuX = e.clientX\n this.legendMenuY = e.clientY\n this.legendMenu = true\n }\n })\n // Append the info to the legend\n legend.querySelector('tbody').appendChild(this.$refs.info)\n },\n ],\n },\n }\n this.graph = new uPlot(\n this.chartOpts,\n this.data,\n document.getElementById(`chart${this.id}`),\n )\n\n this.overviewOpts = {\n ...this.getSize('overview'),\n ...this.getScales(),\n ...this.getAxes('overview'),\n // series: series, // TODO: Uncomment with the performance code\n tzDate: (ts) => uPlot.tzDate(new Date(ts * 1e3), timeZoneName),\n series: [...overviewSeries],\n cursor: {\n y: false,\n drag: {\n setScale: false,\n x: true,\n y: false,\n },\n },\n legend: {\n show: false,\n },\n hooks: {\n setSelect: [\n (chart) => {\n if (!this.zoomChart) {\n // Pause the graph while selecting an overview range to zoom\n if (this.state === 'start' && chart.select.width > 0) {\n this.$emit('pause')\n }\n this.zoomOverview = true\n let min = chart.posToVal(chart.select.left, 'x')\n let max = chart.posToVal(\n chart.select.left + chart.select.width,\n 'x',\n )\n this.graph.setScale('x', { min, max })\n this.zoomOverview = false\n }\n },\n ],\n },\n }\n if (!this.hideOverview) {\n this.overview = new uPlot(\n this.overviewOpts,\n this.data,\n document.getElementById(`overview${this.id}`),\n )\n }\n this.moveLegend(this.legendPosition)\n this.applyHideLegend(this.legendHidden)\n\n // Allow the charts to dynamically resize when the window resizes\n window.addEventListener('resize', this.resize)\n }\n\n if (this.playbackMode !== 'playback') {\n if (this.state !== 'stop') {\n this.startGraph()\n }\n } else {\n this.setupPlaybackMode()\n }\n },\n beforeUnmount: function () {\n this.stopGraph()\n this.cable.disconnect()\n window.removeEventListener('resize', this.resize)\n },\n methods: {\n setupPlaybackMode: function () {\n this.stopGraph()\n this.clearAllData()\n const screenItems = this.itemSubscriptionKeys.map((key) => {\n return key.split('__').slice(2).join('__')\n })\n if (this.actualXAxisItem === DEFAULT_X_AXIS_ITEM) {\n // When in playback we don't have the DEFAULT_X_AXIS_ITEM '__time' available from the stream\n // So parse the first item and add the PACKET_TIMESECONDS from that target / packet\n const tgtpkt = screenItems[0].split('__').slice(0, 2).join('__')\n screenItems.unshift(`${tgtpkt}__PACKET_TIMESECONDS__RAW`)\n } else if (!this.xAxisIsAlsoGraphedItem) {\n // We need to add the x-axis item if it isn't already being graphed\n screenItems.unshift(this.actualXAxisItem)\n }\n this.api.get_tlm_available(screenItems).then((data) => {\n this.graphItems = data\n // This must be the same or we're going to have problems\n // because the data comes back in an ordered array\n if (screenItems.length != data.length) {\n // eslint-disable-next-line no-console\n console.log(\n 'Error getting tlm available',\n screenItems,\n this.graphItems,\n )\n }\n })\n },\n startGraph: function () {\n this.subscribe()\n this.interval = setInterval(() => {\n this.updateGraphData()\n }, this.refreshIntervalMs)\n },\n stopGraph: function () {\n if (this.processingRAF !== null) {\n cancelAnimationFrame(this.processingRAF)\n this.processingRAF = null\n }\n this.pendingData = []\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n if (this.interval) {\n clearInterval(this.interval)\n this.interval = null\n }\n },\n updateGraphData: function () {\n // Ignore changes to the data while we're paused\n if (this.state === 'pause' || !this.dataChanged) {\n return\n }\n // Throttle renders while still receiving/processing burst data\n // to avoid expensive re-renders every 200ms during historical data floods\n if (this.pendingData.length > 0 || this.processingRAF !== null) {\n if (performance.now() - this.lastRenderTime < 1000) {\n return\n }\n }\n this.graph.setData(this.data)\n if (this.overview) {\n this.overview.setData(this.data)\n }\n this.lastRenderTime = performance.now()\n\n const xAxisData = this.data[0]\n if (xAxisData && xAxisData.length) {\n let max = xAxisData.at(-1)\n const possibleMinValues = [xAxisData.at(0)]\n if (this.pointsGraphed <= xAxisData.length) {\n possibleMinValues.push(xAxisData.at(-this.pointsGraphed))\n }\n if (this.xAxisIsTime) {\n possibleMinValues.push(max - this.secondsGraphed)\n }\n const min = Math.max(...possibleMinValues)\n if (min === max) {\n max += 1\n }\n this.graph.setScale('x', { min, max })\n }\n\n this.dataChanged = false\n },\n formatLabel(item) {\n if (item.valueType === 'CONVERTED' && item.reduced === 'DECOM') {\n return item.itemName\n } else {\n let description = ''\n // Only display valueType if we're not CONVERTED\n if (item.valueType !== 'CONVERTED') {\n description += item.valueType\n }\n // Only display reduced if we're not DECOM\n if (item.reduced !== 'DECOM') {\n // If we already have the valueType add a space\n if (description !== '') {\n description += ' '\n }\n description += `${item.reduced.split('_')[1]} ${item.reducedType}`\n }\n return `${item.itemName} (${description})`\n }\n },\n applyHideLegend: function (hide) {\n if (!this.graph) return\n const legend = this.graph.root.querySelector('.u-legend')\n if (legend) {\n legend.style.display = hide ? 'none' : ''\n }\n this.resize()\n },\n legendHide: function () {\n this.legendHidden = true\n this.$emit('hide-legend')\n },\n moveLegend: function (desired) {\n switch (desired) {\n case 'bottom':\n this.graph.root.classList.remove('side-legend')\n this.graph.root.classList.remove('left-legend')\n this.graph.root.classList.remove('top-legend')\n break\n case 'top':\n this.graph.root.classList.remove('side-legend')\n this.graph.root.classList.remove('left-legend')\n this.graph.root.classList.add('top-legend')\n break\n case 'left':\n this.graph.root.classList.remove('top-legend')\n this.graph.root.classList.add('side-legend')\n this.graph.root.classList.add('left-legend')\n break\n case 'right':\n this.graph.root.classList.remove('top-legend')\n this.graph.root.classList.remove('left-legend')\n this.graph.root.classList.add('side-legend')\n break\n }\n this.legendPosition = desired\n this.resize()\n },\n clearErrors: function () {\n this.errors = []\n },\n editGraphClose: function (graph) {\n this.editGraph = false\n this.title = graph.title\n // Don't need to copy items because we don't modify them\n this.legendPosition = graph.legendPosition\n this.graphMinY = graph.graphMinY\n this.graphMaxY = graph.graphMaxY\n this.lines = [...graph.lines]\n this.graphStartDateTime = graph.startDateTime\n this.graphEndDateTime = graph.endDateTime\n // Allow the watch to update needToUpdate\n this.$nextTick(() => {\n if (this.needToUpdate) {\n if (this.subscription == null) {\n this.startGraph()\n } else {\n // NOTE: removing and adding back to back broke the streaming_api\n // because the messages got out of order (add before remove)\n // Code in openc3-cosmos-cmd-tlm-api/app/channels/application_cable/channel.rb\n // fixed the issue to enforce ordering.\n // Clone the items first because removeItems modifies this.items\n let clonedItems = JSON.parse(JSON.stringify(this.items))\n this.removeItems(clonedItems)\n setTimeout(() => {\n this.addItems(clonedItems)\n }, 0)\n }\n this.needToUpdate = false\n }\n })\n this.moveLegend(this.legendPosition)\n this.$emit('edit')\n },\n resize: function () {\n if (!this.graph) return\n this.graph.setSize(this.getSize('chart'))\n if (this.overview) {\n this.overview.setSize(this.getSize('overview'))\n }\n this.$emit('resize', this.id)\n },\n expandAll: function () {\n this.fullWidth = true\n this.fullHeight = true\n this.resize()\n },\n collapseAll: function () {\n this.fullWidth = false\n this.fullHeight = false\n this.resize()\n },\n expandWidth: function () {\n this.fullWidth = true\n this.resize()\n },\n collapseWidth: function () {\n this.fullWidth = false\n this.resize()\n },\n expandHeight: function () {\n this.fullHeight = true\n this.resize()\n },\n collapseHeight: function () {\n this.fullHeight = false\n this.resize()\n },\n minMaxTransition: function () {\n this.expand = !this.expand\n this.$emit('min-max-graph', this.id)\n },\n setGraphRange: function () {\n let pad = 0.1\n if (\n this.graphMinY ||\n this.graphMinY === 0 ||\n this.graphMaxY ||\n this.graphMaxY === 0\n ) {\n pad = 0\n }\n this.graph.scales.y.range = (u, dataMin, dataMax) => {\n let min = dataMin\n if (this.graphMinY || this.graphMinY === 0) {\n min = this.graphMinY\n }\n let max = dataMax\n if (this.graphMaxY || this.graphMaxY === 0) {\n max = this.graphMaxY\n }\n return uPlot.rangeNum(min, max, pad, true)\n }\n },\n subscribe: function () {\n this.cable\n .createSubscription('StreamingChannel', window.openc3Scope, {\n received: (data) => this.received(data),\n connected: () => {\n const itemsToAdd = [...this.items]\n if (!this.xAxisIsDefault && !this.xAxisIsAlsoGraphedItem) {\n itemsToAdd.push(this.actualXAxisItem)\n }\n this.addItemsToSubscription(itemsToAdd)\n },\n disconnected: (data) => {\n // If allowReconnect is true it means we got a disconnect due to connection lost or server disconnect\n // If allowReconnect is false this is a normal server close or client close\n if (data.allowReconnect) {\n this.errors.push({\n type: 'disconnected',\n message: 'OpenC3 backend connection disconnected',\n time: new Date().getTime(),\n })\n }\n },\n rejected: () => {\n this.errors.push({\n type: 'rejected',\n message: 'OpenC3 backend connection rejected',\n time: new Date().getTime(),\n })\n },\n })\n .then((subscription) => {\n this.subscription = subscription\n })\n },\n // throttle(cb, limit) {\n // let wait = false\n // return () => {\n // if (!wait) {\n // requestAnimationFrame(cb)\n // wait = true\n // setTimeout(() => {\n // wait = false\n // }, limit)\n // }\n // }\n // },\n getSize: function (type) {\n let navDrawerWidth = 0\n const navDrawer = document.getElementById('openc3-nav-drawer')\n if (navDrawer) {\n navDrawerWidth = navDrawer.classList.contains(\n 'v-navigation-drawer--active',\n )\n ? navDrawer.clientWidth\n : 0\n }\n let legendWidth = 0\n if (this.legendPosition === 'right' || this.legendPosition === 'left') {\n const legend = document.getElementsByClassName('u-legend')[0]\n legendWidth = legend.clientWidth\n }\n const viewWidth =\n Math.max(document.documentElement.clientWidth, window.innerWidth || 0) -\n navDrawerWidth -\n legendWidth\n const viewHeight = Math.max(\n document.documentElement.clientHeight,\n window.innerHeight || 0,\n )\n\n const panel = document.getElementsByClassName('v-expansion-panel')[0]\n let height = 100\n if (type === 'overview') {\n // Show overview if we're full height and we're not explicitly hiding it\n if (this.fullHeight && !this.hideOverviewData) {\n this.showOverview = true\n } else {\n this.showOverview = false\n }\n } else {\n // Height of chart is viewportSize - expansion-panel - overview - fudge factor (primarily padding)\n height = viewHeight - panel.clientHeight - height - 250\n if (!this.fullHeight) {\n height = height / 2.0 + 10 // 5px padding top and bottom\n }\n }\n // subtract off some arbitrary padding left and right to make the layout work\n let width = viewWidth - 70\n if (!this.fullWidth) {\n // 6px padding left and right defined in TlmGrapher.vue .item-content\n width = width / 2.0 - 12\n }\n return {\n width: this.width || width,\n height: this.height || height,\n }\n },\n getScales: function () {\n return {\n scales: {\n x: {\n range(u, dataMin, dataMax) {\n if (dataMin == null) {\n if (this.xAxisIsTime) {\n return [1566453600, 1566497660]\n }\n return [0, 1]\n }\n return [dataMin, dataMax]\n },\n time: this.xAxisIsTime,\n },\n y: {\n range(u, dataMin, dataMax) {\n if (dataMin == null) return [-100, 100]\n return uPlot.rangeNum(dataMin, dataMax, 0.1, true)\n },\n },\n },\n }\n },\n getAxes: function (type) {\n let strokeColor = 'rgba(255, 255, 255, .1)'\n let axisColor = 'white'\n return {\n axes: [\n {\n stroke: axisColor,\n grid: {\n show: true,\n stroke: strokeColor,\n width: 2,\n },\n },\n {\n size: 80, // This size supports values up to 8 digits plus sign\n stroke: axisColor,\n grid: {\n show: type === 'overview' ? false : true,\n stroke: strokeColor,\n width: 2,\n },\n // Forces the axis values to be formatted correctly\n // especially with really small or large values\n values(u, splits) {\n if (\n splits.some((el) => el >= 10000000) ||\n splits.every((el) => el < 0.01)\n ) {\n splits = splits.map((split) => split.toExponential(3))\n }\n return splits\n },\n },\n ],\n }\n },\n closeEditItem: function (event) {\n this.editItem = false\n if (\n // If we have an end time and anything was changed we basically regraph\n (this.graphEndDateTime !== null && this.selectedItem !== event) ||\n // If we're live graphing we just regraph if the types change\n this.selectedItem.valueType !== event.valueType ||\n this.selectedItem.reduced !== event.reduced ||\n this.selectedItem.reducedType !== event.reducedType\n ) {\n this.changeItem(event)\n }\n },\n changeColor: function (event) {\n let key = this.subscriptionKey(this.selectedItem)\n let index = this.indexes[key]\n this.items[index - 1].color = event\n this.selectedItem.color = event\n this.graph.root.querySelectorAll('.u-marker')[index].style.borderColor =\n event\n },\n changeLimits: function (limits) {\n let key = this.subscriptionKey(this.selectedItem)\n let index = this.indexes[key]\n this.items[index - 1].limits = limits\n this.selectedItem.limits = limits\n this.limitsValues = limits\n },\n linesPlugin: function () {\n return {\n hooks: {\n draw: (u) => {\n const { ctx, bbox } = u\n // These are all in canvas units\n const yMin = u.valToPos(u.scales.y.min, 'y', true)\n const yMax = u.valToPos(u.scales.y.max, 'y', true)\n const redLow = u.valToPos(this.limitsValues[0], 'y', true)\n const yellowLow = u.valToPos(this.limitsValues[1], 'y', true)\n const yellowHigh = u.valToPos(this.limitsValues[2], 'y', true)\n const redHigh = u.valToPos(this.limitsValues[3], 'y', true)\n\n // NOTE: These comparisons are tricky because the canvas\n // starts in the upper left with 0,0. Thus it grows downward\n // and to the right with increasing values. The comparisons\n // of scale and limitsValues use graph coordinates but the\n // fillRect calculations use the canvas coordinates.\n\n // Draw Y axis lines\n this.lines.forEach((line) => {\n if (\n u.scales.y.min <= line.yValue &&\n line.yValue <= u.scales.y.max\n ) {\n ctx.save()\n ctx.beginPath()\n ctx.strokeStyle = line.color\n ctx.lineWidth = 2\n ctx.moveTo(bbox.left, u.valToPos(line.yValue, 'y', true))\n ctx.lineTo(\n bbox.left + bbox.width,\n u.valToPos(line.yValue, 'y', true),\n )\n ctx.stroke()\n ctx.restore()\n }\n })\n\n ctx.save()\n ctx.beginPath()\n\n // Draw red limits\n ctx.fillStyle = 'rgba(255,0,0,0.15)'\n if (u.scales.y.min < this.limitsValues[0]) {\n let start = redLow < yMax ? yMax : redLow\n ctx.fillRect(bbox.left, redLow, bbox.width, yMin - start)\n }\n if (u.scales.y.max > this.limitsValues[3]) {\n let end = yMin < redHigh ? yMin : redHigh\n ctx.fillRect(bbox.left, yMax, bbox.width, end - yMax)\n }\n\n // Draw yellow limits\n ctx.fillStyle = 'rgba(255,255,0,0.15)'\n if (\n u.scales.y.min < this.limitsValues[1] && // yellowLow\n u.scales.y.max > this.limitsValues[0] // redLow\n ) {\n let start = yellowLow < yMax ? yMax : yellowLow\n ctx.fillRect(bbox.left, start, bbox.width, redLow - start)\n }\n if (\n u.scales.y.max > this.limitsValues[2] && // yellowHigh\n u.scales.y.min < this.limitsValues[3] // redHigh\n ) {\n let start = yMin < redHigh ? yMin : redHigh\n let end = yMin < yellowHigh ? yMin : yellowHigh\n ctx.fillRect(bbox.left, start, bbox.width, end - start)\n }\n\n // Draw green limits & operational limits\n ctx.fillStyle = 'rgba(0,255,0,0.15)'\n // If there are no operational limits the interior is all green\n if (this.limitsValues.length === 4) {\n // Determine if we show any green\n if (\n u.scales.y.min < this.limitsValues[2] && // yellowHigh\n u.scales.y.max > this.limitsValues[1] // yellowLow\n ) {\n let start = yellowHigh < yMax ? yMax : yellowHigh\n let end = yMin < yellowLow ? yMin : yellowLow\n ctx.fillRect(bbox.left, start, bbox.width, end - start)\n }\n } else {\n // Operational limits\n const greenLow = u.valToPos(this.limitsValues[4], 'y', true)\n const greenHigh = u.valToPos(this.limitsValues[5], 'y', true)\n if (\n u.scales.y.min < this.limitsValues[4] && // greenLow\n u.scales.y.max > this.limitsValues[1] // yellowLow\n ) {\n let start = greenLow < yMax ? yMax : greenLow\n ctx.fillRect(bbox.left, start, bbox.width, yellowLow - start)\n }\n if (\n u.scales.y.max > this.limitsValues[5] && // greenHigh\n u.scales.y.min < this.limitsValues[2] // yellowHigh\n ) {\n let start = yMin < yellowHigh ? yMin : yellowHigh\n let end = yMin < greenHigh ? yMin : greenHigh\n ctx.fillRect(bbox.left, start, bbox.width, end - start)\n }\n ctx.fillStyle = 'rgba(0,0,255,0.15)'\n let start = greenHigh < yMax ? yMax : greenHigh\n let end = yMin < greenLow ? yMin : greenLow\n ctx.fillRect(bbox.left, start, bbox.width, end - start)\n }\n ctx.stroke()\n ctx.restore()\n },\n },\n }\n },\n changeItem: function (event) {\n // NOTE: removing and adding items back to back broke the streaming_api\n // because the messages got out of order (add before remove)\n // Code in openc3-cosmos-cmd-tlm-api/app/channels/application_cable/channel.rb\n // fixed the issue to enforce ordering.\n this.removeItems([this.selectedItem])\n this.selectedItem.valueType = event.valueType\n this.selectedItem.reduced = event.reduced\n this.selectedItem.reducedType = event.reducedType\n setTimeout(() => {\n this.addItems([this.selectedItem])\n }, 0)\n },\n addItems: function (itemArray, type = 'CONVERTED') {\n itemArray.forEach((item) => {\n item.valueType ||= type // set the default type\n item.color ||= this.colors[this.colorIndex]\n item.limits ||= []\n\n if (item.limits.length > 0) {\n this.limitsValues = item.limits\n }\n\n this.colorIndex = (this.colorIndex + 1) % this.colors.length\n this.items.push(item)\n\n const index = this.data.length\n this.graph.addSeries(this.createSeriesConfig(item), index)\n\n if (this.overview) {\n this.overview.addSeries(this.createOverviewSeriesConfig(), index)\n }\n\n this.data.splice(index, 0, Array(this.data[0].length))\n this.indexes[this.subscriptionKey(item)] = index\n })\n\n this.updateColorIndex(itemArray)\n if (!this.xAxisIsDefault) {\n itemArray.push(this.actualXAxisItem)\n }\n this.addItemsToSubscription(itemArray)\n this.$emit('resize')\n this.$emit('edit')\n },\n createSeriesConfig: function (item) {\n return {\n spanGaps: true,\n item: item,\n label: this.formatLabel(item),\n stroke: (u, seriesIdx) => this.items[seriesIdx - 1].color,\n width: 2,\n value: (self, rawValue) => {\n if (typeof rawValue === 'string' || Number.isNaN(rawValue)) {\n return 'NaN'\n } else if (rawValue == null) {\n return '--'\n } else if (\n (Math.abs(rawValue) < 0.01 && rawValue !== 0) ||\n Math.abs(rawValue) >= 10000000\n ) {\n return rawValue.toExponential(6)\n } else {\n return rawValue.toFixed(6)\n }\n },\n }\n },\n createOverviewSeriesConfig: function () {\n return {\n spanGaps: true,\n stroke: (u, seriesIdx) => this.items[seriesIdx - 1].color,\n }\n },\n updateColorIndex: function (itemArray) {\n const lastItem = itemArray[itemArray.length - 1]\n if (lastItem) {\n const index = this.colors.indexOf(lastItem.color)\n if (index !== -1) {\n this.colorIndex = (index + 1) % this.colors.length\n }\n }\n },\n addItemsToSubscription: function (itemArray = this.items) {\n let theStartTime = this.startTime\n if (this.graphStartDateTime) {\n theStartTime = this.graphStartDateTime\n }\n const items = itemArray.map((item) => {\n if (typeof item === 'object') {\n return this.subscriptionKey(item)\n } else if (typeof item === 'string') {\n return item\n } else {\n throw new Error(\n `Invalid subscription item type for ${item}: ${typeof item}`,\n )\n }\n })\n if (this.subscription) {\n OpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(\n (refreshed) => {\n if (refreshed) {\n OpenC3Auth.setTokens()\n }\n this.subscription.perform('add', {\n scope: window.openc3Scope,\n token: localStorage.openc3Token,\n items: items,\n start_time: theStartTime,\n end_time: this.graphEndDateTime,\n })\n },\n )\n }\n },\n clearAllData: function () {\n // Clear all data so delete the time data as well\n this.data[0] = []\n this.clearData(this.items)\n },\n clearData: function (itemArray) {\n for (const key of itemArray.map(this.subscriptionKey)) {\n let index = this.indexes[key]\n this.data[index] = Array(this.data[0].length).fill(null)\n this.graph.setData(this.data)\n if (this.overview) {\n this.overview.setData(this.data)\n }\n }\n // data.length of 2 means we only have 1 item\n // so delete all the time (data[0]) to start fresh\n if (this.data.length === 2) {\n this.data[0] = []\n this.graph.setData(this.data)\n if (this.overview) {\n this.overview.setData(this.data)\n }\n }\n },\n removeItems: function (itemArray) {\n this.removeItemsFromSubscription(itemArray)\n\n for (const key of itemArray.map(this.subscriptionKey)) {\n const index = this.reorderIndexes(key)\n this.items.splice(index - 1, 1)\n this.data.splice(index, 1)\n this.graph.delSeries(index)\n this.graph.setData(this.data)\n if (this.overview) {\n this.overview.delSeries(index)\n this.overview.setData(this.data)\n }\n }\n // data.length of 1 means we've deleted all our items\n // so delete all the time (data[0]) to start fresh\n if (this.data.length === 1) {\n this.data[0] = []\n this.graph.setData(this.data)\n if (this.overview) {\n this.overview.setData(this.data)\n }\n }\n this.$emit('resize')\n this.$emit('edit')\n },\n removeItemsFromSubscription: function (itemArray = this.items) {\n if (this.subscription) {\n const items = itemArray.map((item) => {\n if (typeof item === 'object') {\n return this.subscriptionKey(item)\n } else if (typeof item === 'string') {\n return item\n } else {\n throw new Error(\n `Invalid subscription item type for ${item}: ${typeof item}`,\n )\n }\n })\n this.subscription.perform('remove', {\n scope: window.openc3Scope,\n token: localStorage.openc3Token,\n items: items,\n })\n }\n },\n reorderIndexes: function (key) {\n let index = this.indexes[key]\n delete this.indexes[key]\n for (let i in this.indexes) {\n if (this.indexes[i] > index) {\n this.indexes[i] -= 1\n }\n }\n return index\n },\n received: function (data) {\n this.cable.recordPing()\n // Buffer incoming data and schedule processing via requestAnimationFrame\n // to prevent blocking the main thread during historical data floods\n this.pendingData.push(data)\n if (this.processingRAF === null) {\n this.processingRAF = requestAnimationFrame(() =>\n this.processReceivedData(),\n )\n }\n },\n // Drains the pendingData buffer in a time-boxed loop. Each call is\n // triggered by a single requestAnimationFrame scheduled in received().\n // When processing exceeds MAX_PROCESSING_MS we schedule another frame\n // so the browser can paint and handle user input between batches.\n processReceivedData: function () {\n // The rAF that invoked us has already fired, so clear the handle\n this.processingRAF = null\n const startTime = performance.now()\n while (this.pendingData.length > 0) {\n const batch = this.pendingData.shift()\n this.processDataBatch(batch)\n // Yield to the browser if processing is taking too long\n if (\n performance.now() - startTime > MAX_PROCESSING_MS &&\n this.pendingData.length > 0\n ) {\n this.processingRAF = requestAnimationFrame(() =>\n this.processReceivedData(),\n )\n break\n }\n }\n },\n processDataBatch: function (data) {\n for (let i = 0; i < data.length; i++) {\n if (!data[i].hasOwnProperty(this.actualXAxisItem)) {\n // This happens if the streaming thread was already sending something when we switched xAxisItems.\n // Nothing we can do but throw away the point. It'll come back when the graph is reset anyway.\n continue\n }\n let xAxisVal = this.xAxisConverter(data[i][this.actualXAxisItem])\n let length = this.data[0].length\n if (length === 0 || xAxisVal > this.data[0][length - 1]) {\n // Nominal case - append new data to end\n for (let j = 0; j < this.data.length; j++) {\n this.data[j].push(null)\n }\n this.setDataAtIndex(this.data[0].length - 1, xAxisVal, data[i])\n } else if (xAxisVal === this.data[0][length - 1]) {\n // Same timestamp as last point - merge data into existing slot\n this.setDataAtIndex(length - 1, xAxisVal, data[i])\n } else {\n let index = bs(this.data[0], xAxisVal, this.bsComparator)\n if (index >= 0) {\n // Found a slot with the exact same time value - merge data into it\n this.setDataAtIndex(index, xAxisVal, data[i])\n } else {\n // Insert a new null slot at the ideal index for a new out-of-order timestamp\n const idealIndex = -index - 1\n for (let j = 0; j < this.data.length; j++) {\n this.data[j].splice(idealIndex, 0, null)\n }\n this.setDataAtIndex(idealIndex, xAxisVal, data[i])\n }\n }\n }\n\n // Enforce pointsSaved limit - remove oldest data points if exceeded\n // Add 300 point buffer to avoid removing points too often\n if (\n this.pointsSaved > 0 &&\n this.data[0].length > this.pointsSaved + 300\n ) {\n const pointsToRemove = this.data[0].length - this.pointsSaved\n for (let j = 0; j < this.data.length; j++) {\n this.data[j].splice(0, pointsToRemove)\n }\n }\n\n // If we weren't passed a startTime notify grapher of our start\n if (this.startTime == null && this.data[0][0]) {\n let newStartTime = this.data[0][0] * 1_000_000_000\n this.$emit('started', newStartTime)\n }\n this.dataChanged = true\n },\n bsComparator: function (element, needle) {\n return element - needle\n },\n setDataAtIndex: function (index, xAxisVal, newData) {\n this.data[0][index] = xAxisVal\n for (const [key, value] of Object.entries(newData)) {\n if (key === this.actualXAxisItem && !this.xAxisIsAlsoGraphedItem) {\n continue\n }\n const keyIndex = this.indexes[key]\n if (keyIndex) {\n let array = this.data[keyIndex]\n // NaN and Infinite values are sent as objects with raw attribute set\n // to 'NaN', '-Infinity', or 'Infinity', just set data to null\n if (value?.raw) {\n array[index] = null\n } else if (typeof value === 'string') {\n // Can't graph strings so just set to null\n array[index] = null\n // If it's not already RAW, change the type to RAW\n // NOTE: Some items are RAW strings so they won't ever work\n if (!key.includes('__RAW')) {\n for (let item of this.items) {\n if (this.subscriptionKey(item) === key) {\n this.selectedItem = item\n break\n }\n }\n this.changeItem({\n valueType: 'RAW',\n reduced: this.selectedItem.reduced,\n reducedType: this.selectedItem.reducedType,\n })\n }\n } else {\n array[index] = value\n }\n }\n }\n },\n subscriptionKey: function (item) {\n let key = `${item.reduced}__TLM__${item.targetName}__${item.packetName}__${item.itemName}__${item.valueType}`\n if (\n item.reduced === 'REDUCED_MINUTE' ||\n item.reduced === 'REDUCED_HOUR' ||\n item.reduced === 'REDUCED_DAY'\n ) {\n key += `__${item.reducedType}`\n }\n return key\n },\n },\n}\n</script>\n\n<style>\n.v-window-item {\n background-color: var(--color-background-surface-default);\n}\n\n/* left right stacked legend */\n.uplot.side-legend {\n display: flex;\n width: auto;\n}\n\n.uplot.side-legend .u-wrap {\n flex: none;\n}\n\n.uplot.side-legend .u-legend {\n text-align: left;\n margin-left: 0;\n width: 220px;\n}\n\n.uplot.side-legend .u-legend,\n.uplot.side-legend .u-legend tr,\n.uplot.side-legend .u-legend th,\n.uplot.side-legend .u-legend td {\n display: revert;\n}\n\n/* left side we need to order the legend before the plot */\n.uplot.left-legend .u-legend {\n order: -1;\n}\n\n/* top legend */\n.uplot.top-legend {\n display: flex;\n flex-direction: column;\n}\n\n.uplot.top-legend .u-legend {\n order: -1;\n}\n\n/* This value is large enough to support negative scientific notation\n that we use on the value with rawValue.toExponential(6) */\n.u-legend.u-inline .u-series .u-value {\n width: 105px;\n}\n\n/* This value is large enough to support our date format: YYYY-MM-DD HH:MM:SS.sss */\n.u-legend.u-inline .u-series:first-child .u-value {\n width: 185px;\n}\n\n.u-select {\n background-color: rgba(255, 255, 255, 0.07);\n}\n</style>\n<style scoped>\n.active {\n background-color: var(--color-background-surface-selected) !important;\n}\n</style>\n"],"names":["_sfc_main","OpenC3TimePicker","TargetPacketItemChooser","TimeFilters","value","isValid","parse","itemId","item","date","toDate","dline","i","enabled","selection","xAxisItemKey","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_createBlock","_component_v_dialog","$options","$event","_ctx","_createVNode","_component_v_toolbar","_component_v_spacer","_cache","_createElementVNode","_component_v_card","_component_v_tabs","_component_v_tab","_component_v_tabs_window","_component_v_tabs_window_item","_component_v_row","_component_v_col","_component_v_card_text","_component_v_text_field","_component_v_select","_component_OpenC3TimePicker","_component_v_list","_component_v_list_item","_component_v_btn","_openBlock","_createElementBlock","_Fragment","$props","_component_v_checkbox","_component_target_packet_item_chooser","_component_v_data_table","_withCtx","_component_v_card_actions","OpenC3Api","details","key","_component_v_card_title","_toDisplayString","DEFAULT_X_AXIS_ITEM","MAX_PROCESSING_MS","GraphEditDialog","GraphEditItemDialog","useStore","Cable","targetName","packetName","val","timeItems","newVal","newState","oldState","_newState","_oldState","data","j","dateStr","dateObj","error","newData","oldData","oldVal","clonedItems","uPlot","index","chartSeries","overviewSeries","seriesObj","commonProps","u","seriesIdx","self","rawValue","timeZoneName","ts","v","targ","handler","e","chart","left","right","legend","seriesEl","series","min","max","screenItems","tgtpkt","xAxisData","possibleMinValues","description","hide","desired","graph","pad","dataMin","dataMax","itemsToAdd","subscription","type","navDrawerWidth","navDrawer","legendWidth","viewWidth","viewHeight","panel","height","width","strokeColor","axisColor","splits","el","split","event","limits","ctx","bbox","yMin","yMax","redLow","yellowLow","yellowHigh","redHigh","line","start","end","greenLow","greenHigh","itemArray","lastItem","theStartTime","items","refreshed","startTime","batch","xAxisVal","length","bs","idealIndex","pointsToRemove","newStartTime","element","needle","keyIndex","array","_normalizeClass","$data","_vShow","_component_v_tooltip","props","_component_v_icon","_mergeProps","_component_v_expand_transition","_withDirectives","_component_graph_edit_dialog","_component_v_textarea","_component_v_menu","_component_v_list_item_title","_createTextVNode","_component_graph_edit_item_dialog","_component_v_list_subheader","_component_v_divider"],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { W as t } from "./Widget-CGePksBA.js";
|
|
2
|
-
import { createElementBlock as o, openBlock as r, normalizeStyle as n } from "vue";
|
|
3
|
-
import { _ as i } from "./CustomIcon-Cg3jCA_l.js";
|
|
4
|
-
const s = {
|
|
5
|
-
mixins: [t]
|
|
6
|
-
};
|
|
7
|
-
function c(e, a, l, m, p, f) {
|
|
8
|
-
return r(), o("hr", {
|
|
9
|
-
style: n(e.computedStyle)
|
|
10
|
-
}, null, 4);
|
|
11
|
-
}
|
|
12
|
-
const $ = /* @__PURE__ */ i(s, [["render", c]]);
|
|
13
|
-
export {
|
|
14
|
-
$ as default
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=HorizontallineWidget-DPiADCAy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MicroservicesTab-CiEGGavF.js","sources":["../src/tools/admin/tabs/MicroservicesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2026, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-alert v-model=\"showAlert\" closable :type=\"alertType\">{{\n alert\n }}</v-alert>\n <div class=\"text-caption text-medium-emphasis mt-2 mb-2 ml-4\">\n <template v-if=\"hasServiceFilter && filteredServiceCount === 0\">\n No microservices match filter (showing 0 / {{ totalServiceCount }})\n </template>\n <template v-else-if=\"hasServiceFilter\">\n Showing {{ filteredServiceCount }} /\n {{ totalServiceCount }} microservices\n </template>\n <template v-else> {{ totalServiceCount }} microservices </template>\n </div>\n <v-row v-if=\"hasServiceFilter\" class=\"ml-1 mb-1\">\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n prepend-icon=\"mdi-filter-off\"\n aria-label=\"Filter applied. Click to clear filter and show all services.\"\n @click=\"clearServiceFilter\"\n >\n Show All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"warning\"\n prepend-icon=\"mdi-refresh\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkRestartServices\"\n >\n Restart All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"error\"\n prepend-icon=\"mdi-stop\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkStopServices\"\n >\n Stop All\n </v-btn>\n </v-col>\n </v-row>\n <v-list class=\"list\" data-test=\"microserviceList\">\n <div\n v-for=\"microservice in filteredMicroservices\"\n :key=\"microservice.name\"\n >\n <v-list-item>\n <v-list-item-title>{{ microservice.name }}</v-list-item-title>\n <v-list-item-subtitle v-if=\"microservice_status[microservice.name]\">\n Updated:\n {{ formatDate(microservice_status[microservice.name].updated_at) }},\n Enabled: {{ isEnabled(microservice.name) ? 'True' : 'False' }},\n Count:\n {{ microservice_status[microservice.name].count }}\n </v-list-item-subtitle>\n <template #append>\n <v-btn\n v-show=\"microservice_status[microservice.name]?.error\"\n icon=\"mdi-alert\"\n variant=\"text\"\n @click=\"showMicroserviceError(microservice.name)\"\n />\n <v-chip\n v-if=\"microservice_status[microservice.name]\"\n :color=\"getStateColor(microservice.name)\"\n size=\"small\"\n label\n >\n {{ getStateText(microservice.name) }}\n </v-chip>\n <v-tooltip\n :text=\"isEnabled(microservice.name) ? 'Restart' : 'Start'\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n :aria-label=\"\n isEnabled(microservice.name)\n ? 'Restart Microservice'\n : 'Start Microservice'\n \"\n :icon=\"\n isRestarting(microservice.name) ||\n isStarting(microservice.name)\n ? 'mdi-loading'\n : isEnabled(microservice.name)\n ? 'mdi-refresh'\n : 'mdi-play'\n \"\n :class=\"{\n 'rotating-icon':\n isRestarting(microservice.name) ||\n isStarting(microservice.name),\n }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"restartMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Stop\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Stop Microservice\"\n :icon=\"\n isStopping(microservice.name) ? 'mdi-loading' : 'mdi-stop'\n \"\n :class=\"{ 'rotating-icon': isStopping(microservice.name) }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"stopMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Show Details\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Show Microservice Details\"\n icon=\"mdi-eye\"\n variant=\"text\"\n @click=\"showMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"jsonContent\"\n type=\"Microservice\"\n :name=\"dialogTitle\"\n @submit=\"dialogCallback\"\n />\n <text-box-dialog\n v-if=\"showError\"\n v-model=\"showError\"\n :text=\"jsonContent\"\n :title=\"dialogTitle\"\n />\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api } from '@openc3/js-common/services'\nimport { OutputDialog, TextBoxDialog } from '@/components'\n\nexport default {\n components: {\n OutputDialog,\n TextBoxDialog,\n },\n data() {\n return {\n filteredMicroservices: [],\n allMicroservices: [],\n microservice_status: {},\n microservice_id: null,\n jsonContent: '',\n dialogTitle: '',\n showDialog: false,\n showError: false,\n alert: '',\n alertType: 'success',\n showAlert: false,\n updater: null,\n // { service_name:\n // { operation: 'stopping' | 'restarting' | 'starting',\n // enabled_states: []\n // initial_updated_at: timestamp\n // time_started: timestamp\n // }\n // }\n microserviceOperations: {},\n }\n },\n computed: {\n serviceFilter() {\n const services = this.$route.query.services\n if (!services) return null\n return services\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s)\n },\n hasServiceFilter() {\n return this.serviceFilter && this.serviceFilter.length > 0\n },\n totalServiceCount() {\n return this.allMicroservices.length\n },\n filteredServiceCount() {\n return this.filteredMicroservices.length\n },\n },\n watch: {\n '$route.query.services': function () {\n this.applyServiceFilter()\n },\n },\n mounted() {\n this.update()\n this.updater = setInterval(() => {\n this.update()\n }, 2000)\n },\n beforeUnmount() {\n clearInterval(this.updater)\n this.updater = null\n },\n methods: {\n isOperationInProgress: function (name) {\n return !!this.microserviceOperations[name]\n },\n isEnabled: function (name) {\n const microservice = this.allMicroservices.find((ms) => ms.name === name)\n return microservice?.enabled !== false\n },\n isRestarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'restarting'\n },\n isStarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'starting'\n },\n isStopping: function (name) {\n return this.microserviceOperations[name]?.operation === 'stopping'\n },\n update: function () {\n Api.get('/openc3-api/microservice_status/all').then((response) => {\n this.microservice_status = response.data\n this.checkOperationCompletion()\n })\n Api.get('/openc3-api/microservices/all').then((response) => {\n // Convert hash of microservices to array of microservices\n let microservices = []\n for (const [_microservice_name, microservice] of Object.entries(\n response.data,\n )) {\n microservices.push(microservice)\n }\n microservices.sort((a, b) => a.name.localeCompare(b.name))\n this.allMicroservices = microservices\n this.applyServiceFilter()\n })\n },\n checkOperationCompletion: function () {\n for (const [name, tracking] of Object.entries(\n this.microserviceOperations,\n )) {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n if (!microservice) continue\n\n const currentEnabled = microservice.enabled !== false\n const lastEnabled =\n tracking.enabled_states[tracking.enabled_states.length - 1]\n\n // Only add state if it changed\n if (currentEnabled !== lastEnabled) {\n tracking.enabled_states.push(currentEnabled)\n }\n\n const isComplete = this.isOperationComplete(name, tracking)\n if (isComplete) {\n delete this.microserviceOperations[name]\n }\n }\n },\n isOperationComplete: function (serviceName, tracking) {\n // Check for timeout (30 seconds)\n const elapsed = Date.now() - tracking.time_started\n if (elapsed > 30000) {\n this.alert = `${serviceName} timed out when ${tracking.operation}.`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[serviceName]\n return true\n }\n\n if (tracking.operation === 'stopping') {\n // Track true -> false\n return tracking.enabled_states.includes(false)\n }\n if (tracking.operation === 'starting') {\n // Track false -> true\n return tracking.enabled_states.includes(true)\n }\n if (tracking.operation === 'restarting') {\n // Check if updated_at has changed\n const currentUpdatedAt =\n this.microservice_status[serviceName]?.updated_at\n if (currentUpdatedAt && tracking.initial_updated_at) {\n return currentUpdatedAt !== tracking.initial_updated_at\n }\n return false\n }\n return false\n },\n applyServiceFilter: function () {\n if (this.hasServiceFilter) {\n this.filteredMicroservices = this.allMicroservices.filter((ms) =>\n this.serviceFilter.includes(ms.name),\n )\n } else {\n this.filteredMicroservices = this.allMicroservices\n }\n },\n clearServiceFilter: function () {\n this.$router.push({ query: {} })\n },\n bulkRestartServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to restart ${microserviceNames.length} microservice(s)? ${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n const initialUpdatedAt = this.microservice_status[name]?.updated_at\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: initialUpdatedAt,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch(\n (error) => {\n this.alert = `Start command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n bulkStopServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to stop ${microserviceNames.length} microservice(s)?\\n\\n${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch(\n (error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n stopMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to stop microservice: ${name}?`, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch((error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n restartMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to restart microservice: ${name}?`, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: this.microservice_status[name]?.updated_at,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch((error) => {\n this.alert = `Restart command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n showMicroservice: function (name) {\n Api.get(`/openc3-api/microservices/${name}`).then((response) => {\n this.microservice_id = name\n this.dialogTitle = name\n this.jsonContent = JSON.stringify(response.data, null, '\\t')\n this.showDialog = true\n })\n },\n showMicroserviceError: function (name) {\n this.dialogTitle = name\n const e = this.microservice_status[name].error\n this.jsonContent = JSON.stringify(e, null, '\\t')\n this.showError = true\n },\n formatDate(nanoSecs) {\n return format(\n toDate(Number.parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n // States are determined by the microservice and not from an explicitly defined set\n // However, we can provide useful colors for errors and common states\n getStateColor(microserviceName) {\n const status = this.microservice_status[microserviceName]\n if (!status) return 'grey'\n if (status.error) return 'red'\n // If not enabled, show as stopped even if state is \"running\"\n if (!this.isEnabled(microserviceName) || status.state === 'STOPPED')\n return 'yellow'\n if (status.state === 'RUNNING') return 'green'\n return 'grey'\n },\n getStateText(microserviceName) {\n if (!this.isEnabled(microserviceName)) {\n return 'STOPPED'\n }\n return this.microservice_status[microserviceName].state\n },\n dialogCallback: function (content) {\n this.showDialog = false\n if (content !== null) {\n let parsed = JSON.parse(content)\n let method = 'put'\n let url = `/openc3-api/microservices/${this.microservice_id}`\n if (parsed['name'] !== this.microservice_id) {\n method = 'post'\n url = '/openc3-api/microservices'\n }\n\n Api[method](url, {\n data: {\n json: content,\n },\n }).then((response) => {\n this.alert = 'Modified Microservice'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n })\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.rotating-icon {\n animation: spin 1s linear infinite;\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n"],"names":["_sfc_main","OutputDialog","TextBoxDialog","services","s","name","ms","Api","response","microservices","_microservice_name","microservice","a","b","tracking","currentEnabled","lastEnabled","serviceName","currentUpdatedAt","microserviceNames","m","microserviceList","confirmMessage","initialUpdatedAt","error","_dialog","e","nanoSecs","format","toDate","microserviceName","status","content","parsed","method","url","_hoisted_1","_createElementBlock","_createVNode","_component_v_alert","$data","$event","_createElementVNode","$options","_Fragment","_toDisplayString","_createTextVNode","_createBlock","_component_v_row","_component_v_col","_component_v_btn","_cache","_component_v_list","_renderList","_component_v_list_item","_vShow","_component_v_chip","_component_v_tooltip","_withCtx","props","_mergeProps","_component_v_list_item_title","_component_v_list_item_subtitle","_component_v_divider","_component_output_dialog","_component_text_box_dialog"],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-MfH160rD.cjs"),e=require("vue"),k=require("./CustomIcon-8F08upeg.cjs");require("./store-CiS35N-w.cjs");require("single-spa");const T=require("./OutputDialog-R3Xj3_yw.cjs"),V=require("./TextBoxDialog-CppyxSFu.cjs"),v=require("./format-DOZQNf-X.cjs"),N={components:{OutputDialog:T.OutputDialog,TextBoxDialog:V.TextBoxDialog},data(){return{filteredMicroservices:[],allMicroservices:[],microservice_status:{},microservice_id:null,jsonContent:"",dialogTitle:"",showDialog:!1,showError:!1,alert:"",alertType:"success",showAlert:!1,updater:null,microserviceOperations:{}}},computed:{serviceFilter(){const t=this.$route.query.services;return t?t.split(",").map(r=>r.trim()).filter(r=>r):null},hasServiceFilter(){return this.serviceFilter&&this.serviceFilter.length>0},totalServiceCount(){return this.allMicroservices.length},filteredServiceCount(){return this.filteredMicroservices.length}},watch:{"$route.query.services":function(){this.applyServiceFilter()}},mounted(){this.update(),this.updater=setInterval(()=>{this.update()},2e3)},beforeUnmount(){clearInterval(this.updater),this.updater=null},methods:{isOperationInProgress:function(t){return!!this.microserviceOperations[t]},isEnabled:function(t){return this.allMicroservices.find(l=>l.name===t)?.enabled!==!1},isRestarting:function(t){return this.microserviceOperations[t]?.operation==="restarting"},isStarting:function(t){return this.microserviceOperations[t]?.operation==="starting"},isStopping:function(t){return this.microserviceOperations[t]?.operation==="stopping"},update:function(){d.Fr.get("/openc3-api/microservice_status/all").then(t=>{this.microservice_status=t.data,this.checkOperationCompletion()}),d.Fr.get("/openc3-api/microservices/all").then(t=>{let r=[];for(const[l,o]of Object.entries(t.data))r.push(o);r.sort((l,o)=>l.name.localeCompare(o.name)),this.allMicroservices=r,this.applyServiceFilter()})},checkOperationCompletion:function(){for(const[t,r]of Object.entries(this.microserviceOperations)){const l=this.allMicroservices.find(c=>c.name===t);if(!l)continue;const o=l.enabled!==!1,s=r.enabled_states[r.enabled_states.length-1];o!==s&&r.enabled_states.push(o),this.isOperationComplete(t,r)&&delete this.microserviceOperations[t]}},isOperationComplete:function(t,r){if(Date.now()-r.time_started>3e4)return this.alert=`${t} timed out when ${r.operation}.`,this.alertType="error",this.showAlert=!0,setTimeout(()=>{this.showAlert=!1},5e3),delete this.microserviceOperations[t],!0;if(r.operation==="stopping")return r.enabled_states.includes(!1);if(r.operation==="starting")return r.enabled_states.includes(!0);if(r.operation==="restarting"){const o=this.microservice_status[t]?.updated_at;return o&&r.initial_updated_at?o!==r.initial_updated_at:!1}return!1},applyServiceFilter:function(){this.hasServiceFilter?this.filteredMicroservices=this.allMicroservices.filter(t=>this.serviceFilter.includes(t.name)):this.filteredMicroservices=this.allMicroservices},clearServiceFilter:function(){this.$router.push({query:{}})},bulkRestartServices:function(){const t=this.filteredMicroservices.map(o=>o.name),r=t.join(", "),l=`Are you sure you want to restart ${t.length} microservice(s)? ${r}`;this.$dialog.confirm(l,{okText:"Restart",cancelText:"Cancel"}).then(()=>{t.forEach(o=>{const i=this.allMicroservices.find(a=>a.name===o)?.enabled!==!1,c=this.microservice_status[o]?.updated_at;this.microserviceOperations[o]={operation:"restarting",enabled_states:[i],initial_updated_at:c,time_started:Date.now()},d.Fr.post(`/openc3-api/microservices/${o}/start`).catch(a=>{this.alert=`Start command failed for ${o}: ${a}`,this.alertType="error",this.showAlert=!0,setTimeout(()=>{this.showAlert=!1},5e3),delete this.microserviceOperations[o]})})}).catch(()=>{})},bulkStopServices:function(){const t=this.filteredMicroservices.map(o=>o.name),r=t.join(", "),l=`Are you sure you want to stop ${t.length} microservice(s)?
|
|
2
|
-
|
|
3
|
-
${r}`;this.$dialog.confirm(l,{okText:"Stop",cancelText:"Cancel"}).then(()=>{t.forEach(o=>{const i=this.allMicroservices.find(c=>c.name===o)?.enabled!==!1;this.microserviceOperations[o]={operation:"stopping",enabled_states:[i],time_started:Date.now()},d.Fr.post(`/openc3-api/microservices/${o}/stop`).catch(c=>{this.alert=`Stop command failed for ${o}: ${c}`,this.alertType="error",this.showAlert=!0,setTimeout(()=>{this.showAlert=!1},5e3),delete this.microserviceOperations[o]})})}).catch(()=>{})},stopMicroservice:function(t){this.$dialog.confirm(`Are you sure you want to stop microservice: ${t}?`,{okText:"Stop",cancelText:"Cancel"}).then(r=>{const o=this.allMicroservices.find(s=>s.name===t)?.enabled!==!1;this.microserviceOperations[t]={operation:"stopping",enabled_states:[o],time_started:Date.now()},d.Fr.post(`/openc3-api/microservices/${t}/stop`).catch(s=>{this.alert=`Stop command failed for ${t}: ${s}`,this.alertType="error",this.showAlert=!0,setTimeout(()=>{this.showAlert=!1},5e3),delete this.microserviceOperations[t]})})},restartMicroservice:function(t){this.$dialog.confirm(`Are you sure you want to restart microservice: ${t}?`,{okText:"Restart",cancelText:"Cancel"}).then(r=>{const o=this.allMicroservices.find(s=>s.name===t)?.enabled!==!1;this.microserviceOperations[t]={operation:"restarting",enabled_states:[o],initial_updated_at:this.microservice_status[t]?.updated_at,time_started:Date.now()},d.Fr.post(`/openc3-api/microservices/${t}/start`).catch(s=>{this.alert=`Restart command failed for ${t}: ${s}`,this.alertType="error",this.showAlert=!0,setTimeout(()=>{this.showAlert=!1},5e3),delete this.microserviceOperations[t]})})},showMicroservice:function(t){d.Fr.get(`/openc3-api/microservices/${t}`).then(r=>{this.microservice_id=t,this.dialogTitle=t,this.jsonContent=JSON.stringify(r.data,null," "),this.showDialog=!0})},showMicroserviceError:function(t){this.dialogTitle=t;const r=this.microservice_status[t].error;this.jsonContent=JSON.stringify(r,null," "),this.showError=!0},formatDate(t){return v.format(v.toDate(Number.parseInt(t)/1e6),"yyyy-MM-dd HH:mm:ss.SSS")},getStateColor(t){const r=this.microservice_status[t];return r?r.error?"red":!this.isEnabled(t)||r.state==="STOPPED"?"yellow":r.state==="RUNNING"?"green":"grey":"grey"},getStateText(t){return this.isEnabled(t)?this.microservice_status[t].state:"STOPPED"},dialogCallback:function(t){if(this.showDialog=!1,t!==null){let r=JSON.parse(t),l="put",o=`/openc3-api/microservices/${this.microservice_id}`;r.name!==this.microservice_id&&(l="post",o="/openc3-api/microservices"),d.Fr[l](o,{data:{json:t}}).then(s=>{this.alert="Modified Microservice",this.alertType="success",this.showAlert=!0,setTimeout(()=>{this.showAlert=!1},5e3),this.update()})}}}},M={class:"text-caption text-medium-emphasis mt-2 mb-2 ml-4"};function D(t,r,l,o,s,i){const c=e.resolveComponent("v-alert"),a=e.resolveComponent("v-btn"),p=e.resolveComponent("v-col"),f=e.resolveComponent("v-row"),_=e.resolveComponent("v-list-item-title"),g=e.resolveComponent("v-list-item-subtitle"),C=e.resolveComponent("v-chip"),m=e.resolveComponent("v-tooltip"),S=e.resolveComponent("v-list-item"),w=e.resolveComponent("v-divider"),b=e.resolveComponent("v-list"),x=e.resolveComponent("output-dialog"),y=e.resolveComponent("text-box-dialog");return e.openBlock(),e.createElementBlock("div",null,[e.createVNode(c,{modelValue:s.showAlert,"onUpdate:modelValue":r[0]||(r[0]=n=>s.showAlert=n),closable:"",type:s.alertType},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.alert),1)]),_:1},8,["modelValue","type"]),e.createElementVNode("div",M,[i.hasServiceFilter&&i.filteredServiceCount===0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createTextVNode(" No microservices match filter (showing 0 / "+e.toDisplayString(i.totalServiceCount)+") ",1)],64)):i.hasServiceFilter?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(" Showing "+e.toDisplayString(i.filteredServiceCount)+" / "+e.toDisplayString(i.totalServiceCount)+" microservices ",1)],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createTextVNode(e.toDisplayString(i.totalServiceCount)+" microservices ",1)],64))]),i.hasServiceFilter?(e.openBlock(),e.createBlock(f,{key:0,class:"ml-1 mb-1"},{default:e.withCtx(()=>[e.createVNode(p,{cols:"auto"},{default:e.withCtx(()=>[e.createVNode(a,{color:"primary","prepend-icon":"mdi-filter-off","aria-label":"Filter applied. Click to clear filter and show all services.",onClick:i.clearServiceFilter},{default:e.withCtx(()=>[...r[3]||(r[3]=[e.createTextVNode(" Show All ",-1)])]),_:1},8,["onClick"])]),_:1}),e.createVNode(p,{cols:"auto"},{default:e.withCtx(()=>[e.createVNode(a,{color:"warning","prepend-icon":"mdi-refresh",disabled:i.filteredServiceCount===0,onClick:i.bulkRestartServices},{default:e.withCtx(()=>[...r[4]||(r[4]=[e.createTextVNode(" Restart All ",-1)])]),_:1},8,["disabled","onClick"])]),_:1}),e.createVNode(p,{cols:"auto"},{default:e.withCtx(()=>[e.createVNode(a,{color:"error","prepend-icon":"mdi-stop",disabled:i.filteredServiceCount===0,onClick:i.bulkStopServices},{default:e.withCtx(()=>[...r[5]||(r[5]=[e.createTextVNode(" Stop All ",-1)])]),_:1},8,["disabled","onClick"])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(b,{class:"list","data-test":"microserviceList"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.filteredMicroservices,n=>(e.openBlock(),e.createElementBlock("div",{key:n.name},[e.createVNode(S,null,{append:e.withCtx(()=>[e.withDirectives(e.createVNode(a,{icon:"mdi-alert",variant:"text",onClick:u=>i.showMicroserviceError(n.name)},null,8,["onClick"]),[[e.vShow,s.microservice_status[n.name]?.error]]),s.microservice_status[n.name]?(e.openBlock(),e.createBlock(C,{key:0,color:i.getStateColor(n.name),size:"small",label:""},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.getStateText(n.name)),1)]),_:2},1032,["color"])):e.createCommentVNode("",!0),e.createVNode(m,{text:i.isEnabled(n.name)?"Restart":"Start",location:"top"},{activator:e.withCtx(({props:u})=>[e.createVNode(a,e.mergeProps({ref_for:!0},u,{"aria-label":i.isEnabled(n.name)?"Restart Microservice":"Start Microservice",icon:i.isRestarting(n.name)||i.isStarting(n.name)?"mdi-loading":i.isEnabled(n.name)?"mdi-refresh":"mdi-play",class:{"rotating-icon":i.isRestarting(n.name)||i.isStarting(n.name)},variant:"text",disabled:i.isOperationInProgress(n.name),onClick:h=>i.restartMicroservice(n.name)}),null,16,["aria-label","icon","class","disabled","onClick"])]),_:2},1032,["text"]),e.createVNode(m,{text:"Stop",location:"top"},{activator:e.withCtx(({props:u})=>[e.createVNode(a,e.mergeProps({ref_for:!0},u,{"aria-label":"Stop Microservice",icon:i.isStopping(n.name)?"mdi-loading":"mdi-stop",class:{"rotating-icon":i.isStopping(n.name)},variant:"text",disabled:i.isOperationInProgress(n.name),onClick:h=>i.stopMicroservice(n.name)}),null,16,["icon","class","disabled","onClick"])]),_:2},1024),e.createVNode(m,{text:"Show Details",location:"top"},{activator:e.withCtx(({props:u})=>[e.createVNode(a,e.mergeProps({ref_for:!0},u,{"aria-label":"Show Microservice Details",icon:"mdi-eye",variant:"text",onClick:h=>i.showMicroservice(n.name)}),null,16,["onClick"])]),_:2},1024)]),default:e.withCtx(()=>[e.createVNode(_,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.name),1)]),_:2},1024),s.microservice_status[n.name]?(e.openBlock(),e.createBlock(g,{key:0},{default:e.withCtx(()=>[e.createTextVNode(" Updated: "+e.toDisplayString(i.formatDate(s.microservice_status[n.name].updated_at))+", Enabled: "+e.toDisplayString(i.isEnabled(n.name)?"True":"False")+", Count: "+e.toDisplayString(s.microservice_status[n.name].count),1)]),_:2},1024)):e.createCommentVNode("",!0)]),_:2},1024),e.createVNode(w)]))),128))]),_:1}),s.showDialog?(e.openBlock(),e.createBlock(x,{key:1,modelValue:s.showDialog,"onUpdate:modelValue":r[1]||(r[1]=n=>s.showDialog=n),content:s.jsonContent,type:"Microservice",name:s.dialogTitle,onSubmit:i.dialogCallback},null,8,["modelValue","content","name","onSubmit"])):e.createCommentVNode("",!0),s.showError?(e.openBlock(),e.createBlock(y,{key:2,modelValue:s.showError,"onUpdate:modelValue":r[2]||(r[2]=n=>s.showError=n),text:s.jsonContent,title:s.dialogTitle},null,8,["modelValue","text","title"])):e.createCommentVNode("",!0)])}const O=k._export_sfc(N,[["render",D],["__scopeId","data-v-172eefdb"]]);exports.default=O;
|
|
4
|
-
//# sourceMappingURL=MicroservicesTab-DvDK2hPW.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MicroservicesTab-DvDK2hPW.cjs","sources":["../src/tools/admin/tabs/MicroservicesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2026, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-alert v-model=\"showAlert\" closable :type=\"alertType\">{{\n alert\n }}</v-alert>\n <div class=\"text-caption text-medium-emphasis mt-2 mb-2 ml-4\">\n <template v-if=\"hasServiceFilter && filteredServiceCount === 0\">\n No microservices match filter (showing 0 / {{ totalServiceCount }})\n </template>\n <template v-else-if=\"hasServiceFilter\">\n Showing {{ filteredServiceCount }} /\n {{ totalServiceCount }} microservices\n </template>\n <template v-else> {{ totalServiceCount }} microservices </template>\n </div>\n <v-row v-if=\"hasServiceFilter\" class=\"ml-1 mb-1\">\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n prepend-icon=\"mdi-filter-off\"\n aria-label=\"Filter applied. Click to clear filter and show all services.\"\n @click=\"clearServiceFilter\"\n >\n Show All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"warning\"\n prepend-icon=\"mdi-refresh\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkRestartServices\"\n >\n Restart All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"error\"\n prepend-icon=\"mdi-stop\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkStopServices\"\n >\n Stop All\n </v-btn>\n </v-col>\n </v-row>\n <v-list class=\"list\" data-test=\"microserviceList\">\n <div\n v-for=\"microservice in filteredMicroservices\"\n :key=\"microservice.name\"\n >\n <v-list-item>\n <v-list-item-title>{{ microservice.name }}</v-list-item-title>\n <v-list-item-subtitle v-if=\"microservice_status[microservice.name]\">\n Updated:\n {{ formatDate(microservice_status[microservice.name].updated_at) }},\n Enabled: {{ isEnabled(microservice.name) ? 'True' : 'False' }},\n Count:\n {{ microservice_status[microservice.name].count }}\n </v-list-item-subtitle>\n <template #append>\n <v-btn\n v-show=\"microservice_status[microservice.name]?.error\"\n icon=\"mdi-alert\"\n variant=\"text\"\n @click=\"showMicroserviceError(microservice.name)\"\n />\n <v-chip\n v-if=\"microservice_status[microservice.name]\"\n :color=\"getStateColor(microservice.name)\"\n size=\"small\"\n label\n >\n {{ getStateText(microservice.name) }}\n </v-chip>\n <v-tooltip\n :text=\"isEnabled(microservice.name) ? 'Restart' : 'Start'\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n :aria-label=\"\n isEnabled(microservice.name)\n ? 'Restart Microservice'\n : 'Start Microservice'\n \"\n :icon=\"\n isRestarting(microservice.name) ||\n isStarting(microservice.name)\n ? 'mdi-loading'\n : isEnabled(microservice.name)\n ? 'mdi-refresh'\n : 'mdi-play'\n \"\n :class=\"{\n 'rotating-icon':\n isRestarting(microservice.name) ||\n isStarting(microservice.name),\n }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"restartMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Stop\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Stop Microservice\"\n :icon=\"\n isStopping(microservice.name) ? 'mdi-loading' : 'mdi-stop'\n \"\n :class=\"{ 'rotating-icon': isStopping(microservice.name) }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"stopMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Show Details\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Show Microservice Details\"\n icon=\"mdi-eye\"\n variant=\"text\"\n @click=\"showMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"jsonContent\"\n type=\"Microservice\"\n :name=\"dialogTitle\"\n @submit=\"dialogCallback\"\n />\n <text-box-dialog\n v-if=\"showError\"\n v-model=\"showError\"\n :text=\"jsonContent\"\n :title=\"dialogTitle\"\n />\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api } from '@openc3/js-common/services'\nimport { OutputDialog, TextBoxDialog } from '@/components'\n\nexport default {\n components: {\n OutputDialog,\n TextBoxDialog,\n },\n data() {\n return {\n filteredMicroservices: [],\n allMicroservices: [],\n microservice_status: {},\n microservice_id: null,\n jsonContent: '',\n dialogTitle: '',\n showDialog: false,\n showError: false,\n alert: '',\n alertType: 'success',\n showAlert: false,\n updater: null,\n // { service_name:\n // { operation: 'stopping' | 'restarting' | 'starting',\n // enabled_states: []\n // initial_updated_at: timestamp\n // time_started: timestamp\n // }\n // }\n microserviceOperations: {},\n }\n },\n computed: {\n serviceFilter() {\n const services = this.$route.query.services\n if (!services) return null\n return services\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s)\n },\n hasServiceFilter() {\n return this.serviceFilter && this.serviceFilter.length > 0\n },\n totalServiceCount() {\n return this.allMicroservices.length\n },\n filteredServiceCount() {\n return this.filteredMicroservices.length\n },\n },\n watch: {\n '$route.query.services': function () {\n this.applyServiceFilter()\n },\n },\n mounted() {\n this.update()\n this.updater = setInterval(() => {\n this.update()\n }, 2000)\n },\n beforeUnmount() {\n clearInterval(this.updater)\n this.updater = null\n },\n methods: {\n isOperationInProgress: function (name) {\n return !!this.microserviceOperations[name]\n },\n isEnabled: function (name) {\n const microservice = this.allMicroservices.find((ms) => ms.name === name)\n return microservice?.enabled !== false\n },\n isRestarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'restarting'\n },\n isStarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'starting'\n },\n isStopping: function (name) {\n return this.microserviceOperations[name]?.operation === 'stopping'\n },\n update: function () {\n Api.get('/openc3-api/microservice_status/all').then((response) => {\n this.microservice_status = response.data\n this.checkOperationCompletion()\n })\n Api.get('/openc3-api/microservices/all').then((response) => {\n // Convert hash of microservices to array of microservices\n let microservices = []\n for (const [_microservice_name, microservice] of Object.entries(\n response.data,\n )) {\n microservices.push(microservice)\n }\n microservices.sort((a, b) => a.name.localeCompare(b.name))\n this.allMicroservices = microservices\n this.applyServiceFilter()\n })\n },\n checkOperationCompletion: function () {\n for (const [name, tracking] of Object.entries(\n this.microserviceOperations,\n )) {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n if (!microservice) continue\n\n const currentEnabled = microservice.enabled !== false\n const lastEnabled =\n tracking.enabled_states[tracking.enabled_states.length - 1]\n\n // Only add state if it changed\n if (currentEnabled !== lastEnabled) {\n tracking.enabled_states.push(currentEnabled)\n }\n\n const isComplete = this.isOperationComplete(name, tracking)\n if (isComplete) {\n delete this.microserviceOperations[name]\n }\n }\n },\n isOperationComplete: function (serviceName, tracking) {\n // Check for timeout (30 seconds)\n const elapsed = Date.now() - tracking.time_started\n if (elapsed > 30000) {\n this.alert = `${serviceName} timed out when ${tracking.operation}.`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[serviceName]\n return true\n }\n\n if (tracking.operation === 'stopping') {\n // Track true -> false\n return tracking.enabled_states.includes(false)\n }\n if (tracking.operation === 'starting') {\n // Track false -> true\n return tracking.enabled_states.includes(true)\n }\n if (tracking.operation === 'restarting') {\n // Check if updated_at has changed\n const currentUpdatedAt =\n this.microservice_status[serviceName]?.updated_at\n if (currentUpdatedAt && tracking.initial_updated_at) {\n return currentUpdatedAt !== tracking.initial_updated_at\n }\n return false\n }\n return false\n },\n applyServiceFilter: function () {\n if (this.hasServiceFilter) {\n this.filteredMicroservices = this.allMicroservices.filter((ms) =>\n this.serviceFilter.includes(ms.name),\n )\n } else {\n this.filteredMicroservices = this.allMicroservices\n }\n },\n clearServiceFilter: function () {\n this.$router.push({ query: {} })\n },\n bulkRestartServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to restart ${microserviceNames.length} microservice(s)? ${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n const initialUpdatedAt = this.microservice_status[name]?.updated_at\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: initialUpdatedAt,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch(\n (error) => {\n this.alert = `Start command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n bulkStopServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to stop ${microserviceNames.length} microservice(s)?\\n\\n${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch(\n (error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n stopMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to stop microservice: ${name}?`, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch((error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n restartMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to restart microservice: ${name}?`, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: this.microservice_status[name]?.updated_at,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch((error) => {\n this.alert = `Restart command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n showMicroservice: function (name) {\n Api.get(`/openc3-api/microservices/${name}`).then((response) => {\n this.microservice_id = name\n this.dialogTitle = name\n this.jsonContent = JSON.stringify(response.data, null, '\\t')\n this.showDialog = true\n })\n },\n showMicroserviceError: function (name) {\n this.dialogTitle = name\n const e = this.microservice_status[name].error\n this.jsonContent = JSON.stringify(e, null, '\\t')\n this.showError = true\n },\n formatDate(nanoSecs) {\n return format(\n toDate(Number.parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n // States are determined by the microservice and not from an explicitly defined set\n // However, we can provide useful colors for errors and common states\n getStateColor(microserviceName) {\n const status = this.microservice_status[microserviceName]\n if (!status) return 'grey'\n if (status.error) return 'red'\n // If not enabled, show as stopped even if state is \"running\"\n if (!this.isEnabled(microserviceName) || status.state === 'STOPPED')\n return 'yellow'\n if (status.state === 'RUNNING') return 'green'\n return 'grey'\n },\n getStateText(microserviceName) {\n if (!this.isEnabled(microserviceName)) {\n return 'STOPPED'\n }\n return this.microservice_status[microserviceName].state\n },\n dialogCallback: function (content) {\n this.showDialog = false\n if (content !== null) {\n let parsed = JSON.parse(content)\n let method = 'put'\n let url = `/openc3-api/microservices/${this.microservice_id}`\n if (parsed['name'] !== this.microservice_id) {\n method = 'post'\n url = '/openc3-api/microservices'\n }\n\n Api[method](url, {\n data: {\n json: content,\n },\n }).then((response) => {\n this.alert = 'Modified Microservice'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n })\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.rotating-icon {\n animation: spin 1s linear infinite;\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n"],"names":["_sfc_main","OutputDialog","TextBoxDialog","services","s","name","ms","Api","response","microservices","_microservice_name","microservice","a","b","tracking","currentEnabled","lastEnabled","serviceName","currentUpdatedAt","microserviceNames","m","microserviceList","confirmMessage","initialUpdatedAt","error","_dialog","e","nanoSecs","format","toDate","microserviceName","status","content","parsed","method","url","_hoisted_1","_createElementBlock","_createVNode","_component_v_alert","$data","$event","_createElementVNode","$options","_Fragment","_toDisplayString","_createTextVNode","_createBlock","_component_v_row","_component_v_col","_component_v_btn","_cache","_component_v_list","_renderList","_component_v_list_item","_vShow","_component_v_chip","_component_v_tooltip","_withCtx","props","_mergeProps","_component_v_list_item_title","_component_v_list_item_subtitle","_component_v_divider","_component_output_dialog","_component_text_box_dialog"],"mappings":"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"}
|