@getontime/cli 4.0.2 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/assets/Backstage-DG-hwPI3.js +2 -0
- package/client/assets/Backstage-DG-hwPI3.js.br +0 -0
- package/client/assets/Backstage-DG-hwPI3.js.gz +0 -0
- package/client/assets/Backstage-DG-hwPI3.js.map +1 -0
- package/client/assets/Countdown-C8LGl1pp.js +2 -0
- package/client/assets/Countdown-C8LGl1pp.js.br +0 -0
- package/client/assets/Countdown-C8LGl1pp.js.gz +0 -0
- package/client/assets/Countdown-C8LGl1pp.js.map +1 -0
- package/client/assets/CustomTranslationModal-CJ9-aDjl.js +2 -0
- package/client/assets/CustomTranslationModal-CJ9-aDjl.js.br +0 -0
- package/client/assets/CustomTranslationModal-CJ9-aDjl.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-C3R_2T5s.js.map → CustomTranslationModal-CJ9-aDjl.js.map} +1 -1
- package/client/assets/DelayIndicator-F4GdgsGh.js +2 -0
- package/client/assets/DelayIndicator-F4GdgsGh.js.br +0 -0
- package/client/assets/DelayIndicator-F4GdgsGh.js.gz +0 -0
- package/client/assets/{DelayIndicator-vT7n8ypf.js.map → DelayIndicator-F4GdgsGh.js.map} +1 -1
- package/client/assets/EditorFeatureWrapper-eIpSr_UK.js +2 -0
- package/client/assets/EditorFeatureWrapper-eIpSr_UK.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-eIpSr_UK.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-DHfuO3EA.js.map → EditorFeatureWrapper-eIpSr_UK.js.map} +1 -1
- package/client/assets/EditorUtils-Bd3J5Dvf.js +2 -0
- package/client/assets/EditorUtils-Bd3J5Dvf.js.br +0 -0
- package/client/assets/EditorUtils-Bd3J5Dvf.js.gz +0 -0
- package/client/assets/EditorUtils-Bd3J5Dvf.js.map +1 -0
- package/client/assets/EditorUtils-CgF7UfHP.css +1 -0
- package/client/assets/EditorUtils-CgF7UfHP.css.br +0 -0
- package/client/assets/EditorUtils-CgF7UfHP.css.gz +0 -0
- package/client/assets/Empty-C0IdV_kI.js +2 -0
- package/client/assets/Empty-C0IdV_kI.js.br +0 -0
- package/client/assets/Empty-C0IdV_kI.js.gz +0 -0
- package/client/assets/{Empty-gWT_HMeu.js.map → Empty-C0IdV_kI.js.map} +1 -1
- package/client/assets/EmptyPage-Ct3d0DqJ.js +2 -0
- package/client/assets/EmptyPage-Ct3d0DqJ.js.br +0 -0
- package/client/assets/EmptyPage-Ct3d0DqJ.js.gz +0 -0
- package/client/assets/{EmptyPage-Dcbg6rmF.js.map → EmptyPage-Ct3d0DqJ.js.map} +1 -1
- package/client/assets/FollowButton-BG-ycRWu.js +2 -0
- package/client/assets/FollowButton-BG-ycRWu.js.br +0 -0
- package/client/assets/FollowButton-BG-ycRWu.js.gz +0 -0
- package/client/assets/{FollowButton-CSqJSvix.js.map → FollowButton-BG-ycRWu.js.map} +1 -1
- package/client/assets/MessageControlExport-DjoUioWA.css +1 -0
- package/client/assets/MessageControlExport-DjoUioWA.css.br +0 -0
- package/client/assets/MessageControlExport-DjoUioWA.css.gz +0 -0
- package/client/assets/MessageControlExport-X-4dl9QT.js +3 -0
- package/client/assets/MessageControlExport-X-4dl9QT.js.br +0 -0
- package/client/assets/MessageControlExport-X-4dl9QT.js.gz +0 -0
- package/client/assets/MessageControlExport-X-4dl9QT.js.map +1 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css +1 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css.br +0 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css.gz +0 -0
- package/client/assets/MilestoneEditor-rgBQSXVU.js +2 -0
- package/client/assets/MilestoneEditor-rgBQSXVU.js.br +0 -0
- package/client/assets/MilestoneEditor-rgBQSXVU.js.gz +0 -0
- package/client/assets/MilestoneEditor-rgBQSXVU.js.map +1 -0
- package/client/assets/Modal-Bn1bZkwb.js +2 -0
- package/client/assets/Modal-Bn1bZkwb.js.br +0 -0
- package/client/assets/Modal-Bn1bZkwb.js.gz +0 -0
- package/client/assets/Modal-Bn1bZkwb.js.map +1 -0
- package/client/assets/Modal-D3tAPV2u.css +1 -0
- package/client/assets/Modal-D3tAPV2u.css.br +0 -0
- package/client/assets/Modal-D3tAPV2u.css.gz +0 -0
- package/client/assets/MultiPartProgressBar-Cmw-gisu.js +2 -0
- package/client/assets/MultiPartProgressBar-Cmw-gisu.js.br +0 -0
- package/client/assets/MultiPartProgressBar-Cmw-gisu.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-D3jJZjb5.js.map → MultiPartProgressBar-Cmw-gisu.js.map} +1 -1
- package/client/assets/OperatorExport-BiBcgVKc.css +1 -0
- package/client/assets/OperatorExport-BiBcgVKc.css.br +0 -0
- package/client/assets/OperatorExport-BiBcgVKc.css.gz +0 -0
- package/client/assets/OperatorExport-CJd8jmY4.js +2 -0
- package/client/assets/OperatorExport-CJd8jmY4.js.br +0 -0
- package/client/assets/OperatorExport-CJd8jmY4.js.gz +0 -0
- package/client/assets/OperatorExport-CJd8jmY4.js.map +1 -0
- package/client/assets/OverviewWrapper-1Vj3_ojX.js +2 -0
- package/client/assets/OverviewWrapper-1Vj3_ojX.js.br +0 -0
- package/client/assets/OverviewWrapper-1Vj3_ojX.js.gz +0 -0
- package/client/assets/OverviewWrapper-1Vj3_ojX.js.map +1 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css +1 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css.br +0 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css.gz +0 -0
- package/client/assets/PipHost-BUF7n-lT.css +1 -0
- package/client/assets/PipHost-BUF7n-lT.css.br +0 -0
- package/client/assets/PipHost-BUF7n-lT.css.gz +0 -0
- package/client/assets/PipHost-D7liNR4M.js +2 -0
- package/client/assets/PipHost-D7liNR4M.js.br +0 -0
- package/client/assets/PipHost-D7liNR4M.js.gz +0 -0
- package/client/assets/PipHost-D7liNR4M.js.map +1 -0
- package/client/assets/ProjectInfo-BduQgjcz.js +2 -0
- package/client/assets/ProjectInfo-BduQgjcz.js.br +0 -0
- package/client/assets/ProjectInfo-BduQgjcz.js.gz +0 -0
- package/client/assets/{ProjectInfo-z4k3cipS.js.map → ProjectInfo-BduQgjcz.js.map} +1 -1
- package/client/assets/ProtectRoute-Ci_AIozP.js +2 -0
- package/client/assets/ProtectRoute-Ci_AIozP.js.br +0 -0
- package/client/assets/ProtectRoute-Ci_AIozP.js.gz +0 -0
- package/client/assets/{ProtectRoute-CrcWfOlG.js.map → ProtectRoute-Ci_AIozP.js.map} +1 -1
- package/client/assets/{ProtectedCuesheet-CMTscjjR.css → ProtectedCuesheet-C_tKodwo.css} +1 -1
- package/client/assets/ProtectedCuesheet-C_tKodwo.css.br +0 -0
- package/client/assets/ProtectedCuesheet-C_tKodwo.css.gz +0 -0
- package/client/assets/ProtectedCuesheet-D_zdkwM-.js +2 -0
- package/client/assets/ProtectedCuesheet-D_zdkwM-.js.br +0 -0
- package/client/assets/ProtectedCuesheet-D_zdkwM-.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-D_zdkwM-.js.map +1 -0
- package/client/assets/ProtectedEditor-CNL2ig79.js +3 -0
- package/client/assets/ProtectedEditor-CNL2ig79.js.br +0 -0
- package/client/assets/ProtectedEditor-CNL2ig79.js.gz +0 -0
- package/client/assets/ProtectedEditor-CNL2ig79.js.map +1 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css +1 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css.br +0 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css.gz +0 -0
- package/client/assets/RundownEntry-Blq5OsMH.css +1 -0
- package/client/assets/RundownEntry-Blq5OsMH.css.br +0 -0
- package/client/assets/RundownEntry-Blq5OsMH.css.gz +0 -0
- package/client/assets/RundownEntry-Bs1ombtH.js +2 -0
- package/client/assets/RundownEntry-Bs1ombtH.js.br +0 -0
- package/client/assets/RundownEntry-Bs1ombtH.js.gz +0 -0
- package/client/assets/RundownEntry-Bs1ombtH.js.map +1 -0
- package/client/assets/RundownExport-BCT0ybxy.js +3 -0
- package/client/assets/RundownExport-BCT0ybxy.js.br +0 -0
- package/client/assets/RundownExport-BCT0ybxy.js.gz +0 -0
- package/client/assets/RundownExport-BCT0ybxy.js.map +1 -0
- package/client/assets/{RundownExport-1zBZurIG.css → RundownExport-DtSvAfBG.css} +1 -1
- package/client/assets/RundownExport-DtSvAfBG.css.br +0 -0
- package/client/assets/RundownExport-DtSvAfBG.css.gz +0 -0
- package/client/assets/Select-B5xNi_tM.js +2 -0
- package/client/assets/Select-B5xNi_tM.js.br +0 -0
- package/client/assets/Select-B5xNi_tM.js.gz +0 -0
- package/client/assets/{Select-CedN80WS.js.map → Select-B5xNi_tM.js.map} +1 -1
- package/client/assets/Studio-D4hRKhJ1.js +2 -0
- package/client/assets/Studio-D4hRKhJ1.js.br +0 -0
- package/client/assets/Studio-D4hRKhJ1.js.gz +0 -0
- package/client/assets/Studio-D4hRKhJ1.js.map +1 -0
- package/client/assets/{StyleEditor-D2z65PB7.js → StyleEditor-BvcE8dkA.js} +2 -2
- package/client/assets/StyleEditor-BvcE8dkA.js.br +3 -0
- package/client/assets/StyleEditor-BvcE8dkA.js.gz +0 -0
- package/client/assets/{StyleEditor-D2z65PB7.js.map → StyleEditor-BvcE8dkA.js.map} +1 -1
- package/client/assets/SuperscriptPeriod-BmHAoSBy.js +2 -0
- package/client/assets/SuperscriptPeriod-BmHAoSBy.js.br +0 -0
- package/client/assets/SuperscriptPeriod-BmHAoSBy.js.gz +0 -0
- package/client/assets/SuperscriptPeriod-BmHAoSBy.js.map +1 -0
- package/client/assets/SuperscriptTime-Nou92D8X.js +2 -0
- package/client/assets/SuperscriptTime-Nou92D8X.js.br +0 -0
- package/client/assets/SuperscriptTime-Nou92D8X.js.gz +0 -0
- package/client/assets/{SuperscriptTime-CIrcMcyg.js.map → SuperscriptTime-Nou92D8X.js.map} +1 -1
- package/client/assets/TimeElements-XpRwBsaa.js +2 -0
- package/client/assets/TimeElements-XpRwBsaa.js.br +0 -0
- package/client/assets/TimeElements-XpRwBsaa.js.gz +0 -0
- package/client/assets/TimeElements-XpRwBsaa.js.map +1 -0
- package/client/assets/TimeElements-c2rTHN98.css +1 -0
- package/client/assets/TimeElements-c2rTHN98.css.br +0 -0
- package/client/assets/TimeElements-c2rTHN98.css.gz +0 -0
- package/client/assets/TimeInput-Bu_5GlHP.js +2 -0
- package/client/assets/TimeInput-Bu_5GlHP.js.br +0 -0
- package/client/assets/TimeInput-Bu_5GlHP.js.gz +0 -0
- package/client/assets/{TimeInput-Dg1naiy3.js.map → TimeInput-Bu_5GlHP.js.map} +1 -1
- package/client/assets/{TimeInput-BrVdiuOQ.css → TimeInput-Cu-N5DmX.css} +1 -1
- package/client/assets/TimeInput-Cu-N5DmX.css.br +0 -0
- package/client/assets/TimeInput-Cu-N5DmX.css.gz +0 -0
- package/client/assets/TimelinePage-CQqUB1KT.js +2 -0
- package/client/assets/TimelinePage-CQqUB1KT.js.br +0 -0
- package/client/assets/TimelinePage-CQqUB1KT.js.gz +0 -0
- package/client/assets/TimelinePage-CQqUB1KT.js.map +1 -0
- package/client/assets/TimelinePage-CcFl3uul.css +1 -0
- package/client/assets/TimelinePage-CcFl3uul.css.br +0 -0
- package/client/assets/TimelinePage-CcFl3uul.css.gz +0 -0
- package/client/assets/{Timer-BvEmZbmF.css → Timer-B7nk3TMf.css} +1 -1
- package/client/assets/Timer-B7nk3TMf.css.br +0 -0
- package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
- package/client/assets/Timer-CIr2L3gJ.js +2 -0
- package/client/assets/Timer-CIr2L3gJ.js.br +0 -0
- package/client/assets/Timer-CIr2L3gJ.js.gz +0 -0
- package/client/assets/Timer-CIr2L3gJ.js.map +1 -0
- package/client/assets/TimerControlExport-4a3Cd9x8.js +2 -0
- package/client/assets/TimerControlExport-4a3Cd9x8.js.br +0 -0
- package/client/assets/TimerControlExport-4a3Cd9x8.js.gz +0 -0
- package/client/assets/{TimerControlExport-C8ECtLBd.js.map → TimerControlExport-4a3Cd9x8.js.map} +1 -1
- package/client/assets/{TimerControlExport-D8kqHQB0.css → TimerControlExport-DavNxY9p.css} +1 -1
- package/client/assets/TimerControlExport-DavNxY9p.css.br +0 -0
- package/client/assets/TimerControlExport-DavNxY9p.css.gz +0 -0
- package/client/assets/TitleCard-1U35ek0D.js +2 -0
- package/client/assets/TitleCard-1U35ek0D.js.br +0 -0
- package/client/assets/TitleCard-1U35ek0D.js.gz +0 -0
- package/client/assets/{TitleCard-CZl9wSHS.js.map → TitleCard-1U35ek0D.js.map} +1 -1
- package/client/assets/{Tooltip-D9XRnwOW.js → Tooltip-B8y25e3n.js} +2 -2
- package/client/assets/Tooltip-B8y25e3n.js.br +0 -0
- package/client/assets/Tooltip-B8y25e3n.js.gz +0 -0
- package/client/assets/{Tooltip-D9XRnwOW.js.map → Tooltip-B8y25e3n.js.map} +1 -1
- package/client/assets/ViewLogo-BHsV7Faa.js +2 -0
- package/client/assets/ViewLogo-BHsV7Faa.js.br +0 -0
- package/client/assets/ViewLogo-BHsV7Faa.js.gz +0 -0
- package/client/assets/{ViewLogo-_3Z1hIHi.js.map → ViewLogo-BHsV7Faa.js.map} +1 -1
- package/client/assets/ViewParamsEditor-BMHXOv-K.js +2 -0
- package/client/assets/ViewParamsEditor-BMHXOv-K.js.br +0 -0
- package/client/assets/ViewParamsEditor-BMHXOv-K.js.gz +0 -0
- package/client/assets/ViewParamsEditor-BMHXOv-K.js.map +1 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css +1 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css.br +0 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css.gz +0 -0
- package/client/assets/{dateConfig-DRQGMWDF.js → dateConfig-_BhycZza.js} +2 -2
- package/client/assets/dateConfig-_BhycZza.js.br +0 -0
- package/client/assets/dateConfig-_BhycZza.js.gz +0 -0
- package/client/assets/{dateConfig-DRQGMWDF.js.map → dateConfig-_BhycZza.js.map} +1 -1
- package/client/assets/{editorSettings-BU0pTMSY.js → editorSettings-DH9ca-nB.js} +2 -2
- package/client/assets/editorSettings-DH9ca-nB.js.br +0 -0
- package/client/assets/editorSettings-DH9ca-nB.js.gz +0 -0
- package/client/assets/{editorSettings-BU0pTMSY.js.map → editorSettings-DH9ca-nB.js.map} +1 -1
- package/client/assets/{getProgress-Cw79NL_O.js → getProgress-DlrSzpnf.js} +2 -2
- package/client/assets/getProgress-DlrSzpnf.js.br +0 -0
- package/client/assets/getProgress-DlrSzpnf.js.gz +0 -0
- package/client/assets/{getProgress-Cw79NL_O.js.map → getProgress-DlrSzpnf.js.map} +1 -1
- package/client/assets/{index-De0uf0Ta.css → index-BuJoGGff.css} +1 -1
- package/client/assets/index-BuJoGGff.css.br +0 -0
- package/client/assets/index-BuJoGGff.css.gz +0 -0
- package/client/assets/index-CDBQg2fh.js +3 -0
- package/client/assets/index-CDBQg2fh.js.br +0 -0
- package/client/assets/index-CDBQg2fh.js.gz +0 -0
- package/client/assets/index-CDBQg2fh.js.map +1 -0
- package/client/assets/offset-CLG4o744.js +2 -0
- package/client/assets/offset-CLG4o744.js.br +0 -0
- package/client/assets/offset-CLG4o744.js.gz +0 -0
- package/client/assets/offset-CLG4o744.js.map +1 -0
- package/client/assets/parseUserTime-Cp5iWS7y.js +2 -0
- package/client/assets/parseUserTime-Cp5iWS7y.js.br +0 -0
- package/client/assets/parseUserTime-Cp5iWS7y.js.gz +0 -0
- package/client/assets/{parseUserTime-BeTKj08M.js.map → parseUserTime-Cp5iWS7y.js.map} +1 -1
- package/client/assets/playbackstate-B3BKJ8cT.js +2 -0
- package/client/assets/playbackstate-B3BKJ8cT.js.br +0 -0
- package/client/assets/playbackstate-B3BKJ8cT.js.gz +0 -0
- package/client/assets/{playbackstate-B_khF6xU.js.map → playbackstate-B3BKJ8cT.js.map} +1 -1
- package/client/assets/{presentation.utils-KwY-ACf7.js → presentation.utils-B-wIv_a5.js} +2 -2
- package/client/assets/presentation.utils-B-wIv_a5.js.br +0 -0
- package/client/assets/presentation.utils-B-wIv_a5.js.gz +0 -0
- package/client/assets/{presentation.utils-KwY-ACf7.js.map → presentation.utils-B-wIv_a5.js.map} +1 -1
- package/client/assets/{rundownUtils-BZHazkXR.js → rundownUtils-DJKMt8Ih.js} +2 -2
- package/client/assets/rundownUtils-DJKMt8Ih.js.br +0 -0
- package/client/assets/rundownUtils-DJKMt8Ih.js.gz +0 -0
- package/client/assets/{rundownUtils-BZHazkXR.js.map → rundownUtils-DJKMt8Ih.js.map} +1 -1
- package/client/assets/timer.utils-ByC_bcT9.js +2 -0
- package/client/assets/timer.utils-ByC_bcT9.js.br +0 -0
- package/client/assets/timer.utils-ByC_bcT9.js.gz +0 -0
- package/client/assets/timer.utils-ByC_bcT9.js.map +1 -0
- package/client/assets/useCustomFields-BUJkzZvM.js +2 -0
- package/client/assets/useCustomFields-BUJkzZvM.js.br +2 -0
- package/client/assets/useCustomFields-BUJkzZvM.js.gz +0 -0
- package/client/assets/{useCustomFields-DqCYz8Kt.js.map → useCustomFields-BUJkzZvM.js.map} +1 -1
- package/client/assets/{useFollowComponent-Ctfhf2or.js → useFollowComponent-Eyo4hWVG.js} +2 -2
- package/client/assets/useFollowComponent-Eyo4hWVG.js.br +0 -0
- package/client/assets/useFollowComponent-Eyo4hWVG.js.gz +0 -0
- package/client/assets/{useFollowComponent-Ctfhf2or.js.map → useFollowComponent-Eyo4hWVG.js.map} +1 -1
- package/client/assets/{useProjectData-C1hVamxc.js → useProjectData-DGA6K2Zs.js} +2 -2
- package/client/assets/useProjectData-DGA6K2Zs.js.br +0 -0
- package/client/assets/useProjectData-DGA6K2Zs.js.gz +0 -0
- package/client/assets/{useProjectData-C1hVamxc.js.map → useProjectData-DGA6K2Zs.js.map} +1 -1
- package/client/assets/useReport-BUCsRa2T.js +2 -0
- package/client/assets/useReport-BUCsRa2T.js.br +0 -0
- package/client/assets/useReport-BUCsRa2T.js.gz +0 -0
- package/client/assets/{useReport-B4dMYcNL.js.map → useReport-BUCsRa2T.js.map} +1 -1
- package/client/assets/useRundown-BFae0_bU.js +2 -0
- package/client/assets/useRundown-BFae0_bU.js.br +0 -0
- package/client/assets/useRundown-BFae0_bU.js.gz +0 -0
- package/client/assets/useRundown-BFae0_bU.js.map +1 -0
- package/client/assets/useWindowTitle-DU8NlxIu.js +2 -0
- package/client/assets/useWindowTitle-DU8NlxIu.js.br +0 -0
- package/client/assets/useWindowTitle-DU8NlxIu.js.gz +0 -0
- package/client/assets/{useWindowTitle-DqdFTWns.js.map → useWindowTitle-DU8NlxIu.js.map} +1 -1
- package/client/assets/{validateEvent-P9sf7C10.js → validateEvent-3adKsP1N.js} +2 -2
- package/client/assets/validateEvent-3adKsP1N.js.br +0 -0
- package/client/assets/validateEvent-3adKsP1N.js.gz +0 -0
- package/client/assets/{validateEvent-P9sf7C10.js.map → validateEvent-3adKsP1N.js.map} +1 -1
- package/client/assets/{vendor-CCiSQ9k9.js → vendor-BoH5HFNN.js} +21 -21
- package/client/assets/vendor-BoH5HFNN.js.br +0 -0
- package/client/assets/vendor-BoH5HFNN.js.gz +0 -0
- package/client/assets/{vendor-CCiSQ9k9.js.map → vendor-BoH5HFNN.js.map} +1 -1
- package/client/assets/{viewLoader.utils-CmM-4-pk.js → viewLoader.utils-BPOG1xso.js} +2 -2
- package/client/assets/viewLoader.utils-BPOG1xso.js.br +0 -0
- package/client/assets/viewLoader.utils-BPOG1xso.js.gz +0 -0
- package/client/assets/{viewLoader.utils-CmM-4-pk.js.map → viewLoader.utils-BPOG1xso.js.map} +1 -1
- package/client/assets/viewUtils-DI8_kmUZ.js +2 -0
- package/client/assets/viewUtils-DI8_kmUZ.js.br +0 -0
- package/client/assets/viewUtils-DI8_kmUZ.js.gz +0 -0
- package/client/assets/viewUtils-DI8_kmUZ.js.map +1 -0
- package/client/index.html +3 -3
- package/package.json +1 -1
- package/server/index.cjs +90 -90
- package/client/assets/Backstage-CAjkmeJm.js +0 -2
- package/client/assets/Backstage-CAjkmeJm.js.br +0 -0
- package/client/assets/Backstage-CAjkmeJm.js.gz +0 -0
- package/client/assets/Backstage-CAjkmeJm.js.map +0 -1
- package/client/assets/Countdown-ChuA9az_.js +0 -2
- package/client/assets/Countdown-ChuA9az_.js.br +0 -0
- package/client/assets/Countdown-ChuA9az_.js.gz +0 -0
- package/client/assets/Countdown-ChuA9az_.js.map +0 -1
- package/client/assets/CustomTranslationModal-C3R_2T5s.js +0 -2
- package/client/assets/CustomTranslationModal-C3R_2T5s.js.br +0 -0
- package/client/assets/CustomTranslationModal-C3R_2T5s.js.gz +0 -0
- package/client/assets/DelayIndicator-vT7n8ypf.js +0 -2
- package/client/assets/DelayIndicator-vT7n8ypf.js.br +0 -0
- package/client/assets/DelayIndicator-vT7n8ypf.js.gz +0 -0
- package/client/assets/EditorFeatureWrapper-DHfuO3EA.js +0 -2
- package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.gz +0 -0
- package/client/assets/EditorUtils-BXko-IuN.css +0 -1
- package/client/assets/EditorUtils-BXko-IuN.css.br +0 -0
- package/client/assets/EditorUtils-BXko-IuN.css.gz +0 -0
- package/client/assets/EditorUtils-Da5ALK1P.js +0 -2
- package/client/assets/EditorUtils-Da5ALK1P.js.br +0 -0
- package/client/assets/EditorUtils-Da5ALK1P.js.gz +0 -0
- package/client/assets/EditorUtils-Da5ALK1P.js.map +0 -1
- package/client/assets/Empty-gWT_HMeu.js +0 -2
- package/client/assets/Empty-gWT_HMeu.js.br +0 -0
- package/client/assets/Empty-gWT_HMeu.js.gz +0 -0
- package/client/assets/EmptyPage-Dcbg6rmF.js +0 -2
- package/client/assets/EmptyPage-Dcbg6rmF.js.br +0 -0
- package/client/assets/EmptyPage-Dcbg6rmF.js.gz +0 -0
- package/client/assets/FollowButton-CSqJSvix.js +0 -2
- package/client/assets/FollowButton-CSqJSvix.js.br +0 -0
- package/client/assets/FollowButton-CSqJSvix.js.gz +0 -0
- package/client/assets/MessageControlExport-DPgqVb-4.css +0 -1
- package/client/assets/MessageControlExport-DPgqVb-4.css.br +0 -0
- package/client/assets/MessageControlExport-DPgqVb-4.css.gz +0 -0
- package/client/assets/MessageControlExport-lXK21piH.js +0 -2
- package/client/assets/MessageControlExport-lXK21piH.js.br +0 -0
- package/client/assets/MessageControlExport-lXK21piH.js.gz +0 -0
- package/client/assets/MessageControlExport-lXK21piH.js.map +0 -1
- package/client/assets/MilestoneEditor-906SVj5M.css +0 -1
- package/client/assets/MilestoneEditor-906SVj5M.css.br +0 -0
- package/client/assets/MilestoneEditor-906SVj5M.css.gz +0 -0
- package/client/assets/MilestoneEditor-Bge8xLrV.js +0 -2
- package/client/assets/MilestoneEditor-Bge8xLrV.js.br +0 -0
- package/client/assets/MilestoneEditor-Bge8xLrV.js.gz +0 -0
- package/client/assets/MilestoneEditor-Bge8xLrV.js.map +0 -1
- package/client/assets/Modal-BgJx3SNK.css +0 -1
- package/client/assets/Modal-BgJx3SNK.css.br +0 -0
- package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
- package/client/assets/Modal-C2sFA0zf.js +0 -2
- package/client/assets/Modal-C2sFA0zf.js.br +0 -0
- package/client/assets/Modal-C2sFA0zf.js.gz +0 -0
- package/client/assets/Modal-C2sFA0zf.js.map +0 -1
- package/client/assets/MultiPartProgressBar-D3jJZjb5.js +0 -2
- package/client/assets/MultiPartProgressBar-D3jJZjb5.js.br +0 -0
- package/client/assets/MultiPartProgressBar-D3jJZjb5.js.gz +0 -0
- package/client/assets/OperatorExport-BUhxjLUx.js +0 -2
- package/client/assets/OperatorExport-BUhxjLUx.js.br +0 -0
- package/client/assets/OperatorExport-BUhxjLUx.js.gz +0 -0
- package/client/assets/OperatorExport-BUhxjLUx.js.map +0 -1
- package/client/assets/OperatorExport-QyLn8tmf.css +0 -1
- package/client/assets/OperatorExport-QyLn8tmf.css.br +0 -0
- package/client/assets/OperatorExport-QyLn8tmf.css.gz +0 -0
- package/client/assets/OverviewWrapper-BveJ6GjK.js +0 -2
- package/client/assets/OverviewWrapper-BveJ6GjK.js.br +0 -0
- package/client/assets/OverviewWrapper-BveJ6GjK.js.gz +0 -0
- package/client/assets/OverviewWrapper-BveJ6GjK.js.map +0 -1
- package/client/assets/OverviewWrapper-a18gep4m.css +0 -1
- package/client/assets/OverviewWrapper-a18gep4m.css.br +0 -0
- package/client/assets/OverviewWrapper-a18gep4m.css.gz +0 -0
- package/client/assets/ProjectInfo-z4k3cipS.js +0 -2
- package/client/assets/ProjectInfo-z4k3cipS.js.br +0 -0
- package/client/assets/ProjectInfo-z4k3cipS.js.gz +0 -0
- package/client/assets/ProtectRoute-CrcWfOlG.js +0 -2
- package/client/assets/ProtectRoute-CrcWfOlG.js.br +0 -0
- package/client/assets/ProtectRoute-CrcWfOlG.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-CMTscjjR.css.br +0 -0
- package/client/assets/ProtectedCuesheet-CMTscjjR.css.gz +0 -0
- package/client/assets/ProtectedCuesheet-Deo4Aw6f.js +0 -2
- package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.br +0 -0
- package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.map +0 -1
- package/client/assets/ProtectedEditor-BoiAT_IR.css +0 -1
- package/client/assets/ProtectedEditor-BoiAT_IR.css.br +0 -0
- package/client/assets/ProtectedEditor-BoiAT_IR.css.gz +0 -0
- package/client/assets/ProtectedEditor-C_SYWpL2.js +0 -3
- package/client/assets/ProtectedEditor-C_SYWpL2.js.br +0 -0
- package/client/assets/ProtectedEditor-C_SYWpL2.js.gz +0 -0
- package/client/assets/ProtectedEditor-C_SYWpL2.js.map +0 -1
- package/client/assets/RundownEntry-3gFEEUnw.css +0 -1
- package/client/assets/RundownEntry-3gFEEUnw.css.br +0 -0
- package/client/assets/RundownEntry-3gFEEUnw.css.gz +0 -0
- package/client/assets/RundownEntry-D61IqkXb.js +0 -2
- package/client/assets/RundownEntry-D61IqkXb.js.br +0 -0
- package/client/assets/RundownEntry-D61IqkXb.js.gz +0 -0
- package/client/assets/RundownEntry-D61IqkXb.js.map +0 -1
- package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
- package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
- package/client/assets/RundownExport-C6YhMGOC.js +0 -3
- package/client/assets/RundownExport-C6YhMGOC.js.br +0 -0
- package/client/assets/RundownExport-C6YhMGOC.js.gz +0 -0
- package/client/assets/RundownExport-C6YhMGOC.js.map +0 -1
- package/client/assets/Select-CedN80WS.js +0 -2
- package/client/assets/Select-CedN80WS.js.br +0 -0
- package/client/assets/Select-CedN80WS.js.gz +0 -0
- package/client/assets/Studio-DUzPBS6P.js +0 -2
- package/client/assets/Studio-DUzPBS6P.js.br +0 -0
- package/client/assets/Studio-DUzPBS6P.js.gz +0 -0
- package/client/assets/Studio-DUzPBS6P.js.map +0 -1
- package/client/assets/StyleEditor-D2z65PB7.js.br +0 -0
- package/client/assets/StyleEditor-D2z65PB7.js.gz +0 -0
- package/client/assets/SuperscriptTime-CIrcMcyg.js +0 -2
- package/client/assets/SuperscriptTime-CIrcMcyg.js.br +0 -0
- package/client/assets/SuperscriptTime-CIrcMcyg.js.gz +0 -0
- package/client/assets/TimeElements-BcQdm4ZV.css +0 -1
- package/client/assets/TimeElements-BcQdm4ZV.css.br +0 -0
- package/client/assets/TimeElements-BcQdm4ZV.css.gz +0 -0
- package/client/assets/TimeElements-CALNfv6u.js +0 -2
- package/client/assets/TimeElements-CALNfv6u.js.br +0 -0
- package/client/assets/TimeElements-CALNfv6u.js.gz +0 -0
- package/client/assets/TimeElements-CALNfv6u.js.map +0 -1
- package/client/assets/TimeInput-BrVdiuOQ.css.br +0 -0
- package/client/assets/TimeInput-BrVdiuOQ.css.gz +0 -0
- package/client/assets/TimeInput-Dg1naiy3.js +0 -2
- package/client/assets/TimeInput-Dg1naiy3.js.br +0 -0
- package/client/assets/TimeInput-Dg1naiy3.js.gz +0 -0
- package/client/assets/TimelinePage-BJav6PAb.css +0 -1
- package/client/assets/TimelinePage-BJav6PAb.css.br +0 -0
- package/client/assets/TimelinePage-BJav6PAb.css.gz +0 -0
- package/client/assets/TimelinePage-Cwm0svjN.js +0 -2
- package/client/assets/TimelinePage-Cwm0svjN.js.br +0 -0
- package/client/assets/TimelinePage-Cwm0svjN.js.gz +0 -0
- package/client/assets/TimelinePage-Cwm0svjN.js.map +0 -1
- package/client/assets/Timer-BVXskRjc.js +0 -2
- package/client/assets/Timer-BVXskRjc.js.br +0 -0
- package/client/assets/Timer-BVXskRjc.js.gz +0 -0
- package/client/assets/Timer-BVXskRjc.js.map +0 -1
- package/client/assets/Timer-BvEmZbmF.css.br +0 -0
- package/client/assets/Timer-BvEmZbmF.css.gz +0 -0
- package/client/assets/TimerControlExport-C8ECtLBd.js +0 -2
- package/client/assets/TimerControlExport-C8ECtLBd.js.br +0 -0
- package/client/assets/TimerControlExport-C8ECtLBd.js.gz +0 -0
- package/client/assets/TimerControlExport-D8kqHQB0.css.br +0 -0
- package/client/assets/TimerControlExport-D8kqHQB0.css.gz +0 -0
- package/client/assets/TitleCard-CZl9wSHS.js +0 -2
- package/client/assets/TitleCard-CZl9wSHS.js.br +0 -0
- package/client/assets/TitleCard-CZl9wSHS.js.gz +0 -0
- package/client/assets/Tooltip-D9XRnwOW.js.br +0 -4
- package/client/assets/Tooltip-D9XRnwOW.js.gz +0 -0
- package/client/assets/ViewLogo-_3Z1hIHi.js +0 -2
- package/client/assets/ViewLogo-_3Z1hIHi.js.br +0 -0
- package/client/assets/ViewLogo-_3Z1hIHi.js.gz +0 -0
- package/client/assets/ViewParamsEditor-1Ok39npF.css +0 -1
- package/client/assets/ViewParamsEditor-1Ok39npF.css.br +0 -0
- package/client/assets/ViewParamsEditor-1Ok39npF.css.gz +0 -0
- package/client/assets/ViewParamsEditor-Bca1TIDW.js +0 -2
- package/client/assets/ViewParamsEditor-Bca1TIDW.js.br +0 -0
- package/client/assets/ViewParamsEditor-Bca1TIDW.js.gz +0 -0
- package/client/assets/ViewParamsEditor-Bca1TIDW.js.map +0 -1
- package/client/assets/dateConfig-DRQGMWDF.js.br +0 -0
- package/client/assets/dateConfig-DRQGMWDF.js.gz +0 -0
- package/client/assets/editorSettings-BU0pTMSY.js.br +0 -0
- package/client/assets/editorSettings-BU0pTMSY.js.gz +0 -0
- package/client/assets/getProgress-Cw79NL_O.js.br +0 -0
- package/client/assets/getProgress-Cw79NL_O.js.gz +0 -0
- package/client/assets/index-BQEUaoAf.js +0 -3
- package/client/assets/index-BQEUaoAf.js.br +0 -0
- package/client/assets/index-BQEUaoAf.js.gz +0 -0
- package/client/assets/index-BQEUaoAf.js.map +0 -1
- package/client/assets/index-De0uf0Ta.css.br +0 -0
- package/client/assets/index-De0uf0Ta.css.gz +0 -0
- package/client/assets/offset-DJAHqjFW.js +0 -2
- package/client/assets/offset-DJAHqjFW.js.br +0 -0
- package/client/assets/offset-DJAHqjFW.js.gz +0 -0
- package/client/assets/offset-DJAHqjFW.js.map +0 -1
- package/client/assets/parseUserTime-BeTKj08M.js +0 -2
- package/client/assets/parseUserTime-BeTKj08M.js.br +0 -0
- package/client/assets/parseUserTime-BeTKj08M.js.gz +0 -0
- package/client/assets/playbackstate-B_khF6xU.js +0 -2
- package/client/assets/playbackstate-B_khF6xU.js.br +0 -0
- package/client/assets/playbackstate-B_khF6xU.js.gz +0 -0
- package/client/assets/presentation.utils-KwY-ACf7.js.br +0 -0
- package/client/assets/presentation.utils-KwY-ACf7.js.gz +0 -0
- package/client/assets/rundownUtils-BZHazkXR.js.br +0 -0
- package/client/assets/rundownUtils-BZHazkXR.js.gz +0 -0
- package/client/assets/useCustomFields-DqCYz8Kt.js +0 -2
- package/client/assets/useCustomFields-DqCYz8Kt.js.br +0 -0
- package/client/assets/useCustomFields-DqCYz8Kt.js.gz +0 -0
- package/client/assets/useFollowComponent-Ctfhf2or.js.br +0 -0
- package/client/assets/useFollowComponent-Ctfhf2or.js.gz +0 -0
- package/client/assets/useProjectData-C1hVamxc.js.br +0 -0
- package/client/assets/useProjectData-C1hVamxc.js.gz +0 -0
- package/client/assets/useReport-B4dMYcNL.js +0 -2
- package/client/assets/useReport-B4dMYcNL.js.br +0 -0
- package/client/assets/useReport-B4dMYcNL.js.gz +0 -0
- package/client/assets/useRundown-BfpjcCEJ.js +0 -2
- package/client/assets/useRundown-BfpjcCEJ.js.br +0 -0
- package/client/assets/useRundown-BfpjcCEJ.js.gz +0 -0
- package/client/assets/useRundown-BfpjcCEJ.js.map +0 -1
- package/client/assets/useWindowTitle-DqdFTWns.js +0 -2
- package/client/assets/useWindowTitle-DqdFTWns.js.br +0 -0
- package/client/assets/useWindowTitle-DqdFTWns.js.gz +0 -0
- package/client/assets/validateEvent-P9sf7C10.js.br +0 -3
- package/client/assets/validateEvent-P9sf7C10.js.gz +0 -0
- package/client/assets/vendor-CCiSQ9k9.js.br +0 -0
- package/client/assets/vendor-CCiSQ9k9.js.gz +0 -0
- package/client/assets/viewLoader.utils-CmM-4-pk.js.br +0 -0
- package/client/assets/viewLoader.utils-CmM-4-pk.js.gz +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,h as m,bj as Z,bk as oe,am as de,bl as ue,bm as U,bn as K,bo as me,bp as he,ah as xe,ba as je,bq as be}from"./vendor-CCiSQ9k9.js";import{L as g,T as p}from"./EditorUtils-Da5ALK1P.js";import{T as S,A as W,s as ge}from"./TimeInput-Dg1naiy3.js";import{u as T,m as ve}from"./dateConfig-DRQGMWDF.js";import{u as J}from"./useCustomFields-DqCYz8Kt.js";import{T as O,E as P}from"./validateEvent-P9sf7C10.js";import{af as B,aA as fe,i as A,ai as F,r as ye,y as w,T as H,B as _e,b8 as pe,w as z,bg as ee}from"./index-BQEUaoAf.js";import{S as R}from"./Select-CedN80WS.js";import{S as ae}from"./useProjectData-C1hVamxc.js";import{T as I}from"./Tooltip-D9XRnwOW.js";import{p as ie}from"./parseUserTime-BeTKj08M.js";import{S as Q,u as re,T as te}from"./Modal-C2sFA0zf.js";import{g as Ee}from"./offset-DJAHqjFW.js";import{T as ke}from"./editorSettings-BU0pTMSY.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="0bb767ec-02a3-42da-88b2-9b7c211addb0",t._sentryDebugIdIdentifier="sentry-dbid-0bb767ec-02a3-42da-88b2-9b7c211addb0")}catch{}})();var N=(t=>(t.onLoad="onLoad",t.onStart="onStart",t.onPause="onPause",t.onStop="onStop",t.onClock="onClock",t.onUpdate="onUpdate",t.onFinish="onFinish",t.onWarning="onWarning",t.onDanger="onDanger",t))(N||{});const Ce=Object.keys(N);function Ne(t){return t.replaceAll(" ","").replaceAll(",",".")}const Te="_imageContainer_1k5qa_17",we="_imageOverlay_1k5qa_25",ne={imageContainer:Te,imageOverlay:we};function Ie({src:t}){return e.jsxs("div",{className:ne.imageContainer,children:[!!t&&e.jsx("img",{loading:"lazy",src:t}),e.jsx("div",{className:ne.imageOverlay})]})}function De({value:t,inputref:s,...a}){return m.useEffect(()=>{const n=s.current;return Z(s.current),()=>{Z.destroy(n)}},[s,t]),e.jsx(ke,{ref:s,value:t,...a})}function le(t,s,a,n){const[o,l]=m.useState(t),i=m.useRef(!1);m.useEffect(()=>{l(typeof t>"u"?"":t)},[t]);const c=m.useCallback(d=>{d!==o&&l(d)},[o]),h=m.useCallback(d=>{var j;if(d===t&&!(n!=null&&n.allowSubmitSameValue))(j=n==null?void 0:n.onCancelUpdate)==null||j.call(n);else{const r=d.trim();s(r),r!==d&&l(r)}setTimeout(()=>{var r,f,y;n!=null&&n.allowKeyboardNavigation?(f=(r=a.current)==null?void 0:r.parentElement)==null||f.focus():(y=a.current)==null||y.blur()})},[t,n,a,s]),x=m.useCallback(()=>{var d;l(t),a.current&&(a.current.value=t),(d=n==null?void 0:n.onCancelUpdate)==null||d.call(n),setTimeout(()=>{var j;return(j=a.current)==null?void 0:j.blur()})},[t,n,a]),b=m.useMemo(()=>{const d=[["Escape",r=>{r.preventDefault(),x()},{preventDefault:!0}]];n!=null&&n.submitOnEnter&&d.push(["Enter",()=>{i.current=!0,h(o),setTimeout(()=>{i.current=!1},0)}]),n!=null&&n.submitOnCtrlEnter&&d.push(["mod + Enter",()=>{i.current=!0,h(o),setTimeout(()=>{i.current=!1},0)}]);const j=oe(d);return r=>{(r.key==="ArrowLeft"||r.key==="ArrowRight"||r.key==="ArrowUp"||r.key==="ArrowDown")&&r.stopPropagation(),j(r)}},[x,h,n==null?void 0:n.submitOnCtrlEnter,n==null?void 0:n.submitOnEnter,o]);return{value:o,onChange:d=>c(d.target.value),onBlur:d=>{i.current||h(d.target.value)},onKeyDown:b}}function G({className:t,field:s,label:a,initialValue:n,style:o,submitHandler:l}){const i=m.useRef(null),c=m.useCallback(j=>l(s,j),[s,l]),{value:h,onChange:x,onBlur:b,onKeyDown:d}=le(n,c,i,{submitOnCtrlEnter:!0});return e.jsxs("div",{children:[e.jsx(g,{className:t,htmlFor:s,style:o,children:a}),e.jsx(De,{id:s,inputref:i,rows:1,"data-testid":"input-textarea",fluid:!0,value:h,onChange:x,onBlur:b,onKeyDown:d})]})}function L({className:t,field:s,label:a,initialValue:n,style:o,submitHandler:l,maxLength:i,placeholder:c}){const h=m.useRef(null),x=m.useCallback(f=>l(s,f),[s,l]),{value:b,onChange:d,onBlur:j,onKeyDown:r}=le(n,x,h,{submitOnEnter:!0});return e.jsxs("div",{children:[e.jsx(g,{className:t,htmlFor:s,style:o,children:a}),e.jsx(B,{id:s,ref:h,maxLength:i,fluid:!0,"data-testid":"input-textfield",value:b,placeholder:c,onChange:d,onBlur:j,onKeyDown:r})]})}const Le="_rundownEditor_nbvvy_19",Se="_content_nbvvy_29",Fe="_column_nbvvy_48",Ae="_decorated_nbvvy_57",Oe="_delayLabel_nbvvy_65",He="_switchLabel_nbvvy_73",$e="_inline_nbvvy_83",Ve="_splitTwo_nbvvy_89",qe="_splitThree_nbvvy_96",Me="_tooltipIcon_nbvvy_103",We="_customImage_nbvvy_110",Re="_textLikeInput_nbvvy_117",Be="_inactive_nbvvy_125",Ge="_active_nbvvy_129",u={rundownEditor:Le,content:Se,column:Fe,decorated:Ae,delayLabel:Oe,switchLabel:He,inline:$e,splitTwo:Ve,splitThree:qe,tooltipIcon:Me,customImage:We,textLikeInput:Re,inactive:Be,active:Ge};function X({fields:t,handleSubmit:s,entry:a}){return e.jsx(m.Fragment,{children:Object.keys(t).map(n=>{const o=`${a.id}-${n}`,l=`custom-${n}`,i=a.custom[n]??"",{backgroundColor:c,color:h}=fe(t[n].colour),x=t[n].label;return t[n].type==="text"?e.jsx(G,{field:l,label:x,initialValue:i,submitHandler:s,className:u.decorated,style:{"--decorator-bg":c,"--decorator-color":h}},o):t[n].type==="image"?e.jsxs("div",{className:u.customImage,children:[e.jsx(L,{field:l,label:x,initialValue:i,placeholder:"Paste image URL",submitHandler:s,className:u.decorated,maxLength:255,style:{"--decorator-bg":c,"--decorator-color":h}},o),e.jsx(Ie,{src:i})]},o):null})})}const Pe="_inputGroup_1e1jq_17",Ue="_delayed_1e1jq_24",se={inputGroup:Pe,delayed:Ue};function q({hasDelay:t,children:s}){return e.jsx("div",{className:A([se.inputGroup,t&&se.delayed]),children:s})}const Ke="_fourtyfive_w3aej_13",ze="_timerNote_w3aej_21",Je="_inactive_w3aej_27",Qe="_active_w3aej_31",C={fourtyfive:Ke,timerNote:ze,inactive:Je,active:Qe},Xe=m.memo(Ye);function Ye({eventId:t,countToEnd:s,timeStart:a,timeEnd:n,duration:o,timeStrategy:l,linkStart:i,delay:c,showLabels:h}){const{updateEntry:x,updateTimer:b}=T(),d=(k,_)=>{b(t,k,_)},j=k=>{x({id:t,timeStrategy:k})},r=k=>{x({id:t,linkStart:k})},f=[];a+o>ye&&f.push("Over midnight"),s&&f.push("Count to End");const y=c!==0,v=l===O.LockEnd,E=l===O.LockDuration;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[h&&e.jsx(g,{className:C.sectionTitle,children:"Start time"}),e.jsxs(q,{hasDelay:y,children:[e.jsx(S,{name:"timeStart",submitHandler:d,time:a,placeholder:"Start",align:"left",disabled:i}),e.jsx(I,{text:"Link start to previous end",onClick:()=>r(!i),render:e.jsx(F,{variant:"subtle-white",className:i?C.active:C.inactive}),children:e.jsx("span",{className:C.fourtyfive,children:i?e.jsx(de,{}):e.jsx(ue,{})})})]})]}),e.jsxs("div",{children:[h&&e.jsx(g,{children:"End time"}),e.jsxs(q,{hasDelay:y,children:[e.jsx(S,{name:"timeEnd",submitHandler:d,time:n,placeholder:"End",align:"left",disabled:E}),e.jsx(I,{text:"Lock end",render:e.jsx(F,{variant:"subtle-white",className:v?C.active:C.inactive}),onClick:()=>j(O.LockEnd),"data-testid":"lock__end",children:v?e.jsx(U,{}):e.jsx(K,{})})]})]}),e.jsxs("div",{children:[h&&e.jsx(g,{children:"Duration"}),e.jsxs(q,{hasDelay:y,children:[e.jsx(S,{name:"duration",submitHandler:d,time:o,placeholder:"Duration",align:"left",disabled:v}),e.jsx(I,{text:"Lock duration",render:e.jsx(F,{variant:"subtle-white",className:E?C.active:C.inactive}),onClick:()=>j(O.LockDuration),"data-testid":"lock__duration",children:E?e.jsx(U,{}):e.jsx(K,{})})]})]}),f.length>0&&e.jsx(I,{text:f.join(" - "),className:C.timerNote,"data-testid":"event-warning",render:e.jsx("span",{}),children:e.jsx(me,{})})]})}const Ze=m.memo(et);function et({eventId:t,timeStart:s,timeEnd:a,duration:n,timeStrategy:o,linkStart:l,countToEnd:i,delay:c,endAction:h,timerType:x,timeWarning:b,timeDanger:d}){const{updateEntry:j}=T(),r=(v,E)=>{if(v==="countToEnd"){j({id:t,countToEnd:E});return}if(v==="timeWarning"||v==="timeDanger"){const k=ie(E);j({id:t,[v]:k});return}if(v==="timerType"||v==="endAction"){j({id:t,[v]:E});return}},y=c!==0?`Event is ${ve(c,"expanded")}. New schedule ${w(s+c)} → ${w(a+c)}`:"";return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:u.column,children:[e.jsx(p,{children:"Event schedule"}),e.jsxs("div",{children:[e.jsx("div",{className:u.inline,children:e.jsx(Xe,{eventId:t,timeStart:s,timeEnd:a,duration:n,timeStrategy:o,linkStart:l,delay:c,countToEnd:i,showLabels:!0})}),e.jsx("div",{className:u.delayLabel,children:y})]})]}),e.jsxs("div",{className:u.column,children:[e.jsx(p,{children:"Event Behaviour"}),e.jsxs("div",{className:u.splitTwo,children:[e.jsxs("div",{children:[e.jsx(g,{htmlFor:"endAction",children:"End Action"}),e.jsx(R,{value:h,onValueChange:v=>r("endAction",v),options:[{value:P.None,label:"None"},{value:P.LoadNext,label:"Load next event"},{value:P.PlayNext,label:"Play next event"}]})]}),e.jsxs("div",{children:[e.jsx(g,{htmlFor:"countToEnd",children:"Count to End"}),e.jsxs(g,{className:u.switchLabel,children:[e.jsx(ae,{id:"countToEnd",checked:i,onCheckedChange:v=>r("countToEnd",v)}),i?"On":"Off"]})]})]})]}),e.jsxs("div",{className:u.column,children:[e.jsx(p,{children:e.jsxs(I,{text:"Changes how the timer is displayed in different views. It is not reflected in the rundown",render:e.jsx("span",{}),children:["Display Options",e.jsx(he,{className:u.tooltipIcon})]})}),e.jsxs("div",{className:u.splitTwo,children:[e.jsxs("div",{children:[e.jsx(g,{htmlFor:"timerType",children:"Timer Type"}),e.jsx(R,{value:x,onValueChange:v=>r("timerType",v),options:[{value:H.CountDown,label:"Count down"},{value:H.CountUp,label:"Count up"},{value:H.Clock,label:"Clock"},{value:H.None,label:"None"}]})]}),e.jsxs("div",{className:u.inline,children:[e.jsxs("div",{children:[e.jsx(g,{htmlFor:"timeWarning",children:"Warning Time"}),e.jsx(S,{id:"timeWarning",name:"timeWarning",submitHandler:r,time:b,placeholder:"Duration"})]}),e.jsxs("div",{children:[e.jsx(g,{htmlFor:"timeDanger",children:"Danger Time"}),e.jsx(S,{id:"timeDanger",name:"timeDanger",submitHandler:r,time:d,placeholder:"Duration"})]})]})]})]})]})}const tt=m.memo(nt);function nt({eventId:t,cue:s,flag:a,title:n,note:o,colour:l}){const{updateEntry:i}=T(),c=(b,d)=>{i({id:t,cue:Ne(d)})},h=b=>{i({id:t,flag:b})},x=(b,d)=>{i({id:t,[b]:d})};return e.jsxs("div",{className:u.column,children:[e.jsx(p,{children:"Event Data"}),e.jsxs("div",{className:u.splitThree,children:[e.jsxs("div",{children:[e.jsx(g,{htmlFor:"eventId",children:"Event ID (read only)"}),e.jsx(B,{id:"eventId","data-testid":"input-textfield",value:t,readOnly:!0,fluid:!0})]}),e.jsx(L,{field:"cue",label:"Cue",initialValue:s,submitHandler:c,maxLength:10}),e.jsxs("div",{children:[e.jsx(g,{htmlFor:"flag",children:"Flag"}),e.jsxs(g,{className:u.switchLabel,children:[e.jsx(ae,{id:"flag",checked:a,onCheckedChange:h}),a?"On":"Off"]})]})]}),e.jsxs("div",{children:[e.jsx(g,{children:"Colour"}),e.jsx(Q,{name:"colour",value:l,handleChange:x})]}),e.jsx(L,{field:"title",label:"Title",initialValue:n,submitHandler:x}),e.jsx(G,{field:"note",label:"Note",initialValue:o,submitHandler:x})]})}const st=[N.onLoad,N.onStart,N.onPause,N.onFinish,N.onWarning,N.onDanger],at="_triggerForm_l7413_17",it="_trigger_l7413_17",rt="_errorLabel_l7413_38",lt="_success_l7413_42",M={triggerForm:at,trigger:it,errorLabel:rt,success:lt};function ct({triggers:t,eventId:s}){const a=t.length>0;return e.jsxs(e.Fragment,{children:[a&&e.jsx(dt,{triggers:t,eventId:s}),e.jsx(ot,{triggers:t,eventId:s})]})}function ot({eventId:t,triggers:s}){const{data:a}=re(),{updateEntry:n}=T(),[o,l]=m.useState(void 0),[i,c]=m.useState(N.onStart),h=(r,f)=>{const y=s??new Array,v=pe();y.push({id:v,title:"",trigger:r,automationId:f}),n({id:t,triggers:y})},b=((r,f)=>{if(f===void 0)return"Select an automation";if(!Object.keys(a.automations).includes(f))return"This automation does not exist";if(s!==void 0)return Object.values(s).some(y=>y.automationId===f&&y.trigger===r)?"Automation can only be used once":void 0})(i,o),d=m.useMemo(()=>[{value:null,label:"Select Trigger"},...st.map(r=>({value:r,label:r}))],[]),j=m.useMemo(()=>[{value:null,label:"Select Automation"},...Object.values(a.automations).map(({id:r,title:f})=>({value:r,label:f}))],[a.automations]);return e.jsxs("div",{className:M.triggerForm,children:[e.jsx(R,{value:i,onValueChange:r=>{r!==null&&c(r)},options:d}),e.jsx(R,{value:o??null,onValueChange:r=>{r!==null&&l(r)},options:j}),e.jsx(_e,{disabled:b!==void 0,onClick:()=>o&&h(i,o),children:"Add"}),b!==void 0?e.jsx(I,{text:b,render:e.jsx("span",{}),children:e.jsx(je,{className:M.errorLabel})}):e.jsx(be,{className:M.success})]})}function dt({eventId:t,triggers:s}){const{updateEntry:a}=T(),{data:n}=re(),o=m.useCallback(i=>{const c=s.filter(h=>h.id!==i);a({id:t,triggers:c})},[t,s,a]),l={};return Ce.forEach(i=>{const c=s.filter(h=>h.trigger===i);c.length&&Object.assign(l,{[i]:c})}),e.jsx("div",{children:Object.entries(l).map(([i,c])=>e.jsx(m.Fragment,{children:c.map(h=>{var j;const{id:x,automationId:b}=h,d=((j=n.automations[b])==null?void 0:j.title)??"<MISSING AUTOMATION>";return e.jsxs("div",{className:M.trigger,children:[e.jsx(te,{children:i}),e.jsx(te,{children:d}),e.jsx(F,{variant:"ghosted-destructive",onClick:()=>o(x),children:e.jsx(xe,{})})]},x)})},i))})}function At({event:t}){const{data:s}=J(),{updateEntry:a}=T(),n=window.location.pathname.includes("editor"),o=m.useCallback((l,i)=>{if(l.startsWith("custom-")){const c=l.split("custom-")[1];a({id:t.id,custom:{[c]:i}})}else a({id:t.id,[l]:i})},[t.id,a]);return e.jsxs("div",{className:u.content,children:[e.jsx(Ze,{eventId:t.id,timeStart:t.timeStart,timeEnd:t.timeEnd,duration:t.duration,timeStrategy:t.timeStrategy,linkStart:t.linkStart,countToEnd:t.countToEnd,delay:t.delay,endAction:t.endAction,timerType:t.timerType,timeWarning:t.timeWarning,timeDanger:t.timeDanger},`${t.id}-times`),e.jsx(tt,{eventId:t.id,cue:t.cue,flag:t.flag,title:t.title,note:t.note,colour:t.colour},`${t.id}-titles`),e.jsxs("div",{className:u.column,children:[e.jsxs(p,{children:["Custom Fields",n&&e.jsx(W,{search:"settings=manage__custom",children:"Manage Custom Fields"})]}),e.jsx(X,{fields:s,handleSubmit:o,entry:t})]}),e.jsxs("div",{className:u.column,children:[e.jsxs(p,{children:["Automations",n&&e.jsx(W,{search:"settings=automation",children:"Manage Automations"})]}),e.jsx(ct,{triggers:t.triggers,eventId:t.id})]})]})}const ut="_blink_1qqxl_1",mt="_fourtyfive_1qqxl_13",ht="_textInput_1qqxl_18",xt="_under_1qqxl_31",jt="_over_1qqxl_34",bt="_muted_1qqxl_37",gt="_disabled_1qqxl_40",$={blink:ut,fourtyfive:mt,textInput:ht,under:xt,over:jt,muted:bt,disabled:gt},ce=m.forwardRef(({offset:t,muted:s,disabled:a,children:n,className:o,...l},i)=>{const c=m.useRef(null),h=A([$.textInput,t&&$[t],s&&$.muted,a&&$.disabled,o]);return m.useImperativeHandle(i,()=>({focusParentElement(){var x,b;(b=(x=c.current)==null?void 0:x.parentElement)==null||b.focus()}})),e.jsx("div",{className:h,tabIndex:a?-1:0,...l,ref:c,children:n})});ce.displayName="TextLikeInput";const V=m.memo(ce);function vt({id:t,name:s,submitHandler:a,time:n,emptyDisplay:o,placeholder:l,disabled:i,align:c="center",className:h}){const x=m.useRef(null),[b,d]=m.useState(""),j=m.useRef(!1),r=m.useCallback(()=>{typeof n!="number"||isNaN(n)?d(o):d(w(n))},[o,n]),f=m.useCallback(()=>{var _;(_=x.current)==null||_.select()},[]),y=m.useCallback(_=>{if(_===""&&n===null)return!1;const D=ie(_);return D===n?!1:(a(s,D),!0)},[s,a,n]),v=m.useCallback(_=>{y(_)||r()},[y,r]),E=m.useCallback(_=>{var D,Y;_.key==="Enter"&&((D=x.current)==null||D.blur()),_.key==="Escape"&&(j.current=!0,(Y=x.current)==null||Y.blur(),r())},[r]),k=m.useCallback(_=>{if(j.current){j.current=!1;return}v(_.target.value)},[v]);return m.useEffect(()=>{r()},[r]),e.jsx(B,{id:t,disabled:i,ref:x,"data-testid":`time-input-${s}`,className:A([ge.timeInput,h]),placeholder:l,onFocus:f,onChange:_=>d(_.target.value),onBlur:k,onKeyDown:E,value:b,maxLength:8,autoComplete:"off",style:{textAlign:c}})}function ft({duration:t,targetDuration:s,submitHandler:a}){const n=s!==null;return e.jsxs("div",{children:[e.jsx(g,{htmlFor:"targetDuration",children:"Target duration"}),e.jsxs(q,{hasDelay:n&&s!==t,children:[e.jsx(vt,{name:"targetDuration",time:s,submitHandler:a,emptyDisplay:z,className:n?"":u.inactive}),e.jsx(I,{text:"Lock to target duration",className:A([u.timeAction,n&&u.active]),onClick:()=>a("targetDuration",n?null:t),"data-testid":"lock__duration",render:e.jsx(F,{variant:"subtle-white",className:n?u.active:u.inactive}),children:n?e.jsx(U,{}):e.jsx(K,{})})]})]})}function Ot({group:t}){const{data:s}=J(),{updateEntry:a}=T(),n=m.useCallback((c,h)=>{if(typeof c=="string"&&c.startsWith("custom-")){const x=c.split("custom-")[1];a({id:t.id,custom:{[x]:h}});return}return a(c==="targetDuration"?{id:t.id,targetDuration:h}:{id:t.id,[c]:h})},[t.id,a]),o=window.location.pathname.includes("editor"),l=t.targetDuration===null?null:t.duration-t.targetDuration,i=l!==null?Ee(l):null;return e.jsxs("div",{className:u.content,children:[e.jsxs("div",{className:u.column,children:[e.jsx(p,{children:"Group schedule"}),e.jsxs("div",{className:u.inline,children:[e.jsxs("div",{children:[e.jsx(g,{children:"First event start"}),e.jsx(V,{className:u.textLikeInput,disabled:!0,children:w(t.timeStart,{fallback:ee})})]}),e.jsxs("div",{children:[e.jsx(g,{children:"Last event end"}),e.jsx(V,{className:u.textLikeInput,disabled:!0,children:w(t.timeEnd,{fallback:ee})})]}),e.jsxs("div",{children:[e.jsx(g,{htmlFor:"duration",children:"Scheduled duration"}),e.jsx(V,{className:u.textLikeInput,disabled:!0,children:w(t.duration,{fallback:z})})]})]}),e.jsxs("div",{className:u.inline,children:[e.jsxs("div",{children:[e.jsx(g,{htmlFor:"eventId",children:"Plan offset"}),e.jsxs(V,{offset:i,className:A([u.textLikeInput,l===null&&u.inactive]),disabled:!0,children:[l!==null&&l>0?"+":"",w(l,{fallback:z})]})]}),e.jsx(ft,{duration:t.duration,targetDuration:t.targetDuration,submitHandler:n})]})]}),e.jsxs("div",{className:u.column,children:[e.jsx(p,{children:"Group data"}),e.jsxs("div",{children:[e.jsx(g,{children:"Colour"}),e.jsx(Q,{name:"colour",value:t.colour,handleChange:n})]}),e.jsx(L,{field:"title",label:"Title",initialValue:t.title,submitHandler:n}),e.jsx(G,{field:"note",label:"Note",initialValue:t.note,submitHandler:n})]}),e.jsxs("div",{className:u.column,children:[e.jsxs(p,{children:["Custom Fields",o&&e.jsx(W,{search:"settings=manage__custom",children:"Manage Custom Fields"})]}),e.jsx(X,{fields:s,handleSubmit:n,entry:t})]})]})}function Ht({milestone:t}){const{data:s}=J(),{updateEntry:a}=T(),n=m.useCallback((l,i)=>{if(typeof l=="string"&&l.startsWith("custom-")){const c=l.split("custom-")[1];a({id:t.id,custom:{[c]:i}});return}return a({id:t.id,[l]:i})},[t.id,a]),o=window.location.pathname.includes("editor");return e.jsxs("div",{className:u.content,children:[e.jsxs("div",{className:u.column,children:[e.jsx(p,{children:"Milestone data"}),e.jsxs("div",{className:u.splitTwo,children:[e.jsxs("div",{children:[e.jsx(g,{htmlFor:"entryId",children:"Milestone ID (read only)"}),e.jsx(B,{id:"entryId","data-testid":"input-textfield",value:t.id,readOnly:!0,fluid:!0})]}),e.jsx(L,{field:"cue",label:"Cue",initialValue:t.cue,submitHandler:n,maxLength:10})]}),e.jsxs("div",{children:[e.jsx(g,{children:"Colour"}),e.jsx(Q,{name:"colour",value:t.colour,handleChange:n})]}),e.jsx(L,{field:"title",label:"Title",initialValue:t.title,submitHandler:n}),e.jsx(G,{field:"note",label:"Note",initialValue:t.note,submitHandler:n})]}),e.jsxs("div",{className:u.column,children:[e.jsxs(p,{children:["Custom Fields",o&&e.jsx(W,{search:"settings=manage__custom",children:"Manage Custom Fields"})]}),e.jsx(X,{fields:s,handleSubmit:n,entry:t})]})]})}export{De as A,At as E,Ot as G,Ht as M,V as T,Xe as a,u as s,le as u};
|
|
2
|
-
//# sourceMappingURL=MilestoneEditor-Bge8xLrV.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MilestoneEditor-Bge8xLrV.js","sources":["../../../../packages/types/src/definitions/core/TimerLifecycle.type.ts","../../../../packages/utils/src/cue-utils/cueUtils.ts","../../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"],"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 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 { useEntryActions } from '../../../common/hooks/useEntryAction';\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 } = useEntryActions();\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>\n {showLabels && <Editor.Label className={style.sectionTitle}>Start time</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>\n {showLabels && <Editor.Label>End time</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>\n {showLabels && <Editor.Label>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 { useEntryActions } from '../../../../common/hooks/useEntryAction';\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 } = useEntryActions();\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) => handleSubmit('endAction', value)}\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) => handleSubmit('timerType', value)}\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 { useEntryActions } from '../../../../common/hooks/useEntryAction';\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 } = useEntryActions();\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 { useEntryActions } from '../../../../common/hooks/useEntryAction';\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 } = useEntryActions();\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 } = useEntryActions();\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 { useEntryActions } from '../../../common/hooks/useEntryAction';\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 } = useEntryActions();\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 { useEntryActions } from '../../../common/hooks/useEntryAction';\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 } = useEntryActions();\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 {\n // TODO: format with user time settings\n }\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 { useEntryActions } from '../../../common/hooks/useEntryAction';\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 } = useEntryActions();\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"],"names":["TimerLifeCycle","timerLifecycleValues","sanitiseCue","cue","EventEditorImage","src","jsxs","style","jsx","AutoTextarea","value","inputref","textAreaProps","useEffect","node","autosize","Textarea","useReactiveTextInput","initialText","submitCallback","ref","options","text","setText","useState","isKeyboardSubmitting","useRef","handleChange","useCallback","newValue","handleSubmit","valueToSubmit","_a","cleanVal","_b","_c","handleEscape","keyHandler","useMemo","hotKeys","event","hotKeyHandler","getHotkeyHandler","EventTextArea","className","field","label","initialValue","givenStyles","submitHandler","onChange","onBlur","onKeyDown","Editor.Label","EntryEditorTextInput","maxLength","placeholder","Input","EntryEditorCustomFields","customFields","entry","Fragment","fieldKey","key","fieldName","backgroundColor","color","getAccessibleColour","labelText","TimeInputGroup","hasDelay","children","cx","memo","TimeInputFlow","eventId","countToEnd","timeStart","timeEnd","duration","timeStrategy","linkStart","delay","showLabels","updateEntry","updateTimer","useEntryActions","handleChangeStrategy","handleLink","doLink","warnings","dayInMs","isLockedEnd","TimeStrategy","isLockedDuration","TimeInput","Tooltip","IconButton","IoLink","IoUnlink","IoLockClosed","IoLockOpenOutline","IoAlertCircleOutline","EventEditorTimes","endAction","timerType","timeWarning","timeDanger","newTime","parseUserTime","delayLabel","millisToDelayString","millisToString","Editor.Title","Select","EndAction","Switch","IoInformationCircle","TimerType","EventEditorTitles","flag","title","note","colour","cueSubmitHandler","_field","flagSubmitHandler","textSubmitHandler","SwatchSelect","eventTriggerOptions","EventEditorTriggers","triggers","showTriggers","ExistingEventTriggers","EventTriggerForm","automationSettings","useAutomationSettings","automationId","setAutomationId","cycleValue","setCycleValue","triggerLifeCycle","newTriggers","id","generateId","validationError","cycle","t","triggerOptions","automationOptions","Button","IoAlertCircle","IoCheckmarkCircle","handleDelete","triggerId","trigger","filteredTriggers","triggerType","thisTriggerType","triggerGroup","automationTitle","Tag","IoTrash","EventEditor","useCustomFields","isEditor","fieldLabel","AppLink","TextLikeInput","forwardRef","offset","muted","disabled","elementProps","textRef","classes","useImperativeHandle","NullableTimeInput","name","time","emptyDisplay","align","inputRef","setValue","ignoreChange","resetValue","handleFocus","valueInMillis","validateAndSubmit","onKeyDownHandler","onBlurHandler","TargetDurationInput","targetDuration","isLocked","enDash","GroupEditor","group","planOffset","planOffsetLabel","getOffsetState","timerPlaceholder","MilestoneEditor","milestone"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._blink_1hjkh_1{animation:_blink_1hjkh_1 1s step-start infinite}@keyframes _blink_1hjkh_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1hjkh_13{transform:rotate(45deg)}._tag_1hjkh_17{font-size:calc(1rem - 3px);letter-spacing:.5px;background-color:#4c4c4c;color:#f6f6f6;border-radius:2px;padding:0 .25rem;white-space:nowrap}._blink_1l5gl_1{animation:_blink_1l5gl_1 1s step-start infinite}@keyframes _blink_1l5gl_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1l5gl_13{transform:rotate(45deg)}._positioner_1l5gl_17{outline:0}._popup_1l5gl_21{box-sizing:border-box;padding-block:.25rem;color:#f6f6f6;background-color:#202020;font-size:calc(1rem - 2px);border-radius:3px;border:1px solid #404040;box-shadow:#00000026 0 3px 3px;outline:none;transform-origin:var(--transform-origin);transition:transform .15s,opacity .15s}._popup_1l5gl_21[data-starting-style],._popup_1l5gl_21[data-ending-style]{opacity:0;transform:scale(.9)}._item_1l5gl_39{outline:0;cursor:default;padding-block:.5rem;padding-inline:1rem 2rem;display:flex;gap:.5rem;line-height:1em}._item_1l5gl_39 svg{color:#9d9d9d}._item_1l5gl_39[data-disabled]{opacity:.4;cursor:not-allowed}._item_1l5gl_39[data-highlighted]{z-index:0;position:relative}._item_1l5gl_39[data-highlighted]:not([data-disabled]):before{content:"";z-index:-1;position:absolute;inset-block:0;inset-inline:.25rem;border-radius:3px;background-color:#404040}._separator_1l5gl_69{margin:.25rem .75rem;height:1px;background-color:#ffffff12}._blink_4rabb_1{animation:_blink_4rabb_1 1s step-start infinite}@keyframes _blink_4rabb_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_4rabb_13{transform:rotate(45deg)}._modal_4rabb_17{position:fixed;top:10vh;left:50%;transform:translate(-50%);padding-inline:1rem;min-width:min(880px,90vw);min-height:min(200px,10vh);max-width:min(1200px,90vw);background-color:#202020;color:#f6f6f6;border-radius:3px;box-shadow:#00000026 0 3px 3px;border:1px solid #2d2d2d;outline:none}._backdrop_4rabb_34{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000000b3;transition:opacity .3s cubic-bezier(.45,1.005,0,1.005)}._backdrop_4rabb_34[data-starting-style],._backdrop_4rabb_34[data-ending-style]{opacity:0}._title_4rabb_44{font-size:1rem;font-weight:600;padding-block:1rem;display:flex;align-items:center;justify-content:space-between}._body_4rabb_53{display:flex;flex-direction:column;gap:.5rem;max-height:60vh;overflow-y:auto}._footer_4rabb_61{padding-block:1rem;display:flex;align-items:center;justify-content:end;gap:1rem}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{e as i,k as w,j as e,br as N,h as k,bs as b,bt as g,bu as h,bv as m,bw as y,bx as x,by as j,D,p as $,q as v,s as C,t as I}from"./vendor-CCiSQ9k9.js";import{aw as E,aE as S,bx as M,i as P,ai as A}from"./index-BQEUaoAf.js";import{s as u,d as T}from"./useProjectData-C1hVamxc.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="4f4df830-7d00-4ab9-8cdc-89b01329db22",s._sentryDebugIdIdentifier="sentry-dbid-4f4df830-7d00-4ab9-8cdc-89b01329db22")}catch{}})();const c=`${E}/automations`;async function F(){return(await i.get(c)).data}async function V(s){return(await i.post(c,s)).data}async function ss(s){return(await i.post(`${c}/trigger`,s)).data}async function es(s,t){return(await i.put(`${c}/trigger/${s}`,t)).data}function ts(s){return i.delete(`${c}/trigger/${s}`)}async function as(s){return(await i.post(`${c}/automation`,s)).data}async function ns(s,t){return(await i.put(`${c}/automation/${s}`,t)).data}function os(s){return i.delete(`${c}/automation/${s}`)}function rs(s){return i.post(`${c}/test`,s)}const O={enabledAutomations:!1,enabledOscIn:!1,oscPortIn:8888,triggers:[],automations:{}};function is(){const{data:s,status:t,isFetching:n,isError:o,refetch:a}=w({queryKey:M,queryFn:F,placeholderData:(r,p)=>r,retry:5,retryDelay:r=>r*2500,refetchInterval:S,networkMode:"always"});return{data:s??O,status:t,isFetching:n,isError:o,refetch:a}}const B="_tag_1hjkh_17",q={tag:B};function cs({children:s}){return e.jsx("span",{className:q.tag,children:s})}function R({color:s,isSelected:t,onClick:n}){const o=r=>{n==null||n(s),r.preventDefault(),r.stopPropagation()},a=P([u.swatch,t&&u.selected,n&&u.selectable]);return s?e.jsx("div",{className:a,style:{backgroundColor:`${s}`},onClick:o}):e.jsx("div",{className:a,onClick:o,children:e.jsx(N,{})})}const f=["","#FFCC78","#FFAB33","#77C785","#339E4E","#779BE7","#3E75E8","#FF7878","#ED3333","#A790F5","#8064E1","#9d9d9d","#ececec"];function ls(s){const{value:t,name:n,handleChange:o}=s,a=k.useCallback(r=>{r!==t&&o(n,r)},[o,n,t]);return e.jsxs("div",{className:u.list,children:[f.map(r=>e.jsx(R,{color:r,onClick:a,isSelected:t===r},r)),e.jsx(T,{color:t,onChange:a,isSelected:!f.includes(t)})]})}const Q="_positioner_1l5gl_17",U="_popup_1l5gl_21",K="_item_1l5gl_39",z="_separator_1l5gl_69",l={positioner:Q,popup:U,item:K,separator:z};function ds({items:s,children:t,...n}){return e.jsxs(b,{children:[e.jsx(g,{...n,children:t}),e.jsx(h,{children:e.jsx(m,{className:l.positioner,align:"start",sideOffset:8,children:e.jsx(y,{className:l.popup,children:s.map((o,a)=>o.type==="divider"?e.jsx(x,{className:l.separator},a):e.jsxs(j,{className:l.item,onClick:o.onClick,disabled:o.disabled,children:[o.icon&&e.jsx(o.icon,{}),o.label]},a))})})})]})}function us({items:s,isOpen:t,position:n,onClose:o}){return e.jsxs(b,{open:t,onOpenChange:a=>{a||o()},children:[e.jsx(g,{style:{position:"fixed",left:n.x,top:n.y},"aria-hidden":!0}),e.jsx(h,{children:e.jsx(m,{className:l.positioner,align:"start",sideOffset:8,alignOffset:8,children:e.jsx(y,{className:l.popup,children:s.map((a,r)=>a.type==="divider"?e.jsx(x,{className:l.separator},r):e.jsxs(j,{className:l.item,onClick:a.onClick,disabled:a.disabled,children:[a.icon&&e.jsx(a.icon,{}),a.label]},r))})})})]})}const G="_modal_4rabb_17",H="_backdrop_4rabb_34",J="_title_4rabb_44",L="_body_4rabb_53",W="_footer_4rabb_61",d={modal:G,backdrop:H,title:J,body:L,footer:W};function ps({isOpen:s,title:t,showCloseButton:n,showBackdrop:o,bodyElements:a,footerElements:r,onClose:p}){return e.jsx(D,{open:s,onOpenChange:_=>{_||p()},dismissible:!1,children:e.jsxs($,{children:[o&&e.jsx(v,{className:d.backdrop}),e.jsxs(C,{className:d.modal,children:[e.jsxs("div",{className:d.title,children:[t,n&&e.jsx(A,{variant:"subtle-white",onClick:p,children:e.jsx(I,{})})]}),e.jsx("div",{className:d.body,children:a}),e.jsx("div",{className:d.footer,children:r})]})]})})}export{ds as D,ps as M,us as P,ls as S,cs as T,ns as a,as as b,es as c,os as d,V as e,ss as f,ts as g,R as h,rs as t,is as u};
|
|
2
|
-
//# sourceMappingURL=Modal-C2sFA0zf.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Modal-C2sFA0zf.js","sources":["../../src/common/api/automation.ts","../../src/common/models/AutomationSettings.ts","../../src/common/hooks-query/useAutomationSettings.ts","../../src/common/components/tag/Tag.tsx","../../src/common/components/input/colour-input/Swatch.tsx","../../src/common/components/input/colour-input/SwatchSelect.tsx","../../src/common/components/dropdown-menu/DropdownMenu.tsx","../../src/common/components/modal/Modal.tsx"],"sourcesContent":["import axios from 'axios';\nimport type {\n Automation,\n AutomationDTO,\n AutomationOutput,\n AutomationSettings,\n Trigger,\n TriggerDTO,\n} from 'ontime-types';\n\nimport { apiEntryUrl } from './constants';\n\nconst automationsPath = `${apiEntryUrl}/automations`;\n\n/**\n * HTTP request to get the automations settings\n */\nexport async function getAutomationSettings(): Promise<AutomationSettings> {\n const res = await axios.get(automationsPath);\n return res.data;\n}\n\n/**\n * HTTP request to edit the automations settings\n */\nexport async function editAutomationSettings(\n automationSettings: Partial<AutomationSettings>,\n): Promise<AutomationSettings> {\n const res = await axios.post(automationsPath, automationSettings);\n return res.data;\n}\n\n/**\n * HTTP request to create a new automation trigger\n */\nexport async function addTrigger(trigger: TriggerDTO): Promise<Trigger> {\n const res = await axios.post(`${automationsPath}/trigger`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to update an automation trigger\n */\nexport async function editTrigger(id: string, trigger: Trigger): Promise<Trigger> {\n const res = await axios.put(`${automationsPath}/trigger/${id}`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to delete an automation trigger\n */\nexport function deleteTrigger(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/trigger/${id}`);\n}\n\n/**\n * HTTP request to create a new automation\n */\nexport async function addAutomation(automation: AutomationDTO): Promise<Automation> {\n const res = await axios.post(`${automationsPath}/automation`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to update a automation\n */\nexport async function editAutomation(id: string, automation: Automation): Promise<Automation> {\n const res = await axios.put(`${automationsPath}/automation/${id}`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to delete a automation\n */\nexport function deleteAutomation(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/automation/${id}`);\n}\n\n/**\n * HTTP request to test automation output\n * The return is irrelevant as we care for the resolution of the promise\n */\nexport function testOutput(output: AutomationOutput): Promise<void> {\n return axios.post(`${automationsPath}/test`, output);\n}\n","import { AutomationSettings } from 'ontime-types';\n\nexport const automationPlaceholderSettings: AutomationSettings = {\n enabledAutomations: false,\n enabledOscIn: false,\n oscPortIn: 8888,\n triggers: [],\n automations: {},\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport { queryRefetchIntervalSlow } from '../../ontimeConfig';\nimport { getAutomationSettings } from '../api/automation';\nimport { AUTOMATION } from '../api/constants';\nimport { automationPlaceholderSettings } from '../models/AutomationSettings';\n\nexport default function useAutomationSettings() {\n const { data, status, isFetching, isError, refetch } = useQuery({\n queryKey: AUTOMATION,\n queryFn: getAutomationSettings,\n placeholderData: (previousData, _previousQuery) => previousData,\n retry: 5,\n retryDelay: (attempt: number) => attempt * 2500,\n refetchInterval: queryRefetchIntervalSlow,\n networkMode: 'always',\n });\n\n return { data: data ?? automationPlaceholderSettings, status, isFetching, isError, refetch };\n}\n","import { ReactNode } from 'react';\n\nimport style from './Tag.module.scss';\n\nexport default function Tag({ children }: { children: ReactNode }) {\n return <span className={style.tag}>{children}</span>;\n}\n","import { MouseEvent } from 'react';\nimport { IoBan } from 'react-icons/io5';\n\nimport { cx } from '../../../utils/styleUtils';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface SwatchProps {\n color: string;\n onClick?: (color: string) => void;\n isSelected?: boolean;\n}\n\nexport default function Swatch({ color, isSelected, onClick }: SwatchProps) {\n const handleClick = (event: MouseEvent) => {\n onClick?.(color);\n event.preventDefault();\n event.stopPropagation();\n };\n\n const classes = cx([style.swatch, isSelected && style.selected, onClick && style.selectable]);\n\n if (!color) {\n return (\n <div className={classes} onClick={handleClick}>\n <IoBan />\n </div>\n );\n }\n return <div className={classes} style={{ backgroundColor: `${color}` }} onClick={handleClick} />;\n}\n","import { useCallback } from 'react';\n\nimport Swatch from './Swatch';\nimport SwatchPicker from './SwatchPicker';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface ColourInputProps {\n value: string;\n name: 'colour';\n handleChange: (newValue: 'colour', name: string) => void;\n}\n\nconst colours = [\n '',\n '#FFCC78', // $orange-400\n '#FFAB33', // $orange-600\n '#77C785', // $green-400\n '#339E4E', // $green-600\n '#779BE7', // $blue-400\n '#3E75E8', // $blue-600\n '#FF7878', // $red-400\n '#ED3333', // $red-600\n '#A790F5', // $violet-400\n '#8064E1', // $violet-600\n '#9d9d9d', // $gray-500\n '#ececec', // $gray-100\n];\n\nexport default function SwatchSelect(props: ColourInputProps) {\n const { value, name, handleChange } = props;\n\n const setColour = useCallback(\n (newValue: string) => {\n if (newValue !== value) {\n handleChange(name, newValue);\n }\n },\n [handleChange, name, value],\n );\n\n return (\n <div className={style.list}>\n {colours.map((colour) => (\n <Swatch key={colour} color={colour} onClick={setColour} isSelected={value === colour} />\n ))}\n <SwatchPicker color={value} onChange={setColour} isSelected={!colours.includes(value)} />\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport { IconType } from 'react-icons';\nimport { Menu as BaseMenu } from '@base-ui-components/react/menu';\n\nimport style from './DropdownMenu.module.scss';\n\ntype DropdownMenuItemDivider = { type: 'divider' };\ntype DropdownMenuItem = {\n type: 'item';\n label: string;\n icon?: IconType;\n disabled?: boolean;\n onClick: () => void;\n};\n\nexport type DropdownMenuOption = DropdownMenuItemDivider | DropdownMenuItem;\n\ninterface DropdownMenuProps extends BaseMenu.Trigger.Props {\n items: DropdownMenuOption[];\n}\n\nexport function DropdownMenu({ items, children, ...triggerProps }: PropsWithChildren<DropdownMenuProps>) {\n return (\n <BaseMenu.Root>\n <BaseMenu.Trigger {...triggerProps}>{children}</BaseMenu.Trigger>\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item key={index} className={style.item} onClick={item.onClick} disabled={item.disabled}>\n {item.icon && <item.icon />}\n {item.label}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n\ninterface PositionedDropdownMenuProps {\n items: Array<DropdownMenuItemDivider | DropdownMenuItem>;\n isOpen: boolean;\n onClose: () => void;\n position: { x: number; y: number };\n}\n\nexport function PositionedDropdownMenu({ items, isOpen, position, onClose }: PositionedDropdownMenuProps) {\n return (\n <BaseMenu.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <BaseMenu.Trigger style={{ position: 'fixed', left: position.x, top: position.y }} aria-hidden />\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8} alignOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item key={index} className={style.item} onClick={item.onClick} disabled={item.disabled}>\n {item.icon && <item.icon />}\n {item.label}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n","import type { ReactNode } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog as BaseDialog } from '@base-ui-components/react/dialog';\n\nimport IconButton from '../buttons/IconButton';\n\nimport style from './Modal.module.scss';\n\ninterface ModalProps {\n isOpen: boolean;\n title?: string;\n showCloseButton?: boolean;\n showBackdrop?: boolean;\n bodyElements: ReactNode;\n footerElements?: ReactNode;\n onClose: () => void;\n}\n\nexport default function Modal({\n isOpen,\n title,\n showCloseButton,\n showBackdrop,\n bodyElements,\n footerElements,\n onClose,\n}: ModalProps) {\n return (\n <BaseDialog.Root\n open={isOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n dismissible={false}\n >\n <BaseDialog.Portal>\n {showBackdrop && <BaseDialog.Backdrop className={style.backdrop} />}\n <BaseDialog.Popup className={style.modal}>\n <div className={style.title}>\n {title}\n {showCloseButton && (\n <IconButton variant='subtle-white' onClick={onClose}>\n <IoClose />\n </IconButton>\n )}\n </div>\n <div className={style.body}>{bodyElements}</div>\n <div className={style.footer}>{footerElements}</div>\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n );\n}\n"],"names":["automationsPath","apiEntryUrl","getAutomationSettings","axios","editAutomationSettings","automationSettings","addTrigger","trigger","editTrigger","id","deleteTrigger","addAutomation","automation","editAutomation","deleteAutomation","testOutput","output","automationPlaceholderSettings","useAutomationSettings","data","status","isFetching","isError","refetch","useQuery","AUTOMATION","previousData","_previousQuery","attempt","queryRefetchIntervalSlow","Tag","children","jsx","style","Swatch","color","isSelected","onClick","handleClick","event","classes","cx","IoBan","colours","SwatchSelect","props","value","name","handleChange","setColour","useCallback","newValue","jsxs","colour","SwatchPicker","DropdownMenu","items","triggerProps","BaseMenu.Root","BaseMenu.Trigger","BaseMenu.Portal","BaseMenu.Positioner","BaseMenu.Popup","item","index","BaseMenu.Separator","BaseMenu.Item","PositionedDropdownMenu","isOpen","position","onClose","open","Modal","title","showCloseButton","showBackdrop","bodyElements","footerElements","BaseDialog.Root","BaseDialog.Portal","BaseDialog.Backdrop","BaseDialog.Popup","IconButton","IoClose"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as r}from"./vendor-CCiSQ9k9.js";import{g as a}from"./getProgress-Cw79NL_O.js";import{i as l}from"./index-BQEUaoAf.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="f258f155-d8d7-41b3-af14-ea50747aa7a5",e._sentryDebugIdIdentifier="sentry-dbid-f258f155-d8d7-41b3-af14-ea50747aa7a5")}catch{}})();function j(e){const{now:s,complete:i,normalColor:g,warning:o,warningColor:m,danger:n,dangerColor:c,hidden:b,hideOvertime:u,ignoreCssOverride:f,className:p=""}=e,_=100-a(s,i),t=n?100-a(n,i):0,h=o?100-t-a(o,i):0,d=s!==null&&s<0&&!u;return r.jsx("div",{className:l(["multiprogress-bar",b&&"multiprogress-bar--hidden",f&&"multiprogress-bar--ignore-css-override",p]),children:s!==null&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"multiprogress-bar__bg",children:[r.jsx("div",{className:"multiprogress-bar__bg-normal",style:{backgroundColor:g}}),r.jsx("div",{className:"multiprogress-bar__bg-warning",style:{width:`${h}%`,backgroundColor:m}}),r.jsx("div",{className:l(["multiprogress-bar__bg-danger",d&&"multiprogress-bar__bg-danger--overtime"]),style:{width:`${t}%`,backgroundColor:d?void 0:c}})]}),r.jsx("div",{className:"multiprogress-bar__indicator",children:r.jsx("div",{className:"multiprogress-bar__indicator-bar",style:{width:`${_}%`}})})]})})}export{j as M};
|
|
2
|
-
//# sourceMappingURL=MultiPartProgressBar-D3jJZjb5.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as u,j as e,D as te,p as se,s as oe,t as ne,b0 as re,l as ie}from"./vendor-CCiSQ9k9.js";import{P as ae}from"./ProtectRoute-CrcWfOlG.js";import{ai as le,B as G,z as ce,bc as de,aA as ue,i as D,y as me,bd as pe,l as fe,M as he,be as ge,a_ as _e,c as be,P as ve,d as xe,L as je,o as ye,h as Se,O as Oe,t as we}from"./index-BQEUaoAf.js";import{r as Ee,i as H,j as Ce}from"./useRundown-BfpjcCEJ.js";import{E as Ne}from"./EmptyPage-Dcbg6rmF.js";import{m as Pe,e as Te,O as I,i as U,g as z,V as Fe}from"./ViewParamsEditor-Bca1TIDW.js";import{u as ke}from"./useFollowComponent-Ctfhf2or.js";import{u as De}from"./useWindowTitle-DqdFTWns.js";import{T as qe}from"./editorSettings-BU0pTMSY.js";import{u as Le}from"./dateConfig-DRQGMWDF.js";import{F as Me}from"./FollowButton-CSqJSvix.js";import{D as Re}from"./DelayIndicator-vT7n8ypf.js";import{f as Be,T as Ie,C as Ue}from"./TimeElements-CALNfv6u.js";import{M as Ae}from"./MultiPartProgressBar-D3jJZjb5.js";import{g as Ve,a as $e}from"./viewLoader.utils-CmM-4-pk.js";import{u as We}from"./useCustomFields-DqCYz8Kt.js";import"./useProjectData-C1hVamxc.js";import"./Empty-gWT_HMeu.js";import"./Select-CedN80WS.js";import"./validateEvent-P9sf7C10.js";import"./parseUserTime-BeTKj08M.js";import"./rundownUtils-BZHazkXR.js";import"./Tooltip-D9XRnwOW.js";import"./offset-DJAHqjFW.js";import"./playbackstate-B_khF6xU.js";import"./getProgress-Cw79NL_O.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="b795dbe0-84e7-42c4-9399-fe9ef7bc3807",t._sentryDebugIdIdentifier="sentry-dbid-b795dbe0-84e7-42c4-9399-fe9ef7bc3807")}catch{}})();const Ge="_editModal_s63mb_17",He="_title_s63mb_31",ze="_body_s63mb_39",Ze="_label_s63mb_48",Qe="_footer_s63mb_54",E={editModal:Ge,title:He,body:ze,label:Ze,footer:Qe};function Je(t){const{event:s,onClose:o}=t,{updateEntry:r}=Le(),[n,i]=u.useState(!1),m=u.useRef(new Array),h=async()=>{if(!m.current)return;i(!0);const a={id:s.id};m.current.forEach(l=>{l.dataset.field&&l.defaultValue!=l.value&&(a.custom?a.custom[l.dataset.field]=l.value:Object.assign(a,{custom:{[l.dataset.field]:l.value}}))}),a.custom&&await r(a),i(!1),o()};return e.jsx(te,{open:!0,onOpenChange:a=>{a||o()},children:e.jsx(se,{children:e.jsxs(oe,{className:E.editModal,children:[e.jsxs("div",{className:E.title,children:[`Editing fields in cue ${s.cue}`,e.jsx(le,{variant:"subtle-white",onClick:o,disabled:n,children:e.jsx(ne,{})})]}),e.jsx("div",{className:E.body,children:s.subscriptions.map(a=>e.jsxs(u.Fragment,{children:[e.jsx("label",{htmlFor:a.id,className:E.label,style:{"--user-bg":a.colour},children:a.label}),e.jsx(qe,{name:a.id,ref:l=>{l&&m.current.push(l)},placeholder:`Add value for ${a.label} field`,defaultValue:a.value,"data-field":a.id,disabled:n,rows:5})]},a.id))}),e.jsxs("div",{className:E.footer,children:[e.jsx(G,{variant:"subtle",size:"large",onClick:o,disabled:n,children:"Cancel"}),e.jsx(G,{variant:"primary",size:"large",onClick:h,disabled:n,children:"Save"})]})]})})})}function Ke(t){const{value:s,hideSeconds:o,hideLeadingZero:r,className:n}=t;let i=Be(s,o||r?2:3);return r&&(i=ce(i)),o&&(i=de(i)),e.jsx("div",{className:n,children:i})}const Xe="_event_k7q3c_63",Ye="_running_k7q3c_80",et="_past_k7q3c_84",tt="_binder_k7q3c_89",st="_cue_k7q3c_98",ot="_mainField_k7q3c_108",nt="_secondaryField_k7q3c_117",rt="_plannedStart_k7q3c_124",it="_timeUntil_k7q3c_124",at="_runningTime_k7q3c_143",lt="_fields_k7q3c_154",ct="_field_k7q3c_154",dt="_noColour_k7q3c_170",ut="_value_k7q3c_176",d={event:Xe,running:Ye,past:et,binder:tt,cue:st,mainField:ot,secondaryField:nt,plannedStart:rt,timeUntil:it,runningTime:at,fields:lt,field:ct,noColour:dt,value:ut},Z=u.memo(mt);function mt({id:t,colour:s,cue:o,main:r,secondary:n,timeStart:i,duration:m,delay:h,dayOffset:a,isLinkedToLoaded:l,isSelected:g,isPast:x,selectedRef:N,showStart:P,subscribed:y,totalGap:S,onLongPress:T}){const _=f=>{f==null||f.preventDefault(),y&&T({id:t,cue:o,subscriptions:y})},b=re(_),q=s&&ue(s),O=D([d.event,g&&d.running,x&&d.past]);return e.jsxs("div",{className:O,"data-testid":o,ref:N,onContextMenu:_,...b,children:[e.jsx("div",{className:d.binder,style:{...q},children:e.jsx("span",{className:d.cue,children:o})}),e.jsxs("span",{className:d.mainField,children:[P&&e.jsx("span",{className:d.plannedStart,children:me(i)}),r]}),e.jsx("span",{className:d.secondaryField,children:n}),e.jsx(pt,{timeStart:i,isPast:x,isSelected:g,delay:h,dayOffset:a,totalGap:S,isLinkedToLoaded:l}),e.jsxs("span",{className:d.runningTime,children:[e.jsx(Re,{delayValue:h}),e.jsx(Ke,{className:D([g&&d.muted]),value:m,hideLeadingZero:!0})]}),e.jsx("div",{className:d.fields,children:y.filter(f=>f.value).map(f=>{const A=D([d.field,f.colour?null:d.noColour]);return e.jsxs("div",{children:[e.jsx("span",{className:A,style:{backgroundColor:f.colour},children:f.label}),e.jsx("span",{className:d.value,style:{color:f.colour},children:f.value})]},f.id)})})]})}function pt({timeStart:t,isPast:s,isSelected:o,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:m}){return s?e.jsx("span",{className:d.timeUntil,children:"DONE"}):o?e.jsx("span",{className:d.timeUntil,children:"LIVE"}):e.jsx(ft,{timeStart:t,delay:r,dayOffset:n,totalGap:i,isLinkedToLoaded:m})}function ft({timeStart:t,delay:s,dayOffset:o,totalGap:r,isLinkedToLoaded:n}){const i=pe({timeStart:t,delay:s,dayOffset:o},{totalGap:r,isLinkedToLoaded:n}),h=i<ge?"DUE":`${fe(Math.abs(i),i>2*he)}`;return e.jsx("span",{className:d.timeUntil,"data-testid":"time-until",children:h})}const ht="_group_c6uj3_17",gt={group:ht},_t=u.memo(bt);function bt({title:t}){return e.jsx("div",{className:gt.group,children:t})}const vt="_statusBar_10qhq_17",xt="_timers_10qhq_25",jt="_runningTimer_10qhq_33",yt="_timeNow_10qhq_42",St="_progressOverride_10qhq_51",C={statusBar:vt,timers:xt,runningTimer:jt,timeNow:yt,progressOverride:St};function Ot({viewSettings:t}){const{current:s,duration:o,timeWarning:r,timeDanger:n}=_e();return e.jsx(Ae,{now:s,complete:o,normalColor:t.normalColor,warning:r,warningColor:t.warningColor,danger:n,dangerColor:t.dangerColor,className:C.progressOverride,ignoreCssOverride:!0})}function wt(){return e.jsxs("div",{className:C.timers,children:[e.jsx(Ie,{className:C.runningTimer}),e.jsx(Ue,{className:C.timeNow})]})}function Et(){const{data:t}=be();return e.jsxs("div",{className:C.statusBar,children:[e.jsx(wt,{}),t&&e.jsx(Ot,{viewSettings:t})]})}const Ct=(t,s)=>{const o=Pe(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),r=Te(t);return[{title:I.ClockOptions,collapsible:!0,options:[Ve(s)]},{title:I.DataSources,collapsible:!0,options:[{id:"main",title:"Main data field",description:"Field to be shown in the first line of text",type:"option",values:o,defaultValue:"title"},{id:"secondary-src",title:"Secondary data field",description:"Field to be shown in the second line of text",type:"option",values:o,defaultValue:"none"},{id:"subscribe",title:"Highlight Fields",description:"Choose custom fields to highlight",type:"multi-option",values:r},{id:"shouldEdit",title:"Edit custom field",description:"Allows editing an highlighted custom field by long pressing",type:"boolean",defaultValue:!1}]},{title:I.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1},{id:"showStart",title:"Show planned start",description:"Whether to prepend the planned start to the items",type:"boolean",defaultValue:!1}]}]};function Nt(t,s){const o=n=>(s==null?void 0:s.get(n))??t.get(n),r=n=>s!=null&&s.has(n)?s.getAll(n):t.getAll(n);return{mainSource:o("main"),secondarySource:o("secondary-src"),subscribe:r("subscribe"),shouldEdit:U(o("shouldEdit")),hidePast:U(o("hidePast")),showStart:U(o("showStart"))}}function Pt(){const[t]=ie(),s=u.use(ve);return u.useMemo(()=>{const r=s?new URLSearchParams(s.search):void 0;return Nt(t,r)},[s,t])}function Q(t,s,o,r,n){const i=s?z(t,s)??"":t.title,m=z(t,o)??"",a=r.filter(l=>Object.hasOwn(n,l)).reduce((l,g)=>{const x=n[g];return x&&l.push({id:g,label:x.label,colour:x.colour,value:t.custom[g]}),l},[]);return{mainField:i,secondaryField:m,subscribedData:a}}function Tt(){const{data:t,rundownMetadata:s,status:o}=Ee(),{data:r,status:n}=We(),{data:i,status:m}=xe();return{data:{rundown:t,rundownMetadata:s,customFields:r,settings:i},status:$e([o,n,m])}}const Ft="_operatorContainer_1o5o0_17",kt="_operatorEvents_1o5o0_24",Dt="_editPrompt_1o5o0_35",qt="_show_1o5o0_49",k={operatorContainer:Ft,operatorEvents:kt,editPrompt:Dt,show:qt},J=50;function Lt(){const{data:t,status:s}=Tt();return De("Operator"),s==="pending"?e.jsx(je,{}):s==="error"?e.jsx(Ne,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Mt,{...t})}function Mt({rundown:t,rundownMetadata:s,customFields:o,settings:r}){const{selectedEventId:n}=ye(),{subscribe:i,mainSource:m,secondarySource:h,shouldEdit:a,hidePast:l,showStart:g}=Pt(),[x,N]=u.useState(!1),[P,y]=u.useState(null),[S,T]=u.useState(!1),_=u.useRef(null),b=u.useRef(null),q=ke({followRef:_,scrollRef:b,doFollow:!S,topOffset:J,followTrigger:n}),O=u.useRef(null);u.useEffect(()=>{var v;n||S||(v=b.current)==null||v.scrollTo(0,0)},[n,S,b]);const f=()=>{n&&q(),T(!1)},K=we(()=>{if(_!=null&&_.current&&(b!=null&&b.current)){const v=_.current.getBoundingClientRect(),c=b.current.getBoundingClientRect();if(v&&c){const j=v.top-c.top,p=j<-8||j>J;T(p)}}},1e3),V=()=>{O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{N(!1)},700),N(!0),K()},$=u.useCallback(v=>{y({...v})},[]),W=Se(r==null?void 0:r.timeFormat),X=u.useMemo(()=>Ct(o,W),[o,W]),L=a&&i.length;return e.jsxs("div",{className:k.operatorContainer,"data-testid":"operator-view",children:[e.jsx(Fe,{target:Oe.Operator,viewOptions:X}),P&&e.jsx(Je,{event:P,onClose:()=>y(null)}),e.jsx(Et,{}),L&&e.jsx("div",{className:D([k.editPrompt,x&&k.show]),children:"Press and hold to edit user field"}),e.jsx("div",{className:k.operatorEvents,onWheel:V,onTouchMove:V,ref:b,children:t.order.map(v=>{const c=t.entries[v];if(H(c)){const{isPast:j,isLinkedToLoaded:p,isLoaded:w,totalGap:F}=s[v];if(l&&j||c.skip)return null;const{mainField:M,secondaryField:R,subscribedData:B}=Q(c,m,h,i,o);return e.jsx(Z,{id:c.id,colour:c.colour,cue:c.cue,main:M,secondary:R,timeStart:c.timeStart,duration:c.duration,delay:c.delay,dayOffset:c.dayOffset,isLinkedToLoaded:p,isSelected:w,isPast:j,selectedRef:w?_:void 0,showStart:g,subscribed:B,totalGap:F,onLongPress:L?$:()=>{}},c.id)}return Ce(c)?e.jsxs(u.Fragment,{children:[e.jsx(_t,{title:c.title},c.id),c.entries.map(j=>{const p=t.entries[j];if(!H(p))return null;const{isPast:w,isLoaded:F,isLinkedToLoaded:M,totalGap:R}=s[j];if(l&&w||p.skip)return null;const{mainField:B,secondaryField:Y,subscribedData:ee}=Q(p,m,h,i,o);return e.jsx(Z,{id:p.id,colour:p.colour,cue:p.cue,main:B,secondary:Y,timeStart:p.timeStart,duration:p.duration,delay:p.delay,dayOffset:p.dayOffset,isLinkedToLoaded:M,isSelected:F,isPast:w,selectedRef:F?_:void 0,showStart:g,subscribed:ee,totalGap:R,onLongPress:L?$:()=>{}},p.id)})]},c.id):null})}),e.jsx(Me,{isVisible:S,onClickHandler:f})]})}function cs(){return e.jsx(ae,{permission:"operator",children:e.jsx(Lt,{})})}export{cs as default};
|
|
2
|
-
//# sourceMappingURL=OperatorExport-BUhxjLUx.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OperatorExport-BUhxjLUx.js","sources":["../../src/features/operator/edit-modal/EditModal.tsx","../../src/features/viewers/common/running-time/RunningTime.tsx","../../src/features/operator/operator-event/OperatorEvent.tsx","../../src/features/operator/operator-group/OperatorGroup.tsx","../../src/features/operator/status-bar/StatusBarProgress.tsx","../../src/features/operator/status-bar/StatusBarTimers.tsx","../../src/features/operator/status-bar/StatusBar.tsx","../../src/features/operator/operator.options.tsx","../../src/features/operator/operator.utils.ts","../../src/features/operator/useOperatorData.ts","../../src/features/operator/Operator.tsx","../../src/features/operator/OperatorExport.tsx"],"sourcesContent":["import { Fragment, useRef, useState } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog } from '@base-ui-components/react/dialog';\nimport { OntimeEvent } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport Textarea from '../../../common/components/input/textarea/Textarea';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { EditEvent } from '../operator.types';\n\nimport style from './EditModal.module.scss';\n\ninterface EditModalProps {\n event: EditEvent;\n onClose: () => void;\n}\n\nexport default function EditModal(props: EditModalProps) {\n const { event, onClose } = props;\n\n const { updateEntry } = useEntryActions();\n const [loading, setLoading] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement[]>(new Array<HTMLTextAreaElement>());\n\n const handleSave = async () => {\n if (!inputRef.current) return;\n setLoading(true);\n\n const patchObject: Partial<OntimeEvent> = { id: event.id };\n\n inputRef.current.forEach((element) => {\n if (element.dataset.field && element.defaultValue != element.value) {\n if (patchObject.custom) {\n patchObject.custom[element.dataset.field] = element.value;\n } else {\n Object.assign(patchObject, { custom: { [element.dataset.field]: element.value } });\n }\n }\n });\n\n if (patchObject.custom) {\n await updateEntry(patchObject);\n }\n\n setLoading(false);\n onClose();\n };\n\n return (\n <Dialog.Root\n open\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n >\n <Dialog.Portal>\n <Dialog.Popup className={style.editModal}>\n <div className={style.title}>\n {`Editing fields in cue ${event.cue}`}\n <IconButton variant='subtle-white' onClick={onClose} disabled={loading}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {event.subscriptions.map((field) => {\n return (\n <Fragment key={field.id}>\n <label htmlFor={field.id} className={style.label} style={{ '--user-bg': field.colour }}>\n {field.label}\n </label>\n <Textarea\n name={field.id}\n ref={(element) => {\n if (element) inputRef.current.push(element);\n }}\n placeholder={`Add value for ${field.label} field`}\n defaultValue={field.value}\n data-field={field.id}\n disabled={loading}\n rows={5}\n />\n </Fragment>\n );\n })}\n </div>\n\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n <Button variant='primary' size='large' onClick={handleSave} disabled={loading}>\n Save\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","/**\n * encapsulate logic related to showing a running timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\nimport { removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { formattedTime } from '../../../overview/overview.utils';\n\ninterface RunningTimeProps {\n value: MaybeNumber;\n hideSeconds?: boolean;\n hideLeadingZero?: boolean;\n className?: string;\n}\n\nexport default function RunningTime(props: RunningTimeProps) {\n const { value, hideSeconds, hideLeadingZero, className } = props;\n let display = formattedTime(value, hideSeconds || hideLeadingZero ? 2 : 3);\n\n if (hideLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (hideSeconds) {\n display = removeSeconds(display);\n }\n\n return <div className={className}>{display}</div>;\n}\n","import { memo, RefObject, SyntheticEvent } from 'react';\nimport { useLongPress } from '@mantine/hooks';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString } from 'ontime-utils';\n\nimport DelayIndicator from '../../../common/components/delay-indicator/DelayIndicator';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, useTimeUntilExpectedStart } from '../../../common/utils/time';\nimport RunningTime from '../../viewers/common/running-time/RunningTime';\nimport type { EditEvent, Subscribed } from '../operator.types';\n\nimport style from './OperatorEvent.module.scss';\n\ninterface OperatorEventProps {\n id: string;\n colour: string;\n cue: string;\n main: string;\n secondary: string;\n timeStart: number;\n duration: number;\n delay: number;\n dayOffset: number;\n isLinkedToLoaded: boolean;\n isSelected: boolean;\n isPast: boolean;\n selectedRef?: RefObject<HTMLDivElement | null>;\n showStart: boolean;\n subscribed: Subscribed;\n totalGap: number;\n onLongPress: (event: EditEvent) => void;\n}\n\nexport default memo(OperatorEvent);\nfunction OperatorEvent({\n id,\n colour,\n cue,\n main,\n secondary,\n timeStart,\n duration,\n delay,\n dayOffset,\n isLinkedToLoaded,\n isSelected,\n isPast,\n selectedRef,\n showStart,\n subscribed,\n totalGap,\n onLongPress,\n}: OperatorEventProps) {\n /**\n * gather behaviour for long press and context menu\n */\n const handleLongPress = (event?: SyntheticEvent) => {\n // we dont have an event out of useLongPress\n event?.preventDefault();\n if (subscribed) {\n onLongPress({ id, cue, subscriptions: subscribed });\n }\n };\n\n const mouseHandlers = useLongPress(handleLongPress);\n const cueColours = colour && getAccessibleColour(colour);\n\n const operatorClasses = cx([\n style.event,\n isSelected && style.running,\n isPast && style.past,\n ]);\n\n return (\n <div className={operatorClasses} data-testid={cue} ref={selectedRef} onContextMenu={handleLongPress} {...mouseHandlers}>\n <div className={style.binder} style={{ ...cueColours }}>\n <span className={style.cue}>{cue}</span>\n </div>\n\n <span className={style.mainField}>\n {showStart && <span className={style.plannedStart}>{millisToString(timeStart)}</span>}\n {main}\n </span>\n <span className={style.secondaryField}>{secondary}</span>\n <OperatorEventSchedule\n timeStart={timeStart}\n isPast={isPast}\n isSelected={isSelected}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n <span className={style.runningTime}>\n <DelayIndicator delayValue={delay} />\n <RunningTime className={cx([isSelected && style.muted])} value={duration} hideLeadingZero />\n </span>\n\n <div className={style.fields}>\n {subscribed\n .filter((field) => field.value)\n .map((field) => {\n const fieldClasses = cx([style.field, !field.colour ? style.noColour : null]);\n return (\n <div key={field.id}>\n <span className={fieldClasses} style={{ backgroundColor: field.colour }}>\n {field.label}\n </span>\n <span className={style.value} style={{ color: field.colour }}>\n {field.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface OperatorEventScheduleProps {\n timeStart: number;\n isPast: boolean;\n isSelected: boolean;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction OperatorEventSchedule({\n timeStart,\n isPast,\n isSelected,\n delay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n}: OperatorEventScheduleProps) {\n if (isPast) {\n return <span className={style.timeUntil}>DONE</span>;\n }\n\n if (isSelected) {\n return <span className={style.timeUntil}>LIVE</span>;\n }\n\n return (\n <TimeUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n );\n}\n\ninterface TimeUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\nfunction TimeUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: TimeUntilProps) {\n // we isolate this to avoid unnecessary re-renders\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n\n const isDue = timeUntil < MILLIS_PER_SECOND;\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return <span className={style.timeUntil} data-testid='time-until'>{timeUntilString}</span>;\n}\n","import { memo } from 'react';\n\nimport style from './OperatorGroup.module.scss';\n\ninterface OperatorGroup {\n title: string;\n}\n\nexport default memo(OperatorGroup);\nfunction OperatorGroup({ title }: OperatorGroup) {\n return <div className={style.group}>{title}</div>;\n}\n","import { ViewSettings } from 'ontime-types';\n\nimport MultiPartProgressBar from '../../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport { useProgressData } from '../../../common/hooks/useSocket';\n\nimport styles from './StatusBar.module.scss';\n\ninterface StatusBarProgressProps {\n viewSettings: ViewSettings;\n}\n\nexport default function StatusBarProgress({ viewSettings }: StatusBarProgressProps) {\n const { current, duration, timeWarning, timeDanger } = useProgressData();\n\n return (\n <MultiPartProgressBar\n now={current}\n complete={duration}\n normalColor={viewSettings.normalColor}\n warning={timeWarning}\n warningColor={viewSettings.warningColor}\n danger={timeDanger}\n dangerColor={viewSettings.dangerColor}\n className={styles.progressOverride}\n ignoreCssOverride\n />\n );\n}\n","import { ClockOverview, TimerOverview } from '../../overview/composite/TimeElements';\n\nimport style from './StatusBar.module.scss';\n\nexport default function StatusBarTimers() {\n return (\n <div className={style.timers}>\n <TimerOverview className={style.runningTimer} />\n <ClockOverview className={style.timeNow} />\n </div>\n );\n}\n","import useViewSettings from '../../../common/hooks-query/useViewSettings';\n\nimport StatusBarProgress from './StatusBarProgress';\nimport StatusBarTimers from './StatusBarTimers';\n\nimport styles from './StatusBar.module.scss';\n\nexport default function StatusBar() {\n const { data } = useViewSettings();\n\n return (\n <div className={styles.statusBar}>\n <StatusBarTimers />\n {data && <StatusBarProgress viewSettings={data} />}\n </div>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, EntryId, OntimeEvent } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport {\n makeCustomFieldSelectOptions,\n makeOptionsFromCustomFields,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../viewers/common/viewUtils';\n\nexport const getOperatorOptions = (customFields: CustomFields, timeFormat: string): ViewOption[] => {\n const fieldOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const customFieldSelect = makeCustomFieldSelectOptions(customFields);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main data field',\n description: 'Field to be shown in the first line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary data field',\n description: 'Field to be shown in the second line of text',\n type: 'option',\n values: fieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'subscribe',\n title: 'Highlight Fields',\n description: 'Choose custom fields to highlight',\n type: 'multi-option',\n values: customFieldSelect,\n },\n {\n id: 'shouldEdit',\n title: 'Edit custom field',\n description: 'Allows editing an highlighted custom field by long pressing',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hidePast',\n title: 'Hide Past Events',\n description: 'Whether to hide events that have passed',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'showStart',\n title: 'Show planned start',\n description: 'Whether to prepend the planned start to the items',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype OperatorOptions = {\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n subscribe: string[];\n shouldEdit: boolean;\n hidePast: boolean;\n showStart: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): OperatorOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Helper to get array values from either source\n const getArrayValues = (key: string): EntryId[] => {\n if (defaultValues?.has(key)) {\n return defaultValues.getAll(key) as EntryId[];\n }\n return searchParams.getAll(key) as EntryId[];\n };\n\n // we manually make an object that matches the key above\n return {\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n subscribe: getArrayValues('subscribe'),\n shouldEdit: isStringBoolean(getValue('shouldEdit')),\n hidePast: isStringBoolean(getValue('hidePast')),\n showStart: isStringBoolean(getValue('showStart')),\n };\n}\n\n/**\n * Hook exposes the operator view options\n */\nexport function useOperatorOptions(): OperatorOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { CustomFields, MaybeString, OntimeEvent } from 'ontime-types';\r\n\r\nimport { getPropertyValue } from '../viewers/common/viewUtils';\r\n\r\nimport type { Subscribed } from './operator.types';\r\n\r\nexport function getEventData(\r\n event: OntimeEvent,\r\n main: MaybeString,\r\n secondary: MaybeString,\r\n subscriptions: string[],\r\n customFields: CustomFields,\r\n) {\r\n const mainField = main ? getPropertyValue(event, main) ?? '' : event.title;\r\n const secondaryField = getPropertyValue(event, secondary) ?? '';\r\n\r\n // remove subscriptions that are not in customFields\r\n const sanitisedSubscriptions = subscriptions.filter((field) => Object.hasOwn(customFields, field));\r\n const subscribedData = sanitisedSubscriptions.reduce<Subscribed>((acc, id) => {\r\n const field = customFields[id];\r\n if (field) {\r\n acc.push({\r\n id,\r\n label: field.label,\r\n colour: field.colour,\r\n value: event.custom[id],\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return { mainField, secondaryField, subscribedData };\r\n}\r\n","import { CustomFields, Rundown, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../../views/utils/viewLoader.utils';\n\nexport interface OperatorData {\n rundown: Rundown;\n rundownMetadata: RundownMetadataObject;\n customFields: CustomFields;\n settings: Settings;\n}\n\nexport function useOperatorData(): ViewData<OperatorData> {\n const { data: rundown, rundownMetadata, status: rundownStatus } = useRundownWithMetadata();\n const { data: customFields, status: customFieldStatus } = useCustomFields();\n const { data: settings, status: settingsStatus } = useSettings();\n\n return {\n data: {\n rundown,\n rundownMetadata,\n customFields,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, customFieldStatus, settingsStatus]),\n };\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isOntimeEvent, isOntimeGroup, OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport { getDefaultFormat } from '../../common/utils/time';\nimport Loader from '../../views/common/loader/Loader';\n\nimport EditModal from './edit-modal/EditModal';\nimport FollowButton from './follow-button/FollowButton';\nimport OperatorEvent from './operator-event/OperatorEvent';\nimport OperatorGroup from './operator-group/OperatorGroup';\nimport StatusBar from './status-bar/StatusBar';\nimport { getOperatorOptions, useOperatorOptions } from './operator.options';\nimport type { EditEvent } from './operator.types';\nimport { getEventData } from './operator.utils';\nimport { OperatorData, useOperatorData } from './useOperatorData';\n\nimport style from './Operator.module.scss';\n\nconst selectedOffset = 50;\n\nexport default function OperatorLoader() {\n const { data, status } = useOperatorData();\n\n useWindowTitle('Operator');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Operator {...data} />;\n}\n\nfunction Operator({ rundown, rundownMetadata, customFields, settings }: OperatorData) {\n const { selectedEventId } = useSelectedEventId();\n const { subscribe, mainSource, secondarySource, shouldEdit, hidePast, showStart } = useOperatorOptions();\n\n const [showEditPrompt, setShowEditPrompt] = useState(false);\n const [editEvent, setEditEvent] = useState<EditEvent | null>(null);\n\n const [lockAutoScroll, setLockAutoScroll] = useState(false);\n const selectedRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollToComponent = useFollowComponent({\n followRef: selectedRef,\n scrollRef,\n doFollow: !lockAutoScroll,\n topOffset: selectedOffset,\n followTrigger: selectedEventId,\n });\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n\n // reset scroll if nothing is selected\n useEffect(() => {\n if (!selectedEventId) {\n if (!lockAutoScroll) {\n scrollRef.current?.scrollTo(0, 0);\n }\n }\n }, [selectedEventId, lockAutoScroll, scrollRef]);\n\n const handleOffset = () => {\n if (selectedEventId) {\n scrollToComponent();\n }\n setLockAutoScroll(false);\n };\n\n // prevent considering automated scrolls as user scrolls\n const handleUserScroll = () => {\n if (selectedRef?.current && scrollRef?.current) {\n const selectedRect = selectedRef.current.getBoundingClientRect();\n const scrollerRect = scrollRef.current.getBoundingClientRect();\n if (selectedRect && scrollerRect) {\n const distanceFromTop = selectedRect.top - scrollerRect.top;\n const hasScrolledOutOfThreshold = distanceFromTop < -8 || distanceFromTop > selectedOffset;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n timeoutId.current = setTimeout(() => {\n setShowEditPrompt(false);\n }, 700);\n\n setShowEditPrompt(true);\n\n throttledHandleScroll();\n };\n\n const handleEdit = useCallback((event: EditEvent) => {\n setEditEvent({ ...event });\n }, []);\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const operatorOptions = useMemo(() => getOperatorOptions(customFields, defaultFormat), [customFields, defaultFormat]);\n\n const canEdit = shouldEdit && subscribe.length;\n\n return (\n <div className={style.operatorContainer} data-testid='operator-view'>\n <ViewParamsEditor target={OntimeView.Operator} viewOptions={operatorOptions} />\n {editEvent && <EditModal event={editEvent} onClose={() => setEditEvent(null)} />}\n\n <StatusBar />\n\n {canEdit && (\n <div className={cx([style.editPrompt, showEditPrompt && style.show])}>Press and hold to edit user field</div>\n )}\n\n <div className={style.operatorEvents} onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {rundown.order.map((entryId) => {\n const entry = rundown.entries[entryId];\n if (isOntimeEvent(entry)) {\n const { isPast, isLinkedToLoaded, isLoaded, totalGap } = rundownMetadata[entryId];\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || entry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n entry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={entry.id}\n id={entry.id}\n colour={entry.colour}\n cue={entry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={entry.timeStart}\n duration={entry.duration}\n delay={entry.delay}\n dayOffset={entry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n }\n\n if (isOntimeGroup(entry)) {\n return (\n <Fragment key={entry.id}>\n <OperatorGroup key={entry.id} title={entry.title} />\n {entry.entries.map((nestedEntryId) => {\n const nestedEntry = rundown.entries[nestedEntryId];\n if (!isOntimeEvent(nestedEntry)) {\n return null;\n }\n\n const { isPast, isLoaded, isLinkedToLoaded, totalGap } = rundownMetadata[nestedEntryId];\n\n // hide past events (if setting) and skipped events\n if ((hidePast && isPast) || nestedEntry.skip) {\n return null;\n }\n\n const { mainField, secondaryField, subscribedData } = getEventData(\n nestedEntry,\n mainSource,\n secondarySource,\n subscribe,\n customFields,\n );\n\n return (\n <OperatorEvent\n key={nestedEntry.id}\n id={nestedEntry.id}\n colour={nestedEntry.colour}\n cue={nestedEntry.cue}\n main={mainField}\n secondary={secondaryField}\n timeStart={nestedEntry.timeStart}\n duration={nestedEntry.duration}\n delay={nestedEntry.delay}\n dayOffset={nestedEntry.dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isSelected={isLoaded}\n isPast={isPast}\n selectedRef={isLoaded ? selectedRef : undefined}\n showStart={showStart}\n subscribed={subscribedData}\n totalGap={totalGap}\n onLongPress={canEdit ? handleEdit : () => undefined}\n />\n );\n })}\n </Fragment>\n );\n }\n return null;\n })}\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n","import ProtectRoute from '../../common/components/protect-route/ProtectRoute';\n\nimport Operator from './Operator';\n\nexport default function OperatorExport() {\n return (\n <ProtectRoute permission='operator'>\n <Operator />\n </ProtectRoute>\n );\n}\n"],"names":["EditModal","props","event","onClose","updateEntry","useEntryActions","loading","setLoading","useState","inputRef","useRef","handleSave","patchObject","element","jsx","Dialog.Root","isOpen","Dialog.Portal","jsxs","Dialog.Popup","style","IconButton","IoClose","field","Fragment","Textarea","Button","RunningTime","value","hideSeconds","hideLeadingZero","className","display","formattedTime","removeLeadingZero","removeSeconds","memo","OperatorEvent","id","colour","cue","main","secondary","timeStart","duration","delay","dayOffset","isLinkedToLoaded","isSelected","isPast","selectedRef","showStart","subscribed","totalGap","onLongPress","handleLongPress","mouseHandlers","useLongPress","cueColours","getAccessibleColour","operatorClasses","cx","millisToString","OperatorEventSchedule","DelayIndicator","fieldClasses","TimeUntil","timeUntil","useTimeUntilExpectedStart","timeUntilString","MILLIS_PER_SECOND","formatDuration","MILLIS_PER_MINUTE","OperatorGroup","title","StatusBarProgress","viewSettings","current","timeWarning","timeDanger","useProgressData","MultiPartProgressBar","styles","StatusBarTimers","TimerOverview","ClockOverview","StatusBar","data","useViewSettings","getOperatorOptions","customFields","timeFormat","fieldOptions","makeOptionsFromCustomFields","customFieldSelect","makeCustomFieldSelectOptions","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","getArrayValues","isStringBoolean","useOperatorOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","getEventData","subscriptions","mainField","getPropertyValue","secondaryField","subscribedData","acc","useOperatorData","rundown","rundownMetadata","rundownStatus","useRundownWithMetadata","customFieldStatus","useCustomFields","settings","settingsStatus","useSettings","aggregateQueryStatus","selectedOffset","OperatorLoader","status","useWindowTitle","Loader","EmptyPage","Operator","selectedEventId","useSelectedEventId","subscribe","mainSource","secondarySource","shouldEdit","hidePast","showEditPrompt","setShowEditPrompt","editEvent","setEditEvent","lockAutoScroll","setLockAutoScroll","scrollRef","scrollToComponent","useFollowComponent","timeoutId","useEffect","_a","handleOffset","throttledHandleScroll","throttle","selectedRect","scrollerRect","distanceFromTop","hasScrolledOutOfThreshold","handleScroll","handleEdit","useCallback","defaultFormat","getDefaultFormat","operatorOptions","canEdit","ViewParamsEditor","OntimeView","entryId","entry","isOntimeEvent","isLoaded","isOntimeGroup","nestedEntryId","nestedEntry","FollowButton","OperatorExport","ProtectRoute"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@charset "UTF-8";._blink_s63mb_1{animation:_blink_s63mb_1 1s step-start infinite}@keyframes _blink_s63mb_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_s63mb_13{transform:rotate(45deg)}._editModal_s63mb_17{position:fixed;top:10%;left:50%;transform:translate(-50%);padding-inline:1rem;min-width:min(720px,90vw);background-color:#202020;color:#f6f6f6;border-radius:3px;box-shadow:#00000026 0 3px 3px;border:1px solid #2d2d2d}._title_s63mb_31{font-size:1.25rem;padding-block:1rem;display:flex;align-items:center;justify-content:space-between}._body_s63mb_39{flex:1;display:flex;flex-direction:column;gap:.5rem;max-height:min(80vh,600px);overflow-y:auto}._label_s63mb_48{background-color:var(--user-bg);width:fit-content;padding-inline:1rem}._footer_s63mb_54{padding-block:1rem;display:flex;align-items:center;justify-content:end;gap:1rem}._blink_k7q3c_2{animation:_blink_k7q3c_2 1s step-start infinite}@keyframes _blink_k7q3c_2{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_k7q3c_14{transform:rotate(45deg)}._mirror_k7q3c_18{transform:rotate(180deg)}._operatorContainer_k7q3c_22{width:100vw;height:100vh;background-color:#101010;color:#f6f6f6}._operatorEvents_k7q3c_29{width:100vw;height:100vh;padding-top:.25rem;overflow:auto;display:flex;flex-direction:column;gap:2px;padding-bottom:95vh}._editPrompt_k7q3c_40{position:fixed;z-index:400;left:50%;transform:translate(-50%);text-align:center;background:#000000b3;border-radius:2px;padding:.5em 2em;color:#ffbc56;opacity:0;transition-property:opacity;transition-duration:.3s}._editPrompt_k7q3c_40._show_k7q3c_54{opacity:1}._schedule_k7q3c_58{display:flex;gap:.25em}._event_k7q3c_63{opacity:1;border-top:1px solid rgba(255,255,255,.01);padding-right:.5rem;color:#ffffffe6;background-color:#ffffff0d;display:grid;align-items:center;column-gap:.5rem;row-gap:.5rem;grid-template-rows:auto auto auto;grid-template-columns:1.25rem 1fr auto;grid-template-areas:"binder main schedule" "binder secondary running" "binder fields fields"}._event_k7q3c_63._subscribed_k7q3c_77{background-color:#202020}._event_k7q3c_63._running_k7q3c_80{border-top:1px solid #1a1a1a;background-color:var(--operator-running-bg-override, #087A27)}._event_k7q3c_63._past_k7q3c_84{border-top:1px solid transparent;opacity:.2}._binder_k7q3c_89{grid-area:binder;color:#f6f6f6;height:100%;display:grid;place-content:center;position:relative;background-color:#303030}._binder_k7q3c_89 ._cue_k7q3c_98{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;width:6em;rotate:-90deg;letter-spacing:.5px}._mainField_k7q3c_108{grid-area:main;font-size:1.5rem;color:#f6f6f6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._secondaryField_k7q3c_117{grid-area:secondary;font-size:1.25rem;line-height:1em;white-space:pre-line}._plannedStart_k7q3c_124,._timeUntil_k7q3c_124{line-height:1em;background-color:#404040;padding:.25rem .5rem;border-radius:1px}._plannedStart_k7q3c_124{font-size:1.5rem;margin-right:.5rem}._timeUntil_k7q3c_124{font-size:calc(1rem - 2px);line-height:1em;grid-area:schedule;justify-self:end}._runningTime_k7q3c_143{font-size:1.25rem;line-height:1em;grid-area:running;justify-self:end;align-self:flex-start;display:flex;align-items:center;gap:.5em}._fields_k7q3c_154{grid-area:fields;font-size:var(--operator-customfield-font-size-override, 1.25rem);font-weight:400;color:#101010;margin:.25rem 0;display:flex;flex-wrap:wrap;gap:.5em;row-gap:.25em;line-height:1.25em}._fields_k7q3c_154 ._field_k7q3c_154{font-weight:600;padding-inline:.25rem}._fields_k7q3c_154 ._noColour_k7q3c_170{outline:.15rem solid #f6f6f6;outline-offset:-.15rem;padding-right:.3rem;color:#f6f6f6}._fields_k7q3c_154 ._value_k7q3c_176{display:inline-flex;padding-inline:.25rem;background-color:#202020;color:#f6f6f6;white-space:pre-line}._fields_k7q3c_154:after{content:""}._blink_c6uj3_1{animation:_blink_c6uj3_1 1s step-start infinite}@keyframes _blink_c6uj3_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_c6uj3_13{transform:rotate(45deg)}._group_c6uj3_17{width:100%;padding:.25rem .5rem;background-color:#101010;font-size:1.25rem}@media (min-width: 500px){._group_c6uj3_17{padding:.25rem 1rem}}._blink_10qhq_1{animation:_blink_10qhq_1 1s step-start infinite}@keyframes _blink_10qhq_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_10qhq_13{transform:rotate(45deg)}._statusBar_10qhq_17{position:sticky;top:0;width:100%;z-index:100;background-color:#101010}._timers_10qhq_25{padding-block:1rem .5rem;padding-inline:1rem .5rem;display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-areas:". timers clock"}._runningTimer_10qhq_33{grid-area:timers;justify-self:center}._runningTimer_10qhq_33 :nth-child(2){font-size:2.5rem;line-height:1.2}._timeNow_10qhq_42{grid-area:clock;justify-self:right}._timeNow_10qhq_42 :nth-child(2){font-size:2.5rem;line-height:1.2}._progressOverride_10qhq_51{grid-area:bar;height:1rem;--progress-bar-br: 0}._blink_1o5o0_1{animation:_blink_1o5o0_1 1s step-start infinite}@keyframes _blink_1o5o0_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1o5o0_13{transform:rotate(45deg)}._operatorContainer_1o5o0_17{width:100vw;height:100vh;background-color:#101010;color:#f6f6f6}._operatorEvents_1o5o0_24{width:100vw;height:100vh;padding-top:.25rem;overflow:auto;display:flex;flex-direction:column;gap:2px;padding-bottom:95vh}._editPrompt_1o5o0_35{position:fixed;z-index:400;left:50%;transform:translate(-50%);text-align:center;background:#000000b3;border-radius:2px;padding:.5em 2em;color:#ffbc56;opacity:0;transition-property:opacity;transition-duration:.3s}._editPrompt_1o5o0_35._show_1o5o0_49{opacity:1}._schedule_1o5o0_53{display:flex;gap:.25em}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,aY as ee,aZ as te,a_ as ae,f as se,a$ as ie,h as d,ad as re,ab as ne,av as le}from"./vendor-CCiSQ9k9.js";import{i as X,ah as oe,ae as j,ar as g,b7 as T,b8 as ce,aq as de,O as x,a9 as ue,ac as he,Y as V,ad as S,af as fe,X as me,a7 as pe,B as ve,_ as be,an as xe,b9 as M,ba as H,am as je,ag as ge,al as _e,au as we,bb as Ce}from"./index-BQEUaoAf.js";import{I as ke}from"./useWindowTitle-DqdFTWns.js";import{S as Y}from"./Select-CedN80WS.js";import{S as _,u as ye}from"./useProjectData-C1hVamxc.js";import{u as Se}from"./useCustomFields-DqCYz8Kt.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new s.Error().stack;r&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[r]="61937960-4c64-47f7-8ff2-b9bfddc30c64",s._sentryDebugIdIdentifier="sentry-dbid-61937960-4c64-47f7-8ff2-b9bfddc30c64")}catch{}})();const it=/^\d+$/,rt=/^https?:\/\//,nt=/^[a-z0-9]+$/i,Oe=/^[a-zA-Z0-9_-]*$/,Re="_blink_1cc8f_1",Ne="_fourtyfive_1cc8f_13",Ie="_radioGroup_1cc8f_17",$e="_item_1cc8f_23",De="_horizontal_1cc8f_28",Ue="_vertical_1cc8f_35",We="_radio_1cc8f_17",Ee="_indicator_1cc8f_73",I={blink:Re,fourtyfive:Ne,radioGroup:Ie,item:$e,horizontal:De,vertical:Ue,radio:We,indicator:Ee};function Z({items:s,className:r,orientation:n="vertical",onValueChange:o,...h}){return e.jsx(ee,{onValueChange:l=>o==null?void 0:o(l),className:X([I.radioGroup,I[n],r]),...h,children:s.map(l=>e.jsxs("label",{className:I.item,children:[e.jsx(te,{value:l.value.toString(),className:I.radio,children:e.jsx(ae,{className:I.indicator})}),l.label]},l.value.toString()))})}const K={hideTableSeconds:!1,hideIndexColumn:!1,showDelayedTimes:!1,hideDelays:!1},lt=se()(ie(s=>({...K,setOption:(r,n)=>s(o=>({...o,[r]:n})),toggleOption:r=>s(n=>({...n,[r]:!n[r]})),resetOptions:()=>s(K)}),{name:"cuesheet-options"})),W=[{value:"flag",label:"Flag"},{value:"cue",label:"Cue"},{value:"title",label:"Title"},{value:"timeStart",label:"Time start"},{value:"timeEnd",label:"Time end"},{value:"duration",label:"Duration"},{value:"note",label:"Note"}];function ze(s){return Object.entries(s).map(([r,n])=>({value:`custom-${r}`,label:n.label}))}const Fe="_twoCols_1wch9_17",Le="_grid_1wch9_23",G={twoCols:Fe,grid:Le};function Pe({readRef:s,writeRef:r}){const{data:n}=Se(),o=d.useMemo(()=>ze(n),[n]),[h,l]=d.useState("full"),[u,$]=d.useState("full"),[w,C]=d.useState(()=>{const t={};return[...W,...o].forEach(i=>{t[i.value]=!0}),t}),[R,D]=d.useState(()=>{const t={};return[...W,...o].forEach(i=>{t[i.value]=!0}),t}),z=t=>{l(t),C(i=>{const f={...i};return Object.keys(f).forEach(m=>{f[m]=!0}),f})},F=t=>{t==="full"&&l("full"),$(t),C(i=>{const f={...i};return D(m=>{const k={...m};return[...W,...o].forEach(N=>{f[N.value]=!0,k[N.value]=!0}),k}),f})},c=(t,i,f)=>{i==="read"?C(m=>({...m,[t]:f})):D(m=>({...m,[t]:f}))},p=()=>h==="full"||u==="full"?"full":Object.entries(w).filter(([t,i])=>i).map(([t])=>t).join(","),L=()=>u==="full"?"full":Object.entries(R).filter(([t,i])=>i).map(([t])=>t).join(",");return e.jsxs(oe,{children:[e.jsx("input",{name:"read",hidden:!0,readOnly:!0,ref:s,value:p()||"-"}),e.jsx("input",{name:"write",hidden:!0,readOnly:!0,ref:r,value:L()||"-"}),e.jsxs("div",{children:[e.jsx(j,{title:"Access mode",description:"Which parts of the data will the link give access to"}),e.jsxs("div",{children:[e.jsx(Z,{value:u,onValueChange:F,orientation:"horizontal",items:[{value:"full",label:"Full write (edit all existing and future columns)"},{value:"custom",label:"Custom write"}]}),e.jsx(Z,{value:h,onValueChange:z,orientation:"horizontal",disabled:u==="full",items:[{value:"full",label:"Full read (view all existing and future columns)"},{value:"custom",label:"Custom read"}]})]})]}),e.jsxs("div",{className:G.twoCols,children:[e.jsxs("div",{className:G.grid,children:[e.jsx(g,{children:"Ontime columns"}),e.jsx(g,{children:"Read"}),e.jsx(g,{children:"Write"}),W.map(t=>e.jsxs(d.Fragment,{children:[e.jsx("div",{children:t.label}),e.jsx(_,{checked:!!w[t.value],onCheckedChange:i=>c(t.value,"read",i),disabled:h==="full"||u==="full","data-testid":`read-${t.value}`}),e.jsx(_,{checked:!!R[t.value],onCheckedChange:i=>c(t.value,"write",i),disabled:u==="full","data-testid":`write-${t.value}`})]},t.value))]}),o.length>0&&e.jsxs("div",{className:G.grid,children:[e.jsx(g,{children:"Custom fields"}),e.jsx(g,{children:"Read"}),e.jsx(g,{children:"Write"}),o.map(t=>e.jsxs(d.Fragment,{children:[t.label,e.jsx(_,{checked:!!w[t.value],onCheckedChange:i=>c(t.value,"read",i),disabled:h==="full"||u==="full","data-testid":`read-${t.value}`}),e.jsx(_,{checked:!!R[t.value],onCheckedChange:i=>c(t.value,"write",i),disabled:u==="full","data-testid":`write-${t.value}`})]},t.value))]})]})]})}const Te="_qrCode_kmiy6_17",Ge="_column_kmiy6_23",Be="_copiableLink_kmiy6_32",qe="_shareInline_kmiy6_39",Ae="_end_kmiy6_45",O={qrCode:Te,column:Ge,copiableLink:Be,shareInline:qe,end:Ae};function Ve({hostOptions:s,pathOptions:r,presets:n,isLockedToView:o}){var B,q;const[h,l]=d.useState("pending"),[u,$]=d.useState(T),w=d.useRef(null),C=d.useRef(null),R=d.useRef(`cuesheet-${ce()}`),{addPreset:D}=de(),{handleSubmit:z,setError:F,watch:c,setValue:p,reset:L,register:t,formState:{errors:i,isDirty:f}}=re({mode:"onChange",defaultValues:{baseUrl:T,path:o?r[0].value:x.Timer,authenticate:!1,lockConfig:!1,lockNav:!1}}),m=async(a,y)=>{if(y.read==="-")throw new Error("Cannot create a share with no read permissions");return(await D({target:x.Cuesheet,enabled:!0,alias:a,search:"",options:{read:y.read,write:y.write}})).find(U=>U.alias===a)},k=async a=>{var y,P,U;try{if(l("loading"),a.path===x.Cuesheet){const v=await m(a.alias,{read:((y=w.current)==null?void 0:y.value)??"full",write:((P=C.current)==null?void 0:P.value)??"full"});if(!v)throw new Error("Failed to create URL preset for Cuesheet");const b=await M({baseUrl:a.baseUrl,path:a.path,authenticate:a.authenticate,lockConfig:a.lockConfig,lockNav:a.lockNav,preset:v.alias});await H(b),$(b)}else{const v=a.path.startsWith("preset-")?a.path.replace("preset-",""):void 0,b=v?(U=n.find(J=>J.alias===v))==null?void 0:U.target:a.path;if(!b)throw new Error(`Could not resolve preset: ${b}`);const A=await M({baseUrl:je(a.baseUrl),path:b,authenticate:a.authenticate,lockConfig:a.lockConfig,lockNav:a.lockNav,preset:v});await H(A),$(A)}L(a,{keepValues:!0,keepDirty:!1}),l("success")}catch(v){const b=ge(v);F("root",{message:b}),l("error")}},N=f||h!=="success";return e.jsxs("form",{onSubmit:z(k),onKeyDown:a=>ue(a),children:[!o&&e.jsx(ke,{children:"You can generate a link to share with your team or to use in automation (such as companion)."}),e.jsxs("div",{className:O.shareInline,children:[e.jsxs("div",{className:O.column,children:[e.jsxs(he,{children:[V?e.jsx("input",{hidden:!0,readOnly:!0,name:"baseUrl",value:T}):e.jsxs(S,{children:[e.jsx(j,{title:"Host IP",description:`Which IP address will be used${V?" (not applicable in Ontime Cloud)":""}`}),e.jsx(Y,{options:s,value:c("baseUrl"),onValueChange:a=>p("baseUrl",a)})]}),o?e.jsx("input",{type:"hidden",value:c("path")}):e.jsxs(S,{children:[e.jsx(j,{title:"Ontime view",description:"Which view or preset will the link point to"}),e.jsx(Y,{options:r,value:c("path"),onValueChange:a=>p("path",a,{shouldDirty:!0})})]}),c("path")===x.Cuesheet&&e.jsxs(e.Fragment,{children:[e.jsxs(S,{children:[e.jsx(j,{title:"Preset alias",description:"The name of the preset we will create to hold this options",error:(B=i.alias)==null?void 0:B.message}),e.jsx(fe,{defaultValue:R.current,...t("alias",{required:"Alias cannot be empty and must be unique",pattern:{value:Oe,message:"Field can only contain URL safe characters (a-z, 0-9, _ and -)"}})})]}),e.jsx(Pe,{readRef:w,writeRef:C})]}),e.jsxs(S,{children:[e.jsx(j,{title:"Lock navigation",description:"Whether to hide the navigation menu"}),e.jsx(_,{size:"large",name:"lockNav","data-testid":"lockNav",checked:c("lockNav"),onCheckedChange:a=>p("lockNav",a,{shouldDirty:!0}),disabled:c("lockConfig")})]}),c("path")!==x.Cuesheet&&e.jsxs(S,{children:[e.jsx(j,{title:"Lock configuration",description:"Whether to hide the configuration panel (also hides navigation)"}),e.jsx(_,{size:"large",name:"lockConfig","data-testid":"lockConfig",checked:c("lockConfig"),onCheckedChange:a=>{a&&p("lockNav",a,{shouldDirty:!0}),p("lockConfig",a,{shouldDirty:!0})}})]}),e.jsxs(S,{children:[e.jsx(j,{title:"Authenticate",description:"Whether the URL should be pre-authenticated"}),e.jsx(_,{size:"large",name:"authenticate","data-testid":"authenticate",checked:c("authenticate"),onCheckedChange:a=>p("authenticate",a,{shouldDirty:!0})})]})]}),e.jsx(me,{children:(q=i.root)==null?void 0:q.message}),e.jsx(pe,{align:"end",className:O.end,children:e.jsx(ve,{type:"submit",variant:N?"primary":"subtle",loading:h==="loading",children:N?"Create share link":"Link copied to clipboard!"})})]}),e.jsxs(be,{className:O.column,children:[e.jsx(g,{children:"Share this link"}),e.jsx(ne,{size:172,value:u,className:O.qrCode}),e.jsx("div",{className:O.copiableLink,"data-testid":"copy-link",children:u}),e.jsx(xe,{copyValue:u,children:"Copy link"})]})]})]})}function ot({lockedPath:s}){const{data:r}=_e(),{data:n}=we({skip:s===void 0}),o=d.useMemo(()=>r.networkInterfaces.map(l=>({value:`http://${l.address}:${r.serverPort}`,label:`${l.name} - ${l.address}`})),[r.networkInterfaces,r.serverPort]),h=d.useMemo(()=>s?[{value:s.value,label:s.label}]:[{value:x.Timer,label:"Timer"},{value:x.Cuesheet,label:"Cuesheet"},{value:x.Operator,label:"Operator"},{value:"<<companion>>",label:"Companion"},...n.map(l=>({value:`preset-${l.alias}`,label:`URL Preset: ${l.alias}`}))],[s,n]);return e.jsx(Ve,{hostOptions:o,pathOptions:h,presets:n,isLockedToView:!!s})}const Me="_title_g70eo_17",He="_description_g70eo_24",Q={title:Me,description:He};function ct(){const{data:s}=ye();return!s.title&&!s.description?null:e.jsxs("div",{children:[e.jsx("div",{className:Q.title,children:s.title}),e.jsx("div",{className:Q.description,children:s.description})]})}const Ye="_overview_zh5tn_17",Ze="_isOffline_zh5tn_24",Ke="_info_zh5tn_24",Qe="_nav_zh5tn_39",E={overview:Ye,isOffline:Ze,info:Ke,nav:Qe};function dt({navElements:s,children:r}){const{isOnline:n}=Ce();return e.jsx("div",{className:X([E.overview,!n&&E.isOffline]),children:e.jsxs(le,{children:[e.jsx("div",{className:E.nav,children:s}),e.jsx("div",{className:E.info,children:r})]})})}export{ot as G,dt as O,Z as R,ct as T,nt as a,it as i,rt as s,lt as u};
|
|
2
|
-
//# sourceMappingURL=OverviewWrapper-BveJ6GjK.js.map
|
|
Binary file
|
|
Binary file
|