@openc3/vue-common 6.2.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ArrayWidget-BbsN1dzF.js +106 -0
- package/dist/ArrayWidget-BbsN1dzF.js.map +1 -0
- package/dist/ArrayWidget-DkjHrXsu.cjs +3 -0
- package/dist/ArrayWidget-DkjHrXsu.cjs.map +1 -0
- package/dist/ArrayplotWidget-CCKEyYIx.js +199 -0
- package/dist/ArrayplotWidget-CCKEyYIx.js.map +1 -0
- package/dist/ArrayplotWidget-COeaK_Lz.cjs +2 -0
- package/dist/ArrayplotWidget-COeaK_Lz.cjs.map +1 -0
- package/dist/AstroStatus-CILMWL6F.cjs +2 -0
- package/dist/AstroStatus-CILMWL6F.cjs.map +1 -0
- package/dist/AstroStatus-CY9VkeTN.js +40 -0
- package/dist/AstroStatus-CY9VkeTN.js.map +1 -0
- package/dist/BarColumn-C6p07yWK.js +108 -0
- package/dist/BarColumn-C6p07yWK.js.map +1 -0
- package/dist/BarColumn-CJLW1nXy.cjs +2 -0
- package/dist/BarColumn-CJLW1nXy.cjs.map +1 -0
- package/dist/BlockWidget-BFVYgbd_.cjs +3 -0
- package/dist/BlockWidget-BFVYgbd_.cjs.map +1 -0
- package/dist/BlockWidget-DlCHbqZX.js +112 -0
- package/dist/BlockWidget-DlCHbqZX.js.map +1 -0
- package/dist/ButtonWidget-CtfJzCBR.js +166 -0
- package/dist/ButtonWidget-CtfJzCBR.js.map +1 -0
- package/dist/ButtonWidget-HN8UHsme.cjs +3 -0
- package/dist/ButtonWidget-HN8UHsme.cjs.map +1 -0
- package/dist/CanvasWidget-CHmkxxMO.cjs +2 -0
- package/dist/CanvasWidget-CHmkxxMO.cjs.map +1 -0
- package/dist/CanvasWidget-CqRlXc4r.js +39 -0
- package/dist/CanvasWidget-CqRlXc4r.js.map +1 -0
- package/dist/CanvasdotWidget--Xr_KsZs.js +19 -0
- package/dist/CanvasdotWidget--Xr_KsZs.js.map +1 -0
- package/dist/CanvasdotWidget-B4bUcKRc.cjs +2 -0
- package/dist/CanvasdotWidget-B4bUcKRc.cjs.map +1 -0
- package/dist/CanvasimageWidget-B5YozXoI.cjs +2 -0
- package/dist/CanvasimageWidget-B5YozXoI.cjs.map +1 -0
- package/dist/CanvasimageWidget-BPlj5QYK.js +58 -0
- package/dist/CanvasimageWidget-BPlj5QYK.js.map +1 -0
- package/dist/CanvasimagevalueWidget-DVFGLt8f.js +107 -0
- package/dist/CanvasimagevalueWidget-DVFGLt8f.js.map +1 -0
- package/dist/CanvasimagevalueWidget-Dx1HnbEw.cjs +2 -0
- package/dist/CanvasimagevalueWidget-Dx1HnbEw.cjs.map +1 -0
- package/dist/CanvaslabelWidget-CYNqmyP0.js +23 -0
- package/dist/CanvaslabelWidget-CYNqmyP0.js.map +1 -0
- package/dist/CanvaslabelWidget-DgadQD-D.cjs +2 -0
- package/dist/CanvaslabelWidget-DgadQD-D.cjs.map +1 -0
- package/dist/CanvaslabelvalueWidget-B7yIDmsn.js +42 -0
- package/dist/CanvaslabelvalueWidget-B7yIDmsn.js.map +1 -0
- package/dist/CanvaslabelvalueWidget-C3k5gx5c.cjs +2 -0
- package/dist/CanvaslabelvalueWidget-C3k5gx5c.cjs.map +1 -0
- package/dist/CanvaslineWidget-BICdxX0Q.js +28 -0
- package/dist/CanvaslineWidget-BICdxX0Q.js.map +1 -0
- package/dist/CanvaslineWidget-CYHkes0a.cjs +2 -0
- package/dist/CanvaslineWidget-CYHkes0a.cjs.map +1 -0
- package/dist/CanvaslinevalueWidget-5DzhZ22p.cjs +2 -0
- package/dist/CanvaslinevalueWidget-5DzhZ22p.cjs.map +1 -0
- package/dist/CanvaslinevalueWidget-Cq-Ddh0P.js +44 -0
- package/dist/CanvaslinevalueWidget-Cq-Ddh0P.js.map +1 -0
- package/dist/CheckbuttonWidget-B74AWeaW.js +37 -0
- package/dist/CheckbuttonWidget-B74AWeaW.js.map +1 -0
- package/dist/CheckbuttonWidget-BCzsXnIF.cjs +2 -0
- package/dist/CheckbuttonWidget-BCzsXnIF.cjs.map +1 -0
- package/dist/ComboboxWidget-CtyKbEWb.js +37 -0
- package/dist/ComboboxWidget-CtyKbEWb.js.map +1 -0
- package/dist/ComboboxWidget-DQgDyDAC.cjs +2 -0
- package/dist/ComboboxWidget-DQgDyDAC.cjs.map +1 -0
- package/dist/CriticalCmdDialog-BnxZlt7W.cjs +2 -0
- package/dist/CriticalCmdDialog-BnxZlt7W.cjs.map +1 -0
- package/dist/CriticalCmdDialog-DPIZOBeP.js +270 -0
- package/dist/CriticalCmdDialog-DPIZOBeP.js.map +1 -0
- package/dist/CustomIcon-Bop2mEnu.cjs +2 -0
- package/dist/CustomIcon-Bop2mEnu.cjs.map +1 -0
- package/dist/CustomIcon-h5X7369N.js +50 -0
- package/dist/CustomIcon-h5X7369N.js.map +1 -0
- package/dist/DateWidget-BB4cIuUS.cjs +2 -0
- package/dist/DateWidget-BB4cIuUS.cjs.map +1 -0
- package/dist/DateWidget-BEVSczU8.js +40 -0
- package/dist/DateWidget-BEVSczU8.js.map +1 -0
- package/dist/DetailsDialog-DmEC5BTs.js +767 -0
- package/dist/DetailsDialog-DmEC5BTs.js.map +1 -0
- package/dist/DetailsDialog-mvxMFmgV.cjs +2 -0
- package/dist/DetailsDialog-mvxMFmgV.cjs.map +1 -0
- package/dist/DynamicWidget-BWEVCUfd.cjs +2 -0
- package/dist/DynamicWidget-BWEVCUfd.cjs.map +1 -0
- package/dist/DynamicWidget-CfMtj7H8.js +35 -0
- package/dist/DynamicWidget-CfMtj7H8.js.map +1 -0
- package/dist/EventListDialog-BHZLl28V.cjs +2 -0
- package/dist/EventListDialog-BHZLl28V.cjs.map +1 -0
- package/dist/EventListDialog-CSMSmCIT.js +1586 -0
- package/dist/EventListDialog-CSMSmCIT.js.map +1 -0
- package/dist/FormatvalueWidget-CdjCEAI7.cjs +2 -0
- package/dist/FormatvalueWidget-CdjCEAI7.cjs.map +1 -0
- package/dist/FormatvalueWidget-DN12xymS.js +44 -0
- package/dist/FormatvalueWidget-DN12xymS.js.map +1 -0
- package/dist/Graph-Bgo0cjl3.js +1988 -0
- package/dist/Graph-Bgo0cjl3.js.map +1 -0
- package/dist/Graph-Ujd2yaeI.cjs +2 -0
- package/dist/Graph-Ujd2yaeI.cjs.map +1 -0
- package/dist/GraphWidget-DurWDmpg.js +130 -0
- package/dist/GraphWidget-DurWDmpg.js.map +1 -0
- package/dist/GraphWidget-sid4Ws9H.cjs +2 -0
- package/dist/GraphWidget-sid4Ws9H.cjs.map +1 -0
- package/dist/HorizontalWidget-Cd_wl1b3.js +41 -0
- package/dist/HorizontalWidget-Cd_wl1b3.js.map +1 -0
- package/dist/HorizontalWidget-_6IR0cR8.cjs +2 -0
- package/dist/HorizontalWidget-_6IR0cR8.cjs.map +1 -0
- package/dist/HorizontalboxWidget-BcMTFBU-.js +47 -0
- package/dist/HorizontalboxWidget-BcMTFBU-.js.map +1 -0
- package/dist/HorizontalboxWidget-zmnurtv1.cjs +2 -0
- package/dist/HorizontalboxWidget-zmnurtv1.cjs.map +1 -0
- package/dist/HorizontallineWidget-CM-6WqCj.cjs +2 -0
- package/dist/HorizontallineWidget-CM-6WqCj.cjs.map +1 -0
- package/dist/HorizontallineWidget-CXFqHclf.js +16 -0
- package/dist/HorizontallineWidget-CXFqHclf.js.map +1 -0
- package/dist/IframeWidget-BPerHCCa.js +90 -0
- package/dist/IframeWidget-BPerHCCa.js.map +1 -0
- package/dist/IframeWidget-EhncMob0.cjs +2 -0
- package/dist/IframeWidget-EhncMob0.cjs.map +1 -0
- package/dist/ImageLoader-4N-7Gj61.js +36 -0
- package/dist/ImageLoader-4N-7Gj61.js.map +1 -0
- package/dist/ImageLoader-cRmBcpU9.cjs +2 -0
- package/dist/ImageLoader-cRmBcpU9.cjs.map +1 -0
- package/dist/ImageviewerWidget-Bv3CreXd.cjs +2 -0
- package/dist/ImageviewerWidget-Bv3CreXd.cjs.map +1 -0
- package/dist/ImageviewerWidget-Cw_H_HmZ.js +37 -0
- package/dist/ImageviewerWidget-Cw_H_HmZ.js.map +1 -0
- package/dist/InterfacesTab-B4glsR9Z.js +93 -0
- package/dist/InterfacesTab-B4glsR9Z.js.map +1 -0
- package/dist/InterfacesTab-Co1Kd6Fa.cjs +2 -0
- package/dist/InterfacesTab-Co1Kd6Fa.cjs.map +1 -0
- package/dist/LabelWidget-mMcf5S8K.cjs +2 -0
- package/dist/LabelWidget-mMcf5S8K.cjs.map +1 -0
- package/dist/LabelWidget-xrmcVeq8.js +48 -0
- package/dist/LabelWidget-xrmcVeq8.js.map +1 -0
- package/dist/LabelledWidget-BoYCuDaH.cjs +2 -0
- package/dist/LabelledWidget-BoYCuDaH.cjs.map +1 -0
- package/dist/LabelledWidget-D48QoyMk.js +42 -0
- package/dist/LabelledWidget-D48QoyMk.js.map +1 -0
- package/dist/LabelprogressbarWidget-C_950t6g.js +43 -0
- package/dist/LabelprogressbarWidget-C_950t6g.js.map +1 -0
- package/dist/LabelprogressbarWidget-DiucKsT2.cjs +2 -0
- package/dist/LabelprogressbarWidget-DiucKsT2.cjs.map +1 -0
- package/dist/LabelsparklineWidget-0KXQyPoU.js +44 -0
- package/dist/LabelsparklineWidget-0KXQyPoU.js.map +1 -0
- package/dist/LabelsparklineWidget-A3MTEhQc.cjs +2 -0
- package/dist/LabelsparklineWidget-A3MTEhQc.cjs.map +1 -0
- package/dist/LabelvalueWidget-CQ06wWDK.js +58 -0
- package/dist/LabelvalueWidget-CQ06wWDK.js.map +1 -0
- package/dist/LabelvalueWidget-DnKoz0-N.cjs +2 -0
- package/dist/LabelvalueWidget-DnKoz0-N.cjs.map +1 -0
- package/dist/LabelvaluedescWidget-Bo8zT01X.js +59 -0
- package/dist/LabelvaluedescWidget-Bo8zT01X.js.map +1 -0
- package/dist/LabelvaluedescWidget-I6ljK--Y.cjs +2 -0
- package/dist/LabelvaluedescWidget-I6ljK--Y.cjs.map +1 -0
- package/dist/LabelvaluelimitsbarWidget-BucTw8Yk.js +57 -0
- package/dist/LabelvaluelimitsbarWidget-BucTw8Yk.js.map +1 -0
- package/dist/LabelvaluelimitsbarWidget-Cb6i_Ixc.cjs +2 -0
- package/dist/LabelvaluelimitsbarWidget-Cb6i_Ixc.cjs.map +1 -0
- package/dist/LabelvaluelimitscolumnWidget-ClY5OxUC.cjs +2 -0
- package/dist/LabelvaluelimitscolumnWidget-ClY5OxUC.cjs.map +1 -0
- package/dist/LabelvaluelimitscolumnWidget-Dflb1hNd.js +47 -0
- package/dist/LabelvaluelimitscolumnWidget-Dflb1hNd.js.map +1 -0
- package/dist/LabelvaluerangebarWidget-9S5rVZaS.cjs +2 -0
- package/dist/LabelvaluerangebarWidget-9S5rVZaS.cjs.map +1 -0
- package/dist/LabelvaluerangebarWidget-D8cbfXFM.js +79 -0
- package/dist/LabelvaluerangebarWidget-D8cbfXFM.js.map +1 -0
- package/dist/Layout-DuCYyOw4.cjs +2 -0
- package/dist/Layout-DuCYyOw4.cjs.map +1 -0
- package/dist/Layout-Tf--nruw.js +14 -0
- package/dist/Layout-Tf--nruw.js.map +1 -0
- package/dist/LedWidget-B2BcwiYF.cjs +2 -0
- package/dist/LedWidget-B2BcwiYF.cjs.map +1 -0
- package/dist/LedWidget-qH_FthkK.js +145 -0
- package/dist/LedWidget-qH_FthkK.js.map +1 -0
- package/dist/LimitsbarWidget-B9lAB2RD.js +69 -0
- package/dist/LimitsbarWidget-B9lAB2RD.js.map +1 -0
- package/dist/LimitsbarWidget-CVCLFIhG.cjs +2 -0
- package/dist/LimitsbarWidget-CVCLFIhG.cjs.map +1 -0
- package/dist/LimitscolorWidget-DORhDxRo.cjs +2 -0
- package/dist/LimitscolorWidget-DORhDxRo.cjs.map +1 -0
- package/dist/LimitscolorWidget-c6Qa6su7.js +63 -0
- package/dist/LimitscolorWidget-c6Qa6su7.js.map +1 -0
- package/dist/LimitscolumnWidget-C9Uyg7Fh.cjs +2 -0
- package/dist/LimitscolumnWidget-C9Uyg7Fh.cjs.map +1 -0
- package/dist/LimitscolumnWidget-CcLs_443.js +66 -0
- package/dist/LimitscolumnWidget-CcLs_443.js.map +1 -0
- package/dist/LinegraphWidget-BSVYLFo1.js +39 -0
- package/dist/LinegraphWidget-BSVYLFo1.js.map +1 -0
- package/dist/LinegraphWidget-Bf8DIwEn.cjs +2 -0
- package/dist/LinegraphWidget-Bf8DIwEn.cjs.map +1 -0
- package/dist/MatrixbycolumnsWidget-DXFpZTre.js +56 -0
- package/dist/MatrixbycolumnsWidget-DXFpZTre.js.map +1 -0
- package/dist/MatrixbycolumnsWidget-DpdFzNeP.cjs +2 -0
- package/dist/MatrixbycolumnsWidget-DpdFzNeP.cjs.map +1 -0
- package/dist/MicroservicesTab-B5n-mN8G.cjs +2 -0
- package/dist/MicroservicesTab-B5n-mN8G.cjs.map +1 -0
- package/dist/MicroservicesTab-mCdS0v39.js +264 -0
- package/dist/MicroservicesTab-mCdS0v39.js.map +1 -0
- package/dist/Openc3Screen-BYhHaH_I.cjs +5 -0
- package/dist/Openc3Screen-BYhHaH_I.cjs.map +1 -0
- package/dist/Openc3Screen-Cud0OCFu.js +1789 -0
- package/dist/Openc3Screen-Cud0OCFu.js.map +1 -0
- package/dist/OutputDialog-DXoL9VPw.cjs +2 -0
- package/dist/OutputDialog-DXoL9VPw.cjs.map +1 -0
- package/dist/OutputDialog-zVPZiZay.js +242 -0
- package/dist/OutputDialog-zVPZiZay.js.map +1 -0
- package/dist/PackagesTab-CvT2JyMA.cjs +2 -0
- package/dist/PackagesTab-CvT2JyMA.cjs.map +1 -0
- package/dist/PackagesTab-SWcXumpK.js +332 -0
- package/dist/PackagesTab-SWcXumpK.js.map +1 -0
- package/dist/PluginsTab-B64OvayB.js +599 -0
- package/dist/PluginsTab-B64OvayB.js.map +1 -0
- package/dist/PluginsTab-CfpwWsqv.cjs +6 -0
- package/dist/PluginsTab-CfpwWsqv.cjs.map +1 -0
- package/dist/ProgressbarWidget-fGWa6ipm.cjs +2 -0
- package/dist/ProgressbarWidget-fGWa6ipm.cjs.map +1 -0
- package/dist/ProgressbarWidget-iYGw8-Dc.js +46 -0
- package/dist/ProgressbarWidget-iYGw8-Dc.js.map +1 -0
- package/dist/RadiobuttonWidget-ZEPJbOp_.cjs +2 -0
- package/dist/RadiobuttonWidget-ZEPJbOp_.cjs.map +1 -0
- package/dist/RadiobuttonWidget-ytmoVZ3u.js +34 -0
- package/dist/RadiobuttonWidget-ytmoVZ3u.js.map +1 -0
- package/dist/RadiogroupWidget-CusMBhKH.js +48 -0
- package/dist/RadiogroupWidget-CusMBhKH.js.map +1 -0
- package/dist/RadiogroupWidget-EK4rEGUC.cjs +2 -0
- package/dist/RadiogroupWidget-EK4rEGUC.cjs.map +1 -0
- package/dist/RangebarWidget-D_zGTtCa.js +67 -0
- package/dist/RangebarWidget-D_zGTtCa.js.map +1 -0
- package/dist/RangebarWidget-DwIs-L5k.cjs +2 -0
- package/dist/RangebarWidget-DwIs-L5k.cjs.map +1 -0
- package/dist/RedisTab-67UcKoPf.cjs +2 -0
- package/dist/RedisTab-67UcKoPf.cjs.map +1 -0
- package/dist/RedisTab-CyPo6ADN.js +135 -0
- package/dist/RedisTab-CyPo6ADN.js.map +1 -0
- package/dist/RollupWidget-DC3OIP6G.cjs +2 -0
- package/dist/RollupWidget-DC3OIP6G.cjs.map +1 -0
- package/dist/RollupWidget-Dolsixyt.js +83 -0
- package/dist/RollupWidget-Dolsixyt.js.map +1 -0
- package/dist/RoutersTab-BBPlFi_z.cjs +2 -0
- package/dist/RoutersTab-BBPlFi_z.cjs.map +1 -0
- package/dist/RoutersTab-Cs2dFVNA.js +95 -0
- package/dist/RoutersTab-Cs2dFVNA.js.map +1 -0
- package/dist/ScriptChooser-EV65rbWx.js +199 -0
- package/dist/ScriptChooser-EV65rbWx.js.map +1 -0
- package/dist/ScriptChooser-vyZwngrz.cjs +2 -0
- package/dist/ScriptChooser-vyZwngrz.cjs.map +1 -0
- package/dist/ScrollwindowWidget-BWeqSUPc.cjs +2 -0
- package/dist/ScrollwindowWidget-BWeqSUPc.cjs.map +1 -0
- package/dist/ScrollwindowWidget-DV2nZuNi.js +45 -0
- package/dist/ScrollwindowWidget-DV2nZuNi.js.map +1 -0
- package/dist/SecretsTab-0IFqUxNJ.cjs +2 -0
- package/dist/SecretsTab-0IFqUxNJ.cjs.map +1 -0
- package/dist/SecretsTab-DVyyyGlG.js +202 -0
- package/dist/SecretsTab-DVyyyGlG.js.map +1 -0
- package/dist/SettingsTab-B1LvOLG2.cjs +3 -0
- package/dist/SettingsTab-B1LvOLG2.cjs.map +1 -0
- package/dist/SettingsTab-g29K6FyC.js +1445 -0
- package/dist/SettingsTab-g29K6FyC.js.map +1 -0
- package/dist/SignalWidget-RvRwpE8T.cjs +2 -0
- package/dist/SignalWidget-RvRwpE8T.cjs.map +1 -0
- package/dist/SignalWidget-d9-6h85k.js +66 -0
- package/dist/SignalWidget-d9-6h85k.js.map +1 -0
- package/dist/SimpleTextDialog-Cpbt7Q-8.cjs +2 -0
- package/dist/SimpleTextDialog-Cpbt7Q-8.cjs.map +1 -0
- package/dist/SimpleTextDialog-pwN8oRy1.js +107 -0
- package/dist/SimpleTextDialog-pwN8oRy1.js.map +1 -0
- package/dist/SpacerWidget-7_8bpLCb.cjs +2 -0
- package/dist/SpacerWidget-7_8bpLCb.cjs.map +1 -0
- package/dist/SpacerWidget-BH0p2OLi.js +19 -0
- package/dist/SpacerWidget-BH0p2OLi.js.map +1 -0
- package/dist/SparklineWidget-60jVlbHA.cjs +2 -0
- package/dist/SparklineWidget-60jVlbHA.cjs.map +1 -0
- package/dist/SparklineWidget-coxi9r2g.js +48 -0
- package/dist/SparklineWidget-coxi9r2g.js.map +1 -0
- package/dist/TabbookWidget-B1XKplGH.js +66 -0
- package/dist/TabbookWidget-B1XKplGH.js.map +1 -0
- package/dist/TabbookWidget-D1CVT9IK.cjs +2 -0
- package/dist/TabbookWidget-D1CVT9IK.cjs.map +1 -0
- package/dist/TargetsTab-BkBkXn9A.js +129 -0
- package/dist/TargetsTab-BkBkXn9A.js.map +1 -0
- package/dist/TargetsTab-C-m26Eqq.cjs +2 -0
- package/dist/TargetsTab-C-m26Eqq.cjs.map +1 -0
- package/dist/TextBoxDialog-DOJ5d2RM.js +110 -0
- package/dist/TextBoxDialog-DOJ5d2RM.js.map +1 -0
- package/dist/TextBoxDialog-DfMXg_5C.cjs +2 -0
- package/dist/TextBoxDialog-DfMXg_5C.cjs.map +1 -0
- package/dist/TextboxWidget-BDG4NxRw.cjs +2 -0
- package/dist/TextboxWidget-BDG4NxRw.cjs.map +1 -0
- package/dist/TextboxWidget-C-_M2M4l.js +93 -0
- package/dist/TextboxWidget-C-_M2M4l.js.map +1 -0
- package/dist/TextfieldWidget-BGJv9Lox.cjs +2 -0
- package/dist/TextfieldWidget-BGJv9Lox.cjs.map +1 -0
- package/dist/TextfieldWidget-C08N4JE8.js +37 -0
- package/dist/TextfieldWidget-C08N4JE8.js.map +1 -0
- package/dist/TimeWidget-CGCOIouj.cjs +2 -0
- package/dist/TimeWidget-CGCOIouj.cjs.map +1 -0
- package/dist/TimeWidget-DtwdEcFg.js +40 -0
- package/dist/TimeWidget-DtwdEcFg.js.map +1 -0
- package/dist/TitleWidget-BljFH9RB.cjs +2 -0
- package/dist/TitleWidget-BljFH9RB.cjs.map +1 -0
- package/dist/TitleWidget-CT-aLcNb.js +26 -0
- package/dist/TitleWidget-CT-aLcNb.js.map +1 -0
- package/dist/ToolsTab-NveeVXz2.js +1521 -0
- package/dist/ToolsTab-NveeVXz2.js.map +1 -0
- package/dist/ToolsTab-RMTst_Sy.cjs +7 -0
- package/dist/ToolsTab-RMTst_Sy.cjs.map +1 -0
- package/dist/TopBar-CnJNNJlV.js +278 -0
- package/dist/TopBar-CnJNNJlV.js.map +1 -0
- package/dist/TopBar-Cnmb6DyC.cjs +2 -0
- package/dist/TopBar-Cnmb6DyC.cjs.map +1 -0
- package/dist/UpgradeToEnterpriseDialog-BvfgoNB1.js +94 -0
- package/dist/UpgradeToEnterpriseDialog-BvfgoNB1.js.map +1 -0
- package/dist/UpgradeToEnterpriseDialog-sUipOVpB.cjs +2 -0
- package/dist/UpgradeToEnterpriseDialog-sUipOVpB.cjs.map +1 -0
- package/dist/VWidget-2N2cOosI.cjs +2 -0
- package/dist/VWidget-2N2cOosI.cjs.map +1 -0
- package/dist/VWidget-DQqb7NVW.js +323 -0
- package/dist/VWidget-DQqb7NVW.js.map +1 -0
- package/dist/ValueWidget-C6RanBj3.js +116 -0
- package/dist/ValueWidget-C6RanBj3.js.map +1 -0
- package/dist/ValueWidget-Cu7hgKja.cjs +2 -0
- package/dist/ValueWidget-Cu7hgKja.cjs.map +1 -0
- package/dist/ValuelimitsbarWidget-B3bvjfxc.js +41 -0
- package/dist/ValuelimitsbarWidget-B3bvjfxc.js.map +1 -0
- package/dist/ValuelimitsbarWidget-C0HROxrb.cjs +2 -0
- package/dist/ValuelimitsbarWidget-C0HROxrb.cjs.map +1 -0
- package/dist/ValuelimitscolumnWidget-CWvLfg8u.cjs +2 -0
- package/dist/ValuelimitscolumnWidget-CWvLfg8u.cjs.map +1 -0
- package/dist/ValuelimitscolumnWidget-QvhI6EcE.js +40 -0
- package/dist/ValuelimitscolumnWidget-QvhI6EcE.js.map +1 -0
- package/dist/ValuerangebarWidget-Dt3K9BnC.js +65 -0
- package/dist/ValuerangebarWidget-Dt3K9BnC.js.map +1 -0
- package/dist/ValuerangebarWidget-DyN78cQl.cjs +2 -0
- package/dist/ValuerangebarWidget-DyN78cQl.cjs.map +1 -0
- package/dist/VerticalWidget-BIIViZgI.js +40 -0
- package/dist/VerticalWidget-BIIViZgI.js.map +1 -0
- package/dist/VerticalWidget-CFTOu4H8.cjs +2 -0
- package/dist/VerticalWidget-CFTOu4H8.cjs.map +1 -0
- package/dist/VerticalboxWidget-DY72fLHW.js +46 -0
- package/dist/VerticalboxWidget-DY72fLHW.js.map +1 -0
- package/dist/VerticalboxWidget-Z8-DWI8t.cjs +2 -0
- package/dist/VerticalboxWidget-Z8-DWI8t.cjs.map +1 -0
- package/dist/Widget-ChoIB2dd.cjs +2 -0
- package/dist/Widget-ChoIB2dd.cjs.map +1 -0
- package/dist/Widget-oyqWpFXJ.js +197 -0
- package/dist/Widget-oyqWpFXJ.js.map +1 -0
- package/dist/WidgetComponents-C1lSLZ0I.js +30205 -0
- package/dist/WidgetComponents-C1lSLZ0I.js.map +1 -0
- package/dist/WidgetComponents-utpQ592X.cjs +1493 -0
- package/dist/WidgetComponents-utpQ592X.cjs.map +1 -0
- package/dist/addMonths-BtG7uZLJ.js +19 -0
- package/dist/addMonths-BtG7uZLJ.js.map +1 -0
- package/dist/addMonths-n1tnl3ab.cjs +2 -0
- package/dist/addMonths-n1tnl3ab.cjs.map +1 -0
- package/dist/components.cjs +4 -0
- package/dist/components.cjs.map +1 -0
- package/dist/components.js +1379 -0
- package/dist/components.js.map +1 -0
- package/dist/fileIcon-BduOQcTc.cjs +2 -0
- package/dist/fileIcon-BduOQcTc.cjs.map +1 -0
- package/dist/fileIcon-DqRHb1_Z.js +22 -0
- package/dist/fileIcon-DqRHb1_Z.js.map +1 -0
- package/dist/format-B22VpiOS.cjs +2 -0
- package/dist/format-B22VpiOS.cjs.map +1 -0
- package/dist/format-CVeawcIv.js +1295 -0
- package/dist/format-CVeawcIv.js.map +1 -0
- package/dist/getDefaultOptions-Batab9o8.cjs +2 -0
- package/dist/getDefaultOptions-Batab9o8.cjs.map +1 -0
- package/dist/getDefaultOptions-BhSDk-Jo.js +8 -0
- package/dist/getDefaultOptions-BhSDk-Jo.js.map +1 -0
- package/dist/icons/status-dark.png +0 -0
- package/dist/icons/status-dark.xcf +0 -0
- package/dist/icons/status-light.png +0 -0
- package/dist/icons.cjs +2 -0
- package/dist/icons.cjs.map +1 -0
- package/dist/icons.js +164 -0
- package/dist/icons.js.map +1 -0
- package/dist/index-BX05anye.cjs +7 -0
- package/dist/index-BX05anye.cjs.map +1 -0
- package/dist/index-DwP8ryNM.js +1694 -0
- package/dist/index-DwP8ryNM.js.map +1 -0
- package/dist/parse-DnkEsW-3.js +1603 -0
- package/dist/parse-DnkEsW-3.js.map +1 -0
- package/dist/parse-DwfgQboe.cjs +2 -0
- package/dist/parse-DwfgQboe.cjs.map +1 -0
- package/dist/plugins.cjs +9 -0
- package/dist/plugins.cjs.map +1 -0
- package/dist/plugins.js +776 -0
- package/dist/plugins.js.map +1 -0
- package/dist/timeFilters-8SaYvcH0.cjs +2 -0
- package/dist/timeFilters-8SaYvcH0.cjs.map +1 -0
- package/dist/timeFilters-CRYpYDdf.js +622 -0
- package/dist/timeFilters-CRYpYDdf.js.map +1 -0
- package/dist/tools/admin.cjs +13 -0
- package/dist/tools/admin.cjs.map +1 -0
- package/dist/tools/admin.js +2024 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/base.cjs +2 -0
- package/dist/tools/base.cjs.map +1 -0
- package/dist/tools/base.js +1677 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/calendar.cjs +2 -0
- package/dist/tools/calendar.cjs.map +1 -0
- package/dist/tools/calendar.js +12 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/scriptrunner.cjs +86 -0
- package/dist/tools/scriptrunner.cjs.map +1 -0
- package/dist/tools/scriptrunner.js +4564 -0
- package/dist/tools/scriptrunner.js.map +1 -0
- package/dist/util.cjs +2 -0
- package/dist/util.cjs.map +1 -0
- package/dist/util.js +9 -0
- package/dist/util.js.map +1 -0
- package/dist/vue-common.css +1 -0
- package/dist/widgets.cjs +2 -0
- package/dist/widgets.cjs.map +1 -0
- package/dist/widgets.js +132 -0
- package/dist/widgets.js.map +1 -0
- package/package.json +20 -15
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";const x=require("./WidgetComponents-utpQ592X.cjs"),e=require("vue"),V=require("./CustomIcon-Bop2mEnu.cjs"),D=require("./fileIcon-BduOQcTc.cjs"),N=require("./TopBar-Cnmb6DyC.cjs");class k{constructor(){x.oi.get("/openc3-api/autocomplete/data/screen").then(t=>{this.autocompleteData=t.data}),this.api=new x.hi}async getCompletions(t,o,s,i,l){let c=o.getLine(s.row).slice(0,s.column).trimStart().split(/ (?![^<]*>)/),u=this.autocompleteData;c.length>1&&(u=u.find(p=>p.caption===c[0]));let d={},a=!0;if(u&&u.params){u.params.length==c.length-1&&(a=!1);let p=u.params[c.length-2];if(p["Target name"])u=(await this.api.get_target_names()).reduce((g,v)=>(g[v]=1,g),{});else if(p["Packet name"]){let f=c[c.length-2];u=(await this.api.get_all_tlm(f)).reduce((v,C)=>(v[C.packet_name]=C.description,v),{})}else if(p["Item name"]){let f=c[c.length-3],g=c[c.length-2];u=(await this.api.get_tlm(f,g)).items.reduce((C,r)=>(C[r.name]=r.description,C),{})}else u=p;d=Object.keys(u||{}).map(f=>{let g={value:f+(a?" ":""),command:a&&"startAutocomplete"};return typeof u[f]=="string"&&(g.meta=u[f]),g})}else d=u;l(null,d)}}const B={props:{modelValue:Boolean,target:{type:String,default:""},screen:{type:String,default:""},definition:{type:String,default:""},keywords:{type:Array,default:()=>[]},errors:{type:Array,default:()=>[]}},data(){return{file:null,docsKeyword:"",contextMenu:!1,menuX:0,menuY:0}},computed:{editErrors:function(){if(this.definition===""&&!this.file)return["Input can not be blank."];if(this.errors.length!==0){let n=new Set,t=[];const o=this.errors.toSorted((s,i)=>s.lineNumber-i.lineNumber);for(const s of o){let i=`At ${s.lineNumber}: (${s.line}) ${s.message}.`;s.usage&&(i+=` Usage: ${s.usage}`),t.push(i),n.add(s.message)}return t}return[]},show:{get(){return this.modelValue},set(n){this.$emit("update:modelValue",n)}}},mounted:function(){this.editor=x.aceExports.edit(this.$refs.editor),this.editor.setTheme("ace/theme/twilight");const n=this.buildScreenMode();this.editor.session.setMode(new n),this.editor.session.setTabSize(2),this.editor.session.setUseWrapMode(!0),this.editor.$blockScrolling=1/0,this.editor.setOption("enableBasicAutocompletion",!0),this.editor.setOption("enableLiveAutocompletion",!0),this.editor.completers=[new k],this.editor.setHighlightActiveLine(!1),this.editor.setValue(this.definition),this.editor.clearSelection(),N.AceEditorUtils.applyVimModeIfEnabled(this.editor),this.editor.focus()},beforeUnmount(){this.editor.destroy(),this.editor.container.remove()},methods:{toggleVimMode:function(){N.AceEditorUtils.toggleVimMode(this.editor)},showContextMenu:function(n){this.menuX=n.pageX,this.menuY=n.pageY;let t=this.editor.getCursorPosition(),o=this.editor.session.getTokenAt(t.row,t.column);if(o){let s=o.value.trim();s.includes(" ")?this.docsKeyword=s.split(" ")[0]:this.docsKeyword=s,this.contextMenu=!0}},openDocumentation(){window.open(`${window.location.origin}/tools/staticdocs/docs/configuration/telemetry-screens#${this.docsKeyword.toLowerCase()}`,"_blank")},buildScreenMode(){let n=x.aceExports.require("ace/lib/oop"),t=x.aceExports.require("ace/mode/text_highlight_rules").TextHighlightRules,o=this.keywords.join("|"),s=function(){this.$rules={start:[{token:"comment",regex:"#.*$"},{token:"string",regex:'".*?"'},{token:"string",regex:"'.*?'"},{token:"constant.numeric",regex:"\\b\\d+(?:\\.\\d+)?\\b"},{token:"keyword",regex:new RegExp(`^\\s*(${o})\\b`)}]},this.normalizeRules()};n.inherits(s,t);let i=function(){this.HighlightRules=s},l=x.aceExports.require("ace/mode/text").Mode;return n.inherits(i,l),(function(){this.$id="ace/mode/openc3"}).call(i.prototype),i},downloadScreen:function(){const n=new Blob([this.editor.getValue()],{type:"text/plain"}),t=document.createElement("a");t.href=URL.createObjectURL(n),t.setAttribute("download",`${this.screen.toLowerCase()}.txt`),t.click()},loadFile:function(){const n=new FileReader;n.readAsText(this.file);const t=this;n.onload=function(){t.editor.setValue(n.result),t.file=null}},deleteScreen:function(){this.$dialog.confirm("Are you sure you want to delete this screen?!",{okText:"Delete",cancelText:"Cancel"}).then(n=>{this.$emit("delete")})}}},I={class:"mx-2"},F={class:"mx-2"},A=["textContent"];function O(n,t,o,s,i,l){const m=e.resolveComponent("v-icon"),h=e.resolveComponent("v-tooltip"),c=e.resolveComponent("v-spacer"),u=e.resolveComponent("v-toolbar"),d=e.resolveComponent("v-row"),a=e.resolveComponent("v-btn"),p=e.resolveComponent("v-file-input"),f=e.resolveComponent("v-list-item-title"),g=e.resolveComponent("v-list-item"),v=e.resolveComponent("v-divider"),C=e.resolveComponent("v-list"),r=e.resolveComponent("v-menu"),y=e.resolveComponent("v-card-text"),E=e.resolveComponent("v-card"),S=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(S,{persistent:"",modelValue:l.show,"onUpdate:modelValue":t[5]||(t[5]=w=>l.show=w),width:"75vw"},{default:e.withCtx(()=>[e.createVNode(E,null,{default:e.withCtx(()=>[e.createVNode(u,{height:"24"},{default:e.withCtx(()=>[e.createElementVNode("div",I,[e.createVNode(h,{location:"top"},{activator:e.withCtx(({props:w})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(w)),[e.createVNode(m,{"data-test":"delete-screen-icon",onClick:l.deleteScreen},{default:e.withCtx(()=>t[6]||(t[6]=[e.createTextVNode(" mdi-delete ")])),_:1},8,["onClick"])],16)]),default:e.withCtx(()=>[t[7]||(t[7]=e.createElementVNode("span",null," Delete Screen ",-1))]),_:1})]),e.createVNode(c),e.createElementVNode("span",null," Edit Screen: "+e.toDisplayString(o.target)+" "+e.toDisplayString(o.screen),1),e.createVNode(c),e.createElementVNode("div",F,[e.createVNode(h,{location:"top"},{activator:e.withCtx(({props:w})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(w)),[e.createVNode(m,{"data-test":"download-screen-icon",onClick:l.downloadScreen},{default:e.withCtx(()=>t[8]||(t[8]=[e.createTextVNode(" mdi-download ")])),_:1},8,["onClick"])],16)]),default:e.withCtx(()=>[t[9]||(t[9]=e.createElementVNode("span",null," Download Screen ",-1))]),_:1})])]),_:1}),e.createVNode(y,{style:{"max-height":"90vh"}},{default:e.withCtx(()=>[e.createVNode(d,{class:"mt-3"},{default:e.withCtx(()=>t[10]||(t[10]=[e.createTextVNode(" Upload a screen file. ")])),_:1}),e.createVNode(d,{"no-gutters":"",align:"center"},{default:e.withCtx(()=>[e.createVNode(a,{onClick:l.loadFile,disabled:!i.file,color:"primary",class:"mr-3","data-test":"edit-screen-load"},{default:e.withCtx(()=>t[11]||(t[11]=[e.createTextVNode(" Load ")])),_:1},8,["onClick","disabled"]),e.createVNode(p,{modelValue:i.file,"onUpdate:modelValue":t[0]||(t[0]=w=>i.file=w),"truncate-length":"15",accept:".txt",label:"Click to select .txt screen file."},null,8,["modelValue"])]),_:1}),e.createVNode(d,{class:"mb-2"},{default:e.withCtx(()=>t[12]||(t[12]=[e.createTextVNode(" Edit the screen definition. ")])),_:1}),e.createVNode(d,{class:"mb-2"},{default:e.withCtx(()=>[e.createElementVNode("pre",{ref:"editor",class:"editor",onContextmenu:t[1]||(t[1]=e.withModifiers((...w)=>l.showContextMenu&&l.showContextMenu(...w),["prevent"]))},null,544),e.createVNode(r,{modelValue:i.contextMenu,"onUpdate:modelValue":t[2]||(t[2]=w=>i.contextMenu=w),target:[i.menuX,i.menuY]},{default:e.withCtx(()=>[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(g,{link:""},{default:e.withCtx(()=>[e.createVNode(f,{onClick:l.openDocumentation},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.docsKeyword)+" documentation ",1)]),_:1},8,["onClick"])]),_:1}),e.createVNode(v),e.createVNode(g,{title:"Toggle Vim mode","prepend-icon":"extras:vim",onClick:l.toggleVimMode},null,8,["onClick"])]),_:1})]),_:1},8,["modelValue","target"])]),_:1}),e.createVNode(d,{style:{"max-height":"120px","overflow-y":"auto"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.editErrors,(w,T)=>(e.openBlock(),e.createElementBlock("div",{key:T},[e.createElementVNode("span",{class:"text-red",textContent:e.toDisplayString(w)},null,8,A)]))),128))]),_:1}),e.createVNode(d,{class:"mt-5"},{default:e.withCtx(()=>[t[15]||(t[15]=e.createElementVNode("span",null,"Ctrl-space brings up autocomplete. Right click keywords for documentation.",-1)),e.createVNode(c),e.createVNode(a,{onClick:t[3]||(t[3]=w=>n.$emit("cancel")),class:"mx-2",variant:"outlined","data-test":"edit-screen-cancel"},{default:e.withCtx(()=>t[13]||(t[13]=[e.createTextVNode(" Cancel ")])),_:1}),e.createVNode(a,{onClick:t[4]||(t[4]=w=>n.$emit("save",n.editor.getValue())),class:"mx-2",color:"primary","data-test":"edit-screen-save"},{default:e.withCtx(()=>t[14]||(t[14]=[e.createTextVNode(" Save ")])),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])}const b=V._export_sfc(B,[["render",O],["__scopeId","data-v-40531a57"]]),M={props:{modelValue:Boolean},data(){return{alert:"",alertType:"success",showAlert:!1,search:"",key:"",keyValue:"",environment:[],headers:[{text:"Key",value:"key"},{text:"Value",value:"value"},{text:"Actions",value:"actions",align:"end",sortable:!1}]}},computed:{show:{get(){return this.modelValue},set(n){this.$emit("update:modelValue",n)}}},mounted(){this.update()},methods:{alertHandler:function(n){this.alert=n.text,this.alertType=n.type,this.showAlert=!0},update:function(){x.oi.get("/openc3-api/environment").then(n=>{this.environment=n.data}).catch(n=>{})},addEnvironment:function(){x.oi.post("/openc3-api/environment",{data:{key:this.key.toUpperCase(),value:this.keyValue}}).then(n=>{`${n.data.name}`,this.update()}).catch(n=>{const t={text:`Failed to add environment variable: ${n}`,type:"error"};this.alertHandler(t)}),this.key="",this.keyValue=""},deleteEnvironment:function(n){this.$dialog.confirm(`Are you sure you want to delete: ${n.key}=${n.value}`,{okText:"Delete",cancelText:"Cancel"}).then(t=>x.oi.delete(`/openc3-api/environment/${n.name}`)).then(t=>{const o={text:`Removed environment variable: ${n.name}`,type:"success"};this.alertHandler(o),this.update()}).catch(t=>{const o={text:`Failed to delete environment: ${t}`,type:"error"};this.alertHandler(o)})}}},R={class:"pa-3"};function z(n,t,o,s,i,l){const m=e.resolveComponent("v-spacer"),h=e.resolveComponent("v-toolbar"),c=e.resolveComponent("v-text-field"),u=e.resolveComponent("v-row"),d=e.resolveComponent("v-icon"),a=e.resolveComponent("v-btn"),p=e.resolveComponent("v-data-table"),f=e.resolveComponent("v-col"),g=e.resolveComponent("v-card-text"),v=e.resolveComponent("v-card"),C=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(C,{modelValue:l.show,"onUpdate:modelValue":t[4]||(t[4]=r=>l.show=r),width:"600"},{default:e.withCtx(()=>[e.createVNode(v,null,{default:e.withCtx(()=>[e.createElementVNode("form",{onSubmit:t[3]||(t[3]=e.withModifiers((...r)=>l.addEnvironment&&l.addEnvironment(...r),["prevent"]))},[e.createVNode(h,{height:"24"},{default:e.withCtx(()=>[e.createVNode(m),t[5]||(t[5]=e.createElementVNode("span",null,"Global Environment Variables",-1)),e.createVNode(m)]),_:1}),e.createVNode(g,null,{default:e.withCtx(()=>[e.createElementVNode("div",R,[e.createVNode(u,{dense:"",class:"mb-2"},{default:e.withCtx(()=>[e.createVNode(c,{modelValue:i.search,"onUpdate:modelValue":t[0]||(t[0]=r=>i.search=r),label:"search",type:"text","data-test":"search","prepend-inner-icon":"mdi-magnify",clearable:"",variant:"outlined",density:"compact","clear-icon":"mdi-close-circle-outline",autofocus:"","single-line":"","hide-details":""},null,8,["modelValue"])]),_:1}),e.createVNode(p,{"item-key":"name","hide-default-header":"","data-test":"env-table",search:i.search,headers:i.headers,items:i.environment,"items-per-page":5,"items-per-page-options":[5]},{"item.actions":e.withCtx(({item:r})=>[e.createVNode(a,{onClick:y=>l.deleteEnvironment(r),icon:"",class:"mt-1","data-test":"item-delete"},{default:e.withCtx(()=>[e.createVNode(d,null,{default:e.withCtx(()=>t[6]||(t[6]=[e.createTextVNode("mdi-delete")])),_:1})]),_:2},1032,["onClick"])]),_:1},8,["search","headers","items"]),e.createVNode(u,{dense:""},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(c,{modelValue:i.key,"onUpdate:modelValue":t[1]||(t[1]=r=>i.key=r),label:"Key","data-test":"env-key"},null,8,["modelValue"])]),_:1}),e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(c,{modelValue:i.keyValue,"onUpdate:modelValue":t[2]||(t[2]=r=>i.keyValue=r),label:"Value","data-test":"env-value"},null,8,["modelValue"])]),_:1})]),_:1}),e.createVNode(u,{dense:""},{default:e.withCtx(()=>[e.createVNode(a,{onClick:e.withModifiers(l.addEnvironment,["prevent"]),block:"",type:"submit",color:"primary","data-test":"add-env",disabled:!i.key||!i.keyValue},{default:e.withCtx(()=>t[7]||(t[7]=[e.createTextVNode(" Add ")])),_:1},8,["onClick","disabled"])]),_:1})])]),_:1})],32)]),_:1})]),_:1},8,["modelValue"])}const L=V._export_sfc(M,[["render",z]]),P={class:"tree-node"},U={class:"content-wrapper"},W=["tabindex"],q={key:1},K={key:2,class:"children"},Z={__name:"TreeNode",props:{node:{type:Object,required:!0},search:{type:String,default:""},type:{type:String,default:"open"}},emits:["nodeToggled","request"],setup(n,{emit:t}){const o=n,s=e.ref(o.node.isOpen||!1),i=e.computed(()=>{const d=a=>{var p;return!o.search||a.path.toLowerCase().includes(o.search.toLowerCase())?!0:!!((p=a.children)!=null&&p.some(d))};return d(o.node)});e.watch(()=>o.node.isOpen,d=>{s.path=d}),e.watch(()=>o.search,d=>{d?o.node.isOpen||h():o.node.isOpen&&h()});const l=t,m=d=>{d.children?(h(),o.type==="save"&&l("request",d)):l("request",d)},h=()=>{o.node.children&&(s.path=!s.path,o.node.isOpen=s.path,l("nodeToggled",o.node.id,s.path))},c=(d,a)=>{l("nodeToggled",d,a)},u=d=>{l("request",d)};return(d,a)=>{const p=e.resolveComponent("v-icon"),f=e.resolveComponent("v-btn"),g=e.resolveComponent("tree-node",!0);return e.openBlock(),e.createElementBlock("div",P,[i.value?(e.openBlock(),e.createElementBlock("div",{key:0,onClick:a[2]||(a[2]=v=>m(n.node)),class:"node-content"},[e.createElementVNode("div",U,[n.node.children?(e.openBlock(),e.createBlock(p,{key:0,class:"toggle-icon",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.node.isOpen?"mdi-menu-down":"mdi-menu-right"),1)]),_:1})):e.createCommentVNode("",!0),n.node.children?(e.openBlock(),e.createBlock(p,{key:1,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>a[3]||(a[3]=[e.createTextVNode(e.toDisplayString("mdi-folder"))])),_:1})):n.node.title.includes(".rb")?(e.openBlock(),e.createBlock(p,{key:2,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>a[4]||(a[4]=[e.createTextVNode(e.toDisplayString("mdi-language-ruby"))])),_:1})):n.node.title.includes(".py")?(e.openBlock(),e.createBlock(p,{key:3,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>a[5]||(a[5]=[e.createTextVNode(e.toDisplayString("mdi-language-python"))])),_:1})):(e.openBlock(),e.createBlock(p,{key:4,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>a[6]||(a[6]=[e.createTextVNode(e.toDisplayString("mdi-file-document"))])),_:1})),e.createElementVNode("span",{class:"title",tabindex:n.node.children?-1:0,onKeyup:a[0]||(a[0]=e.withKeys(v=>m(n.node),["enter"]))},e.toDisplayString(n.node.title),41,W),n.node.title==="__TEMP__"?(e.openBlock(),e.createBlock(f,{key:5,icon:"",onClick:a[1]||(a[1]=v=>l("delete")),style:{"margin-left":"auto"}},{default:e.withCtx(()=>[e.createVNode(p,null,{default:e.withCtx(()=>a[7]||(a[7]=[e.createTextVNode(" mdi-delete ")])),_:1})]),_:1})):e.createCommentVNode("",!0)])])):(e.openBlock(),e.createElementBlock("div",q)),n.node.children&&n.node.isOpen?(e.openBlock(),e.createElementBlock("div",K,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.node.children,v=>(e.openBlock(),e.createBlock(g,{key:v.id,node:v,search:n.search,type:n.type,onNodeToggled:c,onRequest:u},null,8,["node","search","type"]))),128))])):e.createCommentVNode("",!0)])}}},G=V._export_sfc(Z,[["__scopeId","data-v-20be9af4"]]),X={components:{TreeNode:G},props:{type:{type:String,required:!0,validator:function(n){return["open","save"].indexOf(n)!==-1}},apiUrl:String,requireTargetParentDir:Boolean,inputFilename:String,modelValue:Boolean},data(){return{tree:[],items:[],search:null,selectedFile:null,disableButtons:!1,targets:[],targetsRetrieved:[],loading:!0}},computed:{show:{get(){return this.modelValue},set(n){this.$emit("update:modelValue",n)}},title:function(){return this.type==="open"?"File Open":"File Save As..."},submit:function(){return this.type==="open"?"OPEN":"SAVE"},helpText:function(){return this.type==="open"?"Click on folders to open them and then click a file to select it before clicking Open. Use the search box to filter the results. You can also Tab to the files and Enter to select.":"Click on the folder to save into. Then complete the filename path with the desired name. Use the search box to filter the results."},error:function(){if(this.selectedFile===""||this.selectedFile===null)return"No file selected must select a file";if(!this.selectedFile.match(this.validFilenameRegex)||this.selectedFile.match(/\.\.|\/\/|\.\/|\/\./)){let n=`${this.selectedFile} is not a valid filename. Must `;return this.requireTargetParentDir&&(n+="be in a target directory and "),n+=`only contain alphanumeric characters (including !-_.*) and a valid extension.
|
|
2
|
+
|
|
3
|
+
For example: TGT1/procedures/test.py or TGT2/lib/inst.rb`,n}return this.type==="save"&&this.selectedFile.match(/\*$/)?`${this.selectedFile} is not a valid filename. Must not end in '*'.`:null},validFilenameRegex:function(){const n="0-9a-zA-Z";let o=`[${`${n}\\/\\!\\-\\_\\.\\*\\'\\(\\)`}]+\\.[${n}]+`;return this.requireTargetParentDir&&(o=`\\/?${`(${this.targets.join("|")})`}\\/${o}`),new RegExp(o)}},created(){x.oi.get("/openc3-api/targets").then(n=>{this.targets=n.data,this.targets.push("__TEMP__"),this.targets.forEach(t=>{this.items.push({id:t,disabled:!0,title:t,children:[],path:t}),this.loadFiles(t)}),this.loading=!1})},methods:{calcIcon:function(n){return D.fileIcon(n)},loadFiles:function(n){x.oi.get(this.apiUrl,{params:{target:n}}).then(t=>{if(t.data.length===0){this.items=this.items.filter(s=>s.id!==n);return}for(let s of t.data.sort())this.filepath=s,this.insertFile(this.items,2,s);this.inputFilename&&(this.selectedFile=this.inputFilename);const o=this.items.findIndex(s=>s.id===n);o!==-1&&(this.items[o].disabled=!1)}).catch(t=>{this.$emit("error",`Failed to connect to OpenC3. ${t}`)})},clear:function(){this.show=!1,this.overwrite=!1,this.disableButtons=!1},activeFile:function(n){n.length===0?this.selectedFile=null:(this.selectedFile=this.findItem(this.items,n.id),setTimeout(()=>{this.$refs.submitBtn.$el.focus()},100))},findItem:function(n,t){for(let o of n){if(o.id===t)return o.path;if(o.children){const s=this.findItem(o.children,t);if(s)return s}}return null},exists:function(n,t){let o=!1;for(let s of n){if(s.path===t||s.path.length>1&&s.path[s.path.length-1]==="*"&&s.path.slice(0,s.path.length-1)===t)return!0;s.children&&(o=o||this.exists(s.children,t))}return o},success:function(){this.selectedFile!==null&&this.error===null&&(this.type==="open"?this.openSuccess():this.saveSuccess())},deleteTemp:function(){this.$dialog.confirm("Are you sure you want to delete all the temporary files?",{okText:"Delete",cancelText:"Cancel"}).then(n=>x.oi.delete("/script-api/scripts/temp_files")).then(n=>{this.$emit("clear-temp"),this.loadFiles("__TEMP__")}).catch(n=>{this.$notify.serious({title:"Error",body:`Failed to remove script temporary files due to ${n}`})})},openSuccess:function(){this.disableButtons=!0,x.oi.get(`${this.apiUrl}/${this.selectedFile}`).then(n=>{const t={name:this.selectedFile,contents:n.data.contents};n.data.suites&&(t.suites=JSON.parse(n.data.suites)),n.data.error&&(t.error=n.data.error),n.data.success&&(t.success=n.data.success);const o=n.data.locked,s=n.data.breakpoints;this.$emit("file",{file:t,locked:o,breakpoints:s}),this.clear()}).catch(n=>{this.$emit("error",`Failed to open ${this.selectedFile}. ${n}`),this.clear()})},saveSuccess:function(){this.exists(this.items,this.selectedFile)?this.$dialog.confirm(`Are you sure you want to overwrite: ${this.selectedFile}`,{okText:"Overwrite",cancelText:"Cancel"}).then(t=>{this.$emit("filename",this.selectedFile),this.clear()}).catch(t=>{}):(this.$emit("filename",this.selectedFile),this.clear())},insertFile:function(n,t,o){let s=o.split("/");if(s.length===1){n.push({id:this.filepath,title:s[0],file:"ruby",path:this.filepath});return}const i=n.findIndex(l=>l.title===s[0]);i===-1?(n.push({id:this.filepath.split("/").slice(0,t-1).join("/"),title:s[0],children:[],path:this.filepath.split("/").slice(0,t-1).join("/")}),this.insertFile(n[n.length-1].children,t+1,s.slice(1).join("/"))):this.insertFile(n[i].children,t+1,s.slice(1).join("/"))}}},Y={class:"pa-3"},H={class:"overflow-y-auto tree-container"};function j(n,t,o,s,i,l){const m=e.resolveComponent("v-progress-circular"),h=e.resolveComponent("v-overlay"),c=e.resolveComponent("v-spacer"),u=e.resolveComponent("v-toolbar"),d=e.resolveComponent("v-row"),a=e.resolveComponent("v-text-field"),p=e.resolveComponent("tree-node"),f=e.resolveComponent("v-btn"),g=e.resolveComponent("v-card-text"),v=e.resolveComponent("v-card"),C=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(C,{modelValue:l.show,"onUpdate:modelValue":t[4]||(t[4]=r=>l.show=r),width:"600",onKeydown:t[5]||(t[5]=e.withKeys(r=>l.success(),["enter"]))},{default:e.withCtx(()=>[e.createVNode(v,null,{default:e.withCtx(()=>[e.createVNode(h,{"model-value":i.loading},{default:e.withCtx(()=>[e.createVNode(m,{indeterminate:"",absolute:"",size:"64"})]),_:1},8,["model-value"]),e.createElementVNode("form",{onSubmit:t[3]||(t[3]=e.withModifiers((...r)=>l.success&&l.success(...r),["prevent"]))},[e.createVNode(u,{height:"24"},{default:e.withCtx(()=>[e.createVNode(c),e.createElementVNode("span",null,e.toDisplayString(l.title),1),e.createVNode(c)]),_:1}),e.createVNode(g,null,{default:e.withCtx(()=>[e.createElementVNode("div",Y,[e.createVNode(d,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.helpText),1)]),_:1}),e.createVNode(d,{dense:"",class:"mt-5"},{default:e.withCtx(()=>[e.createVNode(a,{modelValue:i.search,"onUpdate:modelValue":t[0]||(t[0]=r=>i.search=r),flat:"",autofocus:"","hide-details":"",clearable:"",label:"Search","prepend-inner-icon":"mdi-magnify",density:"compact","data-test":"file-open-save-search"},null,8,["modelValue"])]),_:1}),e.createElementVNode("div",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.items,r=>(e.openBlock(),e.createBlock(p,{key:`${r.id}`,node:r,search:i.search,type:o.type,onRequest:l.activeFile,onDelete:l.deleteTemp},null,8,["node","search","type","onRequest","onDelete"]))),128))]),e.createVNode(d,{class:"my-2"},{default:e.withCtx(()=>[e.createVNode(a,{modelValue:i.selectedFile,"onUpdate:modelValue":t[1]||(t[1]=r=>i.selectedFile=r),"hide-details":"",label:"Filename","data-test":"file-open-save-filename",disabled:o.type==="open"},null,8,["modelValue","disabled"])]),_:1}),e.createVNode(d,{dense:""},{default:e.withCtx(()=>[e.withDirectives(e.createElementVNode("div",{class:"my-2 text-red",style:{"white-space":"pre-line"}},e.toDisplayString(l.error),513),[[e.vShow,l.error]])]),_:1}),e.createVNode(d,{class:"mt-2"},{default:e.withCtx(()=>[e.createVNode(c),e.createVNode(f,{onClick:t[2]||(t[2]=r=>l.show=!1),variant:"outlined",class:"mx-2","data-test":"file-open-save-cancel-btn",disabled:i.disableButtons},{default:e.withCtx(()=>t[6]||(t[6]=[e.createTextVNode(" Cancel ")])),_:1},8,["disabled"]),e.createVNode(f,{onClick:e.withModifiers(l.success,["prevent"]),ref:"submitBtn",type:"submit",color:"primary",class:"mx-2","data-test":"file-open-save-submit-btn",disabled:i.disableButtons||!!l.error},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.submit),1)]),_:1},8,["onClick","disabled"])]),_:1})])]),_:1})],32)]),_:1})]),_:1},8,["modelValue"])}const $=V._export_sfc(X,[["render",j]]),_=20,J={mixins:[x.WidgetComponents],components:{EditScreenDialog:b},props:{target:{type:String,default:""},screen:{type:String,default:""},definition:{type:String,default:""},keywords:{type:Array,default:()=>[]},initialFloated:{type:Boolean,default:!1},initialTop:{type:Number,default:0},initialLeft:{type:Number,default:0},initialZ:{type:Number,default:0},minZ:{type:Number,default:0},fixFloated:{type:Boolean,default:!1},count:{type:Number,default:0},showClose:{type:Boolean,default:!0},timeZone:{type:String,default:"local"},inline:{type:Boolean,default:!1}},data(){return{api:null,backup:"",currentDefinition:this.definition,editDialog:!1,expand:!0,configParser:null,configError:!1,currentLayout:null,layoutStack:[],namedWidgets:{},dynamicWidgets:[],width:null,height:null,staleTime:30,cacheTimeout:.1,globalSettings:[],substitute:!1,original_target_name:null,force_substitute:!1,pollingPeriod:1,errors:[],errorDialog:!1,screenKey:null,dragX:0,dragY:0,floated:this.initialFloated,top:this.initialTop,left:this.initialLeft,zIndex:this.initialZ,changeCounter:0,screenItems:[],screenValues:{},updateCounter:0,screenId:x.lodashExports.uniqueId("openc3-screen_")}},watch:{count:{handler(n,t){this.currentDefinition=this.definition,this.rerender()}}},computed:{error:function(){if(this.errorDialog&&this.errors.length>0){let n=new Set,t="";for(const o of this.errors){if(n.has(o.message))continue;let s=`${o.time}: (${o.type}) ${o.message}
|
|
4
|
+
`;t+=s,n.add(o.message)}return t}return null},computedStyle(){var o;let n={};const t=this.width||((o=this.$refs.bar)==null?void 0:o.clientWidth);return this.floated&&(n.position="absolute",n.top=this.top+"px",n.left=this.left+"px",n.width=t+"px"),n}},errorCaptured(n,t,o){return console.log({err:n,vm:t,info:o}),this.errors.length<_&&(console.log({errors:this.errors}),n.usage?this.errors.push({type:"usage",message:n.message,usage:n.usage,line:n.line,lineNumber:n.lineNumber,time:new Date().getTime()}):this.errors.push({type:"error",message:n,time:new Date().getTime()}),this.configError=!0),!1},created(){this.api=new x.hi,this.configParser=new x.ui,this.parseDefinition(),this.screenKey=Math.floor(Math.random()*1e6)},mounted(){this.updateRefreshInterval(),this.floated&&(this.$refs.bar.onmousedown=this.dragMouseDown,this.$refs.bar.parentElement.parentElement.style="z-index: "+this.zIndex)},unmounted(){this.updater!=null&&(clearInterval(this.updater),this.updater=null)},methods:{open(n,t){this.$parent.showScreen(n,t)},close(n,t){this.$parent.closeScreenByName(n,t)},closeAll(){this.$parent.closeAll()},clearErrors:function(){this.errors=[],this.configError=!1},updateRefreshInterval:function(){let n=this.pollingPeriod*1e3;this.updater&&clearInterval(this.updater),this.updater=setInterval(()=>{this.update()},n)},parseDefinition:function(){if(this.clearErrors(),this.namedWidgets={},this.layoutStack=[],this.dynamicWidgets=[],this.layoutStack.push({type:"VerticalWidget",parameters:[],widgets:[]}),this.currentLayout=this.layoutStack[this.layoutStack.length-1],this.configParser.parse_string(this.currentDefinition,"",!1,!0,(n,t,o,s)=>{if(n)switch(n){case"SCREEN":this.configParser.verify_num_parameters(3,4,`${n} <Width or AUTO> <Height or AUTO> <Polling Period>`),this.width=parseInt(t[0]),this.height=parseInt(t[1]),this.pollingPeriod=parseFloat(t[2]);break;case"END":this.configParser.verify_num_parameters(0,0,`${n}`),this.layoutStack.pop(),this.currentLayout=this.layoutStack[this.layoutStack.length-1];break;case"STALE_TIME":this.configParser.verify_num_parameters(1,1,`${n} <Time (s)>`),this.staleTime=parseInt(t[0]);break;case"SETTING":case"SUBSETTING":(this.currentLayout.widgets[this.currentLayout.widgets.length-1]??this.currentLayout).settings.push(t);break;case"GLOBAL_SETTING":case"GLOBAL_SUBSETTING":this.globalSettings.push(t);break;default:this.processWidget(n,t,o,s);break}}),typeof this.layoutStack[0]>"u"){let n=[],t=[];for(const o of this.dynamicWidgets)n.push(o.name),t.push(o.lineNumber);this.errors.length<_&&(this.errors.push({type:"usage",message:`Unknown widget! Are these widgets: ${n.join(",")}?`,lineNumber:t.join(","),time:new Date().getTime()}),this.configError=!0),this.layoutStack[0]={type:"VerticalWidget",parameters:[],widgets:[]}}else this.applyGlobalSettings(this.layoutStack[0].widgets)},openEdit:function(){this.backup=this.currentDefinition.repeat(1),this.editDialog=!0},upScreen:function(){this.zIndex+=1,this.$refs.bar.parentElement.parentElement.style="z-index: "+this.zIndex,this.$emit("drag-screen",[this.floated,this.top,this.left,this.zIndex])},downScreen:function(){this.zIndex>this.minZ&&(this.zIndex-=1,this.$refs.bar.parentElement.parentElement.style="z-index: "+this.zIndex,this.$emit("drag-screen",[this.floated,this.top,this.left,this.zIndex]))},floatScreen:function(){if(this.floated)this.$refs.bar.onmousedown=null,this.$refs.bar.parentElement.parentElement.style="z-index: 0",this.floated=!1,this.$emit("unfloat-screen",[this.floated,this.top,this.left,this.zIndex]);else{let n=this.$refs.bar.parentElement.parentElement.parentElement.getBoundingClientRect(),t=this.$refs.bar.getBoundingClientRect();this.top=t.top-n.top-5,this.left=t.left-n.left-5,this.$refs.bar.onmousedown=this.dragMouseDown,this.$refs.bar.parentElement.parentElement.style="z-index: "+this.zIndex,this.floated=!0,this.$emit("float-screen",[this.floated,this.top,this.left,this.zIndex])}},dragMouseDown:function(n){n=n||window.event,n.preventDefault(),this.dragX=n.clientX,this.dragY=n.clientY,document.onmouseup=this.closeDragElement,document.onmousemove=this.elementDrag},elementDrag:function(n){n=n||window.event,n.preventDefault();let t=this.dragX-n.clientX,o=this.dragY-n.clientY;this.dragX=n.clientX,this.dragY=n.clientY,this.top=this.$refs.bar.offsetTop-o,this.left=this.$refs.bar.offsetLeft-t,this.$emit("drag-screen",[this.floated,this.top,this.left,this.zIndex])},closeDragElement:function(){document.onmouseup=null,document.onmousemove=null},rerender:function(){this.parseDefinition(),this.updateRefreshInterval(),this.screenKey=Math.floor(Math.random()*1e6),this.$nextTick(function(){this.clearErrors(),this.$emit("edit-screen")})},cancelEdit:function(){this.file=null,this.editDialog=!1,this.currentDefinition=this.backup,this.rerender()},saveEdit:function(n){this.editDialog=!1,this.currentDefinition=n,this.rerender(),this.$nextTick(function(){x.oi.post("/openc3-api/screen/",{data:{scope:window.openc3Scope,target:this.target,screen:this.screen,text:this.currentDefinition}},0)})},deleteScreen:function(){this.editDialog=!1,x.oi.delete(`/openc3-api/screen/${this.target}/${this.screen}`).then(n=>{this.$emit("delete-screen")})},minMaxTransition:function(){this.expand=!this.expand,this.$emit("min-max-screen")},processWidget:function(n,t,o,s){let i=null;n==="NAMED_WIDGET"&&(this.configParser.verify_num_parameters(2,null,`${n} <Widget Name> <Widget Type> <Widget Settings... (optional)>`),i=t[0].toUpperCase(),n=t[1].toUpperCase(),t=t.slice(2,t.length));const l=n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()+"Widget";let m=[];if(m.push(["__SCREEN_ID__",this.screenId]),i!==null&&m.push(["NAMED_WIDGET",i]),n==="VERTICAL"||n==="VERTICALBOX"||n==="HORIZONTAL"||n==="HORIZONTALBOX"||n==="MATRIXBYCOLUMNS"||n==="TABBOOK"||n==="TABITEM"||n==="CANVAS"||n==="RADIOGROUP"||n==="SCROLLWINDOW"){const h={type:l,parameters:t,settings:m,screenValues:this.screenValues,screenTimeZone:this.timeZone,widgets:[]};this.layoutStack.push(h),this.currentLayout.widgets.push(h),this.currentLayout=h}else if(this.$options.components[l])this.currentLayout.widgets.push({type:l,target:this.target,parameters:t,settings:m,screenValues:this.screenValues,screenTimeZone:this.timeZone,line:o,lineNumber:s});else{let h={type:"DynamicWidget",target:this.target,parameters:t,settings:m,screenValues:this.screenValues,screenTimeZone:this.timeZone,name:l,line:o,lineNumber:s};this.currentLayout.widgets.push(h),this.dynamicWidgets.push(h)}},applyGlobalSettings:function(n){n.forEach(t=>{this.globalSettings.forEach(o=>{t.type.toLowerCase()===o[0].toLowerCase()+"widget"&&t.settings.push(o.slice(1))}),t.widgets&&this.applyGlobalSettings(t.widgets)})},update:function(){this.screenItems.length!==0&&this.configError===!1&&this.api.get_tlm_values(this.screenItems,this.staleTime,this.cacheTimeout).then(n=>{this.clearErrors(),this.updateValues(n)}).catch(n=>{let t=JSON.stringify(n,null,2);t.includes("no response received")||(this.configError=!0),this.errors.find(o=>o.message===t)||this.errors.length<_&&this.errors.push({type:"error",message:t,time:new Date().getTime()})})},updateValues:function(n){this.updateCounter+=1;for(let t=0;t<n.length;t++)n[t].push(this.updateCounter),this.screenValues[this.screenItems[t]]=n[t]},addItem:function(n){this.screenItems.push(n),this.screenValues[n]=[null,null,0]},deleteItem:function(n){let t=this.screenItems.indexOf(n);this.screenItems.splice(t,1)}}},Q={class:"pa-1",style:{position:"relative"},ref:"screen"},ee={key:1,class:"pa-1",style:{position:"relative"}};function te(n,t,o,s,i,l){const m=e.resolveComponent("v-icon"),h=e.resolveComponent("v-tooltip"),c=e.resolveComponent("v-spacer"),u=e.resolveComponent("v-toolbar"),d=e.resolveComponent("v-overlay"),a=e.resolveComponent("vertical-widget"),p=e.resolveComponent("v-expand-transition"),f=e.resolveComponent("v-card"),g=e.resolveComponent("edit-screen-dialog"),v=e.resolveComponent("v-textarea"),C=e.resolveComponent("v-dialog");return e.openBlock(),e.createElementBlock("div",{style:e.normalizeStyle(l.computedStyle),ref:"bar"},[o.inline?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(f,{key:0,"min-height":i.height,"min-width":i.width,style:{cursor:"default"}},{default:e.withCtx(()=>[e.createVNode(u,{height:"24"},{default:e.withCtx(()=>[e.withDirectives(e.createElementVNode("div",null,[e.createVNode(h,{location:"top"},{activator:e.withCtx(({props:r})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(r)),[e.createVNode(m,{"data-test":"error-graph-icon",onClick:t[0]||(t[0]=y=>i.errorDialog=!0)},{default:e.withCtx(()=>t[7]||(t[7]=[e.createTextVNode(" mdi-alert ")])),_:1})],16)]),default:e.withCtx(()=>[t[8]||(t[8]=e.createElementVNode("span",null," Errors ",-1))]),_:1})],512),[[e.vShow,i.errors.length!==0]]),e.createVNode(h,{location:"top"},{activator:e.withCtx(({props:r})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(r)),[e.createVNode(m,{"data-test":"edit-screen-icon",onClick:l.openEdit},{default:e.withCtx(()=>t[9]||(t[9]=[e.createTextVNode(" mdi-pencil ")])),_:1},8,["onClick"])],16)]),default:e.withCtx(()=>[t[10]||(t[10]=e.createElementVNode("span",null," Edit Screen ",-1))]),_:1}),o.fixFloated?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(h,{key:0,location:"top"},{activator:e.withCtx(({props:r})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(r)),[e.createVNode(m,{"data-test":"float-screen-icon",onClick:l.floatScreen},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.floated?"mdi-balloon":"mdi-view-grid-outline"),1)]),_:1},8,["onClick"])],16)]),default:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(i.floated?"Unfloat Screen":"Float Screen"),1)]),_:1})),i.floated?(e.openBlock(),e.createBlock(h,{key:1,location:"top"},{activator:e.withCtx(({props:r})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(r)),[e.createVNode(m,{"data-test":"up-screen-icon",onClick:l.upScreen},{default:e.withCtx(()=>t[11]||(t[11]=[e.createTextVNode(" mdi-arrow-up ")])),_:1},8,["onClick"])],16)]),default:e.withCtx(()=>[t[12]||(t[12]=e.createElementVNode("span",null," Move Screen Up ",-1))]),_:1})):e.createCommentVNode("",!0),i.floated&&i.zIndex>o.minZ?(e.openBlock(),e.createBlock(h,{key:2,location:"top"},{activator:e.withCtx(({props:r})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(r)),[e.createVNode(m,{"data-test":"down-screen-icon",onClick:l.downScreen},{default:e.withCtx(()=>t[13]||(t[13]=[e.createTextVNode(" mdi-arrow-down ")])),_:1},8,["onClick"])],16)]),default:e.withCtx(()=>[t[14]||(t[14]=e.createElementVNode("span",null," Move Screen Down ",-1))]),_:1})):e.createCommentVNode("",!0),e.createVNode(c),e.createElementVNode("span",null,e.toDisplayString(o.target)+" "+e.toDisplayString(o.screen),1),e.createVNode(c),e.createVNode(h,{location:"top"},{activator:e.withCtx(({props:r})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(r)),[e.withDirectives(e.createVNode(m,{"data-test":"minimize-screen-icon",onClick:l.minMaxTransition},{default:e.withCtx(()=>t[15]||(t[15]=[e.createTextVNode(" mdi-window-minimize ")])),_:1},8,["onClick"]),[[e.vShow,i.expand]]),e.withDirectives(e.createVNode(m,{"data-test":"maximize-screen-icon",onClick:l.minMaxTransition},{default:e.withCtx(()=>t[16]||(t[16]=[e.createTextVNode(" mdi-window-maximize ")])),_:1},8,["onClick"]),[[e.vShow,!i.expand]])],16)]),default:e.withCtx(()=>[e.withDirectives(e.createElementVNode("span",null," Minimize Screen ",512),[[e.vShow,i.expand]]),e.withDirectives(e.createElementVNode("span",null," Maximize Screen ",512),[[e.vShow,!i.expand]])]),_:1}),o.showClose?(e.openBlock(),e.createBlock(h,{key:3,location:"top"},{activator:e.withCtx(({props:r})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(r)),[e.createVNode(m,{"data-test":"close-screen-icon",onClick:t[1]||(t[1]=y=>n.$emit("close-screen"))},{default:e.withCtx(()=>t[17]||(t[17]=[e.createTextVNode(" mdi-close-box ")])),_:1})],16)]),default:e.withCtx(()=>[t[18]||(t[18]=e.createElementVNode("span",null," Close Screen ",-1))]),_:1})):e.createCommentVNode("",!0)]),_:1}),i.editDialog?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(p,{key:0},{default:e.withCtx(()=>[e.withDirectives(e.createElementVNode("div",Q,[e.createVNode(d,{style:{"pointer-events":"none"},"model-value":i.errors.length!==0,opacity:"0.8",absolute:"",attach:""},null,8,["model-value"]),(e.openBlock(),e.createBlock(a,{key:i.screenKey,widgets:i.layoutStack[0].widgets,"screen-values":i.screenValues,"screen-time-zone":o.timeZone,onAddItem:l.addItem,onDeleteItem:l.deleteItem,onOpen:l.open,onClose:l.close,onCloseAll:l.closeAll},null,8,["widgets","screen-values","screen-time-zone","onAddItem","onDeleteItem","onOpen","onClose","onCloseAll"]))],512),[[e.vShow,i.expand]])]),_:1}))]),_:1},8,["min-height","min-width"])),o.inline?(e.openBlock(),e.createElementBlock("div",ee,[e.createVNode(d,{style:{"pointer-events":"none"},"model-value":i.errors.length!==0,opacity:"0.8",absolute:"",attach:""},null,8,["model-value"]),(e.openBlock(),e.createBlock(a,{key:i.screenKey,widgets:i.layoutStack[0].widgets,"screen-values":i.screenValues,"screen-time-zone":o.timeZone,onAddItem:l.addItem,onDeleteItem:l.deleteItem,onOpen:l.open,onClose:l.close,onCloseAll:l.closeAll},null,8,["widgets","screen-values","screen-time-zone","onAddItem","onDeleteItem","onOpen","onClose","onCloseAll"]))])):e.createCommentVNode("",!0),i.editDialog?(e.openBlock(),e.createBlock(g,{key:2,modelValue:i.editDialog,"onUpdate:modelValue":t[2]||(t[2]=r=>i.editDialog=r),target:o.target,screen:o.screen,definition:i.currentDefinition,keywords:o.keywords,errors:i.errors,onSave:t[3]||(t[3]=r=>l.saveEdit(r)),onCancel:t[4]||(t[4]=r=>l.cancelEdit()),onDelete:t[5]||(t[5]=r=>l.deleteScreen())},null,8,["modelValue","target","screen","definition","keywords","errors"])):e.createCommentVNode("",!0),e.createVNode(C,{modelValue:i.errorDialog,"onUpdate:modelValue":t[6]||(t[6]=r=>i.errorDialog=r),width:"60vw"},{default:e.withCtx(()=>[e.createVNode(u,{height:"24"},{default:e.withCtx(()=>[e.createVNode(c),e.createElementVNode("span",null," Screen: "+e.toDisplayString(o.target)+" "+e.toDisplayString(o.screen)+" Errors ",1),e.createVNode(c)]),_:1}),e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(v,{class:"errors",readonly:"",rows:"13","model-value":l.error},null,8,["model-value"])]),_:1})]),_:1},8,["modelValue"])],4)}const ne=V._export_sfc(J,[["render",te],["__scopeId","data-v-2bc7c71d"]]);exports.EditScreenDialog=b;exports.EnvironmentDialog=L;exports.FileOpenSaveDialog=$;exports.Openc3Screen=ne;exports.ScreenCompleter=k;
|
|
5
|
+
//# sourceMappingURL=Openc3Screen-BYhHaH_I.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Openc3Screen-BYhHaH_I.cjs","sources":["../src/components/autocomplete/screenCompleter.js","../src/components/EditScreenDialog.vue","../src/components/EnvironmentDialog.vue","../src/components/TreeNode.vue","../src/components/FileOpenSaveDialog.vue","../src/components/Openc3Screen.vue"],"sourcesContent":["/*\n# Copyright 2025 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\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. See the\n# GNU Affero General Public License for more details.\n\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\n\n// Test data useful for testing ScreenCompleter\n// let autocompleteData = [\n// {\n// caption: 'HORIZONTAL',\n// meta: 'Places the widgets it encapsulates horizontally',\n// snippet: 'HORIZONTAL ${1:<Margin>}',\n// },\n// {\n// caption: 'LABELVALUE',\n// meta: 'Displays a LABEL with the item name followed by a VALUE',\n// value: 'LABELVALUE ',\n// command: 'startAutocomplete',\n// params: [\n// { 'Target name': 1 },\n// { 'Packet name': 1 },\n// { 'Item name': 1 },\n// { RAW: 'raw description', CONVERTED: 1, FORMATTED: 1, WITH_UNITS: 1 },\n// { '<Number of characters>': 'characters description' },\n// ],\n// },\n// ]\n\nexport default class ScreenCompleter {\n constructor() {\n // See openc3-cosmos-cmd-tlm-api/app/controllers/script_autocomplete_controller.rb\n // for how the autocompleteData is built\n\n Api.get(`/openc3-api/autocomplete/data/screen`).then((response) => {\n this.autocompleteData = response.data\n })\n this.api = new OpenC3Api()\n }\n\n async getCompletions(editor, session, pos, prefix, callback) {\n let line = session.getLine(pos.row)\n let lineBefore = line.slice(0, pos.column)\n let parsedLine = lineBefore.trimStart().split(/ (?![^<]*>)/)\n let suggestions = this.autocompleteData\n // If we have more than 1 we've selected a keyword\n if (parsedLine.length > 1) {\n suggestions = suggestions.find((x) => x.caption === parsedLine[0])\n }\n let result = {}\n let more = true\n // If we found suggestions and the suggestions have params\n // then we do logic to substitute suggestions using the actual\n // target, packet, item data\n if (suggestions && suggestions['params']) {\n // Check if this is the last autocomplete parameter\n if (suggestions['params'].length == parsedLine.length - 1) {\n more = false\n }\n // parsedLine.length - 2 because the last element is blank\n // e.g. ['LABELVALUE', 'INST', '']\n let current = suggestions['params'][parsedLine.length - 2]\n // Check for Target name, Packet name, and Item name and use\n // api calls to substitute actual values for suggestions\n if (current['Target name']) {\n let target_names = await this.api.get_target_names()\n suggestions = target_names.reduce(\n (acc, curr) => ((acc[curr] = 1), acc),\n {},\n )\n } else if (current['Packet name']) {\n let target_name = parsedLine[parsedLine.length - 2]\n let packets = await this.api.get_all_tlm(target_name)\n suggestions = packets.reduce(\n (acc, pkt) => ((acc[pkt.packet_name] = pkt.description), acc),\n {},\n )\n } else if (current['Item name']) {\n let target_name = parsedLine[parsedLine.length - 3]\n let packet_name = parsedLine[parsedLine.length - 2]\n let packet = await this.api.get_tlm(target_name, packet_name)\n suggestions = packet.items.reduce(\n (acc, item) => ((acc[item.name] = item.description), acc),\n {},\n )\n } else {\n // Not a special case so just use the param as is\n suggestions = current\n }\n\n result = Object.keys(suggestions || {}).map((x) => {\n let completions = {\n value: x + (more ? ' ' : ''),\n // We want the autoComplete to continue right up\n // to the last parameter\n command: more && 'startAutocomplete',\n }\n // Only add the meta (description) if we have a string\n // This prevents adding (Object) descriptions\n if (typeof suggestions[x] === 'string') {\n completions['meta'] = suggestions[x]\n }\n return completions\n })\n } else {\n // The snippet case where we just inject the snippet\n result = suggestions\n }\n callback(null, result)\n }\n}\n","<!--\n# Copyright 2024 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\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. See the\n# GNU Affero General Public License for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <!-- Edit dialog -->\n <v-dialog persistent v-model=\"show\" width=\"75vw\">\n <v-card>\n <v-toolbar height=\"24\">\n <div class=\"mx-2\">\n <v-tooltip location=\"top\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon data-test=\"delete-screen-icon\" @click=\"deleteScreen\">\n mdi-delete\n </v-icon>\n </div>\n </template>\n <span> Delete Screen </span>\n </v-tooltip>\n </div>\n <v-spacer />\n <span> Edit Screen: {{ target }} {{ screen }} </span>\n <v-spacer />\n <div class=\"mx-2\">\n <v-tooltip location=\"top\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon\n data-test=\"download-screen-icon\"\n @click=\"downloadScreen\"\n >\n mdi-download\n </v-icon>\n </div>\n </template>\n <span> Download Screen </span>\n </v-tooltip>\n </div>\n </v-toolbar>\n <v-card-text style=\"max-height: 90vh\">\n <v-row class=\"mt-3\"> Upload a screen file. </v-row>\n <v-row no-gutters align=\"center\">\n <v-btn\n @click=\"loadFile\"\n :disabled=\"!file\"\n color=\"primary\"\n class=\"mr-3\"\n data-test=\"edit-screen-load\"\n >\n Load\n </v-btn>\n <v-file-input\n v-model=\"file\"\n truncate-length=\"15\"\n accept=\".txt\"\n label=\"Click to select .txt screen file.\"\n />\n </v-row>\n <v-row class=\"mb-2\"> Edit the screen definition. </v-row>\n <v-row class=\"mb-2\">\n <pre\n ref=\"editor\"\n class=\"editor\"\n @contextmenu.prevent=\"showContextMenu\"\n ></pre>\n <v-menu v-model=\"contextMenu\" :target=\"[menuX, menuY]\">\n <v-list>\n <v-list-item link>\n <v-list-item-title @click=\"openDocumentation\">\n {{ docsKeyword }} documentation\n </v-list-item-title>\n </v-list-item>\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 </v-row>\n <!-- Make the error messages a max height and scrollable -->\n <v-row style=\"max-height: 120px; overflow-y: auto\">\n <div v-for=\"(error, index) in editErrors\" :key=\"index\">\n <span class=\"text-red\" v-text=\"error\"></span>\n </div>\n </v-row>\n <v-row class=\"mt-5\">\n <span\n >Ctrl-space brings up autocomplete. Right click keywords for\n documentation.</span\n >\n <v-spacer />\n <v-btn\n @click=\"$emit('cancel')\"\n class=\"mx-2\"\n variant=\"outlined\"\n data-test=\"edit-screen-cancel\"\n >\n Cancel\n </v-btn>\n <v-btn\n @click=\"$emit('save', editor.getValue())\"\n class=\"mx-2\"\n color=\"primary\"\n data-test=\"edit-screen-save\"\n >\n Save\n </v-btn>\n </v-row>\n </v-card-text>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport * as ace from 'ace-builds'\nimport 'ace-builds/src-min-noconflict/mode-text'\nimport 'ace-builds/src-min-noconflict/theme-twilight'\nimport 'ace-builds/src-min-noconflict/ext-language_tools'\nimport 'ace-builds/src-min-noconflict/ext-searchbox'\nimport { ScreenCompleter } from './autocomplete'\nimport { AceEditorUtils } from './ace'\n\nexport default {\n props: {\n modelValue: Boolean,\n target: {\n type: String,\n default: '',\n },\n screen: {\n type: String,\n default: '',\n },\n definition: {\n type: String,\n default: '',\n },\n keywords: {\n type: Array,\n default: () => [],\n },\n errors: {\n type: Array,\n default: () => [],\n },\n },\n data() {\n return {\n file: null,\n docsKeyword: '',\n contextMenu: false,\n menuX: 0,\n menuY: 0,\n }\n },\n computed: {\n editErrors: function () {\n if (this.definition === '' && !this.file) {\n return ['Input can not be blank.']\n }\n if (this.errors.length !== 0) {\n let messages = new Set()\n let result = []\n const sortedErrors = this.errors.toSorted(\n (a, b) => a.lineNumber - b.lineNumber,\n )\n for (const error of sortedErrors) {\n let msg = `At ${error.lineNumber}: (${error.line}) ${error.message}.`\n if (error.usage) {\n msg += ` Usage: ${error.usage}`\n }\n result.push(msg)\n messages.add(error.message)\n }\n return result\n }\n return []\n },\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.editor = ace.edit(this.$refs.editor)\n this.editor.setTheme('ace/theme/twilight')\n const screenMode = this.buildScreenMode()\n this.editor.session.setMode(new screenMode())\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 ScreenCompleter()]\n this.editor.setHighlightActiveLine(false)\n this.editor.setValue(this.definition)\n this.editor.clearSelection()\n AceEditorUtils.applyVimModeIfEnabled(this.editor)\n this.editor.focus()\n },\n beforeUnmount() {\n this.editor.destroy()\n this.editor.container.remove()\n },\n methods: {\n toggleVimMode: function () {\n AceEditorUtils.toggleVimMode(this.editor)\n },\n showContextMenu: function (event) {\n this.menuX = event.pageX\n this.menuY = event.pageY\n\n let position = this.editor.getCursorPosition()\n let token = this.editor.session.getTokenAt(position.row, position.column)\n if (token) {\n let value = token.value.trim()\n if (value.includes(' ')) {\n this.docsKeyword = value.split(' ')[0]\n } else {\n this.docsKeyword = value\n }\n this.contextMenu = true\n }\n },\n openDocumentation() {\n window.open(\n `${\n window.location.origin\n }/tools/staticdocs/docs/configuration/telemetry-screens#${this.docsKeyword.toLowerCase()}`,\n '_blank',\n )\n },\n buildScreenMode() {\n let oop = ace.require('ace/lib/oop')\n let TextHighlightRules = ace.require(\n 'ace/mode/text_highlight_rules',\n ).TextHighlightRules\n\n let list = this.keywords.join('|')\n let OpenC3HighlightRules = function () {\n this.$rules = {\n start: [\n {\n token: 'comment',\n regex: '#.*$',\n },\n {\n token: 'string',\n regex: '\".*?\"',\n },\n {\n token: 'string',\n regex: \"'.*?'\",\n },\n {\n token: 'constant.numeric',\n regex: '\\\\b\\\\d+(?:\\\\.\\\\d+)?\\\\b',\n },\n {\n token: 'keyword',\n regex: new RegExp(`^\\\\s*(${list})\\\\b`),\n },\n ],\n }\n this.normalizeRules()\n }\n oop.inherits(OpenC3HighlightRules, TextHighlightRules)\n let Mode = function () {\n this.HighlightRules = OpenC3HighlightRules\n }\n let TextMode = ace.require('ace/mode/text').Mode\n oop.inherits(Mode, TextMode)\n ;(function () {\n this.$id = 'ace/mode/openc3'\n }).call(Mode.prototype)\n return Mode\n },\n downloadScreen: function () {\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.screen.toLowerCase()}.txt`)\n link.click()\n },\n loadFile: function () {\n const fileReader = new FileReader()\n fileReader.readAsText(this.file)\n const that = this\n fileReader.onload = function () {\n that.editor.setValue(fileReader.result)\n that.file = null\n }\n },\n deleteScreen: function () {\n this.$dialog\n .confirm(`Are you sure you want to delete this screen?!`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n this.$emit('delete')\n })\n },\n },\n}\n</script>\n\n<style>\n.ace_autocomplete {\n width: 60vw !important;\n}\n</style>\n<style scoped>\n.editor {\n height: 45vh;\n width: 75vw;\n position: relative;\n font-size: 16px;\n}\n.v-textarea :deep(textarea) {\n padding: 5px;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\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. See the\n# GNU Affero General Public License 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=\"600\">\n <v-card>\n <form v-on:submit.prevent=\"addEnvironment\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span>Global Environment Variables</span>\n <v-spacer />\n </v-toolbar>\n <v-card-text>\n <div class=\"pa-3\">\n <v-row dense class=\"mb-2\">\n <v-text-field\n v-model=\"search\"\n label=\"search\"\n type=\"text\"\n data-test=\"search\"\n prepend-inner-icon=\"mdi-magnify\"\n clearable\n variant=\"outlined\"\n density=\"compact\"\n clear-icon=\"mdi-close-circle-outline\"\n autofocus\n single-line\n hide-details\n />\n </v-row>\n <v-data-table\n item-key=\"name\"\n hide-default-header\n data-test=\"env-table\"\n :search=\"search\"\n :headers=\"headers\"\n :items=\"environment\"\n :items-per-page=\"5\"\n :items-per-page-options=\"[5]\"\n >\n <template v-slot:item.actions=\"{ item }\">\n <v-btn\n @click=\"deleteEnvironment(item)\"\n icon\n class=\"mt-1\"\n data-test=\"item-delete\"\n >\n <v-icon>mdi-delete</v-icon>\n </v-btn>\n </template>\n </v-data-table>\n <v-row dense>\n <v-col>\n <v-text-field v-model=\"key\" label=\"Key\" data-test=\"env-key\" />\n </v-col>\n <v-col>\n <v-text-field\n v-model=\"keyValue\"\n label=\"Value\"\n data-test=\"env-value\"\n />\n </v-col>\n </v-row>\n <v-row dense>\n <v-btn\n @click.prevent=\"addEnvironment\"\n block\n type=\"submit\"\n color=\"primary\"\n data-test=\"add-env\"\n :disabled=\"!key || !keyValue\"\n >\n Add\n </v-btn>\n </v-row>\n </div>\n </v-card-text>\n </form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\n\nexport default {\n props: {\n modelValue: Boolean,\n },\n data() {\n return {\n alert: '',\n alertType: 'success',\n showAlert: false,\n search: '',\n key: '',\n keyValue: '',\n environment: [],\n headers: [\n {\n text: 'Key',\n value: 'key',\n },\n {\n text: 'Value',\n value: 'value',\n },\n {\n text: 'Actions',\n value: 'actions',\n align: 'end',\n sortable: false,\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 mounted() {\n this.update()\n },\n methods: {\n alertHandler: function (event) {\n this.alert = event.text\n this.alertType = event.type\n this.showAlert = true\n },\n update: function () {\n Api.get('/openc3-api/environment')\n .then((response) => {\n this.environment = response.data\n })\n .catch((error) => {\n // TODO: $error.something\n })\n },\n addEnvironment: function () {\n Api.post('/openc3-api/environment', {\n data: {\n key: this.key.toUpperCase(),\n value: this.keyValue,\n },\n })\n .then((response) => {\n const alertEvent = {\n text: `New environment variable: ${response.data.name}`,\n type: 'success',\n }\n this.update()\n })\n .catch((error) => {\n const alertEvent = {\n text: `Failed to add environment variable: ${error}`,\n type: 'error',\n }\n this.alertHandler(alertEvent)\n })\n this.key = ''\n this.keyValue = ''\n },\n deleteEnvironment: function (env) {\n this.$dialog\n .confirm(`Are you sure you want to delete: ${env.key}=${env.value}`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete(`/openc3-api/environment/${env.name}`)\n })\n .then((response) => {\n const alertEvent = {\n text: `Removed environment variable: ${env.name}`,\n type: 'success',\n }\n this.alertHandler(alertEvent)\n this.update()\n })\n .catch((error) => {\n const alertEvent = {\n text: `Failed to delete environment: ${error}`,\n type: 'error',\n }\n this.alertHandler(alertEvent)\n })\n },\n },\n}\n</script>\n","<!--\n# Copyright 2025 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\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. See the\n# GNU Affero General Public License 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<!--\n# Due to performance issues in TreeView we implement TreeNode\n# based on code example provided in https://github.com/vuetifyjs/vuetify/issues/19919\n-->\n<template>\n <div class=\"tree-node\">\n <div @click=\"handleClick(node)\" class=\"node-content\" v-if=\"showNode\">\n <div class=\"content-wrapper\">\n <v-icon\n v-if=\"node.children\"\n class=\"toggle-icon\"\n style=\"padding-right: 10px\"\n >\n {{ node.isOpen ? 'mdi-menu-down' : 'mdi-menu-right' }}\n </v-icon>\n <v-icon v-if=\"node.children\" size=\"small\" style=\"padding-right: 10px\">\n {{ 'mdi-folder' }}\n </v-icon>\n <v-icon\n v-else-if=\"node.title.includes('.rb')\"\n size=\"small\"\n style=\"padding-right: 10px\"\n >\n {{ 'mdi-language-ruby' }}\n </v-icon>\n <v-icon\n v-else-if=\"node.title.includes('.py')\"\n size=\"small\"\n style=\"padding-right: 10px\"\n >\n {{ 'mdi-language-python' }}\n </v-icon>\n <v-icon v-else size=\"small\" style=\"padding-right: 10px\">\n {{ 'mdi-file-document' }}\n </v-icon>\n <span\n class=\"title\"\n :tabindex=\"node.children ? -1 : 0\"\n @keyup.enter=\"handleClick(node)\"\n >\n {{ node.title }}\n </span>\n\n <v-btn\n v-if=\"node.title === '__TEMP__'\"\n icon\n @click=\"emit('delete')\"\n style=\"margin-left: auto\"\n >\n <v-icon> mdi-delete </v-icon>\n </v-btn>\n </div>\n </div>\n <div v-else></div>\n <div v-if=\"node.children && node.isOpen\" class=\"children\">\n <tree-node\n v-for=\"child in node.children\"\n :key=\"child.id\"\n :node=\"child\"\n :search=\"search\"\n :type=\"type\"\n @node-toggled=\"bubbleNodeToggled\"\n @request=\"bubbleNodeRequest\"\n ></tree-node>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { computed, ref, watch } from 'vue'\n\nconst props = defineProps({\n node: {\n type: Object,\n required: true,\n },\n search: {\n type: String,\n default: '',\n },\n type: {\n type: String,\n default: 'open',\n },\n})\n\nconst isOpen = ref(props.node.isOpen || false)\n\nconst showNode = computed(() => {\n const _nodeOrChildMatchesSearch = (node) => {\n if (!props.search) {\n return true\n }\n if (node.path.toLowerCase().includes(props.search.toLowerCase())) {\n return true\n }\n return !!node.children?.some(_nodeOrChildMatchesSearch)\n }\n\n return _nodeOrChildMatchesSearch(props.node)\n})\n\nwatch(\n () => props.node.isOpen,\n (newpath) => {\n isOpen.path = newpath\n },\n)\n\nwatch(\n () => props.search,\n (newSearch) => {\n if (newSearch) {\n if (!props.node.isOpen) toggle()\n } else {\n if (props.node.isOpen) toggle()\n }\n },\n)\n\nconst emit = defineEmits(['nodeToggled', 'request'])\n\nconst handleClick = (node) => {\n if (node.children) {\n toggle()\n // Only emit request on folder for save dialog\n if (props.type === 'save') {\n emit('request', node)\n }\n } else {\n emit('request', node)\n }\n}\nconst toggle = () => {\n if (props.node.children) {\n isOpen.path = !isOpen.path\n props.node.isOpen = isOpen.path\n emit('nodeToggled', props.node.id, isOpen.path)\n }\n}\n// Bubble up the event for the nested tree-nodes\nconst bubbleNodeToggled = (nodeName, isOpen) => {\n emit('nodeToggled', nodeName, isOpen)\n}\nconst bubbleNodeRequest = (node) => {\n emit('request', node)\n}\n</script>\n\n<style scoped>\n.children {\n padding-left: 25px;\n}\n.content-wrapper {\n align-items: center;\n display: flex;\n max-height: 38px;\n}\n.node-content {\n cursor: pointer;\n overflow: hidden;\n user-select: none;\n white-space: nowrap;\n}\n.node-content:hover {\n background-color: rgba(211, 211, 211, 0.2);\n transition: background-color 0.3s ease;\n}\n.title {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.toggle-icon {\n width: 20px;\n}\n.tree-node {\n line-height: 1.8;\n position: relative;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\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. See the\n# GNU Affero General Public License 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=\"600\" @keydown.enter=\"success()\">\n <v-card>\n <v-overlay :model-value=\"loading\">\n <v-progress-circular\n indeterminate\n absolute\n size=\"64\"\n ></v-progress-circular>\n </v-overlay>\n <form v-on:submit.prevent=\"success\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> {{ title }} </span>\n <v-spacer />\n </v-toolbar>\n <v-card-text>\n <div class=\"pa-3\">\n <v-row>{{ helpText }} </v-row>\n <v-row dense class=\"mt-5\">\n <v-text-field\n v-model=\"search\"\n flat\n autofocus\n hide-details\n clearable\n label=\"Search\"\n prepend-inner-icon=\"mdi-magnify\"\n density=\"compact\"\n data-test=\"file-open-save-search\"\n />\n </v-row>\n <div class=\"overflow-y-auto tree-container\">\n <tree-node\n v-for=\"node in items\"\n :key=\"`${node.id}`\"\n :node=\"node\"\n :search=\"search\"\n :type=\"type\"\n @request=\"activeFile\"\n @delete=\"deleteTemp\"\n ></tree-node>\n </div>\n <v-row class=\"my-2\">\n <v-text-field\n v-model=\"selectedFile\"\n hide-details\n label=\"Filename\"\n data-test=\"file-open-save-filename\"\n :disabled=\"type === 'open'\"\n />\n </v-row>\n <v-row dense>\n <div\n class=\"my-2 text-red\"\n style=\"white-space: pre-line\"\n v-show=\"error\"\n >\n {{ error }}\n </div>\n </v-row>\n <v-row class=\"mt-2\">\n <v-spacer />\n <v-btn\n @click=\"show = false\"\n variant=\"outlined\"\n class=\"mx-2\"\n data-test=\"file-open-save-cancel-btn\"\n :disabled=\"disableButtons\"\n >\n Cancel\n </v-btn>\n <v-btn\n @click.prevent=\"success\"\n ref=\"submitBtn\"\n type=\"submit\"\n color=\"primary\"\n class=\"mx-2\"\n data-test=\"file-open-save-submit-btn\"\n :disabled=\"disableButtons || !!error\"\n >\n {{ submit }}\n </v-btn>\n </v-row>\n </div>\n </v-card-text>\n </form>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\nimport { fileIcon } from '@/util/fileIcon'\nimport TreeNode from './TreeNode.vue'\n\nexport default {\n components: {\n TreeNode,\n },\n props: {\n type: {\n type: String,\n required: true,\n validator: function (value) {\n // The value must match one of these strings\n return ['open', 'save'].indexOf(value) !== -1\n },\n },\n apiUrl: String, // Base API URL for use with scripts or cmd-tlm\n requireTargetParentDir: Boolean, // Require that the save filename be nested in a directory with the name of a target\n inputFilename: String, // passed if this is a 'save' dialog\n modelValue: Boolean,\n },\n data() {\n return {\n tree: [],\n items: [],\n search: null,\n selectedFile: null,\n disableButtons: false,\n targets: [],\n targetsRetrieved: [],\n loading: true,\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 title: function () {\n if (this.type === 'open') {\n return 'File Open'\n } else {\n return 'File Save As...'\n }\n },\n submit: function () {\n if (this.type === 'open') {\n return 'OPEN'\n } else {\n return 'SAVE'\n }\n },\n helpText: function () {\n if (this.type === 'open') {\n return 'Click on folders to open them and then click a file to select it before clicking Open. Use the search box to filter the results. You can also Tab to the files and Enter to select.'\n } else {\n return 'Click on the folder to save into. Then complete the filename path with the desired name. Use the search box to filter the results.'\n }\n },\n error: function () {\n if (this.selectedFile === '' || this.selectedFile === null) {\n return 'No file selected must select a file'\n }\n if (\n !this.selectedFile.match(this.validFilenameRegex) ||\n this.selectedFile.match(/\\.\\.|\\/\\/|\\.\\/|\\/\\./) // Block .'s and /'s next to each other (block path traversal)\n ) {\n let message = `${this.selectedFile} is not a valid filename. Must `\n if (this.requireTargetParentDir) {\n message += 'be in a target directory and '\n }\n message +=\n 'only contain alphanumeric characters (including !-_.*) and a valid extension.\\n\\n' +\n 'For example: TGT1/procedures/test.py or TGT2/lib/inst.rb'\n return message\n }\n if (this.type === 'save' && this.selectedFile.match(/\\*$/)) {\n let message = `${this.selectedFile} is not a valid filename. Must not end in '*'.`\n return message\n }\n return null\n },\n validFilenameRegex: function () {\n const alphanumeric = '0-9a-zA-Z'\n const charset = `${alphanumeric}\\\\/\\\\!\\\\-\\\\_\\\\.\\\\*\\\\'\\\\(\\\\)` // From https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html a-z A-Z 0-9 / ! - _ . * ' ( )\n let expression = `[${charset}]+\\\\.[${alphanumeric}]+`\n if (this.requireTargetParentDir) {\n const targets = `(${this.targets.join('|')})`\n expression = `\\\\/?${targets}\\\\/${expression}`\n }\n return new RegExp(expression)\n },\n },\n created() {\n Api.get('/openc3-api/targets').then((response) => {\n this.targets = response.data\n this.targets.push('__TEMP__') // Also support __TEMP__\n this.targets.forEach((target) => {\n // Name not found so push the item and add a children array\n this.items.push({\n id: target,\n disabled: true,\n title: target,\n children: [],\n path: target,\n })\n // Load the targets 1 by 1 in the background\n this.loadFiles(target)\n })\n this.loading = false\n })\n },\n methods: {\n calcIcon: function (filename) {\n return fileIcon(filename)\n },\n loadFiles: function (target) {\n Api.get(this.apiUrl, { params: { target } })\n .then((response) => {\n if (response.data.length === 0) {\n // Delete from items since there is no data\n this.items = this.items.filter((item) => item.id !== target)\n return\n }\n for (let file of response.data.sort()) {\n // Make a copy of the entire file path before calling insertFile\n // because insertFile does recursion and needs the original path\n this.filepath = file\n this.insertFile(this.items, 2, file)\n }\n if (this.inputFilename) {\n this.selectedFile = this.inputFilename\n }\n // Enable the target we just populated\n const index = this.items.findIndex((item) => item.id === target)\n if (index !== -1) {\n this.items[index].disabled = false\n }\n })\n .catch((error) => {\n this.$emit('error', `Failed to connect to OpenC3. ${error}`)\n })\n },\n clear: function () {\n this.show = false\n this.overwrite = false\n this.disableButtons = false\n },\n activeFile: function (file) {\n if (file.length === 0) {\n this.selectedFile = null\n } else {\n // Search through items to find the item with id\n this.selectedFile = this.findItem(this.items, file.id)\n // Select the Submit button so return opens the file\n setTimeout(() => {\n this.$refs.submitBtn.$el.focus()\n }, 100)\n }\n },\n findItem: function (items, id) {\n for (let item of items) {\n if (item.id === id) {\n return item.path\n }\n if (item.children) {\n const found = this.findItem(item.children, id)\n if (found) {\n return found\n }\n }\n }\n return null\n },\n exists: function (root, name) {\n let found = false\n for (let item of root) {\n if (item.path === name) {\n return true\n }\n if (item.path.length > 1) {\n if (item.path[item.path.length - 1] === '*') {\n // Try without the star too\n if (item.path.slice(0, item.path.length - 1) === name) {\n return true\n }\n }\n }\n if (item.children) {\n found = found || this.exists(item.children, name)\n }\n }\n return found\n },\n success: function () {\n // Only process the success call if a file is selected and no error\n if (this.selectedFile !== null && this.error === null) {\n if (this.type === 'open') {\n this.openSuccess()\n } else {\n this.saveSuccess()\n }\n }\n },\n deleteTemp: function () {\n this.$dialog\n .confirm(`Are you sure you want to delete all the temporary files?`, {\n okText: 'Delete',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n return Api.delete('/script-api/scripts/temp_files')\n })\n .then((response) => {\n this.$emit('clear-temp')\n this.loadFiles('__TEMP__')\n })\n .catch((error) => {\n this.$notify.serious({\n title: 'Error',\n body: `Failed to remove script temporary files due to ${error}`,\n })\n })\n },\n openSuccess: function () {\n // Disable the buttons because the API call can take a bit\n this.disableButtons = true\n Api.get(`${this.apiUrl}/${this.selectedFile}`)\n .then((response) => {\n const file = {\n name: this.selectedFile,\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.$emit('file', { file, locked, breakpoints })\n this.clear()\n })\n .catch((error) => {\n this.$emit('error', `Failed to open ${this.selectedFile}. ${error}`)\n this.clear()\n })\n },\n saveSuccess: function () {\n const found = this.exists(this.items, this.selectedFile)\n if (found) {\n this.$dialog\n .confirm(`Are you sure you want to overwrite: ${this.selectedFile}`, {\n okText: 'Overwrite',\n cancelText: 'Cancel',\n })\n .then((dialog) => {\n this.$emit('filename', this.selectedFile)\n this.clear()\n })\n .catch((error) => {}) // Cancel, do nothing\n } else {\n this.$emit('filename', this.selectedFile)\n this.clear()\n }\n },\n insertFile: function (root, level, path) {\n let parts = path.split('/')\n // When there is only 1 part we're at the root so push the filename\n if (parts.length === 1) {\n root.push({\n id: this.filepath,\n title: parts[0],\n file: 'ruby',\n path: this.filepath,\n })\n return\n }\n // Look for the first part of the path\n const index = root.findIndex((item) => item.title === parts[0])\n if (index === -1) {\n // Name not found so push the item and add a children array\n root.push({\n id: this.filepath\n .split('/')\n .slice(0, level - 1)\n .join('/'),\n title: parts[0],\n children: [],\n path: this.filepath\n .split('/')\n .slice(0, level - 1)\n .join('/'),\n })\n this.insertFile(\n root[root.length - 1].children, // Start from the node we just added\n level + 1,\n parts.slice(1).join('/'), // Strip the first part of the path\n )\n } else {\n // We already have something at this level so recursively\n // call the insertPart using the node we found and adjust the path\n this.insertFile(\n root[index].children,\n level + 1,\n parts.slice(1).join('/'),\n )\n }\n },\n },\n}\n</script>\n\n<style>\n.tree-container {\n background-color: var(--color-background-base-default);\n padding: 10px;\n margin-top: 5px;\n max-height: 60vh;\n font-size: large;\n}\n</style>\n","<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is free software; you can modify and/or redistribute it\n# under the terms of the GNU Affero General Public License\n# as published by the Free Software Foundation; version 3 with\n# attribution addendums as found in the LICENSE.txt\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. See the\n# GNU Affero General Public License 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# This screen expects to be inside of two parent elements.\n# An overall item, and then a container for all screens\n-->\n\n<template>\n <div :style=\"computedStyle\" ref=\"bar\">\n <v-card v-if=\"!inline\" :min-height=\"height\" :min-width=\"width\" style=\"cursor: default\">\n <v-toolbar height=\"24\">\n <div v-show=\"errors.length !== 0\">\n <v-tooltip location=\"top\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon\n data-test=\"error-graph-icon\"\n @click=\"errorDialog = true\"\n >\n mdi-alert\n </v-icon>\n </div>\n </template>\n <span> Errors </span>\n </v-tooltip>\n </div>\n <v-tooltip location=\"top\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon data-test=\"edit-screen-icon\" @click=\"openEdit\">\n mdi-pencil\n </v-icon>\n </div>\n </template>\n <span> Edit Screen </span>\n </v-tooltip>\n <v-tooltip location=\"top\" v-if=\"!fixFloated\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon data-test=\"float-screen-icon\" @click=\"floatScreen\">\n {{ floated ? 'mdi-balloon' : 'mdi-view-grid-outline' }}\n </v-icon>\n </div>\n </template>\n <span> {{ floated ? 'Unfloat Screen' : 'Float Screen' }} </span>\n </v-tooltip>\n <v-tooltip location=\"top\" v-if=\"floated\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon data-test=\"up-screen-icon\" @click=\"upScreen\">\n mdi-arrow-up\n </v-icon>\n </div>\n </template>\n <span> Move Screen Up </span>\n </v-tooltip>\n <v-tooltip location=\"top\" v-if=\"floated && zIndex > minZ\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon data-test=\"down-screen-icon\" @click=\"downScreen\">\n mdi-arrow-down\n </v-icon>\n </div>\n </template>\n <span> Move Screen Down </span>\n </v-tooltip>\n <v-spacer />\n <span> {{ target }} {{ screen }} </span>\n <v-spacer />\n <v-tooltip location=\"top\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon\n data-test=\"minimize-screen-icon\"\n @click=\"minMaxTransition\"\n v-show=\"expand\"\n >\n mdi-window-minimize\n </v-icon>\n <v-icon\n data-test=\"maximize-screen-icon\"\n @click=\"minMaxTransition\"\n v-show=\"!expand\"\n >\n mdi-window-maximize\n </v-icon>\n </div>\n </template>\n <span v-show=\"expand\"> Minimize Screen </span>\n <span v-show=\"!expand\"> Maximize Screen </span>\n </v-tooltip>\n <v-tooltip v-if=\"showClose\" location=\"top\">\n <template v-slot:activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-icon\n data-test=\"close-screen-icon\"\n @click=\"$emit('close-screen')\"\n >\n mdi-close-box\n </v-icon>\n </div>\n </template>\n <span> Close Screen </span>\n </v-tooltip>\n </v-toolbar>\n <v-expand-transition v-if=\"!editDialog\">\n <div\n class=\"pa-1\"\n style=\"position: relative\"\n ref=\"screen\"\n v-show=\"expand\"\n >\n <v-overlay\n style=\"pointer-events: none\"\n :model-value=\"errors.length !== 0\"\n opacity=\"0.8\"\n absolute\n attach\n />\n <vertical-widget\n :key=\"screenKey\"\n :widgets=\"layoutStack[0].widgets\"\n :screen-values=\"screenValues\"\n :screen-time-zone=\"timeZone\"\n v-on:add-item=\"addItem\"\n v-on:delete-item=\"deleteItem\"\n v-on:open=\"open\"\n v-on:close=\"close\"\n v-on:close-all=\"closeAll\"\n />\n </div>\n </v-expand-transition>\n </v-card>\n\n <div\n class=\"pa-1\"\n style=\"position: relative\"\n v-if=\"inline\"\n >\n <v-overlay\n style=\"pointer-events: none\"\n :model-value=\"errors.length !== 0\"\n opacity=\"0.8\"\n absolute\n attach\n />\n <vertical-widget\n :key=\"screenKey\"\n :widgets=\"layoutStack[0].widgets\"\n :screen-values=\"screenValues\"\n :screen-time-zone=\"timeZone\"\n v-on:add-item=\"addItem\"\n v-on:delete-item=\"deleteItem\"\n v-on:open=\"open\"\n v-on:close=\"close\"\n v-on:close-all=\"closeAll\"\n />\n </div>\n\n <edit-screen-dialog\n v-if=\"editDialog\"\n v-model=\"editDialog\"\n :target=\"target\"\n :screen=\"screen\"\n :definition=\"currentDefinition\"\n :keywords=\"keywords\"\n :errors=\"errors\"\n @save=\"saveEdit($event)\"\n @cancel=\"cancelEdit()\"\n @delete=\"deleteScreen()\"\n />\n\n <!-- Error dialog -->\n <v-dialog v-model=\"errorDialog\" width=\"60vw\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Screen: {{ target }} {{ screen }} Errors </span>\n <v-spacer />\n </v-toolbar>\n <v-card>\n <v-textarea class=\"errors\" readonly rows=\"13\" :model-value=\"error\" />\n </v-card>\n </v-dialog>\n </div>\n</template>\n\n<script>\nimport { uniqueId } from 'lodash'\nimport { Api, ConfigParserService, OpenC3Api } from '@openc3/js-common/services'\nimport WidgetComponents from '@/widgets/WidgetComponents'\nimport EditScreenDialog from './EditScreenDialog.vue'\n\nconst MAX_ERRORS = 20\n\nexport default {\n mixins: [WidgetComponents],\n components: {\n EditScreenDialog,\n },\n props: {\n target: {\n type: String,\n default: '',\n },\n screen: {\n type: String,\n default: '',\n },\n definition: {\n type: String,\n default: '',\n },\n keywords: {\n type: Array,\n default: () => [],\n },\n initialFloated: {\n type: Boolean,\n default: false,\n },\n initialTop: {\n type: Number,\n default: 0,\n },\n initialLeft: {\n type: Number,\n default: 0,\n },\n initialZ: {\n type: Number,\n default: 0,\n },\n minZ: {\n type: Number,\n default: 0,\n },\n fixFloated: {\n type: Boolean,\n default: false,\n },\n count: {\n type: Number,\n default: 0,\n },\n showClose: {\n type: Boolean,\n default: true,\n },\n timeZone: {\n type: String,\n default: 'local',\n },\n inline: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n api: null,\n backup: '',\n currentDefinition: this.definition,\n editDialog: false,\n expand: true,\n configParser: null,\n configError: false,\n currentLayout: null,\n layoutStack: [],\n namedWidgets: {},\n dynamicWidgets: [],\n width: null,\n height: null,\n staleTime: 30,\n cacheTimeout: 0.1,\n globalSettings: [],\n substitute: false,\n original_target_name: null,\n force_substitute: false,\n pollingPeriod: 1,\n errors: [],\n errorDialog: false,\n screenKey: null,\n dragX: 0,\n dragY: 0,\n floated: this.initialFloated,\n top: this.initialTop,\n left: this.initialLeft,\n zIndex: this.initialZ,\n changeCounter: 0,\n screenItems: [],\n screenValues: {},\n updateCounter: 0,\n screenId: uniqueId('openc3-screen_'),\n }\n },\n watch: {\n count: {\n handler(newValue, oldValue) {\n this.currentDefinition = this.definition\n this.rerender()\n },\n },\n },\n computed: {\n error: function () {\n if (this.errorDialog && this.errors.length > 0) {\n let messages = new Set()\n let result = ''\n for (const error of this.errors) {\n if (messages.has(error.message)) {\n continue\n }\n let msg = `${error.time}: (${error.type}) ${error.message}\\n`\n result += msg\n messages.add(error.message)\n }\n return result\n }\n return null\n },\n computedStyle() {\n let style = {}\n // note down what the width was in case it was set to AUTO, because absolute positioning will lose that\n const origWidth = this.width || this.$refs.bar?.clientWidth\n if (this.floated) {\n style['position'] = 'absolute'\n style['top'] = this.top + 'px'\n style['left'] = this.left + 'px'\n style['width'] = origWidth + 'px'\n }\n return style\n },\n },\n // Called when an error from any descendent component is captured\n // We need this because an error can occur from any of the children\n // in the widget stack and are typically thrown on create()\n errorCaptured(err, vm, info) {\n // eslint-disable-next-line no-console\n console.log({ err, vm, info })\n if (this.errors.length < MAX_ERRORS) {\n // eslint-disable-next-line no-console\n console.log({ errors: this.errors })\n if (err.usage) {\n this.errors.push({\n type: 'usage',\n message: err.message,\n usage: err.usage,\n line: err.line,\n lineNumber: err.lineNumber,\n time: new Date().getTime(),\n })\n } else {\n this.errors.push({\n type: 'error',\n message: err,\n time: new Date().getTime(),\n })\n }\n this.configError = true\n }\n return false\n },\n created() {\n this.api = new OpenC3Api()\n this.configParser = new ConfigParserService()\n this.parseDefinition()\n this.screenKey = Math.floor(Math.random() * 1000000)\n },\n mounted() {\n this.updateRefreshInterval()\n if (this.floated) {\n this.$refs.bar.onmousedown = this.dragMouseDown\n this.$refs.bar.parentElement.parentElement.style =\n 'z-index: ' + this.zIndex\n }\n },\n unmounted() {\n if (this.updater != null) {\n clearInterval(this.updater)\n this.updater = null\n }\n },\n methods: {\n // These are API methods that ButtonWidget uses to open and close screens\n open(target, screen) {\n this.$parent.showScreen(target, screen)\n },\n close(target, screen) {\n this.$parent.closeScreenByName(target, screen)\n },\n closeAll() {\n this.$parent.closeAll()\n },\n clearErrors: function () {\n this.errors = []\n this.configError = false\n },\n updateRefreshInterval: function () {\n let refreshInterval = this.pollingPeriod * 1000\n if (this.updater) {\n clearInterval(this.updater)\n }\n this.updater = setInterval(() => {\n this.update()\n }, refreshInterval)\n },\n parseDefinition: function () {\n // Each time we start over and parse the screen definition\n this.clearErrors()\n this.namedWidgets = {}\n this.layoutStack = []\n this.dynamicWidgets = []\n // Every screen starts with a VerticalWidget\n this.layoutStack.push({\n type: 'VerticalWidget',\n parameters: [],\n widgets: [],\n })\n this.currentLayout = this.layoutStack[this.layoutStack.length - 1]\n\n this.configParser.parse_string(\n this.currentDefinition,\n '',\n false,\n true,\n (keyword, parameters, line, lineNumber) => {\n if (keyword) {\n switch (keyword) {\n case 'SCREEN':\n this.configParser.verify_num_parameters(\n 3,\n 4,\n `${keyword} <Width or AUTO> <Height or AUTO> <Polling Period>`,\n )\n this.width = parseInt(parameters[0])\n this.height = parseInt(parameters[1])\n this.pollingPeriod = parseFloat(parameters[2])\n break\n case 'END':\n this.configParser.verify_num_parameters(0, 0, `${keyword}`)\n this.layoutStack.pop()\n this.currentLayout =\n this.layoutStack[this.layoutStack.length - 1]\n break\n case 'STALE_TIME':\n this.configParser.verify_num_parameters(\n 1,\n 1,\n `${keyword} <Time (s)>`,\n )\n this.staleTime = parseInt(parameters[0])\n break\n case 'SETTING':\n case 'SUBSETTING':\n const widget =\n this.currentLayout.widgets[\n this.currentLayout.widgets.length - 1\n ] ?? this.currentLayout\n widget.settings.push(parameters)\n break\n case 'GLOBAL_SETTING':\n case 'GLOBAL_SUBSETTING':\n this.globalSettings.push(parameters)\n break\n default:\n this.processWidget(keyword, parameters, line, lineNumber)\n break\n } // switch keyword\n } // if keyword\n },\n )\n // This can happen if there is a typo in a layout widget with a corresponding END\n if (typeof this.layoutStack[0] === 'undefined') {\n let names = []\n let lines = []\n for (const widget of this.dynamicWidgets) {\n names.push(widget.name)\n lines.push(widget.lineNumber)\n }\n // Warn about any of the Dynamic widgets we found .. they could be typos\n if (this.errors.length < MAX_ERRORS) {\n this.errors.push({\n type: 'usage',\n message: `Unknown widget! Are these widgets: ${names.join(',')}?`,\n lineNumber: lines.join(','),\n time: new Date().getTime(),\n })\n this.configError = true\n }\n // Create a simple VerticalWidget to replace the bad widget so\n // the layout stack can successfully unwind\n this.layoutStack[0] = {\n type: 'VerticalWidget',\n parameters: [],\n widgets: [],\n }\n } else {\n this.applyGlobalSettings(this.layoutStack[0].widgets)\n }\n },\n openEdit: function () {\n // Make a copy in case they edit and cancel\n this.backup = this.currentDefinition.repeat(1)\n this.editDialog = true\n },\n upScreen: function () {\n this.zIndex += 1\n this.$refs.bar.parentElement.parentElement.style =\n 'z-index: ' + this.zIndex\n this.$emit('drag-screen', [\n this.floated,\n this.top,\n this.left,\n this.zIndex,\n ])\n },\n downScreen: function () {\n if (this.zIndex > this.minZ) {\n this.zIndex -= 1\n this.$refs.bar.parentElement.parentElement.style =\n 'z-index: ' + this.zIndex\n this.$emit('drag-screen', [\n this.floated,\n this.top,\n this.left,\n this.zIndex,\n ])\n }\n },\n floatScreen: function () {\n if (this.floated) {\n this.$refs.bar.onmousedown = null\n this.$refs.bar.parentElement.parentElement.style = 'z-index: 0'\n this.floated = false\n this.$emit('unfloat-screen', [\n this.floated,\n this.top,\n this.left,\n this.zIndex,\n ])\n } else {\n let bodyRect =\n this.$refs.bar.parentElement.parentElement.parentElement.getBoundingClientRect()\n let elemRect = this.$refs.bar.getBoundingClientRect()\n this.top = elemRect.top - bodyRect.top - 5\n this.left = elemRect.left - bodyRect.left - 5\n this.$refs.bar.onmousedown = this.dragMouseDown\n this.$refs.bar.parentElement.parentElement.style =\n 'z-index: ' + this.zIndex\n this.floated = true\n this.$emit('float-screen', [\n this.floated,\n this.top,\n this.left,\n this.zIndex,\n ])\n }\n },\n dragMouseDown: function (e) {\n e = e || window.event\n e.preventDefault()\n // get the mouse cursor position at startup:\n this.dragX = e.clientX\n this.dragY = e.clientY\n document.onmouseup = this.closeDragElement\n // call a function whenever the cursor moves:\n document.onmousemove = this.elementDrag\n },\n elementDrag: function (e) {\n e = e || window.event\n e.preventDefault()\n // calculate the new cursor position:\n let xOffset = this.dragX - e.clientX\n let yOffset = this.dragY - e.clientY\n this.dragX = e.clientX\n this.dragY = e.clientY\n // set the element's new position:\n this.top = this.$refs.bar.offsetTop - yOffset\n this.left = this.$refs.bar.offsetLeft - xOffset\n this.$emit('drag-screen', [\n this.floated,\n this.top,\n this.left,\n this.zIndex,\n ])\n },\n closeDragElement: function () {\n // stop moving when mouse button is released:\n document.onmouseup = null\n document.onmousemove = null\n },\n rerender: function () {\n this.parseDefinition()\n this.updateRefreshInterval()\n // Force re-render\n this.screenKey = Math.floor(Math.random() * 1000000)\n // After re-render clear any errors\n this.$nextTick(function () {\n this.clearErrors()\n this.$emit('edit-screen')\n })\n },\n cancelEdit: function () {\n this.file = null\n this.editDialog = false\n // Restore the backup since we cancelled\n this.currentDefinition = this.backup\n this.rerender()\n },\n saveEdit: function (definition) {\n this.editDialog = false\n this.currentDefinition = definition\n this.rerender()\n this.$nextTick(function () {\n Api.post(\n '/openc3-api/screen/',\n {\n data: {\n scope: window.openc3Scope,\n target: this.target,\n screen: this.screen,\n text: this.currentDefinition,\n },\n },\n 0,\n )\n })\n },\n deleteScreen: function () {\n this.editDialog = false\n Api.delete(`/openc3-api/screen/${this.target}/${this.screen}`).then(\n (response) => {\n this.$emit('delete-screen')\n },\n )\n },\n minMaxTransition: function () {\n this.expand = !this.expand\n this.$emit('min-max-screen')\n },\n processWidget: function (keyword, parameters, line, lineNumber) {\n let widgetName = null\n if (keyword === 'NAMED_WIDGET') {\n this.configParser.verify_num_parameters(\n 2,\n null,\n `${keyword} <Widget Name> <Widget Type> <Widget Settings... (optional)>`,\n )\n widgetName = parameters[0].toUpperCase()\n keyword = parameters[1].toUpperCase()\n parameters = parameters.slice(2, parameters.length)\n }\n const componentName =\n keyword.charAt(0).toUpperCase() +\n keyword.slice(1).toLowerCase() +\n 'Widget'\n let settings = []\n // Give all the widgets a reference to this screen\n // Use settings so we don't break existing custom widgets\n settings.push(['__SCREEN_ID__', this.screenId])\n if (widgetName !== null) {\n // Push a reference to the screen so the layout can register when it is created\n // We do this because the widget isn't actually created until\n // the layout happens with <component :is='type'>\n settings.push(['NAMED_WIDGET', widgetName])\n }\n // If this is a layout widget we add it to the layoutStack and reset the currentLayout\n if (\n keyword === 'VERTICAL' ||\n keyword === 'VERTICALBOX' ||\n keyword === 'HORIZONTAL' ||\n keyword === 'HORIZONTALBOX' ||\n keyword === 'MATRIXBYCOLUMNS' ||\n keyword === 'TABBOOK' ||\n keyword === 'TABITEM' ||\n keyword === 'CANVAS' ||\n keyword === 'RADIOGROUP' ||\n keyword === 'SCROLLWINDOW'\n ) {\n const layout = {\n type: componentName,\n parameters: parameters,\n settings: settings,\n screenValues: this.screenValues,\n screenTimeZone: this.timeZone,\n widgets: [],\n }\n this.layoutStack.push(layout)\n this.currentLayout.widgets.push(layout)\n this.currentLayout = layout\n } else if (this.$options.components[componentName]) {\n this.currentLayout.widgets.push({\n type: componentName,\n target: this.target,\n parameters: parameters,\n settings: settings,\n screenValues: this.screenValues,\n screenTimeZone: this.timeZone,\n line: line,\n lineNumber: lineNumber,\n })\n } else {\n let widget = {\n type: 'DynamicWidget',\n target: this.target,\n parameters: parameters,\n settings: settings,\n screenValues: this.screenValues,\n screenTimeZone: this.timeZone,\n name: componentName,\n line: line,\n lineNumber: lineNumber,\n }\n this.currentLayout.widgets.push(widget)\n this.dynamicWidgets.push(widget)\n }\n },\n applyGlobalSettings: function (widgets) {\n widgets.forEach((widget) => {\n this.globalSettings.forEach((setting) => {\n // widget.type is already the full camelcase widget name like LabelWidget\n // so we have to lower case both and tack on 'widget' to compare\n if (\n widget.type.toLowerCase() ===\n setting[0].toLowerCase() + 'widget'\n ) {\n widget.settings.push(setting.slice(1))\n }\n })\n // Recursively apply to all widgets contained in layouts\n if (widget.widgets) {\n this.applyGlobalSettings(widget.widgets)\n }\n })\n },\n update: function () {\n if (this.screenItems.length !== 0 && this.configError === false) {\n this.api\n .get_tlm_values(this.screenItems, this.staleTime, this.cacheTimeout)\n .then((data) => {\n this.clearErrors()\n this.updateValues(data)\n })\n .catch((error) => {\n let message = JSON.stringify(error, null, 2)\n // Anything other than 'no response received' which means the API server is down\n // is an error the user needs to fix so don't request values until they do\n if (!message.includes('no response received')) {\n this.configError = true\n }\n if (\n !this.errors.find((existing) => {\n return existing.message === message\n })\n ) {\n if (this.errors.length < MAX_ERRORS) {\n this.errors.push({\n type: 'error',\n message: message,\n time: new Date().getTime(),\n })\n }\n }\n })\n }\n },\n updateValues: function (values) {\n this.updateCounter += 1\n for (let i = 0; i < values.length; i++) {\n values[i].push(this.updateCounter)\n this.screenValues[this.screenItems[i]] = values[i]\n }\n },\n addItem: function (valueId) {\n this.screenItems.push(valueId)\n this.screenValues[valueId] = [null, null, 0]\n },\n deleteItem: function (valueId) {\n let index = this.screenItems.indexOf(valueId)\n this.screenItems.splice(index, 1)\n },\n },\n}\n</script>\n\n<style scoped>\n.errors {\n padding-top: 0px;\n margin-top: 0px;\n}\n.v-textarea :deep(textarea) {\n padding: 5px;\n -webkit-mask-image: unset;\n mask-image: unset;\n}\n</style>\n"],"names":["ScreenCompleter","Api","response","OpenC3Api","editor","session","pos","prefix","callback","parsedLine","suggestions","x","result","more","current","acc","curr","target_name","pkt","packet_name","item","completions","_sfc_main","messages","sortedErrors","a","b","error","msg","value","ace.edit","screenMode","AceEditorUtils","event","position","token","oop","ace.require","TextHighlightRules","list","OpenC3HighlightRules","Mode","TextMode","blob","link","fileReader","that","dialog","_hoisted_1","_hoisted_2","_hoisted_3","_createBlock","_component_v_dialog","$options","_cache","$event","_withCtx","_createVNode","_component_v_card","_component_v_toolbar","_createElementVNode","_component_v_tooltip","props","_normalizeProps","_guardReactiveProps","_component_v_icon","_createTextVNode","_component_v_spacer","_toDisplayString","$props","_component_v_card_text","_component_v_row","_component_v_btn","$data","_component_v_file_input","_withModifiers","args","_component_v_menu","_component_v_list","_component_v_list_item","_component_v_list_item_title","_component_v_divider","_openBlock","_createElementBlock","_Fragment","_renderList","index","_ctx","alertEvent","env","_component_v_text_field","_component_v_data_table","_component_v_col","__props","isOpen","ref","showNode","computed","_nodeOrChildMatchesSearch","node","_a","watch","newpath","newSearch","toggle","emit","__emit","handleClick","bubbleNodeToggled","nodeName","bubbleNodeRequest","TreeNode","message","alphanumeric","expression","target","filename","fileIcon","file","items","id","found","root","name","locked","breakpoints","level","path","parts","_withKeys","_component_v_overlay","_component_v_progress_circular","_component_tree_node","MAX_ERRORS","WidgetComponents","EditScreenDialog","uniqueId","newValue","oldValue","style","origWidth","err","vm","info","ConfigParserService","screen","refreshInterval","keyword","parameters","line","lineNumber","names","lines","widget","bodyRect","elemRect","e","xOffset","yOffset","definition","widgetName","componentName","settings","layout","widgets","setting","data","existing","values","i","valueId","_normalizeStyle","_createCommentVNode","_vShow","_withDirectives","_component_v_expand_transition","_component_vertical_widget","_component_edit_screen_dialog","_component_v_textarea"],"mappings":"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"}
|