@getontime/cli 4.4.2 → 4.5.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/client/assets/{Backstage-BdrcXNr9.js → Backstage-DQu8ne-1.js} +2 -2
- package/client/assets/Backstage-DQu8ne-1.js.br +0 -0
- package/client/assets/Backstage-DQu8ne-1.js.gz +0 -0
- package/client/assets/{Backstage-BdrcXNr9.js.map → Backstage-DQu8ne-1.js.map} +1 -1
- package/client/assets/{Countdown-DQM2ppPg.js → Countdown-COte1yne.js} +2 -2
- package/client/assets/Countdown-COte1yne.js.br +0 -0
- package/client/assets/Countdown-COte1yne.js.gz +0 -0
- package/client/assets/{Countdown-DQM2ppPg.js.map → Countdown-COte1yne.js.map} +1 -1
- package/client/assets/CuesheetTable-BQfxAp-I.js +2 -0
- package/client/assets/CuesheetTable-BQfxAp-I.js.br +0 -0
- package/client/assets/CuesheetTable-BQfxAp-I.js.gz +0 -0
- package/client/assets/CuesheetTable-BQfxAp-I.js.map +1 -0
- package/client/assets/CustomTranslationModal-C5mAtBjW.js +2 -0
- package/client/assets/CustomTranslationModal-C5mAtBjW.js.br +0 -0
- package/client/assets/CustomTranslationModal-C5mAtBjW.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-CML7Vsot.js.map → CustomTranslationModal-C5mAtBjW.js.map} +1 -1
- package/client/assets/{DelayIndicator-DKS6mZdB.js → DelayIndicator-B0cudY9N.js} +2 -2
- package/client/assets/DelayIndicator-B0cudY9N.js.br +0 -0
- package/client/assets/DelayIndicator-B0cudY9N.js.gz +0 -0
- package/client/assets/DelayIndicator-B0cudY9N.js.map +1 -0
- package/client/assets/{EditorFeatureWrapper-C1vLQxiy.js → EditorFeatureWrapper-DpDaCaJ3.js} +2 -2
- package/client/assets/EditorFeatureWrapper-DpDaCaJ3.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DpDaCaJ3.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-C1vLQxiy.js.map → EditorFeatureWrapper-DpDaCaJ3.js.map} +1 -1
- package/client/assets/{EditorUtils-BLcTuWz1.js → EditorUtils-k5KpETPG.js} +2 -2
- package/client/assets/EditorUtils-k5KpETPG.js.br +0 -0
- package/client/assets/EditorUtils-k5KpETPG.js.gz +0 -0
- package/client/assets/{EditorUtils-BLcTuWz1.js.map → EditorUtils-k5KpETPG.js.map} +1 -1
- package/client/assets/EmptyPage-aTb22KTq.js +2 -0
- package/client/assets/EmptyPage-aTb22KTq.js.br +0 -0
- package/client/assets/EmptyPage-aTb22KTq.js.gz +0 -0
- package/client/assets/{EmptyPage-CYVrjOvI.js.map → EmptyPage-aTb22KTq.js.map} +1 -1
- package/client/assets/{FollowButton-DcSbb4R_.js → FollowButton--Bj9S6jO.js} +2 -2
- package/client/assets/FollowButton--Bj9S6jO.js.br +0 -0
- package/client/assets/FollowButton--Bj9S6jO.js.gz +0 -0
- package/client/assets/{FollowButton-DcSbb4R_.js.map → FollowButton--Bj9S6jO.js.map} +1 -1
- package/client/assets/MessageControlExport-BN6OfADo.js +3 -0
- package/client/assets/MessageControlExport-BN6OfADo.js.br +0 -0
- package/client/assets/MessageControlExport-BN6OfADo.js.gz +0 -0
- package/client/assets/{MessageControlExport-BgT9JaXk.js.map → MessageControlExport-BN6OfADo.js.map} +1 -1
- package/client/assets/{MultiPartProgressBar-W2a-JWPY.js → MultiPartProgressBar-BlLJNQ0D.js} +2 -2
- package/client/assets/MultiPartProgressBar-BlLJNQ0D.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BlLJNQ0D.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-W2a-JWPY.js.map → MultiPartProgressBar-BlLJNQ0D.js.map} +1 -1
- package/client/assets/{OperatorExport-CbWojpp6.js → OperatorExport-CmgIl1lz.js} +2 -2
- package/client/assets/OperatorExport-CmgIl1lz.js.br +0 -0
- package/client/assets/OperatorExport-CmgIl1lz.js.gz +0 -0
- package/client/assets/OperatorExport-CmgIl1lz.js.map +1 -0
- package/client/assets/OverviewWrapper-B4nU68Eq.js +2 -0
- package/client/assets/OverviewWrapper-B4nU68Eq.js.br +0 -0
- package/client/assets/OverviewWrapper-B4nU68Eq.js.gz +0 -0
- package/client/assets/{OverviewWrapper-B2i8d3rt.js.map → OverviewWrapper-B4nU68Eq.js.map} +1 -1
- package/client/assets/OverviewWrapper-fPfl6o_p.css +1 -0
- package/client/assets/OverviewWrapper-fPfl6o_p.css.br +0 -0
- package/client/assets/OverviewWrapper-fPfl6o_p.css.gz +0 -0
- package/client/assets/{PipHost-Dz2oy7XG.js → PipHost-BZy7ouDv.js} +2 -2
- package/client/assets/PipHost-BZy7ouDv.js.br +0 -0
- package/client/assets/PipHost-BZy7ouDv.js.gz +0 -0
- package/client/assets/{PipHost-Dz2oy7XG.js.map → PipHost-BZy7ouDv.js.map} +1 -1
- package/client/assets/{ProjectInfo-BR_7Hp5u.js → ProjectInfo-D0X9vdIX.js} +2 -2
- package/client/assets/ProjectInfo-D0X9vdIX.js.br +0 -0
- package/client/assets/ProjectInfo-D0X9vdIX.js.gz +0 -0
- package/client/assets/{ProjectInfo-BR_7Hp5u.js.map → ProjectInfo-D0X9vdIX.js.map} +1 -1
- package/client/assets/ProtectRoute-DSilyhst.js +2 -0
- package/client/assets/ProtectRoute-DSilyhst.js.br +0 -0
- package/client/assets/ProtectRoute-DSilyhst.js.gz +0 -0
- package/client/assets/{ProtectRoute-Bxq6q7ba.js.map → ProtectRoute-DSilyhst.js.map} +1 -1
- package/client/assets/ProtectedCuesheet-DRTfZTZN.js +2 -0
- package/client/assets/ProtectedCuesheet-DRTfZTZN.js.br +0 -0
- package/client/assets/ProtectedCuesheet-DRTfZTZN.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-DRTfZTZN.js.map +1 -0
- package/client/assets/ProtectedEditor-DNOiQqIU.js +3 -0
- package/client/assets/ProtectedEditor-DNOiQqIU.js.br +0 -0
- package/client/assets/ProtectedEditor-DNOiQqIU.js.gz +0 -0
- package/client/assets/ProtectedEditor-DNOiQqIU.js.map +1 -0
- package/client/assets/ProtectedEditor-DyaLP0mG.css +1 -0
- package/client/assets/ProtectedEditor-DyaLP0mG.css.br +0 -0
- package/client/assets/ProtectedEditor-DyaLP0mG.css.gz +0 -0
- package/client/assets/{RundownExport-25orDQIW.js → RundownExport-Bvc1J50m.js} +2 -2
- package/client/assets/RundownExport-Bvc1J50m.js.br +0 -0
- package/client/assets/RundownExport-Bvc1J50m.js.gz +0 -0
- package/client/assets/RundownExport-Bvc1J50m.js.map +1 -0
- package/client/assets/{Select-BnGTAeXJ.js → Select-CvUrsmYI.js} +2 -2
- package/client/assets/Select-CvUrsmYI.js.br +0 -0
- package/client/assets/Select-CvUrsmYI.js.gz +0 -0
- package/client/assets/{Select-BnGTAeXJ.js.map → Select-CvUrsmYI.js.map} +1 -1
- package/client/assets/{Studio-BK2Klo_K.js → Studio-BSSiKd6k.js} +2 -2
- package/client/assets/Studio-BSSiKd6k.js.br +0 -0
- package/client/assets/Studio-BSSiKd6k.js.gz +0 -0
- package/client/assets/{Studio-BK2Klo_K.js.map → Studio-BSSiKd6k.js.map} +1 -1
- package/client/assets/{StyleEditor-DIHQ1PUV.js → StyleEditor-buc-zQHR.js} +2 -2
- package/client/assets/StyleEditor-buc-zQHR.js.br +0 -0
- package/client/assets/StyleEditor-buc-zQHR.js.gz +0 -0
- package/client/assets/{StyleEditor-DIHQ1PUV.js.map → StyleEditor-buc-zQHR.js.map} +1 -1
- package/client/assets/{SuperscriptPeriod-EEedc9rG.js → SuperscriptPeriod-CSX8zFgq.js} +2 -2
- package/client/assets/SuperscriptPeriod-CSX8zFgq.js.br +0 -0
- package/client/assets/SuperscriptPeriod-CSX8zFgq.js.gz +0 -0
- package/client/assets/{SuperscriptPeriod-EEedc9rG.js.map → SuperscriptPeriod-CSX8zFgq.js.map} +1 -1
- package/client/assets/{SuperscriptTime-BVanhNvd.js → SuperscriptTime-retbmT5o.js} +2 -2
- package/client/assets/SuperscriptTime-retbmT5o.js.br +0 -0
- package/client/assets/SuperscriptTime-retbmT5o.js.gz +0 -0
- package/client/assets/{SuperscriptTime-BVanhNvd.js.map → SuperscriptTime-retbmT5o.js.map} +1 -1
- package/client/assets/SwatchPicker-DuWAohyD.js +2 -0
- package/client/assets/SwatchPicker-DuWAohyD.js.br +0 -0
- package/client/assets/SwatchPicker-DuWAohyD.js.gz +0 -0
- package/client/assets/{SwatchPicker-Ckpchvjo.js.map → SwatchPicker-DuWAohyD.js.map} +1 -1
- package/client/assets/TimeElements-BfxdLkpO.js +2 -0
- package/client/assets/TimeElements-BfxdLkpO.js.br +0 -0
- package/client/assets/TimeElements-BfxdLkpO.js.gz +0 -0
- package/client/assets/{TimeElements-CYIgGk0T.js.map → TimeElements-BfxdLkpO.js.map} +1 -1
- package/client/assets/{TimeInput-Cwl9vLWA.js → TimeInput-BjOTgjcv.js} +2 -2
- package/client/assets/TimeInput-BjOTgjcv.js.br +0 -0
- package/client/assets/TimeInput-BjOTgjcv.js.gz +0 -0
- package/client/assets/{TimeInput-Cwl9vLWA.js.map → TimeInput-BjOTgjcv.js.map} +1 -1
- package/client/assets/{TimelinePage-D4QNdk-Z.js → TimelinePage-pjff5TxG.js} +2 -2
- package/client/assets/TimelinePage-pjff5TxG.js.br +0 -0
- package/client/assets/TimelinePage-pjff5TxG.js.gz +0 -0
- package/client/assets/TimelinePage-pjff5TxG.js.map +1 -0
- package/client/assets/{Timer-BJQKNHfo.js → Timer-ahF-O2zN.js} +2 -2
- package/client/assets/Timer-ahF-O2zN.js.br +0 -0
- package/client/assets/Timer-ahF-O2zN.js.gz +0 -0
- package/client/assets/{Timer-BJQKNHfo.js.map → Timer-ahF-O2zN.js.map} +1 -1
- package/client/assets/TimerControlExport-De2n8HWG.js +2 -0
- package/client/assets/TimerControlExport-De2n8HWG.js.br +0 -0
- package/client/assets/TimerControlExport-De2n8HWG.js.gz +0 -0
- package/client/assets/TimerControlExport-De2n8HWG.js.map +1 -0
- package/client/assets/TimerDisplay-DeFQvmo9.js +2 -0
- package/client/assets/TimerDisplay-DeFQvmo9.js.br +0 -0
- package/client/assets/TimerDisplay-DeFQvmo9.js.gz +0 -0
- package/client/assets/{TimerDisplay-tVcUk9j3.js.map → TimerDisplay-DeFQvmo9.js.map} +1 -1
- package/client/assets/{TitleCard-BNjv58eq.js → TitleCard-BiaQE4ZK.js} +2 -2
- package/client/assets/TitleCard-BiaQE4ZK.js.br +0 -0
- package/client/assets/TitleCard-BiaQE4ZK.js.gz +0 -0
- package/client/assets/{TitleCard-BNjv58eq.js.map → TitleCard-BiaQE4ZK.js.map} +1 -1
- package/client/assets/{Tooltip-DZJ7u9gm.js → Tooltip-C5iPq6NR.js} +2 -2
- package/client/assets/Tooltip-C5iPq6NR.js.br +0 -0
- package/client/assets/Tooltip-C5iPq6NR.js.gz +0 -0
- package/client/assets/{Tooltip-DZJ7u9gm.js.map → Tooltip-C5iPq6NR.js.map} +1 -1
- package/client/assets/{ViewLogo-2I7w5Yms.js → ViewLogo-DcDhyyIF.js} +2 -2
- package/client/assets/ViewLogo-DcDhyyIF.js.br +0 -0
- package/client/assets/ViewLogo-DcDhyyIF.js.gz +0 -0
- package/client/assets/{ViewLogo-2I7w5Yms.js.map → ViewLogo-DcDhyyIF.js.map} +1 -1
- package/client/assets/{ViewParamsEditor-BX2RM8sx.js → ViewParamsEditor-DeMdkxxC.js} +2 -2
- package/client/assets/ViewParamsEditor-DeMdkxxC.js.br +0 -0
- package/client/assets/ViewParamsEditor-DeMdkxxC.js.gz +0 -0
- package/client/assets/{ViewParamsEditor-BX2RM8sx.js.map → ViewParamsEditor-DeMdkxxC.js.map} +1 -1
- package/client/assets/{editorSettings-_x6YKRfR.js → editorSettings-xk5GwlLv.js} +2 -2
- package/client/assets/editorSettings-xk5GwlLv.js.br +0 -0
- package/client/assets/editorSettings-xk5GwlLv.js.gz +0 -0
- package/client/assets/{editorSettings-_x6YKRfR.js.map → editorSettings-xk5GwlLv.js.map} +1 -1
- package/client/assets/{getProgress-ZUTmCn_v.js → getProgress-CWSCZOIN.js} +2 -2
- package/client/assets/getProgress-CWSCZOIN.js.br +0 -0
- package/client/assets/getProgress-CWSCZOIN.js.gz +0 -0
- package/client/assets/{getProgress-ZUTmCn_v.js.map → getProgress-CWSCZOIN.js.map} +1 -1
- package/client/assets/index-3aosT33y.js +3 -0
- package/client/assets/index-3aosT33y.js.br +0 -0
- package/client/assets/index-3aosT33y.js.gz +0 -0
- package/client/assets/index-3aosT33y.js.map +1 -0
- package/client/assets/{offset-VthsmtrO.js → offset-yVqq_CB1.js} +2 -2
- package/client/assets/offset-yVqq_CB1.js.br +0 -0
- package/client/assets/offset-yVqq_CB1.js.gz +0 -0
- package/client/assets/{offset-VthsmtrO.js.map → offset-yVqq_CB1.js.map} +1 -1
- package/client/assets/parseUserTime-wAKk9aCJ.js +2 -0
- package/client/assets/parseUserTime-wAKk9aCJ.js.br +0 -0
- package/client/assets/parseUserTime-wAKk9aCJ.js.gz +0 -0
- package/client/assets/{parseUserTime-sZbEBi61.js.map → parseUserTime-wAKk9aCJ.js.map} +1 -1
- package/client/assets/{playbackstate-Dl_ZJABT.js → playbackstate-BZ9WYn2k.js} +2 -2
- package/client/assets/playbackstate-BZ9WYn2k.js.br +0 -0
- package/client/assets/playbackstate-BZ9WYn2k.js.gz +0 -0
- package/client/assets/{playbackstate-Dl_ZJABT.js.map → playbackstate-BZ9WYn2k.js.map} +1 -1
- package/client/assets/{presentation.utils-Z61KykAH.js → presentation.utils-lyuuD4A5.js} +2 -2
- package/client/assets/presentation.utils-lyuuD4A5.js.br +0 -0
- package/client/assets/presentation.utils-lyuuD4A5.js.gz +0 -0
- package/client/assets/{presentation.utils-Z61KykAH.js.map → presentation.utils-lyuuD4A5.js.map} +1 -1
- package/client/assets/{rundownUtils-CXZRD6yP.js → rundownUtils-XX_c4Pcl.js} +2 -2
- package/client/assets/rundownUtils-XX_c4Pcl.js.br +0 -0
- package/client/assets/rundownUtils-XX_c4Pcl.js.gz +0 -0
- package/client/assets/{rundownUtils-CXZRD6yP.js.map → rundownUtils-XX_c4Pcl.js.map} +1 -1
- package/client/assets/{timer.utils-B4bvsns3.js → timer.utils-CWHFVz06.js} +2 -2
- package/client/assets/timer.utils-CWHFVz06.js.br +0 -0
- package/client/assets/timer.utils-CWHFVz06.js.gz +0 -0
- package/client/assets/{timer.utils-B4bvsns3.js.map → timer.utils-CWHFVz06.js.map} +1 -1
- package/client/assets/useCustomFields-kBD1jvDA.js +2 -0
- package/client/assets/useCustomFields-kBD1jvDA.js.br +0 -0
- package/client/assets/useCustomFields-kBD1jvDA.js.gz +0 -0
- package/client/assets/{useCustomFields-BBE4LBBr.js.map → useCustomFields-kBD1jvDA.js.map} +1 -1
- package/client/assets/{useEventSelection-Bpbu89c7.js → useEventSelection-Cvdw9all.js} +2 -2
- package/client/assets/useEventSelection-Cvdw9all.js.br +0 -0
- package/client/assets/useEventSelection-Cvdw9all.js.gz +0 -0
- package/client/assets/{useEventSelection-Bpbu89c7.js.map → useEventSelection-Cvdw9all.js.map} +1 -1
- package/client/assets/{useProjectData-C110zIXC.js → useProjectData-gGT2eczr.js} +2 -2
- package/client/assets/useProjectData-gGT2eczr.js.br +0 -0
- package/client/assets/useProjectData-gGT2eczr.js.gz +0 -0
- package/client/assets/{useProjectData-C110zIXC.js.map → useProjectData-gGT2eczr.js.map} +1 -1
- package/client/assets/{useReport-DqSBq4MG.js → useReport-CG6m_Zb0.js} +2 -2
- package/client/assets/useReport-CG6m_Zb0.js.br +0 -0
- package/client/assets/useReport-CG6m_Zb0.js.gz +0 -0
- package/client/assets/{useReport-DqSBq4MG.js.map → useReport-CG6m_Zb0.js.map} +1 -1
- package/client/assets/{useRundown-DAo6huE4.js → useRundown-C6stroSA.js} +2 -2
- package/client/assets/useRundown-C6stroSA.js.br +0 -0
- package/client/assets/useRundown-C6stroSA.js.gz +0 -0
- package/client/assets/useRundown-C6stroSA.js.map +1 -0
- package/client/assets/{useSelectAndRevealEntry-DTg0hmxA.js → useSelectAndRevealEntry-D79sYFHr.js} +2 -2
- package/client/assets/useSelectAndRevealEntry-D79sYFHr.js.br +0 -0
- package/client/assets/useSelectAndRevealEntry-D79sYFHr.js.gz +0 -0
- package/client/assets/{useSelectAndRevealEntry-DTg0hmxA.js.map → useSelectAndRevealEntry-D79sYFHr.js.map} +1 -1
- package/client/assets/{useWindowTitle-DM8dIp8L.js → useWindowTitle-CQ8nEeel.js} +2 -2
- package/client/assets/useWindowTitle-CQ8nEeel.js.br +0 -0
- package/client/assets/useWindowTitle-CQ8nEeel.js.gz +0 -0
- package/client/assets/{useWindowTitle-DM8dIp8L.js.map → useWindowTitle-CQ8nEeel.js.map} +1 -1
- package/client/assets/{validateEvent-GnPt-e9-.js → validateEvent-BnwPmDph.js} +2 -2
- package/client/assets/validateEvent-BnwPmDph.js.br +0 -0
- package/client/assets/validateEvent-BnwPmDph.js.gz +0 -0
- package/client/assets/{validateEvent-GnPt-e9-.js.map → validateEvent-BnwPmDph.js.map} +1 -1
- package/client/assets/{vendor-BKUJ0_Du.js → vendor-Dt3_Fdfs.js} +2 -2
- package/client/assets/vendor-Dt3_Fdfs.js.br +0 -0
- package/client/assets/vendor-Dt3_Fdfs.js.gz +0 -0
- package/client/assets/{vendor-BKUJ0_Du.js.map → vendor-Dt3_Fdfs.js.map} +1 -1
- package/client/assets/{viewLoader.utils-4lL4PiNI.js → viewLoader.utils-H7r-zNPP.js} +2 -2
- package/client/assets/viewLoader.utils-H7r-zNPP.js.br +0 -0
- package/client/assets/viewLoader.utils-H7r-zNPP.js.gz +0 -0
- package/client/assets/{viewLoader.utils-4lL4PiNI.js.map → viewLoader.utils-H7r-zNPP.js.map} +1 -1
- package/client/assets/{viewUtils-29a3Mmiu.js → viewUtils-k0tARVDN.js} +2 -2
- package/client/assets/viewUtils-k0tARVDN.js.br +0 -0
- package/client/assets/viewUtils-k0tARVDN.js.gz +0 -0
- package/client/assets/{viewUtils-29a3Mmiu.js.map → viewUtils-k0tARVDN.js.map} +1 -1
- package/client/index.html +2 -2
- package/package.json +1 -1
- package/server/index.cjs +104 -104
- package/client/assets/Backstage-BdrcXNr9.js.br +0 -0
- package/client/assets/Backstage-BdrcXNr9.js.gz +0 -0
- package/client/assets/Countdown-DQM2ppPg.js.br +0 -0
- package/client/assets/Countdown-DQM2ppPg.js.gz +0 -0
- package/client/assets/CuesheetTable-B5LQVh5m.js +0 -2
- package/client/assets/CuesheetTable-B5LQVh5m.js.br +0 -0
- package/client/assets/CuesheetTable-B5LQVh5m.js.gz +0 -0
- package/client/assets/CuesheetTable-B5LQVh5m.js.map +0 -1
- package/client/assets/CustomTranslationModal-CML7Vsot.js +0 -2
- package/client/assets/CustomTranslationModal-CML7Vsot.js.br +0 -0
- package/client/assets/CustomTranslationModal-CML7Vsot.js.gz +0 -0
- package/client/assets/DelayIndicator-DKS6mZdB.js.br +0 -0
- package/client/assets/DelayIndicator-DKS6mZdB.js.gz +0 -0
- package/client/assets/DelayIndicator-DKS6mZdB.js.map +0 -1
- package/client/assets/EditorFeatureWrapper-C1vLQxiy.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-C1vLQxiy.js.gz +0 -0
- package/client/assets/EditorUtils-BLcTuWz1.js.br +0 -0
- package/client/assets/EditorUtils-BLcTuWz1.js.gz +0 -0
- package/client/assets/EmptyPage-CYVrjOvI.js +0 -2
- package/client/assets/EmptyPage-CYVrjOvI.js.br +0 -0
- package/client/assets/EmptyPage-CYVrjOvI.js.gz +0 -0
- package/client/assets/FollowButton-DcSbb4R_.js.br +0 -0
- package/client/assets/FollowButton-DcSbb4R_.js.gz +0 -0
- package/client/assets/MessageControlExport-BgT9JaXk.js +0 -3
- package/client/assets/MessageControlExport-BgT9JaXk.js.br +0 -0
- package/client/assets/MessageControlExport-BgT9JaXk.js.gz +0 -0
- package/client/assets/MultiPartProgressBar-W2a-JWPY.js.br +0 -0
- package/client/assets/MultiPartProgressBar-W2a-JWPY.js.gz +0 -0
- package/client/assets/OperatorExport-CbWojpp6.js.br +0 -0
- package/client/assets/OperatorExport-CbWojpp6.js.gz +0 -0
- package/client/assets/OperatorExport-CbWojpp6.js.map +0 -1
- package/client/assets/OverviewWrapper-B2i8d3rt.js +0 -2
- package/client/assets/OverviewWrapper-B2i8d3rt.js.br +0 -0
- package/client/assets/OverviewWrapper-B2i8d3rt.js.gz +0 -0
- package/client/assets/OverviewWrapper-DOYzR0Ef.css +0 -1
- package/client/assets/OverviewWrapper-DOYzR0Ef.css.br +0 -0
- package/client/assets/OverviewWrapper-DOYzR0Ef.css.gz +0 -0
- package/client/assets/PipHost-Dz2oy7XG.js.br +0 -0
- package/client/assets/PipHost-Dz2oy7XG.js.gz +0 -0
- package/client/assets/ProjectInfo-BR_7Hp5u.js.br +0 -0
- package/client/assets/ProjectInfo-BR_7Hp5u.js.gz +0 -0
- package/client/assets/ProtectRoute-Bxq6q7ba.js +0 -2
- package/client/assets/ProtectRoute-Bxq6q7ba.js.br +0 -0
- package/client/assets/ProtectRoute-Bxq6q7ba.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-C7AqD2dy.js +0 -2
- package/client/assets/ProtectedCuesheet-C7AqD2dy.js.br +0 -0
- package/client/assets/ProtectedCuesheet-C7AqD2dy.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-C7AqD2dy.js.map +0 -1
- package/client/assets/ProtectedEditor-CsfvVyOU.js +0 -3
- package/client/assets/ProtectedEditor-CsfvVyOU.js.br +0 -0
- package/client/assets/ProtectedEditor-CsfvVyOU.js.gz +0 -0
- package/client/assets/ProtectedEditor-CsfvVyOU.js.map +0 -1
- package/client/assets/ProtectedEditor-DID9cfOA.css +0 -1
- package/client/assets/ProtectedEditor-DID9cfOA.css.br +0 -0
- package/client/assets/ProtectedEditor-DID9cfOA.css.gz +0 -0
- package/client/assets/RundownExport-25orDQIW.js.br +0 -0
- package/client/assets/RundownExport-25orDQIW.js.gz +0 -0
- package/client/assets/RundownExport-25orDQIW.js.map +0 -1
- package/client/assets/Select-BnGTAeXJ.js.br +0 -0
- package/client/assets/Select-BnGTAeXJ.js.gz +0 -0
- package/client/assets/Studio-BK2Klo_K.js.br +0 -0
- package/client/assets/Studio-BK2Klo_K.js.gz +0 -0
- package/client/assets/StyleEditor-DIHQ1PUV.js.br +0 -0
- package/client/assets/StyleEditor-DIHQ1PUV.js.gz +0 -0
- package/client/assets/SuperscriptPeriod-EEedc9rG.js.br +0 -0
- package/client/assets/SuperscriptPeriod-EEedc9rG.js.gz +0 -0
- package/client/assets/SuperscriptTime-BVanhNvd.js.br +0 -0
- package/client/assets/SuperscriptTime-BVanhNvd.js.gz +0 -0
- package/client/assets/SwatchPicker-Ckpchvjo.js +0 -2
- package/client/assets/SwatchPicker-Ckpchvjo.js.br +0 -0
- package/client/assets/SwatchPicker-Ckpchvjo.js.gz +0 -0
- package/client/assets/TimeElements-CYIgGk0T.js +0 -2
- package/client/assets/TimeElements-CYIgGk0T.js.br +0 -0
- package/client/assets/TimeElements-CYIgGk0T.js.gz +0 -0
- package/client/assets/TimeInput-Cwl9vLWA.js.br +0 -0
- package/client/assets/TimeInput-Cwl9vLWA.js.gz +0 -0
- package/client/assets/TimelinePage-D4QNdk-Z.js.br +0 -0
- package/client/assets/TimelinePage-D4QNdk-Z.js.gz +0 -0
- package/client/assets/TimelinePage-D4QNdk-Z.js.map +0 -1
- package/client/assets/Timer-BJQKNHfo.js.br +0 -0
- package/client/assets/Timer-BJQKNHfo.js.gz +0 -0
- package/client/assets/TimerControlExport-Ba1vifNg.js +0 -2
- package/client/assets/TimerControlExport-Ba1vifNg.js.br +0 -0
- package/client/assets/TimerControlExport-Ba1vifNg.js.gz +0 -0
- package/client/assets/TimerControlExport-Ba1vifNg.js.map +0 -1
- package/client/assets/TimerDisplay-tVcUk9j3.js +0 -2
- package/client/assets/TimerDisplay-tVcUk9j3.js.br +0 -0
- package/client/assets/TimerDisplay-tVcUk9j3.js.gz +0 -0
- package/client/assets/TitleCard-BNjv58eq.js.br +0 -0
- package/client/assets/TitleCard-BNjv58eq.js.gz +0 -0
- package/client/assets/Tooltip-DZJ7u9gm.js.br +0 -4
- package/client/assets/Tooltip-DZJ7u9gm.js.gz +0 -0
- package/client/assets/ViewLogo-2I7w5Yms.js.br +0 -0
- package/client/assets/ViewLogo-2I7w5Yms.js.gz +0 -0
- package/client/assets/ViewParamsEditor-BX2RM8sx.js.br +0 -0
- package/client/assets/ViewParamsEditor-BX2RM8sx.js.gz +0 -0
- package/client/assets/editorSettings-_x6YKRfR.js.br +0 -6
- package/client/assets/editorSettings-_x6YKRfR.js.gz +0 -0
- package/client/assets/getProgress-ZUTmCn_v.js.br +0 -0
- package/client/assets/getProgress-ZUTmCn_v.js.gz +0 -0
- package/client/assets/index-Dm-4OTmY.js +0 -3
- package/client/assets/index-Dm-4OTmY.js.br +0 -0
- package/client/assets/index-Dm-4OTmY.js.gz +0 -0
- package/client/assets/index-Dm-4OTmY.js.map +0 -1
- package/client/assets/offset-VthsmtrO.js.br +0 -0
- package/client/assets/offset-VthsmtrO.js.gz +0 -0
- package/client/assets/parseUserTime-sZbEBi61.js +0 -2
- package/client/assets/parseUserTime-sZbEBi61.js.br +0 -0
- package/client/assets/parseUserTime-sZbEBi61.js.gz +0 -0
- package/client/assets/playbackstate-Dl_ZJABT.js.br +0 -0
- package/client/assets/playbackstate-Dl_ZJABT.js.gz +0 -0
- package/client/assets/presentation.utils-Z61KykAH.js.br +0 -0
- package/client/assets/presentation.utils-Z61KykAH.js.gz +0 -0
- package/client/assets/rundownUtils-CXZRD6yP.js.br +0 -0
- package/client/assets/rundownUtils-CXZRD6yP.js.gz +0 -0
- package/client/assets/timer.utils-B4bvsns3.js.br +0 -0
- package/client/assets/timer.utils-B4bvsns3.js.gz +0 -0
- package/client/assets/useCustomFields-BBE4LBBr.js +0 -2
- package/client/assets/useCustomFields-BBE4LBBr.js.br +0 -0
- package/client/assets/useCustomFields-BBE4LBBr.js.gz +0 -0
- package/client/assets/useEventSelection-Bpbu89c7.js.br +0 -0
- package/client/assets/useEventSelection-Bpbu89c7.js.gz +0 -0
- package/client/assets/useProjectData-C110zIXC.js.br +0 -0
- package/client/assets/useProjectData-C110zIXC.js.gz +0 -0
- package/client/assets/useReport-DqSBq4MG.js.br +0 -0
- package/client/assets/useReport-DqSBq4MG.js.gz +0 -0
- package/client/assets/useRundown-DAo6huE4.js.br +0 -0
- package/client/assets/useRundown-DAo6huE4.js.gz +0 -0
- package/client/assets/useRundown-DAo6huE4.js.map +0 -1
- package/client/assets/useSelectAndRevealEntry-DTg0hmxA.js.br +0 -0
- package/client/assets/useSelectAndRevealEntry-DTg0hmxA.js.gz +0 -0
- package/client/assets/useWindowTitle-DM8dIp8L.js.br +0 -0
- package/client/assets/useWindowTitle-DM8dIp8L.js.gz +0 -0
- package/client/assets/validateEvent-GnPt-e9-.js.br +0 -0
- package/client/assets/validateEvent-GnPt-e9-.js.gz +0 -0
- package/client/assets/vendor-BKUJ0_Du.js.br +0 -0
- package/client/assets/vendor-BKUJ0_Du.js.gz +0 -0
- package/client/assets/viewLoader.utils-4lL4PiNI.js.br +0 -0
- package/client/assets/viewLoader.utils-4lL4PiNI.js.gz +0 -0
- package/client/assets/viewUtils-29a3Mmiu.js.br +0 -0
- package/client/assets/viewUtils-29a3Mmiu.js.gz +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DelayIndicator-DKS6mZdB.js","sources":["../../../../packages/utils/src/validate-times/validateTimes.ts","../../../../packages/utils/src/rundown-utils/entryDefinitions.ts","../../../../packages/utils/src/rundown-utils/entryUtils.ts","../../src/features/rundown/rundown.utils.ts","../../src/common/hooks/useEntryAction.ts","../../src/common/utils/dateConfig.ts","../../src/common/components/delay-indicator/DelayIndicator.tsx"],"sourcesContent":["import type { OntimeEvent } from 'ontime-types';\nimport { TimeStrategy } from 'ontime-types';\n\nimport { dayInMs } from '../date-utils/conversionUtils.js';\nimport { validateTimeStrategy } from '../validate-events/validateEvent.js';\n\nexport function getLinkedTimes(\n target: OntimeEvent,\n source: OntimeEvent,\n): { timeStart: number; duration: number; timeEnd: number } {\n const lockEnd = target.timeStrategy === TimeStrategy.LockEnd;\n const lockDuration = target.timeStrategy === TimeStrategy.LockDuration;\n const newStart = source.timeEnd;\n\n const timePatch = {\n timeStart: newStart,\n timeEnd: lockEnd ? target.timeEnd : calculateEnd(newStart, target.duration),\n duration: lockDuration ? target.duration : calculateDuration(newStart, target.timeEnd),\n };\n\n return timePatch;\n}\n\nfunction inferTimes(\n _start?: unknown,\n _end?: unknown,\n _duration?: unknown,\n): { timeStart: number; duration: number; timeEnd: number; timeStrategy: TimeStrategy } {\n const timeStart = convertToInteger(_start);\n const timeEnd = convertToInteger(_end);\n const duration = convertToInteger(_duration);\n\n // TODO: prevent overflow\n\n if (_start != null && _end != null) {\n // Case 1. if we have start and end, duration must be derived\n return {\n timeStart,\n duration: calculateDuration(timeStart, timeEnd),\n timeEnd,\n timeStrategy: _duration != null ? TimeStrategy.LockDuration : TimeStrategy.LockEnd,\n };\n }\n\n if (_start == null && _end == null) {\n if (_duration == null) {\n // Case 2. no valid times were given\n return { timeStart: 0, duration: 0, timeEnd: 0, timeStrategy: TimeStrategy.LockDuration };\n }\n // Case 3. we have a duration and infer the rest\n return { timeStart, duration, timeEnd: duration, timeStrategy: TimeStrategy.LockDuration };\n }\n\n if (_start != null) {\n // Case 5. with only start, we can calculate the rest\n return { timeStart, duration, timeEnd: (timeStart + duration) % dayInMs, timeStrategy: TimeStrategy.LockDuration };\n }\n\n if (_end != null) {\n // Case 6. with only end, we can calculate the rest\n return {\n timeStart: timeEnd - duration,\n duration,\n timeEnd,\n timeStrategy: _duration != null ? TimeStrategy.LockDuration : TimeStrategy.LockEnd,\n };\n }\n\n // we should have covered all cases\n return { timeStart, duration, timeEnd, timeStrategy: TimeStrategy.LockDuration };\n}\n\n/**\n * Ensures the time input variables are valid in relationship to each other\n * Infers values if necessary\n * @param _start\n * @param _end\n * @param _duration\n */\nexport function validateTimes(\n _start?: unknown,\n _end?: unknown,\n _duration?: unknown,\n _strategy?: TimeStrategy,\n): { timeStart: number; duration: number; timeEnd: number; timeStrategy: TimeStrategy } {\n if (_strategy == null) {\n // if no strategy is given we infer it from given parameters\n return inferTimes(_start, _end, _duration);\n }\n\n const timeStrategy = validateTimeStrategy(_strategy);\n const timeStart = convertToInteger(_start);\n let timeEnd = convertToInteger(_end);\n let duration = convertToInteger(_duration);\n\n if (timeStrategy === TimeStrategy.LockEnd) {\n duration = calculateDuration(timeStart, timeEnd);\n } else {\n timeEnd = calculateEnd(timeStart, duration);\n }\n return { timeStart, duration, timeEnd, timeStrategy };\n}\n\n/**\n * @description calculates event duration considering midnight\n * @param {number} timeStart\n * @param {number} timeEnd\n * @returns {number}\n */\nexport function calculateDuration(timeStart: number, timeEnd: number): number {\n // Durations must be positive\n if (timeEnd < timeStart) {\n return timeEnd + dayInMs - timeStart;\n }\n return timeEnd - timeStart;\n}\n\nexport function calculateEnd(timeStart: number, duration: number): number {\n return (timeStart + duration) % dayInMs;\n}\n\n/**\n * Converts a given value to an int, returns 0 otherwise\n * @param value\n * number\n */\nfunction convertToInteger(value: unknown): number {\n const result = Number(value);\n return isNaN(result) ? 0 : Math.floor(result);\n}\n","import type { OntimeDelay, OntimeEvent, OntimeGroup, OntimeMilestone } from 'ontime-types';\nimport { EndAction, SupportedEntry, TimerType, TimeStrategy } from 'ontime-types';\n\nexport const event: Omit<OntimeEvent, 'id' | 'cue'> = {\n type: SupportedEntry.Event,\n flag: false,\n title: '',\n note: '',\n endAction: EndAction.None,\n timerType: TimerType.CountDown,\n timeStrategy: TimeStrategy.LockDuration,\n linkStart: false,\n countToEnd: false,\n timeStart: 0,\n timeEnd: 0,\n duration: 0,\n skip: false,\n colour: '',\n timeWarning: 120000,\n timeDanger: 60000,\n triggers: [],\n custom: {},\n // !==== RUNTIME METADATA ====! //\n parent: null,\n revision: 0, // calculated at runtime\n delay: 0, // calculated at runtime\n dayOffset: 0, // calculated at runtime\n gap: 0, // calculated at runtime\n};\n\nexport const delay: Omit<OntimeDelay, 'id'> = {\n type: SupportedEntry.Delay,\n duration: 0,\n parent: null,\n};\n\nexport const milestone: Omit<OntimeMilestone, 'id'> = {\n type: SupportedEntry.Milestone,\n cue: '',\n title: '',\n note: '',\n colour: '',\n custom: {},\n parent: null,\n // !==== RUNTIME METADATA ====! //\n revision: 0, // calculated at runtime\n};\n\nexport const group: Omit<OntimeGroup, 'id'> = {\n type: SupportedEntry.Group,\n title: '',\n note: '',\n entries: [],\n targetDuration: null,\n colour: '',\n custom: {},\n // !==== RUNTIME METADATA ====! //\n revision: 0, // calculated at runtime\n timeStart: null, // calculated at runtime\n timeEnd: null, // calculated at runtime\n duration: 0, // calculated at runtime\n isFirstLinked: false, // calculated at runtime\n};\n","import type { OntimeDelay, OntimeEvent, OntimeGroup, OntimeMilestone } from 'ontime-types';\nimport { SupportedEntry, TimeStrategy } from 'ontime-types';\n\nimport { generateId } from '../generate-id/generateId.js';\nimport { validateEndAction, validateTimerType } from '../validate-events/validateEvent.js';\nimport { validateTimes } from '../validate-times/validateTimes.js';\nimport { event as eventDef, group as groupDef, milestone as milestoneDef } from './entryDefinitions.js';\n\n/**\n * @description Ensures variable is string, it skips object types\n * @param val - variable to convert\n * @param {string} [fallback=''] - fallback value\n * @returns {string} - value as string or fallback if not possible\n */\nexport const makeString = (val: unknown, fallback = ''): string => {\n if (typeof val === 'string') return val.trim();\n else if (val == null || val.constructor === Object) return fallback;\n return val.toString().trim();\n};\n\n/**\n * Creates a new delay from an optional patch\n */\nexport function createDelay(patch?: Partial<OntimeDelay>): OntimeDelay {\n return {\n type: SupportedEntry.Delay,\n id: patch?.id ?? generateId(),\n duration: patch?.duration ?? 0,\n parent: patch?.parent ?? null,\n };\n}\n\n/**\n * @description Enforces formatting for events\n * @param {object} eventArgs - attributes of event\n * @param {number} eventIndex - can be a string when we pass the a suggested cue name\n * @returns {object|null} - formatted object or null in case is invalid\n */\nexport const createEvent = (eventArgs: Partial<OntimeEvent>, eventIndex: number | string = ''): OntimeEvent | null => {\n if (Object.keys(eventArgs).length === 0) {\n return null;\n }\n\n const cue = typeof eventIndex === 'number' ? String(eventIndex + 1) : eventIndex;\n\n const baseEvent = {\n id: eventArgs?.id ?? generateId(),\n cue,\n ...eventDef,\n };\n const event = createEventPatch(baseEvent, eventArgs);\n return event;\n};\n\n/**\n * Creates a new group from an optional patch\n */\nexport function createGroup(patch?: Partial<OntimeGroup>): OntimeGroup {\n if (!patch) {\n return { ...groupDef, id: generateId() };\n }\n\n return {\n id: patch.id ?? generateId(),\n type: SupportedEntry.Group,\n title: patch.title ?? '',\n note: patch.note ?? '',\n entries: patch.entries ?? [],\n targetDuration: patch.targetDuration ?? null,\n colour: makeString(patch.colour, ''),\n custom: patch.custom ?? {},\n revision: 0,\n timeStart: null,\n timeEnd: null,\n duration: 0,\n isFirstLinked: false,\n };\n}\n\n/**\n * Creates a new milestone from an optional patch\n */\nexport function createMilestone(patch?: Partial<OntimeMilestone>): OntimeMilestone {\n if (!patch) {\n return { ...milestoneDef, id: generateId() };\n }\n\n return {\n id: patch.id ?? generateId(),\n type: SupportedEntry.Milestone,\n cue: patch.cue ?? '',\n title: patch.title ?? '',\n note: patch.note ?? '',\n colour: makeString(patch.colour, ''),\n custom: patch.custom ?? {},\n parent: patch.parent ?? null,\n revision: 0,\n };\n}\n\n/**\n * Function infers strategy for a patch with only partial timer data\n */\nfunction inferStrategy(end: unknown, duration: unknown, fallback: TimeStrategy): TimeStrategy {\n if (end && !duration) {\n return TimeStrategy.LockEnd;\n }\n\n if (!end && duration) {\n return TimeStrategy.LockDuration;\n }\n return fallback;\n}\n\nfunction createEventPatch(originalEvent: OntimeEvent, patchEvent: Partial<OntimeEvent>): OntimeEvent {\n if (Object.keys(patchEvent).length === 0) {\n return originalEvent;\n }\n\n const { timeStart, timeEnd, duration, timeStrategy } = validateTimes(\n patchEvent?.timeStart ?? originalEvent.timeStart,\n patchEvent?.timeEnd ?? originalEvent.timeEnd,\n patchEvent?.duration ?? originalEvent.duration,\n patchEvent?.timeStrategy ?? inferStrategy(patchEvent?.timeEnd, patchEvent?.duration, originalEvent.timeStrategy),\n );\n\n return {\n id: originalEvent.id,\n type: SupportedEntry.Event,\n flag: typeof patchEvent.flag === 'boolean' ? patchEvent.flag : originalEvent.flag,\n title: makeString(patchEvent.title, originalEvent.title),\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart: typeof patchEvent.linkStart === 'boolean' ? patchEvent.linkStart : originalEvent.linkStart,\n endAction: validateEndAction(patchEvent.endAction, originalEvent.endAction),\n timerType: validateTimerType(patchEvent.timerType, originalEvent.timerType),\n countToEnd: typeof patchEvent.countToEnd === 'boolean' ? patchEvent.countToEnd : originalEvent.countToEnd,\n skip: typeof patchEvent.skip === 'boolean' ? patchEvent.skip : originalEvent.skip,\n note: makeString(patchEvent.note, originalEvent.note),\n colour: makeString(patchEvent.colour, originalEvent.colour),\n delay: originalEvent.delay, // is regenerated if timer related data is changed\n dayOffset: originalEvent.dayOffset, // is regenerated if timer related data is changed\n gap: originalEvent.gap, // is regenerated if timer related data is changed\n // short circuit empty string\n cue: makeString(patchEvent.cue ?? null, originalEvent.cue),\n parent: originalEvent.parent,\n revision: originalEvent.revision,\n timeWarning: patchEvent.timeWarning ?? originalEvent.timeWarning,\n timeDanger: patchEvent.timeDanger ?? originalEvent.timeDanger,\n custom: { ...originalEvent.custom, ...patchEvent.custom },\n triggers: patchEvent.triggers ?? originalEvent.triggers,\n };\n}\n","import { EntryId, isOntimeGroup, RundownEntries, SupportedEntry } from 'ontime-types';\n\n/**\n * Creates a sortable list of entries\n * ------------------------------------\n * Due to limitations in dnd-kit we need to flatten the list of entries\n * This list should also be aware of any elements that are sortable (ie: group ends)\n *\n * Note: This creates the FULL structure including all entries and pseudo end-group entries.\n * For rendering, use filterVisibleEntries() to exclude collapsed items.\n */\nexport function makeSortableList(order: EntryId[], entries: RundownEntries): EntryId[] {\n const flatIds: EntryId[] = [];\n\n for (let i = 0; i < order.length; i++) {\n const entry = entries[order[i]];\n\n if (!entry) {\n continue;\n }\n\n if (isOntimeGroup(entry)) {\n // inside a group there are delays and events\n // there is no need for special handling\n flatIds.push(entry.id);\n flatIds.push(...entry.entries);\n\n // close the group\n flatIds.push(`end-${entry.id}`);\n } else {\n flatIds.push(entry.id);\n }\n }\n return flatIds;\n}\n\n/**\n * Filters sortable list to only include visible entries based on collapsed state\n * ------------------------------------\n * Excludes:\n * - Children of collapsed groups\n * - End-group markers of collapsed groups\n *\n * This is used by Virtuoso for rendering, while DND-kit uses the full sortableData.\n */\nexport function filterVisibleEntries(\n sortableData: EntryId[],\n entries: RundownEntries,\n getIsCollapsed: (groupId: EntryId) => boolean,\n): EntryId[] {\n return sortableData.filter((entryId) => {\n // group end pseudo entries are only shown if the group is expanded\n if (entryId.startsWith('end-')) {\n const parentId = entryId.split('end-')[1];\n return !getIsCollapsed(parentId);\n }\n\n // retrieve the entry as usual\n const entry = entries[entryId];\n if (!entry) {\n return false;\n }\n\n // if entry has a parent and parent is collapsed, filter it out\n if (entry.type !== SupportedEntry.Group && 'parent' in entry && entry.parent) {\n return !getIsCollapsed(entry.parent);\n }\n\n return true;\n });\n}\n\n/**\n * Checks whether a drop operation is valid\n * Currently only used for validating dropping groups\n */\nexport function canDrop(\n targetType: SupportedEntry | 'end-group',\n targetParent: EntryId | null,\n order?: 'after' | 'before',\n isTargetCollapsed?: boolean,\n): boolean {\n // inserting before would mean adding a group inside another\n if (targetType === 'end-group') {\n return order === 'after';\n }\n\n // this means swapping places with another group\n // !!! if the user is dragging down, they could be inserting into a group depending on whether the group is collapsed\n if (targetType === 'group') {\n if (order !== undefined && order === 'after' && !isTargetCollapsed) {\n return false;\n }\n return true;\n }\n\n // for all other cases, we just need to check if we are inside a group\n return targetParent === null;\n}\n\n/**\n * calculates destinations for an entry moving one position up in the rundown\n * @returns An object describing how to move the entry:\n * - destinationId: The target entry ID (null if no movement possible)\n * - order: How to position relative to the destination:\n * - 'before': Place before the destination\n * - 'after': Place after the destination\n * - 'insert': Insert into the destination (for groups)\n */\nexport function moveUp(\n entryId: EntryId,\n flatOrder: EntryId[],\n entries: RundownEntries,\n): { destinationId: EntryId | null; order: 'before' | 'after' | 'insert' } {\n const currentEntry = entries[entryId];\n const currentIndex = flatOrder.indexOf(entryId);\n const previousEntryId = flatOrder[currentIndex - 1];\n\n // 1. moving at the top of the list\n if (!previousEntryId) {\n // 1a. we are in a group and need to move outside of it\n if ('parent' in currentEntry && currentEntry.parent !== null) {\n return { destinationId: currentEntry.parent, order: 'before' };\n }\n // 1b. we are at the start of the rundown, no movement possible\n return { destinationId: null, order: 'before' };\n }\n\n // 2. moving a group (always moves at top level)\n if (isOntimeGroup(currentEntry)) {\n // 21. if previous entry is inside a group, swap with parent\n const previousEntry = entries[previousEntryId];\n if ('parent' in previousEntry && previousEntry.parent !== null) {\n return { destinationId: previousEntry.parent, order: 'before' };\n }\n\n // 2b. previous entry is at top level, we just swap places\n return { destinationId: previousEntryId, order: 'before' };\n }\n\n const previousEntry = entries[previousEntryId];\n const currentEntryParent = currentEntry.parent;\n\n // 3. moving in and out of a group\n if (isOntimeGroup(previousEntry)) {\n // 3a. if we're not already in the group, move into it\n if (currentEntryParent === null) {\n return { destinationId: previousEntryId, order: 'insert' };\n }\n // 3b. otherwise, move before the group\n return { destinationId: previousEntryId, order: 'before' };\n }\n\n // 4. moving into the same group as previous entry\n if ('parent' in previousEntry && previousEntry.parent !== null && currentEntryParent === null) {\n return { destinationId: previousEntryId, order: 'after' };\n }\n\n // default - swap positions with previous entry\n return { destinationId: previousEntryId, order: 'before' };\n}\n\n/**\n * calculates destinations for an entry moving one position down in the rundown\n * @returns An object describing how to move the entry:\n * - destinationId: The target entry ID (null if no movement possible)\n * - order: How to position relative to the destination:\n * - 'before': Place before the destination\n * - 'after': Place after the destination\n * - 'insert': Insert into the destination (for groups)\n */\nexport function moveDown(\n entryId: EntryId,\n flatOrder: EntryId[],\n entries: RundownEntries,\n): { destinationId: EntryId | null; order: 'before' | 'after' | 'insert' } {\n const currentEntry = entries[entryId];\n const currentIndex = flatOrder.indexOf(entryId);\n const nextEntryId = flatOrder[currentIndex + 1];\n\n // 1. check if we're the last entry in a group\n if ('parent' in currentEntry && currentEntry.parent !== null) {\n const parentGroup = entries[currentEntry.parent];\n if (isOntimeGroup(parentGroup) && parentGroup.entries[parentGroup.entries.length - 1] === entryId) {\n return { destinationId: currentEntry.parent, order: 'after' };\n }\n }\n\n // 2. moving at the end of the list\n if (!nextEntryId) {\n return { destinationId: null, order: 'after' };\n }\n\n // 3. moving a group (always moves at top level)\n if (isOntimeGroup(currentEntry)) {\n // if next entry is inside this group, skip past all children\n if (currentEntry.entries.includes(nextEntryId)) {\n const afterGroupIndex = currentIndex + currentEntry.entries.length + 1;\n const afterGroupId = flatOrder[afterGroupIndex];\n\n // 2a. group is the last top level entry\n if (!afterGroupId) {\n return { destinationId: null, order: 'after' };\n }\n // 2b. move after the next top level event\n return { destinationId: afterGroupId, order: 'after' };\n }\n // 2c. empty group move after the next entry\n return { destinationId: nextEntryId, order: 'after' };\n }\n\n const nextEntry = entries[nextEntryId];\n const currentEntryParent = currentEntry.parent;\n\n // 4. handle moving relative to groups\n if (isOntimeGroup(nextEntry)) {\n if (currentEntryParent === null) {\n // we are entering a group\n if (nextEntry.entries.length === 0) {\n // 3a. if the group is empty, insert into it\n return { destinationId: nextEntryId, order: 'insert' };\n }\n // 3b. otherwise, add before the first entry in the group\n const firstGroupEntryId = nextEntry.entries[0];\n return { destinationId: firstGroupEntryId, order: 'before' };\n }\n }\n\n // 5. handle moving between group and top level\n const nextEntryParent = 'parent' in nextEntry ? nextEntry.parent : null;\n if (nextEntryParent !== null && currentEntryParent === null) {\n return { destinationId: nextEntryId, order: 'after' };\n }\n\n // default - swap positions with next entry\n return { destinationId: nextEntryId, order: 'after' };\n}\n\n/**\n * Reorders unorderedArray to match the flatOrder entries\n * Useful for operations that convert selections (out of order) to rundown\n */\nexport function orderEntries(unorderedArray: EntryId[], flatOrder: EntryId[]): EntryId[] {\n const orderedArray: EntryId[] = [];\n for (const id of flatOrder) {\n if (unorderedArray.includes(id)) {\n orderedArray.push(id);\n }\n }\n return orderedArray;\n}\n","import { useCallback, useMemo } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport {\n EntryId,\n InsertOptions,\n isOntimeEvent,\n isOntimeGroup,\n MaybeString,\n OntimeDelay,\n OntimeEntry,\n OntimeEvent,\n OntimeGroup,\n OntimeMilestone,\n PatchWithId,\n Rundown,\n SupportedEntry,\n TimeField,\n TimeStrategy,\n} from 'ontime-types';\nimport {\n addToRundown,\n createDelay,\n createEvent,\n createGroup,\n createMilestone,\n dayInMs,\n generateId,\n getInsertAfterId,\n MILLIS_PER_SECOND,\n parseUserTime,\n resolveInsertParent,\n swapEventData,\n} from 'ontime-utils';\n\nimport { moveDown, moveUp, orderEntries } from '../../features/rundown/rundown.utils';\nimport { RUNDOWN } from '../api/constants';\nimport {\n deleteEntries,\n patchReorderEntry,\n postAddEntry,\n postCloneEntry,\n putBatchEditEvents,\n putEditEntry,\n ReorderEntry,\n requestApplyDelay,\n requestDeleteAll,\n requestEventSwap,\n requestGroupEntries,\n requestUngroup,\n} from '../api/rundown';\nimport { logAxiosError } from '../api/utils';\nimport { useEditorSettings } from '../stores/editorSettings';\n\nexport type EventOptions = Partial<{\n // options of any new entries (event / delay / group)\n after: MaybeString;\n before: MaybeString;\n // options of entries of type OntimeEvent\n linkPrevious: boolean;\n lastEventId: MaybeString;\n}>;\n\n/**\n * Gather utilities for actions on entries\n */\nexport const useEntryActions = () => {\n const queryClient = useQueryClient();\n const {\n linkPrevious,\n defaultTimeStrategy,\n defaultDuration,\n defaultWarnTime,\n defaultDangerTime,\n defaultTimerType,\n defaultEndAction,\n } = useEditorSettings();\n\n /**\n * Returns the currently loaded rundown\n */\n const getCurrentRundownData = useCallback(() => {\n return queryClient.getQueryData<Rundown>(RUNDOWN);\n }, [queryClient]);\n\n /**\n * Looks for an entry with a given ID in the currently loaded rundown\n */\n const getEntryById = useCallback(\n (eventId: EntryId): OntimeEntry | undefined => {\n const cachedRundown = getCurrentRundownData();\n if (!cachedRundown?.entries) {\n return;\n }\n return cachedRundown.entries[eventId];\n },\n [getCurrentRundownData],\n );\n\n /**\n * Calls mutation to add new entry\n * @private\n */\n const { mutateAsync: addEntryMutation } = useMutation({\n mutationFn: ([rundownId, entry]: [string, PatchWithId & InsertOptions]) => postAddEntry(rundownId, entry),\n onMutate: async ([_rundownId, entry]) => {\n await queryClient.cancelQueries({ queryKey: RUNDOWN });\n\n const previousData = queryClient.getQueryData<Rundown>(RUNDOWN);\n\n if (previousData) {\n const optimisticEntry = createOptimisticEntry(entry);\n const parentId = resolveInsertParent(previousData, entry);\n const maybeParent = parentId ? previousData.entries[parentId] : null;\n const parent = maybeParent && isOntimeGroup(maybeParent) ? maybeParent : null;\n const afterId = getInsertAfterId(previousData, parent, entry.after, entry.before);\n\n // create a mutable copy — addToRundown mutates in place using immutable array operations\n const newRundown: Rundown = {\n ...previousData,\n entries: { ...previousData.entries },\n revision: -1,\n };\n\n // copy the parent group so we don't mutate the original\n if (parent && parentId) {\n newRundown.entries[parentId] = { ...parent, entries: [...parent.entries] };\n }\n\n addToRundown(\n newRundown,\n optimisticEntry,\n afterId,\n parent ? (newRundown.entries[parent.id] as OntimeGroup) : null,\n );\n\n queryClient.setQueryData<Rundown>(RUNDOWN, newRundown);\n }\n\n return { previousData };\n },\n onSuccess: (response) => {\n if (!response.data) return;\n\n const serverEntry = response.data;\n const currentData = queryClient.getQueryData<Rundown>(RUNDOWN);\n\n if (currentData) {\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n ...currentData,\n entries: { ...currentData.entries, [serverEntry.id]: serverEntry },\n });\n }\n },\n onError: (_error, _variables, context) => {\n if (context?.previousData) {\n queryClient.setQueryData<Rundown>(RUNDOWN, context.previousData);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: RUNDOWN });\n },\n });\n\n /**\n * Adds an entry to rundown\n */\n const addEntry = useCallback(\n async (entry: Partial<OntimeEntry>, options?: EventOptions) => {\n const rundownData = getCurrentRundownData();\n const rundownId = rundownData?.id;\n\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n const newEntry: PatchWithId & InsertOptions = { ...entry, id: generateId() };\n\n // handle adding options that concern all event types\n if (options?.after) {\n newEntry.after = options.after;\n }\n if (options?.before) {\n newEntry.before = options.before;\n }\n\n // ************* CHECK OPTIONS specific to events\n if (isOntimeEvent(newEntry)) {\n if (options?.lastEventId) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- we know this is a value\n const previousEvent = rundownData.entries[options?.lastEventId];\n if (isOntimeEvent(previousEvent)) {\n newEntry.timeStart = previousEvent.timeEnd;\n }\n }\n\n // Override event with options from editor settings\n newEntry.linkStart = options?.linkPrevious ?? linkPrevious;\n\n if (newEntry.duration === undefined && newEntry.timeEnd === undefined) {\n newEntry.duration = parseUserTime(defaultDuration);\n }\n\n if (newEntry.timeDanger === undefined) {\n newEntry.timeDanger = parseUserTime(defaultDangerTime);\n }\n\n if (newEntry.timeWarning === undefined) {\n newEntry.timeWarning = parseUserTime(defaultWarnTime);\n }\n\n if (newEntry.timerType === undefined) {\n newEntry.timerType = defaultTimerType;\n }\n\n if (newEntry.endAction === undefined) {\n newEntry.endAction = defaultEndAction;\n }\n\n if (newEntry.timeStrategy === undefined) {\n newEntry.timeStrategy = defaultTimeStrategy;\n }\n }\n\n try {\n await addEntryMutation([rundownId, newEntry]);\n } catch (error) {\n logAxiosError('Failed adding event', error);\n }\n },\n [\n getCurrentRundownData,\n linkPrevious,\n defaultDuration,\n defaultDangerTime,\n defaultWarnTime,\n defaultTimerType,\n defaultEndAction,\n defaultTimeStrategy,\n addEntryMutation,\n ],\n );\n\n /**\n * Calls mutation to clone a selection\n * @private\n */\n const { mutateAsync: cloneEntryMutation } = useMutation({\n mutationFn: ([rundownId, entryId, options]: Parameters<typeof postCloneEntry>) =>\n postCloneEntry(rundownId, entryId, options),\n onMutate: () => queryClient.cancelQueries({ queryKey: RUNDOWN }),\n onSettled: () => queryClient.invalidateQueries({ queryKey: RUNDOWN }),\n });\n\n /**\n * Clone an entry\n */\n const clone = useCallback(\n async (entryId: EntryId, options?: InsertOptions) => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await cloneEntryMutation([rundownId, entryId, options]);\n } catch (error) {\n logAxiosError('Error cloning entry', error);\n }\n },\n [cloneEntryMutation, getCurrentRundownData],\n );\n\n /**\n * Calls mutation to update existing entry\n * @private\n */\n const { mutateAsync: updateEntryMutation } = useMutation({\n mutationFn: ([rundownId, newEvent]: Parameters<typeof putEditEntry>) => putEditEntry(rundownId, newEvent),\n // we optimistically update here\n onMutate: async ([_rundownId, newEvent]) => {\n // cancel ongoing queries\n await queryClient.cancelQueries({ queryKey: RUNDOWN });\n\n // Snapshot the previous value\n const previousData = queryClient.getQueryData<Rundown>(RUNDOWN);\n const eventId = newEvent.id;\n\n if (previousData && eventId) {\n // optimistically update object\n const newRundown = { ...previousData.entries };\n // @ts-expect-error -- we expect the events to be of same type\n newRundown[eventId] = { ...newRundown[eventId], ...newEvent };\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id: previousData.id,\n title: previousData.title,\n order: previousData.order,\n flatOrder: previousData.flatOrder,\n entries: newRundown,\n revision: -1,\n });\n }\n\n // Return a context with the previous and new events\n return { previousData, newEvent };\n },\n // Mutation fails, rollback undoes optimist update\n onError: (_error, _newEvent, context) => {\n if (context?.previousData) {\n queryClient.setQueryData<Rundown>(RUNDOWN, context?.previousData);\n }\n },\n // Mutation finished, failed or successful\n // Fetch anyway, just to be sure\n onSettled: async () => {\n await queryClient.invalidateQueries({ queryKey: RUNDOWN });\n },\n });\n\n /**\n * Updates existing entry\n */\n const updateEntry = useCallback(\n async (entry: Partial<OntimeEntry>) => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await updateEntryMutation([rundownId, entry]);\n } catch (error) {\n logAxiosError('Error updating event', error);\n }\n },\n [getCurrentRundownData, updateEntryMutation],\n );\n\n /**\n * Updates time of existing event\n * @param eventId {EntryId} - id of the event\n * @param field {TimeField} - field to update\n * @param value {string} - new value string to be parsed\n * @param lockOnUpdate {boolean} - whether we will apply the lock / release on update\n */\n const updateTimer = useCallback(\n async (eventId: EntryId, field: TimeField, value: string, lockOnUpdate?: boolean) => {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n // an empty value with no lock has no domain validity\n if (!lockOnUpdate && value === '') {\n return;\n }\n\n const newEvent: Partial<OntimeEvent> = {\n id: eventId,\n };\n\n // check if we should lock the field\n if (lockOnUpdate) {\n if (field === 'timeEnd') {\n // an empty value indicates that we should unlock the field\n newEvent.timeStrategy = value === '' ? TimeStrategy.LockDuration : TimeStrategy.LockEnd;\n newEvent.timeEnd = value === '' ? undefined : calculateNewValue();\n } else if (field === 'duration') {\n // an empty value indicates that we should unlock the field\n newEvent.timeStrategy = value === '' ? TimeStrategy.LockEnd : TimeStrategy.LockDuration;\n newEvent.duration = value === '' ? undefined : calculateNewValue();\n } else if (field === 'timeStart') {\n // an empty values means we should link to the previous\n newEvent.linkStart = value === '';\n newEvent.timeStart = value === '' ? undefined : calculateNewValue();\n }\n } else {\n newEvent[field] = calculateNewValue();\n }\n\n try {\n await updateEntryMutation([rundownId, newEvent]);\n } catch (error) {\n logAxiosError('Error updating event', error);\n }\n\n /**\n * Utility function to calculate the new time value\n */\n function calculateNewValue(): number {\n let newValMillis = 0;\n\n // check for previous keyword\n if (value === 'p' || value === 'prev' || value === 'previous') {\n newValMillis = getPreviousEnd();\n\n // check for adding time keyword\n } else if (value.startsWith('+') || value.startsWith('p+') || value.startsWith('p +')) {\n // TODO: is this logic solid?\n const remainingString = value.substring(1);\n newValMillis = getPreviousEnd() + parseUserTime(remainingString);\n } else {\n newValMillis = parseUserTime(value);\n }\n // dont allow timer values over 23:59:59\n return Math.min(newValMillis, dayInMs - MILLIS_PER_SECOND);\n }\n\n /**\n * Utility function to get the previous event end time\n */\n function getPreviousEnd(): number {\n const cachedRundown = queryClient.getQueryData<Rundown>(RUNDOWN);\n\n if (!cachedRundown?.order || !cachedRundown?.entries) {\n return 0;\n }\n\n const index = cachedRundown.order.indexOf(eventId);\n if (index === 0) {\n return 0;\n }\n let previousEnd = 0;\n for (let i = index - 1; i >= 0; i--) {\n const event = cachedRundown.entries[cachedRundown.order[i]];\n if (isOntimeEvent(event)) {\n previousEnd = event.timeEnd;\n break;\n }\n }\n return previousEnd;\n }\n },\n [getCurrentRundownData, updateEntryMutation, queryClient],\n );\n\n /**\n * Calls mutation to edit multiple events\n * @private\n */\n const { mutateAsync: batchUpdateEventsMutation } = useMutation({\n mutationFn: ([rundownId, data]: Parameters<typeof putBatchEditEvents>) => putBatchEditEvents(rundownId, data),\n onMutate: async ([_rundownId, data]) => {\n // cancel ongoing queries\n await queryClient.cancelQueries({ queryKey: RUNDOWN });\n\n // Snapshot the previous value\n const previousRundown = queryClient.getQueryData<Rundown>(RUNDOWN);\n\n if (previousRundown) {\n const eventIds = new Set(data.ids);\n const newRundown = { ...previousRundown.entries };\n\n eventIds.forEach((eventId) => {\n if (Object.hasOwn(newRundown, eventId)) {\n const event = newRundown[eventId];\n if (isOntimeEvent(event)) {\n newRundown[eventId] = {\n ...event,\n ...data,\n };\n }\n }\n });\n\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id: previousRundown.id,\n title: previousRundown.title,\n order: previousRundown.order,\n flatOrder: previousRundown.flatOrder,\n entries: newRundown,\n revision: -1,\n });\n }\n\n // Return a context with the previous rundown\n return { previousRundown };\n },\n onSuccess: (response) => {\n if (!response.data) return;\n\n const { id, title, order, flatOrder, entries, revision } = response.data;\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id,\n title,\n order,\n flatOrder,\n entries,\n revision,\n });\n },\n onError: (_error, _newEvent, context) => {\n queryClient.setQueryData<Rundown>(RUNDOWN, context?.previousRundown);\n },\n });\n\n const batchUpdateEvents = useCallback(\n async (data: Partial<OntimeEvent>, eventIds: EntryId[]) => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await batchUpdateEventsMutation([rundownId, { data, ids: eventIds }]);\n } catch (error) {\n logAxiosError('Error updating events', error);\n }\n },\n [batchUpdateEventsMutation, getCurrentRundownData],\n );\n\n /**\n * Calls mutation to delete an entry\n * @private\n */\n const { mutateAsync: deleteEntryMutation } = useMutation({\n mutationFn: ([rundownId, entryIds]: Parameters<typeof deleteEntries>) => deleteEntries(rundownId, entryIds),\n // we optimistically update here\n onMutate: async ([_rundownId, entryIds]) => {\n // cancel ongoing queries\n await queryClient.cancelQueries({ queryKey: RUNDOWN });\n\n // Snapshot the previous value\n const previousData = queryClient.getQueryData<Rundown>(RUNDOWN);\n\n if (previousData) {\n // optimistically update object\n const { entries, order, flatOrder } = optimisticDeleteEntries(entryIds, previousData);\n\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id: previousData.id,\n title: previousData.title,\n order,\n flatOrder,\n entries,\n revision: -1,\n });\n }\n\n // Return a context with the previous and new events\n return { previousData };\n },\n\n // Mutation fails, rollback undoes optimist update\n onError: (_error, _entryIds, context) => {\n queryClient.setQueryData<Rundown>(RUNDOWN, context?.previousData);\n },\n // Mutation finished, failed or successful\n // Fetch anyway, just to be sure\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: RUNDOWN });\n },\n });\n\n /**\n * Deletes an event entry from the rundown\n */\n const deleteEntry = useCallback(\n async (entryIds: EntryId[]) => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await deleteEntryMutation([rundownId, entryIds]);\n } catch (error) {\n logAxiosError('Error deleting event', error);\n }\n },\n [deleteEntryMutation, getCurrentRundownData],\n );\n\n /**\n * Calls mutation to delete all events\n * @private\n */\n const { mutateAsync: deleteAllEntriesMutation } = useMutation({\n mutationFn: ([rundownId]: Parameters<typeof requestDeleteAll>) => requestDeleteAll(rundownId),\n // we optimistically update here\n onMutate: async () => {\n // cancel ongoing queries\n await queryClient.cancelQueries({ queryKey: RUNDOWN });\n\n // Snapshot the previous value\n const previousData = queryClient.getQueryData<Rundown>(RUNDOWN);\n\n // optimistically update object\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id: previousData?.id ?? 'default',\n title: previousData?.title ?? '',\n order: [],\n flatOrder: [],\n entries: {},\n revision: -1,\n });\n\n // Return a context with the previous and new events\n return { previousData };\n },\n\n // Mutation fails, rollback optimist update\n onError: (_error, _, context) => {\n queryClient.setQueryData<Rundown>(RUNDOWN, context?.previousData);\n },\n // Mutation finished, failed or successful\n // Fetch anyway, just to be sure\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: RUNDOWN });\n },\n });\n\n /**\n * Deletes all entries in the rundown\n */\n const deleteAllEntries = useCallback(async () => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await deleteAllEntriesMutation([rundownId]);\n } catch (error) {\n logAxiosError('Error deleting events', error);\n }\n }, [deleteAllEntriesMutation, getCurrentRundownData]);\n\n /**\n * Calls mutation to apply a delay\n * @private\n */\n const { mutateAsync: applyDelayMutation } = useMutation({\n mutationFn: ([rundownId, delayId]: Parameters<typeof requestApplyDelay>) => requestApplyDelay(rundownId, delayId),\n onMutate: () => queryClient.cancelQueries({ queryKey: RUNDOWN }),\n onSuccess: (response) => {\n if (!response.data) return;\n\n const { id, title, order, flatOrder, entries, revision } = response.data;\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id,\n title,\n order,\n flatOrder,\n entries,\n revision,\n });\n },\n // Mutation finished, failed or successful\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: RUNDOWN });\n },\n });\n\n /**\n * Applies a given delay\n */\n const applyDelay = useCallback(\n async (delayEventId: EntryId) => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await applyDelayMutation([rundownId, delayEventId]);\n } catch (error) {\n logAxiosError('Error applying delay', error);\n }\n },\n [applyDelayMutation, getCurrentRundownData],\n );\n\n /**\n * Calls mutation to dissolve a group\n * @private\n */\n const { mutateAsync: ungroupMutation } = useMutation({\n mutationFn: ([rundownId, groupId]: Parameters<typeof requestUngroup>) => requestUngroup(rundownId, groupId),\n onMutate: () => queryClient.cancelQueries({ queryKey: RUNDOWN }),\n onSuccess: (response) => {\n if (!response.data) return;\n\n const { id, title, order, flatOrder, entries, revision } = response.data;\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id,\n title,\n order,\n flatOrder,\n entries,\n revision,\n });\n },\n onSettled: () => queryClient.invalidateQueries({ queryKey: RUNDOWN }),\n });\n\n /**\n * Deletes a group and moves its events to the top level\n */\n const ungroup = useCallback(\n async (groupId: EntryId) => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await ungroupMutation([rundownId, groupId]);\n } catch (error) {\n logAxiosError('Error dissolving group', error);\n }\n },\n [getCurrentRundownData, ungroupMutation],\n );\n\n /**\n * Calls mutation to create a group with a selection\n * @private\n */\n const { mutateAsync: groupEntriesMutation } = useMutation({\n mutationFn: ([rundownId, entryIds]: Parameters<typeof requestGroupEntries>) =>\n requestGroupEntries(rundownId, entryIds),\n onMutate: () => queryClient.cancelQueries({ queryKey: RUNDOWN }),\n onSuccess: (response) => {\n if (!response.data) return;\n\n const { id, title, order, flatOrder, entries, revision } = response.data;\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id,\n title,\n order,\n flatOrder,\n entries,\n revision,\n });\n },\n onSettled: () => queryClient.invalidateQueries({ queryKey: RUNDOWN }),\n });\n\n /**\n * Create a group with a selection\n */\n const groupEntries = useCallback(\n async (entryIds: EntryId[]) => {\n if (entryIds.length === 0) return;\n\n try {\n const rundownData = getCurrentRundownData();\n const rundownId = rundownData?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n if (entryIds.length === 1) {\n await groupEntriesMutation([rundownId, entryIds]);\n } else {\n // the user selection may be out of order\n const orderedIds = orderEntries(entryIds, rundownData.flatOrder);\n await groupEntriesMutation([rundownId, orderedIds]);\n }\n } catch (error) {\n logAxiosError('Error grouping entries', error);\n }\n },\n [getCurrentRundownData, groupEntriesMutation],\n );\n\n /**\n * Calls mutation to reorder an entry\n * @private\n */\n const { mutateAsync: reorderEntryMutation } = useMutation({\n mutationFn: ([rundownId, data]: Parameters<typeof patchReorderEntry>) => patchReorderEntry(rundownId, data),\n onMutate: () => queryClient.cancelQueries({ queryKey: RUNDOWN }),\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: RUNDOWN });\n },\n });\n\n /**\n * Reorders a given entry one step up or down in the timeline\n */\n const move = useCallback(\n async (entryId: EntryId, direction: 'up' | 'down') => {\n try {\n const rundownData = getCurrentRundownData();\n const rundownId = rundownData?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n const { destinationId, order } =\n direction === 'up'\n ? moveUp(entryId, rundownData.flatOrder, rundownData.entries)\n : moveDown(entryId, rundownData.flatOrder, rundownData.entries);\n\n if (!destinationId) {\n return; // noop\n }\n\n const reorderObject: ReorderEntry = {\n entryId,\n destinationId,\n order,\n };\n await reorderEntryMutation([rundownId, reorderObject]);\n // the rundown needs to know whether we moved into a group\n return rundownData.entries[destinationId]?.type === SupportedEntry.Group ? destinationId : undefined;\n } catch (error) {\n logAxiosError('Error re-ordering event', error);\n }\n return undefined;\n },\n [getCurrentRundownData, reorderEntryMutation],\n );\n /**\n * Reorders a given entry\n */\n const reorderEntry = useCallback(\n async (entryId: EntryId, destinationId: EntryId, order: 'before' | 'after' | 'insert') => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await reorderEntryMutation([\n rundownId,\n {\n entryId,\n destinationId,\n order,\n },\n ]);\n } catch (error) {\n logAxiosError('Error re-ordering event', error);\n throw error; // rethrow to handle in the component\n }\n },\n [getCurrentRundownData, reorderEntryMutation],\n );\n\n /**\n * Calls mutation to swap events\n * @private\n */\n const { mutateAsync: swapEventsMutation } = useMutation({\n mutationFn: ([rundownId, from, to]: Parameters<typeof requestEventSwap>) => requestEventSwap(rundownId, from, to),\n // we optimistically update here\n onMutate: async ([_rundownId, from, to]) => {\n // cancel ongoing queries\n await queryClient.cancelQueries({ queryKey: RUNDOWN });\n\n // Snapshot the previous value\n const previousData = queryClient.getQueryData<Rundown>(RUNDOWN);\n if (previousData) {\n // optimistically update object\n const newRundown = { ...previousData.entries };\n const eventA = previousData.entries[from];\n const eventB = previousData.entries[to];\n\n if (!isOntimeEvent(eventA) || !isOntimeEvent(eventB)) {\n return;\n }\n\n const [newA, newB] = swapEventData(eventA, eventB);\n newRundown[from] = newA;\n newRundown[to] = newB;\n\n queryClient.setQueryData<Rundown>(RUNDOWN, {\n id: previousData.id,\n title: previousData.title,\n order: previousData.order,\n flatOrder: previousData.flatOrder,\n entries: newRundown,\n revision: -1,\n });\n }\n\n // Return a context with the previous events\n return { previousData };\n },\n\n // Mutation fails, rollback undoes optimist update\n onError: (_error, _eventId, context) => {\n queryClient.setQueryData<Rundown>(RUNDOWN, context?.previousData);\n },\n // Mutation finished, failed or successful\n // Fetch anyway, just to be sure\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: RUNDOWN });\n },\n });\n\n /**\n * Swaps the schedule of two events\n */\n const swapEvents = useCallback(\n async (from: EntryId, to: EntryId) => {\n try {\n const rundownId = getCurrentRundownData()?.id;\n if (!rundownId) {\n throw new Error('Rundown not initialised');\n }\n\n await swapEventsMutation([rundownId, from, to]);\n } catch (error) {\n logAxiosError('Error re-ordering event', error);\n }\n },\n [getCurrentRundownData, swapEventsMutation],\n );\n\n return useMemo(\n () => ({\n addEntry,\n applyDelay,\n batchUpdateEvents,\n clone,\n deleteEntry,\n deleteAllEntries,\n ungroup,\n getEntryById,\n groupEntries,\n move,\n reorderEntry,\n swapEvents,\n updateEntry,\n updateTimer,\n }),\n [\n addEntry,\n applyDelay,\n batchUpdateEvents,\n clone,\n deleteEntry,\n deleteAllEntries,\n ungroup,\n getEntryById,\n groupEntries,\n move,\n reorderEntry,\n swapEvents,\n updateEntry,\n updateTimer,\n ],\n );\n};\n\n/**\n * Utility to optimistically delete entries from client cache\n */\nfunction optimisticDeleteEntries(entryIds: EntryId[], rundown: Rundown) {\n const entries = { ...rundown.entries };\n let order = [...rundown.order];\n let flatOrder = [...rundown.flatOrder];\n\n for (let i = 0; i < entryIds.length; i++) {\n const entry = entries[entryIds[i]];\n deleteEntry(entry);\n }\n\n function deleteEntry(entry: OntimeEntry) {\n if (isOntimeGroup(entry) || !entry.parent) {\n order = order.filter((id) => id !== entry.id);\n } else {\n const parent = entries[entry.parent];\n if (parent && isOntimeGroup(parent)) {\n parent.entries = parent.entries.filter((parentEntry) => parentEntry !== entry.id);\n }\n }\n\n delete entries[entry.id];\n flatOrder = flatOrder.filter((id) => id !== entry.id);\n }\n\n return { entries, order, flatOrder };\n}\n\n/**\n * Utility to create an optimistic entry for immediate cache insertion\n */\nfunction createOptimisticEntry(payload: PatchWithId & InsertOptions): OntimeEntry {\n const { after: _after, before: _before, ...entryData } = payload;\n const id = entryData.id;\n let parent: EntryId | null = null;\n if ('parent' in entryData && entryData.parent) {\n parent = entryData.parent;\n }\n\n switch (entryData.type) {\n case SupportedEntry.Event: {\n return createEvent({ ...entryData, id, parent }) as OntimeEvent;\n }\n case SupportedEntry.Delay:\n return createDelay({ id, duration: (entryData as Partial<OntimeDelay>).duration ?? 0, parent });\n case SupportedEntry.Group:\n return createGroup({ ...(entryData as Partial<OntimeGroup>), id });\n case SupportedEntry.Milestone:\n return createMilestone({ ...(entryData as Partial<OntimeMilestone>), id, parent });\n default:\n throw new Error('Unknown entry type');\n }\n}\n","import { MaybeNumber } from 'ontime-types';\nimport { formatFromMillis, MILLIS_PER_HOUR, MILLIS_PER_MINUTE } from 'ontime-utils';\n\n/**\n * Parses a value in millis to a string which encodes a delay\n * @param millis\n * @param format\n */\nexport function millisToDelayString(millis: MaybeNumber, format: 'compact' | 'expanded' = 'compact'): string {\n if (millis == null || millis === 0) {\n return '';\n }\n\n const isNegative = millis < 0;\n const absMillis = Math.abs(millis);\n const isCompact = format === 'compact';\n const delayed = isCompact ? '+' : 'delayed by ';\n const ahead = isCompact ? '-' : 'ahead by ';\n\n if (absMillis < MILLIS_PER_MINUTE) {\n return `${isNegative ? ahead : delayed}${formatFromMillis(absMillis, 's')} sec`;\n } else if (absMillis < MILLIS_PER_HOUR && absMillis % MILLIS_PER_MINUTE === 0) {\n return `${isNegative ? ahead : delayed}${formatFromMillis(absMillis, 'm')} min`;\n }\n\n return `${isNegative ? ahead : delayed}${formatFromMillis(absMillis, 'HH:mm:ss')}`;\n}\n","import { IoChevronDown, IoChevronUp } from 'react-icons/io5';\n\nimport { millisToDelayString } from '../../utils/dateConfig';\nimport Tooltip from '../tooltip/Tooltip';\n\nimport style from './DelayIndicator.module.scss';\n\ninterface DelayIndicatorProps {\n delayValue?: number;\n tooltipPrefix?: string;\n}\n\nexport default function DelayIndicator(props: DelayIndicatorProps) {\n const { delayValue, tooltipPrefix } = props;\n\n if (typeof delayValue !== 'number' || delayValue === 0) {\n return null;\n }\n\n const delayString = tooltipPrefix\n ? `${tooltipPrefix} ${millisToDelayString(delayValue)}`\n : millisToDelayString(delayValue);\n\n return (\n <Tooltip text={delayString} render={<span />} className={style.delaySymbol}>\n {delayValue < 0 ? <IoChevronDown /> : <IoChevronUp />}\n </Tooltip>\n );\n}\n"],"names":["inferTimes","_start","_end","_duration","timeStart","convertToInteger","timeEnd","duration","calculateDuration","timeStrategy","TimeStrategy","LockDuration","LockEnd","dayInMs","validateTimes","_strategy","validateTimeStrategy","calculateEnd","value","result","Number","isNaN","Math","floor","event","type","SupportedEntry","Event","flag","title","note","endAction","EndAction","None","timerType","TimerType","CountDown","linkStart","countToEnd","skip","colour","timeWarning","timeDanger","triggers","custom","parent","revision","delay","dayOffset","gap","Delay","milestone","Milestone","cue","group","Group","entries","targetDuration","isFirstLinked","makeString","val","fallback","trim","constructor","Object","toString","createDelay","patch","id","generateId","createEvent","eventArgs","eventIndex","keys","length","String","baseEvent","eventDef","createEventPatch","createGroup","groupDef","createMilestone","milestoneDef","inferStrategy","end","originalEvent","patchEvent","validateEndAction","validateTimerType","makeSortableList","order","flatIds","i","entry","isOntimeGroup","push","filterVisibleEntries","sortableData","getIsCollapsed","filter","entryId","startsWith","parentId","split","canDrop","targetType","targetParent","isTargetCollapsed","undefined","moveUp","flatOrder","currentEntry","currentIndex","indexOf","previousEntryId","destinationId","previousEntry","currentEntryParent","moveDown","nextEntryId","parentGroup","includes","afterGroupIndex","afterGroupId","nextEntry","orderEntries","unorderedArray","orderedArray","useEntryActions","queryClient","useQueryClient","linkPrevious","defaultTimeStrategy","defaultDuration","defaultWarnTime","defaultDangerTime","defaultTimerType","defaultEndAction","useEditorSettings","getCurrentRundownData","useCallback","getQueryData","RUNDOWN","getEntryById","eventId","cachedRundown","mutateAsync","addEntryMutation","useMutation","mutationFn","rundownId","postAddEntry","onMutate","_rundownId","cancelQueries","queryKey","previousData","optimisticEntry","createOptimisticEntry","resolveInsertParent","maybeParent","afterId","getInsertAfterId","after","before","newRundown","setQueryData","onSuccess","response","data","serverEntry","currentData","onError","_error","_variables","context","onSettled","invalidateQueries","addEntry","options","rundownData","Error","newEntry","isOntimeEvent","lastEventId","previousEvent","parseUserTime","error","logAxiosError","cloneEntryMutation","postCloneEntry","clone","updateEntryMutation","newEvent","putEditEntry","_newEvent","updateEntry","updateTimer","field","lockOnUpdate","calculateNewValue","newValMillis","getPreviousEnd","remainingString","substring","min","MILLIS_PER_SECOND","index","previousEnd","batchUpdateEventsMutation","putBatchEditEvents","previousRundown","eventIds","Set","ids","forEach","hasOwn","batchUpdateEvents","deleteEntryMutation","entryIds","deleteEntries","optimisticDeleteEntries","_entryIds","deleteEntry","deleteAllEntriesMutation","requestDeleteAll","_","deleteAllEntries","applyDelayMutation","delayId","requestApplyDelay","applyDelay","delayEventId","ungroupMutation","groupId","requestUngroup","ungroup","groupEntriesMutation","requestGroupEntries","groupEntries","orderedIds","reorderEntryMutation","patchReorderEntry","move","direction","reorderEntry","swapEventsMutation","from","to","requestEventSwap","eventA","eventB","newA","newB","swapEventData","_eventId","swapEvents","useMemo","rundown","parentEntry","payload","_after","_before","entryData","millisToDelayString","millis","format","isNegative","absMillis","abs","isCompact","delayed","ahead","MILLIS_PER_MINUTE","formatFromMillis","MILLIS_PER_HOUR","DelayIndicator","props","delayValue","tooltipPrefix","delayString","Tooltip","jsx","style","delaySymbol","IoChevronDown","IoChevronUp"],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./vendor-BKUJ0_Du.js";import{e as d,bE as o}from"./index-Dm-4OTmY.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="7ba8bd2a-998b-4959-9ad7-cadc4c7d3eac",e._sentryDebugIdIdentifier="sentry-dbid-7ba8bd2a-998b-4959-9ad7-cadc4c7d3eac")}catch{}})();const i="_emptyContainer_xiuvv_17",r="_empty_xiuvv_17",c="_text_xiuvv_26",n={emptyContainer:i,empty:r,text:c};function p({text:e,className:t,injectedStyles:a}){return s.jsxs("div",{className:d([n.emptyContainer,t]),style:a,children:[s.jsx(o,{className:n.empty}),e&&s.jsx("span",{className:n.text,children:e})]})}const y="_page_27rqx_22",l={page:y};function b({text:e,injectedStyles:t}){return s.jsx("div",{className:l.page,children:s.jsx(p,{text:e,injectedStyles:t})})}export{b as E,p as a};
|
|
2
|
-
//# sourceMappingURL=EmptyPage-CYVrjOvI.js.map
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./PipHost-Dz2oy7XG.js","./vendor-BKUJ0_Du.js","./vendor-4xP-6xVS.css","./EditorUtils-BLcTuWz1.js","./index-Dm-4OTmY.js","./index-Cm69j2Ld.css","./EditorUtils-L4Sg72o_.css","./timer.utils-B4bvsns3.js","./viewUtils-29a3Mmiu.js","./playbackstate-Dl_ZJABT.js","./MultiPartProgressBar-W2a-JWPY.js","./getProgress-ZUTmCn_v.js","./MultiPartProgressBar-1_EFIx1M.css","./presentation.utils-Z61KykAH.js","./PipHost-DEhjTbGT.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{h as o,j as e,$ as M,av as A,y as L,bi as R,bj as B,bg as D,c6 as k,c7 as w}from"./vendor-BKUJ0_Du.js";import{a as V,S as q,P as F,C as O}from"./EditorUtils-BLcTuWz1.js";import{e as S,ah as $,bQ as H,a as U,T as d,bk as z,y as j,ax as I,bR as T,B as h,bS as i,bT as W,ak as P,bU as Q,bA as G,be as J,bB as K}from"./index-Dm-4OTmY.js";import{P as X}from"./ProtectRoute-Bxq6q7ba.js";import{S as Y}from"./Select-BnGTAeXJ.js";import{T as f}from"./Tooltip-DZJ7u9gm.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new n.Error().stack;t&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[t]="b84d454b-2f21-4f36-889b-c34ef81ea0b5",n._sentryDebugIdIdentifier="sentry-dbid-b84d454b-2f21-4f36-889b-c34ef81ea0b5")}catch{}})();const Z="_inputItems_13jx0_17",ee="_label_13jx0_24",te="_active_13jx0_28",v={inputItems:Z,label:ee,active:te};function E(n){const{label:t,placeholder:a,text:s,visible:l,changeHandler:b,children:u}=n,[m,x]=o.useState(s),c=o.useRef(null),p=o.useRef(0);o.useEffect(()=>{c.current&&c.current!==document.activeElement&&(c.current.selectionStart=p.current,c.current.selectionEnd=p.current)},[s]),o.useEffect(()=>{c.current!==document.activeElement&&x(s)},[s]);const y=g=>{p.current=g.target.selectionStart??0,x(g.target.value),b(g.target.value)};return e.jsxs("div",{children:[e.jsx("label",{className:S([v.label,l??v.active]),htmlFor:t,children:t}),e.jsxs("div",{className:v.inputItems,children:[e.jsx($,{id:t,ref:c,value:m,onChange:y,placeholder:a}),u]})]})}const ne="documentPictureInPicture"in window,se=o.lazy(()=>M(()=>import("./PipHost-Dz2oy7XG.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]),import.meta.url)),ae=o.memo(re);function re(){return ne?e.jsx(o.Suspense,{fallback:null,children:e.jsx(se,{})}):null}const oe="_blink_k96dq_1",ie="_preview_k96dq_17",ce="_mainContent_k96dq_25",le="_secondaryContent_k96dq_41",ue="_blackout_k96dq_45",de="_eventStatus_k96dq_49",me="_statusIcon_k96dq_58",r={blink:oe,preview:ie,mainContent:ce,secondaryContent:le,blackout:ue,eventStatus:de,statusIcon:me},xe={aux1:"Aux 1",aux2:"Aux 2",aux3:"Aux 3",secondary:"Secondary message"};function pe(){const{blink:n,blackout:t,countToEnd:a,phase:s,secondarySource:l,showTimerMessage:b,timerType:u}=H(),{data:m}=U(),x=b?"Message":u===d.None?z:s===j.Pending?"Standby to start":s===j.Overtime?"Timer Overtime":u===d.Clock?"Clock":a?"Count to End":"Timer",c=b||!l?null:xe[l],p=s===j.Warning?m.warningColor??"#ffa528":s===j.Danger?m.dangerColor??"#ff7300":m.normalColor??"#FFFC",y=x=="Timer",g=S([n&&r.blink,t&&r.blackout]);return e.jsxs("div",{className:r.preview,children:[e.jsx(V,{onExtractClick:N=>I("timer",N),pipElement:e.jsx(ae,{})}),e.jsxs("div",{className:g,children:[e.jsx("div",{className:r.mainContent,"data-phase":y&&s,style:y?{"--override-colour":p}:{},children:x}),c!==null&&e.jsx("div",{className:r.secondaryContent,children:c})]}),e.jsxs("div",{className:r.eventStatus,children:[e.jsx(f,{text:"Time type: Count down",render:e.jsx("span",{}),className:r.statusIcon,"data-active":u===d.CountDown,children:e.jsx(A,{})}),e.jsx(f,{text:"Time type: Count up",render:e.jsx("span",{}),className:r.statusIcon,"data-active":u===d.CountUp,children:e.jsx(L,{})}),e.jsx(f,{text:"Time type: Clock",render:e.jsx("span",{}),className:r.statusIcon,"data-active":u===d.Clock,children:e.jsx(R,{})}),e.jsx(f,{text:"Time type: None",render:e.jsx("span",{}),className:r.statusIcon,"data-active":u===d.None,children:e.jsx(B,{})}),e.jsx(f,{text:a?"Count to end":"Count duration",render:e.jsx("span",{}),className:r.statusIcon,"data-active":a,children:e.jsx(D,{})})]})]})}const ge="_previewContainer_ytrng_17",fe="_options_ytrng_23",_={previewContainer:ge,options:fe};function be(){const{blackout:n,blink:t}=T();return e.jsxs("div",{className:_.previewContainer,children:[e.jsx(pe,{}),e.jsxs("div",{className:_.options,children:[e.jsx(ye,{}),e.jsx(q,{orientation:"horizontal"}),e.jsx(h,{variant:t?"primary":"subtle",fluid:!0,onClick:()=>i.timerBlink(!t),"data-testid":"toggle timer blink",children:"Blink"}),e.jsx(h,{variant:n?"primary":"subtle",fluid:!0,onClick:()=>i.timerBlackout(!n),"data-testid":"toggle timer blackout",children:"Blackout screen"})]})]})}function ye(){const{secondarySource:n}=T(),[t,a]=o.useState("aux1");o.useEffect(()=>{n!==null&&a(n)},[n]);const s=()=>{n===t?i.timerSecondarySource(null):i.timerSecondarySource(t)};return e.jsxs(e.Fragment,{children:[e.jsx(Y,{value:t,options:[{value:"aux1",label:"Aux 1"},{value:"aux2",label:"Aux 2"},{value:"aux3",label:"Aux 3"},{value:"secondary",label:"Secondary message"}],onValueChange:l=>{l!==null&&(n!==null&&i.timerSecondarySource(l),a(l))}}),e.jsx(h,{variant:n!==null?"primary":"subtle",fluid:!0,onClick:s,"data-testid":"toggle secondary",children:"Show secondary"})]})}function je(){return e.jsxs(e.Fragment,{children:[e.jsx(be,{}),e.jsx(ve,{}),e.jsx(he,{})]})}function ve(){const{text:n,visible:t}=W();return e.jsx(E,{label:"Timer Message",placeholder:"Message shown fullscreen in stage timer",text:n,visible:t,changeHandler:a=>i.timerText(a),children:e.jsx(P,{"aria-label":"Toggle timer message visibility",onClick:()=>i.timerVisible(!t),variant:t?"primary":"subtle",children:t?e.jsx(k,{}):e.jsx(w,{})})})}function he(){const{text:n,visible:t}=Q(),a=()=>{t?i.timerSecondarySource(null):i.timerSecondarySource("secondary")};return e.jsx(E,{label:"Secondary Message",placeholder:"Message shown as secondary text in stage timer",text:n,visible:t,changeHandler:s=>i.secondaryMessage(s),children:e.jsx(P,{"aria-label":"Toggle secondary message visibility",onClick:a,variant:t?"primary":"subtle",children:t?e.jsx(k,{}):e.jsx(w,{})})})}const _e="_growPanel_9ahya_17",Ce="_contentLayout_9ahya_21",C={growPanel:_e,contentLayout:Ce},Ne=o.memo(ke);function ke(){const n=window.location.pathname.includes("/messagecontrol");return e.jsx(X,{permission:"editor",children:e.jsxs(F,{className:C.growPanel,"data-testid":"panel-messages-control",children:[!n&&e.jsx(O,{onClick:t=>I("messagecontrol",t)}),n&&e.jsx(G,{suppressSettings:!0,isNavigationLocked:J()}),e.jsx("div",{className:C.contentLayout,children:e.jsx(K,{children:e.jsx(je,{})})})]})})}export{Ne as default};
|
|
3
|
-
//# sourceMappingURL=MessageControlExport-BgT9JaXk.js.map
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OperatorExport-CbWojpp6.js","sources":["../../src/features/operator/custom-field-edit-modal/CustomFieldEditModal.tsx","../../src/common/hooks/useLongPress.ts","../../src/views/common/running-time/RunningTime.tsx","../../src/features/operator/operator-event/OperatorEvent.tsx","../../src/features/operator/operator-group/OperatorGroup.tsx","../../src/features/operator/status-bar/StatusBarProgress.tsx","../../src/features/operator/status-bar/StatusBarTimers.tsx","../../src/features/operator/status-bar/StatusBar.tsx","../../src/features/operator/operator.options.tsx","../../src/features/operator/operator.utils.ts","../../src/features/operator/useOperatorData.ts","../../src/features/operator/Operator.tsx","../../src/features/operator/OperatorExport.tsx"],"sourcesContent":["import { Fragment, useRef, useState } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog } from '@base-ui/react/dialog';\nimport { OntimeEvent } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport Textarea from '../../../common/components/input/textarea/Textarea';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { EditEvent } from '../operator.types';\n\nimport style from './CustomFieldEditModal.module.scss';\n\ninterface CustomFieldEditModalProps {\n event: EditEvent;\n onClose: () => void;\n}\n\nexport default function CustomFieldEditModal(props: CustomFieldEditModalProps) {\n const { event, onClose } = props;\n\n const { updateEntry } = useEntryActions();\n const [loading, setLoading] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement[]>(new Array<HTMLTextAreaElement>());\n\n const handleSave = async () => {\n if (!inputRef.current) return;\n setLoading(true);\n\n const patchObject: Partial<OntimeEvent> = { id: event.id };\n\n inputRef.current.forEach((element) => {\n if (element.dataset.field && element.defaultValue != element.value) {\n if (patchObject.custom) {\n patchObject.custom[element.dataset.field] = element.value;\n } else {\n Object.assign(patchObject, { custom: { [element.dataset.field]: element.value } });\n }\n }\n });\n\n if (patchObject.custom) {\n await updateEntry(patchObject);\n }\n\n setLoading(false);\n onClose();\n };\n\n return (\n <Dialog.Root\n open\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n >\n <Dialog.Portal>\n <Dialog.Popup className={style.editModal}>\n <div className={style.title}>\n {`Editing fields in cue ${event.cue}`}\n <IconButton variant='subtle-white' onClick={onClose} disabled={loading}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {event.subscriptions.map((field) => {\n return (\n <Fragment key={field.id}>\n <label htmlFor={field.id} className={style.label} style={{ '--user-bg': field.colour }}>\n {field.label}\n </label>\n <Textarea\n name={field.id}\n ref={(element) => {\n if (element) inputRef.current.push(element);\n }}\n placeholder={`Add value for ${field.label} field`}\n defaultValue={field.value}\n data-field={field.id}\n disabled={loading}\n rows={5}\n />\n </Fragment>\n );\n })}\n </div>\n\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n <Button variant='primary' size='large' onClick={handleSave} disabled={loading}>\n Save\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\n\nimport { throttle } from '../utils/throttle';\n\nexport interface UseLongPressOptions {\n /** Time in milliseconds to trigger the long press, default is 400ms */\n threshold?: number;\n\n /** Callback triggered when the long press starts */\n onStart?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press finishes */\n onFinish?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press is canceled */\n onCancel?: (event: React.MouseEvent | React.TouchEvent) => void;\n}\n\nexport interface UseLongPressReturnValue {\n onMouseDown: (event: React.MouseEvent) => void;\n onMouseUp: (event: React.MouseEvent) => void;\n onMouseLeave: (event: React.MouseEvent) => void;\n onTouchStart: (event: React.TouchEvent) => void;\n onTouchEnd: (event: React.TouchEvent) => void;\n}\n\nexport function useLongPress(\n onLongPress: (event: React.MouseEvent | React.TouchEvent) => void,\n options: UseLongPressOptions = {},\n): UseLongPressReturnValue {\n const { threshold = 700, onStart, onFinish, onCancel } = options;\n const isLongPressActive = useRef(false);\n const isPressed = useRef(false);\n const timeout = useRef<number>(-1);\n\n useEffect(() => () => window.clearTimeout(timeout.current), []);\n\n return useMemo(() => {\n if (typeof onLongPress !== 'function') {\n return {} as UseLongPressReturnValue;\n }\n\n const start = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (onStart) {\n onStart(event);\n }\n\n isPressed.current = true;\n timeout.current = window.setTimeout(() => {\n onLongPress(event);\n isLongPressActive.current = true;\n }, threshold);\n };\n\n const cancel = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (isLongPressActive.current) {\n onFinish?.(event);\n } else if (isPressed.current) {\n onCancel?.(event);\n }\n\n isLongPressActive.current = false;\n isPressed.current = false;\n\n if (timeout.current) {\n window.clearTimeout(timeout.current);\n }\n };\n\n return {\n onMouseDown: start,\n onMouseUp: cancel,\n onMouseLeave: cancel,\n onTouchStart: start,\n onTouchEnd: cancel,\n onTouchMove: throttle(cancel, 150),\n };\n }, [onLongPress, threshold, onCancel, onFinish, onStart]);\n}\n\nfunction isTouchEvent(event: React.MouseEvent | React.TouchEvent): event is React.TouchEvent {\n return window.TouchEvent ? event.nativeEvent instanceof TouchEvent : 'touches' in event.nativeEvent;\n}\n\nfunction isMouseEvent(event: React.MouseEvent | React.TouchEvent): event is React.MouseEvent {\n return event.nativeEvent instanceof MouseEvent;\n}\n","/**\n * encapsulate logic related to showing a running timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\nimport { removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { formattedTime } from '../../../features/overview/overview.utils';\n\ninterface RunningTimeProps {\n value: MaybeNumber;\n hideSeconds?: boolean;\n hideLeadingZero?: boolean;\n className?: string;\n}\n\nexport default function RunningTime(props: RunningTimeProps) {\n const { value, hideSeconds, hideLeadingZero, className } = props;\n let display = formattedTime(value, hideSeconds || hideLeadingZero ? 2 : 3);\n\n if (hideLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (hideSeconds) {\n display = removeSeconds(display);\n }\n\n return <div className={className}>{display}</div>;\n}\n","import { CSSProperties, memo, RefObject, SyntheticEvent } from 'react';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND } from 'ontime-utils';\n\nimport DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';\nimport { useLongPress } from '../../../common/hooks/useLongPress';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, formatTime, useTimeUntilExpectedStart } from '../../../common/utils/time';\nimport RunningTime from '../../../views/common/running-time/RunningTime';\nimport SuperscriptPeriod from '../../../views/common/superscript-time/SuperscriptPeriod';\nimport type { EditEvent, Subscribed } from '../operator.types';\n\nimport style from './OperatorEvent.module.scss';\n\ninterface OperatorEventProps {\n id: string;\n colour: string;\n cue: string;\n main: string;\n secondary: string;\n timeStart: number;\n duration: number;\n delay: number;\n dayOffset: number;\n isLinkedToLoaded: boolean;\n isSelected: boolean;\n isPast: boolean;\n selectedRef?: RefObject<HTMLDivElement | null>;\n showStart: boolean;\n subscribed: Subscribed;\n totalGap: number;\n onLongPress: (event: EditEvent) => void;\n}\n\nexport default memo(OperatorEvent);\nfunction OperatorEvent({\n id,\n colour,\n cue,\n main,\n secondary,\n timeStart,\n duration,\n delay,\n dayOffset,\n isLinkedToLoaded,\n isSelected,\n isPast,\n selectedRef,\n showStart,\n subscribed,\n totalGap,\n onLongPress,\n}: OperatorEventProps) {\n /**\n * gather behaviour for long press and context menu\n */\n const handleLongPress = (event?: SyntheticEvent) => {\n // prevent default if the event is cancelable to avoid browser intervention warnings\n if (event && event.cancelable) {\n event.preventDefault();\n }\n if (subscribed) {\n onLongPress({ id, cue, subscriptions: subscribed });\n }\n };\n\n const mouseHandlers = useLongPress(handleLongPress);\n const cueColours = colour && getAccessibleColour(colour);\n\n const operatorClasses = cx([style.event, isSelected && style.running, isPast && style.past]);\n\n const hasFields = subscribed.some((field) => field.value);\n const columnCount = subscribed.length ? Math.min(subscribed.length, 4) : 0;\n const fieldGridStyle =\n columnCount > 0\n ? ({\n gridTemplateColumns: `repeat(${columnCount}, minmax(12rem, 1fr))`,\n } satisfies CSSProperties)\n : undefined;\n\n return (\n <div\n className={operatorClasses}\n data-testid={cue}\n ref={selectedRef}\n onContextMenu={handleLongPress}\n {...mouseHandlers}\n >\n <div className={style.binder} style={{ ...cueColours }}>\n <span className={style.cue}>{cue}</span>\n </div>\n\n <span className={style.mainField}>\n {showStart && <SuperscriptPeriod className={style.plannedStart} time={formatTime(timeStart)} />}\n {main}\n </span>\n <span className={style.secondaryField}>{secondary}</span>\n <OperatorEventSchedule\n timeStart={timeStart}\n isPast={isPast}\n isSelected={isSelected}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n <span className={style.runningTime}>\n <DelayIndicator delayValue={delay} />\n <RunningTime className={cx([isSelected && style.muted])} value={duration} hideLeadingZero />\n </span>\n\n <div className={cx([style.fields, hasFields && style.fieldsWithContent])} style={fieldGridStyle}>\n {subscribed.map((field) => {\n if (!field.value) {\n return <div key={field.id} />;\n }\n return (\n <div key={field.id}>\n <span\n className={cx([style.field, !field.colour && style.noColour])}\n style={{ backgroundColor: field.colour }}\n >\n {field.label}\n </span>\n <span className={style.value} style={{ color: field.colour }}>\n {field.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface OperatorEventScheduleProps {\n timeStart: number;\n isPast: boolean;\n isSelected: boolean;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction OperatorEventSchedule({\n timeStart,\n isPast,\n isSelected,\n delay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n}: OperatorEventScheduleProps) {\n if (isPast) {\n return <span className={style.timeUntil}>DONE</span>;\n }\n\n if (isSelected) {\n return <span className={style.timeUntil}>LIVE</span>;\n }\n\n return (\n <TimeUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n );\n}\n\ninterface TimeUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction TimeUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: TimeUntilProps) {\n // we isolate this to avoid unnecessary re-renders\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n\n const isDue = timeUntil < MILLIS_PER_SECOND;\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return (\n <span className={style.timeUntil} data-testid='time-until'>\n {timeUntilString}\n </span>\n );\n}\n","import { memo } from 'react';\n\nimport style from './OperatorGroup.module.scss';\n\ninterface OperatorGroup {\n title: string;\n}\n\nexport default memo(OperatorGroup);\nfunction OperatorGroup({ title }: OperatorGroup) {\n return <div className={style.group}>{title}</div>;\n}\n","import { ViewSettings } from 'ontime-types';\n\nimport MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useProgressData } from '../../../common/hooks/useSocket';\n\nimport styles from './StatusBar.module.scss';\n\ninterface StatusBarProgressProps {\n viewSettings: ViewSettings;\n}\n\nexport default function StatusBarProgress({ viewSettings }: StatusBarProgressProps) {\n const { current, duration, timeWarning, timeDanger } = useProgressData();\n\n return (\n <MultiPartProgressBar\n now={current}\n complete={duration}\n normalColor={viewSettings.normalColor}\n warning={timeWarning}\n warningColor={viewSettings.warningColor}\n danger={timeDanger}\n dangerColor={viewSettings.dangerColor}\n className={styles.progressOverride}\n ignoreCssOverride\n />\n );\n}\n","import { ClockOverview, TimerOverview } from '../../overview/composite/TimeElements';\n\nimport style from './StatusBar.module.scss';\n\nexport default function StatusBarTimers() {\n return (\n <div className={style.timers}>\n <TimerOverview className={style.runningTimer} />\n <ClockOverview className={style.timeNow} shouldFormat />\n </div>\n );\n}\n","import useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport StatusBarProgress from './StatusBarProgress';\nimport StatusBarTimers from './StatusBarTimers';\n\nimport styles from './StatusBar.module.scss';\n\nexport default function StatusBar() {\n const { data } = useViewSettings();\n\n return (\n <div className={styles.statusBar}>\n <StatusBarTimers />\n {data && <StatusBarProgress viewSettings={data} />}\n </div>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, EntryId, OntimeEvent } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport {\n makeCustomFieldSelectOptions,\n makeOptionsFromCustomFields,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../views/common/viewUtils';\n\nexport const getOperatorOptions = (customFields: CustomFields, timeFormat: string): ViewOption[] => {\n const fieldOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const customFieldSelect = makeCustomFieldSelectOptions(customFields);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main data field',\n description: 'Field to be shown in the first line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary data field',\n description: 'Field to be shown in the second line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'subscribe',\n title: 'Highlight Fields',\n description: 'Choose custom fields to highlight',\n type: 'multi-option',\n values: customFieldSelect,\n },\n {\n id: 'shouldEdit',\n title: 'Edit custom field',\n description: 'Allows editing an highlighted custom field by long pressing',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hidePast',\n title: 'Hide Past Events',\n description: 'Whether to hide events that have passed',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'showStart',\n title: 'Show planned start',\n description: 'Whether to prepend the planned start to the items',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype OperatorOptions = {\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n subscribe: string[];\n shouldEdit: boolean;\n hidePast: boolean;\n showStart: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): OperatorOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Helper to get array values from either source\n const getArrayValues = (key: string): EntryId[] => {\n if (defaultValues?.has(key)) {\n return defaultValues.getAll(key) as EntryId[];\n }\n return searchParams.getAll(key) as EntryId[];\n };\n\n // we manually make an object that matches the key above\n return {\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n subscribe: getArrayValues('subscribe'),\n shouldEdit: isStringBoolean(getValue('shouldEdit')),\n hidePast: isStringBoolean(getValue('hidePast')),\n showStart: isStringBoolean(getValue('showStart')),\n };\n}\n\n/**\n * Hook exposes the operator view options\n */\nexport function useOperatorOptions(): OperatorOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, MaybeString, OntimeEvent } from 'ontime-types';\r\n\r\nimport { getPropertyValue } from '../../views/common/viewUtils';\r\n\r\nimport type { Subscribed } from './operator.types';\r\n\r\nexport function getEventData(\r\n event: OntimeEvent,\r\n main: MaybeString,\r\n secondary: MaybeString,\r\n subscriptions: string[],\r\n customFields: CustomFields,\r\n) {\r\n const mainField = main ? getPropertyValue(event, main) ?? '' : event.title;\r\n const secondaryField = getPropertyValue(event, secondary) ?? '';\r\n\r\n // remove subscriptions that are not in customFields\r\n const sanitisedSubscriptions = subscriptions.filter((field) => Object.hasOwn(customFields, field));\r\n const subscribedData = sanitisedSubscriptions.reduce<Subscribed>((acc, id) => {\r\n const field = customFields[id];\r\n if (field) {\r\n acc.push({\r\n id,\r\n label: field.label,\r\n colour: field.colour,\r\n value: event.custom[id],\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return { mainField, secondaryField, subscribedData };\r\n}\r\n","import { CustomFields, Rundown, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../../views/utils/viewLoader.utils';\n\nexport interface OperatorData {\n rundown: Rundown;\n rundownMetadata: RundownMetadataObject;\n customFields: CustomFields;\n settings: Settings;\n}\n\nexport function useOperatorData(): ViewData<OperatorData> {\n const { data: rundown, rundownMetadata, status: rundownStatus } = useRundownWithMetadata();\n const { data: customFields, status: customFieldStatus } = useCustomFields();\n const { data: settings, status: settingsStatus } = useSettings();\n\n return {\n data: {\n rundown,\n rundownMetadata,\n customFields,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, customFieldStatus, settingsStatus]),\n };\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isOntimeEvent, isOntimeGroup, OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport { getDefaultFormat } from '../../common/utils/time';\nimport { isTouchDevice } from '../../externals';\nimport Loader from '../../views/common/loader/Loader';\n\nimport CustomFieldEditModal from './custom-field-edit-modal/CustomFieldEditModal';\nimport FollowButton from './follow-button/FollowButton';\nimport OperatorEvent from './operator-event/OperatorEvent';\nimport OperatorGroup from './operator-group/OperatorGroup';\nimport StatusBar from './status-bar/StatusBar';\nimport { getOperatorOptions, useOperatorOptions } from './operator.options';\nimport type { EditEvent } from './operator.types';\nimport { getEventData } from './operator.utils';\nimport { OperatorData, useOperatorData } from './useOperatorData';\n\nimport style from './Operator.module.scss';\n\nconst selectedOffset = 50;\n\nexport default function OperatorLoader() {\n const { data, status } = useOperatorData();\n\n useWindowTitle('Operator');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Operator {...data} />;\n}\n\nfunction Operator({ rundown, rundownMetadata, customFields, settings }: OperatorData) {\n const selectedEventId = useSelectedEventId();\n const { subscribe, mainSource, secondarySource, shouldEdit, hidePast, showStart } = useOperatorOptions();\n\n const [showEditPrompt, setShowEditPrompt] = useState(false);\n const [editEvent, setEditEvent] = useState<EditEvent | null>(null);\n\n const [lockAutoScroll, setLockAutoScroll] = useState(false);\n const selectedRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollToComponent = useFollowComponent({\n followRef: selectedRef,\n scrollRef,\n doFollow: !lockAutoScroll,\n topOffset: selectedOffset,\n followTrigger: selectedEventId,\n });\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n\n // reset scroll if nothing is selected\n useEffect(() => {\n if (!selectedEventId) {\n if (!lockAutoScroll) {\n scrollRef.current?.scrollTo(0, 0);\n }\n }\n }, [selectedEventId, lockAutoScroll, scrollRef]);\n\n const handleOffset = () => {\n if (selectedEventId) {\n scrollToComponent();\n }\n setLockAutoScroll(false);\n };\n\n // prevent considering automated scrolls as user scrolls\n const handleUserScroll = () => {\n if (selectedRef?.current && scrollRef?.current) {\n const selectedRect = selectedRef.current.getBoundingClientRect();\n const scrollerRect = scrollRef.current.getBoundingClientRect();\n if (selectedRect && scrollerRect) {\n const distanceFromTop = selectedRect.top - scrollerRect.top;\n const hasScrolledOutOfThreshold = distanceFromTop < -8 || distanceFromTop > selectedOffset;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n timeoutId.current = setTimeout(() => {\n setShowEditPrompt(false);\n }, 700);\n\n setShowEditPrompt(true);\n\n throttledHandleScroll();\n };\n\n const handleEdit = useCallback((event: EditEvent) => {\n setEditEvent({ ...event });\n }, []);\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const operatorOptions = useMemo(() => getOperatorOptions(customFields, defaultFormat), [customFields, defaultFormat]);\n\n const canEdit = shouldEdit && subscribe.length;\n\n return (\n <div className={style.operatorContainer} data-testid='operator-view'>\n <ViewParamsEditor target={OntimeView.Operator} viewOptions={operatorOptions} />\n {editEvent && <CustomFieldEditModal event={editEvent} onClose={() => setEditEvent(null)} />}\n\n <StatusBar />\n\n {canEdit && (\n <div className={cx([style.editPrompt, showEditPrompt && style.show])}>\n {isTouchDevice ? 'Press and hold to edit user field' : 'Right click to edit user field'}\n </div>\n )}\n\n <div className={style.operatorEvents} onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {rundown.order.map((entryId) => {\n const entry = rundown.entries[entryId];\n if (isOntimeEvent(entry)) {\n const { isPast, isLinkedToLoaded, isLoaded, totalGap } = rundownMetadata[entryId];\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || entry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n entry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={entry.id}\n id={entry.id}\n colour={entry.colour}\n cue={entry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={entry.timeStart}\n duration={entry.duration}\n delay={entry.delay}\n dayOffset={entry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n }\n\n if (isOntimeGroup(entry)) {\n const { isPast } = rundownMetadata[entry.id];\n\n const isCurrentParent = selectedEventId ? rundownMetadata[selectedEventId]?.groupId === entry.id : false;\n\n if (hidePast && isPast && !isCurrentParent) {\n return null;\n }\n\n return (\n <Fragment key={entry.id}>\n <OperatorGroup key={entry.id} title={entry.title} />\n {entry.entries.map((nestedEntryId) => {\n const nestedEntry = rundown.entries[nestedEntryId];\n if (!isOntimeEvent(nestedEntry)) {\n return null;\n }\n\n const { isPast, isLoaded, isLinkedToLoaded, totalGap } = rundownMetadata[nestedEntryId];\n\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || nestedEntry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n nestedEntry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={nestedEntry.id}\n id={nestedEntry.id}\n colour={nestedEntry.colour}\n cue={nestedEntry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={nestedEntry.timeStart}\n duration={nestedEntry.duration}\n delay={nestedEntry.delay}\n dayOffset={nestedEntry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n })}\n </Fragment>\n );\n }\n return null;\n })}\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n","import ProtectRoute from '../../common/components/protect-route/ProtectRoute';\n\nimport Operator from './Operator';\n\nexport default function OperatorExport() {\n return (\n <ProtectRoute permission='operator'>\n <Operator />\n </ProtectRoute>\n );\n}\n"],"names":["CustomFieldEditModal","props","event","onClose","updateEntry","useEntryActions","loading","setLoading","useState","inputRef","useRef","Array","handleSave","current","patchObject","id","forEach","element","dataset","field","defaultValue","value","custom","Object","assign","Dialog.Root","isOpen","jsx","Dialog.Portal","jsxs","Dialog.Popup","style","editModal","title","cue","IconButton","IoClose","body","subscriptions","map","Fragment","label","colour","Textarea","push","footer","Button","useLongPress","onLongPress","options","threshold","onStart","onFinish","onCancel","isLongPressActive","isPressed","timeout","useEffect","window","clearTimeout","useMemo","start","isMouseEvent","isTouchEvent","setTimeout","cancel","onMouseDown","onMouseUp","onMouseLeave","onTouchStart","onTouchEnd","onTouchMove","throttle","TouchEvent","nativeEvent","MouseEvent","RunningTime","hideSeconds","hideLeadingZero","className","display","formattedTime","removeLeadingZero","removeSeconds","memo","OperatorEvent","main","secondary","timeStart","duration","delay","dayOffset","isLinkedToLoaded","isSelected","isPast","selectedRef","showStart","subscribed","totalGap","handleLongPress","cancelable","preventDefault","mouseHandlers","cueColours","getAccessibleColour","operatorClasses","cx","running","past","hasFields","some","columnCount","length","Math","min","fieldGridStyle","gridTemplateColumns","undefined","binder","mainField","SuperscriptPeriod","plannedStart","formatTime","secondaryField","OperatorEventSchedule","runningTime","DelayIndicator","muted","fields","fieldsWithContent","noColour","backgroundColor","color","timeUntil","TimeUntil","useTimeUntilExpectedStart","timeUntilString","MILLIS_PER_SECOND","formatDuration","abs","MILLIS_PER_MINUTE","OperatorGroup","group","StatusBarProgress","viewSettings","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","normalColor","warningColor","dangerColor","styles","progressOverride","StatusBarTimers","timers","TimerOverview","runningTimer","ClockOverview","timeNow","StatusBar","data","useViewSettings","statusBar","getOperatorOptions","customFields","timeFormat","fieldOptions","makeOptionsFromCustomFields","customFieldSelect","makeCustomFieldSelectOptions","OptionTitle","ClockOptions","collapsible","getTimeOption","DataSources","description","type","values","ElementVisibility","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","getArrayValues","has","getAll","mainSource","secondarySource","subscribe","shouldEdit","isStringBoolean","hidePast","useOperatorOptions","useSearchParams","maybePreset","use","PresetContext","URLSearchParams","search","getEventData","getPropertyValue","subscribedData","filter","hasOwn","reduce","acc","useOperatorData","rundown","rundownMetadata","status","rundownStatus","useRundownWithMetadata","customFieldStatus","useCustomFields","settings","settingsStatus","useSettings","aggregateQueryStatus","selectedOffset","OperatorLoader","useWindowTitle","Loader","EmptyPage","Operator","selectedEventId","useSelectedEventId","showEditPrompt","setShowEditPrompt","editEvent","setEditEvent","lockAutoScroll","setLockAutoScroll","scrollRef","scrollToComponent","useFollowComponent","followRef","doFollow","topOffset","followTrigger","timeoutId","scrollTo","handleOffset","throttledHandleScroll","handleUserScroll","selectedRect","getBoundingClientRect","scrollerRect","distanceFromTop","top","hasScrolledOutOfThreshold","handleScroll","handleEdit","useCallback","defaultFormat","getDefaultFormat","operatorOptions","canEdit","operatorContainer","ViewParamsEditor","OntimeView","editPrompt","show","isTouchDevice","operatorEvents","order","entryId","entry","entries","isOntimeEvent","isLoaded","skip","isOntimeGroup","isCurrentParent","groupId","nestedEntryId","nestedEntry","FollowButton","OperatorExport","ProtectRoute"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s,aH as f,aI as u,aJ as v,aK as b,aL as m,ax as y}from"./vendor-BKUJ0_Du.js";import{u as p}from"./useProjectData-C110zIXC.js";import{e as a,bf as h}from"./index-Dm-4OTmY.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ac3fd58d-2005-46a3-b40b-d3590d914106",e._sentryDebugIdIdentifier="sentry-dbid-ac3fd58d-2005-46a3-b40b-d3590d914106")}catch{}})();const x="_title_1kaxc_17",w="_description_1kaxc_27",r={title:x,description:w};function $(){const{data:e}=p();return!e.title&&!e.description?null:s.jsxs("div",{children:[s.jsx("div",{className:r.title,children:e.title}),s.jsx("div",{className:r.description,children:e.description})]})}const j="_root_1kuaa_17",S="_viewport_1kuaa_22",N="_scrollbar_1kuaa_28",O="_thumb_1kuaa_51",i={root:j,viewport:S,scrollbar:N,thumb:O};function g({className:e,viewportClassName:n,contentClassName:t,contentStyle:l,children:c,ref:d,orientation:_="vertical"}){return s.jsxs(f,{className:a([i.root,e]),children:[s.jsx(u,{ref:d,className:a([i.viewport,n]),children:s.jsx(v,{className:t,style:l,children:c})}),s.jsx(b,{className:i.scrollbar,orientation:_,children:s.jsx(m,{className:i.thumb})})]})}const k="_overview_12a2y_17",I="_isOffline_12a2y_24",A="_info_12a2y_24",D="_nav_12a2y_39",T="_infoScroll_12a2y_54",E="_inline_12a2y_60",o={overview:k,isOffline:I,info:A,nav:D,infoScroll:T,inline:E};function z({navElements:e,children:n}){const t=h();return s.jsx("div",{className:a([o.overview,!t&&o.isOffline]),children:s.jsxs(y,{children:[s.jsx("div",{className:o.nav,children:e}),s.jsx(g,{className:o.infoScroll,contentClassName:o.info,contentStyle:{minWidth:"100%"},orientation:"horizontal",children:n})]})})}export{z as O,g as S,$ as T,o as s};
|
|
2
|
-
//# sourceMappingURL=OverviewWrapper-B2i8d3rt.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._blink_1kaxc_1{animation:_blink_1kaxc_1 1s step-start infinite}@keyframes _blink_1kaxc_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1kaxc_13{transform:rotate(45deg)}._title_1kaxc_17{font-size:1.75rem;font-weight:600;color:#f6f6f6;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._description_1kaxc_27{font-size:1rem;color:#b1b1b1;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._blink_1kuaa_1{animation:_blink_1kuaa_1 1s step-start infinite}@keyframes _blink_1kuaa_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1kuaa_13{transform:rotate(45deg)}._root_1kuaa_17{position:relative;overflow:hidden}._viewport_1kuaa_22{height:100%;width:100%;overscroll-behavior:contain}._scrollbar_1kuaa_28{background:transparent;opacity:0;transition:opacity .15s}._scrollbar_1kuaa_28[data-orientation=vertical]{width:6px}._scrollbar_1kuaa_28[data-orientation=horizontal]{height:6px}._scrollbar_1kuaa_28[data-orientation=horizontal][data-has-overflow-x]{opacity:1;pointer-events:auto}._scrollbar_1kuaa_28[data-scrolling]{transition-duration:0ms}._scrollbar_1kuaa_28[data-hovering],._scrollbar_1kuaa_28[data-scrolling]{opacity:1;pointer-events:auto}._thumb_1kuaa_51{background:#fff3;border-radius:2px}._thumb_1kuaa_51:hover{background:#fff9}._blink_12a2y_1{animation:_blink_12a2y_1 1s step-start infinite}@keyframes _blink_12a2y_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_12a2y_13{transform:rotate(45deg)}._overview_12a2y_17{grid-area:overview;font-size:calc(1rem - 2px);display:flex;overflow:hidden}._isOffline_12a2y_24 ._info_12a2y_24{opacity:.4}._isOffline_12a2y_24:after{content:"Disconnected";position:absolute;padding-inline:.5rem;bottom:.5rem;right:.5rem;background-color:#d20300;border-radius:2px;font-size:calc(1rem - 2px);z-index:1000}._nav_12a2y_39{display:flex;align-items:center;gap:.5rem}._info_12a2y_24{padding-left:1rem;display:flex;align-items:center;justify-content:space-between;width:max-content;height:100%}._infoScroll_12a2y_54{flex:1;min-width:0;height:100%}._inline_12a2y_60{display:flex;align-items:center;gap:1rem}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as l,j as t,A as f}from"./vendor-BKUJ0_Du.js";import{e as h,ah as p,ak as b,bV as g,U as x}from"./index-Dm-4OTmY.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},a=new e.Error().stack;a&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[a]="8cc1f795-9a1d-4861-82a8-ba198e0be9e5",e._sentryDebugIdIdentifier="sentry-dbid-8cc1f795-9a1d-4861-82a8-ba198e0be9e5")}catch{}})();const y="_container_o8th0_17",_="_pin_o8th0_27",m="_pinFailed_o8th0_51",c={container:y,pin:_,pinFailed:m};function v({permission:e,handleValidation:a}){const[s,o]=l.useState(""),[i,r]=l.useState(!1),u=()=>{a(s)||(r(!0),o(""))},d=n=>{o(n),i&&r(!1)};return t.jsxs("div",{className:c.container,children:[`Ontime ${e}`,t.jsxs("form",{onSubmit:n=>{n.preventDefault(),u()},className:h([c.pin,i&&c.pinFailed]),children:[t.jsx(p,{type:"password",maxLength:4,height:"large",value:s,onChange:n=>d(n.target.value)}),t.jsx(b,{type:"submit",variant:"primary","aria-label":"Enter",children:t.jsx(f,{})})]})]})}function w({permission:e,children:a}){const{editorAuth:s,operatorAuth:o,validate:i}=l.useContext(g),r=l.useCallback(d=>i(d,e),[e,i]);return x||(e==="editor"?s:e==="operator"?o:!1)?t.jsx(t.Fragment,{children:a}):t.jsx(v,{permission:e,handleValidation:r})}export{w as P};
|
|
2
|
-
//# sourceMappingURL=ProtectRoute-Bxq6q7ba.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{o as C,h as n,j as e,aG as b,C as j,I as v}from"./vendor-BKUJ0_Du.js";import{P as w}from"./ProtectRoute-Bxq6q7ba.js";import{a as E,bb as y,P as M,bc as O,b6 as m,bd as p,be as P,ba as T,ak as S}from"./index-Dm-4OTmY.js";import{u as I,m as W,C as _,a as k,E as D,b as F}from"./CuesheetTable-B5LQVh5m.js";import{u as A}from"./DelayIndicator-DKS6mZdB.js";import{u as $}from"./useWindowTitle-DM8dIp8L.js";import{T as f,O as g,a as L,M as N,C as R}from"./TimeElements-CYIgGk0T.js";import{O as h,T as z}from"./OverviewWrapper-B2i8d3rt.js";import{M as B}from"./MultiPartProgressBar-W2a-JWPY.js";import{E as V}from"./EmptyPage-CYVrjOvI.js";import{u as G}from"./useCustomFields-BBE4LBBr.js";import"./useEventSelection-Bpbu89c7.js";import"./SwatchPicker-Ckpchvjo.js";import"./Select-BnGTAeXJ.js";import"./useRundown-DAo6huE4.js";import"./EditorUtils-BLcTuWz1.js";import"./TimeInput-Cwl9vLWA.js";import"./parseUserTime-sZbEBi61.js";import"./validateEvent-GnPt-e9-.js";import"./Tooltip-DZJ7u9gm.js";import"./offset-VthsmtrO.js";import"./editorSettings-_x6YKRfR.js";import"./rundownUtils-CXZRD6yP.js";import"./SuperscriptPeriod-EEedc9rG.js";/* empty css */import"./playbackstate-Dl_ZJABT.js";import"./useProjectData-C110zIXC.js";import"./getProgress-ZUTmCn_v.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new s.Error().stack;r&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[r]="37ed73f6-c625-4ce2-8f10-7dfe734754ba",s._sentryDebugIdIdentifier="sentry-dbid-37ed73f6-c625-4ce2-8f10-7dfe734754ba")}catch{}})();function H(){const{width:s}=C();return n.useMemo(()=>s<800,[s])}const K=n.memo(q);function q({children:s}){return H()?e.jsx(J,{children:s}):e.jsx(Q,{children:s})}function J({children:s}){return e.jsxs(h,{navElements:s,children:[e.jsx(f,{}),e.jsx(g,{})]})}function Q({children:s}){return e.jsxs(h,{navElements:s,children:[e.jsx(z,{}),e.jsx(L,{shouldFormat:!0}),e.jsx(f,{}),e.jsx(g,{}),e.jsx(N,{}),e.jsx(R,{shouldFormat:!0})]})}const U="_progressOverride_av4z0_17",X={progressOverride:U};function Y(){const{data:s}=E(),{current:r,duration:o,timeWarning:t,timeDanger:i}=y();return e.jsx(B,{now:r,complete:o,normalColor:s.normalColor,warning:t,warningColor:s.warningColor,danger:i,dangerColor:s.dangerColor,className:X.progressOverride,ignoreCssOverride:!0})}const Z=n.memo(ee);function ee(){const{data:s,status:r}=G(),o=I(a=>a.setPermissions),t=n.use(M);n.useEffect(()=>{var a,l,d;if(t){const u=((a=t.options)==null?void 0:a.write)==="full";o({canChangeMode:((l=t.options)==null?void 0:l.write)!=="-",canCreateEntries:u,canEditEntries:u,canFlag:u||!!((d=t.options)!=null&&d.write.includes("flag")),canShare:!1})}else o({canChangeMode:!0,canCreateEntries:!0,canEditEntries:!0,canFlag:!0,canShare:O==="rw"})},[t,o]);const[i]=b({key:t?`${t.alias}${p.cuesheetMode}`:p.cuesheetMode,defaultValue:t?m.Run:m.Edit}),c=n.useMemo(()=>W(s,i,t),[s,i,t]),x=!s||r==="pending";return e.jsx(_,{columns:c,children:x?e.jsx(V,{text:"Loading..."}):e.jsx(k,{columns:c,cuesheetMode:i})})}const se="_tableWrapper_h9gr1_17",te={tableWrapper:se};function re(){const[s,r]=j(),o=A();$("Cuesheet");const t=P();return e.jsxs(D,{actions:o,children:[e.jsx(T,{isOpen:s,onClose:r.close}),e.jsx(F,{}),e.jsxs("div",{className:te.tableWrapper,"data-testid":"cuesheet",children:[e.jsx(K,{children:!t&&e.jsx(S,{"aria-label":"Toggle navigation",variant:"subtle-white",size:"xlarge",onClick:r.open,children:e.jsx(v,{})})}),e.jsx(Y,{}),e.jsx(Z,{})]})]})}function _e(){return e.jsx(w,{permission:"operator",children:e.jsx(re,{})})}export{_e as default};
|
|
2
|
-
//# sourceMappingURL=ProtectedCuesheet-C7AqD2dy.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProtectedCuesheet-C7AqD2dy.js","sources":["../../src/common/hooks/useIsMobileScreen.ts","../../src/features/overview/CuesheetOverview.tsx","../../src/views/cuesheet/cuesheet-progress/CuesheetProgress.tsx","../../src/views/cuesheet/CuesheetTableWrapper.tsx","../../src/views/cuesheet/CuesheetPage.tsx","../../src/views/cuesheet/ProtectedCuesheet.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useViewportSize } from '@mantine/hooks';\n\nexport function useIsMobileScreen(): boolean {\n const { width } = useViewportSize();\n\n return useMemo(() => width < 800, [width]);\n}\n","import { memo, PropsWithChildren } from 'react';\n\nimport { useIsMobileScreen } from '../../common/hooks/useIsMobileScreen';\n\nimport {\n ClockOverview,\n MetadataTimes,\n OffsetOverview,\n StartTimesRuntime,\n TimerOverview,\n} from './composite/TimeElements';\nimport TitleOverview from './composite/TitleOverview';\nimport { OverviewWrapper } from './OverviewWrapper';\n\nexport default memo(CuesheetOverview);\nfunction CuesheetOverview({ children }: PropsWithChildren) {\n const isMobileScreen = useIsMobileScreen();\n\n if (isMobileScreen) {\n return <CuesheetMobile>{children}</CuesheetMobile>;\n }\n return <CuesheetDesktop>{children}</CuesheetDesktop>;\n}\n\nfunction CuesheetMobile({ children }: PropsWithChildren) {\n return (\n <OverviewWrapper navElements={children}>\n <TimerOverview />\n <OffsetOverview />\n </OverviewWrapper>\n );\n}\n\nfunction CuesheetDesktop({ children }: PropsWithChildren) {\n return (\n <OverviewWrapper navElements={children}>\n <TitleOverview />\n <StartTimesRuntime shouldFormat />\n <TimerOverview />\n <OffsetOverview />\n <MetadataTimes />\n <ClockOverview shouldFormat />\n </OverviewWrapper>\n );\n}\n","import MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useProgressData } from '../../../common/hooks/useSocket';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport styles from './CuesheetProgress.module.scss';\n\nexport default function CuesheetProgress() {\n const { data } = useViewSettings();\n const { current, duration, timeWarning, timeDanger } = useProgressData();\n\n return (\n <MultiPartProgressBar\n now={current}\n complete={duration}\n normalColor={data.normalColor}\n warning={timeWarning}\n warningColor={data.warningColor}\n danger={timeDanger}\n dangerColor={data.dangerColor}\n className={styles.progressOverride}\n ignoreCssOverride\n />\n );\n}\n","import { memo, use, useEffect, useMemo } from 'react';\nimport { useSessionStorage } from '@mantine/hooks';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport { sessionScope } from '../../externals';\nimport { AppMode, sessionKeys } from '../../ontimeConfig';\n\nimport CuesheetDnd from './cuesheet-dnd/CuesheetDnd';\nimport { makeCuesheetColumns } from './cuesheet-table/cuesheet-table-elements/cuesheetColsFactory';\nimport CuesheetTable from './cuesheet-table/CuesheetTable';\nimport { useCuesheetPermissions } from './useTablePermissions';\n\nexport default memo(CuesheetTableWrapper);\nfunction CuesheetTableWrapper() {\n const { data: customFields, status: customFieldStatus } = useCustomFields();\n const setPermissions = useCuesheetPermissions((state) => state.setPermissions);\n const preset = use(PresetContext);\n\n // set permissions based on preset\n useEffect(() => {\n if (preset) {\n const fullWrite = preset.options?.write === 'full';\n setPermissions({\n canChangeMode: preset.options?.write !== '-',\n canCreateEntries: fullWrite,\n canEditEntries: fullWrite,\n canFlag: fullWrite || Boolean(preset.options?.write.includes('flag')),\n canShare: false, // TODO: should be sessionScope === 'rw' when we have granular scopes\n });\n } else {\n setPermissions({\n canChangeMode: true,\n canCreateEntries: true,\n canEditEntries: true,\n canFlag: true,\n canShare: sessionScope === 'rw',\n });\n }\n }, [preset, setPermissions]);\n\n const [cuesheetMode] = useSessionStorage({\n key: preset ? `${preset.alias}${sessionKeys.cuesheetMode}` : sessionKeys.cuesheetMode,\n defaultValue: preset ? AppMode.Run : AppMode.Edit,\n });\n\n const columns = useMemo(\n () => makeCuesheetColumns(customFields, cuesheetMode, preset),\n [customFields, cuesheetMode, preset],\n );\n\n const isLoading = !customFields || customFieldStatus === 'pending';\n\n return (\n <CuesheetDnd columns={columns}>\n {isLoading ? <EmptyPage text='Loading...' /> : <CuesheetTable columns={columns} cuesheetMode={cuesheetMode} />}\n </CuesheetDnd>\n );\n}\n","import { IoApps } from 'react-icons/io5';\nimport { useDisclosure } from '@mantine/hooks';\n\nimport IconButton from '../../common/components/buttons/IconButton';\nimport NavigationMenu from '../../common/components/navigation-menu/NavigationMenu';\nimport { EntryActionsProvider } from '../../common/context/EntryActionsContext';\nimport { useEntryActions } from '../../common/hooks/useEntryAction';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { getIsNavigationLocked } from '../../externals';\nimport CuesheetOverview from '../../features/overview/CuesheetOverview';\n\nimport EntryEditModal from './cuesheet-edit-modal/EntryEditModal';\nimport CuesheetProgress from './cuesheet-progress/CuesheetProgress';\nimport CuesheetTableWrapper from './CuesheetTableWrapper';\n\nimport styles from './CuesheetPage.module.scss';\n\nexport default function CuesheetPage() {\n const [isMenuOpen, menuHandler] = useDisclosure();\n const entryActions = useEntryActions();\n\n useWindowTitle('Cuesheet');\n\n const isLocked = getIsNavigationLocked();\n\n return (\n <EntryActionsProvider actions={entryActions}>\n <NavigationMenu isOpen={isMenuOpen} onClose={menuHandler.close} />\n <EntryEditModal />\n <div className={styles.tableWrapper} data-testid='cuesheet'>\n <CuesheetOverview>\n {!isLocked && (\n <IconButton aria-label='Toggle navigation' variant='subtle-white' size='xlarge' onClick={menuHandler.open}>\n <IoApps />\n </IconButton>\n )}\n </CuesheetOverview>\n <CuesheetProgress />\n <CuesheetTableWrapper />\n </div>\n </EntryActionsProvider>\n );\n}\n","import ProtectRoute from '../../common/components/protect-route/ProtectRoute';\n\nimport CuesheetPage from './CuesheetPage';\n\nexport default function ProtectedCuesheet() {\n return (\n <ProtectRoute permission='operator'>\n <CuesheetPage />\n </ProtectRoute>\n );\n}\n"],"names":["useIsMobileScreen","width","useViewportSize","useMemo","memo","CuesheetOverview","children","jsx","CuesheetMobile","CuesheetDesktop","jsxs","OverviewWrapper","TimerOverview","OffsetOverview","TitleOverview","StartTimesRuntime","MetadataTimes","ClockOverview","CuesheetProgress","data","useViewSettings","current","duration","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","normalColor","warningColor","dangerColor","styles","progressOverride","CuesheetTableWrapper","customFields","status","customFieldStatus","useCustomFields","setPermissions","useCuesheetPermissions","state","preset","use","PresetContext","useEffect","fullWrite","options","write","canChangeMode","canCreateEntries","canEditEntries","canFlag","Boolean","includes","canShare","sessionScope","cuesheetMode","useSessionStorage","key","alias","sessionKeys","defaultValue","AppMode","Run","Edit","columns","makeCuesheetColumns","isLoading","CuesheetDnd","EmptyPage","CuesheetTable","CuesheetPage","isMenuOpen","menuHandler","useDisclosure","entryActions","useEntryActions","useWindowTitle","isLocked","getIsNavigationLocked","EntryActionsProvider","NavigationMenu","close","EntryEditModal","tableWrapper","IconButton","open","IoApps","ProtectedCuesheet","ProtectRoute"],"mappings":"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"}
|