@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":"CuesheetTable-B5LQVh5m.js","sources":["../../../../packages/types/src/definitions/core/TimerLifecycle.type.ts","../../../../packages/utils/src/cue-utils/cueUtils.ts","../../src/common/context/EntryActionsContext.tsx","../../src/features/rundown/entry-editor/composite/EventEditorImage.tsx","../../src/common/components/input/auto-textarea/AutoTextarea.tsx","../../src/common/components/input/text-input/useReactiveTextInput.tsx","../../src/features/rundown/entry-editor/composite/EventTextArea.tsx","../../src/features/rundown/entry-editor/composite/EventTextInput.tsx","../../src/features/rundown/entry-editor/composite/EventEditorCustomFields.tsx","../../src/features/rundown/time-input-flow/TimeInputGroup.tsx","../../src/features/rundown/time-input-flow/TimeInputFlow.tsx","../../src/features/rundown/entry-editor/composite/EventEditorTimes.tsx","../../src/features/rundown/entry-editor/composite/EventEditorTitles.tsx","../../src/features/rundown/entry-editor/composite/eventTrigger.constants.ts","../../src/features/rundown/entry-editor/composite/EventEditorTriggers.tsx","../../src/features/rundown/entry-editor/EventEditor.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput.tsx","../../src/common/components/input/time-input/NullableTimeInput.tsx","../../src/features/rundown/entry-editor/composite/TargetDurationInput.tsx","../../src/features/rundown/entry-editor/GroupEditor.tsx","../../src/features/rundown/entry-editor/MilestoneEditor.tsx","../../src/features/rundown/entry-editor/CuesheetEventEditor.tsx","../../src/views/cuesheet/cuesheet-edit-modal/useEditModal.tsx","../../src/views/cuesheet/cuesheet-edit-modal/EntryEditModal.tsx","../../src/common/utils/debounce.ts","../../src/views/cuesheet/cuesheet-table/useColumnManager.tsx","../../src/views/cuesheet/cuesheet-dnd/CuesheetDnd.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/SingleLineCell.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/DurationInput.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/EditableImage.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/FlagCell.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/GhostedText.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/MultiLineCell.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/MutedText.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/TimeInput.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/cuesheetColsFactory.tsx","../../src/common/components/state/EmptyTableBody.tsx","../../src/features/rundown/rundown.options.ts","../../src/views/cuesheet/useTablePermissions.tsx","../../src/common/components/icons/RotatedLink.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-settings/CuesheetShareModal.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-settings/CuesheetTableSettings.tsx","../../src/features/rundown/rundown-table/EditorTableSettings.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/SortableCell.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/CuesheetHeader.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/DelayRow.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-menu/useCuesheetTableMenu.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/EventRow.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/GroupRow.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/MilestoneRow.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-menu/TableMenu.tsx","../../src/views/cuesheet/cuesheet-table/CuesheetTable.tsx"],"sourcesContent":["export enum TimerLifeCycle {\n onLoad = 'onLoad',\n onStart = 'onStart',\n onPause = 'onPause',\n onStop = 'onStop',\n onClock = 'onClock',\n onUpdate = 'onUpdate',\n onFinish = 'onFinish',\n onWarning = 'onWarning',\n onDanger = 'onDanger',\n}\n\nexport type TimerLifeCycleKey = keyof typeof TimerLifeCycle;\n\nexport const timerLifecycleValues = Object.keys(TimerLifeCycle);\n","import type { EntryId, OntimeEntry, RundownEntries } from 'ontime-types';\nimport { isOntimeEvent } from 'ontime-types';\n\nimport { getFirstEventNormal, getNextEventNormal, getPreviousEventNormal } from '../rundown-utils/rundownUtils.js';\nimport { isNumeric } from '../types/types.js';\n\n// Zero or more non-digit characters at the beginning ((\\D*)).\n// One or more digits ((\\d+)).\n// Optionally, a decimal part starting with a dot ((\\.\\d+)?).\nconst regex = /^(\\D*)(\\d+)(\\.\\d+)?$/;\n\n/**\n * Finds if last characters in input are a number and increments\n */\nexport function getIncrement(input: string): string {\n // Check if the input string contains a number at the end\n const match = regex.exec(input);\n if (match) {\n // If a number is found, extract the non-numeric prefix, integer part, and decimal part\n // eslint-disable-next-line prefer-const -- some items in the destructuring are modified\n let [, prefix, integerPart, decimalPart] = match;\n\n if (decimalPart) {\n if (decimalPart === '.99') {\n decimalPart = '.100';\n } else {\n const addDecimal = `${'0'.repeat(decimalPart.length - 2)}1`;\n const incrementedDecimal = (Number(decimalPart) + Number(`0.${addDecimal}`)).toFixed(decimalPart.length - 1);\n decimalPart = incrementedDecimal.toString().replace('0.', '.');\n }\n return `${prefix}${integerPart}${decimalPart}`;\n }\n const incrementedInteger = Number(integerPart) + 1;\n integerPart = incrementedInteger.toString();\n return `${prefix}${integerPart}`;\n }\n // If no number is found, append \"2\" to the string and return the updated string\n return `${input}2`;\n}\n\n/**\n * Gets suitable name for a new event cue\n */\nexport function getCueCandidate(entries: RundownEntries, order: EntryId[], insertAfterId: EntryId | null): string {\n // we did not provide a element to go after, we attempt to go first so only need to check for a cue with value 1\n if (insertAfterId === null || order.length === 0) {\n return addAtTop();\n }\n\n // get the given event, or any before that\n let previousEvent: OntimeEntry | null | undefined = entries[insertAfterId];\n\n if (!isOntimeEvent(previousEvent)) {\n previousEvent = getPreviousEventNormal(entries, order, insertAfterId).previousEvent;\n if (!isOntimeEvent(previousEvent)) {\n return addAtTop();\n }\n }\n\n // the cue is based on the previous event cue\n const cue = getIncrement(previousEvent.cue);\n const { nextEvent } = getNextEventNormal(entries, order, insertAfterId);\n\n // if increment is clashing with next, we add a decimal instead\n if (cue !== nextEvent?.cue) {\n return cue;\n }\n\n // there is a clash, bt the cue is a pure number\n if (isNumeric(cue)) {\n return incrementDecimal(previousEvent.cue);\n }\n\n /**\n * at this point, we know the cue is not numeric\n * but the increment failed, so we have a numeric ending\n * eg. Presenter 1 .... Presenter 2 -> Presenter1.1\n * eg. Presenter 1.1 .... Presenter 1.2 -> Presenter1.1.1\n */\n return `${previousEvent.cue}.1`;\n\n function incrementDecimal(cue: string) {\n const n = Number(cue);\n return (n + 0.1).toString();\n }\n\n function addAtTop() {\n const firstEventCue = getFirstEventNormal(entries, order).firstEvent?.cue;\n if (firstEventCue === '1') {\n return '0.1';\n }\n return '1';\n }\n}\n\nexport function sanitiseCue(cue: string) {\n return cue.replaceAll(' ', '').replaceAll(',', '.');\n}\n","import { createContext, PropsWithChildren, useContext } from 'react';\n\nimport { useEntryActions } from '../hooks/useEntryAction';\n\ntype EntryActionsContextValue = ReturnType<typeof useEntryActions>;\nconst EntryActionsContext = createContext<EntryActionsContextValue | null>(null);\n\ninterface EntryActionsProviderProps extends PropsWithChildren {\n actions: EntryActionsContextValue;\n}\n\nexport function EntryActionsProvider({ children, actions }: EntryActionsProviderProps) {\n return <EntryActionsContext.Provider value={actions}>{children}</EntryActionsContext.Provider>;\n}\n\nexport function useEntryActionsContext(): EntryActionsContextValue {\n const context = useContext(EntryActionsContext);\n\n if (!context) {\n throw new Error('useEntryActionsContext must be used within EntryActionsProvider');\n }\n\n return context;\n}\n","import style from './EventEditorImage.module.scss';\n\ninterface EventEditorImageProps {\n src: string;\n}\n\nexport default function EventEditorImage({ src }: EventEditorImageProps) {\n return (\n <div className={style.imageContainer}>\n {Boolean(src) && <img loading='lazy' src={src} />}\n <div className={style.imageOverlay} />\n </div>\n );\n}\n","import { RefObject, useEffect } from 'react';\n// @ts-expect-error no types from library\nimport autosize from 'autosize/dist/autosize';\n\nimport Textarea, { type TextareaProps } from '../textarea/Textarea';\n\ninterface AutoTextAreaProps extends TextareaProps {\n inputref: RefObject<HTMLTextAreaElement | null>;\n}\n\n/**\n * A textarea that automatically resizes based on its content\n */\nexport function AutoTextarea({ value, inputref, ...textAreaProps }: AutoTextAreaProps) {\n // when the value changes, we use the ref to reapply autosize\n useEffect(() => {\n const node = inputref.current;\n autosize(inputref.current);\n\n return () => {\n autosize.destroy(node);\n };\n }, [inputref, value]);\n\n return <Textarea ref={inputref} value={value} {...textAreaProps} />;\n}\n","import { ChangeEvent, KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getHotkeyHandler, HotkeyItem } from '@mantine/hooks';\n\ninterface UseReactiveTextInputReturn {\n value: string;\n onChange: (event: ChangeEvent) => void;\n onBlur: (event: ChangeEvent) => void;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n}\n\nexport default function useReactiveTextInput(\n initialText: string,\n submitCallback: (newValue: string) => void,\n ref: RefObject<HTMLInputElement | HTMLTextAreaElement | null>,\n options?: {\n submitOnEnter?: boolean;\n submitOnCtrlEnter?: boolean;\n onCancelUpdate?: () => void;\n allowSubmitSameValue?: boolean;\n allowKeyboardNavigation?: boolean;\n },\n): UseReactiveTextInputReturn {\n const [text, setText] = useState<string>(initialText);\n // track whether we are submitting via a submit key (eg enter) and avoid submitting again on blur\n const isKeyboardSubmitting = useRef(false);\n\n useEffect(() => {\n if (typeof initialText === 'undefined') {\n setText('');\n } else {\n setText(initialText);\n }\n }, [initialText]);\n\n /**\n * @description Handles Input value change\n * @param {string} newValue\n */\n const handleChange = useCallback(\n (newValue: string) => {\n if (newValue !== text) {\n setText(newValue);\n }\n },\n [text],\n );\n\n /**\n * @description Handles submit events\n * @param {string} valueToSubmit\n */\n const handleSubmit = useCallback(\n (valueToSubmit: string) => {\n // No need to update if it hasn't changed\n if (valueToSubmit === initialText && !options?.allowSubmitSameValue) {\n options?.onCancelUpdate?.();\n } else {\n const cleanVal = valueToSubmit.trim();\n submitCallback(cleanVal);\n if (cleanVal !== valueToSubmit) {\n setText(cleanVal);\n }\n }\n\n setTimeout(() => {\n if (options?.allowKeyboardNavigation) {\n ref.current?.parentElement?.focus(); // Focus on parent element to continue keyboard navigation\n } else {\n ref.current?.blur();\n }\n }); // Immediate timeout to ensure text is set before blurring\n },\n [initialText, options, ref, submitCallback],\n );\n\n /**\n * @description Handles escape events\n * @param {string} valueToSubmit\n */\n const handleEscape = useCallback(() => {\n // No need to update if it hasn't changed\n setText(initialText);\n // force the text to be the initial value\n if (ref.current) {\n ref.current.value = initialText;\n }\n options?.onCancelUpdate?.();\n setTimeout(() => ref.current?.blur()); // Immediate timeout to ensure text is set before blurring\n }, [initialText, options, ref]);\n\n const keyHandler = useMemo(() => {\n const hotKeys: HotkeyItem[] = [\n [\n 'Escape',\n (event) => {\n event.preventDefault();\n handleEscape();\n },\n { preventDefault: true },\n ],\n ];\n\n if (options?.submitOnEnter) {\n hotKeys.push([\n 'Enter',\n () => {\n isKeyboardSubmitting.current = true;\n handleSubmit(text);\n // clear flag after blur has been processed\n setTimeout(() => {\n isKeyboardSubmitting.current = false;\n }, 0);\n },\n ]);\n }\n\n if (options?.submitOnCtrlEnter) {\n hotKeys.push([\n 'mod + Enter',\n () => {\n isKeyboardSubmitting.current = true;\n handleSubmit(text);\n // clear flag after blur has been processed\n setTimeout(() => {\n isKeyboardSubmitting.current = false;\n }, 0);\n },\n ]);\n }\n\n const hotKeyHandler = getHotkeyHandler(hotKeys);\n\n return (event: KeyboardEvent<HTMLElement>) => {\n // allow moving in input field with arrow keys\n if (\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown'\n ) {\n event.stopPropagation();\n }\n\n hotKeyHandler(event);\n };\n }, [handleEscape, handleSubmit, options?.submitOnCtrlEnter, options?.submitOnEnter, text]);\n\n return {\n value: text,\n onChange: (event: ChangeEvent) => handleChange((event.target as HTMLInputElement).value),\n onBlur: (event: ChangeEvent) => {\n if (!isKeyboardSubmitting.current) {\n handleSubmit((event.target as HTMLInputElement).value);\n }\n },\n onKeyDown: keyHandler,\n };\n}\n","import { type CSSProperties, useCallback, useRef } from 'react';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport { AutoTextarea } from '../../../../common/components/input/auto-textarea/AutoTextarea';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\nimport { EventEditorUpdateFields } from '../EventEditor';\n\ninterface CountedTextAreaProps {\n className?: string;\n field: EventEditorUpdateFields;\n label: string;\n initialValue: string;\n style?: CSSProperties;\n submitHandler: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EventTextArea({\n className,\n field,\n label,\n initialValue,\n style: givenStyles,\n submitHandler,\n}: CountedTextAreaProps) {\n const ref = useRef<HTMLTextAreaElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnCtrlEnter: true,\n });\n\n return (\n <div>\n <Editor.Label className={className} htmlFor={field} style={givenStyles}>\n {label}\n </Editor.Label>\n <AutoTextarea\n id={field}\n inputref={ref}\n rows={1}\n data-testid='input-textarea'\n fluid\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n}\n","import { useCallback, useRef } from 'react';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport Input, { type InputProps } from '../../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\nimport { EventEditorUpdateFields } from '../EventEditor';\nimport { GroupEditorUpdateTextFields } from '../GroupEditor';\n\ninterface EntryEditorTextInputProps extends InputProps {\n field: EventEditorUpdateFields | GroupEditorUpdateTextFields;\n label: string;\n initialValue: string;\n placeholder?: string;\n submitHandler: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EntryEditorTextInput({\n className,\n field,\n label,\n initialValue,\n style: givenStyles,\n submitHandler,\n maxLength,\n placeholder,\n}: EntryEditorTextInputProps) {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n return (\n <div>\n <Editor.Label className={className} htmlFor={field} style={givenStyles}>\n {label}\n </Editor.Label>\n <Input\n id={field}\n ref={ref}\n maxLength={maxLength}\n fluid\n data-testid='input-textfield'\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n}\n","import { CSSProperties, Fragment } from 'react';\nimport { CustomFields, OntimeEvent, OntimeGroup, OntimeMilestone } from 'ontime-types';\n\nimport { getAccessibleColour } from '../../../../common/utils/styleUtils';\nimport { EventEditorUpdateFields } from '../EventEditor';\n\nimport EventEditorImage from './EventEditorImage';\nimport EventTextArea from './EventTextArea';\nimport EntryEditorTextInput from './EventTextInput';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EntryEditorCustomFieldsProps {\n fields: CustomFields;\n entry: OntimeEvent | OntimeGroup | OntimeMilestone;\n handleSubmit: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EntryEditorCustomFields({\n fields: customFields,\n handleSubmit,\n entry,\n}: EntryEditorCustomFieldsProps) {\n return (\n <Fragment>\n {Object.keys(customFields).map((fieldKey) => {\n const key = `${entry.id}-${fieldKey}`;\n const fieldName = `custom-${fieldKey}`;\n const initialValue = entry.custom[fieldKey] ?? '';\n const { backgroundColor, color } = getAccessibleColour(customFields[fieldKey].colour);\n const labelText = customFields[fieldKey].label;\n\n if (customFields[fieldKey].type === 'text') {\n return (\n <EventTextArea\n key={key}\n field={fieldName}\n label={labelText}\n initialValue={initialValue}\n submitHandler={handleSubmit}\n className={style.decorated}\n style={{ '--decorator-bg': backgroundColor, '--decorator-color': color } as CSSProperties}\n />\n );\n }\n\n if (customFields[fieldKey].type === 'image') {\n return (\n <div key={key} className={style.customImage}>\n <EntryEditorTextInput\n key={key}\n field={fieldName}\n label={labelText}\n initialValue={initialValue}\n placeholder='Paste image URL'\n submitHandler={handleSubmit}\n className={style.decorated}\n maxLength={255}\n style={{ '--decorator-bg': backgroundColor, '--decorator-color': color } as CSSProperties}\n />\n <EventEditorImage src={initialValue} />\n </div>\n );\n }\n\n // we should have exhausted all types by now\n return null;\n })}\n </Fragment>\n );\n}\n","import { PropsWithChildren } from 'react';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TimeInputGroup.module.scss';\n\ninterface TimeInputGroupProps {\n hasDelay?: boolean;\n}\n\nexport default function TimeInputGroup({ hasDelay, children }: PropsWithChildren<TimeInputGroupProps>) {\n return <div className={cx([style.inputGroup, hasDelay && style.delayed])}>{children}</div>;\n}\n","import { memo } from 'react';\nimport { IoAlertCircleOutline, IoLink, IoLockClosed, IoLockOpenOutline, IoUnlink } from 'react-icons/io5';\nimport { TimeField, TimeStrategy } from 'ontime-types';\nimport { dayInMs } from 'ontime-utils';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport TimeInput from '../../../common/components/input/time-input/TimeInput';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useEntryActionsContext } from '../../../common/context/EntryActionsContext';\n\nimport TimeInputGroup from './TimeInputGroup';\n\nimport style from './TimeInputFlow.module.scss';\n\ninterface TimeInputFlowProps {\n eventId: string;\n countToEnd: boolean;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n delay: number;\n showLabels?: boolean;\n}\n\nexport default memo(TimeInputFlow);\nfunction TimeInputFlow({\n eventId,\n countToEnd,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n delay,\n showLabels,\n}: TimeInputFlowProps) {\n const { updateEntry, updateTimer } = useEntryActionsContext();\n\n // In sync with EventEditorTimes\n const handleSubmit = (field: TimeField, value: string) => {\n updateTimer(eventId, field, value);\n };\n\n const handleChangeStrategy = (timeStrategy: TimeStrategy) => {\n updateEntry({ id: eventId, timeStrategy });\n };\n\n const handleLink = (doLink: boolean) => {\n updateEntry({ id: eventId, linkStart: doLink });\n };\n\n const warnings = [];\n if (timeStart + duration > dayInMs) {\n warnings.push('Over midnight');\n }\n\n if (countToEnd) {\n warnings.push('Count to End');\n }\n\n const hasDelay = delay !== 0;\n const isLockedEnd = timeStrategy === TimeStrategy.LockEnd;\n const isLockedDuration = timeStrategy === TimeStrategy.LockDuration;\n\n return (\n <>\n <div className={style.inputWrapper}>\n {showLabels && <Editor.Label className={style.sectionTitle}>Start time</Editor.Label>}\n <Editor.Label className={style.hoverLabel}>Start</Editor.Label>\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='timeStart'\n submitHandler={handleSubmit}\n time={timeStart}\n placeholder='Start'\n align='left'\n disabled={linkStart}\n />\n <Tooltip\n text='Link start to previous end'\n onClick={() => handleLink(!linkStart)}\n render={<IconButton variant='subtle-white' className={linkStart ? style.active : style.inactive} />}\n >\n <span className={style.fourtyfive}>{linkStart ? <IoLink /> : <IoUnlink />}</span>\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n <div className={style.inputWrapper}>\n {showLabels && <Editor.Label>End time</Editor.Label>}\n <Editor.Label className={style.hoverLabel}>End</Editor.Label>\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='timeEnd'\n submitHandler={handleSubmit}\n time={timeEnd}\n placeholder='End'\n align='left'\n disabled={isLockedDuration}\n />\n <Tooltip\n text='Lock end'\n render={<IconButton variant='subtle-white' className={isLockedEnd ? style.active : style.inactive} />}\n onClick={() => handleChangeStrategy(TimeStrategy.LockEnd)}\n data-testid='lock__end'\n >\n {isLockedEnd ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n <div className={style.inputWrapper}>\n {showLabels && <Editor.Label>Duration</Editor.Label>}\n <Editor.Label className={style.hoverLabel}>Duration</Editor.Label>\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='duration'\n submitHandler={handleSubmit}\n time={duration}\n placeholder='Duration'\n align='left'\n disabled={isLockedEnd}\n />\n <Tooltip\n text='Lock duration'\n render={<IconButton variant='subtle-white' className={isLockedDuration ? style.active : style.inactive} />}\n onClick={() => handleChangeStrategy(TimeStrategy.LockDuration)}\n data-testid='lock__duration'\n >\n {isLockedDuration ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n {warnings.length > 0 && (\n <Tooltip text={warnings.join(' - ')} className={style.timerNote} data-testid='event-warning' render={<span />}>\n <IoAlertCircleOutline />\n </Tooltip>\n )}\n </>\n );\n}\n","import { memo } from 'react';\nimport { IoInformationCircle } from 'react-icons/io5';\nimport { EndAction, TimerType, TimeStrategy } from 'ontime-types';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport Select from '../../../../common/components/select/Select';\nimport Switch from '../../../../common/components/switch/Switch';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActionsContext } from '../../../../common/context/EntryActionsContext';\nimport { millisToDelayString } from '../../../../common/utils/dateConfig';\nimport TimeInputFlow from '../../time-input-flow/TimeInputFlow';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EventEditorTimesProps {\n eventId: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n countToEnd: boolean;\n delay: number;\n endAction: EndAction;\n timerType: TimerType;\n timeWarning: number;\n timeDanger: number;\n}\n\ntype HandledActions = 'countToEnd' | 'timerType' | 'endAction' | 'timeWarning' | 'timeDanger';\n\nexport default memo(EventEditorTimes);\nfunction EventEditorTimes({\n eventId,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n countToEnd,\n delay,\n endAction,\n timerType,\n timeWarning,\n timeDanger,\n}: EventEditorTimesProps) {\n const { updateEntry } = useEntryActionsContext();\n\n const handleSubmit = (field: HandledActions, value: string | boolean) => {\n if (field === 'countToEnd') {\n updateEntry({ id: eventId, countToEnd: value as boolean });\n return;\n }\n\n if (field === 'timeWarning' || field === 'timeDanger') {\n const newTime = parseUserTime(value as string);\n updateEntry({ id: eventId, [field]: newTime });\n return;\n }\n\n if (field === 'timerType' || field === 'endAction') {\n updateEntry({ id: eventId, [field]: value });\n return;\n }\n };\n\n const hasDelay = delay !== 0;\n const delayLabel = hasDelay\n ? `Event is ${millisToDelayString(delay, 'expanded')}. New schedule ${millisToString(\n timeStart + delay,\n )} → ${millisToString(timeEnd + delay)}`\n : '';\n\n return (\n <>\n <div className={style.column}>\n <Editor.Title>Event schedule</Editor.Title>\n <div>\n <div className={style.inline}>\n <TimeInputFlow\n eventId={eventId}\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n timeStrategy={timeStrategy}\n linkStart={linkStart}\n delay={delay}\n countToEnd={countToEnd}\n showLabels\n />\n </div>\n <div className={style.delayLabel}>{delayLabel}</div>\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>Event Behaviour</Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='endAction'>End Action</Editor.Label>\n <Select\n value={endAction}\n onValueChange={(value: EndAction | null) => {\n if (value === null) return;\n handleSubmit('endAction', value);\n }}\n options={[\n { value: EndAction.None, label: 'None' },\n { value: EndAction.LoadNext, label: 'Load next event' },\n { value: EndAction.PlayNext, label: 'Play next event' },\n ]}\n />\n </div>\n <div>\n <Editor.Label htmlFor='countToEnd'>Count to End</Editor.Label>\n <Editor.Label className={style.switchLabel}>\n <Switch\n id='countToEnd'\n checked={countToEnd}\n onCheckedChange={(value) => handleSubmit('countToEnd', value)}\n />\n {countToEnd ? 'On' : 'Off'}\n </Editor.Label>\n </div>\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n <Tooltip\n text='Changes how the timer is displayed in different views. It is not reflected in the rundown'\n render={<span />}\n >\n Display Options\n <IoInformationCircle className={style.tooltipIcon} />\n </Tooltip>\n </Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='timerType'>Timer Type</Editor.Label>\n <Select\n value={timerType}\n onValueChange={(value: TimerType | null) => {\n if (value === null) return;\n handleSubmit('timerType', value);\n }}\n options={[\n { value: TimerType.CountDown, label: 'Count down' },\n { value: TimerType.CountUp, label: 'Count up' },\n { value: TimerType.Clock, label: 'Clock' },\n { value: TimerType.None, label: 'None' },\n ]}\n />\n </div>\n\n <div className={style.inline}>\n <div>\n <Editor.Label htmlFor='timeWarning'>Warning Time</Editor.Label>\n <TimeInput\n id='timeWarning'\n name='timeWarning'\n submitHandler={handleSubmit}\n time={timeWarning}\n placeholder='Duration'\n />\n </div>\n <div>\n <Editor.Label htmlFor='timeDanger'>Danger Time</Editor.Label>\n <TimeInput\n id='timeDanger'\n name='timeDanger'\n submitHandler={handleSubmit}\n time={timeDanger}\n placeholder='Duration'\n />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n}\n","import { memo } from 'react';\nimport { sanitiseCue } from 'ontime-utils';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../../common/components/input/colour-input/SwatchSelect';\nimport Input from '../../../../common/components/input/input/Input';\nimport Switch from '../../../../common/components/switch/Switch';\nimport { useEntryActionsContext } from '../../../../common/context/EntryActionsContext';\n\nimport EventTextArea from './EventTextArea';\nimport EntryEditorTextInput from './EventTextInput';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EventEditorTitlesProps {\n eventId: string;\n cue: string;\n flag: boolean;\n title: string;\n note: string;\n colour: string;\n}\n\nexport default memo(EventEditorTitles);\nfunction EventEditorTitles({ eventId, cue, flag, title, note, colour }: EventEditorTitlesProps) {\n const { updateEntry } = useEntryActionsContext();\n\n const cueSubmitHandler = (_field: string, newValue: string) => {\n updateEntry({ id: eventId, cue: sanitiseCue(newValue) });\n };\n\n const flagSubmitHandler = (newValue: boolean) => {\n updateEntry({ id: eventId, flag: newValue });\n };\n\n const textSubmitHandler = (field: string, newValue: string) => {\n updateEntry({ id: eventId, [field]: newValue });\n };\n\n return (\n <div className={style.column}>\n <Editor.Title>Event Data</Editor.Title>\n <div className={style.splitThree}>\n <div>\n <Editor.Label htmlFor='eventId'>Event ID (read only)</Editor.Label>\n <Input id='eventId' data-testid='input-textfield' value={eventId} readOnly fluid />\n </div>\n <EntryEditorTextInput\n field='cue'\n label='Cue'\n initialValue={cue}\n submitHandler={cueSubmitHandler}\n maxLength={10}\n />\n <div>\n <Editor.Label htmlFor='flag'>Flag</Editor.Label>\n <Editor.Label className={style.switchLabel}>\n <Switch id='flag' checked={flag} onCheckedChange={flagSubmitHandler} />\n {flag ? 'On' : 'Off'}\n </Editor.Label>\n </div>\n </div>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={colour} handleChange={textSubmitHandler} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={title} submitHandler={textSubmitHandler} />\n <EventTextArea field='note' label='Note' initialValue={note} submitHandler={textSubmitHandler} />\n </div>\n );\n}\n","import { TimerLifeCycle } from 'ontime-types';\n\nexport const eventTriggerOptions: TimerLifeCycle[] = [\n TimerLifeCycle.onLoad,\n TimerLifeCycle.onStart,\n TimerLifeCycle.onPause,\n TimerLifeCycle.onFinish,\n TimerLifeCycle.onWarning,\n TimerLifeCycle.onDanger,\n];\n","import { Fragment, useCallback, useMemo, useState } from 'react';\nimport { IoAlertCircle, IoCheckmarkCircle, IoTrash } from 'react-icons/io5';\nimport { TimerLifeCycle, timerLifecycleValues, Trigger } from 'ontime-types';\nimport { generateId } from 'ontime-utils';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport Select from '../../../../common/components/select/Select';\nimport Tag from '../../../../common/components/tag/Tag';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActionsContext } from '../../../../common/context/EntryActionsContext';\nimport useAutomationSettings from '../../../../common/hooks-query/useAutomationSettings';\n\nimport { eventTriggerOptions } from './eventTrigger.constants';\n\nimport style from './EventEditorTriggers.module.scss';\n\ninterface EventEditorTriggersProps {\n eventId: string;\n triggers: Trigger[];\n}\n\nexport default function EventEditorTriggers({ triggers, eventId }: EventEditorTriggersProps) {\n const showTriggers = triggers.length > 0;\n\n return (\n <>\n {showTriggers && <ExistingEventTriggers triggers={triggers} eventId={eventId} />}\n <EventTriggerForm triggers={triggers} eventId={eventId} />\n </>\n );\n}\n\ninterface EventTriggerFormProps {\n eventId: string;\n triggers?: Trigger[];\n}\n\nfunction EventTriggerForm({ eventId, triggers }: EventTriggerFormProps) {\n const { data: automationSettings } = useAutomationSettings();\n const { updateEntry } = useEntryActionsContext();\n const [automationId, setAutomationId] = useState<string | undefined>(undefined);\n const [cycleValue, setCycleValue] = useState(TimerLifeCycle.onStart);\n\n const handleSubmit = (triggerLifeCycle: TimerLifeCycle, automationId: string) => {\n const newTriggers = triggers ?? new Array<Trigger>();\n const id = generateId();\n newTriggers.push({ id, title: '', trigger: triggerLifeCycle, automationId });\n updateEntry({ id: eventId, triggers: newTriggers });\n };\n\n const getValidationError = (cycle: TimerLifeCycle, automationId?: string): string | undefined => {\n if (automationId === undefined) {\n return 'Select an automation';\n }\n if (!Object.keys(automationSettings.automations).includes(automationId)) {\n return 'This automation does not exist';\n }\n if (triggers === undefined) {\n return;\n }\n return Object.values(triggers).some((t) => t.automationId === automationId && t.trigger === cycle)\n ? 'Automation can only be used once'\n : undefined;\n };\n\n const validationError = getValidationError(cycleValue, automationId);\n\n const triggerOptions = useMemo(\n () => [\n { value: null, label: 'Select Trigger' },\n ...eventTriggerOptions.map((cycle) => ({ value: cycle, label: cycle })),\n ],\n [], // eventTriggerOptions is a constant, no need for dependency\n );\n\n const automationOptions = useMemo(\n () => [\n { value: null, label: 'Select Automation' },\n ...Object.values(automationSettings.automations).map(({ id, title }) => ({ value: id, label: title })),\n ],\n [automationSettings.automations], // This needs to be a dependency as it can change\n );\n\n return (\n <div className={style.triggerForm}>\n <Select\n value={cycleValue}\n onValueChange={(value) => {\n if (value !== null) setCycleValue(value);\n }}\n options={triggerOptions}\n />\n\n <Select\n value={automationId ?? null}\n onValueChange={(value) => {\n if (value !== null) setAutomationId(value);\n }}\n options={automationOptions}\n />\n\n <Button\n disabled={validationError !== undefined}\n onClick={() => automationId && handleSubmit(cycleValue, automationId)}\n >\n Add\n </Button>\n {validationError !== undefined ? (\n <Tooltip text={validationError} render={<span />}>\n <IoAlertCircle className={style.errorLabel} />\n </Tooltip>\n ) : (\n <IoCheckmarkCircle className={style.success} />\n )}\n </div>\n );\n}\n\ninterface ExistingEventTriggersProps {\n eventId: string;\n triggers: Trigger[];\n}\n\nfunction ExistingEventTriggers({ eventId, triggers }: ExistingEventTriggersProps) {\n const { updateEntry } = useEntryActionsContext();\n const { data: automationSettings } = useAutomationSettings();\n\n const handleDelete = useCallback(\n (triggerId: string) => {\n const newTriggers = triggers.filter((trigger) => trigger.id !== triggerId);\n updateEntry({ id: eventId, triggers: newTriggers });\n },\n [eventId, triggers, updateEntry],\n );\n\n const filteredTriggers: Record<string, Trigger[]> = {};\n\n // sort triggers out into groups by the Lifecycle they are on\n timerLifecycleValues.forEach((triggerType) => {\n const thisTriggerType = triggers.filter((trigger) => trigger.trigger === triggerType);\n if (thisTriggerType.length) {\n Object.assign(filteredTriggers, { [triggerType]: thisTriggerType });\n }\n });\n\n return (\n <div>\n {Object.entries(filteredTriggers).map(([triggerLifeCycle, triggerGroup]) => (\n <Fragment key={triggerLifeCycle}>\n {triggerGroup.map((trigger) => {\n const { id, automationId } = trigger;\n const automationTitle = automationSettings.automations[automationId]?.title ?? '<MISSING AUTOMATION>';\n return (\n <div key={id} className={style.trigger}>\n <Tag>{triggerLifeCycle}</Tag>\n <Tag>{automationTitle}</Tag>\n <IconButton variant='ghosted-destructive' onClick={() => handleDelete(id)}>\n <IoTrash />\n </IconButton>\n </div>\n );\n })}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { OntimeEvent } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActionsContext } from '../../../common/context/EntryActionsContext';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventEditorTimes from './composite/EventEditorTimes';\nimport EventEditorTitles from './composite/EventEditorTitles';\nimport EventEditorTriggers from './composite/EventEditorTriggers';\n\nimport style from './EntryEditor.module.scss';\n\n// any of the titles + colour + custom field labels\nexport type EventEditorUpdateFields = 'cue' | 'title' | 'note' | 'colour' | string;\n\ninterface EventEditorProps {\n event: OntimeEvent;\n}\n\nexport default function EventEditor({ event }: EventEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActionsContext();\n\n const isEditor = window.location.pathname.includes('editor');\n\n const handleSubmit = useCallback(\n (field: EventEditorUpdateFields, value: string) => {\n if (field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: event.id, custom: { [fieldLabel]: value } });\n } else {\n updateEntry({ id: event.id, [field]: value });\n }\n },\n [event.id, updateEntry],\n );\n\n return (\n <div className={style.content}>\n <EventEditorTimes\n key={`${event.id}-times`}\n eventId={event.id}\n timeStart={event.timeStart}\n timeEnd={event.timeEnd}\n duration={event.duration}\n timeStrategy={event.timeStrategy}\n linkStart={event.linkStart}\n countToEnd={event.countToEnd}\n delay={event.delay}\n endAction={event.endAction}\n timerType={event.timerType}\n timeWarning={event.timeWarning}\n timeDanger={event.timeDanger}\n />\n <EventEditorTitles\n key={`${event.id}-titles`}\n eventId={event.id}\n cue={event.cue}\n flag={event.flag}\n title={event.title}\n note={event.note}\n colour={event.colour}\n />\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={event} />\n </div>\n <div className={style.column}>\n <Editor.Title>\n Automations\n {isEditor && <AppLink search='settings=automation'>Manage Automations</AppLink>}\n </Editor.Title>\n <EventEditorTriggers triggers={event.triggers} eventId={event.id} />\n </div>\n </div>\n );\n}\n","import { forwardRef, HTMLAttributes, memo, PropsWithChildren, useImperativeHandle, useRef } from 'react';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './TextLikeInput.module.scss';\n\ninterface TextLikeInputProps extends HTMLAttributes<HTMLSpanElement> {\n offset?: 'over' | 'under' | 'muted' | null;\n muted?: boolean;\n disabled?: boolean;\n}\n\nconst TextLikeInput = forwardRef(\n (\n { offset, muted, disabled, children, className, ...elementProps }: PropsWithChildren<TextLikeInputProps>,\n textRef,\n ) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const classes = cx([\n style.textInput,\n offset && style[offset],\n muted && style.muted,\n disabled && style.disabled,\n className,\n ]);\n\n useImperativeHandle(textRef, () => {\n return {\n focusParentElement() {\n ref.current?.parentElement?.focus();\n },\n };\n });\n\n return (\n <div className={classes} tabIndex={disabled ? -1 : 0} {...elementProps} ref={ref}>\n {children}\n </div>\n );\n },\n);\n\nTextLikeInput.displayName = 'TextLikeInput';\n\nexport default memo(TextLikeInput);\n","import { FocusEvent, KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { cx } from '../../../utils/styleUtils';\nimport Input from '../input/Input';\n\nimport style from './TimeInput.module.scss';\n\ninterface NullableTimeInputProps<T extends string> {\n id?: T;\n name: T;\n submitHandler: (field: T, value: number) => void;\n time?: number | null;\n emptyDisplay: string;\n placeholder?: string;\n disabled?: boolean;\n align?: 'left' | 'center';\n className?: string;\n}\n\n/**\n * Similar to TimeInput, but allows clearing the time value\n */\nexport default function NullableTimeInput<T extends string>({\n id,\n name,\n submitHandler,\n time,\n emptyDisplay,\n placeholder,\n disabled,\n align = 'center',\n className,\n}: NullableTimeInputProps<T>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [value, setValue] = useState<string>('');\n const ignoreChange = useRef(false);\n\n /**\n * @description Resets input value to given\n */\n const resetValue = useCallback(() => {\n if (typeof time !== 'number' || isNaN(time)) {\n setValue(emptyDisplay);\n } else {\n setValue(millisToString(time));\n }\n }, [emptyDisplay, time]);\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = useCallback(() => {\n inputRef.current?.select();\n }, []);\n\n /**\n * @description Submit handler\n * @param {string} newValue\n */\n const handleSubmit = useCallback(\n (newValue: string) => {\n // skip if user deleted and time is already null\n if (newValue === '' && time === null) {\n return false;\n }\n\n // skip if the value evaluates to the same thing\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis === time) {\n return false;\n }\n\n submitHandler(name, valueInMillis);\n return true;\n },\n [name, submitHandler, time],\n );\n\n /**\n * @description Prepare time fields\n * @param {string} value string to be parsed\n */\n const validateAndSubmit = useCallback(\n (newValue: string) => {\n const success = handleSubmit(newValue);\n if (!success) {\n resetValue();\n }\n },\n [handleSubmit, resetValue],\n );\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n }\n if (event.key === 'Escape') {\n ignoreChange.current = true;\n inputRef.current?.blur();\n resetValue();\n }\n },\n [resetValue],\n );\n\n const onBlurHandler = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (ignoreChange.current) {\n ignoreChange.current = false;\n return;\n }\n validateAndSubmit((event.target as HTMLInputElement).value);\n },\n [validateAndSubmit],\n );\n\n useEffect(() => {\n resetValue();\n }, [resetValue]);\n\n return (\n <Input\n id={id}\n disabled={disabled}\n ref={inputRef}\n data-testid={`time-input-${name}`}\n className={cx([style.timeInput, className])}\n placeholder={placeholder}\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlurHandler}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={8}\n autoComplete='off'\n style={{\n textAlign: align,\n }}\n />\n );\n}\n","import { IoLockClosed, IoLockOpenOutline } from 'react-icons/io5';\nimport { MaybeNumber } from 'ontime-types';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport NullableTimeInput from '../../../../common/components/input/time-input/NullableTimeInput';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { cx, enDash } from '../../../../common/utils/styleUtils';\nimport TimeInputGroup from '../../time-input-flow/TimeInputGroup';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface TargetDurationInputProps {\n duration: MaybeNumber;\n targetDuration: MaybeNumber;\n submitHandler: (field: 'targetDuration', value: MaybeNumber) => void;\n}\n\nexport default function TargetDurationInput({ duration, targetDuration, submitHandler }: TargetDurationInputProps) {\n const isLocked = targetDuration !== null;\n\n return (\n <div>\n <Editor.Label htmlFor='targetDuration'>Target duration</Editor.Label>\n <TimeInputGroup hasDelay={isLocked && targetDuration !== duration}>\n <NullableTimeInput\n name='targetDuration'\n time={targetDuration}\n submitHandler={submitHandler}\n emptyDisplay={enDash}\n className={isLocked ? '' : style.inactive}\n />\n <Tooltip\n text='Lock to target duration'\n className={cx([style.timeAction, isLocked && style.active])}\n onClick={() => submitHandler('targetDuration', isLocked ? null : duration)}\n data-testid='lock__duration'\n render={<IconButton variant='subtle-white' className={isLocked ? style.active : style.inactive} />}\n >\n {isLocked ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { MaybeNumber, OntimeGroup } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActionsContext } from '../../../common/context/EntryActionsContext';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { cx, enDash, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport TextLikeInput from '../../../views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventTextArea from './composite/EventTextArea';\nimport EntryEditorTextInput from './composite/EventTextInput';\nimport TargetDurationInput from './composite/TargetDurationInput';\n\nimport style from './EntryEditor.module.scss';\n\n// title + colour + custom field labels\nexport type GroupEditorUpdateTextFields = 'title' | 'colour' | string;\nexport type GroupEditorUpdateMaybeNumberFields = 'targetDuration';\n\ninterface GroupEditorProps {\n group: OntimeGroup;\n}\n\nexport default function GroupEditor({ group }: GroupEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActionsContext();\n\n const handleSubmit = useCallback(\n (field: GroupEditorUpdateTextFields | GroupEditorUpdateMaybeNumberFields, value: string | MaybeNumber) => {\n // Handle custom fields\n if (typeof field === 'string' && field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: group.id, custom: { [fieldLabel]: value as string } });\n return;\n }\n\n if (field === 'targetDuration') {\n return updateEntry({ id: group.id, targetDuration: value as MaybeNumber });\n }\n\n // all other strings are text fields\n return updateEntry({ id: group.id, [field]: value as string });\n },\n [group.id, updateEntry],\n );\n\n const isEditor = window.location.pathname.includes('editor');\n const planOffset = group.targetDuration === null ? null : group.duration - group.targetDuration;\n const planOffsetLabel = planOffset !== null ? getOffsetState(planOffset) : null;\n\n return (\n <div className={style.content}>\n <div className={style.column}>\n <Editor.Title>Group schedule</Editor.Title>\n <div className={style.inline}>\n <div>\n <Editor.Label>First event start</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.timeStart, { fallback: timerPlaceholder })}\n </TextLikeInput>\n </div>\n <div>\n <Editor.Label>Last event end</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.timeEnd, { fallback: timerPlaceholder })}\n </TextLikeInput>\n </div>\n <div>\n <Editor.Label htmlFor='duration'>Scheduled duration</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.duration, { fallback: enDash })}\n </TextLikeInput>\n </div>\n </div>\n <div className={style.inline}>\n <div>\n <Editor.Label htmlFor='eventId'>Plan offset</Editor.Label>\n <TextLikeInput\n offset={planOffsetLabel}\n className={cx([style.textLikeInput, planOffset === null && style.inactive])}\n disabled\n >\n {planOffset !== null && planOffset > 0 ? '+' : ''}\n {millisToString(planOffset, { fallback: enDash })}\n </TextLikeInput>\n </div>\n <TargetDurationInput\n duration={group.duration}\n targetDuration={group.targetDuration}\n submitHandler={handleSubmit}\n />\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>Group data</Editor.Title>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={group.colour} handleChange={handleSubmit} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={group.title} submitHandler={handleSubmit} />\n <EventTextArea field='note' label='Note' initialValue={group.note} submitHandler={handleSubmit} />\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={group} />\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { OntimeMilestone } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect';\nimport Input from '../../../common/components/input/input/Input';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActionsContext } from '../../../common/context/EntryActionsContext';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventTextArea from './composite/EventTextArea';\nimport EntryEditorTextInput from './composite/EventTextInput';\n\nimport style from './EntryEditor.module.scss';\n\n// cue + title + colour + custom field labels\nexport type MilestoneEditorUpdateTextFields = 'cue' | 'title' | 'colour' | string;\n\ninterface MilestoneEditorProps {\n milestone: OntimeMilestone;\n}\nexport default function MilestoneEditor({ milestone }: MilestoneEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActionsContext();\n\n const handleSubmit = useCallback(\n (field: MilestoneEditorUpdateTextFields, value: string) => {\n // Handle custom fields\n if (typeof field === 'string' && field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: milestone.id, custom: { [fieldLabel]: value } });\n return;\n }\n // all other strings are text fields\n return updateEntry({ id: milestone.id, [field]: value });\n },\n [milestone.id, updateEntry],\n );\n\n const isEditor = window.location.pathname.includes('editor');\n\n return (\n <div className={style.content}>\n <div className={style.column}>\n <Editor.Title>Milestone data</Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='entryId'>Milestone ID (read only)</Editor.Label>\n <Input id='entryId' data-testid='input-textfield' value={milestone.id} readOnly fluid />\n </div>\n <EntryEditorTextInput\n field='cue'\n label='Cue'\n initialValue={milestone.cue}\n submitHandler={handleSubmit}\n maxLength={10}\n />\n </div>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={milestone.colour} handleChange={handleSubmit} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={milestone.title} submitHandler={handleSubmit} />\n <EventTextArea field='note' label='Note' initialValue={milestone.note} submitHandler={handleSubmit} />\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={milestone} />\n </div>\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { isOntimeEvent, isOntimeGroup, isOntimeMilestone, OntimeEntry } from 'ontime-types';\n\nimport useRundown from '../../../common/hooks-query/useRundown';\n\nimport EventEditor from './EventEditor';\nimport GroupEditor from './GroupEditor';\nimport MilestoneEditor from './MilestoneEditor';\n\nimport style from './EntryEditor.module.scss';\n\ninterface CuesheetEntryEditorProps {\n entryId: string;\n}\n\nexport default function CuesheetEntryEditor({ entryId }: CuesheetEntryEditorProps) {\n const { data } = useRundown();\n\n const entry = useMemo<OntimeEntry | null>(() => {\n if (data.order.length === 0) {\n return null;\n }\n\n const event = data.entries[entryId];\n return event ?? null;\n }, [entryId, data.order, data.entries]);\n\n if (isOntimeEvent(entry)) {\n return (\n <div className={style.entryEditor} data-testid='editor-container'>\n <EventEditor event={entry} />\n </div>\n );\n }\n\n if (isOntimeMilestone(entry)) {\n return (\n <div className={style.inModal} data-testid='editor-container'>\n <MilestoneEditor milestone={entry} />\n </div>\n );\n }\n\n if (isOntimeGroup(entry)) {\n return (\n <div className={style.inModal} data-testid='editor-container'>\n <GroupEditor group={entry} />\n </div>\n );\n }\n\n return null;\n}\n","import { EntryId } from 'ontime-types';\nimport { create } from 'zustand';\n\ninterface SelectedEntryState {\n selectedEntryId: EntryId | null;\n setEditableEntry: (entryId: EntryId) => void;\n clearSelection: () => void;\n}\n\nexport const useEditModal = create<SelectedEntryState>((set) => ({\n selectedEntryId: null,\n setEditableEntry: (entryId: EntryId) => set({ selectedEntryId: entryId }),\n clearSelection: () => set({ selectedEntryId: null }),\n}));\n","import { memo } from 'react';\n\nimport Modal from '../../../common/components/modal/Modal';\nimport CuesheetEntryEditor from '../../../features/rundown/entry-editor/CuesheetEventEditor';\n\nimport { useEditModal } from './useEditModal';\n\nexport default memo(EntryEditModal);\nfunction EntryEditModal() {\n const entryId = useEditModal((state) => state.selectedEntryId);\n const closeModal = useEditModal((state) => state.clearSelection);\n\n if (entryId === null) {\n return null;\n }\n\n return (\n <Modal\n isOpen\n onClose={closeModal}\n title='Edit entry'\n showCloseButton\n bodyElements={<CuesheetEntryEditor entryId={entryId} />}\n />\n );\n}\n","export function debounce<T extends any[]>(callback: (...args: T) => void, wait: number) {\n let timeout: NodeJS.Timeout | null;\n return (...args: T) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n timeout = null;\n callback(...args);\n }, wait);\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useLocalStorage } from '@mantine/hooks';\nimport { ColumnDef, ColumnSizingState, Updater } from '@tanstack/react-table';\n\nimport { debounce } from '../../../common/utils/debounce';\nimport { makeStageKey } from '../../../common/utils/localStorage';\nimport type { ExtendedEntry } from '../../../common/utils/rundownMetadata';\n\ntype TableRoot = 'editor' | 'cuesheet';\n\nexport function useColumnSizes(tableRoot: TableRoot = 'cuesheet') {\n const tableSizesKey = useMemo(() => makeStageKey(`${tableRoot}-table-sizes`), [tableRoot]);\n\n const [columnSizing, setColumnSizingState] = useState<Record<string, number>>(() => {\n try {\n const stored = localStorage.getItem(tableSizesKey);\n return stored ? JSON.parse(stored) : {};\n } catch {\n return {};\n }\n });\n\n // save sizes to localStorage whenever they change (debounced)\n useEffect(() => {\n const saveSizesToStorage = debounce((sizes: Record<string, number>) => {\n localStorage.setItem(tableSizesKey, JSON.stringify(sizes));\n }, 500);\n saveSizesToStorage(columnSizing);\n }, [columnSizing, tableSizesKey]);\n\n const setColumnSizing = useCallback((sizesOrUpdater: Updater<ColumnSizingState>) => {\n setColumnSizingState(sizesOrUpdater);\n }, []);\n\n return {\n columnSizing,\n setColumnSizing,\n };\n}\n\nexport function useColumnOrder(columns: ColumnDef<ExtendedEntry>[], tableRoot: TableRoot = 'cuesheet') {\n const tableOrderKey = useMemo(() => makeStageKey(`${tableRoot}-table-order`), [tableRoot]);\n\n const [columnOrder, saveColumnOrder] = useLocalStorage<string[]>({\n key: tableOrderKey,\n defaultValue: columns.map((col) => col.id as string),\n });\n\n // update column order if columns change\n useEffect(() => {\n const newColumns = columns.map((col) => col.id as string);\n if (newColumns.some((id) => !columnOrder.includes(id))) {\n saveColumnOrder(newColumns);\n }\n }, [columnOrder, columns, saveColumnOrder]);\n\n const resetColumnOrder = useCallback(() => {\n saveColumnOrder(columns.map((col) => col.id as string));\n }, [columns, saveColumnOrder]);\n\n return {\n columnOrder,\n saveColumnOrder,\n resetColumnOrder,\n };\n}\n\nexport function useColumnVisibility(tableRoot: TableRoot = 'cuesheet') {\n const tableHiddenKey = useMemo(() => makeStageKey(`${tableRoot}-table-hidden`), [tableRoot]);\n\n const [columnVisibility, setColumnVisibility] = useLocalStorage({\n key: tableHiddenKey,\n defaultValue: {},\n });\n\n return {\n columnVisibility,\n setColumnVisibility,\n };\n}\n","import { PropsWithChildren } from 'react';\nimport {\n closestCorners,\n DndContext,\n DragEndEvent,\n PointerSensor,\n TouchSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { ColumnDef } from '@tanstack/react-table';\n\nimport type { ExtendedEntry } from '../../../common/utils/rundownMetadata';\nimport { useColumnOrder } from '../cuesheet-table/useColumnManager';\n\ninterface CuesheetDndProps {\n columns: ColumnDef<ExtendedEntry>[];\n tableRoot?: 'editor' | 'cuesheet';\n}\n\nexport default function CuesheetDnd({\n columns,\n tableRoot = 'cuesheet',\n children,\n}: PropsWithChildren<CuesheetDndProps>) {\n const { columnOrder, saveColumnOrder } = useColumnOrder(columns, tableRoot);\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n delay: 100,\n tolerance: 50,\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 100,\n tolerance: 50,\n },\n }),\n );\n\n const handleOnDragEnd = (event: DragEndEvent) => {\n const { delta, active, over } = event;\n\n // cancel if delta y is greater than 200\n if (delta.y > 200) return;\n // cancel if we do not have an over id\n if (over?.id == null) return;\n\n // get index of from\n const fromIndex = columnOrder.indexOf(active.id as string);\n\n // get index of to\n const toIndex = columnOrder.indexOf(over.id as string);\n\n if (toIndex === -1) {\n return;\n }\n\n const reorderedCols = [...columnOrder];\n const reorderedItem = reorderedCols.splice(fromIndex, 1);\n reorderedCols.splice(toIndex, 0, reorderedItem[0]);\n saveColumnOrder(reorderedCols);\n };\n\n return (\n <DndContext sensors={sensors} collisionDetection={closestCorners} onDragEnd={handleOnDragEnd}>\n {children}\n </DndContext>\n );\n}\n","import { forwardRef, memo, useCallback, useImperativeHandle, useRef } from 'react';\n\nimport Input from '../../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\n\ninterface SingleLineCellProps {\n initialValue: string;\n fieldId?: string;\n fieldLabel?: string;\n allowSubmitSameValue?: boolean;\n handleUpdate: (newValue: string) => void;\n handleCancelUpdate?: () => void;\n}\n\nconst SingleLineCell = forwardRef(\n (\n { initialValue, fieldId, fieldLabel, allowSubmitSameValue, handleUpdate, handleCancelUpdate }: SingleLineCellProps,\n inputRef,\n ) => {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => handleUpdate(newValue), [handleUpdate]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n allowSubmitSameValue,\n allowKeyboardNavigation: true,\n submitOnEnter: true, // single line should submit on enter\n submitOnCtrlEnter: true,\n onCancelUpdate: handleCancelUpdate,\n });\n\n // expose a subset of the methods to the parent\n useImperativeHandle(inputRef, () => {\n return {\n focus() {\n ref.current?.focus();\n },\n select() {\n ref.current?.select();\n },\n focusParentElement() {\n ref.current?.parentElement?.focus();\n },\n };\n }, [ref]);\n\n return (\n <Input\n ref={ref}\n variant='ghosted'\n fluid\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n data-testid={fieldId ? `cuesheet-editor-${fieldId}` : undefined}\n aria-label={fieldLabel ? `${fieldLabel} editor` : undefined}\n />\n );\n },\n);\n\nSingleLineCell.displayName = 'SingleLineCell';\n\nexport default memo(SingleLineCell);\n","import { memo, PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport SingleLineCell from './SingleLineCell';\nimport TextLikeInput from './TextLikeInput';\n\ninterface DurationInputProps {\n initialValue: number;\n lockedValue: boolean;\n delayed?: boolean;\n onSubmit: (value: string) => void;\n}\n\ninterface ParentFocusableInput extends HTMLInputElement {\n focusParentElement: () => void;\n}\n\nexport default memo(DurationInput);\n\nfunction DurationInput({\n initialValue,\n lockedValue,\n delayed,\n onSubmit,\n children,\n}: PropsWithChildren<DurationInputProps>) {\n const [isEditing, setIsEditing] = useState(false);\n const [value, setValue] = useState(initialValue);\n const inputRef = useRef<ParentFocusableInput>(null);\n const textRef = useRef<ParentFocusableInput>(null);\n\n // when we go into edit mode, set focus to the input\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n // reset value when initialValue changes, avoiding interrupting the user if we are in edit mode\n useEffect(() => {\n if (!isEditing) {\n setValue(initialValue);\n }\n }, [initialValue, isEditing]);\n\n const handleFakeFocus = () => setIsEditing(true);\n const handleFakeBlur = () => {\n setIsEditing(false);\n setTimeout(() => textRef.current?.focusParentElement()); // Immediate timeout to ensure state change takes place first\n };\n\n const handleUpdate = useCallback(\n (newValue: string) => {\n setIsEditing(false);\n\n // if the user sends an empty string, we want to clear the value\n if (newValue === '') {\n onSubmit(newValue);\n inputRef.current?.focusParentElement();\n return;\n }\n\n // we dont know the values in the rundown, escalate to handler\n if (newValue.startsWith('p') || newValue.startsWith('+')) {\n onSubmit(newValue);\n inputRef.current?.focusParentElement();\n return;\n }\n\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis < 0 || isNaN(valueInMillis)) {\n setValue(initialValue);\n setTimeout(() => textRef.current?.focusParentElement()); // Immediate timeout to ensure state change takes place first\n return;\n }\n\n // if the value is the same, we may still want to push the lock change\n if (valueInMillis === initialValue && lockedValue) {\n inputRef.current?.focusParentElement();\n return;\n }\n\n onSubmit(newValue);\n setValue(Number(newValue));\n setTimeout(() => textRef.current?.focusParentElement()); // Immediate timeout to ensure state change takes place first\n },\n [initialValue, lockedValue, onSubmit],\n );\n\n const timeString = millisToString(value);\n\n return isEditing ? (\n <SingleLineCell\n ref={inputRef}\n initialValue={timeString}\n allowSubmitSameValue={!lockedValue} // if the value is not locked, submitting will lock the value\n handleUpdate={handleUpdate}\n handleCancelUpdate={handleFakeBlur}\n />\n ) : (\n <TextLikeInput\n onClick={handleFakeFocus}\n onFocus={handleFakeFocus}\n muted={!lockedValue}\n offset={delayed ? 'over' : undefined}\n ref={textRef}\n >\n {children}\n </TextLikeInput>\n );\n}\n","import { memo } from 'react';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport Input from '../../../../common/components/input/input/Input';\n\nimport style from './EditableImage.module.scss';\n\ninterface EditableImageProps {\n initialValue: string;\n readOnly?: boolean;\n updateValue: (newValue: string) => void;\n}\n\nexport default memo(EditableImage);\n\nfunction EditableImage({ initialValue, readOnly, updateValue }: EditableImageProps) {\n const handleUpdate = (newValue: string) => {\n if (newValue === initialValue) {\n return;\n }\n if (newValue !== '' && !newValue.startsWith('http')) {\n return;\n }\n updateValue(newValue);\n };\n\n const openInNewTab = () => {\n if (initialValue) {\n window.open(initialValue, '_blank', 'noopener,noreferrer');\n }\n };\n\n if (!initialValue) {\n return (\n <Input\n variant='ghosted'\n className={style.imageInput}\n fluid\n readOnly={readOnly}\n // we disable the field to prevent receiving focus\n disabled={readOnly}\n placeholder='Paste image URL'\n onBlur={(event) => handleUpdate(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n handleUpdate(event.currentTarget.value);\n }\n }}\n defaultValue={initialValue}\n />\n );\n }\n\n return (\n <div className={style.imageCell}>\n {!readOnly && (\n <div className={style.overlay}>\n <Button onClick={openInNewTab}>Preview</Button>\n <Button variant='subtle-destructive' onClick={() => handleUpdate('')}>\n Delete\n </Button>\n </div>\n )}\n {Boolean(initialValue) && <img loading='lazy' src={initialValue} className={style.image} />}\n </div>\n );\n}\n","import { TbFlagFilled } from 'react-icons/tb';\n\nimport style from './FlagCell.module.scss';\n\nexport default function FlagCell() {\n return (\n <div className={style.flag}>\n <TbFlagFilled />\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\n\nimport style from './GhostedText.module.scss';\n\ninterface GhostedTextProps {\n multiline?: boolean;\n}\n\nexport default function GhostedText({ children, multiline }: PropsWithChildren<GhostedTextProps>) {\n return <div className={`${style.ghostedText} ${multiline ? style.multiline : ''}`}>{children}</div>;\n}\n","import { memo, useCallback, useRef } from 'react';\n\nimport { AutoTextarea } from '../../../../common/components/input/auto-textarea/AutoTextarea';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\n\ninterface MultiLineCellProps {\n initialValue: string;\n fieldId?: string;\n fieldLabel?: string;\n handleUpdate: (newValue: string) => void;\n}\n\nexport default memo(MultiLineCell);\n\nfunction MultiLineCell({ initialValue, fieldId, fieldLabel, handleUpdate }: MultiLineCellProps) {\n const ref = useRef<HTMLTextAreaElement | null>(null);\n const submitCallback = useCallback((newValue: string) => handleUpdate(newValue), [handleUpdate]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnCtrlEnter: true,\n allowKeyboardNavigation: true,\n });\n\n return (\n <AutoTextarea\n inputref={ref}\n variant='ghosted'\n fluid\n rows={1}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n spellCheck={false}\n data-testid={fieldId ? `cuesheet-editor-${fieldId}` : undefined}\n aria-label={fieldLabel ? `${fieldLabel} editor` : undefined}\n />\n );\n}\n","import { PropsWithChildren } from 'react';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './MutedText.module.scss';\n\ninterface MutedTextProps {\n numeric?: boolean;\n}\n\nexport default function MutedText({ numeric, children }: PropsWithChildren<MutedTextProps>) {\n return <span className={cx([style.muted, numeric && style.numeric])}>{children}</span>;\n}\n","import { memo, PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';\nimport { parseUserTime } from 'ontime-utils';\n\nimport { formatTime } from '../../../../common/utils/time';\n\nimport SingleLineCell from './SingleLineCell';\nimport TextLikeInput from './TextLikeInput';\n\ninterface TimeInputDurationProps {\n initialValue: number;\n lockedValue: boolean;\n delayed?: boolean;\n onSubmit: (value: string) => void;\n}\n\ninterface ParentFocusableInput extends HTMLInputElement {\n focusParentElement: () => void;\n}\n\nexport default memo(TimeInputDuration);\n\nfunction TimeInputDuration({\n initialValue,\n lockedValue,\n delayed,\n onSubmit,\n children,\n}: PropsWithChildren<TimeInputDurationProps>) {\n const [isEditing, setIsEditing] = useState(false);\n const [value, setValue] = useState(initialValue);\n const inputRef = useRef<ParentFocusableInput>(null);\n const textRef = useRef<ParentFocusableInput>(null);\n\n // when we go into edit mode, set focus to the input\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n // reset value when initialValue changes, avoiding interrupting the user if we are in edit mode\n useEffect(() => {\n if (!isEditing) {\n setValue(initialValue);\n }\n }, [initialValue, isEditing]);\n\n const handleFakeFocus = () => setIsEditing(true);\n const handleFakeBlur = () => {\n setIsEditing(false);\n setTimeout(() => textRef.current?.focusParentElement()); // Immediate timeout to ensure state change takes place first\n };\n\n const handleUpdate = useCallback(\n (newValue: string) => {\n setIsEditing(false);\n\n // if the user sends an empty string, we want to clear the value\n if (newValue === '') {\n onSubmit(newValue);\n inputRef.current?.focusParentElement();\n return;\n }\n\n // we dont know the values in the rundown, escalate to handler\n if (newValue.startsWith('p') || newValue.startsWith('+')) {\n onSubmit(newValue);\n inputRef.current?.focusParentElement();\n return;\n }\n\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis < 0 || isNaN(valueInMillis)) {\n setValue(initialValue);\n setTimeout(() => textRef.current?.focusParentElement()); // Immediate timeout to ensure state change takes place first\n return;\n }\n\n // if the value is the same, we may still want to push the lock change\n if (valueInMillis === initialValue && lockedValue) {\n inputRef.current?.focusParentElement();\n return;\n }\n\n onSubmit(newValue);\n setValue(Number(newValue));\n setTimeout(() => textRef.current?.focusParentElement()); // Immediate timeout to ensure state change takes place first\n },\n [initialValue, lockedValue, onSubmit],\n );\n\n const timeString = formatTime(value);\n\n return isEditing ? (\n <SingleLineCell\n ref={inputRef}\n initialValue={timeString}\n allowSubmitSameValue={!lockedValue} // if the value is not locked, submitting will lock the value\n handleUpdate={handleUpdate}\n handleCancelUpdate={handleFakeBlur}\n />\n ) : (\n <TextLikeInput\n onClick={handleFakeFocus}\n onFocus={handleFakeFocus}\n muted={!lockedValue}\n offset={delayed ? 'over' : undefined}\n ref={textRef}\n >\n {children}\n </TextLikeInput>\n );\n}\n","import { useCallback } from 'react';\nimport { CellContext, ColumnDef } from '@tanstack/react-table';\nimport { CustomFields, isOntimeDelay, isOntimeEvent, TimeStrategy, URLPreset } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport DelayIndicator from '../../../../common/components/delay-indicator/DelayIndicator';\nimport type { ExtendedEntry } from '../../../../common/utils/rundownMetadata';\nimport { formatDuration, formatTime } from '../../../../common/utils/time';\nimport { AppMode } from '../../../../ontimeConfig';\n\nimport DurationInput from './DurationInput';\nimport EditableImage from './EditableImage';\nimport FlagCell from './FlagCell';\nimport GhostedText from './GhostedText';\nimport MultiLineCell from './MultiLineCell';\nimport MutedText from './MutedText';\nimport SingleLineCell from './SingleLineCell';\nimport TimeInput from './TimeInput';\n\nfunction getColumnLabel(column: CellContext<ExtendedEntry, unknown>['column']): string {\n return typeof column.columnDef.header === 'string' ? column.columnDef.header : column.id;\n}\n\nfunction MakeStart({ getValue, row, table, column }: CellContext<ExtendedEntry, unknown>) {\n if (!table.options.meta) {\n return null;\n }\n\n const { showDelayedTimes, hideTableSeconds } = table.options.meta.options;\n const formatOpts = hideTableSeconds ? { format12: 'h:mm a', format24: 'HH:mm' } : undefined;\n\n const event = row.original;\n if (!isOntimeEvent(event)) {\n return <MutedText numeric>{formatTime(getValue() as number, formatOpts)}</MutedText>;\n }\n\n const { handleUpdateTimer } = table.options.meta;\n\n const update = (newValue: string) => handleUpdateTimer(row.original.id, 'timeStart', newValue);\n\n const startTime = getValue() as number;\n const isStartLocked = !event.linkStart;\n const displayTime = showDelayedTimes ? startTime + event.delay : startTime;\n const formattedTime = formatTime(displayTime, formatOpts);\n\n const canWrite = column.columnDef.meta?.canWrite;\n if (!canWrite) {\n return (\n <MutedText numeric>\n {formattedTime}\n <DelayIndicator delayValue={event.delay} tooltipPrefix={millisToString(startTime)} />\n </MutedText>\n );\n }\n return (\n <TimeInput initialValue={startTime} onSubmit={update} lockedValue={isStartLocked} delayed={event.delay !== 0}>\n {formattedTime}\n <DelayIndicator delayValue={event.delay} tooltipPrefix={millisToString(startTime)} />\n </TimeInput>\n );\n}\n\nfunction MakeEnd({ getValue, row, table, column }: CellContext<ExtendedEntry, unknown>) {\n if (!table.options.meta) {\n return null;\n }\n\n const { showDelayedTimes, hideTableSeconds } = table.options.meta.options;\n const formatOpts = hideTableSeconds ? { format12: 'h:mm a', format24: 'HH:mm' } : undefined;\n\n const event = row.original;\n if (!isOntimeEvent(event)) {\n return <MutedText numeric>{formatTime(getValue() as number, formatOpts)}</MutedText>;\n }\n\n const { handleUpdateTimer } = table.options.meta;\n\n const update = (newValue: string) => handleUpdateTimer(row.original.id, 'timeEnd', newValue);\n\n const endTime = getValue() as number;\n const isEndLocked = event.timeStrategy === TimeStrategy.LockEnd;\n const displayTime = showDelayedTimes ? endTime + event.delay : endTime;\n const formattedTime = formatTime(displayTime, formatOpts);\n\n const canWrite = column.columnDef.meta?.canWrite;\n if (!canWrite) {\n return (\n <MutedText numeric>\n {formattedTime}\n <DelayIndicator delayValue={event.delay} tooltipPrefix={millisToString(endTime)} />\n </MutedText>\n );\n }\n\n return (\n <TimeInput initialValue={endTime} onSubmit={update} lockedValue={isEndLocked} delayed={event.delay !== 0}>\n {formattedTime}\n <DelayIndicator delayValue={event.delay} tooltipPrefix={millisToString(endTime)} />\n </TimeInput>\n );\n}\n\nfunction MakeDuration({ getValue, row, table, column }: CellContext<ExtendedEntry, unknown>) {\n if (!table.options.meta) {\n return null;\n }\n\n const { hideTableSeconds } = table.options.meta.options;\n const event = row.original;\n if (!isOntimeEvent(event)) {\n return <MutedText numeric>{formatDuration(getValue() as number, hideTableSeconds)}</MutedText>;\n }\n\n const { handleUpdateTimer } = table.options.meta;\n\n const update = (newValue: string) => handleUpdateTimer(row.original.id, 'duration', newValue);\n\n const duration = getValue() as number;\n const isDurationLocked = event.timeStrategy === TimeStrategy.LockDuration;\n const formattedDuration = formatDuration(duration, hideTableSeconds);\n\n const canWrite = column.columnDef.meta?.canWrite;\n if (!canWrite) {\n return <MutedText numeric>{formattedDuration}</MutedText>;\n }\n\n return (\n <DurationInput initialValue={duration} onSubmit={update} lockedValue={isDurationLocked}>\n {formattedDuration}\n </DurationInput>\n );\n}\n\nfunction MakeMultiLineField({ row, column, table }: CellContext<ExtendedEntry, unknown>) {\n const update = useCallback(\n (newValue: string) => {\n table.options.meta?.handleUpdate(row.index, column.id, newValue, false);\n },\n [column.id, row.index, table.options.meta],\n );\n\n // not all entries have all properties (eg groups)\n const initialValue = row.original[column.id as keyof ExtendedEntry];\n if (typeof initialValue !== 'string') {\n return null;\n }\n\n const canWrite = column.columnDef.meta?.canWrite;\n if (!canWrite) {\n return <GhostedText multiline>{initialValue}</GhostedText>;\n }\n\n return (\n <MultiLineCell\n initialValue={initialValue as string}\n fieldId={column.id}\n fieldLabel={getColumnLabel(column)}\n handleUpdate={update}\n />\n );\n}\n\nfunction LazyImage({ row, column, table }: CellContext<ExtendedEntry, unknown>) {\n const update = useCallback(\n (newValue: string) => {\n table.options.meta?.handleUpdate(row.index, column.id, newValue, true);\n },\n [column.id, row.index, table.options.meta],\n );\n\n const event = row.original;\n if (isOntimeDelay(event)) {\n return null;\n }\n\n const canWrite = column.columnDef.meta?.canWrite;\n const initialValue = event.custom[column.id];\n return <EditableImage initialValue={initialValue} updateValue={update} readOnly={!canWrite} />;\n}\n\nfunction MakeSingleLineField({ row, column, table }: CellContext<ExtendedEntry, unknown>) {\n const update = useCallback(\n (newValue: string) => {\n table.options.meta?.handleUpdate(row.index, column.id, newValue, false);\n },\n [column.id, row.index, table.options.meta],\n );\n\n // not all entries have all properties (eg groups)\n const initialValue = row.original[column.id as keyof ExtendedEntry];\n if (typeof initialValue !== 'string') {\n return null;\n }\n\n const canWrite = column.columnDef.meta?.canWrite;\n if (!canWrite) {\n return <GhostedText>{initialValue}</GhostedText>;\n }\n\n return (\n <SingleLineCell\n initialValue={initialValue as string}\n fieldId={column.id}\n fieldLabel={getColumnLabel(column)}\n handleUpdate={update}\n />\n );\n}\n\nfunction MakeFlagField({ row }: CellContext<ExtendedEntry, unknown>) {\n const event = row.original;\n if (!isOntimeEvent(event) || !event.flag) {\n return null;\n }\n return <FlagCell />;\n}\n\nfunction MakeCustomField({ row, column, table }: CellContext<ExtendedEntry, unknown>) {\n const update = useCallback(\n (newValue: string) => {\n table.options.meta?.handleUpdate(row.index, column.id, newValue, true);\n },\n [column.id, row.index, table.options.meta],\n );\n\n const event = row.original;\n if (isOntimeDelay(event)) {\n return null;\n }\n\n // entries will not contain the field if there is no value set by the user\n // event if there is no initial value, we still render the cell\n const initialValue = event.custom[column.id] ?? '';\n\n const canWrite = column.columnDef.meta?.canWrite;\n if (!canWrite) {\n return <GhostedText multiline>{initialValue}</GhostedText>;\n }\n\n return (\n <MultiLineCell\n initialValue={initialValue}\n fieldId={column.id}\n fieldLabel={getColumnLabel(column)}\n handleUpdate={update}\n />\n );\n}\n\n/**\n * we cant use the createColumnHelper() because we have custom logic for rendering the cells\n * This means that the display columns: index and action are added inline by the row components\n */\nexport function makeCuesheetColumns(\n customFields: CustomFields,\n cuesheetMode: AppMode,\n preset: URLPreset | undefined,\n): ColumnDef<ExtendedEntry>[] {\n const columnsDef: ColumnDef<ExtendedEntry>[] = [];\n const modeAllowsWrite = cuesheetMode === AppMode.Edit;\n const fullRead = preset ? preset.options?.read === 'full' : true;\n const fullWrite = preset ? preset.options?.write === 'full' : true;\n const canWriteKeys = preset?.options?.write ? new Set(preset.options.write.split(',')) : new Set<string>();\n const canReadKeys = preset?.options?.read ? new Set(preset.options.read.split(',')) : new Set<string>();\n\n // helpers to check read/write for a given key\n const canRead = (key: string) => fullRead || canReadKeys.has(key);\n const canWrite = (key: string) => modeAllowsWrite && (fullWrite || canWriteKeys.has(key));\n\n if (canRead('flag')) {\n columnsDef.push({\n accessorKey: 'flag',\n id: 'flag',\n header: 'Flag',\n cell: MakeFlagField,\n size: 45,\n minSize: 45,\n meta: { canWrite: canWrite('flag') },\n });\n }\n\n if (canRead('cue')) {\n columnsDef.push({\n accessorKey: 'cue',\n id: 'cue',\n header: 'Cue',\n cell: MakeSingleLineField,\n size: 75,\n minSize: 40,\n meta: { canWrite: canWrite('cue') },\n });\n }\n\n if (canRead('timeStart')) {\n columnsDef.push({\n accessorKey: 'timeStart',\n id: 'timeStart',\n header: 'Start',\n cell: MakeStart,\n size: 75,\n minSize: 75,\n meta: { canWrite: canWrite('timeStart') },\n });\n }\n\n if (canRead('timeEnd')) {\n columnsDef.push({\n accessorKey: 'timeEnd',\n id: 'timeEnd',\n header: 'End',\n cell: MakeEnd,\n size: 75,\n minSize: 75,\n meta: { canWrite: canWrite('timeEnd') },\n });\n }\n\n if (canRead('duration')) {\n columnsDef.push({\n accessorKey: 'duration',\n id: 'duration',\n header: 'Duration',\n cell: MakeDuration,\n size: 75,\n minSize: 75,\n meta: { canWrite: canWrite('duration') },\n });\n }\n\n if (canRead('title')) {\n columnsDef.push({\n accessorKey: 'title',\n id: 'title',\n header: 'Title',\n cell: MakeSingleLineField,\n size: 250,\n minSize: 75,\n meta: { canWrite: canWrite('title') },\n });\n }\n\n if (canRead('note')) {\n columnsDef.push({\n accessorKey: 'note',\n id: 'note',\n header: 'Note',\n cell: MakeMultiLineField,\n size: 250,\n minSize: 75,\n meta: { canWrite: canWrite('note') },\n });\n }\n\n // custom fields at the end\n const customFieldKeys = Object.keys(customFields);\n\n for (let i = 0; i < customFieldKeys.length; i++) {\n const key = customFieldKeys[i];\n const permissionKey = `custom-${key}`;\n if (!canRead(permissionKey)) continue;\n columnsDef.push({\n accessorKey: key,\n id: key,\n header: customFields[key].label,\n cell: customFields[key].type === 'text' ? MakeCustomField : LazyImage,\n size: 250,\n minSize: 75,\n meta: {\n colour: customFields[key].colour,\n canWrite: canWrite(permissionKey),\n },\n });\n }\n\n return columnsDef;\n}\n","import EmptyImage from '../../../assets/images/empty.svg?react';\n\nimport style from './EmptyTableBody.module.scss';\n\ninterface EmptyTableBodyProps {\n text: string;\n}\n\nexport default function EmptyTableBody({ text }: EmptyTableBodyProps) {\n return (\n <tbody className={style.emptyContainer}>\n <tr>\n <td colSpan={99} className={style.emptyCell}>\n <EmptyImage className={style.empty} />\n {text && <span className={style.text}>{text}</span>}\n </td>\n </tr>\n </tbody>\n );\n}\n","import { CustomFields } from 'ontime-types';\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\ntype OptionValues = {\n hideTableSeconds: boolean;\n hideIndexColumn: boolean;\n showDelayedTimes: boolean;\n hideDelays: boolean;\n};\n\nconst defaultOptions: OptionValues = {\n hideTableSeconds: false,\n hideIndexColumn: false,\n showDelayedTimes: false,\n hideDelays: false,\n};\n\nexport type RundownOptionKeys = keyof OptionValues;\n\nexport interface RundownOptions extends OptionValues {\n setOption: <K extends RundownOptionKeys>(key: K, value: OptionValues[K]) => void;\n toggleOption: (key: RundownOptionKeys) => void;\n resetOptions: () => void;\n}\n\nexport const usePersistedRundownOptions = create<RundownOptions>()(\n persist(\n (set) => {\n return {\n ...defaultOptions,\n setOption: (key, value) => set((state) => ({ ...state, [key]: value })),\n toggleOption: (key) => set((state) => ({ ...state, [key]: !state[key] })),\n resetOptions: () => set(defaultOptions),\n };\n },\n {\n name: 'editor-options',\n },\n ),\n);\n\nexport const rundownDefaultColumns = [\n { value: 'flag', label: 'Flag' },\n { value: 'cue', label: 'Cue' },\n { value: 'title', label: 'Title' },\n { value: 'timeStart', label: 'Time start' },\n { value: 'timeEnd', label: 'Time end' },\n { value: 'duration', label: 'Duration' },\n { value: 'note', label: 'Note' },\n];\n\nexport function makeRundownCustomColumns(customFields: CustomFields) {\n return Object.entries(customFields).map(([key, field]) => {\n return {\n value: `custom-${key}`,\n label: field.label,\n };\n });\n}\n\nexport enum RundownViewMode {\n List = 'list',\n Table = 'table',\n}\n","import { create } from 'zustand';\n\ninterface CuesheetPermissionsStore {\n canChangeMode: boolean;\n canCreateEntries: boolean;\n canEditEntries: boolean;\n canFlag: boolean;\n canShare: boolean;\n setPermissions: (permissions: Omit<CuesheetPermissionsStore, 'setPermissions'>) => void;\n}\n\nexport const useCuesheetPermissions = create<CuesheetPermissionsStore>((set) => ({\n canChangeMode: false,\n canCreateEntries: false,\n canEditEntries: false,\n canFlag: false,\n canShare: false,\n setPermissions(permissions) {\n set({\n canChangeMode: permissions.canChangeMode,\n canFlag: permissions.canFlag,\n canCreateEntries: permissions.canCreateEntries,\n canEditEntries: permissions.canEditEntries,\n canShare: permissions.canShare,\n });\n },\n}));\n","import { IconBaseProps } from 'react-icons';\nimport { IoLink } from 'react-icons/io5';\n\nexport default function RotatedLink(linkProps: IconBaseProps) {\n return <IoLink style={{ transform: 'rotate(-45deg)' }} {...linkProps} />;\n}\n","import { Toolbar } from '@base-ui/react/toolbar';\nimport { useDisclosure } from '@mantine/hooks';\nimport { OntimeView } from 'ontime-types';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport RotatedLink from '../../../../common/components/icons/RotatedLink';\nimport Modal from '../../../../common/components/modal/Modal';\nimport useInfo from '../../../../common/hooks-query/useInfo';\nimport useUrlPresets from '../../../../common/hooks-query/useUrlPresets';\nimport GenerateLinkFormExport from '../../../../features/sharing/GenerateLinkFormExport';\n\nfunction CuesheetShareModal() {\n const { data: infoData } = useInfo();\n const { data: urlPresetData } = useUrlPresets();\n const [isOpen, handler] = useDisclosure();\n\n // Don't render the modal content until it's open and data is loaded\n const showModalContent = isOpen && infoData && urlPresetData;\n\n return (\n <>\n <Toolbar.Button onClick={handler.open} render={<Button />}>\n <RotatedLink />\n Share...\n </Toolbar.Button>\n <Modal\n isOpen={isOpen}\n onClose={handler.close}\n title='Share cuesheet view'\n showBackdrop\n showCloseButton\n bodyElements={\n showModalContent ? (\n <GenerateLinkFormExport lockedPath={{ value: OntimeView.Cuesheet, label: 'Cuesheet' }} />\n ) : null\n }\n />\n </>\n );\n}\n\nexport default CuesheetShareModal;\n","import { ReactNode, use } from 'react';\nimport { IoBookOutline, IoChevronDown, IoOptions } from 'react-icons/io5';\nimport { Popover } from '@base-ui/react/popover';\nimport { Toggle } from '@base-ui/react/toggle';\nimport { ToggleGroup } from '@base-ui/react/toggle-group';\nimport { Toolbar } from '@base-ui/react/toolbar';\nimport { useSessionStorage } from '@mantine/hooks';\nimport type { Column } from '@tanstack/react-table';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport Checkbox from '../../../../common/components/checkbox/Checkbox';\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport PopoverContents from '../../../../common/components/popover/Popover';\nimport { PresetContext } from '../../../../common/context/PresetContext';\nimport type { ExtendedEntry } from '../../../../common/utils/rundownMetadata';\nimport { cx } from '../../../../common/utils/styleUtils';\nimport { AppMode, sessionKeys } from '../../../../ontimeConfig';\nimport { CuesheetOptions, usePersistedCuesheetOptions } from '../../cuesheet.options';\nimport { useCuesheetPermissions } from '../../useTablePermissions';\n\nimport CuesheetShareModal from './CuesheetShareModal';\n\nimport style from './CuesheetTableSettings.module.scss';\n\ninterface CuesheetTableSettingsProps {\n columns: Column<ExtendedEntry, unknown>[];\n handleResetResizing: () => void;\n handleResetReordering: () => void;\n handleClearToggles: () => void;\n}\n\nexport interface ViewSettingsProps {\n optionsStore: CuesheetOptions;\n}\n\nexport interface ColumnSettingsProps {\n columns: Column<ExtendedEntry, unknown>[];\n handleResetResizing: () => void;\n handleResetReordering: () => void;\n handleClearToggles: () => void;\n}\n\nexport default function CuesheetTableSettings({\n columns,\n handleResetResizing,\n handleResetReordering,\n handleClearToggles,\n}: CuesheetTableSettingsProps) {\n const canShare = useCuesheetPermissions((state) => state.canShare);\n const preset = use(PresetContext);\n const options = usePersistedCuesheetOptions();\n\n const [cuesheetMode, setCuesheetMode] = useSessionStorage({\n key: preset ? `${preset.alias}${sessionKeys.cuesheetMode}` : sessionKeys.cuesheetMode,\n defaultValue: preset ? AppMode.Run : AppMode.Edit,\n });\n\n const toggleCuesheetMode = (mode: AppMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setCuesheetMode(newValue);\n };\n\n return (\n <Toolbar.Root className={style.tableSettings}>\n <ViewSettings optionsStore={options} />\n <ColumnSettings\n columns={columns}\n handleResetResizing={handleResetResizing}\n handleResetReordering={handleResetReordering}\n handleClearToggles={handleClearToggles}\n />\n <ToggleGroup value={[cuesheetMode]} onValueChange={toggleCuesheetMode} className={cx([style.group, style.apart])}>\n <Toolbar.Button render={<Toggle />} value={AppMode.Run} className={style.radioButton}>\n Run\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={AppMode.Edit} className={style.radioButton}>\n Edit\n </Toolbar.Button>\n </ToggleGroup>\n\n {canShare && (\n <>\n <Editor.Separator orientation='vertical' />\n <CuesheetShareModal />\n </>\n )}\n </Toolbar.Root>\n );\n}\n\nexport function ViewSettings({ optionsStore }: ViewSettingsProps) {\n const options = optionsStore;\n\n return (\n <Popover.Root>\n <Popover.Trigger\n render={\n <Toolbar.Button\n render={\n <Button variant='ghosted-white'>\n <IoOptions /> Settings\n <IoChevronDown />\n </Button>\n }\n />\n }\n />\n\n <PopoverContents align='start' className={style.inline}>\n <div className={style.column}>\n <Editor.Label className={style.sectionTitle}>Element visibility</Editor.Label>\n <Editor.Label className={style.option}>\n <Checkbox\n defaultChecked={options.hideTableSeconds}\n onCheckedChange={(checked) => options.setOption('hideTableSeconds', checked)}\n />\n Hide seconds in table\n </Editor.Label>\n <Editor.Label className={style.option}>\n <Checkbox\n defaultChecked={options.hideIndexColumn}\n onCheckedChange={(checked) => options.setOption('hideIndexColumn', checked)}\n />\n Hide index column\n </Editor.Label>\n </div>\n\n <div className={style.column}>\n <Editor.Label className={style.sectionTitle}>Table Behaviour</Editor.Label>\n <Editor.Label className={style.option}>\n <Checkbox\n defaultChecked={options.showDelayedTimes}\n onCheckedChange={(checked) => options.setOption('showDelayedTimes', checked)}\n />\n Show delayed times\n </Editor.Label>\n <Editor.Label className={style.option}>\n <Checkbox\n defaultChecked={options.hideDelays}\n onCheckedChange={(checked) => options.setOption('hideDelays', checked)}\n />\n Hide delay entries\n </Editor.Label>\n </div>\n </PopoverContents>\n </Popover.Root>\n );\n}\n\nexport function ColumnSettings({\n columns,\n handleResetResizing,\n handleResetReordering,\n handleClearToggles,\n}: ColumnSettingsProps) {\n return (\n <Popover.Root>\n <Popover.Trigger\n render={\n <Toolbar.Button\n render={\n <Button variant='ghosted-white'>\n <IoBookOutline /> Columns\n <IoChevronDown />\n </Button>\n }\n />\n }\n />\n <PopoverContents align='start' className={style.inline}>\n <div className={style.column}>\n <Editor.Label className={style.sectionTitle}>Column visibility</Editor.Label>\n {columns.map((column) => {\n const columnHeader = column.columnDef.header;\n const visible = column.getIsVisible();\n return (\n <Editor.Label key={`${column.id}-${visible}`} className={style.option}>\n <Checkbox defaultChecked={visible} onCheckedChange={column.toggleVisibility} />\n {columnHeader as ReactNode}\n </Editor.Label>\n );\n })}\n </div>\n <div className={style.column}>\n <Editor.Label className={style.sectionTitle}>Reset Options</Editor.Label>\n <Button size='small' fluid onClick={handleClearToggles}>\n Show All\n </Button>\n <Button size='small' fluid onClick={handleResetResizing}>\n Reset Resizing\n </Button>\n <Button size='small' fluid onClick={handleResetReordering}>\n Reset Reordering\n </Button>\n </div>\n </PopoverContents>\n </Popover.Root>\n );\n}\n","import { Toolbar } from '@base-ui/react/toolbar';\nimport type { Column } from '@tanstack/react-table';\n\nimport type { ExtendedEntry } from '../../../common/utils/rundownMetadata';\nimport {\n ColumnSettings,\n ViewSettings,\n} from '../../../views/cuesheet/cuesheet-table/cuesheet-table-settings/CuesheetTableSettings';\nimport { usePersistedRundownOptions } from '../rundown.options';\n\nimport style from '../../../views/cuesheet/cuesheet-table/cuesheet-table-settings/CuesheetTableSettings.module.scss';\n\ninterface EditorTableSettingsProps {\n columns: Column<ExtendedEntry, unknown>[];\n handleResetResizing: () => void;\n handleResetReordering: () => void;\n handleClearToggles: () => void;\n}\n\nexport default function EditorTableSettings({\n columns,\n handleResetResizing,\n handleResetReordering,\n handleClearToggles,\n}: EditorTableSettingsProps) {\n const options = usePersistedRundownOptions();\n\n return (\n <Toolbar.Root className={style.tableSettings}>\n <ViewSettings optionsStore={options} />\n <ColumnSettings\n columns={columns}\n handleResetResizing={handleResetResizing}\n handleResetReordering={handleResetReordering}\n handleClearToggles={handleClearToggles}\n />\n </Toolbar.Root>\n );\n}\n","import { CSSProperties, ReactNode } from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { Header } from '@tanstack/react-table';\n\nimport type { ExtendedEntry } from '../../../../common/utils/rundownMetadata';\n\nimport style from '../CuesheetTable.module.scss';\n\ninterface SortableCellProps {\n columnId: string;\n colSpan: number;\n injectedStyles: CSSProperties;\n children: ReactNode;\n draggable: ReactNode;\n}\n\nexport function SortableCell({ columnId, colSpan, injectedStyles, children, draggable }: SortableCellProps) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: columnId,\n });\n\n // build drag styles\n const dragStyle = {\n ...injectedStyles,\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n return (\n <th ref={setNodeRef} style={dragStyle} colSpan={colSpan} tabIndex={-1}>\n <div {...attributes} {...listeners}>\n {children}\n </div>\n {draggable}\n </th>\n );\n}\n\nexport function TableCell({ colSpan, injectedStyles, children, draggable }: SortableCellProps) {\n return (\n <th style={injectedStyles} colSpan={colSpan} tabIndex={-1}>\n <div>{children}</div>\n {draggable}\n </th>\n );\n}\n\ninterface DraggableProps {\n header: Header<ExtendedEntry, unknown>;\n}\n\nexport function Draggable({ header }: DraggableProps) {\n return (\n <div\n onDoubleClick={() => header.column.resetSize()}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n className={style.resizer}\n />\n );\n}\n","import { CSSProperties } from 'react';\nimport { horizontalListSortingStrategy, SortableContext } from '@dnd-kit/sortable';\nimport { flexRender, HeaderGroup } from '@tanstack/react-table';\n\nimport type { ExtendedEntry } from '../../../../common/utils/rundownMetadata';\nimport { getAccessibleColour } from '../../../../common/utils/styleUtils';\nimport { AppMode } from '../../../../ontimeConfig';\nimport { usePersistedCuesheetOptions } from '../../cuesheet.options';\n\nimport { Draggable, SortableCell, TableCell } from './SortableCell';\n\nimport style from '../CuesheetTable.module.scss';\n\ninterface CuesheetHeaderProps {\n headerGroup: HeaderGroup<ExtendedEntry>;\n cuesheetMode: AppMode;\n}\n\nexport function SortableCuesheetHeader({ headerGroup, cuesheetMode }: CuesheetHeaderProps) {\n const hideIndexColumn = usePersistedCuesheetOptions((state) => state.hideIndexColumn);\n\n return (\n <tr key={headerGroup.id}>\n {cuesheetMode === AppMode.Edit && <th className={style.actionColumn} tabIndex={-1} />}\n {!hideIndexColumn && (\n <th className={style.indexColumn} tabIndex={-1}>\n #\n </th>\n )}\n <SortableContext key={headerGroup.id} items={headerGroup.headers} strategy={horizontalListSortingStrategy}>\n {headerGroup.headers.map((header) => {\n const customBackground = header.column.columnDef.meta?.colour;\n const canWrite = header.column.columnDef.meta?.canWrite;\n\n const customStyles: CSSProperties = {\n opacity: canWrite ? 1 : 0.6,\n };\n if (customBackground) {\n const customColour = getAccessibleColour(customBackground);\n customStyles.backgroundColor = customColour.backgroundColor;\n customStyles.color = customColour.color;\n }\n\n return (\n <SortableCell\n key={header.column.columnDef.id}\n columnId={header.column.id}\n colSpan={header.colSpan}\n injectedStyles={{ width: `calc(var(--header-${header?.id}-size) * 1px)`, ...customStyles }}\n draggable={<Draggable header={header} />}\n >\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </SortableCell>\n );\n })}\n </SortableContext>\n </tr>\n );\n}\n\nexport function CuesheetHeader({ headerGroup, cuesheetMode }: CuesheetHeaderProps) {\n const hideIndexColumn = usePersistedCuesheetOptions((state) => state.hideIndexColumn);\n\n return (\n <tr key={headerGroup.id}>\n {cuesheetMode === AppMode.Edit && <th className={style.actionColumn} tabIndex={-1} />}\n {!hideIndexColumn && (\n <th className={style.indexColumn} tabIndex={-1}>\n #\n </th>\n )}\n {headerGroup.headers.map((header) => {\n const customBackground = header.column.columnDef.meta?.colour;\n const canWrite = header.column.columnDef.meta?.canWrite;\n\n const customStyles: CSSProperties = {\n opacity: canWrite ? 1 : 0.6,\n };\n if (customBackground) {\n const customColour = getAccessibleColour(customBackground);\n customStyles.backgroundColor = customColour.backgroundColor;\n customStyles.color = customColour.color;\n }\n\n return (\n <TableCell\n key={header.column.columnDef.id}\n columnId={header.column.id}\n colSpan={header.colSpan}\n injectedStyles={{ width: `calc(var(--header-${header?.id}-size) * 1px)`, ...customStyles }}\n draggable={<Draggable header={header} />}\n >\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableCell>\n );\n })}\n </tr>\n );\n}\n","import { CSSProperties, memo } from 'react';\n\nimport { millisToDelayString } from '../../../../common/utils/dateConfig';\nimport { usePersistedCuesheetOptions } from '../../cuesheet.options';\n\nimport style from './DelayRow.module.scss';\n\ninterface DelayRowProps {\n duration: number;\n injectedStyles?: CSSProperties;\n hasCursor?: boolean;\n}\n\nfunction DelayRow({ duration, injectedStyles, hasCursor, ...virtuosoProps }: DelayRowProps) {\n const hideDelays = usePersistedCuesheetOptions((state) => state.hideDelays);\n\n if (hideDelays || duration === 0) {\n return (\n <tr\n className={`${style.delayRow} ${style.delayRowHidden}`}\n data-testid='cuesheet-delay-hidden'\n style={injectedStyles}\n {...virtuosoProps}\n >\n <td />\n </tr>\n );\n }\n\n const delayTime = millisToDelayString(duration, 'expanded');\n\n return (\n <tr\n className={style.delayRow}\n data-testid='cuesheet-delay'\n style={injectedStyles}\n data-cursor={hasCursor}\n {...virtuosoProps}\n >\n <td tabIndex={0}>{delayTime}</td>\n </tr>\n );\n}\n\nexport default memo(DelayRow);\n","import { EntryId, SupportedEntry } from 'ontime-types';\nimport { create } from 'zustand';\n\ntype Anchor = { x: number; y: number };\n\ntype OpenMenu = {\n isOpen: true;\n entryId: EntryId;\n entryType: SupportedEntry;\n entryIndex: number;\n parentId: EntryId | null;\n flag: boolean | null;\n};\n\ntype ClosedMenu = {\n isOpen: false;\n entryId: null;\n entryType: null;\n entryIndex: null;\n parentId: null;\n flag: null;\n};\n\ntype CuesheetTableMenuStore = (OpenMenu | ClosedMenu) & {\n position: Anchor;\n openMenu: (\n position: Anchor,\n entryId: EntryId,\n entryType: SupportedEntry,\n entryIndex: number,\n parentId: EntryId | null,\n flag: boolean | null,\n ) => void;\n closeMenu: () => void;\n};\n\nexport const useCuesheetTableMenu = create<CuesheetTableMenuStore>((set) => ({\n isOpen: false,\n entryId: null,\n entryType: null,\n entryIndex: null,\n parentId: null,\n position: { x: 0, y: 0 },\n flag: null,\n openMenu: (\n position: Anchor,\n entryId: EntryId,\n entryType: SupportedEntry,\n entryIndex: number,\n parentId: EntryId | null,\n flag: null | boolean,\n ) => set({ isOpen: true, position, entryId, entryType, entryIndex, parentId, flag }),\n closeMenu: () => set({ isOpen: false }),\n}));\n","import { CSSProperties, useMemo } from 'react';\nimport { IoEllipsisHorizontal } from 'react-icons/io5';\nimport { flexRender, Table } from '@tanstack/react-table';\nimport { EntryId, OntimeEntry, RGBColour, SupportedEntry } from 'ontime-types';\nimport { colourToHex, cssOrHexToColour } from 'ontime-utils';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport type { ExtendedEntry } from '../../../../common/utils/rundownMetadata';\nimport { cx, getAccessibleColour } from '../../../../common/utils/styleUtils';\nimport { AppMode } from '../../../../ontimeConfig';\nimport { useCuesheetTableMenu } from '../cuesheet-table-menu/useCuesheetTableMenu';\n\nimport style from './EventRow.module.scss';\n\ninterface EventRowProps {\n rowId: string;\n id: EntryId;\n eventIndex: number;\n colour: string;\n isFirstAfterGroup: boolean;\n isLoaded: boolean;\n isPast: boolean;\n groupColour: string | undefined;\n flag: boolean;\n skip: boolean;\n parent: EntryId | null;\n rowIndex: number;\n table: Table<ExtendedEntry<OntimeEntry>>;\n injectedStyles?: CSSProperties;\n hasCursor?: boolean;\n}\n\nexport default function EventRow({\n rowId,\n id,\n eventIndex,\n colour,\n isFirstAfterGroup,\n isLoaded,\n isPast,\n groupColour,\n flag,\n skip,\n parent,\n rowIndex,\n table,\n injectedStyles,\n hasCursor,\n ...virtuosoProps\n}: EventRowProps) {\n const { cuesheetMode, hideIndexColumn } = table.options.meta?.options ?? {\n cuesheetMode: AppMode.Edit,\n hideIndexColumn: false,\n };\n\n const openMenu = useCuesheetTableMenu((store) => store.openMenu);\n\n const { color, backgroundColor } = getAccessibleColour(colour);\n const tmpColour = cssOrHexToColour(color) as RGBColour; // we know this to be a correct colour\n const mutedText = colourToHex({ ...tmpColour, alpha: tmpColour.alpha * 0.8 });\n\n const rowBgColour: string | undefined = useMemo(() => {\n if (isLoaded) {\n return '#087A27'; // $active-green\n } else if (colour) {\n // the colour is user defined and might be invalid\n const accessibleBackgroundColor = cssOrHexToColour(getAccessibleColour(colour).backgroundColor);\n if (accessibleBackgroundColor !== null) {\n return colourToHex({\n ...accessibleBackgroundColor,\n alpha: accessibleBackgroundColor.alpha * 0.25,\n });\n }\n }\n return;\n }, [colour, isLoaded]);\n\n return (\n <tr\n id={rowId}\n className={cx([\n style.eventRow,\n skip && style.skip,\n isFirstAfterGroup && style.firstAfterGroup,\n parent && style.hasParent,\n ])}\n style={{\n ...injectedStyles,\n opacity: `${isPast ? '0.2' : '1'}`,\n '--user-bg': groupColour ?? 'transparent',\n }}\n data-cursor={hasCursor}\n data-testid='cuesheet-event'\n data-entry-id={id}\n {...virtuosoProps}\n >\n {cuesheetMode === AppMode.Edit && (\n <td className={style.actionColumn} tabIndex={-1} role='cell'>\n <IconButton\n aria-label='Options'\n variant='ghosted-white'\n size='small'\n onClick={(e) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const yPos = 8 + rect.y + rect.height / 2;\n openMenu({ x: rect.x, y: yPos }, id, SupportedEntry.Event, rowIndex, parent, flag);\n }}\n >\n <IoEllipsisHorizontal />\n </IconButton>\n </td>\n )}\n {!hideIndexColumn && (\n <td className={style.indexColumn} style={{ backgroundColor, color: mutedText }} tabIndex={-1} role='cell'>\n {eventIndex}\n </td>\n )}\n {table\n .getRow(rowId)\n .getVisibleCells()\n .map((cell) => {\n return (\n <td\n key={cell.id}\n style={{\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n backgroundColor: rowBgColour,\n }}\n tabIndex={-1}\n role='cell'\n data-testid={`cuesheet-cell-${cell.column.id}`}\n data-column-id={cell.column.id}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n );\n })}\n </tr>\n );\n}\n","import { CSSProperties } from 'react';\nimport { IoEllipsisHorizontal } from 'react-icons/io5';\nimport { flexRender, Table } from '@tanstack/react-table';\nimport { EntryId, SupportedEntry } from 'ontime-types';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport type { ExtendedEntry } from '../../../../common/utils/rundownMetadata';\nimport { AppMode } from '../../../../ontimeConfig';\nimport { useCuesheetTableMenu } from '../cuesheet-table-menu/useCuesheetTableMenu';\n\nimport style from './GroupRow.module.scss';\n\ninterface GroupRowProps {\n groupId: EntryId;\n colour: string;\n rowId: string;\n rowIndex: number;\n table: Table<ExtendedEntry>;\n injectedStyles?: CSSProperties;\n hasCursor?: boolean;\n}\n\nexport default function GroupRow({\n groupId,\n colour,\n rowId,\n rowIndex,\n table,\n injectedStyles,\n hasCursor,\n ...virtuosoProps\n}: GroupRowProps) {\n const { cuesheetMode, hideIndexColumn } = table.options.meta?.options ?? {\n cuesheetMode: AppMode.Edit,\n hideIndexColumn: false,\n };\n\n const openMenu = useCuesheetTableMenu((store) => store.openMenu);\n\n return (\n <tr\n className={style.groupRow}\n style={{ ...injectedStyles, '--user-bg': colour }}\n data-testid='cuesheet-group'\n data-cursor={hasCursor}\n {...virtuosoProps}\n >\n {cuesheetMode === AppMode.Edit && (\n <td className={style.actionColumn} tabIndex={-1} role='cell'>\n <IconButton\n aria-label='Options'\n variant='ghosted-white'\n size='small'\n onClick={(e) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const yPos = 8 + rect.y + rect.height / 2;\n openMenu({ x: rect.x, y: yPos }, groupId, SupportedEntry.Group, rowIndex, null, null);\n }}\n >\n <IoEllipsisHorizontal />\n </IconButton>\n </td>\n )}\n {!hideIndexColumn && <td className={style.indexColumn} tabIndex={-1} role='cell' />}\n {table\n .getRow(rowId)\n .getVisibleCells()\n .map((cell) => {\n return (\n <td\n key={cell.id}\n tabIndex={-1}\n style={{\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n }}\n role='cell'\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n );\n })}\n </tr>\n );\n}\n","import { CSSProperties } from 'react';\nimport { IoEllipsisHorizontal } from 'react-icons/io5';\nimport { flexRender, Table } from '@tanstack/react-table';\nimport { EntryId, SupportedEntry } from 'ontime-types';\nimport { colourToHex, cssOrHexToColour } from 'ontime-utils';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport type { ExtendedEntry } from '../../../../common/utils/rundownMetadata';\nimport { cx, enDash, getAccessibleColour } from '../../../../common/utils/styleUtils';\nimport { AppMode } from '../../../../ontimeConfig';\nimport { useCuesheetTableMenu } from '../cuesheet-table-menu/useCuesheetTableMenu';\n\nimport style from './MilestoneRow.module.scss';\n\ninterface MilestoneRowProps {\n entryId: EntryId;\n isPast: boolean;\n parentBgColour?: string;\n parentId: EntryId | null;\n colour: string;\n rowId: string;\n rowIndex: number;\n table: Table<ExtendedEntry>;\n injectedStyles?: CSSProperties;\n hasCursor?: boolean;\n}\n\nexport default function MilestoneRow({\n entryId,\n isPast,\n parentBgColour,\n parentId,\n colour,\n rowId,\n rowIndex,\n hasCursor,\n table,\n injectedStyles,\n ...virtuosoProps\n}: MilestoneRowProps) {\n const { cuesheetMode, hideIndexColumn } = table.options.meta?.options ?? {\n cuesheetMode: AppMode.Edit,\n hideIndexColumn: false,\n };\n\n const openMenu = useCuesheetTableMenu((store) => store.openMenu);\n\n let rowBgColour: string | undefined;\n if (colour) {\n // the colour is user defined and might be invalid\n const accessibleBackgroundColor = cssOrHexToColour(getAccessibleColour(colour).backgroundColor);\n if (accessibleBackgroundColor !== null) {\n rowBgColour = colourToHex({\n ...accessibleBackgroundColor,\n alpha: accessibleBackgroundColor.alpha * 0.25,\n });\n }\n }\n\n return (\n <tr\n className={cx([style.milestoneRow, Boolean(parentBgColour) && style.hasParent])}\n style={{\n ...injectedStyles,\n opacity: `${isPast ? '0.2' : '1'}`,\n '--user-bg': parentBgColour ?? 'transparent',\n }}\n data-testid='cuesheet-milestone'\n data-cursor={hasCursor}\n {...virtuosoProps}\n >\n {cuesheetMode === AppMode.Edit && (\n <td className={style.actionColumn} tabIndex={-1} role='cell'>\n <IconButton\n aria-label='Options'\n variant='ghosted-white'\n size='small'\n onClick={(e) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const yPos = 8 + rect.y + rect.height / 2;\n openMenu({ x: rect.x, y: yPos }, entryId, SupportedEntry.Milestone, rowIndex, parentId, null);\n }}\n >\n <IoEllipsisHorizontal />\n </IconButton>\n </td>\n )}\n {!hideIndexColumn && (\n <td className={style.indexColumn} tabIndex={-1} role='cell'>\n {enDash}\n </td>\n )}\n {table\n .getRow(rowId)\n .getVisibleCells()\n .map((cell) => {\n const canRender =\n cell.column.id !== 'duration' && cell.column.id !== 'timeStart' && cell.column.id !== 'timeEnd';\n return (\n <td\n key={cell.id}\n style={{\n width: `calc(var(--col-${cell.column.id}-size) * 1px)`,\n backgroundColor: rowBgColour,\n opacity: canRender ? 1 : 0.4,\n }}\n tabIndex={-1}\n >\n {canRender && flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n );\n })}\n </tr>\n );\n}\n","import { memo } from 'react';\nimport { IoAdd, IoArrowDown, IoArrowUp, IoDuplicateOutline, IoOptions, IoTrash } from 'react-icons/io5';\nimport { SupportedEntry } from 'ontime-types';\n\nimport { PositionedDropdownMenu } from '../../../../common/components/dropdown-menu/DropdownMenu';\nimport { useEntryActionsContext } from '../../../../common/context/EntryActionsContext';\nimport { useEditModal } from '../../cuesheet-edit-modal/useEditModal';\nimport { useCuesheetPermissions } from '../../useTablePermissions';\n\nimport { useCuesheetTableMenu } from './useCuesheetTableMenu';\n\nexport default memo(TableMenu);\n\nfunction TableMenu() {\n const { isOpen, entryId, entryIndex, parentId, flag, position, closeMenu } = useCuesheetTableMenu();\n const { addEntry, clone, deleteEntry, move, updateEntry } = useEntryActionsContext();\n const showModal = useEditModal((state) => state.setEditableEntry);\n const permissions = useCuesheetPermissions();\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <PositionedDropdownMenu\n isOpen\n onClose={closeMenu}\n items={[\n {\n type: 'item',\n label: 'Edit...',\n onClick: () => showModal(entryId),\n icon: IoOptions,\n disabled: !permissions.canEditEntries,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: flag ? 'Remove flag' : 'Add flag',\n onClick: () => updateEntry({ id: entryId, flag: !flag }),\n icon: IoDuplicateOutline,\n disabled: flag === null || !permissions.canFlag,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Add event above',\n onClick: () => addEntry({ type: SupportedEntry.Event, parent: parentId }, { before: entryId }),\n icon: IoAdd,\n disabled: !permissions.canCreateEntries,\n },\n {\n type: 'item',\n label: 'Add event below',\n onClick: () => addEntry({ type: SupportedEntry.Event, parent: parentId }, { after: entryId }),\n icon: IoAdd,\n disabled: !permissions.canCreateEntries,\n },\n {\n type: 'item',\n label: 'Clone event',\n onClick: () => clone(entryId),\n icon: IoDuplicateOutline,\n disabled: !permissions.canCreateEntries,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Move up',\n onClick: () => move(entryId, 'up'),\n icon: IoArrowUp,\n disabled: entryIndex < 1 || !permissions.canEditEntries,\n },\n {\n type: 'item',\n label: 'Move down',\n onClick: () => move(entryId, 'down'),\n icon: IoArrowDown,\n disabled: !permissions.canEditEntries,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n onClick: () => deleteEntry([entryId]),\n icon: IoTrash,\n disabled: !permissions.canEditEntries,\n },\n ]}\n position={position}\n />\n );\n}\n","import { ComponentProps, memo, useCallback, useEffect, useMemo, useRef } from 'react';\nimport {\n ContextProp,\n ItemProps,\n TableComponents,\n TableProps,\n TableVirtuoso,\n TableVirtuosoHandle,\n} from 'react-virtuoso';\nimport { useTableNav } from '@table-nav/react';\nimport { ColumnDef, getCoreRowModel, Table, useReactTable } from '@tanstack/react-table';\nimport { isOntimeDelay, isOntimeGroup, isOntimeMilestone, OntimeEntry, TimeField } from 'ontime-types';\n\nimport EmptyPage from '../../../common/components/state/EmptyPage';\nimport EmptyTableBody from '../../../common/components/state/EmptyTableBody';\nimport { useEntryActionsContext } from '../../../common/context/EntryActionsContext';\nimport { useSelectedEventId } from '../../../common/hooks/useSocket';\nimport { useFlatRundownWithMetadata } from '../../../common/hooks-query/useRundown';\nimport type { ExtendedEntry } from '../../../common/utils/rundownMetadata';\nimport { usePersistedRundownOptions } from '../../../features/rundown/rundown.options';\nimport EditorTableSettings from '../../../features/rundown/rundown-table/EditorTableSettings';\nimport { useEventSelection } from '../../../features/rundown/useEventSelection';\nimport { AppMode } from '../../../ontimeConfig';\nimport { usePersistedCuesheetOptions } from '../cuesheet.options';\n\nimport { CuesheetHeader, SortableCuesheetHeader } from './cuesheet-table-elements/CuesheetHeader';\nimport DelayRow from './cuesheet-table-elements/DelayRow';\nimport EventRow from './cuesheet-table-elements/EventRow';\nimport GroupRow from './cuesheet-table-elements/GroupRow';\nimport MilestoneRow from './cuesheet-table-elements/MilestoneRow';\nimport TableMenu from './cuesheet-table-menu/TableMenu';\nimport CuesheetTableSettings from './cuesheet-table-settings/CuesheetTableSettings';\nimport { useColumnOrder, useColumnSizes, useColumnVisibility } from './useColumnManager';\n\nimport style from './CuesheetTable.module.scss';\n\ninterface CuesheetTableProps {\n columns: ColumnDef<ExtendedEntry>[];\n cuesheetMode: AppMode;\n tableRoot?: 'editor' | 'cuesheet';\n}\n\nexport default function CuesheetTable({ columns, cuesheetMode, tableRoot = 'cuesheet' }: CuesheetTableProps) {\n const { data, status } = useFlatRundownWithMetadata();\n const { updateEntry, updateTimer } = useEntryActionsContext();\n\n const useOptions = tableRoot === 'editor' ? usePersistedRundownOptions : usePersistedCuesheetOptions;\n const showDelayedTimes = useOptions((state) => state.showDelayedTimes);\n const hideTableSeconds = useOptions((state) => state.hideTableSeconds);\n const hideIndexColumn = useOptions((state) => state.hideIndexColumn);\n\n const selectedEventId = useSelectedEventId();\n const cursor = useEventSelection((state) => state.cursor);\n const setScrollHandler = useEventSelection((state) => state.setScrollHandler);\n\n const virtuosoRef = useRef<TableVirtuosoHandle | null>(null);\n const { listeners } = useTableNav();\n\n const meta = useMemo(\n () => ({\n handleUpdate: (rowIndex: number, accessor: string, payload: string, isCustom = false) => {\n // check if value is the same\n const event = data[rowIndex];\n\n if (!event) {\n return;\n }\n\n // skip if there is no value change\n const key = accessor as keyof OntimeEntry;\n const previousValue = event[key];\n if (previousValue === payload) {\n return;\n }\n\n if (isCustom) {\n updateEntry({ id: event.id, custom: { [accessor]: payload } });\n return;\n }\n\n updateEntry({ id: event.id, [accessor]: payload });\n },\n handleUpdateTimer: (eventId: string, field: TimeField, payload: string) => {\n // the timer element already contains logic to avoid submitting a unchanged value\n updateTimer(eventId, field, payload, true);\n },\n options: {\n showDelayedTimes,\n hideTableSeconds,\n cuesheetMode,\n hideIndexColumn,\n },\n }),\n [cuesheetMode, data, hideIndexColumn, hideTableSeconds, showDelayedTimes, updateEntry, updateTimer],\n );\n\n const { columnOrder, resetColumnOrder } = useColumnOrder(columns, tableRoot);\n const { columnSizing, setColumnSizing } = useColumnSizes(tableRoot);\n const { columnVisibility, setColumnVisibility } = useColumnVisibility(tableRoot);\n\n const table = useReactTable({\n data,\n columns,\n columnResizeMode: 'onChange',\n state: {\n columnOrder,\n columnVisibility,\n columnSizing,\n },\n onColumnVisibilityChange: setColumnVisibility,\n onColumnSizingChange: setColumnSizing,\n getCoreRowModel: getCoreRowModel(),\n meta,\n });\n\n const setAllVisible = useCallback(() => {\n table.toggleAllColumnsVisible(true);\n }, [table]);\n\n const resetColumnResizing = useCallback(() => {\n setColumnSizing({});\n }, [setColumnSizing]);\n\n // in Run mode, follow the current event\n useEffect(() => {\n if (virtuosoRef.current === null || cuesheetMode !== AppMode.Run || !selectedEventId) {\n return;\n }\n\n const eventIndex = data.findIndex((event) => event.id === selectedEventId);\n if (eventIndex === -1) {\n return;\n }\n\n virtuosoRef.current.scrollToIndex({ index: eventIndex, behavior: 'auto', align: 'start', offset: -50 });\n }, [cuesheetMode, data, selectedEventId]);\n\n // Provide an imperative scroll handler for explicit jumps (finder/keyboard)\n useEffect(() => {\n const handler = (entryId: string) => {\n if (virtuosoRef.current === null) {\n return;\n }\n\n const eventIndex = data.findIndex((event) => event.id === entryId);\n if (eventIndex === -1) {\n return;\n }\n\n virtuosoRef.current.scrollToIndex({ index: eventIndex, behavior: 'auto', align: 'start', offset: -50 });\n };\n\n setScrollHandler(handler);\n\n return () => {\n setScrollHandler(null);\n };\n }, [data, setScrollHandler]);\n\n /**\n * To improve performance on resizing, we memoise the column sizes\n * and pass them as CSS variables to the table container.\n */\n const columnSizeVars = useMemo(() => {\n const headers = table.getFlatHeaders();\n const colSizes: { [key: string]: number } = {};\n for (let i = 0; i < headers.length; i++) {\n const header = headers[i];\n if (!header) continue;\n colSizes[`--header-${header.id}-size`] = header.getSize();\n colSizes[`--col-${header.column.id}-size`] = header.column.getSize();\n }\n return colSizes;\n // eslint-disable-next-line react-compiler/react-compiler -- unfortunately this is what we need\n // eslint-disable-next-line react-hooks/exhaustive-deps -- this works well and follows documentation\n }, [table.getState().columnSizingInfo, table.getState().columnSizing]);\n\n const allLeafColumns = table.getAllLeafColumns();\n const { rows } = table.getRowModel();\n const virtuosoContext = useMemo(\n () => ({\n columnSizeVars,\n cursor,\n listeners,\n rows,\n table,\n }),\n [columnSizeVars, cursor, listeners, rows, table],\n );\n\n const computeItemKey = useCallback((_: number, item: ExtendedEntry) => item.id, []);\n const fixedHeaderContent = useCallback(() => {\n return table.getHeaderGroups().map((headerGroup) => {\n const HeaderComponent = table.getState().columnSizingInfo.isResizingColumn\n ? CuesheetHeader\n : SortableCuesheetHeader;\n\n // if the table is being resized, we render non-sortable headers to avoid performance issues\n return <HeaderComponent key={headerGroup.id} cuesheetMode={cuesheetMode} headerGroup={headerGroup} />;\n });\n }, [cuesheetMode, table]);\n\n const isLoading = !data || status === 'pending';\n\n if (isLoading) {\n return <EmptyPage text='Loading...' />;\n }\n\n // control components need different implementations for handling permissions\n const TableRootSettings = tableRoot === 'editor' ? EditorTableSettings : CuesheetTableSettings;\n\n return (\n <>\n <TableRootSettings\n columns={allLeafColumns}\n handleResetResizing={resetColumnResizing}\n handleResetReordering={resetColumnOrder}\n handleClearToggles={setAllVisible}\n />\n <TableVirtuoso\n ref={virtuosoRef}\n data={data}\n context={virtuosoContext}\n style={tableRoot === 'editor' ? { paddingLeft: '1rem' } : undefined}\n computeItemKey={computeItemKey}\n increaseViewportBy={{ top: 100, bottom: 200 }}\n components={virtuosoComponents}\n fixedHeaderContent={fixedHeaderContent}\n />\n\n <TableMenu />\n </>\n );\n}\n\n\ninterface CuesheetVirtuosoContext {\n columnSizeVars: { [key: string]: number };\n cursor: string | null;\n listeners: ReturnType<typeof useTableNav>['listeners'];\n rows: ReturnType<Table<ExtendedEntry>['getRowModel']>['rows'];\n table: Table<ExtendedEntry>;\n}\n\nconst EmptyPlaceholder = memo(function EmptyPlaceholder() {\n return <EmptyTableBody text='No data in rundown' />;\n});\n\nconst CuesheetTableElement = memo(function CuesheetTableElement({\n style: injectedStyles,\n context,\n ...virtuosoProps\n}: TableProps & ContextProp<CuesheetVirtuosoContext>) {\n return (\n <table\n className={style.cuesheet}\n id='cuesheet'\n style={{ ...injectedStyles, ...context.columnSizeVars }}\n {...context.listeners}\n {...virtuosoProps}\n />\n );\n});\n\nconst CuesheetTableHead = memo(function CuesheetTableHead({\n context: _context,\n className: _className,\n ...virtuosoProps\n}: ComponentProps<'thead'> & ContextProp<CuesheetVirtuosoContext>) {\n return <thead className={style.tableHeader} {...virtuosoProps} />;\n});\n\nconst CuesheetTableRow = memo(function CuesheetTableRow({\n item: _item,\n style: injectedStyles,\n context,\n ...virtuosoProps\n}: ItemProps<ExtendedEntry> & ContextProp<CuesheetVirtuosoContext>) {\n // eslint-disable-next-line react/destructuring-assignment\n const rowIndex = virtuosoProps['data-index'];\n const row = context.rows[rowIndex];\n if (!row) {\n return null;\n }\n\n const key = row.original.id;\n const entry = row.original;\n const hasCursor = entry.id === context.cursor;\n\n if (isOntimeGroup(entry)) {\n return (\n <GroupRow\n key={key}\n groupId={entry.id}\n colour={entry.colour}\n rowId={row.id}\n rowIndex={row.index}\n table={context.table}\n injectedStyles={injectedStyles}\n hasCursor={hasCursor}\n {...virtuosoProps}\n />\n );\n }\n\n if (isOntimeDelay(entry)) {\n return (\n <DelayRow\n key={key}\n duration={entry.duration}\n injectedStyles={injectedStyles}\n hasCursor={hasCursor}\n {...virtuosoProps}\n />\n );\n }\n\n if (isOntimeMilestone(entry)) {\n return (\n <MilestoneRow\n key={key}\n entryId={entry.id}\n isPast={entry.isPast}\n parentBgColour={entry.groupColour}\n parentId={entry.parent}\n colour={entry.colour}\n rowId={row.id}\n rowIndex={rowIndex}\n table={context.table}\n injectedStyles={injectedStyles}\n hasCursor={hasCursor}\n {...virtuosoProps}\n />\n );\n }\n\n return (\n <EventRow\n key={row.id}\n id={entry.id}\n eventIndex={entry.eventIndex}\n colour={entry.colour}\n isFirstAfterGroup={entry.isFirstAfterGroup}\n isLoaded={entry.isLoaded}\n isPast={entry.isPast}\n groupColour={entry.groupColour}\n flag={entry.flag}\n skip={entry.skip}\n parent={entry.parent}\n rowId={row.id}\n rowIndex={rowIndex}\n table={context.table}\n injectedStyles={injectedStyles}\n hasCursor={hasCursor}\n {...virtuosoProps}\n />\n );\n});\n\nconst virtuosoComponents: TableComponents<ExtendedEntry, CuesheetVirtuosoContext> = {\n EmptyPlaceholder,\n Table: CuesheetTableElement,\n TableHead: CuesheetTableHead,\n TableRow: CuesheetTableRow,\n};\n"],"names":["TimerLifeCycle","onLoad","onStart","onPause","onStop","onClock","onUpdate","onFinish","onWarning","onDanger","timerLifecycleValues","Object","keys","sanitiseCue","cue","replaceAll","EntryActionsContext","createContext","EntryActionsProvider","children","actions","useEntryActionsContext","context","useContext","Error","EventEditorImage","src","jsxs","style","imageContainer","Boolean","jsx","imageOverlay","AutoTextarea","value","inputref","textAreaProps","useEffect","node","current","autosize","destroy","Textarea","useReactiveTextInput","initialText","submitCallback","ref","options","text","setText","useState","isKeyboardSubmitting","useRef","handleChange","useCallback","newValue","handleSubmit","valueToSubmit","allowSubmitSameValue","onCancelUpdate","cleanVal","trim","setTimeout","allowKeyboardNavigation","parentElement","focus","blur","handleEscape","keyHandler","useMemo","hotKeys","event","preventDefault","submitOnEnter","push","submitOnCtrlEnter","hotKeyHandler","getHotkeyHandler","key","stopPropagation","onChange","target","onBlur","onKeyDown","EventTextArea","className","field","label","initialValue","givenStyles","submitHandler","Editor.Label","EntryEditorTextInput","maxLength","placeholder","Input","EntryEditorCustomFields","fields","customFields","entry","Fragment","map","fieldKey","id","fieldName","custom","backgroundColor","color","getAccessibleColour","colour","labelText","type","decorated","customImage","TimeInputGroup","hasDelay","cx","inputGroup","delayed","memo","TimeInputFlow","eventId","countToEnd","timeStart","timeEnd","duration","timeStrategy","linkStart","delay","showLabels","updateEntry","updateTimer","handleChangeStrategy","handleLink","doLink","warnings","dayInMs","isLockedEnd","TimeStrategy","LockEnd","isLockedDuration","LockDuration","inputWrapper","sectionTitle","hoverLabel","TimeInput","Tooltip","IconButton","active","inactive","fourtyfive","IoLink","IoUnlink","IoLockClosed","IoLockOpenOutline","length","join","timerNote","IoAlertCircleOutline","EventEditorTimes","endAction","timerType","timeWarning","timeDanger","newTime","parseUserTime","delayLabel","millisToDelayString","millisToString","column","Editor.Title","inline","splitTwo","Select","EndAction","None","LoadNext","PlayNext","switchLabel","Switch","IoInformationCircle","tooltipIcon","TimerType","CountDown","CountUp","Clock","EventEditorTitles","flag","title","note","cueSubmitHandler","_field","flagSubmitHandler","textSubmitHandler","splitThree","SwatchSelect","eventTriggerOptions","EventEditorTriggers","triggers","showTriggers","ExistingEventTriggers","EventTriggerForm","data","automationSettings","useAutomationSettings","automationId","setAutomationId","undefined","cycleValue","setCycleValue","triggerLifeCycle","newTriggers","Array","generateId","trigger","validationError","getValidationError","cycle","automations","includes","values","some","t","triggerOptions","automationOptions","triggerForm","Button","IoAlertCircle","errorLabel","IoCheckmarkCircle","success","handleDelete","triggerId","filter","filteredTriggers","forEach","triggerType","thisTriggerType","assign","entries","triggerGroup","automationTitle","Tag","IoTrash","EventEditor","useCustomFields","isEditor","window","location","pathname","startsWith","fieldLabel","split","content","AppLink","TextLikeInput","forwardRef","offset","muted","disabled","elementProps","textRef","classes","textInput","useImperativeHandle","focusParentElement","displayName","NullableTimeInput","name","time","emptyDisplay","align","inputRef","setValue","ignoreChange","resetValue","isNaN","handleFocus","select","valueInMillis","validateAndSubmit","onKeyDownHandler","onBlurHandler","timeInput","textAlign","TargetDurationInput","targetDuration","isLocked","enDash","timeAction","GroupEditor","group","planOffset","planOffsetLabel","getOffsetState","textLikeInput","fallback","timerPlaceholder","MilestoneEditor","milestone","CuesheetEntryEditor","entryId","useRundown","order","isOntimeEvent","entryEditor","isOntimeMilestone","inModal","isOntimeGroup","useEditModal","create","set","selectedEntryId","setEditableEntry","clearSelection","EntryEditModal","state","closeModal","Modal","debounce","callback","wait","timeout","args","clearTimeout","useColumnSizes","tableRoot","tableSizesKey","makeStageKey","columnSizing","setColumnSizingState","stored","localStorage","getItem","JSON","parse","sizes","setItem","stringify","setColumnSizing","sizesOrUpdater","useColumnOrder","columns","tableOrderKey","columnOrder","saveColumnOrder","useLocalStorage","defaultValue","col","newColumns","resetColumnOrder","useColumnVisibility","tableHiddenKey","columnVisibility","setColumnVisibility","CuesheetDnd","sensors","useSensors","useSensor","PointerSensor","activationConstraint","tolerance","TouchSensor","handleOnDragEnd","delta","over","y","fromIndex","indexOf","toIndex","reorderedCols","reorderedItem","splice","DndContext","closestCorners","SingleLineCell","fieldId","handleUpdate","handleCancelUpdate","DurationInput","lockedValue","onSubmit","isEditing","setIsEditing","handleFakeFocus","handleFakeBlur","Number","timeString","EditableImage","readOnly","updateValue","openInNewTab","open","imageCell","overlay","image","imageInput","currentTarget","FlagCell","TbFlagFilled","GhostedText","multiline","ghostedText","MultiLineCell","MutedText","numeric","TimeInputDuration","formatTime","getColumnLabel","columnDef","header","MakeStart","getValue","row","table","meta","showDelayedTimes","hideTableSeconds","formatOpts","format12","format24","original","handleUpdateTimer","update","startTime","isStartLocked","displayTime","formattedTime","canWrite","DelayIndicator","MakeEnd","endTime","isEndLocked","MakeDuration","formatDuration","isDurationLocked","formattedDuration","MakeMultiLineField","index","LazyImage","isOntimeDelay","MakeSingleLineField","MakeFlagField","MakeCustomField","makeCuesheetColumns","cuesheetMode","preset","columnsDef","modeAllowsWrite","AppMode","Edit","fullRead","read","fullWrite","write","canWriteKeys","Set","canReadKeys","canRead","has","accessorKey","cell","size","minSize","customFieldKeys","i","permissionKey","EmptyTableBody","emptyContainer","emptyCell","EmptyImage","empty","defaultOptions","hideIndexColumn","hideDelays","usePersistedRundownOptions","persist","setOption","toggleOption","resetOptions","RundownViewMode","List","Table","useCuesheetPermissions","canChangeMode","canCreateEntries","canEditEntries","canFlag","canShare","setPermissions","permissions","RotatedLink","linkProps","transform","CuesheetShareModal","infoData","useInfo","urlPresetData","useUrlPresets","isOpen","handler","useDisclosure","showModalContent","Toolbar.Button","close","GenerateLinkFormExport","OntimeView","Cuesheet","CuesheetTableSettings","handleResetResizing","handleResetReordering","handleClearToggles","use","PresetContext","usePersistedCuesheetOptions","setCuesheetMode","useSessionStorage","alias","sessionKeys","Run","toggleCuesheetMode","mode","at","Toolbar.Root","tableSettings","ViewSettings","ColumnSettings","ToggleGroup","apart","Toggle","radioButton","Editor.Separator","optionsStore","Popover.Root","Popover.Trigger","IoOptions","IoChevronDown","PopoverContents","option","Checkbox","checked","IoBookOutline","columnHeader","visible","getIsVisible","toggleVisibility","EditorTableSettings","SortableCell","columnId","colSpan","injectedStyles","draggable","attributes","listeners","setNodeRef","transition","isDragging","useSortable","dragStyle","zIndex","CSS","Translate","toString","TableCell","Draggable","resetSize","getResizeHandler","resizer","SortableCuesheetHeader","headerGroup","actionColumn","indexColumn","SortableContext","headers","horizontalListSortingStrategy","customBackground","customStyles","opacity","customColour","width","isPlaceholder","flexRender","getContext","CuesheetHeader","DelayRow","hasCursor","virtuosoProps","delayRow","delayRowHidden","delayTime","useCuesheetTableMenu","entryType","entryIndex","parentId","position","x","openMenu","closeMenu","EventRow","rowId","eventIndex","isFirstAfterGroup","isLoaded","isPast","groupColour","skip","parent","rowIndex","store","tmpColour","cssOrHexToColour","mutedText","colourToHex","alpha","rowBgColour","accessibleBackgroundColor","eventRow","firstAfterGroup","hasParent","e","rect","getBoundingClientRect","yPos","height","SupportedEntry","Event","IoEllipsisHorizontal","getRow","getVisibleCells","GroupRow","groupId","groupRow","Group","MilestoneRow","parentBgColour","milestoneRow","Milestone","canRender","TableMenu","addEntry","clone","deleteEntry","move","showModal","PositionedDropdownMenu","onClick","icon","IoDuplicateOutline","before","IoAdd","after","IoArrowUp","IoArrowDown","CuesheetTable","status","useFlatRundownWithMetadata","useOptions","selectedEventId","useSelectedEventId","cursor","useEventSelection","setScrollHandler","virtuosoRef","useTableNav","accessor","payload","isCustom","useReactTable","columnResizeMode","onColumnVisibilityChange","onColumnSizingChange","getCoreRowModel","setAllVisible","toggleAllColumnsVisible","resetColumnResizing","findIndex","scrollToIndex","behavior","columnSizeVars","getFlatHeaders","colSizes","getSize","getState","columnSizingInfo","allLeafColumns","getAllLeafColumns","rows","getRowModel","virtuosoContext","computeItemKey","_","item","fixedHeaderContent","getHeaderGroups","HeaderComponent","isResizingColumn","EmptyPage","TableRootSettings","TableVirtuoso","paddingLeft","top","bottom","virtuosoComponents","EmptyPlaceholder","CuesheetTableElement","cuesheet","CuesheetTableHead","_context","_className","tableHeader","CuesheetTableRow","_item","TableHead","TableRow"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as w,ad as I,j as e}from"./vendor-BKUJ0_Du.js";import{d as v,bW as c,Y as S,a9 as u,B as m,$ as T,ae as _,af as C,ag as D,ah as O,ai as B}from"./index-Dm-4OTmY.js";import{I as M}from"./SwatchPicker-Ckpchvjo.js";import{M as F}from"./useEventSelection-Bpbu89c7.js";import"./Select-BnGTAeXJ.js";import"./useCustomFields-BBE4LBBr.js";import"./useRundown-DAo6huE4.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},o=new s.Error().stack;o&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[o]="e1824082-b680-4dd2-830c-9b8f0c7f7e44",s._sentryDebugIdIdentifier="sentry-dbid-e1824082-b680-4dd2-830c-9b8f0c7f7e44")}catch{}})();function G({isOpen:s,onClose:o}){const{userTranslation:a,postUserTranslation:f}=v(),h=w.useMemo(()=>{const t={};return Object.keys(c).forEach(r=>{t[l(r)]=a[r]||""}),t},[a]),{handleSubmit:p,register:b,reset:g,formState:{isSubmitting:d,isDirty:x,errors:i,isValid:j},setError:y}=I({defaultValues:h,resetOptions:{keepDirtyValues:!0},mode:"onChange"}),E=async t=>{try{const r={};Object.keys(t).forEach(n=>{r[L(n)]=t[n]}),await f(r),g(t)}catch(r){y("root",{message:B(r)})}};return e.jsx(F,{title:"Edit custom translations",isOpen:s,onClose:o,showCloseButton:!0,showBackdrop:!0,bodyElements:e.jsxs(T,{as:"form",onSubmit:p(E),id:"custom-translations-form",children:[e.jsxs(M,{children:["Provide custom translations for the public views of Ontime. ",e.jsx("br",{}),'You will need to activate this in the settings by selecting "Custom" as the views language.']}),e.jsx(_,{children:Object.entries(c).map(([t,r])=>{var n;return e.jsxs(C,{children:[e.jsx(D,{title:r,description:"",error:(n=i[l(t)])==null?void 0:n.message}),e.jsx(O,{maxLength:150,...b(l(t),{required:"This field is required"}),placeholder:r})]},t)})})]}),footerElements:e.jsxs("div",{children:[(i==null?void 0:i.root)&&e.jsx(S,{children:i.root.message}),e.jsx(u,{align:"apart",children:e.jsxs(u,{children:[e.jsx(m,{size:"large",onClick:o,children:"Cancel"}),e.jsx(m,{variant:"primary",size:"large",type:"submit",form:"custom-translations-form",disabled:d||!x||!j,loading:d,children:"Save changes"})]})})]})})}function l(s){return s.replace(".","_")}function L(s){return s.replace("_",".")}export{G as default};
|
|
2
|
-
//# sourceMappingURL=CustomTranslationModal-CML7Vsot.js.map
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|