@openc3/vue-common 7.1.1 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/dist/{ArrayWidget-CmKZQfWB.js → ArrayWidget-D1PArcGr.js} +5 -5
  2. package/dist/{ArrayWidget-CmKZQfWB.js.map → ArrayWidget-D1PArcGr.js.map} +1 -1
  3. package/dist/{ArrayWidget-D_zfyp9k.cjs → ArrayWidget-sQ40q9fv.cjs} +2 -2
  4. package/dist/{ArrayWidget-D_zfyp9k.cjs.map → ArrayWidget-sQ40q9fv.cjs.map} +1 -1
  5. package/dist/{ArrayplotWidget-CK5o4lO8.cjs → ArrayplotWidget-CEBmTpZH.cjs} +2 -2
  6. package/dist/{ArrayplotWidget-CK5o4lO8.cjs.map → ArrayplotWidget-CEBmTpZH.cjs.map} +1 -1
  7. package/dist/{ArrayplotWidget-D5McM1rY.js → ArrayplotWidget-DPUPy0qM.js} +5 -5
  8. package/dist/{ArrayplotWidget-D5McM1rY.js.map → ArrayplotWidget-DPUPy0qM.js.map} +1 -1
  9. package/dist/{BarColumn-BsS8Fdyl.cjs → BarColumn-BHCgIHhm.cjs} +2 -2
  10. package/dist/{BarColumn-BsS8Fdyl.cjs.map → BarColumn-BHCgIHhm.cjs.map} +1 -1
  11. package/dist/{BarColumn-BtP1cQcf.js → BarColumn-BpdscDQf.js} +3 -3
  12. package/dist/{BarColumn-BtP1cQcf.js.map → BarColumn-BpdscDQf.js.map} +1 -1
  13. package/dist/{BlockWidget-CtBgkMYu.cjs → BlockWidget-BzUgw2-i.cjs} +2 -2
  14. package/dist/{BlockWidget-CtBgkMYu.cjs.map → BlockWidget-BzUgw2-i.cjs.map} +1 -1
  15. package/dist/{BlockWidget-BKMse4hP.js → BlockWidget-_VUsK5T9.js} +5 -5
  16. package/dist/{BlockWidget-BKMse4hP.js.map → BlockWidget-_VUsK5T9.js.map} +1 -1
  17. package/dist/{ButtonWidget-hNa6zzSd.cjs → ButtonWidget-D8BhMKz_.cjs} +3 -3
  18. package/dist/{ButtonWidget-hNa6zzSd.cjs.map → ButtonWidget-D8BhMKz_.cjs.map} +1 -1
  19. package/dist/{ButtonWidget-BLNVL46w.js → ButtonWidget-DE41o-cg.js} +7 -7
  20. package/dist/{ButtonWidget-BLNVL46w.js.map → ButtonWidget-DE41o-cg.js.map} +1 -1
  21. package/dist/{CanvasWidget-1jy1JskS.js → CanvasWidget-BEi8h3Mq.js} +2 -2
  22. package/dist/{CanvasWidget-1jy1JskS.js.map → CanvasWidget-BEi8h3Mq.js.map} +1 -1
  23. package/dist/{CanvasWidget-BldZDkOl.cjs → CanvasWidget-DplsGt-k.cjs} +2 -2
  24. package/dist/{CanvasWidget-BldZDkOl.cjs.map → CanvasWidget-DplsGt-k.cjs.map} +1 -1
  25. package/dist/{CanvasdotWidget-D1yQLRDN.cjs → CanvasdotWidget-CLzrz9dr.cjs} +2 -2
  26. package/dist/{CanvasdotWidget-D1yQLRDN.cjs.map → CanvasdotWidget-CLzrz9dr.cjs.map} +1 -1
  27. package/dist/{CanvasdotWidget-DxuFGoWt.js → CanvasdotWidget-eZuMgkhL.js} +2 -2
  28. package/dist/{CanvasdotWidget-DxuFGoWt.js.map → CanvasdotWidget-eZuMgkhL.js.map} +1 -1
  29. package/dist/{CanvasimageWidget-D8DConb8.cjs → CanvasimageWidget-66HcpffG.cjs} +2 -2
  30. package/dist/{CanvasimageWidget-D8DConb8.cjs.map → CanvasimageWidget-66HcpffG.cjs.map} +1 -1
  31. package/dist/{CanvasimageWidget-B_JxCI_f.js → CanvasimageWidget-COv_Qnc8.js} +3 -3
  32. package/dist/{CanvasimageWidget-B_JxCI_f.js.map → CanvasimageWidget-COv_Qnc8.js.map} +1 -1
  33. package/dist/{CanvasimagevalueWidget-DwHIZzWo.js → CanvasimagevalueWidget-BhuUqLOo.js} +3 -3
  34. package/dist/{CanvasimagevalueWidget-DwHIZzWo.js.map → CanvasimagevalueWidget-BhuUqLOo.js.map} +1 -1
  35. package/dist/{CanvasimagevalueWidget-BL08pdLh.cjs → CanvasimagevalueWidget-DcoH1Rzz.cjs} +2 -2
  36. package/dist/{CanvasimagevalueWidget-BL08pdLh.cjs.map → CanvasimagevalueWidget-DcoH1Rzz.cjs.map} +1 -1
  37. package/dist/CanvaslabelWidget-DtvbgeYH.js +27 -0
  38. package/dist/CanvaslabelWidget-DtvbgeYH.js.map +1 -0
  39. package/dist/CanvaslabelWidget-wcraOzwr.cjs +2 -0
  40. package/dist/CanvaslabelWidget-wcraOzwr.cjs.map +1 -0
  41. package/dist/{CanvaslabelvalueWidget-D1-kZsi-.js → CanvaslabelvalueWidget-C_FRIeNb.js} +2 -2
  42. package/dist/{CanvaslabelvalueWidget-D1-kZsi-.js.map → CanvaslabelvalueWidget-C_FRIeNb.js.map} +1 -1
  43. package/dist/{CanvaslabelvalueWidget-BhL55tjO.cjs → CanvaslabelvalueWidget-CkkDoL8i.cjs} +2 -2
  44. package/dist/{CanvaslabelvalueWidget-BhL55tjO.cjs.map → CanvaslabelvalueWidget-CkkDoL8i.cjs.map} +1 -1
  45. package/dist/{CanvaslineWidget-Din8LMyF.js → CanvaslineWidget-D1K_6mAY.js} +2 -2
  46. package/dist/{CanvaslineWidget-Din8LMyF.js.map → CanvaslineWidget-D1K_6mAY.js.map} +1 -1
  47. package/dist/{CanvaslineWidget-DtkdP3Bb.cjs → CanvaslineWidget-Da1Bf4Df.cjs} +2 -2
  48. package/dist/{CanvaslineWidget-DtkdP3Bb.cjs.map → CanvaslineWidget-Da1Bf4Df.cjs.map} +1 -1
  49. package/dist/{CanvaslinevalueWidget-ELgzjZeY.cjs → CanvaslinevalueWidget-ChY93jQz.cjs} +2 -2
  50. package/dist/{CanvaslinevalueWidget-ELgzjZeY.cjs.map → CanvaslinevalueWidget-ChY93jQz.cjs.map} +1 -1
  51. package/dist/{CanvaslinevalueWidget-DOrasE2j.js → CanvaslinevalueWidget-D4eaxWhR.js} +2 -2
  52. package/dist/{CanvaslinevalueWidget-DOrasE2j.js.map → CanvaslinevalueWidget-D4eaxWhR.js.map} +1 -1
  53. package/dist/{CheckbuttonWidget-A07FryqU.js → CheckbuttonWidget-ByxMDkiS.js} +2 -2
  54. package/dist/{CheckbuttonWidget-A07FryqU.js.map → CheckbuttonWidget-ByxMDkiS.js.map} +1 -1
  55. package/dist/{CheckbuttonWidget-BFjaAmt-.cjs → CheckbuttonWidget-C1iDNOXO.cjs} +2 -2
  56. package/dist/{CheckbuttonWidget-BFjaAmt-.cjs.map → CheckbuttonWidget-C1iDNOXO.cjs.map} +1 -1
  57. package/dist/{ClassificationBanners-ClraI2Ns.js → ClassificationBanners-By6aaadq.js} +2 -2
  58. package/dist/{ClassificationBanners-ClraI2Ns.js.map → ClassificationBanners-By6aaadq.js.map} +1 -1
  59. package/dist/{ClassificationBanners-DCL0KBCW.cjs → ClassificationBanners-D0wqqFTp.cjs} +2 -2
  60. package/dist/{ClassificationBanners-DCL0KBCW.cjs.map → ClassificationBanners-D0wqqFTp.cjs.map} +1 -1
  61. package/dist/{ComboboxWidget-CqZ79bCh.cjs → ComboboxWidget-B6kRwkHm.cjs} +2 -2
  62. package/dist/{ComboboxWidget-CqZ79bCh.cjs.map → ComboboxWidget-B6kRwkHm.cjs.map} +1 -1
  63. package/dist/{ComboboxWidget-xayce-aY.js → ComboboxWidget-CAGxGv2r.js} +2 -2
  64. package/dist/{ComboboxWidget-xayce-aY.js.map → ComboboxWidget-CAGxGv2r.js.map} +1 -1
  65. package/dist/{CriticalCmdDialog-ne9rOh2L.js → CriticalCmdDialog-BOA6-qrE.js} +4 -4
  66. package/dist/{CriticalCmdDialog-ne9rOh2L.js.map → CriticalCmdDialog-BOA6-qrE.js.map} +1 -1
  67. package/dist/{CriticalCmdDialog-DmhxVXdn.cjs → CriticalCmdDialog-DB9iMK3r.cjs} +2 -2
  68. package/dist/{CriticalCmdDialog-DmhxVXdn.cjs.map → CriticalCmdDialog-DB9iMK3r.cjs.map} +1 -1
  69. package/dist/{DateWidget-xU2zuIE3.cjs → DateWidget-C3iCuWog.cjs} +2 -2
  70. package/dist/{DateWidget-xU2zuIE3.cjs.map → DateWidget-C3iCuWog.cjs.map} +1 -1
  71. package/dist/{DateWidget-DrYZJta_.js → DateWidget-DkNWx28s.js} +4 -4
  72. package/dist/{DateWidget-DrYZJta_.js.map → DateWidget-DkNWx28s.js.map} +1 -1
  73. package/dist/{DetailsDialog-V6X078bY.cjs → DetailsDialog-C0q3d_JF.cjs} +2 -2
  74. package/dist/{DetailsDialog-V6X078bY.cjs.map → DetailsDialog-C0q3d_JF.cjs.map} +1 -1
  75. package/dist/{DetailsDialog-CFCaJZWz.js → DetailsDialog-F4KgYM6m.js} +10 -10
  76. package/dist/{DetailsDialog-CFCaJZWz.js.map → DetailsDialog-F4KgYM6m.js.map} +1 -1
  77. package/dist/EventListDialog-CDZFdKNU.cjs +2 -0
  78. package/dist/EventListDialog-CDZFdKNU.cjs.map +1 -0
  79. package/dist/{EventListDialog-CIc8RCyY.js → EventListDialog-g0Y3PS7i.js} +26 -23
  80. package/dist/EventListDialog-g0Y3PS7i.js.map +1 -0
  81. package/dist/{FilechecksumWidget-CTf0XGST.js → FilechecksumWidget-DSfNEnDJ.js} +6 -6
  82. package/dist/{FilechecksumWidget-CTf0XGST.js.map → FilechecksumWidget-DSfNEnDJ.js.map} +1 -1
  83. package/dist/{FilechecksumWidget-JeWqA6dh.cjs → FilechecksumWidget-DxpkQwol.cjs} +2 -2
  84. package/dist/{FilechecksumWidget-JeWqA6dh.cjs.map → FilechecksumWidget-DxpkQwol.cjs.map} +1 -1
  85. package/dist/{FiledisplayWidget-DLJuesmU.js → FiledisplayWidget-D2cxMmrP.js} +5 -5
  86. package/dist/{FiledisplayWidget-DLJuesmU.js.map → FiledisplayWidget-D2cxMmrP.js.map} +1 -1
  87. package/dist/{FiledisplayWidget-B6XFz4P6.cjs → FiledisplayWidget-DZ186686.cjs} +2 -2
  88. package/dist/{FiledisplayWidget-B6XFz4P6.cjs.map → FiledisplayWidget-DZ186686.cjs.map} +1 -1
  89. package/dist/{FormatvalueWidget-DODmUWPH.js → FormatvalueWidget-6-bj_PJO.js} +3 -3
  90. package/dist/{FormatvalueWidget-DODmUWPH.js.map → FormatvalueWidget-6-bj_PJO.js.map} +1 -1
  91. package/dist/{FormatvalueWidget-DHHKnH8A.cjs → FormatvalueWidget-DYvEvnXQ.cjs} +2 -2
  92. package/dist/{FormatvalueWidget-DHHKnH8A.cjs.map → FormatvalueWidget-DYvEvnXQ.cjs.map} +1 -1
  93. package/dist/{Graph-Cwghj5Pc.js → Graph-Cz0Ns1FD.js} +9 -9
  94. package/dist/{Graph-Cwghj5Pc.js.map → Graph-Cz0Ns1FD.js.map} +1 -1
  95. package/dist/{Graph-BtMRutcx.cjs → Graph-Dz9GecGm.cjs} +2 -2
  96. package/dist/{Graph-BtMRutcx.cjs.map → Graph-Dz9GecGm.cjs.map} +1 -1
  97. package/dist/{GraphWidget-Rc-fnHCt.js → GraphWidget-COXK3Dab.js} +5 -5
  98. package/dist/{GraphWidget-Rc-fnHCt.js.map → GraphWidget-COXK3Dab.js.map} +1 -1
  99. package/dist/{GraphWidget-CROq9BtI.cjs → GraphWidget-Duz0GLrA.cjs} +2 -2
  100. package/dist/{GraphWidget-CROq9BtI.cjs.map → GraphWidget-Duz0GLrA.cjs.map} +1 -1
  101. package/dist/{HorizontalWidget-CZqN6UYp.js → HorizontalWidget-C9UFBPsk.js} +2 -2
  102. package/dist/{HorizontalWidget-CZqN6UYp.js.map → HorizontalWidget-C9UFBPsk.js.map} +1 -1
  103. package/dist/{HorizontalWidget-TdOhYEM1.cjs → HorizontalWidget-DXqgBfii.cjs} +2 -2
  104. package/dist/{HorizontalWidget-TdOhYEM1.cjs.map → HorizontalWidget-DXqgBfii.cjs.map} +1 -1
  105. package/dist/{HorizontalboxWidget-JzKHl3o_.cjs → HorizontalboxWidget-B-7LJM-K.cjs} +2 -2
  106. package/dist/{HorizontalboxWidget-JzKHl3o_.cjs.map → HorizontalboxWidget-B-7LJM-K.cjs.map} +1 -1
  107. package/dist/{HorizontalboxWidget-BV7cyhwN.js → HorizontalboxWidget-CWLfmRtr.js} +5 -5
  108. package/dist/{HorizontalboxWidget-BV7cyhwN.js.map → HorizontalboxWidget-CWLfmRtr.js.map} +1 -1
  109. package/dist/{HorizontallineWidget-Bln3Q-pv.cjs → HorizontallineWidget-CQ_PbiXH.cjs} +2 -2
  110. package/dist/{HorizontallineWidget-Bln3Q-pv.cjs.map → HorizontallineWidget-CQ_PbiXH.cjs.map} +1 -1
  111. package/dist/{HorizontallineWidget-ChDLR_8D.js → HorizontallineWidget-DeFkOaYO.js} +2 -2
  112. package/dist/{HorizontallineWidget-ChDLR_8D.js.map → HorizontallineWidget-DeFkOaYO.js.map} +1 -1
  113. package/dist/{IframeWidget-DmCr3YW6.cjs → IframeWidget-BAIs-bzc.cjs} +2 -2
  114. package/dist/{IframeWidget-DmCr3YW6.cjs.map → IframeWidget-BAIs-bzc.cjs.map} +1 -1
  115. package/dist/{IframeWidget-BdOS5sm_.js → IframeWidget-Bn9eGzrq.js} +2 -2
  116. package/dist/{IframeWidget-BdOS5sm_.js.map → IframeWidget-Bn9eGzrq.js.map} +1 -1
  117. package/dist/{ImageLoader-D0-l7mY3.cjs → ImageLoader-C8ZJSOzF.cjs} +2 -2
  118. package/dist/{ImageLoader-D0-l7mY3.cjs.map → ImageLoader-C8ZJSOzF.cjs.map} +1 -1
  119. package/dist/{ImageLoader-CnlQ4xLd.js → ImageLoader-_gAudhVo.js} +2 -2
  120. package/dist/{ImageLoader-CnlQ4xLd.js.map → ImageLoader-_gAudhVo.js.map} +1 -1
  121. package/dist/{ImageviewerWidget-B-TRYlMs.cjs → ImageviewerWidget-BDxMpWzy.cjs} +2 -2
  122. package/dist/{ImageviewerWidget-B-TRYlMs.cjs.map → ImageviewerWidget-BDxMpWzy.cjs.map} +1 -1
  123. package/dist/{ImageviewerWidget-DoJBe5eZ.js → ImageviewerWidget-BUWhF32Z.js} +2 -2
  124. package/dist/{ImageviewerWidget-DoJBe5eZ.js.map → ImageviewerWidget-BUWhF32Z.js.map} +1 -1
  125. package/dist/{InterfacesTab-CITUnMac.js → InterfacesTab-CZsnR6xB.js} +4 -4
  126. package/dist/{InterfacesTab-CITUnMac.js.map → InterfacesTab-CZsnR6xB.js.map} +1 -1
  127. package/dist/{InterfacesTab-CIg-DS_I.cjs → InterfacesTab-oFTUZfti.cjs} +2 -2
  128. package/dist/{InterfacesTab-CIg-DS_I.cjs.map → InterfacesTab-oFTUZfti.cjs.map} +1 -1
  129. package/dist/{LabelWidget-DYwcB_S4.js → LabelWidget-BhzkN06D.js} +2 -2
  130. package/dist/{LabelWidget-DYwcB_S4.js.map → LabelWidget-BhzkN06D.js.map} +1 -1
  131. package/dist/{LabelWidget-B695rUxB.cjs → LabelWidget-agzCO9Rx.cjs} +2 -2
  132. package/dist/{LabelWidget-B695rUxB.cjs.map → LabelWidget-agzCO9Rx.cjs.map} +1 -1
  133. package/dist/{LabelledWidget-ubrlqe_n.cjs → LabelledWidget-CmlB3Yd-.cjs} +2 -2
  134. package/dist/{LabelledWidget-ubrlqe_n.cjs.map → LabelledWidget-CmlB3Yd-.cjs.map} +1 -1
  135. package/dist/{LabelledWidget-D4N2gPxJ.js → LabelledWidget-vx8NvW1b.js} +4 -4
  136. package/dist/{LabelledWidget-D4N2gPxJ.js.map → LabelledWidget-vx8NvW1b.js.map} +1 -1
  137. package/dist/{LabelprogressbarWidget-y__BgVQk.cjs → LabelprogressbarWidget-BB-420i0.cjs} +2 -2
  138. package/dist/{LabelprogressbarWidget-y__BgVQk.cjs.map → LabelprogressbarWidget-BB-420i0.cjs.map} +1 -1
  139. package/dist/{LabelprogressbarWidget-CRnteLAo.js → LabelprogressbarWidget-t5PvKuS4.js} +4 -4
  140. package/dist/{LabelprogressbarWidget-CRnteLAo.js.map → LabelprogressbarWidget-t5PvKuS4.js.map} +1 -1
  141. package/dist/{LabelsparklineWidget-B7h0ndrm.cjs → LabelsparklineWidget-CGg51THo.cjs} +2 -2
  142. package/dist/{LabelsparklineWidget-B7h0ndrm.cjs.map → LabelsparklineWidget-CGg51THo.cjs.map} +1 -1
  143. package/dist/{LabelsparklineWidget-Bbjjio1S.js → LabelsparklineWidget-CebbEH-j.js} +4 -4
  144. package/dist/{LabelsparklineWidget-Bbjjio1S.js.map → LabelsparklineWidget-CebbEH-j.js.map} +1 -1
  145. package/dist/{LabelvalueWidget-Bc6HtTMO.js → LabelvalueWidget-Cbs1DBK2.js} +4 -4
  146. package/dist/{LabelvalueWidget-Bc6HtTMO.js.map → LabelvalueWidget-Cbs1DBK2.js.map} +1 -1
  147. package/dist/{LabelvalueWidget-BE8r18n2.cjs → LabelvalueWidget-xIp1W4ZB.cjs} +2 -2
  148. package/dist/{LabelvalueWidget-BE8r18n2.cjs.map → LabelvalueWidget-xIp1W4ZB.cjs.map} +1 -1
  149. package/dist/{LabelvaluedescWidget-D5aDNr1o.js → LabelvaluedescWidget-B7OIOGc0.js} +5 -5
  150. package/dist/{LabelvaluedescWidget-D5aDNr1o.js.map → LabelvaluedescWidget-B7OIOGc0.js.map} +1 -1
  151. package/dist/{LabelvaluedescWidget-CEZeqLAB.cjs → LabelvaluedescWidget-DE5cZcfN.cjs} +2 -2
  152. package/dist/{LabelvaluedescWidget-CEZeqLAB.cjs.map → LabelvaluedescWidget-DE5cZcfN.cjs.map} +1 -1
  153. package/dist/{LabelvaluelimitsbarWidget-CMnJoNKz.js → LabelvaluelimitsbarWidget-C57kf-oQ.js} +4 -4
  154. package/dist/{LabelvaluelimitsbarWidget-CMnJoNKz.js.map → LabelvaluelimitsbarWidget-C57kf-oQ.js.map} +1 -1
  155. package/dist/{LabelvaluelimitsbarWidget-BhLZsBy5.cjs → LabelvaluelimitsbarWidget-RlJt1ReS.cjs} +2 -2
  156. package/dist/{LabelvaluelimitsbarWidget-BhLZsBy5.cjs.map → LabelvaluelimitsbarWidget-RlJt1ReS.cjs.map} +1 -1
  157. package/dist/{LabelvaluelimitscolumnWidget-7MEUPhe4.cjs → LabelvaluelimitscolumnWidget-B-TbUVpY.cjs} +2 -2
  158. package/dist/{LabelvaluelimitscolumnWidget-7MEUPhe4.cjs.map → LabelvaluelimitscolumnWidget-B-TbUVpY.cjs.map} +1 -1
  159. package/dist/{LabelvaluelimitscolumnWidget-R5ofG4q1.js → LabelvaluelimitscolumnWidget-BRlNDEqp.js} +5 -5
  160. package/dist/{LabelvaluelimitscolumnWidget-R5ofG4q1.js.map → LabelvaluelimitscolumnWidget-BRlNDEqp.js.map} +1 -1
  161. package/dist/{LabelvaluerangebarWidget-49fO9s25.cjs → LabelvaluerangebarWidget-BK08A6_N.cjs} +2 -2
  162. package/dist/{LabelvaluerangebarWidget-49fO9s25.cjs.map → LabelvaluerangebarWidget-BK08A6_N.cjs.map} +1 -1
  163. package/dist/{LabelvaluerangebarWidget-Qa3R2_4p.js → LabelvaluerangebarWidget-Pt_evm3v.js} +4 -4
  164. package/dist/{LabelvaluerangebarWidget-Qa3R2_4p.js.map → LabelvaluerangebarWidget-Pt_evm3v.js.map} +1 -1
  165. package/dist/{Layout-BBLYT0gE.js → Layout-CKmC50QZ.js} +2 -2
  166. package/dist/{Layout-BBLYT0gE.js.map → Layout-CKmC50QZ.js.map} +1 -1
  167. package/dist/{Layout-CilReWuB.cjs → Layout-CkSElGRo.cjs} +2 -2
  168. package/dist/{Layout-CilReWuB.cjs.map → Layout-CkSElGRo.cjs.map} +1 -1
  169. package/dist/{LedWidget-CL2dOxb7.js → LedWidget-D1lmNXpi.js} +5 -5
  170. package/dist/{LedWidget-CL2dOxb7.js.map → LedWidget-D1lmNXpi.js.map} +1 -1
  171. package/dist/{LedWidget-CioTReXJ.cjs → LedWidget-DaFZrKbt.cjs} +2 -2
  172. package/dist/{LedWidget-CioTReXJ.cjs.map → LedWidget-DaFZrKbt.cjs.map} +1 -1
  173. package/dist/{LimitsBar-Akh9OBX8.cjs → LimitsBar-Bkv0A0XE.cjs} +2 -2
  174. package/dist/{LimitsBar-Akh9OBX8.cjs.map → LimitsBar-Bkv0A0XE.cjs.map} +1 -1
  175. package/dist/{LimitsBar-59_qNqi8.js → LimitsBar-D5IZu7eX.js} +2 -2
  176. package/dist/{LimitsBar-59_qNqi8.js.map → LimitsBar-D5IZu7eX.js.map} +1 -1
  177. package/dist/{LimitsbarWidget-Bs2svA1K.cjs → LimitsbarWidget-B_cIeVXW.cjs} +2 -2
  178. package/dist/{LimitsbarWidget-Bs2svA1K.cjs.map → LimitsbarWidget-B_cIeVXW.cjs.map} +1 -1
  179. package/dist/{LimitsbarWidget-C0N2611W.js → LimitsbarWidget-VpxQXE-e.js} +3 -3
  180. package/dist/{LimitsbarWidget-C0N2611W.js.map → LimitsbarWidget-VpxQXE-e.js.map} +1 -1
  181. package/dist/{LimitscolorWidget-GfNCPo3i.js → LimitscolorWidget-79P41CX7.js} +5 -5
  182. package/dist/{LimitscolorWidget-GfNCPo3i.js.map → LimitscolorWidget-79P41CX7.js.map} +1 -1
  183. package/dist/{LimitscolorWidget-G_3Sc7Y3.cjs → LimitscolorWidget-z2tnAyFH.cjs} +2 -2
  184. package/dist/{LimitscolorWidget-G_3Sc7Y3.cjs.map → LimitscolorWidget-z2tnAyFH.cjs.map} +1 -1
  185. package/dist/{LimitscolumnWidget-ut6NX68S.js → LimitscolumnWidget-BFDXhJeZ.js} +2 -2
  186. package/dist/{LimitscolumnWidget-ut6NX68S.js.map → LimitscolumnWidget-BFDXhJeZ.js.map} +1 -1
  187. package/dist/{LimitscolumnWidget-B3OcZYau.cjs → LimitscolumnWidget-ClnN8sMJ.cjs} +2 -2
  188. package/dist/{LimitscolumnWidget-B3OcZYau.cjs.map → LimitscolumnWidget-ClnN8sMJ.cjs.map} +1 -1
  189. package/dist/{LinegraphWidget-BDda9hjY.cjs → LinegraphWidget-C-yffvsK.cjs} +2 -2
  190. package/dist/{LinegraphWidget-BDda9hjY.cjs.map → LinegraphWidget-C-yffvsK.cjs.map} +1 -1
  191. package/dist/{LinegraphWidget-DaCyvdnI.js → LinegraphWidget-VqkpOlws.js} +5 -5
  192. package/dist/{LinegraphWidget-DaCyvdnI.js.map → LinegraphWidget-VqkpOlws.js.map} +1 -1
  193. package/dist/{MatrixbycolumnsWidget-Cni63alW.js → MatrixbycolumnsWidget--ihvirDP.js} +3 -3
  194. package/dist/{MatrixbycolumnsWidget-Cni63alW.js.map → MatrixbycolumnsWidget--ihvirDP.js.map} +1 -1
  195. package/dist/{MatrixbycolumnsWidget-DibzZkF7.cjs → MatrixbycolumnsWidget-DGqVDsdg.cjs} +2 -2
  196. package/dist/{MatrixbycolumnsWidget-DibzZkF7.cjs.map → MatrixbycolumnsWidget-DGqVDsdg.cjs.map} +1 -1
  197. package/dist/{MicroservicesTab-CV_35ag8.cjs → MicroservicesTab-BEGNdUG3.cjs} +3 -3
  198. package/dist/{MicroservicesTab-CV_35ag8.cjs.map → MicroservicesTab-BEGNdUG3.cjs.map} +1 -1
  199. package/dist/{MicroservicesTab-gCXt9Jlh.js → MicroservicesTab-CQPpb7j1.js} +15 -15
  200. package/dist/{MicroservicesTab-gCXt9Jlh.js.map → MicroservicesTab-CQPpb7j1.js.map} +1 -1
  201. package/dist/{OpenC3TimePicker-WVlNQdKk.js → OpenC3TimePicker-B0lAIU91.js} +3 -3
  202. package/dist/{OpenC3TimePicker-WVlNQdKk.js.map → OpenC3TimePicker-B0lAIU91.js.map} +1 -1
  203. package/dist/{OpenC3TimePicker-BAzvaP-g.cjs → OpenC3TimePicker-DXhyDkOv.cjs} +2 -2
  204. package/dist/{OpenC3TimePicker-BAzvaP-g.cjs.map → OpenC3TimePicker-DXhyDkOv.cjs.map} +1 -1
  205. package/dist/{Openc3Screen-GLWnn7RG.cjs → Openc3Screen-051vwmN8.cjs} +5 -5
  206. package/dist/{Openc3Screen-GLWnn7RG.cjs.map → Openc3Screen-051vwmN8.cjs.map} +1 -1
  207. package/dist/{Openc3Screen-C4DL3LBY.js → Openc3Screen-Bew5BPgc.js} +8 -8
  208. package/dist/{Openc3Screen-C4DL3LBY.js.map → Openc3Screen-Bew5BPgc.js.map} +1 -1
  209. package/dist/{OutputDialog-DN4Qy6LH.cjs → OutputDialog-CgnRA-f-.cjs} +2 -2
  210. package/dist/{OutputDialog-DN4Qy6LH.cjs.map → OutputDialog-CgnRA-f-.cjs.map} +1 -1
  211. package/dist/{OutputDialog-wOewjnk2.js → OutputDialog-DtrpwjGL.js} +3 -3
  212. package/dist/{OutputDialog-wOewjnk2.js.map → OutputDialog-DtrpwjGL.js.map} +1 -1
  213. package/dist/{PackagesTab-D6UNkpw9.cjs → PackagesTab-BBFiRQN-.cjs} +2 -2
  214. package/dist/{PackagesTab-D6UNkpw9.cjs.map → PackagesTab-BBFiRQN-.cjs.map} +1 -1
  215. package/dist/{PackagesTab-DmsuQSmU.js → PackagesTab-DQ5s3nfh.js} +21 -21
  216. package/dist/{PackagesTab-DmsuQSmU.js.map → PackagesTab-DQ5s3nfh.js.map} +1 -1
  217. package/dist/{PluginsTab-CLQ0EbDl.js → PluginsTab-1tlTx4k1.js} +7 -7
  218. package/dist/{PluginsTab-CLQ0EbDl.js.map → PluginsTab-1tlTx4k1.js.map} +1 -1
  219. package/dist/{PluginsTab-D_cFEd7L.cjs → PluginsTab-DN_iK1D9.cjs} +4 -4
  220. package/dist/{PluginsTab-D_cFEd7L.cjs.map → PluginsTab-DN_iK1D9.cjs.map} +1 -1
  221. package/dist/{ProgressbarWidget-CYyOjBLI.cjs → ProgressbarWidget-B-ScYWwv.cjs} +2 -2
  222. package/dist/{ProgressbarWidget-CYyOjBLI.cjs.map → ProgressbarWidget-B-ScYWwv.cjs.map} +1 -1
  223. package/dist/{ProgressbarWidget-BWqCsk87.js → ProgressbarWidget-BIB3r9SL.js} +2 -2
  224. package/dist/{ProgressbarWidget-BWqCsk87.js.map → ProgressbarWidget-BIB3r9SL.js.map} +1 -1
  225. package/dist/{RadiobuttonWidget-Dza2r34f.js → RadiobuttonWidget-C5rxLM7K.js} +2 -2
  226. package/dist/{RadiobuttonWidget-Dza2r34f.js.map → RadiobuttonWidget-C5rxLM7K.js.map} +1 -1
  227. package/dist/{RadiobuttonWidget-zyCcviRt.cjs → RadiobuttonWidget-EBzI13by.cjs} +2 -2
  228. package/dist/{RadiobuttonWidget-zyCcviRt.cjs.map → RadiobuttonWidget-EBzI13by.cjs.map} +1 -1
  229. package/dist/{RadiogroupWidget-BK-b4dDV.cjs → RadiogroupWidget-BnT62bxt.cjs} +2 -2
  230. package/dist/{RadiogroupWidget-BK-b4dDV.cjs.map → RadiogroupWidget-BnT62bxt.cjs.map} +1 -1
  231. package/dist/{RadiogroupWidget-DWmZMNmr.js → RadiogroupWidget-CciTCv1U.js} +2 -2
  232. package/dist/{RadiogroupWidget-DWmZMNmr.js.map → RadiogroupWidget-CciTCv1U.js.map} +1 -1
  233. package/dist/{RangebarWidget-BKTLrzKd.cjs → RangebarWidget-Can_BQBL.cjs} +2 -2
  234. package/dist/{RangebarWidget-BKTLrzKd.cjs.map → RangebarWidget-Can_BQBL.cjs.map} +1 -1
  235. package/dist/{RangebarWidget-DsGCC1x7.js → RangebarWidget-MPQYi2Km.js} +2 -2
  236. package/dist/{RangebarWidget-DsGCC1x7.js.map → RangebarWidget-MPQYi2Km.js.map} +1 -1
  237. package/dist/{RedisTab-2wFbDYIY.cjs → RedisTab-Bkj57lOf.cjs} +2 -2
  238. package/dist/{RedisTab-2wFbDYIY.cjs.map → RedisTab-Bkj57lOf.cjs.map} +1 -1
  239. package/dist/{RedisTab-9hUKvLT7.js → RedisTab-DAeGow_e.js} +2 -2
  240. package/dist/{RedisTab-9hUKvLT7.js.map → RedisTab-DAeGow_e.js.map} +1 -1
  241. package/dist/{RollupWidget-DGElKXm3.js → RollupWidget-CfjGAhzg.js} +2 -2
  242. package/dist/{RollupWidget-DGElKXm3.js.map → RollupWidget-CfjGAhzg.js.map} +1 -1
  243. package/dist/{RollupWidget-B7x7pcGm.cjs → RollupWidget-IDDWGLom.cjs} +2 -2
  244. package/dist/{RollupWidget-B7x7pcGm.cjs.map → RollupWidget-IDDWGLom.cjs.map} +1 -1
  245. package/dist/{RoutersTab-PRDpocd3.cjs → RoutersTab-BtfVCL1C.cjs} +2 -2
  246. package/dist/{RoutersTab-PRDpocd3.cjs.map → RoutersTab-BtfVCL1C.cjs.map} +1 -1
  247. package/dist/{RoutersTab-Dpq_F5it.js → RoutersTab-G4WKtUOo.js} +4 -4
  248. package/dist/{RoutersTab-Dpq_F5it.js.map → RoutersTab-G4WKtUOo.js.map} +1 -1
  249. package/dist/{ScriptChooser-BIPvMV1Z.cjs → ScriptChooser-B6qtMbkx.cjs} +2 -2
  250. package/dist/{ScriptChooser-BIPvMV1Z.cjs.map → ScriptChooser-B6qtMbkx.cjs.map} +1 -1
  251. package/dist/{ScriptChooser-DSb-nUOY.js → ScriptChooser-BwYB6FOa.js} +16 -16
  252. package/dist/{ScriptChooser-DSb-nUOY.js.map → ScriptChooser-BwYB6FOa.js.map} +1 -1
  253. package/dist/{ScrollwindowWidget-CxCp6zl7.cjs → ScrollwindowWidget-BPTaWCGg.cjs} +2 -2
  254. package/dist/{ScrollwindowWidget-CxCp6zl7.cjs.map → ScrollwindowWidget-BPTaWCGg.cjs.map} +1 -1
  255. package/dist/{ScrollwindowWidget-BvKT59rV.js → ScrollwindowWidget-CupaygNN.js} +2 -2
  256. package/dist/{ScrollwindowWidget-BvKT59rV.js.map → ScrollwindowWidget-CupaygNN.js.map} +1 -1
  257. package/dist/{SecretsTab-DAZeb63H.js → SecretsTab-C9xAxuwO.js} +4 -4
  258. package/dist/{SecretsTab-DAZeb63H.js.map → SecretsTab-C9xAxuwO.js.map} +1 -1
  259. package/dist/{SecretsTab-CY-73DBl.cjs → SecretsTab-CRC8DUz8.cjs} +2 -2
  260. package/dist/{SecretsTab-CY-73DBl.cjs.map → SecretsTab-CRC8DUz8.cjs.map} +1 -1
  261. package/dist/{SettingsTab-CHcHYnay.js → SettingsTab-BUdeAh4o.js} +5 -5
  262. package/dist/{SettingsTab-CHcHYnay.js.map → SettingsTab-BUdeAh4o.js.map} +1 -1
  263. package/dist/{SettingsTab-BBi3rofi.cjs → SettingsTab-CXoTKykc.cjs} +2 -2
  264. package/dist/{SettingsTab-BBi3rofi.cjs.map → SettingsTab-CXoTKykc.cjs.map} +1 -1
  265. package/dist/{SignalWidget-NxN9VFAv.cjs → SignalWidget-BbXnGcy9.cjs} +2 -2
  266. package/dist/{SignalWidget-NxN9VFAv.cjs.map → SignalWidget-BbXnGcy9.cjs.map} +1 -1
  267. package/dist/{SignalWidget-DRAFunW0.js → SignalWidget-C-qecoTO.js} +2 -2
  268. package/dist/{SignalWidget-DRAFunW0.js.map → SignalWidget-C-qecoTO.js.map} +1 -1
  269. package/dist/{SimpleTextDialog-B9KuFMP5.cjs → SimpleTextDialog-5wMXYOXj.cjs} +2 -2
  270. package/dist/{SimpleTextDialog-B9KuFMP5.cjs.map → SimpleTextDialog-5wMXYOXj.cjs.map} +1 -1
  271. package/dist/{SimpleTextDialog-B7XASoZh.js → SimpleTextDialog-C-0ZC2bs.js} +2 -2
  272. package/dist/{SimpleTextDialog-B7XASoZh.js.map → SimpleTextDialog-C-0ZC2bs.js.map} +1 -1
  273. package/dist/{SpacerWidget-DnRV7NSQ.cjs → SpacerWidget-BSJsjARt.cjs} +2 -2
  274. package/dist/{SpacerWidget-DnRV7NSQ.cjs.map → SpacerWidget-BSJsjARt.cjs.map} +1 -1
  275. package/dist/{SpacerWidget-CUGpXBpA.js → SpacerWidget-VVkOCb6N.js} +2 -2
  276. package/dist/{SpacerWidget-CUGpXBpA.js.map → SpacerWidget-VVkOCb6N.js.map} +1 -1
  277. package/dist/{SparklineWidget-XWxWkTZw.cjs → SparklineWidget-COGPJfbo.cjs} +2 -2
  278. package/dist/{SparklineWidget-XWxWkTZw.cjs.map → SparklineWidget-COGPJfbo.cjs.map} +1 -1
  279. package/dist/{SparklineWidget-SBWjRrqq.js → SparklineWidget-Dsmn38z_.js} +5 -5
  280. package/dist/{SparklineWidget-SBWjRrqq.js.map → SparklineWidget-Dsmn38z_.js.map} +1 -1
  281. package/dist/{TabbookWidget-yfZK_n_2.cjs → TabbookWidget-B2geV2Qi.cjs} +2 -2
  282. package/dist/{TabbookWidget-yfZK_n_2.cjs.map → TabbookWidget-B2geV2Qi.cjs.map} +1 -1
  283. package/dist/{TabbookWidget-7l6fPoRA.js → TabbookWidget-CXklff-l.js} +2 -2
  284. package/dist/{TabbookWidget-7l6fPoRA.js.map → TabbookWidget-CXklff-l.js.map} +1 -1
  285. package/dist/{TargetPacketItemChooser-QPHy-p2u.js → TargetPacketItemChooser-DDHuygCl.js} +3 -3
  286. package/dist/{TargetPacketItemChooser-QPHy-p2u.js.map → TargetPacketItemChooser-DDHuygCl.js.map} +1 -1
  287. package/dist/{TargetPacketItemChooser-CvDABqt7.cjs → TargetPacketItemChooser-DgO3VgdY.cjs} +2 -2
  288. package/dist/{TargetPacketItemChooser-CvDABqt7.cjs.map → TargetPacketItemChooser-DgO3VgdY.cjs.map} +1 -1
  289. package/dist/{TargetsTab-DcHwCcSU.js → TargetsTab-Ci4cOsIa.js} +13 -13
  290. package/dist/{TargetsTab-DcHwCcSU.js.map → TargetsTab-Ci4cOsIa.js.map} +1 -1
  291. package/dist/{TargetsTab-GpduFeiA.cjs → TargetsTab-DSSFGLD_.cjs} +2 -2
  292. package/dist/{TargetsTab-GpduFeiA.cjs.map → TargetsTab-DSSFGLD_.cjs.map} +1 -1
  293. package/dist/{TextboxWidget-CcvPtdyE.cjs → TextboxWidget-B9vBiTFU.cjs} +2 -2
  294. package/dist/{TextboxWidget-CcvPtdyE.cjs.map → TextboxWidget-B9vBiTFU.cjs.map} +1 -1
  295. package/dist/{TextboxWidget-Qb0TNt4Y.js → TextboxWidget-CHs2VYIv.js} +5 -5
  296. package/dist/{TextboxWidget-Qb0TNt4Y.js.map → TextboxWidget-CHs2VYIv.js.map} +1 -1
  297. package/dist/{TextfieldWidget-D5v1Endh.cjs → TextfieldWidget-CHf6ER_G.cjs} +2 -2
  298. package/dist/{TextfieldWidget-D5v1Endh.cjs.map → TextfieldWidget-CHf6ER_G.cjs.map} +1 -1
  299. package/dist/{TextfieldWidget-DcSGRfnF.js → TextfieldWidget-CdANAW-6.js} +2 -2
  300. package/dist/{TextfieldWidget-DcSGRfnF.js.map → TextfieldWidget-CdANAW-6.js.map} +1 -1
  301. package/dist/{TimeWidget-j18gWgF-.cjs → TimeWidget-C8Za7zUx.cjs} +2 -2
  302. package/dist/{TimeWidget-j18gWgF-.cjs.map → TimeWidget-C8Za7zUx.cjs.map} +1 -1
  303. package/dist/{TimeWidget-aoMkDgRR.js → TimeWidget-D0xT1wXR.js} +5 -5
  304. package/dist/{TimeWidget-aoMkDgRR.js.map → TimeWidget-D0xT1wXR.js.map} +1 -1
  305. package/dist/{TitleWidget-C8b9Vp5r.js → TitleWidget-68NWCcXB.js} +2 -2
  306. package/dist/{TitleWidget-C8b9Vp5r.js.map → TitleWidget-68NWCcXB.js.map} +1 -1
  307. package/dist/{TitleWidget-CNZqa48C.cjs → TitleWidget-D0PYh7V7.cjs} +2 -2
  308. package/dist/{TitleWidget-CNZqa48C.cjs.map → TitleWidget-D0PYh7V7.cjs.map} +1 -1
  309. package/dist/{ToolsTab-MCjy5Bf6.js → ToolsTab-BCvmMDIZ.js} +4 -4
  310. package/dist/{ToolsTab-MCjy5Bf6.js.map → ToolsTab-BCvmMDIZ.js.map} +1 -1
  311. package/dist/{ToolsTab-C7ldaGOD.cjs → ToolsTab-UwVIeP-J.cjs} +2 -2
  312. package/dist/{ToolsTab-C7ldaGOD.cjs.map → ToolsTab-UwVIeP-J.cjs.map} +1 -1
  313. package/dist/{TopBar-Dv9AvR6L.cjs → TopBar-BhrJBXut.cjs} +2 -2
  314. package/dist/{TopBar-Dv9AvR6L.cjs.map → TopBar-BhrJBXut.cjs.map} +1 -1
  315. package/dist/{TopBar-S3ydRxjf.js → TopBar-Cg0kJvmG.js} +2 -2
  316. package/dist/{TopBar-S3ydRxjf.js.map → TopBar-Cg0kJvmG.js.map} +1 -1
  317. package/dist/{TsdbTab-4OaejSum.js → TsdbTab-BytqwnkN.js} +2 -2
  318. package/dist/{TsdbTab-4OaejSum.js.map → TsdbTab-BytqwnkN.js.map} +1 -1
  319. package/dist/{TsdbTab-d1l9Ak2R.cjs → TsdbTab-DatsFS_R.cjs} +2 -2
  320. package/dist/{TsdbTab-d1l9Ak2R.cjs.map → TsdbTab-DatsFS_R.cjs.map} +1 -1
  321. package/dist/{UpgradeToEnterpriseDialog-CkHl-BAB.js → UpgradeToEnterpriseDialog-B0lZup6_.js} +2 -2
  322. package/dist/{UpgradeToEnterpriseDialog-CkHl-BAB.js.map → UpgradeToEnterpriseDialog-B0lZup6_.js.map} +1 -1
  323. package/dist/{UpgradeToEnterpriseDialog-Cd1ulQkq.cjs → UpgradeToEnterpriseDialog-BFhTiNXm.cjs} +2 -2
  324. package/dist/{UpgradeToEnterpriseDialog-Cd1ulQkq.cjs.map → UpgradeToEnterpriseDialog-BFhTiNXm.cjs.map} +1 -1
  325. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-hv0QWZ6Z.cjs → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DOidODWT.cjs} +76 -76
  326. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-hv0QWZ6Z.cjs.map → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DOidODWT.cjs.map} +1 -1
  327. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-C6eLx1ow.js → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-JHbHqvBt.js} +1862 -1862
  328. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-C6eLx1ow.js.map → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-JHbHqvBt.js.map} +1 -1
  329. package/dist/{VWidget-CMHOOByt.cjs → VWidget-BZqlpdEk.cjs} +2 -2
  330. package/dist/{VWidget-CMHOOByt.cjs.map → VWidget-BZqlpdEk.cjs.map} +1 -1
  331. package/dist/{VWidget-BgNciXK1.js → VWidget-oMbywhLA.js} +5 -5
  332. package/dist/{VWidget-BgNciXK1.js.map → VWidget-oMbywhLA.js.map} +1 -1
  333. package/dist/{ValueWidget-B1OvCmXK.js → ValueWidget-B1aGUBP7.js} +5 -5
  334. package/dist/{ValueWidget-B1OvCmXK.js.map → ValueWidget-B1aGUBP7.js.map} +1 -1
  335. package/dist/{ValueWidget-C3T9tAUT.cjs → ValueWidget-CuMPXR-z.cjs} +2 -2
  336. package/dist/{ValueWidget-C3T9tAUT.cjs.map → ValueWidget-CuMPXR-z.cjs.map} +1 -1
  337. package/dist/{ValuelimitsbarWidget-CUd9P_Xg.js → ValuelimitsbarWidget-B7KcRjLS.js} +4 -4
  338. package/dist/{ValuelimitsbarWidget-CUd9P_Xg.js.map → ValuelimitsbarWidget-B7KcRjLS.js.map} +1 -1
  339. package/dist/{ValuelimitsbarWidget-DzJYkWOa.cjs → ValuelimitsbarWidget-elJnDGWA.cjs} +2 -2
  340. package/dist/{ValuelimitsbarWidget-DzJYkWOa.cjs.map → ValuelimitsbarWidget-elJnDGWA.cjs.map} +1 -1
  341. package/dist/{ValuelimitscolumnWidget-CbThSMma.js → ValuelimitscolumnWidget-BVt6nLXq.js} +4 -4
  342. package/dist/{ValuelimitscolumnWidget-CbThSMma.js.map → ValuelimitscolumnWidget-BVt6nLXq.js.map} +1 -1
  343. package/dist/{ValuelimitscolumnWidget-Dx_im9Qk.cjs → ValuelimitscolumnWidget-DyQjC-h-.cjs} +2 -2
  344. package/dist/{ValuelimitscolumnWidget-Dx_im9Qk.cjs.map → ValuelimitscolumnWidget-DyQjC-h-.cjs.map} +1 -1
  345. package/dist/{ValuerangebarWidget-C8n2hb3N.cjs → ValuerangebarWidget-E1xvTwhi.cjs} +2 -2
  346. package/dist/{ValuerangebarWidget-C8n2hb3N.cjs.map → ValuerangebarWidget-E1xvTwhi.cjs.map} +1 -1
  347. package/dist/{ValuerangebarWidget-DjL4ze3d.js → ValuerangebarWidget-uVZEI32U.js} +4 -4
  348. package/dist/{ValuerangebarWidget-DjL4ze3d.js.map → ValuerangebarWidget-uVZEI32U.js.map} +1 -1
  349. package/dist/{VerticalWidget-C81rZFvu.cjs → VerticalWidget-BxL_5yEC.cjs} +2 -2
  350. package/dist/{VerticalWidget-C81rZFvu.cjs.map → VerticalWidget-BxL_5yEC.cjs.map} +1 -1
  351. package/dist/{VerticalWidget-V5-vGq7l.js → VerticalWidget-DlftYBjH.js} +2 -2
  352. package/dist/{VerticalWidget-V5-vGq7l.js.map → VerticalWidget-DlftYBjH.js.map} +1 -1
  353. package/dist/{VerticalboxWidget-DQerkhfd.cjs → VerticalboxWidget-BHP0SPpV.cjs} +2 -2
  354. package/dist/{VerticalboxWidget-DQerkhfd.cjs.map → VerticalboxWidget-BHP0SPpV.cjs.map} +1 -1
  355. package/dist/{VerticalboxWidget-OigMLjH8.js → VerticalboxWidget-C7RrkfY0.js} +5 -5
  356. package/dist/{VerticalboxWidget-OigMLjH8.js.map → VerticalboxWidget-C7RrkfY0.js.map} +1 -1
  357. package/dist/{Widget-BiaunQ83.js → Widget-D_HaosJK.js} +3 -3
  358. package/dist/{Widget-BiaunQ83.js.map → Widget-D_HaosJK.js.map} +1 -1
  359. package/dist/{Widget-D23R5IBP.cjs → Widget-a5Y50rAX.cjs} +2 -2
  360. package/dist/{Widget-D23R5IBP.cjs.map → Widget-a5Y50rAX.cjs.map} +1 -1
  361. package/dist/{addMonths-DI1YMeKj.js → addMonths-8x2Zqxlu.js} +2 -2
  362. package/dist/{addMonths-DI1YMeKj.js.map → addMonths-8x2Zqxlu.js.map} +1 -1
  363. package/dist/{addMonths-SOmDn5_g.cjs → addMonths-BKZ-wlfT.cjs} +2 -2
  364. package/dist/{addMonths-SOmDn5_g.cjs.map → addMonths-BKZ-wlfT.cjs.map} +1 -1
  365. package/dist/components.cjs +1 -1
  366. package/dist/components.js +71 -71
  367. package/dist/{format-DMO5vfrX.cjs → format-MMgAFAGt.cjs} +10 -10
  368. package/dist/format-MMgAFAGt.cjs.map +1 -0
  369. package/dist/{format-BJTVXrSU.js → format-mcuVCYue.js} +921 -911
  370. package/dist/format-mcuVCYue.js.map +1 -0
  371. package/dist/getDefaultOptions-DFvSlHOQ.cjs +2 -0
  372. package/dist/{getDefaultOptions-DM-1w6JL.cjs.map → getDefaultOptions-DFvSlHOQ.cjs.map} +1 -1
  373. package/dist/getDefaultOptions-iOY0zDuv.js +8 -0
  374. package/dist/{getDefaultOptions-CK1Ea9CA.js.map → getDefaultOptions-iOY0zDuv.js.map} +1 -1
  375. package/dist/{index-0c3bHqHD.js → index-AU71Em-T.js} +683 -681
  376. package/dist/index-AU71Em-T.js.map +1 -0
  377. package/dist/{index-fyIAHTXk.js → index-CbFUkAzJ.js} +482 -471
  378. package/dist/index-CbFUkAzJ.js.map +1 -0
  379. package/dist/index-DpGzPeGX.cjs +10 -0
  380. package/dist/index-DpGzPeGX.cjs.map +1 -0
  381. package/dist/index-jFVMElAV.cjs +7 -0
  382. package/dist/index-jFVMElAV.cjs.map +1 -0
  383. package/dist/{parse-DVpJm282.cjs → parse-VYeg4sm9.cjs} +2 -2
  384. package/dist/parse-VYeg4sm9.cjs.map +1 -0
  385. package/dist/{parse-BDajhNCa.js → parse-tBX2kWMh.js} +3 -3
  386. package/dist/parse-tBX2kWMh.js.map +1 -0
  387. package/dist/plugins.cjs +2 -2
  388. package/dist/plugins.cjs.map +1 -1
  389. package/dist/plugins.js +362 -376
  390. package/dist/plugins.js.map +1 -1
  391. package/dist/purify.es-BgN5W7Gm.cjs +4 -0
  392. package/dist/purify.es-BgN5W7Gm.cjs.map +1 -0
  393. package/dist/purify.es-XBlcheTS.js +663 -0
  394. package/dist/purify.es-XBlcheTS.js.map +1 -0
  395. package/dist/{settings-TnQjO9IR.cjs → settings-CekhMYoq.cjs} +2 -2
  396. package/dist/{settings-TnQjO9IR.cjs.map → settings-CekhMYoq.cjs.map} +1 -1
  397. package/dist/{settings-08OS6cx2.js → settings-DZ910lLo.js} +2 -2
  398. package/dist/{settings-08OS6cx2.js.map → settings-DZ910lLo.js.map} +1 -1
  399. package/dist/settingsCache-BTZ8CWTD.js +28 -0
  400. package/dist/{settingsCache-CriaPeNM.js.map → settingsCache-BTZ8CWTD.js.map} +1 -1
  401. package/dist/{settingsCache-Bm4JOm9j.cjs → settingsCache-DmIdInSd.cjs} +2 -2
  402. package/dist/{settingsCache-Bm4JOm9j.cjs.map → settingsCache-DmIdInSd.cjs.map} +1 -1
  403. package/dist/{timeFilters-BacGikeM.cjs → timeFilters-DdEvgzim.cjs} +2 -2
  404. package/dist/{timeFilters-BacGikeM.cjs.map → timeFilters-DdEvgzim.cjs.map} +1 -1
  405. package/dist/{timeFilters-BjNif-pu.js → timeFilters-a8Cma3bj.js} +10 -10
  406. package/dist/{timeFilters-BjNif-pu.js.map → timeFilters-a8Cma3bj.js.map} +1 -1
  407. package/dist/tools/admin.cjs +1 -1
  408. package/dist/tools/admin.js +1 -1
  409. package/dist/tools/base.cjs +1 -1
  410. package/dist/tools/base.cjs.map +1 -1
  411. package/dist/tools/base.js +18 -18
  412. package/dist/tools/base.js.map +1 -1
  413. package/dist/tools/calendar.cjs +1 -1
  414. package/dist/tools/calendar.js +1 -1
  415. package/dist/tools/scriptrunner.cjs +8 -8
  416. package/dist/tools/scriptrunner.cjs.map +1 -1
  417. package/dist/tools/scriptrunner.js +1443 -1389
  418. package/dist/tools/scriptrunner.js.map +1 -1
  419. package/dist/util.cjs +1 -1
  420. package/dist/util.js +2 -2
  421. package/dist/vue-common.css +1 -1
  422. package/dist/widgets.cjs +1 -1
  423. package/dist/widgets.js +64 -64
  424. package/package.json +11 -11
  425. package/dist/CanvaslabelWidget-SuEi9yf4.cjs +0 -2
  426. package/dist/CanvaslabelWidget-SuEi9yf4.cjs.map +0 -1
  427. package/dist/CanvaslabelWidget-Tt4dmAOI.js +0 -23
  428. package/dist/CanvaslabelWidget-Tt4dmAOI.js.map +0 -1
  429. package/dist/EventListDialog-C57w2AlC.cjs +0 -2
  430. package/dist/EventListDialog-C57w2AlC.cjs.map +0 -1
  431. package/dist/EventListDialog-CIc8RCyY.js.map +0 -1
  432. package/dist/format-BJTVXrSU.js.map +0 -1
  433. package/dist/format-DMO5vfrX.cjs.map +0 -1
  434. package/dist/getDefaultOptions-CK1Ea9CA.js +0 -8
  435. package/dist/getDefaultOptions-DM-1w6JL.cjs +0 -2
  436. package/dist/index-0c3bHqHD.js.map +0 -1
  437. package/dist/index-BwjFEWGT.cjs +0 -10
  438. package/dist/index-BwjFEWGT.cjs.map +0 -1
  439. package/dist/index-D3OfXI7H.cjs +0 -7
  440. package/dist/index-D3OfXI7H.cjs.map +0 -1
  441. package/dist/index-fyIAHTXk.js.map +0 -1
  442. package/dist/parse-BDajhNCa.js.map +0 -1
  443. package/dist/parse-DVpJm282.cjs.map +0 -1
  444. package/dist/purify.es-C8CCt8xk.cjs +0 -3
  445. package/dist/purify.es-C8CCt8xk.cjs.map +0 -1
  446. package/dist/purify.es-cZjWcAUR.js +0 -595
  447. package/dist/purify.es-cZjWcAUR.js.map +0 -1
  448. package/dist/settingsCache-CriaPeNM.js +0 -28
@@ -1 +1 @@
1
- {"version":3,"file":"MicroservicesTab-CV_35ag8.cjs","sources":["../src/tools/admin/tabs/MicroservicesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2026, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-alert v-model=\"showAlert\" closable :type=\"alertType\">{{\n alert\n }}</v-alert>\n <div class=\"text-caption text-medium-emphasis mt-2 mb-2 ml-4\">\n <template v-if=\"hasServiceFilter && filteredServiceCount === 0\">\n No microservices match filter (showing 0 / {{ totalServiceCount }})\n </template>\n <template v-else-if=\"hasServiceFilter\">\n Showing {{ filteredServiceCount }} /\n {{ totalServiceCount }} microservices\n </template>\n <template v-else> {{ totalServiceCount }} microservices </template>\n </div>\n <v-row v-if=\"hasServiceFilter\" class=\"ml-1 mb-1\">\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n prepend-icon=\"mdi-filter-off\"\n aria-label=\"Filter applied. Click to clear filter and show all services.\"\n @click=\"clearServiceFilter\"\n >\n Show All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"warning\"\n prepend-icon=\"mdi-refresh\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkRestartServices\"\n >\n Restart All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"error\"\n prepend-icon=\"mdi-stop\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkStopServices\"\n >\n Stop All\n </v-btn>\n </v-col>\n </v-row>\n <v-list class=\"list\" data-test=\"microserviceList\">\n <div\n v-for=\"microservice in filteredMicroservices\"\n :key=\"microservice.name\"\n >\n <v-list-item>\n <v-list-item-title>{{ microservice.name }}</v-list-item-title>\n <v-list-item-subtitle v-if=\"microservice_status[microservice.name]\">\n Updated:\n {{\n formatNanoseconds(\n microservice_status[microservice.name].updated_at,\n timeZone,\n )\n }}, Enabled: {{ isEnabled(microservice.name) ? 'True' : 'False' }},\n Count:\n {{ microservice_status[microservice.name].count }}\n </v-list-item-subtitle>\n <template #append>\n <v-btn\n v-show=\"microservice_status[microservice.name]?.error\"\n icon=\"mdi-alert\"\n variant=\"text\"\n @click=\"showMicroserviceError(microservice.name)\"\n />\n <v-chip\n v-if=\"microservice_status[microservice.name]\"\n :color=\"getStateColor(microservice.name)\"\n size=\"small\"\n label\n >\n {{ getStateText(microservice.name) }}\n </v-chip>\n <v-tooltip\n :text=\"isEnabled(microservice.name) ? 'Restart' : 'Start'\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n :aria-label=\"\n isEnabled(microservice.name)\n ? 'Restart Microservice'\n : 'Start Microservice'\n \"\n :icon=\"\n isRestarting(microservice.name) ||\n isStarting(microservice.name)\n ? 'mdi-loading'\n : isEnabled(microservice.name)\n ? 'mdi-refresh'\n : 'mdi-play'\n \"\n :class=\"{\n 'rotating-icon':\n isRestarting(microservice.name) ||\n isStarting(microservice.name),\n }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"restartMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Stop\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Stop Microservice\"\n :icon=\"\n isStopping(microservice.name) ? 'mdi-loading' : 'mdi-stop'\n \"\n :class=\"{ 'rotating-icon': isStopping(microservice.name) }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"stopMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Show Details\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Show Microservice Details\"\n icon=\"mdi-eye\"\n variant=\"text\"\n @click=\"showMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"jsonContent\"\n type=\"Microservice\"\n :name=\"dialogTitle\"\n @submit=\"dialogCallback\"\n />\n <text-box-dialog\n v-if=\"showError\"\n v-model=\"showError\"\n :text=\"jsonContent\"\n :title=\"dialogTitle\"\n />\n </div>\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { OutputDialog, TextBoxDialog } from '@/components'\nimport { TimeFilters } from '@/util'\n\nexport default {\n components: {\n OutputDialog,\n TextBoxDialog,\n },\n mixins: [TimeFilters],\n data() {\n return {\n filteredMicroservices: [],\n allMicroservices: [],\n microservice_status: {},\n microservice_id: null,\n jsonContent: '',\n dialogTitle: '',\n showDialog: false,\n showError: false,\n alert: '',\n alertType: 'success',\n showAlert: false,\n updater: null,\n timeZone: 'local',\n // { service_name:\n // { operation: 'stopping' | 'restarting' | 'starting',\n // enabled_states: []\n // initial_updated_at: timestamp\n // time_started: timestamp\n // }\n // }\n microserviceOperations: {},\n }\n },\n computed: {\n serviceFilter() {\n const services = this.$route.query.services\n if (!services) return null\n return services\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s)\n },\n hasServiceFilter() {\n return this.serviceFilter && this.serviceFilter.length > 0\n },\n totalServiceCount() {\n return this.allMicroservices.length\n },\n filteredServiceCount() {\n return this.filteredMicroservices.length\n },\n },\n watch: {\n '$route.query.services': function () {\n this.applyServiceFilter()\n },\n },\n created() {\n new OpenC3Api()\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch(() => {\n // Do nothing\n })\n },\n mounted() {\n this.update()\n this.updater = setInterval(() => {\n this.update()\n }, 2000)\n },\n beforeUnmount() {\n clearInterval(this.updater)\n this.updater = null\n },\n methods: {\n isOperationInProgress: function (name) {\n return !!this.microserviceOperations[name]\n },\n isEnabled: function (name) {\n const microservice = this.allMicroservices.find((ms) => ms.name === name)\n return microservice?.enabled !== false\n },\n isRestarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'restarting'\n },\n isStarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'starting'\n },\n isStopping: function (name) {\n return this.microserviceOperations[name]?.operation === 'stopping'\n },\n update: function () {\n Api.get('/openc3-api/microservice_status/all').then((response) => {\n this.microservice_status = response.data\n this.checkOperationCompletion()\n })\n Api.get('/openc3-api/microservices/all').then((response) => {\n // Convert hash of microservices to array of microservices\n let microservices = []\n for (const [_microservice_name, microservice] of Object.entries(\n response.data,\n )) {\n microservices.push(microservice)\n }\n microservices.sort((a, b) => a.name.localeCompare(b.name))\n this.allMicroservices = microservices\n this.applyServiceFilter()\n })\n },\n checkOperationCompletion: function () {\n for (const [name, tracking] of Object.entries(\n this.microserviceOperations,\n )) {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n if (!microservice) continue\n\n const currentEnabled = microservice.enabled !== false\n const lastEnabled =\n tracking.enabled_states[tracking.enabled_states.length - 1]\n\n // Only add state if it changed\n if (currentEnabled !== lastEnabled) {\n tracking.enabled_states.push(currentEnabled)\n }\n\n const isComplete = this.isOperationComplete(name, tracking)\n if (isComplete) {\n delete this.microserviceOperations[name]\n }\n }\n },\n isOperationComplete: function (serviceName, tracking) {\n // Check for timeout (30 seconds)\n const elapsed = Date.now() - tracking.time_started\n if (elapsed > 30000) {\n this.alert = `${serviceName} timed out when ${tracking.operation}.`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[serviceName]\n return true\n }\n\n if (tracking.operation === 'stopping') {\n // Track true -> false\n return tracking.enabled_states.includes(false)\n }\n if (tracking.operation === 'starting') {\n // Track false -> true\n return tracking.enabled_states.includes(true)\n }\n if (tracking.operation === 'restarting') {\n // Check if updated_at has changed\n const currentUpdatedAt =\n this.microservice_status[serviceName]?.updated_at\n if (currentUpdatedAt && tracking.initial_updated_at) {\n return currentUpdatedAt !== tracking.initial_updated_at\n }\n return false\n }\n return false\n },\n applyServiceFilter: function () {\n if (this.hasServiceFilter) {\n this.filteredMicroservices = this.allMicroservices.filter((ms) =>\n this.serviceFilter.includes(ms.name),\n )\n } else {\n this.filteredMicroservices = this.allMicroservices\n }\n },\n clearServiceFilter: function () {\n this.$router.push({ query: {} })\n },\n bulkRestartServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to restart ${microserviceNames.length} microservice(s)? ${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n const initialUpdatedAt = this.microservice_status[name]?.updated_at\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: initialUpdatedAt,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch(\n (error) => {\n this.alert = `Start command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n bulkStopServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to stop ${microserviceNames.length} microservice(s)?\\n\\n${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch(\n (error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n stopMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to stop microservice: ${name}?`, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch((error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n restartMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to restart microservice: ${name}?`, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: this.microservice_status[name]?.updated_at,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch((error) => {\n this.alert = `Restart command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n showMicroservice: function (name) {\n Api.get(`/openc3-api/microservices/${name}`).then((response) => {\n this.microservice_id = name\n this.dialogTitle = name\n this.jsonContent = JSON.stringify(response.data, null, '\\t')\n this.showDialog = true\n })\n },\n showMicroserviceError: function (name) {\n this.dialogTitle = name\n const e = this.microservice_status[name].error\n this.jsonContent = JSON.stringify(e, null, '\\t')\n this.showError = true\n },\n // States are determined by the microservice and not from an explicitly defined set\n // However, we can provide useful colors for errors and common states\n getStateColor(microserviceName) {\n const status = this.microservice_status[microserviceName]\n if (!status) return 'grey'\n if (status.error) return 'red'\n // If not enabled, show as stopped even if state is \"running\"\n if (!this.isEnabled(microserviceName) || status.state === 'STOPPED')\n return 'yellow'\n if (status.state === 'RUNNING') return 'green'\n return 'grey'\n },\n getStateText(microserviceName) {\n if (!this.isEnabled(microserviceName)) {\n return 'STOPPED'\n }\n return this.microservice_status[microserviceName].state\n },\n dialogCallback: function (content) {\n this.showDialog = false\n if (content !== null) {\n let parsed = JSON.parse(content)\n let method = 'put'\n let url = `/openc3-api/microservices/${this.microservice_id}`\n if (parsed['name'] !== this.microservice_id) {\n method = 'post'\n url = '/openc3-api/microservices'\n }\n\n Api[method](url, {\n data: {\n json: content,\n },\n }).then((response) => {\n this.alert = 'Modified Microservice'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n })\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.rotating-icon {\n animation: spin 1s linear infinite;\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n"],"names":["_sfc_main","OutputDialog","TextBoxDialog","TimeFilters","services","s","OpenC3Api","response","name","ms","Api","microservices","_microservice_name","microservice","a","b","tracking","currentEnabled","lastEnabled","serviceName","currentUpdatedAt","microserviceNames","m","microserviceList","confirmMessage","initialUpdatedAt","error","_dialog","e","microserviceName","status","content","parsed","method","url","_hoisted_1","_createElementBlock","_createVNode","_component_v_alert","$data","$event","_createElementVNode","$options","_Fragment","_toDisplayString","_createTextVNode","_createBlock","_component_v_row","_component_v_col","_component_v_btn","_cache","_component_v_list","_renderList","_component_v_list_item","_vShow","_component_v_chip","_component_v_tooltip","_withCtx","props","_mergeProps","_component_v_list_item_title","_component_v_list_item_subtitle","_ctx","_component_v_divider","_component_output_dialog","_component_text_box_dialog"],"mappings":"kdAqLKA,EAAU,CACb,WAAY,cACVC,EAAAA,2BACAC,EAAAA,eAEF,OAAQ,CAACC,EAAAA,WAAW,EACpB,MAAO,CACL,MAAO,CACL,sBAAuB,CAAA,EACvB,iBAAkB,CAAA,EAClB,oBAAqB,CAAA,EACrB,gBAAiB,KACjB,YAAa,GACb,YAAa,GACb,WAAY,GACZ,UAAW,GACX,MAAO,GACP,UAAW,UACX,UAAW,GACX,QAAS,KACT,SAAU,QAQV,uBAAwB,CAAA,CAC1B,CACF,EACA,SAAU,CACR,eAAgB,CACd,MAAMC,EAAW,KAAK,OAAO,MAAM,SACnC,OAAKA,EACEA,EACJ,MAAM,GAAG,EACT,IAAKC,GAAMA,EAAE,KAAI,CAAE,EACnB,OAAQA,GAAMA,CAAC,EAJI,IAKxB,EACA,kBAAmB,CACjB,OAAO,KAAK,eAAiB,KAAK,cAAc,OAAS,CAC3D,EACA,mBAAoB,CAClB,OAAO,KAAK,iBAAiB,MAC/B,EACA,sBAAuB,CACrB,OAAO,KAAK,sBAAsB,MACpC,GAEF,MAAO,CACL,wBAAyB,UAAY,CACnC,KAAK,mBAAkB,CACzB,GAEF,SAAU,CACR,IAAIC,EAAAA,GAAS,EACV,YAAY,WAAW,EACvB,KAAMC,GAAa,CACdA,IACF,KAAK,SAAWA,EAEpB,CAAC,EACA,MAAM,IAAM,CAEb,CAAC,CACL,EACA,SAAU,CACR,KAAK,OAAM,EACX,KAAK,QAAU,YAAY,IAAM,CAC/B,KAAK,OAAM,CACb,EAAG,GAAI,CACT,EACA,eAAgB,CACd,cAAc,KAAK,OAAO,EAC1B,KAAK,QAAU,IACjB,EACA,QAAS,CACP,sBAAuB,SAAUC,EAAM,CACrC,MAAO,CAAC,CAAC,KAAK,uBAAuBA,CAAI,CAC3C,EACA,UAAW,SAAUA,EAAM,CAEzB,OADqB,KAAK,iBAAiB,KAAMC,GAAOA,EAAG,OAASD,CAAI,GACnD,UAAY,EACnC,EACA,aAAc,SAAUA,EAAM,CAC5B,OAAO,KAAK,uBAAuBA,CAAI,GAAG,YAAc,YAC1D,EACA,WAAY,SAAUA,EAAM,CAC1B,OAAO,KAAK,uBAAuBA,CAAI,GAAG,YAAc,UAC1D,EACA,WAAY,SAAUA,EAAM,CAC1B,OAAO,KAAK,uBAAuBA,CAAI,GAAG,YAAc,UAC1D,EACA,OAAQ,UAAY,CAClBE,EAAAA,GAAI,IAAI,qCAAqC,EAAE,KAAMH,GAAa,CAChE,KAAK,oBAAsBA,EAAS,KACpC,KAAK,yBAAwB,CAC/B,CAAC,EACDG,EAAAA,GAAI,IAAI,+BAA+B,EAAE,KAAMH,GAAa,CAE1D,IAAII,EAAgB,CAAA,EACpB,SAAW,CAACC,EAAoBC,CAAY,IAAK,OAAO,QACtDN,EAAS,IACX,EACEI,EAAc,KAAKE,CAAY,EAEjCF,EAAc,KAAK,CAACG,EAAGC,IAAMD,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,EACzD,KAAK,iBAAmBJ,EACxB,KAAK,mBAAkB,CACzB,CAAC,CACH,EACA,yBAA0B,UAAY,CACpC,SAAW,CAACH,EAAMQ,CAAQ,IAAK,OAAO,QACpC,KAAK,sBACP,EAAG,CACD,MAAMH,EAAe,KAAK,iBAAiB,KACxCJ,GAAOA,EAAG,OAASD,CACtB,EACA,GAAI,CAACK,EAAc,SAEnB,MAAMI,EAAiBJ,EAAa,UAAY,GAC1CK,EACJF,EAAS,eAAeA,EAAS,eAAe,OAAS,CAAC,EAGxDC,IAAmBC,GACrBF,EAAS,eAAe,KAAKC,CAAc,EAG1B,KAAK,oBAAoBT,EAAMQ,CAAQ,GAExD,OAAO,KAAK,uBAAuBR,CAAI,CAE3C,CACF,EACA,oBAAqB,SAAUW,EAAaH,EAAU,CAGpD,GADgB,KAAK,IAAG,EAAKA,EAAS,aACxB,IACZ,YAAK,MAAQ,GAAGG,CAAW,mBAAmBH,EAAS,SAAS,IAChE,KAAK,UAAY,QACjB,KAAK,UAAY,GACjB,WAAW,IAAM,CACf,KAAK,UAAY,EACnB,EAAG,GAAI,EACP,OAAO,KAAK,uBAAuBG,CAAW,EACvC,GAGT,GAAIH,EAAS,YAAc,WAEzB,OAAOA,EAAS,eAAe,SAAS,EAAK,EAE/C,GAAIA,EAAS,YAAc,WAEzB,OAAOA,EAAS,eAAe,SAAS,EAAI,EAE9C,GAAIA,EAAS,YAAc,aAAc,CAEvC,MAAMI,EACJ,KAAK,oBAAoBD,CAAW,GAAG,WACzC,OAAIC,GAAoBJ,EAAS,mBACxBI,IAAqBJ,EAAS,mBAEhC,EACT,CACA,MAAO,EACT,EACA,mBAAoB,UAAY,CAC1B,KAAK,iBACP,KAAK,sBAAwB,KAAK,iBAAiB,OAAQP,GACzD,KAAK,cAAc,SAASA,EAAG,IAAI,CACrC,EAEA,KAAK,sBAAwB,KAAK,gBAEtC,EACA,mBAAoB,UAAY,CAC9B,KAAK,QAAQ,KAAK,CAAE,MAAO,CAAA,CAAC,CAAG,CACjC,EACA,oBAAqB,UAAY,CAC/B,MAAMY,EAAoB,KAAK,sBAAsB,IAAKC,GAAMA,EAAE,IAAI,EAChEC,EAAmBF,EAAkB,KAAK,IAAI,EAC9CG,EAAiB,oCAAoCH,EAAkB,MAAM,qBAAqBE,CAAgB,GAExH,KAAK,QACF,QAAQC,EAAgB,CACvB,OAAQ,UACR,WAAY,SACb,EACA,KAAK,IAAM,CACVH,EAAkB,QAASb,GAAS,CAIlC,MAAMS,EAHe,KAAK,iBAAiB,KACxCR,GAAOA,EAAG,OAASD,CACtB,GACqC,UAAY,GAC3CiB,EAAmB,KAAK,oBAAoBjB,CAAI,GAAG,WACzD,KAAK,uBAAuBA,CAAI,EAAI,CAClC,UAAW,aACX,eAAgB,CAACS,CAAc,EAC/B,mBAAoBQ,EACpB,aAAc,KAAK,IAAG,CACxB,EACAf,EAAAA,GAAI,KAAK,6BAA6BF,CAAI,QAAQ,EAAE,MACjDkB,GAAU,CACT,KAAK,MAAQ,4BAA4BlB,CAAI,KAAKkB,CAAK,GACvD,KAAK,UAAY,QACjB,KAAK,UAAY,GACjB,WAAW,IAAM,CACf,KAAK,UAAY,EACnB,EAAG,GAAI,EACP,OAAO,KAAK,uBAAuBlB,CAAI,CACzC,CACF,CACF,CAAC,CACH,CAAC,EACA,MAAM,IAAM,CAEb,CAAC,CACL,EACA,iBAAkB,UAAY,CAC5B,MAAMa,EAAoB,KAAK,sBAAsB,IAAKC,GAAMA,EAAE,IAAI,EAChEC,EAAmBF,EAAkB,KAAK,IAAI,EAC9CG,EAAiB,iCAAiCH,EAAkB,MAAM;AAAA;AAAA,EAAwBE,CAAgB,GAExH,KAAK,QACF,QAAQC,EAAgB,CACvB,OAAQ,OACR,WAAY,SACb,EACA,KAAK,IAAM,CACVH,EAAkB,QAASb,GAAS,CAIlC,MAAMS,EAHe,KAAK,iBAAiB,KACxCR,GAAOA,EAAG,OAASD,CACtB,GACqC,UAAY,GACjD,KAAK,uBAAuBA,CAAI,EAAI,CAClC,UAAW,WACX,eAAgB,CAACS,CAAc,EAC/B,aAAc,KAAK,IAAG,CACxB,EACAP,EAAAA,GAAI,KAAK,6BAA6BF,CAAI,OAAO,EAAE,MAChDkB,GAAU,CACT,KAAK,MAAQ,2BAA2BlB,CAAI,KAAKkB,CAAK,GACtD,KAAK,UAAY,QACjB,KAAK,UAAY,GACjB,WAAW,IAAM,CACf,KAAK,UAAY,EACnB,EAAG,GAAI,EACP,OAAO,KAAK,uBAAuBlB,CAAI,CACzC,CACF,CACF,CAAC,CACH,CAAC,EACA,MAAM,IAAM,CAEb,CAAC,CACL,EACA,iBAAkB,SAAUA,EAAM,CAChC,KAAK,QACF,QAAQ,+CAA+CA,CAAI,IAAK,CAC/D,OAAQ,OACR,WAAY,SACb,EACA,KAAMmB,GAAY,CAIjB,MAAMV,EAHe,KAAK,iBAAiB,KACxCR,GAAOA,EAAG,OAASD,CACtB,GACqC,UAAY,GACjD,KAAK,uBAAuBA,CAAI,EAAI,CAClC,UAAW,WACX,eAAgB,CAACS,CAAc,EAC/B,aAAc,KAAK,IAAG,CACxB,EACAP,KAAI,KAAK,6BAA6BF,CAAI,OAAO,EAAE,MAAOkB,GAAU,CAClE,KAAK,MAAQ,2BAA2BlB,CAAI,KAAKkB,CAAK,GACtD,KAAK,UAAY,QACjB,KAAK,UAAY,GACjB,WAAW,IAAM,CACf,KAAK,UAAY,EACnB,EAAG,GAAI,EACP,OAAO,KAAK,uBAAuBlB,CAAI,CACzC,CAAC,CACH,CAAC,CACL,EACA,oBAAqB,SAAUA,EAAM,CACnC,KAAK,QACF,QAAQ,kDAAkDA,CAAI,IAAK,CAClE,OAAQ,UACR,WAAY,SACb,EACA,KAAMmB,GAAY,CAIjB,MAAMV,EAHe,KAAK,iBAAiB,KACxCR,GAAOA,EAAG,OAASD,CACtB,GACqC,UAAY,GACjD,KAAK,uBAAuBA,CAAI,EAAI,CAClC,UAAW,aACX,eAAgB,CAACS,CAAc,EAC/B,mBAAoB,KAAK,oBAAoBT,CAAI,GAAG,WACpD,aAAc,KAAK,IAAG,CACxB,EACAE,KAAI,KAAK,6BAA6BF,CAAI,QAAQ,EAAE,MAAOkB,GAAU,CACnE,KAAK,MAAQ,8BAA8BlB,CAAI,KAAKkB,CAAK,GACzD,KAAK,UAAY,QACjB,KAAK,UAAY,GACjB,WAAW,IAAM,CACf,KAAK,UAAY,EACnB,EAAG,GAAI,EACP,OAAO,KAAK,uBAAuBlB,CAAI,CACzC,CAAC,CACH,CAAC,CACL,EACA,iBAAkB,SAAUA,EAAM,CAChCE,KAAI,IAAI,6BAA6BF,CAAI,EAAE,EAAE,KAAMD,GAAa,CAC9D,KAAK,gBAAkBC,EACvB,KAAK,YAAcA,EACnB,KAAK,YAAc,KAAK,UAAUD,EAAS,KAAM,KAAM,GAAI,EAC3D,KAAK,WAAa,EACpB,CAAC,CACH,EACA,sBAAuB,SAAUC,EAAM,CACrC,KAAK,YAAcA,EACnB,MAAMoB,EAAI,KAAK,oBAAoBpB,CAAI,EAAE,MACzC,KAAK,YAAc,KAAK,UAAUoB,EAAG,KAAM,GAAI,EAC/C,KAAK,UAAY,EACnB,EAGA,cAAcC,EAAkB,CAC9B,MAAMC,EAAS,KAAK,oBAAoBD,CAAgB,EACxD,OAAKC,EACDA,EAAO,MAAc,MAErB,CAAC,KAAK,UAAUD,CAAgB,GAAKC,EAAO,QAAU,UACjD,SACLA,EAAO,QAAU,UAAkB,QAChC,OANa,MAOtB,EACA,aAAaD,EAAkB,CAC7B,OAAK,KAAK,UAAUA,CAAgB,EAG7B,KAAK,oBAAoBA,CAAgB,EAAE,MAFzC,SAGX,EACA,eAAgB,SAAUE,EAAS,CAEjC,GADA,KAAK,WAAa,GACdA,IAAY,KAAM,CACpB,IAAIC,EAAS,KAAK,MAAMD,CAAO,EAC3BE,EAAS,MACTC,EAAM,6BAA6B,KAAK,eAAe,GACvDF,EAAO,OAAY,KAAK,kBAC1BC,EAAS,OACTC,EAAM,6BAGRxB,KAAIuB,CAAM,EAAEC,EAAK,CACf,KAAM,CACJ,KAAMH,EAEV,CAAC,EAAE,KAAMxB,GAAa,CACpB,KAAK,MAAQ,wBACb,KAAK,UAAY,UACjB,KAAK,UAAY,GACjB,WAAW,IAAM,CACf,KAAK,UAAY,EACnB,EAAG,GAAI,EACP,KAAK,OAAM,CACb,CAAC,CACH,CACF,EAEJ,EAphBS4B,EAAA,CAAA,MAAM,kDAAkD,0fAJ/DC,qBA2JM,MAAA,KAAA,CA1JJC,EAAAA,YAEYC,EAAA,YAFMC,EAAA,+CAAAA,EAAA,UAASC,GAAE,SAAA,GAAU,KAAMD,EAAA,8BAAW,IAEtD,qCADAA,EAAA,KAAK,EAAA,CAAA,kCAEPE,EAAAA,mBASM,MATNN,EASM,CARYO,EAAA,kBAAoBA,EAAA,uBAAoB,iBAAxDN,EAAAA,mBAEWO,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,mBAFqD,+CACnBC,EAAAA,gBAAGF,EAAA,iBAAiB,EAAG,KACpE,CAAA,QACqBA,EAAA,gCAArBN,EAAAA,mBAGWO,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAH4BE,EAAAA,gBAAA,8BAC1BH,EAAA,oBAAoB,EAAG,MAClCE,EAAAA,gBAAGF,EAAA,iBAAiB,EAAG,kBACzB,CAAA,uBACAN,EAAAA,mBAAmEO,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAA,CAA9CE,EAAAA,gBAAAD,EAAAA,gBAAAF,EAAA,iBAAiB,EAAG,kBAAe,CAAA,UAE7CA,EAAA,gCAAbI,EAAAA,YA+BQC,EAAA,OA/BuB,MAAM,gCACnC,IASQ,CATRV,EAAAA,YASQW,EAAA,CATD,KAAK,MAAM,EAAA,mBAChB,IAOQ,CAPRX,EAAAA,YAOQY,EAAA,CANN,MAAM,UACN,eAAa,iBACb,aAAW,+DACV,QAAOP,EAAA,uCACT,IAED,CAAA,GAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAFC,aAED,EAAA,kCAEFb,EAAAA,YASQW,EAAA,CATD,KAAK,MAAM,EAAA,mBAChB,IAOQ,CAPRX,EAAAA,YAOQY,EAAA,CANN,MAAM,UACN,eAAa,cACZ,SAAUP,EAAA,uBAAoB,EAC9B,QAAOA,EAAA,wCACT,IAED,CAAA,GAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAFC,gBAED,EAAA,6CAEFb,EAAAA,YASQW,EAAA,CATD,KAAK,MAAM,EAAA,mBAChB,IAOQ,CAPRX,EAAAA,YAOQY,EAAA,CANN,MAAM,QACN,eAAa,WACZ,SAAUP,EAAA,uBAAoB,EAC9B,QAAOA,EAAA,qCACT,IAED,CAAA,GAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAFC,aAED,EAAA,kFAGJb,EAAAA,YA8FSc,EAAA,CA9FD,MAAM,OAAO,YAAU,uCAE3B,IAA6C,kBAD/Cf,EAAAA,mBA4FMO,EAAAA,SAAA,KAAAS,EAAAA,WA3FmBb,EAAA,sBAAhB1B,kBADTuB,EAAAA,mBA4FM,MAAA,CA1FH,IAAKvB,EAAa,OAEnBwB,EAAAA,YAsFcgB,EAAA,KAAA,CAzED,iBACT,IAKE,kBALFhB,EAAAA,YAKEY,EAAA,CAHA,KAAK,YACL,QAAQ,OACP,QAAKT,GAAEE,EAAA,sBAAsB7B,EAAa,IAAI,wBAHvC,CAAAyC,EAAAA,MAAAf,EAAA,oBAAoB1B,EAAa,IAAI,GAAG,KAAK,IAM/C0B,EAAA,oBAAoB1B,EAAa,IAAI,iBAD7CiC,EAAAA,YAOSS,EAAA,OALN,MAAOb,EAAA,cAAc7B,EAAa,IAAI,EACvC,KAAK,QACL,MAAA,uBAEA,IAAqC,qCAAlC6B,EAAA,aAAa7B,EAAa,IAAI,CAAA,EAAA,CAAA,sDAEnCwB,EAAAA,YA8BYmB,EAAA,CA7BT,KAAMd,EAAA,UAAU7B,EAAa,IAAI,EAAA,UAAA,QAClC,SAAS,QAEE,UAAS4C,EAAAA,QAClB,CAuBE,CAxBoB,MAAAC,KAAK,CAC3BrB,EAAAA,YAuBEY,EAvBFU,EAAAA,WAuBE,CAAA,QAAA,EAAA,EAtBQD,EAAK,CACZ,aAAiChB,EAAA,UAAU7B,EAAa,IAAI,8CAK5D,KAA2B6B,EAAA,aAAa7B,EAAa,IAAI,GAAyB6B,EAAA,WAAW7B,EAAa,IAAI,gBAAgE6B,EAAA,UAAU7B,EAAa,IAAI,2BAQzM,MAAK,iBAA+D6B,EAAA,aAAa7B,EAAa,IAAI,GAA2B6B,EAAA,WAAW7B,EAAa,IAAI,GAK1J,QAAQ,OACP,SAAU6B,EAAA,sBAAsB7B,EAAa,IAAI,EACjD,QAAK2B,GAAEE,EAAA,oBAAoB7B,EAAa,IAAI,sFAInDwB,EAAAA,YAcYmB,EAAA,CAdD,KAAK,OAAO,SAAS,QACnB,UAASC,EAAAA,QAClB,CAUE,CAXoB,MAAAC,KAAK,CAC3BrB,EAAAA,YAUEY,EAVFU,EAAAA,WAUE,CAAA,QAAA,EAAA,EATQD,EAAK,CACb,aAAW,oBACV,KAA2BhB,EAAA,WAAW7B,EAAa,IAAI,EAAA,cAAA,WAGvD,MAAK,CAAA,gBAAqB6B,EAAA,WAAW7B,EAAa,IAAI,CAAA,EACvD,QAAQ,OACP,SAAU6B,EAAA,sBAAsB7B,EAAa,IAAI,EACjD,QAAK2B,GAAEE,EAAA,iBAAiB7B,EAAa,IAAI,gEAIhDwB,EAAAA,YAUYmB,EAAA,CAVD,KAAK,eAAe,SAAS,QAC3B,UAASC,EAAAA,QAClB,CAME,CAPoB,MAAAC,KAAK,CAC3BrB,EAAAA,YAMEY,EANFU,EAAAA,WAME,CAAA,QAAA,EAAA,EALQD,EAAK,CACb,aAAW,4BACX,KAAK,UACL,QAAQ,OACP,QAAKlB,GAAEE,EAAA,iBAAiB7B,EAAa,IAAI,0DAhFlD,IAA8D,CAA9DwB,EAAAA,YAA8DuB,EAAA,KAAA,mBAA3C,IAAuB,CAApBf,EAAAA,gBAAAD,EAAAA,gBAAA/B,EAAa,IAAI,EAAA,CAAA,eACX0B,EAAA,oBAAoB1B,EAAa,IAAI,iBAAjEiC,EAAAA,YAUuBe,EAAA,CAAA,IAAA,CAAA,EAAA,mBAV6C,IAElE,CAFkEhB,EAAAA,gBAAA,+BAGhEiB,EAAA,kBAAmCvB,EAAA,oBAAoB1B,EAAa,IAAI,EAAE,WAA4B0B,EAAA,QAItG,CAAA,EAAA,cAAWK,EAAAA,gBAAGF,EAAA,UAAU7B,EAAa,IAAI,EAAA,OAAA,OAAA,EAAuB,YAElE+B,EAAAA,gBAAGL,sBAAoB1B,EAAa,IAAI,EAAE,KAAK,EAAA,CAAA,yDA4EnDwB,EAAAA,YAAa0B,CAAA,oBAITxB,EAAA,0BADRO,EAAAA,YAOEkB,EAAA,kBALSzB,EAAA,gDAAAA,EAAA,WAAUC,GAClB,QAASD,EAAA,YACV,KAAK,eACJ,KAAMA,EAAA,YACN,SAAQG,EAAA,gGAGHH,EAAA,yBADRO,EAAAA,YAKEmB,EAAA,kBAHS1B,EAAA,+CAAAA,EAAA,UAASC,GACjB,KAAMD,EAAA,YACN,MAAOA,EAAA"}
1
+ {"version":3,"file":"MicroservicesTab-BEGNdUG3.cjs","sources":["../src/tools/admin/tabs/MicroservicesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2026, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-alert v-model=\"showAlert\" closable :type=\"alertType\">{{\n alert\n }}</v-alert>\n <div class=\"text-caption text-medium-emphasis mt-2 mb-2 ml-4\">\n <template v-if=\"hasServiceFilter && filteredServiceCount === 0\">\n No microservices match filter (showing 0 / {{ totalServiceCount }})\n </template>\n <template v-else-if=\"hasServiceFilter\">\n Showing {{ filteredServiceCount }} /\n {{ totalServiceCount }} microservices\n </template>\n <template v-else> {{ totalServiceCount }} microservices </template>\n </div>\n <v-row v-if=\"hasServiceFilter\" class=\"ml-1 mb-1\">\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n prepend-icon=\"mdi-filter-off\"\n aria-label=\"Filter applied. Click to clear filter and show all services.\"\n @click=\"clearServiceFilter\"\n >\n Show All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"warning\"\n prepend-icon=\"mdi-refresh\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkRestartServices\"\n >\n Restart All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"error\"\n prepend-icon=\"mdi-stop\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkStopServices\"\n >\n Stop All\n </v-btn>\n </v-col>\n </v-row>\n <v-list class=\"list\" data-test=\"microserviceList\">\n <div\n v-for=\"microservice in filteredMicroservices\"\n :key=\"microservice.name\"\n >\n <v-list-item>\n <v-list-item-title>{{ microservice.name }}</v-list-item-title>\n <v-list-item-subtitle v-if=\"microservice_status[microservice.name]\">\n Updated:\n {{\n formatNanoseconds(\n microservice_status[microservice.name].updated_at,\n timeZone,\n )\n }}, Enabled: {{ isEnabled(microservice.name) ? 'True' : 'False' }},\n Count:\n {{ microservice_status[microservice.name].count }}\n </v-list-item-subtitle>\n <template #append>\n <v-btn\n v-show=\"microservice_status[microservice.name]?.error\"\n icon=\"mdi-alert\"\n variant=\"text\"\n @click=\"showMicroserviceError(microservice.name)\"\n />\n <v-chip\n v-if=\"microservice_status[microservice.name]\"\n :color=\"getStateColor(microservice.name)\"\n size=\"small\"\n label\n >\n {{ getStateText(microservice.name) }}\n </v-chip>\n <v-tooltip\n :text=\"isEnabled(microservice.name) ? 'Restart' : 'Start'\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n :aria-label=\"\n isEnabled(microservice.name)\n ? 'Restart Microservice'\n : 'Start Microservice'\n \"\n :icon=\"\n isRestarting(microservice.name) ||\n isStarting(microservice.name)\n ? 'mdi-loading'\n : isEnabled(microservice.name)\n ? 'mdi-refresh'\n : 'mdi-play'\n \"\n :class=\"{\n 'rotating-icon':\n isRestarting(microservice.name) ||\n isStarting(microservice.name),\n }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"restartMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Stop\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Stop Microservice\"\n :icon=\"\n isStopping(microservice.name) ? 'mdi-loading' : 'mdi-stop'\n \"\n :class=\"{ 'rotating-icon': isStopping(microservice.name) }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"stopMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Show Details\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Show Microservice Details\"\n icon=\"mdi-eye\"\n variant=\"text\"\n @click=\"showMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"jsonContent\"\n type=\"Microservice\"\n :name=\"dialogTitle\"\n @submit=\"dialogCallback\"\n />\n <text-box-dialog\n v-if=\"showError\"\n v-model=\"showError\"\n :text=\"jsonContent\"\n :title=\"dialogTitle\"\n />\n </div>\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { OutputDialog, TextBoxDialog } from '@/components'\nimport { TimeFilters } from '@/util'\n\nexport default {\n components: {\n OutputDialog,\n TextBoxDialog,\n },\n mixins: [TimeFilters],\n data() {\n return {\n filteredMicroservices: [],\n allMicroservices: [],\n microservice_status: {},\n microservice_id: null,\n jsonContent: '',\n dialogTitle: '',\n showDialog: false,\n showError: false,\n alert: '',\n alertType: 'success',\n showAlert: false,\n updater: null,\n timeZone: 'local',\n // { service_name:\n // { operation: 'stopping' | 'restarting' | 'starting',\n // enabled_states: []\n // initial_updated_at: timestamp\n // time_started: timestamp\n // }\n // }\n microserviceOperations: {},\n }\n },\n computed: {\n serviceFilter() {\n const services = this.$route.query.services\n if (!services) return null\n return services\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s)\n },\n hasServiceFilter() {\n return this.serviceFilter && this.serviceFilter.length > 0\n },\n totalServiceCount() {\n return this.allMicroservices.length\n },\n filteredServiceCount() {\n return this.filteredMicroservices.length\n },\n },\n watch: {\n '$route.query.services': function () {\n this.applyServiceFilter()\n },\n },\n created() {\n new OpenC3Api()\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch(() => {\n // Do nothing\n })\n },\n mounted() {\n this.update()\n this.updater = setInterval(() => {\n this.update()\n }, 2000)\n },\n beforeUnmount() {\n clearInterval(this.updater)\n this.updater = null\n },\n methods: {\n isOperationInProgress: function (name) {\n return !!this.microserviceOperations[name]\n },\n isEnabled: function (name) {\n const microservice = this.allMicroservices.find((ms) => ms.name === name)\n return microservice?.enabled !== false\n },\n isRestarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'restarting'\n },\n isStarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'starting'\n },\n isStopping: function (name) {\n return this.microserviceOperations[name]?.operation === 'stopping'\n },\n update: function () {\n Api.get('/openc3-api/microservice_status/all').then((response) => {\n this.microservice_status = response.data\n this.checkOperationCompletion()\n })\n Api.get('/openc3-api/microservices/all').then((response) => {\n // Convert hash of microservices to array of microservices\n let microservices = []\n for (const [_microservice_name, microservice] of Object.entries(\n response.data,\n )) {\n microservices.push(microservice)\n }\n microservices.sort((a, b) => a.name.localeCompare(b.name))\n this.allMicroservices = microservices\n this.applyServiceFilter()\n })\n },\n checkOperationCompletion: function () {\n for (const [name, tracking] of Object.entries(\n this.microserviceOperations,\n )) {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n if (!microservice) continue\n\n const currentEnabled = microservice.enabled !== false\n const lastEnabled =\n tracking.enabled_states[tracking.enabled_states.length - 1]\n\n // Only add state if it changed\n if (currentEnabled !== lastEnabled) {\n tracking.enabled_states.push(currentEnabled)\n }\n\n const isComplete = this.isOperationComplete(name, tracking)\n if (isComplete) {\n delete this.microserviceOperations[name]\n }\n }\n },\n isOperationComplete: function (serviceName, tracking) {\n // Check for timeout (30 seconds)\n const elapsed = Date.now() - tracking.time_started\n if (elapsed > 30000) {\n this.alert = `${serviceName} timed out when ${tracking.operation}.`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[serviceName]\n return true\n }\n\n if (tracking.operation === 'stopping') {\n // Track true -> false\n return tracking.enabled_states.includes(false)\n }\n if (tracking.operation === 'starting') {\n // Track false -> true\n return tracking.enabled_states.includes(true)\n }\n if (tracking.operation === 'restarting') {\n // Check if updated_at has changed\n const currentUpdatedAt =\n this.microservice_status[serviceName]?.updated_at\n if (currentUpdatedAt && tracking.initial_updated_at) {\n return currentUpdatedAt !== tracking.initial_updated_at\n }\n return false\n }\n return false\n },\n applyServiceFilter: function () {\n if (this.hasServiceFilter) {\n this.filteredMicroservices = this.allMicroservices.filter((ms) =>\n this.serviceFilter.includes(ms.name),\n )\n } else {\n this.filteredMicroservices = this.allMicroservices\n }\n },\n clearServiceFilter: function () {\n this.$router.push({ query: {} })\n },\n bulkRestartServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to restart ${microserviceNames.length} microservice(s)? ${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n const initialUpdatedAt = this.microservice_status[name]?.updated_at\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: initialUpdatedAt,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch(\n (error) => {\n this.alert = `Start command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n bulkStopServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to stop ${microserviceNames.length} microservice(s)?\\n\\n${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch(\n (error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n stopMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to stop microservice: ${name}?`, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch((error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n restartMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to restart microservice: ${name}?`, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: this.microservice_status[name]?.updated_at,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch((error) => {\n this.alert = `Restart command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n showMicroservice: function (name) {\n Api.get(`/openc3-api/microservices/${name}`).then((response) => {\n this.microservice_id = name\n this.dialogTitle = name\n this.jsonContent = JSON.stringify(response.data, null, '\\t')\n this.showDialog = true\n })\n },\n showMicroserviceError: function (name) {\n this.dialogTitle = name\n const e = this.microservice_status[name].error\n this.jsonContent = JSON.stringify(e, null, '\\t')\n this.showError = true\n },\n // States are determined by the microservice and not from an explicitly defined set\n // However, we can provide useful colors for errors and common states\n getStateColor(microserviceName) {\n const status = this.microservice_status[microserviceName]\n if (!status) return 'grey'\n if (status.error) return 'red'\n // If not enabled, show as stopped even if state is \"running\"\n if (!this.isEnabled(microserviceName) || status.state === 'STOPPED')\n return 'yellow'\n if (status.state === 'RUNNING') return 'green'\n return 'grey'\n },\n getStateText(microserviceName) {\n if (!this.isEnabled(microserviceName)) {\n return 'STOPPED'\n }\n return this.microservice_status[microserviceName].state\n },\n dialogCallback: function (content) {\n this.showDialog = false\n if (content !== null) {\n let parsed = JSON.parse(content)\n let method = 'put'\n let url = `/openc3-api/microservices/${this.microservice_id}`\n if (parsed['name'] !== this.microservice_id) {\n method = 'post'\n url = '/openc3-api/microservices'\n }\n\n Api[method](url, {\n data: {\n json: content,\n },\n }).then((response) => {\n this.alert = 'Modified Microservice'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n })\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.rotating-icon {\n animation: spin 1s linear infinite;\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n"],"names":["_sfc_main","OutputDialog","TextBoxDialog","TimeFilters","services","s","OpenC3Api","response","name","ms","Api","microservices","_microservice_name","microservice","a","b","tracking","currentEnabled","lastEnabled","serviceName","currentUpdatedAt","microserviceNames","m","microserviceList","confirmMessage","initialUpdatedAt","error","_dialog","e","microserviceName","status","content","parsed","method","url","_hoisted_1","_createElementBlock","_createVNode","_component_v_alert","$data","$event","_createElementVNode","$options","_Fragment","_toDisplayString","_createTextVNode","_createBlock","_component_v_row","_component_v_col","_component_v_btn","_cache","_component_v_list","_renderList","_component_v_list_item","_vShow","_component_v_chip","_component_v_tooltip","_withCtx","props","_mergeProps","_component_v_list_item_title","_component_v_list_item_subtitle","_ctx","_component_v_divider","_component_output_dialog","_component_text_box_dialog"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
- import { e as v, j } from "./format-BJTVXrSU.js";
2
- import "./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-C6eLx1ow.js";
3
- import { resolveComponent as c, openBlock as d, createElementBlock as _, createVNode as n, withCtx as a, createTextVNode as m, toDisplayString as p, createElementVNode as R, Fragment as S, createBlock as g, createCommentVNode as b, renderList as N, withDirectives as P, vShow as U, mergeProps as y } from "vue";
1
+ import { F as v, s as R } from "./format-mcuVCYue.js";
2
+ import "./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-JHbHqvBt.js";
3
+ import { resolveComponent as c, openBlock as d, createElementBlock as _, createVNode as n, withCtx as a, createTextVNode as m, toDisplayString as p, createElementVNode as j, Fragment as S, createBlock as g, createCommentVNode as b, renderList as N, withDirectives as P, vShow as U, mergeProps as y } from "vue";
4
4
  import { _ as I } from "./CustomIcon-DTR361si.js";
5
- import { T as B } from "./timeFilters-BjNif-pu.js";
5
+ import { T as q } from "./timeFilters-a8Cma3bj.js";
6
6
  import "./store-CO68rDJT.js";
7
7
  import "single-spa";
8
- import { O as L } from "./OutputDialog-wOewjnk2.js";
9
- import { T as q } from "./TextBoxDialog-R6GC8pMa.js";
8
+ import { O as B } from "./OutputDialog-DtrpwjGL.js";
9
+ import { T as L } from "./TextBoxDialog-R6GC8pMa.js";
10
10
  const J = {
11
11
  components: {
12
- OutputDialog: L,
13
- TextBoxDialog: q
12
+ OutputDialog: B,
13
+ TextBoxDialog: L
14
14
  },
15
- mixins: [B],
15
+ mixins: [q],
16
16
  data() {
17
17
  return {
18
18
  filteredMicroservices: [],
@@ -59,7 +59,7 @@ const J = {
59
59
  }
60
60
  },
61
61
  created() {
62
- new j().get_setting("time_zone").then((e) => {
62
+ new R().get_setting("time_zone").then((e) => {
63
63
  e && (this.timeZone = e);
64
64
  }).catch(() => {
65
65
  });
@@ -263,7 +263,7 @@ ${t}`;
263
263
  }
264
264
  }, Z = { class: "text-caption text-medium-emphasis mt-2 mb-2 ml-4" };
265
265
  function z(e, t, l, r, s, i) {
266
- const h = c("v-alert"), u = c("v-btn"), w = c("v-col"), M = c("v-row"), x = c("v-list-item-title"), k = c("v-list-item-subtitle"), O = c("v-chip"), C = c("v-tooltip"), E = c("v-list-item"), A = c("v-divider"), D = c("v-list"), F = c("output-dialog"), V = c("text-box-dialog");
266
+ const h = c("v-alert"), u = c("v-btn"), w = c("v-col"), M = c("v-row"), x = c("v-list-item-title"), k = c("v-list-item-subtitle"), O = c("v-chip"), C = c("v-tooltip"), E = c("v-list-item"), A = c("v-divider"), F = c("v-list"), D = c("output-dialog"), V = c("text-box-dialog");
267
267
  return d(), _("div", null, [
268
268
  n(h, {
269
269
  modelValue: s.showAlert,
@@ -276,7 +276,7 @@ function z(e, t, l, r, s, i) {
276
276
  ]),
277
277
  _: 1
278
278
  }, 8, ["modelValue", "type"]),
279
- R("div", Z, [
279
+ j("div", Z, [
280
280
  i.hasServiceFilter && i.filteredServiceCount === 0 ? (d(), _(S, { key: 0 }, [
281
281
  m(" No microservices match filter (showing 0 / " + p(i.totalServiceCount) + ") ", 1)
282
282
  ], 64)) : i.hasServiceFilter ? (d(), _(S, { key: 1 }, [
@@ -341,7 +341,7 @@ function z(e, t, l, r, s, i) {
341
341
  ]),
342
342
  _: 1
343
343
  })) : b("", !0),
344
- n(D, {
344
+ n(F, {
345
345
  class: "list",
346
346
  "data-test": "microserviceList"
347
347
  }, {
@@ -442,7 +442,7 @@ function z(e, t, l, r, s, i) {
442
442
  ]),
443
443
  _: 1
444
444
  }),
445
- s.showDialog ? (d(), g(F, {
445
+ s.showDialog ? (d(), g(D, {
446
446
  key: 1,
447
447
  modelValue: s.showDialog,
448
448
  "onUpdate:modelValue": t[1] || (t[1] = (o) => s.showDialog = o),
@@ -464,4 +464,4 @@ const te = /* @__PURE__ */ I(J, [["render", z], ["__scopeId", "data-v-6b152c7a"]
464
464
  export {
465
465
  te as default
466
466
  };
467
- //# sourceMappingURL=MicroservicesTab-gCXt9Jlh.js.map
467
+ //# sourceMappingURL=MicroservicesTab-CQPpb7j1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MicroservicesTab-gCXt9Jlh.js","sources":["../src/tools/admin/tabs/MicroservicesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2026, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-alert v-model=\"showAlert\" closable :type=\"alertType\">{{\n alert\n }}</v-alert>\n <div class=\"text-caption text-medium-emphasis mt-2 mb-2 ml-4\">\n <template v-if=\"hasServiceFilter && filteredServiceCount === 0\">\n No microservices match filter (showing 0 / {{ totalServiceCount }})\n </template>\n <template v-else-if=\"hasServiceFilter\">\n Showing {{ filteredServiceCount }} /\n {{ totalServiceCount }} microservices\n </template>\n <template v-else> {{ totalServiceCount }} microservices </template>\n </div>\n <v-row v-if=\"hasServiceFilter\" class=\"ml-1 mb-1\">\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n prepend-icon=\"mdi-filter-off\"\n aria-label=\"Filter applied. Click to clear filter and show all services.\"\n @click=\"clearServiceFilter\"\n >\n Show All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"warning\"\n prepend-icon=\"mdi-refresh\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkRestartServices\"\n >\n Restart All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"error\"\n prepend-icon=\"mdi-stop\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkStopServices\"\n >\n Stop All\n </v-btn>\n </v-col>\n </v-row>\n <v-list class=\"list\" data-test=\"microserviceList\">\n <div\n v-for=\"microservice in filteredMicroservices\"\n :key=\"microservice.name\"\n >\n <v-list-item>\n <v-list-item-title>{{ microservice.name }}</v-list-item-title>\n <v-list-item-subtitle v-if=\"microservice_status[microservice.name]\">\n Updated:\n {{\n formatNanoseconds(\n microservice_status[microservice.name].updated_at,\n timeZone,\n )\n }}, Enabled: {{ isEnabled(microservice.name) ? 'True' : 'False' }},\n Count:\n {{ microservice_status[microservice.name].count }}\n </v-list-item-subtitle>\n <template #append>\n <v-btn\n v-show=\"microservice_status[microservice.name]?.error\"\n icon=\"mdi-alert\"\n variant=\"text\"\n @click=\"showMicroserviceError(microservice.name)\"\n />\n <v-chip\n v-if=\"microservice_status[microservice.name]\"\n :color=\"getStateColor(microservice.name)\"\n size=\"small\"\n label\n >\n {{ getStateText(microservice.name) }}\n </v-chip>\n <v-tooltip\n :text=\"isEnabled(microservice.name) ? 'Restart' : 'Start'\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n :aria-label=\"\n isEnabled(microservice.name)\n ? 'Restart Microservice'\n : 'Start Microservice'\n \"\n :icon=\"\n isRestarting(microservice.name) ||\n isStarting(microservice.name)\n ? 'mdi-loading'\n : isEnabled(microservice.name)\n ? 'mdi-refresh'\n : 'mdi-play'\n \"\n :class=\"{\n 'rotating-icon':\n isRestarting(microservice.name) ||\n isStarting(microservice.name),\n }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"restartMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Stop\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Stop Microservice\"\n :icon=\"\n isStopping(microservice.name) ? 'mdi-loading' : 'mdi-stop'\n \"\n :class=\"{ 'rotating-icon': isStopping(microservice.name) }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"stopMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Show Details\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Show Microservice Details\"\n icon=\"mdi-eye\"\n variant=\"text\"\n @click=\"showMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"jsonContent\"\n type=\"Microservice\"\n :name=\"dialogTitle\"\n @submit=\"dialogCallback\"\n />\n <text-box-dialog\n v-if=\"showError\"\n v-model=\"showError\"\n :text=\"jsonContent\"\n :title=\"dialogTitle\"\n />\n </div>\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { OutputDialog, TextBoxDialog } from '@/components'\nimport { TimeFilters } from '@/util'\n\nexport default {\n components: {\n OutputDialog,\n TextBoxDialog,\n },\n mixins: [TimeFilters],\n data() {\n return {\n filteredMicroservices: [],\n allMicroservices: [],\n microservice_status: {},\n microservice_id: null,\n jsonContent: '',\n dialogTitle: '',\n showDialog: false,\n showError: false,\n alert: '',\n alertType: 'success',\n showAlert: false,\n updater: null,\n timeZone: 'local',\n // { service_name:\n // { operation: 'stopping' | 'restarting' | 'starting',\n // enabled_states: []\n // initial_updated_at: timestamp\n // time_started: timestamp\n // }\n // }\n microserviceOperations: {},\n }\n },\n computed: {\n serviceFilter() {\n const services = this.$route.query.services\n if (!services) return null\n return services\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s)\n },\n hasServiceFilter() {\n return this.serviceFilter && this.serviceFilter.length > 0\n },\n totalServiceCount() {\n return this.allMicroservices.length\n },\n filteredServiceCount() {\n return this.filteredMicroservices.length\n },\n },\n watch: {\n '$route.query.services': function () {\n this.applyServiceFilter()\n },\n },\n created() {\n new OpenC3Api()\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch(() => {\n // Do nothing\n })\n },\n mounted() {\n this.update()\n this.updater = setInterval(() => {\n this.update()\n }, 2000)\n },\n beforeUnmount() {\n clearInterval(this.updater)\n this.updater = null\n },\n methods: {\n isOperationInProgress: function (name) {\n return !!this.microserviceOperations[name]\n },\n isEnabled: function (name) {\n const microservice = this.allMicroservices.find((ms) => ms.name === name)\n return microservice?.enabled !== false\n },\n isRestarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'restarting'\n },\n isStarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'starting'\n },\n isStopping: function (name) {\n return this.microserviceOperations[name]?.operation === 'stopping'\n },\n update: function () {\n Api.get('/openc3-api/microservice_status/all').then((response) => {\n this.microservice_status = response.data\n this.checkOperationCompletion()\n })\n Api.get('/openc3-api/microservices/all').then((response) => {\n // Convert hash of microservices to array of microservices\n let microservices = []\n for (const [_microservice_name, microservice] of Object.entries(\n response.data,\n )) {\n microservices.push(microservice)\n }\n microservices.sort((a, b) => a.name.localeCompare(b.name))\n this.allMicroservices = microservices\n this.applyServiceFilter()\n })\n },\n checkOperationCompletion: function () {\n for (const [name, tracking] of Object.entries(\n this.microserviceOperations,\n )) {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n if (!microservice) continue\n\n const currentEnabled = microservice.enabled !== false\n const lastEnabled =\n tracking.enabled_states[tracking.enabled_states.length - 1]\n\n // Only add state if it changed\n if (currentEnabled !== lastEnabled) {\n tracking.enabled_states.push(currentEnabled)\n }\n\n const isComplete = this.isOperationComplete(name, tracking)\n if (isComplete) {\n delete this.microserviceOperations[name]\n }\n }\n },\n isOperationComplete: function (serviceName, tracking) {\n // Check for timeout (30 seconds)\n const elapsed = Date.now() - tracking.time_started\n if (elapsed > 30000) {\n this.alert = `${serviceName} timed out when ${tracking.operation}.`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[serviceName]\n return true\n }\n\n if (tracking.operation === 'stopping') {\n // Track true -> false\n return tracking.enabled_states.includes(false)\n }\n if (tracking.operation === 'starting') {\n // Track false -> true\n return tracking.enabled_states.includes(true)\n }\n if (tracking.operation === 'restarting') {\n // Check if updated_at has changed\n const currentUpdatedAt =\n this.microservice_status[serviceName]?.updated_at\n if (currentUpdatedAt && tracking.initial_updated_at) {\n return currentUpdatedAt !== tracking.initial_updated_at\n }\n return false\n }\n return false\n },\n applyServiceFilter: function () {\n if (this.hasServiceFilter) {\n this.filteredMicroservices = this.allMicroservices.filter((ms) =>\n this.serviceFilter.includes(ms.name),\n )\n } else {\n this.filteredMicroservices = this.allMicroservices\n }\n },\n clearServiceFilter: function () {\n this.$router.push({ query: {} })\n },\n bulkRestartServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to restart ${microserviceNames.length} microservice(s)? ${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n const initialUpdatedAt = this.microservice_status[name]?.updated_at\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: initialUpdatedAt,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch(\n (error) => {\n this.alert = `Start command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n bulkStopServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to stop ${microserviceNames.length} microservice(s)?\\n\\n${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch(\n (error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n stopMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to stop microservice: ${name}?`, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch((error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n restartMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to restart microservice: ${name}?`, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: this.microservice_status[name]?.updated_at,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch((error) => {\n this.alert = `Restart command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n showMicroservice: function (name) {\n Api.get(`/openc3-api/microservices/${name}`).then((response) => {\n this.microservice_id = name\n this.dialogTitle = name\n this.jsonContent = JSON.stringify(response.data, null, '\\t')\n this.showDialog = true\n })\n },\n showMicroserviceError: function (name) {\n this.dialogTitle = name\n const e = this.microservice_status[name].error\n this.jsonContent = JSON.stringify(e, null, '\\t')\n this.showError = true\n },\n // States are determined by the microservice and not from an explicitly defined set\n // However, we can provide useful colors for errors and common states\n getStateColor(microserviceName) {\n const status = this.microservice_status[microserviceName]\n if (!status) return 'grey'\n if (status.error) return 'red'\n // If not enabled, show as stopped even if state is \"running\"\n if (!this.isEnabled(microserviceName) || status.state === 'STOPPED')\n return 'yellow'\n if (status.state === 'RUNNING') return 'green'\n return 'grey'\n },\n getStateText(microserviceName) {\n if (!this.isEnabled(microserviceName)) {\n return 'STOPPED'\n }\n return this.microservice_status[microserviceName].state\n },\n dialogCallback: function (content) {\n this.showDialog = false\n if (content !== null) {\n let parsed = JSON.parse(content)\n let method = 'put'\n let url = `/openc3-api/microservices/${this.microservice_id}`\n if (parsed['name'] !== this.microservice_id) {\n method = 'post'\n url = '/openc3-api/microservices'\n }\n\n Api[method](url, {\n data: {\n json: content,\n },\n }).then((response) => {\n this.alert = 'Modified Microservice'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n })\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.rotating-icon {\n animation: spin 1s linear infinite;\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n"],"names":["_sfc_main","OutputDialog","TextBoxDialog","TimeFilters","services","s","OpenC3Api","response","name","ms","Api","microservices","_microservice_name","microservice","a","b","tracking","currentEnabled","lastEnabled","serviceName","currentUpdatedAt","microserviceNames","m","microserviceList","confirmMessage","initialUpdatedAt","error","_dialog","e","microserviceName","status","content","parsed","method","url","_hoisted_1","_createElementBlock","_createVNode","_component_v_alert","$data","$event","_createElementVNode","$options","_Fragment","_toDisplayString","_createTextVNode","_createBlock","_component_v_row","_component_v_col","_component_v_btn","_cache","_component_v_list","_renderList","_component_v_list_item","_vShow","_component_v_chip","_component_v_tooltip","_withCtx","props","_mergeProps","_component_v_list_item_title","_component_v_list_item_subtitle","_ctx","_component_v_divider","_component_output_dialog","_component_text_box_dialog"],"mappings":"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"}
1
+ {"version":3,"file":"MicroservicesTab-CQPpb7j1.js","sources":["../src/tools/admin/tabs/MicroservicesTab.vue"],"sourcesContent":["<!--\n# Copyright 2022 Ball Aerospace & Technologies Corp.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# Modified by OpenC3, Inc.\n# All changes Copyright 2026, OpenC3, Inc.\n# All Rights Reserved\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-alert v-model=\"showAlert\" closable :type=\"alertType\">{{\n alert\n }}</v-alert>\n <div class=\"text-caption text-medium-emphasis mt-2 mb-2 ml-4\">\n <template v-if=\"hasServiceFilter && filteredServiceCount === 0\">\n No microservices match filter (showing 0 / {{ totalServiceCount }})\n </template>\n <template v-else-if=\"hasServiceFilter\">\n Showing {{ filteredServiceCount }} /\n {{ totalServiceCount }} microservices\n </template>\n <template v-else> {{ totalServiceCount }} microservices </template>\n </div>\n <v-row v-if=\"hasServiceFilter\" class=\"ml-1 mb-1\">\n <v-col cols=\"auto\">\n <v-btn\n color=\"primary\"\n prepend-icon=\"mdi-filter-off\"\n aria-label=\"Filter applied. Click to clear filter and show all services.\"\n @click=\"clearServiceFilter\"\n >\n Show All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"warning\"\n prepend-icon=\"mdi-refresh\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkRestartServices\"\n >\n Restart All\n </v-btn>\n </v-col>\n <v-col cols=\"auto\">\n <v-btn\n color=\"error\"\n prepend-icon=\"mdi-stop\"\n :disabled=\"filteredServiceCount === 0\"\n @click=\"bulkStopServices\"\n >\n Stop All\n </v-btn>\n </v-col>\n </v-row>\n <v-list class=\"list\" data-test=\"microserviceList\">\n <div\n v-for=\"microservice in filteredMicroservices\"\n :key=\"microservice.name\"\n >\n <v-list-item>\n <v-list-item-title>{{ microservice.name }}</v-list-item-title>\n <v-list-item-subtitle v-if=\"microservice_status[microservice.name]\">\n Updated:\n {{\n formatNanoseconds(\n microservice_status[microservice.name].updated_at,\n timeZone,\n )\n }}, Enabled: {{ isEnabled(microservice.name) ? 'True' : 'False' }},\n Count:\n {{ microservice_status[microservice.name].count }}\n </v-list-item-subtitle>\n <template #append>\n <v-btn\n v-show=\"microservice_status[microservice.name]?.error\"\n icon=\"mdi-alert\"\n variant=\"text\"\n @click=\"showMicroserviceError(microservice.name)\"\n />\n <v-chip\n v-if=\"microservice_status[microservice.name]\"\n :color=\"getStateColor(microservice.name)\"\n size=\"small\"\n label\n >\n {{ getStateText(microservice.name) }}\n </v-chip>\n <v-tooltip\n :text=\"isEnabled(microservice.name) ? 'Restart' : 'Start'\"\n location=\"top\"\n >\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n :aria-label=\"\n isEnabled(microservice.name)\n ? 'Restart Microservice'\n : 'Start Microservice'\n \"\n :icon=\"\n isRestarting(microservice.name) ||\n isStarting(microservice.name)\n ? 'mdi-loading'\n : isEnabled(microservice.name)\n ? 'mdi-refresh'\n : 'mdi-play'\n \"\n :class=\"{\n 'rotating-icon':\n isRestarting(microservice.name) ||\n isStarting(microservice.name),\n }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"restartMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Stop\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Stop Microservice\"\n :icon=\"\n isStopping(microservice.name) ? 'mdi-loading' : 'mdi-stop'\n \"\n :class=\"{ 'rotating-icon': isStopping(microservice.name) }\"\n variant=\"text\"\n :disabled=\"isOperationInProgress(microservice.name)\"\n @click=\"stopMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n <v-tooltip text=\"Show Details\" location=\"top\">\n <template #activator=\"{ props }\">\n <v-btn\n v-bind=\"props\"\n aria-label=\"Show Microservice Details\"\n icon=\"mdi-eye\"\n variant=\"text\"\n @click=\"showMicroservice(microservice.name)\"\n />\n </template>\n </v-tooltip>\n </template>\n </v-list-item>\n <v-divider />\n </div>\n </v-list>\n <output-dialog\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :content=\"jsonContent\"\n type=\"Microservice\"\n :name=\"dialogTitle\"\n @submit=\"dialogCallback\"\n />\n <text-box-dialog\n v-if=\"showError\"\n v-model=\"showError\"\n :text=\"jsonContent\"\n :title=\"dialogTitle\"\n />\n </div>\n</template>\n\n<script>\nimport { Api, OpenC3Api } from '@openc3/js-common/services'\nimport { OutputDialog, TextBoxDialog } from '@/components'\nimport { TimeFilters } from '@/util'\n\nexport default {\n components: {\n OutputDialog,\n TextBoxDialog,\n },\n mixins: [TimeFilters],\n data() {\n return {\n filteredMicroservices: [],\n allMicroservices: [],\n microservice_status: {},\n microservice_id: null,\n jsonContent: '',\n dialogTitle: '',\n showDialog: false,\n showError: false,\n alert: '',\n alertType: 'success',\n showAlert: false,\n updater: null,\n timeZone: 'local',\n // { service_name:\n // { operation: 'stopping' | 'restarting' | 'starting',\n // enabled_states: []\n // initial_updated_at: timestamp\n // time_started: timestamp\n // }\n // }\n microserviceOperations: {},\n }\n },\n computed: {\n serviceFilter() {\n const services = this.$route.query.services\n if (!services) return null\n return services\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s)\n },\n hasServiceFilter() {\n return this.serviceFilter && this.serviceFilter.length > 0\n },\n totalServiceCount() {\n return this.allMicroservices.length\n },\n filteredServiceCount() {\n return this.filteredMicroservices.length\n },\n },\n watch: {\n '$route.query.services': function () {\n this.applyServiceFilter()\n },\n },\n created() {\n new OpenC3Api()\n .get_setting('time_zone')\n .then((response) => {\n if (response) {\n this.timeZone = response\n }\n })\n .catch(() => {\n // Do nothing\n })\n },\n mounted() {\n this.update()\n this.updater = setInterval(() => {\n this.update()\n }, 2000)\n },\n beforeUnmount() {\n clearInterval(this.updater)\n this.updater = null\n },\n methods: {\n isOperationInProgress: function (name) {\n return !!this.microserviceOperations[name]\n },\n isEnabled: function (name) {\n const microservice = this.allMicroservices.find((ms) => ms.name === name)\n return microservice?.enabled !== false\n },\n isRestarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'restarting'\n },\n isStarting: function (name) {\n return this.microserviceOperations[name]?.operation === 'starting'\n },\n isStopping: function (name) {\n return this.microserviceOperations[name]?.operation === 'stopping'\n },\n update: function () {\n Api.get('/openc3-api/microservice_status/all').then((response) => {\n this.microservice_status = response.data\n this.checkOperationCompletion()\n })\n Api.get('/openc3-api/microservices/all').then((response) => {\n // Convert hash of microservices to array of microservices\n let microservices = []\n for (const [_microservice_name, microservice] of Object.entries(\n response.data,\n )) {\n microservices.push(microservice)\n }\n microservices.sort((a, b) => a.name.localeCompare(b.name))\n this.allMicroservices = microservices\n this.applyServiceFilter()\n })\n },\n checkOperationCompletion: function () {\n for (const [name, tracking] of Object.entries(\n this.microserviceOperations,\n )) {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n if (!microservice) continue\n\n const currentEnabled = microservice.enabled !== false\n const lastEnabled =\n tracking.enabled_states[tracking.enabled_states.length - 1]\n\n // Only add state if it changed\n if (currentEnabled !== lastEnabled) {\n tracking.enabled_states.push(currentEnabled)\n }\n\n const isComplete = this.isOperationComplete(name, tracking)\n if (isComplete) {\n delete this.microserviceOperations[name]\n }\n }\n },\n isOperationComplete: function (serviceName, tracking) {\n // Check for timeout (30 seconds)\n const elapsed = Date.now() - tracking.time_started\n if (elapsed > 30000) {\n this.alert = `${serviceName} timed out when ${tracking.operation}.`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[serviceName]\n return true\n }\n\n if (tracking.operation === 'stopping') {\n // Track true -> false\n return tracking.enabled_states.includes(false)\n }\n if (tracking.operation === 'starting') {\n // Track false -> true\n return tracking.enabled_states.includes(true)\n }\n if (tracking.operation === 'restarting') {\n // Check if updated_at has changed\n const currentUpdatedAt =\n this.microservice_status[serviceName]?.updated_at\n if (currentUpdatedAt && tracking.initial_updated_at) {\n return currentUpdatedAt !== tracking.initial_updated_at\n }\n return false\n }\n return false\n },\n applyServiceFilter: function () {\n if (this.hasServiceFilter) {\n this.filteredMicroservices = this.allMicroservices.filter((ms) =>\n this.serviceFilter.includes(ms.name),\n )\n } else {\n this.filteredMicroservices = this.allMicroservices\n }\n },\n clearServiceFilter: function () {\n this.$router.push({ query: {} })\n },\n bulkRestartServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to restart ${microserviceNames.length} microservice(s)? ${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n const initialUpdatedAt = this.microservice_status[name]?.updated_at\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: initialUpdatedAt,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch(\n (error) => {\n this.alert = `Start command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n bulkStopServices: function () {\n const microserviceNames = this.filteredMicroservices.map((m) => m.name)\n const microserviceList = microserviceNames.join(', ')\n const confirmMessage = `Are you sure you want to stop ${microserviceNames.length} microservice(s)?\\n\\n${microserviceList}`\n\n this.$dialog\n .confirm(confirmMessage, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then(() => {\n microserviceNames.forEach((name) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch(\n (error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n },\n )\n })\n })\n .catch(() => {\n // User cancelled\n })\n },\n stopMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to stop microservice: ${name}?`, {\n okText: 'Stop',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'stopping',\n enabled_states: [currentEnabled],\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/stop`).catch((error) => {\n this.alert = `Stop command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n restartMicroservice: function (name) {\n this.$dialog\n .confirm(`Are you sure you want to restart microservice: ${name}?`, {\n okText: 'Restart',\n cancelText: 'Cancel',\n })\n .then((_dialog) => {\n const microservice = this.allMicroservices.find(\n (ms) => ms.name === name,\n )\n const currentEnabled = microservice?.enabled !== false\n this.microserviceOperations[name] = {\n operation: 'restarting',\n enabled_states: [currentEnabled],\n initial_updated_at: this.microservice_status[name]?.updated_at,\n time_started: Date.now(),\n }\n Api.post(`/openc3-api/microservices/${name}/start`).catch((error) => {\n this.alert = `Restart command failed for ${name}: ${error}`\n this.alertType = 'error'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n delete this.microserviceOperations[name]\n })\n })\n },\n showMicroservice: function (name) {\n Api.get(`/openc3-api/microservices/${name}`).then((response) => {\n this.microservice_id = name\n this.dialogTitle = name\n this.jsonContent = JSON.stringify(response.data, null, '\\t')\n this.showDialog = true\n })\n },\n showMicroserviceError: function (name) {\n this.dialogTitle = name\n const e = this.microservice_status[name].error\n this.jsonContent = JSON.stringify(e, null, '\\t')\n this.showError = true\n },\n // States are determined by the microservice and not from an explicitly defined set\n // However, we can provide useful colors for errors and common states\n getStateColor(microserviceName) {\n const status = this.microservice_status[microserviceName]\n if (!status) return 'grey'\n if (status.error) return 'red'\n // If not enabled, show as stopped even if state is \"running\"\n if (!this.isEnabled(microserviceName) || status.state === 'STOPPED')\n return 'yellow'\n if (status.state === 'RUNNING') return 'green'\n return 'grey'\n },\n getStateText(microserviceName) {\n if (!this.isEnabled(microserviceName)) {\n return 'STOPPED'\n }\n return this.microservice_status[microserviceName].state\n },\n dialogCallback: function (content) {\n this.showDialog = false\n if (content !== null) {\n let parsed = JSON.parse(content)\n let method = 'put'\n let url = `/openc3-api/microservices/${this.microservice_id}`\n if (parsed['name'] !== this.microservice_id) {\n method = 'post'\n url = '/openc3-api/microservices'\n }\n\n Api[method](url, {\n data: {\n json: content,\n },\n }).then((response) => {\n this.alert = 'Modified Microservice'\n this.alertType = 'success'\n this.showAlert = true\n setTimeout(() => {\n this.showAlert = false\n }, 5000)\n this.update()\n })\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.list {\n background-color: var(--color-background-surface-default) !important;\n overflow-x: hidden;\n}\n.rotating-icon {\n animation: spin 1s linear infinite;\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n"],"names":["_sfc_main","OutputDialog","TextBoxDialog","TimeFilters","services","s","OpenC3Api","response","name","ms","Api","microservices","_microservice_name","microservice","a","b","tracking","currentEnabled","lastEnabled","serviceName","currentUpdatedAt","microserviceNames","m","microserviceList","confirmMessage","initialUpdatedAt","error","_dialog","e","microserviceName","status","content","parsed","method","url","_hoisted_1","_createElementBlock","_createVNode","_component_v_alert","$data","$event","_createElementVNode","$options","_Fragment","_toDisplayString","_createTextVNode","_createBlock","_component_v_row","_component_v_col","_component_v_btn","_cache","_component_v_list","_renderList","_component_v_list_item","_vShow","_component_v_chip","_component_v_tooltip","_withCtx","props","_mergeProps","_component_v_list_item_title","_component_v_list_item_subtitle","_ctx","_component_v_divider","_component_output_dialog","_component_text_box_dialog"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { g, p as N } from "./settingsCache-CriaPeNM.js";
1
+ import { g, p as N } from "./settingsCache-BTZ8CWTD.js";
2
2
  import { resolveComponent as l, openBlock as _, createBlock as b, withKeys as v, normalizeClass as T, normalizeStyle as F, withCtx as o, createVNode as u, createTextVNode as c, mergeProps as I } from "vue";
3
- import "./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-C6eLx1ow.js";
3
+ import "./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-JHbHqvBt.js";
4
4
  import { _ as C } from "./CustomIcon-DTR361si.js";
5
5
  const k = {
6
6
  inheritAttrs: !1,
@@ -232,4 +232,4 @@ const w = /* @__PURE__ */ C(k, [["render", x], ["__scopeId", "data-v-3a6a70ee"]]
232
232
  export {
233
233
  w as O
234
234
  };
235
- //# sourceMappingURL=OpenC3TimePicker-WVlNQdKk.js.map
235
+ //# sourceMappingURL=OpenC3TimePicker-B0lAIU91.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OpenC3TimePicker-WVlNQdKk.js","sources":["../src/components/OpenC3TimePicker.vue"],"sourcesContent":["<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-text-field\n v-model=\"inputValue\"\n :label=\"label\"\n :rules=\"computedRules\"\n :error-messages=\"errorMessages\"\n :hide-details=\"hideDetails\"\n :variant=\"variant\"\n :density=\"density\"\n :style=\"computedStyle\"\n :class=\"textFieldClass\"\n :disabled=\"disabled\"\n :data-test=\"dataTest\"\n @blur=\"handleBlur\"\n @focus=\"$emit('focus', $event)\"\n @keydown.enter=\"handleBlur\"\n >\n <template #prepend-inner>\n <v-menu\n v-model=\"menu\"\n :close-on-content-click=\"false\"\n transition=\"scale-transition\"\n offset=\"16\"\n >\n <template #activator=\"{ props: menuProps }\">\n <v-icon v-bind=\"menuProps\" class=\"cursor-pointer\">\n mdi-clock-outline\n </v-icon>\n </template>\n <v-card class=\"time-picker-card\">\n <v-time-picker\n v-model=\"tempTime\"\n :format=\"timeFormat\"\n scrollable\n use-seconds\n hide-header\n />\n <v-card-actions>\n <v-spacer />\n <v-btn variant=\"text\" @click=\"cancel\">Cancel</v-btn>\n <v-btn color=\"primary\" variant=\"text\" @click=\"save\">OK</v-btn>\n </v-card-actions>\n </v-card>\n </v-menu>\n </template>\n </v-text-field>\n</template>\n\n<script>\nimport { getCachedSetting, peekCachedSetting } from '../util'\n\nexport default {\n inheritAttrs: false,\n props: {\n modelValue: {\n type: String,\n default: '',\n },\n label: {\n type: String,\n default: 'Time',\n },\n rules: {\n type: Array,\n default: () => [],\n },\n errorMessages: {\n type: [String, Array],\n default: () => [],\n },\n hideDetails: {\n type: [Boolean, String],\n default: false,\n },\n variant: {\n type: String,\n default: 'filled',\n },\n density: {\n type: String,\n default: 'default',\n },\n style: {\n type: [String, Object],\n default: '',\n },\n textFieldClass: {\n type: String,\n default: '',\n },\n dataTest: {\n type: String,\n default: '',\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['update:modelValue', 'focus'],\n data() {\n return {\n menu: false,\n // peek returns undefined until the first instance resolves the setting;\n // null then marks \"still loading\" so the watcher defers formatting.\n timeFormat: peekCachedSetting('time_format') ?? null,\n tempTime: null,\n inputValue: '',\n }\n },\n computed: {\n computedStyle() {\n if (typeof this.style === 'string') {\n return this.style\n }\n return this.style\n },\n computedRules() {\n // Wrap the passed rules to validate against the 24-hour modelValue\n return this.rules.map((rule) => {\n return () => {\n return rule(this.modelValue)\n }\n })\n },\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(newVal) {\n // Skip until timeFormat has loaded — created() will do the initial\n // format. Otherwise we'd flash the default ('ampm') style first.\n if (!this.menu && this.timeFormat !== null) {\n this.inputValue = this.formatForDisplay(newVal)\n }\n },\n },\n inputValue(newVal) {\n // Immediately emit empty value when input is cleared for instant validation\n if (newVal === '' && this.modelValue !== '') {\n this.$emit('update:modelValue', '')\n }\n },\n menu(newVal) {\n if (newVal) {\n // When menu opens, initialize tempTime with current value\n // Normalize to HH:mm:ss format (v-time-picker doesn't handle milliseconds)\n this.tempTime = this.normalizeTime(this.modelValue) || '00:00:00'\n }\n },\n tempTime(newVal) {\n // Update input display in real-time when using the time picker\n if (this.menu && newVal) {\n this.inputValue = this.formatForDisplay(newVal)\n }\n },\n },\n async created() {\n // If the cache was already populated, the immediate modelValue watcher has\n // already done the initial format — nothing to do.\n if (this.timeFormat !== null) return\n const previousDisplay = this.inputValue\n this.timeFormat = await getCachedSetting('time_format', 'ampm')\n // Only overwrite if the user hasn't typed during the await.\n if (!this.menu && this.inputValue === previousDisplay) {\n this.inputValue = this.formatForDisplay(this.modelValue)\n }\n },\n methods: {\n formatForDisplay(time24) {\n if (!time24) return ''\n if (this.timeFormat === '24hr') {\n return time24\n }\n return this.convertTo12Hour(time24)\n },\n handleBlur() {\n // Parse input and update modelValue\n const parsed = this.parseTimeInput(this.inputValue)\n if (parsed) {\n this.$emit('update:modelValue', parsed)\n this.inputValue = this.formatForDisplay(parsed)\n } else if (this.inputValue === '') {\n this.$emit('update:modelValue', '')\n } else {\n // Invalid input, revert to current modelValue display\n this.inputValue = this.formatForDisplay(this.modelValue)\n }\n },\n parseTimeInput(input) {\n if (!input || input.trim() === '') return ''\n\n // Try to parse 24-hour format: HH:mm:ss or HH:mm\n const time24Match = input.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/)\n if (time24Match) {\n const hours = Number.parseInt(time24Match[1], 10)\n const minutes = Number.parseInt(time24Match[2], 10)\n const seconds = time24Match[3] ? Number.parseInt(time24Match[3], 10) : 0\n if (\n hours >= 0 &&\n hours <= 23 &&\n minutes >= 0 &&\n minutes <= 59 &&\n seconds >= 0 &&\n seconds <= 59\n ) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`\n }\n }\n\n // Try to parse 12-hour format: HH:mm:ss AM/PM or HH:mm AM/PM\n const time12Match = input.match(\n /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM|am|pm)$/i,\n )\n if (time12Match) {\n let hours = Number.parseInt(time12Match[1], 10)\n const minutes = Number.parseInt(time12Match[2], 10)\n const seconds = time12Match[3] ? Number.parseInt(time12Match[3], 10) : 0\n const period = time12Match[4].toUpperCase()\n\n if (\n hours >= 1 &&\n hours <= 12 &&\n minutes >= 0 &&\n minutes <= 59 &&\n seconds >= 0 &&\n seconds <= 59\n ) {\n // Convert to 24-hour format\n if (period === 'AM') {\n if (hours === 12) hours = 0\n } else {\n if (hours !== 12) hours += 12\n }\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`\n }\n }\n\n return null // Invalid format\n },\n save() {\n this.$emit('update:modelValue', this.tempTime)\n this.inputValue = this.formatForDisplay(this.tempTime)\n this.menu = false\n },\n cancel() {\n this.tempTime = this.normalizeTime(this.modelValue) || '00:00:00'\n this.menu = false\n },\n // Normalize time to HH:mm:ss format (strips milliseconds if present)\n normalizeTime(time) {\n if (!time) return ''\n const parts = time.split(':')\n if (parts.length < 2) return time\n const hours = Number.parseInt(parts[0], 10)\n const minutes = Number.parseInt(parts[1], 10)\n // Strip milliseconds from seconds (e.g., \"45.123\" -> 45)\n const seconds = parts.length > 2 ? Number.parseInt(parts[2], 10) : 0\n if (\n Number.isNaN(hours) ||\n Number.isNaN(minutes) ||\n Number.isNaN(seconds)\n ) {\n return ''\n }\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`\n },\n convertTo12Hour(time24) {\n if (!time24) return ''\n const parts = time24.split(':')\n if (parts.length < 2) return time24\n let hours = Number.parseInt(parts[0], 10)\n const minutes = Number.parseInt(parts[1], 10)\n // Strip milliseconds from seconds (e.g., \"45.123\" -> 45)\n const seconds = parts.length > 2 ? Number.parseInt(parts[2], 10) : 0\n // Validate all parts are valid numbers\n if (\n Number.isNaN(hours) ||\n Number.isNaN(minutes) ||\n Number.isNaN(seconds)\n ) {\n return time24 // Return original if parsing fails\n }\n const ampm = hours >= 12 ? 'PM' : 'AM'\n hours = hours % 12\n hours = hours ? hours : 12 // 0 should be 12\n const paddedHours = hours.toString().padStart(2, '0')\n const paddedMinutes = minutes.toString().padStart(2, '0')\n const paddedSeconds = seconds.toString().padStart(2, '0')\n return `${paddedHours}:${paddedMinutes}:${paddedSeconds} ${ampm}`\n },\n },\n}\n</script>\n\n<style scoped>\n.time-picker-card {\n background-color: var(--color-background-surface-default);\n}\n.time-picker-card :deep(.v-time-picker) {\n background-color: var(--color-background-surface-default);\n}\n.time-picker-card :deep(.v-time-picker-clock__container) {\n background-color: var(--color-background-surface-default);\n}\n.time-picker-card :deep(.v-time-picker-clock) {\n background-color: var(--color-background-base-default);\n}\n.time-picker-card :deep(.v-picker__header) {\n background-color: var(--color-background-surface-header);\n}\n.time-picker-card :deep(.v-picker-title) {\n background-color: var(--color-background-surface-header);\n}\n.cursor-pointer {\n cursor: pointer;\n}\n</style>\n"],"names":["_sfc_main","peekCachedSetting","rule","newVal","previousDisplay","getCachedSetting","time24","parsed","input","time24Match","hours","minutes","seconds","time12Match","period","time","parts","ampm","paddedHours","paddedMinutes","paddedSeconds","_createBlock","_component_v_text_field","$data","$event","$props","$options","_cache","_ctx","_createVNode","_component_v_menu","_withCtx","menuProps","_component_v_icon","_mergeProps","_component_v_card","_component_v_time_picker","_component_v_card_actions","_component_v_spacer","_component_v_btn"],"mappings":"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"}
1
+ {"version":3,"file":"OpenC3TimePicker-B0lAIU91.js","sources":["../src/components/OpenC3TimePicker.vue"],"sourcesContent":["<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-text-field\n v-model=\"inputValue\"\n :label=\"label\"\n :rules=\"computedRules\"\n :error-messages=\"errorMessages\"\n :hide-details=\"hideDetails\"\n :variant=\"variant\"\n :density=\"density\"\n :style=\"computedStyle\"\n :class=\"textFieldClass\"\n :disabled=\"disabled\"\n :data-test=\"dataTest\"\n @blur=\"handleBlur\"\n @focus=\"$emit('focus', $event)\"\n @keydown.enter=\"handleBlur\"\n >\n <template #prepend-inner>\n <v-menu\n v-model=\"menu\"\n :close-on-content-click=\"false\"\n transition=\"scale-transition\"\n offset=\"16\"\n >\n <template #activator=\"{ props: menuProps }\">\n <v-icon v-bind=\"menuProps\" class=\"cursor-pointer\">\n mdi-clock-outline\n </v-icon>\n </template>\n <v-card class=\"time-picker-card\">\n <v-time-picker\n v-model=\"tempTime\"\n :format=\"timeFormat\"\n scrollable\n use-seconds\n hide-header\n />\n <v-card-actions>\n <v-spacer />\n <v-btn variant=\"text\" @click=\"cancel\">Cancel</v-btn>\n <v-btn color=\"primary\" variant=\"text\" @click=\"save\">OK</v-btn>\n </v-card-actions>\n </v-card>\n </v-menu>\n </template>\n </v-text-field>\n</template>\n\n<script>\nimport { getCachedSetting, peekCachedSetting } from '../util'\n\nexport default {\n inheritAttrs: false,\n props: {\n modelValue: {\n type: String,\n default: '',\n },\n label: {\n type: String,\n default: 'Time',\n },\n rules: {\n type: Array,\n default: () => [],\n },\n errorMessages: {\n type: [String, Array],\n default: () => [],\n },\n hideDetails: {\n type: [Boolean, String],\n default: false,\n },\n variant: {\n type: String,\n default: 'filled',\n },\n density: {\n type: String,\n default: 'default',\n },\n style: {\n type: [String, Object],\n default: '',\n },\n textFieldClass: {\n type: String,\n default: '',\n },\n dataTest: {\n type: String,\n default: '',\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['update:modelValue', 'focus'],\n data() {\n return {\n menu: false,\n // peek returns undefined until the first instance resolves the setting;\n // null then marks \"still loading\" so the watcher defers formatting.\n timeFormat: peekCachedSetting('time_format') ?? null,\n tempTime: null,\n inputValue: '',\n }\n },\n computed: {\n computedStyle() {\n if (typeof this.style === 'string') {\n return this.style\n }\n return this.style\n },\n computedRules() {\n // Wrap the passed rules to validate against the 24-hour modelValue\n return this.rules.map((rule) => {\n return () => {\n return rule(this.modelValue)\n }\n })\n },\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(newVal) {\n // Skip until timeFormat has loaded — created() will do the initial\n // format. Otherwise we'd flash the default ('ampm') style first.\n if (!this.menu && this.timeFormat !== null) {\n this.inputValue = this.formatForDisplay(newVal)\n }\n },\n },\n inputValue(newVal) {\n // Immediately emit empty value when input is cleared for instant validation\n if (newVal === '' && this.modelValue !== '') {\n this.$emit('update:modelValue', '')\n }\n },\n menu(newVal) {\n if (newVal) {\n // When menu opens, initialize tempTime with current value\n // Normalize to HH:mm:ss format (v-time-picker doesn't handle milliseconds)\n this.tempTime = this.normalizeTime(this.modelValue) || '00:00:00'\n }\n },\n tempTime(newVal) {\n // Update input display in real-time when using the time picker\n if (this.menu && newVal) {\n this.inputValue = this.formatForDisplay(newVal)\n }\n },\n },\n async created() {\n // If the cache was already populated, the immediate modelValue watcher has\n // already done the initial format — nothing to do.\n if (this.timeFormat !== null) return\n const previousDisplay = this.inputValue\n this.timeFormat = await getCachedSetting('time_format', 'ampm')\n // Only overwrite if the user hasn't typed during the await.\n if (!this.menu && this.inputValue === previousDisplay) {\n this.inputValue = this.formatForDisplay(this.modelValue)\n }\n },\n methods: {\n formatForDisplay(time24) {\n if (!time24) return ''\n if (this.timeFormat === '24hr') {\n return time24\n }\n return this.convertTo12Hour(time24)\n },\n handleBlur() {\n // Parse input and update modelValue\n const parsed = this.parseTimeInput(this.inputValue)\n if (parsed) {\n this.$emit('update:modelValue', parsed)\n this.inputValue = this.formatForDisplay(parsed)\n } else if (this.inputValue === '') {\n this.$emit('update:modelValue', '')\n } else {\n // Invalid input, revert to current modelValue display\n this.inputValue = this.formatForDisplay(this.modelValue)\n }\n },\n parseTimeInput(input) {\n if (!input || input.trim() === '') return ''\n\n // Try to parse 24-hour format: HH:mm:ss or HH:mm\n const time24Match = input.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?$/)\n if (time24Match) {\n const hours = Number.parseInt(time24Match[1], 10)\n const minutes = Number.parseInt(time24Match[2], 10)\n const seconds = time24Match[3] ? Number.parseInt(time24Match[3], 10) : 0\n if (\n hours >= 0 &&\n hours <= 23 &&\n minutes >= 0 &&\n minutes <= 59 &&\n seconds >= 0 &&\n seconds <= 59\n ) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`\n }\n }\n\n // Try to parse 12-hour format: HH:mm:ss AM/PM or HH:mm AM/PM\n const time12Match = input.match(\n /^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM|am|pm)$/i,\n )\n if (time12Match) {\n let hours = Number.parseInt(time12Match[1], 10)\n const minutes = Number.parseInt(time12Match[2], 10)\n const seconds = time12Match[3] ? Number.parseInt(time12Match[3], 10) : 0\n const period = time12Match[4].toUpperCase()\n\n if (\n hours >= 1 &&\n hours <= 12 &&\n minutes >= 0 &&\n minutes <= 59 &&\n seconds >= 0 &&\n seconds <= 59\n ) {\n // Convert to 24-hour format\n if (period === 'AM') {\n if (hours === 12) hours = 0\n } else {\n if (hours !== 12) hours += 12\n }\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`\n }\n }\n\n return null // Invalid format\n },\n save() {\n this.$emit('update:modelValue', this.tempTime)\n this.inputValue = this.formatForDisplay(this.tempTime)\n this.menu = false\n },\n cancel() {\n this.tempTime = this.normalizeTime(this.modelValue) || '00:00:00'\n this.menu = false\n },\n // Normalize time to HH:mm:ss format (strips milliseconds if present)\n normalizeTime(time) {\n if (!time) return ''\n const parts = time.split(':')\n if (parts.length < 2) return time\n const hours = Number.parseInt(parts[0], 10)\n const minutes = Number.parseInt(parts[1], 10)\n // Strip milliseconds from seconds (e.g., \"45.123\" -> 45)\n const seconds = parts.length > 2 ? Number.parseInt(parts[2], 10) : 0\n if (\n Number.isNaN(hours) ||\n Number.isNaN(minutes) ||\n Number.isNaN(seconds)\n ) {\n return ''\n }\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`\n },\n convertTo12Hour(time24) {\n if (!time24) return ''\n const parts = time24.split(':')\n if (parts.length < 2) return time24\n let hours = Number.parseInt(parts[0], 10)\n const minutes = Number.parseInt(parts[1], 10)\n // Strip milliseconds from seconds (e.g., \"45.123\" -> 45)\n const seconds = parts.length > 2 ? Number.parseInt(parts[2], 10) : 0\n // Validate all parts are valid numbers\n if (\n Number.isNaN(hours) ||\n Number.isNaN(minutes) ||\n Number.isNaN(seconds)\n ) {\n return time24 // Return original if parsing fails\n }\n const ampm = hours >= 12 ? 'PM' : 'AM'\n hours = hours % 12\n hours = hours ? hours : 12 // 0 should be 12\n const paddedHours = hours.toString().padStart(2, '0')\n const paddedMinutes = minutes.toString().padStart(2, '0')\n const paddedSeconds = seconds.toString().padStart(2, '0')\n return `${paddedHours}:${paddedMinutes}:${paddedSeconds} ${ampm}`\n },\n },\n}\n</script>\n\n<style scoped>\n.time-picker-card {\n background-color: var(--color-background-surface-default);\n}\n.time-picker-card :deep(.v-time-picker) {\n background-color: var(--color-background-surface-default);\n}\n.time-picker-card :deep(.v-time-picker-clock__container) {\n background-color: var(--color-background-surface-default);\n}\n.time-picker-card :deep(.v-time-picker-clock) {\n background-color: var(--color-background-base-default);\n}\n.time-picker-card :deep(.v-picker__header) {\n background-color: var(--color-background-surface-header);\n}\n.time-picker-card :deep(.v-picker-title) {\n background-color: var(--color-background-surface-header);\n}\n.cursor-pointer {\n cursor: pointer;\n}\n</style>\n"],"names":["_sfc_main","peekCachedSetting","rule","newVal","previousDisplay","getCachedSetting","time24","parsed","input","time24Match","hours","minutes","seconds","time12Match","period","time","parts","ampm","paddedHours","paddedMinutes","paddedSeconds","_createBlock","_component_v_text_field","$data","$event","$props","$options","_cache","_ctx","_createVNode","_component_v_menu","_withCtx","menuProps","_component_v_icon","_mergeProps","_component_v_card","_component_v_time_picker","_component_v_card_actions","_component_v_spacer","_component_v_btn"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const p=require("./settingsCache-Bm4JOm9j.cjs"),t=require("vue");require("./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-hv0QWZ6Z.cjs");const N=require("./CustomIcon-8F08upeg.cjs"),y={inheritAttrs:!1,props:{modelValue:{type:String,default:""},label:{type:String,default:"Time"},rules:{type:Array,default:()=>[]},errorMessages:{type:[String,Array],default:()=>[]},hideDetails:{type:[Boolean,String],default:!1},variant:{type:String,default:"filled"},density:{type:String,default:"default"},style:{type:[String,Object],default:""},textFieldClass:{type:String,default:""},dataTest:{type:String,default:""},disabled:{type:Boolean,default:!1}},emits:["update:modelValue","focus"],data(){return{menu:!1,timeFormat:p.peekCachedSetting("time_format")??null,tempTime:null,inputValue:""}},computed:{computedStyle(){return typeof this.style=="string"?this.style:this.style},computedRules(){return this.rules.map(e=>()=>e(this.modelValue))}},watch:{modelValue:{immediate:!0,handler(e){!this.menu&&this.timeFormat!==null&&(this.inputValue=this.formatForDisplay(e))}},inputValue(e){e===""&&this.modelValue!==""&&this.$emit("update:modelValue","")},menu(e){e&&(this.tempTime=this.normalizeTime(this.modelValue)||"00:00:00")},tempTime(e){this.menu&&e&&(this.inputValue=this.formatForDisplay(e))}},async created(){if(this.timeFormat!==null)return;const e=this.inputValue;this.timeFormat=await p.getCachedSetting("time_format","ampm"),!this.menu&&this.inputValue===e&&(this.inputValue=this.formatForDisplay(this.modelValue))},methods:{formatForDisplay(e){return e?this.timeFormat==="24hr"?e:this.convertTo12Hour(e):""},handleBlur(){const e=this.parseTimeInput(this.inputValue);e?(this.$emit("update:modelValue",e),this.inputValue=this.formatForDisplay(e)):this.inputValue===""?this.$emit("update:modelValue",""):this.inputValue=this.formatForDisplay(this.modelValue)},parseTimeInput(e){if(!e||e.trim()==="")return"";const r=e.match(/^(\d{1,2}):(\d{2})(?::(\d{2}))?$/);if(r){const s=Number.parseInt(r[1],10),i=Number.parseInt(r[2],10),a=r[3]?Number.parseInt(r[3],10):0;if(s>=0&&s<=23&&i>=0&&i<=59&&a>=0&&a<=59)return`${s.toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}`}const n=e.match(/^(\d{1,2}):(\d{2})(?::(\d{2}))?\s*(AM|PM|am|pm)$/i);if(n){let s=Number.parseInt(n[1],10);const i=Number.parseInt(n[2],10),a=n[3]?Number.parseInt(n[3],10):0,l=n[4].toUpperCase();if(s>=1&&s<=12&&i>=0&&i<=59&&a>=0&&a<=59)return l==="AM"?s===12&&(s=0):s!==12&&(s+=12),`${s.toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}`}return null},save(){this.$emit("update:modelValue",this.tempTime),this.inputValue=this.formatForDisplay(this.tempTime),this.menu=!1},cancel(){this.tempTime=this.normalizeTime(this.modelValue)||"00:00:00",this.menu=!1},normalizeTime(e){if(!e)return"";const r=e.split(":");if(r.length<2)return e;const n=Number.parseInt(r[0],10),s=Number.parseInt(r[1],10),i=r.length>2?Number.parseInt(r[2],10):0;return Number.isNaN(n)||Number.isNaN(s)||Number.isNaN(i)?"":`${n.toString().padStart(2,"0")}:${s.toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}`},convertTo12Hour(e){if(!e)return"";const r=e.split(":");if(r.length<2)return e;let n=Number.parseInt(r[0],10);const s=Number.parseInt(r[1],10),i=r.length>2?Number.parseInt(r[2],10):0;if(Number.isNaN(n)||Number.isNaN(s)||Number.isNaN(i))return e;const a=n>=12?"PM":"AM";n=n%12,n=n||12;const l=n.toString().padStart(2,"0"),u=s.toString().padStart(2,"0"),m=i.toString().padStart(2,"0");return`${l}:${u}:${m} ${a}`}}};function S(e,r,n,s,i,a){const l=t.resolveComponent("v-icon"),u=t.resolveComponent("v-time-picker"),m=t.resolveComponent("v-spacer"),d=t.resolveComponent("v-btn"),c=t.resolveComponent("v-card-actions"),f=t.resolveComponent("v-card"),h=t.resolveComponent("v-menu"),V=t.resolveComponent("v-text-field");return t.openBlock(),t.createBlock(V,{modelValue:i.inputValue,"onUpdate:modelValue":r[2]||(r[2]=o=>i.inputValue=o),label:n.label,rules:a.computedRules,"error-messages":n.errorMessages,"hide-details":n.hideDetails,variant:n.variant,density:n.density,style:t.normalizeStyle(a.computedStyle),class:t.normalizeClass(n.textFieldClass),disabled:n.disabled,"data-test":n.dataTest,onBlur:a.handleBlur,onFocus:r[3]||(r[3]=o=>e.$emit("focus",o)),onKeydown:t.withKeys(a.handleBlur,["enter"])},{"prepend-inner":t.withCtx(()=>[t.createVNode(h,{modelValue:i.menu,"onUpdate:modelValue":r[1]||(r[1]=o=>i.menu=o),"close-on-content-click":!1,transition:"scale-transition",offset:"16"},{activator:t.withCtx(({props:o})=>[t.createVNode(l,t.mergeProps(o,{class:"cursor-pointer"}),{default:t.withCtx(()=>[...r[4]||(r[4]=[t.createTextVNode(" mdi-clock-outline ",-1)])]),_:1},16)]),default:t.withCtx(()=>[t.createVNode(f,{class:"time-picker-card"},{default:t.withCtx(()=>[t.createVNode(u,{modelValue:i.tempTime,"onUpdate:modelValue":r[0]||(r[0]=o=>i.tempTime=o),format:i.timeFormat,scrollable:"","use-seconds":"","hide-header":""},null,8,["modelValue","format"]),t.createVNode(c,null,{default:t.withCtx(()=>[t.createVNode(m),t.createVNode(d,{variant:"text",onClick:a.cancel},{default:t.withCtx(()=>[...r[5]||(r[5]=[t.createTextVNode("Cancel",-1)])]),_:1},8,["onClick"]),t.createVNode(d,{color:"primary",variant:"text",onClick:a.save},{default:t.withCtx(()=>[...r[6]||(r[6]=[t.createTextVNode("OK",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["modelValue","label","rules","error-messages","hide-details","variant","density","style","class","disabled","data-test","onBlur","onKeydown"])}const v=N._export_sfc(y,[["render",S],["__scopeId","data-v-3a6a70ee"]]);exports.OpenC3TimePicker=v;
2
- //# sourceMappingURL=OpenC3TimePicker-BAzvaP-g.cjs.map
1
+ "use strict";const p=require("./settingsCache-DmIdInSd.cjs"),t=require("vue");require("./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DOidODWT.cjs");const N=require("./CustomIcon-8F08upeg.cjs"),y={inheritAttrs:!1,props:{modelValue:{type:String,default:""},label:{type:String,default:"Time"},rules:{type:Array,default:()=>[]},errorMessages:{type:[String,Array],default:()=>[]},hideDetails:{type:[Boolean,String],default:!1},variant:{type:String,default:"filled"},density:{type:String,default:"default"},style:{type:[String,Object],default:""},textFieldClass:{type:String,default:""},dataTest:{type:String,default:""},disabled:{type:Boolean,default:!1}},emits:["update:modelValue","focus"],data(){return{menu:!1,timeFormat:p.peekCachedSetting("time_format")??null,tempTime:null,inputValue:""}},computed:{computedStyle(){return typeof this.style=="string"?this.style:this.style},computedRules(){return this.rules.map(e=>()=>e(this.modelValue))}},watch:{modelValue:{immediate:!0,handler(e){!this.menu&&this.timeFormat!==null&&(this.inputValue=this.formatForDisplay(e))}},inputValue(e){e===""&&this.modelValue!==""&&this.$emit("update:modelValue","")},menu(e){e&&(this.tempTime=this.normalizeTime(this.modelValue)||"00:00:00")},tempTime(e){this.menu&&e&&(this.inputValue=this.formatForDisplay(e))}},async created(){if(this.timeFormat!==null)return;const e=this.inputValue;this.timeFormat=await p.getCachedSetting("time_format","ampm"),!this.menu&&this.inputValue===e&&(this.inputValue=this.formatForDisplay(this.modelValue))},methods:{formatForDisplay(e){return e?this.timeFormat==="24hr"?e:this.convertTo12Hour(e):""},handleBlur(){const e=this.parseTimeInput(this.inputValue);e?(this.$emit("update:modelValue",e),this.inputValue=this.formatForDisplay(e)):this.inputValue===""?this.$emit("update:modelValue",""):this.inputValue=this.formatForDisplay(this.modelValue)},parseTimeInput(e){if(!e||e.trim()==="")return"";const r=e.match(/^(\d{1,2}):(\d{2})(?::(\d{2}))?$/);if(r){const s=Number.parseInt(r[1],10),i=Number.parseInt(r[2],10),a=r[3]?Number.parseInt(r[3],10):0;if(s>=0&&s<=23&&i>=0&&i<=59&&a>=0&&a<=59)return`${s.toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}`}const n=e.match(/^(\d{1,2}):(\d{2})(?::(\d{2}))?\s*(AM|PM|am|pm)$/i);if(n){let s=Number.parseInt(n[1],10);const i=Number.parseInt(n[2],10),a=n[3]?Number.parseInt(n[3],10):0,l=n[4].toUpperCase();if(s>=1&&s<=12&&i>=0&&i<=59&&a>=0&&a<=59)return l==="AM"?s===12&&(s=0):s!==12&&(s+=12),`${s.toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}`}return null},save(){this.$emit("update:modelValue",this.tempTime),this.inputValue=this.formatForDisplay(this.tempTime),this.menu=!1},cancel(){this.tempTime=this.normalizeTime(this.modelValue)||"00:00:00",this.menu=!1},normalizeTime(e){if(!e)return"";const r=e.split(":");if(r.length<2)return e;const n=Number.parseInt(r[0],10),s=Number.parseInt(r[1],10),i=r.length>2?Number.parseInt(r[2],10):0;return Number.isNaN(n)||Number.isNaN(s)||Number.isNaN(i)?"":`${n.toString().padStart(2,"0")}:${s.toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}`},convertTo12Hour(e){if(!e)return"";const r=e.split(":");if(r.length<2)return e;let n=Number.parseInt(r[0],10);const s=Number.parseInt(r[1],10),i=r.length>2?Number.parseInt(r[2],10):0;if(Number.isNaN(n)||Number.isNaN(s)||Number.isNaN(i))return e;const a=n>=12?"PM":"AM";n=n%12,n=n||12;const l=n.toString().padStart(2,"0"),u=s.toString().padStart(2,"0"),m=i.toString().padStart(2,"0");return`${l}:${u}:${m} ${a}`}}};function S(e,r,n,s,i,a){const l=t.resolveComponent("v-icon"),u=t.resolveComponent("v-time-picker"),m=t.resolveComponent("v-spacer"),d=t.resolveComponent("v-btn"),c=t.resolveComponent("v-card-actions"),f=t.resolveComponent("v-card"),h=t.resolveComponent("v-menu"),V=t.resolveComponent("v-text-field");return t.openBlock(),t.createBlock(V,{modelValue:i.inputValue,"onUpdate:modelValue":r[2]||(r[2]=o=>i.inputValue=o),label:n.label,rules:a.computedRules,"error-messages":n.errorMessages,"hide-details":n.hideDetails,variant:n.variant,density:n.density,style:t.normalizeStyle(a.computedStyle),class:t.normalizeClass(n.textFieldClass),disabled:n.disabled,"data-test":n.dataTest,onBlur:a.handleBlur,onFocus:r[3]||(r[3]=o=>e.$emit("focus",o)),onKeydown:t.withKeys(a.handleBlur,["enter"])},{"prepend-inner":t.withCtx(()=>[t.createVNode(h,{modelValue:i.menu,"onUpdate:modelValue":r[1]||(r[1]=o=>i.menu=o),"close-on-content-click":!1,transition:"scale-transition",offset:"16"},{activator:t.withCtx(({props:o})=>[t.createVNode(l,t.mergeProps(o,{class:"cursor-pointer"}),{default:t.withCtx(()=>[...r[4]||(r[4]=[t.createTextVNode(" mdi-clock-outline ",-1)])]),_:1},16)]),default:t.withCtx(()=>[t.createVNode(f,{class:"time-picker-card"},{default:t.withCtx(()=>[t.createVNode(u,{modelValue:i.tempTime,"onUpdate:modelValue":r[0]||(r[0]=o=>i.tempTime=o),format:i.timeFormat,scrollable:"","use-seconds":"","hide-header":""},null,8,["modelValue","format"]),t.createVNode(c,null,{default:t.withCtx(()=>[t.createVNode(m),t.createVNode(d,{variant:"text",onClick:a.cancel},{default:t.withCtx(()=>[...r[5]||(r[5]=[t.createTextVNode("Cancel",-1)])]),_:1},8,["onClick"]),t.createVNode(d,{color:"primary",variant:"text",onClick:a.save},{default:t.withCtx(()=>[...r[6]||(r[6]=[t.createTextVNode("OK",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["modelValue","label","rules","error-messages","hide-details","variant","density","style","class","disabled","data-test","onBlur","onKeydown"])}const v=N._export_sfc(y,[["render",S],["__scopeId","data-v-3a6a70ee"]]);exports.OpenC3TimePicker=v;
2
+ //# sourceMappingURL=OpenC3TimePicker-DXhyDkOv.cjs.map