@openc3/vue-common 7.0.0-rc3 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ArrayWidget-B2-n1K3r.cjs → ArrayWidget-BsAUsmBz.cjs} +2 -2
- package/dist/{ArrayWidget-B2-n1K3r.cjs.map → ArrayWidget-BsAUsmBz.cjs.map} +1 -1
- package/dist/{ArrayWidget-dQWDMMrn.js → ArrayWidget-D2UrA5Db.js} +4 -4
- package/dist/{ArrayWidget-dQWDMMrn.js.map → ArrayWidget-D2UrA5Db.js.map} +1 -1
- package/dist/{ArrayplotWidget-DCnbK37q.js → ArrayplotWidget-CDNRxI2F.js} +3 -3
- package/dist/{ArrayplotWidget-DCnbK37q.js.map → ArrayplotWidget-CDNRxI2F.js.map} +1 -1
- package/dist/{ArrayplotWidget-BmBcPGUR.cjs → ArrayplotWidget-ChHMy5_L.cjs} +2 -2
- package/dist/{ArrayplotWidget-BmBcPGUR.cjs.map → ArrayplotWidget-ChHMy5_L.cjs.map} +1 -1
- package/dist/{BarColumn-CkecDAzn.cjs → BarColumn-e-sSkSvE.cjs} +2 -2
- package/dist/{BarColumn-CkecDAzn.cjs.map → BarColumn-e-sSkSvE.cjs.map} +1 -1
- package/dist/{BarColumn-DmOxuCa9.js → BarColumn-nSFR2LZF.js} +3 -3
- package/dist/{BarColumn-DmOxuCa9.js.map → BarColumn-nSFR2LZF.js.map} +1 -1
- package/dist/{BlockWidget-UejKxAxY.js → BlockWidget-C-WB0Q2m.js} +4 -4
- package/dist/{BlockWidget-UejKxAxY.js.map → BlockWidget-C-WB0Q2m.js.map} +1 -1
- package/dist/{BlockWidget-BZXHLTJt.cjs → BlockWidget-DJpyQiec.cjs} +2 -2
- package/dist/{BlockWidget-BZXHLTJt.cjs.map → BlockWidget-DJpyQiec.cjs.map} +1 -1
- package/dist/{ButtonWidget-DtAkhzCN.js → ButtonWidget-rS7sVb7m.js} +4 -4
- package/dist/{ButtonWidget-DtAkhzCN.js.map → ButtonWidget-rS7sVb7m.js.map} +1 -1
- package/dist/{ButtonWidget-CzRyY1N5.cjs → ButtonWidget-rkOE5b8G.cjs} +2 -2
- package/dist/{ButtonWidget-CzRyY1N5.cjs.map → ButtonWidget-rkOE5b8G.cjs.map} +1 -1
- package/dist/{CanvasWidget-YXQ8TLqA.js → CanvasWidget-DuWolVCW.js} +2 -2
- package/dist/{CanvasWidget-YXQ8TLqA.js.map → CanvasWidget-DuWolVCW.js.map} +1 -1
- package/dist/{CanvasWidget-cQqNxspP.cjs → CanvasWidget-Dv7_QUJY.cjs} +2 -2
- package/dist/{CanvasWidget-cQqNxspP.cjs.map → CanvasWidget-Dv7_QUJY.cjs.map} +1 -1
- package/dist/{CanvasdotWidget-BbmhHQV_.js → CanvasdotWidget-B42YizA1.js} +2 -2
- package/dist/{CanvasdotWidget-BbmhHQV_.js.map → CanvasdotWidget-B42YizA1.js.map} +1 -1
- package/dist/{CanvasdotWidget-CMIw-ga4.cjs → CanvasdotWidget-E1OgFBVZ.cjs} +2 -2
- package/dist/{CanvasdotWidget-CMIw-ga4.cjs.map → CanvasdotWidget-E1OgFBVZ.cjs.map} +1 -1
- package/dist/{CanvasimageWidget-CJf5NYEj.js → CanvasimageWidget-DMHdDTSs.js} +3 -3
- package/dist/{CanvasimageWidget-CJf5NYEj.js.map → CanvasimageWidget-DMHdDTSs.js.map} +1 -1
- package/dist/{CanvasimageWidget-DXxtYjGG.cjs → CanvasimageWidget-ysw78z4C.cjs} +2 -2
- package/dist/{CanvasimageWidget-DXxtYjGG.cjs.map → CanvasimageWidget-ysw78z4C.cjs.map} +1 -1
- package/dist/{CanvasimagevalueWidget-VPKlJrxM.cjs → CanvasimagevalueWidget-Bc-VYXe7.cjs} +2 -2
- package/dist/{CanvasimagevalueWidget-VPKlJrxM.cjs.map → CanvasimagevalueWidget-Bc-VYXe7.cjs.map} +1 -1
- package/dist/{CanvasimagevalueWidget-D86eJXbs.js → CanvasimagevalueWidget-ns-5S1HA.js} +3 -3
- package/dist/{CanvasimagevalueWidget-D86eJXbs.js.map → CanvasimagevalueWidget-ns-5S1HA.js.map} +1 -1
- package/dist/{CanvaslabelWidget-BgGRS0NS.cjs → CanvaslabelWidget-6h59qJY8.cjs} +2 -2
- package/dist/{CanvaslabelWidget-BgGRS0NS.cjs.map → CanvaslabelWidget-6h59qJY8.cjs.map} +1 -1
- package/dist/{CanvaslabelWidget-TkrVd-Dg.js → CanvaslabelWidget-DElES3gU.js} +2 -2
- package/dist/{CanvaslabelWidget-TkrVd-Dg.js.map → CanvaslabelWidget-DElES3gU.js.map} +1 -1
- package/dist/{CanvaslabelvalueWidget-BwsIN_MT.js → CanvaslabelvalueWidget-B2B5KlUm.js} +2 -2
- package/dist/{CanvaslabelvalueWidget-BwsIN_MT.js.map → CanvaslabelvalueWidget-B2B5KlUm.js.map} +1 -1
- package/dist/{CanvaslabelvalueWidget-W2QzOkQw.cjs → CanvaslabelvalueWidget-BLIgF8xi.cjs} +2 -2
- package/dist/{CanvaslabelvalueWidget-W2QzOkQw.cjs.map → CanvaslabelvalueWidget-BLIgF8xi.cjs.map} +1 -1
- package/dist/{CanvaslineWidget-yT7FUWs8.cjs → CanvaslineWidget-CxZGCwVF.cjs} +2 -2
- package/dist/{CanvaslineWidget-yT7FUWs8.cjs.map → CanvaslineWidget-CxZGCwVF.cjs.map} +1 -1
- package/dist/{CanvaslineWidget-BjBvF-vY.js → CanvaslineWidget-DaHxgGyM.js} +2 -2
- package/dist/{CanvaslineWidget-BjBvF-vY.js.map → CanvaslineWidget-DaHxgGyM.js.map} +1 -1
- package/dist/{CanvaslinevalueWidget-Dj4tsTBp.cjs → CanvaslinevalueWidget-BljeuN4S.cjs} +2 -2
- package/dist/{CanvaslinevalueWidget-Dj4tsTBp.cjs.map → CanvaslinevalueWidget-BljeuN4S.cjs.map} +1 -1
- package/dist/{CanvaslinevalueWidget-krBLp9yB.js → CanvaslinevalueWidget-CrtDsSOP.js} +2 -2
- package/dist/{CanvaslinevalueWidget-krBLp9yB.js.map → CanvaslinevalueWidget-CrtDsSOP.js.map} +1 -1
- package/dist/{CheckbuttonWidget-IMrIK9q4.js → CheckbuttonWidget-BK4SgIu7.js} +2 -2
- package/dist/{CheckbuttonWidget-IMrIK9q4.js.map → CheckbuttonWidget-BK4SgIu7.js.map} +1 -1
- package/dist/{CheckbuttonWidget-CT28NPNo.cjs → CheckbuttonWidget-By46VH2e.cjs} +2 -2
- package/dist/{CheckbuttonWidget-CT28NPNo.cjs.map → CheckbuttonWidget-By46VH2e.cjs.map} +1 -1
- package/dist/{ClassificationBanners-DC__VXBX.cjs → ClassificationBanners-CHQX3t7t.cjs} +2 -2
- package/dist/{ClassificationBanners-DC__VXBX.cjs.map → ClassificationBanners-CHQX3t7t.cjs.map} +1 -1
- package/dist/{ClassificationBanners-DiIkXqna.js → ClassificationBanners-DGl2HUKd.js} +2 -2
- package/dist/{ClassificationBanners-DiIkXqna.js.map → ClassificationBanners-DGl2HUKd.js.map} +1 -1
- package/dist/{ComboboxWidget-hFBSBFwy.cjs → ComboboxWidget-CHFTOmhZ.cjs} +2 -2
- package/dist/{ComboboxWidget-hFBSBFwy.cjs.map → ComboboxWidget-CHFTOmhZ.cjs.map} +1 -1
- package/dist/{ComboboxWidget-C9Zlc2Hy.js → ComboboxWidget-CciRWuKq.js} +2 -2
- package/dist/{ComboboxWidget-C9Zlc2Hy.js.map → ComboboxWidget-CciRWuKq.js.map} +1 -1
- package/dist/{CriticalCmdDialog-CCaStsM-.cjs → CriticalCmdDialog-BWrwpTNK.cjs} +2 -2
- package/dist/{CriticalCmdDialog-CCaStsM-.cjs.map → CriticalCmdDialog-BWrwpTNK.cjs.map} +1 -1
- package/dist/{CriticalCmdDialog-Cp-ykpQb.js → CriticalCmdDialog-C5EZDRSZ.js} +2 -2
- package/dist/{CriticalCmdDialog-Cp-ykpQb.js.map → CriticalCmdDialog-C5EZDRSZ.js.map} +1 -1
- package/dist/{DateWidget-C_QpCTxN.cjs → DateWidget-Bb6juAYs.cjs} +2 -2
- package/dist/{DateWidget-C_QpCTxN.cjs.map → DateWidget-Bb6juAYs.cjs.map} +1 -1
- package/dist/{DateWidget-Y6WAFGGt.js → DateWidget-DwgQ3Jik.js} +2 -2
- package/dist/{DateWidget-Y6WAFGGt.js.map → DateWidget-DwgQ3Jik.js.map} +1 -1
- package/dist/{DetailsDialog-DznGAE6i.js → DetailsDialog-CspQjoR5.js} +3 -3
- package/dist/{DetailsDialog-DznGAE6i.js.map → DetailsDialog-CspQjoR5.js.map} +1 -1
- package/dist/{DetailsDialog-Bq9BPuoe.cjs → DetailsDialog-D_my0nhs.cjs} +2 -2
- package/dist/{DetailsDialog-Bq9BPuoe.cjs.map → DetailsDialog-D_my0nhs.cjs.map} +1 -1
- package/dist/{EventListDialog-CktWO2jn.js → EventListDialog-DL2HHNQG.js} +9 -6
- package/dist/EventListDialog-DL2HHNQG.js.map +1 -0
- package/dist/EventListDialog-DO32zY2U.cjs +2 -0
- package/dist/EventListDialog-DO32zY2U.cjs.map +1 -0
- package/dist/{FilechecksumWidget-VbLODmHh.js → FilechecksumWidget-BS281Q0h.js} +3 -3
- package/dist/{FilechecksumWidget-VbLODmHh.js.map → FilechecksumWidget-BS281Q0h.js.map} +1 -1
- package/dist/{FilechecksumWidget-BZdmiTbb.cjs → FilechecksumWidget-DMpuLZJ5.cjs} +2 -2
- package/dist/{FilechecksumWidget-BZdmiTbb.cjs.map → FilechecksumWidget-DMpuLZJ5.cjs.map} +1 -1
- package/dist/{FiledisplayWidget-BI7GAQ4d.cjs → FiledisplayWidget-BoD7LuLP.cjs} +2 -2
- package/dist/{FiledisplayWidget-BI7GAQ4d.cjs.map → FiledisplayWidget-BoD7LuLP.cjs.map} +1 -1
- package/dist/{FiledisplayWidget-kixqcLtx.js → FiledisplayWidget-C9YdXDdv.js} +3 -3
- package/dist/{FiledisplayWidget-kixqcLtx.js.map → FiledisplayWidget-C9YdXDdv.js.map} +1 -1
- package/dist/{FormatvalueWidget-I1y_kf9t.cjs → FormatvalueWidget-DfvTVSs-.cjs} +2 -2
- package/dist/{FormatvalueWidget-I1y_kf9t.cjs.map → FormatvalueWidget-DfvTVSs-.cjs.map} +1 -1
- package/dist/{FormatvalueWidget--djAS0BE.js → FormatvalueWidget-dfmQfrNA.js} +3 -3
- package/dist/{FormatvalueWidget--djAS0BE.js.map → FormatvalueWidget-dfmQfrNA.js.map} +1 -1
- package/dist/{Graph-GhpiUBKI.js → Graph-BTtGIbYG.js} +10 -6
- package/dist/Graph-BTtGIbYG.js.map +1 -0
- package/dist/Graph-Cy2LrwoK.cjs +2 -0
- package/dist/Graph-Cy2LrwoK.cjs.map +1 -0
- package/dist/{GraphWidget-8T08osON.js → GraphWidget-CWJ4Yb26.js} +2 -2
- package/dist/{GraphWidget-8T08osON.js.map → GraphWidget-CWJ4Yb26.js.map} +1 -1
- package/dist/{GraphWidget-Bzo-klWV.cjs → GraphWidget-XjxjI3og.cjs} +2 -2
- package/dist/{GraphWidget-Bzo-klWV.cjs.map → GraphWidget-XjxjI3og.cjs.map} +1 -1
- package/dist/{HorizontalWidget-CAf9I0CU.cjs → HorizontalWidget-BeW4b13V.cjs} +2 -2
- package/dist/{HorizontalWidget-CAf9I0CU.cjs.map → HorizontalWidget-BeW4b13V.cjs.map} +1 -1
- package/dist/{HorizontalWidget-CusI1RiA.js → HorizontalWidget-DFAqF95S.js} +2 -2
- package/dist/{HorizontalWidget-CusI1RiA.js.map → HorizontalWidget-DFAqF95S.js.map} +1 -1
- package/dist/{HorizontalboxWidget-D5fIhINf.js → HorizontalboxWidget-CL1xEhDj.js} +5 -5
- package/dist/{HorizontalboxWidget-D5fIhINf.js.map → HorizontalboxWidget-CL1xEhDj.js.map} +1 -1
- package/dist/{HorizontalboxWidget-B7E5GEPu.cjs → HorizontalboxWidget-DdPv_6qb.cjs} +2 -2
- package/dist/{HorizontalboxWidget-B7E5GEPu.cjs.map → HorizontalboxWidget-DdPv_6qb.cjs.map} +1 -1
- package/dist/{HorizontallineWidget-DqLKGhdz.cjs → HorizontallineWidget-BdWOnioI.cjs} +2 -2
- package/dist/{HorizontallineWidget-DqLKGhdz.cjs.map → HorizontallineWidget-BdWOnioI.cjs.map} +1 -1
- package/dist/{HorizontallineWidget-CnRlq7hi.js → HorizontallineWidget-DPiADCAy.js} +2 -2
- package/dist/{HorizontallineWidget-CnRlq7hi.js.map → HorizontallineWidget-DPiADCAy.js.map} +1 -1
- package/dist/{IframeWidget-DtF44NYM.js → IframeWidget-BsDu4b17.js} +2 -2
- package/dist/{IframeWidget-DtF44NYM.js.map → IframeWidget-BsDu4b17.js.map} +1 -1
- package/dist/{IframeWidget-BMtv8io0.cjs → IframeWidget-Z12pG6JT.cjs} +2 -2
- package/dist/{IframeWidget-BMtv8io0.cjs.map → IframeWidget-Z12pG6JT.cjs.map} +1 -1
- package/dist/{ImageLoader-B5rGuJ_H.js → ImageLoader-CT4rnwWn.js} +2 -2
- package/dist/{ImageLoader-B5rGuJ_H.js.map → ImageLoader-CT4rnwWn.js.map} +1 -1
- package/dist/{ImageLoader-jcIDHdUq.cjs → ImageLoader-CZ0Wx_Ua.cjs} +2 -2
- package/dist/{ImageLoader-jcIDHdUq.cjs.map → ImageLoader-CZ0Wx_Ua.cjs.map} +1 -1
- package/dist/{ImageviewerWidget-Ciu80vaC.js → ImageviewerWidget-BQbrz2WL.js} +2 -2
- package/dist/{ImageviewerWidget-Ciu80vaC.js.map → ImageviewerWidget-BQbrz2WL.js.map} +1 -1
- package/dist/{ImageviewerWidget-ox5FNYVP.cjs → ImageviewerWidget-CtJzQn0e.cjs} +2 -2
- package/dist/{ImageviewerWidget-ox5FNYVP.cjs.map → ImageviewerWidget-CtJzQn0e.cjs.map} +1 -1
- package/dist/{InterfacesTab-CUM5GGWs.cjs → InterfacesTab-A0g0y1n1.cjs} +2 -2
- package/dist/{InterfacesTab-CUM5GGWs.cjs.map → InterfacesTab-A0g0y1n1.cjs.map} +1 -1
- package/dist/{InterfacesTab-C14LErLZ.js → InterfacesTab-COKNyeUu.js} +3 -3
- package/dist/{InterfacesTab-C14LErLZ.js.map → InterfacesTab-COKNyeUu.js.map} +1 -1
- package/dist/{LabelWidget-78VnL1xc.js → LabelWidget-D5-IFUYW.js} +2 -2
- package/dist/{LabelWidget-78VnL1xc.js.map → LabelWidget-D5-IFUYW.js.map} +1 -1
- package/dist/{LabelWidget-B9J1Whh0.cjs → LabelWidget-rH3SsItK.cjs} +2 -2
- package/dist/{LabelWidget-B9J1Whh0.cjs.map → LabelWidget-rH3SsItK.cjs.map} +1 -1
- package/dist/{LabelledWidget-BMtqUP-E.cjs → LabelledWidget-Bca_qNSP.cjs} +2 -2
- package/dist/{LabelledWidget-BMtqUP-E.cjs.map → LabelledWidget-Bca_qNSP.cjs.map} +1 -1
- package/dist/{LabelledWidget-Cx2PI85E.js → LabelledWidget-Dt9miRtB.js} +4 -4
- package/dist/{LabelledWidget-Cx2PI85E.js.map → LabelledWidget-Dt9miRtB.js.map} +1 -1
- package/dist/{LabelprogressbarWidget-eC7VC7lY.js → LabelprogressbarWidget-BNFgTq4D.js} +4 -4
- package/dist/{LabelprogressbarWidget-eC7VC7lY.js.map → LabelprogressbarWidget-BNFgTq4D.js.map} +1 -1
- package/dist/{LabelprogressbarWidget-Ce3PRzaA.cjs → LabelprogressbarWidget-hyK9Vqsl.cjs} +2 -2
- package/dist/{LabelprogressbarWidget-Ce3PRzaA.cjs.map → LabelprogressbarWidget-hyK9Vqsl.cjs.map} +1 -1
- package/dist/{LabelsparklineWidget-CP5rD4ob.js → LabelsparklineWidget-BByxev6X.js} +4 -4
- package/dist/{LabelsparklineWidget-CP5rD4ob.js.map → LabelsparklineWidget-BByxev6X.js.map} +1 -1
- package/dist/{LabelsparklineWidget-DuCA67yl.cjs → LabelsparklineWidget-BxkxEVwQ.cjs} +2 -2
- package/dist/{LabelsparklineWidget-DuCA67yl.cjs.map → LabelsparklineWidget-BxkxEVwQ.cjs.map} +1 -1
- package/dist/{LabelvalueWidget-PM8DFnDm.js → LabelvalueWidget-BM6L9bVw.js} +4 -4
- package/dist/{LabelvalueWidget-PM8DFnDm.js.map → LabelvalueWidget-BM6L9bVw.js.map} +1 -1
- package/dist/{LabelvalueWidget-DxEvAoHT.cjs → LabelvalueWidget-DEGmbKMG.cjs} +2 -2
- package/dist/{LabelvalueWidget-DxEvAoHT.cjs.map → LabelvalueWidget-DEGmbKMG.cjs.map} +1 -1
- package/dist/{LabelvaluedescWidget-Dy3_fdkx.cjs → LabelvaluedescWidget-B7bGqqeO.cjs} +2 -2
- package/dist/{LabelvaluedescWidget-Dy3_fdkx.cjs.map → LabelvaluedescWidget-B7bGqqeO.cjs.map} +1 -1
- package/dist/{LabelvaluedescWidget-C8OmKnu-.js → LabelvaluedescWidget-DeBRjYXs.js} +5 -5
- package/dist/{LabelvaluedescWidget-C8OmKnu-.js.map → LabelvaluedescWidget-DeBRjYXs.js.map} +1 -1
- package/dist/{LabelvaluelimitsbarWidget-DIsTQqkO.js → LabelvaluelimitsbarWidget-CqV0-c3G.js} +4 -4
- package/dist/{LabelvaluelimitsbarWidget-DIsTQqkO.js.map → LabelvaluelimitsbarWidget-CqV0-c3G.js.map} +1 -1
- package/dist/{LabelvaluelimitsbarWidget-DWvSVvXl.cjs → LabelvaluelimitsbarWidget-DzEc9ZZr.cjs} +2 -2
- package/dist/{LabelvaluelimitsbarWidget-DWvSVvXl.cjs.map → LabelvaluelimitsbarWidget-DzEc9ZZr.cjs.map} +1 -1
- package/dist/{LabelvaluelimitscolumnWidget-ld556rRi.js → LabelvaluelimitscolumnWidget-Bz0PKTIV.js} +5 -5
- package/dist/{LabelvaluelimitscolumnWidget-ld556rRi.js.map → LabelvaluelimitscolumnWidget-Bz0PKTIV.js.map} +1 -1
- package/dist/{LabelvaluelimitscolumnWidget-CyPuEz7E.cjs → LabelvaluelimitscolumnWidget-C0-v0q7a.cjs} +2 -2
- package/dist/{LabelvaluelimitscolumnWidget-CyPuEz7E.cjs.map → LabelvaluelimitscolumnWidget-C0-v0q7a.cjs.map} +1 -1
- package/dist/{LabelvaluerangebarWidget-DdqgjjUc.cjs → LabelvaluerangebarWidget-CWhsb5gm.cjs} +2 -2
- package/dist/{LabelvaluerangebarWidget-DdqgjjUc.cjs.map → LabelvaluerangebarWidget-CWhsb5gm.cjs.map} +1 -1
- package/dist/{LabelvaluerangebarWidget-nCeoujui.js → LabelvaluerangebarWidget-DKuAJHLm.js} +4 -4
- package/dist/{LabelvaluerangebarWidget-nCeoujui.js.map → LabelvaluerangebarWidget-DKuAJHLm.js.map} +1 -1
- package/dist/{Layout-BcytiBn4.js → Layout-LSeXBY_W.js} +2 -2
- package/dist/{Layout-BcytiBn4.js.map → Layout-LSeXBY_W.js.map} +1 -1
- package/dist/{Layout-JCk8r88e.cjs → Layout-QcVHlWPp.cjs} +2 -2
- package/dist/{Layout-JCk8r88e.cjs.map → Layout-QcVHlWPp.cjs.map} +1 -1
- package/dist/{LedWidget-3pWKnZsD.js → LedWidget-CH4Il9R7.js} +4 -4
- package/dist/{LedWidget-3pWKnZsD.js.map → LedWidget-CH4Il9R7.js.map} +1 -1
- package/dist/{LedWidget-BEP-sFTh.cjs → LedWidget-CJwBssHl.cjs} +2 -2
- package/dist/{LedWidget-BEP-sFTh.cjs.map → LedWidget-CJwBssHl.cjs.map} +1 -1
- package/dist/{LimitsBar-BJ_cERjE.cjs → LimitsBar-B0O6RMrG.cjs} +2 -2
- package/dist/{LimitsBar-BJ_cERjE.cjs.map → LimitsBar-B0O6RMrG.cjs.map} +1 -1
- package/dist/{LimitsBar-DCco6Rwp.js → LimitsBar-BelAQFD0.js} +2 -2
- package/dist/{LimitsBar-DCco6Rwp.js.map → LimitsBar-BelAQFD0.js.map} +1 -1
- package/dist/{LimitsbarWidget-DiAnkXID.cjs → LimitsbarWidget--AwjBbtb.cjs} +2 -2
- package/dist/{LimitsbarWidget-DiAnkXID.cjs.map → LimitsbarWidget--AwjBbtb.cjs.map} +1 -1
- package/dist/{LimitsbarWidget-_BMzxWBm.js → LimitsbarWidget-PkPqlyxL.js} +3 -3
- package/dist/{LimitsbarWidget-_BMzxWBm.js.map → LimitsbarWidget-PkPqlyxL.js.map} +1 -1
- package/dist/{LimitscolorWidget-ByfzIE_O.cjs → LimitscolorWidget-1D2myv8a.cjs} +2 -2
- package/dist/{LimitscolorWidget-ByfzIE_O.cjs.map → LimitscolorWidget-1D2myv8a.cjs.map} +1 -1
- package/dist/{LimitscolorWidget-C2gZyqtI.js → LimitscolorWidget-BlA15g4A.js} +4 -4
- package/dist/{LimitscolorWidget-C2gZyqtI.js.map → LimitscolorWidget-BlA15g4A.js.map} +1 -1
- package/dist/{LimitscolumnWidget-Cv-6FXU3.js → LimitscolumnWidget-PT917BA0.js} +2 -2
- package/dist/{LimitscolumnWidget-Cv-6FXU3.js.map → LimitscolumnWidget-PT917BA0.js.map} +1 -1
- package/dist/{LimitscolumnWidget-CZwcXbLS.cjs → LimitscolumnWidget-_QPf3cUQ.cjs} +2 -2
- package/dist/{LimitscolumnWidget-CZwcXbLS.cjs.map → LimitscolumnWidget-_QPf3cUQ.cjs.map} +1 -1
- package/dist/{LinegraphWidget-BahyhwSt.js → LinegraphWidget-BW7kS_6G.js} +4 -4
- package/dist/{LinegraphWidget-BahyhwSt.js.map → LinegraphWidget-BW7kS_6G.js.map} +1 -1
- package/dist/{LinegraphWidget-so5ohfWF.cjs → LinegraphWidget-DfXd3959.cjs} +2 -2
- package/dist/{LinegraphWidget-so5ohfWF.cjs.map → LinegraphWidget-DfXd3959.cjs.map} +1 -1
- package/dist/{MatrixbycolumnsWidget-B1Hy9but.js → MatrixbycolumnsWidget-BGNsZvjv.js} +3 -3
- package/dist/{MatrixbycolumnsWidget-B1Hy9but.js.map → MatrixbycolumnsWidget-BGNsZvjv.js.map} +1 -1
- package/dist/{MatrixbycolumnsWidget-Dma8IsO-.cjs → MatrixbycolumnsWidget-oRYGFSEt.cjs} +2 -2
- package/dist/{MatrixbycolumnsWidget-Dma8IsO-.cjs.map → MatrixbycolumnsWidget-oRYGFSEt.cjs.map} +1 -1
- package/dist/{MicroservicesTab-BSXNA_Si.js → MicroservicesTab-CiEGGavF.js} +3 -3
- package/dist/{MicroservicesTab-BSXNA_Si.js.map → MicroservicesTab-CiEGGavF.js.map} +1 -1
- package/dist/{MicroservicesTab-ARGtrfOb.cjs → MicroservicesTab-DvDK2hPW.cjs} +2 -2
- package/dist/{MicroservicesTab-ARGtrfOb.cjs.map → MicroservicesTab-DvDK2hPW.cjs.map} +1 -1
- package/dist/{OpenC3TimePicker-LN9R7V31.js → OpenC3TimePicker-CkaALgy9.js} +2 -2
- package/dist/{OpenC3TimePicker-LN9R7V31.js.map → OpenC3TimePicker-CkaALgy9.js.map} +1 -1
- package/dist/{OpenC3TimePicker-BHX9fnlR.cjs → OpenC3TimePicker-bbdbKTv_.cjs} +2 -2
- package/dist/{OpenC3TimePicker-BHX9fnlR.cjs.map → OpenC3TimePicker-bbdbKTv_.cjs.map} +1 -1
- package/dist/{Openc3Screen-BP7Ho9XC.js → Openc3Screen-BnM1bNOB.js} +11 -12
- package/dist/{Openc3Screen-BP7Ho9XC.js.map → Openc3Screen-BnM1bNOB.js.map} +1 -1
- package/dist/{Openc3Screen-CJOTF-lu.cjs → Openc3Screen-DoOAFAlJ.cjs} +4 -4
- package/dist/{Openc3Screen-CJOTF-lu.cjs.map → Openc3Screen-DoOAFAlJ.cjs.map} +1 -1
- package/dist/{OutputDialog-JdAxzpPD.js → OutputDialog-BY-TZNRl.js} +2 -2
- package/dist/{OutputDialog-JdAxzpPD.js.map → OutputDialog-BY-TZNRl.js.map} +1 -1
- package/dist/{OutputDialog-Dx5mkq19.cjs → OutputDialog-R3Xj3_yw.cjs} +2 -2
- package/dist/{OutputDialog-Dx5mkq19.cjs.map → OutputDialog-R3Xj3_yw.cjs.map} +1 -1
- package/dist/{PackagesTab-HPNAXhzf.cjs → PackagesTab-2Mu7yvxU.cjs} +2 -2
- package/dist/{PackagesTab-HPNAXhzf.cjs.map → PackagesTab-2Mu7yvxU.cjs.map} +1 -1
- package/dist/{PackagesTab-ByfVH001.js → PackagesTab-DGrqIo_Z.js} +4 -4
- package/dist/{PackagesTab-ByfVH001.js.map → PackagesTab-DGrqIo_Z.js.map} +1 -1
- package/dist/{PluginsTab-D7zpmf8s.js → PluginsTab-BXjVe_81.js} +427 -390
- package/dist/PluginsTab-BXjVe_81.js.map +1 -0
- package/dist/PluginsTab-R6i60Pih.cjs +6 -0
- package/dist/PluginsTab-R6i60Pih.cjs.map +1 -0
- package/dist/{ProgressbarWidget-mAVHKeok.js → ProgressbarWidget-Cy_ad8mb.js} +2 -2
- package/dist/{ProgressbarWidget-mAVHKeok.js.map → ProgressbarWidget-Cy_ad8mb.js.map} +1 -1
- package/dist/{ProgressbarWidget-BINuoD9p.cjs → ProgressbarWidget-XAy4iHgC.cjs} +2 -2
- package/dist/{ProgressbarWidget-BINuoD9p.cjs.map → ProgressbarWidget-XAy4iHgC.cjs.map} +1 -1
- package/dist/{RadiobuttonWidget-CL3QjTnZ.js → RadiobuttonWidget-aJBIz45y.js} +2 -2
- package/dist/{RadiobuttonWidget-CL3QjTnZ.js.map → RadiobuttonWidget-aJBIz45y.js.map} +1 -1
- package/dist/{RadiobuttonWidget-DDmgt0su.cjs → RadiobuttonWidget-fAqkUUTb.cjs} +2 -2
- package/dist/{RadiobuttonWidget-DDmgt0su.cjs.map → RadiobuttonWidget-fAqkUUTb.cjs.map} +1 -1
- package/dist/{RadiogroupWidget-q7h1v-ko.cjs → RadiogroupWidget-BuYMyBQd.cjs} +2 -2
- package/dist/{RadiogroupWidget-q7h1v-ko.cjs.map → RadiogroupWidget-BuYMyBQd.cjs.map} +1 -1
- package/dist/{RadiogroupWidget-RUwgtUTC.js → RadiogroupWidget-DNRlJnPE.js} +2 -2
- package/dist/{RadiogroupWidget-RUwgtUTC.js.map → RadiogroupWidget-DNRlJnPE.js.map} +1 -1
- package/dist/{RangebarWidget-BbPMpwMs.cjs → RangebarWidget-gcukfXnM.cjs} +2 -2
- package/dist/{RangebarWidget-BbPMpwMs.cjs.map → RangebarWidget-gcukfXnM.cjs.map} +1 -1
- package/dist/{RangebarWidget-CfDsKLZc.js → RangebarWidget-h4YItqPF.js} +2 -2
- package/dist/{RangebarWidget-CfDsKLZc.js.map → RangebarWidget-h4YItqPF.js.map} +1 -1
- package/dist/{RedisTab-dZE6KvLS.cjs → RedisTab-0V8f-hs1.cjs} +2 -2
- package/dist/{RedisTab-dZE6KvLS.cjs.map → RedisTab-0V8f-hs1.cjs.map} +1 -1
- package/dist/{RedisTab-YrX-5A3T.js → RedisTab-BmZWA0OG.js} +2 -2
- package/dist/{RedisTab-YrX-5A3T.js.map → RedisTab-BmZWA0OG.js.map} +1 -1
- package/dist/{RollupWidget-DCMoQUeJ.js → RollupWidget-CnxDQRQ0.js} +2 -2
- package/dist/{RollupWidget-DCMoQUeJ.js.map → RollupWidget-CnxDQRQ0.js.map} +1 -1
- package/dist/{RollupWidget-BmgRFIOo.cjs → RollupWidget-ZerASRD3.cjs} +2 -2
- package/dist/{RollupWidget-BmgRFIOo.cjs.map → RollupWidget-ZerASRD3.cjs.map} +1 -1
- package/dist/{RoutersTab-C6vejQrw.cjs → RoutersTab-CY-SmZd4.cjs} +2 -2
- package/dist/{RoutersTab-C6vejQrw.cjs.map → RoutersTab-CY-SmZd4.cjs.map} +1 -1
- package/dist/{RoutersTab-MA9KW_gu.js → RoutersTab-Db28gKLP.js} +3 -3
- package/dist/{RoutersTab-MA9KW_gu.js.map → RoutersTab-Db28gKLP.js.map} +1 -1
- package/dist/{ScriptChooser-DGbs03IW.js → ScriptChooser-Bl0wisob.js} +4 -4
- package/dist/{ScriptChooser-DGbs03IW.js.map → ScriptChooser-Bl0wisob.js.map} +1 -1
- package/dist/{ScriptChooser-Cm_HEyBf.cjs → ScriptChooser-CI4lAYZ1.cjs} +2 -2
- package/dist/{ScriptChooser-Cm_HEyBf.cjs.map → ScriptChooser-CI4lAYZ1.cjs.map} +1 -1
- package/dist/{ScrollwindowWidget-BbASNNcM.cjs → ScrollwindowWidget-BJkQ5uX_.cjs} +2 -2
- package/dist/{ScrollwindowWidget-BbASNNcM.cjs.map → ScrollwindowWidget-BJkQ5uX_.cjs.map} +1 -1
- package/dist/{ScrollwindowWidget-DarXe7-1.js → ScrollwindowWidget-DFkTJ2Ue.js} +2 -2
- package/dist/{ScrollwindowWidget-DarXe7-1.js.map → ScrollwindowWidget-DFkTJ2Ue.js.map} +1 -1
- package/dist/{SecretsTab-DwE3KJNI.cjs → SecretsTab-B8YTrfQ2.cjs} +2 -2
- package/dist/{SecretsTab-DwE3KJNI.cjs.map → SecretsTab-B8YTrfQ2.cjs.map} +1 -1
- package/dist/{SecretsTab-DTaPAHv3.js → SecretsTab-DTdVLi0I.js} +2 -2
- package/dist/{SecretsTab-DTaPAHv3.js.map → SecretsTab-DTdVLi0I.js.map} +1 -1
- package/dist/{SettingsTab-BhT5sui9.js → SettingsTab-CnybxvVj.js} +4 -4
- package/dist/{SettingsTab-BhT5sui9.js.map → SettingsTab-CnybxvVj.js.map} +1 -1
- package/dist/{SettingsTab-o9tfAuE4.cjs → SettingsTab-_SJLhuk0.cjs} +2 -2
- package/dist/{SettingsTab-o9tfAuE4.cjs.map → SettingsTab-_SJLhuk0.cjs.map} +1 -1
- package/dist/{SignalWidget-CO3UaFok.cjs → SignalWidget-DC7-NIOj.cjs} +2 -2
- package/dist/{SignalWidget-CO3UaFok.cjs.map → SignalWidget-DC7-NIOj.cjs.map} +1 -1
- package/dist/{SignalWidget-C-iEC5KL.js → SignalWidget-jYpXSIfD.js} +2 -2
- package/dist/{SignalWidget-C-iEC5KL.js.map → SignalWidget-jYpXSIfD.js.map} +1 -1
- package/dist/{SimpleTextDialog-B9ZurpdS.cjs → SimpleTextDialog-DLdHGmmb.cjs} +2 -2
- package/dist/{SimpleTextDialog-B9ZurpdS.cjs.map → SimpleTextDialog-DLdHGmmb.cjs.map} +1 -1
- package/dist/{SimpleTextDialog-Bqh3eT2B.js → SimpleTextDialog-Dd3BoNG-.js} +2 -2
- package/dist/{SimpleTextDialog-Bqh3eT2B.js.map → SimpleTextDialog-Dd3BoNG-.js.map} +1 -1
- package/dist/{SpacerWidget-CQh-LB4u.cjs → SpacerWidget-BwwxG8k3.cjs} +2 -2
- package/dist/{SpacerWidget-CQh-LB4u.cjs.map → SpacerWidget-BwwxG8k3.cjs.map} +1 -1
- package/dist/{SpacerWidget-FHxUhs1G.js → SpacerWidget-CUqvml6o.js} +2 -2
- package/dist/{SpacerWidget-FHxUhs1G.js.map → SpacerWidget-CUqvml6o.js.map} +1 -1
- package/dist/{SparklineWidget-BsMIozYC.cjs → SparklineWidget-05TlKC-x.cjs} +2 -2
- package/dist/{SparklineWidget-BsMIozYC.cjs.map → SparklineWidget-05TlKC-x.cjs.map} +1 -1
- package/dist/{SparklineWidget-ClT5Umm2.js → SparklineWidget-CVf1TtjV.js} +4 -4
- package/dist/{SparklineWidget-ClT5Umm2.js.map → SparklineWidget-CVf1TtjV.js.map} +1 -1
- package/dist/{TabbookWidget-D-b0v0oo.js → TabbookWidget-CTUEpDnn.js} +2 -2
- package/dist/{TabbookWidget-D-b0v0oo.js.map → TabbookWidget-CTUEpDnn.js.map} +1 -1
- package/dist/{TabbookWidget-So-oaWd4.cjs → TabbookWidget-oZre4A6Y.cjs} +2 -2
- package/dist/{TabbookWidget-So-oaWd4.cjs.map → TabbookWidget-oZre4A6Y.cjs.map} +1 -1
- package/dist/TargetPacketItemChooser-BvXBVNLj.cjs +2 -0
- package/dist/TargetPacketItemChooser-BvXBVNLj.cjs.map +1 -0
- package/dist/{TargetPacketItemChooser-DD7JgCD9.js → TargetPacketItemChooser-CS2Vvi2U.js} +22 -22
- package/dist/TargetPacketItemChooser-CS2Vvi2U.js.map +1 -0
- package/dist/{TargetsTab-BD0JGvAl.cjs → TargetsTab-Bc7-iav6.cjs} +2 -2
- package/dist/{TargetsTab-BD0JGvAl.cjs.map → TargetsTab-Bc7-iav6.cjs.map} +1 -1
- package/dist/{TargetsTab-hTLe_rba.js → TargetsTab-CGv0GwAF.js} +3 -3
- package/dist/{TargetsTab-hTLe_rba.js.map → TargetsTab-CGv0GwAF.js.map} +1 -1
- package/dist/{TextboxWidget-WM3eFUR_.js → TextboxWidget-B0Y1W7GP.js} +4 -4
- package/dist/{TextboxWidget-WM3eFUR_.js.map → TextboxWidget-B0Y1W7GP.js.map} +1 -1
- package/dist/{TextboxWidget-CF4iq315.cjs → TextboxWidget-qSbx4xxD.cjs} +2 -2
- package/dist/{TextboxWidget-CF4iq315.cjs.map → TextboxWidget-qSbx4xxD.cjs.map} +1 -1
- package/dist/{TextfieldWidget-lfc1Vg51.js → TextfieldWidget-B8TAf9oU.js} +2 -2
- package/dist/{TextfieldWidget-lfc1Vg51.js.map → TextfieldWidget-B8TAf9oU.js.map} +1 -1
- package/dist/{TextfieldWidget-D9BINKRU.cjs → TextfieldWidget-cCG7BQ25.cjs} +2 -2
- package/dist/{TextfieldWidget-D9BINKRU.cjs.map → TextfieldWidget-cCG7BQ25.cjs.map} +1 -1
- package/dist/{TimeWidget-CgtJbnnC.cjs → TimeWidget-DNkhFoZO.cjs} +2 -2
- package/dist/{TimeWidget-CgtJbnnC.cjs.map → TimeWidget-DNkhFoZO.cjs.map} +1 -1
- package/dist/{TimeWidget-B13aIVqG.js → TimeWidget-DewVXks0.js} +3 -3
- package/dist/{TimeWidget-B13aIVqG.js.map → TimeWidget-DewVXks0.js.map} +1 -1
- package/dist/{TitleWidget-CTAMgzU4.js → TitleWidget-BAq2LGJF.js} +2 -2
- package/dist/{TitleWidget-CTAMgzU4.js.map → TitleWidget-BAq2LGJF.js.map} +1 -1
- package/dist/{TitleWidget-BV2sDP_-.cjs → TitleWidget-ChGb6BJW.cjs} +2 -2
- package/dist/{TitleWidget-BV2sDP_-.cjs.map → TitleWidget-ChGb6BJW.cjs.map} +1 -1
- package/dist/{ToolsTab-DXK-L-kx.cjs → ToolsTab-CB_6hFQF.cjs} +2 -2
- package/dist/{ToolsTab-DXK-L-kx.cjs.map → ToolsTab-CB_6hFQF.cjs.map} +1 -1
- package/dist/{ToolsTab-CmhRtClS.js → ToolsTab-USmbUvDq.js} +3 -3
- package/dist/{ToolsTab-CmhRtClS.js.map → ToolsTab-USmbUvDq.js.map} +1 -1
- package/dist/{TopBar-D-lJHb6d.js → TopBar-B4RDkLs-.js} +2 -2
- package/dist/{TopBar-D-lJHb6d.js.map → TopBar-B4RDkLs-.js.map} +1 -1
- package/dist/{TopBar-BiE7GgIN.cjs → TopBar-DzL3L4ih.cjs} +2 -2
- package/dist/{TopBar-BiE7GgIN.cjs.map → TopBar-DzL3L4ih.cjs.map} +1 -1
- package/dist/TsdbTab-0aYlysh5.js +125 -0
- package/dist/TsdbTab-0aYlysh5.js.map +1 -0
- package/dist/TsdbTab-H64XGfOO.cjs +2 -0
- package/dist/TsdbTab-H64XGfOO.cjs.map +1 -0
- package/dist/{UpgradeToEnterpriseDialog-D1_viCAx.cjs → UpgradeToEnterpriseDialog-BBRXrLrL.cjs} +2 -2
- package/dist/{UpgradeToEnterpriseDialog-D1_viCAx.cjs.map → UpgradeToEnterpriseDialog-BBRXrLrL.cjs.map} +1 -1
- package/dist/{UpgradeToEnterpriseDialog-et3RrozN.js → UpgradeToEnterpriseDialog-DTmnp8xy.js} +2 -2
- package/dist/{UpgradeToEnterpriseDialog-et3RrozN.js.map → UpgradeToEnterpriseDialog-DTmnp8xy.js.map} +1 -1
- package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-D0cYHPwr.js → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-CDTSzdb-.js} +2 -2
- package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-D0cYHPwr.js.map → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-CDTSzdb-.js.map} +1 -1
- package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DtL207xP.cjs → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-MfH160rD.cjs} +2 -2
- package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DtL207xP.cjs.map → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-MfH160rD.cjs.map} +1 -1
- package/dist/{VWidget-0kkhOxhV.js → VWidget-0KwtSssI.js} +3 -3
- package/dist/{VWidget-0kkhOxhV.js.map → VWidget-0KwtSssI.js.map} +1 -1
- package/dist/{VWidget-Dkji3VZ0.cjs → VWidget-SWmlQP30.cjs} +2 -2
- package/dist/{VWidget-Dkji3VZ0.cjs.map → VWidget-SWmlQP30.cjs.map} +1 -1
- package/dist/{ValueWidget-BoQfnx8U.js → ValueWidget-BGNqaaRs.js} +4 -4
- package/dist/{ValueWidget-BoQfnx8U.js.map → ValueWidget-BGNqaaRs.js.map} +1 -1
- package/dist/{ValueWidget-mkXMZvdK.cjs → ValueWidget-BfxZq1LD.cjs} +2 -2
- package/dist/{ValueWidget-mkXMZvdK.cjs.map → ValueWidget-BfxZq1LD.cjs.map} +1 -1
- package/dist/{ValuelimitsbarWidget-ZfgwDNqX.js → ValuelimitsbarWidget-B6mH4PdF.js} +4 -4
- package/dist/{ValuelimitsbarWidget-ZfgwDNqX.js.map → ValuelimitsbarWidget-B6mH4PdF.js.map} +1 -1
- package/dist/{ValuelimitsbarWidget-B8IUYgYx.cjs → ValuelimitsbarWidget-m5fBewLy.cjs} +2 -2
- package/dist/{ValuelimitsbarWidget-B8IUYgYx.cjs.map → ValuelimitsbarWidget-m5fBewLy.cjs.map} +1 -1
- package/dist/{ValuelimitscolumnWidget-B7DigaiC.cjs → ValuelimitscolumnWidget-D_5XZhiD.cjs} +2 -2
- package/dist/{ValuelimitscolumnWidget-B7DigaiC.cjs.map → ValuelimitscolumnWidget-D_5XZhiD.cjs.map} +1 -1
- package/dist/{ValuelimitscolumnWidget-B3x9DknL.js → ValuelimitscolumnWidget-DlX90_-6.js} +4 -4
- package/dist/{ValuelimitscolumnWidget-B3x9DknL.js.map → ValuelimitscolumnWidget-DlX90_-6.js.map} +1 -1
- package/dist/{ValuerangebarWidget-DA4X0MuO.cjs → ValuerangebarWidget-C3XFFRhf.cjs} +2 -2
- package/dist/{ValuerangebarWidget-DA4X0MuO.cjs.map → ValuerangebarWidget-C3XFFRhf.cjs.map} +1 -1
- package/dist/{ValuerangebarWidget-40InNHft.js → ValuerangebarWidget-C9xyLOJO.js} +4 -4
- package/dist/{ValuerangebarWidget-40InNHft.js.map → ValuerangebarWidget-C9xyLOJO.js.map} +1 -1
- package/dist/{VerticalWidget-abr1X6L7.js → VerticalWidget-0UbbE2g3.js} +2 -2
- package/dist/{VerticalWidget-abr1X6L7.js.map → VerticalWidget-0UbbE2g3.js.map} +1 -1
- package/dist/{VerticalWidget-BiFa3xbs.cjs → VerticalWidget-D-U8cue6.cjs} +2 -2
- package/dist/{VerticalWidget-BiFa3xbs.cjs.map → VerticalWidget-D-U8cue6.cjs.map} +1 -1
- package/dist/{VerticalboxWidget-Cx30rcqe.cjs → VerticalboxWidget-C4nkJhEd.cjs} +2 -2
- package/dist/{VerticalboxWidget-Cx30rcqe.cjs.map → VerticalboxWidget-C4nkJhEd.cjs.map} +1 -1
- package/dist/{VerticalboxWidget-DsbB17o-.js → VerticalboxWidget-efbeOAKE.js} +5 -5
- package/dist/{VerticalboxWidget-DsbB17o-.js.map → VerticalboxWidget-efbeOAKE.js.map} +1 -1
- package/dist/{Widget-DksaxMdD.js → Widget-CGePksBA.js} +2 -2
- package/dist/{Widget-DksaxMdD.js.map → Widget-CGePksBA.js.map} +1 -1
- package/dist/{Widget-VL9FlMQp.cjs → Widget-D0drYWOT.cjs} +2 -2
- package/dist/{Widget-VL9FlMQp.cjs.map → Widget-D0drYWOT.cjs.map} +1 -1
- package/dist/components.cjs +1 -1
- package/dist/components.js +16 -16
- package/dist/{index-BRc4sKEF.js → index-BJrYCoCB.js} +19 -13
- package/dist/index-BJrYCoCB.js.map +1 -0
- package/dist/{index-Qy49-kGB.cjs → index-Cmp6oZpm.cjs} +2 -2
- package/dist/index-Cmp6oZpm.cjs.map +1 -0
- package/dist/plugins.cjs +1 -1
- package/dist/plugins.cjs.map +1 -1
- package/dist/plugins.js +1 -1
- package/dist/plugins.js.map +1 -1
- package/dist/purify.es-4pyphLiB.cjs +3 -0
- package/dist/purify.es-4pyphLiB.cjs.map +1 -0
- package/dist/{purify.es-DcWaZU6I.js → purify.es-BPDBzHtc.js} +115 -115
- package/dist/purify.es-BPDBzHtc.js.map +1 -0
- package/dist/{settings-BDlsBCNk.js → settings-CjmDHCpE.js} +2 -2
- package/dist/{settings-BDlsBCNk.js.map → settings-CjmDHCpE.js.map} +1 -1
- package/dist/{settings-D3MxiRHY.cjs → settings-l1j_GGzu.cjs} +2 -2
- package/dist/{settings-D3MxiRHY.cjs.map → settings-l1j_GGzu.cjs.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 +4 -4
- 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 +1477 -1067
- 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 +64 -64
- package/package.json +7 -7
- package/dist/EventListDialog-CktWO2jn.js.map +0 -1
- package/dist/EventListDialog-EAGLDaHc.cjs +0 -2
- package/dist/EventListDialog-EAGLDaHc.cjs.map +0 -1
- package/dist/Graph-9_EZ9aQx.cjs +0 -2
- package/dist/Graph-9_EZ9aQx.cjs.map +0 -1
- package/dist/Graph-GhpiUBKI.js.map +0 -1
- package/dist/PluginsTab-D7zpmf8s.js.map +0 -1
- package/dist/PluginsTab-DfmpvAYa.cjs +0 -6
- package/dist/PluginsTab-DfmpvAYa.cjs.map +0 -1
- package/dist/TargetPacketItemChooser-DD7JgCD9.js.map +0 -1
- package/dist/TargetPacketItemChooser-PqyXKRlT.cjs +0 -2
- package/dist/TargetPacketItemChooser-PqyXKRlT.cjs.map +0 -1
- package/dist/index-BRc4sKEF.js.map +0 -1
- package/dist/index-Qy49-kGB.cjs.map +0 -1
- package/dist/purify.es-B336bjAn.cjs +0 -3
- package/dist/purify.es-B336bjAn.cjs.map +0 -1
- package/dist/purify.es-DcWaZU6I.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Graph-GhpiUBKI.js","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 // Decrement store counter now that playback data has been processed\n this.store.updatePlayback({\n playbackLoading: Math.max(\n 0,\n this.store.playback.playbackLoading - 1,\n ),\n })\n this.dataChanged = true\n this.updateGraphData()\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","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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginsTab-D7zpmf8s.js","sources":["../src/plugins/plugin-store/PluginProps.js","../src/plugins/plugin-store/PluginDetailsDialog.vue","../src/plugins/plugin-store/PluginCard.vue","../src/plugins/plugin-store/PluginStoreSettingsDialog.vue","../src/plugins/plugin-store/PluginStore.vue","../src/tools/admin/tabs/plugins/PluginListItem.vue","../src/tools/admin/tabs/plugins/PluginList.vue","../src/tools/admin/tabs/PluginsTab.vue"],"sourcesContent":["/*\n# Copyright 2025, 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\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\n\nconst SETTING_NAME = 'store_url'\nconst DEFAULT_STORE_URL = 'https://store.openc3.com'\n\nexport default {\n props: {\n id: Number,\n name: String,\n title: String,\n // titleSlug: String,\n author: String,\n // authorSlug: String,\n author_extra: Object,\n description: String,\n keywords: Array,\n img_path: String, // Set for local plugins\n image_url: String, // Set for app store plugins\n licenses: Array,\n // rating: Number,\n // downloads: Number,\n homepage: String,\n repository: String,\n gem_url: String,\n minimum_cosmos_version: String,\n checksum: String,\n versions: Array,\n current_version_id: Number,\n },\n data: function () {\n return {\n _api: new OpenC3Api(),\n _storeUrl: '',\n imageContents: null,\n }\n },\n computed: {\n plugin: function () {\n return {\n id: this.id,\n name: this.name,\n title: this.title,\n // titleSlug: this.titleSlug,\n author: this.author,\n // authorSlug: this.authorSlug,\n author_extra: this.author_extra,\n description: this.description,\n keywords: this.keywords,\n img_path: this.img_path,\n image_url: this.image_url,\n licenses: this.licenses,\n // rating: this.rating,\n // downloads: this.downloads,\n homepage: this.homepage,\n repository: this.repository,\n gem_url: this.gem_url,\n minimum_cosmos_version: this.minimum_cosmos_version,\n checksum: this.checksum,\n versions: this.versions,\n current_version_id: this.current_version_id,\n }\n },\n imageContentsWithMimeType: function () {\n if (this.imageContents) {\n const magicNumbers = {\n 'image/bmp': [0x42, 0x4d],\n 'image/jpeg': [0xff, 0xd8, 0xff],\n 'image/png': [0x89, 0x50, 0x4e, 0x47],\n 'image/gif': [0x47, 0x49, 0x46, 0x38],\n 'image/webp': [0x52, 0x49, 0x46, 0x46],\n }\n const fileHead = new TextEncoder()\n .encode(globalThis.atob(this.imageContents.slice(0, 6))) // only atob as much as we need\n .slice(1) // second call to slice on the decoded data because base64 bytes aren't 1:1\n const found = Object.entries(magicNumbers).find(([_, magicNumber]) => {\n return magicNumber.every((byte, i) => byte === fileHead[i])\n })\n if (found) {\n const [mimeType] = found\n return `data:${mimeType};base64,${this.imageContents}`\n }\n }\n return undefined\n },\n _navigableStoreUrl: function () {\n return this._storeUrl.replace('host.docker.internal', 'localhost')\n },\n storeLink: function () {\n if (this.hasStoreListing && this._navigableStoreUrl) {\n return new URL(`/cosmos_plugins/${this.id}`, this._navigableStoreUrl)\n }\n return null\n },\n hasStoreListing: function () {\n return !!this.id\n },\n hasDetails: function () {\n if (this.hasStoreListing) {\n return true\n }\n return !!this.title && !!this.description\n },\n isPluginInstalled: function () {\n return !!this.name // Plugins only have a title, not a name, from the store\n },\n },\n created: async function () {\n try {\n this._storeUrl =\n (await this._api.get_setting(SETTING_NAME)) || DEFAULT_STORE_URL\n } catch {\n this._storeUrl = DEFAULT_STORE_URL\n }\n if (this.img_path) {\n try {\n const params = new URLSearchParams({\n volume: 'OPENC3_GEMS_VOLUME',\n scope: globalThis.openc3Scope,\n })\n const { data } = await Api.get(\n `/openc3-api/storage/download_file/${encodeURIComponent(this.img_path)}?${params}`,\n )\n this.imageContents = data.contents\n } catch {\n // Failed to get image, don't do anything\n }\n }\n },\n}\n","<!--\n# Copyright 2025 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 <v-dialog v-model=\"isDialogOpen\" max-width=\"500\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span v-text=\"versionTitle\" />\n <v-spacer />\n <v-tooltip location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-btn\n :href=\"storeLink\"\n target=\"_blank\"\n icon=\"mdi-open-in-new\"\n size=\"small\"\n variant=\"plain\"\n />\n </div>\n </template>\n <span> View at {{ formattedStoreLink }} </span>\n </v-tooltip>\n <v-btn\n icon=\"mdi-close-box\"\n variant=\"text\"\n density=\"compact\"\n @click=\"closeDialog\"\n />\n </v-toolbar>\n <v-card-subtitle\n class=\"d-flex align-center justify-space-between subtitle-with-version\"\n >\n <div>\n By <strong>{{ author }}</strong>\n <span v-if=\"author_extra?.badge_text\" class=\"ml-1 font-italic\">\n {{ author_extra.badge_text }}\n </span>\n <v-icon\n v-if=\"author_extra?.badge_icon\"\n :icon=\"author_extra.badge_icon\"\n :size=\"18\"\n class=\"ml-1\"\n />\n </div>\n <v-select\n v-if=\"hasVersions\"\n v-model=\"selectedVersionId\"\n :items=\"versionOptions\"\n item-title=\"title\"\n item-value=\"value\"\n label=\"Version\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n class=\"version-select\"\n />\n </v-card-subtitle>\n <!--\n <v-card-subtitle\n class=\"d-flex align-center justify-content-space-between\"\n >\n <div>\n <v-icon icon=\"mdi-cloud-download\" size=\"x-small\" />\n {{ downloads }} downloads\n </div>\n <v-spacer />\n <div class=\"d-flex align-center\">\n <v-rating\n :model-value=\"rating\"\n density=\"compact\"\n size=\"small\"\n readonly\n half-increments\n />\n </div>\n </v-card-subtitle>\n -->\n <v-card-text>\n <div class=\"plugin-image-backdrop\">\n <v-img\n v-if=\"imageContentsWithMimeType\"\n :src=\"imageContentsWithMimeType\"\n />\n <v-img v-else-if=\"versionImageUrl\" :src=\"versionImageUrl\" />\n </div>\n <div class=\"mt-3\" v-text=\"versionDescription\" />\n <div class=\"mt-3 text-caption font-italic\">\n Keywords:\n <template v-if=\"versionKeywords\">\n <v-chip\n v-for=\"keyword in versionKeywords\"\n :key=\"keyword\"\n variant=\"flat\"\n color=\"primary\"\n size=\"x-small\"\n class=\"ml-1\"\n >\n {{ keyword }}\n </v-chip>\n </template>\n <span v-else class=\"font-italic\"> none </span>\n </div>\n <div class=\"mt-3 text-caption font-italic\">\n Licenses:\n <v-chip\n v-for=\"license in versionLicenses\"\n :key=\"license\"\n size=\"x-small\"\n class=\"ml-1\"\n >\n {{ license }}\n </v-chip>\n </div>\n <div class=\"mt-3\">\n <span class=\"text-caption font-italic\">\n Minimum COSMOS version:\n </span>\n {{ versionMinimumCosmosVersion }}\n <v-tooltip\n v-if=\"versionsAreCompatible !== null\"\n :open-delay=\"600\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <span v-bind=\"props\">\n <v-icon\n :icon=\"\n versionsAreCompatible ? 'mdi-check-circle' : 'mdi-alert'\n \"\n size=\"small\"\n />\n </span>\n </template>\n <span v-if=\"versionsAreCompatible\">\n Your version of COSMOS meets the requirements.\n </span>\n <span v-else>\n Your version of COSMOS is out of date. You can still install this\n plugin, but it might not work correctly.\n </span>\n </v-tooltip>\n </div>\n <v-text-field\n v-model=\"versionChecksum\"\n class=\"mt-3\"\n label=\"SHA256\"\n variant=\"solo\"\n density=\"compact\"\n hide-details\n readonly\n >\n <template #append>\n <v-tooltip\n v-model=\"showCopiedTooltip\"\n location=\"top\"\n :open-on-hover=\"false\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-content-copy\"\n variant=\"text\"\n density=\"compact\"\n @click=\"copyChecksum\"\n />\n </template>\n <span>Copied!</span>\n </v-tooltip>\n </template>\n </v-text-field>\n </v-card-text>\n\n <v-card-actions class=\"justify-start px-6\">\n <v-btn\n v-if=\"isPluginInstalled\"\n text=\"Uninstall\"\n append-icon=\"mdi-puzzle-remove\"\n variant=\"outlined\"\n color=\"red\"\n @click=\"uninstall\"\n />\n <v-btn\n v-else\n text=\"Install\"\n append-icon=\"mdi-puzzle-plus\"\n variant=\"elevated\"\n @click=\"install\"\n />\n <v-btn\n v-if=\"versionRepository\"\n text=\"Repository\"\n append-icon=\"mdi-open-in-new\"\n variant=\"outlined\"\n :href=\"versionRepository\"\n target=\"_blank\"\n />\n <v-btn\n v-if=\"versionHomepage\"\n text=\"Homepage\"\n append-icon=\"mdi-open-in-new\"\n variant=\"outlined\"\n :href=\"versionHomepage\"\n target=\"_blank\"\n />\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\nimport * as semver from 'semver'\nimport PluginProps from './PluginProps'\n\nexport default {\n mixins: [PluginProps],\n props: {\n modelValue: Boolean,\n },\n emits: ['triggerInstall', 'triggerUninstall', 'update:modelValue'],\n data() {\n return {\n showDialog: false,\n showCopiedTooltip: false,\n installedCosmosVersion: null,\n selectedVersionId: null,\n }\n },\n computed: {\n isDialogOpen: {\n get: function () {\n return this.modelValue || this.showDialog\n },\n set: function (val) {\n this.showDialog = val\n this.$emit('update:modelValue', val)\n },\n },\n hasVersions: function () {\n return this.versions && this.versions.length > 0\n },\n selectedVersion: function () {\n if (!this.hasVersions) {\n return null\n }\n const versionId = this.selectedVersionId || this.current_version_id\n return this.versions.find((v) => v.id === versionId) || this.versions[0]\n },\n versionOptions: function () {\n if (!this.hasVersions) {\n return []\n }\n return this.versions.map((v) => ({\n title: v.version_number,\n value: v.id,\n }))\n },\n versionTitle: function () {\n return this.selectedVersion?.title || this.title\n },\n versionDescription: function () {\n return this.selectedVersion?.description || this.description\n },\n versionKeywords: function () {\n return this.selectedVersion?.keywords || this.keywords\n },\n versionLicenses: function () {\n return this.selectedVersion?.licenses || this.licenses\n },\n versionHomepage: function () {\n return this.selectedVersion?.homepage || this.homepage\n },\n versionRepository: function () {\n return this.selectedVersion?.repository || this.repository\n },\n versionGemUrl: function () {\n return this.selectedVersion?.gem_url || this.gem_url\n },\n versionMinimumCosmosVersion: function () {\n return (\n this.selectedVersion?.minimum_cosmos_version ||\n this.minimum_cosmos_version\n )\n },\n versionChecksum: function () {\n return this.selectedVersion?.checksum || this.checksum\n },\n versionImageUrl: function () {\n return this.selectedVersion?.image_url || this.image_url\n },\n formattedStoreLink: function () {\n return this._navigableStoreUrl.split('://').at(-1)\n },\n versionsAreCompatible: function () {\n if (!this.installedCosmosVersion || !this.versionMinimumCosmosVersion) {\n return null\n }\n return semver.gte(\n this.installedCosmosVersion,\n this.versionMinimumCosmosVersion,\n )\n },\n },\n created: function () {\n Api.get('/openc3-api/info').then(({ data }) => {\n this.installedCosmosVersion = data.version\n })\n },\n mounted: function () {\n this.selectedVersionId = this.current_version_id\n },\n methods: {\n openDialog: function () {\n this.isDialogOpen = true\n },\n closeDialog: function () {\n this.isDialogOpen = false\n },\n install: function () {\n this.$emit('triggerInstall', {\n id: this.id,\n version_id: this.selectedVersionId || this.current_version_id,\n })\n },\n uninstall: function () {\n this.$emit('triggerUninstall', {\n id: this.id,\n version_id: this.selectedVersionId || this.current_version_id,\n })\n },\n copyChecksum: function () {\n navigator.clipboard.writeText(this.versionChecksum)\n this.showCopiedTooltip = true\n setTimeout(() => {\n this.showCopiedTooltip = false\n }, 1000)\n },\n },\n}\n</script>\n\n<style scoped>\n.plugin-image-backdrop {\n background-color: rgb(156, 163, 175);\n}\n\n.subtitle-with-version {\n width: 100%;\n min-height: 48px;\n}\n\n.version-select {\n max-width: 120px;\n min-width: 120px;\n}\n</style>\n","<!--\n# Copyright 2025 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 <v-card height=\"350\" class=\"d-flex flex-column\" @click=\"openDialog\">\n <v-card-title class=\"d-flex align-center justify-content-space-between\">\n {{ title }}\n </v-card-title>\n <v-card-subtitle class=\"d-flex align-center justify-content-space-between\">\n <div>\n By <strong>{{ author }}</strong>\n <span v-if=\"author_extra?.badge_text\" class=\"ml-1 font-italic\">\n {{ author_extra.badge_text }}\n </span>\n <v-icon\n v-if=\"author_extra?.badge_icon\"\n :icon=\"author_extra.badge_icon\"\n :size=\"18\"\n class=\"ml-1\"\n />\n </div>\n <!--\n <v-spacer />\n <v-rating\n :model-value=\"rating\"\n density=\"compact\"\n size=\"small\"\n readonly\n half-increments\n />\n -->\n </v-card-subtitle>\n <v-card-text>\n <div class=\"plugin-image-backdrop\">\n <v-img v-if=\"image_url\" :src=\"image_url\" max-height=\"160\" />\n </div>\n <div\n :class=\"{\n 'truncate-description': true,\n 'truncate-2': !!image_url,\n 'truncate-10': !image_url,\n }\"\n v-text=\"description\"\n />\n </v-card-text>\n <v-spacer />\n <v-card-actions class=\"flex-wrap\">\n <v-btn\n text=\"Install\"\n append-icon=\"mdi-puzzle-plus\"\n variant=\"elevated\"\n @click.stop=\"install\"\n />\n </v-card-actions>\n </v-card>\n <plugin-details-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n v-bind=\"plugin\"\n @trigger-install=\"install\"\n />\n</template>\n\n<script>\nimport PluginProps from './PluginProps'\nimport PluginDetailsDialog from './PluginDetailsDialog.vue'\n\nexport default {\n components: {\n PluginDetailsDialog,\n },\n mixins: [PluginProps],\n emits: ['triggerInstall'],\n data() {\n return {\n showDialog: false,\n }\n },\n methods: {\n openDialog: function () {\n this.showDialog = true\n },\n install: function (event) {\n this.$emit('triggerInstall', {\n id: this.id,\n version_id: event?.version_id || this.current_version_id,\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.truncate-description {\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n}\n\n.truncate-2 {\n line-clamp: 2;\n -webkit-line-clamp: 2;\n}\n\n.truncate-10 {\n line-clamp: 10;\n -webkit-line-clamp: 10;\n}\n\n.plugin-image-backdrop {\n background-color: rgb(156, 163, 175);\n}\n</style>\n","<!--\n# Copyright 2025 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 <v-dialog v-model=\"showDialog\" width=\"600\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Plugin Store Settings</span>\n <v-spacer />\n </v-toolbar>\n <v-card class=\"pa-3\">\n <v-alert v-model=\"errorLoading\" type=\"error\" closable density=\"compact\">\n Error loading previous configuration due to {{ errorText }}\n </v-alert>\n <v-alert v-model=\"errorSaving\" type=\"error\" closable density=\"compact\">\n Error saving due to {{ errorText }}\n </v-alert>\n <v-card-text>\n <v-text-field\n v-model=\"storeUrl\"\n label=\"Store URL\"\n :rules=\"[rules.required, rules.url]\"\n />\n <v-text-field v-model=\"apiKey\" type=\"password\" label=\"API Key\" />\n </v-card-text>\n <v-card-actions>\n <v-btn\n color=\"success\"\n variant=\"text\"\n text=\"Save\"\n data-test=\"save-store-settings-btn\"\n @click=\"save\"\n />\n </v-card-actions>\n </v-card>\n </v-dialog>\n\n <v-dialog v-model=\"showApiKeyAlert\">\n <v-card class=\"pa-3\">\n <v-card-text class=\"pb-0\">\n You're using COSMOS Enterprise, but you haven't set an OpenC3 Store API\n key yet. You must set this to access Enterprise plugins.\n <br />\n <br />\n Visit the\n <a :href=\"accountSettingsUrl\" target=\"_blank\">\n OpenC3 Store account settings<v-icon\n icon=\"mdi-open-in-new\"\n size=\"x-small\"\n />\n </a>\n to generate an API key. Then, return here and open the Plugin Store\n settings with the\n <v-icon icon=\"mdi-cog\" size=\"small\" /> icon and paste your API key into\n the API key field.\n </v-card-text>\n <v-card-actions>\n <v-checkbox\n v-model=\"suppressApiKeyAlert\"\n class=\"px-3\"\n label=\"Don't show this message again\"\n hide-details\n />\n <v-btn variant=\"elevated\" text=\"OK\" @click=\"closeApiKeyAlert\" />\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\nimport Settings from '@/tools/admin/tabs/settings/settings.js'\n\nconst URL_SETTING_NAME = 'store_url'\nconst API_KEY_SETTING_NAME = 'store_api_key'\nconst SETTING_SCOPE = 'DEFAULT'\nconst DEFAULT_STORE_URL = 'https://store.openc3.com'\n\nexport default {\n mixins: [Settings],\n props: {\n modelValue: Boolean,\n },\n emits: ['update:modelValue', 'update:storeUrl'],\n data() {\n return {\n showDialog: false,\n storeUrl: '',\n apiKey: null,\n isEnterprise: false,\n showApiKeyAlert: false,\n suppressApiKeyAlert: false,\n rules: {\n required: (value) => !!value || 'Required',\n url: (value) => {\n try {\n new URL(value)\n } catch (_) {\n return 'Not a valid URL'\n }\n return true\n },\n },\n }\n },\n computed: {\n accountSettingsUrl: function () {\n const navigableHost = this.storeUrl.replace(\n 'host.docker.internal',\n 'localhost',\n )\n return new URL('account', navigableHost)\n },\n },\n watch: {\n apiKey: function (val) {\n this.checkEnterpriseKey()\n },\n isEnterprise: function (val) {\n this.checkEnterpriseKey()\n },\n suppressApiKeyAlert: function (val) {\n localStorage.setItem('pluginStore.suppressApiKeyAlert', val)\n },\n modelValue: function (val) {\n if (val) {\n this.showDialog = val\n }\n },\n showDialog: function (val) {\n if (!val) {\n this.$emit('update:modelValue', val)\n }\n },\n },\n created: function () {\n Api.get('/openc3-api/info').then(({ data }) => {\n this.isEnterprise = data.enterprise\n })\n this.loadSetting(URL_SETTING_NAME, { scope: SETTING_SCOPE })\n this.loadSetting(API_KEY_SETTING_NAME, { scope: SETTING_SCOPE })\n this.$emit('update:storeUrl', this.storeUrl)\n },\n methods: {\n checkEnterpriseKey: function () {\n if (this.isEnterprise && this.apiKey === '') {\n this.openApiKeyAlert()\n }\n },\n openApiKeyAlert: function () {\n if (localStorage.getItem('pluginStore.suppressApiKeyAlert') !== 'true') {\n this.showApiKeyAlert = true\n }\n },\n closeApiKeyAlert: function () {\n this.showApiKeyAlert = false\n },\n save: function () {\n this.saveSetting(URL_SETTING_NAME, this.storeUrl, {\n scope: SETTING_SCOPE,\n })\n this.saveSetting(API_KEY_SETTING_NAME, this.apiKey, {\n scope: SETTING_SCOPE,\n })\n this.$emit('update:storeUrl', this.storeUrl)\n this.showDialog = false\n },\n parseSetting: function (response, { setting }) {\n switch (setting) {\n case URL_SETTING_NAME:\n this.storeUrl = response || DEFAULT_STORE_URL\n break\n case API_KEY_SETTING_NAME:\n this.apiKey = response || ''\n break\n }\n },\n },\n}\n</script>\n","<!--\n# Copyright 2025 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 <v-sheet class=\"pb-11 pt-8 px-8\" height=\"100%\">\n <div class=\"d-flex justify-content-space-between\">\n <div>\n <div class=\"text-h3 mb-3\">OpenC3 Plugin Store</div>\n <div class=\"text-subtitle-1\">\n Browse plugins made by OpenC3 and the COSMOS community\n </div>\n </div>\n <v-spacer />\n <v-btn icon=\"mdi-cog\" variant=\"text\" @click=\"openSettings\" />\n\n <v-tooltip location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-btn\n :href=\"storeUrl\"\n target=\"_blank\"\n icon=\"mdi-open-in-new\"\n variant=\"text\"\n class=\"mx-2\"\n />\n </div>\n </template>\n <span> Open {{ formattedStoreUrl }} </span>\n </v-tooltip>\n\n <v-btn icon=\"mdi-close\" variant=\"text\" @click=\"close\" />\n </div>\n <div class=\"d-inline-flex align-center w-100\">\n <v-text-field\n v-model=\"search\"\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n single-line\n hide-details\n data-test=\"search-plugin-store\"\n />\n </div>\n <v-spacer />\n <span class=\"\"> Click on a plugin to see more information about it </span>\n <v-alert\n v-if=\"storeError\"\n class=\"mt-6\"\n color=\"error\"\n :title=\"storeError.title\"\n :text=\"storeError.body\"\n />\n <v-container v-else>\n <v-row>\n <v-col v-for=\"plugin in filteredPlugins\" :key=\"plugin.id\" cols=\"4\">\n <plugin-card v-bind=\"plugin\" @trigger-install=\"install\" />\n </v-col>\n </v-row>\n </v-container>\n </v-sheet>\n <plugin-store-settings-dialog\n v-model=\"showSettingsDialog\"\n @update:store-url=\"updatePluginStore\"\n />\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { PluginCard } from '@/plugins/plugin-store'\nimport PluginStoreSettingsDialog from './PluginStoreSettingsDialog.vue' // idk why importing from @/plugins/plugin-store isn't working\n\nconst DEFAULT_STORE_URL = 'https://store.openc3.com'\n\nexport default {\n components: {\n PluginCard,\n PluginStoreSettingsDialog,\n },\n emits: ['close', 'triggerInstall'],\n data() {\n return {\n api: new OpenC3Api(),\n search: '',\n showSettingsDialog: false,\n plugins: [],\n storeError: null,\n storeUrl: DEFAULT_STORE_URL,\n }\n },\n computed: {\n filteredPlugins: function () {\n let filtered = this.plugins\n if (this.search.length) {\n filtered = filtered.filter((plugin) =>\n plugin.title.toLowerCase().includes(this.search.toLowerCase()),\n )\n }\n return filtered\n },\n formattedStoreUrl: function () {\n return this.storeUrl.split('://').at(-1)\n },\n },\n mounted: function () {\n // Don't call updatePluginStore() here. It should be called in the background before the user opens this store\n // view (see PluginsTab.vue `created()`) to keep this feeling fast\n this.fetchPluginStoreData()\n // TODO: do something with plugins that are already installed (no uninstall button: https://github.com/OpenC3/cosmos/pull/2162#discussion_r2249339853 )\n },\n methods: {\n fetchPluginStoreData: function () {\n Api.get('/openc3-api/pluginstore').then(({ data }) => {\n if (data.error) {\n const { title, body } = data\n this.storeError = { title, body }\n this.plugins = []\n } else {\n this.storeError = null\n this.plugins = data\n }\n })\n },\n close: function () {\n this.$emit('close')\n },\n install: function (plugin) {\n this.$emit('triggerInstall', plugin)\n this.close()\n },\n openSettings: function () {\n this.showSettingsDialog = true\n },\n updatePluginStore: function (storeUrl) {\n this.storeUrl = storeUrl\n this.api.update_plugin_store().then((response) => {\n this.fetchPluginStoreData()\n })\n },\n },\n}\n</script>\n\n<style>\n.v-sheet {\n background-color: var(--color-background-base-default);\n}\n</style>\n","<!--\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 <tr :class=\"{ 'cursor-pointer': hasDetails }\" data-test=\"plugin-list-item\">\n <td>\n <v-img\n v-if=\"imageContentsWithMimeType\"\n :src=\"imageContentsWithMimeType\"\n max-height=\"56\"\n min-width=\"56\"\n />\n </td>\n <td>\n <div class=\"text-h6\" @click=\"openDetails\" v-text=\"displayTitle\" />\n <div class=\"text-subtitle-2 v-list-item-subtitle pl-0\">\n <!-- subtitle -->\n <template v-if=\"isModified\"> * </template>\n {{ name }}\n </div>\n <div v-if=\"targets?.length\">\n <!-- sub-subtitle -->\n <span v-for=\"(target, index) in targets\" :key=\"index\" class=\"mr-2\">\n <a\n v-if=\"target.modified\"\n style=\"cursor: pointer\"\n @click.prevent=\"downloadTarget(target.name)\"\n v-text=\"target.name\"\n />\n <span v-else v-text=\"target.name\" />\n </span>\n </div>\n </td>\n\n <td>\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"plugin-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Download\"\n prepend-icon=\"mdi-download\"\n data-test=\"download-plugin\"\n @click=\"downloadPlugin\"\n />\n <v-list-item\n title=\"Edit Details\"\n prepend-icon=\"mdi-pencil\"\n data-test=\"edit-plugin\"\n @click=\"edit\"\n />\n <v-list-item\n title=\"Upgrade\"\n prepend-icon=\"mdi-update\"\n data-test=\"upgrade-plugin\"\n @click=\"upgrade\"\n />\n <v-list-item\n :title=\"`View Microservices (${microserviceCount})`\"\n prepend-icon=\"mdi-tab\"\n data-test=\"view-microservices\"\n @click=\"viewMicroservices\"\n />\n <v-list-item\n title=\"Delete\"\n prepend-icon=\"mdi-delete\"\n data-test=\"delete-plugin\"\n @click=\"deletePrompt\"\n />\n </v-list>\n </v-menu>\n </td>\n </tr>\n <plugin-details-dialog\n v-if=\"showCard\"\n v-model=\"showCard\"\n v-bind=\"plugin\"\n @trigger-uninstall=\"deletePrompt\"\n />\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\nimport { PluginDetailsDialog, PluginProps } from '@/plugins/plugin-store'\n\nexport default {\n components: {\n PluginDetailsDialog,\n },\n mixins: [PluginProps],\n props: {\n targets: {\n type: Array,\n default: () => {\n return []\n },\n },\n isModified: Boolean,\n microservices: {\n type: Object,\n default: () => ({}),\n },\n },\n emits: ['edit', 'delete', 'upgrade'],\n data() {\n return {\n showCard: false,\n }\n },\n computed: {\n displayTitle: function () {\n if (this.title) {\n return this.title\n }\n return this.name\n .replace(/^openc3-cosmos-/, '')\n .replace(/-?\\d+\\.\\d+\\.\\d+(?:\\.pre\\.beta\\d+\\.\\d+)?\\.gem(?:__\\d+)?$/, '') // '-6.6.1.pre.beta0.20250801182255.gem__20250801182444' or '6.6.1.gem'\n },\n getMicroservicesForPlugin: function () {\n const names = []\n for (const [microserviceName, microservice] of Object.entries(\n this.microservices,\n )) {\n if (microservice.plugin === this.name) {\n names.push(microserviceName)\n }\n }\n return names\n },\n microserviceCount: function () {\n return this.getMicroservicesForPlugin.length\n },\n },\n methods: {\n openDetails: function () {\n if (this.hasDetails) {\n this.showCard = true\n }\n },\n downloadPlugin: function () {\n Api.post(`/openc3-api/packages/${this.name}/download`).then(\n (response) => {\n // Decode Base64 string\n const decodedData = window.atob(response.data.contents)\n // Create UNIT8ARRAY of size same as row data length\n const uInt8Array = new Uint8Array(decodedData.length)\n // Insert all character code into uInt8Array\n for (let i = 0; i < decodedData.length; ++i) {\n uInt8Array[i] = decodedData.charCodeAt(i)\n }\n const blob = new Blob([uInt8Array], { type: 'application/zip' })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n },\n )\n },\n downloadTarget: function (name) {\n Api.post(`/openc3-api/targets/${name}/download`).then((response) => {\n // Decode Base64 string\n const decodedData = window.atob(response.data.contents)\n // Create UNIT8ARRAY of size same as row data length\n const uInt8Array = new Uint8Array(decodedData.length)\n // Insert all character code into uInt8Array\n for (let i = 0; i < decodedData.length; ++i) {\n uInt8Array[i] = decodedData.charCodeAt(i)\n }\n const blob = new Blob([uInt8Array], { type: 'application/zip' })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n })\n },\n edit: function () {\n this.$emit('edit')\n },\n upgrade: function () {\n this.$emit('upgrade')\n },\n viewMicroservices: function () {\n const servicesParam = this.getMicroservicesForPlugin.join(',')\n this.$router.push({\n path: '/tools/admin/microservices',\n query: { services: servicesParam },\n })\n },\n deletePrompt: function () {\n this.showCard = false\n this.$emit('delete')\n },\n },\n}\n</script>\n","<!--\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 <v-data-table\n :headers=\"[]\"\n :items=\"shownPlugins\"\n density=\"compact\"\n class=\"list\"\n data-test=\"plugin-list\"\n >\n <template #item=\"{ item: plugin }\">\n <plugin-list-item\n v-bind=\"plugin\"\n :targets=\"pluginTargets(plugin.name)\"\n :is-modified=\"isModified(plugin.name)\"\n :microservices=\"microservices\"\n @edit=\"() => editPlugin(plugin.name)\"\n @upgrade=\"() => upgradePlugin(plugin.name)\"\n @delete=\"() => deletePrompt(plugin.name)\"\n />\n </template>\n </v-data-table>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\nimport PluginListItem from './PluginListItem.vue'\n\nexport default {\n components: {\n PluginListItem,\n },\n props: {\n plugins: {\n type: Array,\n required: true,\n },\n targets: {\n type: Object,\n required: true,\n },\n showDefaultTools: {\n type: Boolean,\n default: false,\n },\n defaultPlugins: {\n type: Array,\n required: true,\n },\n },\n emits: ['edit', 'delete', 'upgrade'],\n data() {\n return {\n showPluginDetails: false,\n detailPlugin: null,\n microservices: {},\n }\n },\n computed: {\n shownPlugins() {\n const pluginsToShow = []\n const defaultPluginsToShow = []\n this.plugins.forEach((plugin) => {\n const pluginNameFirst = plugin.name.split('__')[0]\n const pluginNameSplit = pluginNameFirst.split('-').slice(0, -1)\n const pluginNameShort = pluginNameSplit.join('-')\n if (this.defaultPlugins.includes(pluginNameShort)) {\n defaultPluginsToShow.push(plugin)\n } else {\n pluginsToShow.push(plugin)\n }\n })\n pluginsToShow.sort((a, b) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0,\n )\n if (this.showDefaultTools) {\n defaultPluginsToShow.sort((a, b) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0,\n )\n return pluginsToShow.concat(defaultPluginsToShow)\n }\n return pluginsToShow\n },\n },\n mounted() {\n this.fetchMicroservices()\n },\n methods: {\n showDetails: function (plugin) {\n this.detailPlugin = plugin\n this.showPluginDetails = true\n },\n pluginTargets: function (plugin) {\n let result = []\n for (const target in this.targets) {\n if (this.targets[target]['plugin'] === plugin) {\n result.push(this.targets[target])\n }\n }\n return result\n },\n isModified: function (plugin) {\n return Object.entries(this.targets).some(([targetName, target]) => {\n return target['plugin'] === plugin && target['modified'] === true\n })\n },\n editPlugin: function (plugin) {\n this.$emit('edit', plugin)\n },\n upgradePlugin(plugin) {\n this.$emit('upgrade', plugin)\n },\n deletePrompt: function (plugin) {\n this.$emit('delete', plugin)\n },\n fetchMicroservices: function () {\n Api.get('/openc3-api/microservices/all').then((response) => {\n this.microservices = response.data\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</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 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-row no-gutters align=\"center\" class=\"px-2\">\n <v-col class=\"pa-2 mt-2\">\n <v-btn append-icon=\"mdi-store\" @click=\"openStore\">\n Browse Plugins\n </v-btn>\n <v-btn append-icon=\"mdi-paperclip\" class=\"mx-2\" @click=\"selectFile\">\n Install From File\n </v-btn>\n <input\n ref=\"fileInput\"\n accept=\".gem\"\n style=\"display: none\"\n type=\"file\"\n @change=\"fileChange\"\n />\n <br />\n <p class=\"mt-2\">\n Note: Use <v-icon> mdi-dots-horizontal </v-icon> in the Installed\n Plugins list to upgrade existing plugins\n </p>\n </v-col>\n <v-col class=\"ml-4 mr-2\" cols=\"4\">\n <rux-progress :value=\"progress\" />\n </v-col>\n </v-row>\n <v-row no-gutters class=\"px-2\">\n <v-col align=\"right\" class=\"mr-2\">\n <div>* indicates a modified plugin</div>\n <div>Click target link to download modifications</div>\n </v-col>\n </v-row>\n <v-divider />\n <!-- TODO This alert shows both success and failure. Make consistent with rest of OpenC3. -->\n <v-alert\n v-model=\"showAlert\"\n closable\n :type=\"alertType\"\n :text=\"alert\"\n data-test=\"plugin-alert\"\n />\n <v-list\n v-if=\"Object.keys(processes).length > 0\"\n class=\"list\"\n data-test=\"process-list\"\n >\n <v-row no-gutters class=\"px-4\">\n <v-col class=\"text-h5\"> Process List </v-col>\n <v-col align=\"right\">\n <!-- See openc3/lib/openc3/utilities/process_manager.rb CLEANUP_CYCLE_SECONDS -->\n <div>Showing last 10 min of activity</div>\n </v-col>\n </v-row>\n <div v-for=\"process in processes\" :key=\"process.name\">\n <v-list-item>\n <v-list-item-title>\n <span\n :class=\"process.state.toLowerCase()\"\n v-text=\"\n `Processing ${process.process_type}: ${process.detail} - ${process.state}`\n \"\n />\n </v-list-item-title>\n <v-list-item-subtitle>\n <span v-text=\"' Updated At: ' + formatDate(process.updated_at)\" />\n </v-list-item-subtitle>\n\n <template #append>\n <v-progress-circular\n v-if=\"process.state === 'Running'\"\n indeterminate\n color=\"primary\"\n />\n <v-tooltip v-else :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n icon=\"mdi-eye\"\n variant=\"text\"\n aria-label=\"Show Output\"\n data-test=\"show-output\"\n @click=\"showOutput(process)\"\n />\n </template>\n <span> Show Output </span>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <v-row no-gutters class=\"px-4\">\n <v-col class=\"text-h5\"> Installed Plugins </v-col>\n <v-col class=\"v-col-auto\">\n <v-switch\n v-model=\"showDefaultTools\"\n label=\"Show Default Tools\"\n density=\"compact\"\n hide-details\n data-test=\"show-default-tools\"\n />\n </v-col>\n </v-row>\n <plugin-list\n :plugins=\"plugins\"\n :targets=\"targets\"\n :show-default-tools=\"showDefaultTools\"\n :default-plugins=\"defaultPlugins\"\n @edit=\"editPlugin\"\n @upgrade=\"upgradePlugin\"\n @delete=\"deletePrompt\"\n />\n <plugin-dialog\n v-if=\"showPluginDialog\"\n v-model=\"showPluginDialog\"\n :plugin-name=\"pluginName\"\n :variables=\"variables\"\n :plugin-txt=\"pluginTxt\"\n :existing-plugin-txt=\"existingPluginTxt\"\n :store-plugin-id=\"storePluginId\"\n :store-version-id=\"storeVersionId\"\n :min-cosmos-version=\"minCosmosVersion\"\n @callback=\"pluginCallback\"\n />\n <modified-plugin-dialog\n v-if=\"showModifiedPluginDialog\"\n v-model=\"showModifiedPluginDialog\"\n :plugin-name=\"currentPlugin\"\n :targets=\"pluginTargets(currentPlugin)\"\n :plugin-delete=\"pluginDelete\"\n @submit=\"modifiedSubmit\"\n />\n <!-- <download-dialog v-model=\"showDownloadDialog\" /> -->\n <simple-text-dialog\n v-model=\"showProcessOutput\"\n title=\"Process Output\"\n :text=\"processOutput\"\n />\n <v-bottom-sheet v-model=\"showPluginStore\" fullscreen>\n <plugin-store\n @close=\"() => (showPluginStore = false)\"\n @trigger-install=\"(storeData) => upload(null, storeData)\"\n />\n </v-bottom-sheet>\n </div>\n</template>\n\n<script>\nimport { toDate, format } from 'date-fns'\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { SimpleTextDialog } from '@/components'\nimport { ModifiedPluginDialog, PluginDialog } from '@/tools/admin'\nimport { PluginList } from '@/tools/admin/tabs/plugins'\nimport { PluginStore } from '@/plugins/plugin-store'\n\nexport default {\n components: {\n PluginDialog,\n PluginList,\n PluginStore,\n ModifiedPluginDialog,\n SimpleTextDialog,\n },\n data() {\n return {\n // Control state\n pluginName: null,\n variables: {},\n storePluginId: null,\n storeVersionId: null,\n minCosmosVersion: null,\n pluginTxt: '',\n file: null,\n currentPlugin: null,\n pluginHashTmp: null,\n existingPluginTxt: null,\n progress: 0,\n pluginDelete: false,\n\n api: new OpenC3Api(),\n plugins: [],\n targets: {},\n processes: {},\n alert: '',\n alertType: 'success',\n showAlert: false,\n showDownloadDialog: false,\n showProcessOutput: false,\n processOutput: '',\n showPluginStore: false,\n showPluginDialog: false,\n showModifiedPluginDialog: false,\n showDefaultTools: false,\n // When updating update local_mode.rb, local_mode.py, plugins.p.spec.ts\n defaultPlugins: [\n 'openc3-cosmos-tool-admin',\n 'openc3-cosmos-tool-bucketexplorer',\n 'openc3-cosmos-tool-cmdsender',\n 'openc3-cosmos-tool-cmdqueue', // Enterprise only\n 'openc3-cosmos-tool-cmdhistory', // Enterprise only\n 'openc3-cosmos-tool-cmdtlmserver',\n 'openc3-cosmos-tool-dataextractor',\n 'openc3-cosmos-tool-dataviewer',\n 'openc3-cosmos-tool-docs',\n 'openc3-cosmos-tool-handbooks',\n 'openc3-cosmos-tool-iframe',\n 'openc3-cosmos-tool-limitsmonitor',\n 'openc3-cosmos-tool-packetviewer',\n 'openc3-cosmos-tool-scriptrunner',\n 'openc3-cosmos-tool-tablemanager',\n 'openc3-cosmos-tool-tlmgrapher',\n 'openc3-cosmos-tool-tlmviewer',\n 'openc3-cosmos-enterprise-tool-admin', // Enterprise only\n 'openc3-cosmos-tool-autonomic', // Enterprise only\n 'openc3-cosmos-tool-calendar', // Enterprise only\n 'openc3-cosmos-tool-grafana', // Enterprise only\n 'openc3-cosmos-tool-logexplorer', // Enterprise only\n 'openc3-cosmos-tool-notebooks', // Enterprise only\n 'openc3-cosmos-tool-systemhealth', // Enterprise only\n 'openc3-enterprise-tool-base', // Enterprise only\n 'openc3-tool-base',\n ],\n }\n },\n watch: {\n // watcher to reset the file input when the dialog is closed\n showPluginDialog: function (newValue, oldValue) {\n if (newValue === false) {\n this.file = null\n this.$refs.fileInput.value = null\n }\n },\n },\n created() {\n this.api.update_plugin_store()\n },\n mounted() {\n this.update()\n this.updateProcesses()\n\n // Handle going \"back\" from the plugin store\n // (idk why v-bottom-sheet's close-on-back prop isn't working)\n const that = this\n window.onpopstate = function () {\n if (that.showPluginStore) {\n that.showPluginStore = false\n history.go(1)\n }\n }\n },\n methods: {\n resetControlState: function () {\n this.pluginName = null\n this.variables = {}\n this.storePluginId = null\n this.storeVersionId = null\n this.minCosmosVersion = null\n this.pluginTxt = ''\n this.file = null\n this.currentPlugin = null\n this.pluginHashTmp = null\n this.existingPluginTxt = null\n this.progress = 0\n this.pluginDelete = false\n },\n pluginTargets: function (plugin) {\n let result = []\n for (const target in this.targets) {\n if (this.targets[target]['plugin'] === plugin) {\n result.push(this.targets[target])\n }\n }\n return result\n },\n isModified: function (plugin) {\n return Object.entries(this.targets).some(([targetName, target]) => {\n return target['plugin'] === plugin && target['modified'] === true\n })\n },\n showOutput: function (process) {\n this.processOutput = process.output\n this.showProcessOutput = true\n },\n update: function () {\n Api.get('/openc3-api/plugins/all').then((response) => {\n this.plugins = Object.entries(response.data).map(\n ([_, plugin]) => plugin,\n )\n })\n Api.get('/openc3-api/targets_modified').then((response) => {\n this.targets = response.data\n })\n },\n updateProcesses: function () {\n Api.get('openc3-api/process_status/plugin_?substr=true').then(\n (response) => {\n this.processes = response.data\n if (Object.keys(this.processes).length > 0) {\n setTimeout(() => {\n this.updateProcesses()\n this.update()\n }, 5000)\n }\n },\n )\n },\n formatDate(nanoSecs) {\n return format(\n toDate(Number.parseInt(nanoSecs) / 1000000),\n 'yyyy-MM-dd HH:mm:ss.SSS',\n )\n },\n upload: function (existing = null, storeData = null) {\n const method = existing ? 'put' : 'post'\n const path = existing\n ? `/openc3-api/plugins/${existing}`\n : '/openc3-api/plugins'\n const formData = new FormData()\n if (storeData === null) {\n formData.append('plugin', this.file, this.file.name)\n } else {\n formData.append('store_plugin_id', storeData.id)\n formData.append('store_version_id', storeData.version_id)\n }\n let self = this\n const promise = Api[method](path, {\n data: formData,\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: function (progressEvent) {\n let percentCompleted = Math.round(\n (progressEvent.loaded * 100) / progressEvent.total,\n )\n self.progress = percentCompleted\n },\n })\n promise\n .then((response) => {\n this.progress = 100\n this.alert = 'Uploaded file'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n let existingPluginTxt = null\n if (response.data.existing_plugin_txt_lines !== undefined) {\n existingPluginTxt =\n response.data.existing_plugin_txt_lines.join('\\n')\n }\n let pluginTxt = response.data.plugin_txt_lines.join('\\n')\n this.pluginName = response.data.name\n this.variables = response.data.variables\n this.storePluginId = response.data.store_plugin_id\n this.storeVersionId = response.data.store_version_id\n this.minCosmosVersion = response.data.minimum_cosmos_version\n this.pluginTxt = pluginTxt\n this.existingPluginTxt = existingPluginTxt\n this.showPluginDialog = true\n this.file = undefined\n })\n .catch((error) => {\n this.currentPlugin = null\n this.file = undefined\n })\n },\n pluginCallback: function (pluginHash) {\n this.showPluginDialog = false\n if (this.currentPlugin !== null) {\n pluginHash['name'] = this.currentPlugin\n }\n this.pluginHashTmp = pluginHash\n if (this.isModified(this.currentPlugin)) {\n this.pluginDelete = false\n this.showModifiedPluginDialog = true\n } else {\n this.pluginInstall()\n }\n },\n modifiedSubmit: async function (deleteModified) {\n if (deleteModified === true) {\n for (let target of this.pluginTargets(this.currentPlugin)) {\n if (target.modified == true) {\n await Api.post(`/openc3-api/targets/${target.name}/delete_modified`)\n }\n }\n }\n if (this.pluginDelete) {\n this.deletePlugin(this.currentPlugin)\n } else {\n this.pluginInstall()\n }\n },\n pluginInstall: function () {\n Api.post(`/openc3-api/plugins/install/${this.pluginName}`, {\n data: {\n plugin_hash: JSON.stringify(this.pluginHashTmp),\n },\n }).then((response) => {\n this.alert = `Started installing plugin ${this.pluginName} ...`\n this.alertType = 'success'\n this.showAlert = true\n this.currentPlugin = null\n this.file = undefined\n this.variables = {}\n this.pluginTxt = ''\n this.existingPluginTxt = null\n this.storePluginId = null\n this.storeVersionId = null\n setTimeout(() => {\n this.showAlert = false\n this.updateProcesses()\n }, 5000)\n this.update()\n })\n },\n editPlugin: function (plugin) {\n this.resetControlState()\n Api.get(`/openc3-api/plugins/${plugin}`).then((response) => {\n let existingPluginTxt = null\n if (response.data.existing_plugin_txt_lines !== undefined) {\n existingPluginTxt = response.data.existing_plugin_txt_lines.join('\\n')\n }\n this.pluginName = response.data.name\n this.variables = response.data.variables\n this.pluginTxt = response.data.plugin_txt_lines.join('\\n')\n this.existingPluginTxt = existingPluginTxt\n this.showPluginDialog = true\n })\n },\n deletePrompt: function (plugin) {\n this.resetControlState()\n this.$dialog\n .confirm(`Are you sure you want to remove: ${plugin}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n if (this.isModified(plugin)) {\n this.currentPlugin = plugin\n this.pluginDelete = true\n this.showModifiedPluginDialog = true\n } else {\n this.deletePlugin(plugin)\n }\n })\n },\n deletePlugin: function (plugin) {\n this.alert = `Removing plugin ${plugin} ...`\n this.alertType = 'success'\n this.showAlert = true\n Api.delete(`/openc3-api/plugins/${plugin}`).then((response) => {\n setTimeout(() => {\n this.showAlert = false\n this.updateProcesses()\n }, 5000)\n })\n this.update()\n },\n upgradePlugin(plugin) {\n this.resetControlState()\n this.currentPlugin = plugin\n this.$refs.fileInput.click()\n },\n selectFile() {\n this.resetControlState()\n this.$refs.fileInput.click()\n },\n fileChange(event) {\n const files = event.target.files\n if (files.length > 0) {\n this.file = files[0]\n if (this.currentPlugin !== null) {\n if (\n this.file.name.split('.gem')[0] ==\n this.currentPlugin.split('.gem')[0]\n ) {\n this.$dialog\n .confirm(\n `The new gem ${this.file.name} appears to be identical to the existing ${this.currentPlugin}. Install?`,\n {\n okText: 'Ok',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.upload(this.currentPlugin)\n })\n .catch((error) => {\n // do nothing\n })\n } else {\n // Split up the gem name to determine if this is an upgrade\n // or mistakenly trying to install a different gem\n // Gems are named like openc3-cosmos-demo-5.3.2.gem or\n // openc3-cosmos-pw-test-1.0.0.20230213074527.gem\n // So split on - and match everything until the first .\n let parts = this.file.name.split('-')\n let i = parts.findIndex((x) => x.includes('.'))\n let newName = parts.slice(0, i).join('-')\n parts = this.currentPlugin.split('-')\n i = parts.findIndex((x) => x.includes('.'))\n let existingName = parts.slice(0, i).join('-')\n if (newName !== existingName) {\n this.$dialog\n .confirm(\n `The new gem base name ${newName} doesn't match the existing ${existingName}. Install?`,\n {\n okText: 'Ok',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.upload(this.currentPlugin)\n })\n } else {\n this.upload(this.currentPlugin)\n }\n }\n } else {\n this.upload()\n }\n } else {\n // Reset the input element\n this.$refs.fileInput.value = null\n }\n },\n openStore() {\n this.resetControlState()\n this.showPluginStore = true\n },\n },\n}\n</script>\n\n<style scoped>\n.crashed {\n color: red;\n}\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n</style>\n"],"names":["SETTING_NAME","DEFAULT_STORE_URL","PluginProps","OpenC3Api","magicNumbers","fileHead","found","_","magicNumber","byte","i","mimeType","params","data","Api","_sfc_main","val","versionId","v","semver.gte","_hoisted_3","_hoisted_5","_hoisted_7","_hoisted_8","_createBlock","_component_v_dialog","$options","$event","_createVNode","_component_v_card","_component_v_toolbar","_component_v_spacer","_createElementVNode","_toDisplayString","_component_v_tooltip","_withCtx","props","_component_v_btn","_ctx","_component_v_card_subtitle","_openBlock","_createElementBlock","_hoisted_2","_component_v_icon","_component_v_select","$data","_component_v_card_text","_component_v_img","_Fragment","_renderList","keyword","_component_v_chip","_hoisted_6","license","_cache","_component_v_text_field","_mergeProps","_component_v_card_actions","PluginDetailsDialog","event","_component_v_card_title","_hoisted_1","_normalizeClass","_component_plugin_details_dialog","URL_SETTING_NAME","API_KEY_SETTING_NAME","SETTING_SCOPE","Settings","value","navigableHost","response","setting","_component_v_alert","_createTextVNode","_component_v_checkbox","PluginCard","PluginStoreSettingsDialog","filtered","plugin","title","body","storeUrl","_component_v_sheet","_component_v_container","_component_v_row","_component_v_col","_component_plugin_card","_component_plugin_store_settings_dialog","names","microserviceName","microservice","decodedData","uInt8Array","blob","link","name","servicesParam","args","$props","target","index","_withModifiers","_component_v_menu","_component_v_list","_component_v_list_item","PluginListItem","pluginsToShow","defaultPluginsToShow","pluginNameShort","a","b","result","targetName","_component_v_data_table","_component_plugin_list_item","PluginDialog","PluginList","PluginStore","ModifiedPluginDialog","SimpleTextDialog","newValue","oldValue","that","process","nanoSecs","format","toDate","existing","storeData","method","path","formData","self","progressEvent","percentCompleted","existingPluginTxt","pluginTxt","error","pluginHash","deleteModified","dialog","files","parts","x","newName","existingName","_component_rux_progress","_component_v_divider","_component_v_progress_circular","_component_v_list_item_title","_component_v_list_item_subtitle","_component_v_switch","_component_plugin_list","_component_plugin_dialog","_component_modified_plugin_dialog","_component_simple_text_dialog","_component_v_bottom_sheet","_component_plugin_store"],"mappings":"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"}
|