@openc3/vue-common 6.9.2 → 6.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/dist/{ArrayWidget-Barb7cCJ.cjs → ArrayWidget-ByKRAWXn.cjs} +2 -2
  2. package/dist/{ArrayWidget-Barb7cCJ.cjs.map → ArrayWidget-ByKRAWXn.cjs.map} +1 -1
  3. package/dist/{ArrayWidget-DUTccTH3.js → ArrayWidget-CR7Wpw3N.js} +4 -4
  4. package/dist/{ArrayWidget-DUTccTH3.js.map → ArrayWidget-CR7Wpw3N.js.map} +1 -1
  5. package/dist/{ArrayplotWidget-CQRRIpFr.cjs → ArrayplotWidget-Cty7KQ_h.cjs} +2 -2
  6. package/dist/{ArrayplotWidget-CQRRIpFr.cjs.map → ArrayplotWidget-Cty7KQ_h.cjs.map} +1 -1
  7. package/dist/{ArrayplotWidget-BeNF76NM.js → ArrayplotWidget-DDEd-jRJ.js} +3 -3
  8. package/dist/{ArrayplotWidget-BeNF76NM.js.map → ArrayplotWidget-DDEd-jRJ.js.map} +1 -1
  9. package/dist/{BarColumn-ooUZaRUq.cjs → BarColumn-BZSUr33b.cjs} +2 -2
  10. package/dist/{BarColumn-ooUZaRUq.cjs.map → BarColumn-BZSUr33b.cjs.map} +1 -1
  11. package/dist/{BarColumn-Dn6MDJoo.js → BarColumn-XWs-3Cwb.js} +3 -3
  12. package/dist/{BarColumn-Dn6MDJoo.js.map → BarColumn-XWs-3Cwb.js.map} +1 -1
  13. package/dist/{BlockWidget-BDkZljH8.cjs → BlockWidget-BDzoqpxO.cjs} +2 -2
  14. package/dist/{BlockWidget-BDkZljH8.cjs.map → BlockWidget-BDzoqpxO.cjs.map} +1 -1
  15. package/dist/{BlockWidget-BXQlPVQI.js → BlockWidget-CfFgdNSv.js} +4 -4
  16. package/dist/{BlockWidget-BXQlPVQI.js.map → BlockWidget-CfFgdNSv.js.map} +1 -1
  17. package/dist/{ButtonWidget-5ybX-zVD.cjs → ButtonWidget-BBMDS_YF.cjs} +3 -3
  18. package/dist/{ButtonWidget-5ybX-zVD.cjs.map → ButtonWidget-BBMDS_YF.cjs.map} +1 -1
  19. package/dist/{ButtonWidget-D8ncnhlr.js → ButtonWidget-BaSvtElA.js} +10 -10
  20. package/dist/{ButtonWidget-D8ncnhlr.js.map → ButtonWidget-BaSvtElA.js.map} +1 -1
  21. package/dist/{CanvasWidget-D4ZHOTxU.cjs → CanvasWidget-CFNpgqfW.cjs} +2 -2
  22. package/dist/{CanvasWidget-D4ZHOTxU.cjs.map → CanvasWidget-CFNpgqfW.cjs.map} +1 -1
  23. package/dist/{CanvasWidget-IkZPgKME.js → CanvasWidget-DcwDi5Zk.js} +2 -2
  24. package/dist/{CanvasWidget-IkZPgKME.js.map → CanvasWidget-DcwDi5Zk.js.map} +1 -1
  25. package/dist/{CanvasdotWidget-Ceu6X0ma.js → CanvasdotWidget--awMOWyz.js} +2 -2
  26. package/dist/{CanvasdotWidget-Ceu6X0ma.js.map → CanvasdotWidget--awMOWyz.js.map} +1 -1
  27. package/dist/{CanvasdotWidget-C_M5yCv9.cjs → CanvasdotWidget-BZ9TrTvw.cjs} +2 -2
  28. package/dist/{CanvasdotWidget-C_M5yCv9.cjs.map → CanvasdotWidget-BZ9TrTvw.cjs.map} +1 -1
  29. package/dist/{CanvasimageWidget-BiWHp93X.cjs → CanvasimageWidget-Dk15uRRu.cjs} +2 -2
  30. package/dist/{CanvasimageWidget-BiWHp93X.cjs.map → CanvasimageWidget-Dk15uRRu.cjs.map} +1 -1
  31. package/dist/{CanvasimageWidget-Bnx5rUVW.js → CanvasimageWidget-YP1pCtvb.js} +3 -3
  32. package/dist/{CanvasimageWidget-Bnx5rUVW.js.map → CanvasimageWidget-YP1pCtvb.js.map} +1 -1
  33. package/dist/{CanvasimagevalueWidget-CVdY8iLq.cjs → CanvasimagevalueWidget-BQHjJCuq.cjs} +2 -2
  34. package/dist/{CanvasimagevalueWidget-CVdY8iLq.cjs.map → CanvasimagevalueWidget-BQHjJCuq.cjs.map} +1 -1
  35. package/dist/{CanvasimagevalueWidget-CFO-XDML.js → CanvasimagevalueWidget-CjVHb2uj.js} +3 -3
  36. package/dist/{CanvasimagevalueWidget-CFO-XDML.js.map → CanvasimagevalueWidget-CjVHb2uj.js.map} +1 -1
  37. package/dist/{CanvaslabelWidget-C5wyN8dS.js → CanvaslabelWidget-DoMplTTO.js} +2 -2
  38. package/dist/{CanvaslabelWidget-C5wyN8dS.js.map → CanvaslabelWidget-DoMplTTO.js.map} +1 -1
  39. package/dist/{CanvaslabelWidget-U4P4GDpI.cjs → CanvaslabelWidget-Dw1YmiY0.cjs} +2 -2
  40. package/dist/{CanvaslabelWidget-U4P4GDpI.cjs.map → CanvaslabelWidget-Dw1YmiY0.cjs.map} +1 -1
  41. package/dist/{CanvaslabelvalueWidget-C60wTi40.cjs → CanvaslabelvalueWidget-BYmsu9r_.cjs} +2 -2
  42. package/dist/{CanvaslabelvalueWidget-C60wTi40.cjs.map → CanvaslabelvalueWidget-BYmsu9r_.cjs.map} +1 -1
  43. package/dist/{CanvaslabelvalueWidget-CXr6zhdn.js → CanvaslabelvalueWidget-Dyo_ogHn.js} +2 -2
  44. package/dist/{CanvaslabelvalueWidget-CXr6zhdn.js.map → CanvaslabelvalueWidget-Dyo_ogHn.js.map} +1 -1
  45. package/dist/{CanvaslineWidget-DW2l3EAG.js → CanvaslineWidget-D7W1TIxm.js} +2 -2
  46. package/dist/{CanvaslineWidget-DW2l3EAG.js.map → CanvaslineWidget-D7W1TIxm.js.map} +1 -1
  47. package/dist/{CanvaslineWidget-CzOtvkcR.cjs → CanvaslineWidget-tm194dw1.cjs} +2 -2
  48. package/dist/{CanvaslineWidget-CzOtvkcR.cjs.map → CanvaslineWidget-tm194dw1.cjs.map} +1 -1
  49. package/dist/{CanvaslinevalueWidget-UJ0xa8-8.js → CanvaslinevalueWidget-BOZyJuLE.js} +2 -2
  50. package/dist/{CanvaslinevalueWidget-UJ0xa8-8.js.map → CanvaslinevalueWidget-BOZyJuLE.js.map} +1 -1
  51. package/dist/{CanvaslinevalueWidget-D20bbhm_.cjs → CanvaslinevalueWidget-DM5c-ciY.cjs} +2 -2
  52. package/dist/{CanvaslinevalueWidget-D20bbhm_.cjs.map → CanvaslinevalueWidget-DM5c-ciY.cjs.map} +1 -1
  53. package/dist/{CheckbuttonWidget-BF5cvQHd.js → CheckbuttonWidget-B1E4BC6v.js} +2 -2
  54. package/dist/{CheckbuttonWidget-BF5cvQHd.js.map → CheckbuttonWidget-B1E4BC6v.js.map} +1 -1
  55. package/dist/{CheckbuttonWidget-dStQF0Yp.cjs → CheckbuttonWidget-BSvTWD3x.cjs} +2 -2
  56. package/dist/{CheckbuttonWidget-dStQF0Yp.cjs.map → CheckbuttonWidget-BSvTWD3x.cjs.map} +1 -1
  57. package/dist/{ClassificationBanners-CTChOmRf.cjs → ClassificationBanners-CzZoKcRy.cjs} +2 -2
  58. package/dist/{ClassificationBanners-CTChOmRf.cjs.map → ClassificationBanners-CzZoKcRy.cjs.map} +1 -1
  59. package/dist/{ClassificationBanners-CDc_06x9.js → ClassificationBanners-DQeVwmYp.js} +2 -2
  60. package/dist/{ClassificationBanners-CDc_06x9.js.map → ClassificationBanners-DQeVwmYp.js.map} +1 -1
  61. package/dist/{ComboboxWidget-Di1O9VBF.js → ComboboxWidget-BExUBH57.js} +2 -2
  62. package/dist/{ComboboxWidget-Di1O9VBF.js.map → ComboboxWidget-BExUBH57.js.map} +1 -1
  63. package/dist/{ComboboxWidget-D4h-0V0x.cjs → ComboboxWidget-B_KAnIVB.cjs} +2 -2
  64. package/dist/{ComboboxWidget-D4h-0V0x.cjs.map → ComboboxWidget-B_KAnIVB.cjs.map} +1 -1
  65. package/dist/{CriticalCmdDialog-CZHVDFjK.js → CriticalCmdDialog-BtzhxuZi.js} +16 -16
  66. package/dist/CriticalCmdDialog-BtzhxuZi.js.map +1 -0
  67. package/dist/{CriticalCmdDialog-EvK998xs.cjs → CriticalCmdDialog-CeohXoAG.cjs} +2 -2
  68. package/dist/CriticalCmdDialog-CeohXoAG.cjs.map +1 -0
  69. package/dist/{DateWidget-GiUOvEZO.js → DateWidget-_ZmPsi2l.js} +2 -2
  70. package/dist/{DateWidget-GiUOvEZO.js.map → DateWidget-_ZmPsi2l.js.map} +1 -1
  71. package/dist/{DateWidget-BAFINBB6.cjs → DateWidget-kTJBAHVp.cjs} +2 -2
  72. package/dist/{DateWidget-BAFINBB6.cjs.map → DateWidget-kTJBAHVp.cjs.map} +1 -1
  73. package/dist/DetailsDialog-Bc_VEG95.cjs +2 -0
  74. package/dist/DetailsDialog-Bc_VEG95.cjs.map +1 -0
  75. package/dist/{DetailsDialog-Ji0jA6sd.js → DetailsDialog-Bq7SS7bc.js} +76 -73
  76. package/dist/DetailsDialog-Bq7SS7bc.js.map +1 -0
  77. package/dist/{EventListDialog-CEDNXaKw.cjs → EventListDialog-Dycx70tY.cjs} +2 -2
  78. package/dist/{EventListDialog-CEDNXaKw.cjs.map → EventListDialog-Dycx70tY.cjs.map} +1 -1
  79. package/dist/{EventListDialog-BLLIQyah.js → EventListDialog-jdNF3szO.js} +3 -3
  80. package/dist/{EventListDialog-BLLIQyah.js.map → EventListDialog-jdNF3szO.js.map} +1 -1
  81. package/dist/{FormatvalueWidget-JVEG-72b.js → FormatvalueWidget-4C0vrL2i.js} +3 -3
  82. package/dist/{FormatvalueWidget-JVEG-72b.js.map → FormatvalueWidget-4C0vrL2i.js.map} +1 -1
  83. package/dist/{FormatvalueWidget-DJkp_gM_.cjs → FormatvalueWidget-CVoJgFJA.cjs} +2 -2
  84. package/dist/{FormatvalueWidget-DJkp_gM_.cjs.map → FormatvalueWidget-CVoJgFJA.cjs.map} +1 -1
  85. package/dist/{Graph-B3v4RJRC.js → Graph-B7KPo9Ul.js} +3 -3
  86. package/dist/{Graph-B3v4RJRC.js.map → Graph-B7KPo9Ul.js.map} +1 -1
  87. package/dist/{Graph-BOZlkDbl.cjs → Graph-C9FS6KR3.cjs} +2 -2
  88. package/dist/{Graph-BOZlkDbl.cjs.map → Graph-C9FS6KR3.cjs.map} +1 -1
  89. package/dist/{GraphWidget-DGe0TweO.js → GraphWidget-BpkPpAbd.js} +2 -2
  90. package/dist/{GraphWidget-DGe0TweO.js.map → GraphWidget-BpkPpAbd.js.map} +1 -1
  91. package/dist/{GraphWidget-DD7SIV2k.cjs → GraphWidget-D3HueIZi.cjs} +2 -2
  92. package/dist/{GraphWidget-DD7SIV2k.cjs.map → GraphWidget-D3HueIZi.cjs.map} +1 -1
  93. package/dist/{HorizontalWidget-CIDUx-Qp.cjs → HorizontalWidget-CN6goWHY.cjs} +2 -2
  94. package/dist/{HorizontalWidget-CIDUx-Qp.cjs.map → HorizontalWidget-CN6goWHY.cjs.map} +1 -1
  95. package/dist/{HorizontalWidget-B_JnT2Q0.js → HorizontalWidget-DbEQYjFC.js} +2 -2
  96. package/dist/{HorizontalWidget-B_JnT2Q0.js.map → HorizontalWidget-DbEQYjFC.js.map} +1 -1
  97. package/dist/{HorizontalboxWidget-D_1bF3p-.js → HorizontalboxWidget-CTomf_Iy.js} +5 -5
  98. package/dist/{HorizontalboxWidget-D_1bF3p-.js.map → HorizontalboxWidget-CTomf_Iy.js.map} +1 -1
  99. package/dist/{HorizontalboxWidget-BQYyunr-.cjs → HorizontalboxWidget-ysq7slso.cjs} +2 -2
  100. package/dist/{HorizontalboxWidget-BQYyunr-.cjs.map → HorizontalboxWidget-ysq7slso.cjs.map} +1 -1
  101. package/dist/{HorizontallineWidget-Bqb82J2C.js → HorizontallineWidget-B7xx7ofY.js} +2 -2
  102. package/dist/{HorizontallineWidget-Bqb82J2C.js.map → HorizontallineWidget-B7xx7ofY.js.map} +1 -1
  103. package/dist/{HorizontallineWidget-dYDzYNW1.cjs → HorizontallineWidget-BgXZZymr.cjs} +2 -2
  104. package/dist/{HorizontallineWidget-dYDzYNW1.cjs.map → HorizontallineWidget-BgXZZymr.cjs.map} +1 -1
  105. package/dist/{IframeWidget-BUOO2Zav.js → IframeWidget-DK7rbULe.js} +2 -2
  106. package/dist/{IframeWidget-BUOO2Zav.js.map → IframeWidget-DK7rbULe.js.map} +1 -1
  107. package/dist/{IframeWidget-92T3yaK4.cjs → IframeWidget-fV9e-Nm1.cjs} +2 -2
  108. package/dist/{IframeWidget-92T3yaK4.cjs.map → IframeWidget-fV9e-Nm1.cjs.map} +1 -1
  109. package/dist/{ImageLoader-C6RNmpHN.js → ImageLoader-C9rN_pSY.js} +2 -2
  110. package/dist/{ImageLoader-C6RNmpHN.js.map → ImageLoader-C9rN_pSY.js.map} +1 -1
  111. package/dist/{ImageLoader-Dq0Qs61n.cjs → ImageLoader-CJxiBXAL.cjs} +2 -2
  112. package/dist/{ImageLoader-Dq0Qs61n.cjs.map → ImageLoader-CJxiBXAL.cjs.map} +1 -1
  113. package/dist/{ImageviewerWidget-Fd7r9VTx.js → ImageviewerWidget-6d6Kl3W_.js} +2 -2
  114. package/dist/{ImageviewerWidget-Fd7r9VTx.js.map → ImageviewerWidget-6d6Kl3W_.js.map} +1 -1
  115. package/dist/{ImageviewerWidget-Y6xx7zZX.cjs → ImageviewerWidget-CULuNsiD.cjs} +2 -2
  116. package/dist/{ImageviewerWidget-Y6xx7zZX.cjs.map → ImageviewerWidget-CULuNsiD.cjs.map} +1 -1
  117. package/dist/{InterfacesTab-DgLHHNke.cjs → InterfacesTab-0pmK3KNu.cjs} +2 -2
  118. package/dist/{InterfacesTab-DgLHHNke.cjs.map → InterfacesTab-0pmK3KNu.cjs.map} +1 -1
  119. package/dist/{InterfacesTab-dig9pzGg.js → InterfacesTab-BCqTanhV.js} +7 -7
  120. package/dist/{InterfacesTab-dig9pzGg.js.map → InterfacesTab-BCqTanhV.js.map} +1 -1
  121. package/dist/{LabelWidget-BVxcrEXf.js → LabelWidget-D71FfOSw.js} +2 -2
  122. package/dist/{LabelWidget-BVxcrEXf.js.map → LabelWidget-D71FfOSw.js.map} +1 -1
  123. package/dist/{LabelWidget-BqN6Noag.cjs → LabelWidget-DdZz2NWv.cjs} +2 -2
  124. package/dist/{LabelWidget-BqN6Noag.cjs.map → LabelWidget-DdZz2NWv.cjs.map} +1 -1
  125. package/dist/{LabelledWidget-eR2Dar84.cjs → LabelledWidget-BZ319slb.cjs} +2 -2
  126. package/dist/{LabelledWidget-eR2Dar84.cjs.map → LabelledWidget-BZ319slb.cjs.map} +1 -1
  127. package/dist/{LabelledWidget-ZZJPwPpI.js → LabelledWidget-D2ir5kVU.js} +4 -4
  128. package/dist/{LabelledWidget-ZZJPwPpI.js.map → LabelledWidget-D2ir5kVU.js.map} +1 -1
  129. package/dist/{LabelprogressbarWidget-C2vkWITx.js → LabelprogressbarWidget-C4_YbROz.js} +4 -4
  130. package/dist/{LabelprogressbarWidget-C2vkWITx.js.map → LabelprogressbarWidget-C4_YbROz.js.map} +1 -1
  131. package/dist/{LabelprogressbarWidget-D-Oxgeeg.cjs → LabelprogressbarWidget-LyevJNuz.cjs} +2 -2
  132. package/dist/{LabelprogressbarWidget-D-Oxgeeg.cjs.map → LabelprogressbarWidget-LyevJNuz.cjs.map} +1 -1
  133. package/dist/{LabelsparklineWidget-B0q6o8ro.cjs → LabelsparklineWidget-Cbug97Ne.cjs} +2 -2
  134. package/dist/{LabelsparklineWidget-B0q6o8ro.cjs.map → LabelsparklineWidget-Cbug97Ne.cjs.map} +1 -1
  135. package/dist/{LabelsparklineWidget-CSlvTtVj.js → LabelsparklineWidget-CdZ_pM2B.js} +4 -4
  136. package/dist/{LabelsparklineWidget-CSlvTtVj.js.map → LabelsparklineWidget-CdZ_pM2B.js.map} +1 -1
  137. package/dist/{LabelvalueWidget-6MxCpBTc.js → LabelvalueWidget-BS0EPY5h.js} +4 -4
  138. package/dist/{LabelvalueWidget-6MxCpBTc.js.map → LabelvalueWidget-BS0EPY5h.js.map} +1 -1
  139. package/dist/{LabelvalueWidget-DbCpaJBW.cjs → LabelvalueWidget-DSHwAKma.cjs} +2 -2
  140. package/dist/{LabelvalueWidget-DbCpaJBW.cjs.map → LabelvalueWidget-DSHwAKma.cjs.map} +1 -1
  141. package/dist/{LabelvaluedescWidget-BzcfT8oZ.cjs → LabelvaluedescWidget-3lwQxkKj.cjs} +2 -2
  142. package/dist/{LabelvaluedescWidget-BzcfT8oZ.cjs.map → LabelvaluedescWidget-3lwQxkKj.cjs.map} +1 -1
  143. package/dist/{LabelvaluedescWidget-8mNs15uI.js → LabelvaluedescWidget-Cpr8_Voq.js} +5 -5
  144. package/dist/{LabelvaluedescWidget-8mNs15uI.js.map → LabelvaluedescWidget-Cpr8_Voq.js.map} +1 -1
  145. package/dist/{LabelvaluelimitsbarWidget-jeDT8JjR.js → LabelvaluelimitsbarWidget-DTcYbEQS.js} +4 -4
  146. package/dist/{LabelvaluelimitsbarWidget-jeDT8JjR.js.map → LabelvaluelimitsbarWidget-DTcYbEQS.js.map} +1 -1
  147. package/dist/{LabelvaluelimitsbarWidget-Cc7NNKOt.cjs → LabelvaluelimitsbarWidget-DbO_Q5ex.cjs} +2 -2
  148. package/dist/{LabelvaluelimitsbarWidget-Cc7NNKOt.cjs.map → LabelvaluelimitsbarWidget-DbO_Q5ex.cjs.map} +1 -1
  149. package/dist/{LabelvaluelimitscolumnWidget-CNqHPGpL.cjs → LabelvaluelimitscolumnWidget-BMSwK1Ys.cjs} +2 -2
  150. package/dist/{LabelvaluelimitscolumnWidget-CNqHPGpL.cjs.map → LabelvaluelimitscolumnWidget-BMSwK1Ys.cjs.map} +1 -1
  151. package/dist/{LabelvaluelimitscolumnWidget-DfO5Yb79.js → LabelvaluelimitscolumnWidget-D0ltQ9Ta.js} +5 -5
  152. package/dist/{LabelvaluelimitscolumnWidget-DfO5Yb79.js.map → LabelvaluelimitscolumnWidget-D0ltQ9Ta.js.map} +1 -1
  153. package/dist/{LabelvaluerangebarWidget-CnDgjH-G.cjs → LabelvaluerangebarWidget-B6_alHq4.cjs} +2 -2
  154. package/dist/{LabelvaluerangebarWidget-CnDgjH-G.cjs.map → LabelvaluerangebarWidget-B6_alHq4.cjs.map} +1 -1
  155. package/dist/{LabelvaluerangebarWidget-D23BEk-N.js → LabelvaluerangebarWidget-O8IHjvHs.js} +4 -4
  156. package/dist/{LabelvaluerangebarWidget-D23BEk-N.js.map → LabelvaluerangebarWidget-O8IHjvHs.js.map} +1 -1
  157. package/dist/Layout-DDewLzbI.cjs +2 -0
  158. package/dist/{Layout-Dd5e3p-K.cjs.map → Layout-DDewLzbI.cjs.map} +1 -1
  159. package/dist/{Layout-DuiUWxWc.js → Layout-DW5yNlp7.js} +2 -2
  160. package/dist/{Layout-DuiUWxWc.js.map → Layout-DW5yNlp7.js.map} +1 -1
  161. package/dist/{LedWidget-CQkF1v5x.cjs → LedWidget-Cif7vC7q.cjs} +2 -2
  162. package/dist/{LedWidget-CQkF1v5x.cjs.map → LedWidget-Cif7vC7q.cjs.map} +1 -1
  163. package/dist/{LedWidget-9IAav1IH.js → LedWidget-DUvJ2v8k.js} +4 -4
  164. package/dist/{LedWidget-9IAav1IH.js.map → LedWidget-DUvJ2v8k.js.map} +1 -1
  165. package/dist/{LimitsbarWidget-DqaTaWO1.js → LimitsbarWidget-BehZv0-k.js} +2 -2
  166. package/dist/{LimitsbarWidget-DqaTaWO1.js.map → LimitsbarWidget-BehZv0-k.js.map} +1 -1
  167. package/dist/{LimitsbarWidget-C4jNTGa9.cjs → LimitsbarWidget-BodNPbuH.cjs} +2 -2
  168. package/dist/{LimitsbarWidget-C4jNTGa9.cjs.map → LimitsbarWidget-BodNPbuH.cjs.map} +1 -1
  169. package/dist/{LimitscolorWidget-BjlXWw_j.cjs → LimitscolorWidget-DPhymKgB.cjs} +2 -2
  170. package/dist/{LimitscolorWidget-BjlXWw_j.cjs.map → LimitscolorWidget-DPhymKgB.cjs.map} +1 -1
  171. package/dist/{LimitscolorWidget-4g3UVzsW.js → LimitscolorWidget-FXT0ZPPH.js} +2 -2
  172. package/dist/{LimitscolorWidget-4g3UVzsW.js.map → LimitscolorWidget-FXT0ZPPH.js.map} +1 -1
  173. package/dist/{LimitscolumnWidget-BLZE1Zfh.cjs → LimitscolumnWidget-C5yozwf0.cjs} +2 -2
  174. package/dist/{LimitscolumnWidget-BLZE1Zfh.cjs.map → LimitscolumnWidget-C5yozwf0.cjs.map} +1 -1
  175. package/dist/{LimitscolumnWidget-pR-tLgFG.js → LimitscolumnWidget-CjBy-CCI.js} +2 -2
  176. package/dist/{LimitscolumnWidget-pR-tLgFG.js.map → LimitscolumnWidget-CjBy-CCI.js.map} +1 -1
  177. package/dist/{LinegraphWidget-adpA8cjD.cjs → LinegraphWidget-dO_B0T3E.cjs} +2 -2
  178. package/dist/{LinegraphWidget-adpA8cjD.cjs.map → LinegraphWidget-dO_B0T3E.cjs.map} +1 -1
  179. package/dist/{LinegraphWidget-DMcegwyu.js → LinegraphWidget-lmu_tFKd.js} +4 -4
  180. package/dist/{LinegraphWidget-DMcegwyu.js.map → LinegraphWidget-lmu_tFKd.js.map} +1 -1
  181. package/dist/{MatrixbycolumnsWidget-2lqTNOqb.cjs → MatrixbycolumnsWidget-BLkwvpMk.cjs} +2 -2
  182. package/dist/{MatrixbycolumnsWidget-2lqTNOqb.cjs.map → MatrixbycolumnsWidget-BLkwvpMk.cjs.map} +1 -1
  183. package/dist/{MatrixbycolumnsWidget--31rW1Mx.js → MatrixbycolumnsWidget-CCF7rCkV.js} +3 -3
  184. package/dist/{MatrixbycolumnsWidget--31rW1Mx.js.map → MatrixbycolumnsWidget-CCF7rCkV.js.map} +1 -1
  185. package/dist/{MicroservicesTab-DhisErku.js → MicroservicesTab-rxOATXLO.js} +3 -3
  186. package/dist/{MicroservicesTab-DhisErku.js.map → MicroservicesTab-rxOATXLO.js.map} +1 -1
  187. package/dist/{MicroservicesTab-BDkTm3LD.cjs → MicroservicesTab-uesXuuM4.cjs} +2 -2
  188. package/dist/{MicroservicesTab-BDkTm3LD.cjs.map → MicroservicesTab-uesXuuM4.cjs.map} +1 -1
  189. package/dist/{Openc3Screen-B_8bygux.cjs → Openc3Screen-CzD9BB0M.cjs} +5 -5
  190. package/dist/Openc3Screen-CzD9BB0M.cjs.map +1 -0
  191. package/dist/{Openc3Screen-zVSKWUkb.js → Openc3Screen-DcIIUO63.js} +120 -112
  192. package/dist/Openc3Screen-DcIIUO63.js.map +1 -0
  193. package/dist/{OutputDialog-D3zlQlpE.js → OutputDialog-CNH74LpJ.js} +2 -2
  194. package/dist/{OutputDialog-D3zlQlpE.js.map → OutputDialog-CNH74LpJ.js.map} +1 -1
  195. package/dist/{OutputDialog-DxEYVYA3.cjs → OutputDialog-QIabyvK1.cjs} +2 -2
  196. package/dist/{OutputDialog-DxEYVYA3.cjs.map → OutputDialog-QIabyvK1.cjs.map} +1 -1
  197. package/dist/{PackagesTab-Bjy3y4fK.js → PackagesTab-BE6W7Aru.js} +3 -3
  198. package/dist/{PackagesTab-Bjy3y4fK.js.map → PackagesTab-BE6W7Aru.js.map} +1 -1
  199. package/dist/{PackagesTab-CVytftqm.cjs → PackagesTab-PEPT4CQu.cjs} +2 -2
  200. package/dist/{PackagesTab-CVytftqm.cjs.map → PackagesTab-PEPT4CQu.cjs.map} +1 -1
  201. package/dist/{PluginsTab-Di5nXctJ.js → PluginsTab-B_Pf2A9c.js} +6 -5
  202. package/dist/PluginsTab-B_Pf2A9c.js.map +1 -0
  203. package/dist/{PluginsTab-BvwrAskE.cjs → PluginsTab-DXf9zX0h.cjs} +4 -4
  204. package/dist/PluginsTab-DXf9zX0h.cjs.map +1 -0
  205. package/dist/{ProgressbarWidget-DGAYHWEj.js → ProgressbarWidget-B5WN658S.js} +2 -2
  206. package/dist/{ProgressbarWidget-DGAYHWEj.js.map → ProgressbarWidget-B5WN658S.js.map} +1 -1
  207. package/dist/{ProgressbarWidget-COa_sGKn.cjs → ProgressbarWidget-D2NHSJny.cjs} +2 -2
  208. package/dist/{ProgressbarWidget-COa_sGKn.cjs.map → ProgressbarWidget-D2NHSJny.cjs.map} +1 -1
  209. package/dist/{RadiobuttonWidget-Cbx15iyl.js → RadiobuttonWidget-B_3nys46.js} +2 -2
  210. package/dist/{RadiobuttonWidget-Cbx15iyl.js.map → RadiobuttonWidget-B_3nys46.js.map} +1 -1
  211. package/dist/{RadiobuttonWidget-CQPXrm0x.cjs → RadiobuttonWidget-DkG9GtAy.cjs} +2 -2
  212. package/dist/{RadiobuttonWidget-CQPXrm0x.cjs.map → RadiobuttonWidget-DkG9GtAy.cjs.map} +1 -1
  213. package/dist/{RadiogroupWidget-DW3nTccf.js → RadiogroupWidget-BiMIL9li.js} +2 -2
  214. package/dist/{RadiogroupWidget-DW3nTccf.js.map → RadiogroupWidget-BiMIL9li.js.map} +1 -1
  215. package/dist/{RadiogroupWidget-C15ugChT.cjs → RadiogroupWidget-BnUjXU28.cjs} +2 -2
  216. package/dist/{RadiogroupWidget-C15ugChT.cjs.map → RadiogroupWidget-BnUjXU28.cjs.map} +1 -1
  217. package/dist/{RangebarWidget-5ekc5Lyp.cjs → RangebarWidget-CJgtAk5z.cjs} +2 -2
  218. package/dist/{RangebarWidget-5ekc5Lyp.cjs.map → RangebarWidget-CJgtAk5z.cjs.map} +1 -1
  219. package/dist/{RangebarWidget-BZba6dPt.js → RangebarWidget-Dn0GASdi.js} +2 -2
  220. package/dist/{RangebarWidget-BZba6dPt.js.map → RangebarWidget-Dn0GASdi.js.map} +1 -1
  221. package/dist/{RedisTab-Dnqd_dRk.js → RedisTab-BsKrL4fD.js} +13 -13
  222. package/dist/{RedisTab-Dnqd_dRk.js.map → RedisTab-BsKrL4fD.js.map} +1 -1
  223. package/dist/{RedisTab-C89xySPI.cjs → RedisTab-C1yaDRSt.cjs} +2 -2
  224. package/dist/{RedisTab-C89xySPI.cjs.map → RedisTab-C1yaDRSt.cjs.map} +1 -1
  225. package/dist/{RollupWidget-ILwSCjGa.cjs → RollupWidget-B2pGGoET.cjs} +2 -2
  226. package/dist/{RollupWidget-ILwSCjGa.cjs.map → RollupWidget-B2pGGoET.cjs.map} +1 -1
  227. package/dist/{RollupWidget-Mley0KZv.js → RollupWidget-b62qcG5K.js} +2 -2
  228. package/dist/{RollupWidget-Mley0KZv.js.map → RollupWidget-b62qcG5K.js.map} +1 -1
  229. package/dist/{RoutersTab-CokDnWfK.cjs → RoutersTab-8wGbiPCk.cjs} +2 -2
  230. package/dist/{RoutersTab-CokDnWfK.cjs.map → RoutersTab-8wGbiPCk.cjs.map} +1 -1
  231. package/dist/{RoutersTab-Dg3i3h0M.js → RoutersTab-EHz4wDCn.js} +3 -3
  232. package/dist/{RoutersTab-Dg3i3h0M.js.map → RoutersTab-EHz4wDCn.js.map} +1 -1
  233. package/dist/ScriptChooser-CtV7dDJS.cjs +2 -0
  234. package/dist/ScriptChooser-CtV7dDJS.cjs.map +1 -0
  235. package/dist/{ScriptChooser-DL8ct71n.js → ScriptChooser-DMPY3m8a.js} +33 -33
  236. package/dist/ScriptChooser-DMPY3m8a.js.map +1 -0
  237. package/dist/{ScrollwindowWidget-B4dv7icF.cjs → ScrollwindowWidget-ByJRy528.cjs} +2 -2
  238. package/dist/{ScrollwindowWidget-B4dv7icF.cjs.map → ScrollwindowWidget-ByJRy528.cjs.map} +1 -1
  239. package/dist/{ScrollwindowWidget-DvsnpEcJ.js → ScrollwindowWidget-Dn29gs-U.js} +3 -3
  240. package/dist/{ScrollwindowWidget-DvsnpEcJ.js.map → ScrollwindowWidget-Dn29gs-U.js.map} +1 -1
  241. package/dist/{SecretsTab-CIrHz_ni.js → SecretsTab-Cbt_r-1I.js} +2 -2
  242. package/dist/{SecretsTab-CIrHz_ni.js.map → SecretsTab-Cbt_r-1I.js.map} +1 -1
  243. package/dist/{SecretsTab-Dudp9OiZ.cjs → SecretsTab-DSMFodJM.cjs} +2 -2
  244. package/dist/{SecretsTab-Dudp9OiZ.cjs.map → SecretsTab-DSMFodJM.cjs.map} +1 -1
  245. package/dist/{SettingsTab-MipB-sIq.cjs → SettingsTab-8Zeg3G0C.cjs} +2 -2
  246. package/dist/{SettingsTab-MipB-sIq.cjs.map → SettingsTab-8Zeg3G0C.cjs.map} +1 -1
  247. package/dist/{SettingsTab-DztpIQm7.js → SettingsTab-L5xbCAW_.js} +4 -4
  248. package/dist/{SettingsTab-DztpIQm7.js.map → SettingsTab-L5xbCAW_.js.map} +1 -1
  249. package/dist/{SignalWidget-CQqD33Lg.cjs → SignalWidget-CEmQymzQ.cjs} +2 -2
  250. package/dist/{SignalWidget-CQqD33Lg.cjs.map → SignalWidget-CEmQymzQ.cjs.map} +1 -1
  251. package/dist/{SignalWidget-BE-MGigb.js → SignalWidget-CLi6qask.js} +2 -2
  252. package/dist/{SignalWidget-BE-MGigb.js.map → SignalWidget-CLi6qask.js.map} +1 -1
  253. package/dist/{SimpleTextDialog-BkUovtW9.js → SimpleTextDialog-8vDPDt6X.js} +2 -2
  254. package/dist/{SimpleTextDialog-BkUovtW9.js.map → SimpleTextDialog-8vDPDt6X.js.map} +1 -1
  255. package/dist/{SimpleTextDialog-NSW_V3iT.cjs → SimpleTextDialog-CJ8pLBGz.cjs} +2 -2
  256. package/dist/{SimpleTextDialog-NSW_V3iT.cjs.map → SimpleTextDialog-CJ8pLBGz.cjs.map} +1 -1
  257. package/dist/{SpacerWidget-DXayYLSi.js → SpacerWidget-BCA3gdap.js} +2 -2
  258. package/dist/{SpacerWidget-DXayYLSi.js.map → SpacerWidget-BCA3gdap.js.map} +1 -1
  259. package/dist/{SpacerWidget-QlVjOsLl.cjs → SpacerWidget-BJpqoaeP.cjs} +2 -2
  260. package/dist/{SpacerWidget-QlVjOsLl.cjs.map → SpacerWidget-BJpqoaeP.cjs.map} +1 -1
  261. package/dist/{SparklineWidget-mi0idVbP.cjs → SparklineWidget-CIkMm4O-.cjs} +2 -2
  262. package/dist/{SparklineWidget-mi0idVbP.cjs.map → SparklineWidget-CIkMm4O-.cjs.map} +1 -1
  263. package/dist/{SparklineWidget-BNYHhnFk.js → SparklineWidget-D8mb4zLt.js} +4 -4
  264. package/dist/{SparklineWidget-BNYHhnFk.js.map → SparklineWidget-D8mb4zLt.js.map} +1 -1
  265. package/dist/{TabbookWidget-BbnCFFoI.js → TabbookWidget-Bkt4g02d.js} +2 -2
  266. package/dist/{TabbookWidget-BbnCFFoI.js.map → TabbookWidget-Bkt4g02d.js.map} +1 -1
  267. package/dist/{TabbookWidget-BMaDTham.cjs → TabbookWidget-DqcScWwW.cjs} +2 -2
  268. package/dist/{TabbookWidget-BMaDTham.cjs.map → TabbookWidget-DqcScWwW.cjs.map} +1 -1
  269. package/dist/TargetPacketItemChooser-Cm6mQvhI.cjs +2 -0
  270. package/dist/TargetPacketItemChooser-Cm6mQvhI.cjs.map +1 -0
  271. package/dist/{TargetPacketItemChooser-Z0Tn5eXv.js → TargetPacketItemChooser-DGcXvdTX.js} +107 -112
  272. package/dist/TargetPacketItemChooser-DGcXvdTX.js.map +1 -0
  273. package/dist/{TargetsTab-D32K2JiE.cjs → TargetsTab-C4tQ1auc.cjs} +2 -2
  274. package/dist/{TargetsTab-D32K2JiE.cjs.map → TargetsTab-C4tQ1auc.cjs.map} +1 -1
  275. package/dist/{TargetsTab-CDd9F7X3.js → TargetsTab-c-qMsGHh.js} +12 -12
  276. package/dist/{TargetsTab-CDd9F7X3.js.map → TargetsTab-c-qMsGHh.js.map} +1 -1
  277. package/dist/{TextboxWidget-D1pZXnLn.cjs → TextboxWidget-BcRfHcF6.cjs} +2 -2
  278. package/dist/{TextboxWidget-D1pZXnLn.cjs.map → TextboxWidget-BcRfHcF6.cjs.map} +1 -1
  279. package/dist/{TextboxWidget-BmANrs4B.js → TextboxWidget-CR05wO-t.js} +4 -4
  280. package/dist/{TextboxWidget-BmANrs4B.js.map → TextboxWidget-CR05wO-t.js.map} +1 -1
  281. package/dist/{TextfieldWidget-SJaLN05z.js → TextfieldWidget-Be_Pz2bF.js} +2 -2
  282. package/dist/{TextfieldWidget-SJaLN05z.js.map → TextfieldWidget-Be_Pz2bF.js.map} +1 -1
  283. package/dist/{TextfieldWidget-CTIX-cUX.cjs → TextfieldWidget-Ct1hZr2M.cjs} +2 -2
  284. package/dist/{TextfieldWidget-CTIX-cUX.cjs.map → TextfieldWidget-Ct1hZr2M.cjs.map} +1 -1
  285. package/dist/{TimeWidget-Dytou9_B.cjs → TimeWidget-3M7CQ893.cjs} +2 -2
  286. package/dist/{TimeWidget-Dytou9_B.cjs.map → TimeWidget-3M7CQ893.cjs.map} +1 -1
  287. package/dist/{TimeWidget-jB9OkZz4.js → TimeWidget-Dy8zpkC6.js} +2 -2
  288. package/dist/{TimeWidget-jB9OkZz4.js.map → TimeWidget-Dy8zpkC6.js.map} +1 -1
  289. package/dist/{TitleWidget-mcKJD8dB.js → TitleWidget-BcmxUDzM.js} +2 -2
  290. package/dist/{TitleWidget-mcKJD8dB.js.map → TitleWidget-BcmxUDzM.js.map} +1 -1
  291. package/dist/{TitleWidget-CjgUoNOz.cjs → TitleWidget-C1qzja9l.cjs} +2 -2
  292. package/dist/{TitleWidget-CjgUoNOz.cjs.map → TitleWidget-C1qzja9l.cjs.map} +1 -1
  293. package/dist/{ToolsTab-BbUbC7aQ.js → ToolsTab-Buklih4C.js} +3 -3
  294. package/dist/{ToolsTab-BbUbC7aQ.js.map → ToolsTab-Buklih4C.js.map} +1 -1
  295. package/dist/{ToolsTab-DIjQdiL-.cjs → ToolsTab-CbY2K86w.cjs} +3 -3
  296. package/dist/{ToolsTab-DIjQdiL-.cjs.map → ToolsTab-CbY2K86w.cjs.map} +1 -1
  297. package/dist/TopBar-D4C9DJcu.js +324 -0
  298. package/dist/TopBar-D4C9DJcu.js.map +1 -0
  299. package/dist/TopBar-HxaiWynT.cjs +2 -0
  300. package/dist/TopBar-HxaiWynT.cjs.map +1 -0
  301. package/dist/{UpgradeToEnterpriseDialog-XVvb43ME.js → UpgradeToEnterpriseDialog-D0AGxldj.js} +2 -2
  302. package/dist/{UpgradeToEnterpriseDialog-XVvb43ME.js.map → UpgradeToEnterpriseDialog-D0AGxldj.js.map} +1 -1
  303. package/dist/{UpgradeToEnterpriseDialog-BDYrclMq.cjs → UpgradeToEnterpriseDialog-D8BkzmVD.cjs} +2 -2
  304. package/dist/{UpgradeToEnterpriseDialog-BDYrclMq.cjs.map → UpgradeToEnterpriseDialog-D8BkzmVD.cjs.map} +1 -1
  305. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-ByJi6BSv.js → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-B8ikVCn7.js} +2259 -2241
  306. package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-B8ikVCn7.js.map +1 -0
  307. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-B-k6legU.cjs → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-CP8T5W6m.cjs} +70 -70
  308. package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-CP8T5W6m.cjs.map +1 -0
  309. package/dist/{VWidget-D8c5Lci7.js → VWidget-CBmUpKSV.js} +7 -7
  310. package/dist/VWidget-CBmUpKSV.js.map +1 -0
  311. package/dist/VWidget-DhGLFGS2.cjs +2 -0
  312. package/dist/VWidget-DhGLFGS2.cjs.map +1 -0
  313. package/dist/{ValueWidget-SNDW9Het.js → ValueWidget-BxWrHkYY.js} +4 -4
  314. package/dist/{ValueWidget-SNDW9Het.js.map → ValueWidget-BxWrHkYY.js.map} +1 -1
  315. package/dist/{ValueWidget-CyN11MWT.cjs → ValueWidget-yuZ8tPzG.cjs} +2 -2
  316. package/dist/{ValueWidget-CyN11MWT.cjs.map → ValueWidget-yuZ8tPzG.cjs.map} +1 -1
  317. package/dist/{ValuelimitsbarWidget-Zw91SPeP.js → ValuelimitsbarWidget-BdY02gqc.js} +4 -4
  318. package/dist/{ValuelimitsbarWidget-Zw91SPeP.js.map → ValuelimitsbarWidget-BdY02gqc.js.map} +1 -1
  319. package/dist/{ValuelimitsbarWidget-B86GYsdL.cjs → ValuelimitsbarWidget-KsFz7ipK.cjs} +2 -2
  320. package/dist/{ValuelimitsbarWidget-B86GYsdL.cjs.map → ValuelimitsbarWidget-KsFz7ipK.cjs.map} +1 -1
  321. package/dist/{ValuelimitscolumnWidget-DPh3TEH4.cjs → ValuelimitscolumnWidget-B0HGnyS5.cjs} +2 -2
  322. package/dist/{ValuelimitscolumnWidget-DPh3TEH4.cjs.map → ValuelimitscolumnWidget-B0HGnyS5.cjs.map} +1 -1
  323. package/dist/{ValuelimitscolumnWidget-B9unbzmn.js → ValuelimitscolumnWidget-CuJ6rqtC.js} +4 -4
  324. package/dist/{ValuelimitscolumnWidget-B9unbzmn.js.map → ValuelimitscolumnWidget-CuJ6rqtC.js.map} +1 -1
  325. package/dist/{ValuerangebarWidget-DwNzPUzz.js → ValuerangebarWidget-C5rolGDi.js} +4 -4
  326. package/dist/{ValuerangebarWidget-DwNzPUzz.js.map → ValuerangebarWidget-C5rolGDi.js.map} +1 -1
  327. package/dist/{ValuerangebarWidget-Dm0754rv.cjs → ValuerangebarWidget-CDJeamPr.cjs} +2 -2
  328. package/dist/{ValuerangebarWidget-Dm0754rv.cjs.map → ValuerangebarWidget-CDJeamPr.cjs.map} +1 -1
  329. package/dist/{VerticalWidget-gv7hWDKU.js → VerticalWidget-DsnEzKZ2.js} +2 -2
  330. package/dist/{VerticalWidget-gv7hWDKU.js.map → VerticalWidget-DsnEzKZ2.js.map} +1 -1
  331. package/dist/{VerticalWidget-BAH0R-Tj.cjs → VerticalWidget-wuRCrd7Q.cjs} +2 -2
  332. package/dist/{VerticalWidget-BAH0R-Tj.cjs.map → VerticalWidget-wuRCrd7Q.cjs.map} +1 -1
  333. package/dist/{VerticalboxWidget-CZb5ebV7.js → VerticalboxWidget-CzDgveBl.js} +5 -5
  334. package/dist/{VerticalboxWidget-CZb5ebV7.js.map → VerticalboxWidget-CzDgveBl.js.map} +1 -1
  335. package/dist/{VerticalboxWidget-F9StIQ_8.cjs → VerticalboxWidget-D-3H1PYU.cjs} +2 -2
  336. package/dist/{VerticalboxWidget-F9StIQ_8.cjs.map → VerticalboxWidget-D-3H1PYU.cjs.map} +1 -1
  337. package/dist/{Widget-DghDRiv6.cjs → Widget-CKianvfR.cjs} +2 -2
  338. package/dist/{Widget-DghDRiv6.cjs.map → Widget-CKianvfR.cjs.map} +1 -1
  339. package/dist/{Widget-DNBZcUQg.js → Widget-VCl8Ts8s.js} +2 -2
  340. package/dist/{Widget-DNBZcUQg.js.map → Widget-VCl8Ts8s.js.map} +1 -1
  341. package/dist/{cmdUtilities-C5lf-N2L.js → cmdUtilities--4ZqS2At.js} +2 -2
  342. package/dist/{cmdUtilities-C5lf-N2L.js.map → cmdUtilities--4ZqS2At.js.map} +1 -1
  343. package/dist/cmdUtilities-N30xDV6q.cjs +2 -0
  344. package/dist/{cmdUtilities-DDCksp2R.cjs.map → cmdUtilities-N30xDV6q.cjs.map} +1 -1
  345. package/dist/components.cjs +1 -1
  346. package/dist/components.js +25 -25
  347. package/dist/composables.cjs +2 -0
  348. package/dist/composables.cjs.map +1 -0
  349. package/dist/composables.js +5 -0
  350. package/dist/composables.js.map +1 -0
  351. package/dist/{index-BUPRVmV-.js → index-3k1IXN1T.js} +136 -118
  352. package/dist/index-3k1IXN1T.js.map +1 -0
  353. package/dist/{index-BWTUBIkL.cjs → index-DlWUR7vt.cjs} +6 -6
  354. package/dist/index-DlWUR7vt.cjs.map +1 -0
  355. package/dist/plugins.cjs +2 -2
  356. package/dist/plugins.cjs.map +1 -1
  357. package/dist/plugins.js +7 -7
  358. package/dist/plugins.js.map +1 -1
  359. package/dist/purify.es-B608WQkR.cjs +3 -0
  360. package/dist/purify.es-B608WQkR.cjs.map +1 -0
  361. package/dist/{purify.es-BuxjWxA2.js → purify.es-BGaRrCfO.js} +144 -144
  362. package/dist/purify.es-BGaRrCfO.js.map +1 -0
  363. package/dist/{settings-BC-CN37t.js → settings-DlX9yvJJ.js} +2 -2
  364. package/dist/{settings-BC-CN37t.js.map → settings-DlX9yvJJ.js.map} +1 -1
  365. package/dist/{settings-DHUu0bEd.cjs → settings-sg_XHXQ-.cjs} +2 -2
  366. package/dist/{settings-DHUu0bEd.cjs.map → settings-sg_XHXQ-.cjs.map} +1 -1
  367. package/dist/tools/admin.cjs +1 -1
  368. package/dist/tools/admin.js +56 -56
  369. package/dist/tools/base.cjs +1 -1
  370. package/dist/tools/base.js +5 -5
  371. package/dist/tools/calendar.cjs +1 -1
  372. package/dist/tools/calendar.js +1 -1
  373. package/dist/tools/scriptrunner.cjs +8 -8
  374. package/dist/tools/scriptrunner.cjs.map +1 -1
  375. package/dist/tools/scriptrunner.js +864 -849
  376. package/dist/tools/scriptrunner.js.map +1 -1
  377. package/dist/useContainerHeight-BAw05dIa.js +11 -0
  378. package/dist/useContainerHeight-BAw05dIa.js.map +1 -0
  379. package/dist/useContainerHeight-BEd4f2Lr.cjs +2 -0
  380. package/dist/useContainerHeight-BEd4f2Lr.cjs.map +1 -0
  381. package/dist/util.cjs +1 -1
  382. package/dist/util.js +1 -1
  383. package/dist/vue-common.css +1 -1
  384. package/dist/widgets.cjs +1 -1
  385. package/dist/widgets.js +63 -63
  386. package/package.json +13 -9
  387. package/dist/CriticalCmdDialog-CZHVDFjK.js.map +0 -1
  388. package/dist/CriticalCmdDialog-EvK998xs.cjs.map +0 -1
  389. package/dist/DetailsDialog-DbRPJzDG.cjs +0 -2
  390. package/dist/DetailsDialog-DbRPJzDG.cjs.map +0 -1
  391. package/dist/DetailsDialog-Ji0jA6sd.js.map +0 -1
  392. package/dist/Layout-Dd5e3p-K.cjs +0 -2
  393. package/dist/Openc3Screen-B_8bygux.cjs.map +0 -1
  394. package/dist/Openc3Screen-zVSKWUkb.js.map +0 -1
  395. package/dist/PluginsTab-BvwrAskE.cjs.map +0 -1
  396. package/dist/PluginsTab-Di5nXctJ.js.map +0 -1
  397. package/dist/ScriptChooser-BzQcgW8g.cjs +0 -2
  398. package/dist/ScriptChooser-BzQcgW8g.cjs.map +0 -1
  399. package/dist/ScriptChooser-DL8ct71n.js.map +0 -1
  400. package/dist/TargetPacketItemChooser-DezS0jS3.cjs +0 -2
  401. package/dist/TargetPacketItemChooser-DezS0jS3.cjs.map +0 -1
  402. package/dist/TargetPacketItemChooser-Z0Tn5eXv.js.map +0 -1
  403. package/dist/TopBar-Bn4u3OQj.cjs +0 -2
  404. package/dist/TopBar-Bn4u3OQj.cjs.map +0 -1
  405. package/dist/TopBar-LuMoAqrA.js +0 -296
  406. package/dist/TopBar-LuMoAqrA.js.map +0 -1
  407. package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-B-k6legU.cjs.map +0 -1
  408. package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-ByJi6BSv.js.map +0 -1
  409. package/dist/VWidget-B22Re761.cjs +0 -2
  410. package/dist/VWidget-B22Re761.cjs.map +0 -1
  411. package/dist/VWidget-D8c5Lci7.js.map +0 -1
  412. package/dist/cmdUtilities-DDCksp2R.cjs +0 -2
  413. package/dist/index-BUPRVmV-.js.map +0 -1
  414. package/dist/index-BWTUBIkL.cjs.map +0 -1
  415. package/dist/purify.es-BuxjWxA2.js.map +0 -1
  416. package/dist/purify.es-d7tb6jjJ.cjs +0 -3
  417. package/dist/purify.es-d7tb6jjJ.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
- "use strict";const y=require("./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-B-k6legU.cjs"),e=require("vue"),w=require("./CustomIcon-eie3rPKh.cjs"),T=require("./fileIcon-BduOQcTc.cjs"),b=require("./TopBar-Bn4u3OQj.cjs");class k{constructor(){y.di.get("/openc3-api/autocomplete/data/screen").then(n=>{this.autocompleteData=n.data}),this.api=new y.bi}async getCompletions(n,i,s,o,l){let m=i.getLine(s.row).slice(0,s.column).trimStart().split(/ (?![^<]*>)/),d=this.autocompleteData;m.length>1&&(d=d.find(x=>x.caption===m[0]));let g={},_=!0;if(d&&d.params){d.params.length==m.length-1&&(_=!1);let x=d.params[m.length-2];if(x["Target name"])d=(await this.api.get_target_names()).reduce((r,v)=>(r[v]=1,r),{});else if(x["Packet name"]){let c=m[m.length-2];d=(await this.api.get_all_tlm(c)).reduce((v,u)=>(v[u.packet_name]=u.description,v),{})}else if(x["Item name"]){let c=m[m.length-3],r=m[m.length-2];d=(await this.api.get_tlm(c,r)).items.reduce((u,h)=>(u[h.name]=h.description,u),{})}else d=x;g=Object.keys(d||{}).map(c=>{let r={value:c+(_?" ":""),command:_&&"startAutocomplete"};return typeof d[c]=="string"&&(r.meta=d[c]),r})}else g=d;l(null,g)}}const E={props:{modelValue:Boolean,target:{type:String,default:""},screen:{type:String,default:""},definition:{type:String,default:""},keywords:{type:Array,default:()=>[]},errors:{type:Array,default:()=>[]}},emits:["cancel","delete","save","update:modelValue"],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 t=new Set,n=[];const i=this.errors.toSorted((s,o)=>s.lineNumber-o.lineNumber);for(const s of i){let o=`At ${s.lineNumber}: (${s.line}) ${s.message}.`;s.usage&&(o+=` Usage: ${s.usage}`),n.push(o),t.add(s.message)}return n}return[]},show:{get(){return this.modelValue},set(t){this.$emit("update:modelValue",t)}}},mounted:function(){this.editor=y.aceExports.edit(this.$refs.editor),this.editor.setTheme("ace/theme/twilight");const t=this.buildScreenMode();this.editor.session.setMode(new t),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(),b.AceEditorUtils.applyVimModeIfEnabled(this.editor),this.editor.focus()},beforeUnmount(){this.editor.destroy(),this.editor.container.remove()},methods:{toggleVimMode:function(){b.AceEditorUtils.toggleVimMode(this.editor)},showContextMenu:function(t){this.menuX=t.pageX,this.menuY=t.pageY;let n=this.editor.getCursorPosition(),i=this.editor.session.getTokenAt(n.row,n.column);if(i){let s=i.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 t=y.aceExports.require("ace/lib/oop"),n=y.aceExports.require("ace/mode/text_highlight_rules").TextHighlightRules,i=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*(${i})\\b`)}]},this.normalizeRules()};t.inherits(s,n);let o=function(){this.HighlightRules=s},l=y.aceExports.require("ace/mode/text").Mode;return t.inherits(o,l),(function(){this.$id="ace/mode/openc3"}).call(o.prototype),o},downloadScreen:function(){const t=new Blob([this.editor.getValue()],{type:"text/plain"}),n=document.createElement("a");n.href=URL.createObjectURL(t),n.setAttribute("download",`${this.screen.toLowerCase()}.txt`),n.click()},loadFile:function(){const t=new FileReader;t.readAsText(this.file);const n=this;t.onload=function(){n.editor.setValue(t.result),n.file=null}},deleteScreen:function(){this.$dialog.confirm("Are you sure you want to delete this screen?!",{okText:"Delete",cancelText:"Cancel"}).then(t=>{this.$emit("delete")})}}},D=["textContent"];function I(t,n,i,s,o,l){const a=e.resolveComponent("v-btn"),f=e.resolveComponent("v-spacer"),m=e.resolveComponent("v-toolbar"),d=e.resolveComponent("v-row"),g=e.resolveComponent("v-file-input"),_=e.resolveComponent("v-list-item-title"),x=e.resolveComponent("v-list-item"),c=e.resolveComponent("v-divider"),r=e.resolveComponent("v-list"),v=e.resolveComponent("v-menu"),u=e.resolveComponent("v-card-text"),h=e.resolveComponent("v-card"),C=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(C,{modelValue:l.show,"onUpdate:modelValue":n[5]||(n[5]=p=>l.show=p),persistent:"",width:"75vw",onKeydown:n[6]||(n[6]=e.withKeys(p=>t.$emit("cancel"),["esc"]))},{default:e.withCtx(()=>[e.createVNode(h,null,{default:e.withCtx(()=>[e.createVNode(m,{height:"24"},{default:e.withCtx(()=>[e.createVNode(a,{class:"mx-2",icon:"mdi-delete",variant:"text",density:"compact","data-test":"delete-screen-icon",onClick:l.deleteScreen},null,8,["onClick"]),e.createVNode(f),e.createElementVNode("span",null," Edit Screen: "+e.toDisplayString(i.target)+" "+e.toDisplayString(i.screen),1),e.createVNode(f),e.createVNode(a,{class:"mx-2",icon:"mdi-download",variant:"text",density:"compact","data-test":"download-screen-icon",onClick:l.downloadScreen},null,8,["onClick"])]),_:1}),e.createVNode(u,{style:{"max-height":"90vh"}},{default:e.withCtx(()=>[e.createVNode(d,{class:"mt-3"},{default:e.withCtx(()=>[...n[7]||(n[7]=[e.createTextVNode(" Upload a screen file. ",-1)])]),_:1}),e.createVNode(d,{"no-gutters":"",align:"center"},{default:e.withCtx(()=>[e.createVNode(a,{disabled:!o.file,color:"primary",class:"mr-3","data-test":"edit-screen-load",onClick:l.loadFile},{default:e.withCtx(()=>[...n[8]||(n[8]=[e.createTextVNode(" Load ",-1)])]),_:1},8,["disabled","onClick"]),e.createVNode(g,{modelValue:o.file,"onUpdate:modelValue":n[0]||(n[0]=p=>o.file=p),"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(()=>[...n[9]||(n[9]=[e.createTextVNode(" Edit the screen definition. ",-1)])]),_:1}),e.createVNode(d,{class:"mb-2"},{default:e.withCtx(()=>[e.createElementVNode("pre",{ref:"editor",class:"editor",onContextmenu:n[1]||(n[1]=e.withModifiers((...p)=>l.showContextMenu&&l.showContextMenu(...p),["prevent"]))},null,544),e.createVNode(v,{modelValue:o.contextMenu,"onUpdate:modelValue":n[2]||(n[2]=p=>o.contextMenu=p),target:[o.menuX,o.menuY]},{default:e.withCtx(()=>[e.createVNode(r,null,{default:e.withCtx(()=>[e.createVNode(x,{link:""},{default:e.withCtx(()=>[e.createVNode(_,{onClick:l.openDocumentation},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.docsKeyword)+" documentation ",1)]),_:1},8,["onClick"])]),_:1}),e.createVNode(c),e.createVNode(x,{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,(p,S)=>(e.openBlock(),e.createElementBlock("div",{key:S},[e.createElementVNode("span",{class:"text-red",textContent:e.toDisplayString(p)},null,8,D)]))),128))]),_:1}),e.createVNode(d,{class:"mt-5"},{default:e.withCtx(()=>[n[12]||(n[12]=e.createElementVNode("span",null," Ctrl-space brings up autocomplete. Right click keywords for documentation. ",-1)),e.createVNode(f),e.createVNode(a,{class:"mx-2",variant:"outlined","data-test":"edit-screen-cancel",onClick:n[3]||(n[3]=p=>t.$emit("cancel"))},{default:e.withCtx(()=>[...n[10]||(n[10]=[e.createTextVNode(" Cancel ",-1)])]),_:1}),e.createVNode(a,{class:"mx-2",color:"primary","data-test":"edit-screen-save",onClick:n[4]||(n[4]=p=>t.$emit("save",t.editor.getValue()))},{default:e.withCtx(()=>[...n[11]||(n[11]=[e.createTextVNode(" Save ",-1)])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])}const N=w._export_sfc(E,[["render",I],["__scopeId","data-v-00a228d0"]]),B={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(t){this.$emit("update:modelValue",t)}}},mounted(){this.update()},methods:{alertHandler:function(t){this.alert=t.text,this.alertType=t.type,this.showAlert=!0},update:function(){y.di.get("/openc3-api/environment").then(t=>{this.environment=t.data}).catch(t=>{})},addEnvironment:function(){y.di.post("/openc3-api/environment",{data:{key:this.key.toUpperCase(),value:this.keyValue}}).then(t=>{`${t.data.name}`,this.update()}).catch(t=>{const n={text:`Failed to add environment variable: ${t}`,type:"error"};this.alertHandler(n)}),this.key="",this.keyValue=""},deleteEnvironment:function(t){this.$dialog.confirm(`Are you sure you want to delete: ${t.key}=${t.value}`,{okText:"Delete",cancelText:"Cancel"}).then(n=>y.di.delete(`/openc3-api/environment/${t.name}`)).then(n=>{const i={text:`Removed environment variable: ${t.name}`,type:"success"};this.alertHandler(i),this.update()}).catch(n=>{const i={text:`Failed to delete environment: ${n}`,type:"error"};this.alertHandler(i)})}}},A={class:"pa-3"};function F(t,n,i,s,o,l){const a=e.resolveComponent("v-spacer"),f=e.resolveComponent("v-toolbar"),m=e.resolveComponent("v-text-field"),d=e.resolveComponent("v-row"),g=e.resolveComponent("v-btn"),_=e.resolveComponent("v-data-table"),x=e.resolveComponent("v-col"),c=e.resolveComponent("v-card-text"),r=e.resolveComponent("v-card"),v=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(v,{modelValue:l.show,"onUpdate:modelValue":n[4]||(n[4]=u=>l.show=u),width:"600"},{default:e.withCtx(()=>[e.createVNode(r,null,{default:e.withCtx(()=>[e.createElementVNode("form",{onSubmit:n[3]||(n[3]=e.withModifiers((...u)=>l.addEnvironment&&l.addEnvironment(...u),["prevent"]))},[e.createVNode(f,{height:"24"},{default:e.withCtx(()=>[e.createVNode(a),n[5]||(n[5]=e.createElementVNode("span",null,"Global Environment Variables",-1)),e.createVNode(a)]),_:1}),e.createVNode(c,null,{default:e.withCtx(()=>[e.createElementVNode("div",A,[e.createVNode(d,{dense:"",class:"mb-2"},{default:e.withCtx(()=>[e.createVNode(m,{modelValue:o.search,"onUpdate:modelValue":n[0]||(n[0]=u=>o.search=u),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(_,{"item-key":"name","hide-default-header":"","data-test":"env-table",search:o.search,headers:o.headers,items:o.environment,"items-per-page":5,"items-per-page-options":[5]},{"item.actions":e.withCtx(({item:u})=>[e.createVNode(g,{icon:"mdi-delete",variant:"text",class:"mt-1","data-test":"item-delete","aria-label":"Delete Environment Variable",onClick:h=>l.deleteEnvironment(u)},null,8,["onClick"])]),_:1},8,["search","headers","items"]),e.createVNode(d,{dense:""},{default:e.withCtx(()=>[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(m,{modelValue:o.key,"onUpdate:modelValue":n[1]||(n[1]=u=>o.key=u),label:"Key","data-test":"env-key"},null,8,["modelValue"])]),_:1}),e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(m,{modelValue:o.keyValue,"onUpdate:modelValue":n[2]||(n[2]=u=>o.keyValue=u),label:"Value","data-test":"env-value"},null,8,["modelValue"])]),_:1})]),_:1}),e.createVNode(d,{dense:""},{default:e.withCtx(()=>[e.createVNode(g,{block:"",type:"submit",color:"primary","data-test":"add-env",disabled:!o.key||!o.keyValue,onClick:e.withModifiers(l.addEnvironment,["prevent"])},{default:e.withCtx(()=>[...n[6]||(n[6]=[e.createTextVNode(" Add ",-1)])]),_:1},8,["disabled","onClick"])]),_:1})])]),_:1})],32)]),_:1})]),_:1},8,["modelValue"])}const M=w._export_sfc(B,[["render",F]]),O={class:"tree-node"},R={class:"content-wrapper"},L=["tabindex"],U={key:1},z={key:2,class:"children"},W={__name:"TreeNode",props:{node:{type:Object,required:!0},search:{type:String,default:""},type:{type:String,default:"open"}},emits:["nodeToggled","request"],setup(t,{emit:n}){const i=t,s=e.ref(i.node.isOpen||!1),o=e.computed(()=>{const c=r=>{var v;return!i.search||r.path.toLowerCase().includes(i.search.toLowerCase())?!0:!!((v=r.children)!=null&&v.some(c))};return c(i.node)});e.watch(()=>i.node.isOpen,c=>{s.value=c}),e.watch(()=>i.search,c=>{c?i.node.isOpen||g():i.node.isOpen&&g()});const l=n,a=e.ref({show:!1,text:"",x:0,y:0}),f=(c,r)=>{if(!r||r.length<=50)return;const v=c.target.getBoundingClientRect(),u=v.left,h=v.top;a.value.text=r,a.value.x=u,a.value.y=h-40,a.value.show=!0},m=()=>{a.value.show=!1},d=c=>{c.children?(g(),i.type==="save"&&l("request",c)):l("request",c)},g=()=>{i.node.children&&(s.value=!s.value,i.node.isOpen=s.value,l("nodeToggled",i.node.id,s.value))},_=(c,r)=>{l("nodeToggled",c,r)},x=c=>{l("request",c)};return(c,r)=>{const v=e.resolveComponent("v-tooltip"),u=e.resolveComponent("v-icon"),h=e.resolveComponent("v-btn"),C=e.resolveComponent("tree-node",!0);return e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createVNode(v,{modelValue:a.value.show,"onUpdate:modelValue":r[0]||(r[0]=p=>a.value.show=p),text:a.value.text,location:"top",style:e.normalizeStyle(`position: fixed; left: ${a.value.x}px; top: ${a.value.y}px; pointer-events: none;`)},null,8,["modelValue","text","style"]),e.createElementVNode("div",O,[o.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"node-content",onClick:r[4]||(r[4]=p=>d(t.node))},[e.createElementVNode("div",R,[t.node.children?(e.openBlock(),e.createBlock(u,{key:0,class:"toggle-icon",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.node.isOpen?"mdi-menu-down":"mdi-menu-right"),1)]),_:1})):e.createCommentVNode("",!0),t.node.children?(e.openBlock(),e.createBlock(u,{key:1,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[...r[5]||(r[5]=[e.createTextVNode(e.toDisplayString("mdi-folder"),-1)])]),_:1})):t.node.title.includes(".rb")?(e.openBlock(),e.createBlock(u,{key:2,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[...r[6]||(r[6]=[e.createTextVNode(e.toDisplayString("mdi-language-ruby"),-1)])]),_:1})):t.node.title.includes(".py")?(e.openBlock(),e.createBlock(u,{key:3,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[...r[7]||(r[7]=[e.createTextVNode(e.toDisplayString("mdi-language-python"),-1)])]),_:1})):(e.openBlock(),e.createBlock(u,{key:4,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[...r[8]||(r[8]=[e.createTextVNode(e.toDisplayString("mdi-file-document"),-1)])]),_:1})),e.createElementVNode("span",{class:"title",tabindex:t.node.children?-1:0,onKeyup:r[1]||(r[1]=e.withKeys(p=>d(t.node),["enter"])),onMouseenter:r[2]||(r[2]=p=>f(p,t.node.title)),onMouseleave:m},e.toDisplayString(t.node.title),41,L),t.node.title==="__TEMP__"?(e.openBlock(),e.createBlock(h,{key:5,icon:"mdi-delete",variant:"text",style:{"margin-left":"auto"},"aria-label":"Delete",onClick:r[3]||(r[3]=p=>l("delete"))})):e.createCommentVNode("",!0)])])):(e.openBlock(),e.createElementBlock("div",U)),t.node.children&&t.node.isOpen?(e.openBlock(),e.createElementBlock("div",z,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.node.children,p=>(e.openBlock(),e.createBlock(C,{key:p.id,node:p,search:t.search,type:t.type,onNodeToggled:_,onRequest:x},null,8,["node","search","type"]))),128))])):e.createCommentVNode("",!0)])],64)}}},P=w._export_sfc(W,[["__scopeId","data-v-9d98e565"]]),q={components:{TreeNode:P},props:{type:{type:String,required:!0,validator:function(t){return["open","save"].indexOf(t)!==-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(t){this.$emit("update:modelValue",t)}},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 t=`${this.selectedFile} is not a valid filename. Must `;return this.requireTargetParentDir&&(t+="be in a target directory and "),t+=`only contain alphanumeric characters (including !-_.*) and a valid extension.
1
+ "use strict";const y=require("./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_2c757408_lang-CP8T5W6m.cjs"),e=require("vue"),w=require("./CustomIcon-eie3rPKh.cjs"),T=require("./fileIcon-BduOQcTc.cjs"),b=require("./TopBar-HxaiWynT.cjs");class k{constructor(){y.fi.get("/openc3-api/autocomplete/data/screen").then(n=>{this.autocompleteData=n.data}),this.api=new y.yi}async getCompletions(n,i,s,o,l){let m=i.getLine(s.row).slice(0,s.column).trimStart().split(/ (?![^<]*>)/),d=this.autocompleteData;m.length>1&&(d=d.find(x=>x.caption===m[0]));let v={},_=!0;if(d&&d.params){d.params.length==m.length-1&&(_=!1);let x=d.params[m.length-2];if(x["Target name"])d=(await this.api.get_target_names()).reduce((r,p)=>(r[p]=1,r),{});else if(x["Packet name"]){let c=m[m.length-2];d=(await this.api.get_all_tlm(c)).reduce((p,u)=>(p[u.packet_name]=u.description,p),{}),d.LATEST="LATEST values from all packets"}else if(x["Item name"]){let c=m[m.length-3],r=m[m.length-2];if(r==="LATEST"){let p=await this.api.get_all_tlm_item_names(c);d={},p.forEach(u=>{d[u]=`LATEST ${u}`})}else d=(await this.api.get_tlm(c,r)).items.reduce((u,h)=>(u[h.name]=h.description,u),{})}else d=x;v=Object.keys(d||{}).map(c=>{let r={value:c+(_?" ":""),command:_&&"startAutocomplete"};return typeof d[c]=="string"&&(r.meta=d[c]),r})}else v=d;l(null,v)}}const E={props:{modelValue:Boolean,target:{type:String,default:""},screen:{type:String,default:""},definition:{type:String,default:""},keywords:{type:Array,default:()=>[]},errors:{type:Array,default:()=>[]}},emits:["cancel","delete","save","update:modelValue"],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 t=new Set,n=[];const i=this.errors.toSorted((s,o)=>s.lineNumber-o.lineNumber);for(const s of i){let o=`At ${s.lineNumber}: (${s.line}) ${s.message}.`;s.usage&&(o+=` Usage: ${s.usage}`),n.push(o),t.add(s.message)}return n}return[]},show:{get(){return this.modelValue},set(t){this.$emit("update:modelValue",t)}}},mounted:function(){this.editor=y.aceExports.edit(this.$refs.editor),this.editor.setTheme("ace/theme/twilight");const t=this.buildScreenMode();this.editor.session.setMode(new t),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(),b.AceEditorUtils.applyVimModeIfEnabled(this.editor),this.editor.focus()},beforeUnmount(){this.editor.destroy(),this.editor.container.remove()},methods:{toggleVimMode:function(){b.AceEditorUtils.toggleVimMode(this.editor)},showContextMenu:function(t){this.menuX=t.pageX,this.menuY=t.pageY;let n=this.editor.getCursorPosition(),i=this.editor.session.getTokenAt(n.row,n.column);if(i){let s=i.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 t=y.aceExports.require("ace/lib/oop"),n=y.aceExports.require("ace/mode/text_highlight_rules").TextHighlightRules,i=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*(${i})\\b`)}]},this.normalizeRules()};t.inherits(s,n);let o=function(){this.HighlightRules=s},l=y.aceExports.require("ace/mode/text").Mode;return t.inherits(o,l),(function(){this.$id="ace/mode/openc3"}).call(o.prototype),o},downloadScreen:function(){const t=new Blob([this.editor.getValue()],{type:"text/plain"}),n=document.createElement("a");n.href=URL.createObjectURL(t),n.setAttribute("download",`${this.screen.toLowerCase()}.txt`),n.click()},loadFile:function(){const t=new FileReader;t.readAsText(this.file);const n=this;t.onload=function(){n.editor.setValue(t.result),n.file=null}},deleteScreen:function(){this.$dialog.confirm("Are you sure you want to delete this screen?!",{okText:"Delete",cancelText:"Cancel"}).then(t=>{this.$emit("delete")})}}},D=["textContent"];function I(t,n,i,s,o,l){const a=e.resolveComponent("v-btn"),g=e.resolveComponent("v-spacer"),m=e.resolveComponent("v-toolbar"),d=e.resolveComponent("v-row"),v=e.resolveComponent("v-file-input"),_=e.resolveComponent("v-list-item-title"),x=e.resolveComponent("v-list-item"),c=e.resolveComponent("v-divider"),r=e.resolveComponent("v-list"),p=e.resolveComponent("v-menu"),u=e.resolveComponent("v-card-text"),h=e.resolveComponent("v-card"),C=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(C,{modelValue:l.show,"onUpdate:modelValue":n[5]||(n[5]=f=>l.show=f),persistent:"",width:"75vw",onKeydown:n[6]||(n[6]=e.withKeys(f=>t.$emit("cancel"),["esc"]))},{default:e.withCtx(()=>[e.createVNode(h,null,{default:e.withCtx(()=>[e.createVNode(m,{height:"24"},{default:e.withCtx(()=>[e.createVNode(a,{class:"mx-2",icon:"mdi-delete",variant:"text",density:"compact","data-test":"delete-screen-icon",onClick:l.deleteScreen},null,8,["onClick"]),e.createVNode(g),e.createElementVNode("span",null," Edit Screen: "+e.toDisplayString(i.target)+" "+e.toDisplayString(i.screen),1),e.createVNode(g),e.createVNode(a,{class:"mx-2",icon:"mdi-download",variant:"text",density:"compact","data-test":"download-screen-icon",onClick:l.downloadScreen},null,8,["onClick"])]),_:1}),e.createVNode(u,{style:{"max-height":"90vh"}},{default:e.withCtx(()=>[e.createVNode(d,{class:"mt-3"},{default:e.withCtx(()=>[...n[7]||(n[7]=[e.createTextVNode(" Upload a screen file. ",-1)])]),_:1}),e.createVNode(d,{"no-gutters":"",align:"center"},{default:e.withCtx(()=>[e.createVNode(a,{disabled:!o.file,color:"primary",class:"mr-3","data-test":"edit-screen-load",onClick:l.loadFile},{default:e.withCtx(()=>[...n[8]||(n[8]=[e.createTextVNode(" Load ",-1)])]),_:1},8,["disabled","onClick"]),e.createVNode(v,{modelValue:o.file,"onUpdate:modelValue":n[0]||(n[0]=f=>o.file=f),"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(()=>[...n[9]||(n[9]=[e.createTextVNode(" Edit the screen definition. ",-1)])]),_:1}),e.createVNode(d,{class:"mb-2"},{default:e.withCtx(()=>[e.createElementVNode("pre",{ref:"editor",class:"editor",onContextmenu:n[1]||(n[1]=e.withModifiers((...f)=>l.showContextMenu&&l.showContextMenu(...f),["prevent"]))},null,544),e.createVNode(p,{modelValue:o.contextMenu,"onUpdate:modelValue":n[2]||(n[2]=f=>o.contextMenu=f),target:[o.menuX,o.menuY]},{default:e.withCtx(()=>[e.createVNode(r,null,{default:e.withCtx(()=>[e.createVNode(x,{link:""},{default:e.withCtx(()=>[e.createVNode(_,{onClick:l.openDocumentation},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(o.docsKeyword)+" documentation ",1)]),_:1},8,["onClick"])]),_:1}),e.createVNode(c),e.createVNode(x,{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,(f,S)=>(e.openBlock(),e.createElementBlock("div",{key:S},[e.createElementVNode("span",{class:"text-red",textContent:e.toDisplayString(f)},null,8,D)]))),128))]),_:1}),e.createVNode(d,{class:"mt-5"},{default:e.withCtx(()=>[n[12]||(n[12]=e.createElementVNode("span",null," Ctrl-space brings up autocomplete. Right click keywords for documentation. ",-1)),e.createVNode(g),e.createVNode(a,{class:"mx-2",variant:"outlined","data-test":"edit-screen-cancel",onClick:n[3]||(n[3]=f=>t.$emit("cancel"))},{default:e.withCtx(()=>[...n[10]||(n[10]=[e.createTextVNode(" Cancel ",-1)])]),_:1}),e.createVNode(a,{class:"mx-2",color:"primary","data-test":"edit-screen-save",onClick:n[4]||(n[4]=f=>t.$emit("save",t.editor.getValue()))},{default:e.withCtx(()=>[...n[11]||(n[11]=[e.createTextVNode(" Save ",-1)])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])}const N=w._export_sfc(E,[["render",I],["__scopeId","data-v-00a228d0"]]),B={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(t){this.$emit("update:modelValue",t)}}},mounted(){this.update()},methods:{alertHandler:function(t){this.alert=t.text,this.alertType=t.type,this.showAlert=!0},update:function(){y.fi.get("/openc3-api/environment").then(t=>{this.environment=t.data}).catch(t=>{})},addEnvironment:function(){y.fi.post("/openc3-api/environment",{data:{key:this.key.toUpperCase(),value:this.keyValue}}).then(t=>{`${t.data.name}`,this.update()}).catch(t=>{const n={text:`Failed to add environment variable: ${t}`,type:"error"};this.alertHandler(n)}),this.key="",this.keyValue=""},deleteEnvironment:function(t){this.$dialog.confirm(`Are you sure you want to delete: ${t.key}=${t.value}`,{okText:"Delete",cancelText:"Cancel"}).then(n=>y.fi.delete(`/openc3-api/environment/${t.name}`)).then(n=>{const i={text:`Removed environment variable: ${t.name}`,type:"success"};this.alertHandler(i),this.update()}).catch(n=>{const i={text:`Failed to delete environment: ${n}`,type:"error"};this.alertHandler(i)})}}},A={class:"pa-3"};function F(t,n,i,s,o,l){const a=e.resolveComponent("v-spacer"),g=e.resolveComponent("v-toolbar"),m=e.resolveComponent("v-text-field"),d=e.resolveComponent("v-row"),v=e.resolveComponent("v-btn"),_=e.resolveComponent("v-data-table"),x=e.resolveComponent("v-col"),c=e.resolveComponent("v-card-text"),r=e.resolveComponent("v-card"),p=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(p,{modelValue:l.show,"onUpdate:modelValue":n[4]||(n[4]=u=>l.show=u),width:"600"},{default:e.withCtx(()=>[e.createVNode(r,null,{default:e.withCtx(()=>[e.createElementVNode("form",{onSubmit:n[3]||(n[3]=e.withModifiers((...u)=>l.addEnvironment&&l.addEnvironment(...u),["prevent"]))},[e.createVNode(g,{height:"24"},{default:e.withCtx(()=>[e.createVNode(a),n[5]||(n[5]=e.createElementVNode("span",null,"Global Environment Variables",-1)),e.createVNode(a)]),_:1}),e.createVNode(c,null,{default:e.withCtx(()=>[e.createElementVNode("div",A,[e.createVNode(d,{dense:"",class:"mb-2"},{default:e.withCtx(()=>[e.createVNode(m,{modelValue:o.search,"onUpdate:modelValue":n[0]||(n[0]=u=>o.search=u),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(_,{"item-key":"name","hide-default-header":"","data-test":"env-table",search:o.search,headers:o.headers,items:o.environment,"items-per-page":5,"items-per-page-options":[5]},{"item.actions":e.withCtx(({item:u})=>[e.createVNode(v,{icon:"mdi-delete",variant:"text",class:"mt-1","data-test":"item-delete","aria-label":"Delete Environment Variable",onClick:h=>l.deleteEnvironment(u)},null,8,["onClick"])]),_:1},8,["search","headers","items"]),e.createVNode(d,{dense:""},{default:e.withCtx(()=>[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(m,{modelValue:o.key,"onUpdate:modelValue":n[1]||(n[1]=u=>o.key=u),label:"Key","data-test":"env-key"},null,8,["modelValue"])]),_:1}),e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(m,{modelValue:o.keyValue,"onUpdate:modelValue":n[2]||(n[2]=u=>o.keyValue=u),label:"Value","data-test":"env-value"},null,8,["modelValue"])]),_:1})]),_:1}),e.createVNode(d,{dense:""},{default:e.withCtx(()=>[e.createVNode(v,{block:"",type:"submit",color:"primary","data-test":"add-env",disabled:!o.key||!o.keyValue,onClick:e.withModifiers(l.addEnvironment,["prevent"])},{default:e.withCtx(()=>[...n[6]||(n[6]=[e.createTextVNode(" Add ",-1)])]),_:1},8,["disabled","onClick"])]),_:1})])]),_:1})],32)]),_:1})]),_:1},8,["modelValue"])}const M=w._export_sfc(B,[["render",F]]),O={class:"tree-node"},R={class:"content-wrapper"},L=["tabindex"],U={key:1},z={key:2,class:"children"},W={__name:"TreeNode",props:{node:{type:Object,required:!0},search:{type:String,default:""},type:{type:String,default:"open"}},emits:["nodeToggled","request"],setup(t,{emit:n}){const i=t,s=e.ref(i.node.isOpen||!1),o=e.computed(()=>{const c=r=>{var p;return!i.search||r.path.toLowerCase().includes(i.search.toLowerCase())?!0:!!((p=r.children)!=null&&p.some(c))};return c(i.node)});e.watch(()=>i.node.isOpen,c=>{s.value=c}),e.watch(()=>i.search,c=>{c?i.node.isOpen||v():i.node.isOpen&&v()});const l=n,a=e.ref({show:!1,text:"",x:0,y:0}),g=(c,r)=>{if(!r||r.length<=50)return;const p=c.target.getBoundingClientRect(),u=p.left,h=p.top;a.value.text=r,a.value.x=u,a.value.y=h-40,a.value.show=!0},m=()=>{a.value.show=!1},d=c=>{c.children?(v(),i.type==="save"&&l("request",c)):l("request",c)},v=()=>{i.node.children&&(s.value=!s.value,i.node.isOpen=s.value,l("nodeToggled",i.node.id,s.value))},_=(c,r)=>{l("nodeToggled",c,r)},x=c=>{l("request",c)};return(c,r)=>{const p=e.resolveComponent("v-tooltip"),u=e.resolveComponent("v-icon"),h=e.resolveComponent("v-btn"),C=e.resolveComponent("tree-node",!0);return e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createVNode(p,{modelValue:a.value.show,"onUpdate:modelValue":r[0]||(r[0]=f=>a.value.show=f),text:a.value.text,location:"top",style:e.normalizeStyle(`position: fixed; left: ${a.value.x}px; top: ${a.value.y}px; pointer-events: none;`)},null,8,["modelValue","text","style"]),e.createElementVNode("div",O,[o.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"node-content",onClick:r[4]||(r[4]=f=>d(t.node))},[e.createElementVNode("div",R,[t.node.children?(e.openBlock(),e.createBlock(u,{key:0,class:"toggle-icon",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.node.isOpen?"mdi-menu-down":"mdi-menu-right"),1)]),_:1})):e.createCommentVNode("",!0),t.node.children?(e.openBlock(),e.createBlock(u,{key:1,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[...r[5]||(r[5]=[e.createTextVNode(e.toDisplayString("mdi-folder"),-1)])]),_:1})):t.node.title.includes(".rb")?(e.openBlock(),e.createBlock(u,{key:2,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[...r[6]||(r[6]=[e.createTextVNode(e.toDisplayString("mdi-language-ruby"),-1)])]),_:1})):t.node.title.includes(".py")?(e.openBlock(),e.createBlock(u,{key:3,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[...r[7]||(r[7]=[e.createTextVNode(e.toDisplayString("mdi-language-python"),-1)])]),_:1})):(e.openBlock(),e.createBlock(u,{key:4,size:"small",style:{"padding-right":"10px"}},{default:e.withCtx(()=>[...r[8]||(r[8]=[e.createTextVNode(e.toDisplayString("mdi-file-document"),-1)])]),_:1})),e.createElementVNode("span",{class:"text-h6",tabindex:t.node.children?-1:0,onKeyup:r[1]||(r[1]=e.withKeys(f=>d(t.node),["enter"])),onMouseenter:r[2]||(r[2]=f=>g(f,t.node.title)),onMouseleave:m},e.toDisplayString(t.node.title),41,L),t.node.title==="__TEMP__"?(e.openBlock(),e.createBlock(h,{key:5,icon:"mdi-delete",variant:"text",style:{"margin-left":"auto"},"aria-label":"Delete",onClick:r[3]||(r[3]=f=>l("delete"))})):e.createCommentVNode("",!0)])])):(e.openBlock(),e.createElementBlock("div",U)),t.node.children&&t.node.isOpen?(e.openBlock(),e.createElementBlock("div",z,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.node.children,f=>(e.openBlock(),e.createBlock(C,{key:f.id,node:f,search:t.search,type:t.type,onNodeToggled:_,onRequest:x},null,8,["node","search","type"]))),128))])):e.createCommentVNode("",!0)])],64)}}},P=w._export_sfc(W,[["__scopeId","data-v-953cd2ec"]]),q={components:{TreeNode:P},props:{type:{type:String,required:!0,validator:function(t){return["open","save"].indexOf(t)!==-1}},apiUrl:String,requireTargetParentDir:Boolean,inputFilename:String,modelValue:Boolean,customHelpText:String},data(){return{tree:[],items:[],search:null,selectedFile:null,disableButtons:!1,targets:[],targetsRetrieved:[],loading:!0}},computed:{show:{get(){return this.modelValue},set(t){this.$emit("update:modelValue",t)}},title:function(){return this.type==="open"?"File Open":"File Save As..."},submit:function(){return this.type==="open"?"OPEN":"SAVE"},helpText:function(){return this.customHelpText?this.customHelpText: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 t=`${this.selectedFile} is not a valid filename. Must `;return this.requireTargetParentDir&&(t+="be in a target directory and "),t+=`only contain alphanumeric characters (including !-_.*) and a valid extension.
2
2
 
3
- For example: TGT1/procedures/test.py or TGT2/lib/inst.rb`,t}return this.type==="save"&&this.selectedFile.match(/\*$/)?`${this.selectedFile} is not a valid filename. Must not end in '*'.`:null},validFilenameRegex:function(){const t="0-9a-zA-Z";let i=`[${`${t}\\/\\!\\-\\_\\.\\*\\'\\(\\)`}]+\\.[${t}]+`;return this.requireTargetParentDir&&(i=`\\/?${`(${this.targets.join("|")})`}\\/${i}`),new RegExp(i)}},created(){y.di.get("/openc3-api/targets").then(t=>{this.targets=t.data,this.targets.push("__TEMP__"),this.targets.forEach(n=>{this.items.push({id:n,disabled:!0,title:n,children:[],path:n}),this.loadFiles(n)}),this.loading=!1})},methods:{calcIcon:function(t){return T.fileIcon(t)},loadFiles:function(t){y.di.get(this.apiUrl,{params:{target:t}}).then(n=>{if(n.data.length===0){this.items=this.items.filter(s=>s.id!==t);return}for(let s of n.data.sort())this.filepath=s,this.insertFile(this.items,2,s);this.inputFilename&&(this.selectedFile=this.inputFilename);const i=this.items.findIndex(s=>s.id===t);i!==-1&&(this.items[i].disabled=!1)}).catch(n=>{this.$emit("error",`Failed to connect to OpenC3. ${n}`)})},clear:function(){this.show=!1,this.overwrite=!1,this.disableButtons=!1},activeFile:function(t){t.length===0?this.selectedFile=null:(this.selectedFile=this.findItem(this.items,t.id),setTimeout(()=>{this.$refs.submitBtn.$el.focus()},100))},findItem:function(t,n){for(let i of t){if(i.id===n)return i.path;if(i.children){const s=this.findItem(i.children,n);if(s)return s}}return null},exists:function(t,n){let i=!1;for(let s of t){if(s.path===n||s.path.length>1&&s.path[s.path.length-1]==="*"&&s.path.slice(0,s.path.length-1)===n)return!0;s.children&&(i=i||this.exists(s.children,n))}return i},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(t=>y.di.delete("/script-api/scripts/temp_files")).then(t=>{this.$emit("clear-temp"),this.loadFiles("__TEMP__")}).catch(t=>{this.$notify.serious({title:"Error",body:`Failed to remove script temporary files due to ${t}`})})},openSuccess:function(){this.disableButtons=!0,y.di.get(`${this.apiUrl}/${this.selectedFile}`).then(t=>{const n={name:this.selectedFile,contents:t.data.contents};t.data.suites&&(n.suites=JSON.parse(t.data.suites)),t.data.error&&(n.error=t.data.error),t.data.success&&(n.success=t.data.success);const i=t.data.locked,s=t.data.breakpoints;this.$emit("file",{file:n,locked:i,breakpoints:s}),this.clear()}).catch(t=>{this.$emit("error",`Failed to open ${this.selectedFile}. ${t}`),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(n=>{this.$emit("filename",this.selectedFile),this.clear()}).catch(n=>{}):(this.$emit("filename",this.selectedFile),this.clear())},insertFile:function(t,n,i){let s=i.split("/");if(s.length===1){t.push({id:this.filepath,title:s[0],file:"ruby",path:this.filepath});return}const o=t.findIndex(l=>l.title===s[0]);o===-1?(t.push({id:this.filepath.split("/").slice(0,n-1).join("/"),title:s[0],children:[],path:this.filepath.split("/").slice(0,n-1).join("/")}),this.insertFile(t[t.length-1].children,n+1,s.slice(1).join("/"))):this.insertFile(t[o].children,n+1,s.slice(1).join("/"))}}},K={class:"pa-3"},G={class:"overflow-y-auto tree-container"};function Z(t,n,i,s,o,l){const a=e.resolveComponent("v-progress-circular"),f=e.resolveComponent("v-overlay"),m=e.resolveComponent("v-spacer"),d=e.resolveComponent("v-toolbar"),g=e.resolveComponent("v-row"),_=e.resolveComponent("v-text-field"),x=e.resolveComponent("tree-node"),c=e.resolveComponent("v-btn"),r=e.resolveComponent("v-card-text"),v=e.resolveComponent("v-card"),u=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(u,{modelValue:l.show,"onUpdate:modelValue":n[4]||(n[4]=h=>l.show=h),persistent:"",width:"800",onKeydown:[n[5]||(n[5]=e.withKeys(h=>l.success(),["enter"])),n[6]||(n[6]=e.withKeys(h=>o.disableButtons?null:l.show=!1,["esc"]))]},{default:e.withCtx(()=>[e.createVNode(v,null,{default:e.withCtx(()=>[e.createVNode(f,{"model-value":o.loading},{default:e.withCtx(()=>[e.createVNode(a,{indeterminate:"",absolute:"",size:"64"})]),_:1},8,["model-value"]),e.createElementVNode("form",{onSubmit:n[3]||(n[3]=e.withModifiers((...h)=>l.success&&l.success(...h),["prevent"]))},[e.createVNode(d,{height:"24"},{default:e.withCtx(()=>[e.createVNode(m),e.createElementVNode("span",null,e.toDisplayString(l.title),1),e.createVNode(m)]),_:1}),e.createVNode(r,null,{default:e.withCtx(()=>[e.createElementVNode("div",K,[e.createVNode(g,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.helpText),1)]),_:1}),e.createVNode(g,{dense:"",class:"mt-5"},{default:e.withCtx(()=>[e.createVNode(_,{modelValue:o.search,"onUpdate:modelValue":n[0]||(n[0]=h=>o.search=h),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",G,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.items,h=>(e.openBlock(),e.createBlock(x,{key:`${h.id}`,node:h,search:o.search,type:i.type,onRequest:l.activeFile,onDelete:l.deleteTemp},null,8,["node","search","type","onRequest","onDelete"]))),128))]),e.createVNode(g,{class:"my-2"},{default:e.withCtx(()=>[e.createVNode(_,{modelValue:o.selectedFile,"onUpdate:modelValue":n[1]||(n[1]=h=>o.selectedFile=h),"hide-details":"",label:"Filename","data-test":"file-open-save-filename",disabled:i.type==="open"},null,8,["modelValue","disabled"])]),_:1}),e.createVNode(g,{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(g,{class:"mt-2"},{default:e.withCtx(()=>[e.createVNode(m),e.createVNode(c,{variant:"outlined",class:"mx-2","data-test":"file-open-save-cancel-btn",disabled:o.disableButtons,onClick:n[2]||(n[2]=h=>l.show=!1)},{default:e.withCtx(()=>[...n[7]||(n[7]=[e.createTextVNode(" Cancel ",-1)])]),_:1},8,["disabled"]),e.createVNode(c,{ref:"submitBtn",type:"submit",color:"primary",class:"mx-2","data-test":"file-open-save-submit-btn",disabled:o.disableButtons||!!l.error,onClick:e.withModifiers(l.success,["prevent"])},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.submit),1)]),_:1},8,["disabled","onClick"])]),_:1})])]),_:1})],32)]),_:1})]),_:1},8,["modelValue"])}const X=w._export_sfc(q,[["render",Z]]),V=20,$={components:{EditScreenDialog:N},mixins:[y.WidgetComponents],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},playbackMode:{type:String,default:"realtime"},playbackDateTime:{type:Date,default:null}},emits:["close-screen","delete-screen","drag-screen","edit-screen","float-screen","min-max-screen","unfloat-screen"],data(){return{api:null,backup:"",currentDefinition:this.definition,editDialog:!1,expand:!0,configParser:null,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:[],actualScreenItems:[],screenValues:{},updateCounter:0,updater:null,screenId:y.lodashExports.uniqueId("openc3-screen_"),tlmAvailableTimeout:null}},computed:{error:function(){if(this.errorDialog&&this.errors.length>0){let t=new Set,n="";for(const i of this.errors){if(t.has(i.message))continue;let s=`${i.time}: (${i.type}) ${i.message}
4
- `;n+=s,t.add(i.message)}return n}return null},computedStyle(){var i;let t={};const n=this.width||((i=this.$refs.bar)==null?void 0:i.clientWidth);return this.floated&&(t.position="absolute",t.top=this.top+"px",t.left=this.left+"px",t.width=n+"px"),t}},watch:{count:{handler(t,n){this.currentDefinition=this.definition,this.rerender()}},playbackDateTime:{handler(t,n){this.playbackMode==="playback"&&t&&this.update()}},playbackMode:{handler(t,n){t==="realtime"?this.updateRefreshInterval():(clearInterval(this.updater),this.updater=null)}}},errorCaptured(t,n,i){return this.errors.length<V&&(t.usage?this.errors.push({type:"usage",message:t.message,usage:t.usage,line:t.line,lineNumber:t.lineNumber,time:new Date().getTime()}):this.errors.push({type:"error",message:t,time:new Date().getTime()})),!1},created(){this.api=new y.bi,this.configParser=new y.gi,this.parseDefinition(),this.screenKey=Math.floor(Math.random()*1e6)},mounted(){this.playbackMode==="realtime"&&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),this.tlmAvailableTimeout!=null&&(clearTimeout(this.tlmAvailableTimeout),this.tlmAvailableTimeout=null)},methods:{open(t,n){this.$parent.showScreen(t,n)},close(t,n){this.$parent.closeScreenByName(t,n)},closeAll(){this.$parent.closeAll()},clearErrors:function(){this.errors=[]},updateRefreshInterval:function(){let t=this.pollingPeriod*1e3;this.updater&&clearInterval(this.updater),this.updater=setInterval(()=>{this.update()},t)},parseDefinition:function(){if(this.clearErrors(),this.screenItems=[],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,(t,n,i,s)=>{if(t)switch(t){case"SCREEN":this.configParser.verify_num_parameters(3,4,`${t} <Width or AUTO> <Height or AUTO> <Polling Period>`),this.width=parseInt(n[0]),this.height=parseInt(n[1]),this.pollingPeriod=parseFloat(n[2]);break;case"END":this.configParser.verify_num_parameters(0,0,`${t}`),this.layoutStack.pop(),this.currentLayout=this.layoutStack[this.layoutStack.length-1];break;case"STALE_TIME":this.configParser.verify_num_parameters(1,1,`${t} <Time (s)>`),this.staleTime=parseInt(n[0]);break;case"SUBSETTING":this.configParser.verify_num_parameters(3,null,`${t} <Index> <Widget Type> <Widget Settings...>`),n[1]==="RAW"&&(n[1]="RAW__"+n[2].toLowerCase());case"SETTING":this.configParser.verify_num_parameters(2,null,`${t} <Widget Type> <Widget Settings...>`),n[0]==="RAW"&&(n[0]="RAW__"+n[1].toLowerCase()),(this.currentLayout.widgets[this.currentLayout.widgets.length-1]??this.currentLayout).settings.push(n);break;case"GLOBAL_SUBSETTING":this.configParser.verify_num_parameters(3,null,`${t} <Index> <Widget Type> <Widget Settings...>`),n[2]==="RAW"&&(n[2]="RAW__"+n[3].toLowerCase());case"GLOBAL_SETTING":this.configParser.verify_num_parameters(2,null,`${t} <Widget Type> <Widget Settings...>`),n[1]==="RAW"&&(n[1]="RAW__"+n[2].toLowerCase()),this.globalSettings.push(n);break;default:this.processWidget(t,n,i,s);break}}),typeof this.layoutStack[0]>"u"){let t=[],n=[];for(const i of this.dynamicWidgets)t.push(i.name),n.push(i.lineNumber);this.errors.length<V&&this.errors.push({type:"usage",message:`Unknown widget! Are these widgets: ${t.join(",")}?`,lineNumber:n.join(","),time:new Date().getTime()}),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 t=this.$refs.bar.parentElement.parentElement.parentElement.getBoundingClientRect(),n=this.$refs.bar.getBoundingClientRect();this.top=n.top-t.top-5,this.left=n.left-t.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(t){t=t||window.event,t.preventDefault(),this.dragX=t.clientX,this.dragY=t.clientY,document.onmouseup=this.closeDragElement,document.onmousemove=this.elementDrag},elementDrag:function(t){t=t||window.event,t.preventDefault();let n=this.dragX-t.clientX,i=this.dragY-t.clientY;this.dragX=t.clientX,this.dragY=t.clientY,this.top=this.$refs.bar.offsetTop-i,this.left=this.$refs.bar.offsetLeft-n,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(t){this.editDialog=!1,this.currentDefinition=t,this.rerender(),this.$nextTick(function(){y.di.post("/openc3-api/screen/",{data:{scope:window.openc3Scope,target:this.target,screen:this.screen,text:this.currentDefinition}},0)})},deleteScreen:function(){this.editDialog=!1,y.di.delete(`/openc3-api/screen/${this.target}/${this.screen}`).then(t=>{this.$emit("delete-screen")})},minMaxTransition:function(){this.expand=!this.expand,this.$emit("min-max-screen")},processWidget:function(t,n,i,s){let o=null;t==="NAMED_WIDGET"&&(this.configParser.verify_num_parameters(2,null,`${t} <Widget Name> <Widget Type> <Widget Settings... (optional)>`),o=n[0].toUpperCase(),t=n[1].toUpperCase(),n=n.slice(2,n.length));const l=t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()+"Widget";let a=[];if(a.push(["__SCREEN_ID__",this.screenId]),o!==null&&a.push(["NAMED_WIDGET",o]),t==="VERTICAL"||t==="VERTICALBOX"||t==="HORIZONTAL"||t==="HORIZONTALBOX"||t==="MATRIXBYCOLUMNS"||t==="TABBOOK"||t==="TABITEM"||t==="CANVAS"||t==="RADIOGROUP"||t==="SCROLLWINDOW"){const f={type:l,parameters:n,settings:a,screenValues:this.screenValues,screenTimeZone:this.timeZone,widgets:[]};this.layoutStack.push(f),this.currentLayout.widgets.push(f),this.currentLayout=f}else if(this.$options.components[l])this.currentLayout.widgets.push({type:l,target:this.target,parameters:n,settings:a,screenValues:this.screenValues,screenTimeZone:this.timeZone,line:i,lineNumber:s});else{let f={type:"DynamicWidget",target:this.target,parameters:n,settings:a,screenValues:this.screenValues,screenTimeZone:this.timeZone,name:l,line:i,lineNumber:s};this.currentLayout.widgets.push(f),this.dynamicWidgets.push(f)}},applyGlobalSettings:function(t){t.forEach(n=>{this.globalSettings.forEach(i=>{n.type.toLowerCase()===i[0].toLowerCase()+"widget"&&(n.settings.find(o=>o[0]===i[1])||n.settings.push(i.slice(1)))}),n.widgets&&this.applyGlobalSettings(n.widgets)})},update:function(){let t=this.playbackMode==="playback"?this.playbackDateTime:null;this.actualScreenItems.length!==0&&this.api.get_tlm_values(this.actualScreenItems,this.staleTime,this.cacheTimeout,t).then(n=>{n&&n.length>0&&this.updateValues(n)}).catch(n=>{let i=JSON.stringify(n,null,2);this.errors.find(s=>s.message===i)||this.errors.length<V&&this.errors.push({type:"error",message:i,time:new Date().getTime()})})},updateValues:function(t){if(this.updateCounter+=1,t.length!=this.screenItems.length||t.length!=this.actualScreenItems.length)console.log(`get_tlm_values mismatch: data.length: ${t.length}, screenItems.length: ${this.screenItems.length}, actualScreenItems.length: ${this.actualScreenItems.length}`,JSON.stringify(t),JSON.stringify(this.screenItems),JSON.stringify(this.actualScreenItems));else for(let n=0;n<t.length;n++)t[n].push(this.updateCounter),this.screenValues[this.screenItems[n]]=t[n]},debouncedUpdateTlmAvailable:function(){this.tlmAvailableTimeout!=null&&clearTimeout(this.tlmAvailableTimeout),this.tlmAvailableTimeout=setTimeout(()=>{this.api.get_tlm_available(this.screenItems).then(t=>{if(this.actualScreenItems=t,this.screenItems.length!=t.length)console.log("Error getting tlm available",this.screenItems,this.actualScreenItems);else for(let n=0;n<this.actualScreenItems.length;n++)if(this.actualScreenItems[n]===null){const i=this.screenItems[n].split("__"),s=this.currentDefinition.split(`
5
- `),o=s.findIndex(l=>l.includes(i[0])&&l.includes(i[1])&&l.includes(i[2]))+1;o>0?this.errors.push({type:"usage",message:`Null for ${i.join(" ")}! Does it exist?`,line:s[o-1],lineNumber:o,time:new Date().getTime()}):this.errors.push({type:"error",message:`Null for ${i.join(" ")}! Does it exist?`,time:new Date().getTime()})}}).catch(t=>{console.log("Error getting tlm available",t),this.actualScreenItems=this.screenItems}),this.tlmAvailableTimeout=null},100)},addItem:function(t){this.screenItems.push(t),this.screenValues[t]=[null,null,0],this.debouncedUpdateTlmAvailable()},deleteItem:function(t){let n=this.screenItems.indexOf(t);this.screenItems.splice(n,1),this.debouncedUpdateTlmAvailable()}}},Y={ref:"screen",class:"pa-1",style:{position:"relative"}},j={key:1,class:"pa-1",style:{position:"relative"}};function H(t,n,i,s,o,l){const a=e.resolveComponent("v-btn"),f=e.resolveComponent("v-tooltip"),m=e.resolveComponent("v-spacer"),d=e.resolveComponent("v-toolbar"),g=e.resolveComponent("v-overlay"),_=e.resolveComponent("vertical-widget"),x=e.resolveComponent("v-expand-transition"),c=e.resolveComponent("v-card"),r=e.resolveComponent("edit-screen-dialog"),v=e.resolveComponent("v-textarea"),u=e.resolveComponent("v-card-actions"),h=e.resolveComponent("v-dialog");return e.openBlock(),e.createElementBlock("div",{ref:"bar",style:e.normalizeStyle(l.computedStyle)},[i.inline?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(c,{key:0,"min-height":o.height,"min-width":o.width,style:{cursor:"default"}},{default:e.withCtx(()=>[e.createVNode(d,{height:"24"},{default:e.withCtx(()=>[e.withDirectives(e.createVNode(a,{icon:"mdi-alert",variant:"text",density:"compact","data-test":"error-graph-icon","aria-label":"Show Errors",onClick:n[0]||(n[0]=()=>{o.errorDialog=!0})},null,512),[[e.vShow,o.errors.length!==0]]),e.createVNode(a,{icon:"mdi-pencil",variant:"text",density:"compact","data-test":"edit-screen-icon","aria-label":"Edit Screen",onClick:l.openEdit},null,8,["onClick"]),i.fixFloated?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(f,{key:0,"open-delay":600,location:"top"},{activator:e.withCtx(({props:C})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(C)),[e.createVNode(a,{icon:o.floated?"mdi-balloon":"mdi-view-grid-outline",variant:"text",density:"compact","data-test":"float-screen-icon","aria-label":o.floated?"Unfloat Screen":"Float Screen",onClick:l.floatScreen},null,8,["icon","aria-label","onClick"])],16)]),default:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(o.floated?"Unfloat Screen":"Float Screen"),1)]),_:1})),o.floated?(e.openBlock(),e.createBlock(f,{key:1,"open-delay":600,location:"top"},{activator:e.withCtx(({props:C})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(C)),[e.createVNode(a,{icon:"mdi-arrow-up",variant:"text",density:"compact","data-test":"up-screen-icon","aria-label":"Move Screen Up",onClick:l.upScreen},null,8,["onClick"])],16)]),default:e.withCtx(()=>[n[6]||(n[6]=e.createElementVNode("span",null," Move Screen Up ",-1))]),_:1})):e.createCommentVNode("",!0),o.floated&&o.zIndex>i.minZ?(e.openBlock(),e.createBlock(f,{key:2,"open-delay":600,location:"top"},{activator:e.withCtx(({props:C})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(C)),[e.createVNode(a,{icon:"mdi-arrow-down",variant:"text",density:"compact","data-test":"down-screen-icon","aria-label":"Move Screen Down",onClick:l.downScreen},null,8,["onClick"])],16)]),default:e.withCtx(()=>[n[7]||(n[7]=e.createElementVNode("span",null," Move Screen Down ",-1))]),_:1})):e.createCommentVNode("",!0),e.createVNode(m),e.createElementVNode("span",null,e.toDisplayString(i.target)+" "+e.toDisplayString(i.screen),1),e.createVNode(m),o.expand?(e.openBlock(),e.createBlock(a,{key:3,icon:"mdi-window-minimize",variant:"text",density:"compact","data-test":"minimize-screen-icon","aria-label":"Minimize Screen",onClick:l.minMaxTransition},null,8,["onClick"])):(e.openBlock(),e.createBlock(a,{key:4,icon:"mdi-window-maximize",variant:"text",density:"compact","data-test":"maximize-screen-icon","aria-label":"Maximize Screen",onClick:l.minMaxTransition},null,8,["onClick"])),i.showClose?(e.openBlock(),e.createBlock(a,{key:5,icon:"mdi-close-box",variant:"text",density:"compact","data-test":"close-screen-icon","aria-label":"Close Screen",onClick:n[1]||(n[1]=C=>t.$emit("close-screen"))})):e.createCommentVNode("",!0)]),_:1}),o.editDialog?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0},{default:e.withCtx(()=>[e.withDirectives(e.createElementVNode("div",Y,[e.createVNode(g,{style:{"pointer-events":"none"},"model-value":o.errors.length!==0,opacity:"0.8",absolute:"",attach:"","scroll-strategy":"none"},null,8,["model-value"]),(e.openBlock(),e.createBlock(_,{key:o.screenKey,widgets:o.layoutStack[0].widgets,"screen-values":o.screenValues,"screen-time-zone":i.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,o.expand]])]),_:1}))]),_:1},8,["min-height","min-width"])),i.inline?(e.openBlock(),e.createElementBlock("div",j,[e.createVNode(g,{style:{"pointer-events":"none"},"model-value":o.errors.length!==0,opacity:"0.8",absolute:"",attach:"","scroll-strategy":"none"},null,8,["model-value"]),e.withDirectives(e.createVNode(a,{icon:"mdi-alert",variant:"text",density:"compact","data-test":"error-graph-icon","aria-label":"Show Errors",onClick:n[2]||(n[2]=()=>{o.errorDialog=!0})},null,512),[[e.vShow,o.errors.length!==0]]),(e.openBlock(),e.createBlock(_,{key:o.screenKey,widgets:o.layoutStack[0].widgets,"screen-values":o.screenValues,"screen-time-zone":i.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),o.editDialog?(e.openBlock(),e.createBlock(r,{key:2,modelValue:o.editDialog,"onUpdate:modelValue":n[3]||(n[3]=C=>o.editDialog=C),target:i.target,screen:i.screen,definition:o.currentDefinition,keywords:i.keywords,errors:o.errors,onSave:l.saveEdit,onCancel:l.cancelEdit,onDelete:l.deleteScreen},null,8,["modelValue","target","screen","definition","keywords","errors","onSave","onCancel","onDelete"])):e.createCommentVNode("",!0),e.createVNode(h,{modelValue:o.errorDialog,"onUpdate:modelValue":n[5]||(n[5]=C=>o.errorDialog=C),width:"60vw"},{default:e.withCtx(()=>[e.createVNode(d,{height:"24"},{default:e.withCtx(()=>[e.createVNode(m),e.createElementVNode("span",null," Screen: "+e.toDisplayString(i.target)+" "+e.toDisplayString(i.screen)+" Errors ",1),e.createVNode(m)]),_:1}),e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(v,{class:"errors",readonly:"",rows:"13","model-value":l.error},null,8,["model-value"]),e.createVNode(u,{class:"pb-5"},{default:e.withCtx(()=>[e.createVNode(m),e.createVNode(a,{variant:"outlined",class:"mr-2",onClick:l.clearErrors},{default:e.withCtx(()=>[...n[8]||(n[8]=[e.createTextVNode(" Clear Errors ",-1)])]),_:1},8,["onClick"]),e.createVNode(a,{variant:"flat",class:"mr-2",onClick:n[4]||(n[4]=C=>o.errorDialog=!1)},{default:e.withCtx(()=>[...n[9]||(n[9]=[e.createTextVNode(" Close ",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])],4)}const J=w._export_sfc($,[["render",H],["__scopeId","data-v-95e4a143"]]);exports.EditScreenDialog=N;exports.EnvironmentDialog=M;exports.FileOpenSaveDialog=X;exports.Openc3Screen=J;exports.ScreenCompleter=k;
6
- //# sourceMappingURL=Openc3Screen-B_8bygux.cjs.map
3
+ For example: TGT1/procedures/test.py or TGT2/lib/inst.rb`,t}return this.type==="save"&&this.selectedFile.match(/\*$/)?`${this.selectedFile} is not a valid filename. Must not end in '*'.`:null},validFilenameRegex:function(){const t="0-9a-zA-Z";let i=`[${`${t}\\/\\!\\-\\_\\.\\*\\'\\(\\)`}]+\\.[${t}]+`;return this.requireTargetParentDir&&(i=`\\/?${`(${this.targets.join("|")})`}\\/${i}`),new RegExp(i)}},created(){y.fi.get("/openc3-api/targets").then(t=>{this.targets=t.data,this.targets.push("__TEMP__"),this.targets.forEach(n=>{this.items.push({id:n,disabled:!0,title:n,children:[],path:n}),this.loadFiles(n)}),this.loading=!1})},methods:{calcIcon:function(t){return T.fileIcon(t)},loadFiles:function(t){y.fi.get(this.apiUrl,{params:{target:t}}).then(n=>{if(n.data.length===0){this.items=this.items.filter(s=>s.id!==t);return}for(let s of n.data.sort())this.filepath=s,this.insertFile(this.items,2,s);this.inputFilename&&(this.selectedFile=this.inputFilename);const i=this.items.findIndex(s=>s.id===t);i!==-1&&(this.items[i].disabled=!1)}).catch(n=>{this.$emit("error",`Failed to connect to OpenC3. ${n}`)})},clear:function(){this.show=!1,this.overwrite=!1,this.disableButtons=!1},activeFile:function(t){t.length===0?this.selectedFile=null:(this.selectedFile=this.findItem(this.items,t.id),setTimeout(()=>{this.$refs.submitBtn.$el.focus()},100))},findItem:function(t,n){for(let i of t){if(i.id===n)return i.path;if(i.children){const s=this.findItem(i.children,n);if(s)return s}}return null},exists:function(t,n){let i=!1;for(let s of t){if(s.path===n||s.path.length>1&&s.path[s.path.length-1]==="*"&&s.path.slice(0,s.path.length-1)===n)return!0;s.children&&(i=i||this.exists(s.children,n))}return i},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(t=>y.fi.delete("/script-api/scripts/temp_files")).then(t=>{this.$emit("clear-temp"),this.loadFiles("__TEMP__")}).catch(t=>{this.$notify.serious({title:"Error",body:`Failed to remove script temporary files due to ${t}`})})},openSuccess:function(){this.disableButtons=!0,y.fi.get(`${this.apiUrl}/${this.selectedFile}`).then(t=>{const n={name:this.selectedFile,contents:t.data.contents};t.data.suites&&(n.suites=JSON.parse(t.data.suites)),t.data.error&&(n.error=t.data.error),t.data.success&&(n.success=t.data.success);const i=t.data.locked,s=t.data.breakpoints;this.$emit("file",{file:n,locked:i,breakpoints:s}),this.clear()}).catch(t=>{this.$emit("error",`Failed to open ${this.selectedFile}. ${t}`),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(n=>{this.$emit("filename",this.selectedFile),this.clear()}).catch(n=>{}):(this.$emit("filename",this.selectedFile),this.clear())},insertFile:function(t,n,i){let s=i.split("/");if(s.length===1){t.push({id:this.filepath,title:s[0],file:"ruby",path:this.filepath});return}const o=t.findIndex(l=>l.title===s[0]);o===-1?(t.push({id:this.filepath.split("/").slice(0,n-1).join("/"),title:s[0],children:[],path:this.filepath.split("/").slice(0,n-1).join("/")}),this.insertFile(t[t.length-1].children,n+1,s.slice(1).join("/"))):this.insertFile(t[o].children,n+1,s.slice(1).join("/"))}}},K={class:"pa-3"},G={class:"overflow-y-auto tree-container"};function Z(t,n,i,s,o,l){const a=e.resolveComponent("v-progress-circular"),g=e.resolveComponent("v-overlay"),m=e.resolveComponent("v-spacer"),d=e.resolveComponent("v-toolbar"),v=e.resolveComponent("v-row"),_=e.resolveComponent("v-text-field"),x=e.resolveComponent("tree-node"),c=e.resolveComponent("v-btn"),r=e.resolveComponent("v-card-text"),p=e.resolveComponent("v-card"),u=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(u,{modelValue:l.show,"onUpdate:modelValue":n[4]||(n[4]=h=>l.show=h),persistent:"",width:"800",onKeydown:[n[5]||(n[5]=e.withKeys(h=>l.success(),["enter"])),n[6]||(n[6]=e.withKeys(h=>o.disableButtons?null:l.show=!1,["esc"]))]},{default:e.withCtx(()=>[e.createVNode(p,null,{default:e.withCtx(()=>[e.createVNode(g,{"model-value":o.loading},{default:e.withCtx(()=>[e.createVNode(a,{indeterminate:"",absolute:"",size:"64"})]),_:1},8,["model-value"]),e.createElementVNode("form",{onSubmit:n[3]||(n[3]=e.withModifiers((...h)=>l.success&&l.success(...h),["prevent"]))},[e.createVNode(d,{height:"24"},{default:e.withCtx(()=>[e.createVNode(m),e.createElementVNode("span",null,e.toDisplayString(l.title),1),e.createVNode(m)]),_:1}),e.createVNode(r,null,{default:e.withCtx(()=>[e.createElementVNode("div",K,[e.createVNode(v,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.helpText),1)]),_:1}),e.createVNode(v,{dense:"",class:"mt-5"},{default:e.withCtx(()=>[e.createVNode(_,{modelValue:o.search,"onUpdate:modelValue":n[0]||(n[0]=h=>o.search=h),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",G,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.items,h=>(e.openBlock(),e.createBlock(x,{key:`${h.id}`,node:h,search:o.search,type:i.type,onRequest:l.activeFile,onDelete:l.deleteTemp},null,8,["node","search","type","onRequest","onDelete"]))),128))]),e.createVNode(v,{class:"my-2"},{default:e.withCtx(()=>[e.createVNode(_,{modelValue:o.selectedFile,"onUpdate:modelValue":n[1]||(n[1]=h=>o.selectedFile=h),"hide-details":"",label:"Filename","data-test":"file-open-save-filename",disabled:i.type==="open"},null,8,["modelValue","disabled"])]),_:1}),e.createVNode(v,{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(v,{class:"mt-2"},{default:e.withCtx(()=>[e.createVNode(m),e.createVNode(c,{variant:"outlined",class:"mx-2","data-test":"file-open-save-cancel-btn",disabled:o.disableButtons,onClick:n[2]||(n[2]=h=>l.show=!1)},{default:e.withCtx(()=>[...n[7]||(n[7]=[e.createTextVNode(" Cancel ",-1)])]),_:1},8,["disabled"]),e.createVNode(c,{ref:"submitBtn",type:"submit",color:"primary",class:"mx-2","data-test":"file-open-save-submit-btn",disabled:o.disableButtons||!!l.error,onClick:e.withModifiers(l.success,["prevent"])},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.submit),1)]),_:1},8,["disabled","onClick"])]),_:1})])]),_:1})],32)]),_:1})]),_:1},8,["modelValue"])}const X=w._export_sfc(q,[["render",Z]]),V=20,$={components:{EditScreenDialog:N},mixins:[y.WidgetComponents],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},playbackMode:{type:String,default:"realtime"},playbackDateTime:{type:Date,default:null}},emits:["close-screen","delete-screen","drag-screen","edit-screen","float-screen","min-max-screen","unfloat-screen"],data(){return{api:null,backup:"",currentDefinition:this.definition,editDialog:!1,expand:!0,configParser:null,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:[],actualScreenItems:[],screenValues:{},updateCounter:0,updater:null,screenId:y.lodashExports.uniqueId("openc3-screen_"),tlmAvailableTimeout:null}},computed:{error:function(){if(this.errorDialog&&this.errors.length>0){let t=new Set,n="";for(const i of this.errors){if(t.has(i.message))continue;let s=`${i.time}: (${i.type}) ${i.message}
4
+ `;n+=s,t.add(i.message)}return n}return null},computedStyle(){var i;let t={};const n=this.width||((i=this.$refs.bar)==null?void 0:i.clientWidth);return this.floated&&(t.position="absolute",t.top=this.top+"px",t.left=this.left+"px",t.width=n+"px"),t}},watch:{count:{handler(t,n){this.currentDefinition=this.definition,this.rerender()}},playbackDateTime:{handler(t,n){this.playbackMode==="playback"&&t&&this.update()}},playbackMode:{handler(t,n){t==="realtime"?this.updateRefreshInterval():(clearInterval(this.updater),this.updater=null)}}},errorCaptured(t,n,i){return this.errors.length<V&&(t.usage?this.errors.push({type:"usage",message:t.message,usage:t.usage,line:t.line,lineNumber:t.lineNumber,time:new Date().getTime()}):this.errors.push({type:"error",message:t,time:new Date().getTime()})),!1},created(){this.api=new y.yi,this.configParser=new y.bi,this.parseDefinition(),this.screenKey=Math.floor(Math.random()*1e6)},mounted(){this.playbackMode==="realtime"&&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),this.tlmAvailableTimeout!=null&&(clearTimeout(this.tlmAvailableTimeout),this.tlmAvailableTimeout=null)},methods:{open(t,n){this.$parent.showScreen(t,n)},close(t,n){this.$parent.closeScreenByName(t,n)},closeAll(){this.$parent.closeAll()},clearErrors:function(){this.errors=[]},updateRefreshInterval:function(){let t=this.pollingPeriod*1e3;this.updater&&clearInterval(this.updater),this.updater=setInterval(()=>{this.update()},t)},parseDefinition:function(){if(this.clearErrors(),this.screenItems=[],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,(t,n,i,s)=>{if(t)switch(t){case"SCREEN":this.configParser.verify_num_parameters(3,4,`${t} <Width or AUTO> <Height or AUTO> <Polling Period>`),this.width=parseInt(n[0]),this.height=parseInt(n[1]),this.pollingPeriod=parseFloat(n[2]);break;case"END":this.configParser.verify_num_parameters(0,0,`${t}`),this.layoutStack.pop(),this.currentLayout=this.layoutStack[this.layoutStack.length-1];break;case"STALE_TIME":this.configParser.verify_num_parameters(1,1,`${t} <Time (s)>`),this.staleTime=parseInt(n[0]);break;case"SUBSETTING":this.configParser.verify_num_parameters(3,null,`${t} <Index> <Widget Type> <Widget Settings...>`),n[1]==="RAW"&&(n[1]="RAW__"+n[2].toLowerCase());case"SETTING":this.configParser.verify_num_parameters(2,null,`${t} <Widget Type> <Widget Settings...>`),n[0]==="RAW"&&(n[0]="RAW__"+n[1].toLowerCase()),(this.currentLayout.widgets[this.currentLayout.widgets.length-1]??this.currentLayout).settings.push(n);break;case"GLOBAL_SUBSETTING":this.configParser.verify_num_parameters(3,null,`${t} <Index> <Widget Type> <Widget Settings...>`),n[2]==="RAW"&&(n[2]="RAW__"+n[3].toLowerCase());case"GLOBAL_SETTING":this.configParser.verify_num_parameters(2,null,`${t} <Widget Type> <Widget Settings...>`),n[1]==="RAW"&&(n[1]="RAW__"+n[2].toLowerCase()),this.globalSettings.push(n);break;default:this.processWidget(t,n,i,s);break}}),typeof this.layoutStack[0]>"u"){let t=[],n=[];for(const i of this.dynamicWidgets)t.push(i.name),n.push(i.lineNumber);this.errors.length<V&&this.errors.push({type:"usage",message:`Unknown widget! Are these widgets: ${t.join(",")}?`,lineNumber:n.join(","),time:new Date().getTime()}),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 t=this.$refs.bar.parentElement.parentElement.parentElement.getBoundingClientRect(),n=this.$refs.bar.getBoundingClientRect();this.top=n.top-t.top-5,this.left=n.left-t.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(t){t=t||window.event,t.preventDefault(),this.dragX=t.clientX,this.dragY=t.clientY,document.onmouseup=this.closeDragElement,document.onmousemove=this.elementDrag},elementDrag:function(t){t=t||window.event,t.preventDefault();let n=this.dragX-t.clientX,i=this.dragY-t.clientY;this.dragX=t.clientX,this.dragY=t.clientY,this.top=this.$refs.bar.offsetTop-i,this.left=this.$refs.bar.offsetLeft-n,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(t){this.editDialog=!1,this.currentDefinition=t,this.rerender(),this.$nextTick(function(){y.fi.post("/openc3-api/screen/",{data:{scope:window.openc3Scope,target:this.target,screen:this.screen,text:this.currentDefinition}},0)})},deleteScreen:function(){this.editDialog=!1,y.fi.delete(`/openc3-api/screen/${this.target}/${this.screen}`).then(t=>{this.$emit("delete-screen")})},minMaxTransition:function(){this.expand=!this.expand,this.$emit("min-max-screen")},processWidget:function(t,n,i,s){let o=null;t==="NAMED_WIDGET"&&(this.configParser.verify_num_parameters(2,null,`${t} <Widget Name> <Widget Type> <Widget Settings... (optional)>`),o=n[0].toUpperCase(),t=n[1].toUpperCase(),n=n.slice(2,n.length));const l=t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()+"Widget";let a=[];if(a.push(["__SCREEN_ID__",this.screenId]),o!==null&&a.push(["NAMED_WIDGET",o]),t==="VERTICAL"||t==="VERTICALBOX"||t==="HORIZONTAL"||t==="HORIZONTALBOX"||t==="MATRIXBYCOLUMNS"||t==="TABBOOK"||t==="TABITEM"||t==="CANVAS"||t==="RADIOGROUP"||t==="SCROLLWINDOW"){const g={type:l,parameters:n,settings:a,screenValues:this.screenValues,screenTimeZone:this.timeZone,widgets:[]};this.layoutStack.push(g),this.currentLayout.widgets.push(g),this.currentLayout=g}else if(this.$options.components[l])this.currentLayout.widgets.push({type:l,target:this.target,parameters:n,settings:a,screenValues:this.screenValues,screenTimeZone:this.timeZone,line:i,lineNumber:s});else{let g={type:"DynamicWidget",target:this.target,parameters:n,settings:a,screenValues:this.screenValues,screenTimeZone:this.timeZone,name:l,line:i,lineNumber:s};this.currentLayout.widgets.push(g),this.dynamicWidgets.push(g)}},applyGlobalSettings:function(t){t.forEach(n=>{this.globalSettings.forEach(i=>{n.type.toLowerCase()===i[0].toLowerCase()+"widget"&&(n.settings.find(o=>o[0]===i[1])||n.settings.push(i.slice(1)))}),n.widgets&&this.applyGlobalSettings(n.widgets)})},update:function(){let t=this.playbackMode==="playback"?this.playbackDateTime:null;this.actualScreenItems.length!==0&&this.api.get_tlm_values(this.actualScreenItems,this.staleTime,this.cacheTimeout,t).then(n=>{n&&n.length>0&&this.updateValues(n)}).catch(n=>{let i=JSON.stringify(n,null,2);this.errors.find(s=>s.message===i)||this.errors.length<V&&this.errors.push({type:"error",message:i,time:new Date().getTime()})})},updateValues:function(t){if(this.updateCounter+=1,t.length!=this.screenItems.length||t.length!=this.actualScreenItems.length)console.log(`get_tlm_values mismatch: data.length: ${t.length}, screenItems.length: ${this.screenItems.length}, actualScreenItems.length: ${this.actualScreenItems.length}`,JSON.stringify(t),JSON.stringify(this.screenItems),JSON.stringify(this.actualScreenItems));else for(let n=0;n<t.length;n++)t[n].push(this.updateCounter),this.screenValues[this.screenItems[n]]=t[n]},debouncedUpdateTlmAvailable:function(){this.tlmAvailableTimeout!=null&&clearTimeout(this.tlmAvailableTimeout),this.tlmAvailableTimeout=setTimeout(()=>{this.api.get_tlm_available(this.screenItems).then(t=>{if(this.actualScreenItems=t,this.screenItems.length!=t.length)console.log("Error getting tlm available",this.screenItems,this.actualScreenItems);else for(let n=0;n<this.actualScreenItems.length;n++)if(this.actualScreenItems[n]===null){const i=this.screenItems[n].split("__"),s=this.currentDefinition.split(`
5
+ `),o=s.findIndex(l=>l.includes(i[0])&&l.includes(i[1])&&l.includes(i[2]))+1;o>0?this.errors.push({type:"usage",message:`Null for ${i.join(" ")}! Does it exist?`,line:s[o-1],lineNumber:o,time:new Date().getTime()}):this.errors.push({type:"error",message:`Null for ${i.join(" ")}! Does it exist?`,time:new Date().getTime()})}}).catch(t=>{console.log("Error getting tlm available",t),this.actualScreenItems=this.screenItems}),this.tlmAvailableTimeout=null},100)},addItem:function(t){this.screenItems.push(t),this.screenValues[t]=[null,null,0],this.debouncedUpdateTlmAvailable()},deleteItem:function(t){let n=this.screenItems.indexOf(t);this.screenItems.splice(n,1),this.debouncedUpdateTlmAvailable()}}},H={ref:"screen",class:"pa-1",style:{position:"relative"}},Y={key:1,class:"pa-1",style:{position:"relative"}};function j(t,n,i,s,o,l){const a=e.resolveComponent("v-btn"),g=e.resolveComponent("v-tooltip"),m=e.resolveComponent("v-spacer"),d=e.resolveComponent("v-toolbar"),v=e.resolveComponent("v-overlay"),_=e.resolveComponent("vertical-widget"),x=e.resolveComponent("v-expand-transition"),c=e.resolveComponent("v-card"),r=e.resolveComponent("edit-screen-dialog"),p=e.resolveComponent("v-textarea"),u=e.resolveComponent("v-card-actions"),h=e.resolveComponent("v-dialog");return e.openBlock(),e.createElementBlock("div",{ref:"bar",style:e.normalizeStyle(l.computedStyle)},[i.inline?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(c,{key:0,"min-height":o.height,"min-width":o.width,style:{cursor:"default"}},{default:e.withCtx(()=>[e.createVNode(d,{height:"24"},{default:e.withCtx(()=>[e.withDirectives(e.createVNode(a,{icon:"mdi-alert",variant:"text",density:"compact","data-test":"error-graph-icon","aria-label":"Show Errors",onClick:n[0]||(n[0]=()=>{o.errorDialog=!0})},null,512),[[e.vShow,o.errors.length!==0]]),e.createVNode(a,{icon:"mdi-pencil",variant:"text",density:"compact","data-test":"edit-screen-icon","aria-label":"Edit Screen",onClick:l.openEdit},null,8,["onClick"]),i.fixFloated?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(g,{key:0,"open-delay":600,location:"top"},{activator:e.withCtx(({props:C})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(C)),[e.createVNode(a,{icon:o.floated?"mdi-balloon":"mdi-view-grid-outline",variant:"text",density:"compact","data-test":"float-screen-icon","aria-label":o.floated?"Unfloat Screen":"Float Screen",onClick:l.floatScreen},null,8,["icon","aria-label","onClick"])],16)]),default:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(o.floated?"Unfloat Screen":"Float Screen"),1)]),_:1})),o.floated?(e.openBlock(),e.createBlock(g,{key:1,"open-delay":600,location:"top"},{activator:e.withCtx(({props:C})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(C)),[e.createVNode(a,{icon:"mdi-arrow-up",variant:"text",density:"compact","data-test":"up-screen-icon","aria-label":"Move Screen Up",onClick:l.upScreen},null,8,["onClick"])],16)]),default:e.withCtx(()=>[n[6]||(n[6]=e.createElementVNode("span",null," Move Screen Up ",-1))]),_:1})):e.createCommentVNode("",!0),o.floated&&o.zIndex>i.minZ?(e.openBlock(),e.createBlock(g,{key:2,"open-delay":600,location:"top"},{activator:e.withCtx(({props:C})=>[e.createElementVNode("div",e.normalizeProps(e.guardReactiveProps(C)),[e.createVNode(a,{icon:"mdi-arrow-down",variant:"text",density:"compact","data-test":"down-screen-icon","aria-label":"Move Screen Down",onClick:l.downScreen},null,8,["onClick"])],16)]),default:e.withCtx(()=>[n[7]||(n[7]=e.createElementVNode("span",null," Move Screen Down ",-1))]),_:1})):e.createCommentVNode("",!0),e.createVNode(m),e.createElementVNode("span",null,e.toDisplayString(i.target)+" "+e.toDisplayString(i.screen),1),e.createVNode(m),o.expand?(e.openBlock(),e.createBlock(a,{key:3,icon:"mdi-window-minimize",variant:"text",density:"compact","data-test":"minimize-screen-icon","aria-label":"Minimize Screen",onClick:l.minMaxTransition},null,8,["onClick"])):(e.openBlock(),e.createBlock(a,{key:4,icon:"mdi-window-maximize",variant:"text",density:"compact","data-test":"maximize-screen-icon","aria-label":"Maximize Screen",onClick:l.minMaxTransition},null,8,["onClick"])),i.showClose?(e.openBlock(),e.createBlock(a,{key:5,icon:"mdi-close-box",variant:"text",density:"compact","data-test":"close-screen-icon","aria-label":"Close Screen",onClick:n[1]||(n[1]=C=>t.$emit("close-screen"))})):e.createCommentVNode("",!0)]),_:1}),o.editDialog?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0},{default:e.withCtx(()=>[e.withDirectives(e.createElementVNode("div",H,[e.createVNode(v,{style:{"pointer-events":"none"},"model-value":o.errors.length!==0,opacity:"0.8",absolute:"",attach:"","scroll-strategy":"none"},null,8,["model-value"]),(e.openBlock(),e.createBlock(_,{key:o.screenKey,widgets:o.layoutStack[0].widgets,"screen-values":o.screenValues,"screen-time-zone":i.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,o.expand]])]),_:1}))]),_:1},8,["min-height","min-width"])),i.inline?(e.openBlock(),e.createElementBlock("div",Y,[e.createVNode(v,{style:{"pointer-events":"none"},"model-value":o.errors.length!==0,opacity:"0.8",absolute:"",attach:"","scroll-strategy":"none"},null,8,["model-value"]),e.withDirectives(e.createVNode(a,{icon:"mdi-alert",variant:"text",density:"compact","data-test":"error-graph-icon","aria-label":"Show Errors",onClick:n[2]||(n[2]=()=>{o.errorDialog=!0})},null,512),[[e.vShow,o.errors.length!==0]]),(e.openBlock(),e.createBlock(_,{key:o.screenKey,widgets:o.layoutStack[0].widgets,"screen-values":o.screenValues,"screen-time-zone":i.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),o.editDialog?(e.openBlock(),e.createBlock(r,{key:2,modelValue:o.editDialog,"onUpdate:modelValue":n[3]||(n[3]=C=>o.editDialog=C),target:i.target,screen:i.screen,definition:o.currentDefinition,keywords:i.keywords,errors:o.errors,onSave:l.saveEdit,onCancel:l.cancelEdit,onDelete:l.deleteScreen},null,8,["modelValue","target","screen","definition","keywords","errors","onSave","onCancel","onDelete"])):e.createCommentVNode("",!0),e.createVNode(h,{modelValue:o.errorDialog,"onUpdate:modelValue":n[5]||(n[5]=C=>o.errorDialog=C),width:"60vw"},{default:e.withCtx(()=>[e.createVNode(d,{height:"24"},{default:e.withCtx(()=>[e.createVNode(m),e.createElementVNode("span",null," Screen: "+e.toDisplayString(i.target)+" "+e.toDisplayString(i.screen)+" Errors ",1),e.createVNode(m)]),_:1}),e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(p,{class:"errors",readonly:"",rows:"13","model-value":l.error},null,8,["model-value"]),e.createVNode(u,{class:"pb-5"},{default:e.withCtx(()=>[e.createVNode(m),e.createVNode(a,{variant:"outlined",class:"mr-2",onClick:l.clearErrors},{default:e.withCtx(()=>[...n[8]||(n[8]=[e.createTextVNode(" Clear Errors ",-1)])]),_:1},8,["onClick"]),e.createVNode(a,{variant:"flat",class:"mr-2",onClick:n[4]||(n[4]=C=>o.errorDialog=!1)},{default:e.withCtx(()=>[...n[9]||(n[9]=[e.createTextVNode(" Close ",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])],4)}const J=w._export_sfc($,[["render",j],["__scopeId","data-v-dca85517"]]);exports.EditScreenDialog=N;exports.EnvironmentDialog=M;exports.FileOpenSaveDialog=X;exports.Openc3Screen=J;exports.ScreenCompleter=k;
6
+ //# sourceMappingURL=Openc3Screen-CzD9BB0M.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Openc3Screen-CzD9BB0M.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 suggestions['LATEST'] = 'LATEST values from all packets'\n } else if (current['Item name']) {\n let target_name = parsedLine[parsedLine.length - 3]\n let packet_name = parsedLine[parsedLine.length - 2]\n if (packet_name === 'LATEST') {\n let items = await this.api.get_all_tlm_item_names(target_name)\n suggestions = {}\n items.forEach((item) => {\n suggestions[item] = `LATEST ${item}`\n })\n } else {\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 }\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 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<template>\n <!-- Edit dialog -->\n <v-dialog\n v-model=\"show\"\n persistent\n width=\"75vw\"\n @keydown.esc=\"$emit('cancel')\"\n >\n <v-card>\n <v-toolbar height=\"24\">\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-delete\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"delete-screen-icon\"\n @click=\"deleteScreen\"\n />\n <v-spacer />\n <span> Edit Screen: {{ target }} {{ screen }} </span>\n <v-spacer />\n <v-btn\n class=\"mx-2\"\n icon=\"mdi-download\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"download-screen-icon\"\n @click=\"downloadScreen\"\n />\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 :disabled=\"!file\"\n color=\"primary\"\n class=\"mr-3\"\n data-test=\"edit-screen-load\"\n @click=\"loadFile\"\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\" />\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.\n </span>\n <v-spacer />\n <v-btn\n class=\"mx-2\"\n variant=\"outlined\"\n data-test=\"edit-screen-cancel\"\n @click=\"$emit('cancel')\"\n >\n Cancel\n </v-btn>\n <v-btn\n class=\"mx-2\"\n color=\"primary\"\n data-test=\"edit-screen-save\"\n @click=\"$emit('save', editor.getValue())\"\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 emits: ['cancel', 'delete', 'save', 'update:modelValue'],\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\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 @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 #item.actions=\"{ item }\">\n <v-btn\n icon=\"mdi-delete\"\n variant=\"text\"\n class=\"mt-1\"\n data-test=\"item-delete\"\n aria-label=\"Delete Environment Variable\"\n @click=\"deleteEnvironment(item)\"\n />\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 block\n type=\"submit\"\n color=\"primary\"\n data-test=\"add-env\"\n :disabled=\"!key || !keyValue\"\n @click.prevent=\"addEnvironment\"\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 <v-tooltip\n v-model=\"globalTooltip.show\"\n :text=\"globalTooltip.text\"\n location=\"top\"\n :style=\"`position: fixed; left: ${globalTooltip.x}px; top: ${globalTooltip.y}px; pointer-events: none;`\"\n />\n\n <div class=\"tree-node\">\n <div v-if=\"showNode\" class=\"node-content\" @click=\"handleClick(node)\">\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=\"text-h6\"\n :tabindex=\"node.children ? -1 : 0\"\n @keyup.enter=\"handleClick(node)\"\n @mouseenter=\"showGlobalTooltip($event, node.title)\"\n @mouseleave=\"hideGlobalTooltip\"\n >\n {{ node.title }}\n </span>\n\n <v-btn\n v-if=\"node.title === '__TEMP__'\"\n icon=\"mdi-delete\"\n variant=\"text\"\n style=\"margin-left: auto\"\n aria-label=\"Delete\"\n @click=\"emit('delete')\"\n />\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.value = 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 globalTooltip = ref({\n show: false,\n text: '',\n x: 0,\n y: 0,\n})\n\nconst showGlobalTooltip = (event, text) => {\n // Only show tooltip if text is long enough to potentially overflow\n if (!text || text.length <= 50) return\n\n const rect = event.target.getBoundingClientRect()\n const centerX = rect.left\n const centerY = rect.top\n\n globalTooltip.value.text = text\n globalTooltip.value.x = centerX\n globalTooltip.value.y = centerY - 40\n globalTooltip.value.show = true\n}\n\nconst hideGlobalTooltip = () => {\n globalTooltip.value.show = false\n}\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.value = !isOpen.value\n props.node.isOpen = isOpen.value\n emit('nodeToggled', props.node.id, isOpen.value)\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\n v-model=\"show\"\n persistent\n width=\"800\"\n @keydown.enter=\"success()\"\n @keydown.esc=\"disableButtons ? null : (show = false)\"\n >\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 @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 v-show=\"error\"\n class=\"my-2 text-red\"\n style=\"white-space: pre-line\"\n >\n {{ error }}\n </div>\n </v-row>\n <v-row class=\"mt-2\">\n <v-spacer />\n <v-btn\n variant=\"outlined\"\n class=\"mx-2\"\n data-test=\"file-open-save-cancel-btn\"\n :disabled=\"disableButtons\"\n @click=\"show = false\"\n >\n Cancel\n </v-btn>\n <v-btn\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 @click.prevent=\"success\"\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 customHelpText: String, // Optional custom help text to display\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.customHelpText) {\n return this.customHelpText\n }\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 2025, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n#\n# 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 ref=\"bar\" :style=\"computedStyle\">\n <v-card\n v-if=\"!inline\"\n :min-height=\"height\"\n :min-width=\"width\"\n style=\"cursor: default\"\n >\n <v-toolbar height=\"24\">\n <v-btn\n v-show=\"errors.length !== 0\"\n icon=\"mdi-alert\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"error-graph-icon\"\n aria-label=\"Show Errors\"\n @click=\"\n () => {\n errorDialog = true\n }\n \"\n />\n <v-btn\n icon=\"mdi-pencil\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"edit-screen-icon\"\n aria-label=\"Edit Screen\"\n @click=\"openEdit\"\n />\n <v-tooltip v-if=\"!fixFloated\" :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-btn\n :icon=\"floated ? 'mdi-balloon' : 'mdi-view-grid-outline'\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"float-screen-icon\"\n :aria-label=\"floated ? 'Unfloat Screen' : 'Float Screen'\"\n @click=\"floatScreen\"\n />\n </div>\n </template>\n <span> {{ floated ? 'Unfloat Screen' : 'Float Screen' }} </span>\n </v-tooltip>\n <v-tooltip v-if=\"floated\" :open-delay=\"600\" location=\"top\">\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-btn\n icon=\"mdi-arrow-up\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"up-screen-icon\"\n aria-label=\"Move Screen Up\"\n @click=\"upScreen\"\n />\n </div>\n </template>\n <span> Move Screen Up </span>\n </v-tooltip>\n <v-tooltip\n v-if=\"floated && zIndex > minZ\"\n :open-delay=\"600\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <div v-bind=\"props\">\n <v-btn\n icon=\"mdi-arrow-down\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"down-screen-icon\"\n aria-label=\"Move Screen Down\"\n @click=\"downScreen\"\n />\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-btn\n v-if=\"expand\"\n icon=\"mdi-window-minimize\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"minimize-screen-icon\"\n aria-label=\"Minimize Screen\"\n @click=\"minMaxTransition\"\n />\n <v-btn\n v-else\n icon=\"mdi-window-maximize\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"maximize-screen-icon\"\n aria-label=\"Maximize Screen\"\n @click=\"minMaxTransition\"\n />\n <v-btn\n v-if=\"showClose\"\n icon=\"mdi-close-box\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"close-screen-icon\"\n aria-label=\"Close Screen\"\n @click=\"$emit('close-screen')\"\n />\n </v-toolbar>\n <v-expand-transition v-if=\"!editDialog\">\n <div\n v-show=\"expand\"\n ref=\"screen\"\n class=\"pa-1\"\n style=\"position: relative\"\n >\n <v-overlay\n style=\"pointer-events: none\"\n :model-value=\"errors.length !== 0\"\n opacity=\"0.8\"\n absolute\n attach\n scroll-strategy=\"none\"\n />\n <vertical-widget\n :key=\"screenKey\"\n :widgets=\"layoutStack[0].widgets\"\n :screen-values=\"screenValues\"\n :screen-time-zone=\"timeZone\"\n @add-item=\"addItem\"\n @delete-item=\"deleteItem\"\n @open=\"open\"\n @close=\"close\"\n @close-all=\"closeAll\"\n />\n </div>\n </v-expand-transition>\n </v-card>\n\n <div v-if=\"inline\" class=\"pa-1\" style=\"position: relative\">\n <v-overlay\n style=\"pointer-events: none\"\n :model-value=\"errors.length !== 0\"\n opacity=\"0.8\"\n absolute\n attach\n scroll-strategy=\"none\"\n />\n <v-btn\n v-show=\"errors.length !== 0\"\n icon=\"mdi-alert\"\n variant=\"text\"\n density=\"compact\"\n data-test=\"error-graph-icon\"\n aria-label=\"Show Errors\"\n @click=\"\n () => {\n errorDialog = true\n }\n \"\n />\n <vertical-widget\n :key=\"screenKey\"\n :widgets=\"layoutStack[0].widgets\"\n :screen-values=\"screenValues\"\n :screen-time-zone=\"timeZone\"\n @add-item=\"addItem\"\n @delete-item=\"deleteItem\"\n @open=\"open\"\n @close=\"close\"\n @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\"\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-actions class=\"pb-5\">\n <v-spacer />\n <v-btn variant=\"outlined\" class=\"mr-2\" @click=\"clearErrors\">\n Clear Errors\n </v-btn>\n <v-btn variant=\"flat\" class=\"mr-2\" @click=\"errorDialog = false\">\n Close\n </v-btn>\n </v-card-actions>\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 components: {\n EditScreenDialog,\n },\n mixins: [WidgetComponents],\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 playbackMode: {\n type: String,\n default: 'realtime',\n },\n playbackDateTime: {\n type: Date,\n default: null,\n },\n },\n emits: [\n 'close-screen',\n 'delete-screen',\n 'drag-screen',\n 'edit-screen',\n 'float-screen',\n 'min-max-screen',\n 'unfloat-screen',\n ],\n data() {\n return {\n api: null,\n backup: '',\n currentDefinition: this.definition,\n editDialog: false,\n expand: true,\n configParser: null,\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 actualScreenItems: [],\n screenValues: {},\n updateCounter: 0,\n updater: null,\n screenId: uniqueId('openc3-screen_'),\n tlmAvailableTimeout: null,\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 watch: {\n count: {\n handler(newValue, oldValue) {\n this.currentDefinition = this.definition\n this.rerender()\n },\n },\n playbackDateTime: {\n handler(newValue, oldValue) {\n if (this.playbackMode === 'playback' && newValue) {\n this.update()\n }\n },\n },\n playbackMode: {\n handler(newValue, oldValue) {\n if (newValue === 'realtime') {\n this.updateRefreshInterval()\n } else {\n // Initially playback just clears all updates\n // The play button restarts the updater\n clearInterval(this.updater)\n this.updater = null\n }\n },\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 if (this.errors.length < MAX_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 }\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 if (this.playbackMode === 'realtime') {\n this.updateRefreshInterval()\n }\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 if (this.tlmAvailableTimeout != null) {\n clearTimeout(this.tlmAvailableTimeout)\n this.tlmAvailableTimeout = 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 },\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.screenItems = []\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 'SUBSETTING':\n this.configParser.verify_num_parameters(\n 3,\n null,\n `${keyword} <Index> <Widget Type> <Widget Settings...>`,\n )\n if (parameters[1] === 'RAW') {\n parameters[1] = 'RAW__' + parameters[2].toLowerCase()\n }\n case 'SETTING':\n this.configParser.verify_num_parameters(\n 2,\n null,\n `${keyword} <Widget Type> <Widget Settings...>`,\n )\n if (parameters[0] === 'RAW') {\n parameters[0] = 'RAW__' + parameters[1].toLowerCase()\n }\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_SUBSETTING':\n this.configParser.verify_num_parameters(\n 3,\n null,\n `${keyword} <Index> <Widget Type> <Widget Settings...>`,\n )\n if (parameters[2] === 'RAW') {\n parameters[2] = 'RAW__' + parameters[3].toLowerCase()\n }\n case 'GLOBAL_SETTING':\n this.configParser.verify_num_parameters(\n 2,\n null,\n `${keyword} <Widget Type> <Widget Settings...>`,\n )\n if (parameters[1] === 'RAW') {\n parameters[1] = 'RAW__' + parameters[2].toLowerCase()\n }\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 }\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 const existingSetting = widget.settings.find(\n (s) => s[0] === setting[1],\n )\n if (!existingSetting) {\n widget.settings.push(setting.slice(1))\n }\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 // Only pass the dateTime if we're in playback mode, null means realtime\n let dateTime =\n this.playbackMode === 'playback' ? this.playbackDateTime : null\n if (this.actualScreenItems.length !== 0) {\n this.api\n .get_tlm_values(\n this.actualScreenItems,\n this.staleTime,\n this.cacheTimeout,\n dateTime,\n )\n .then((data) => {\n if (data && data.length > 0) {\n this.updateValues(data)\n }\n })\n .catch((error) => {\n let message = JSON.stringify(error, null, 2)\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 if (\n values.length != this.screenItems.length ||\n values.length != this.actualScreenItems.length\n ) {\n // eslint-disable-next-line no-console\n console.log(\n `get_tlm_values mismatch: data.length: ${values.length}, screenItems.length: ${this.screenItems.length}, actualScreenItems.length: ${this.actualScreenItems.length}`,\n JSON.stringify(values),\n JSON.stringify(this.screenItems),\n JSON.stringify(this.actualScreenItems),\n )\n } else {\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 },\n debouncedUpdateTlmAvailable: function () {\n if (this.tlmAvailableTimeout != null) {\n clearTimeout(this.tlmAvailableTimeout)\n }\n this.tlmAvailableTimeout = setTimeout(() => {\n this.api\n .get_tlm_available(this.screenItems)\n .then((data) => {\n this.actualScreenItems = data\n // This must be the same or we're going to have problems\n // because the data comes back in an ordered array\n if (this.screenItems.length != data.length) {\n // eslint-disable-next-line no-console\n console.log(\n 'Error getting tlm available',\n this.screenItems,\n this.actualScreenItems,\n )\n } else {\n for (let i = 0; i < this.actualScreenItems.length; i++) {\n if (this.actualScreenItems[i] === null) {\n // Try to find the line in the screen definition for this item\n const parts = this.screenItems[i].split('__')\n const lines = this.currentDefinition.split('\\n')\n const itemLine =\n lines.findIndex(\n (line) =>\n line.includes(parts[0]) &&\n line.includes(parts[1]) &&\n line.includes(parts[2]),\n ) + 1 // +1 for 1-based line number\n if (itemLine > 0) {\n this.errors.push({\n type: 'usage',\n message: `Null for ${parts.join(' ')}! Does it exist?`,\n line: lines[itemLine - 1], // 0-based line array\n lineNumber: itemLine,\n time: new Date().getTime(),\n })\n } else {\n this.errors.push({\n type: 'error',\n message: `Null for ${parts.join(' ')}! Does it exist?`,\n time: new Date().getTime(),\n })\n }\n }\n }\n }\n })\n .catch((error) => {\n // eslint-disable-next-line\n console.log('Error getting tlm available', error)\n this.actualScreenItems = this.screenItems\n })\n this.tlmAvailableTimeout = null\n }, 100)\n },\n addItem: function (valueId) {\n this.screenItems.push(valueId)\n this.screenValues[valueId] = [null, null, 0]\n this.debouncedUpdateTlmAvailable()\n },\n deleteItem: function (valueId) {\n let index = this.screenItems.indexOf(valueId)\n this.screenItems.splice(index, 1)\n this.debouncedUpdateTlmAvailable()\n },\n },\n}\n</script>\n\n<style scoped>\n.errors {\n padding-top: 0px;\n margin-top: 0px;\n}\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","result","more","current","acc","curr","target_name","pkt","packet_name","items","item","x","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","_createBlock","_component_v_dialog","$options","$event","_ctx","_createVNode","_component_v_card","_component_v_toolbar","_component_v_btn","_component_v_spacer","_createElementVNode","_toDisplayString","$props","_component_v_card_text","_component_v_row","_cache","$data","_component_v_file_input","args","_component_v_menu","_component_v_list","_component_v_list_item","_component_v_list_item_title","_createTextVNode","_component_v_divider","_openBlock","_createElementBlock","_Fragment","_renderList","index","alertEvent","env","_hoisted_1","_component_v_text_field","_component_v_data_table","_withCtx","_component_v_col","props","__props","isOpen","ref","showNode","computed","_nodeOrChildMatchesSearch","node","_a","watch","newpath","newSearch","toggle","emit","__emit","globalTooltip","showGlobalTooltip","text","rect","centerX","centerY","hideGlobalTooltip","handleClick","bubbleNodeToggled","nodeName","bubbleNodeRequest","_component_v_tooltip","_hoisted_2","_component_v_icon","_withKeys","_hoisted_3","_hoisted_4","_hoisted_5","child","_component_tree_node","TreeNode","message","alphanumeric","expression","target","filename","fileIcon","file","id","found","root","name","locked","breakpoints","level","path","parts","_component_v_overlay","_component_v_progress_circular","MAX_ERRORS","EditScreenDialog","WidgetComponents","uniqueId","style","origWidth","newValue","oldValue","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","s","dateTime","data","existing","values","i","itemLine","valueId","_vShow","_component_v_expand_transition","_withDirectives","_component_vertical_widget","_component_edit_screen_dialog","_component_v_textarea","_component_v_card_actions"],"mappings":"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"}