@openc3/vue-common 7.0.1 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ArrayWidget-BHjh3qLF.cjs → ArrayWidget-CQCphADm.cjs} +3 -3
- package/dist/{ArrayWidget-BHjh3qLF.cjs.map → ArrayWidget-CQCphADm.cjs.map} +1 -1
- package/dist/{ArrayWidget-Dh6zDiC7.js → ArrayWidget-CcQFJGCA.js} +7 -6
- package/dist/{ArrayWidget-Dh6zDiC7.js.map → ArrayWidget-CcQFJGCA.js.map} +1 -1
- package/dist/{ArrayplotWidget-CSc_TqNm.js → ArrayplotWidget-DGJEXAY0.js} +6 -5
- package/dist/{ArrayplotWidget-CSc_TqNm.js.map → ArrayplotWidget-DGJEXAY0.js.map} +1 -1
- package/dist/ArrayplotWidget-J0xWFYsb.cjs +2 -0
- package/dist/{ArrayplotWidget-BHD-TGQO.cjs.map → ArrayplotWidget-J0xWFYsb.cjs.map} +1 -1
- package/dist/BarColumn-DrvHLEts.cjs +2 -0
- package/dist/BarColumn-DrvHLEts.cjs.map +1 -0
- package/dist/{BarColumn-DmjMnw5l.js → BarColumn-DwZmAe8g.js} +11 -9
- package/dist/BarColumn-DwZmAe8g.js.map +1 -0
- package/dist/{BlockWidget-BdR_HCVc.js → BlockWidget-BHtugveV.js} +14 -13
- package/dist/{BlockWidget-BdR_HCVc.js.map → BlockWidget-BHtugveV.js.map} +1 -1
- package/dist/{BlockWidget-Bi1PfS1k.cjs → BlockWidget-_HTXwzGu.cjs} +2 -2
- package/dist/{BlockWidget-Bi1PfS1k.cjs.map → BlockWidget-_HTXwzGu.cjs.map} +1 -1
- package/dist/ButtonWidget-C_4jUjbD.cjs +3 -0
- package/dist/ButtonWidget-C_4jUjbD.cjs.map +1 -0
- package/dist/{ButtonWidget-DZ4VCNWU.js → ButtonWidget-Cc9cYsg8.js} +7 -6
- package/dist/ButtonWidget-Cc9cYsg8.js.map +1 -0
- package/dist/{CanvasWidget-DTEx-DpZ.cjs → CanvasWidget-98hvMkWl.cjs} +2 -2
- package/dist/{CanvasWidget-DTEx-DpZ.cjs.map → CanvasWidget-98hvMkWl.cjs.map} +1 -1
- package/dist/{CanvasWidget-DuXOo3jG.js → CanvasWidget-Bn70gBcc.js} +2 -2
- package/dist/{CanvasWidget-DuXOo3jG.js.map → CanvasWidget-Bn70gBcc.js.map} +1 -1
- package/dist/{CanvasdotWidget-bbOquK8B.cjs → CanvasdotWidget-6s1Kzzoj.cjs} +2 -2
- package/dist/{CanvasdotWidget-bbOquK8B.cjs.map → CanvasdotWidget-6s1Kzzoj.cjs.map} +1 -1
- package/dist/{CanvasdotWidget-WoLpxI1u.js → CanvasdotWidget-CMROfW3O.js} +2 -2
- package/dist/{CanvasdotWidget-WoLpxI1u.js.map → CanvasdotWidget-CMROfW3O.js.map} +1 -1
- package/dist/{CanvasimageWidget-tWpK5rsv.js → CanvasimageWidget-BpM05v_m.js} +3 -3
- package/dist/{CanvasimageWidget-tWpK5rsv.js.map → CanvasimageWidget-BpM05v_m.js.map} +1 -1
- package/dist/{CanvasimageWidget-D2EqsK7w.cjs → CanvasimageWidget-Du_TULyr.cjs} +2 -2
- package/dist/{CanvasimageWidget-D2EqsK7w.cjs.map → CanvasimageWidget-Du_TULyr.cjs.map} +1 -1
- package/dist/{CanvasimagevalueWidget-By_DiQ75.cjs → CanvasimagevalueWidget-DUiZEzwq.cjs} +2 -2
- package/dist/{CanvasimagevalueWidget-By_DiQ75.cjs.map → CanvasimagevalueWidget-DUiZEzwq.cjs.map} +1 -1
- package/dist/{CanvasimagevalueWidget-BVzJYz3l.js → CanvasimagevalueWidget-E6G93iGc.js} +3 -3
- package/dist/{CanvasimagevalueWidget-BVzJYz3l.js.map → CanvasimagevalueWidget-E6G93iGc.js.map} +1 -1
- package/dist/{CanvaslabelWidget-CDFf8Vll.js → CanvaslabelWidget-C074R2Fy.js} +2 -2
- package/dist/{CanvaslabelWidget-CDFf8Vll.js.map → CanvaslabelWidget-C074R2Fy.js.map} +1 -1
- package/dist/{CanvaslabelWidget-DiPxyXoX.cjs → CanvaslabelWidget-C7K2dtNN.cjs} +2 -2
- package/dist/{CanvaslabelWidget-DiPxyXoX.cjs.map → CanvaslabelWidget-C7K2dtNN.cjs.map} +1 -1
- package/dist/{CanvaslabelvalueWidget-DzJKD6qs.js → CanvaslabelvalueWidget-B0nJeS4X.js} +2 -2
- package/dist/{CanvaslabelvalueWidget-DzJKD6qs.js.map → CanvaslabelvalueWidget-B0nJeS4X.js.map} +1 -1
- package/dist/{CanvaslabelvalueWidget-Cw5CCQTi.cjs → CanvaslabelvalueWidget-BuayHPZu.cjs} +2 -2
- package/dist/{CanvaslabelvalueWidget-Cw5CCQTi.cjs.map → CanvaslabelvalueWidget-BuayHPZu.cjs.map} +1 -1
- package/dist/{CanvaslineWidget-BttTXCZq.js → CanvaslineWidget-CxnNAqOX.js} +2 -2
- package/dist/{CanvaslineWidget-BttTXCZq.js.map → CanvaslineWidget-CxnNAqOX.js.map} +1 -1
- package/dist/{CanvaslineWidget-BECtKTPL.cjs → CanvaslineWidget-DaBwCmSV.cjs} +2 -2
- package/dist/{CanvaslineWidget-BECtKTPL.cjs.map → CanvaslineWidget-DaBwCmSV.cjs.map} +1 -1
- package/dist/{CanvaslinevalueWidget-i6G0JfnZ.js → CanvaslinevalueWidget-BwfFyCwH.js} +2 -2
- package/dist/{CanvaslinevalueWidget-i6G0JfnZ.js.map → CanvaslinevalueWidget-BwfFyCwH.js.map} +1 -1
- package/dist/{CanvaslinevalueWidget-5duJ98qu.cjs → CanvaslinevalueWidget-xSHdgNCO.cjs} +2 -2
- package/dist/{CanvaslinevalueWidget-5duJ98qu.cjs.map → CanvaslinevalueWidget-xSHdgNCO.cjs.map} +1 -1
- package/dist/{CheckbuttonWidget-CTMObPhX.cjs → CheckbuttonWidget-Bey7tHx-.cjs} +2 -2
- package/dist/{CheckbuttonWidget-CTMObPhX.cjs.map → CheckbuttonWidget-Bey7tHx-.cjs.map} +1 -1
- package/dist/{CheckbuttonWidget-18jtf7sh.js → CheckbuttonWidget-yAm10oX0.js} +2 -2
- package/dist/{CheckbuttonWidget-18jtf7sh.js.map → CheckbuttonWidget-yAm10oX0.js.map} +1 -1
- package/dist/{ClassificationBanners-BmnQODLn.js → ClassificationBanners-DxpE_iPX.js} +2 -2
- package/dist/{ClassificationBanners-BmnQODLn.js.map → ClassificationBanners-DxpE_iPX.js.map} +1 -1
- package/dist/ClassificationBanners-xG4DOlqJ.cjs +2 -0
- package/dist/{ClassificationBanners-DjGCuH-4.cjs.map → ClassificationBanners-xG4DOlqJ.cjs.map} +1 -1
- package/dist/{ComboboxWidget-BjaVFbD4.js → ComboboxWidget-BnWksnnp.js} +2 -2
- package/dist/{ComboboxWidget-BjaVFbD4.js.map → ComboboxWidget-BnWksnnp.js.map} +1 -1
- package/dist/{ComboboxWidget-Cc0Acq9q.cjs → ComboboxWidget-Mh6axKMv.cjs} +2 -2
- package/dist/{ComboboxWidget-Cc0Acq9q.cjs.map → ComboboxWidget-Mh6axKMv.cjs.map} +1 -1
- package/dist/{CriticalCmdDialog-CO-nvphS.js → CriticalCmdDialog-D0fIp8Tq.js} +24 -23
- package/dist/{CriticalCmdDialog-CO-nvphS.js.map → CriticalCmdDialog-D0fIp8Tq.js.map} +1 -1
- package/dist/CriticalCmdDialog-DJ3FWL0_.cjs +2 -0
- package/dist/{CriticalCmdDialog-eytxCQto.cjs.map → CriticalCmdDialog-DJ3FWL0_.cjs.map} +1 -1
- package/dist/{DateWidget-DkFAFlc8.js → DateWidget-CAiG2FIl.js} +9 -8
- package/dist/{DateWidget-DkFAFlc8.js.map → DateWidget-CAiG2FIl.js.map} +1 -1
- package/dist/DateWidget-DUYYp-Yx.cjs +2 -0
- package/dist/{DateWidget-Cle8FY8Q.cjs.map → DateWidget-DUYYp-Yx.cjs.map} +1 -1
- package/dist/DetailsDialog-D3iPUi8b.cjs +2 -0
- package/dist/{DetailsDialog-BcMaTfuQ.cjs.map → DetailsDialog-D3iPUi8b.cjs.map} +1 -1
- package/dist/{DetailsDialog-sqja4Lzq.js → DetailsDialog-q5SDzw3R.js} +72 -71
- package/dist/{DetailsDialog-sqja4Lzq.js.map → DetailsDialog-q5SDzw3R.js.map} +1 -1
- package/dist/EventListDialog-1RsuuLHZ.cjs +2 -0
- package/dist/EventListDialog-1RsuuLHZ.cjs.map +1 -0
- package/dist/{EventListDialog-DjCQAwGl.js → EventListDialog-HuEtOu3k.js} +61 -58
- package/dist/EventListDialog-HuEtOu3k.js.map +1 -0
- package/dist/FilechecksumWidget-ByVrYgzI.cjs +2 -0
- package/dist/{FilechecksumWidget-2ta-UvLp.cjs.map → FilechecksumWidget-ByVrYgzI.cjs.map} +1 -1
- package/dist/{FilechecksumWidget-DqJ_hvN4.js → FilechecksumWidget-DeW9wy5d.js} +9 -9
- package/dist/{FilechecksumWidget-DqJ_hvN4.js.map → FilechecksumWidget-DeW9wy5d.js.map} +1 -1
- package/dist/{FiledisplayWidget-CYznG_tf.js → FiledisplayWidget-C_zPFu2E.js} +7 -6
- package/dist/{FiledisplayWidget-CYznG_tf.js.map → FiledisplayWidget-C_zPFu2E.js.map} +1 -1
- package/dist/FiledisplayWidget-hYmg981k.cjs +2 -0
- package/dist/{FiledisplayWidget-BUKXIQir.cjs.map → FiledisplayWidget-hYmg981k.cjs.map} +1 -1
- package/dist/{FormatvalueWidget-BpFXnA_U.cjs → FormatvalueWidget-7VD_kwxB.cjs} +2 -2
- package/dist/{FormatvalueWidget-BpFXnA_U.cjs.map → FormatvalueWidget-7VD_kwxB.cjs.map} +1 -1
- package/dist/{FormatvalueWidget-BnVu4YGx.js → FormatvalueWidget-BrvPWwfN.js} +3 -3
- package/dist/{FormatvalueWidget-BnVu4YGx.js.map → FormatvalueWidget-BrvPWwfN.js.map} +1 -1
- package/dist/{Graph-CUFzx8Ti.js → Graph-BCvaO4yI.js} +45 -38
- package/dist/Graph-BCvaO4yI.js.map +1 -0
- package/dist/Graph-BUqdz6gu.cjs +2 -0
- package/dist/Graph-BUqdz6gu.cjs.map +1 -0
- package/dist/GraphWidget-BdP0xM_P.cjs +2 -0
- package/dist/{GraphWidget-BvCQHVxQ.cjs.map → GraphWidget-BdP0xM_P.cjs.map} +1 -1
- package/dist/{GraphWidget-DO5XbOGy.js → GraphWidget-QS-VJoes.js} +26 -31
- package/dist/{GraphWidget-DO5XbOGy.js.map → GraphWidget-QS-VJoes.js.map} +1 -1
- package/dist/{HorizontalWidget-BBQE-dP-.cjs → HorizontalWidget-B9j7DG2Q.cjs} +2 -2
- package/dist/{HorizontalWidget-BBQE-dP-.cjs.map → HorizontalWidget-B9j7DG2Q.cjs.map} +1 -1
- package/dist/{HorizontalWidget-BA9PiP3d.js → HorizontalWidget-cFSsdChw.js} +2 -2
- package/dist/{HorizontalWidget-BA9PiP3d.js.map → HorizontalWidget-cFSsdChw.js.map} +1 -1
- package/dist/{HorizontalboxWidget-CX7J8RdA.cjs → HorizontalboxWidget-C3zHRO9h.cjs} +2 -2
- package/dist/{HorizontalboxWidget-CX7J8RdA.cjs.map → HorizontalboxWidget-C3zHRO9h.cjs.map} +1 -1
- package/dist/{HorizontalboxWidget-B-7HOqgl.js → HorizontalboxWidget-CKA7rLGd.js} +5 -5
- package/dist/{HorizontalboxWidget-B-7HOqgl.js.map → HorizontalboxWidget-CKA7rLGd.js.map} +1 -1
- package/dist/{HorizontallineWidget-D-o9MGo0.js → HorizontallineWidget-BqbLK0zc.js} +2 -2
- package/dist/{HorizontallineWidget-D-o9MGo0.js.map → HorizontallineWidget-BqbLK0zc.js.map} +1 -1
- package/dist/{HorizontallineWidget-odTFoB8u.cjs → HorizontallineWidget-GGNFIo1N.cjs} +2 -2
- package/dist/{HorizontallineWidget-odTFoB8u.cjs.map → HorizontallineWidget-GGNFIo1N.cjs.map} +1 -1
- package/dist/{IframeWidget-BzOka-fX.js → IframeWidget-CITX8Es1.js} +2 -2
- package/dist/{IframeWidget-BzOka-fX.js.map → IframeWidget-CITX8Es1.js.map} +1 -1
- package/dist/{IframeWidget-cTHu_Rmp.cjs → IframeWidget-lK6Cw1Pp.cjs} +2 -2
- package/dist/{IframeWidget-cTHu_Rmp.cjs.map → IframeWidget-lK6Cw1Pp.cjs.map} +1 -1
- package/dist/ImageLoader-CkTaGfCC.cjs +2 -0
- package/dist/{ImageLoader-BTEOukIw.cjs.map → ImageLoader-CkTaGfCC.cjs.map} +1 -1
- package/dist/{ImageLoader-CstmWFM4.js → ImageLoader-DQV_11Vd.js} +2 -2
- package/dist/{ImageLoader-CstmWFM4.js.map → ImageLoader-DQV_11Vd.js.map} +1 -1
- package/dist/{ImageviewerWidget-BA9uOM1q.js → ImageviewerWidget-BIsSA7KD.js} +2 -2
- package/dist/{ImageviewerWidget-BA9uOM1q.js.map → ImageviewerWidget-BIsSA7KD.js.map} +1 -1
- package/dist/{ImageviewerWidget-CLAFwmaB.cjs → ImageviewerWidget-CvbsaXCd.cjs} +2 -2
- package/dist/{ImageviewerWidget-CLAFwmaB.cjs.map → ImageviewerWidget-CvbsaXCd.cjs.map} +1 -1
- package/dist/InterfacesTab-Cfvks-ms.cjs +2 -0
- package/dist/{InterfacesTab-CM0CGFVS.cjs.map → InterfacesTab-Cfvks-ms.cjs.map} +1 -1
- package/dist/{InterfacesTab-C3mDLkGC.js → InterfacesTab-twne_Qp4.js} +11 -10
- package/dist/{InterfacesTab-C3mDLkGC.js.map → InterfacesTab-twne_Qp4.js.map} +1 -1
- package/dist/{LabelWidget-CMmVq1mx.cjs → LabelWidget-BFWd6Vgh.cjs} +2 -2
- package/dist/{LabelWidget-CMmVq1mx.cjs.map → LabelWidget-BFWd6Vgh.cjs.map} +1 -1
- package/dist/{LabelWidget-Da2howZF.js → LabelWidget-FQI-cH_A.js} +2 -2
- package/dist/{LabelWidget-Da2howZF.js.map → LabelWidget-FQI-cH_A.js.map} +1 -1
- package/dist/{LabelledWidget-CAqH0oWs.cjs → LabelledWidget-AZifUp-f.cjs} +2 -2
- package/dist/{LabelledWidget-CAqH0oWs.cjs.map → LabelledWidget-AZifUp-f.cjs.map} +1 -1
- package/dist/{LabelledWidget-BH8y3OXT.js → LabelledWidget-KGXtQ4Zb.js} +4 -4
- package/dist/{LabelledWidget-BH8y3OXT.js.map → LabelledWidget-KGXtQ4Zb.js.map} +1 -1
- package/dist/{LabelprogressbarWidget-Brl24F4c.js → LabelprogressbarWidget-72WyzD_Q.js} +4 -4
- package/dist/{LabelprogressbarWidget-Brl24F4c.js.map → LabelprogressbarWidget-72WyzD_Q.js.map} +1 -1
- package/dist/{LabelprogressbarWidget-BxLGmW9T.cjs → LabelprogressbarWidget-Bd2E9G7V.cjs} +2 -2
- package/dist/{LabelprogressbarWidget-BxLGmW9T.cjs.map → LabelprogressbarWidget-Bd2E9G7V.cjs.map} +1 -1
- package/dist/{LabelsparklineWidget-D22MB7-4.js → LabelsparklineWidget-DtWNf4mK.js} +4 -4
- package/dist/{LabelsparklineWidget-D22MB7-4.js.map → LabelsparklineWidget-DtWNf4mK.js.map} +1 -1
- package/dist/{LabelsparklineWidget-BUXOpBeB.cjs → LabelsparklineWidget-__3CB0T-.cjs} +2 -2
- package/dist/{LabelsparklineWidget-BUXOpBeB.cjs.map → LabelsparklineWidget-__3CB0T-.cjs.map} +1 -1
- package/dist/LabelvalueWidget-B681T0uR.cjs +2 -0
- package/dist/LabelvalueWidget-B681T0uR.cjs.map +1 -0
- package/dist/{LabelvalueWidget-_1JPbK-K.js → LabelvalueWidget-D_JLdY7r.js} +11 -12
- package/dist/LabelvalueWidget-D_JLdY7r.js.map +1 -0
- package/dist/LabelvaluedescWidget-BppM5vGp.js +64 -0
- package/dist/LabelvaluedescWidget-BppM5vGp.js.map +1 -0
- package/dist/LabelvaluedescWidget-CiGIPdMG.cjs +2 -0
- package/dist/LabelvaluedescWidget-CiGIPdMG.cjs.map +1 -0
- package/dist/{LabelvaluelimitsbarWidget-C9PlEhWo.js → LabelvaluelimitsbarWidget-B69ogLif.js} +4 -4
- package/dist/{LabelvaluelimitsbarWidget-C9PlEhWo.js.map → LabelvaluelimitsbarWidget-B69ogLif.js.map} +1 -1
- package/dist/{LabelvaluelimitsbarWidget-BGag8V6k.cjs → LabelvaluelimitsbarWidget-Cmb4kGcv.cjs} +2 -2
- package/dist/{LabelvaluelimitsbarWidget-BGag8V6k.cjs.map → LabelvaluelimitsbarWidget-Cmb4kGcv.cjs.map} +1 -1
- package/dist/{LabelvaluelimitscolumnWidget-SHVJIgGJ.cjs → LabelvaluelimitscolumnWidget-BXdmh9So.cjs} +2 -2
- package/dist/{LabelvaluelimitscolumnWidget-SHVJIgGJ.cjs.map → LabelvaluelimitscolumnWidget-BXdmh9So.cjs.map} +1 -1
- package/dist/{LabelvaluelimitscolumnWidget-Cay6AhoZ.js → LabelvaluelimitscolumnWidget-DPYwFdgq.js} +5 -5
- package/dist/{LabelvaluelimitscolumnWidget-Cay6AhoZ.js.map → LabelvaluelimitscolumnWidget-DPYwFdgq.js.map} +1 -1
- package/dist/{LabelvaluerangebarWidget-s_8IgY-C.js → LabelvaluerangebarWidget-BT0BcOoK.js} +4 -4
- package/dist/{LabelvaluerangebarWidget-s_8IgY-C.js.map → LabelvaluerangebarWidget-BT0BcOoK.js.map} +1 -1
- package/dist/{LabelvaluerangebarWidget-Dbibpimv.cjs → LabelvaluerangebarWidget-cavgscEk.cjs} +2 -2
- package/dist/{LabelvaluerangebarWidget-Dbibpimv.cjs.map → LabelvaluerangebarWidget-cavgscEk.cjs.map} +1 -1
- package/dist/{Layout-DwWEea79.cjs → Layout-D1ukrMwN.cjs} +2 -2
- package/dist/{Layout-DwWEea79.cjs.map → Layout-D1ukrMwN.cjs.map} +1 -1
- package/dist/{Layout-D7RGn0Fe.js → Layout-d-vb0okO.js} +2 -2
- package/dist/{Layout-D7RGn0Fe.js.map → Layout-d-vb0okO.js.map} +1 -1
- package/dist/{LedWidget-DgMtvsiv.js → LedWidget-Cmr6eVG2.js} +7 -6
- package/dist/{LedWidget-DgMtvsiv.js.map → LedWidget-Cmr6eVG2.js.map} +1 -1
- package/dist/LedWidget-Dwrm6hTX.cjs +2 -0
- package/dist/{LedWidget-BaiKDozd.cjs.map → LedWidget-Dwrm6hTX.cjs.map} +1 -1
- package/dist/{LimitsBar-BFM38vQL.cjs → LimitsBar-Dz1lZ_81.cjs} +2 -2
- package/dist/{LimitsBar-BFM38vQL.cjs.map → LimitsBar-Dz1lZ_81.cjs.map} +1 -1
- package/dist/{LimitsBar-CcOaAw0C.js → LimitsBar-qMynDHYT.js} +2 -2
- package/dist/{LimitsBar-CcOaAw0C.js.map → LimitsBar-qMynDHYT.js.map} +1 -1
- package/dist/{LimitsbarWidget-DpmJn1Lo.js → LimitsbarWidget-CMvcwa-m.js} +3 -3
- package/dist/{LimitsbarWidget-DpmJn1Lo.js.map → LimitsbarWidget-CMvcwa-m.js.map} +1 -1
- package/dist/{LimitsbarWidget-ConP3qI5.cjs → LimitsbarWidget-vIP9AUk4.cjs} +2 -2
- package/dist/{LimitsbarWidget-ConP3qI5.cjs.map → LimitsbarWidget-vIP9AUk4.cjs.map} +1 -1
- package/dist/LimitscolorWidget-CPuknJPk.cjs +2 -0
- package/dist/{LimitscolorWidget-veWQ4NXl.cjs.map → LimitscolorWidget-CPuknJPk.cjs.map} +1 -1
- package/dist/{LimitscolorWidget-BMXiEaDm.js → LimitscolorWidget-CZ9wMtcI.js} +7 -6
- package/dist/{LimitscolorWidget-BMXiEaDm.js.map → LimitscolorWidget-CZ9wMtcI.js.map} +1 -1
- package/dist/{LimitscolumnWidget-CJABAor8.cjs → LimitscolumnWidget-r-nOETY5.cjs} +2 -2
- package/dist/{LimitscolumnWidget-CJABAor8.cjs.map → LimitscolumnWidget-r-nOETY5.cjs.map} +1 -1
- package/dist/{LimitscolumnWidget-ufFMz6R-.js → LimitscolumnWidget-r84KJGU-.js} +2 -2
- package/dist/{LimitscolumnWidget-ufFMz6R-.js.map → LimitscolumnWidget-r84KJGU-.js.map} +1 -1
- package/dist/LinegraphWidget-BMUI8q6Q.cjs +2 -0
- package/dist/{LinegraphWidget-3E8L5CvM.cjs.map → LinegraphWidget-BMUI8q6Q.cjs.map} +1 -1
- package/dist/{LinegraphWidget-BC2wVOny.js → LinegraphWidget-COGBGOjF.js} +10 -9
- package/dist/{LinegraphWidget-BC2wVOny.js.map → LinegraphWidget-COGBGOjF.js.map} +1 -1
- package/dist/{MatrixbycolumnsWidget-DICgiNQo.cjs → MatrixbycolumnsWidget-BoNbbrEi.cjs} +2 -2
- package/dist/{MatrixbycolumnsWidget-DICgiNQo.cjs.map → MatrixbycolumnsWidget-BoNbbrEi.cjs.map} +1 -1
- package/dist/{MatrixbycolumnsWidget-DfUAeBnO.js → MatrixbycolumnsWidget-Dx2iz0YF.js} +3 -3
- package/dist/{MatrixbycolumnsWidget-DfUAeBnO.js.map → MatrixbycolumnsWidget-Dx2iz0YF.js.map} +1 -1
- package/dist/{MicroservicesTab-B0SZVty3.js → MicroservicesTab-Bhsf1soi.js} +12 -11
- package/dist/{MicroservicesTab-B0SZVty3.js.map → MicroservicesTab-Bhsf1soi.js.map} +1 -1
- package/dist/{MicroservicesTab-snXJDoYq.cjs → MicroservicesTab-Cuj56g8-.cjs} +3 -3
- package/dist/{MicroservicesTab-snXJDoYq.cjs.map → MicroservicesTab-Cuj56g8-.cjs.map} +1 -1
- package/dist/{OpenC3TimePicker-DpkbfbgC.js → OpenC3TimePicker-C3vCnk72.js} +20 -24
- package/dist/OpenC3TimePicker-C3vCnk72.js.map +1 -0
- package/dist/OpenC3TimePicker-CVUV2cK4.cjs +2 -0
- package/dist/OpenC3TimePicker-CVUV2cK4.cjs.map +1 -0
- package/dist/Openc3Screen-Bi6NOEQM.cjs +6 -0
- package/dist/{Openc3Screen-D1RLlBgQ.cjs.map → Openc3Screen-Bi6NOEQM.cjs.map} +1 -1
- package/dist/{Openc3Screen-DbUvz-3B.js → Openc3Screen-DkhDra2o.js} +67 -66
- package/dist/{Openc3Screen-DbUvz-3B.js.map → Openc3Screen-DkhDra2o.js.map} +1 -1
- package/dist/{OutputDialog-Ds-GdGyI.js → OutputDialog-D0ifesTw.js} +11 -10
- package/dist/{OutputDialog-Ds-GdGyI.js.map → OutputDialog-D0ifesTw.js.map} +1 -1
- package/dist/OutputDialog-DR9cJem2.cjs +2 -0
- package/dist/{OutputDialog-ChPCaQAE.cjs.map → OutputDialog-DR9cJem2.cjs.map} +1 -1
- package/dist/PackagesTab-B4sG5tHo.cjs +2 -0
- package/dist/{PackagesTab-BgQsbXRo.cjs.map → PackagesTab-B4sG5tHo.cjs.map} +1 -1
- package/dist/{PackagesTab-CWplBp_I.js → PackagesTab-Bb221-aM.js} +19 -18
- package/dist/{PackagesTab-CWplBp_I.js.map → PackagesTab-Bb221-aM.js.map} +1 -1
- package/dist/PluginsTab-Cbi_R9jL.cjs +6 -0
- package/dist/PluginsTab-Cbi_R9jL.cjs.map +1 -0
- package/dist/{PluginsTab-BiiL622n.js → PluginsTab-nWngR5kY.js} +275 -234
- package/dist/PluginsTab-nWngR5kY.js.map +1 -0
- package/dist/{ProgressbarWidget-D3ndYnq_.js → ProgressbarWidget-DPbAVjdC.js} +2 -2
- package/dist/{ProgressbarWidget-D3ndYnq_.js.map → ProgressbarWidget-DPbAVjdC.js.map} +1 -1
- package/dist/{ProgressbarWidget-DludJVUf.cjs → ProgressbarWidget-cPr3o6Nv.cjs} +2 -2
- package/dist/{ProgressbarWidget-DludJVUf.cjs.map → ProgressbarWidget-cPr3o6Nv.cjs.map} +1 -1
- package/dist/{RadiobuttonWidget-DX4h94p1.cjs → RadiobuttonWidget-BQZkRFa-.cjs} +2 -2
- package/dist/{RadiobuttonWidget-DX4h94p1.cjs.map → RadiobuttonWidget-BQZkRFa-.cjs.map} +1 -1
- package/dist/{RadiobuttonWidget-CP0S9nWW.js → RadiobuttonWidget-iXI9yCDk.js} +2 -2
- package/dist/{RadiobuttonWidget-CP0S9nWW.js.map → RadiobuttonWidget-iXI9yCDk.js.map} +1 -1
- package/dist/{RadiogroupWidget-BXHfA21T.js → RadiogroupWidget-CMM_p1eA.js} +2 -2
- package/dist/{RadiogroupWidget-BXHfA21T.js.map → RadiogroupWidget-CMM_p1eA.js.map} +1 -1
- package/dist/{RadiogroupWidget-NqjBNUH6.cjs → RadiogroupWidget-D2iIQ5RU.cjs} +2 -2
- package/dist/{RadiogroupWidget-NqjBNUH6.cjs.map → RadiogroupWidget-D2iIQ5RU.cjs.map} +1 -1
- package/dist/{RangebarWidget-Bv2DqkPo.js → RangebarWidget-DJXGUHAc.js} +2 -2
- package/dist/{RangebarWidget-Bv2DqkPo.js.map → RangebarWidget-DJXGUHAc.js.map} +1 -1
- package/dist/{RangebarWidget-CRq2zpvw.cjs → RangebarWidget-DsphX-jB.cjs} +2 -2
- package/dist/{RangebarWidget-CRq2zpvw.cjs.map → RangebarWidget-DsphX-jB.cjs.map} +1 -1
- package/dist/RedisTab-BZtfqEcP.js +186 -0
- package/dist/RedisTab-BZtfqEcP.js.map +1 -0
- package/dist/RedisTab-KhsG2CCO.cjs +2 -0
- package/dist/RedisTab-KhsG2CCO.cjs.map +1 -0
- package/dist/{RollupWidget-o_huYU0x.js → RollupWidget-BbWLSsTT.js} +2 -2
- package/dist/{RollupWidget-o_huYU0x.js.map → RollupWidget-BbWLSsTT.js.map} +1 -1
- package/dist/{RollupWidget-B7_Q_boi.cjs → RollupWidget-w-SF3f-X.cjs} +2 -2
- package/dist/{RollupWidget-B7_Q_boi.cjs.map → RollupWidget-w-SF3f-X.cjs.map} +1 -1
- package/dist/{RoutersTab-DN17iBBi.js → RoutersTab-CLKIJ5cm.js} +13 -12
- package/dist/{RoutersTab-DN17iBBi.js.map → RoutersTab-CLKIJ5cm.js.map} +1 -1
- package/dist/RoutersTab-DUvOfNhU.cjs +2 -0
- package/dist/{RoutersTab-CAbnSGHy.cjs.map → RoutersTab-DUvOfNhU.cjs.map} +1 -1
- package/dist/{ScriptChooser-CzzUJ1Zj.js → ScriptChooser-BxTJKTVu.js} +20 -19
- package/dist/{ScriptChooser-CzzUJ1Zj.js.map → ScriptChooser-BxTJKTVu.js.map} +1 -1
- package/dist/ScriptChooser-YC_FfCLd.cjs +2 -0
- package/dist/{ScriptChooser-CggwstfT.cjs.map → ScriptChooser-YC_FfCLd.cjs.map} +1 -1
- package/dist/{ScrollwindowWidget-kS5QjP-v.cjs → ScrollwindowWidget-D1mtHFMa.cjs} +2 -2
- package/dist/{ScrollwindowWidget-kS5QjP-v.cjs.map → ScrollwindowWidget-D1mtHFMa.cjs.map} +1 -1
- package/dist/{ScrollwindowWidget-DdjaML6D.js → ScrollwindowWidget-Dxhp7yKn.js} +2 -2
- package/dist/{ScrollwindowWidget-DdjaML6D.js.map → ScrollwindowWidget-Dxhp7yKn.js.map} +1 -1
- package/dist/SecretsTab-B7oZb354.cjs +2 -0
- package/dist/{SecretsTab-Cn6-o85L.cjs.map → SecretsTab-B7oZb354.cjs.map} +1 -1
- package/dist/{SecretsTab-Cu3sx2OA.js → SecretsTab-BoBmTh63.js} +5 -5
- package/dist/{SecretsTab-Cu3sx2OA.js.map → SecretsTab-BoBmTh63.js.map} +1 -1
- package/dist/SettingsTab-2EMyS-3_.cjs +3 -0
- package/dist/{SettingsTab-C6zIL2D6.cjs.map → SettingsTab-2EMyS-3_.cjs.map} +1 -1
- package/dist/{SettingsTab-B_vvSLvt.js → SettingsTab-BL7gkaO9.js} +7 -6
- package/dist/{SettingsTab-B_vvSLvt.js.map → SettingsTab-BL7gkaO9.js.map} +1 -1
- package/dist/{SignalWidget-Dd54y28I.js → SignalWidget-65q0tiuo.js} +2 -2
- package/dist/{SignalWidget-Dd54y28I.js.map → SignalWidget-65q0tiuo.js.map} +1 -1
- package/dist/{SignalWidget-BagcB92r.cjs → SignalWidget-Cld2lVyc.cjs} +2 -2
- package/dist/{SignalWidget-BagcB92r.cjs.map → SignalWidget-Cld2lVyc.cjs.map} +1 -1
- package/dist/{SimpleTextDialog-DZv9n_kJ.js → SimpleTextDialog-ChmFtdVw.js} +2 -2
- package/dist/{SimpleTextDialog-DZv9n_kJ.js.map → SimpleTextDialog-ChmFtdVw.js.map} +1 -1
- package/dist/{SimpleTextDialog-BJ50TbWh.cjs → SimpleTextDialog-DVlqwD8O.cjs} +2 -2
- package/dist/{SimpleTextDialog-BJ50TbWh.cjs.map → SimpleTextDialog-DVlqwD8O.cjs.map} +1 -1
- package/dist/{SpacerWidget-GPFYtIG1.js → SpacerWidget-DFzbojmX.js} +2 -2
- package/dist/{SpacerWidget-GPFYtIG1.js.map → SpacerWidget-DFzbojmX.js.map} +1 -1
- package/dist/{SpacerWidget-DWjBns9r.cjs → SpacerWidget-DV0-ZfEm.cjs} +2 -2
- package/dist/{SpacerWidget-DWjBns9r.cjs.map → SpacerWidget-DV0-ZfEm.cjs.map} +1 -1
- package/dist/SparklineWidget-B1RfTxEp.cjs +2 -0
- package/dist/{SparklineWidget-xdPgolp3.cjs.map → SparklineWidget-B1RfTxEp.cjs.map} +1 -1
- package/dist/{SparklineWidget-f11nrlLS.js → SparklineWidget-Bu4I8zY0.js} +10 -9
- package/dist/{SparklineWidget-f11nrlLS.js.map → SparklineWidget-Bu4I8zY0.js.map} +1 -1
- package/dist/{TabbookWidget-DeaC27yC.js → TabbookWidget-CELMWyx7.js} +2 -2
- package/dist/{TabbookWidget-DeaC27yC.js.map → TabbookWidget-CELMWyx7.js.map} +1 -1
- package/dist/{TabbookWidget-CUIYWHRH.cjs → TabbookWidget-CLpx5e5Q.cjs} +2 -2
- package/dist/{TabbookWidget-CUIYWHRH.cjs.map → TabbookWidget-CLpx5e5Q.cjs.map} +1 -1
- package/dist/{TargetPacketItemChooser-BoBqvs3T.js → TargetPacketItemChooser-BOdVLVbe.js} +177 -153
- package/dist/TargetPacketItemChooser-BOdVLVbe.js.map +1 -0
- package/dist/TargetPacketItemChooser-xoRA3b9K.cjs +2 -0
- package/dist/TargetPacketItemChooser-xoRA3b9K.cjs.map +1 -0
- package/dist/{TargetsTab-CjVaBN9O.js → TargetsTab-BJZEtKY4.js} +11 -10
- package/dist/{TargetsTab-CjVaBN9O.js.map → TargetsTab-BJZEtKY4.js.map} +1 -1
- package/dist/TargetsTab-Dkp4VoK6.cjs +2 -0
- package/dist/{TargetsTab-BMcWjrZ_.cjs.map → TargetsTab-Dkp4VoK6.cjs.map} +1 -1
- package/dist/{TextboxWidget-tL41zWUX.js → TextboxWidget-DYsqXntS.js} +7 -6
- package/dist/{TextboxWidget-tL41zWUX.js.map → TextboxWidget-DYsqXntS.js.map} +1 -1
- package/dist/TextboxWidget-DuNmhz89.cjs +2 -0
- package/dist/{TextboxWidget-CXA9rR02.cjs.map → TextboxWidget-DuNmhz89.cjs.map} +1 -1
- package/dist/{TextfieldWidget-D1qj14Qi.js → TextfieldWidget-BIUgV9Q4.js} +2 -2
- package/dist/{TextfieldWidget-D1qj14Qi.js.map → TextfieldWidget-BIUgV9Q4.js.map} +1 -1
- package/dist/{TextfieldWidget-D-H2fOZG.cjs → TextfieldWidget-BlW-rSVv.cjs} +2 -2
- package/dist/{TextfieldWidget-D-H2fOZG.cjs.map → TextfieldWidget-BlW-rSVv.cjs.map} +1 -1
- package/dist/{TimeWidget-CSVGNong.js → TimeWidget-BPXcY1Wy.js} +7 -6
- package/dist/{TimeWidget-CSVGNong.js.map → TimeWidget-BPXcY1Wy.js.map} +1 -1
- package/dist/TimeWidget-BddmbQgt.cjs +2 -0
- package/dist/{TimeWidget-CGk8Ze_I.cjs.map → TimeWidget-BddmbQgt.cjs.map} +1 -1
- package/dist/{TitleWidget-ClhWhUf3.cjs → TitleWidget-CPqwZKUx.cjs} +2 -2
- package/dist/{TitleWidget-ClhWhUf3.cjs.map → TitleWidget-CPqwZKUx.cjs.map} +1 -1
- package/dist/{TitleWidget-CLx-tuYT.js → TitleWidget-DJ9mHRLE.js} +2 -2
- package/dist/{TitleWidget-CLx-tuYT.js.map → TitleWidget-DJ9mHRLE.js.map} +1 -1
- package/dist/ToolsTab-B4CURni4.cjs +2 -0
- package/dist/{ToolsTab-DTHap-Nq.cjs.map → ToolsTab-B4CURni4.cjs.map} +1 -1
- package/dist/{ToolsTab-lBB_KhmA.js → ToolsTab-VSCWDywf.js} +62 -61
- package/dist/{ToolsTab-lBB_KhmA.js.map → ToolsTab-VSCWDywf.js.map} +1 -1
- package/dist/{TopBar-C810rP_B.js → TopBar-B4oz2FsN.js} +2 -2
- package/dist/{TopBar-C810rP_B.js.map → TopBar-B4oz2FsN.js.map} +1 -1
- package/dist/{TopBar-Ctzx7o2k.cjs → TopBar-lcB6jpd_.cjs} +2 -2
- package/dist/{TopBar-Ctzx7o2k.cjs.map → TopBar-lcB6jpd_.cjs.map} +1 -1
- package/dist/TsdbTab-Cv8GjpoJ.js +1164 -0
- package/dist/TsdbTab-Cv8GjpoJ.js.map +1 -0
- package/dist/TsdbTab-OOO451j0.cjs +5 -0
- package/dist/TsdbTab-OOO451j0.cjs.map +1 -0
- package/dist/{UpgradeToEnterpriseDialog-D_S574Zb.js → UpgradeToEnterpriseDialog-BUuXsGPY.js} +2 -2
- package/dist/{UpgradeToEnterpriseDialog-D_S574Zb.js.map → UpgradeToEnterpriseDialog-BUuXsGPY.js.map} +1 -1
- package/dist/{UpgradeToEnterpriseDialog-XJb6gVCY.cjs → UpgradeToEnterpriseDialog-DHLK6v6f.cjs} +2 -2
- package/dist/{UpgradeToEnterpriseDialog-XJb6gVCY.cjs.map → UpgradeToEnterpriseDialog-DHLK6v6f.cjs.map} +1 -1
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-CTNR19Zt.cjs +1477 -0
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-CTNR19Zt.cjs.map +1 -0
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DskbVSHX.js +26306 -0
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DskbVSHX.js.map +1 -0
- package/dist/VWidget-B6WHN0_z.cjs +2 -0
- package/dist/VWidget-B6WHN0_z.cjs.map +1 -0
- package/dist/{VWidget-CxnaMF0w.js → VWidget-BDy0211S.js} +17 -20
- package/dist/VWidget-BDy0211S.js.map +1 -0
- package/dist/{ValueWidget-BYgpXfDo.js → ValueWidget-DzOSy7lp.js} +7 -6
- package/dist/{ValueWidget-BYgpXfDo.js.map → ValueWidget-DzOSy7lp.js.map} +1 -1
- package/dist/ValueWidget-QWzoEFXc.cjs +2 -0
- package/dist/{ValueWidget-Bws1qOEI.cjs.map → ValueWidget-QWzoEFXc.cjs.map} +1 -1
- package/dist/{ValuelimitsbarWidget-BoZSJvuq.cjs → ValuelimitsbarWidget-5AkAljK-.cjs} +2 -2
- package/dist/{ValuelimitsbarWidget-BoZSJvuq.cjs.map → ValuelimitsbarWidget-5AkAljK-.cjs.map} +1 -1
- package/dist/{ValuelimitsbarWidget-Dc9-VNZ3.js → ValuelimitsbarWidget-D5dSlW6D.js} +4 -4
- package/dist/{ValuelimitsbarWidget-Dc9-VNZ3.js.map → ValuelimitsbarWidget-D5dSlW6D.js.map} +1 -1
- package/dist/{ValuelimitscolumnWidget-b7W8K3mR.js → ValuelimitscolumnWidget-7DXCsVW_.js} +4 -4
- package/dist/{ValuelimitscolumnWidget-b7W8K3mR.js.map → ValuelimitscolumnWidget-7DXCsVW_.js.map} +1 -1
- package/dist/{ValuelimitscolumnWidget-ta9i_tiy.cjs → ValuelimitscolumnWidget-zNx9i1v7.cjs} +2 -2
- package/dist/{ValuelimitscolumnWidget-ta9i_tiy.cjs.map → ValuelimitscolumnWidget-zNx9i1v7.cjs.map} +1 -1
- package/dist/{ValuerangebarWidget-DmhczZQb.js → ValuerangebarWidget-BWjnpmyy.js} +4 -4
- package/dist/{ValuerangebarWidget-DmhczZQb.js.map → ValuerangebarWidget-BWjnpmyy.js.map} +1 -1
- package/dist/{ValuerangebarWidget-Ips-beG6.cjs → ValuerangebarWidget-EsdIz4oP.cjs} +2 -2
- package/dist/{ValuerangebarWidget-Ips-beG6.cjs.map → ValuerangebarWidget-EsdIz4oP.cjs.map} +1 -1
- package/dist/{VerticalWidget-BvsVh0Ob.js → VerticalWidget-BOtXAhxt.js} +2 -2
- package/dist/{VerticalWidget-BvsVh0Ob.js.map → VerticalWidget-BOtXAhxt.js.map} +1 -1
- package/dist/{VerticalWidget-BVt7QPjO.cjs → VerticalWidget-DVskS6fx.cjs} +2 -2
- package/dist/{VerticalWidget-BVt7QPjO.cjs.map → VerticalWidget-DVskS6fx.cjs.map} +1 -1
- package/dist/{VerticalboxWidget-CNoXT3YW.cjs → VerticalboxWidget-Bu4oHN2K.cjs} +2 -2
- package/dist/{VerticalboxWidget-CNoXT3YW.cjs.map → VerticalboxWidget-Bu4oHN2K.cjs.map} +1 -1
- package/dist/{VerticalboxWidget-ClTCDCQN.js → VerticalboxWidget-RAsXfGdI.js} +5 -5
- package/dist/{VerticalboxWidget-ClTCDCQN.js.map → VerticalboxWidget-RAsXfGdI.js.map} +1 -1
- package/dist/{Widget-DRhVdCLP.js → Widget-BDsgRxuV.js} +37 -14
- package/dist/{Widget-DRhVdCLP.js.map → Widget-BDsgRxuV.js.map} +1 -1
- package/dist/Widget-Ddu_kuTL.cjs +2 -0
- package/dist/{Widget-CB_BtOFw.cjs.map → Widget-Ddu_kuTL.cjs.map} +1 -1
- package/dist/{addMonths-Zggd7y6j.js → addMonths-BiRF9eDT.js} +2 -2
- package/dist/{addMonths-Zggd7y6j.js.map → addMonths-BiRF9eDT.js.map} +1 -1
- package/dist/{addMonths-BhOW2mOW.cjs → addMonths-Ds2ObZwt.cjs} +2 -2
- package/dist/{addMonths-BhOW2mOW.cjs.map → addMonths-Ds2ObZwt.cjs.map} +1 -1
- package/dist/components.cjs +2 -2
- package/dist/components.js +28 -28
- package/dist/format-D2pYLAIF.js +5896 -0
- package/dist/format-D2pYLAIF.js.map +1 -0
- package/dist/format-qjtPogBb.cjs +13 -0
- package/dist/format-qjtPogBb.cjs.map +1 -0
- package/dist/getDefaultOptions-DSMQojSA.cjs +2 -0
- package/dist/{getDefaultOptions-Cek5kGzE.cjs.map → getDefaultOptions-DSMQojSA.cjs.map} +1 -1
- package/dist/getDefaultOptions-v3X-F5jM.js +8 -0
- package/dist/{getDefaultOptions-xjgn1r-_.js.map → getDefaultOptions-v3X-F5jM.js.map} +1 -1
- package/dist/{index-GYAZJDxn.js → index-BJCQaZ7q.js} +63 -62
- package/dist/{index-GYAZJDxn.js.map → index-BJCQaZ7q.js.map} +1 -1
- package/dist/{index-CJcL4_a4.js → index-BjcgyMLV.js} +691 -633
- package/dist/index-BjcgyMLV.js.map +1 -0
- package/dist/{index-3sXOEKCU.cjs → index-CctPeecq.cjs} +5 -5
- package/dist/{index-3sXOEKCU.cjs.map → index-CctPeecq.cjs.map} +1 -1
- package/dist/index-_a-NnvKv.cjs +10 -0
- package/dist/index-_a-NnvKv.cjs.map +1 -0
- package/dist/{parse-BKTTGw2p.js → parse-Br4M7sX4.js} +3 -3
- package/dist/{parse-BKTTGw2p.js.map → parse-Br4M7sX4.js.map} +1 -1
- package/dist/{parse-DgZTYocC.cjs → parse-D8syXcjd.cjs} +2 -2
- package/dist/{parse-DgZTYocC.cjs.map → parse-D8syXcjd.cjs.map} +1 -1
- package/dist/plugins.cjs +1 -1
- package/dist/plugins.cjs.map +1 -1
- package/dist/plugins.js +1 -1
- package/dist/plugins.js.map +1 -1
- package/dist/purify.es-CehoGjrR.cjs +3 -0
- package/dist/purify.es-CehoGjrR.cjs.map +1 -0
- package/dist/purify.es-exIQuqhb.js +596 -0
- package/dist/purify.es-exIQuqhb.js.map +1 -0
- package/dist/settings-CWvCIKI4.cjs +2 -0
- package/dist/{settings-B0AhztTk.cjs.map → settings-CWvCIKI4.cjs.map} +1 -1
- package/dist/{settings-C2auUQwX.js → settings-Dvmurty6.js} +2 -2
- package/dist/{settings-C2auUQwX.js.map → settings-Dvmurty6.js.map} +1 -1
- package/dist/settingsCache-CGgEjlw3.js +28 -0
- package/dist/settingsCache-CGgEjlw3.js.map +1 -0
- package/dist/settingsCache-Dg7OMDJK.cjs +2 -0
- package/dist/settingsCache-Dg7OMDJK.cjs.map +1 -0
- package/dist/{timeFilters-CRNRsUsb.cjs → timeFilters-BtN2a5-O.cjs} +2 -2
- package/dist/{timeFilters-CRNRsUsb.cjs.map → timeFilters-BtN2a5-O.cjs.map} +1 -1
- package/dist/{timeFilters-DTOZtBlG.js → timeFilters-C1beMtAQ.js} +3 -3
- package/dist/{timeFilters-DTOZtBlG.js.map → timeFilters-C1beMtAQ.js.map} +1 -1
- package/dist/tools/admin.cjs +1 -1
- package/dist/tools/admin.js +1 -1
- package/dist/tools/base.cjs +1 -1
- package/dist/tools/base.cjs.map +1 -1
- package/dist/tools/base.js +51 -51
- package/dist/tools/calendar.cjs +1 -1
- package/dist/tools/calendar.js +1 -1
- package/dist/tools/scriptrunner.cjs +8 -8
- package/dist/tools/scriptrunner.cjs.map +1 -1
- package/dist/tools/scriptrunner.js +17 -17
- package/dist/tools/scriptrunner.js.map +1 -1
- package/dist/util.cjs +1 -1
- package/dist/util.js +11 -7
- package/dist/util.js.map +1 -1
- package/dist/vue-common.css +1 -1
- package/dist/widgets.cjs +1 -1
- package/dist/widgets.js +64 -64
- package/package.json +7 -7
- package/dist/ArrayplotWidget-BHD-TGQO.cjs +0 -2
- package/dist/BarColumn-DmjMnw5l.js.map +0 -1
- package/dist/BarColumn-Ym4P8YHC.cjs +0 -2
- package/dist/BarColumn-Ym4P8YHC.cjs.map +0 -1
- package/dist/ButtonWidget-70hNWuEy.cjs +0 -3
- package/dist/ButtonWidget-70hNWuEy.cjs.map +0 -1
- package/dist/ButtonWidget-DZ4VCNWU.js.map +0 -1
- package/dist/ClassificationBanners-DjGCuH-4.cjs +0 -2
- package/dist/CriticalCmdDialog-eytxCQto.cjs +0 -2
- package/dist/DateWidget-Cle8FY8Q.cjs +0 -2
- package/dist/DetailsDialog-BcMaTfuQ.cjs +0 -2
- package/dist/EventListDialog-DjCQAwGl.js.map +0 -1
- package/dist/EventListDialog-EmC7YW60.cjs +0 -2
- package/dist/EventListDialog-EmC7YW60.cjs.map +0 -1
- package/dist/FilechecksumWidget-2ta-UvLp.cjs +0 -2
- package/dist/FiledisplayWidget-BUKXIQir.cjs +0 -2
- package/dist/Graph-CUFzx8Ti.js.map +0 -1
- package/dist/Graph-qxF4224c.cjs +0 -2
- package/dist/Graph-qxF4224c.cjs.map +0 -1
- package/dist/GraphWidget-BvCQHVxQ.cjs +0 -2
- package/dist/ImageLoader-BTEOukIw.cjs +0 -2
- package/dist/InterfacesTab-CM0CGFVS.cjs +0 -2
- package/dist/LabelvalueWidget-_1JPbK-K.js.map +0 -1
- package/dist/LabelvalueWidget-bYqqgIGE.cjs +0 -2
- package/dist/LabelvalueWidget-bYqqgIGE.cjs.map +0 -1
- package/dist/LabelvaluedescWidget-B2dFZoDE.cjs +0 -2
- package/dist/LabelvaluedescWidget-B2dFZoDE.cjs.map +0 -1
- package/dist/LabelvaluedescWidget-BgduSJJb.js +0 -59
- package/dist/LabelvaluedescWidget-BgduSJJb.js.map +0 -1
- package/dist/LedWidget-BaiKDozd.cjs +0 -2
- package/dist/LimitscolorWidget-veWQ4NXl.cjs +0 -2
- package/dist/LinegraphWidget-3E8L5CvM.cjs +0 -2
- package/dist/OpenC3TimePicker-DpkbfbgC.js.map +0 -1
- package/dist/OpenC3TimePicker-Yl1jVi7p.cjs +0 -2
- package/dist/OpenC3TimePicker-Yl1jVi7p.cjs.map +0 -1
- package/dist/Openc3Screen-D1RLlBgQ.cjs +0 -6
- package/dist/OutputDialog-ChPCaQAE.cjs +0 -2
- package/dist/PackagesTab-BgQsbXRo.cjs +0 -2
- package/dist/PluginsTab-BiiL622n.js.map +0 -1
- package/dist/PluginsTab-RgIMk-F7.cjs +0 -6
- package/dist/PluginsTab-RgIMk-F7.cjs.map +0 -1
- package/dist/RedisTab-7TbOXFA_.js +0 -171
- package/dist/RedisTab-7TbOXFA_.js.map +0 -1
- package/dist/RedisTab-DpWPY1P0.cjs +0 -2
- package/dist/RedisTab-DpWPY1P0.cjs.map +0 -1
- package/dist/RoutersTab-CAbnSGHy.cjs +0 -2
- package/dist/ScriptChooser-CggwstfT.cjs +0 -2
- package/dist/SecretsTab-Cn6-o85L.cjs +0 -2
- package/dist/SettingsTab-C6zIL2D6.cjs +0 -3
- package/dist/SparklineWidget-xdPgolp3.cjs +0 -2
- package/dist/TargetPacketItemChooser-BoBqvs3T.js.map +0 -1
- package/dist/TargetPacketItemChooser-C0Z90rss.cjs +0 -2
- package/dist/TargetPacketItemChooser-C0Z90rss.cjs.map +0 -1
- package/dist/TargetsTab-BMcWjrZ_.cjs +0 -2
- package/dist/TextboxWidget-CXA9rR02.cjs +0 -2
- package/dist/TimeWidget-CGk8Ze_I.cjs +0 -2
- package/dist/ToolsTab-DTHap-Nq.cjs +0 -2
- package/dist/TsdbTab-7F4mRKDo.js +0 -125
- package/dist/TsdbTab-7F4mRKDo.js.map +0 -1
- package/dist/TsdbTab-DVF6n9mq.cjs +0 -2
- package/dist/TsdbTab-DVF6n9mq.cjs.map +0 -1
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-BJxLUZhh.js +0 -30891
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-BJxLUZhh.js.map +0 -1
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-eKtA_EtD.cjs +0 -1485
- package/dist/UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-eKtA_EtD.cjs.map +0 -1
- package/dist/VWidget-CxnaMF0w.js.map +0 -1
- package/dist/VWidget-dEHSEvZx.cjs +0 -2
- package/dist/VWidget-dEHSEvZx.cjs.map +0 -1
- package/dist/ValueWidget-Bws1qOEI.cjs +0 -2
- package/dist/Widget-CB_BtOFw.cjs +0 -2
- package/dist/format-CJYjW-xx.js +0 -1252
- package/dist/format-CJYjW-xx.js.map +0 -1
- package/dist/format-DOZQNf-X.cjs +0 -2
- package/dist/format-DOZQNf-X.cjs.map +0 -1
- package/dist/getDefaultOptions-Cek5kGzE.cjs +0 -2
- package/dist/getDefaultOptions-xjgn1r-_.js +0 -8
- package/dist/index-B34azWgs.cjs +0 -7
- package/dist/index-B34azWgs.cjs.map +0 -1
- package/dist/index-CJcL4_a4.js.map +0 -1
- package/dist/purify.es-4pyphLiB.cjs +0 -3
- package/dist/purify.es-4pyphLiB.cjs.map +0 -1
- package/dist/purify.es-BPDBzHtc.js +0 -553
- package/dist/purify.es-BPDBzHtc.js.map +0 -1
- package/dist/settings-B0AhztTk.cjs +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TsdbTab-Cv8GjpoJ.js","sources":["../src/tools/admin/tabs/tsdb/RepairGapDialog.vue","../src/tools/admin/tabs/tsdb/tsdbApi.js","../src/tools/admin/tabs/tsdb/TsdbMetrics.vue","../src/tools/admin/tabs/tsdb/TsdbQueries.vue","../src/tools/admin/tabs/TsdbTab.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-dialog :model-value=\"modelValue\" max-width=\"900\" persistent>\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n Repair Gap: {{ context.target }} {{ context.packet }}\n </v-card-title>\n <v-card-subtitle v-if=\"context.gap\">\n {{ context.gap.start }} — {{ context.gap.end }} ({{\n context.gap.duration\n }})\n </v-card-subtitle>\n\n <v-card-text style=\"max-height: 75vh; overflow-y: auto\">\n <div v-if=\"errorMessage\" class=\"text-red monospace mb-4\">\n Error: {{ errorMessage }}\n </div>\n\n <!-- Candidate listing phase -->\n <template v-if=\"!jobId\">\n <div v-if=\"loadingCandidates\" class=\"d-flex align-center mb-4\">\n <v-progress-circular indeterminate size=\"24\" class=\"mr-3\" />\n Searching bucket for raw log files that cover this gap…\n </div>\n\n <template v-else>\n <div v-if=\"candidates.length === 0\" class=\"text-medium-emphasis\">\n No raw log files cover this gap window. Reingest is not available\n — the data may have been written from a source that skipped\n raw logging, or the logs have been deleted.\n </div>\n\n <template v-else>\n <div class=\"mb-2\">\n {{ candidates.length }} raw log file(s) overlap this window.\n Select which to reingest:\n </div>\n <v-data-table\n v-model=\"selectedKeys\"\n :headers=\"candidateHeaders\"\n :items=\"candidates\"\n item-value=\"key\"\n show-select\n class=\"monospace\"\n :items-per-page=\"20\"\n density=\"compact\"\n data-test=\"repair-candidates\"\n />\n\n <div class=\"mt-4\">\n <div class=\"text-subtitle-2 font-weight-bold mb-1\">\n Target Definition Version\n </div>\n <v-radio-group\n v-model=\"targetVersion\"\n hide-details\n density=\"compact\"\n data-test=\"repair-version\"\n >\n <v-radio\n value=\"as_logged\"\n data-test=\"repair-version-as-logged\"\n >\n <template #label>\n <div style=\"padding-left: 10px\">\n <div>As logged (default)</div>\n <div class=\"text-caption text-medium-emphasis\">\n Decode each file with the cmd/tlm definition that was\n in effect when the data was originally logged. Safest\n for historical fidelity — preserves packet layouts as\n they existed at that time.\n </div>\n <div class=\"text-caption text-medium-emphasis mt-1\">\n If an item's type has changed since the log was\n written (e.g. STRING → FLOAT), QuestDB column\n types are kept as-is; historical values are cast to\n fit the current column, and any values that can't cast\n are stored as NULL.\n </div>\n </div>\n </template>\n </v-radio>\n <v-radio value=\"current\" data-test=\"repair-version-current\">\n <template #label>\n <div style=\"padding-left: 10px\">\n <div>Current</div>\n <div class=\"text-caption text-medium-emphasis\">\n Decode all files with the latest cmd/tlm definition.\n Choose this when the historical definition had a bug\n that you've since fixed, and you want the reingested\n data decoded with the corrected layout.\n </div>\n </div>\n </template>\n </v-radio>\n </v-radio-group>\n </div>\n </template>\n </template>\n </template>\n\n <!-- Job polling phase -->\n <template v-else-if=\"jobStatus\">\n <v-table density=\"compact\" class=\"monospace mb-4\">\n <tbody>\n <tr>\n <td class=\"font-weight-bold\">Job</td>\n <td>{{ jobId }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">State</td>\n <td>{{ jobStatus.state }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Phase</td>\n <td>{{ phaseLabel }}</td>\n </tr>\n <tr v-if=\"jobStatus.target_version\">\n <td class=\"font-weight-bold\">Target Version</td>\n <td>{{ jobStatus.target_version }}</td>\n </tr>\n <tr v-if=\"jobStatus.packets_written !== undefined\">\n <td class=\"font-weight-bold\">Packets Written</td>\n <td>{{ jobStatus.packets_written.toLocaleString() }}</td>\n </tr>\n <tr v-if=\"jobStatus.error\">\n <td class=\"font-weight-bold text-red\">Error</td>\n <td class=\"text-red\">{{ jobStatus.error }}</td>\n </tr>\n <tr v-if=\"jobStatus.warnings && jobStatus.warnings.length\">\n <td class=\"font-weight-bold text-orange\">Warnings</td>\n <td class=\"text-orange\">\n <div v-for=\"(w, idx) in jobStatus.warnings\" :key=\"idx\">\n {{ w }}\n </div>\n </td>\n </tr>\n </tbody>\n </v-table>\n <v-progress-linear\n :model-value=\"progressPercent\"\n :indeterminate=\"progressPercent === 0 && isRunning\"\n class=\"mb-2\"\n />\n </template>\n </v-card-text>\n\n <v-card-actions class=\"px-4 pb-4\">\n <v-spacer />\n <v-btn\n v-if=\"!jobId\"\n color=\"warning\"\n variant=\"elevated\"\n :disabled=\"\n loadingCandidates ||\n candidates.length === 0 ||\n selectedKeys.length === 0\n \"\n data-test=\"repair-reingest\"\n @click=\"startReingest\"\n >\n Reingest {{ selectedKeys.length }}\n </v-btn>\n <v-btn variant=\"text\" data-test=\"repair-close\" @click=\"attemptClose\">\n Close\n </v-btn>\n </v-card-actions>\n </v-card>\n\n <v-dialog v-model=\"confirmCloseOpen\" max-width=\"500\" persistent>\n <v-card>\n <v-card-title>Reingest Still Running</v-card-title>\n <v-card-text>\n The reingest job is still in progress. Closing this dialog will not\n stop the job, but you will lose visibility into its status. Are you\n sure you want to close?\n </v-card-text>\n <v-card-actions class=\"px-4 pb-4\">\n <v-spacer />\n <v-btn\n variant=\"text\"\n data-test=\"repair-close-cancel\"\n @click=\"confirmCloseOpen = false\"\n >\n Keep Watching\n </v-btn>\n <v-btn\n color=\"warning\"\n variant=\"elevated\"\n data-test=\"repair-close-confirm\"\n @click=\"confirmClose\"\n >\n Close Anyway\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\n\nconst PHASE_LABELS = {\n downloading: 'Downloading files…',\n enabling_dedup: 'Enabling DEDUP…',\n ingesting: 'Ingesting packets…',\n dedup_cooldown: 'Waiting for DEDUP cooldown…',\n disabling_dedup: 'Disabling DEDUP…',\n}\n\nexport default {\n props: {\n modelValue: {\n type: Boolean,\n default: false,\n },\n context: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:modelValue', 'complete'],\n data() {\n return {\n loadingCandidates: false,\n candidates: [],\n selectedKeys: [],\n targetVersion: 'as_logged',\n bucketEnv: null,\n path: null,\n candidateHeaders: [\n { title: 'File', key: 'filename' },\n { title: 'Key', key: 'key' },\n ],\n jobId: null,\n jobStatus: null,\n pollHandle: null,\n errorMessage: null,\n confirmCloseOpen: false,\n }\n },\n computed: {\n isRunning() {\n if (!this.jobStatus) return false\n return ['Queued', 'Running'].includes(this.jobStatus.state)\n },\n phaseLabel() {\n const phase = this.jobStatus?.progress_phase\n if (!phase) return this.jobStatus?.state || ''\n if (phase === 'dedup_cooldown') {\n const remaining = this.cooldownRemaining\n if (remaining != null) {\n return `Waiting for DEDUP cooldown (${remaining}s)…`\n }\n }\n return PHASE_LABELS[phase] || phase\n },\n cooldownRemaining() {\n const enabledAt = this.jobStatus?.dedup_enabled_at\n const cooldown = this.jobStatus?.dedup_cooldown_seconds\n if (!enabledAt || !cooldown) return null\n const nowSec = Date.now() / 1000\n const enabledSec = new Date(enabledAt).getTime() / 1000\n const remaining = Math.round(enabledSec + cooldown - nowSec)\n return Math.max(remaining, 0)\n },\n progressPercent() {\n const s = this.jobStatus\n if (!s) return 0\n if (s.state === 'Complete') return 100\n if (!s.progress_total || s.progress_total === 0) return 0\n return Math.round((s.progress_current / s.progress_total) * 100)\n },\n },\n watch: {\n modelValue(open) {\n if (open) this.fetchCandidates()\n },\n },\n mounted() {\n if (this.modelValue) this.fetchCandidates()\n },\n beforeUnmount() {\n this.stopPolling()\n },\n methods: {\n close() {\n this.stopPolling()\n const completed = this.jobStatus?.state === 'Complete'\n this.resetState()\n this.$emit('update:modelValue', false)\n if (completed) this.$emit('complete')\n },\n attemptClose() {\n if (this.isRunning) {\n this.confirmCloseOpen = true\n } else {\n this.close()\n }\n },\n confirmClose() {\n this.confirmCloseOpen = false\n this.close()\n },\n resetState() {\n this.candidates = []\n this.selectedKeys = []\n this.targetVersion = 'as_logged'\n this.bucketEnv = null\n this.path = null\n this.jobId = null\n this.jobStatus = null\n this.errorMessage = null\n this.loadingCandidates = false\n this.confirmCloseOpen = false\n },\n async fetchCandidates() {\n this.resetState()\n this.loadingCandidates = true\n try {\n const response = await Api.get(\n '/openc3-api/storage/repair_candidates',\n {\n params: {\n scope: this.context.scope,\n target: this.context.target,\n packet: this.context.packet,\n cmd_or_tlm: this.context.cmdOrTlm,\n start_time: this.context.gap.startIso,\n end_time: this.context.gap.endIso,\n },\n },\n )\n this.candidates = response.data.files || []\n this.bucketEnv = response.data.bucket\n this.path = response.data.path\n this.selectedKeys = this.candidates.map((c) => c.key)\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n } finally {\n this.loadingCandidates = false\n }\n },\n async startReingest() {\n this.errorMessage = null\n // The controller expects filenames relative to `path`, not full keys.\n const filenames = this.selectedKeys.map((key) => {\n if (this.path && key.startsWith(this.path)) {\n return key.slice(this.path.length)\n }\n return key.split('/').pop()\n })\n try {\n const response = await Api.post('/openc3-api/storage/reingest', {\n data: {\n scope: this.context.scope,\n bucket: this.bucketEnv,\n path: this.path,\n files: filenames,\n target_version: this.targetVersion,\n },\n })\n this.jobId = response.data.job_id\n this.jobStatus = { state: response.data.state }\n this.startPolling()\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n }\n },\n startPolling() {\n this.stopPolling()\n this.pollHandle = setInterval(this.pollStatus, 2000)\n this.pollStatus()\n },\n stopPolling() {\n if (this.pollHandle) {\n clearInterval(this.pollHandle)\n this.pollHandle = null\n }\n },\n async pollStatus() {\n if (!this.jobId) return\n try {\n const response = await Api.get(\n `/openc3-api/storage/reingest/${this.jobId}`,\n { params: { scope: this.context.scope } },\n )\n this.jobStatus = response.data\n if (!this.isRunning) this.stopPolling()\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n this.stopPolling()\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n.text-orange {\n color: rgb(var(--v-theme-warning));\n}\n</style>\n","/*\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { Api } from '@openc3/js-common/services'\n\n// QuestDB's PG wire occasionally drops idle connections; retry with backoff\n// so transient PQconsumeInput / \"server closed the connection\" errors from\n// the backend don't surface to the user.\nexport async function execSql(sql, db_shard, retries = 3) {\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n let url = '/openc3-api/tsdb/exec'\n if (db_shard && db_shard !== '0') {\n url += `?db_shard=${db_shard}`\n }\n return await Api.post(url, {\n data: sql,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'text/plain',\n },\n })\n } catch (error) {\n const msg = error.response?.data?.message || error.message || ''\n const isConnectionError =\n msg.includes('PQconsumeInput') ||\n msg.includes('server closed the connection')\n if (isConnectionError && attempt < retries) {\n await new Promise((r) => setTimeout(r, 1000 * attempt))\n continue\n }\n throw error\n }\n }\n}\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-card>\n <v-card-title> QuestDB Table Storage Metrics </v-card-title>\n <v-card-text>\n <div v-if=\"metricsError\" class=\"mt-2 text-red monospace\">\n Error: {{ metricsError }}\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-btn\n :loading=\"metricsLoading\"\n color=\"success\"\n variant=\"text\"\n data-test=\"tsdb-metrics-refresh\"\n @click=\"fetchMetrics\"\n >\n Refresh\n </v-btn>\n <v-text-field\n v-model=\"db_shard\"\n type=\"number\"\n min=\"0\"\n label=\"DB Shard\"\n hint=\"DB Shard is N/A in Core\"\n hide-details\n density=\"compact\"\n style=\"max-width: 100px\"\n class=\"ml-4\"\n />\n <v-spacer />\n <v-text-field\n v-model=\"gapSampleInterval\"\n label=\"Data Gap Sample Interval\"\n hint=\"QuestDB SAMPLE BY duration (e.g. 5s, 1m, 10m, 1h)\"\n persistent-hint\n density=\"compact\"\n hide-details=\"auto\"\n style=\"max-width: 260px\"\n data-test=\"gap-sample-interval\"\n />\n </v-card-actions>\n\n <div v-if=\"metricsRows.length\">\n <template v-for=\"(section, idx) in sections\" :key=\"section.title\">\n <h3 class=\"text-h6 ml-2\" :class=\"idx === 0 ? 'mt-4' : 'mt-6'\">\n {{ section.title }}\n </h3>\n <v-data-table\n :headers=\"metricsHeaders\"\n :items=\"section.items\"\n :group-by=\"metricsGroupBy\"\n class=\"monospace\"\n :items-per-page=\"50\"\n density=\"compact\"\n >\n <template\n #group-header=\"{ item, columns, toggleGroup, isGroupOpen }\"\n >\n <tr>\n <td :colspan=\"columns.length - 1\">\n <v-btn\n :icon=\"isGroupOpen(item) ? '$expand' : '$next'\"\n size=\"small\"\n variant=\"text\"\n @click=\"toggleGroup(item)\"\n />\n <span class=\"font-weight-bold\">\n {{ item.value }}\n </span>\n <span class=\"ml-4 text-medium-emphasis\">\n Packets: {{ item.items.length }} — Rows:\n {{ groupRowCount(item.items).toLocaleString() }} —\n Disk: {{ formatBytes(groupDiskSize(item.items)) }}\n </span>\n </td>\n <td>\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"group-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Analyze Data Gaps\"\n prepend-icon=\"mdi-chart-timeline-variant-shimmer\"\n data-test=\"group-analyze-gap\"\n @click=\"analyzeGroupDataGap(item.items)\"\n />\n <v-list-item\n title=\"Delete All\"\n prepend-icon=\"mdi-delete\"\n data-test=\"group-delete\"\n @click=\"deleteGroup(item.items)\"\n />\n </v-list>\n </v-menu>\n </td>\n </tr>\n </template>\n <template #item.diskSize=\"{ item }\">\n {{ formatBytes(item.diskSize) }}\n </template>\n <template #item.rowCount=\"{ item }\">\n {{ Number(item.rowCount).toLocaleString() }}\n </template>\n <template #item.actions=\"{ item }\">\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"row-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Analyze Data Gap\"\n prepend-icon=\"mdi-chart-timeline-variant-shimmer\"\n data-test=\"row-analyze-gap\"\n @click=\"analyzeDataGap(item.tableName)\"\n />\n <v-list-item\n title=\"Delete\"\n prepend-icon=\"mdi-delete\"\n data-test=\"row-delete\"\n @click=\"deleteTable(item.tableName)\"\n />\n </v-list>\n </v-menu>\n </template>\n </v-data-table>\n </template>\n </div>\n </v-card>\n\n <!-- Data Gap Analysis Dialog -->\n <v-dialog v-model=\"gapDialog\" max-width=\"900\">\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n Data Gap Analysis: {{ gapDialogTitle }}\n <v-spacer />\n <v-btn icon=\"mdi-close\" variant=\"text\" @click=\"gapDialog = false\" />\n </v-card-title>\n <v-card-text style=\"max-height: 80vh; overflow-y: auto\">\n <v-progress-linear\n v-if=\"gapLoading\"\n :model-value=\"gapProgress\"\n :indeterminate=\"gapProgress === 0\"\n class=\"mb-4\"\n />\n <div v-if=\"gapError\" class=\"text-red monospace mb-4\">\n Error: {{ gapError }}\n </div>\n\n <!-- Single table result -->\n <template v-if=\"!gapLoading && !gapError && gapSummary\">\n <v-table density=\"compact\" class=\"monospace mb-4\">\n <tbody>\n <tr>\n <td class=\"font-weight-bold\">First Record</td>\n <td>{{ gapSummary.firstTs }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Last Record</td>\n <td>{{ gapSummary.lastTs }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Total Time Span</td>\n <td>{{ gapSummary.timeSpan }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Gaps Found</td>\n <td>{{ gapSummary.gaps.length }}</td>\n </tr>\n </tbody>\n </v-table>\n <div v-if=\"gapSummary.gaps.length\">\n <h4 class=\"text-subtitle-1 font-weight-bold mb-2\">\n Data Gaps (periods with no data)\n </h4>\n <v-data-table\n :headers=\"gapHeaders\"\n :items=\"gapSummary.gaps\"\n class=\"monospace\"\n :items-per-page=\"20\"\n density=\"compact\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n v-if=\"isTlmTable(gapDialogTitle)\"\n icon=\"mdi-wrench\"\n size=\"small\"\n variant=\"text\"\n data-test=\"gap-repair\"\n title=\"Repair (reingest raw logs)\"\n @click=\"openRepair(item, gapDialogTitle)\"\n />\n </template>\n </v-data-table>\n </div>\n <div v-else class=\"text-medium-emphasis\">\n No data gaps detected (sampled at {{ gapSampleInterval }}\n intervals).\n </div>\n </template>\n\n <!-- Group results (only tables with gaps) -->\n <template v-if=\"!gapLoading && !gapError && gapGroupResults\">\n <div\n v-if=\"gapGroupResults.withGaps.length === 0\"\n class=\"text-medium-emphasis\"\n >\n No data gaps detected across\n {{ gapGroupResults.totalTables }} tables (sampled at\n {{ gapSampleInterval }} intervals).\n </div>\n <div v-else>\n <div class=\"mb-4 text-medium-emphasis\">\n {{ gapGroupResults.withGaps.length }} of\n {{ gapGroupResults.totalTables }} tables have data gaps.\n </div>\n <div\n v-for=\"result in gapGroupResults.withGaps\"\n :key=\"result.tableName\"\n class=\"mb-6\"\n >\n <h4 class=\"text-subtitle-1 font-weight-bold mb-1\">\n {{ result.packet }}\n </h4>\n <div class=\"text-medium-emphasis monospace mb-2\">\n {{ result.firstTs }} to {{ result.lastTs }} ({{\n result.timeSpan\n }}) — {{ result.gaps.length }} gap(s)\n </div>\n <v-data-table\n :headers=\"gapHeaders\"\n :items=\"result.gaps\"\n class=\"monospace\"\n :items-per-page=\"10\"\n density=\"compact\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n v-if=\"isTlmTable(result.tableName)\"\n icon=\"mdi-wrench\"\n size=\"small\"\n variant=\"text\"\n data-test=\"gap-repair\"\n title=\"Repair (reingest raw logs)\"\n @click=\"openRepair(item, result.tableName)\"\n />\n </template>\n </v-data-table>\n </div>\n </div>\n </template>\n </v-card-text>\n </v-card>\n </v-dialog>\n\n <repair-gap-dialog\n v-if=\"repairContext\"\n v-model=\"repairDialog\"\n :context=\"repairContext\"\n @complete=\"onRepairComplete\"\n />\n </div>\n</template>\n\n<script>\nimport RepairGapDialog from './RepairGapDialog.vue'\nimport { execSql } from './tsdbApi'\n\nexport default {\n components: {\n RepairGapDialog,\n },\n data() {\n return {\n metricsRows: [],\n metricsError: null,\n metricsLoading: false,\n metricsGroupBy: [{ key: 'target', order: 'asc' }],\n metricsHeaders: [\n { title: 'Packet', key: 'packet' },\n { title: 'Table Name', key: 'tableName' },\n { title: 'Partition Count', key: 'partitionCount' },\n { title: 'Row Count', key: 'rowCount' },\n { title: 'Disk Size', key: 'diskSize' },\n { title: 'Actions', key: 'actions', sortable: false },\n ],\n gapDialog: false,\n gapDialogTitle: '',\n gapLoading: false,\n gapProgress: 0,\n gapError: null,\n gapSummary: null,\n gapGroupResults: null,\n gapHeaders: [\n { title: 'Gap Start', key: 'start' },\n { title: 'Gap End', key: 'end' },\n { title: 'Duration', key: 'duration' },\n { title: 'Actions', key: 'actions', sortable: false, width: 80 },\n ],\n repairDialog: false,\n repairContext: null,\n gapSampleInterval: '1m',\n db_shard: '0',\n }\n },\n computed: {\n sections() {\n return [\n {\n title: 'Telemetry',\n items: this.metricsRows.filter((row) => row.type === 'TLM'),\n },\n {\n title: 'Commands',\n items: this.metricsRows.filter((row) => row.type === 'CMD'),\n },\n ]\n },\n },\n mounted() {\n this.fetchMetrics()\n },\n methods: {\n groupRowCount(items) {\n return items.reduce(\n (sum, row) => sum + Number((row.raw || row).rowCount || 0),\n 0,\n )\n },\n groupDiskSize(items) {\n return items.reduce(\n (sum, row) => sum + Number((row.raw || row).diskSize || 0),\n 0,\n )\n },\n formatBytes(bytes) {\n if (bytes === 0) return '0 B'\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n const k = 1024\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n const value = bytes / Math.pow(k, i)\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n },\n fetchMetrics() {\n this.metricsError = null\n this.metricsRows = []\n this.metricsLoading = true\n execSql(\n 'SELECT tableName, partitionCount, rowCount, diskSize FROM table_storage;',\n this.db_shard,\n )\n .then((response) => {\n const cols = response.data.columns\n this.metricsRows = response.data.rows.map((row) => {\n const obj = {}\n cols.forEach((col, i) => {\n obj[col] = row[i]\n })\n const parts = (obj.tableName || '').split('__')\n obj.type = parts[1] || ''\n obj.target = parts[2] || ''\n obj.packet = parts[3] || ''\n return obj\n })\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n .finally(() => {\n this.metricsLoading = false\n })\n },\n dropTable(tableName) {\n return execSql(`DROP TABLE '${tableName}';`, this.db_shard)\n },\n deleteTable(tableName) {\n let target = tableName.split('__')[2] || tableName\n let packet = tableName.split('__')[3] || tableName\n this.$dialog\n .confirm(\n `Are you sure you want to drop table: ${tableName}? This removes ALL decommutated data for ${target} ${packet}!`,\n {\n okText: 'Delete',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.dropTable(tableName)\n .then(() => {\n this.metricsRows = this.metricsRows.filter(\n (row) => row.tableName !== tableName,\n )\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n })\n },\n deleteGroup(items) {\n const tableNames = items.map((item) => (item.raw || item).tableName)\n let target = tableNames[0].split('__')[2]\n this.$dialog\n .confirm(\n `Are you sure you want to drop ${tableNames.length} tables? This removes ALL decommutated data for ${target}!\\n\\n${tableNames.join('\\n')}`,\n {\n okText: 'Delete',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n const nameSet = new Set(tableNames)\n Promise.all(tableNames.map((name) => this.dropTable(name)))\n .then(() => {\n this.metricsRows = this.metricsRows.filter(\n (row) => !nameSet.has(row.tableName),\n )\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n })\n },\n formatDuration(ms) {\n const seconds = Math.floor(ms / 1000)\n const days = Math.floor(seconds / 86400)\n const hours = Math.floor((seconds % 86400) / 3600)\n const minutes = Math.floor((seconds % 3600) / 60)\n const parts = []\n if (days) parts.push(`${days}d`)\n if (hours) parts.push(`${hours}h`)\n if (minutes) parts.push(`${minutes}m`)\n if (!parts.length) parts.push(`${seconds}s`)\n return parts.join(' ')\n },\n formatTimestamp(ts) {\n return new Date(ts).toISOString().replace('T', ' ').replace('.000Z', 'Z')\n },\n // Parse a QuestDB SAMPLE BY duration like \"1m\", \"30s\", \"2h\" into ms.\n // Returns null if malformed.\n parseSampleIntervalMs(input) {\n const match = String(input || '')\n .trim()\n .match(/^(\\d+)\\s*([smhd])$/i)\n if (!match) return null\n const value = Number.parseInt(match[1], 10)\n const multipliers = { s: 1_000, m: 60_000, h: 3_600_000, d: 86_400_000 }\n return value * multipliers[match[2].toLowerCase()]\n },\n async fetchTableGaps(tableName) {\n const interval = (this.gapSampleInterval || '1m').trim()\n const bucketMs = this.parseSampleIntervalMs(interval)\n if (!bucketMs) {\n throw new Error(\n `Invalid sample interval '${interval}'. Use a number followed by s, m, h, or d (e.g. 5s, 1m, 2h).`,\n )\n }\n\n // Get first and last timestamps\n const rangeResp = await execSql(\n `SELECT first(PACKET_TIMESECONDS) as first_ts, last(PACKET_TIMESECONDS) as last_ts FROM '${tableName}';`,\n this.db_shard,\n )\n const rangeCols = rangeResp.data.columns\n const rangeRow = rangeResp.data.rows[0]\n const rangeObj = {}\n rangeCols.forEach((col, i) => {\n rangeObj[col] = rangeRow[i]\n })\n const firstTs = rangeObj.first_ts\n const lastTs = rangeObj.last_ts\n const totalMs = new Date(lastTs) - new Date(firstTs)\n\n // Sample by the user-chosen interval with FILL(NULL) to detect gaps.\n const gapResp = await execSql(\n `(SELECT PACKET_TIMESECONDS, count() as cnt FROM '${tableName}' SAMPLE BY ${interval} FILL(NULL)) WHERE cnt IS NULL`,\n this.db_shard,\n )\n const gapCols = gapResp.data.columns\n const gapRows = gapResp.data.rows.map((row) => {\n const obj = {}\n gapCols.forEach((col, i) => {\n obj[col] = row[i]\n })\n return obj\n })\n\n // Group contiguous null-bucket timestamps into gaps. A delta > bucketMs\n // between consecutive empty buckets means a new gap has started.\n const gaps = []\n const buildGap = (startRaw, endRaw) => {\n const startMs = new Date(startRaw).getTime()\n const endMs = new Date(endRaw).getTime() + bucketMs\n return {\n start: this.formatTimestamp(startRaw),\n end: this.formatTimestamp(new Date(endMs)),\n duration: this.formatDuration(endMs - startMs),\n // ISO strings avoid the JS precision cliff on nsec integers.\n startIso: new Date(startMs).toISOString(),\n endIso: new Date(endMs).toISOString(),\n }\n }\n if (gapRows.length > 0) {\n let gapStart = gapRows[0].PACKET_TIMESECONDS\n let gapEnd = gapStart\n for (let i = 1; i < gapRows.length; i++) {\n const prev = new Date(gapEnd)\n const curr = new Date(gapRows[i].PACKET_TIMESECONDS)\n if (curr - prev > bucketMs) {\n gaps.push(buildGap(gapStart, gapEnd))\n gapStart = gapRows[i].PACKET_TIMESECONDS\n }\n gapEnd = gapRows[i].PACKET_TIMESECONDS\n }\n gaps.push(buildGap(gapStart, gapEnd))\n }\n\n return {\n firstTs: this.formatTimestamp(firstTs),\n lastTs: this.formatTimestamp(lastTs),\n timeSpan: this.formatDuration(totalMs),\n gaps,\n }\n },\n async analyzeDataGap(tableName) {\n this.gapDialogTitle = tableName\n this.gapDialog = true\n this.gapLoading = true\n this.gapProgress = 0\n this.gapError = null\n this.gapSummary = null\n this.gapGroupResults = null\n try {\n this.gapSummary = await this.fetchTableGaps(tableName)\n } catch (error) {\n this.gapError = error.response?.data?.message || error.message\n } finally {\n this.gapLoading = false\n }\n },\n async analyzeGroupDataGap(items) {\n const tableNames = items.map((item) => (item.raw || item).tableName)\n const target = (items[0].raw || items[0]).target\n this.gapDialogTitle = `${target} (${tableNames.length} tables)`\n this.gapDialog = true\n this.gapLoading = true\n this.gapProgress = 0\n this.gapError = null\n this.gapSummary = null\n this.gapGroupResults = null\n try {\n const withGaps = []\n for (let i = 0; i < tableNames.length; i++) {\n this.gapProgress = Math.round(((i + 1) / tableNames.length) * 100)\n try {\n const result = await this.fetchTableGaps(tableNames[i])\n if (result.gaps.length > 0) {\n const parts = tableNames[i].split('__')\n withGaps.push({\n tableName: tableNames[i],\n packet: parts[3] || tableNames[i],\n ...result,\n })\n }\n } catch {\n // Skip tables that error (e.g. empty tables)\n }\n }\n this.gapGroupResults = {\n totalTables: tableNames.length,\n withGaps,\n }\n } catch (error) {\n this.gapError = error.response?.data?.message || error.message\n } finally {\n this.gapLoading = false\n }\n },\n // scope__TLM|CMD__TARGET__PACKET → { scope, cmdOrTlm, target, packet }\n parseTableName(tableName) {\n const parts = tableName.split('__')\n if (parts.length < 4) return null\n return {\n scope: parts[0],\n cmdOrTlm: parts[1],\n target: parts[2],\n packet: parts[3],\n }\n },\n isTlmTable(tableName) {\n const parsed = this.parseTableName(tableName)\n return parsed?.cmdOrTlm === 'TLM'\n },\n openRepair(gap, tableName) {\n const parsed = this.parseTableName(tableName)\n if (!parsed) return\n this.repairContext = {\n tableName,\n ...parsed,\n gap,\n }\n this.repairDialog = true\n },\n onRepairComplete() {\n // Re-run gap analysis on whichever view is currently showing.\n if (this.gapGroupResults) return // group analysis is expensive; let the user re-run manually\n if (this.gapDialogTitle) this.analyzeDataGap(this.gapDialogTitle)\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n</style>\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-card>\n <v-card-title> Send SQL Queries to QuestDB </v-card-title>\n <v-card-subtitle>\n THIS IS DANGEROUS! This allows you to interact directly with the\n underlying QuestDB time series database, making it easy to modify or\n delete data.\n <br /><br />\n Enter SQL queries like:\n <code> SELECT * FROM DEFAULT__TLM__INST__HEALTH_STATUS LIMIT 10 </code>\n or\n <code>SHOW TABLES</code>\n </v-card-subtitle>\n <v-card-text class=\"pb-0 ml-2\">\n <v-textarea\n v-model=\"sqlText\"\n hide-details\n label=\"SQL query\"\n class=\"monospace\"\n rows=\"3\"\n @keydown=\"commandKeydown\"\n />\n <div v-if=\"errorMessage\" class=\"mt-2 text-red monospace\">\n Error: {{ errorMessage }}\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-btn\n :disabled=\"!sqlText.length\"\n :loading=\"loading\"\n color=\"success\"\n variant=\"text\"\n data-test=\"tsdb-execute\"\n @click=\"executeQuery\"\n >\n Execute\n </v-btn>\n <v-text-field\n v-model=\"db_shard\"\n type=\"number\"\n min=\"0\"\n label=\"DB Shard\"\n hide-details\n density=\"compact\"\n style=\"max-width: 100px\"\n class=\"ml-4\"\n />\n </v-card-actions>\n\n <v-data-table\n v-if=\"columns.length\"\n :headers=\"tableHeaders\"\n :items=\"rows\"\n class=\"monospace\"\n :items-per-page=\"50\"\n density=\"compact\"\n >\n </v-data-table>\n </v-card>\n</template>\n\n<script>\nimport { execSql } from './tsdbApi'\n\nexport default {\n data() {\n return {\n sqlText: '',\n db_shard: '0',\n columns: [],\n rows: [],\n errorMessage: null,\n loading: false,\n }\n },\n computed: {\n tableHeaders() {\n return this.columns.map((col) => ({\n title: col,\n key: col,\n }))\n },\n },\n methods: {\n commandKeydown($event) {\n if (($event.metaKey || $event.ctrlKey) && $event.key === 'Enter') {\n this.executeQuery()\n }\n },\n executeQuery() {\n this.errorMessage = null\n this.columns = []\n this.rows = []\n this.loading = true\n execSql(this.sqlText, this.db_shard)\n .then((response) => {\n this.columns = response.data.columns\n this.rows = response.data.rows.map((row) => {\n const obj = {}\n this.columns.forEach((col, i) => {\n obj[col] = row[i]\n })\n return obj\n })\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.errorMessage = error.response.data.message\n } else {\n this.errorMessage = error.message\n }\n })\n .finally(() => {\n this.loading = false\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n</style>\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-tabs v-model=\"activeTab\">\n <v-tab value=\"metrics\" data-test=\"tsdb-metrics-tab\">Metrics</v-tab>\n <v-tab value=\"queries\" data-test=\"tsdb-queries-tab\">Queries</v-tab>\n </v-tabs>\n <v-window v-model=\"activeTab\">\n <v-window-item value=\"metrics\">\n <tsdb-metrics />\n </v-window-item>\n <v-window-item value=\"queries\">\n <tsdb-queries />\n </v-window-item>\n </v-window>\n </div>\n</template>\n\n<script>\nimport TsdbMetrics from './tsdb/TsdbMetrics.vue'\nimport TsdbQueries from './tsdb/TsdbQueries.vue'\n\nexport default {\n components: {\n TsdbMetrics,\n TsdbQueries,\n },\n data() {\n return {\n activeTab: 'metrics',\n }\n },\n}\n</script>\n"],"names":["PHASE_LABELS","_sfc_main","phase","remaining","enabledAt","cooldown","nowSec","enabledSec","open","completed","response","Api","c","error","filenames","key","_hoisted_4","_hoisted_5","_hoisted_9","_hoisted_11","_createBlock","_component_v_dialog","$props","_createVNode","_component_v_card","_component_v_card_title","_toDisplayString","_component_v_card_subtitle","_component_v_card_text","$data","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_component_v_table","_createElementVNode","_cache","$options","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_10","w","idx","_component_v_progress_linear","_hoisted_2","_component_v_progress_circular","_hoisted_3","_component_v_data_table","$event","_component_v_radio_group","_component_v_radio","_component_v_card_actions","_component_v_spacer","_component_v_btn","execSql","sql","db_shard","retries","attempt","url","msg","r","RepairGapDialog","row","items","sum","bytes","units","k","i","cols","obj","col","parts","tableName","target","packet","tableNames","item","nameSet","name","ms","seconds","days","hours","minutes","ts","input","match","interval","bucketMs","rangeResp","rangeCols","rangeRow","rangeObj","firstTs","lastTs","totalMs","gapResp","gapCols","gapRows","gaps","buildGap","startRaw","endRaw","startMs","endMs","gapStart","gapEnd","prev","withGaps","result","gap","parsed","_hoisted_12","_hoisted_13","_component_v_text_field","_renderList","section","_normalizeClass","_withCtx","columns","toggleGroup","isGroupOpen","_component_v_menu","props","_component_v_icon","_mergeProps","_component_v_list","_component_v_list_item","_createTextVNode","_component_repair_gap_dialog","_component_v_textarea","TsdbMetrics","TsdbQueries","_component_v_tabs","_component_v_tab","_component_v_window","_component_v_window_item","_component_tsdb_metrics","_component_tsdb_queries"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("./format-qjtPogBb.cjs"),e=require("vue"),T=require("./CustomIcon-8F08upeg.cjs"),M={downloading:"Downloading files…",enabling_dedup:"Enabling DEDUP…",ingesting:"Ingesting packets…",dedup_cooldown:"Waiting for DEDUP cooldown…",disabling_dedup:"Disabling DEDUP…"},L={props:{modelValue:{type:Boolean,default:!1},context:{type:Object,required:!0}},emits:["update:modelValue","complete"],data(){return{loadingCandidates:!1,candidates:[],selectedKeys:[],targetVersion:"as_logged",bucketEnv:null,path:null,candidateHeaders:[{title:"File",key:"filename"},{title:"Key",key:"key"}],jobId:null,jobStatus:null,pollHandle:null,errorMessage:null,confirmCloseOpen:!1}},computed:{isRunning(){return this.jobStatus?["Queued","Running"].includes(this.jobStatus.state):!1},phaseLabel(){const s=this.jobStatus?.progress_phase;if(!s)return this.jobStatus?.state||"";if(s==="dedup_cooldown"){const t=this.cooldownRemaining;if(t!=null)return`Waiting for DEDUP cooldown (${t}s)…`}return M[s]||s},cooldownRemaining(){const s=this.jobStatus?.dedup_enabled_at,t=this.jobStatus?.dedup_cooldown_seconds;if(!s||!t)return null;const n=Date.now()/1e3,a=new Date(s).getTime()/1e3,o=Math.round(a+t-n);return Math.max(o,0)},progressPercent(){const s=this.jobStatus;return s?s.state==="Complete"?100:!s.progress_total||s.progress_total===0?0:Math.round(s.progress_current/s.progress_total*100):0}},watch:{modelValue(s){s&&this.fetchCandidates()}},mounted(){this.modelValue&&this.fetchCandidates()},beforeUnmount(){this.stopPolling()},methods:{close(){this.stopPolling();const s=this.jobStatus?.state==="Complete";this.resetState(),this.$emit("update:modelValue",!1),s&&this.$emit("complete")},attemptClose(){this.isRunning?this.confirmCloseOpen=!0:this.close()},confirmClose(){this.confirmCloseOpen=!1,this.close()},resetState(){this.candidates=[],this.selectedKeys=[],this.targetVersion="as_logged",this.bucketEnv=null,this.path=null,this.jobId=null,this.jobStatus=null,this.errorMessage=null,this.loadingCandidates=!1,this.confirmCloseOpen=!1},async fetchCandidates(){this.resetState(),this.loadingCandidates=!0;try{const s=await S.Br.get("/openc3-api/storage/repair_candidates",{params:{scope:this.context.scope,target:this.context.target,packet:this.context.packet,cmd_or_tlm:this.context.cmdOrTlm,start_time:this.context.gap.startIso,end_time:this.context.gap.endIso}});this.candidates=s.data.files||[],this.bucketEnv=s.data.bucket,this.path=s.data.path,this.selectedKeys=this.candidates.map(t=>t.key)}catch(s){this.errorMessage=s.response?.data?.message||s.message}finally{this.loadingCandidates=!1}},async startReingest(){this.errorMessage=null;const s=this.selectedKeys.map(t=>this.path&&t.startsWith(this.path)?t.slice(this.path.length):t.split("/").pop());try{const t=await S.Br.post("/openc3-api/storage/reingest",{data:{scope:this.context.scope,bucket:this.bucketEnv,path:this.path,files:s,target_version:this.targetVersion}});this.jobId=t.data.job_id,this.jobStatus={state:t.data.state},this.startPolling()}catch(t){this.errorMessage=t.response?.data?.message||t.message}},startPolling(){this.stopPolling(),this.pollHandle=setInterval(this.pollStatus,2e3),this.pollStatus()},stopPolling(){this.pollHandle&&(clearInterval(this.pollHandle),this.pollHandle=null)},async pollStatus(){if(this.jobId)try{const s=await S.Br.get(`/openc3-api/storage/reingest/${this.jobId}`,{params:{scope:this.context.scope}});this.jobStatus=s.data,this.isRunning||this.stopPolling()}catch(s){this.errorMessage=s.response?.data?.message||s.message,this.stopPolling()}}}},I={key:0,class:"text-red monospace mb-4"},j={key:0,class:"d-flex align-center mb-4"},G={key:0,class:"text-medium-emphasis"},P={class:"mb-2"},A={class:"mt-4"},O={key:0},z={key:1},K={key:2},U={class:"text-red"},F={key:3},H={class:"text-orange"};function q(s,t,n,a,o,l){const d=e.resolveComponent("v-card-title"),h=e.resolveComponent("v-card-subtitle"),g=e.resolveComponent("v-progress-circular"),C=e.resolveComponent("v-data-table"),_=e.resolveComponent("v-radio"),w=e.resolveComponent("v-radio-group"),m=e.resolveComponent("v-table"),v=e.resolveComponent("v-progress-linear"),b=e.resolveComponent("v-card-text"),i=e.resolveComponent("v-spacer"),c=e.resolveComponent("v-btn"),p=e.resolveComponent("v-card-actions"),f=e.resolveComponent("v-card"),V=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(V,{"model-value":n.modelValue,"max-width":"900",persistent:""},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(d,{class:"d-flex align-center"},{default:e.withCtx(()=>[e.createTextVNode(" Repair Gap: "+e.toDisplayString(n.context.target)+" "+e.toDisplayString(n.context.packet),1)]),_:1}),n.context.gap?(e.openBlock(),e.createBlock(h,{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.context.gap.start)+" — "+e.toDisplayString(n.context.gap.end)+" ("+e.toDisplayString(n.context.gap.duration)+") ",1)]),_:1})):e.createCommentVNode("",!0),e.createVNode(b,{style:{"max-height":"75vh","overflow-y":"auto"}},{default:e.withCtx(()=>[o.errorMessage?(e.openBlock(),e.createElementBlock("div",I," Error: "+e.toDisplayString(o.errorMessage),1)):e.createCommentVNode("",!0),o.jobId?o.jobStatus?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createVNode(m,{density:"compact",class:"monospace mb-4"},{default:e.withCtx(()=>[e.createElementVNode("tbody",null,[e.createElementVNode("tr",null,[t[8]||(t[8]=e.createElementVNode("td",{class:"font-weight-bold"},"Job",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobId),1)]),e.createElementVNode("tr",null,[t[9]||(t[9]=e.createElementVNode("td",{class:"font-weight-bold"},"State",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.state),1)]),e.createElementVNode("tr",null,[t[10]||(t[10]=e.createElementVNode("td",{class:"font-weight-bold"},"Phase",-1)),e.createElementVNode("td",null,e.toDisplayString(l.phaseLabel),1)]),o.jobStatus.target_version?(e.openBlock(),e.createElementBlock("tr",O,[t[11]||(t[11]=e.createElementVNode("td",{class:"font-weight-bold"},"Target Version",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.target_version),1)])):e.createCommentVNode("",!0),o.jobStatus.packets_written!==void 0?(e.openBlock(),e.createElementBlock("tr",z,[t[12]||(t[12]=e.createElementVNode("td",{class:"font-weight-bold"},"Packets Written",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.packets_written.toLocaleString()),1)])):e.createCommentVNode("",!0),o.jobStatus.error?(e.openBlock(),e.createElementBlock("tr",K,[t[13]||(t[13]=e.createElementVNode("td",{class:"font-weight-bold text-red"},"Error",-1)),e.createElementVNode("td",U,e.toDisplayString(o.jobStatus.error),1)])):e.createCommentVNode("",!0),o.jobStatus.warnings&&o.jobStatus.warnings.length?(e.openBlock(),e.createElementBlock("tr",F,[t[14]||(t[14]=e.createElementVNode("td",{class:"font-weight-bold text-orange"},"Warnings",-1)),e.createElementVNode("td",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.jobStatus.warnings,(y,D)=>(e.openBlock(),e.createElementBlock("div",{key:D},e.toDisplayString(y),1))),128))])])):e.createCommentVNode("",!0)])]),_:1}),e.createVNode(v,{"model-value":l.progressPercent,indeterminate:l.progressPercent===0&&l.isRunning,class:"mb-2"},null,8,["model-value","indeterminate"])],64)):e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[o.loadingCandidates?(e.openBlock(),e.createElementBlock("div",j,[e.createVNode(g,{indeterminate:"",size:"24",class:"mr-3"}),t[4]||(t[4]=e.createTextVNode(" Searching bucket for raw log files that cover this gap… ",-1))])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[o.candidates.length===0?(e.openBlock(),e.createElementBlock("div",G," No raw log files cover this gap window. Reingest is not available — the data may have been written from a source that skipped raw logging, or the logs have been deleted. ")):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",P,e.toDisplayString(o.candidates.length)+" raw log file(s) overlap this window. Select which to reingest: ",1),e.createVNode(C,{modelValue:o.selectedKeys,"onUpdate:modelValue":t[0]||(t[0]=y=>o.selectedKeys=y),headers:o.candidateHeaders,items:o.candidates,"item-value":"key","show-select":"",class:"monospace","items-per-page":20,density:"compact","data-test":"repair-candidates"},null,8,["modelValue","headers","items"]),e.createElementVNode("div",A,[t[7]||(t[7]=e.createElementVNode("div",{class:"text-subtitle-2 font-weight-bold mb-1"}," Target Definition Version ",-1)),e.createVNode(w,{modelValue:o.targetVersion,"onUpdate:modelValue":t[1]||(t[1]=y=>o.targetVersion=y),"hide-details":"",density:"compact","data-test":"repair-version"},{default:e.withCtx(()=>[e.createVNode(_,{value:"as_logged","data-test":"repair-version-as-logged"},{label:e.withCtx(()=>[...t[5]||(t[5]=[e.createElementVNode("div",{style:{"padding-left":"10px"}},[e.createElementVNode("div",null,"As logged (default)"),e.createElementVNode("div",{class:"text-caption text-medium-emphasis"}," Decode each file with the cmd/tlm definition that was in effect when the data was originally logged. Safest for historical fidelity — preserves packet layouts as they existed at that time. "),e.createElementVNode("div",{class:"text-caption text-medium-emphasis mt-1"}," If an item's type has changed since the log was written (e.g. STRING → FLOAT), QuestDB column types are kept as-is; historical values are cast to fit the current column, and any values that can't cast are stored as NULL. ")],-1)])]),_:1}),e.createVNode(_,{value:"current","data-test":"repair-version-current"},{label:e.withCtx(()=>[...t[6]||(t[6]=[e.createElementVNode("div",{style:{"padding-left":"10px"}},[e.createElementVNode("div",null,"Current"),e.createElementVNode("div",{class:"text-caption text-medium-emphasis"}," Decode all files with the latest cmd/tlm definition. Choose this when the historical definition had a bug that you've since fixed, and you want the reingested data decoded with the corrected layout. ")],-1)])]),_:1})]),_:1},8,["modelValue"])])],64))],64))],64))]),_:1}),e.createVNode(p,{class:"px-4 pb-4"},{default:e.withCtx(()=>[e.createVNode(i),o.jobId?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(c,{key:0,color:"warning",variant:"elevated",disabled:o.loadingCandidates||o.candidates.length===0||o.selectedKeys.length===0,"data-test":"repair-reingest",onClick:l.startReingest},{default:e.withCtx(()=>[e.createTextVNode(" Reingest "+e.toDisplayString(o.selectedKeys.length),1)]),_:1},8,["disabled","onClick"])),e.createVNode(c,{variant:"text","data-test":"repair-close",onClick:l.attemptClose},{default:e.withCtx(()=>[...t[15]||(t[15]=[e.createTextVNode(" Close ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1}),e.createVNode(V,{modelValue:o.confirmCloseOpen,"onUpdate:modelValue":t[3]||(t[3]=y=>o.confirmCloseOpen=y),"max-width":"500",persistent:""},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(d,null,{default:e.withCtx(()=>[...t[16]||(t[16]=[e.createTextVNode("Reingest Still Running",-1)])]),_:1}),e.createVNode(b,null,{default:e.withCtx(()=>[...t[17]||(t[17]=[e.createTextVNode(" The reingest job is still in progress. Closing this dialog will not stop the job, but you will lose visibility into its status. Are you sure you want to close? ",-1)])]),_:1}),e.createVNode(p,{class:"px-4 pb-4"},{default:e.withCtx(()=>[e.createVNode(i),e.createVNode(c,{variant:"text","data-test":"repair-close-cancel",onClick:t[2]||(t[2]=y=>o.confirmCloseOpen=!1)},{default:e.withCtx(()=>[...t[18]||(t[18]=[e.createTextVNode(" Keep Watching ",-1)])]),_:1}),e.createVNode(c,{color:"warning",variant:"elevated","data-test":"repair-close-confirm",onClick:l.confirmClose},{default:e.withCtx(()=>[...t[19]||(t[19]=[e.createTextVNode(" Close Anyway ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["model-value"])}const Q=T._export_sfc(L,[["render",q],["__scopeId","data-v-2ab87eb9"]]);async function x(s,t,n=3){for(let a=1;a<=n;a++)try{let o="/openc3-api/tsdb/exec";return t&&t!=="0"&&(o+=`?db_shard=${t}`),await S.Br.post(o,{data:s,headers:{Accept:"application/json","Content-Type":"text/plain"}})}catch(o){const l=o.response?.data?.message||o.message||"";if((l.includes("PQconsumeInput")||l.includes("server closed the connection"))&&a<n){await new Promise(h=>setTimeout(h,1e3*a));continue}throw o}}const W={components:{RepairGapDialog:Q},data(){return{metricsRows:[],metricsError:null,metricsLoading:!1,metricsGroupBy:[{key:"target",order:"asc"}],metricsHeaders:[{title:"Packet",key:"packet"},{title:"Table Name",key:"tableName"},{title:"Partition Count",key:"partitionCount"},{title:"Row Count",key:"rowCount"},{title:"Disk Size",key:"diskSize"},{title:"Actions",key:"actions",sortable:!1}],gapDialog:!1,gapDialogTitle:"",gapLoading:!1,gapProgress:0,gapError:null,gapSummary:null,gapGroupResults:null,gapHeaders:[{title:"Gap Start",key:"start"},{title:"Gap End",key:"end"},{title:"Duration",key:"duration"},{title:"Actions",key:"actions",sortable:!1,width:80}],repairDialog:!1,repairContext:null,gapSampleInterval:"1m",db_shard:"0"}},computed:{sections(){return[{title:"Telemetry",items:this.metricsRows.filter(s=>s.type==="TLM")},{title:"Commands",items:this.metricsRows.filter(s=>s.type==="CMD")}]}},mounted(){this.fetchMetrics()},methods:{groupRowCount(s){return s.reduce((t,n)=>t+Number((n.raw||n).rowCount||0),0)},groupDiskSize(s){return s.reduce((t,n)=>t+Number((n.raw||n).diskSize||0),0)},formatBytes(s){if(s===0)return"0 B";const t=["B","KB","MB","GB","TB"],n=1024,a=Math.floor(Math.log(s)/Math.log(n));return`${(s/Math.pow(n,a)).toFixed(a===0?0:1)} ${t[a]}`},fetchMetrics(){this.metricsError=null,this.metricsRows=[],this.metricsLoading=!0,x("SELECT tableName, partitionCount, rowCount, diskSize FROM table_storage;",this.db_shard).then(s=>{const t=s.data.columns;this.metricsRows=s.data.rows.map(n=>{const a={};t.forEach((l,d)=>{a[l]=n[d]});const o=(a.tableName||"").split("__");return a.type=o[1]||"",a.target=o[2]||"",a.packet=o[3]||"",a})}).catch(s=>{s.response&&s.response.data?this.metricsError=s.response.data.message:this.metricsError=s.message}).finally(()=>{this.metricsLoading=!1})},dropTable(s){return x(`DROP TABLE '${s}';`,this.db_shard)},deleteTable(s){let t=s.split("__")[2]||s,n=s.split("__")[3]||s;this.$dialog.confirm(`Are you sure you want to drop table: ${s}? This removes ALL decommutated data for ${t} ${n}!`,{okText:"Delete",cancelText:"Cancel"}).then(()=>{this.dropTable(s).then(()=>{this.metricsRows=this.metricsRows.filter(a=>a.tableName!==s)}).catch(a=>{a.response&&a.response.data?this.metricsError=a.response.data.message:this.metricsError=a.message})})},deleteGroup(s){const t=s.map(a=>(a.raw||a).tableName);let n=t[0].split("__")[2];this.$dialog.confirm(`Are you sure you want to drop ${t.length} tables? This removes ALL decommutated data for ${n}!
|
|
2
|
+
|
|
3
|
+
${t.join(`
|
|
4
|
+
`)}`,{okText:"Delete",cancelText:"Cancel"}).then(()=>{const a=new Set(t);Promise.all(t.map(o=>this.dropTable(o))).then(()=>{this.metricsRows=this.metricsRows.filter(o=>!a.has(o.tableName))}).catch(o=>{o.response&&o.response.data?this.metricsError=o.response.data.message:this.metricsError=o.message})})},formatDuration(s){const t=Math.floor(s/1e3),n=Math.floor(t/86400),a=Math.floor(t%86400/3600),o=Math.floor(t%3600/60),l=[];return n&&l.push(`${n}d`),a&&l.push(`${a}h`),o&&l.push(`${o}m`),l.length||l.push(`${t}s`),l.join(" ")},formatTimestamp(s){return new Date(s).toISOString().replace("T"," ").replace(".000Z","Z")},parseSampleIntervalMs(s){const t=String(s||"").trim().match(/^(\d+)\s*([smhd])$/i);return t?Number.parseInt(t[1],10)*{s:1e3,m:6e4,h:36e5,d:864e5}[t[2].toLowerCase()]:null},async fetchTableGaps(s){const t=(this.gapSampleInterval||"1m").trim(),n=this.parseSampleIntervalMs(t);if(!n)throw new Error(`Invalid sample interval '${t}'. Use a number followed by s, m, h, or d (e.g. 5s, 1m, 2h).`);const a=await x(`SELECT first(PACKET_TIMESECONDS) as first_ts, last(PACKET_TIMESECONDS) as last_ts FROM '${s}';`,this.db_shard),o=a.data.columns,l=a.data.rows[0],d={};o.forEach((i,c)=>{d[i]=l[c]});const h=d.first_ts,g=d.last_ts,C=new Date(g)-new Date(h),_=await x(`(SELECT PACKET_TIMESECONDS, count() as cnt FROM '${s}' SAMPLE BY ${t} FILL(NULL)) WHERE cnt IS NULL`,this.db_shard),w=_.data.columns,m=_.data.rows.map(i=>{const c={};return w.forEach((p,f)=>{c[p]=i[f]}),c}),v=[],b=(i,c)=>{const p=new Date(i).getTime(),f=new Date(c).getTime()+n;return{start:this.formatTimestamp(i),end:this.formatTimestamp(new Date(f)),duration:this.formatDuration(f-p),startIso:new Date(p).toISOString(),endIso:new Date(f).toISOString()}};if(m.length>0){let i=m[0].PACKET_TIMESECONDS,c=i;for(let p=1;p<m.length;p++){const f=new Date(c);new Date(m[p].PACKET_TIMESECONDS)-f>n&&(v.push(b(i,c)),i=m[p].PACKET_TIMESECONDS),c=m[p].PACKET_TIMESECONDS}v.push(b(i,c))}return{firstTs:this.formatTimestamp(h),lastTs:this.formatTimestamp(g),timeSpan:this.formatDuration(C),gaps:v}},async analyzeDataGap(s){this.gapDialogTitle=s,this.gapDialog=!0,this.gapLoading=!0,this.gapProgress=0,this.gapError=null,this.gapSummary=null,this.gapGroupResults=null;try{this.gapSummary=await this.fetchTableGaps(s)}catch(t){this.gapError=t.response?.data?.message||t.message}finally{this.gapLoading=!1}},async analyzeGroupDataGap(s){const t=s.map(a=>(a.raw||a).tableName),n=(s[0].raw||s[0]).target;this.gapDialogTitle=`${n} (${t.length} tables)`,this.gapDialog=!0,this.gapLoading=!0,this.gapProgress=0,this.gapError=null,this.gapSummary=null,this.gapGroupResults=null;try{const a=[];for(let o=0;o<t.length;o++){this.gapProgress=Math.round((o+1)/t.length*100);try{const l=await this.fetchTableGaps(t[o]);if(l.gaps.length>0){const d=t[o].split("__");a.push({tableName:t[o],packet:d[3]||t[o],...l})}}catch{}}this.gapGroupResults={totalTables:t.length,withGaps:a}}catch(a){this.gapError=a.response?.data?.message||a.message}finally{this.gapLoading=!1}},parseTableName(s){const t=s.split("__");return t.length<4?null:{scope:t[0],cmdOrTlm:t[1],target:t[2],packet:t[3]}},isTlmTable(s){return this.parseTableName(s)?.cmdOrTlm==="TLM"},openRepair(s,t){const n=this.parseTableName(t);n&&(this.repairContext={tableName:t,...n,gap:s},this.repairDialog=!0)},onRepairComplete(){this.gapGroupResults||this.gapDialogTitle&&this.analyzeDataGap(this.gapDialogTitle)}}},Y={key:0,class:"mt-2 text-red monospace"},Z={key:0},J=["colspan"],X={class:"font-weight-bold"},$={class:"ml-4 text-medium-emphasis"},ee={key:1,class:"text-red monospace mb-4"},te={key:0},oe={key:1,class:"text-medium-emphasis"},se={key:0,class:"text-medium-emphasis"},ae={key:1},ne={class:"mb-4 text-medium-emphasis"},le={class:"text-subtitle-1 font-weight-bold mb-1"},re={class:"text-medium-emphasis monospace mb-2"};function ie(s,t,n,a,o,l){const d=e.resolveComponent("v-card-title"),h=e.resolveComponent("v-card-text"),g=e.resolveComponent("v-btn"),C=e.resolveComponent("v-text-field"),_=e.resolveComponent("v-spacer"),w=e.resolveComponent("v-card-actions"),m=e.resolveComponent("v-icon"),v=e.resolveComponent("v-list-item"),b=e.resolveComponent("v-list"),i=e.resolveComponent("v-menu"),c=e.resolveComponent("v-data-table"),p=e.resolveComponent("v-card"),f=e.resolveComponent("v-progress-linear"),V=e.resolveComponent("v-table"),y=e.resolveComponent("v-dialog"),D=e.resolveComponent("repair-gap-dialog");return e.openBlock(),e.createElementBlock("div",null,[e.createVNode(p,null,{default:e.withCtx(()=>[e.createVNode(d,null,{default:e.withCtx(()=>[...t[5]||(t[5]=[e.createTextVNode(" QuestDB Table Storage Metrics ",-1)])]),_:1}),e.createVNode(h,null,{default:e.withCtx(()=>[o.metricsError?(e.openBlock(),e.createElementBlock("div",Y," Error: "+e.toDisplayString(o.metricsError),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(w,{class:"px-2"},{default:e.withCtx(()=>[e.createVNode(g,{loading:o.metricsLoading,color:"success",variant:"text","data-test":"tsdb-metrics-refresh",onClick:l.fetchMetrics},{default:e.withCtx(()=>[...t[6]||(t[6]=[e.createTextVNode(" Refresh ",-1)])]),_:1},8,["loading","onClick"]),e.createVNode(C,{modelValue:o.db_shard,"onUpdate:modelValue":t[0]||(t[0]=r=>o.db_shard=r),type:"number",min:"0",label:"DB Shard",hint:"DB Shard is N/A in Core","hide-details":"",density:"compact",style:{"max-width":"100px"},class:"ml-4"},null,8,["modelValue"]),e.createVNode(_),e.createVNode(C,{modelValue:o.gapSampleInterval,"onUpdate:modelValue":t[1]||(t[1]=r=>o.gapSampleInterval=r),label:"Data Gap Sample Interval",hint:"QuestDB SAMPLE BY duration (e.g. 5s, 1m, 10m, 1h)","persistent-hint":"",density:"compact","hide-details":"auto",style:{"max-width":"260px"},"data-test":"gap-sample-interval"},null,8,["modelValue"])]),_:1}),o.metricsRows.length?(e.openBlock(),e.createElementBlock("div",Z,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.sections,(r,k)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:r.title},[e.createElementVNode("h3",{class:e.normalizeClass(["text-h6 ml-2",k===0?"mt-4":"mt-6"])},e.toDisplayString(r.title),3),e.createVNode(c,{headers:o.metricsHeaders,items:r.items,"group-by":o.metricsGroupBy,class:"monospace","items-per-page":50,density:"compact"},{"group-header":e.withCtx(({item:u,columns:N,toggleGroup:B,isGroupOpen:R})=>[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:N.length-1},[e.createVNode(g,{icon:R(u)?"$expand":"$next",size:"small",variant:"text",onClick:E=>B(u)},null,8,["icon","onClick"]),e.createElementVNode("span",X,e.toDisplayString(u.value),1),e.createElementVNode("span",$," Packets: "+e.toDisplayString(u.items.length)+" — Rows: "+e.toDisplayString(l.groupRowCount(u.items).toLocaleString())+" — Disk: "+e.toDisplayString(l.formatBytes(l.groupDiskSize(u.items))),1)],8,J),e.createElementVNode("td",null,[e.createVNode(i,null,{activator:e.withCtx(({props:E})=>[e.createVNode(m,e.mergeProps({ref_for:!0},E,{icon:"mdi-dots-horizontal","data-test":"group-actions"}),null,16)]),default:e.withCtx(()=>[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(v,{title:"Analyze Data Gaps","prepend-icon":"mdi-chart-timeline-variant-shimmer","data-test":"group-analyze-gap",onClick:E=>l.analyzeGroupDataGap(u.items)},null,8,["onClick"]),e.createVNode(v,{title:"Delete All","prepend-icon":"mdi-delete","data-test":"group-delete",onClick:E=>l.deleteGroup(u.items)},null,8,["onClick"])]),_:2},1024)]),_:2},1024)])])]),"item.diskSize":e.withCtx(({item:u})=>[e.createTextVNode(e.toDisplayString(l.formatBytes(u.diskSize)),1)]),"item.rowCount":e.withCtx(({item:u})=>[e.createTextVNode(e.toDisplayString(Number(u.rowCount).toLocaleString()),1)]),"item.actions":e.withCtx(({item:u})=>[e.createVNode(i,null,{activator:e.withCtx(({props:N})=>[e.createVNode(m,e.mergeProps({ref_for:!0},N,{icon:"mdi-dots-horizontal","data-test":"row-actions"}),null,16)]),default:e.withCtx(()=>[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(v,{title:"Analyze Data Gap","prepend-icon":"mdi-chart-timeline-variant-shimmer","data-test":"row-analyze-gap",onClick:N=>l.analyzeDataGap(u.tableName)},null,8,["onClick"]),e.createVNode(v,{title:"Delete","prepend-icon":"mdi-delete","data-test":"row-delete",onClick:N=>l.deleteTable(u.tableName)},null,8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:1},8,["headers","items","group-by"])],64))),128))])):e.createCommentVNode("",!0)]),_:1}),e.createVNode(y,{modelValue:o.gapDialog,"onUpdate:modelValue":t[3]||(t[3]=r=>o.gapDialog=r),"max-width":"900"},{default:e.withCtx(()=>[e.createVNode(p,null,{default:e.withCtx(()=>[e.createVNode(d,{class:"d-flex align-center"},{default:e.withCtx(()=>[e.createTextVNode(" Data Gap Analysis: "+e.toDisplayString(o.gapDialogTitle)+" ",1),e.createVNode(_),e.createVNode(g,{icon:"mdi-close",variant:"text",onClick:t[2]||(t[2]=r=>o.gapDialog=!1)})]),_:1}),e.createVNode(h,{style:{"max-height":"80vh","overflow-y":"auto"}},{default:e.withCtx(()=>[o.gapLoading?(e.openBlock(),e.createBlock(f,{key:0,"model-value":o.gapProgress,indeterminate:o.gapProgress===0,class:"mb-4"},null,8,["model-value","indeterminate"])):e.createCommentVNode("",!0),o.gapError?(e.openBlock(),e.createElementBlock("div",ee," Error: "+e.toDisplayString(o.gapError),1)):e.createCommentVNode("",!0),!o.gapLoading&&!o.gapError&&o.gapSummary?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createVNode(V,{density:"compact",class:"monospace mb-4"},{default:e.withCtx(()=>[e.createElementVNode("tbody",null,[e.createElementVNode("tr",null,[t[7]||(t[7]=e.createElementVNode("td",{class:"font-weight-bold"},"First Record",-1)),e.createElementVNode("td",null,e.toDisplayString(o.gapSummary.firstTs),1)]),e.createElementVNode("tr",null,[t[8]||(t[8]=e.createElementVNode("td",{class:"font-weight-bold"},"Last Record",-1)),e.createElementVNode("td",null,e.toDisplayString(o.gapSummary.lastTs),1)]),e.createElementVNode("tr",null,[t[9]||(t[9]=e.createElementVNode("td",{class:"font-weight-bold"},"Total Time Span",-1)),e.createElementVNode("td",null,e.toDisplayString(o.gapSummary.timeSpan),1)]),e.createElementVNode("tr",null,[t[10]||(t[10]=e.createElementVNode("td",{class:"font-weight-bold"},"Gaps Found",-1)),e.createElementVNode("td",null,e.toDisplayString(o.gapSummary.gaps.length),1)])])]),_:1}),o.gapSummary.gaps.length?(e.openBlock(),e.createElementBlock("div",te,[t[11]||(t[11]=e.createElementVNode("h4",{class:"text-subtitle-1 font-weight-bold mb-2"}," Data Gaps (periods with no data) ",-1)),e.createVNode(c,{headers:o.gapHeaders,items:o.gapSummary.gaps,class:"monospace","items-per-page":20,density:"compact"},{"item.actions":e.withCtx(({item:r})=>[l.isTlmTable(o.gapDialogTitle)?(e.openBlock(),e.createBlock(g,{key:0,icon:"mdi-wrench",size:"small",variant:"text","data-test":"gap-repair",title:"Repair (reingest raw logs)",onClick:k=>l.openRepair(r,o.gapDialogTitle)},null,8,["onClick"])):e.createCommentVNode("",!0)]),_:1},8,["headers","items"])])):(e.openBlock(),e.createElementBlock("div",oe," No data gaps detected (sampled at "+e.toDisplayString(o.gapSampleInterval)+" intervals). ",1))],64)):e.createCommentVNode("",!0),!o.gapLoading&&!o.gapError&&o.gapGroupResults?(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[o.gapGroupResults.withGaps.length===0?(e.openBlock(),e.createElementBlock("div",se," No data gaps detected across "+e.toDisplayString(o.gapGroupResults.totalTables)+" tables (sampled at "+e.toDisplayString(o.gapSampleInterval)+" intervals). ",1)):(e.openBlock(),e.createElementBlock("div",ae,[e.createElementVNode("div",ne,e.toDisplayString(o.gapGroupResults.withGaps.length)+" of "+e.toDisplayString(o.gapGroupResults.totalTables)+" tables have data gaps. ",1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.gapGroupResults.withGaps,r=>(e.openBlock(),e.createElementBlock("div",{key:r.tableName,class:"mb-6"},[e.createElementVNode("h4",le,e.toDisplayString(r.packet),1),e.createElementVNode("div",re,e.toDisplayString(r.firstTs)+" to "+e.toDisplayString(r.lastTs)+" ("+e.toDisplayString(r.timeSpan)+") — "+e.toDisplayString(r.gaps.length)+" gap(s) ",1),e.createVNode(c,{headers:o.gapHeaders,items:r.gaps,class:"monospace","items-per-page":10,density:"compact"},{"item.actions":e.withCtx(({item:k})=>[l.isTlmTable(r.tableName)?(e.openBlock(),e.createBlock(g,{key:0,icon:"mdi-wrench",size:"small",variant:"text","data-test":"gap-repair",title:"Repair (reingest raw logs)",onClick:u=>l.openRepair(k,r.tableName)},null,8,["onClick"])):e.createCommentVNode("",!0)]),_:2},1032,["headers","items"])]))),128))]))],64)):e.createCommentVNode("",!0)]),_:1})]),_:1})]),_:1},8,["modelValue"]),o.repairContext?(e.openBlock(),e.createBlock(D,{key:0,modelValue:o.repairDialog,"onUpdate:modelValue":t[4]||(t[4]=r=>o.repairDialog=r),context:o.repairContext,onComplete:l.onRepairComplete},null,8,["modelValue","context","onComplete"])):e.createCommentVNode("",!0)])}const ce=T._export_sfc(W,[["render",ie],["__scopeId","data-v-25188e19"]]),de={data(){return{sqlText:"",db_shard:"0",columns:[],rows:[],errorMessage:null,loading:!1}},computed:{tableHeaders(){return this.columns.map(s=>({title:s,key:s}))}},methods:{commandKeydown(s){(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&this.executeQuery()},executeQuery(){this.errorMessage=null,this.columns=[],this.rows=[],this.loading=!0,x(this.sqlText,this.db_shard).then(s=>{this.columns=s.data.columns,this.rows=s.data.rows.map(t=>{const n={};return this.columns.forEach((a,o)=>{n[a]=t[o]}),n})}).catch(s=>{s.response&&s.response.data?this.errorMessage=s.response.data.message:this.errorMessage=s.message}).finally(()=>{this.loading=!1})}}},me={key:0,class:"mt-2 text-red monospace"};function pe(s,t,n,a,o,l){const d=e.resolveComponent("v-card-title"),h=e.resolveComponent("v-card-subtitle"),g=e.resolveComponent("v-textarea"),C=e.resolveComponent("v-card-text"),_=e.resolveComponent("v-btn"),w=e.resolveComponent("v-text-field"),m=e.resolveComponent("v-card-actions"),v=e.resolveComponent("v-data-table"),b=e.resolveComponent("v-card");return e.openBlock(),e.createBlock(b,null,{default:e.withCtx(()=>[e.createVNode(d,null,{default:e.withCtx(()=>[...t[2]||(t[2]=[e.createTextVNode(" Send SQL Queries to QuestDB ",-1)])]),_:1}),e.createVNode(h,null,{default:e.withCtx(()=>[...t[3]||(t[3]=[e.createTextVNode(" THIS IS DANGEROUS! This allows you to interact directly with the underlying QuestDB time series database, making it easy to modify or delete data. ",-1),e.createElementVNode("br",null,null,-1),e.createElementVNode("br",null,null,-1),e.createTextVNode(" Enter SQL queries like: ",-1),e.createElementVNode("code",null," SELECT * FROM DEFAULT__TLM__INST__HEALTH_STATUS LIMIT 10 ",-1),e.createTextVNode(" or ",-1),e.createElementVNode("code",null,"SHOW TABLES",-1)])]),_:1}),e.createVNode(C,{class:"pb-0 ml-2"},{default:e.withCtx(()=>[e.createVNode(g,{modelValue:o.sqlText,"onUpdate:modelValue":t[0]||(t[0]=i=>o.sqlText=i),"hide-details":"",label:"SQL query",class:"monospace",rows:"3",onKeydown:l.commandKeydown},null,8,["modelValue","onKeydown"]),o.errorMessage?(e.openBlock(),e.createElementBlock("div",me," Error: "+e.toDisplayString(o.errorMessage),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(m,{class:"px-2"},{default:e.withCtx(()=>[e.createVNode(_,{disabled:!o.sqlText.length,loading:o.loading,color:"success",variant:"text","data-test":"tsdb-execute",onClick:l.executeQuery},{default:e.withCtx(()=>[...t[4]||(t[4]=[e.createTextVNode(" Execute ",-1)])]),_:1},8,["disabled","loading","onClick"]),e.createVNode(w,{modelValue:o.db_shard,"onUpdate:modelValue":t[1]||(t[1]=i=>o.db_shard=i),type:"number",min:"0",label:"DB Shard","hide-details":"",density:"compact",style:{"max-width":"100px"},class:"ml-4"},null,8,["modelValue"])]),_:1}),o.columns.length?(e.openBlock(),e.createBlock(v,{key:0,headers:l.tableHeaders,items:o.rows,class:"monospace","items-per-page":50,density:"compact"},null,8,["headers","items"])):e.createCommentVNode("",!0)]),_:1})}const ue=T._export_sfc(de,[["render",pe],["__scopeId","data-v-4c0d0a5c"]]),ge={components:{TsdbMetrics:ce,TsdbQueries:ue},data(){return{activeTab:"metrics"}}};function he(s,t,n,a,o,l){const d=e.resolveComponent("v-tab"),h=e.resolveComponent("v-tabs"),g=e.resolveComponent("tsdb-metrics"),C=e.resolveComponent("v-window-item"),_=e.resolveComponent("tsdb-queries"),w=e.resolveComponent("v-window");return e.openBlock(),e.createElementBlock("div",null,[e.createVNode(h,{modelValue:o.activeTab,"onUpdate:modelValue":t[0]||(t[0]=m=>o.activeTab=m)},{default:e.withCtx(()=>[e.createVNode(d,{value:"metrics","data-test":"tsdb-metrics-tab"},{default:e.withCtx(()=>[...t[2]||(t[2]=[e.createTextVNode("Metrics",-1)])]),_:1}),e.createVNode(d,{value:"queries","data-test":"tsdb-queries-tab"},{default:e.withCtx(()=>[...t[3]||(t[3]=[e.createTextVNode("Queries",-1)])]),_:1})]),_:1},8,["modelValue"]),e.createVNode(w,{modelValue:o.activeTab,"onUpdate:modelValue":t[1]||(t[1]=m=>o.activeTab=m)},{default:e.withCtx(()=>[e.createVNode(C,{value:"metrics"},{default:e.withCtx(()=>[e.createVNode(g)]),_:1}),e.createVNode(C,{value:"queries"},{default:e.withCtx(()=>[e.createVNode(_)]),_:1})]),_:1},8,["modelValue"])])}const _e=T._export_sfc(ge,[["render",he]]);exports.default=_e;
|
|
5
|
+
//# sourceMappingURL=TsdbTab-OOO451j0.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TsdbTab-OOO451j0.cjs","sources":["../src/tools/admin/tabs/tsdb/RepairGapDialog.vue","../src/tools/admin/tabs/tsdb/tsdbApi.js","../src/tools/admin/tabs/tsdb/TsdbMetrics.vue","../src/tools/admin/tabs/tsdb/TsdbQueries.vue","../src/tools/admin/tabs/TsdbTab.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-dialog :model-value=\"modelValue\" max-width=\"900\" persistent>\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n Repair Gap: {{ context.target }} {{ context.packet }}\n </v-card-title>\n <v-card-subtitle v-if=\"context.gap\">\n {{ context.gap.start }} — {{ context.gap.end }} ({{\n context.gap.duration\n }})\n </v-card-subtitle>\n\n <v-card-text style=\"max-height: 75vh; overflow-y: auto\">\n <div v-if=\"errorMessage\" class=\"text-red monospace mb-4\">\n Error: {{ errorMessage }}\n </div>\n\n <!-- Candidate listing phase -->\n <template v-if=\"!jobId\">\n <div v-if=\"loadingCandidates\" class=\"d-flex align-center mb-4\">\n <v-progress-circular indeterminate size=\"24\" class=\"mr-3\" />\n Searching bucket for raw log files that cover this gap…\n </div>\n\n <template v-else>\n <div v-if=\"candidates.length === 0\" class=\"text-medium-emphasis\">\n No raw log files cover this gap window. Reingest is not available\n — the data may have been written from a source that skipped\n raw logging, or the logs have been deleted.\n </div>\n\n <template v-else>\n <div class=\"mb-2\">\n {{ candidates.length }} raw log file(s) overlap this window.\n Select which to reingest:\n </div>\n <v-data-table\n v-model=\"selectedKeys\"\n :headers=\"candidateHeaders\"\n :items=\"candidates\"\n item-value=\"key\"\n show-select\n class=\"monospace\"\n :items-per-page=\"20\"\n density=\"compact\"\n data-test=\"repair-candidates\"\n />\n\n <div class=\"mt-4\">\n <div class=\"text-subtitle-2 font-weight-bold mb-1\">\n Target Definition Version\n </div>\n <v-radio-group\n v-model=\"targetVersion\"\n hide-details\n density=\"compact\"\n data-test=\"repair-version\"\n >\n <v-radio\n value=\"as_logged\"\n data-test=\"repair-version-as-logged\"\n >\n <template #label>\n <div style=\"padding-left: 10px\">\n <div>As logged (default)</div>\n <div class=\"text-caption text-medium-emphasis\">\n Decode each file with the cmd/tlm definition that was\n in effect when the data was originally logged. Safest\n for historical fidelity — preserves packet layouts as\n they existed at that time.\n </div>\n <div class=\"text-caption text-medium-emphasis mt-1\">\n If an item's type has changed since the log was\n written (e.g. STRING → FLOAT), QuestDB column\n types are kept as-is; historical values are cast to\n fit the current column, and any values that can't cast\n are stored as NULL.\n </div>\n </div>\n </template>\n </v-radio>\n <v-radio value=\"current\" data-test=\"repair-version-current\">\n <template #label>\n <div style=\"padding-left: 10px\">\n <div>Current</div>\n <div class=\"text-caption text-medium-emphasis\">\n Decode all files with the latest cmd/tlm definition.\n Choose this when the historical definition had a bug\n that you've since fixed, and you want the reingested\n data decoded with the corrected layout.\n </div>\n </div>\n </template>\n </v-radio>\n </v-radio-group>\n </div>\n </template>\n </template>\n </template>\n\n <!-- Job polling phase -->\n <template v-else-if=\"jobStatus\">\n <v-table density=\"compact\" class=\"monospace mb-4\">\n <tbody>\n <tr>\n <td class=\"font-weight-bold\">Job</td>\n <td>{{ jobId }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">State</td>\n <td>{{ jobStatus.state }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Phase</td>\n <td>{{ phaseLabel }}</td>\n </tr>\n <tr v-if=\"jobStatus.target_version\">\n <td class=\"font-weight-bold\">Target Version</td>\n <td>{{ jobStatus.target_version }}</td>\n </tr>\n <tr v-if=\"jobStatus.packets_written !== undefined\">\n <td class=\"font-weight-bold\">Packets Written</td>\n <td>{{ jobStatus.packets_written.toLocaleString() }}</td>\n </tr>\n <tr v-if=\"jobStatus.error\">\n <td class=\"font-weight-bold text-red\">Error</td>\n <td class=\"text-red\">{{ jobStatus.error }}</td>\n </tr>\n <tr v-if=\"jobStatus.warnings && jobStatus.warnings.length\">\n <td class=\"font-weight-bold text-orange\">Warnings</td>\n <td class=\"text-orange\">\n <div v-for=\"(w, idx) in jobStatus.warnings\" :key=\"idx\">\n {{ w }}\n </div>\n </td>\n </tr>\n </tbody>\n </v-table>\n <v-progress-linear\n :model-value=\"progressPercent\"\n :indeterminate=\"progressPercent === 0 && isRunning\"\n class=\"mb-2\"\n />\n </template>\n </v-card-text>\n\n <v-card-actions class=\"px-4 pb-4\">\n <v-spacer />\n <v-btn\n v-if=\"!jobId\"\n color=\"warning\"\n variant=\"elevated\"\n :disabled=\"\n loadingCandidates ||\n candidates.length === 0 ||\n selectedKeys.length === 0\n \"\n data-test=\"repair-reingest\"\n @click=\"startReingest\"\n >\n Reingest {{ selectedKeys.length }}\n </v-btn>\n <v-btn variant=\"text\" data-test=\"repair-close\" @click=\"attemptClose\">\n Close\n </v-btn>\n </v-card-actions>\n </v-card>\n\n <v-dialog v-model=\"confirmCloseOpen\" max-width=\"500\" persistent>\n <v-card>\n <v-card-title>Reingest Still Running</v-card-title>\n <v-card-text>\n The reingest job is still in progress. Closing this dialog will not\n stop the job, but you will lose visibility into its status. Are you\n sure you want to close?\n </v-card-text>\n <v-card-actions class=\"px-4 pb-4\">\n <v-spacer />\n <v-btn\n variant=\"text\"\n data-test=\"repair-close-cancel\"\n @click=\"confirmCloseOpen = false\"\n >\n Keep Watching\n </v-btn>\n <v-btn\n color=\"warning\"\n variant=\"elevated\"\n data-test=\"repair-close-confirm\"\n @click=\"confirmClose\"\n >\n Close Anyway\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\n\nconst PHASE_LABELS = {\n downloading: 'Downloading files…',\n enabling_dedup: 'Enabling DEDUP…',\n ingesting: 'Ingesting packets…',\n dedup_cooldown: 'Waiting for DEDUP cooldown…',\n disabling_dedup: 'Disabling DEDUP…',\n}\n\nexport default {\n props: {\n modelValue: {\n type: Boolean,\n default: false,\n },\n context: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:modelValue', 'complete'],\n data() {\n return {\n loadingCandidates: false,\n candidates: [],\n selectedKeys: [],\n targetVersion: 'as_logged',\n bucketEnv: null,\n path: null,\n candidateHeaders: [\n { title: 'File', key: 'filename' },\n { title: 'Key', key: 'key' },\n ],\n jobId: null,\n jobStatus: null,\n pollHandle: null,\n errorMessage: null,\n confirmCloseOpen: false,\n }\n },\n computed: {\n isRunning() {\n if (!this.jobStatus) return false\n return ['Queued', 'Running'].includes(this.jobStatus.state)\n },\n phaseLabel() {\n const phase = this.jobStatus?.progress_phase\n if (!phase) return this.jobStatus?.state || ''\n if (phase === 'dedup_cooldown') {\n const remaining = this.cooldownRemaining\n if (remaining != null) {\n return `Waiting for DEDUP cooldown (${remaining}s)…`\n }\n }\n return PHASE_LABELS[phase] || phase\n },\n cooldownRemaining() {\n const enabledAt = this.jobStatus?.dedup_enabled_at\n const cooldown = this.jobStatus?.dedup_cooldown_seconds\n if (!enabledAt || !cooldown) return null\n const nowSec = Date.now() / 1000\n const enabledSec = new Date(enabledAt).getTime() / 1000\n const remaining = Math.round(enabledSec + cooldown - nowSec)\n return Math.max(remaining, 0)\n },\n progressPercent() {\n const s = this.jobStatus\n if (!s) return 0\n if (s.state === 'Complete') return 100\n if (!s.progress_total || s.progress_total === 0) return 0\n return Math.round((s.progress_current / s.progress_total) * 100)\n },\n },\n watch: {\n modelValue(open) {\n if (open) this.fetchCandidates()\n },\n },\n mounted() {\n if (this.modelValue) this.fetchCandidates()\n },\n beforeUnmount() {\n this.stopPolling()\n },\n methods: {\n close() {\n this.stopPolling()\n const completed = this.jobStatus?.state === 'Complete'\n this.resetState()\n this.$emit('update:modelValue', false)\n if (completed) this.$emit('complete')\n },\n attemptClose() {\n if (this.isRunning) {\n this.confirmCloseOpen = true\n } else {\n this.close()\n }\n },\n confirmClose() {\n this.confirmCloseOpen = false\n this.close()\n },\n resetState() {\n this.candidates = []\n this.selectedKeys = []\n this.targetVersion = 'as_logged'\n this.bucketEnv = null\n this.path = null\n this.jobId = null\n this.jobStatus = null\n this.errorMessage = null\n this.loadingCandidates = false\n this.confirmCloseOpen = false\n },\n async fetchCandidates() {\n this.resetState()\n this.loadingCandidates = true\n try {\n const response = await Api.get(\n '/openc3-api/storage/repair_candidates',\n {\n params: {\n scope: this.context.scope,\n target: this.context.target,\n packet: this.context.packet,\n cmd_or_tlm: this.context.cmdOrTlm,\n start_time: this.context.gap.startIso,\n end_time: this.context.gap.endIso,\n },\n },\n )\n this.candidates = response.data.files || []\n this.bucketEnv = response.data.bucket\n this.path = response.data.path\n this.selectedKeys = this.candidates.map((c) => c.key)\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n } finally {\n this.loadingCandidates = false\n }\n },\n async startReingest() {\n this.errorMessage = null\n // The controller expects filenames relative to `path`, not full keys.\n const filenames = this.selectedKeys.map((key) => {\n if (this.path && key.startsWith(this.path)) {\n return key.slice(this.path.length)\n }\n return key.split('/').pop()\n })\n try {\n const response = await Api.post('/openc3-api/storage/reingest', {\n data: {\n scope: this.context.scope,\n bucket: this.bucketEnv,\n path: this.path,\n files: filenames,\n target_version: this.targetVersion,\n },\n })\n this.jobId = response.data.job_id\n this.jobStatus = { state: response.data.state }\n this.startPolling()\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n }\n },\n startPolling() {\n this.stopPolling()\n this.pollHandle = setInterval(this.pollStatus, 2000)\n this.pollStatus()\n },\n stopPolling() {\n if (this.pollHandle) {\n clearInterval(this.pollHandle)\n this.pollHandle = null\n }\n },\n async pollStatus() {\n if (!this.jobId) return\n try {\n const response = await Api.get(\n `/openc3-api/storage/reingest/${this.jobId}`,\n { params: { scope: this.context.scope } },\n )\n this.jobStatus = response.data\n if (!this.isRunning) this.stopPolling()\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n this.stopPolling()\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n.text-orange {\n color: rgb(var(--v-theme-warning));\n}\n</style>\n","/*\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { Api } from '@openc3/js-common/services'\n\n// QuestDB's PG wire occasionally drops idle connections; retry with backoff\n// so transient PQconsumeInput / \"server closed the connection\" errors from\n// the backend don't surface to the user.\nexport async function execSql(sql, db_shard, retries = 3) {\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n let url = '/openc3-api/tsdb/exec'\n if (db_shard && db_shard !== '0') {\n url += `?db_shard=${db_shard}`\n }\n return await Api.post(url, {\n data: sql,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'text/plain',\n },\n })\n } catch (error) {\n const msg = error.response?.data?.message || error.message || ''\n const isConnectionError =\n msg.includes('PQconsumeInput') ||\n msg.includes('server closed the connection')\n if (isConnectionError && attempt < retries) {\n await new Promise((r) => setTimeout(r, 1000 * attempt))\n continue\n }\n throw error\n }\n }\n}\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-card>\n <v-card-title> QuestDB Table Storage Metrics </v-card-title>\n <v-card-text>\n <div v-if=\"metricsError\" class=\"mt-2 text-red monospace\">\n Error: {{ metricsError }}\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-btn\n :loading=\"metricsLoading\"\n color=\"success\"\n variant=\"text\"\n data-test=\"tsdb-metrics-refresh\"\n @click=\"fetchMetrics\"\n >\n Refresh\n </v-btn>\n <v-text-field\n v-model=\"db_shard\"\n type=\"number\"\n min=\"0\"\n label=\"DB Shard\"\n hint=\"DB Shard is N/A in Core\"\n hide-details\n density=\"compact\"\n style=\"max-width: 100px\"\n class=\"ml-4\"\n />\n <v-spacer />\n <v-text-field\n v-model=\"gapSampleInterval\"\n label=\"Data Gap Sample Interval\"\n hint=\"QuestDB SAMPLE BY duration (e.g. 5s, 1m, 10m, 1h)\"\n persistent-hint\n density=\"compact\"\n hide-details=\"auto\"\n style=\"max-width: 260px\"\n data-test=\"gap-sample-interval\"\n />\n </v-card-actions>\n\n <div v-if=\"metricsRows.length\">\n <template v-for=\"(section, idx) in sections\" :key=\"section.title\">\n <h3 class=\"text-h6 ml-2\" :class=\"idx === 0 ? 'mt-4' : 'mt-6'\">\n {{ section.title }}\n </h3>\n <v-data-table\n :headers=\"metricsHeaders\"\n :items=\"section.items\"\n :group-by=\"metricsGroupBy\"\n class=\"monospace\"\n :items-per-page=\"50\"\n density=\"compact\"\n >\n <template\n #group-header=\"{ item, columns, toggleGroup, isGroupOpen }\"\n >\n <tr>\n <td :colspan=\"columns.length - 1\">\n <v-btn\n :icon=\"isGroupOpen(item) ? '$expand' : '$next'\"\n size=\"small\"\n variant=\"text\"\n @click=\"toggleGroup(item)\"\n />\n <span class=\"font-weight-bold\">\n {{ item.value }}\n </span>\n <span class=\"ml-4 text-medium-emphasis\">\n Packets: {{ item.items.length }} — Rows:\n {{ groupRowCount(item.items).toLocaleString() }} —\n Disk: {{ formatBytes(groupDiskSize(item.items)) }}\n </span>\n </td>\n <td>\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"group-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Analyze Data Gaps\"\n prepend-icon=\"mdi-chart-timeline-variant-shimmer\"\n data-test=\"group-analyze-gap\"\n @click=\"analyzeGroupDataGap(item.items)\"\n />\n <v-list-item\n title=\"Delete All\"\n prepend-icon=\"mdi-delete\"\n data-test=\"group-delete\"\n @click=\"deleteGroup(item.items)\"\n />\n </v-list>\n </v-menu>\n </td>\n </tr>\n </template>\n <template #item.diskSize=\"{ item }\">\n {{ formatBytes(item.diskSize) }}\n </template>\n <template #item.rowCount=\"{ item }\">\n {{ Number(item.rowCount).toLocaleString() }}\n </template>\n <template #item.actions=\"{ item }\">\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"row-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Analyze Data Gap\"\n prepend-icon=\"mdi-chart-timeline-variant-shimmer\"\n data-test=\"row-analyze-gap\"\n @click=\"analyzeDataGap(item.tableName)\"\n />\n <v-list-item\n title=\"Delete\"\n prepend-icon=\"mdi-delete\"\n data-test=\"row-delete\"\n @click=\"deleteTable(item.tableName)\"\n />\n </v-list>\n </v-menu>\n </template>\n </v-data-table>\n </template>\n </div>\n </v-card>\n\n <!-- Data Gap Analysis Dialog -->\n <v-dialog v-model=\"gapDialog\" max-width=\"900\">\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n Data Gap Analysis: {{ gapDialogTitle }}\n <v-spacer />\n <v-btn icon=\"mdi-close\" variant=\"text\" @click=\"gapDialog = false\" />\n </v-card-title>\n <v-card-text style=\"max-height: 80vh; overflow-y: auto\">\n <v-progress-linear\n v-if=\"gapLoading\"\n :model-value=\"gapProgress\"\n :indeterminate=\"gapProgress === 0\"\n class=\"mb-4\"\n />\n <div v-if=\"gapError\" class=\"text-red monospace mb-4\">\n Error: {{ gapError }}\n </div>\n\n <!-- Single table result -->\n <template v-if=\"!gapLoading && !gapError && gapSummary\">\n <v-table density=\"compact\" class=\"monospace mb-4\">\n <tbody>\n <tr>\n <td class=\"font-weight-bold\">First Record</td>\n <td>{{ gapSummary.firstTs }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Last Record</td>\n <td>{{ gapSummary.lastTs }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Total Time Span</td>\n <td>{{ gapSummary.timeSpan }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Gaps Found</td>\n <td>{{ gapSummary.gaps.length }}</td>\n </tr>\n </tbody>\n </v-table>\n <div v-if=\"gapSummary.gaps.length\">\n <h4 class=\"text-subtitle-1 font-weight-bold mb-2\">\n Data Gaps (periods with no data)\n </h4>\n <v-data-table\n :headers=\"gapHeaders\"\n :items=\"gapSummary.gaps\"\n class=\"monospace\"\n :items-per-page=\"20\"\n density=\"compact\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n v-if=\"isTlmTable(gapDialogTitle)\"\n icon=\"mdi-wrench\"\n size=\"small\"\n variant=\"text\"\n data-test=\"gap-repair\"\n title=\"Repair (reingest raw logs)\"\n @click=\"openRepair(item, gapDialogTitle)\"\n />\n </template>\n </v-data-table>\n </div>\n <div v-else class=\"text-medium-emphasis\">\n No data gaps detected (sampled at {{ gapSampleInterval }}\n intervals).\n </div>\n </template>\n\n <!-- Group results (only tables with gaps) -->\n <template v-if=\"!gapLoading && !gapError && gapGroupResults\">\n <div\n v-if=\"gapGroupResults.withGaps.length === 0\"\n class=\"text-medium-emphasis\"\n >\n No data gaps detected across\n {{ gapGroupResults.totalTables }} tables (sampled at\n {{ gapSampleInterval }} intervals).\n </div>\n <div v-else>\n <div class=\"mb-4 text-medium-emphasis\">\n {{ gapGroupResults.withGaps.length }} of\n {{ gapGroupResults.totalTables }} tables have data gaps.\n </div>\n <div\n v-for=\"result in gapGroupResults.withGaps\"\n :key=\"result.tableName\"\n class=\"mb-6\"\n >\n <h4 class=\"text-subtitle-1 font-weight-bold mb-1\">\n {{ result.packet }}\n </h4>\n <div class=\"text-medium-emphasis monospace mb-2\">\n {{ result.firstTs }} to {{ result.lastTs }} ({{\n result.timeSpan\n }}) — {{ result.gaps.length }} gap(s)\n </div>\n <v-data-table\n :headers=\"gapHeaders\"\n :items=\"result.gaps\"\n class=\"monospace\"\n :items-per-page=\"10\"\n density=\"compact\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n v-if=\"isTlmTable(result.tableName)\"\n icon=\"mdi-wrench\"\n size=\"small\"\n variant=\"text\"\n data-test=\"gap-repair\"\n title=\"Repair (reingest raw logs)\"\n @click=\"openRepair(item, result.tableName)\"\n />\n </template>\n </v-data-table>\n </div>\n </div>\n </template>\n </v-card-text>\n </v-card>\n </v-dialog>\n\n <repair-gap-dialog\n v-if=\"repairContext\"\n v-model=\"repairDialog\"\n :context=\"repairContext\"\n @complete=\"onRepairComplete\"\n />\n </div>\n</template>\n\n<script>\nimport RepairGapDialog from './RepairGapDialog.vue'\nimport { execSql } from './tsdbApi'\n\nexport default {\n components: {\n RepairGapDialog,\n },\n data() {\n return {\n metricsRows: [],\n metricsError: null,\n metricsLoading: false,\n metricsGroupBy: [{ key: 'target', order: 'asc' }],\n metricsHeaders: [\n { title: 'Packet', key: 'packet' },\n { title: 'Table Name', key: 'tableName' },\n { title: 'Partition Count', key: 'partitionCount' },\n { title: 'Row Count', key: 'rowCount' },\n { title: 'Disk Size', key: 'diskSize' },\n { title: 'Actions', key: 'actions', sortable: false },\n ],\n gapDialog: false,\n gapDialogTitle: '',\n gapLoading: false,\n gapProgress: 0,\n gapError: null,\n gapSummary: null,\n gapGroupResults: null,\n gapHeaders: [\n { title: 'Gap Start', key: 'start' },\n { title: 'Gap End', key: 'end' },\n { title: 'Duration', key: 'duration' },\n { title: 'Actions', key: 'actions', sortable: false, width: 80 },\n ],\n repairDialog: false,\n repairContext: null,\n gapSampleInterval: '1m',\n db_shard: '0',\n }\n },\n computed: {\n sections() {\n return [\n {\n title: 'Telemetry',\n items: this.metricsRows.filter((row) => row.type === 'TLM'),\n },\n {\n title: 'Commands',\n items: this.metricsRows.filter((row) => row.type === 'CMD'),\n },\n ]\n },\n },\n mounted() {\n this.fetchMetrics()\n },\n methods: {\n groupRowCount(items) {\n return items.reduce(\n (sum, row) => sum + Number((row.raw || row).rowCount || 0),\n 0,\n )\n },\n groupDiskSize(items) {\n return items.reduce(\n (sum, row) => sum + Number((row.raw || row).diskSize || 0),\n 0,\n )\n },\n formatBytes(bytes) {\n if (bytes === 0) return '0 B'\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n const k = 1024\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n const value = bytes / Math.pow(k, i)\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n },\n fetchMetrics() {\n this.metricsError = null\n this.metricsRows = []\n this.metricsLoading = true\n execSql(\n 'SELECT tableName, partitionCount, rowCount, diskSize FROM table_storage;',\n this.db_shard,\n )\n .then((response) => {\n const cols = response.data.columns\n this.metricsRows = response.data.rows.map((row) => {\n const obj = {}\n cols.forEach((col, i) => {\n obj[col] = row[i]\n })\n const parts = (obj.tableName || '').split('__')\n obj.type = parts[1] || ''\n obj.target = parts[2] || ''\n obj.packet = parts[3] || ''\n return obj\n })\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n .finally(() => {\n this.metricsLoading = false\n })\n },\n dropTable(tableName) {\n return execSql(`DROP TABLE '${tableName}';`, this.db_shard)\n },\n deleteTable(tableName) {\n let target = tableName.split('__')[2] || tableName\n let packet = tableName.split('__')[3] || tableName\n this.$dialog\n .confirm(\n `Are you sure you want to drop table: ${tableName}? This removes ALL decommutated data for ${target} ${packet}!`,\n {\n okText: 'Delete',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.dropTable(tableName)\n .then(() => {\n this.metricsRows = this.metricsRows.filter(\n (row) => row.tableName !== tableName,\n )\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n })\n },\n deleteGroup(items) {\n const tableNames = items.map((item) => (item.raw || item).tableName)\n let target = tableNames[0].split('__')[2]\n this.$dialog\n .confirm(\n `Are you sure you want to drop ${tableNames.length} tables? This removes ALL decommutated data for ${target}!\\n\\n${tableNames.join('\\n')}`,\n {\n okText: 'Delete',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n const nameSet = new Set(tableNames)\n Promise.all(tableNames.map((name) => this.dropTable(name)))\n .then(() => {\n this.metricsRows = this.metricsRows.filter(\n (row) => !nameSet.has(row.tableName),\n )\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n })\n },\n formatDuration(ms) {\n const seconds = Math.floor(ms / 1000)\n const days = Math.floor(seconds / 86400)\n const hours = Math.floor((seconds % 86400) / 3600)\n const minutes = Math.floor((seconds % 3600) / 60)\n const parts = []\n if (days) parts.push(`${days}d`)\n if (hours) parts.push(`${hours}h`)\n if (minutes) parts.push(`${minutes}m`)\n if (!parts.length) parts.push(`${seconds}s`)\n return parts.join(' ')\n },\n formatTimestamp(ts) {\n return new Date(ts).toISOString().replace('T', ' ').replace('.000Z', 'Z')\n },\n // Parse a QuestDB SAMPLE BY duration like \"1m\", \"30s\", \"2h\" into ms.\n // Returns null if malformed.\n parseSampleIntervalMs(input) {\n const match = String(input || '')\n .trim()\n .match(/^(\\d+)\\s*([smhd])$/i)\n if (!match) return null\n const value = Number.parseInt(match[1], 10)\n const multipliers = { s: 1_000, m: 60_000, h: 3_600_000, d: 86_400_000 }\n return value * multipliers[match[2].toLowerCase()]\n },\n async fetchTableGaps(tableName) {\n const interval = (this.gapSampleInterval || '1m').trim()\n const bucketMs = this.parseSampleIntervalMs(interval)\n if (!bucketMs) {\n throw new Error(\n `Invalid sample interval '${interval}'. Use a number followed by s, m, h, or d (e.g. 5s, 1m, 2h).`,\n )\n }\n\n // Get first and last timestamps\n const rangeResp = await execSql(\n `SELECT first(PACKET_TIMESECONDS) as first_ts, last(PACKET_TIMESECONDS) as last_ts FROM '${tableName}';`,\n this.db_shard,\n )\n const rangeCols = rangeResp.data.columns\n const rangeRow = rangeResp.data.rows[0]\n const rangeObj = {}\n rangeCols.forEach((col, i) => {\n rangeObj[col] = rangeRow[i]\n })\n const firstTs = rangeObj.first_ts\n const lastTs = rangeObj.last_ts\n const totalMs = new Date(lastTs) - new Date(firstTs)\n\n // Sample by the user-chosen interval with FILL(NULL) to detect gaps.\n const gapResp = await execSql(\n `(SELECT PACKET_TIMESECONDS, count() as cnt FROM '${tableName}' SAMPLE BY ${interval} FILL(NULL)) WHERE cnt IS NULL`,\n this.db_shard,\n )\n const gapCols = gapResp.data.columns\n const gapRows = gapResp.data.rows.map((row) => {\n const obj = {}\n gapCols.forEach((col, i) => {\n obj[col] = row[i]\n })\n return obj\n })\n\n // Group contiguous null-bucket timestamps into gaps. A delta > bucketMs\n // between consecutive empty buckets means a new gap has started.\n const gaps = []\n const buildGap = (startRaw, endRaw) => {\n const startMs = new Date(startRaw).getTime()\n const endMs = new Date(endRaw).getTime() + bucketMs\n return {\n start: this.formatTimestamp(startRaw),\n end: this.formatTimestamp(new Date(endMs)),\n duration: this.formatDuration(endMs - startMs),\n // ISO strings avoid the JS precision cliff on nsec integers.\n startIso: new Date(startMs).toISOString(),\n endIso: new Date(endMs).toISOString(),\n }\n }\n if (gapRows.length > 0) {\n let gapStart = gapRows[0].PACKET_TIMESECONDS\n let gapEnd = gapStart\n for (let i = 1; i < gapRows.length; i++) {\n const prev = new Date(gapEnd)\n const curr = new Date(gapRows[i].PACKET_TIMESECONDS)\n if (curr - prev > bucketMs) {\n gaps.push(buildGap(gapStart, gapEnd))\n gapStart = gapRows[i].PACKET_TIMESECONDS\n }\n gapEnd = gapRows[i].PACKET_TIMESECONDS\n }\n gaps.push(buildGap(gapStart, gapEnd))\n }\n\n return {\n firstTs: this.formatTimestamp(firstTs),\n lastTs: this.formatTimestamp(lastTs),\n timeSpan: this.formatDuration(totalMs),\n gaps,\n }\n },\n async analyzeDataGap(tableName) {\n this.gapDialogTitle = tableName\n this.gapDialog = true\n this.gapLoading = true\n this.gapProgress = 0\n this.gapError = null\n this.gapSummary = null\n this.gapGroupResults = null\n try {\n this.gapSummary = await this.fetchTableGaps(tableName)\n } catch (error) {\n this.gapError = error.response?.data?.message || error.message\n } finally {\n this.gapLoading = false\n }\n },\n async analyzeGroupDataGap(items) {\n const tableNames = items.map((item) => (item.raw || item).tableName)\n const target = (items[0].raw || items[0]).target\n this.gapDialogTitle = `${target} (${tableNames.length} tables)`\n this.gapDialog = true\n this.gapLoading = true\n this.gapProgress = 0\n this.gapError = null\n this.gapSummary = null\n this.gapGroupResults = null\n try {\n const withGaps = []\n for (let i = 0; i < tableNames.length; i++) {\n this.gapProgress = Math.round(((i + 1) / tableNames.length) * 100)\n try {\n const result = await this.fetchTableGaps(tableNames[i])\n if (result.gaps.length > 0) {\n const parts = tableNames[i].split('__')\n withGaps.push({\n tableName: tableNames[i],\n packet: parts[3] || tableNames[i],\n ...result,\n })\n }\n } catch {\n // Skip tables that error (e.g. empty tables)\n }\n }\n this.gapGroupResults = {\n totalTables: tableNames.length,\n withGaps,\n }\n } catch (error) {\n this.gapError = error.response?.data?.message || error.message\n } finally {\n this.gapLoading = false\n }\n },\n // scope__TLM|CMD__TARGET__PACKET → { scope, cmdOrTlm, target, packet }\n parseTableName(tableName) {\n const parts = tableName.split('__')\n if (parts.length < 4) return null\n return {\n scope: parts[0],\n cmdOrTlm: parts[1],\n target: parts[2],\n packet: parts[3],\n }\n },\n isTlmTable(tableName) {\n const parsed = this.parseTableName(tableName)\n return parsed?.cmdOrTlm === 'TLM'\n },\n openRepair(gap, tableName) {\n const parsed = this.parseTableName(tableName)\n if (!parsed) return\n this.repairContext = {\n tableName,\n ...parsed,\n gap,\n }\n this.repairDialog = true\n },\n onRepairComplete() {\n // Re-run gap analysis on whichever view is currently showing.\n if (this.gapGroupResults) return // group analysis is expensive; let the user re-run manually\n if (this.gapDialogTitle) this.analyzeDataGap(this.gapDialogTitle)\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n</style>\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-card>\n <v-card-title> Send SQL Queries to QuestDB </v-card-title>\n <v-card-subtitle>\n THIS IS DANGEROUS! This allows you to interact directly with the\n underlying QuestDB time series database, making it easy to modify or\n delete data.\n <br /><br />\n Enter SQL queries like:\n <code> SELECT * FROM DEFAULT__TLM__INST__HEALTH_STATUS LIMIT 10 </code>\n or\n <code>SHOW TABLES</code>\n </v-card-subtitle>\n <v-card-text class=\"pb-0 ml-2\">\n <v-textarea\n v-model=\"sqlText\"\n hide-details\n label=\"SQL query\"\n class=\"monospace\"\n rows=\"3\"\n @keydown=\"commandKeydown\"\n />\n <div v-if=\"errorMessage\" class=\"mt-2 text-red monospace\">\n Error: {{ errorMessage }}\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-btn\n :disabled=\"!sqlText.length\"\n :loading=\"loading\"\n color=\"success\"\n variant=\"text\"\n data-test=\"tsdb-execute\"\n @click=\"executeQuery\"\n >\n Execute\n </v-btn>\n <v-text-field\n v-model=\"db_shard\"\n type=\"number\"\n min=\"0\"\n label=\"DB Shard\"\n hide-details\n density=\"compact\"\n style=\"max-width: 100px\"\n class=\"ml-4\"\n />\n </v-card-actions>\n\n <v-data-table\n v-if=\"columns.length\"\n :headers=\"tableHeaders\"\n :items=\"rows\"\n class=\"monospace\"\n :items-per-page=\"50\"\n density=\"compact\"\n >\n </v-data-table>\n </v-card>\n</template>\n\n<script>\nimport { execSql } from './tsdbApi'\n\nexport default {\n data() {\n return {\n sqlText: '',\n db_shard: '0',\n columns: [],\n rows: [],\n errorMessage: null,\n loading: false,\n }\n },\n computed: {\n tableHeaders() {\n return this.columns.map((col) => ({\n title: col,\n key: col,\n }))\n },\n },\n methods: {\n commandKeydown($event) {\n if (($event.metaKey || $event.ctrlKey) && $event.key === 'Enter') {\n this.executeQuery()\n }\n },\n executeQuery() {\n this.errorMessage = null\n this.columns = []\n this.rows = []\n this.loading = true\n execSql(this.sqlText, this.db_shard)\n .then((response) => {\n this.columns = response.data.columns\n this.rows = response.data.rows.map((row) => {\n const obj = {}\n this.columns.forEach((col, i) => {\n obj[col] = row[i]\n })\n return obj\n })\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.errorMessage = error.response.data.message\n } else {\n this.errorMessage = error.message\n }\n })\n .finally(() => {\n this.loading = false\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n</style>\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-tabs v-model=\"activeTab\">\n <v-tab value=\"metrics\" data-test=\"tsdb-metrics-tab\">Metrics</v-tab>\n <v-tab value=\"queries\" data-test=\"tsdb-queries-tab\">Queries</v-tab>\n </v-tabs>\n <v-window v-model=\"activeTab\">\n <v-window-item value=\"metrics\">\n <tsdb-metrics />\n </v-window-item>\n <v-window-item value=\"queries\">\n <tsdb-queries />\n </v-window-item>\n </v-window>\n </div>\n</template>\n\n<script>\nimport TsdbMetrics from './tsdb/TsdbMetrics.vue'\nimport TsdbQueries from './tsdb/TsdbQueries.vue'\n\nexport default {\n components: {\n TsdbMetrics,\n TsdbQueries,\n },\n data() {\n return {\n activeTab: 'metrics',\n }\n },\n}\n</script>\n"],"names":["PHASE_LABELS","_sfc_main","phase","remaining","enabledAt","cooldown","nowSec","enabledSec","open","completed","response","Api","c","error","filenames","key","_hoisted_4","_hoisted_5","_hoisted_9","_hoisted_11","_createBlock","_component_v_dialog","$props","_createVNode","_component_v_card","_component_v_card_title","_toDisplayString","_component_v_card_subtitle","_component_v_card_text","$data","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_component_v_table","_createElementVNode","_cache","$options","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_10","w","idx","_component_v_progress_linear","_hoisted_2","_component_v_progress_circular","_hoisted_3","_component_v_data_table","$event","_component_v_radio_group","_component_v_radio","_component_v_card_actions","_component_v_spacer","_component_v_btn","execSql","sql","db_shard","retries","attempt","url","msg","r","RepairGapDialog","row","items","sum","bytes","units","k","i","cols","obj","col","parts","tableName","target","packet","tableNames","item","nameSet","name","ms","seconds","days","hours","minutes","ts","input","match","interval","bucketMs","rangeResp","rangeCols","rangeRow","rangeObj","firstTs","lastTs","totalMs","gapResp","gapCols","gapRows","gaps","buildGap","startRaw","endRaw","startMs","endMs","gapStart","gapEnd","prev","withGaps","result","gap","parsed","_hoisted_12","_hoisted_13","_component_v_text_field","_renderList","section","_normalizeClass","_withCtx","columns","toggleGroup","isGroupOpen","_component_v_menu","props","_component_v_icon","_mergeProps","_component_v_list","_component_v_list_item","_createTextVNode","_component_repair_gap_dialog","_component_v_textarea","TsdbMetrics","TsdbQueries","_component_v_tabs","_component_v_tab","_component_v_window","_component_v_window_item","_component_tsdb_metrics","_component_tsdb_queries"],"mappings":"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"}
|
package/dist/{UpgradeToEnterpriseDialog-D_S574Zb.js → UpgradeToEnterpriseDialog-BUuXsGPY.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveComponent as n, openBlock as m, createBlock as _, withCtx as r, createVNode as e, createElementVNode as t, createElementBlock as C, toDisplayString as b, createCommentVNode as V, createTextVNode as s } from "vue";
|
|
2
|
-
import "./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-
|
|
2
|
+
import "./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DskbVSHX.js";
|
|
3
3
|
import { _ as w } from "./CustomIcon-DTR361si.js";
|
|
4
4
|
const x = {
|
|
5
5
|
props: {
|
|
@@ -95,4 +95,4 @@ const A = /* @__PURE__ */ w(x, [["render", B], ["__scopeId", "data-v-c790a82f"]]
|
|
|
95
95
|
export {
|
|
96
96
|
A as U
|
|
97
97
|
};
|
|
98
|
-
//# sourceMappingURL=UpgradeToEnterpriseDialog-
|
|
98
|
+
//# sourceMappingURL=UpgradeToEnterpriseDialog-BUuXsGPY.js.map
|
package/dist/{UpgradeToEnterpriseDialog-D_S574Zb.js.map → UpgradeToEnterpriseDialog-BUuXsGPY.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeToEnterpriseDialog-
|
|
1
|
+
{"version":3,"file":"UpgradeToEnterpriseDialog-BUuXsGPY.js","sources":["../src/components/UpgradeToEnterpriseDialog.vue"],"sourcesContent":["<!--\n# Copyright 2025 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"650px\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Upgrade to COSMOS Enterprise </span>\n <v-spacer />\n </v-toolbar>\n <v-card>\n <v-card-text class=\"mt-4\">\n <div class=\"logo\">\n <img :src=\"logo\" alt=\"OpenC3\" />\n <div class=\"cosmos\">COSMOS Enterprise</div>\n </div>\n <div class=\"pb-4\">Thank you for using the COSMOS Core!</div>\n <div v-if=\"reason\">\n <div class=\"pb-4 pl-4 reason\">\n {{ reason }}\n </div>\n </div>\n COSMOS Enterprise removes all restrictions and offers users with role\n based access control, scaling on kubernetes, cloud platform support,\n multiple scopes, Calendar and Autonomic, various integrations with\n common protocols and hardware, commercial licensing, and much more!<br /><br />\n Learn more at\n <a href=\"https://openc3.com/enterprise\">\n https://openc3.com/enterprise\n </a>\n and help support COSMOS Core by supporting our business. Contact us at\n <a href=\"mailto:support@openc3.com\">support@openc3.com</a> for more\n information about COSMOS Enterprise, COSMOS training, COSMOS support,\n and custom COSMOS development.\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n modelValue: Boolean, // modelValue is the default prop when using v-model\n reason: {\n type: String,\n default: null,\n },\n },\n emits: ['update:modelValue'],\n data() {\n return {\n logo: '/img/logo.png',\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value) // update is the default event when using v-model\n },\n },\n },\n}\n</script>\n\n<style scoped>\n.logo {\n float: right;\n margin: 15px;\n}\n\n.cosmos {\n text-align: center;\n font-size: 18pt;\n}\n\n.reason {\n font-weight: bold;\n}\n</style>\n"],"names":["_sfc_main","value","_hoisted_1","_hoisted_4","_createBlock","_component_v_dialog","$options","$event","_createVNode","_component_v_toolbar","_component_v_spacer","_cache","_createElementVNode","_component_v_card","_component_v_card_text","$data","$props","_createElementBlock","_hoisted_3","_toDisplayString","_component_v_card_actions","_component_v_btn"],"mappings":";;;AAsDA,MAAKA,IAAU;AAAA,EACb,OAAO;AAAA,IACL,YAAY;AAAA;AAAA,IACZ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA;;EAGb,OAAO,CAAC,mBAAmB;AAAA,EAC3B,OAAO;AACL,WAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,MACA,IAAIC,GAAO;AACT,aAAK,MAAM,qBAAqBA,CAAK;AAAA,MACvC;AAAA;;AAGN,GAxDaC,IAAA,EAAA,OAAM,OAAM,gCAMVC,IAAA,EAAA,OAAM,mBAAkB;;;cAdrCC,EAoCWC,GAAA;AAAA,gBApCQC,EAAA;AAAA,kDAAAA,EAAA,OAAIC;AAAA,IAAE,OAAM;AAAA;eAC7B,MAIY;AAAA,MAJZC,EAIYC,GAAA,EAJD,QAAO,KAAI,GAAA;AAAA,mBACpB,MAAY;AAAA,UAAZD,EAAYE,CAAA;AAAA,UACZC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAA2C,cAArC,kCAA8B,EAAA;AAAA,UACpCJ,EAAYE,CAAA;AAAA;;;MAEdF,EA6BSK,GAAA,MAAA;AAAA,mBA5BP,MAuBc;AAAA,UAvBdL,EAuBcM,GAAA,EAvBD,OAAM,OAAM,GAAA;AAAA,uBACvB,MAGM;AAAA,cAHNF,EAGM,OAHNV,GAGM;AAAA,gBAFJU,EAAgC,OAAA;AAAA,kBAA1B,KAAKG,EAAA;AAAA,kBAAM,KAAI;AAAA;gBACrBJ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAA2C,OAAA,EAAtC,OAAM,YAAS,qBAAiB,EAAA;AAAA;cAEvCD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAA4D,OAAA,EAAvD,OAAM,OAAM,GAAC,wCAAoC,EAAA;AAAA,cAC3CI,EAAA,eAAXC,EAIM,OAAAC,GAAA;AAAA,gBAHJN,EAEM,OAFNT,GAEMgB,EADDH,EAAA,MAAM,GAAA,CAAA;AAAA;gCAEP,sRAI6D,EAAA;AAAA,8BAAAJ,EAAM,MAAA,MAAA,MAAA,EAAA;AAAA,8BAAAA,EAAM,MAAA,MAAA,MAAA,EAAA;AAAA,gCAAA,mBAE/E,EAAA;AAAA,cAAAD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAEI,KAAA,EAFD,MAAK,gCAA+B,GAAC,mCAExC,EAAA;AAAA,kCAAI,4EAEJ,EAAA;AAAA,cAAAD,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAC,EAA0D,KAAA,EAAvD,MAAK,4BAA2B,GAAC,sBAAkB,EAAA;AAAA,kCAAI,mHAG5D,EAAA;AAAA;;;UACAJ,EAGiBY,GAAA,EAHD,OAAM,OAAM,GAAA;AAAA,uBAC1B,MAAY;AAAA,cAAZZ,EAAYE,CAAA;AAAA,cACZF,EAAwDa,GAAA;AAAA,gBAAjD,SAAQ;AAAA,gBAAQ,SAAKV,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAJ,MAAED,EAAA,OAAI,CAAIA,EAAA;AAAA;2BAAM,MAAI,CAAA,GAAAK,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,oBAAJ,QAAI,EAAA;AAAA;;;;;;;;;;;;;;"}
|
package/dist/{UpgradeToEnterpriseDialog-XJb6gVCY.cjs → UpgradeToEnterpriseDialog-DHLK6v6f.cjs}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("vue");require("./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-
|
|
2
|
-
//# sourceMappingURL=UpgradeToEnterpriseDialog-
|
|
1
|
+
"use strict";const e=require("vue");require("./UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-CTNR19Zt.cjs");const v=require("./CustomIcon-8F08upeg.cjs"),V={props:{modelValue:Boolean,reason:{type:String,default:null}},emits:["update:modelValue"],data(){return{logo:"/img/logo.png"}},computed:{show:{get(){return this.modelValue},set(r){this.$emit("update:modelValue",r)}}}},C={class:"logo"},g=["src"],N={key:0},f={class:"pb-4 pl-4 reason"};function O(r,o,s,_,a,t){const n=e.resolveComponent("v-spacer"),d=e.resolveComponent("v-toolbar"),p=e.resolveComponent("v-card-text"),i=e.resolveComponent("v-btn"),m=e.resolveComponent("v-card-actions"),u=e.resolveComponent("v-card"),c=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(c,{modelValue:t.show,"onUpdate:modelValue":o[1]||(o[1]=l=>t.show=l),width:"650px"},{default:e.withCtx(()=>[e.createVNode(d,{height:"24"},{default:e.withCtx(()=>[e.createVNode(n),o[2]||(o[2]=e.createElementVNode("span",null," Upgrade to COSMOS Enterprise ",-1)),e.createVNode(n)]),_:1}),e.createVNode(u,null,{default:e.withCtx(()=>[e.createVNode(p,{class:"mt-4"},{default:e.withCtx(()=>[e.createElementVNode("div",C,[e.createElementVNode("img",{src:a.logo,alt:"OpenC3"},null,8,g),o[3]||(o[3]=e.createElementVNode("div",{class:"cosmos"},"COSMOS Enterprise",-1))]),o[4]||(o[4]=e.createElementVNode("div",{class:"pb-4"},"Thank you for using the COSMOS Core!",-1)),s.reason?(e.openBlock(),e.createElementBlock("div",N,[e.createElementVNode("div",f,e.toDisplayString(s.reason),1)])):e.createCommentVNode("",!0),o[5]||(o[5]=e.createTextVNode(" COSMOS Enterprise removes all restrictions and offers users with role based access control, scaling on kubernetes, cloud platform support, multiple scopes, Calendar and Autonomic, various integrations with common protocols and hardware, commercial licensing, and much more!",-1)),o[6]||(o[6]=e.createElementVNode("br",null,null,-1)),o[7]||(o[7]=e.createElementVNode("br",null,null,-1)),o[8]||(o[8]=e.createTextVNode(" Learn more at ",-1)),o[9]||(o[9]=e.createElementVNode("a",{href:"https://openc3.com/enterprise"}," https://openc3.com/enterprise ",-1)),o[10]||(o[10]=e.createTextVNode(" and help support COSMOS Core by supporting our business. Contact us at ",-1)),o[11]||(o[11]=e.createElementVNode("a",{href:"mailto:support@openc3.com"},"support@openc3.com",-1)),o[12]||(o[12]=e.createTextVNode(" for more information about COSMOS Enterprise, COSMOS training, COSMOS support, and custom COSMOS development. ",-1))]),_:1}),e.createVNode(m,{class:"px-2"},{default:e.withCtx(()=>[e.createVNode(n),e.createVNode(i,{variant:"flat",onClick:o[0]||(o[0]=l=>t.show=!t.show)},{default:e.withCtx(()=>[...o[13]||(o[13]=[e.createTextVNode(" Ok ",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])}const S=v._export_sfc(V,[["render",O],["__scopeId","data-v-c790a82f"]]);exports.UpgradeToEnterpriseDialog=S;
|
|
2
|
+
//# sourceMappingURL=UpgradeToEnterpriseDialog-DHLK6v6f.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpgradeToEnterpriseDialog-
|
|
1
|
+
{"version":3,"file":"UpgradeToEnterpriseDialog-DHLK6v6f.cjs","sources":["../src/components/UpgradeToEnterpriseDialog.vue"],"sourcesContent":["<!--\n# Copyright 2025 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog v-model=\"show\" width=\"650px\">\n <v-toolbar height=\"24\">\n <v-spacer />\n <span> Upgrade to COSMOS Enterprise </span>\n <v-spacer />\n </v-toolbar>\n <v-card>\n <v-card-text class=\"mt-4\">\n <div class=\"logo\">\n <img :src=\"logo\" alt=\"OpenC3\" />\n <div class=\"cosmos\">COSMOS Enterprise</div>\n </div>\n <div class=\"pb-4\">Thank you for using the COSMOS Core!</div>\n <div v-if=\"reason\">\n <div class=\"pb-4 pl-4 reason\">\n {{ reason }}\n </div>\n </div>\n COSMOS Enterprise removes all restrictions and offers users with role\n based access control, scaling on kubernetes, cloud platform support,\n multiple scopes, Calendar and Autonomic, various integrations with\n common protocols and hardware, commercial licensing, and much more!<br /><br />\n Learn more at\n <a href=\"https://openc3.com/enterprise\">\n https://openc3.com/enterprise\n </a>\n and help support COSMOS Core by supporting our business. Contact us at\n <a href=\"mailto:support@openc3.com\">support@openc3.com</a> for more\n information about COSMOS Enterprise, COSMOS training, COSMOS support,\n and custom COSMOS development.\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-spacer />\n <v-btn variant=\"flat\" @click=\"show = !show\"> Ok </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nexport default {\n props: {\n modelValue: Boolean, // modelValue is the default prop when using v-model\n reason: {\n type: String,\n default: null,\n },\n },\n emits: ['update:modelValue'],\n data() {\n return {\n logo: '/img/logo.png',\n }\n },\n computed: {\n show: {\n get() {\n return this.modelValue\n },\n set(value) {\n this.$emit('update:modelValue', value) // update is the default event when using v-model\n },\n },\n },\n}\n</script>\n\n<style scoped>\n.logo {\n float: right;\n margin: 15px;\n}\n\n.cosmos {\n text-align: center;\n font-size: 18pt;\n}\n\n.reason {\n font-weight: bold;\n}\n</style>\n"],"names":["_sfc_main","value","_hoisted_1","_hoisted_4","_createBlock","_component_v_dialog","$options","$event","_createVNode","_component_v_toolbar","_component_v_spacer","_cache","_createElementVNode","_component_v_card","_component_v_card_text","$data","$props","_createElementBlock","_hoisted_3","_toDisplayString","_component_v_card_actions","_component_v_btn"],"mappings":"qLAsDKA,EAAU,CACb,MAAO,CACL,WAAY,QACZ,OAAQ,CACN,KAAM,OACN,QAAS,OAGb,MAAO,CAAC,mBAAmB,EAC3B,MAAO,CACL,MAAO,CACL,KAAM,eACR,CACF,EACA,SAAU,CACR,KAAM,CACJ,KAAM,CACJ,OAAO,KAAK,UACd,EACA,IAAIC,EAAO,CACT,KAAK,MAAM,oBAAqBA,CAAK,CACvC,GAGN,EAxDaC,EAAA,CAAA,MAAM,MAAM,sBAMVC,EAAA,CAAA,MAAM,kBAAkB,iSAdrCC,EAAAA,YAoCWC,EAAA,YApCQC,EAAA,0CAAAA,EAAA,KAAIC,GAAE,MAAM,4BAC7B,IAIY,CAJZC,EAAAA,YAIYC,EAAA,CAJD,OAAO,IAAI,EAAA,mBACpB,IAAY,CAAZD,EAAAA,YAAYE,CAAA,EACZC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,qBAA2C,YAArC,iCAA8B,EAAA,GACpCJ,EAAAA,YAAYE,CAAA,UAEdF,EAAAA,YA6BSK,EAAA,KAAA,mBA5BP,IAuBc,CAvBdL,EAAAA,YAuBcM,EAAA,CAvBD,MAAM,MAAM,EAAA,mBACvB,IAGM,CAHNF,EAAAA,mBAGM,MAHNV,EAGM,CAFJU,EAAAA,mBAAgC,MAAA,CAA1B,IAAKG,EAAA,KAAM,IAAI,oBACrBJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAA,mBAA2C,MAAA,CAAtC,MAAM,UAAS,oBAAiB,EAAA,KAEvCD,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAA,mBAA4D,MAAA,CAAvD,MAAM,MAAM,EAAC,uCAAoC,EAAA,GAC3CI,EAAA,sBAAXC,EAAAA,mBAIM,MAAAC,EAAA,CAHJN,EAAAA,mBAEM,MAFNT,EAEMgB,EAAAA,gBADDH,EAAA,MAAM,EAAA,CAAA,+DAEP,qRAI6D,EAAA,eAAAJ,qBAAM,KAAA,KAAA,KAAA,EAAA,eAAAA,qBAAM,KAAA,KAAA,KAAA,EAAA,iCAAA,kBAE/E,EAAA,GAAAD,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAA,mBAEI,IAAA,CAFD,KAAK,+BAA+B,EAAC,kCAExC,EAAA,mCAAI,2EAEJ,EAAA,GAAAD,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAC,EAAAA,mBAA0D,IAAA,CAAvD,KAAK,2BAA2B,EAAC,qBAAkB,EAAA,mCAAI,kHAG5D,EAAA,WACAJ,EAAAA,YAGiBY,EAAA,CAHD,MAAM,MAAM,EAAA,mBAC1B,IAAY,CAAZZ,EAAAA,YAAYE,CAAA,EACZF,EAAAA,YAAwDa,EAAA,CAAjD,QAAQ,OAAQ,QAAKV,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAJ,GAAED,EAAA,KAAI,CAAIA,EAAA,0BAAM,IAAI,CAAA,GAAAK,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,mBAAJ,OAAI,EAAA"}
|