@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scriptrunner.js","sources":["../../src/tools/scriptrunner/autocomplete/mnemonicChecker.js","../../src/tools/scriptrunner/RunningScripts.vue","../../src/tools/scriptrunner/ScriptLogMessages.vue","../../../../node_modules/.pnpm/splitpanes@4.0.4_vue@3.5.29/node_modules/splitpanes/dist/splitpanes.es.js","../../src/tools/scriptrunner/Dialogs/AskDialog.vue","../../src/tools/scriptrunner/Dialogs/FileDialog.vue","../../src/tools/scriptrunner/Dialogs/InformationDialog.vue","../../src/tools/scriptrunner/Dialogs/OverridesDialog.vue","../../src/tools/scriptrunner/Dialogs/PromptDialog.vue","../../src/tools/scriptrunner/Dialogs/ResultsDialog.vue","../../src/tools/scriptrunner/Dialogs/ScriptEnvironmentDialog.vue","../../src/tools/scriptrunner/SuiteRunner.vue","../../src/tools/scriptrunner/annotations/regexAnnotator.js","../../src/tools/scriptrunner/annotations/sleepAnnotator.js","../../src/tools/scriptrunner/ScriptRunner.vue"],"sourcesContent":["/*\n# Copyright 2021 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\nimport { OpenC3Api } from '@openc3/js-common/services'\nimport { getKeywords, groupBy } from './utilities'\n\nconst toKeywordRegex = (word) => {\n // create regex to find the opening of a ruby method call\n const prefix = '(^|[{\\\\(\\\\s])' // Allowable characters before the method name: start of line or { or ( or a space\n const call = '((\\\\s.+)|(\\\\(.+\\\\)))' // A method call and its arguments\n return new RegExp(`${prefix}${word}${call}`)\n}\nconst interpolatedStringRegex = /\\{/\nconst alternateSyntaxRegex = /['\"],\\s?['\"]/\n\nexport default class MnemonicChecker {\n constructor() {\n this.api = new OpenC3Api()\n\n this.targets = {}\n this.api.get_target_names().then((response) => {\n response.forEach((target) => {\n this.targets[target] = {\n cmd: null,\n tlm: null,\n }\n })\n })\n\n this.cmdKeywordExpressions = []\n getKeywords('cmd').then((response) => {\n this.cmdKeywordExpressions = response.data.map(toKeywordRegex)\n })\n\n this.tlmKeywordExpressions = []\n getKeywords('tlm').then((response) => {\n this.tlmKeywordExpressions = response.data.map(toKeywordRegex)\n })\n }\n\n async checkText(text) {\n const { linesToCheck, linesToSkip } = text.split('\\n').reduce(\n (result, line, index) => {\n line = line.trim()\n if (line.match(/^#/)) {\n return result\n }\n // Strip trailing comments to avoid matching keywords in comments\n // This handles both Ruby (# comment) and Python (# comment) style\n // Be careful not to strip # inside strings\n const commentMatch = line.match(\n /^([^#'\"]*(?:(?:\"[^\"]*\"|'[^']*')[^#'\"]*)*)(#.*)$/,\n )\n const lineWithoutComment = commentMatch ? commentMatch[1].trim() : line\n\n const cmdMatch = this.cmdKeywordExpressions.reduce((found, regex) => {\n return found || lineWithoutComment.match(regex)\n }, null)\n const tlmMatch = this.tlmKeywordExpressions.reduce((found, regex) => {\n return found || lineWithoutComment.match(regex)\n }, null)\n if (!cmdMatch && !tlmMatch) {\n return result\n }\n\n const matchResult = cmdMatch || tlmMatch\n // Use capture group 2 which contains the full call arguments\n // Group 2 is always defined when matched: ((\\s.+)|(\\(.+\\)))\n // Groups 3 and 4 are alternates and only one will be defined\n const matchStr = matchResult[2]\n if (!matchStr) {\n return result\n }\n\n const parenOrSpaceMatch = matchStr.match(/[\\(\\s)]/)\n if (!parenOrSpaceMatch) {\n return result\n }\n\n let mnemonicMatch = matchStr\n .substring(parenOrSpaceMatch.index + 1) // Trim off leading `(` or space\n .replace(/\\)+.*$/, '') // and the closing )s\n\n if (mnemonicMatch.match(interpolatedStringRegex)) {\n result.linesToSkip.push(index + 1)\n return result\n }\n\n const usingAlternateSyntax = !!mnemonicMatch.match(alternateSyntaxRegex)\n\n // For space-based syntax (command as a single string like \"TARGET PACKET with PARAM value\"),\n // extract only the content within the first quoted string to avoid including\n // Ruby/Python keyword arguments like queue: or queue=\n if (!usingAlternateSyntax) {\n const firstQuote = mnemonicMatch.match(/^['\"]/)\n if (firstQuote) {\n const quoteChar = firstQuote[0]\n const closingQuoteIndex = mnemonicMatch.indexOf(quoteChar, 1)\n if (closingQuoteIndex > 0) {\n mnemonicMatch = mnemonicMatch.substring(1, closingQuoteIndex)\n }\n }\n }\n\n const mnemonicParts = mnemonicMatch.split(\n usingAlternateSyntax ? ',' : ' ',\n )\n if (mnemonicParts.length < 2) {\n return result // TODO: is this right? Maybe put an error on lineObj?\n }\n\n const mnemonic = {\n target: mnemonicParts[0],\n packet: mnemonicParts[1],\n }\n if (tlmMatch) {\n mnemonic.item = mnemonicParts[2]\n } else {\n const mnemonicParams = mnemonicParts.slice(2)\n if (usingAlternateSyntax) {\n mnemonic.params = mnemonicParams.map(\n (param) => param.split('=>')[0],\n )\n } else {\n mnemonic.params = mnemonicParams.filter((token, index) => index % 2)\n }\n }\n\n // Clean up the quotes and whitespace from the parts of the mnemonic\n for (const property in mnemonic) {\n if (typeof mnemonic[property] === 'string') {\n mnemonic[property] = mnemonic[property].replace(/['\"]/g, '').trim()\n } else {\n mnemonic[property] = mnemonic[property].map((item) =>\n item.replace(/['\"]/g, '').trim(),\n )\n }\n }\n\n result.linesToCheck.push({\n line,\n mnemonic,\n lineNumber: index + 1,\n })\n return result\n },\n { linesToCheck: [], linesToSkip: [] },\n )\n\n const problems = await this._checkLines(linesToCheck)\n return {\n skipped: linesToSkip.sort(),\n problems: problems.sort((a, b) => a.lineNumber - b.lineNumber),\n }\n }\n\n async _checkLines(linesToCheck) {\n const problemLines = []\n const targetGroups = groupBy(\n linesToCheck,\n (lineObj) => lineObj.mnemonic.target,\n )\n for (const target in targetGroups) {\n if (!this.targets[target]) {\n for (const lineObj of targetGroups[target]) {\n problemLines.push({\n ...lineObj,\n error: `Target \"${target}\" does not exist.`,\n })\n }\n continue\n }\n const packetGroups = groupBy(\n targetGroups[target],\n (lineObj) => lineObj.mnemonic.packet,\n )\n for (const packet in packetGroups) {\n for (const lineObj of packetGroups[packet]) {\n const cmdOrTlm = lineObj.mnemonic.item ? 'tlm' : 'cmd'\n if (!this.targets[target][cmdOrTlm]) {\n const method = lineObj.mnemonic.item\n ? 'get_all_tlm'\n : 'get_all_cmds'\n const response = await this.api[method](target)\n this.targets[target][cmdOrTlm] = response.reduce(\n (result, packetInfo) => {\n result[packetInfo.packet_name] = packetInfo.items.map(\n (item) => item.name,\n )\n return result\n },\n {},\n )\n }\n\n const items = this.targets[target][cmdOrTlm][packet]\n if (!items) {\n problemLines.push({\n ...lineObj,\n error: `${\n cmdOrTlm === 'tlm' ? 'Packet' : 'Command'\n } \"${target} ${packet}\" does not exist.`,\n })\n continue\n }\n if (lineObj.mnemonic.item) {\n if (!items.some((item) => item === lineObj.mnemonic.item)) {\n problemLines.push({\n ...lineObj,\n error: `Item \"${target} ${packet} ${lineObj.mnemonic.item}\" does not exist.`,\n })\n continue\n }\n } else {\n for (const param of lineObj.mnemonic.params) {\n if (!items.some((item) => item === param)) {\n problemLines.push({\n ...lineObj,\n error: `Command \"${target} ${packet}\" param \"${param}\" does not exist.`,\n })\n continue\n }\n }\n }\n }\n }\n }\n return problemLines\n }\n}\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 2025, 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-card flat class=\"tab-card\">\n <v-tabs\n v-model=\"activeTab\"\n bg-color=\"var(--color-background-base-default)\"\n >\n <v-tab value=\"running\">Running Scripts</v-tab>\n <v-tab value=\"completed\">Completed Scripts</v-tab>\n </v-tabs>\n <v-window v-model=\"activeTab\">\n <!-- Running Scripts Tab -->\n <v-window-item value=\"running\">\n <v-card-title>\n <v-row dense>\n <v-spacer />\n <v-btn class=\"mr-3\" color=\"primary\" @click=\"getRunningScripts\"\n >Refresh</v-btn\n >\n <v-text-field\n v-model=\"runningSearch\"\n class=\"pt-0 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=\"running-search\"\n style=\"max-width: 300px\"\n />\n </v-row>\n </v-card-title>\n\n <v-data-table-server\n :headers=\"runningHeaders\"\n :items=\"runningScripts\"\n :items-length=\"runningTotal\"\n :loading=\"runningLoading\"\n :search=\"runningSearch\"\n density=\"compact\"\n data-test=\"running-scripts\"\n :items-per-page=\"runningItemsPerPage\"\n :page=\"runningPage\"\n :items-per-page-options=\"[10, 25, 50]\"\n class=\"script-table\"\n @update:page=\"updateRunningPage\"\n @update:items-per-page=\"updateRunningItemsPerPage\"\n >\n <template #item.name=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n @click=\"showScript(item)\"\n >{{ item.name }}</v-btn\n >\n </template>\n <template #item.connect=\"{ item }\">\n <v-btn color=\"primary\" @click=\"connectScript(item)\">\n <span>Connect</span>\n <v-icon v-show=\"connectInNewTab\" end> mdi-open-in-new </v-icon>\n </v-btn>\n </template>\n <template #item.stop=\"{ item }\">\n <v-btn color=\"primary\" @click=\"deleteScript(item)\">\n <span>Stop</span>\n <v-icon end> mdi-close-circle-outline </v-icon>\n </v-btn>\n </template>\n </v-data-table-server>\n </v-window-item>\n\n <!-- Completed Scripts Tab -->\n <v-window-item value=\"completed\">\n <v-card-title>\n <v-row dense>\n <v-spacer />\n <v-btn class=\"mr-3\" color=\"primary\" @click=\"getCompletedScripts\"\n >Refresh</v-btn\n >\n <v-text-field\n v-model=\"completedSearch\"\n class=\"pt-0 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 style=\"max-width: 300px\"\n />\n </v-row>\n </v-card-title>\n\n <v-data-table-server\n :headers=\"completedHeaders\"\n :items=\"completedScripts\"\n :items-length=\"completedTotal\"\n :loading=\"completedLoading\"\n :search=\"completedSearch\"\n density=\"compact\"\n data-test=\"completed-scripts\"\n :items-per-page=\"completedItemsPerPage\"\n :page=\"completedPage\"\n :items-per-page-options=\"[10, 25, 50]\"\n class=\"script-table\"\n @update:page=\"updateCompletedPage\"\n @update:items-per-page=\"updateCompletedItemsPerPage\"\n >\n <template #item.name=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n @click=\"showScript(item)\"\n >{{ item.name }}</v-btn\n >\n </template>\n <template #item.log=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-eye\"\n @click=\"viewScriptLog(item, 'log')\"\n />\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-file-download-outline\"\n :disabled=\"downloadScript\"\n :loading=\"downloadScript && downloadScript.name === item.name\"\n @click=\"downloadScriptLog(item, 'log')\"\n />\n </template>\n <template #item.report=\"{ item }\">\n <div v-if=\"!item.report\">\n <span>N/A</span>\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-eye\"\n @click=\"viewScriptLog(item, 'report')\"\n />\n <v-menu>\n <template #activator=\"{ props }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-file-download-outline\"\n :disabled=\"downloadScript\"\n :loading=\"\n downloadScript && downloadScript.name === item.name\n \"\n v-bind=\"props\"\n />\n </template>\n <v-list>\n <v-list-item\n @click=\"downloadScriptLog(item, 'report', 'text')\"\n >\n <v-list-item-title>Download as Text</v-list-item-title>\n </v-list-item>\n <v-list-item\n @click=\"downloadScriptLog(item, 'report', 'ctrf')\"\n >\n <v-list-item-title>Download as CTRF</v-list-item-title>\n </v-list-item>\n </v-list>\n </v-menu>\n </div>\n </template>\n </v-data-table-server>\n </v-window-item>\n </v-window>\n </v-card>\n\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"dialogContent\"\n type=\"Script\"\n :name=\"dialogName\"\n :filename=\"dialogFilename\"\n @submit=\"showDialog = false\"\n />\n </div>\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { OutputDialog } from '@/components'\nimport { TimeFilters } from '@/util'\n\nexport default {\n components: { OutputDialog },\n mixins: [TimeFilters],\n props: {\n tabId: {\n type: Number,\n default: null,\n },\n curTab: {\n type: Number,\n default: null,\n },\n connectInNewTab: Boolean,\n },\n emits: ['disconnect', 'close'],\n data() {\n return {\n api: null,\n timeZone: 'local',\n activeTab: 'completed',\n downloadScript: null,\n refreshTimer: null,\n // Running scripts pagination data\n runningSearch: '',\n runningScripts: [],\n runningTotal: 0,\n runningLoading: false,\n runningPage: 1,\n runningItemsPerPage: 10,\n runningHeaders: [\n {\n title: 'Connect',\n key: 'connect',\n sortable: false,\n filterable: false,\n },\n { title: 'Id', key: 'name' },\n { title: 'User', key: 'user_display' },\n { title: 'Filename', key: 'filename' },\n { title: 'Start Time', key: 'start_time_formatted' },\n { title: 'Duration', key: 'duration' },\n { title: 'State', key: 'state' },\n {\n title: 'Stop',\n key: 'stop',\n sortable: false,\n filterable: false,\n },\n ],\n // Completed scripts pagination data\n completedSearch: '',\n completedScripts: [],\n completedTotal: 0,\n completedLoading: false,\n completedPage: 1,\n completedItemsPerPage: 10,\n completedHeaders: [\n { title: 'Id', key: 'name' },\n { title: 'User', key: 'user_display' },\n { title: 'Filename', key: 'filename' },\n { title: 'Start Time', key: 'start_time_formatted' },\n { title: 'Duration', key: 'duration' },\n { title: 'State', key: 'state' },\n {\n title: 'Log',\n key: 'log',\n sortable: false,\n filterable: false,\n },\n {\n title: 'Report',\n key: 'report',\n sortable: false,\n filterable: false,\n },\n ],\n showDialog: false,\n dialogName: '',\n dialogContent: '',\n dialogFilename: '',\n }\n },\n watch: {\n activeTab(newTab) {\n if (newTab === 'running') {\n this.getRunningScripts()\n } else if (newTab === 'completed') {\n this.getCompletedScripts()\n }\n },\n },\n created() {\n this.api = new OpenC3Api()\n this.api\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch((error) => {\n // Do nothing\n })\n\n this.getRunningScripts()\n this.getCompletedScripts()\n\n // Start a timer to refresh the running scripts list every 5 seconds\n this.refreshTimer = setInterval(() => {\n if (this.activeTab === 'running') {\n this.getRunningScripts()\n }\n }, 5000)\n },\n beforeUnmount() {\n // Clear the timer when component is unmounted\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer)\n }\n },\n methods: {\n getRunningScripts: function () {\n this.runningLoading = true\n const offset = (this.runningPage - 1) * this.runningItemsPerPage\n Api.get(\n `/script-api/running-script?scope=DEFAULT&offset=${offset}&limit=${this.runningItemsPerPage}`,\n )\n .then((response) => {\n const scripts = response.data.items || []\n const currentTime = new Date()\n\n // Calculate duration for each running script and format user info\n scripts.forEach((script) => {\n // Format user display as \"full_name (username)\"\n script.user_display = `${script.user_full_name} (${script.username})`\n\n // Calculate duration\n if (script.start_time) {\n const startTime = new Date(script.start_time)\n const durationMs = currentTime - startTime\n script.start_time_formatted = this.formatDateTimeHMS(\n startTime,\n this.timeZone,\n )\n // Format duration\n if (durationMs < 0) {\n script.duration = 'N/A'\n } else if (durationMs < 1000) {\n script.duration = '< 1s'\n } else if (durationMs < 60000) {\n script.duration = `${Math.round(durationMs / 1000)}s`\n } else if (durationMs < 3600000) {\n const minutes = Math.floor(durationMs / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${minutes}m ${seconds}s`\n } else {\n const hours = Math.floor(durationMs / 3600000)\n const minutes = Math.floor((durationMs % 3600000) / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${hours}h ${minutes}m ${seconds}s`\n }\n } else {\n script.duration = 'N/A'\n }\n })\n\n this.runningScripts = scripts\n this.runningTotal = response.data.total || scripts.length\n this.runningLoading = false\n })\n .catch((error) => {\n this.runningLoading = false\n this.$notify.caution({\n title: 'Error Loading Running Scripts',\n body: error.message,\n })\n })\n },\n updateRunningPage: function (page) {\n this.runningPage = page\n this.getRunningScripts()\n },\n updateRunningItemsPerPage: function (itemsPerPage) {\n this.runningItemsPerPage = itemsPerPage\n this.runningPage = 1\n this.getRunningScripts()\n },\n getCompletedScripts: function () {\n this.completedLoading = true\n const offset = (this.completedPage - 1) * this.completedItemsPerPage\n Api.get(\n `/script-api/completed-scripts?scope=DEFAULT&offset=${offset}&limit=${this.completedItemsPerPage}`,\n )\n .then((response) => {\n const scripts = response.data.items || []\n\n // Calculate duration and format user info for each completed script\n scripts.forEach((script) => {\n // Format user display as \"full_name (username)\"\n script.user_display = `${script.user_full_name} (${script.username})`\n\n // Calculate duration\n if (script.start_time && script.end_time) {\n const startTime = new Date(script.start_time)\n const endTime = new Date(script.end_time)\n const durationMs = endTime - startTime\n script.start_time_formatted = this.formatDateTimeHMS(\n startTime,\n this.timeZone,\n )\n\n // Format duration\n if (durationMs < 0) {\n script.duration = 'N/A'\n } else if (durationMs < 1000) {\n script.duration = '< 1s'\n } else if (durationMs < 60000) {\n script.duration = `${Math.round(durationMs / 1000)}s`\n } else if (durationMs < 3600000) {\n const minutes = Math.floor(durationMs / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${minutes}m ${seconds}s`\n } else {\n const hours = Math.floor(durationMs / 3600000)\n const minutes = Math.floor((durationMs % 3600000) / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${hours}h ${minutes}m ${seconds}s`\n }\n } else {\n script.duration = 'N/A'\n }\n })\n\n this.completedScripts = scripts\n this.completedTotal = response.data.total || scripts.length\n this.completedLoading = false\n })\n .catch((error) => {\n this.completedLoading = false\n this.$notify.caution({\n title: 'Error Loading Completed Scripts',\n body: error.message,\n })\n })\n },\n updateCompletedPage: function (page) {\n this.completedPage = page\n this.getCompletedScripts()\n },\n updateCompletedItemsPerPage: function (itemsPerPage) {\n this.completedItemsPerPage = itemsPerPage\n this.completedPage = 1\n this.getCompletedScripts()\n },\n showScript: function (script) {\n this.dialogContent = JSON.stringify(script, null, 2)\n this.dialogName = 'Script: ' + script.name\n this.dialogFilename = ''\n this.showDialog = true\n },\n connectScript: function (script) {\n // Must disconnect before connecting\n this.$emit('disconnect')\n const destination = {\n name: 'ScriptRunner',\n params: { id: script.name },\n }\n if (this.connectInNewTab) {\n let { href } = this.$router.resolve(destination)\n window.open(href, '_blank')\n } else {\n this.$router.push(destination)\n this.$emit('close')\n }\n },\n deleteScript: function (script) {\n this.$dialog\n .confirm(\n `Are you sure you want to stop script: ${script.name} ${script.filename}?\\n`,\n {\n okText: 'Stop',\n cancelText: 'Cancel',\n },\n )\n .then((dialog) => {\n return Api.post(`/script-api/running-script/${script.name}/delete`)\n })\n .then((response) => {\n this.$notify.normal({\n body: `Stopped script: ${script.name} ${script.filename}`,\n })\n this.getRunningScripts()\n })\n .catch((error) => {\n if (error !== true) {\n this.$notify.caution({\n body: `Failed to stop script: ${script.name} ${script.filename}`,\n })\n }\n })\n },\n viewScriptLog: function (script, type) {\n let logUrl = null\n if (type === 'report') {\n this.dialogName = 'Report'\n logUrl = script.report\n } else {\n this.dialogName = 'Log'\n logUrl = script.log\n }\n Api.get(\n `/openc3-api/storage/download_file/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET`,\n ).then((response) => {\n const filenameParts = logUrl.split('/')\n this.dialogFilename = filenameParts[filenameParts.length - 1]\n // Decode Base64 string\n this.dialogContent = window.atob(response.data.contents)\n this.showDialog = true\n })\n },\n downloadScriptLog: function (script, type, format = 'text') {\n let logUrl = null\n if (type === 'report') {\n this.dialogName = 'Report'\n logUrl = script.report\n } else {\n this.dialogName = 'Log'\n logUrl = script.log\n }\n this.downloadScript = script\n\n if (format === 'ctrf' && type === 'report') {\n // For CTRF format, pass format parameter to backend for conversion\n Api.get(\n `/openc3-api/storage/download_file/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET&format=ctrf`,\n )\n .then((response) => {\n // Backend returns the converted CTRF content\n const blob = new Blob([window.atob(response.data.contents)], {\n type: 'application/json',\n })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n this.downloadScript = null\n })\n .catch(() => {\n this.$notify.caution({\n title: `Unable to download log ${logUrl}`,\n body: `You may be able to download this log manually from the 'logs' bucket at ${logUrl}`,\n })\n this.downloadScript = null\n })\n } else {\n // Original download functionality for text format\n Api.get(\n `/openc3-api/storage/download/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET`,\n )\n .then((response) => {\n const filenameParts = logUrl.split('/')\n const basename = filenameParts[filenameParts.length - 1]\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = response.data.url\n link.setAttribute('download', basename)\n link.click()\n this.downloadScript = null\n })\n .catch(() => {\n this.$notify.caution({\n title: `Unable to download log ${logUrl}`,\n body: `You may be able to download this log manually from the 'logs' bucket at ${logUrl}`,\n })\n this.downloadScript = null\n })\n }\n },\n },\n}\n</script>\n<style>\n.v-sheet {\n background-color: var(--color-background-base-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 <v-card class=\"d-flex flex-column h-100\">\n <v-card-title class=\"d-flex align-center\">\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"download-log\"\n aria-label=\"Download Log\"\n @click=\"downloadLog\"\n />\n Script Messages\n <v-spacer />\n <v-select\n v-model=\"messageOrder\"\n density=\"compact\"\n hide-details\n variant=\"outlined\"\n :items=\"messageOrderOptions\"\n class=\"mr-2\"\n style=\"max-width: 200px\"\n data-test=\"message-order\"\n />\n <v-spacer />\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 class=\"search\"\n data-test=\"search-messages\"\n />\n\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-delete-sweep\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"clear-log\"\n aria-label=\"Clear Log\"\n @click=\"clearLog\"\n />\n </v-card-title>\n <v-card-text class=\"overflow-auto\">\n <v-data-table\n id=\"script-log-messages\"\n :headers=\"headers\"\n :items=\"messages\"\n :search=\"search\"\n :items-per-page=\"-1\"\n hide-default-footer\n density=\"compact\"\n data-test=\"output-messages\"\n >\n <template #item.message=\"{ item }\">\n <div :class=\"messageClass(item.message)\">{{ item.message }}</div>\n </template>\n </v-data-table>\n </v-card-text>\n </v-card>\n</template>\n\n<script>\nimport { format } from 'date-fns'\n\nexport default {\n props: {\n modelValue: {\n type: Array,\n required: true,\n },\n },\n emits: ['sort', 'update:modelValue'],\n data() {\n return {\n search: '',\n headers: [{ title: 'Message', value: 'message', sortable: false }],\n messageOrderOptions: ['Newest on Top', 'Newest on Bottom'],\n messageOrder: 'Newest on Top',\n }\n },\n computed: {\n messages: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n watch: {\n messageOrder: function (newValue, oldValue) {\n this.$emit('sort', newValue)\n },\n },\n methods: {\n messageClass(message) {\n if (\n message.match(/(CHECK|WAIT): .*(success|was within range.*) with value/)\n ) {\n return 'openc3-green'\n } else if (\n message.match(\n /(CHECK|WAIT): .*(failed|failed to be within range.*) with value/,\n )\n ) {\n return 'openc3-red'\n } else {\n return ''\n }\n },\n downloadLog() {\n const output = this.messages.map((message) => message.message).join('\\n')\n const blob = new Blob([output], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute(\n 'download',\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss') + '_sr_message_log.txt',\n )\n link.click()\n },\n clearLog: function () {\n this.$dialog\n .confirm('Are you sure you want to clear the log?', {\n okText: 'Clear',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n this.messages = []\n })\n .catch(function (err) {\n // Canceling the dialog forces catch and sets err to true\n })\n },\n },\n}\n</script>\n","import { useSlots as ce, ref as k, computed as z, watch as B, onMounted as G, onBeforeUnmount as X, provide as g, createBlock as ve, openBlock as Y, resolveDynamicComponent as me, nextTick as T, h as fe, inject as w, getCurrentInstance as de, createElementBlock as pe, normalizeStyle as ze, unref as he, renderSlot as xe } from \"vue\";\nconst Pe = {\n __name: \"splitpanes\",\n props: {\n horizontal: { type: Boolean, default: !1 },\n pushOtherPanes: { type: Boolean, default: !0 },\n maximizePanes: { type: Boolean, default: !0 },\n // Maximize pane on splitter double click/tap.\n rtl: { type: Boolean, default: !1 },\n // Right to left direction.\n firstSplitter: { type: Boolean, default: !1 }\n },\n emits: [\n \"ready\",\n \"resize\",\n \"resized\",\n \"pane-click\",\n \"pane-maximize\",\n \"pane-add\",\n \"pane-remove\",\n \"splitter-click\",\n \"splitter-dblclick\"\n ],\n setup(D, { emit: h }) {\n const y = h, u = D, E = ce(), l = k([]), M = z(() => l.value.reduce((e, n) => (e[~~n.id] = n) && e, {})), m = z(() => l.value.length), x = k(null), S = k(!1), c = k({\n mouseDown: !1,\n dragging: !1,\n activeSplitter: null,\n cursorOffset: 0\n // Cursor offset within the splitter.\n }), f = k({\n // Used to detect double click on touch devices.\n splitter: null,\n timeoutId: null\n }), _ = z(() => ({\n [`splitpanes splitpanes--${u.horizontal ? \"horizontal\" : \"vertical\"}`]: !0,\n \"splitpanes--dragging\": c.value.dragging\n })), R = () => {\n document.addEventListener(\"mousemove\", r, { passive: !1 }), document.addEventListener(\"mouseup\", P), \"ontouchstart\" in window && (document.addEventListener(\"touchmove\", r, { passive: !1 }), document.addEventListener(\"touchend\", P));\n }, O = () => {\n document.removeEventListener(\"mousemove\", r, { passive: !1 }), document.removeEventListener(\"mouseup\", P), \"ontouchstart\" in window && (document.removeEventListener(\"touchmove\", r, { passive: !1 }), document.removeEventListener(\"touchend\", P));\n }, b = (e, n) => {\n const t = e.target.closest(\".splitpanes__splitter\");\n if (t) {\n const { left: i, top: a } = t.getBoundingClientRect(), { clientX: s, clientY: o } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n c.value.cursorOffset = u.horizontal ? o - a : s - i;\n }\n R(), c.value.mouseDown = !0, c.value.activeSplitter = n;\n }, r = (e) => {\n c.value.mouseDown && (e.preventDefault(), c.value.dragging = !0, requestAnimationFrame(() => {\n K(I(e)), d(\"resize\", { event: e }, !0);\n }));\n }, P = (e) => {\n c.value.dragging && (window.getSelection().removeAllRanges(), d(\"resized\", { event: e }, !0)), c.value.mouseDown = !1, c.value.activeSplitter = null, setTimeout(() => {\n c.value.dragging = !1, O();\n }, 100);\n }, A = (e, n) => {\n \"ontouchstart\" in window && (e.preventDefault(), f.value.splitter === n ? (clearTimeout(f.value.timeoutId), f.value.timeoutId = null, U(e, n), f.value.splitter = null) : (f.value.splitter = n, f.value.timeoutId = setTimeout(() => f.value.splitter = null, 500))), c.value.dragging || d(\"splitter-click\", { event: e, index: n }, !0);\n }, U = (e, n) => {\n if (d(\"splitter-dblclick\", { event: e, index: n }, !0), u.maximizePanes) {\n let t = 0;\n l.value = l.value.map((i, a) => (i.size = a === n ? i.max : i.min, a !== n && (t += i.min), i)), l.value[n].size -= t, d(\"pane-maximize\", { event: e, index: n, pane: l.value[n] }), d(\"resized\", { event: e, index: n }, !0);\n }\n }, W = (e, n) => {\n d(\"pane-click\", {\n event: e,\n index: M.value[n].index,\n pane: M.value[n]\n });\n }, I = (e) => {\n const n = x.value.getBoundingClientRect(), { clientX: t, clientY: i } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n return {\n x: t - (u.horizontal ? 0 : c.value.cursorOffset) - n.left,\n y: i - (u.horizontal ? c.value.cursorOffset : 0) - n.top\n };\n }, J = (e) => {\n e = e[u.horizontal ? \"y\" : \"x\"];\n const n = x.value[u.horizontal ? \"clientHeight\" : \"clientWidth\"];\n return u.rtl && !u.horizontal && (e = n - e), e * 100 / n;\n }, K = (e) => {\n const n = c.value.activeSplitter;\n let t = {\n prevPanesSize: $(n),\n nextPanesSize: N(n),\n prevReachedMinPanes: 0,\n nextReachedMinPanes: 0\n };\n const i = 0 + (u.pushOtherPanes ? 0 : t.prevPanesSize), a = 100 - (u.pushOtherPanes ? 0 : t.nextPanesSize), s = Math.max(Math.min(J(e), a), i);\n let o = [n, n + 1], v = l.value[o[0]] || null, p = l.value[o[1]] || null;\n const H = v.max < 100 && s >= v.max + t.prevPanesSize, ue = p.max < 100 && s <= 100 - (p.max + N(n + 1));\n if (H || ue) {\n H ? (v.size = v.max, p.size = Math.max(100 - v.max - t.prevPanesSize - t.nextPanesSize, 0)) : (v.size = Math.max(100 - p.max - t.prevPanesSize - N(n + 1), 0), p.size = p.max);\n return;\n }\n if (u.pushOtherPanes) {\n const j = Q(t, s);\n if (!j) return;\n ({ sums: t, panesToResize: o } = j), v = l.value[o[0]] || null, p = l.value[o[1]] || null;\n }\n v !== null && (v.size = Math.min(Math.max(s - t.prevPanesSize - t.prevReachedMinPanes, v.min), v.max)), p !== null && (p.size = Math.min(Math.max(100 - s - t.nextPanesSize - t.nextReachedMinPanes, p.min), p.max));\n }, Q = (e, n) => {\n const t = c.value.activeSplitter, i = [t, t + 1];\n return n < e.prevPanesSize + l.value[i[0]].min && (i[0] = V(t).index, e.prevReachedMinPanes = 0, i[0] < t && l.value.forEach((a, s) => {\n s > i[0] && s <= t && (a.size = a.min, e.prevReachedMinPanes += a.min);\n }), e.prevPanesSize = $(i[0]), i[0] === void 0) ? (e.prevReachedMinPanes = 0, l.value[0].size = l.value[0].min, l.value.forEach((a, s) => {\n s > 0 && s <= t && (a.size = a.min, e.prevReachedMinPanes += a.min);\n }), l.value[i[1]].size = 100 - e.prevReachedMinPanes - l.value[0].min - e.prevPanesSize - e.nextPanesSize, null) : n > 100 - e.nextPanesSize - l.value[i[1]].min && (i[1] = Z(t).index, e.nextReachedMinPanes = 0, i[1] > t + 1 && l.value.forEach((a, s) => {\n s > t && s < i[1] && (a.size = a.min, e.nextReachedMinPanes += a.min);\n }), e.nextPanesSize = N(i[1] - 1), i[1] === void 0) ? (e.nextReachedMinPanes = 0, l.value.forEach((a, s) => {\n s < m.value - 1 && s >= t + 1 && (a.size = a.min, e.nextReachedMinPanes += a.min);\n }), l.value[i[0]].size = 100 - e.prevPanesSize - N(i[0] - 1), null) : { sums: e, panesToResize: i };\n }, $ = (e) => l.value.reduce((n, t, i) => n + (i < e ? t.size : 0), 0), N = (e) => l.value.reduce((n, t, i) => n + (i > e + 1 ? t.size : 0), 0), V = (e) => [...l.value].reverse().find((t) => t.index < e && t.size > t.min) || {}, Z = (e) => l.value.find((t) => t.index > e + 1 && t.size > t.min) || {}, ee = () => {\n var n;\n const e = Array.from(((n = x.value) == null ? void 0 : n.children) || []);\n for (const t of e) {\n const i = t.classList.contains(\"splitpanes__pane\"), a = t.classList.contains(\"splitpanes__splitter\");\n !i && !a && (t.remove(), console.warn(\"Splitpanes: Only <pane> elements are allowed at the root of <splitpanes>. One of your DOM nodes was removed.\"));\n }\n }, F = (e, n, t = !1) => {\n const i = e - 1, a = document.createElement(\"div\");\n a.classList.add(\"splitpanes__splitter\"), t || (a.onmousedown = (s) => b(s, i), typeof window < \"u\" && \"ontouchstart\" in window && (a.ontouchstart = (s) => b(s, i)), a.onclick = (s) => A(s, i + 1)), a.ondblclick = (s) => U(s, i + 1), n.parentNode.insertBefore(a, n);\n }, ne = (e) => {\n e.onmousedown = void 0, e.onclick = void 0, e.ondblclick = void 0, e.remove();\n }, C = () => {\n var t;\n const e = Array.from(((t = x.value) == null ? void 0 : t.children) || []);\n for (const i of e)\n i.className.includes(\"splitpanes__splitter\") && ne(i);\n let n = 0;\n for (const i of e)\n i.className.includes(\"splitpanes__pane\") && (!n && u.firstSplitter ? F(n, i, !0) : n && F(n, i), n++);\n }, ie = ({ uid: e, ...n }) => {\n const t = M.value[e];\n for (const [i, a] of Object.entries(n)) t[i] = a;\n }, te = (e) => {\n var t;\n let n = -1;\n Array.from(((t = x.value) == null ? void 0 : t.children) || []).some((i) => (i.className.includes(\"splitpanes__pane\") && n++, i.isSameNode(e.el))), l.value.splice(n, 0, { ...e, index: n }), l.value.forEach((i, a) => i.index = a), S.value && T(() => {\n C(), L({ addedPane: l.value[n] }), d(\"pane-add\", { pane: l.value[n] });\n });\n }, ae = (e) => {\n const n = l.value.findIndex((i) => i.id === e);\n l.value[n].el = null;\n const t = l.value.splice(n, 1)[0];\n l.value.forEach((i, a) => i.index = a), T(() => {\n C(), d(\"pane-remove\", { pane: t }), L({ removedPane: { ...t } });\n });\n }, L = (e = {}) => {\n !e.addedPane && !e.removedPane ? le() : l.value.some((n) => n.givenSize !== null || n.min || n.max < 100) ? oe(e) : se(), S.value && d(\"resized\");\n }, se = () => {\n const e = 100 / m.value;\n let n = 0;\n const t = [], i = [];\n for (const a of l.value)\n a.size = Math.max(Math.min(e, a.max), a.min), n -= a.size, a.size >= a.max && t.push(a.id), a.size <= a.min && i.push(a.id);\n n > 0.1 && q(n, t, i);\n }, le = () => {\n let e = 100;\n const n = [], t = [];\n let i = 0;\n for (const s of l.value)\n e -= s.size, s.givenSize !== null && i++, s.size >= s.max && n.push(s.id), s.size <= s.min && t.push(s.id);\n let a = 100;\n if (e > 0.1) {\n for (const s of l.value)\n s.givenSize === null && (s.size = Math.max(Math.min(e / (m.value - i), s.max), s.min)), a -= s.size;\n a > 0.1 && q(a, n, t);\n }\n }, oe = ({ addedPane: e, removedPane: n } = {}) => {\n let t = 100 / m.value, i = 0;\n const a = [], s = [];\n ((e == null ? void 0 : e.givenSize) ?? null) !== null && (t = (100 - e.givenSize) / (m.value - 1));\n for (const o of l.value)\n i -= o.size, o.size >= o.max && a.push(o.id), o.size <= o.min && s.push(o.id);\n if (!(Math.abs(i) < 0.1)) {\n for (const o of l.value)\n (e == null ? void 0 : e.givenSize) !== null && (e == null ? void 0 : e.id) === o.id || (o.size = Math.max(Math.min(t, o.max), o.min)), i -= o.size, o.size >= o.max && a.push(o.id), o.size <= o.min && s.push(o.id);\n i > 0.1 && q(i, a, s);\n }\n }, q = (e, n, t) => {\n let i;\n e > 0 ? i = e / (m.value - n.length) : i = e / (m.value - t.length), l.value.forEach((a, s) => {\n if (e > 0 && !n.includes(a.id)) {\n const o = Math.max(Math.min(a.size + i, a.max), a.min), v = o - a.size;\n e -= v, a.size = o;\n } else if (!t.includes(a.id)) {\n const o = Math.max(Math.min(a.size + i, a.max), a.min), v = o - a.size;\n e -= v, a.size = o;\n }\n }), Math.abs(e) > 0.1 && T(() => {\n S.value && console.warn(\"Splitpanes: Could not resize panes correctly due to their constraints.\");\n });\n }, d = (e, n = void 0, t = !1) => {\n const i = (n == null ? void 0 : n.index) ?? c.value.activeSplitter ?? null;\n y(e, {\n ...n,\n ...i !== null && { index: i },\n ...t && i !== null && {\n prevPane: l.value[i - (u.firstSplitter ? 1 : 0)],\n nextPane: l.value[i + (u.firstSplitter ? 0 : 1)]\n },\n panes: l.value.map((a) => ({ min: a.min, max: a.max, size: a.size }))\n });\n };\n B(() => u.firstSplitter, () => C()), G(() => {\n ee(), C(), L(), d(\"ready\"), S.value = !0;\n }), X(() => S.value = !1);\n const re = () => {\n var e;\n return fe(\n \"div\",\n { ref: x, class: _.value },\n (e = E.default) == null ? void 0 : e.call(E)\n );\n };\n return g(\"panes\", l), g(\"indexedPanes\", M), g(\"horizontal\", z(() => u.horizontal)), g(\"requestUpdate\", ie), g(\"onPaneAdd\", te), g(\"onPaneRemove\", ae), g(\"onPaneClick\", W), (e, n) => (Y(), ve(me(re)));\n }\n}, ge = {\n __name: \"pane\",\n props: {\n size: { type: [Number, String] },\n minSize: { type: [Number, String], default: 0 },\n maxSize: { type: [Number, String], default: 100 }\n },\n setup(D) {\n var b;\n const h = D, y = w(\"requestUpdate\"), u = w(\"onPaneAdd\"), E = w(\"horizontal\"), l = w(\"onPaneRemove\"), M = w(\"onPaneClick\"), m = (b = de()) == null ? void 0 : b.uid, x = w(\"indexedPanes\"), S = z(() => x.value[m]), c = k(null), f = z(() => {\n const r = isNaN(h.size) || h.size === void 0 ? 0 : parseFloat(h.size);\n return Math.max(Math.min(r, R.value), _.value);\n }), _ = z(() => {\n const r = parseFloat(h.minSize);\n return isNaN(r) ? 0 : r;\n }), R = z(() => {\n const r = parseFloat(h.maxSize);\n return isNaN(r) ? 100 : r;\n }), O = z(() => {\n var r;\n return `${E.value ? \"height\" : \"width\"}: ${(r = S.value) == null ? void 0 : r.size}%`;\n });\n return B(() => f.value, (r) => y({ uid: m, size: r })), B(() => _.value, (r) => y({ uid: m, min: r })), B(() => R.value, (r) => y({ uid: m, max: r })), G(() => {\n u({\n id: m,\n el: c.value,\n min: _.value,\n max: R.value,\n // The given size (useful to know the user intention).\n givenSize: h.size === void 0 ? null : f.value,\n size: f.value\n // The computed current size at any time.\n });\n }), X(() => l(m)), (r, P) => (Y(), pe(\"div\", {\n ref_key: \"paneEl\",\n ref: c,\n class: \"splitpanes__pane\",\n onClick: P[0] || (P[0] = (A) => he(M)(A, r._.uid)),\n style: ze(O.value)\n }, [\n xe(r.$slots, \"default\")\n ], 4));\n }\n};\nexport {\n ge as Pane,\n Pe as Splitpanes\n};\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 2022, 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 <v-dialog v-model=\"show\" persistent width=\"600\" @keydown.esc=\"cancelHandler\">\n <v-card>\n <v-form v-model=\"valid\" @submit.prevent=\"submitHandler\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> User Input Required </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <div class=\"question\">{{ question }}</div>\n <v-text-field\n v-model=\"inputValue\"\n autofocus\n data-test=\"ask-value-input\"\n :type=\"password ? 'password' : 'text'\"\n :rules=\"rules\"\n />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"ask-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n type=\"submit\"\n data-test=\"ask-ok\"\n :disabled=\"!valid\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n question: {\n type: String,\n required: true,\n },\n default: {\n type: String,\n default: null,\n },\n password: {\n type: Boolean,\n default: false,\n },\n answerRequired: {\n type: Boolean,\n default: true,\n },\n modelValue: Boolean,\n },\n emits: ['update:modelValue', 'response'],\n data() {\n return {\n inputValue: '',\n valid: false,\n rules: [(v) => !!v || 'Required'],\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 },\n created() {\n if (this.default) {\n this.valid = true\n this.inputValue = this.default\n }\n if (this.answerRequired === false) {\n this.valid = true\n this.rules = [(v) => true]\n }\n },\n methods: {\n submitHandler: function () {\n this.$emit('response', this.inputValue)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.question {\n font-size: 1rem;\n white-space: pre-line;\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 2022, 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 <v-dialog v-model=\"show\" persistent width=\"600\" @keydown.esc=\"cancelHandler\">\n <v-card>\n <v-form v-model=\"valid\" @submit.prevent=\"submitHandler\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> File Dialog </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row>\n <span class=\"text-h6\">{{ title }}</span>\n </v-row>\n <v-row v-if=\"message\">\n <span\n class=\"ma-3\"\n style=\"white-space: pre-line\"\n v-text=\"message\"\n />\n </v-row>\n <v-row class=\"my-1\">\n <v-file-input\n v-model=\"inputValue\"\n label=\"Choose File\"\n :rules=\"rules\"\n autofocus\n data-test=\"file-input\"\n :accept=\"filter\"\n small-chips\n :multiple=\"multiple\"\n />\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"file-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n type=\"submit\"\n data-test=\"file-ok\"\n :disabled=\"!valid\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n default: null,\n },\n filter: {\n type: String,\n default: '*',\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n modelValue: Boolean,\n },\n emits: ['update:modelValue', 'response'],\n data() {\n return {\n inputValue: null,\n valid: null,\n rules: [\n (value) => {\n if (this.multiple) {\n return value.length != 0 || 'Required'\n } else {\n return !!value || 'Required'\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)\n },\n },\n },\n methods: {\n submitHandler: function () {\n // Ensure we send back an array of file names even in the single case\n // to make it easier to deal with a consistent result\n if (!Array.isArray(this.inputValue)) {\n this.inputValue = [this.inputValue]\n }\n this.$emit('response', this.inputValue)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style scoped>\n.title {\n font-size: 1.125rem;\n font-weight: bold;\n padding-bottom: 5px;\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 2022, 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 <!-- INFO -->\n <v-dialog v-model=\"show\" :width=\"width\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span style=\"white-space: pre\" v-text=\"title\" />\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row v-for=\"(line, index) in text\" :key=\"index\" no-gutters>\n <span style=\"white-space: pre\" v-text=\"line\" />\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n title: {\n type: String,\n required: true,\n },\n text: {\n type: String,\n required: true,\n },\n width: {\n type: String,\n required: true,\n },\n },\n emits: ['update:modelValue'],\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n methods: {},\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 2022, 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 <v-dialog v-model=\"show\" width=\"1000\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Overrides</span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row class=\"ma-1\">\n <v-btn\n color=\"primary\"\n data-test=\"overrides-dialog-clear-all\"\n @click=\"clearOverrides\"\n >\n Clear All Overrides\n </v-btn>\n <v-spacer />\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 />\n </v-row>\n <v-data-table\n :headers=\"headers\"\n :items=\"overrides\"\n :search=\"search\"\n :items-per-page-options=\"[100]\"\n multi-sort\n density=\"compact\"\n >\n <template #item.delete=\"{ item }\">\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Override\"\n @click=\"deleteOverride(item)\"\n />\n </template>\n </v-data-table>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"flat\"\n data-test=\"overrides-dialog-ok\"\n @click=\"show = !show\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { OpenC3Api } from '@openc3/js-common/services'\n\nexport default {\n components: {},\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n },\n emits: ['update:modelValue'],\n data() {\n return {\n api: null,\n overrides: [],\n search: '',\n headers: [\n { text: 'Target', value: 'target_name' },\n { text: 'Packet', value: 'packet_name' },\n { text: 'Item', value: 'item_name' },\n { text: 'Type', value: 'value_type' },\n { text: 'Value', value: 'value' },\n { text: 'Delete', value: 'delete' },\n ],\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 },\n created: function () {\n this.api = new OpenC3Api()\n this.getOverrides()\n },\n methods: {\n getOverrides: function () {\n this.api.get_overrides().then((result) => {\n this.overrides = result\n })\n },\n clearOverrides: function () {\n const items = [\n ...new Map(\n this.overrides.map((item) => [\n // Create a key based on target, packet, item so we remove duplicates\n `${item.target_name}__${item.packet_name}__${item.item_name}`,\n item,\n ]),\n ).values(),\n ]\n for (let item of items) {\n this.api\n .normalize_tlm(\n item.target_name,\n item.packet_name,\n item.item_name,\n 'ALL',\n )\n .then((result) => {\n this.overrides = []\n })\n }\n },\n deleteOverride: function (item) {\n this.api\n .normalize_tlm(\n item.target_name,\n item.packet_name,\n item.item_name,\n item.value_type,\n )\n .then((result) => {\n let index = this.overrides.indexOf(item)\n this.overrides.splice(index, 1)\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\n<template>\n <v-dialog\n v-model=\"show\"\n persistent\n scrollable\n width=\"600\"\n @keydown.esc=\"cancelHandler\"\n >\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span class=\"text\" v-text=\"title\" />\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\" style=\"max-height: 60vh; overflow: auto\">\n <v-card-text class=\"text\">\n <v-row v-if=\"subtitle\">\n <v-card-subtitle>{{ subtitle }}</v-card-subtitle>\n </v-row>\n <v-row class=\"mt-1\">\n <span v-text=\"message\" />\n </v-row>\n <v-row v-if=\"details\" class=\"mt-1\">\n <span v-text=\"details\" />\n </v-row>\n </v-card-text>\n </div>\n <div v-if=\"layout === 'combo'\">\n <v-row class=\"ma-2\">\n <v-select\n v-model=\"selectedItem\"\n label=\"Select\"\n color=\"secondary\"\n class=\"ma-1\"\n data-test=\"prompt-select\"\n :items=\"buttons\"\n :multiple=\"multiple === true\"\n @update:model-value=\"selectOkDisabled = false\"\n />\n </v-row>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"prompt-ok\"\n :disabled=\"selectOkDisabled\"\n @click=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </div>\n <div v-else>\n <v-card-actions :class=\"layoutClass\">\n <v-spacer v-if=\"layout !== 'vertical'\" />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <div v-for=\"(button, index) in buttons\" :key=\"index\">\n <v-btn\n variant=\"flat\"\n :data-test=\"`prompt-${button.text}`\"\n @click=\"submitWrapper(button.value)\"\n >\n {{ button.text }}\n </v-btn>\n </div>\n </v-card-actions>\n </div>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n title: {\n type: String,\n default: 'Prompt Dialog',\n },\n subtitle: {\n type: String,\n default: '',\n },\n message: {\n type: String,\n required: true,\n },\n details: {\n type: String,\n default: '',\n },\n buttons: {\n type: Array,\n default: () => [],\n },\n layout: {\n type: String,\n default: 'horizontal', // Also 'vertical' or 'combo' when means ComboBox\n },\n multiple: {\n type: Boolean,\n default: false,\n required: false,\n },\n modelValue: Boolean,\n },\n emits: ['update:modelValue', 'response'],\n data() {\n return {\n selectOkDisabled: true,\n selectedItem: null,\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 layoutClass() {\n let layout = 'px-2 d-flex align-start'\n if (this.layout === 'vertical') {\n return `${layout} flex-column prompt-buttons-vertical`\n } else {\n return `${layout} flex-row flex-wrap prompt-buttons-horizontal`\n }\n },\n },\n methods: {\n submitWrapper: function (output) {\n this.selectedItem = output\n this.submitHandler()\n },\n submitHandler: function () {\n this.$emit('response', this.selectedItem)\n },\n cancelHandler: function () {\n this.$emit('response', 'Cancel')\n },\n },\n}\n</script>\n\n<style scoped>\n.v-card__subtitle {\n padding: 0;\n padding-bottom: 10px;\n}\n\n.text {\n font-size: 1rem;\n white-space: pre-line;\n}\n\n.prompt-buttons-vertical {\n max-height: 50vh;\n overflow-y: auto;\n}\n\n.prompt-buttons-horizontal {\n max-height: 50vh;\n overflow-y: auto;\n gap: 8px;\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 2024, 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 <v-dialog v-model=\"show\" scrollable width=\"800\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Script Results </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text style=\"width: 100%; max-height: 80vh; overflow: auto\">\n <v-textarea\n readonly\n hide-details\n density=\"compact\"\n auto-grow\n :model-value=\"text\"\n />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"outlined\" @click=\"downloadResults\"> Download </v-btn>\n <v-btn ref=\"okButton\" variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { format } from 'date-fns'\n\nexport default {\n components: {},\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n text: {\n type: String,\n required: true,\n },\n },\n emits: ['update:modelValue'],\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n mounted() {\n // Focus the OK button so it's easy to hit Enter to close\n setTimeout(() => {\n this.$refs.okButton.$el.focus()\n })\n },\n methods: {\n downloadResults() {\n const blob = new Blob([this.text], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute(\n 'download',\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss') + '_suite_results.txt',\n )\n link.click()\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 2022, 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 <v-dialog v-model=\"show\" persistent width=\"600\" @keydown.esc=\"cancel\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Script Environment Variables</span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <environment-chooser v-model=\"selected\" />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"environment-dialog-cancel\"\n @click=\"cancel\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"environment-dialog-save\"\n :disabled=\"!!inputError\"\n @click=\"updateEnvironment\"\n >\n Save\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { EnvironmentChooser } from '@/components'\n\nexport default {\n components: {\n EnvironmentChooser,\n },\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n inputEnvironment: {\n type: Array,\n required: true,\n },\n },\n emits: ['update:modelValue', 'environment'],\n data() {\n return {\n selected: [],\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 },\n mounted: function () {\n this.loadEnvironment()\n },\n methods: {\n loadEnvironment: function () {\n this.selected = [...this.inputEnvironment]\n },\n updateEnvironment: function () {\n this.$emit('environment', this.selected)\n this.show = !this.show\n },\n cancel: function () {\n this.show = !this.show\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 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 <div>\n <div id=\"tr-container\">\n <v-row no-gutters align=\"center\">\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Pause on Error\"\n value=\"pauseOnError\"\n hide-details\n data-test=\"pause-on-error\"\n />\n </div>\n </template>\n <span>\n Checked pauses the script when an error is encountered<br />\n Unchecked continues without user interaction\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Manual\"\n value=\"manual\"\n hide-details\n data-test=\"manual\"\n />\n </div>\n </template>\n <span>\n {{ checkedManualTooltip }}<br />\n {{ uncheckedManualTooltip }}\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"suite\"\n label=\"Suite:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"suites\"\n data-test=\"select-suite\"\n @update:model-value=\"suiteChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-suite\"\n @click=\"$emit('button', { method: 'start', suite, options })\"\n >\n Start\n </v-btn>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n data-test=\"setup-suite\"\n :disabled=\"\n disableButtons || !setupSuiteEnabled || !userInfo.execute\n \"\n @click=\"$emit('button', { method: 'setup', suite, options })\"\n >\n Setup\n </v-btn>\n <v-btn\n color=\"primary\"\n data-test=\"teardown-suite\"\n :disabled=\"\n disableButtons || !teardownSuiteEnabled || !userInfo.execute\n \"\n @click=\"$emit('button', { method: 'teardown', suite, options })\"\n >\n Teardown\n </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Continue after Error\"\n value=\"continueAfterError\"\n hide-details\n data-test=\"continue-after-error\"\n />\n </div>\n </template>\n <span>\n Checked allows the script to continue when an error is\n encountered<br />\n Unchecked forces the current script to end\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Loop\"\n value=\"loop\"\n hide-details\n data-test=\"loop\"\n />\n </div>\n </template>\n <span>\n Checked continuously executes until explicitly stopped<br />\n Unchecked executes only the started script(s)\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"group\"\n label=\"Group:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"groups\"\n data-test=\"select-group\"\n @update:model-value=\"groupChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-group\"\n @click=\"\n $emit('button', { method: 'start', suite, group, options })\n \"\n >\n Start\n </v-btn>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n data-test=\"setup-group\"\n :disabled=\"\n disableButtons || !setupGroupEnabled || !userInfo.execute\n \"\n @click=\"\n $emit('button', { method: 'setup', suite, group, options })\n \"\n >\n Setup\n </v-btn>\n <v-btn\n color=\"primary\"\n data-test=\"teardown-group\"\n :disabled=\"\n disableButtons || !teardownGroupEnabled || !userInfo.execute\n \"\n @click=\"\n $emit('button', { method: 'teardown', suite, group, options })\n \"\n >\n Teardown\n </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Abort after Error\"\n value=\"abortAfterError\"\n hide-details\n data-test=\"abort-after-error\"\n />\n </div>\n </template>\n <span>\n Checked stops additional script execution when an error is\n encountered<br />\n Unchecked allows additional scripts to execute\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n :disabled=\"!options.includes('loop')\"\n label=\"Break Loop on Error\"\n value=\"breakLoopOnError\"\n hide-details\n data-test=\"break-loop-on-error\"\n />\n </div>\n </template>\n <span>\n Checked breaks the loop option when an error is encountered<br />\n Unchecked allows the loop to run continuously<br />\n Note: Abort after Error still breaks the loop\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"script\"\n label=\"Script:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"scriptNames\"\n item-title=\"title\"\n item-value=\"value\"\n data-test=\"select-script\"\n @update:model-value=\"scriptChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-script\"\n @click=\"\n $emit('button', {\n method: 'start',\n suite,\n group,\n script,\n options,\n })\n \"\n >\n Start\n </v-btn>\n <!-- Create some invisible buttons to line up Start properly -->\n <v-btn color=\"primary\" class=\"mr-2 invisible\"> Setup </v-btn>\n <v-btn color=\"primary\" class=\"invisible\"> Teardown </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n suiteMap: {\n type: Object,\n required: true,\n },\n disableButtons: {\n type: Boolean,\n required: true,\n },\n filename: {\n type: String,\n required: true,\n },\n },\n emits: ['button', 'loaded'],\n data() {\n return {\n suites: [],\n groups: [],\n scripts: [],\n suite: '',\n group: '',\n script: '',\n options: ['pauseOnError', 'manual', 'continueAfterError'],\n userInfo: {},\n }\n },\n computed: {\n checkedManualTooltip() {\n if (this.filename.endsWith('.py')) {\n return 'Checked sets the RunningScript.manual variable to True'\n } else {\n return 'Checked sets the $manual variable to true'\n }\n },\n uncheckedManualTooltip() {\n if (this.filename.endsWith('.py')) {\n return 'Unchecked sets the RunningScript.manual variable to False'\n } else {\n return 'Unchecked sets the $manual variable to false'\n }\n },\n setupSuiteEnabled() {\n if (this.suite && this.suiteMap[this.suite].setup) {\n return true\n } else {\n return false\n }\n },\n teardownSuiteEnabled() {\n if (this.suite && this.suiteMap[this.suite].teardown) {\n return true\n } else {\n return false\n }\n },\n setupGroupEnabled() {\n if (\n this.suite &&\n this.group &&\n this.suiteMap[this.suite].groups[this.group].setup\n ) {\n return true\n } else {\n return false\n }\n },\n teardownGroupEnabled() {\n if (\n this.suite &&\n this.group &&\n this.suiteMap[this.suite].groups[this.group].teardown\n ) {\n return true\n } else {\n return false\n }\n },\n scriptNames() {\n return this.scripts.map((name) => {\n return {\n // strip script_ or test_ from the name\n title: name.replace(/^(script_|test_)/, ''),\n value: name,\n }\n })\n },\n },\n // Watch the suiteMap so we can recreate the suites and set the initial value\n watch: {\n suiteMap: {\n handler: function (newVal, oldVal) {\n this.updateSuiteMap()\n },\n deep: true, // Deep watcher because suiteMap is a nested Object\n },\n },\n created() {\n this.userInfo = JSON.parse(localStorage['script_runner__userinfo'])\n this.initSuites()\n this.$emit('loaded')\n },\n methods: {\n updateSuiteMap() {\n this.suites = Object.keys(this.suiteMap)\n if (\n this.suiteMap[this.suite] == undefined ||\n this.suiteMap[this.suite].groups[this.group] == undefined\n ) {\n this.initSuites()\n } else {\n this.groups = Object.keys(this.suiteMap[this.suite].groups)\n this.scripts = this.suiteMap[this.suite].groups[this.group].scripts\n }\n },\n initSuites() {\n this.suites = Object.keys(this.suiteMap)\n this.suiteChanged(this.suites[0])\n },\n suiteChanged(event) {\n if (!event || this.suiteMap[event] == undefined) {\n return\n }\n this.suite = event\n this.group = ''\n this.script = ''\n this.groups = Object.keys(this.suiteMap[event].groups)\n // Make the group default be the first group\n this.groupChanged(this.groups[0])\n },\n groupChanged(event) {\n if (\n !event ||\n this.suiteMap[this.suite] == undefined ||\n this.suiteMap[this.suite].groups[event] == undefined\n ) {\n return\n }\n this.group = event\n this.script = ''\n this.scripts = this.suiteMap[this.suite].groups[event].scripts\n // Make the script default be the first\n this.scriptChanged(this.scripts[0])\n },\n scriptChanged(event) {\n this.script = event\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.invisible {\n visibility: hidden;\n}\n#tr-container {\n padding-top: 0px;\n padding-bottom: 15px;\n padding-left: 0px;\n padding-right: 0px;\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 2022, 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\nexport default class RegexAnnotator {\n // TODO: the eslint parser errors on these because of the #\n // Not sure if this naming is needed for the Ace editor or something?\n #id\n #editor\n #pattern\n #text\n #type\n\n constructor(editor, { pattern, text, type }) {\n this.#id = `regexAnnotator-${Math.floor(Math.random() * 10000000)}`\n this.#editor = editor\n this.#pattern = pattern\n this.#text = text\n this.#type = type\n }\n\n // Re-annotate the entire document\n refresh = () => {\n const session = this.#editor.session\n this.#removeAllAnnotations(session)\n const event = {\n lines: session.doc.$lines,\n action: 'insert',\n start: { row: 0 },\n end: { row: session.doc.$lines.length },\n }\n this.annotate(event, session)\n }\n\n // Update annotations for the changed lines\n annotate = ($event, session) => {\n if ($event.lines.length > 1) {\n // They created or deleted a line (or multiple lines), so first need to shift all the existing annotations\n switch ($event.action) {\n case 'insert':\n this.#shiftAnnotations(\n session,\n $event.start.row,\n $event.lines.length - 1,\n )\n break\n case 'remove':\n this.#shiftAnnotations(\n session,\n $event.start.row + 1,\n -$event.lines.length + 1,\n )\n break\n }\n }\n for (let row = $event.start.row; row <= $event.end.row; row++) {\n let column = session.doc.$lines[row]?.match(this.#pattern)?.index\n if (column !== undefined) {\n column !== 0 && (column += 1) // Account for a leading space that might've been included in the match\n this.#addAnnotation(session, {\n row,\n column, // I don't think our editor theme shows the column for annotations, but others do\n text: this.#text,\n type: this.#type,\n openc3Id: this.#id,\n })\n } else if ($event.action === 'remove') {\n this.#deleteAnnotationsForRow(session, row)\n }\n }\n }\n\n #addAnnotation = (session, newAnnotation) => {\n this.#deleteAnnotationsForRow(session, newAnnotation.row) // Reset this row first for the new annotation\n session.setAnnotations([...session.getAnnotations(), newAnnotation])\n }\n\n #deleteAnnotationsForRow = (session, row) => {\n session.setAnnotations(\n session\n .getAnnotations()\n .filter(\n (annotation) =>\n annotation.openc3Id !== this.#id || annotation.row !== row,\n ),\n )\n }\n\n #shiftAnnotations = (session, row, count) => {\n session.setAnnotations(\n session.getAnnotations().map((annotation) => {\n if (annotation.row > row) {\n annotation.row += count\n }\n return annotation\n }),\n )\n }\n\n #removeAllAnnotations = (session) => {\n session.setAnnotations(\n session\n .getAnnotations()\n .filter((annotation) => annotation.openc3Id !== this.#id),\n )\n }\n}\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 2022, 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\nimport RegexAnnotator from './regexAnnotator.js'\n\nexport default class SleepAnnotator extends RegexAnnotator {\n constructor(editor) {\n const prefix = '(^|[{\\\\s])' // Allowable characters before the keyword: start of line or { or a space\n const keyword = 'sleep' // The keyword this annotation looks for\n const suffix = '[\\\\(\\\\s]' // Allowable characters after the keyword: ( or a space\n super(editor, {\n pattern: new RegExp(`${prefix}${keyword}${suffix}`),\n text: 'Use `wait` instead of `sleep` in OpenC3 scripts', // because we override wait to make it work better, but not sleep\n type: 'warning',\n })\n }\n}\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-if=\"!inline\"\n class=\"d-flex flex-column overflow-hidden\"\n :style=\"{\n height: containerHeight,\n }\"\n >\n <top-bar :menus=\"menus\" :title=\"title\" />\n <v-snackbar\n v-model=\"showAlert\"\n absolute\n :color=\"alertType\"\n :timeout=\"3000\"\n class=\"apply-top\"\n :style=\"classificationStyles\"\n >\n <v-icon> mdi-{{ alertType }} </v-icon>\n {{ alertText }}\n <template #actions=\"{ attrs }\">\n <v-btn\n variant=\"text\"\n text=\"Close\"\n v-bind=\"attrs\"\n @click=\"showAlert = false\"\n />\n </template>\n </v-snackbar>\n <v-snackbar\n v-model=\"showEditingToast\"\n absolute\n class=\"apply-top\"\n :style=\"classificationStyles\"\n :timeout=\"-1\"\n color=\"orange\"\n >\n <v-icon> mdi-pencil-off </v-icon>\n {{ lockedBy }} is editing this script. Editor is in read-only mode\n <template #actions=\"{ attrs }\">\n <v-btn\n variant=\"text\"\n v-bind=\"attrs\"\n color=\"danger\"\n text=\"Unlock\"\n data-test=\"unlock-button\"\n @click=\"confirmLocalUnlock\"\n />\n <v-btn\n variant=\"text\"\n text=\"Dismiss\"\n v-bind=\"attrs\"\n @click=\"\n () => {\n showEditingToast = false\n }\n \"\n />\n </template>\n </v-snackbar>\n <div class=\"grid\">\n <div\n v-for=\"def in screens\"\n :id=\"screenId(def.id)\"\n :key=\"def.id\"\n ref=\"gridItem\"\n class=\"item\"\n >\n <div class=\"item-content\">\n <openc3-screen\n :target=\"def.target\"\n :screen=\"def.screen\"\n :definition=\"def.definition\"\n :keywords=\"screenKeywords\"\n :initial-floated=\"true\"\n :initial-top=\"def.top\"\n :initial-left=\"def.left\"\n :initial-z=\"3\"\n :min-z=\"3\"\n :fix-floated=\"true\"\n :count=\"def.count\"\n @close-screen=\"closeScreen(def.id)\"\n @delete-screen=\"closeScreen(def.id)\"\n />\n </div>\n </div>\n </div>\n <v-card class=\"flex-shrink-0\">\n <v-card-text>\n <suite-runner\n v-if=\"suiteRunner\"\n class=\"suite-runner\"\n :suite-map=\"suiteMap\"\n :disable-buttons=\"disableSuiteButtons\"\n :filename=\"fullFilename\"\n @button=\"suiteRunnerButton\"\n @loaded=\"doResize\"\n />\n <div id=\"sr-controls\">\n <v-row no-gutters justify=\"space-between\">\n <v-icon v-if=\"showDisconnect\" class=\"mt-2\" color=\"red\">\n mdi-connection\n </v-icon>\n <div class=\"d-flex align-center mr-1\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-if=\"!scriptId\"\n v-bind=\"props\"\n icon=\"mdi-cached\"\n variant=\"text\"\n density=\"compact\"\n :disabled=\"filename === NEW_FILENAME\"\n aria-label=\"Reload File\"\n @click=\"reloadFile\"\n />\n <v-btn\n v-else\n v-bind=\"props\"\n icon=\"mdi-arrow-left\"\n variant=\"text\"\n density=\"compact\"\n @click=\"backToNewScript\"\n />\n </template>\n <span v-if=\"!scriptId\"> Reload File </span>\n <span v-else> Back to New Script </span>\n </v-tooltip>\n </div>\n <v-tooltip\n location=\"bottom\"\n :text=\"filenameSelect\"\n :disabled=\"!filenameSelect || filenameSelect.length <= 45\"\n >\n <template #activator=\"{ props }\">\n <div v-bind=\"props\" style=\"width: 32rem\">\n <v-select\n id=\"filename\"\n v-model=\"filenameSelect\"\n :items=\"fileList\"\n :disabled=\"fileList.length <= 1\"\n label=\"Filename\"\n data-test=\"filename\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n @update:model-value=\"fileNameChanged\"\n />\n </div>\n </template>\n </v-tooltip>\n <v-text-field\n v-model=\"scriptId\"\n label=\"Script ID\"\n data-test=\"id\"\n class=\"shrink ml-2 script-state\"\n style=\"max-width: 100px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-text-field\n v-model=\"stateTimer\"\n label=\"Script State\"\n data-test=\"state\"\n :class=\"['shrink', 'ml-2', 'script-state', stateColorClass]\"\n style=\"max-width: 120px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-progress-circular\n v-if=\"state === 'Connecting...'\"\n :size=\"40\"\n class=\"mx-2\"\n indeterminate\n color=\"primary\"\n />\n <div v-else style=\"width: 40px; height: 40px\" class=\"mx-2\"></div>\n\n <v-spacer />\n <div v-if=\"startOrGoButton === 'Start'\">\n <v-tooltip\n v-if=\"overridesCount > 0\"\n :open-delay=\"600\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n class=\"mr-4\"\n icon\n variant=\"text\"\n density=\"compact\"\n data-test=\"tlm-override-button\"\n aria-label=\"TLM Overrides\"\n @click=\"showOverrides = !showOverrides\"\n >\n <v-badge\n :content=\"overridesCount > 99 ? '99+' : overridesCount\"\n floating\n color=\"primary\"\n >\n <v-icon icon=\"mdi-application-cog-outline\" />\n </v-badge>\n </v-btn>\n </template>\n <span> TLM Overrides ({{ overridesCount }}) </span>\n </v-tooltip>\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n class=\"mr-2\"\n icon\n variant=\"text\"\n density=\"compact\"\n :disabled=\"envDisabled\"\n data-test=\"env-button\"\n aria-label=\"Script Environment\"\n @click=\"scriptEnvironment.show = !scriptEnvironment.show\"\n >\n <v-badge v-model=\"environmentModified\" floating dot>\n <v-icon icon=\"mdi-application-variable\" />\n </v-badge>\n </v-btn>\n </template>\n <span>\n Script Environment\n <template v-if=\"environmentModified\"> (modified) </template>\n </span>\n </v-tooltip>\n <v-btn\n class=\"mx-1\"\n color=\"primary\"\n text=\"Start\"\n data-test=\"start-button\"\n :disabled=\"startOrGoDisabled || !executeUser\"\n :hidden=\"suiteRunner\"\n @click=\"startHandler\"\n />\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n text=\"Go\"\n :disabled=\"startOrGoDisabled\"\n data-test=\"go-button\"\n @click=\"go\"\n />\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :text=\"pauseOrRetryButton\"\n :disabled=\"pauseOrRetryDisabled\"\n data-test=\"pause-retry-button\"\n @click=\"pauseOrRetry\"\n />\n <v-btn\n color=\"primary\"\n text=\"Stop\"\n data-test=\"stop-button\"\n :disabled=\"stopDisabled\"\n @click=\"stop\"\n />\n </div>\n </v-row>\n </div>\n </v-card-text>\n </v-card>\n <splitpanes\n horizontal\n class=\"flex-grow-1 overflow-hidden\"\n @resize=\"({ prevPane }) => (editorBoxSize = prevPane.size)\"\n >\n <pane class=\"editorbox\" :size=\"editorBoxSize\">\n <v-snackbar\n v-model=\"showSave\"\n absolute\n location=\"right\"\n :timeout=\"-1\"\n class=\"saving apply-top\"\n :style=\"classificationStyles\"\n >\n Saving...\n </v-snackbar>\n <pre\n ref=\"editor\"\n class=\"editor\"\n @contextmenu.prevent=\"showExecuteSelectionMenu\"\n ></pre>\n <v-menu v-model=\"executeSelectionMenu\" :target=\"[menuX, menuY]\">\n <v-list>\n <v-list-item\n :title=\"currentLineHasCommand ? 'Edit Command' : 'Insert Command'\"\n @click=\"openCommandEditor\"\n />\n <v-divider />\n <v-list-item title=\"Execute Selection\" @click=\"executeSelection\" />\n <v-list-item\n v-if=\"scriptId\"\n title=\"Goto Line\"\n @click=\"runFromCursor\"\n />\n <v-list-item\n v-if=\"!scriptId\"\n title=\"Run From Line\"\n @click=\"runFromCursor\"\n />\n <v-list-item\n v-if=\"!scriptId\"\n title=\"Clear Local Breakpoints\"\n @click=\"clearBreakpoints\"\n />\n <v-divider />\n <v-list-item\n title=\"Toggle Vim mode\"\n prepend-icon=\"extras:vim\"\n @click=\"toggleVimMode\"\n />\n </v-list>\n </v-menu>\n </pane>\n <pane id=\"messages\" class=\"mt-2\" :size=\"100 - editorBoxSize\">\n <div v-if=\"showDebug\" id=\"debug\" class=\"pa-0\">\n <v-row no-gutters>\n <v-btn\n color=\"primary\"\n style=\"width: 100px\"\n class=\"mr-4\"\n text=\"Step\"\n append-icon=\"mdi-step-forward\"\n :disabled=\"!scriptId\"\n data-test=\"step-button\"\n @click=\"step\"\n />\n <v-text-field\n ref=\"debug\"\n v-model=\"debug\"\n class=\"mb-2\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n label=\"Debug\"\n data-test=\"debug-text\"\n @keydown=\"debugKeydown\"\n />\n </v-row>\n </div>\n <script-log-messages\n id=\"log-messages\"\n v-model=\"messages\"\n @sort=\"messageSortOrder\"\n />\n </pane>\n </splitpanes>\n </div>\n\n <div\n v-else\n style=\"\n background-color: var(--color-background-base-default);\n margin: 0px;\n padding: 0px;\n \"\n >\n <v-row no-gutters justify=\"right\">\n <v-tabs v-model=\"inlineTab\" density=\"compact\">\n <v-tab value=\"script\" text=\"Script\" data-test=\"script-tab\" />\n <v-tab value=\"messages\" text=\"Messages\" data-test=\"messages-tab\" />\n </v-tabs>\n <v-tooltip\n location=\"bottom\"\n :text=\"filenameSelect\"\n :disabled=\"!filenameSelect || filenameSelect.length <= 45\"\n >\n <template #activator=\"{ props }\">\n <div v-bind=\"props\" style=\"width: 32rem\">\n <v-select\n id=\"inline-filename\"\n v-model=\"filenameSelect\"\n :items=\"fileList\"\n :disabled=\"fileList.length <= 1\"\n label=\"Filename\"\n data-test=\"filename\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n @update:model-value=\"fileNameChanged\"\n />\n </div>\n </template>\n </v-tooltip>\n <v-text-field\n v-model=\"scriptId\"\n label=\"Script ID\"\n data-test=\"id\"\n class=\"shrink ml-2 script-state\"\n style=\"max-width: 100px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-text-field\n v-model=\"stateTimer\"\n label=\"Script State\"\n data-test=\"state\"\n :class=\"['shrink', 'ml-2', 'script-state', stateColorClass]\"\n style=\"max-width: 120px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-progress-circular\n v-if=\"state === 'Connecting...'\"\n :size=\"40\"\n class=\"mx-2\"\n indeterminate\n color=\"primary\"\n />\n </v-row>\n <v-tabs-window v-model=\"inlineTab\">\n <v-tabs-window-item value=\"script\">\n <v-row>\n <v-col\n class=\"v-col-10\"\n style=\"margin: 15px 0px 0px 0px; padding: 0px\"\n >\n <pre\n ref=\"editor\"\n class=\"editor\"\n style=\"height: 200px\"\n @contextmenu.prevent=\"showExecuteSelectionMenu\"\n ></pre>\n </v-col>\n <v-col\n class=\"v-col-2\"\n style=\"\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: var(--color-background-surface-default);\n \"\n >\n <div v-if=\"startOrGoButton === 'Start'\">\n <v-btn\n class=\"mx-1\"\n color=\"primary\"\n text=\"Start\"\n data-test=\"start-button\"\n :disabled=\"startOrGoDisabled || !executeUser\"\n :hidden=\"suiteRunner\"\n @click=\"startHandler\"\n />\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n text=\"Go\"\n :disabled=\"startOrGoDisabled\"\n data-test=\"go-button\"\n @click=\"go\"\n />\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n :text=\"pauseOrRetryButton\"\n :disabled=\"pauseOrRetryDisabled\"\n data-test=\"pause-retry-button\"\n @click=\"pauseOrRetry\"\n />\n\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n text=\"Stop\"\n data-test=\"stop-button\"\n :disabled=\"stopDisabled\"\n @click=\"stop\"\n />\n </div>\n </v-col>\n </v-row>\n </v-tabs-window-item>\n\n <v-tabs-window-item value=\"messages\">\n <div style=\"height: 200px; overflow: hidden\">\n <script-log-messages\n v-model=\"messages\"\n :newest-on-top=\"messagesNewestOnTop\"\n @message-order-changed=\"messageOrderChanged\"\n />\n </div>\n </v-tabs-window-item>\n </v-tabs-window>\n </div>\n\n <file-open-save-dialog\n v-if=\"fileOpen\"\n v-model=\"fileOpen\"\n type=\"open\"\n api-url=\"/script-api/scripts\"\n @file=\"setFile($event)\"\n @error=\"setError($event)\"\n @clear-temp=\"clearTemp($event)\"\n />\n <file-open-save-dialog\n v-if=\"showSaveAs\"\n v-model=\"showSaveAs\"\n type=\"save\"\n api-url=\"/script-api/scripts\"\n require-target-parent-dir\n :input-filename=\"filenameOrBlank\"\n @filename=\"saveAsFilename($event)\"\n @error=\"setError($event)\"\n @clear-temp=\"clearTemp($event)\"\n />\n <environment-dialog v-if=\"showEnvironment\" v-model=\"showEnvironment\" />\n <ask-dialog\n v-if=\"ask.show\"\n v-model=\"ask.show\"\n :question=\"ask.question\"\n :default=\"ask.default\"\n :password=\"ask.password\"\n :answer-required=\"ask.answerRequired\"\n @response=\"ask.callback\"\n />\n <file-dialog\n v-if=\"file.show\"\n v-model=\"file.show\"\n :title=\"file.title\"\n :message=\"file.message\"\n :multiple=\"file.multiple\"\n :filter=\"file.filter\"\n @response=\"fileDialogCallback\"\n />\n <information-dialog\n v-if=\"information.show\"\n v-model=\"information.show\"\n :title=\"information.title\"\n :text=\"information.text\"\n :width=\"information.width\"\n />\n <event-list-dialog\n v-if=\"inputMetadata.show\"\n v-model=\"inputMetadata.show\"\n :events=\"inputMetadata.events\"\n :time-zone=\"timeZone\"\n new-metadata\n @close=\"inputMetadata.callback\"\n />\n <overrides-dialog v-if=\"showOverrides\" v-model=\"showOverrides\" />\n <prompt-dialog\n v-if=\"prompt.show\"\n v-model=\"prompt.show\"\n :title=\"prompt.title\"\n :subtitle=\"prompt.subtitle\"\n :message=\"prompt.message\"\n :details=\"prompt.details\"\n :buttons=\"prompt.buttons\"\n :layout=\"prompt.layout\"\n :multiple=\"prompt.multiple\"\n @response=\"prompt.callback\"\n />\n <results-dialog\n v-if=\"results.show\"\n v-model=\"results.show\"\n :text=\"results.text\"\n />\n <script-environment-dialog\n v-if=\"scriptEnvironment.show\"\n v-model=\"scriptEnvironment.show\"\n :input-environment=\"scriptEnvironment.env\"\n @environment=\"environmentHandler\"\n />\n <simple-text-dialog\n v-model=\"showSuiteError\"\n title=\"Suite Analysis Error\"\n :text=\"suiteError\"\n :width=\"1000\"\n />\n <critical-cmd-dialog\n v-model=\"displayCriticalCmd\"\n :uuid=\"criticalCmdUuid\"\n :cmd-string=\"criticalCmdString\"\n :cmd-user=\"criticalCmdUser\"\n :persistent=\"true\"\n @status=\"promptDialogCallback\"\n />\n <!-- Command Editor Dialog -->\n <v-dialog\n v-model=\"commandEditor.show\"\n max-width=\"1200\"\n persistent\n scrollable\n @keydown.esc=\"closeCommandDialog\"\n >\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n <span>Insert Command</span>\n <v-spacer />\n <v-btn icon=\"mdi-close\" variant=\"text\" @click=\"closeCommandDialog\" />\n </v-card-title>\n <v-card-text class=\"pa-0\">\n <div v-if=\"commandEditor.dialogError\" class=\"error-message\">\n <v-icon class=\"mr-2\" color=\"error\">mdi-alert-circle</v-icon>\n <span class=\"flex-grow-1\">{{ commandEditor.dialogError }}</span>\n <v-btn\n icon=\"mdi-close\"\n size=\"small\"\n variant=\"text\"\n color=\"error\"\n class=\"ml-2\"\n @click=\"commandEditor.dialogError = null\"\n />\n </div>\n <command-editor\n ref=\"commandEditor\"\n :initial-target-name=\"commandEditor.targetName\"\n :initial-packet-name=\"commandEditor.packetName\"\n :cmd-string=\"commandEditor.cmdString\"\n :send-disabled=\"false\"\n :show-command-button=\"false\"\n @build-cmd=\"insertCommand($event)\"\n />\n </v-card-text>\n <v-card-actions>\n <v-spacer />\n <v-btn variant=\"outlined\" @click=\"closeCommandDialog\"> Cancel </v-btn>\n <v-btn color=\"primary\" variant=\"flat\" @click=\"insertCommand()\">\n Insert Command\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n <v-bottom-sheet v-model=\"showScripts\">\n <v-sheet class=\"pb-11 pt-5 px-5\">\n <running-scripts\n v-if=\"showScripts\"\n :connect-in-new-tab=\"!!fileModified\"\n @disconnect=\"scriptDisconnect\"\n @close=\"\n () => {\n showScripts = false\n }\n \"\n />\n </v-sheet>\n </v-bottom-sheet>\n</template>\n\n<script>\nimport axios from 'axios'\nimport { format } from 'date-fns'\nimport { Splitpanes, Pane } from 'splitpanes'\nimport 'splitpanes/dist/splitpanes.css'\n\nimport { Api, Cable, OpenC3Api } from '@openc3/js-common/services'\nimport { useContainerHeight } from '@/composables/useContainerHeight'\nimport {\n AceEditorModes,\n AceEditorUtils,\n CriticalCmdDialog,\n EnvironmentDialog,\n FileOpenSaveDialog,\n Openc3Screen,\n SimpleTextDialog,\n TopBar,\n} from '@/components'\nimport { ClassificationBanners } from '@/tools/base'\nimport { fileIcon } from '@/util'\nimport { EventListDialog } from '@/tools/calendar'\n\nimport AskDialog from '@/tools/scriptrunner/Dialogs/AskDialog.vue'\nimport FileDialog from '@/tools/scriptrunner/Dialogs/FileDialog.vue'\nimport InformationDialog from '@/tools/scriptrunner/Dialogs/InformationDialog.vue'\nimport OverridesDialog from '@/tools/scriptrunner/Dialogs/OverridesDialog.vue'\nimport PromptDialog from '@/tools/scriptrunner/Dialogs/PromptDialog.vue'\nimport ResultsDialog from '@/tools/scriptrunner/Dialogs/ResultsDialog.vue'\nimport ScriptEnvironmentDialog from '@/tools/scriptrunner/Dialogs/ScriptEnvironmentDialog.vue'\nimport CommandEditor from '@/components/CommandEditor.vue'\nimport SuiteRunner from '@/tools/scriptrunner/SuiteRunner.vue'\nimport ScriptLogMessages from '@/tools/scriptrunner/ScriptLogMessages.vue'\nimport {\n CmdCompleter,\n TlmCompleter,\n MnemonicChecker,\n} from '@/tools/scriptrunner/autocomplete'\nimport { SleepAnnotator } from '@/tools/scriptrunner/annotations'\nimport RunningScripts from '@/tools/scriptrunner/RunningScripts.vue'\n\n// Matches target_file.rb TEMP_FOLDER\nconst TEMP_FOLDER = '__TEMP__'\nconst NEW_FILENAME = '<Untitled>'\nconst START = 'Start'\nconst GO = 'Go'\nconst PAUSE = 'Pause'\nconst RETRY = 'Retry'\n\nexport default {\n components: {\n FileOpenSaveDialog,\n Openc3Screen,\n EnvironmentDialog,\n Splitpanes,\n Pane,\n TopBar,\n AskDialog,\n FileDialog,\n InformationDialog,\n EventListDialog,\n OverridesDialog,\n PromptDialog,\n ResultsDialog,\n ScriptEnvironmentDialog,\n SimpleTextDialog,\n SuiteRunner,\n RunningScripts,\n ScriptLogMessages,\n CriticalCmdDialog,\n CommandEditor,\n },\n mixins: [AceEditorModes, ClassificationBanners],\n beforeRouteUpdate: function (to, from, next) {\n if (to.params.id) {\n this.tryLoadRunningScript(to.params.id).then(next)\n } else {\n next()\n }\n },\n props: {\n inline: {\n type: Boolean,\n default: false,\n },\n body: {\n type: String,\n default: null,\n },\n // Optional filename to use when running inline scripts\n // This allows relative path resolution to work correctly\n initialFilename: {\n type: String,\n default: null,\n },\n },\n emits: ['alert', 'script-id'],\n setup() {\n const containerHeight = useContainerHeight()\n\n return { containerHeight }\n },\n data() {\n return {\n title: 'Script Runner',\n suiteRunner: false, // Whether to display the SuiteRunner GUI\n disableSuiteButtons: false,\n suiteMap: {\n // Useful for testing the various options in the SuiteRunner GUI\n // Suite: {\n // teardown: true,\n // groups: {\n // Group: {\n // setup: true,\n // cases: ['case1', 'case2', 'really_long_test_case_name3'],\n // },\n // ReallyLongGroupName: {\n // cases: ['case1', 'case2', 'case3'],\n // },\n // },\n // },\n },\n filenameSelect: null,\n currentFilename: null, // This is the currently shown filename while running\n showSave: false,\n showAlert: false,\n alertType: null,\n alertText: '',\n state: null,\n scriptId: null,\n startOrGoButton: START,\n startOrGoDisabled: false,\n envDisabled: false,\n pauseOrRetryButton: PAUSE,\n pauseOrRetryDisabled: false,\n stopDisabled: false,\n showEnvironment: false,\n showDebug: false,\n debug: '',\n debugHistory: [],\n debugHistoryIndex: 0,\n showDisconnect: false,\n files: {},\n breakpoints: {},\n enableStackTraces: false,\n filename: NEW_FILENAME,\n readOnlyUser: false,\n executeUser: true,\n saveAllowed: true,\n tempFilename: null,\n fileModified: '',\n fileOpen: false,\n lockedBy: null,\n showEditingToast: false,\n showSaveAs: false,\n areYouSure: false,\n subscription: null,\n cable: null,\n fatal: false,\n updateInterval: null,\n receivedEvents: [],\n messages: [],\n messagesNewestOnTop: true,\n inlineTab: 'script',\n maxArrayLength: 200,\n Range: ace.require('ace/range').Range,\n ask: {\n show: false,\n question: '',\n default: null,\n password: false,\n answerRequired: true,\n callback: () => {},\n },\n file: {\n show: false,\n message: '',\n directory: null,\n filter: '*',\n multiple: false,\n callback: () => {},\n },\n prompt: {\n show: false,\n title: '',\n subtitle: '',\n message: '',\n details: '',\n buttons: null,\n layout: 'horizontal',\n callback: () => {},\n },\n information: {\n show: false,\n title: '',\n text: [],\n width: '600',\n },\n inputMetadata: {\n show: false,\n events: [],\n callback: () => {},\n },\n results: {\n show: false,\n text: '',\n },\n scriptEnvironment: {\n show: false,\n env: [],\n },\n showSuiteError: false,\n suiteError: '',\n executeSelectionMenu: false,\n menuX: 0,\n menuY: 0,\n mnemonicChecker: new MnemonicChecker(),\n showScripts: false,\n showOverrides: false,\n overridesCount: 0,\n commandEditor: {\n show: false,\n targetName: null,\n commandName: null,\n dialogError: null,\n cmdString: null,\n isEditing: false,\n editLine: null,\n },\n currentLineHasCommand: false,\n activePromptId: '',\n api: null,\n timeZone: 'local',\n screens: [],\n screenKeywords: null,\n idCounter: 0,\n updateCounter: 0,\n recent: [],\n waitingInterval: null,\n waitingTime: 0,\n waitingStart: 0,\n criticalCmdUuid: null,\n criticalCmdString: null,\n criticalCmdUser: null,\n displayCriticalCmd: false,\n editorBoxSize: 50,\n }\n },\n computed: {\n stateTimer: function () {\n if (this.state === 'waiting' || this.state === 'paused') {\n return `${this.state} ${this.waitingTime}s`\n }\n // Map completed_errors to completed for display\n // it will be colored via the stateColorClass\n if (this.state === 'completed_errors') {\n return 'completed'\n }\n return this.state\n },\n stateColorClass: function () {\n // All possible states: spawning, init, running, paused, waiting, breakpoint,\n // error, crashed, stopped, completed, completed_errors, killed\n if (\n this.state === 'error' ||\n this.state === 'crashed' ||\n this.state === 'killed'\n ) {\n return 'script-state-red'\n } else if (this.state === 'completed_errors') {\n return 'script-state-orange'\n } else if (this.state === 'completed') {\n return 'script-state-green'\n } else {\n return ''\n }\n },\n // This is the list of files shown in the select dropdown\n fileList: function () {\n // this.files is the list of all files seen while running\n const filenames = Object.keys(this.files)\n filenames.push(this.fullFilename) // Make sure the currently shown filename is last\n return [...new Set(filenames)] // ensure unique\n },\n environmentModified: function () {\n return this.scriptEnvironment.env.length > 0\n },\n isLocked: function () {\n return !!this.lockedBy\n },\n // Returns the currently shown filename\n fullFilename: function () {\n if (this.currentFilename) return this.currentFilename\n // New filenames should not indicate modified\n if (this.filename === NEW_FILENAME) return NEW_FILENAME\n return `${this.filename} ${this.fileModified}`.trim()\n },\n // It's annoying for people (and tests) to clear the <Untitled>\n // when saving a new file so replace with blank\n // This makes sure that string doesn't show up in the dialog\n filenameOrBlank: function () {\n return this.filename === NEW_FILENAME ? '' : this.filename\n },\n menus: function () {\n return [\n {\n label: 'File',\n items: [\n {\n label: 'New File',\n icon: 'mdi-file-plus',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.newFileWithConfirm()\n },\n },\n {\n label: 'New Suite',\n icon: 'mdi-file-document-plus',\n disabled: this.scriptId || this.readOnlyUser,\n subMenu: [\n {\n label: 'Ruby',\n icon: 'mdi-language-ruby',\n command: () => {\n this.newRubyTestSuite()\n },\n },\n {\n label: 'Python',\n icon: 'mdi-language-python',\n command: () => {\n this.newPythonTestSuite()\n },\n },\n ],\n },\n {\n label: 'Open File',\n icon: 'mdi-folder-open',\n disabled: this.scriptId,\n command: () => {\n this.openFileWithConfirm()\n },\n },\n {\n label: 'Open Recent',\n icon: 'mdi-folder-open',\n disabled: this.scriptId,\n subMenu: this.recent,\n },\n {\n divider: true,\n },\n {\n label: 'Save File',\n icon: 'mdi-content-save',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.saveFile()\n },\n },\n {\n label: 'Save As...',\n icon: 'mdi-content-save',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.saveAs()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Download',\n icon: 'mdi-cloud-download',\n disabled: this.scriptId,\n command: () => {\n this.download()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Delete File',\n icon: 'mdi-delete',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.delete()\n },\n },\n ],\n },\n {\n label: 'Edit',\n items: [\n {\n label: 'Find',\n icon: 'mdi-magnify',\n command: () => {\n this.editor.execCommand('find')\n },\n },\n {\n label: 'Replace',\n icon: 'mdi-find-replace',\n disabled: this.scriptId,\n command: () => {\n this.editor.execCommand('replace')\n },\n },\n {\n label: 'Set Line Delay',\n icon: 'mdi-invoice-text-clock',\n disabled: this.scriptId,\n command: () => {\n this.$dialog.open({\n title: 'Info',\n text:\n 'You can set the line delay in seconds using the api method set_line_delay().<br/><br/>' +\n 'The default line delay is 0.1 seconds between lines. ' +\n 'Adding set_line_delay(0) to the top of your script will execute the script at maximum speed. ' +\n 'However, this can make it difficult to see and pause the script. ' +\n 'Executing set_line_delay(1) will cause a 1 second delay between lines.',\n okText: 'OK',\n okClass: 'primary',\n validateText: null,\n cancelText: null,\n html: true,\n })\n },\n },\n ],\n },\n {\n label: 'Script',\n items: [\n {\n label: 'Execution Status',\n icon: 'mdi-run',\n command: () => {\n this.showScripts = true\n },\n },\n {\n divider: true,\n },\n {\n label: 'Global Environment',\n icon: 'mdi-library',\n disabled: this.scriptId,\n command: () => {\n this.showEnvironment = !this.showEnvironment\n },\n },\n {\n label: 'Metadata',\n icon: 'mdi-calendar',\n disabled: this.scriptId,\n command: () => {\n this.inputMetadata.callback = () => {}\n this.showMetadata()\n },\n },\n {\n label: 'Overrides',\n icon: 'mdi-swap-horizontal',\n command: () => {\n this.showOverrides = true\n },\n },\n {\n divider: true,\n },\n {\n label: 'Syntax Check',\n icon: 'mdi-file-check',\n disabled: this.scriptId,\n command: () => {\n this.syntaxCheck()\n },\n },\n {\n label: 'Mnemonic Check',\n icon: 'mdi-spellcheck',\n disabled: this.scriptId,\n command: () => {\n this.checkMnemonics()\n },\n },\n {\n label: 'Instrumented Script',\n icon: 'mdi-code-braces-box',\n disabled: this.scriptId,\n command: () => {\n this.showInstrumented()\n },\n },\n {\n label: 'Call Stack',\n icon: 'mdi-format-list-numbered',\n disabled: !this.scriptId,\n command: () => {\n this.showCallStack()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Toggle Debug',\n icon: 'mdi-bug',\n command: () => {\n this.toggleDebug()\n },\n },\n {\n label: 'Toggle Disconnect',\n icon: 'mdi-connection',\n disabled: this.scriptId,\n command: () => {\n this.toggleDisconnect()\n },\n },\n {\n label: 'Enable Stack Traces',\n checkbox: true,\n checked: this.enableStackTraces,\n disabled: this.scriptId,\n command: () => {\n // Toggling the checkbox closes the menu so no need\n // to check state, just toggle existing value\n this.enableStackTraces = !this.enableStackTraces\n },\n },\n {\n divider: true,\n },\n {\n label: 'Delete All Breakpoints',\n icon: 'mdi-delete-circle-outline',\n disabled: this.scriptId,\n command: () => {\n this.deleteAllBreakpoints()\n },\n },\n ],\n },\n ]\n },\n },\n watch: {\n isLocked: function (val) {\n this.showEditingToast = val\n if (!this.suiteRunner) {\n this.startOrGoDisabled = val\n }\n if (this.readOnlyUser == false && val == false && !this.inline) {\n this.editor.setReadOnly(val)\n } else {\n this.editor.setReadOnly(true)\n }\n },\n fullFilename: function (filename) {\n this.filenameSelect = filename\n if (!this.inline) {\n if (filename === NEW_FILENAME) {\n localStorage.removeItem('script_runner__filename')\n } else {\n localStorage['script_runner__filename'] = filename\n }\n }\n },\n readOnlyUser: function (val) {\n if (this.editor) {\n if (val) {\n this.editor.setReadOnly(true)\n this.editor.renderer.$cursorLayer.element.style.display = 'none'\n } else {\n if (!this.inline) {\n this.editor.setReadOnly(false)\n }\n this.editor.renderer.$cursorLayer.element.style.display = null\n }\n }\n },\n showOverrides: function (newVal, oldVal) {\n if (oldVal && !newVal) {\n this.updateOverridesCount()\n }\n },\n },\n created: async function () {\n // Ensure Offline Access Is Setup For the Current User\n this.api = new OpenC3Api()\n this.api.ensure_offline_access()\n this.api\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch((error) => {\n // Do nothing\n })\n\n this.updateOverridesCount()\n\n // Make NEW_FILENAME available to the template\n this.NEW_FILENAME = NEW_FILENAME\n\n let user = OpenC3Auth.user()\n let roles = OpenC3Auth.userroles()\n this.readOnlyUser = true\n this.executeUser = false\n for (let role of roles) {\n if (role == 'viewer') {\n continue\n }\n if (role == 'admin' || role == 'operator') {\n this.readOnlyUser = false\n this.executeUser = true\n } else if (role == 'runner') {\n this.executeUser = true\n } else {\n await Api.get(`/openc3-api/roles/${role}`).then((response) => {\n if (\n response.data !== null &&\n response.data.permissions !== undefined\n ) {\n if (\n response.data.permissions.some(\n (i) => i.permission == 'script_edit',\n )\n ) {\n this.readOnlyUser = false\n }\n if (\n response.data.permissions.some(\n (i) => i.permission == 'script_run',\n )\n ) {\n this.executeUser = true\n }\n }\n })\n }\n }\n // Output the userinfo for use in the SuiteRunner component\n if (!this.inline) {\n localStorage['script_runner__userinfo'] = JSON.stringify({\n name: user['preferred_username'],\n readOnly: this.readOnlyUser,\n execute: this.executeUser,\n })\n }\n if (this.readOnlyUser == true) {\n this.alertType = 'info'\n let text = `User ${user['preferred_username']} is read only`\n if (this.executeUser) {\n text += ' but can execute scripts'\n }\n this.alertText = text\n this.showAlert = true\n }\n\n Api.get('/openc3-api/autocomplete/keywords/screen').then((response) => {\n this.screenKeywords = response.data\n })\n\n if (this.inline) {\n this.readOnly = true\n }\n },\n mounted: async function () {\n this.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n const RubyMode = this.buildRubyMode()\n const PythonMode = this.buildPythonMode()\n this.rubyMode = new RubyMode()\n this.pythonMode = new PythonMode()\n const language = AceEditorUtils.getDefaultScriptingLanguage()\n if (language === 'python') {\n this.editor.session.setMode(this.pythonMode)\n } else {\n this.editor.session.setMode(this.rubyMode)\n }\n this.editor.session.setTabSize(2)\n this.editor.session.setUseWrapMode(true)\n this.editor.$blockScrolling = Infinity\n this.editor.setOption('enableBasicAutocompletion', true)\n this.editor.setOption('enableLiveAutocompletion', true)\n this.editor.completers = [new CmdCompleter(), new TlmCompleter()]\n this.editor.setHighlightActiveLine(false)\n AceEditorUtils.applyVimModeIfEnabled(this.editor, { saveFn: this.saveFile })\n this.editor.focus()\n\n this.editor.on('guttermousedown', this.toggleBreakpoint)\n // We listen to tokenizerUpdate rather than change because this\n // is the background process that updates as changes are processed\n // while change fires immediately before the UndoManager is updated.\n this.editor.session.on('tokenizerUpdate', this.onChange)\n if (this.readOnlyUser || this.inline) {\n this.editor.setReadOnly(true)\n this.editor.renderer.$cursorLayer.element.style.display = 'none'\n }\n\n const sleepAnnotator = new SleepAnnotator(this.editor)\n this.editor.session.on('change', ($event, session) => {\n sleepAnnotator.annotate($event, session)\n this.updateBreakpoints($event, session)\n })\n\n this.editor.container.addEventListener('resize', this.doResize)\n this.editor.container.addEventListener('keydown', this.keydown)\n\n this.cable = new Cable('/script-api/cable')\n\n if (!this.inline && localStorage['script_runner__recent']) {\n this.recent = JSON.parse(localStorage['script_runner__recent'])\n // Rebuild the command since that doesn't get stringified\n this.recent = this.recent.map((item) => ({\n ...item,\n command: async (event) => {\n this.filename = event.label\n await this.reloadFile()\n },\n }))\n }\n if (!this.inline) {\n if (this.$route.query?.file) {\n this.filename = this.$route.query.file\n await this.reloadFile()\n } else if (this.$route.params?.id) {\n await this.tryLoadRunningScript(this.$route.params.id)\n } else {\n this.scriptId = sessionStorage.getItem('script_runner__script_id')\n if (this.scriptId) {\n await this.tryLoadRunningScript(this.scriptId)\n } else if (localStorage['script_runner__filename']) {\n this.filename = localStorage['script_runner__filename']\n await this.reloadFile(false)\n }\n }\n } else {\n if (this.body) {\n this.editor.setValue(this.body)\n this.editor.clearSelection()\n // If initialFilename is provided, use it for path resolution\n if (this.initialFilename) {\n this.filename = this.initialFilename\n }\n }\n }\n this.updateInterval = setInterval(async () => {\n this.processReceived()\n }, 100) // Every 100ms\n },\n beforeUnmount() {\n if (this.scriptId && !this.inline) {\n sessionStorage.setItem('script_runner__script_id', this.scriptId)\n }\n this.editor.destroy()\n this.editor.container.remove()\n },\n unmounted() {\n this.unlockFile()\n if (this.updateInterval != null) {\n clearInterval(this.updateInterval)\n }\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n this.cable.disconnect()\n },\n methods: {\n updateOverridesCount: function () {\n this.api.get_overrides().then((result) => {\n this.overridesCount = result.length\n })\n },\n toggleVimMode() {\n AceEditorUtils.toggleVimMode(this.editor)\n },\n openCommandEditor() {\n this.executeSelectionMenu = false\n const position = this.editor.getCursorPosition()\n const line = this.editor.session.getLine(position.row)\n\n if (this.currentLineHasCommand) {\n // Extract and parse the command from the line\n const cmdString = this.parseCommandFromLine(line)\n this.commandEditor.cmdString = cmdString\n this.commandEditor.isEditing = true\n this.commandEditor.editLine = position.row\n } else {\n // Inserting a new command\n this.commandEditor.cmdString = null\n this.commandEditor.isEditing = false\n this.commandEditor.editLine = null\n }\n this.commandEditor.show = true\n this.commandEditor.dialogError = null\n },\n insertCommand(event) {\n let commandString = ''\n try {\n commandString = this.$refs.commandEditor.getCmdString()\n let parts = commandString.split(' ')\n this.commandEditor.targetName = parts[0]\n this.commandEditor.commandName = parts[1]\n } catch (error) {\n this.commandEditor.dialogError =\n error.message || 'Please fix command parameters'\n return\n }\n\n if (\n this.commandEditor.isEditing &&\n this.commandEditor.editLine !== null\n ) {\n // Replace the existing line\n const line = this.editor.session.getLine(this.commandEditor.editLine)\n const indent = line.match(/^\\s*/)[0] // Preserve indentation\n // Extract trailing comment if present\n const commentMatch = line.match(/\\s+#.*$/)\n const trailingComment = commentMatch ? commentMatch[0] : ''\n const newLine = `${indent}cmd(\"${commandString}\")${trailingComment}`\n const Range = this.Range\n this.editor.session.replace(\n new Range(\n this.commandEditor.editLine,\n 0,\n this.commandEditor.editLine,\n line.length,\n ),\n newLine,\n )\n } else {\n // Insert a new command at the cursor position\n const position = this.editor.getCursorPosition()\n this.editor.session.insert(position, `cmd(\"${commandString}\")\\n`)\n }\n\n this.fileModified = true\n this.commandEditor.show = false\n },\n closeCommandDialog: function () {\n this.commandEditor.show = false\n },\n doResize() {\n this.editor.resize()\n },\n scriptDisconnect() {\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n this.receivedEvents.length = 0 // Clear any unprocessed events\n },\n showMetadata() {\n Api.get('/openc3-api/metadata').then((response) => {\n // TODO: This is how Calendar creates new metadata items via makeMetadataEvent\n this.inputMetadata.events = response.data.map((event) => {\n return {\n name: 'Metadata',\n start: new Date(event.start * 1000),\n end: new Date(event.start * 1000),\n color: event.color,\n type: event.type,\n timed: true,\n metadata: event,\n }\n })\n this.inputMetadata.show = true\n })\n },\n messageSortOrder(order) {\n // See ScriptLogMessages for these strings\n if (order === 'Newest on Top' && this.messagesNewestOnTop === false) {\n this.messagesNewestOnTop = true\n this.messages.reverse()\n } else if (\n order === 'Newest on Bottom' &&\n this.messagesNewestOnTop === true\n ) {\n this.messagesNewestOnTop = false\n this.messages.reverse()\n }\n },\n // This only gets called when the user changes the filename dropdown\n // Or when a user hits Go\n fileNameChanged(filename) {\n // Split off the '*' which indicates modified\n filename = filename.split('*')[0]\n this.editor.setValue(this.files[filename].content)\n this.restoreBreakpoints(filename)\n this.editor.clearSelection()\n this.removeAllMarkers()\n this.editor.session.addMarker(\n new this.Range(\n this.files[filename].lineNo - 1,\n 0,\n this.files[filename].lineNo - 1,\n 1,\n ),\n `${this.state}Marker`,\n 'fullLine',\n )\n this.editor.gotoLine(this.files[filename].lineNo)\n },\n tryLoadRunningScript: function (id) {\n return Api.get(`/script-api/running-script/${id}`)\n .then((response) => {\n if (response.data) {\n let state = response.data.state\n // Check for all the completed states, see is_complete in script_status_model\n if (\n state !== 'completed' &&\n state !== 'completed_errors' &&\n state !== 'stopped' &&\n state !== 'crashed' &&\n state !== 'killed'\n ) {\n this.filename = response.data.filename\n this.tryLoadSuites(response)\n this.initScriptStart()\n this.scriptStart(id)\n } else {\n this.$notify.caution({\n title: `Script ${id} has already completed`,\n body: 'Check the Completed Scripts below ...',\n })\n this.scriptComplete()\n this.showScripts = true\n }\n } else {\n throw new Error(`Unable to load state for running script ${id}`) // Get into the following catch block because this should be handled the same as an error like 404\n }\n })\n .catch((error) => {\n // TODO: This is appearing on the main page which is blurred from the presence of the bottom sheet\n // We should probably not allow the bottom sheet to blur the screen\n this.$notify.caution({\n title: `Running Script ${id} not found`,\n body: 'Check the Completed Scripts below ...',\n })\n this.scriptComplete()\n this.showScripts = true\n })\n },\n tryLoadSuites: function (response) {\n if (response.data.suites) {\n this.startOrGoDisabled = true\n this.suiteRunner = true\n this.suiteMap = JSON.parse(response.data.suites)\n }\n this.doResize()\n },\n showExecuteSelectionMenu: function ($event) {\n this.menuX = $event.pageX\n this.menuY = $event.pageY\n // Check if the current line contains a command\n const position = this.editor.getCursorPosition()\n const line = this.editor.session.getLine(position.row)\n this.currentLineHasCommand = this.isCommandLine(line)\n this.executeSelectionMenu = true\n },\n isCommandLine: function (line) {\n // Check if line contains cmd() or cmd_no_hazardous_check() or similar command patterns\n const trimmedLine = line.trim()\n // Match patterns like: cmd(\"...\", cmd_no_hazardous_check(\"...\", cmd_raw(\"...\", etc.\n return /^\\s*cmd(_\\w+)?\\s*\\(/.test(trimmedLine)\n },\n parseCommandFromLine: function (line) {\n // Extract the command string from patterns like: cmd(\"TARGET COMMAND with PARAM value\")\n const match = line.match(/cmd(_\\w+)?\\s*\\(\\s*[\"'](.+?)[\"']\\s*\\)/)\n if (match) {\n return match[2] // Return the command string\n }\n return null\n },\n runFromCursor: function () {\n const start_row = this.editor.getCursorPosition().row + 1\n if (!this.scriptId) {\n this.start(null, null, start_row)\n } else {\n Api.post(\n `/script-api/running-script/${this.scriptId}/executewhilepaused`,\n {\n data: {\n args: [this.filenameSelect, start_row],\n },\n },\n )\n }\n },\n executeSelection: function () {\n const range = this.editor.getSelectionRange()\n let start_row = range.start.row + 1\n let end_row = range.end.row + 1\n if (range.end.column === 0) {\n end_row -= 1\n }\n if (!this.scriptId) {\n this.start(null, null, start_row, end_row)\n } else {\n Api.post(\n `/script-api/running-script/${this.scriptId}/executewhilepaused`,\n {\n data: {\n args: [this.filenameSelect, start_row, end_row],\n },\n },\n )\n }\n },\n clearBreakpoints: function () {\n this.editor.session.clearBreakpoints()\n },\n toggleBreakpoint: function ($event) {\n // Don't allow setting breakpoints while running\n if (!this.scriptId) {\n const row = $event.getDocumentPosition().row\n if ($event.editor.session.getBreakpoints(row, 0)[row]) {\n $event.editor.session.clearBreakpoint(row)\n } else {\n $event.editor.session.setBreakpoint(row)\n }\n }\n },\n updateBreakpoints: function ($event, session) {\n if ($event.lines.length <= 1) {\n return\n }\n const rowsToUpdate = this.getBreakpointRows(session).filter(\n (row) =>\n ($event.start.column === 0 && row === $event.start.row) ||\n row > $event.start.row,\n )\n let rowsToDelete = []\n let offset = 0\n switch ($event.action) {\n case 'insert':\n offset = $event.lines.length - 1\n rowsToUpdate.reverse() // shift the lower ones down out of the way first\n break\n case 'remove':\n offset = -$event.lines.length + 1\n rowsToDelete = [...Array($event.lines.length).keys()].map(\n (row) => row + $event.start.row,\n )\n break\n }\n rowsToUpdate.forEach((row) => {\n session.clearBreakpoint(row)\n if (!rowsToDelete.includes(row)) {\n session.setBreakpoint(row + offset)\n }\n })\n },\n getBreakpointRows: function (session = this.editor.session) {\n return session\n .getBreakpoints()\n .map((breakpoint, row) => breakpoint && row) // [empty, 'ace_breakpoint', 'ace_breakpoint', empty] -> [empty, 1, 2, empty]\n .filter(Number.isInteger) // [empty, 1, 2, empty] -> [1, 2]\n },\n restoreBreakpoints: function (filename) {\n this.clearBreakpoints()\n this.breakpoints[filename]?.forEach((breakpoint) => {\n this.editor.session.setBreakpoint(breakpoint)\n })\n },\n deleteAllBreakpoints: function () {\n this.$dialog\n .confirm('Permanently delete all breakpoints for ALL scripts?', {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete('/script-api/breakpoints/delete/all')\n })\n .then((response) => {\n this.clearBreakpoints()\n })\n },\n suiteRunnerButton(event) {\n if (this.startOrGoButton === START) {\n this.start(event, 'suiteRunner')\n } else {\n this.go(event, 'suiteRunner')\n }\n },\n async keydown(event) {\n // Don't ever save if running or readonly\n if (this.scriptId || this.editor.getReadOnly() === true) {\n return\n }\n // NOTE: Chrome does not allow overriding Ctrl-N, Ctrl-Shift-N, Ctrl-T, Ctrl-Shift-T, Ctrl-W\n // NOTE: metaKey == Command on Mac\n if (\n (event.metaKey || event.ctrlKey) &&\n event.keyCode === 'S'.charCodeAt(0)\n ) {\n if (event.shiftKey) {\n event.preventDefault()\n this.saveAs()\n } else {\n event.preventDefault()\n await this.saveFile()\n }\n }\n },\n onChange(event) {\n // Don't track changes when we're running or read-only (locked)\n if (this.scriptId || this.editor.getReadOnly() === true) {\n return\n }\n if (this.editor.session.getUndoManager().canUndo()) {\n this.fileModified = '*'\n } else {\n this.fileModified = ''\n }\n },\n checkMnemonics: function () {\n let filename = this.filename\n if (this.filename !== NEW_FILENAME) {\n // Check if the extension is not .rb or .py\n if (!(filename.endsWith('.rb') || filename.endsWith('.py'))) {\n Api.post(`/script-api/scripts/${this.filename}/mnemonics`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n let alertText = ''\n alertText += `<strong>${response.data.title}</strong><br/><br/>`\n alertText += JSON.parse(response.data.description)\n this.$dialog.alert(alertText.trim(), { html: true })\n return\n })\n }\n }\n this.mnemonicChecker\n .checkText(this.editor.getValue())\n .then(({ skipped, problems }) => {\n let alertText = ''\n if (problems.length) {\n const problemText = problems\n .map((problem) => `${problem.lineNumber}: ${problem.error}`)\n .join('<br/>')\n alertText += `<strong>The following lines have problems:</strong><br/>${problemText}<br/><br/>`\n }\n if (skipped.length) {\n alertText +=\n '<strong>Mnemonics with string interpolation were not checked.</strong>'\n }\n if (alertText === '') {\n alertText = '<strong>Everything looks good!</strong>'\n }\n this.$dialog.alert(alertText.trim(), { html: true })\n })\n },\n initScriptStart() {\n this.disableSuiteButtons = true\n this.startOrGoDisabled = true\n this.envDisabled = true\n this.pauseOrRetryDisabled = true\n this.stopDisabled = true\n this.state = 'Connecting...'\n this.startOrGoButton = GO\n this.editor.setReadOnly(true)\n },\n scriptStart(id) {\n this.$emit('script-id', id)\n this.scriptId = id\n this.cable\n .createSubscription(\n 'RunningScriptChannel',\n window.openc3Scope,\n {\n received: (data) => this.received(data),\n },\n {\n id: this.scriptId,\n },\n )\n .then((subscription) => {\n this.subscription = subscription\n })\n },\n async scriptComplete() {\n // Make sure we process no more events\n if (this.subscription) {\n await this.subscription.unsubscribe()\n this.subscription = null\n }\n this.receivedEvents.length = 0 // Clear any unprocessed events\n\n await this.reloadFile() // Make sure the right file is shown\n // We may have changed the contents (if there were sub-scripts)\n // so don't let the undo manager think this is a change\n this.editor.session.getUndoManager().reset()\n if (this.readOnlyUser == false && !this.inline) {\n this.editor.setReadOnly(false)\n }\n\n this.scriptId = null // No current scriptId\n sessionStorage.removeItem('script_runner__script_id')\n\n // Lastly enable the buttons so another script can start\n this.disableSuiteButtons = false\n this.startOrGoButton = START\n this.pauseOrRetryButton = PAUSE\n // Disable start if suiteRunner\n this.startOrGoDisabled = this.suiteRunner\n this.envDisabled = false\n this.pauseOrRetryDisabled = true\n this.stopDisabled = true\n // Overrides can be set from a script\n this.updateOverridesCount()\n },\n environmentHandler: function (event) {\n this.scriptEnvironment.env = event\n },\n startHandler: function () {\n this.start()\n },\n async start(\n event = null,\n suiteRunner = null,\n line_no = null,\n end_line_no = null,\n ) {\n // Initialize variables and disable buttons before actually posting.\n // This prevents delays in the backend from delaying frontend changes\n // like disabling start which could allow users to click start twice.\n this.initScriptStart()\n await this.saveFile('start')\n this.saveAllowed = false\n let filename = this.filename\n if (this.filename === NEW_FILENAME) {\n // NEW_FILENAME so use tempFilename created by saveFile()\n filename = this.tempFilename\n }\n let url = `/script-api/scripts/${filename}/run`\n if (this.showDisconnect) {\n url += '/disconnect'\n }\n let env = this.scriptEnvironment.env\n if (this.enableStackTraces) {\n env = env.concat({\n key: 'OPENC3_FULL_BACKTRACE',\n value: '1',\n })\n }\n let data = {\n environment: env,\n }\n if (suiteRunner) {\n // TODO 7.0: Should suiteRunner be snake case?\n data['suiteRunner'] = event\n }\n if (line_no !== null) {\n data['line_no'] = line_no\n }\n if (end_line_no !== null) {\n data['end_line_no'] = end_line_no\n }\n Api.post(url, { data })\n .then((response) => {\n this.scriptStart(response.data)\n })\n .catch((error) => {\n this.scriptComplete()\n })\n },\n go() {\n // Ensure we're on the correct filename when we hit go\n // They may have changed it using the drop down\n this.filenameSelect = this.currentFilename\n this.fileNameChanged(this.currentFilename)\n Api.post(`/script-api/running-script/${this.scriptId}/go`)\n },\n pauseOrRetry() {\n if (this.pauseOrRetryButton === PAUSE) {\n Api.post(`/script-api/running-script/${this.scriptId}/pause`)\n } else {\n this.pauseOrRetryButton = PAUSE\n Api.post(`/script-api/running-script/${this.scriptId}/retry`)\n }\n },\n stop() {\n Api.post(`/script-api/running-script/${this.scriptId}/stop`)\n },\n step() {\n Api.post(`/script-api/running-script/${this.scriptId}/step`)\n },\n // This is called by processLine no matter the current state\n handleWaiting() {\n // First check if we're not waiting and if so clear the interval\n if (this.state !== 'waiting' && this.state !== 'paused') {\n this.clearWaiting()\n } else if (this.waitingInterval !== null) {\n // If we're waiting and the interval is active then nothing to do\n return\n }\n this.waitingStart = Date.now()\n // Create an interval to count every second\n this.waitingInterval = setInterval(() => {\n this.waitingTime = Math.round((Date.now() - this.waitingStart) / 1000)\n }, 1000)\n },\n clearWaiting() {\n this.waitingTime = 0\n clearInterval(this.waitingInterval)\n this.waitingInterval = null\n },\n processLine(data) {\n if (data.filename && data.filename !== this.currentFilename) {\n if (!this.files[data.filename]) {\n // We don't have the contents of the running file (probably because connected to running script)\n // Set the contents initially to an empty string so we don't start slamming the API\n this.files[data.filename] = { content: '', lineNo: 0 }\n\n // Request the script we need\n Api.get(`/script-api/scripts/${data.filename}`)\n .then((response) => {\n // Success - Save the script text and mark the currentFilename as null\n // so it will get loaded in on the next line executed\n this.files[data.filename] = {\n content: response.data.contents,\n lineNo: 0,\n }\n this.breakpoints[data.filename] = response.data.breakpoints\n this.restoreBreakpoints(data.filename)\n this.currentFilename = null\n })\n .catch((err) => {\n // Error - Restore the file contents to null so we'll try the API again on the next line\n this.files[data.filename] = null\n })\n } else {\n this.currentFilename = data.filename\n this.editor.setValue(this.files[data.filename].content)\n this.restoreBreakpoints(data.filename)\n this.editor.clearSelection()\n }\n }\n this.state = data.state\n const markers = this.editor.session.getMarkers()\n switch (this.state) {\n // Handle all the script states, see script_status_model for details\n // spawning, init, running, paused, waiting, breakpoint, error, crashed, stopped, completed, completed_errors, killed\n case 'running':\n this.handleWaiting()\n this.startOrGoDisabled = false\n this.pauseOrRetryDisabled = false\n this.stopDisabled = false\n this.pauseOrRetryButton = PAUSE\n\n this.removeAllMarkers()\n this.editor.session.addMarker(\n new this.Range(data.line_no - 1, 0, data.line_no - 1, 1),\n 'runningMarker',\n 'fullLine',\n )\n this.editor.gotoLine(data.line_no)\n this.files[data.filename].lineNo = data.line_no\n break\n case 'error':\n this.pauseOrRetryButton = RETRY\n // Deliberate fall through (no break)\n case 'spawning': // wait for script to be spawned\n case 'init': // wait for script to initialize\n case 'paused':\n case 'waiting':\n case 'breakpoint':\n this.handleWaiting()\n this.startOrGoDisabled = false\n this.pauseOrRetryDisabled = false\n this.stopDisabled = false\n let existing = Object.keys(markers).filter(\n (key) => markers[key].clazz === `${this.state}Marker`,\n )\n if (existing.length === 0) {\n this.removeAllMarkers()\n let line = data.line_no > 0 ? data.line_no : 1\n this.editor.session.addMarker(\n new this.Range(line - 1, 0, line - 1, 1),\n `${this.state}Marker`,\n 'fullLine',\n )\n this.editor.gotoLine(line)\n // Fatal errors don't always have a filename set\n if (data.filename) {\n this.files[data.filename].lineNo = line\n }\n }\n break\n case 'completed':\n case 'completed_errors':\n case 'stopped':\n case 'crashed':\n case 'killed':\n // Only remove markers here - full cleanup is handled by the\n // 'complete' message in processReceived() which always follows.\n // Calling scriptComplete() here would unsubscribe the channel\n // before the 'complete' message (with suite report) arrives.\n this.removeAllMarkers()\n break\n\n default:\n break\n }\n },\n processReceived() {\n let count = 0\n for (let data of this.receivedEvents) {\n count += 1\n // console.log(data) // Uncomment for debugging\n let index = 0\n switch (data.type) {\n case 'file':\n this.files[data.filename] = { content: data.text, lineNo: 0 }\n this.breakpoints[data.filename] = data.breakpoints\n if (this.currentFilename === data.filename) {\n this.restoreBreakpoints(data.filename)\n }\n break\n case 'line':\n // A further optimization would be to only process the last line of a batch\n // However with some testing this did not seem to make much difference\n // and was preventing the highlighting of the final line of a script because\n // the last line of the final batch was line_number 0 with state stopped\n // and that would never highlight the actual final line\n this.processLine(data)\n break\n case 'output':\n // data.line can consist of multiple lines split by newlines,\n // thus we split and only output if the content is not empty.\n // We also need to ensure it's properly serialized as a string.\n let dataLine = data.line\n if (dataLine === null || dataLine === undefined) {\n dataLine = ''\n } else if (typeof dataLine === 'object') {\n dataLine = JSON.stringify(dataLine)\n } else {\n dataLine = String(dataLine)\n }\n for (const line of dataLine.split('\\n')) {\n if (line) {\n if (this.messagesNewestOnTop) {\n this.messages.unshift({ message: line })\n } else {\n this.messages.push({ message: line })\n }\n }\n }\n while (this.messages.length > this.maxArrayLength) {\n this.messages.pop()\n }\n break\n case 'script':\n this.handleScript(data)\n break\n // DEPRECATED because the 'complete' message now includes the report\n case 'report':\n this.results.text = data.report\n this.results.show = true\n break\n case 'complete':\n if (data.report) {\n this.results.text = data.report\n this.results.show = true\n }\n this.removeAllMarkers()\n this.scriptComplete()\n break\n case 'step':\n this.showDebug = true\n break\n case 'screen':\n let found = false\n let definition = {}\n for (screen of this.screens) {\n if (\n screen.target == data.target_name &&\n screen.screen == data.screen_name\n ) {\n definition = screen\n found = true\n break\n }\n index += 1\n }\n definition.target = data.target_name\n definition.screen = data.screen_name\n definition.definition = data.definition\n if (data.x) {\n definition.left = data.x\n } else {\n definition.left = 0\n }\n if (data.y) {\n definition.top = data.y\n } else {\n definition.top = 0\n }\n definition.count = this.updateCounter++\n if (!found) {\n definition.id = this.idCounter++\n this.screens[this.screens.length] = definition\n } else {\n this.screens[index] = definition\n }\n break\n case 'clearscreen':\n for (screen of this.screens) {\n if (\n screen.target == data.target_name &&\n screen.screen == data.screen_name\n ) {\n this.screens.splice(index, 1)\n break\n }\n index += 1\n }\n break\n case 'clearallscreens':\n this.screens = []\n break\n case 'downloadfile':\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = window.location.origin + data.url\n link.setAttribute('download', data.filename)\n link.click()\n break\n case 'opentab':\n window.open(data.url, '_blank')\n break\n default:\n // console.log('Unexpected ActionCable message')\n // console.log(data)\n break\n }\n }\n\n // Remove all the events we processed\n this.receivedEvents.splice(0, count)\n },\n received(data) {\n this.cable.recordPing()\n this.receivedEvents.push(data)\n },\n promptDialogCallback(value) {\n this.prompt.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: this.prompt.method,\n answer: value,\n prompt_id: this.activePromptId,\n multiple: this.prompt.multiple,\n },\n })\n },\n handleScript(data) {\n if (data.prompt_complete) {\n this.activePromptId = ''\n this.prompt.show = false\n this.ask.show = false\n this.file.show = false\n return\n }\n this.activePromptId = data.prompt_id\n this.prompt.method = data.method // Set it here since all prompts use this\n this.prompt.layout = 'horizontal' // Reset the layout since most are horizontal\n this.prompt.title = 'Prompt'\n this.prompt.subtitle = ''\n this.prompt.details = ''\n this.prompt.buttons = []\n this.prompt.multiple = null\n switch (data.method) {\n case 'ask':\n case 'ask_string':\n // Reset values since this dialog can be reused\n this.ask.default = null\n this.ask.answerRequired = true\n this.ask.password = false\n this.ask.question = data.args[0]\n // If the second parameter is not true or false it indicates a default value\n if (data.args[1] && data.args[1] !== true && data.args[1] !== false) {\n this.ask.default = data.args[1].toString()\n } else if (data.args[1] === true) {\n // If the second parameter is true it means no value is required to be entered\n this.ask.answerRequired = false\n }\n // The third parameter indicates a password textfield\n if (data.args[2] === true) {\n this.ask.password = true\n }\n this.ask.callback = (value) => {\n this.ask.show = false // Close the dialog\n if (this.ask.password) {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n password: value, // Using password as a key automatically filters it from rails logs\n prompt_id: this.activePromptId,\n },\n })\n } else {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n answer: value,\n prompt_id: this.activePromptId,\n },\n })\n }\n }\n this.ask.show = true // Display the dialog\n break\n case 'prompt_for_hazardous':\n this.prompt.title = 'Hazardous Command'\n this.prompt.message = `Warning: Command ${data.args[0]} ${data.args[1]} is Hazardous. `\n if (data.args[2]) {\n this.prompt.message += data.args[2] + ' '\n }\n this.prompt.message += 'Send?'\n this.prompt.buttons = [{ text: 'Send', value: 'Send' }]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'prompt_for_critical_cmd':\n this.criticalCmdUuid = data.args[0]\n this.criticalCmdString = data.args[5]\n this.criticalCmdUser = data.args[1]\n this.displayCriticalCmd = true\n break\n case 'prompt':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n this.prompt.message = data.args[0]\n this.prompt.buttons = [{ text: 'Ok', value: 'Ok' }]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'combo_box':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n if (data.kwargs && data.kwargs.multiple) {\n this.prompt.multiple = true\n }\n this.prompt.message = data.args[0]\n data.args.slice(1).forEach((v) => {\n this.prompt.buttons.push({ title: v, value: v })\n })\n this.prompt.layout = 'combo'\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'message_box':\n case 'vertical_message_box':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n this.prompt.message = data.args[0]\n data.args.slice(1).forEach((v) => {\n this.prompt.buttons.push({ text: v, value: v })\n })\n if (data.method.includes('vertical')) {\n this.prompt.layout = 'vertical'\n }\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'backtrace':\n this.information.title = 'Call Stack'\n this.information.text = data.args\n this.information.show = true\n this.information.width = '600'\n break\n case 'metadata_input':\n this.inputMetadata.callback = (value) => {\n this.inputMetadata.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n answer: value,\n prompt_id: this.activePromptId,\n },\n })\n }\n this.showMetadata()\n break\n // This is called continuously by the backend\n case 'open_file_dialog':\n case 'open_files_dialog':\n this.file.title = data.args[0]\n this.file.message = data.args[1]\n if (data.kwargs && data.kwargs.filter) {\n this.file.filter = data.kwargs.filter\n }\n if (data.method == 'open_files_dialog') {\n this.file.multiple = true\n }\n this.file.show = true\n break\n default:\n // console.log(\n // 'Unknown script method:' + data.method + ' with args:' + data.args\n // )\n break\n }\n },\n async fileDialogCallback(files) {\n // Set fileNames to 'Cancel' in case they cancelled\n // otherwise we will populate it with the file names they selected\n let fileNames = 'Cancel'\n // Record all the API request promises so we can ensure they complete\n let promises = []\n if (files != 'Cancel') {\n fileNames = []\n files.forEach((file) => {\n fileNames.push(file.name)\n promises.push(\n Api.get(\n `/openc3-api/storage/upload/${encodeURIComponent(\n `${window.openc3Scope}/tmp/${file.name}`,\n )}?bucket=OPENC3_CONFIG_BUCKET`,\n ).then((response) => {\n // This pushes the file into storage by using the fields in the presignedRequest\n // See storage_controller.rb get_upload_presigned_request()\n promises.push(\n axios({\n ...response.data,\n data: file,\n }),\n )\n }),\n )\n })\n }\n // We have to wait for all the upload API requests to finish before notifying the prompt\n Promise.all(promises).then((responses) => {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: this.file.multiple\n ? 'open_files_dialog'\n : 'open_file_dialog',\n answer: fileNames,\n prompt_id: this.activePromptId,\n },\n })\n this.file.show = false // Close the dialog immediately to avoid race condition\n })\n },\n setError(event) {\n this.alertType = 'error'\n this.alertText = `Error: ${event}`\n this.showAlert = true\n },\n // ScriptRunner File menu actions\n async confirmUnsavedChanges() {\n if (this.fileModified === '*') {\n return await this.$dialog.confirm(\n 'You have unsaved changes. Are you sure you want to continue?',\n {\n okText: 'Continue',\n cancelText: 'Cancel',\n },\n )\n }\n return true\n },\n async newFileWithConfirm() {\n const confirmed = await this.confirmUnsavedChanges()\n if (confirmed) {\n this.newFile()\n }\n },\n newFile() {\n this.unlockFile()\n this.filename = NEW_FILENAME\n this.currentFilename = null\n this.tempFilename = null\n this.files = {} // Clear the cached file list\n this.editor.session.setValue('')\n this.saveAllowed = true\n this.fileModified = ''\n this.suiteRunner = false\n this.startOrGoDisabled = false\n this.envDisabled = false\n if (!this.inline) {\n this.$router\n .replace({\n name: 'ScriptRunner',\n })\n // catch the error in case we route to where we already are\n .catch((err) => {})\n document.title = 'Script Runner'\n }\n this.doResize()\n },\n async newRubyTestSuite() {\n const confirmed = await this.confirmUnsavedChanges()\n if (!confirmed) return\n this.newFile()\n this.editor.session.setValue(`require 'openc3/script/suite.rb'\n\n# Group class name should indicate what the scripts are testing\nclass Power < OpenC3::Group\n # Methods beginning with script_ are added to Script dropdown\n def script_power_on\n # Using OpenC3::Group.puts adds the output to the Test Report\n # This can be useful for requirements verification, QA notes, etc\n OpenC3::Group.puts \"Verifying requirement SR-1\"\n configure()\n end\n\n # Other methods are not added to Script dropdown\n def configure\n end\n\n def setup\n # Run when Group Setup button is pressed\n # Run before all scripts when Group Start is pressed\n end\n\n def teardown\n # Run when Group Teardown button is pressed\n # Run after all scripts when Group Start is pressed\n end\nend\n\nclass TestSuite < OpenC3::Suite\n def initialize\n add_group('Power')\n end\n def setup\n # Run when Suite Setup button is pressed\n # Run before all groups when Suite Start is pressed\n end\n def teardown\n # Run when Suite Teardown button is pressed\n # Run after all groups when Suite Start is pressed\n end\nend\n`)\n await this.saveFile('auto')\n },\n async newPythonTestSuite() {\n const confirmed = await this.confirmUnsavedChanges()\n if (!confirmed) return\n this.newFile()\n this.editor.session.setValue(`from openc3.script.suite import Suite, Group\n\n# Group class name should indicate what the scripts are testing\nclass Power(Group):\n # Methods beginning with script_ are added to Script dropdown\n def script_power_on(self):\n # Using Group.print adds the output to the Test Report\n # This can be useful for requirements verification, QA notes, etc\n Group.print(\"Verifying requirement SR-1\")\n self.configure()\n\n # Other methods are not added to Script dropdown\n def configure(self):\n pass\n\n def setup(self):\n # Run when Group Setup button is pressed\n # Run before all scripts when Group Start is pressed\n pass\n\n def teardown(self):\n # Run when Group Teardown button is pressed\n # Run after all scripts when Group Start is pressed\n pass\n\nclass TestSuite(Suite):\n def __init__(self):\n self.add_group(Power)\n\n def setup(self):\n # Run when Suite Setup button is pressed\n # Run before all groups when Suite Start is pressed\n pass\n\n def teardown(self):\n # Run when Suite Teardown button is pressed\n # Run after all groups when Suite Start is pressed\n pass\n`)\n await this.saveFile('auto')\n },\n addToRecent(filename) {\n // See if this filename is already in the recent ... if so remove it\n let index = this.recent.findIndex((i) => i.label === filename)\n if (index !== -1) {\n this.recent.splice(index, 1)\n }\n // Push this filename to the front of the recently used\n this.recent.unshift({\n label: filename,\n icon: fileIcon(filename),\n command: async (event) => {\n const confirmed = await this.confirmUnsavedChanges()\n if (!confirmed) return\n this.filename = event.label\n await this.reloadFile()\n },\n })\n if (this.recent.length > 8) {\n this.recent.pop()\n }\n // This only stringifies the label and icon ... not the command\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n }\n },\n removeFromRecent(filename) {\n this.recent = this.recent.filter((entry) => entry.label !== filename)\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n if (localStorage['script_runner__filename'] === filename) {\n localStorage.removeItem('script_runner__filename')\n }\n }\n },\n async openFileWithConfirm() {\n const confirmed = await this.confirmUnsavedChanges()\n if (confirmed) {\n this.openFile()\n }\n },\n openFile() {\n this.fileOpen = true\n },\n async reloadFile(showError = true) {\n // Disable start while we're loading the file so we don't hit Start\n // before it's fully loaded and then save over it with a blank file\n this.saveAllowed = false\n this.startOrGoDisabled = true\n await Api.get(`/script-api/scripts/${this.filename}`, {\n headers: {\n Accept: 'application/json',\n 'Ignore-Errors': '404',\n },\n })\n .then((response) => {\n const file = {\n name: this.filename,\n contents: response.data.contents,\n }\n if (response.data.suites) {\n file['suites'] = JSON.parse(response.data.suites)\n }\n if (response.data.error) {\n file['error'] = response.data.error\n }\n if (response.data.success) {\n file['success'] = response.data.success\n }\n const locked = response.data.locked\n const breakpoints = response.data.breakpoints\n this.setFile({ file, locked, breakpoints }, true)\n this.saveAllowed = true\n })\n .catch((error) => {\n if (showError === true) {\n this.$notify.caution({\n title: 'File Open Error',\n body: `Failed to open ${this.filename} due to ${error}`,\n })\n }\n this.removeFromRecent(this.filename)\n this.newFile() // Reset the GUI\n })\n },\n // Called by the FileOpenDialog to set the file contents\n setFile({ file, locked, breakpoints }, local = false) {\n this.files = {} // Clear the cached file list\n // Split off the ' *' which indicates a file is modified on the server\n let newFilename = file.name.split('*')[0]\n if (local === false) {\n // We only need to unlock if the file is different\n if (this.filename !== newFilename) {\n this.unlockFile() // first unlock what was just being edited\n this.lockedBy = locked\n }\n }\n this.filename = newFilename\n if (!this.inline) {\n // Update the URL with the filename\n this.$router\n .replace({\n name: 'ScriptRunner',\n query: {\n file: this.filename,\n },\n })\n // catch the error in case we route to where we already are\n .catch((err) => {})\n\n // Update the browser tab with the name of the file first\n // so squished tabs are still useful, followed by the rest\n // of the path for context. Target name will be first which\n // is probably the most useful part of the path.\n let parts = this.filename.split('/')\n document.title = `${parts.pop()} (${parts.join('/')})`\n }\n\n if (this.filename.split('.').pop() === 'py') {\n this.editor.session.setMode(this.pythonMode)\n } else {\n this.editor.session.setMode(this.rubyMode)\n }\n this.currentFilename = null\n this.editor.session.setValue(file.contents)\n this.breakpoints[this.filename] = breakpoints\n this.restoreBreakpoints(this.filename)\n this.fileModified = ''\n this.envDisabled = false\n this.addToRecent(this.filename)\n\n if (file.suites) {\n this.suiteRunner = true\n this.suiteMap = file.suites\n this.startOrGoDisabled = true\n } else {\n this.suiteRunner = false\n this.startOrGoDisabled = false\n }\n if (file.error) {\n this.suiteError = file.error\n this.showSuiteError = true\n }\n // Disable suite buttons if we didn't successfully parse the suite\n this.disableSuiteButtons = file.success == false\n this.doResize()\n },\n clearTemp() {\n this.recent = this.recent.filter(\n (entry) => !entry.label.includes('__TEMP__'),\n )\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n }\n },\n detectLanguage() {\n let rubyRegex1 = new RegExp('^\\\\s*(require|load|puts) ')\n let pythonRegex1 = new RegExp('^\\\\s*(import|from) ')\n let rubyRegex2 = new RegExp('^\\\\s*end\\\\s*$')\n let pythonRegex2 = new RegExp(\n '^\\\\s*(if|def|while|else|elif|class).*:\\\\s*$',\n )\n let pythonRegex3 = /\\(f\"/ // f strings\n // Since python types are defined like \"def method(string: str):\"\n // we make sure the line doesn't end in ':' which indicates Python\n // (?!:)$ is a negative lookahead to ensure it doesn't end in ':'\n let rubyRegex3 = /\\(.*\\w+:\\s+.+\\)(?!:)$/ // named parameters\n let text = this.editor.getValue()\n let lines = text.split('\\n')\n for (let line of lines) {\n if (line.match(rubyRegex1)) {\n return 'ruby'\n }\n if (line.match(pythonRegex1)) {\n return 'python'\n }\n if (line.match(rubyRegex2)) {\n return 'ruby'\n }\n if (line.match(pythonRegex2)) {\n return 'python'\n }\n if (line.match(pythonRegex3)) {\n return 'python'\n }\n if (line.match(rubyRegex3)) {\n return 'ruby'\n }\n }\n return 'unknown' // otherwise unknown\n },\n // saveFile takes a type to indicate if it was called by the Menu\n // or automatically by 'Start' (to ensure a consistent backend file) or autoSave\n async saveFile(type = 'menu') {\n if (this.readOnlyUser) {\n return\n }\n if (this.saveAllowed) {\n const breakpoints = this.getBreakpointRows()\n if (this.filename === NEW_FILENAME) {\n if (type === 'menu') {\n // Menu driven saves on a new file should prompt SaveAs\n this.saveAs()\n return\n } else {\n // start or auto with NEW_FILENAME\n if (this.tempFilename === null) {\n let language = this.detectLanguage()\n if (language === 'unknown') {\n language = AceEditorUtils.getDefaultScriptingLanguage()\n }\n const uuid = crypto.randomUUID().split('-')[0]\n if (language === 'ruby') {\n this.tempFilename =\n TEMP_FOLDER +\n '/' +\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss_SSS') +\n '_' +\n uuid +\n '_temp.rb'\n } else if (language === 'python') {\n this.tempFilename =\n TEMP_FOLDER +\n '/' +\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss_SSS') +\n '_' +\n uuid +\n '_temp.py'\n } else {\n // No autosave for unknown language\n return\n }\n this.filename = this.tempFilename\n this.addToRecent(this.filename)\n }\n }\n }\n this.showSave = true\n await Api.post(`/script-api/scripts/${this.filename}`, {\n data: {\n text: this.editor.getValue(), // Pass in the raw file text\n breakpoints,\n },\n })\n .then((response) => {\n if (response.status == 200) {\n if (response.data.suites) {\n this.startOrGoDisabled = true\n this.suiteRunner = true\n this.suiteMap = JSON.parse(response.data.suites)\n } else {\n this.startOrGoDisabled = false\n this.suiteRunner = false\n this.suiteMap = {}\n }\n if (response.data.error) {\n this.suiteError = response.data.error\n this.showSuiteError = true\n }\n this.fileModified = ''\n setTimeout(() => {\n this.showSave = false\n }, 2000)\n } else {\n this.showSave = false\n this.alertType = 'error'\n this.alertText = `Error saving file. Code: ${response.status} Text: ${response.statusText}`\n this.showAlert = true\n }\n this.lockFile() // Ensure this file is locked for editing\n this.doResize()\n })\n .catch(({ response }) => {\n this.showSave = false\n // 422 error means we couldn't parse the script file into Suites\n // response.data.suites holds the parse result\n if (response.status == 422) {\n this.alertType = 'error'\n this.alertText = response.data.suites\n } else {\n this.alertType = 'error'\n this.alertText = `Error saving file. Code: ${response.status} Text: ${response.statusText}`\n }\n this.showAlert = true\n })\n } else {\n this.setError('Attempt to save file when not allowed')\n }\n },\n saveAs() {\n this.showSaveAs = true\n },\n async saveAsFilename(filename) {\n this.filename = filename.split('*')[0]\n this.currentFilename = null\n if (this.tempFilename) {\n Api.post(`/script-api/scripts/${this.tempFilename}/delete`)\n this.tempFilename = null\n }\n await this.saveFile('menu')\n },\n delete() {\n let filename = this.filename\n if (this.tempFilename) {\n filename = this.tempFilename\n }\n this.$dialog\n .confirm(`Permanently delete file: ${filename}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.post(`/script-api/scripts/${filename}/delete`, {\n data: {},\n })\n })\n .then((response) => {\n this.removeFromRecent(filename)\n this.newFile()\n })\n .catch((error) => {\n if (error !== true) {\n const alertObject = {\n text: `Failed Multi-Delete. ${error}`,\n type: 'error',\n }\n this.$emit('alert', alertObject)\n }\n })\n },\n download() {\n const blob = new Blob([this.editor.getValue()], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', this.filename)\n link.click()\n },\n // ScriptRunner Script menu actions\n syntaxCheck() {\n Api.post(`/script-api/scripts/${this.filename}/syntax`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n this.information.title = response.data.title\n this.information.text = JSON.parse(response.data.description)\n this.information.show = true\n this.information.width = '600'\n })\n },\n showInstrumented() {\n Api.post(`/script-api/scripts/${this.filename}/instrumented`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n this.information.title = response.data.title\n this.information.text = JSON.parse(response.data.description)\n this.information.show = true\n this.information.width = '90vw'\n })\n },\n showCallStack() {\n Api.post(`/script-api/running-script/${this.scriptId}/backtrace`)\n },\n toggleDebug() {\n this.showDebug = !this.showDebug\n if (this.showDebug) {\n this.$nextTick(() => {\n this.$refs.debug.focus()\n })\n }\n },\n toggleDisconnect() {\n this.showDisconnect = !this.showDisconnect\n },\n debugKeydown(event) {\n if (event.key === 'Escape') {\n this.debug = ''\n this.debugHistoryIndex = this.debugHistory.length\n } else if (event.key === 'Enter') {\n this.debugHistory.push(this.debug)\n this.debugHistoryIndex = this.debugHistory.length\n // Post the code to /debug, output is processed by receive()\n Api.post(`/script-api/running-script/${this.scriptId}/debug`, {\n data: {\n args: this.debug,\n },\n })\n this.debug = ''\n } else if (event.key === 'ArrowUp') {\n this.debugHistoryIndex -= 1\n if (this.debugHistoryIndex < 0) {\n this.debugHistoryIndex = this.debugHistory.length - 1\n }\n this.debug = this.debugHistory[this.debugHistoryIndex]\n // Prevent the cursor/caret from moving to the front\n event.preventDefault()\n } else if (event.key === 'ArrowDown') {\n this.debugHistoryIndex += 1\n if (this.debugHistoryIndex >= this.debugHistory.length) {\n this.debugHistoryIndex = 0\n }\n this.debug = this.debugHistory[this.debugHistoryIndex]\n }\n },\n removeAllMarkers: function () {\n const allMarkers = this.editor.session.getMarkers()\n Object.keys(allMarkers)\n .filter((key) => allMarkers[key].type === 'fullLine')\n .forEach((marker) => this.editor.session.removeMarker(marker))\n },\n confirmLocalUnlock: function () {\n this.$dialog\n .confirm(\n 'Are you sure you want to unlock this script for editing? If another user is editing this script, your changes might conflict with each other.',\n {\n okText: 'Force Unlock',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.lockedBy = null\n return this.lockFile() // Re-lock it as this user so it's locked for anyone else who opens it\n })\n },\n lockFile: function () {\n if (!this.readOnlyUser) {\n return Api.post(`/script-api/scripts/${this.filename}/lock`)\n }\n },\n unlockFile: function () {\n if (\n this.filename !== NEW_FILENAME &&\n !this.readOnly &&\n !this.readOnlyUser\n ) {\n Api.post(`/script-api/scripts/${this.filename}/unlock`)\n }\n },\n backToNewScript: async function () {\n // Disconnect from the current script\n this.scriptDisconnect()\n // Clear script-related state\n this.removeAllMarkers()\n await this.scriptComplete()\n // Create a new blank script\n this.newFile()\n },\n screenId(id) {\n return 'scriptRunnerScreen' + id\n },\n closeScreen(id) {\n let index = 0\n for (screen of this.screens) {\n if (screen.id == id) {\n this.screens.splice(index, 1)\n break\n }\n index += 1\n }\n },\n },\n}\n</script>\n\n<style scoped>\nhr {\n color: white;\n height: 3px;\n}\n\n.error-message {\n border: 2px solid #f44336;\n border-radius: 8px;\n background-color: rgba(244, 67, 54, 0.1);\n color: #d32f2f;\n padding-left: 8px;\n padding-right: 8px;\n margin: 16px;\n display: flex;\n align-items: center;\n font-weight: 500;\n box-shadow: 0 2px 4px rgba(244, 67, 54, 0.2);\n}\n\n#sr-controls {\n padding: 0px;\n}\n\n.editor {\n height: 100%;\n width: 100%;\n position: relative;\n font-size: 16px;\n}\n\n.script-state :deep(.v-field) {\n background-color: var(--color-background-base-default);\n}\n\n.script-state :deep(input) {\n text-transform: capitalize;\n}\n\n/* Taken from the various status-symbol-color-fill classes\n on https://www.astrouxds.com/design-tokens/component/ */\n.script-state-red :deep(input) {\n color: #ff3838 !important;\n}\n\n.script-state-orange :deep(input) {\n color: #ffb302 !important;\n}\n\n.script-state-green :deep(input) {\n color: #56f000 !important;\n}\n</style>\n<style>\n.splitpanes--horizontal > .splitpanes__splitter {\n min-height: 4px;\n position: relative;\n top: 4px;\n background-color: grey;\n width: 5%;\n margin: auto;\n cursor: row-resize;\n}\n\n.runningMarker {\n position: absolute;\n background: rgba(0, 255, 0, 0.5);\n z-index: 20;\n}\n\n.waitingMarker {\n position: absolute;\n background: rgba(0, 155, 0, 1);\n z-index: 20;\n}\n\n.breakpointMarker {\n position: absolute;\n border-style: solid;\n border-color: red;\n background: rgba(0, 255, 0, 0.5);\n z-index: 20;\n}\n\n.pausedMarker {\n position: absolute;\n background: rgba(0, 140, 255, 0.5);\n z-index: 20;\n}\n\n.errorMarker {\n position: absolute;\n background: rgba(255, 0, 119, 0.5);\n z-index: 20;\n}\n\n.saving {\n z-index: 20;\n opacity: 0.35;\n}\n\n.ace_gutter {\n /* Screens have a default z-index of 3 so get below that */\n z-index: 2;\n}\n\n.ace_gutter-cell.ace_breakpoint {\n border-radius: 20px 0px 0px 20px;\n box-shadow: 0px 0px 1px 1px red inset;\n}\n\n.grid {\n position: relative;\n}\n\n.item {\n /* TODO: this non-scoped generic class name conflicts with other things and should be scoped or renamed. */\n position: absolute;\n display: block;\n margin: 5px;\n z-index: 1;\n}\n\n.item-content {\n position: relative;\n cursor: pointer;\n border-radius: 6px;\n}\n\n.apply-top .v-snackbar__wrapper {\n top: var(--classification-height-top);\n}\n</style>\n"],"names":["toKeywordRegex","word","prefix","call","interpolatedStringRegex","alternateSyntaxRegex","MnemonicChecker","OpenC3Api","response","target","getKeywords","text","linesToCheck","linesToSkip","result","line","index","commentMatch","lineWithoutComment","cmdMatch","found","regex","tlmMatch","matchStr","parenOrSpaceMatch","mnemonicMatch","usingAlternateSyntax","firstQuote","quoteChar","closingQuoteIndex","mnemonicParts","mnemonic","mnemonicParams","param","token","property","item","problems","a","b","problemLines","targetGroups","groupBy","lineObj","packetGroups","packet","cmdOrTlm","method","packetInfo","items","_sfc_main","OutputDialog","TimeFilters","newTab","error","offset","Api","scripts","currentTime","script","startTime","durationMs","minutes","seconds","hours","page","itemsPerPage","destination","href","dialog","type","logUrl","filenameParts","format","blob","link","basename","_createElementBlock","_createVNode","_component_v_card","_component_v_tabs","$data","$event","_component_v_tab","_cache","_component_v_window","_component_v_window_item","_component_v_card_title","_component_v_row","_component_v_spacer","_component_v_btn","$options","_component_v_text_field","_component_v_data_table_server","_withCtx","_createTextVNode","_toDisplayString","_createElementVNode","_component_v_icon","$props","_hoisted_2","_component_v_menu","props","_mergeProps","_component_v_list","_component_v_list_item","_component_v_list_item_title","_hoisted_1","_createBlock","_component_output_dialog","value","newValue","oldValue","message","output","err","_component_v_select","_component_v_card_text","_component_v_data_table","_normalizeClass","Pe","D","h","y","u","E","ce","l","k","M","z","e","n","m","x","S","c","f","_","R","r","P","O","t","i","s","o","K","I","d","A","U","W","J","$","N","v","p","H","ue","j","Q","V","Z","ee","F","ne","C","ie","te","T","L","ae","le","oe","se","q","B","G","X","re","fe","g","Y","ve","me","ge","w","de","pe","he","ze","xe","_component_v_dialog","_component_v_form","_component_v_toolbar","_component_v_card_actions","_component_v_file_input","_openBlock","_Fragment","_renderList","layout","_component_v_card_subtitle","_hoisted_5","_hoisted_6","button","_component_v_textarea","EnvironmentChooser","_component_environment_chooser","_ctx","name","newVal","oldVal","event","_component_v_col","_component_v_tooltip","_component_v_checkbox","RegexAnnotator","#id","#editor","#pattern","#text","#type","editor","pattern","session","#removeAllAnnotations","#shiftAnnotations","row","column","#addAnnotation","#deleteAnnotationsForRow","newAnnotation","annotation","count","SleepAnnotator","keyword","suffix","TEMP_FOLDER","NEW_FILENAME","START","GO","PAUSE","RETRY","FileOpenSaveDialog","Openc3Screen","EnvironmentDialog","Splitpanes","Pane","TopBar","AskDialog","FileDialog","InformationDialog","EventListDialog","OverridesDialog","PromptDialog","ResultsDialog","ScriptEnvironmentDialog","SimpleTextDialog","SuiteRunner","RunningScripts","ScriptLogMessages","CriticalCmdDialog","CommandEditor","AceEditorModes","ClassificationBanners","to","from","next","useContainerHeight","filenames","val","filename","user","roles","role","RubyMode","PythonMode","AceEditorUtils","CmdCompleter","TlmCompleter","sleepAnnotator","Cable","position","cmdString","commandString","parts","indent","trailingComment","newLine","Range","order","id","state","trimmedLine","match","start_row","range","end_row","rowsToUpdate","rowsToDelete","breakpoint","alertText","skipped","problemText","problem","data","subscription","suiteRunner","line_no","end_line_no","url","env","markers","key","dataLine","definition","files","fileNames","promises","file","axios","responses","fileIcon","entry","showError","locked","breakpoints","local","newFilename","rubyRegex1","pythonRegex1","rubyRegex2","pythonRegex2","pythonRegex3","rubyRegex3","lines","language","uuid","alertObject","allMarkers","marker","_hoisted_3","_hoisted_4","_hoisted_15","_hoisted_17","_hoisted_12","_component_v_progress_circular","_component_v_tabs_window","_component_v_tabs_window_item","args","_hoisted_13","_hoisted_14","_component_script_log_messages","_normalizeStyle","$setup","_component_top_bar","_component_v_snackbar","attrs","def","_component_openc3_screen","_component_suite_runner","_hoisted_8","_hoisted_9","_component_v_badge","_hoisted_10","_component_splitpanes","prevPane","_component_pane","_component_v_divider","_hoisted_11","_component_file_open_save_dialog","_component_environment_dialog","_component_ask_dialog","_component_file_dialog","_component_information_dialog","_component_event_list_dialog","_component_overrides_dialog","_component_prompt_dialog","_component_results_dialog","_component_script_environment_dialog","_component_simple_text_dialog","_component_critical_cmd_dialog","_hoisted_16","_component_command_editor","_component_v_bottom_sheet","_component_v_sheet","_component_running_scripts"],"mappings":"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","x_google_ignoreList":[3]}
|
|
1
|
+
{"version":3,"file":"scriptrunner.js","sources":["../../src/tools/scriptrunner/autocomplete/mnemonicChecker.js","../../src/tools/scriptrunner/RunningScripts.vue","../../src/tools/scriptrunner/ScriptLogMessages.vue","../../../../node_modules/.pnpm/splitpanes@4.0.4_vue@3.5.30/node_modules/splitpanes/dist/splitpanes.es.js","../../src/tools/scriptrunner/Dialogs/AskDialog.vue","../../src/tools/scriptrunner/Dialogs/BucketDialog.vue","../../src/tools/scriptrunner/Dialogs/FileDialog.vue","../../src/tools/scriptrunner/Dialogs/InformationDialog.vue","../../src/tools/scriptrunner/Dialogs/OverridesDialog.vue","../../src/tools/scriptrunner/Dialogs/PromptDialog.vue","../../src/tools/scriptrunner/Dialogs/ResultsDialog.vue","../../src/tools/scriptrunner/Dialogs/ScriptEnvironmentDialog.vue","../../src/tools/scriptrunner/SuiteRunner.vue","../../src/tools/scriptrunner/annotations/regexAnnotator.js","../../src/tools/scriptrunner/annotations/sleepAnnotator.js","../../src/tools/scriptrunner/ScriptRunner.vue"],"sourcesContent":["/*\n# Copyright 2021 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\nimport { OpenC3Api } from '@openc3/js-common/services'\nimport { getKeywords, groupBy } from './utilities'\n\nconst toKeywordRegex = (word) => {\n // create regex to find the opening of a ruby method call\n const prefix = '(^|[{\\\\(\\\\s])' // Allowable characters before the method name: start of line or { or ( or a space\n const call = '((\\\\s.+)|(\\\\(.+\\\\)))' // A method call and its arguments\n return new RegExp(`${prefix}${word}${call}`)\n}\nconst interpolatedStringRegex = /\\{/\nconst alternateSyntaxRegex = /['\"],\\s?['\"]/\n\nexport default class MnemonicChecker {\n constructor() {\n this.api = new OpenC3Api()\n\n this.targets = {}\n this.api.get_target_names().then((response) => {\n response.forEach((target) => {\n this.targets[target] = {\n cmd: null,\n tlm: null,\n }\n })\n })\n\n this.cmdKeywordExpressions = []\n getKeywords('cmd').then((response) => {\n this.cmdKeywordExpressions = response.data.map(toKeywordRegex)\n })\n\n this.tlmKeywordExpressions = []\n getKeywords('tlm').then((response) => {\n this.tlmKeywordExpressions = response.data.map(toKeywordRegex)\n })\n }\n\n async checkText(text) {\n const { linesToCheck, linesToSkip } = text.split('\\n').reduce(\n (result, line, index) => {\n line = line.trim()\n if (line.match(/^#/)) {\n return result\n }\n // Strip trailing comments to avoid matching keywords in comments\n // This handles both Ruby (# comment) and Python (# comment) style\n // Be careful not to strip # inside strings\n const commentMatch = line.match(\n /^([^#'\"]*(?:(?:\"[^\"]*\"|'[^']*')[^#'\"]*)*)(#.*)$/,\n )\n const lineWithoutComment = commentMatch ? commentMatch[1].trim() : line\n\n const cmdMatch = this.cmdKeywordExpressions.reduce((found, regex) => {\n return found || lineWithoutComment.match(regex)\n }, null)\n const tlmMatch = this.tlmKeywordExpressions.reduce((found, regex) => {\n return found || lineWithoutComment.match(regex)\n }, null)\n if (!cmdMatch && !tlmMatch) {\n return result\n }\n\n const matchResult = cmdMatch || tlmMatch\n // Use capture group 2 which contains the full call arguments\n // Group 2 is always defined when matched: ((\\s.+)|(\\(.+\\)))\n // Groups 3 and 4 are alternates and only one will be defined\n const matchStr = matchResult[2]\n if (!matchStr) {\n return result\n }\n\n const parenOrSpaceMatch = matchStr.match(/[\\(\\s)]/)\n if (!parenOrSpaceMatch) {\n return result\n }\n\n let mnemonicMatch = matchStr\n .substring(parenOrSpaceMatch.index + 1) // Trim off leading `(` or space\n .replace(/\\)+.*$/, '') // and the closing )s\n\n if (mnemonicMatch.match(interpolatedStringRegex)) {\n result.linesToSkip.push(index + 1)\n return result\n }\n\n const usingAlternateSyntax = !!mnemonicMatch.match(alternateSyntaxRegex)\n\n // For space-based syntax (command as a single string like \"TARGET PACKET with PARAM value\"),\n // extract only the content within the first quoted string to avoid including\n // Ruby/Python keyword arguments like queue: or queue=\n if (!usingAlternateSyntax) {\n const firstQuote = mnemonicMatch.match(/^['\"]/)\n if (firstQuote) {\n const quoteChar = firstQuote[0]\n const closingQuoteIndex = mnemonicMatch.indexOf(quoteChar, 1)\n if (closingQuoteIndex > 0) {\n mnemonicMatch = mnemonicMatch.substring(1, closingQuoteIndex)\n }\n }\n }\n\n const mnemonicParts = mnemonicMatch.split(\n usingAlternateSyntax ? ',' : ' ',\n )\n if (mnemonicParts.length < 2) {\n return result // TODO: is this right? Maybe put an error on lineObj?\n }\n\n const mnemonic = {\n target: mnemonicParts[0],\n packet: mnemonicParts[1],\n }\n if (tlmMatch) {\n mnemonic.item = mnemonicParts[2]\n } else {\n const mnemonicParams = mnemonicParts.slice(2)\n if (usingAlternateSyntax) {\n mnemonic.params = mnemonicParams.map(\n (param) => param.split('=>')[0],\n )\n } else {\n mnemonic.params = mnemonicParams.filter((token, index) => index % 2)\n }\n }\n\n // Clean up the quotes and whitespace from the parts of the mnemonic\n for (const property in mnemonic) {\n if (typeof mnemonic[property] === 'string') {\n mnemonic[property] = mnemonic[property].replace(/['\"]/g, '').trim()\n } else {\n mnemonic[property] = mnemonic[property].map((item) =>\n item.replace(/['\"]/g, '').trim(),\n )\n }\n }\n\n result.linesToCheck.push({\n line,\n mnemonic,\n lineNumber: index + 1,\n })\n return result\n },\n { linesToCheck: [], linesToSkip: [] },\n )\n\n const problems = await this._checkLines(linesToCheck)\n return {\n skipped: linesToSkip.sort(),\n problems: problems.sort((a, b) => a.lineNumber - b.lineNumber),\n }\n }\n\n async _checkLines(linesToCheck) {\n const problemLines = []\n const targetGroups = groupBy(\n linesToCheck,\n (lineObj) => lineObj.mnemonic.target,\n )\n for (const target in targetGroups) {\n if (!this.targets[target]) {\n for (const lineObj of targetGroups[target]) {\n problemLines.push({\n ...lineObj,\n error: `Target \"${target}\" does not exist.`,\n })\n }\n continue\n }\n const packetGroups = groupBy(\n targetGroups[target],\n (lineObj) => lineObj.mnemonic.packet,\n )\n for (const packet in packetGroups) {\n for (const lineObj of packetGroups[packet]) {\n const cmdOrTlm = lineObj.mnemonic.item ? 'tlm' : 'cmd'\n if (!this.targets[target][cmdOrTlm]) {\n const method = lineObj.mnemonic.item\n ? 'get_all_tlm'\n : 'get_all_cmds'\n const response = await this.api[method](target)\n this.targets[target][cmdOrTlm] = response.reduce(\n (result, packetInfo) => {\n result[packetInfo.packet_name] = packetInfo.items.map(\n (item) => item.name,\n )\n return result\n },\n {},\n )\n }\n\n const items = this.targets[target][cmdOrTlm][packet]\n if (!items) {\n problemLines.push({\n ...lineObj,\n error: `${\n cmdOrTlm === 'tlm' ? 'Packet' : 'Command'\n } \"${target} ${packet}\" does not exist.`,\n })\n continue\n }\n if (lineObj.mnemonic.item) {\n if (!items.some((item) => item === lineObj.mnemonic.item)) {\n problemLines.push({\n ...lineObj,\n error: `Item \"${target} ${packet} ${lineObj.mnemonic.item}\" does not exist.`,\n })\n continue\n }\n } else {\n for (const param of lineObj.mnemonic.params) {\n if (!items.some((item) => item === param)) {\n problemLines.push({\n ...lineObj,\n error: `Command \"${target} ${packet}\" param \"${param}\" does not exist.`,\n })\n continue\n }\n }\n }\n }\n }\n }\n return problemLines\n }\n}\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 2025, 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-card flat class=\"tab-card\">\n <v-tabs\n v-model=\"activeTab\"\n bg-color=\"var(--color-background-base-default)\"\n >\n <v-tab value=\"running\">Running Scripts</v-tab>\n <v-tab value=\"completed\">Completed Scripts</v-tab>\n </v-tabs>\n <v-window v-model=\"activeTab\">\n <!-- Running Scripts Tab -->\n <v-window-item value=\"running\">\n <v-card-title>\n <v-row dense>\n <v-spacer />\n <v-btn class=\"mr-3\" color=\"primary\" @click=\"getRunningScripts\"\n >Refresh</v-btn\n >\n <v-text-field\n v-model=\"runningSearch\"\n class=\"pt-0 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=\"running-search\"\n style=\"max-width: 300px\"\n />\n </v-row>\n </v-card-title>\n\n <v-data-table-server\n :headers=\"runningHeaders\"\n :items=\"runningScripts\"\n :items-length=\"runningTotal\"\n :loading=\"runningLoading\"\n :search=\"runningSearch\"\n density=\"compact\"\n data-test=\"running-scripts\"\n :items-per-page=\"runningItemsPerPage\"\n :page=\"runningPage\"\n :items-per-page-options=\"[10, 25, 50]\"\n class=\"script-table\"\n @update:page=\"updateRunningPage\"\n @update:items-per-page=\"updateRunningItemsPerPage\"\n >\n <template #item.name=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n @click=\"showScript(item)\"\n >{{ item.name }}</v-btn\n >\n </template>\n <template #item.connect=\"{ item }\">\n <v-btn color=\"primary\" @click=\"connectScript(item)\">\n <span>Connect</span>\n <v-icon v-show=\"connectInNewTab\" end> mdi-open-in-new </v-icon>\n </v-btn>\n </template>\n <template #item.stop=\"{ item }\">\n <v-btn color=\"primary\" @click=\"deleteScript(item)\">\n <span>Stop</span>\n <v-icon end> mdi-close-circle-outline </v-icon>\n </v-btn>\n </template>\n </v-data-table-server>\n </v-window-item>\n\n <!-- Completed Scripts Tab -->\n <v-window-item value=\"completed\">\n <v-card-title>\n <v-row dense>\n <v-spacer />\n <v-btn class=\"mr-3\" color=\"primary\" @click=\"getCompletedScripts\"\n >Refresh</v-btn\n >\n <v-text-field\n v-model=\"completedSearch\"\n class=\"pt-0 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 style=\"max-width: 300px\"\n />\n </v-row>\n </v-card-title>\n\n <v-data-table-server\n :headers=\"completedHeaders\"\n :items=\"completedScripts\"\n :items-length=\"completedTotal\"\n :loading=\"completedLoading\"\n :search=\"completedSearch\"\n density=\"compact\"\n data-test=\"completed-scripts\"\n :items-per-page=\"completedItemsPerPage\"\n :page=\"completedPage\"\n :items-per-page-options=\"[10, 25, 50]\"\n class=\"script-table\"\n @update:page=\"updateCompletedPage\"\n @update:items-per-page=\"updateCompletedItemsPerPage\"\n >\n <template #item.name=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n @click=\"showScript(item)\"\n >{{ item.name }}</v-btn\n >\n </template>\n <template #item.log=\"{ item }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-eye\"\n @click=\"viewScriptLog(item, 'log')\"\n />\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-file-download-outline\"\n :disabled=\"downloadScript\"\n :loading=\"downloadScript && downloadScript.name === item.name\"\n @click=\"downloadScriptLog(item, 'log')\"\n />\n </template>\n <template #item.report=\"{ item }\">\n <div v-if=\"!item.report\">\n <span>N/A</span>\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-eye\"\n @click=\"viewScriptLog(item, 'report')\"\n />\n <v-menu>\n <template #activator=\"{ props }\">\n <v-btn\n color=\"primary\"\n density=\"comfortable\"\n icon=\"mdi-file-download-outline\"\n :disabled=\"downloadScript\"\n :loading=\"\n downloadScript && downloadScript.name === item.name\n \"\n v-bind=\"props\"\n />\n </template>\n <v-list>\n <v-list-item\n @click=\"downloadScriptLog(item, 'report', 'text')\"\n >\n <v-list-item-title>Download as Text</v-list-item-title>\n </v-list-item>\n <v-list-item\n @click=\"downloadScriptLog(item, 'report', 'ctrf')\"\n >\n <v-list-item-title>Download as CTRF</v-list-item-title>\n </v-list-item>\n </v-list>\n </v-menu>\n </div>\n </template>\n </v-data-table-server>\n </v-window-item>\n </v-window>\n </v-card>\n\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"dialogContent\"\n type=\"Script\"\n :name=\"dialogName\"\n :filename=\"dialogFilename\"\n @submit=\"showDialog = false\"\n />\n </div>\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { OutputDialog } from '@/components'\nimport { TimeFilters } from '@/util'\n\nexport default {\n components: { OutputDialog },\n mixins: [TimeFilters],\n props: {\n tabId: {\n type: Number,\n default: null,\n },\n curTab: {\n type: Number,\n default: null,\n },\n connectInNewTab: Boolean,\n },\n emits: ['disconnect', 'close'],\n data() {\n return {\n api: null,\n timeZone: 'local',\n activeTab: 'completed',\n downloadScript: null,\n refreshTimer: null,\n // Running scripts pagination data\n runningSearch: '',\n runningScripts: [],\n runningTotal: 0,\n runningLoading: false,\n runningPage: 1,\n runningItemsPerPage: 10,\n runningHeaders: [\n {\n title: 'Connect',\n key: 'connect',\n sortable: false,\n filterable: false,\n },\n { title: 'Id', key: 'name' },\n { title: 'User', key: 'user_display' },\n { title: 'Filename', key: 'filename' },\n { title: 'Start Time', key: 'start_time_formatted' },\n { title: 'Duration', key: 'duration' },\n { title: 'State', key: 'state' },\n {\n title: 'Stop',\n key: 'stop',\n sortable: false,\n filterable: false,\n },\n ],\n // Completed scripts pagination data\n completedSearch: '',\n completedScripts: [],\n completedTotal: 0,\n completedLoading: false,\n completedPage: 1,\n completedItemsPerPage: 10,\n completedHeaders: [\n { title: 'Id', key: 'name' },\n { title: 'User', key: 'user_display' },\n { title: 'Filename', key: 'filename' },\n { title: 'Start Time', key: 'start_time_formatted' },\n { title: 'Duration', key: 'duration' },\n { title: 'State', key: 'state' },\n {\n title: 'Log',\n key: 'log',\n sortable: false,\n filterable: false,\n },\n {\n title: 'Report',\n key: 'report',\n sortable: false,\n filterable: false,\n },\n ],\n showDialog: false,\n dialogName: '',\n dialogContent: '',\n dialogFilename: '',\n }\n },\n watch: {\n activeTab(newTab) {\n if (newTab === 'running') {\n this.getRunningScripts()\n } else if (newTab === 'completed') {\n this.getCompletedScripts()\n }\n },\n },\n created() {\n this.api = new OpenC3Api()\n this.api\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch((error) => {\n // Do nothing\n })\n\n this.getRunningScripts()\n this.getCompletedScripts()\n\n // Start a timer to refresh the running scripts list every 5 seconds\n this.refreshTimer = setInterval(() => {\n if (this.activeTab === 'running') {\n this.getRunningScripts()\n }\n }, 5000)\n },\n beforeUnmount() {\n // Clear the timer when component is unmounted\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer)\n }\n },\n methods: {\n getRunningScripts: function () {\n this.runningLoading = true\n const offset = (this.runningPage - 1) * this.runningItemsPerPage\n Api.get(\n `/script-api/running-script?scope=DEFAULT&offset=${offset}&limit=${this.runningItemsPerPage}`,\n )\n .then((response) => {\n const scripts = response.data.items || []\n const currentTime = new Date()\n\n // Calculate duration for each running script and format user info\n scripts.forEach((script) => {\n // Format user display as \"full_name (username)\"\n script.user_display = `${script.user_full_name} (${script.username})`\n\n // Calculate duration\n if (script.start_time) {\n const startTime = new Date(script.start_time)\n const durationMs = currentTime - startTime\n script.start_time_formatted = this.formatDateTimeHMS(\n startTime,\n this.timeZone,\n )\n // Format duration\n if (durationMs < 0) {\n script.duration = 'N/A'\n } else if (durationMs < 1000) {\n script.duration = '< 1s'\n } else if (durationMs < 60000) {\n script.duration = `${Math.round(durationMs / 1000)}s`\n } else if (durationMs < 3600000) {\n const minutes = Math.floor(durationMs / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${minutes}m ${seconds}s`\n } else {\n const hours = Math.floor(durationMs / 3600000)\n const minutes = Math.floor((durationMs % 3600000) / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${hours}h ${minutes}m ${seconds}s`\n }\n } else {\n script.duration = 'N/A'\n }\n })\n\n this.runningScripts = scripts\n this.runningTotal = response.data.total || scripts.length\n this.runningLoading = false\n })\n .catch((error) => {\n this.runningLoading = false\n this.$notify.caution({\n title: 'Error Loading Running Scripts',\n body: error.message,\n })\n })\n },\n updateRunningPage: function (page) {\n this.runningPage = page\n this.getRunningScripts()\n },\n updateRunningItemsPerPage: function (itemsPerPage) {\n this.runningItemsPerPage = itemsPerPage\n this.runningPage = 1\n this.getRunningScripts()\n },\n getCompletedScripts: function () {\n this.completedLoading = true\n const offset = (this.completedPage - 1) * this.completedItemsPerPage\n Api.get(\n `/script-api/completed-scripts?scope=DEFAULT&offset=${offset}&limit=${this.completedItemsPerPage}`,\n )\n .then((response) => {\n const scripts = response.data.items || []\n\n // Calculate duration and format user info for each completed script\n scripts.forEach((script) => {\n // Format user display as \"full_name (username)\"\n script.user_display = `${script.user_full_name} (${script.username})`\n\n // Calculate duration\n if (script.start_time && script.end_time) {\n const startTime = new Date(script.start_time)\n const endTime = new Date(script.end_time)\n const durationMs = endTime - startTime\n script.start_time_formatted = this.formatDateTimeHMS(\n startTime,\n this.timeZone,\n )\n\n // Format duration\n if (durationMs < 0) {\n script.duration = 'N/A'\n } else if (durationMs < 1000) {\n script.duration = '< 1s'\n } else if (durationMs < 60000) {\n script.duration = `${Math.round(durationMs / 1000)}s`\n } else if (durationMs < 3600000) {\n const minutes = Math.floor(durationMs / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${minutes}m ${seconds}s`\n } else {\n const hours = Math.floor(durationMs / 3600000)\n const minutes = Math.floor((durationMs % 3600000) / 60000)\n const seconds = Math.round((durationMs % 60000) / 1000)\n script.duration = `${hours}h ${minutes}m ${seconds}s`\n }\n } else {\n script.duration = 'N/A'\n }\n })\n\n this.completedScripts = scripts\n this.completedTotal = response.data.total || scripts.length\n this.completedLoading = false\n })\n .catch((error) => {\n this.completedLoading = false\n this.$notify.caution({\n title: 'Error Loading Completed Scripts',\n body: error.message,\n })\n })\n },\n updateCompletedPage: function (page) {\n this.completedPage = page\n this.getCompletedScripts()\n },\n updateCompletedItemsPerPage: function (itemsPerPage) {\n this.completedItemsPerPage = itemsPerPage\n this.completedPage = 1\n this.getCompletedScripts()\n },\n showScript: function (script) {\n this.dialogContent = JSON.stringify(script, null, 2)\n this.dialogName = 'Script: ' + script.name\n this.dialogFilename = ''\n this.showDialog = true\n },\n connectScript: function (script) {\n // Must disconnect before connecting\n this.$emit('disconnect')\n const destination = {\n name: 'ScriptRunner',\n params: { id: script.name },\n }\n if (this.connectInNewTab) {\n let { href } = this.$router.resolve(destination)\n window.open(href, '_blank')\n } else {\n this.$router.push(destination)\n this.$emit('close')\n }\n },\n deleteScript: function (script) {\n this.$dialog\n .confirm(\n `Are you sure you want to stop script: ${script.name} ${script.filename}?\\n`,\n {\n okText: 'Stop',\n cancelText: 'Cancel',\n },\n )\n .then((dialog) => {\n return Api.post(`/script-api/running-script/${script.name}/delete`)\n })\n .then((response) => {\n this.$notify.normal({\n body: `Stopped script: ${script.name} ${script.filename}`,\n })\n this.getRunningScripts()\n })\n .catch((error) => {\n if (error !== true) {\n this.$notify.caution({\n body: `Failed to stop script: ${script.name} ${script.filename}`,\n })\n }\n })\n },\n viewScriptLog: function (script, type) {\n let logUrl = null\n if (type === 'report') {\n this.dialogName = 'Report'\n logUrl = script.report\n } else {\n this.dialogName = 'Log'\n logUrl = script.log\n }\n Api.get(\n `/openc3-api/storage/download_file/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET`,\n ).then((response) => {\n const filenameParts = logUrl.split('/')\n this.dialogFilename = filenameParts[filenameParts.length - 1]\n // Decode Base64 string\n this.dialogContent = window.atob(response.data.contents)\n this.showDialog = true\n })\n },\n downloadScriptLog: function (script, type, format = 'text') {\n let logUrl = null\n if (type === 'report') {\n this.dialogName = 'Report'\n logUrl = script.report\n } else {\n this.dialogName = 'Log'\n logUrl = script.log\n }\n this.downloadScript = script\n\n if (format === 'ctrf' && type === 'report') {\n // For CTRF format, pass format parameter to backend for conversion\n Api.get(\n `/openc3-api/storage/download_file/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET&format=ctrf`,\n )\n .then((response) => {\n // Backend returns the converted CTRF content\n const blob = new Blob([window.atob(response.data.contents)], {\n type: 'application/json',\n })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', response.data.filename)\n link.click()\n this.downloadScript = null\n })\n .catch(() => {\n this.$notify.caution({\n title: `Unable to download log ${logUrl}`,\n body: `You may be able to download this log manually from the 'logs' bucket at ${logUrl}`,\n })\n this.downloadScript = null\n })\n } else {\n // Original download functionality for text format\n Api.get(\n `/openc3-api/storage/download/${encodeURIComponent(\n logUrl,\n )}?bucket=OPENC3_LOGS_BUCKET`,\n )\n .then((response) => {\n const filenameParts = logUrl.split('/')\n const basename = filenameParts[filenameParts.length - 1]\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = response.data.url\n link.setAttribute('download', basename)\n link.click()\n this.downloadScript = null\n })\n .catch(() => {\n this.$notify.caution({\n title: `Unable to download log ${logUrl}`,\n body: `You may be able to download this log manually from the 'logs' bucket at ${logUrl}`,\n })\n this.downloadScript = null\n })\n }\n },\n },\n}\n</script>\n<style>\n.v-sheet {\n background-color: var(--color-background-base-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 <v-card class=\"d-flex flex-column h-100\">\n <v-card-title class=\"d-flex align-center\">\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"download-log\"\n aria-label=\"Download Log\"\n @click=\"downloadLog\"\n />\n Script Messages\n <v-spacer />\n <v-select\n v-model=\"messageOrder\"\n density=\"compact\"\n hide-details\n variant=\"outlined\"\n :items=\"messageOrderOptions\"\n class=\"mr-2\"\n style=\"max-width: 200px\"\n data-test=\"message-order\"\n />\n <v-spacer />\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 class=\"search\"\n data-test=\"search-messages\"\n />\n\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-delete-sweep\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"clear-log\"\n aria-label=\"Clear Log\"\n @click=\"clearLog\"\n />\n </v-card-title>\n <v-card-text class=\"overflow-auto\">\n <v-data-table\n id=\"script-log-messages\"\n :headers=\"headers\"\n :items=\"messages\"\n :search=\"search\"\n :items-per-page=\"-1\"\n hide-default-footer\n density=\"compact\"\n data-test=\"output-messages\"\n >\n <template #item.message=\"{ item }\">\n <div :class=\"messageClass(item.message)\">{{ item.message }}</div>\n </template>\n </v-data-table>\n </v-card-text>\n </v-card>\n</template>\n\n<script>\nimport { format } from 'date-fns'\n\nexport default {\n props: {\n modelValue: {\n type: Array,\n required: true,\n },\n },\n emits: ['sort', 'update:modelValue'],\n data() {\n return {\n search: '',\n headers: [{ title: 'Message', value: 'message', sortable: false }],\n messageOrderOptions: ['Newest on Top', 'Newest on Bottom'],\n messageOrder: 'Newest on Top',\n }\n },\n computed: {\n messages: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n watch: {\n messageOrder: function (newValue, oldValue) {\n this.$emit('sort', newValue)\n },\n },\n methods: {\n messageClass(message) {\n if (\n message.match(/(CHECK|WAIT): .*(success|was within range.*) with value/)\n ) {\n return 'openc3-green'\n } else if (\n message.match(\n /(CHECK|WAIT): .*(failed|failed to be within range.*) with value/,\n )\n ) {\n return 'openc3-red'\n } else {\n return ''\n }\n },\n downloadLog() {\n const output = this.messages.map((message) => message.message).join('\\n')\n const blob = new Blob([output], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute(\n 'download',\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss') + '_sr_message_log.txt',\n )\n link.click()\n },\n clearLog: function () {\n this.$dialog\n .confirm('Are you sure you want to clear the log?', {\n okText: 'Clear',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n this.messages = []\n })\n .catch(function (err) {\n // Canceling the dialog forces catch and sets err to true\n })\n },\n },\n}\n</script>\n","import { useSlots as ce, ref as k, computed as z, watch as B, onMounted as G, onBeforeUnmount as X, provide as g, createBlock as ve, openBlock as Y, resolveDynamicComponent as me, nextTick as T, h as fe, inject as w, getCurrentInstance as de, createElementBlock as pe, normalizeStyle as ze, unref as he, renderSlot as xe } from \"vue\";\nconst Pe = {\n __name: \"splitpanes\",\n props: {\n horizontal: { type: Boolean, default: !1 },\n pushOtherPanes: { type: Boolean, default: !0 },\n maximizePanes: { type: Boolean, default: !0 },\n // Maximize pane on splitter double click/tap.\n rtl: { type: Boolean, default: !1 },\n // Right to left direction.\n firstSplitter: { type: Boolean, default: !1 }\n },\n emits: [\n \"ready\",\n \"resize\",\n \"resized\",\n \"pane-click\",\n \"pane-maximize\",\n \"pane-add\",\n \"pane-remove\",\n \"splitter-click\",\n \"splitter-dblclick\"\n ],\n setup(D, { emit: h }) {\n const y = h, u = D, E = ce(), l = k([]), M = z(() => l.value.reduce((e, n) => (e[~~n.id] = n) && e, {})), m = z(() => l.value.length), x = k(null), S = k(!1), c = k({\n mouseDown: !1,\n dragging: !1,\n activeSplitter: null,\n cursorOffset: 0\n // Cursor offset within the splitter.\n }), f = k({\n // Used to detect double click on touch devices.\n splitter: null,\n timeoutId: null\n }), _ = z(() => ({\n [`splitpanes splitpanes--${u.horizontal ? \"horizontal\" : \"vertical\"}`]: !0,\n \"splitpanes--dragging\": c.value.dragging\n })), R = () => {\n document.addEventListener(\"mousemove\", r, { passive: !1 }), document.addEventListener(\"mouseup\", P), \"ontouchstart\" in window && (document.addEventListener(\"touchmove\", r, { passive: !1 }), document.addEventListener(\"touchend\", P));\n }, O = () => {\n document.removeEventListener(\"mousemove\", r, { passive: !1 }), document.removeEventListener(\"mouseup\", P), \"ontouchstart\" in window && (document.removeEventListener(\"touchmove\", r, { passive: !1 }), document.removeEventListener(\"touchend\", P));\n }, b = (e, n) => {\n const t = e.target.closest(\".splitpanes__splitter\");\n if (t) {\n const { left: i, top: a } = t.getBoundingClientRect(), { clientX: s, clientY: o } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n c.value.cursorOffset = u.horizontal ? o - a : s - i;\n }\n R(), c.value.mouseDown = !0, c.value.activeSplitter = n;\n }, r = (e) => {\n c.value.mouseDown && (e.preventDefault(), c.value.dragging = !0, requestAnimationFrame(() => {\n K(I(e)), d(\"resize\", { event: e }, !0);\n }));\n }, P = (e) => {\n c.value.dragging && (window.getSelection().removeAllRanges(), d(\"resized\", { event: e }, !0)), c.value.mouseDown = !1, c.value.activeSplitter = null, setTimeout(() => {\n c.value.dragging = !1, O();\n }, 100);\n }, A = (e, n) => {\n \"ontouchstart\" in window && (e.preventDefault(), f.value.splitter === n ? (clearTimeout(f.value.timeoutId), f.value.timeoutId = null, U(e, n), f.value.splitter = null) : (f.value.splitter = n, f.value.timeoutId = setTimeout(() => f.value.splitter = null, 500))), c.value.dragging || d(\"splitter-click\", { event: e, index: n }, !0);\n }, U = (e, n) => {\n if (d(\"splitter-dblclick\", { event: e, index: n }, !0), u.maximizePanes) {\n let t = 0;\n l.value = l.value.map((i, a) => (i.size = a === n ? i.max : i.min, a !== n && (t += i.min), i)), l.value[n].size -= t, d(\"pane-maximize\", { event: e, index: n, pane: l.value[n] }), d(\"resized\", { event: e, index: n }, !0);\n }\n }, W = (e, n) => {\n d(\"pane-click\", {\n event: e,\n index: M.value[n].index,\n pane: M.value[n]\n });\n }, I = (e) => {\n const n = x.value.getBoundingClientRect(), { clientX: t, clientY: i } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n return {\n x: t - (u.horizontal ? 0 : c.value.cursorOffset) - n.left,\n y: i - (u.horizontal ? c.value.cursorOffset : 0) - n.top\n };\n }, J = (e) => {\n e = e[u.horizontal ? \"y\" : \"x\"];\n const n = x.value[u.horizontal ? \"clientHeight\" : \"clientWidth\"];\n return u.rtl && !u.horizontal && (e = n - e), e * 100 / n;\n }, K = (e) => {\n const n = c.value.activeSplitter;\n let t = {\n prevPanesSize: $(n),\n nextPanesSize: N(n),\n prevReachedMinPanes: 0,\n nextReachedMinPanes: 0\n };\n const i = 0 + (u.pushOtherPanes ? 0 : t.prevPanesSize), a = 100 - (u.pushOtherPanes ? 0 : t.nextPanesSize), s = Math.max(Math.min(J(e), a), i);\n let o = [n, n + 1], v = l.value[o[0]] || null, p = l.value[o[1]] || null;\n const H = v.max < 100 && s >= v.max + t.prevPanesSize, ue = p.max < 100 && s <= 100 - (p.max + N(n + 1));\n if (H || ue) {\n H ? (v.size = v.max, p.size = Math.max(100 - v.max - t.prevPanesSize - t.nextPanesSize, 0)) : (v.size = Math.max(100 - p.max - t.prevPanesSize - N(n + 1), 0), p.size = p.max);\n return;\n }\n if (u.pushOtherPanes) {\n const j = Q(t, s);\n if (!j) return;\n ({ sums: t, panesToResize: o } = j), v = l.value[o[0]] || null, p = l.value[o[1]] || null;\n }\n v !== null && (v.size = Math.min(Math.max(s - t.prevPanesSize - t.prevReachedMinPanes, v.min), v.max)), p !== null && (p.size = Math.min(Math.max(100 - s - t.nextPanesSize - t.nextReachedMinPanes, p.min), p.max));\n }, Q = (e, n) => {\n const t = c.value.activeSplitter, i = [t, t + 1];\n return n < e.prevPanesSize + l.value[i[0]].min && (i[0] = V(t).index, e.prevReachedMinPanes = 0, i[0] < t && l.value.forEach((a, s) => {\n s > i[0] && s <= t && (a.size = a.min, e.prevReachedMinPanes += a.min);\n }), e.prevPanesSize = $(i[0]), i[0] === void 0) ? (e.prevReachedMinPanes = 0, l.value[0].size = l.value[0].min, l.value.forEach((a, s) => {\n s > 0 && s <= t && (a.size = a.min, e.prevReachedMinPanes += a.min);\n }), l.value[i[1]].size = 100 - e.prevReachedMinPanes - l.value[0].min - e.prevPanesSize - e.nextPanesSize, null) : n > 100 - e.nextPanesSize - l.value[i[1]].min && (i[1] = Z(t).index, e.nextReachedMinPanes = 0, i[1] > t + 1 && l.value.forEach((a, s) => {\n s > t && s < i[1] && (a.size = a.min, e.nextReachedMinPanes += a.min);\n }), e.nextPanesSize = N(i[1] - 1), i[1] === void 0) ? (e.nextReachedMinPanes = 0, l.value.forEach((a, s) => {\n s < m.value - 1 && s >= t + 1 && (a.size = a.min, e.nextReachedMinPanes += a.min);\n }), l.value[i[0]].size = 100 - e.prevPanesSize - N(i[0] - 1), null) : { sums: e, panesToResize: i };\n }, $ = (e) => l.value.reduce((n, t, i) => n + (i < e ? t.size : 0), 0), N = (e) => l.value.reduce((n, t, i) => n + (i > e + 1 ? t.size : 0), 0), V = (e) => [...l.value].reverse().find((t) => t.index < e && t.size > t.min) || {}, Z = (e) => l.value.find((t) => t.index > e + 1 && t.size > t.min) || {}, ee = () => {\n var n;\n const e = Array.from(((n = x.value) == null ? void 0 : n.children) || []);\n for (const t of e) {\n const i = t.classList.contains(\"splitpanes__pane\"), a = t.classList.contains(\"splitpanes__splitter\");\n !i && !a && (t.remove(), console.warn(\"Splitpanes: Only <pane> elements are allowed at the root of <splitpanes>. One of your DOM nodes was removed.\"));\n }\n }, F = (e, n, t = !1) => {\n const i = e - 1, a = document.createElement(\"div\");\n a.classList.add(\"splitpanes__splitter\"), t || (a.onmousedown = (s) => b(s, i), typeof window < \"u\" && \"ontouchstart\" in window && (a.ontouchstart = (s) => b(s, i)), a.onclick = (s) => A(s, i + 1)), a.ondblclick = (s) => U(s, i + 1), n.parentNode.insertBefore(a, n);\n }, ne = (e) => {\n e.onmousedown = void 0, e.onclick = void 0, e.ondblclick = void 0, e.remove();\n }, C = () => {\n var t;\n const e = Array.from(((t = x.value) == null ? void 0 : t.children) || []);\n for (const i of e)\n i.className.includes(\"splitpanes__splitter\") && ne(i);\n let n = 0;\n for (const i of e)\n i.className.includes(\"splitpanes__pane\") && (!n && u.firstSplitter ? F(n, i, !0) : n && F(n, i), n++);\n }, ie = ({ uid: e, ...n }) => {\n const t = M.value[e];\n for (const [i, a] of Object.entries(n)) t[i] = a;\n }, te = (e) => {\n var t;\n let n = -1;\n Array.from(((t = x.value) == null ? void 0 : t.children) || []).some((i) => (i.className.includes(\"splitpanes__pane\") && n++, i.isSameNode(e.el))), l.value.splice(n, 0, { ...e, index: n }), l.value.forEach((i, a) => i.index = a), S.value && T(() => {\n C(), L({ addedPane: l.value[n] }), d(\"pane-add\", { pane: l.value[n] });\n });\n }, ae = (e) => {\n const n = l.value.findIndex((i) => i.id === e);\n l.value[n].el = null;\n const t = l.value.splice(n, 1)[0];\n l.value.forEach((i, a) => i.index = a), T(() => {\n C(), d(\"pane-remove\", { pane: t }), L({ removedPane: { ...t } });\n });\n }, L = (e = {}) => {\n !e.addedPane && !e.removedPane ? le() : l.value.some((n) => n.givenSize !== null || n.min || n.max < 100) ? oe(e) : se(), S.value && d(\"resized\");\n }, se = () => {\n const e = 100 / m.value;\n let n = 0;\n const t = [], i = [];\n for (const a of l.value)\n a.size = Math.max(Math.min(e, a.max), a.min), n -= a.size, a.size >= a.max && t.push(a.id), a.size <= a.min && i.push(a.id);\n n > 0.1 && q(n, t, i);\n }, le = () => {\n let e = 100;\n const n = [], t = [];\n let i = 0;\n for (const s of l.value)\n e -= s.size, s.givenSize !== null && i++, s.size >= s.max && n.push(s.id), s.size <= s.min && t.push(s.id);\n let a = 100;\n if (e > 0.1) {\n for (const s of l.value)\n s.givenSize === null && (s.size = Math.max(Math.min(e / (m.value - i), s.max), s.min)), a -= s.size;\n a > 0.1 && q(a, n, t);\n }\n }, oe = ({ addedPane: e, removedPane: n } = {}) => {\n let t = 100 / m.value, i = 0;\n const a = [], s = [];\n ((e == null ? void 0 : e.givenSize) ?? null) !== null && (t = (100 - e.givenSize) / (m.value - 1));\n for (const o of l.value)\n i -= o.size, o.size >= o.max && a.push(o.id), o.size <= o.min && s.push(o.id);\n if (!(Math.abs(i) < 0.1)) {\n for (const o of l.value)\n (e == null ? void 0 : e.givenSize) !== null && (e == null ? void 0 : e.id) === o.id || (o.size = Math.max(Math.min(t, o.max), o.min)), i -= o.size, o.size >= o.max && a.push(o.id), o.size <= o.min && s.push(o.id);\n i > 0.1 && q(i, a, s);\n }\n }, q = (e, n, t) => {\n let i;\n e > 0 ? i = e / (m.value - n.length) : i = e / (m.value - t.length), l.value.forEach((a, s) => {\n if (e > 0 && !n.includes(a.id)) {\n const o = Math.max(Math.min(a.size + i, a.max), a.min), v = o - a.size;\n e -= v, a.size = o;\n } else if (!t.includes(a.id)) {\n const o = Math.max(Math.min(a.size + i, a.max), a.min), v = o - a.size;\n e -= v, a.size = o;\n }\n }), Math.abs(e) > 0.1 && T(() => {\n S.value && console.warn(\"Splitpanes: Could not resize panes correctly due to their constraints.\");\n });\n }, d = (e, n = void 0, t = !1) => {\n const i = (n == null ? void 0 : n.index) ?? c.value.activeSplitter ?? null;\n y(e, {\n ...n,\n ...i !== null && { index: i },\n ...t && i !== null && {\n prevPane: l.value[i - (u.firstSplitter ? 1 : 0)],\n nextPane: l.value[i + (u.firstSplitter ? 0 : 1)]\n },\n panes: l.value.map((a) => ({ min: a.min, max: a.max, size: a.size }))\n });\n };\n B(() => u.firstSplitter, () => C()), G(() => {\n ee(), C(), L(), d(\"ready\"), S.value = !0;\n }), X(() => S.value = !1);\n const re = () => {\n var e;\n return fe(\n \"div\",\n { ref: x, class: _.value },\n (e = E.default) == null ? void 0 : e.call(E)\n );\n };\n return g(\"panes\", l), g(\"indexedPanes\", M), g(\"horizontal\", z(() => u.horizontal)), g(\"requestUpdate\", ie), g(\"onPaneAdd\", te), g(\"onPaneRemove\", ae), g(\"onPaneClick\", W), (e, n) => (Y(), ve(me(re)));\n }\n}, ge = {\n __name: \"pane\",\n props: {\n size: { type: [Number, String] },\n minSize: { type: [Number, String], default: 0 },\n maxSize: { type: [Number, String], default: 100 }\n },\n setup(D) {\n var b;\n const h = D, y = w(\"requestUpdate\"), u = w(\"onPaneAdd\"), E = w(\"horizontal\"), l = w(\"onPaneRemove\"), M = w(\"onPaneClick\"), m = (b = de()) == null ? void 0 : b.uid, x = w(\"indexedPanes\"), S = z(() => x.value[m]), c = k(null), f = z(() => {\n const r = isNaN(h.size) || h.size === void 0 ? 0 : parseFloat(h.size);\n return Math.max(Math.min(r, R.value), _.value);\n }), _ = z(() => {\n const r = parseFloat(h.minSize);\n return isNaN(r) ? 0 : r;\n }), R = z(() => {\n const r = parseFloat(h.maxSize);\n return isNaN(r) ? 100 : r;\n }), O = z(() => {\n var r;\n return `${E.value ? \"height\" : \"width\"}: ${(r = S.value) == null ? void 0 : r.size}%`;\n });\n return B(() => f.value, (r) => y({ uid: m, size: r })), B(() => _.value, (r) => y({ uid: m, min: r })), B(() => R.value, (r) => y({ uid: m, max: r })), G(() => {\n u({\n id: m,\n el: c.value,\n min: _.value,\n max: R.value,\n // The given size (useful to know the user intention).\n givenSize: h.size === void 0 ? null : f.value,\n size: f.value\n // The computed current size at any time.\n });\n }), X(() => l(m)), (r, P) => (Y(), pe(\"div\", {\n ref_key: \"paneEl\",\n ref: c,\n class: \"splitpanes__pane\",\n onClick: P[0] || (P[0] = (A) => he(M)(A, r._.uid)),\n style: ze(O.value)\n }, [\n xe(r.$slots, \"default\")\n ], 4));\n }\n};\nexport {\n ge as Pane,\n Pe as Splitpanes\n};\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 <v-dialog v-model=\"show\" persistent width=\"600\" @keydown.esc=\"cancelHandler\">\n <v-card>\n <v-form v-model=\"valid\" @submit.prevent=\"submitHandler\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> User Input Required </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <div class=\"question\">{{ question }}</div>\n <v-text-field\n v-model=\"inputValue\"\n autofocus\n data-test=\"ask-value-input\"\n :type=\"password ? 'password' : 'text'\"\n :rules=\"rules\"\n />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"ask-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n type=\"submit\"\n data-test=\"ask-ok\"\n :disabled=\"!valid\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n question: {\n type: String,\n required: true,\n },\n default: {\n type: String,\n default: null,\n },\n password: {\n type: Boolean,\n default: false,\n },\n answerRequired: {\n type: Boolean,\n default: true,\n },\n modelValue: Boolean,\n },\n emits: ['update:modelValue', 'response'],\n data() {\n return {\n inputValue: '',\n valid: false,\n rules: [(v) => !!v || 'Required'],\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 },\n created() {\n if (this.default) {\n this.valid = true\n this.inputValue = this.default\n }\n if (this.answerRequired === false) {\n this.valid = true\n this.rules = [(v) => true]\n }\n },\n methods: {\n submitHandler: function () {\n this.$emit('response', this.inputValue)\n },\n cancelHandler: function () {\n this.$emit('response', 'COSMOS__CANCEL')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.question {\n font-size: 1rem;\n white-space: pre-line;\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 <v-dialog v-model=\"show\" persistent width=\"800\" @keydown.esc=\"cancelHandler\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Bucket Dialog </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row>\n <span class=\"text-h6\">{{ title }}</span>\n </v-row>\n <v-row v-if=\"message\">\n <span class=\"ma-3\" style=\"white-space: pre-line\" v-text=\"message\" />\n </v-row>\n <v-row class=\"my-2\">\n <v-chip\n v-for=\"(bucket, index) in buckets\"\n :key=\"index\"\n :variant=\"selectedBucket === bucket ? 'elevated' : 'outlined'\"\n color=\"primary\"\n class=\"ma-2\"\n data-test=\"bucket-chip\"\n @click.stop=\"selectBucket(bucket)\"\n >\n <v-icon start>mdi-bucket</v-icon>\n {{ bucket }}\n </v-chip>\n </v-row>\n <v-row v-if=\"selectedBucket\" class=\"my-1\">\n <v-col class=\"pa-0\">\n <v-row\n class=\"ma-0 align-center\"\n style=\"background-color: var(--color-background-surface-header)\"\n >\n <v-btn\n icon=\"mdi-chevron-left-box-outline\"\n variant=\"text\"\n density=\"compact\"\n class=\"ml-2\"\n data-test=\"bucket-nav-back\"\n aria-label=\"Navigate Back\"\n @click.stop=\"backArrow\"\n />\n <div\n class=\"ma-2\"\n style=\"font-size: 0.875rem\"\n data-test=\"bucket-path\"\n >\n {{ selectedBucket }}/<span\n v-for=\"(part, index) in breadcrumbPath\"\n :key=\"index\"\n ><a\n style=\"cursor: pointer\"\n @click.prevent=\"gotoPath(part.path)\"\n >{{ part.name }}</a\n >/</span\n >\n </div>\n </v-row>\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 class=\"mx-2 mt-2\"\n data-test=\"bucket-search\"\n />\n <v-list\n density=\"compact\"\n class=\"bucket-file-list\"\n data-test=\"bucket-file-list\"\n >\n <v-list-item v-if=\"loading\">\n <v-progress-circular indeterminate size=\"20\" class=\"mr-2\" />\n Loading...\n </v-list-item>\n <v-list-item\n v-for=\"item in filteredFiles\"\n :key=\"item.name\"\n :class=\"{\n 'selected-file':\n selectedFile === item.name && item.icon === 'mdi-file',\n }\"\n :data-test=\"`bucket-item-${item.name}`\"\n @click=\"itemClick(item)\"\n @dblclick=\"itemDblClick(item)\"\n >\n <template #prepend>\n <v-icon>{{ item.icon }}</v-icon>\n </template>\n <v-list-item-title>{{ item.name }}</v-list-item-title>\n <template v-if=\"item.size\" #append>\n <span class=\"text-caption\">{{\n formatSize(item.size)\n }}</span>\n </template>\n </v-list-item>\n <v-list-item v-if=\"!loading && filteredFiles.length === 0\">\n <v-list-item-title class=\"text-caption text-grey\">\n No files found\n </v-list-item-title>\n </v-list-item>\n </v-list>\n </v-col>\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"bucket-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"bucket-ok\"\n :disabled=\"!selectedFile\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\n\nexport default {\n props: {\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n default: null,\n },\n modelValue: Boolean,\n },\n emits: ['update:modelValue', 'response'],\n data() {\n return {\n buckets: [],\n selectedBucket: null,\n path: '',\n files: [],\n selectedFile: null,\n search: '',\n loading: false,\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 breadcrumbPath() {\n if (!this.path) return []\n const parts = this.path.split('/').filter((p) => !!p)\n return parts.map((part, index) => ({\n name: part,\n path: parts.slice(0, index + 1).join('/') + '/',\n }))\n },\n filteredFiles() {\n if (!this.search) return this.files\n const term = this.search.toLowerCase()\n return this.files.filter((f) => f.name.toLowerCase().includes(term))\n },\n },\n created() {\n Api.get('/openc3-api/storage/buckets').then((response) => {\n this.buckets = response.data\n })\n },\n methods: {\n formatSize(bytes) {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n },\n selectBucket(bucket) {\n this.selectedBucket = bucket\n this.path = ''\n this.selectedFile = null\n this.updateFiles()\n },\n backArrow() {\n if (this.path === '') return\n const parts = this.path.split('/')\n this.path = parts.slice(0, -2).join('/')\n if (this.path) {\n this.path += '/'\n }\n this.selectedFile = null\n this.updateFiles()\n },\n gotoPath(path) {\n this.path = path\n this.selectedFile = null\n this.updateFiles()\n },\n itemClick(item) {\n if (item.icon === 'mdi-folder') {\n this.path += `${item.name}/`\n this.selectedFile = null\n this.updateFiles()\n } else {\n this.selectedFile = item.name\n }\n },\n itemDblClick(item) {\n if (item.icon === 'mdi-file') {\n this.selectedFile = item.name\n this.submitHandler()\n }\n },\n updateFiles() {\n this.loading = true\n const root = this.selectedBucket.toUpperCase()\n Api.get(`/openc3-api/storage/files/OPENC3_${root}_BUCKET/${this.path}`)\n .then((response) => {\n this.files = response.data[0].map((dir) => ({\n name: dir,\n icon: 'mdi-folder',\n }))\n this.files = this.files.concat(\n response.data[1].map((item) => ({\n name: item.name,\n icon: 'mdi-file',\n size: item.size,\n })),\n )\n this.loading = false\n })\n .catch(() => {\n this.files = []\n this.loading = false\n })\n },\n submitHandler() {\n this.$emit('response', {\n bucket: `OPENC3_${this.selectedBucket.toUpperCase()}_BUCKET`,\n path: `${this.path}${this.selectedFile}`,\n filename: this.selectedFile,\n })\n },\n cancelHandler() {\n this.$emit('response', 'COSMOS__CANCEL')\n },\n },\n}\n</script>\n\n<style scoped>\n.bucket-file-list {\n max-height: 300px;\n overflow-y: auto;\n border: 1px solid rgba(var(--v-border-color), var(--v-border-opacity));\n border-radius: 4px;\n margin-top: 8px;\n}\n.selected-file {\n background-color: rgba(var(--v-theme-primary), 0.15);\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 <v-dialog v-model=\"show\" persistent width=\"600\" @keydown.esc=\"cancelHandler\">\n <v-card>\n <v-form v-model=\"valid\" @submit.prevent=\"submitHandler\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> File Dialog </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row>\n <span class=\"text-h6\">{{ title }}</span>\n </v-row>\n <v-row v-if=\"message\">\n <span\n class=\"ma-3\"\n style=\"white-space: pre-line\"\n v-text=\"message\"\n />\n </v-row>\n <v-row class=\"my-1\">\n <v-file-input\n v-model=\"inputValue\"\n label=\"Choose File\"\n :rules=\"rules\"\n autofocus\n data-test=\"file-input\"\n :accept=\"filter\"\n small-chips\n :multiple=\"multiple\"\n />\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"file-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n type=\"submit\"\n data-test=\"file-ok\"\n :disabled=\"!valid\"\n @click.prevent=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n default: null,\n },\n filter: {\n type: String,\n default: '*',\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n modelValue: Boolean,\n },\n emits: ['update:modelValue', 'response'],\n data() {\n return {\n inputValue: null,\n valid: null,\n rules: [\n (value) => {\n if (this.multiple) {\n return value.length != 0 || 'Required'\n } else {\n return !!value || 'Required'\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)\n },\n },\n },\n methods: {\n submitHandler: function () {\n // Ensure we send back an array of file names even in the single case\n // to make it easier to deal with a consistent result\n if (!Array.isArray(this.inputValue)) {\n this.inputValue = [this.inputValue]\n }\n this.$emit('response', this.inputValue)\n },\n cancelHandler: function () {\n this.$emit('response', 'COSMOS__CANCEL')\n },\n },\n}\n</script>\n\n<style scoped>\n.title {\n font-size: 1.125rem;\n font-weight: bold;\n padding-bottom: 5px;\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 2022, 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 <!-- INFO -->\n <v-dialog v-model=\"show\" :width=\"width\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span style=\"white-space: pre\" v-text=\"title\" />\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row v-for=\"(line, index) in text\" :key=\"index\" no-gutters>\n <span style=\"white-space: pre\" v-text=\"line\" />\n </v-row>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n title: {\n type: String,\n required: true,\n },\n text: {\n type: String,\n required: true,\n },\n width: {\n type: String,\n required: true,\n },\n },\n emits: ['update:modelValue'],\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n methods: {},\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 2022, 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 <v-dialog v-model=\"show\" width=\"1000\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Overrides</span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <v-row class=\"ma-1\">\n <v-btn\n color=\"primary\"\n data-test=\"overrides-dialog-clear-all\"\n @click=\"clearOverrides\"\n >\n Clear All Overrides\n </v-btn>\n <v-spacer />\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 />\n </v-row>\n <v-data-table\n :headers=\"headers\"\n :items=\"overrides\"\n :search=\"search\"\n :items-per-page-options=\"[100]\"\n multi-sort\n density=\"compact\"\n >\n <template #item.delete=\"{ item }\">\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n aria-label=\"Delete Override\"\n @click=\"deleteOverride(item)\"\n />\n </template>\n </v-data-table>\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"flat\"\n data-test=\"overrides-dialog-ok\"\n @click=\"show = !show\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { OpenC3Api } from '@openc3/js-common/services'\n\nexport default {\n components: {},\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n },\n emits: ['update:modelValue'],\n data() {\n return {\n api: null,\n overrides: [],\n search: '',\n headers: [\n { text: 'Target', value: 'target_name' },\n { text: 'Packet', value: 'packet_name' },\n { text: 'Item', value: 'item_name' },\n { text: 'Type', value: 'value_type' },\n { text: 'Value', value: 'value' },\n { text: 'Delete', value: 'delete' },\n ],\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 },\n created: function () {\n this.api = new OpenC3Api()\n this.getOverrides()\n },\n methods: {\n getOverrides: function () {\n this.api.get_overrides().then((result) => {\n this.overrides = result\n })\n },\n clearOverrides: function () {\n const items = [\n ...new Map(\n this.overrides.map((item) => [\n // Create a key based on target, packet, item so we remove duplicates\n `${item.target_name}__${item.packet_name}__${item.item_name}`,\n item,\n ]),\n ).values(),\n ]\n for (let item of items) {\n this.api\n .normalize_tlm(\n item.target_name,\n item.packet_name,\n item.item_name,\n 'ALL',\n )\n .then((result) => {\n this.overrides = []\n })\n }\n },\n deleteOverride: function (item) {\n this.api\n .normalize_tlm(\n item.target_name,\n item.packet_name,\n item.item_name,\n item.value_type,\n )\n .then((result) => {\n let index = this.overrides.indexOf(item)\n this.overrides.splice(index, 1)\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\n<template>\n <v-dialog\n v-model=\"show\"\n persistent\n scrollable\n width=\"600\"\n @keydown.esc=\"cancelHandler\"\n >\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span class=\"text\" v-text=\"title\" />\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\" style=\"max-height: 60vh; overflow: auto\">\n <v-card-text class=\"text\">\n <v-row v-if=\"subtitle\" class=\"mb-2\">\n <v-card-subtitle>{{ subtitle }}</v-card-subtitle>\n </v-row>\n <v-row class=\"mt-1\">\n <span v-text=\"message\" />\n </v-row>\n <v-row v-if=\"details\" class=\"mt-3\">\n <span v-text=\"details\" />\n </v-row>\n </v-card-text>\n </div>\n <div v-if=\"layout === 'combo'\">\n <v-row class=\"ma-2\">\n <v-select\n v-model=\"selectedItem\"\n label=\"Select\"\n color=\"secondary\"\n class=\"ma-1\"\n data-test=\"prompt-select\"\n :items=\"buttons\"\n :multiple=\"multiple === true\"\n @update:model-value=\"selectOkDisabled = false\"\n />\n </v-row>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"prompt-ok\"\n :disabled=\"selectOkDisabled\"\n @click=\"submitHandler\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </div>\n <div v-else-if=\"layout === 'check'\">\n <v-row class=\"ma-2\">\n <v-col>\n <v-checkbox\n v-for=\"(button, index) in buttons\"\n :key=\"index\"\n v-model=\"checkedItems\"\n :label=\"button.title\"\n :value=\"button.value\"\n color=\"secondary\"\n density=\"compact\"\n hide-details\n :data-test=\"`prompt-check-${button.value}`\"\n />\n </v-col>\n </v-row>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"prompt-ok\"\n :disabled=\"checkedItems.length === 0\"\n @click=\"submitChecked\"\n >\n Ok\n </v-btn>\n </v-card-actions>\n </div>\n <div v-else>\n <v-card-actions :class=\"layoutClass\">\n <v-spacer v-if=\"layout !== 'vertical'\" />\n <v-btn\n variant=\"outlined\"\n data-test=\"prompt-cancel\"\n @click=\"cancelHandler\"\n >\n Cancel\n </v-btn>\n <div v-for=\"(button, index) in buttons\" :key=\"index\">\n <v-btn\n variant=\"flat\"\n :data-test=\"`prompt-${button.text}`\"\n @click=\"submitWrapper(button.value)\"\n >\n {{ button.text }}\n </v-btn>\n </div>\n </v-card-actions>\n </div>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n title: {\n type: String,\n default: 'Prompt Dialog',\n },\n subtitle: {\n type: String,\n default: '',\n },\n message: {\n type: String,\n required: true,\n },\n details: {\n type: String,\n default: '',\n },\n buttons: {\n type: Array,\n default: () => [],\n },\n layout: {\n type: String,\n default: 'horizontal', // Also 'vertical', 'combo' for ComboBox, or 'check' for CheckBox\n },\n multiple: {\n type: Boolean,\n default: false,\n required: false,\n },\n modelValue: Boolean,\n },\n emits: ['update:modelValue', 'response'],\n data() {\n return {\n selectOkDisabled: true,\n selectedItem: null,\n checkedItems: [],\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 layoutClass() {\n let layout = 'px-2 d-flex align-start'\n if (this.layout === 'vertical') {\n return `${layout} flex-column prompt-buttons-vertical`\n } else {\n return `${layout} flex-row flex-wrap prompt-buttons-horizontal`\n }\n },\n },\n methods: {\n submitWrapper: function (output) {\n this.selectedItem = output\n this.submitHandler()\n },\n submitHandler: function () {\n this.$emit('response', this.selectedItem)\n },\n submitChecked: function () {\n this.$emit('response', this.checkedItems)\n },\n cancelHandler: function () {\n // Emit a unique value that indicates cancel was clicked so that the caller\n // can differentiate between cancel and a button with the text 'Cancel'\n this.$emit('response', 'COSMOS__CANCEL')\n },\n },\n}\n</script>\n\n<style scoped>\n.v-card__subtitle {\n padding: 0;\n padding-bottom: 10px;\n}\n\n.text {\n font-size: 1rem;\n white-space: pre-line;\n}\n\n.prompt-buttons-vertical {\n max-height: 50vh;\n overflow-y: auto;\n}\n\n.prompt-buttons-horizontal {\n max-height: 50vh;\n overflow-y: auto;\n gap: 8px;\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 2024, 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 <v-dialog v-model=\"show\" scrollable width=\"800\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Script Results </span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text style=\"width: 100%; max-height: 80vh; overflow: auto\">\n <v-textarea\n readonly\n hide-details\n density=\"compact\"\n auto-grow\n :model-value=\"text\"\n />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"outlined\" @click=\"downloadResults\"> Download </v-btn>\n <v-btn ref=\"okButton\" variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { format } from 'date-fns'\n\nexport default {\n components: {},\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n text: {\n type: String,\n required: true,\n },\n },\n emits: ['update:modelValue'],\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value)\n },\n },\n },\n mounted() {\n // Focus the OK button so it's easy to hit Enter to close\n setTimeout(() => {\n this.$refs.okButton.$el.focus()\n })\n },\n methods: {\n downloadResults() {\n const blob = new Blob([this.text], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute(\n 'download',\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss') + '_suite_results.txt',\n )\n link.click()\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 2022, 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 <v-dialog v-model=\"show\" persistent width=\"600\" @keydown.esc=\"cancel\">\n <v-card>\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Script Environment Variables</span>\n <v-spacer />\n </v-toolbar>\n <div class=\"pa-2\">\n <v-card-text>\n <environment-chooser v-model=\"selected\" />\n </v-card-text>\n </div>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n data-test=\"environment-dialog-cancel\"\n @click=\"cancel\"\n >\n Cancel\n </v-btn>\n <v-btn\n variant=\"flat\"\n data-test=\"environment-dialog-save\"\n :disabled=\"!!inputError\"\n @click=\"updateEnvironment\"\n >\n Save\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { EnvironmentChooser } from '@/components'\n\nexport default {\n components: {\n EnvironmentChooser,\n },\n props: {\n modelValue: {\n type: Boolean,\n required: true,\n },\n inputEnvironment: {\n type: Array,\n required: true,\n },\n },\n emits: ['update:modelValue', 'environment'],\n data() {\n return {\n selected: [],\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 },\n mounted: function () {\n this.loadEnvironment()\n },\n methods: {\n loadEnvironment: function () {\n this.selected = [...this.inputEnvironment]\n },\n updateEnvironment: function () {\n this.$emit('environment', this.selected)\n this.show = !this.show\n },\n cancel: function () {\n this.show = !this.show\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 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 <div>\n <div id=\"tr-container\">\n <v-row no-gutters align=\"center\">\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Pause on Error\"\n value=\"pauseOnError\"\n hide-details\n data-test=\"pause-on-error\"\n />\n </div>\n </template>\n <span>\n Checked pauses the script when an error is encountered<br />\n Unchecked continues without user interaction\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Manual\"\n value=\"manual\"\n hide-details\n data-test=\"manual\"\n />\n </div>\n </template>\n <span>\n {{ checkedManualTooltip }}<br />\n {{ uncheckedManualTooltip }}\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"suite\"\n label=\"Suite:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"suites\"\n data-test=\"select-suite\"\n @update:model-value=\"suiteChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-suite\"\n @click=\"$emit('button', { method: 'start', suite, options })\"\n >\n Start\n </v-btn>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n data-test=\"setup-suite\"\n :disabled=\"\n disableButtons || !setupSuiteEnabled || !userInfo.execute\n \"\n @click=\"$emit('button', { method: 'setup', suite, options })\"\n >\n Setup\n </v-btn>\n <v-btn\n color=\"primary\"\n data-test=\"teardown-suite\"\n :disabled=\"\n disableButtons || !teardownSuiteEnabled || !userInfo.execute\n \"\n @click=\"$emit('button', { method: 'teardown', suite, options })\"\n >\n Teardown\n </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Continue after Error\"\n value=\"continueAfterError\"\n hide-details\n data-test=\"continue-after-error\"\n />\n </div>\n </template>\n <span>\n Checked allows the script to continue when an error is\n encountered<br />\n Unchecked forces the current script to end\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Loop\"\n value=\"loop\"\n hide-details\n data-test=\"loop\"\n />\n </div>\n </template>\n <span>\n Checked continuously executes until explicitly stopped<br />\n Unchecked executes only the started script(s)\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"group\"\n label=\"Group:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"groups\"\n data-test=\"select-group\"\n @update:model-value=\"groupChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-group\"\n @click=\"\n $emit('button', { method: 'start', suite, group, options })\n \"\n >\n Start\n </v-btn>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n data-test=\"setup-group\"\n :disabled=\"\n disableButtons || !setupGroupEnabled || !userInfo.execute\n \"\n @click=\"\n $emit('button', { method: 'setup', suite, group, options })\n \"\n >\n Setup\n </v-btn>\n <v-btn\n color=\"primary\"\n data-test=\"teardown-group\"\n :disabled=\"\n disableButtons || !teardownGroupEnabled || !userInfo.execute\n \"\n @click=\"\n $emit('button', { method: 'teardown', suite, group, options })\n \"\n >\n Teardown\n </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n <v-row no-gutters>\n <v-col cols=\"4\">\n <v-row no-gutters>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n label=\"Abort after Error\"\n value=\"abortAfterError\"\n hide-details\n data-test=\"abort-after-error\"\n />\n </div>\n </template>\n <span>\n Checked stops additional script execution when an error is\n encountered<br />\n Unchecked allows additional scripts to execute\n </span>\n </v-tooltip>\n </v-col>\n <v-col cols=\"6\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-checkbox\n v-model=\"options\"\n :disabled=\"!options.includes('loop')\"\n label=\"Break Loop on Error\"\n value=\"breakLoopOnError\"\n hide-details\n data-test=\"break-loop-on-error\"\n />\n </div>\n </template>\n <span>\n Checked breaks the loop option when an error is encountered<br />\n Unchecked allows the loop to run continuously<br />\n Note: Abort after Error still breaks the loop\n </span>\n </v-tooltip>\n </v-col>\n </v-row>\n </v-col>\n <v-col cols=\"8\">\n <v-row no-gutters justify=\"end\">\n <v-col cols=\"5\">\n <v-select\n v-model=\"script\"\n label=\"Script:\"\n class=\"mb-2 mr-2\"\n hide-details\n density=\"compact\"\n variant=\"outlined\"\n :items=\"scriptNames\"\n item-title=\"title\"\n item-value=\"value\"\n data-test=\"select-script\"\n @update:model-value=\"scriptChanged\"\n />\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :disabled=\"disableButtons || !userInfo.execute\"\n data-test=\"start-script\"\n @click=\"\n $emit('button', {\n method: 'start',\n suite,\n group,\n script,\n options,\n })\n \"\n >\n Start\n </v-btn>\n <!-- Create some invisible buttons to line up Start properly -->\n <v-btn color=\"primary\" class=\"mr-2 invisible\"> Setup </v-btn>\n <v-btn color=\"primary\" class=\"invisible\"> Teardown </v-btn>\n </v-col>\n </v-row>\n </v-col>\n </v-row>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n suiteMap: {\n type: Object,\n required: true,\n },\n disableButtons: {\n type: Boolean,\n required: true,\n },\n filename: {\n type: String,\n required: true,\n },\n },\n emits: ['button', 'loaded'],\n data() {\n return {\n suites: [],\n groups: [],\n scripts: [],\n suite: '',\n group: '',\n script: '',\n options: ['pauseOnError', 'manual', 'continueAfterError'],\n userInfo: {},\n }\n },\n computed: {\n checkedManualTooltip() {\n if (this.filename.endsWith('.py')) {\n return 'Checked sets the RunningScript.manual variable to True'\n } else {\n return 'Checked sets the $manual variable to true'\n }\n },\n uncheckedManualTooltip() {\n if (this.filename.endsWith('.py')) {\n return 'Unchecked sets the RunningScript.manual variable to False'\n } else {\n return 'Unchecked sets the $manual variable to false'\n }\n },\n setupSuiteEnabled() {\n if (this.suite && this.suiteMap[this.suite].setup) {\n return true\n } else {\n return false\n }\n },\n teardownSuiteEnabled() {\n if (this.suite && this.suiteMap[this.suite].teardown) {\n return true\n } else {\n return false\n }\n },\n setupGroupEnabled() {\n if (\n this.suite &&\n this.group &&\n this.suiteMap[this.suite].groups[this.group].setup\n ) {\n return true\n } else {\n return false\n }\n },\n teardownGroupEnabled() {\n if (\n this.suite &&\n this.group &&\n this.suiteMap[this.suite].groups[this.group].teardown\n ) {\n return true\n } else {\n return false\n }\n },\n scriptNames() {\n return this.scripts.map((name) => {\n return {\n // strip script_ or test_ from the name\n title: name.replace(/^(script_|test_)/, ''),\n value: name,\n }\n })\n },\n },\n // Watch the suiteMap so we can recreate the suites and set the initial value\n watch: {\n suiteMap: {\n handler: function (newVal, oldVal) {\n this.updateSuiteMap()\n },\n deep: true, // Deep watcher because suiteMap is a nested Object\n },\n },\n created() {\n this.userInfo = JSON.parse(localStorage['script_runner__userinfo'])\n this.initSuites()\n this.$emit('loaded')\n },\n methods: {\n updateSuiteMap() {\n this.suites = Object.keys(this.suiteMap)\n if (\n this.suiteMap[this.suite] == undefined ||\n this.suiteMap[this.suite].groups[this.group] == undefined\n ) {\n this.initSuites()\n } else {\n this.groups = Object.keys(this.suiteMap[this.suite].groups)\n this.scripts = this.suiteMap[this.suite].groups[this.group].scripts\n }\n },\n initSuites() {\n this.suites = Object.keys(this.suiteMap)\n this.suiteChanged(this.suites[0])\n },\n suiteChanged(event) {\n if (!event || this.suiteMap[event] == undefined) {\n return\n }\n this.suite = event\n this.group = ''\n this.script = ''\n this.groups = Object.keys(this.suiteMap[event].groups)\n // Make the group default be the first group\n this.groupChanged(this.groups[0])\n },\n groupChanged(event) {\n if (\n !event ||\n this.suiteMap[this.suite] == undefined ||\n this.suiteMap[this.suite].groups[event] == undefined\n ) {\n return\n }\n this.group = event\n this.script = ''\n this.scripts = this.suiteMap[this.suite].groups[event].scripts\n // Make the script default be the first\n this.scriptChanged(this.scripts[0])\n },\n scriptChanged(event) {\n this.script = event\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.invisible {\n visibility: hidden;\n}\n#tr-container {\n padding-top: 0px;\n padding-bottom: 15px;\n padding-left: 0px;\n padding-right: 0px;\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 2022, 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\nexport default class RegexAnnotator {\n // TODO: the eslint parser errors on these because of the #\n // Not sure if this naming is needed for the Ace editor or something?\n #id\n #editor\n #pattern\n #text\n #type\n\n constructor(editor, { pattern, text, type }) {\n this.#id = `regexAnnotator-${Math.floor(Math.random() * 10000000)}`\n this.#editor = editor\n this.#pattern = pattern\n this.#text = text\n this.#type = type\n }\n\n // Re-annotate the entire document\n refresh = () => {\n const session = this.#editor.session\n this.#removeAllAnnotations(session)\n const event = {\n lines: session.doc.$lines,\n action: 'insert',\n start: { row: 0 },\n end: { row: session.doc.$lines.length },\n }\n this.annotate(event, session)\n }\n\n // Update annotations for the changed lines\n annotate = ($event, session) => {\n if ($event.lines.length > 1) {\n // They created or deleted a line (or multiple lines), so first need to shift all the existing annotations\n switch ($event.action) {\n case 'insert':\n this.#shiftAnnotations(\n session,\n $event.start.row,\n $event.lines.length - 1,\n )\n break\n case 'remove':\n this.#shiftAnnotations(\n session,\n $event.start.row + 1,\n -$event.lines.length + 1,\n )\n break\n }\n }\n for (let row = $event.start.row; row <= $event.end.row; row++) {\n let column = session.doc.$lines[row]?.match(this.#pattern)?.index\n if (column !== undefined) {\n column !== 0 && (column += 1) // Account for a leading space that might've been included in the match\n this.#addAnnotation(session, {\n row,\n column, // I don't think our editor theme shows the column for annotations, but others do\n text: this.#text,\n type: this.#type,\n openc3Id: this.#id,\n })\n } else if ($event.action === 'remove') {\n this.#deleteAnnotationsForRow(session, row)\n }\n }\n }\n\n #addAnnotation = (session, newAnnotation) => {\n this.#deleteAnnotationsForRow(session, newAnnotation.row) // Reset this row first for the new annotation\n session.setAnnotations([...session.getAnnotations(), newAnnotation])\n }\n\n #deleteAnnotationsForRow = (session, row) => {\n session.setAnnotations(\n session\n .getAnnotations()\n .filter(\n (annotation) =>\n annotation.openc3Id !== this.#id || annotation.row !== row,\n ),\n )\n }\n\n #shiftAnnotations = (session, row, count) => {\n session.setAnnotations(\n session.getAnnotations().map((annotation) => {\n if (annotation.row > row) {\n annotation.row += count\n }\n return annotation\n }),\n )\n }\n\n #removeAllAnnotations = (session) => {\n session.setAnnotations(\n session\n .getAnnotations()\n .filter((annotation) => annotation.openc3Id !== this.#id),\n )\n }\n}\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 2022, 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\nimport RegexAnnotator from './regexAnnotator.js'\n\nexport default class SleepAnnotator extends RegexAnnotator {\n constructor(editor) {\n const prefix = '(^|[{\\\\s])' // Allowable characters before the keyword: start of line or { or a space\n const keyword = 'sleep' // The keyword this annotation looks for\n const suffix = '[\\\\(\\\\s]' // Allowable characters after the keyword: ( or a space\n super(editor, {\n pattern: new RegExp(`${prefix}${keyword}${suffix}`),\n text: 'Use `wait` instead of `sleep` in OpenC3 scripts', // because we override wait to make it work better, but not sleep\n type: 'warning',\n })\n }\n}\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-if=\"!inline\"\n class=\"d-flex flex-column overflow-hidden\"\n :style=\"{\n height: containerHeight,\n }\"\n >\n <top-bar :menus=\"menus\" :title=\"title\" />\n <v-snackbar\n v-model=\"showAlert\"\n absolute\n :color=\"alertType\"\n :timeout=\"3000\"\n class=\"apply-top\"\n :style=\"classificationStyles\"\n >\n <v-icon> mdi-{{ alertType }} </v-icon>\n {{ alertText }}\n <template #actions=\"{ attrs }\">\n <v-btn\n variant=\"text\"\n text=\"Close\"\n v-bind=\"attrs\"\n @click=\"showAlert = false\"\n />\n </template>\n </v-snackbar>\n <v-snackbar\n v-model=\"showEditingToast\"\n absolute\n class=\"apply-top\"\n :style=\"classificationStyles\"\n :timeout=\"-1\"\n color=\"orange\"\n >\n <v-icon> mdi-pencil-off </v-icon>\n {{ lockedBy }} is editing this script. Editor is in read-only mode\n <template #actions=\"{ attrs }\">\n <v-btn\n variant=\"text\"\n v-bind=\"attrs\"\n color=\"danger\"\n text=\"Unlock\"\n data-test=\"unlock-button\"\n @click=\"confirmLocalUnlock\"\n />\n <v-btn\n variant=\"text\"\n text=\"Dismiss\"\n v-bind=\"attrs\"\n @click=\"\n () => {\n showEditingToast = false\n }\n \"\n />\n </template>\n </v-snackbar>\n <div class=\"grid\">\n <div\n v-for=\"def in screens\"\n :id=\"screenId(def.id)\"\n :key=\"def.id\"\n ref=\"gridItem\"\n class=\"item\"\n >\n <div class=\"item-content\">\n <openc3-screen\n :target=\"def.target\"\n :screen=\"def.screen\"\n :definition=\"def.definition\"\n :keywords=\"screenKeywords\"\n :initial-floated=\"true\"\n :initial-top=\"def.top\"\n :initial-left=\"def.left\"\n :initial-z=\"3\"\n :min-z=\"3\"\n :fix-floated=\"true\"\n :count=\"def.count\"\n @close-screen=\"closeScreen(def.id)\"\n @delete-screen=\"closeScreen(def.id)\"\n />\n </div>\n </div>\n </div>\n <v-card class=\"flex-shrink-0\">\n <v-card-text>\n <suite-runner\n v-if=\"suiteRunner\"\n class=\"suite-runner\"\n :suite-map=\"suiteMap\"\n :disable-buttons=\"disableSuiteButtons\"\n :filename=\"fullFilename\"\n @button=\"suiteRunnerButton\"\n @loaded=\"doResize\"\n />\n <div id=\"sr-controls\">\n <v-row no-gutters justify=\"space-between\">\n <v-icon v-if=\"showDisconnect\" class=\"mt-2\" color=\"red\">\n mdi-connection\n </v-icon>\n <div class=\"d-flex align-center mr-1\">\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-if=\"!scriptId\"\n v-bind=\"props\"\n icon=\"mdi-cached\"\n variant=\"text\"\n density=\"compact\"\n :disabled=\"filename === NEW_FILENAME\"\n aria-label=\"Reload File\"\n @click=\"reloadFile\"\n />\n <v-btn\n v-else\n v-bind=\"props\"\n icon=\"mdi-arrow-left\"\n variant=\"text\"\n density=\"compact\"\n @click=\"backToNewScript\"\n />\n </template>\n <span v-if=\"!scriptId\"> Reload File </span>\n <span v-else> Back to New Script </span>\n </v-tooltip>\n </div>\n <v-tooltip\n location=\"bottom\"\n :text=\"filenameSelect\"\n :disabled=\"!filenameSelect || filenameSelect.length <= 45\"\n >\n <template #activator=\"{ props }\">\n <div v-bind=\"props\" style=\"width: 32rem\">\n <v-select\n id=\"filename\"\n v-model=\"filenameSelect\"\n :items=\"fileList\"\n :disabled=\"fileList.length <= 1\"\n label=\"Filename\"\n data-test=\"filename\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n @update:model-value=\"fileNameChanged\"\n />\n </div>\n </template>\n </v-tooltip>\n <v-text-field\n v-model=\"scriptId\"\n label=\"Script ID\"\n data-test=\"id\"\n class=\"shrink ml-2 script-state\"\n style=\"max-width: 100px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-text-field\n v-model=\"stateTimer\"\n label=\"Script State\"\n data-test=\"state\"\n :class=\"['shrink', 'ml-2', 'script-state', stateColorClass]\"\n style=\"max-width: 120px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-progress-circular\n v-if=\"state === 'Connecting...'\"\n :size=\"40\"\n class=\"mx-2\"\n indeterminate\n color=\"primary\"\n />\n <div v-else style=\"width: 40px; height: 40px\" class=\"mx-2\"></div>\n\n <v-spacer />\n <div v-if=\"startOrGoButton === 'Start'\">\n <v-tooltip\n v-if=\"overridesCount > 0\"\n :open-delay=\"600\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n class=\"mr-4\"\n icon\n variant=\"text\"\n density=\"compact\"\n data-test=\"tlm-override-button\"\n aria-label=\"TLM Overrides\"\n @click=\"showOverrides = !showOverrides\"\n >\n <v-badge\n :content=\"overridesCount > 99 ? '99+' : overridesCount\"\n floating\n color=\"primary\"\n >\n <v-icon icon=\"mdi-application-cog-outline\" />\n </v-badge>\n </v-btn>\n </template>\n <span> TLM Overrides ({{ overridesCount }}) </span>\n </v-tooltip>\n <v-tooltip :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n class=\"mr-2\"\n icon\n variant=\"text\"\n density=\"compact\"\n :disabled=\"envDisabled\"\n data-test=\"env-button\"\n aria-label=\"Script Environment\"\n @click=\"scriptEnvironment.show = !scriptEnvironment.show\"\n >\n <v-badge v-model=\"environmentModified\" floating dot>\n <v-icon icon=\"mdi-application-variable\" />\n </v-badge>\n </v-btn>\n </template>\n <span>\n Script Environment\n <template v-if=\"environmentModified\"> (modified) </template>\n </span>\n </v-tooltip>\n <v-btn\n class=\"mx-1\"\n color=\"primary\"\n text=\"Start\"\n data-test=\"start-button\"\n :disabled=\"startOrGoDisabled || !executeUser\"\n :hidden=\"suiteRunner\"\n @click=\"startHandler\"\n />\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n text=\"Go\"\n :disabled=\"startOrGoDisabled\"\n data-test=\"go-button\"\n @click=\"go\"\n />\n <v-btn\n color=\"primary\"\n class=\"mr-2\"\n :text=\"pauseOrRetryButton\"\n :disabled=\"pauseOrRetryDisabled\"\n data-test=\"pause-retry-button\"\n @click=\"pauseOrRetry\"\n />\n <v-btn\n color=\"primary\"\n text=\"Stop\"\n data-test=\"stop-button\"\n :disabled=\"stopDisabled\"\n @click=\"stop\"\n />\n </div>\n </v-row>\n </div>\n </v-card-text>\n </v-card>\n <splitpanes\n horizontal\n class=\"flex-grow-1 overflow-hidden\"\n @resize=\"({ prevPane }) => (editorBoxSize = prevPane.size)\"\n >\n <pane class=\"editorbox\" :size=\"editorBoxSize\">\n <v-snackbar\n v-model=\"showSave\"\n absolute\n location=\"right\"\n :timeout=\"-1\"\n class=\"saving apply-top\"\n :style=\"classificationStyles\"\n >\n Saving...\n </v-snackbar>\n <pre\n ref=\"editor\"\n class=\"editor\"\n @contextmenu.prevent=\"showExecuteSelectionMenu\"\n ></pre>\n <v-menu v-model=\"executeSelectionMenu\" :target=\"[menuX, menuY]\">\n <v-list>\n <v-list-item\n :title=\"currentLineHasCommand ? 'Edit Command' : 'Insert Command'\"\n @click=\"openCommandEditor\"\n />\n <v-divider />\n <v-list-item title=\"Execute Selection\" @click=\"executeSelection\" />\n <v-list-item\n v-if=\"scriptId\"\n title=\"Goto Line\"\n @click=\"runFromCursor\"\n />\n <v-list-item\n v-if=\"!scriptId\"\n title=\"Run From Line\"\n @click=\"runFromCursor\"\n />\n <v-list-item\n v-if=\"!scriptId\"\n title=\"Clear Local Breakpoints\"\n @click=\"clearBreakpoints\"\n />\n <v-divider />\n <v-list-item\n title=\"Toggle Vim mode\"\n prepend-icon=\"extras:vim\"\n @click=\"toggleVimMode\"\n />\n </v-list>\n </v-menu>\n </pane>\n <pane id=\"messages\" class=\"mt-2\" :size=\"100 - editorBoxSize\">\n <div v-if=\"showDebug\" id=\"debug\" class=\"pa-0\">\n <v-row no-gutters>\n <v-btn\n color=\"primary\"\n style=\"width: 100px\"\n class=\"mr-4\"\n text=\"Step\"\n append-icon=\"mdi-step-forward\"\n :disabled=\"!scriptId\"\n data-test=\"step-button\"\n @click=\"step\"\n />\n <v-text-field\n ref=\"debug\"\n v-model=\"debug\"\n class=\"mb-2\"\n variant=\"outlined\"\n density=\"compact\"\n hide-details\n label=\"Debug\"\n data-test=\"debug-text\"\n @keydown=\"debugKeydown\"\n />\n </v-row>\n </div>\n <script-log-messages\n id=\"log-messages\"\n v-model=\"messages\"\n @sort=\"messageSortOrder\"\n />\n </pane>\n </splitpanes>\n </div>\n\n <div\n v-else\n style=\"\n background-color: var(--color-background-base-default);\n margin: 0px;\n padding: 0px;\n \"\n >\n <v-row no-gutters justify=\"right\">\n <v-tabs v-model=\"inlineTab\" density=\"compact\">\n <v-tab value=\"script\" text=\"Script\" data-test=\"script-tab\" />\n <v-tab value=\"messages\" text=\"Messages\" data-test=\"messages-tab\" />\n </v-tabs>\n <v-tooltip\n location=\"bottom\"\n :text=\"filenameSelect\"\n :disabled=\"!filenameSelect || filenameSelect.length <= 45\"\n >\n <template #activator=\"{ props }\">\n <div v-bind=\"props\" style=\"width: 32rem\">\n <v-select\n id=\"inline-filename\"\n v-model=\"filenameSelect\"\n :items=\"fileList\"\n :disabled=\"fileList.length <= 1\"\n label=\"Filename\"\n data-test=\"filename\"\n density=\"compact\"\n variant=\"outlined\"\n hide-details\n @update:model-value=\"fileNameChanged\"\n />\n </div>\n </template>\n </v-tooltip>\n <v-text-field\n v-model=\"scriptId\"\n label=\"Script ID\"\n data-test=\"id\"\n class=\"shrink ml-2 script-state\"\n style=\"max-width: 100px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-text-field\n v-model=\"stateTimer\"\n label=\"Script State\"\n data-test=\"state\"\n :class=\"['shrink', 'ml-2', 'script-state', stateColorClass]\"\n style=\"max-width: 120px\"\n density=\"compact\"\n variant=\"outlined\"\n readonly\n hide-details\n />\n <v-progress-circular\n v-if=\"state === 'Connecting...'\"\n :size=\"40\"\n class=\"mx-2\"\n indeterminate\n color=\"primary\"\n />\n </v-row>\n <v-tabs-window v-model=\"inlineTab\">\n <v-tabs-window-item value=\"script\">\n <v-row>\n <v-col\n class=\"v-col-10\"\n style=\"margin: 15px 0px 0px 0px; padding: 0px\"\n >\n <pre\n ref=\"editor\"\n class=\"editor\"\n style=\"height: 200px\"\n @contextmenu.prevent=\"showExecuteSelectionMenu\"\n ></pre>\n </v-col>\n <v-col\n class=\"v-col-2\"\n style=\"\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: var(--color-background-surface-default);\n \"\n >\n <div v-if=\"startOrGoButton === 'Start'\">\n <v-btn\n class=\"mx-1\"\n color=\"primary\"\n text=\"Start\"\n data-test=\"start-button\"\n :disabled=\"startOrGoDisabled || !executeUser\"\n :hidden=\"suiteRunner\"\n @click=\"startHandler\"\n />\n </div>\n <div v-else>\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n text=\"Go\"\n :disabled=\"startOrGoDisabled\"\n data-test=\"go-button\"\n @click=\"go\"\n />\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n :text=\"pauseOrRetryButton\"\n :disabled=\"pauseOrRetryDisabled\"\n data-test=\"pause-retry-button\"\n @click=\"pauseOrRetry\"\n />\n\n <v-btn\n color=\"primary\"\n class=\"ma-2\"\n text=\"Stop\"\n data-test=\"stop-button\"\n :disabled=\"stopDisabled\"\n @click=\"stop\"\n />\n </div>\n </v-col>\n </v-row>\n </v-tabs-window-item>\n\n <v-tabs-window-item value=\"messages\">\n <div style=\"height: 200px; overflow: hidden\">\n <script-log-messages\n v-model=\"messages\"\n :newest-on-top=\"messagesNewestOnTop\"\n @message-order-changed=\"messageOrderChanged\"\n />\n </div>\n </v-tabs-window-item>\n </v-tabs-window>\n </div>\n\n <file-open-save-dialog\n v-if=\"fileOpen\"\n v-model=\"fileOpen\"\n type=\"open\"\n api-url=\"/script-api/scripts\"\n @file=\"setFile($event)\"\n @error=\"setError($event)\"\n @clear-temp=\"clearTemp($event)\"\n />\n <file-open-save-dialog\n v-if=\"showSaveAs\"\n v-model=\"showSaveAs\"\n type=\"save\"\n api-url=\"/script-api/scripts\"\n require-target-parent-dir\n :input-filename=\"filenameOrBlank\"\n @filename=\"saveAsFilename($event)\"\n @error=\"setError($event)\"\n @clear-temp=\"clearTemp($event)\"\n />\n <environment-dialog v-if=\"showEnvironment\" v-model=\"showEnvironment\" />\n <ask-dialog\n v-if=\"ask.show\"\n v-model=\"ask.show\"\n :question=\"ask.question\"\n :default=\"ask.default\"\n :password=\"ask.password\"\n :answer-required=\"ask.answerRequired\"\n @response=\"ask.callback\"\n />\n <file-dialog\n v-if=\"file.show\"\n v-model=\"file.show\"\n :title=\"file.title\"\n :message=\"file.message\"\n :multiple=\"file.multiple\"\n :filter=\"file.filter\"\n @response=\"fileDialogCallback\"\n />\n <bucket-dialog\n v-if=\"bucket.show\"\n v-model=\"bucket.show\"\n :title=\"bucket.title\"\n :message=\"bucket.message\"\n @response=\"bucketDialogCallback\"\n />\n <information-dialog\n v-if=\"information.show\"\n v-model=\"information.show\"\n :title=\"information.title\"\n :text=\"information.text\"\n :width=\"information.width\"\n />\n <event-list-dialog\n v-if=\"inputMetadata.show\"\n v-model=\"inputMetadata.show\"\n :events=\"inputMetadata.events\"\n :time-zone=\"timeZone\"\n new-metadata\n @close=\"inputMetadata.callback\"\n />\n <overrides-dialog v-if=\"showOverrides\" v-model=\"showOverrides\" />\n <prompt-dialog\n v-if=\"prompt.show\"\n v-model=\"prompt.show\"\n :title=\"prompt.title\"\n :subtitle=\"prompt.subtitle\"\n :message=\"prompt.message\"\n :details=\"prompt.details\"\n :buttons=\"prompt.buttons\"\n :layout=\"prompt.layout\"\n :multiple=\"prompt.multiple\"\n @response=\"prompt.callback\"\n />\n <results-dialog\n v-if=\"results.show\"\n v-model=\"results.show\"\n :text=\"results.text\"\n />\n <script-environment-dialog\n v-if=\"scriptEnvironment.show\"\n v-model=\"scriptEnvironment.show\"\n :input-environment=\"scriptEnvironment.env\"\n @environment=\"environmentHandler\"\n />\n <simple-text-dialog\n v-model=\"showSuiteError\"\n title=\"Suite Analysis Error\"\n :text=\"suiteError\"\n :width=\"1000\"\n />\n <critical-cmd-dialog\n v-model=\"displayCriticalCmd\"\n :uuid=\"criticalCmdUuid\"\n :cmd-string=\"criticalCmdString\"\n :cmd-user=\"criticalCmdUser\"\n :persistent=\"true\"\n @status=\"promptDialogCallback\"\n />\n <!-- Command Editor Dialog -->\n <v-dialog\n v-model=\"commandEditor.show\"\n max-width=\"1200\"\n persistent\n scrollable\n @keydown.esc=\"closeCommandDialog\"\n >\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n <span>Insert Command</span>\n <v-spacer />\n <v-btn icon=\"mdi-close\" variant=\"text\" @click=\"closeCommandDialog\" />\n </v-card-title>\n <v-card-text class=\"pa-0\">\n <div v-if=\"commandEditor.dialogError\" class=\"error-message\">\n <v-icon class=\"mr-2\" color=\"error\">mdi-alert-circle</v-icon>\n <span class=\"flex-grow-1\">{{ commandEditor.dialogError }}</span>\n <v-btn\n icon=\"mdi-close\"\n size=\"small\"\n variant=\"text\"\n color=\"error\"\n class=\"ml-2\"\n @click=\"commandEditor.dialogError = null\"\n />\n </div>\n <command-editor\n ref=\"commandEditor\"\n :initial-target-name=\"commandEditor.targetName\"\n :initial-packet-name=\"commandEditor.packetName\"\n :cmd-string=\"commandEditor.cmdString\"\n :send-disabled=\"false\"\n :show-command-button=\"false\"\n @build-cmd=\"insertCommand($event)\"\n />\n </v-card-text>\n <v-card-actions>\n <v-spacer />\n <v-btn variant=\"outlined\" @click=\"closeCommandDialog\"> Cancel </v-btn>\n <v-btn color=\"primary\" variant=\"flat\" @click=\"insertCommand()\">\n Insert Command\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n <v-bottom-sheet v-model=\"showScripts\">\n <v-sheet class=\"pb-11 pt-5 px-5\">\n <running-scripts\n v-if=\"showScripts\"\n :connect-in-new-tab=\"!!fileModified\"\n @disconnect=\"scriptDisconnect\"\n @close=\"\n () => {\n showScripts = false\n }\n \"\n />\n </v-sheet>\n </v-bottom-sheet>\n</template>\n\n<script>\nimport axios from 'axios'\nimport { format } from 'date-fns'\nimport { Splitpanes, Pane } from 'splitpanes'\nimport 'splitpanes/dist/splitpanes.css'\n\nimport { Api, Cable, OpenC3Api } from '@openc3/js-common/services'\nimport { useContainerHeight } from '@/composables/useContainerHeight'\nimport {\n AceEditorModes,\n AceEditorUtils,\n CriticalCmdDialog,\n EnvironmentDialog,\n FileOpenSaveDialog,\n Openc3Screen,\n SimpleTextDialog,\n TopBar,\n} from '@/components'\nimport { ClassificationBanners } from '@/tools/base'\nimport { fileIcon } from '@/util'\nimport { EventListDialog } from '@/tools/calendar'\n\nimport AskDialog from '@/tools/scriptrunner/Dialogs/AskDialog.vue'\nimport BucketDialog from '@/tools/scriptrunner/Dialogs/BucketDialog.vue'\nimport FileDialog from '@/tools/scriptrunner/Dialogs/FileDialog.vue'\nimport InformationDialog from '@/tools/scriptrunner/Dialogs/InformationDialog.vue'\nimport OverridesDialog from '@/tools/scriptrunner/Dialogs/OverridesDialog.vue'\nimport PromptDialog from '@/tools/scriptrunner/Dialogs/PromptDialog.vue'\nimport ResultsDialog from '@/tools/scriptrunner/Dialogs/ResultsDialog.vue'\nimport ScriptEnvironmentDialog from '@/tools/scriptrunner/Dialogs/ScriptEnvironmentDialog.vue'\nimport CommandEditor from '@/components/CommandEditor.vue'\nimport SuiteRunner from '@/tools/scriptrunner/SuiteRunner.vue'\nimport ScriptLogMessages from '@/tools/scriptrunner/ScriptLogMessages.vue'\nimport {\n CmdCompleter,\n TlmCompleter,\n MnemonicChecker,\n} from '@/tools/scriptrunner/autocomplete'\nimport { SleepAnnotator } from '@/tools/scriptrunner/annotations'\nimport RunningScripts from '@/tools/scriptrunner/RunningScripts.vue'\n\n// Matches target_file.rb TEMP_FOLDER\nconst TEMP_FOLDER = '__TEMP__'\nconst NEW_FILENAME = '<Untitled>'\nconst START = 'Start'\nconst GO = 'Go'\nconst PAUSE = 'Pause'\nconst RETRY = 'Retry'\n\nexport default {\n components: {\n FileOpenSaveDialog,\n Openc3Screen,\n EnvironmentDialog,\n Splitpanes,\n Pane,\n TopBar,\n AskDialog,\n BucketDialog,\n FileDialog,\n InformationDialog,\n EventListDialog,\n OverridesDialog,\n PromptDialog,\n ResultsDialog,\n ScriptEnvironmentDialog,\n SimpleTextDialog,\n SuiteRunner,\n RunningScripts,\n ScriptLogMessages,\n CriticalCmdDialog,\n CommandEditor,\n },\n mixins: [AceEditorModes, ClassificationBanners],\n beforeRouteUpdate: function (to, from, next) {\n if (to.params.id) {\n this.tryLoadRunningScript(to.params.id).then(next)\n } else {\n next()\n }\n },\n props: {\n inline: {\n type: Boolean,\n default: false,\n },\n body: {\n type: String,\n default: null,\n },\n // Optional filename to use when running inline scripts\n // This allows relative path resolution to work correctly\n initialFilename: {\n type: String,\n default: null,\n },\n },\n emits: ['alert', 'script-id'],\n setup() {\n const containerHeight = useContainerHeight()\n\n return { containerHeight }\n },\n data() {\n return {\n title: 'Script Runner',\n suiteRunner: false, // Whether to display the SuiteRunner GUI\n disableSuiteButtons: false,\n suiteMap: {\n // Useful for testing the various options in the SuiteRunner GUI\n // Suite: {\n // teardown: true,\n // groups: {\n // Group: {\n // setup: true,\n // cases: ['case1', 'case2', 'really_long_test_case_name3'],\n // },\n // ReallyLongGroupName: {\n // cases: ['case1', 'case2', 'case3'],\n // },\n // },\n // },\n },\n filenameSelect: null,\n currentFilename: null, // This is the currently shown filename while running\n showSave: false,\n showAlert: false,\n alertType: null,\n alertText: '',\n state: null,\n scriptId: null,\n startOrGoButton: START,\n startOrGoDisabled: false,\n envDisabled: false,\n pauseOrRetryButton: PAUSE,\n pauseOrRetryDisabled: false,\n stopDisabled: false,\n showEnvironment: false,\n showDebug: false,\n debug: '',\n debugHistory: [],\n debugHistoryIndex: 0,\n showDisconnect: false,\n files: {},\n breakpoints: {},\n enableStackTraces: false,\n filename: NEW_FILENAME,\n readOnlyUser: false,\n executeUser: true,\n saveAllowed: true,\n tempFilename: null,\n fileModified: '',\n fileOpen: false,\n lockedBy: null,\n showEditingToast: false,\n showSaveAs: false,\n areYouSure: false,\n subscription: null,\n cable: null,\n fatal: false,\n updateInterval: null,\n receivedEvents: [],\n messages: [],\n messagesNewestOnTop: true,\n inlineTab: 'script',\n maxArrayLength: 200,\n Range: ace.require('ace/range').Range,\n ask: {\n show: false,\n question: '',\n default: null,\n password: false,\n answerRequired: true,\n callback: () => {},\n },\n file: {\n show: false,\n message: '',\n directory: null,\n filter: '*',\n multiple: false,\n callback: () => {},\n },\n bucket: {\n show: false,\n title: '',\n message: '',\n },\n prompt: {\n show: false,\n title: '',\n subtitle: '',\n message: '',\n details: '',\n buttons: null,\n layout: 'horizontal',\n callback: () => {},\n },\n information: {\n show: false,\n title: '',\n text: [],\n width: '600',\n },\n inputMetadata: {\n show: false,\n events: [],\n callback: () => {},\n },\n results: {\n show: false,\n text: '',\n },\n scriptEnvironment: {\n show: false,\n env: [],\n },\n showSuiteError: false,\n suiteError: '',\n executeSelectionMenu: false,\n menuX: 0,\n menuY: 0,\n mnemonicChecker: new MnemonicChecker(),\n showScripts: false,\n showOverrides: false,\n overridesCount: 0,\n commandEditor: {\n show: false,\n targetName: null,\n commandName: null,\n dialogError: null,\n cmdString: null,\n isEditing: false,\n editLine: null,\n },\n currentLineHasCommand: false,\n activePromptId: '',\n api: null,\n timeZone: 'local',\n screens: [],\n screenKeywords: null,\n idCounter: 0,\n updateCounter: 0,\n recent: [],\n waitingInterval: null,\n waitingTime: 0,\n waitingStart: 0,\n criticalCmdUuid: null,\n criticalCmdString: null,\n criticalCmdUser: null,\n displayCriticalCmd: false,\n editorBoxSize: 50,\n }\n },\n computed: {\n stateTimer: function () {\n if (this.state === 'waiting' || this.state === 'paused') {\n return `${this.state} ${this.waitingTime}s`\n }\n // Map completed_errors to completed for display\n // it will be colored via the stateColorClass\n if (this.state === 'completed_errors') {\n return 'completed'\n }\n return this.state\n },\n stateColorClass: function () {\n // All possible states: spawning, init, running, paused, waiting, breakpoint,\n // error, crashed, stopped, completed, completed_errors, killed\n if (\n this.state === 'error' ||\n this.state === 'crashed' ||\n this.state === 'killed'\n ) {\n return 'script-state-red'\n } else if (this.state === 'completed_errors') {\n return 'script-state-orange'\n } else if (this.state === 'completed') {\n return 'script-state-green'\n } else {\n return ''\n }\n },\n // This is the list of files shown in the select dropdown\n fileList: function () {\n // this.files is the list of all files seen while running\n const filenames = Object.keys(this.files)\n filenames.push(this.fullFilename) // Make sure the currently shown filename is last\n return [...new Set(filenames)] // ensure unique\n },\n environmentModified: function () {\n return this.scriptEnvironment.env.length > 0\n },\n isLocked: function () {\n return !!this.lockedBy\n },\n // Returns the currently shown filename\n fullFilename: function () {\n if (this.currentFilename) return this.currentFilename\n // New filenames should not indicate modified\n if (this.filename === NEW_FILENAME) return NEW_FILENAME\n return `${this.filename} ${this.fileModified}`.trim()\n },\n // It's annoying for people (and tests) to clear the <Untitled>\n // when saving a new file so replace with blank\n // This makes sure that string doesn't show up in the dialog\n filenameOrBlank: function () {\n return this.filename === NEW_FILENAME ? '' : this.filename\n },\n menus: function () {\n return [\n {\n label: 'File',\n items: [\n {\n label: 'New File',\n icon: 'mdi-file-plus',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.newFileWithConfirm()\n },\n },\n {\n label: 'New Suite',\n icon: 'mdi-file-document-plus',\n disabled: this.scriptId || this.readOnlyUser,\n subMenu: [\n {\n label: 'Ruby',\n icon: 'mdi-language-ruby',\n command: () => {\n this.newRubyTestSuite()\n },\n },\n {\n label: 'Python',\n icon: 'mdi-language-python',\n command: () => {\n this.newPythonTestSuite()\n },\n },\n ],\n },\n {\n label: 'Open File',\n icon: 'mdi-folder-open',\n disabled: this.scriptId,\n command: () => {\n this.openFileWithConfirm()\n },\n },\n {\n label: 'Open Recent',\n icon: 'mdi-folder-open',\n disabled: this.scriptId,\n subMenu: this.recent,\n },\n {\n divider: true,\n },\n {\n label: 'Save File',\n icon: 'mdi-content-save',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.saveFile()\n },\n },\n {\n label: 'Save As...',\n icon: 'mdi-content-save',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.saveAs()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Download',\n icon: 'mdi-cloud-download',\n disabled: this.scriptId,\n command: () => {\n this.download()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Delete File',\n icon: 'mdi-delete',\n disabled: this.scriptId || this.readOnlyUser,\n command: () => {\n this.delete()\n },\n },\n ],\n },\n {\n label: 'Edit',\n items: [\n {\n label: 'Find',\n icon: 'mdi-magnify',\n command: () => {\n this.editor.execCommand('find')\n },\n },\n {\n label: 'Replace',\n icon: 'mdi-find-replace',\n disabled: this.scriptId,\n command: () => {\n this.editor.execCommand('replace')\n },\n },\n {\n label: 'Set Line Delay',\n icon: 'mdi-invoice-text-clock',\n disabled: this.scriptId,\n command: () => {\n this.$dialog.open({\n title: 'Info',\n text:\n 'You can set the line delay in seconds using the api method set_line_delay().<br/><br/>' +\n 'The default line delay is 0.1 seconds between lines. ' +\n 'Adding set_line_delay(0) to the top of your script will execute the script at maximum speed. ' +\n 'However, this can make it difficult to see and pause the script. ' +\n 'Executing set_line_delay(1) will cause a 1 second delay between lines.',\n okText: 'OK',\n okClass: 'primary',\n validateText: null,\n cancelText: null,\n html: true,\n })\n },\n },\n ],\n },\n {\n label: 'Script',\n items: [\n {\n label: 'Execution Status',\n icon: 'mdi-run',\n command: () => {\n this.showScripts = true\n },\n },\n {\n divider: true,\n },\n {\n label: 'Global Environment',\n icon: 'mdi-library',\n disabled: this.scriptId,\n command: () => {\n this.showEnvironment = !this.showEnvironment\n },\n },\n {\n label: 'Metadata',\n icon: 'mdi-calendar',\n disabled: this.scriptId,\n command: () => {\n this.inputMetadata.callback = () => {}\n this.showMetadata()\n },\n },\n {\n label: 'Overrides',\n icon: 'mdi-swap-horizontal',\n command: () => {\n this.showOverrides = true\n },\n },\n {\n divider: true,\n },\n {\n label: 'Syntax Check',\n icon: 'mdi-file-check',\n disabled: this.scriptId,\n command: () => {\n this.syntaxCheck()\n },\n },\n {\n label: 'Mnemonic Check',\n icon: 'mdi-spellcheck',\n disabled: this.scriptId,\n command: () => {\n this.checkMnemonics()\n },\n },\n {\n label: 'Instrumented Script',\n icon: 'mdi-code-braces-box',\n disabled: this.scriptId,\n command: () => {\n this.showInstrumented()\n },\n },\n {\n label: 'Call Stack',\n icon: 'mdi-format-list-numbered',\n disabled: !this.scriptId,\n command: () => {\n this.showCallStack()\n },\n },\n {\n divider: true,\n },\n {\n label: 'Toggle Debug',\n icon: 'mdi-bug',\n command: () => {\n this.toggleDebug()\n },\n },\n {\n label: 'Toggle Disconnect',\n icon: 'mdi-connection',\n disabled: this.scriptId,\n command: () => {\n this.toggleDisconnect()\n },\n },\n {\n label: 'Enable Stack Traces',\n checkbox: true,\n checked: this.enableStackTraces,\n disabled: this.scriptId,\n command: () => {\n // Toggling the checkbox closes the menu so no need\n // to check state, just toggle existing value\n this.enableStackTraces = !this.enableStackTraces\n },\n },\n {\n divider: true,\n },\n {\n label: 'Delete All Breakpoints',\n icon: 'mdi-delete-circle-outline',\n disabled: this.scriptId,\n command: () => {\n this.deleteAllBreakpoints()\n },\n },\n ],\n },\n ]\n },\n },\n watch: {\n isLocked: function (val) {\n this.showEditingToast = val\n if (!this.suiteRunner) {\n this.startOrGoDisabled = val\n }\n if (this.readOnlyUser == false && val == false && !this.inline) {\n this.editor.setReadOnly(val)\n } else {\n this.editor.setReadOnly(true)\n }\n },\n fullFilename: function (filename) {\n this.filenameSelect = filename\n if (!this.inline) {\n if (filename === NEW_FILENAME) {\n localStorage.removeItem('script_runner__filename')\n } else {\n localStorage['script_runner__filename'] = filename\n }\n }\n },\n readOnlyUser: function (val) {\n if (this.editor) {\n if (val) {\n this.editor.setReadOnly(true)\n this.editor.renderer.$cursorLayer.element.style.display = 'none'\n } else {\n if (!this.inline) {\n this.editor.setReadOnly(false)\n }\n this.editor.renderer.$cursorLayer.element.style.display = null\n }\n }\n },\n showOverrides: function (newVal, oldVal) {\n if (oldVal && !newVal) {\n this.updateOverridesCount()\n }\n },\n },\n created: async function () {\n // Ensure Offline Access Is Setup For the Current User\n this.api = new OpenC3Api()\n this.api.ensure_offline_access()\n this.api\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch((error) => {\n // Do nothing\n })\n\n this.updateOverridesCount()\n\n // Make NEW_FILENAME available to the template\n this.NEW_FILENAME = NEW_FILENAME\n\n let user = OpenC3Auth.user()\n let roles = OpenC3Auth.userroles()\n this.readOnlyUser = true\n this.executeUser = false\n for (let role of roles) {\n if (role == 'viewer') {\n continue\n }\n if (role == 'admin' || role == 'operator') {\n this.readOnlyUser = false\n this.executeUser = true\n } else if (role == 'runner') {\n this.executeUser = true\n } else {\n await Api.get(`/openc3-api/roles/${role}`).then((response) => {\n if (\n response.data !== null &&\n response.data.permissions !== undefined\n ) {\n if (\n response.data.permissions.some(\n (i) => i.permission == 'script_edit',\n )\n ) {\n this.readOnlyUser = false\n }\n if (\n response.data.permissions.some(\n (i) => i.permission == 'script_run',\n )\n ) {\n this.executeUser = true\n }\n }\n })\n }\n }\n // Output the userinfo for use in the SuiteRunner component\n if (!this.inline) {\n localStorage['script_runner__userinfo'] = JSON.stringify({\n name: user['preferred_username'],\n readOnly: this.readOnlyUser,\n execute: this.executeUser,\n })\n }\n if (this.readOnlyUser == true) {\n this.alertType = 'info'\n let text = `User ${user['preferred_username']} is read only`\n if (this.executeUser) {\n text += ' but can execute scripts'\n }\n this.alertText = text\n this.showAlert = true\n }\n\n Api.get('/openc3-api/autocomplete/keywords/screen').then((response) => {\n this.screenKeywords = response.data\n })\n\n if (this.inline) {\n this.readOnly = true\n }\n },\n mounted: async function () {\n this.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n const RubyMode = this.buildRubyMode()\n const PythonMode = this.buildPythonMode()\n this.rubyMode = new RubyMode()\n this.pythonMode = new PythonMode()\n const language = AceEditorUtils.getDefaultScriptingLanguage()\n if (language === 'python') {\n this.editor.session.setMode(this.pythonMode)\n } else {\n this.editor.session.setMode(this.rubyMode)\n }\n this.editor.session.setTabSize(2)\n this.editor.session.setUseWrapMode(true)\n this.editor.$blockScrolling = Infinity\n this.editor.setOption('enableBasicAutocompletion', true)\n this.editor.setOption('enableLiveAutocompletion', true)\n this.editor.completers = [new CmdCompleter(), new TlmCompleter()]\n this.editor.setHighlightActiveLine(false)\n AceEditorUtils.applyVimModeIfEnabled(this.editor, { saveFn: this.saveFile })\n this.editor.focus()\n\n this.editor.on('guttermousedown', this.toggleBreakpoint)\n // We listen to tokenizerUpdate rather than change because this\n // is the background process that updates as changes are processed\n // while change fires immediately before the UndoManager is updated.\n this.editor.session.on('tokenizerUpdate', this.onChange)\n if (this.readOnlyUser || this.inline) {\n this.editor.setReadOnly(true)\n this.editor.renderer.$cursorLayer.element.style.display = 'none'\n }\n\n const sleepAnnotator = new SleepAnnotator(this.editor)\n this.editor.session.on('change', ($event, session) => {\n sleepAnnotator.annotate($event, session)\n this.updateBreakpoints($event, session)\n })\n\n this.editor.container.addEventListener('resize', this.doResize)\n this.editor.container.addEventListener('keydown', this.keydown)\n\n this.cable = new Cable('/script-api/cable')\n\n if (!this.inline && localStorage['script_runner__recent']) {\n this.recent = JSON.parse(localStorage['script_runner__recent'])\n // Rebuild the command since that doesn't get stringified\n this.recent = this.recent.map((item) => ({\n ...item,\n command: async (event) => {\n this.filename = event.label\n await this.reloadFile()\n },\n }))\n }\n if (!this.inline) {\n if (this.$route.query?.file) {\n this.filename = this.$route.query.file\n await this.reloadFile()\n } else if (this.$route.params?.id) {\n await this.tryLoadRunningScript(this.$route.params.id)\n } else {\n this.scriptId = sessionStorage.getItem('script_runner__script_id')\n if (this.scriptId) {\n await this.tryLoadRunningScript(this.scriptId)\n } else if (localStorage['script_runner__filename']) {\n this.filename = localStorage['script_runner__filename']\n await this.reloadFile(false)\n }\n }\n } else {\n if (this.body) {\n this.editor.setValue(this.body)\n this.editor.clearSelection()\n // If initialFilename is provided, use it for path resolution\n if (this.initialFilename) {\n this.filename = this.initialFilename\n }\n }\n }\n this.updateInterval = setInterval(async () => {\n this.processReceived()\n }, 100) // Every 100ms\n },\n beforeUnmount() {\n if (this.scriptId && !this.inline) {\n sessionStorage.setItem('script_runner__script_id', this.scriptId)\n }\n this.editor.destroy()\n this.editor.container.remove()\n },\n unmounted() {\n this.unlockFile()\n if (this.updateInterval != null) {\n clearInterval(this.updateInterval)\n }\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n this.cable.disconnect()\n },\n methods: {\n updateOverridesCount: function () {\n this.api.get_overrides().then((result) => {\n this.overridesCount = result.length\n })\n },\n toggleVimMode() {\n AceEditorUtils.toggleVimMode(this.editor)\n },\n openCommandEditor() {\n this.executeSelectionMenu = false\n const position = this.editor.getCursorPosition()\n const line = this.editor.session.getLine(position.row)\n\n if (this.currentLineHasCommand) {\n // Extract and parse the command from the line\n const cmdString = this.parseCommandFromLine(line)\n this.commandEditor.cmdString = cmdString\n this.commandEditor.isEditing = true\n this.commandEditor.editLine = position.row\n } else {\n // Inserting a new command\n this.commandEditor.cmdString = null\n this.commandEditor.isEditing = false\n this.commandEditor.editLine = null\n }\n this.commandEditor.show = true\n this.commandEditor.dialogError = null\n },\n insertCommand(event) {\n let commandString = ''\n try {\n commandString = this.$refs.commandEditor.getCmdString()\n let parts = commandString.split(' ')\n this.commandEditor.targetName = parts[0]\n this.commandEditor.commandName = parts[1]\n } catch (error) {\n this.commandEditor.dialogError =\n error.message || 'Please fix command parameters'\n return\n }\n\n if (\n this.commandEditor.isEditing &&\n this.commandEditor.editLine !== null\n ) {\n // Replace the existing line\n const line = this.editor.session.getLine(this.commandEditor.editLine)\n const indent = line.match(/^\\s*/)[0] // Preserve indentation\n // Extract trailing comment if present\n const commentMatch = line.match(/\\s+#.*$/)\n const trailingComment = commentMatch ? commentMatch[0] : ''\n const newLine = `${indent}cmd(\"${commandString}\")${trailingComment}`\n const Range = this.Range\n this.editor.session.replace(\n new Range(\n this.commandEditor.editLine,\n 0,\n this.commandEditor.editLine,\n line.length,\n ),\n newLine,\n )\n } else {\n // Insert a new command at the cursor position\n const position = this.editor.getCursorPosition()\n this.editor.session.insert(position, `cmd(\"${commandString}\")\\n`)\n }\n\n this.fileModified = true\n this.commandEditor.show = false\n },\n closeCommandDialog: function () {\n this.commandEditor.show = false\n },\n doResize() {\n this.editor.resize()\n },\n scriptDisconnect() {\n if (this.subscription) {\n this.subscription.unsubscribe()\n this.subscription = null\n }\n this.receivedEvents.length = 0 // Clear any unprocessed events\n },\n showMetadata() {\n Api.get('/openc3-api/metadata').then((response) => {\n // TODO: This is how Calendar creates new metadata items via makeMetadataEvent\n this.inputMetadata.events = response.data.map((event) => {\n return {\n name: 'Metadata',\n start: new Date(event.start * 1000),\n end: new Date(event.start * 1000),\n color: event.color,\n type: event.type,\n timed: true,\n metadata: event,\n }\n })\n this.inputMetadata.show = true\n })\n },\n messageSortOrder(order) {\n // See ScriptLogMessages for these strings\n if (order === 'Newest on Top' && this.messagesNewestOnTop === false) {\n this.messagesNewestOnTop = true\n this.messages.reverse()\n } else if (\n order === 'Newest on Bottom' &&\n this.messagesNewestOnTop === true\n ) {\n this.messagesNewestOnTop = false\n this.messages.reverse()\n }\n },\n // This only gets called when the user changes the filename dropdown\n // Or when a user hits Go\n fileNameChanged(filename) {\n // Split off the '*' which indicates modified\n filename = filename.split('*')[0]\n this.editor.setValue(this.files[filename].content)\n this.restoreBreakpoints(filename)\n this.editor.clearSelection()\n this.removeAllMarkers()\n this.editor.session.addMarker(\n new this.Range(\n this.files[filename].lineNo - 1,\n 0,\n this.files[filename].lineNo - 1,\n 1,\n ),\n `${this.state}Marker`,\n 'fullLine',\n )\n this.editor.gotoLine(this.files[filename].lineNo)\n },\n tryLoadRunningScript: function (id) {\n return Api.get(`/script-api/running-script/${id}`)\n .then((response) => {\n if (response.data) {\n let state = response.data.state\n // Check for all the completed states, see is_complete in script_status_model\n if (\n state !== 'completed' &&\n state !== 'completed_errors' &&\n state !== 'stopped' &&\n state !== 'crashed' &&\n state !== 'killed'\n ) {\n this.filename = response.data.filename\n this.tryLoadSuites(response)\n this.initScriptStart()\n this.scriptStart(id)\n } else {\n this.$notify.caution({\n title: `Script ${id} has already completed`,\n body: 'Check the Completed Scripts below ...',\n })\n this.scriptComplete()\n this.showScripts = true\n }\n } else {\n throw new Error(`Unable to load state for running script ${id}`) // Get into the following catch block because this should be handled the same as an error like 404\n }\n })\n .catch((error) => {\n // TODO: This is appearing on the main page which is blurred from the presence of the bottom sheet\n // We should probably not allow the bottom sheet to blur the screen\n this.$notify.caution({\n title: `Running Script ${id} not found`,\n body: 'Check the Completed Scripts below ...',\n })\n this.scriptComplete()\n this.showScripts = true\n })\n },\n tryLoadSuites: function (response) {\n if (response.data.suites) {\n this.startOrGoDisabled = true\n this.suiteRunner = true\n this.suiteMap = JSON.parse(response.data.suites)\n }\n this.doResize()\n },\n showExecuteSelectionMenu: function ($event) {\n this.menuX = $event.pageX\n this.menuY = $event.pageY\n // Check if the current line contains a command\n const position = this.editor.getCursorPosition()\n const line = this.editor.session.getLine(position.row)\n this.currentLineHasCommand = this.isCommandLine(line)\n this.executeSelectionMenu = true\n },\n isCommandLine: function (line) {\n // Check if line contains cmd() or cmd_no_hazardous_check() or similar command patterns\n const trimmedLine = line.trim()\n // Match patterns like: cmd(\"...\", cmd_no_hazardous_check(\"...\", cmd_raw(\"...\", etc.\n return /^\\s*cmd(_\\w+)?\\s*\\(/.test(trimmedLine)\n },\n parseCommandFromLine: function (line) {\n // Extract the command string from patterns like: cmd(\"TARGET COMMAND with PARAM value\")\n const match = line.match(/cmd(_\\w+)?\\s*\\(\\s*[\"'](.+?)[\"']\\s*\\)/)\n if (match) {\n return match[2] // Return the command string\n }\n return null\n },\n runFromCursor: function () {\n const start_row = this.editor.getCursorPosition().row + 1\n if (!this.scriptId) {\n this.start(null, null, start_row)\n } else {\n Api.post(\n `/script-api/running-script/${this.scriptId}/executewhilepaused`,\n {\n data: {\n args: [this.filenameSelect, start_row],\n },\n },\n )\n }\n },\n executeSelection: function () {\n const range = this.editor.getSelectionRange()\n let start_row = range.start.row + 1\n let end_row = range.end.row + 1\n if (range.end.column === 0) {\n end_row -= 1\n }\n if (!this.scriptId) {\n this.start(null, null, start_row, end_row)\n } else {\n Api.post(\n `/script-api/running-script/${this.scriptId}/executewhilepaused`,\n {\n data: {\n args: [this.filenameSelect, start_row, end_row],\n },\n },\n )\n }\n },\n clearBreakpoints: function () {\n this.editor.session.clearBreakpoints()\n },\n toggleBreakpoint: function ($event) {\n // Don't allow setting breakpoints while running\n if (!this.scriptId) {\n const row = $event.getDocumentPosition().row\n if ($event.editor.session.getBreakpoints(row, 0)[row]) {\n $event.editor.session.clearBreakpoint(row)\n } else {\n $event.editor.session.setBreakpoint(row)\n }\n }\n },\n updateBreakpoints: function ($event, session) {\n if ($event.lines.length <= 1) {\n return\n }\n const rowsToUpdate = this.getBreakpointRows(session).filter(\n (row) =>\n ($event.start.column === 0 && row === $event.start.row) ||\n row > $event.start.row,\n )\n let rowsToDelete = []\n let offset = 0\n switch ($event.action) {\n case 'insert':\n offset = $event.lines.length - 1\n rowsToUpdate.reverse() // shift the lower ones down out of the way first\n break\n case 'remove':\n offset = -$event.lines.length + 1\n rowsToDelete = [...Array($event.lines.length).keys()].map(\n (row) => row + $event.start.row,\n )\n break\n }\n rowsToUpdate.forEach((row) => {\n session.clearBreakpoint(row)\n if (!rowsToDelete.includes(row)) {\n session.setBreakpoint(row + offset)\n }\n })\n },\n getBreakpointRows: function (session = this.editor.session) {\n return session\n .getBreakpoints()\n .map((breakpoint, row) => breakpoint && row) // [empty, 'ace_breakpoint', 'ace_breakpoint', empty] -> [empty, 1, 2, empty]\n .filter(Number.isInteger) // [empty, 1, 2, empty] -> [1, 2]\n },\n restoreBreakpoints: function (filename) {\n this.clearBreakpoints()\n this.breakpoints[filename]?.forEach((breakpoint) => {\n this.editor.session.setBreakpoint(breakpoint)\n })\n },\n deleteAllBreakpoints: function () {\n this.$dialog\n .confirm('Permanently delete all breakpoints for ALL scripts?', {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete('/script-api/breakpoints/delete/all')\n })\n .then((response) => {\n this.clearBreakpoints()\n })\n },\n suiteRunnerButton(event) {\n if (this.startOrGoButton === START) {\n this.start(event, 'suiteRunner')\n } else {\n this.go(event, 'suiteRunner')\n }\n },\n async keydown(event) {\n // Don't ever save if running or readonly\n if (this.scriptId || this.editor.getReadOnly() === true) {\n return\n }\n // NOTE: Chrome does not allow overriding Ctrl-N, Ctrl-Shift-N, Ctrl-T, Ctrl-Shift-T, Ctrl-W\n // NOTE: metaKey == Command on Mac\n if (\n (event.metaKey || event.ctrlKey) &&\n event.keyCode === 'S'.charCodeAt(0)\n ) {\n if (event.shiftKey) {\n event.preventDefault()\n this.saveAs()\n } else {\n event.preventDefault()\n await this.saveFile()\n }\n }\n },\n onChange(event) {\n // Don't track changes when we're running or read-only (locked)\n if (this.scriptId || this.editor.getReadOnly() === true) {\n return\n }\n if (this.editor.session.getUndoManager().canUndo()) {\n this.fileModified = '*'\n } else {\n this.fileModified = ''\n }\n },\n checkMnemonics: function () {\n let filename = this.filename\n if (this.filename !== NEW_FILENAME) {\n // Check if the extension is not .rb or .py\n if (!(filename.endsWith('.rb') || filename.endsWith('.py'))) {\n Api.post(`/script-api/scripts/${this.filename}/mnemonics`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n let alertText = ''\n alertText += `<strong>${response.data.title}</strong><br/><br/>`\n alertText += JSON.parse(response.data.description)\n this.$dialog.alert(alertText.trim(), { html: true })\n return\n })\n }\n }\n this.mnemonicChecker\n .checkText(this.editor.getValue())\n .then(({ skipped, problems }) => {\n let alertText = ''\n if (problems.length) {\n const problemText = problems\n .map((problem) => `${problem.lineNumber}: ${problem.error}`)\n .join('<br/>')\n alertText += `<strong>The following lines have problems:</strong><br/>${problemText}<br/><br/>`\n }\n if (skipped.length) {\n alertText +=\n '<strong>Mnemonics with string interpolation were not checked.</strong>'\n }\n if (alertText === '') {\n alertText = '<strong>Everything looks good!</strong>'\n }\n this.$dialog.alert(alertText.trim(), { html: true })\n })\n },\n initScriptStart() {\n this.disableSuiteButtons = true\n this.startOrGoDisabled = true\n this.envDisabled = true\n this.pauseOrRetryDisabled = true\n this.stopDisabled = true\n this.state = 'Connecting...'\n this.startOrGoButton = GO\n this.editor.setReadOnly(true)\n },\n scriptStart(id) {\n this.$emit('script-id', id)\n this.scriptId = id\n this.cable\n .createSubscription(\n 'RunningScriptChannel',\n window.openc3Scope,\n {\n received: (data) => this.received(data),\n },\n {\n id: this.scriptId,\n },\n )\n .then((subscription) => {\n this.subscription = subscription\n })\n },\n async scriptComplete() {\n // Make sure we process no more events\n if (this.subscription) {\n await this.subscription.unsubscribe()\n this.subscription = null\n }\n this.receivedEvents.length = 0 // Clear any unprocessed events\n\n await this.reloadFile() // Make sure the right file is shown\n // We may have changed the contents (if there were sub-scripts)\n // so don't let the undo manager think this is a change\n this.editor.session.getUndoManager().reset()\n if (this.readOnlyUser == false && !this.inline) {\n this.editor.setReadOnly(false)\n }\n\n this.scriptId = null // No current scriptId\n sessionStorage.removeItem('script_runner__script_id')\n\n // Lastly enable the buttons so another script can start\n this.disableSuiteButtons = false\n this.startOrGoButton = START\n this.pauseOrRetryButton = PAUSE\n // Disable start if suiteRunner\n this.startOrGoDisabled = this.suiteRunner\n this.envDisabled = false\n this.pauseOrRetryDisabled = true\n this.stopDisabled = true\n // Overrides can be set from a script\n this.updateOverridesCount()\n },\n environmentHandler: function (event) {\n this.scriptEnvironment.env = event\n },\n startHandler: function () {\n this.start()\n },\n async start(\n event = null,\n suiteRunner = null,\n line_no = null,\n end_line_no = null,\n ) {\n // Initialize variables and disable buttons before actually posting.\n // This prevents delays in the backend from delaying frontend changes\n // like disabling start which could allow users to click start twice.\n this.initScriptStart()\n await this.saveFile('start')\n this.saveAllowed = false\n let filename = this.filename\n if (this.filename === NEW_FILENAME) {\n // NEW_FILENAME so use tempFilename created by saveFile()\n filename = this.tempFilename\n }\n let url = `/script-api/scripts/${filename}/run`\n if (this.showDisconnect) {\n url += '/disconnect'\n }\n let env = this.scriptEnvironment.env\n if (this.enableStackTraces) {\n env = env.concat({\n key: 'OPENC3_FULL_BACKTRACE',\n value: '1',\n })\n }\n let data = {\n environment: env,\n }\n if (suiteRunner) {\n // TODO 7.0: Should suiteRunner be snake case?\n data['suiteRunner'] = event\n }\n if (line_no !== null) {\n data['line_no'] = line_no\n }\n if (end_line_no !== null) {\n data['end_line_no'] = end_line_no\n }\n Api.post(url, { data })\n .then((response) => {\n this.scriptStart(response.data)\n })\n .catch((error) => {\n this.scriptComplete()\n })\n },\n go() {\n // Ensure we're on the correct filename when we hit go\n // They may have changed it using the drop down\n this.filenameSelect = this.currentFilename\n this.fileNameChanged(this.currentFilename)\n Api.post(`/script-api/running-script/${this.scriptId}/go`)\n },\n pauseOrRetry() {\n if (this.pauseOrRetryButton === PAUSE) {\n Api.post(`/script-api/running-script/${this.scriptId}/pause`)\n } else {\n this.pauseOrRetryButton = PAUSE\n Api.post(`/script-api/running-script/${this.scriptId}/retry`)\n }\n },\n stop() {\n Api.post(`/script-api/running-script/${this.scriptId}/stop`)\n },\n step() {\n Api.post(`/script-api/running-script/${this.scriptId}/step`)\n },\n // This is called by processLine no matter the current state\n handleWaiting() {\n // First check if we're not waiting and if so clear the interval\n if (this.state !== 'waiting' && this.state !== 'paused') {\n this.clearWaiting()\n } else if (this.waitingInterval !== null) {\n // If we're waiting and the interval is active then nothing to do\n return\n }\n this.waitingStart = Date.now()\n // Create an interval to count every second\n this.waitingInterval = setInterval(() => {\n this.waitingTime = Math.round((Date.now() - this.waitingStart) / 1000)\n }, 1000)\n },\n clearWaiting() {\n this.waitingTime = 0\n clearInterval(this.waitingInterval)\n this.waitingInterval = null\n },\n processLine(data) {\n if (data.filename && data.filename !== this.currentFilename) {\n if (!this.files[data.filename]) {\n // We don't have the contents of the running file (probably because connected to running script)\n // Set the contents initially to an empty string so we don't start slamming the API\n this.files[data.filename] = { content: '', lineNo: 0 }\n\n // Request the script we need\n Api.get(`/script-api/scripts/${data.filename}`)\n .then((response) => {\n // Success - Save the script text and mark the currentFilename as null\n // so it will get loaded in on the next line executed\n this.files[data.filename] = {\n content: response.data.contents,\n lineNo: 0,\n }\n this.breakpoints[data.filename] = response.data.breakpoints\n this.restoreBreakpoints(data.filename)\n this.currentFilename = null\n })\n .catch((err) => {\n // Error - Restore the file contents to null so we'll try the API again on the next line\n this.files[data.filename] = null\n })\n } else {\n this.currentFilename = data.filename\n this.editor.setValue(this.files[data.filename].content)\n this.restoreBreakpoints(data.filename)\n this.editor.clearSelection()\n }\n }\n this.state = data.state\n const markers = this.editor.session.getMarkers()\n switch (this.state) {\n // Handle all the script states, see script_status_model for details\n // spawning, init, running, paused, waiting, breakpoint, error, crashed, stopped, completed, completed_errors, killed\n case 'running':\n this.handleWaiting()\n this.startOrGoDisabled = false\n this.pauseOrRetryDisabled = false\n this.stopDisabled = false\n this.pauseOrRetryButton = PAUSE\n\n this.removeAllMarkers()\n this.editor.session.addMarker(\n new this.Range(data.line_no - 1, 0, data.line_no - 1, 1),\n 'runningMarker',\n 'fullLine',\n )\n this.editor.gotoLine(data.line_no)\n this.files[data.filename].lineNo = data.line_no\n break\n case 'error':\n this.pauseOrRetryButton = RETRY\n // Deliberate fall through (no break)\n case 'spawning': // wait for script to be spawned\n case 'init': // wait for script to initialize\n case 'paused':\n case 'waiting':\n case 'breakpoint':\n this.handleWaiting()\n this.startOrGoDisabled = false\n this.pauseOrRetryDisabled = false\n this.stopDisabled = false\n let existing = Object.keys(markers).filter(\n (key) => markers[key].clazz === `${this.state}Marker`,\n )\n if (existing.length === 0) {\n this.removeAllMarkers()\n let line = data.line_no > 0 ? data.line_no : 1\n this.editor.session.addMarker(\n new this.Range(line - 1, 0, line - 1, 1),\n `${this.state}Marker`,\n 'fullLine',\n )\n this.editor.gotoLine(line)\n // Fatal errors don't always have a filename set\n if (data.filename) {\n this.files[data.filename].lineNo = line\n }\n }\n break\n case 'completed':\n case 'completed_errors':\n case 'stopped':\n case 'crashed':\n case 'killed':\n // Only remove markers here - full cleanup is handled by the\n // 'complete' message in processReceived() which always follows.\n // Calling scriptComplete() here would unsubscribe the channel\n // before the 'complete' message (with suite report) arrives.\n this.removeAllMarkers()\n break\n\n default:\n break\n }\n },\n processReceived() {\n let count = 0\n for (let data of this.receivedEvents) {\n count += 1\n // console.log(data) // Uncomment for debugging\n let index = 0\n switch (data.type) {\n case 'file':\n this.files[data.filename] = { content: data.text, lineNo: 0 }\n this.breakpoints[data.filename] = data.breakpoints\n if (this.currentFilename === data.filename) {\n this.restoreBreakpoints(data.filename)\n }\n break\n case 'line':\n // A further optimization would be to only process the last line of a batch\n // However with some testing this did not seem to make much difference\n // and was preventing the highlighting of the final line of a script because\n // the last line of the final batch was line_number 0 with state stopped\n // and that would never highlight the actual final line\n this.processLine(data)\n break\n case 'output':\n // data.line can consist of multiple lines split by newlines,\n // thus we split and only output if the content is not empty.\n // We also need to ensure it's properly serialized as a string.\n let dataLine = data.line\n if (dataLine === null || dataLine === undefined) {\n dataLine = ''\n } else if (typeof dataLine === 'object') {\n dataLine = JSON.stringify(dataLine)\n } else {\n dataLine = String(dataLine)\n }\n for (const line of dataLine.split('\\n')) {\n if (line) {\n if (this.messagesNewestOnTop) {\n this.messages.unshift({ message: line })\n } else {\n this.messages.push({ message: line })\n }\n }\n }\n while (this.messages.length > this.maxArrayLength) {\n this.messages.pop()\n }\n break\n case 'script':\n this.handleScript(data)\n break\n // DEPRECATED because the 'complete' message now includes the report\n case 'report':\n this.results.text = data.report\n this.results.show = true\n break\n case 'complete':\n if (data.report) {\n this.results.text = data.report\n this.results.show = true\n }\n this.removeAllMarkers()\n this.scriptComplete()\n break\n case 'step':\n this.showDebug = true\n break\n case 'screen':\n let found = false\n let definition = {}\n for (screen of this.screens) {\n if (\n screen.target == data.target_name &&\n screen.screen == data.screen_name\n ) {\n definition = screen\n found = true\n break\n }\n index += 1\n }\n definition.target = data.target_name\n definition.screen = data.screen_name\n definition.definition = data.definition\n if (data.x) {\n definition.left = data.x\n } else {\n definition.left = 0\n }\n if (data.y) {\n definition.top = data.y\n } else {\n definition.top = 0\n }\n definition.count = this.updateCounter++\n if (!found) {\n definition.id = this.idCounter++\n this.screens[this.screens.length] = definition\n } else {\n this.screens[index] = definition\n }\n break\n case 'clearscreen':\n for (screen of this.screens) {\n if (\n screen.target == data.target_name &&\n screen.screen == data.screen_name\n ) {\n this.screens.splice(index, 1)\n break\n }\n index += 1\n }\n break\n case 'clearallscreens':\n this.screens = []\n break\n case 'downloadfile':\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = window.location.origin + data.url\n link.setAttribute('download', data.filename)\n link.click()\n break\n case 'opentab':\n window.open(data.url, '_blank')\n break\n default:\n // console.log('Unexpected ActionCable message')\n // console.log(data)\n break\n }\n }\n\n // Remove all the events we processed\n this.receivedEvents.splice(0, count)\n },\n received(data) {\n this.cable.recordPing()\n this.receivedEvents.push(data)\n },\n promptDialogCallback(value) {\n this.prompt.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: this.prompt.method,\n answer: value,\n prompt_id: this.activePromptId,\n multiple: this.prompt.multiple,\n },\n })\n },\n handleScript(data) {\n if (data.prompt_complete) {\n this.activePromptId = ''\n this.prompt.show = false\n this.ask.show = false\n this.file.show = false\n this.bucket.show = false\n return\n }\n this.activePromptId = data.prompt_id\n this.prompt.method = data.method // Set it here since all prompts use this\n this.prompt.layout = 'horizontal' // Reset the layout since most are horizontal\n this.prompt.title = 'Prompt'\n this.prompt.subtitle = ''\n this.prompt.details = ''\n this.prompt.buttons = []\n this.prompt.multiple = null\n switch (data.method) {\n case 'ask':\n case 'ask_string':\n // Reset values since this dialog can be reused\n this.ask.default = null\n this.ask.answerRequired = true\n this.ask.password = false\n this.ask.question = data.args[0]\n // If the second parameter is not true or false it indicates a default value\n if (data.args[1] && data.args[1] !== true && data.args[1] !== false) {\n this.ask.default = data.args[1].toString()\n } else if (data.args[1] === true) {\n // If the second parameter is true it means no value is required to be entered\n this.ask.answerRequired = false\n }\n // The third parameter indicates a password textfield\n if (data.args[2] === true) {\n this.ask.password = true\n }\n this.ask.callback = (value) => {\n this.ask.show = false // Close the dialog\n if (this.ask.password) {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n password: value, // Using password as a key automatically filters it from rails logs\n prompt_id: this.activePromptId,\n },\n })\n } else {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n answer: value,\n prompt_id: this.activePromptId,\n },\n })\n }\n }\n this.ask.show = true // Display the dialog\n break\n case 'prompt_for_hazardous':\n this.prompt.title = 'Hazardous Command'\n this.prompt.message = `Warning: Command ${data.args[0]} ${data.args[1]} is Hazardous. `\n if (data.args[2]) {\n this.prompt.message += data.args[2] + ' '\n }\n this.prompt.message += 'Send?'\n this.prompt.buttons = [{ text: 'Send', value: 'Send' }]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'prompt_for_critical_cmd':\n this.criticalCmdUuid = data.args[0]\n this.criticalCmdString = data.args[5]\n this.criticalCmdUser = data.args[1]\n this.displayCriticalCmd = true\n break\n case 'prompt':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n this.prompt.message = data.args[0]\n this.prompt.buttons = [{ text: 'Ok', value: 'Ok' }]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'combo_box':\n case 'check_box':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n // check_box is always multiple choice, combo_box is single choice unless kwargs.multiple is set to true\n if (\n data.method === 'check_box' ||\n (data.kwargs && data.kwargs.multiple)\n ) {\n this.prompt.multiple = true\n }\n this.prompt.message = data.args[0]\n data.args.slice(1).forEach((v) => {\n this.prompt.buttons.push({ title: v, value: v })\n })\n this.prompt.layout = data.method.split('_')[0]\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'message_box':\n case 'vertical_message_box':\n if (data.kwargs && data.kwargs.informative) {\n this.prompt.subtitle = data.kwargs.informative\n }\n if (data.kwargs && data.kwargs.details) {\n this.prompt.details = data.kwargs.details\n }\n this.prompt.message = data.args[0]\n data.args.slice(1).forEach((v) => {\n this.prompt.buttons.push({ text: v, value: v })\n })\n if (data.method.includes('vertical')) {\n this.prompt.layout = 'vertical'\n }\n this.prompt.callback = this.promptDialogCallback\n this.prompt.show = true\n break\n case 'backtrace':\n this.information.title = 'Call Stack'\n this.information.text = data.args\n this.information.show = true\n this.information.width = '600'\n break\n case 'metadata_input':\n this.inputMetadata.callback = (value) => {\n this.inputMetadata.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: data.method,\n answer: value,\n prompt_id: this.activePromptId,\n },\n })\n }\n this.showMetadata()\n break\n case 'open_bucket_dialog':\n this.bucket.title = data.args[0]\n this.bucket.message = data.args[1]\n this.bucket.show = true\n break\n // This is called continuously by the backend\n case 'open_file_dialog':\n case 'open_files_dialog':\n this.file.title = data.args[0]\n this.file.message = data.args[1]\n if (data.kwargs && data.kwargs.filter) {\n this.file.filter = data.kwargs.filter\n }\n if (data.method == 'open_files_dialog') {\n this.file.multiple = true\n }\n this.file.show = true\n break\n default:\n // console.log(\n // 'Unknown script method:' + data.method + ' with args:' + data.args\n // )\n break\n }\n },\n async fileDialogCallback(files) {\n // Set fileNames to 'COSMOS__CANCEL' in case they cancelled\n // otherwise we will populate it with the file names they selected\n let fileNames = 'COSMOS__CANCEL'\n // Record all the API request promises so we can ensure they complete\n let promises = []\n if (files != 'COSMOS__CANCEL') {\n fileNames = []\n files.forEach((file) => {\n fileNames.push(file.name)\n promises.push(\n Api.get(\n `/openc3-api/storage/upload/${encodeURIComponent(\n `${window.openc3Scope}/tmp/${file.name}`,\n )}?bucket=OPENC3_CONFIG_BUCKET`,\n ).then((response) => {\n // This pushes the file into storage by using the fields in the presignedRequest\n // See storage_controller.rb get_upload_presigned_request()\n promises.push(\n axios({\n ...response.data,\n data: file,\n }),\n )\n }),\n )\n })\n }\n // We have to wait for all the upload API requests to finish before notifying the prompt\n Promise.all(promises).then((responses) => {\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: this.file.multiple\n ? 'open_files_dialog'\n : 'open_file_dialog',\n answer: fileNames,\n prompt_id: this.activePromptId,\n },\n })\n this.file.show = false // Close the dialog immediately to avoid race condition\n })\n },\n bucketDialogCallback(response) {\n this.bucket.show = false\n Api.post(`/script-api/running-script/${this.scriptId}/prompt`, {\n data: {\n method: 'open_bucket_dialog',\n answer: response,\n prompt_id: this.activePromptId,\n },\n })\n },\n setError(event) {\n this.alertType = 'error'\n this.alertText = `Error: ${event}`\n this.showAlert = true\n },\n // ScriptRunner File menu actions\n async confirmUnsavedChanges() {\n if (this.fileModified === '*') {\n return await this.$dialog.confirm(\n 'You have unsaved changes. Are you sure you want to continue?',\n {\n okText: 'Continue',\n cancelText: 'Cancel',\n },\n )\n }\n return true\n },\n async newFileWithConfirm() {\n const confirmed = await this.confirmUnsavedChanges()\n if (confirmed) {\n this.newFile()\n }\n },\n newFile() {\n this.unlockFile()\n this.filename = NEW_FILENAME\n this.currentFilename = null\n this.tempFilename = null\n this.files = {} // Clear the cached file list\n this.editor.session.setValue('')\n this.saveAllowed = true\n this.fileModified = ''\n this.suiteRunner = false\n this.startOrGoDisabled = false\n this.envDisabled = false\n if (!this.inline) {\n this.$router\n .replace({\n name: 'ScriptRunner',\n })\n // catch the error in case we route to where we already are\n .catch((err) => {})\n document.title = 'Script Runner'\n }\n this.doResize()\n },\n async newRubyTestSuite() {\n const confirmed = await this.confirmUnsavedChanges()\n if (!confirmed) return\n this.newFile()\n this.editor.session.setValue(`require 'openc3/script/suite.rb'\n\n# Group class name should indicate what the scripts are testing\nclass Power < OpenC3::Group\n # Methods beginning with script_ are added to Script dropdown\n def script_power_on\n # Using OpenC3::Group.puts adds the output to the Test Report\n # This can be useful for requirements verification, QA notes, etc\n OpenC3::Group.puts \"Verifying requirement SR-1\"\n configure()\n end\n\n # Other methods are not added to Script dropdown\n def configure\n end\n\n def setup\n # Run when Group Setup button is pressed\n # Run before all scripts when Group Start is pressed\n end\n\n def teardown\n # Run when Group Teardown button is pressed\n # Run after all scripts when Group Start is pressed\n end\nend\n\nclass TestSuite < OpenC3::Suite\n def initialize\n add_group('Power')\n end\n def setup\n # Run when Suite Setup button is pressed\n # Run before all groups when Suite Start is pressed\n end\n def teardown\n # Run when Suite Teardown button is pressed\n # Run after all groups when Suite Start is pressed\n end\nend\n`)\n await this.saveFile('auto')\n },\n async newPythonTestSuite() {\n const confirmed = await this.confirmUnsavedChanges()\n if (!confirmed) return\n this.newFile()\n this.editor.session.setValue(`from openc3.script.suite import Suite, Group\n\n# Group class name should indicate what the scripts are testing\nclass Power(Group):\n # Methods beginning with script_ are added to Script dropdown\n def script_power_on(self):\n # Using Group.print adds the output to the Test Report\n # This can be useful for requirements verification, QA notes, etc\n Group.print(\"Verifying requirement SR-1\")\n self.configure()\n\n # Other methods are not added to Script dropdown\n def configure(self):\n pass\n\n def setup(self):\n # Run when Group Setup button is pressed\n # Run before all scripts when Group Start is pressed\n pass\n\n def teardown(self):\n # Run when Group Teardown button is pressed\n # Run after all scripts when Group Start is pressed\n pass\n\nclass TestSuite(Suite):\n def __init__(self):\n self.add_group(Power)\n\n def setup(self):\n # Run when Suite Setup button is pressed\n # Run before all groups when Suite Start is pressed\n pass\n\n def teardown(self):\n # Run when Suite Teardown button is pressed\n # Run after all groups when Suite Start is pressed\n pass\n`)\n await this.saveFile('auto')\n },\n addToRecent(filename) {\n // See if this filename is already in the recent ... if so remove it\n let index = this.recent.findIndex((i) => i.label === filename)\n if (index !== -1) {\n this.recent.splice(index, 1)\n }\n // Push this filename to the front of the recently used\n this.recent.unshift({\n label: filename,\n icon: fileIcon(filename),\n command: async (event) => {\n const confirmed = await this.confirmUnsavedChanges()\n if (!confirmed) return\n this.filename = event.label\n await this.reloadFile()\n },\n })\n if (this.recent.length > 8) {\n this.recent.pop()\n }\n // This only stringifies the label and icon ... not the command\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n }\n },\n removeFromRecent(filename) {\n this.recent = this.recent.filter((entry) => entry.label !== filename)\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n if (localStorage['script_runner__filename'] === filename) {\n localStorage.removeItem('script_runner__filename')\n }\n }\n },\n async openFileWithConfirm() {\n const confirmed = await this.confirmUnsavedChanges()\n if (confirmed) {\n this.openFile()\n }\n },\n openFile() {\n this.fileOpen = true\n },\n async reloadFile(showError = true) {\n // Disable start while we're loading the file so we don't hit Start\n // before it's fully loaded and then save over it with a blank file\n this.saveAllowed = false\n this.startOrGoDisabled = true\n await Api.get(`/script-api/scripts/${this.filename}`, {\n headers: {\n Accept: 'application/json',\n 'Ignore-Errors': '404',\n },\n })\n .then((response) => {\n const file = {\n name: this.filename,\n contents: response.data.contents,\n }\n if (response.data.suites) {\n file['suites'] = JSON.parse(response.data.suites)\n }\n if (response.data.error) {\n file['error'] = response.data.error\n }\n if (response.data.success) {\n file['success'] = response.data.success\n }\n const locked = response.data.locked\n const breakpoints = response.data.breakpoints\n this.setFile({ file, locked, breakpoints }, true)\n this.saveAllowed = true\n })\n .catch((error) => {\n if (showError === true) {\n this.$notify.caution({\n title: 'File Open Error',\n body: `Failed to open ${this.filename} due to ${error}`,\n })\n }\n this.removeFromRecent(this.filename)\n this.newFile() // Reset the GUI\n })\n },\n // Called by the FileOpenDialog to set the file contents\n setFile({ file, locked, breakpoints }, local = false) {\n this.files = {} // Clear the cached file list\n // Split off the ' *' which indicates a file is modified on the server\n let newFilename = file.name.split('*')[0]\n if (local === false) {\n // We only need to unlock if the file is different\n if (this.filename !== newFilename) {\n this.unlockFile() // first unlock what was just being edited\n this.lockedBy = locked\n }\n }\n this.filename = newFilename\n if (!this.inline) {\n // Update the URL with the filename\n this.$router\n .replace({\n name: 'ScriptRunner',\n query: {\n file: this.filename,\n },\n })\n // catch the error in case we route to where we already are\n .catch((err) => {})\n\n // Update the browser tab with the name of the file first\n // so squished tabs are still useful, followed by the rest\n // of the path for context. Target name will be first which\n // is probably the most useful part of the path.\n let parts = this.filename.split('/')\n document.title = `${parts.pop()} (${parts.join('/')})`\n }\n\n if (this.filename.split('.').pop() === 'py') {\n this.editor.session.setMode(this.pythonMode)\n } else {\n this.editor.session.setMode(this.rubyMode)\n }\n this.currentFilename = null\n this.editor.session.setValue(file.contents)\n this.breakpoints[this.filename] = breakpoints\n this.restoreBreakpoints(this.filename)\n this.fileModified = ''\n this.envDisabled = false\n this.addToRecent(this.filename)\n\n if (file.suites) {\n this.suiteRunner = true\n this.suiteMap = file.suites\n this.startOrGoDisabled = true\n } else {\n this.suiteRunner = false\n this.startOrGoDisabled = false\n }\n if (file.error) {\n this.suiteError = file.error\n this.showSuiteError = true\n }\n // Disable suite buttons if we didn't successfully parse the suite\n this.disableSuiteButtons = file.success == false\n this.doResize()\n },\n clearTemp() {\n this.recent = this.recent.filter(\n (entry) => !entry.label.includes('__TEMP__'),\n )\n if (!this.inline) {\n localStorage['script_runner__recent'] = JSON.stringify(this.recent)\n }\n },\n detectLanguage() {\n let rubyRegex1 = new RegExp('^\\\\s*(require|load|puts) ')\n let pythonRegex1 = new RegExp('^\\\\s*(import|from) ')\n let rubyRegex2 = new RegExp('^\\\\s*end\\\\s*$')\n let pythonRegex2 = new RegExp(\n '^\\\\s*(if|def|while|else|elif|class).*:\\\\s*$',\n )\n let pythonRegex3 = /\\(f\"/ // f strings\n // Since python types are defined like \"def method(string: str):\"\n // we make sure the line doesn't end in ':' which indicates Python\n // (?!:)$ is a negative lookahead to ensure it doesn't end in ':'\n let rubyRegex3 = /\\(.*\\w+:\\s+.+\\)(?!:)$/ // named parameters\n let text = this.editor.getValue()\n let lines = text.split('\\n')\n for (let line of lines) {\n if (line.match(rubyRegex1)) {\n return 'ruby'\n }\n if (line.match(pythonRegex1)) {\n return 'python'\n }\n if (line.match(rubyRegex2)) {\n return 'ruby'\n }\n if (line.match(pythonRegex2)) {\n return 'python'\n }\n if (line.match(pythonRegex3)) {\n return 'python'\n }\n if (line.match(rubyRegex3)) {\n return 'ruby'\n }\n }\n return 'unknown' // otherwise unknown\n },\n // saveFile takes a type to indicate if it was called by the Menu\n // or automatically by 'Start' (to ensure a consistent backend file) or autoSave\n async saveFile(type = 'menu') {\n if (this.readOnlyUser) {\n return\n }\n if (this.saveAllowed) {\n const breakpoints = this.getBreakpointRows()\n if (this.filename === NEW_FILENAME) {\n if (type === 'menu') {\n // Menu driven saves on a new file should prompt SaveAs\n this.saveAs()\n return\n } else {\n // start or auto with NEW_FILENAME\n if (this.tempFilename === null) {\n let language = this.detectLanguage()\n if (language === 'unknown') {\n language = AceEditorUtils.getDefaultScriptingLanguage()\n }\n const uuid = crypto.randomUUID().split('-')[0]\n if (language === 'ruby') {\n this.tempFilename =\n TEMP_FOLDER +\n '/' +\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss_SSS') +\n '_' +\n uuid +\n '_temp.rb'\n } else if (language === 'python') {\n this.tempFilename =\n TEMP_FOLDER +\n '/' +\n format(Date.now(), 'yyyy_MM_dd_HH_mm_ss_SSS') +\n '_' +\n uuid +\n '_temp.py'\n } else {\n // No autosave for unknown language\n return\n }\n this.filename = this.tempFilename\n this.addToRecent(this.filename)\n }\n }\n }\n this.showSave = true\n await Api.post(`/script-api/scripts/${this.filename}`, {\n data: {\n text: this.editor.getValue(), // Pass in the raw file text\n breakpoints,\n },\n })\n .then((response) => {\n if (response.status == 200) {\n if (response.data.suites) {\n this.startOrGoDisabled = true\n this.suiteRunner = true\n this.suiteMap = JSON.parse(response.data.suites)\n } else {\n this.startOrGoDisabled = false\n this.suiteRunner = false\n this.suiteMap = {}\n }\n if (response.data.error) {\n this.suiteError = response.data.error\n this.showSuiteError = true\n }\n this.fileModified = ''\n setTimeout(() => {\n this.showSave = false\n }, 2000)\n } else {\n this.showSave = false\n this.alertType = 'error'\n this.alertText = `Error saving file. Code: ${response.status} Text: ${response.statusText}`\n this.showAlert = true\n }\n this.lockFile() // Ensure this file is locked for editing\n this.doResize()\n })\n .catch(({ response }) => {\n this.showSave = false\n // 422 error means we couldn't parse the script file into Suites\n // response.data.suites holds the parse result\n if (response.status == 422) {\n this.alertType = 'error'\n this.alertText = response.data.suites\n } else {\n this.alertType = 'error'\n this.alertText = `Error saving file. Code: ${response.status} Text: ${response.statusText}`\n }\n this.showAlert = true\n })\n } else {\n this.setError('Attempt to save file when not allowed')\n }\n },\n saveAs() {\n this.showSaveAs = true\n },\n async saveAsFilename(filename) {\n this.filename = filename.split('*')[0]\n this.currentFilename = null\n if (this.tempFilename) {\n Api.post(`/script-api/scripts/${this.tempFilename}/delete`)\n this.tempFilename = null\n }\n await this.saveFile('menu')\n },\n delete() {\n let filename = this.filename\n if (this.tempFilename) {\n filename = this.tempFilename\n }\n this.$dialog\n .confirm(`Permanently delete file: ${filename}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.post(`/script-api/scripts/${filename}/delete`, {\n data: {},\n })\n })\n .then((response) => {\n this.removeFromRecent(filename)\n this.newFile()\n })\n .catch((error) => {\n if (error !== true) {\n const alertObject = {\n text: `Failed Multi-Delete. ${error}`,\n type: 'error',\n }\n this.$emit('alert', alertObject)\n }\n })\n },\n download() {\n const blob = new Blob([this.editor.getValue()], {\n type: 'text/plain',\n })\n // Make a link and then 'click' on it to start the download\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', this.filename)\n link.click()\n },\n // ScriptRunner Script menu actions\n syntaxCheck() {\n Api.post(`/script-api/scripts/${this.filename}/syntax`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n this.information.title = response.data.title\n this.information.text = JSON.parse(response.data.description)\n this.information.show = true\n this.information.width = '600'\n })\n },\n showInstrumented() {\n Api.post(`/script-api/scripts/${this.filename}/instrumented`, {\n data: this.editor.getValue(),\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'plain/text',\n },\n }).then((response) => {\n this.information.title = response.data.title\n this.information.text = JSON.parse(response.data.description)\n this.information.show = true\n this.information.width = '90vw'\n })\n },\n showCallStack() {\n Api.post(`/script-api/running-script/${this.scriptId}/backtrace`)\n },\n toggleDebug() {\n this.showDebug = !this.showDebug\n if (this.showDebug) {\n this.$nextTick(() => {\n this.$refs.debug.focus()\n })\n }\n },\n toggleDisconnect() {\n this.showDisconnect = !this.showDisconnect\n },\n debugKeydown(event) {\n if (event.key === 'Escape') {\n this.debug = ''\n this.debugHistoryIndex = this.debugHistory.length\n } else if (event.key === 'Enter') {\n this.debugHistory.push(this.debug)\n this.debugHistoryIndex = this.debugHistory.length\n // Post the code to /debug, output is processed by receive()\n Api.post(`/script-api/running-script/${this.scriptId}/debug`, {\n data: {\n args: this.debug,\n },\n })\n this.debug = ''\n } else if (event.key === 'ArrowUp') {\n this.debugHistoryIndex -= 1\n if (this.debugHistoryIndex < 0) {\n this.debugHistoryIndex = this.debugHistory.length - 1\n }\n this.debug = this.debugHistory[this.debugHistoryIndex]\n // Prevent the cursor/caret from moving to the front\n event.preventDefault()\n } else if (event.key === 'ArrowDown') {\n this.debugHistoryIndex += 1\n if (this.debugHistoryIndex >= this.debugHistory.length) {\n this.debugHistoryIndex = 0\n }\n this.debug = this.debugHistory[this.debugHistoryIndex]\n }\n },\n removeAllMarkers: function () {\n const allMarkers = this.editor.session.getMarkers()\n Object.keys(allMarkers)\n .filter((key) => allMarkers[key].type === 'fullLine')\n .forEach((marker) => this.editor.session.removeMarker(marker))\n },\n confirmLocalUnlock: function () {\n this.$dialog\n .confirm(\n 'Are you sure you want to unlock this script for editing? If another user is editing this script, your changes might conflict with each other.',\n {\n okText: 'Force Unlock',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.lockedBy = null\n return this.lockFile() // Re-lock it as this user so it's locked for anyone else who opens it\n })\n },\n lockFile: function () {\n if (!this.readOnlyUser) {\n return Api.post(`/script-api/scripts/${this.filename}/lock`)\n }\n },\n unlockFile: function () {\n if (\n this.filename !== NEW_FILENAME &&\n !this.readOnly &&\n !this.readOnlyUser\n ) {\n Api.post(`/script-api/scripts/${this.filename}/unlock`)\n }\n },\n backToNewScript: async function () {\n // Disconnect from the current script\n this.scriptDisconnect()\n // Clear script-related state\n this.removeAllMarkers()\n await this.scriptComplete()\n // Create a new blank script\n this.newFile()\n },\n screenId(id) {\n return 'scriptRunnerScreen' + id\n },\n closeScreen(id) {\n let index = 0\n for (screen of this.screens) {\n if (screen.id == id) {\n this.screens.splice(index, 1)\n break\n }\n index += 1\n }\n },\n },\n}\n</script>\n\n<style scoped>\nhr {\n color: white;\n height: 3px;\n}\n\n.error-message {\n border: 2px solid #f44336;\n border-radius: 8px;\n background-color: rgba(244, 67, 54, 0.1);\n color: #d32f2f;\n padding-left: 8px;\n padding-right: 8px;\n margin: 16px;\n display: flex;\n align-items: center;\n font-weight: 500;\n box-shadow: 0 2px 4px rgba(244, 67, 54, 0.2);\n}\n\n#sr-controls {\n padding: 0px;\n}\n\n.editor {\n height: 100%;\n width: 100%;\n position: relative;\n font-size: 16px;\n}\n\n.script-state :deep(.v-field) {\n background-color: var(--color-background-base-default);\n}\n\n.script-state :deep(input) {\n text-transform: capitalize;\n}\n\n/* Taken from the various status-symbol-color-fill classes\n on https://www.astrouxds.com/design-tokens/component/ */\n.script-state-red :deep(input) {\n color: #ff3838 !important;\n}\n\n.script-state-orange :deep(input) {\n color: #ffb302 !important;\n}\n\n.script-state-green :deep(input) {\n color: #56f000 !important;\n}\n</style>\n<style>\n.splitpanes--horizontal > .splitpanes__splitter {\n min-height: 4px;\n position: relative;\n top: 4px;\n background-color: grey;\n width: 5%;\n margin: auto;\n cursor: row-resize;\n}\n\n.runningMarker {\n position: absolute;\n background: rgba(0, 255, 0, 0.5);\n z-index: 20;\n}\n\n.waitingMarker {\n position: absolute;\n background: rgba(0, 155, 0, 1);\n z-index: 20;\n}\n\n.breakpointMarker {\n position: absolute;\n border-style: solid;\n border-color: red;\n background: rgba(0, 255, 0, 0.5);\n z-index: 20;\n}\n\n.pausedMarker {\n position: absolute;\n background: rgba(0, 140, 255, 0.5);\n z-index: 20;\n}\n\n.errorMarker {\n position: absolute;\n background: rgba(255, 0, 119, 0.5);\n z-index: 20;\n}\n\n.saving {\n z-index: 20;\n opacity: 0.35;\n}\n\n.ace_gutter {\n /* Screens have a default z-index of 3 so get below that */\n z-index: 2;\n}\n\n.ace_gutter-cell.ace_breakpoint {\n border-radius: 20px 0px 0px 20px;\n box-shadow: 0px 0px 1px 1px red inset;\n}\n\n.grid {\n position: relative;\n}\n\n.item {\n /* TODO: this non-scoped generic class name conflicts with other things and should be scoped or renamed. */\n position: absolute;\n display: block;\n margin: 5px;\n z-index: 1;\n}\n\n.item-content {\n position: relative;\n cursor: pointer;\n border-radius: 6px;\n}\n\n.apply-top .v-snackbar__wrapper {\n top: var(--classification-height-top);\n}\n</style>\n"],"names":["toKeywordRegex","word","prefix","call","interpolatedStringRegex","alternateSyntaxRegex","MnemonicChecker","OpenC3Api","response","target","getKeywords","text","linesToCheck","linesToSkip","result","line","index","commentMatch","lineWithoutComment","cmdMatch","found","regex","tlmMatch","matchStr","parenOrSpaceMatch","mnemonicMatch","usingAlternateSyntax","firstQuote","quoteChar","closingQuoteIndex","mnemonicParts","mnemonic","mnemonicParams","param","token","property","item","problems","a","b","problemLines","targetGroups","groupBy","lineObj","packetGroups","packet","cmdOrTlm","method","packetInfo","items","_sfc_main","OutputDialog","TimeFilters","newTab","error","offset","Api","scripts","currentTime","script","startTime","durationMs","minutes","seconds","hours","page","itemsPerPage","destination","href","dialog","type","logUrl","filenameParts","format","blob","link","basename","_createElementBlock","_createVNode","_component_v_card","_component_v_tabs","$data","$event","_component_v_tab","_cache","_component_v_window","_component_v_window_item","_component_v_card_title","_component_v_row","_component_v_spacer","_component_v_btn","$options","_component_v_text_field","_component_v_data_table_server","_withCtx","_createTextVNode","_toDisplayString","_createElementVNode","_component_v_icon","$props","_hoisted_2","_component_v_menu","props","_mergeProps","_component_v_list","_component_v_list_item","_component_v_list_item_title","_hoisted_1","_createBlock","_component_output_dialog","value","newValue","oldValue","message","output","err","_component_v_select","_component_v_card_text","_component_v_data_table","_normalizeClass","Pe","D","h","y","u","E","ce","l","k","M","z","e","n","m","x","S","c","f","_","R","r","P","O","t","i","s","o","K","I","d","A","U","W","J","$","N","v","p","H","ue","j","Q","V","Z","ee","F","ne","C","ie","te","T","L","ae","le","oe","se","q","B","G","X","re","fe","g","Y","ve","me","ge","w","de","pe","he","ze","xe","_component_v_dialog","_component_v_form","_component_v_toolbar","_component_v_card_actions","parts","part","term","bytes","bucket","path","root","dir","_hoisted_6","_openBlock","_Fragment","_renderList","_component_v_chip","_withModifiers","_component_v_col","_hoisted_4","_hoisted_5","_component_v_progress_circular","_component_v_file_input","layout","_component_v_card_subtitle","button","_component_v_checkbox","_hoisted_7","_component_v_textarea","EnvironmentChooser","_component_environment_chooser","_ctx","name","newVal","oldVal","event","_component_v_tooltip","RegexAnnotator","#id","#editor","#pattern","#text","#type","editor","pattern","session","#removeAllAnnotations","#shiftAnnotations","row","column","#addAnnotation","#deleteAnnotationsForRow","newAnnotation","annotation","count","SleepAnnotator","keyword","suffix","TEMP_FOLDER","NEW_FILENAME","START","GO","PAUSE","RETRY","FileOpenSaveDialog","Openc3Screen","EnvironmentDialog","Splitpanes","Pane","TopBar","AskDialog","BucketDialog","FileDialog","InformationDialog","EventListDialog","OverridesDialog","PromptDialog","ResultsDialog","ScriptEnvironmentDialog","SimpleTextDialog","SuiteRunner","RunningScripts","ScriptLogMessages","CriticalCmdDialog","CommandEditor","AceEditorModes","ClassificationBanners","to","from","next","useContainerHeight","filenames","val","filename","user","roles","role","RubyMode","PythonMode","AceEditorUtils","CmdCompleter","TlmCompleter","sleepAnnotator","Cable","position","cmdString","commandString","indent","trailingComment","newLine","Range","order","id","state","trimmedLine","match","start_row","range","end_row","rowsToUpdate","rowsToDelete","breakpoint","alertText","skipped","problemText","problem","data","subscription","suiteRunner","line_no","end_line_no","url","env","markers","key","dataLine","definition","files","fileNames","promises","file","axios","responses","fileIcon","entry","showError","locked","breakpoints","local","newFilename","rubyRegex1","pythonRegex1","rubyRegex2","pythonRegex2","pythonRegex3","rubyRegex3","lines","language","uuid","alertObject","allMarkers","marker","_hoisted_3","_hoisted_15","_hoisted_17","_hoisted_12","_component_v_tabs_window","_component_v_tabs_window_item","args","_hoisted_13","_hoisted_14","_component_script_log_messages","_normalizeStyle","$setup","_component_top_bar","_component_v_snackbar","attrs","def","_component_openc3_screen","_component_suite_runner","_hoisted_8","_hoisted_9","_component_v_badge","_hoisted_10","_component_splitpanes","prevPane","_component_pane","_component_v_divider","_hoisted_11","_component_file_open_save_dialog","_component_environment_dialog","_component_ask_dialog","_component_file_dialog","_component_bucket_dialog","_component_information_dialog","_component_event_list_dialog","_component_overrides_dialog","_component_prompt_dialog","_component_results_dialog","_component_script_environment_dialog","_component_simple_text_dialog","_component_critical_cmd_dialog","_hoisted_16","_component_command_editor","_component_v_bottom_sheet","_component_v_sheet","_component_running_scripts"],"mappings":"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","x_google_ignoreList":[3]}
|