@getontime/cli 4.1.0 → 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-BBNxpds0.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-CFCDQ7FN.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-D55c8JBz.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-C-JO_XAr.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-BSzsxpGg.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-Mox6N4JW.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-krcwDRb-.js.map → Modal-Bn1bZkwb.js.map} +1 -1
- 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-BXQbpM-j.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-MGJ1uE5W.js → OverviewWrapper-1Vj3_ojX.js} +2 -2
- package/client/assets/OverviewWrapper-1Vj3_ojX.js.br +0 -0
- package/client/assets/OverviewWrapper-1Vj3_ojX.js.gz +0 -0
- package/client/assets/{OverviewWrapper-MGJ1uE5W.js.map → OverviewWrapper-1Vj3_ojX.js.map} +1 -1
- 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-CJ-GLvVG.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-DJ9xZnPI.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-BLA-yQMq.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-DNjZ46Qf.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-DNjZ46Qf.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-C8ypTVpH.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-DU09ewqh.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-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-i0ZDpUx7.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-BgOtucv6.js.map → TitleCard-1U35ek0D.js.map} +1 -1
- package/client/assets/{Tooltip-C0rGHLsB.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-C0rGHLsB.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--9miplQv.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-WYqMzV9D.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-WYqMzV9D.js.map → dateConfig-_BhycZza.js.map} +1 -1
- package/client/assets/{editorSettings-CCHx-wCx.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-CCHx-wCx.js.map → editorSettings-DH9ca-nB.js.map} +1 -1
- package/client/assets/{getProgress-B94Ieskb.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-B94Ieskb.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-Bc1pSJR2.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-BpzbtG9F.js.map → playbackstate-B3BKJ8cT.js.map} +1 -1
- package/client/assets/{presentation.utils-B2baBe3j.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-B2baBe3j.js.map → presentation.utils-B-wIv_a5.js.map} +1 -1
- package/client/assets/{rundownUtils-H6xvQyre.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-H6xvQyre.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-Da0Li7nQ.js.map → useCustomFields-BUJkzZvM.js.map} +1 -1
- package/client/assets/{useFollowComponent-Qo3FobyV.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-Qo3FobyV.js.map → useFollowComponent-Eyo4hWVG.js.map} +1 -1
- package/client/assets/{useProjectData-DW06zQvF.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-DW06zQvF.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-DhFY2L8v.js.map → useReport-BUCsRa2T.js.map} +1 -1
- package/client/assets/{useRundown-ihoU8qBi.js → useRundown-BFae0_bU.js} +2 -2
- package/client/assets/useRundown-BFae0_bU.js.br +0 -0
- package/client/assets/useRundown-BFae0_bU.js.gz +0 -0
- package/client/assets/{useRundown-ihoU8qBi.js.map → useRundown-BFae0_bU.js.map} +1 -1
- 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-B2UzPuki.js.map → useWindowTitle-DU8NlxIu.js.map} +1 -1
- package/client/assets/{validateEvent-BJMwP_mq.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-BJMwP_mq.js.map → validateEvent-3adKsP1N.js.map} +1 -1
- package/client/assets/{vendor-9UkPSc5K.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-9UkPSc5K.js.map → vendor-BoH5HFNN.js.map} +1 -1
- package/client/assets/{viewLoader.utils-DQGhrjSp.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-DQGhrjSp.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 +70 -70
- package/client/assets/Backstage-BhtXVpms.js +0 -2
- package/client/assets/Backstage-BhtXVpms.js.br +0 -0
- package/client/assets/Backstage-BhtXVpms.js.gz +0 -0
- package/client/assets/Backstage-BhtXVpms.js.map +0 -1
- package/client/assets/Countdown-NmGi1KMx.js +0 -2
- package/client/assets/Countdown-NmGi1KMx.js.br +0 -0
- package/client/assets/Countdown-NmGi1KMx.js.gz +0 -0
- package/client/assets/Countdown-NmGi1KMx.js.map +0 -1
- package/client/assets/CustomTranslationModal-BBNxpds0.js +0 -2
- package/client/assets/CustomTranslationModal-BBNxpds0.js.br +0 -0
- package/client/assets/CustomTranslationModal-BBNxpds0.js.gz +0 -0
- package/client/assets/DelayIndicator-CFCDQ7FN.js +0 -2
- package/client/assets/DelayIndicator-CFCDQ7FN.js.br +0 -0
- package/client/assets/DelayIndicator-CFCDQ7FN.js.gz +0 -0
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js +0 -2
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-D55c8JBz.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-CFE106qQ.js +0 -2
- package/client/assets/EditorUtils-CFE106qQ.js.br +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js.gz +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js.map +0 -1
- package/client/assets/Empty-C-JO_XAr.js +0 -2
- package/client/assets/Empty-C-JO_XAr.js.br +0 -2
- package/client/assets/Empty-C-JO_XAr.js.gz +0 -0
- package/client/assets/EmptyPage-BSzsxpGg.js +0 -2
- package/client/assets/EmptyPage-BSzsxpGg.js.br +0 -1
- package/client/assets/EmptyPage-BSzsxpGg.js.gz +0 -0
- package/client/assets/FollowButton-Mox6N4JW.js +0 -2
- package/client/assets/FollowButton-Mox6N4JW.js.br +0 -0
- package/client/assets/FollowButton-Mox6N4JW.js.gz +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js +0 -2
- package/client/assets/MessageControlExport-BL2ip9qN.js.br +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js.gz +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js.map +0 -1
- 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/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-DcWPGKNK.js +0 -2
- package/client/assets/MilestoneEditor-DcWPGKNK.js.br +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js.gz +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js.map +0 -1
- package/client/assets/Modal-krcwDRb-.js +0 -2
- package/client/assets/Modal-krcwDRb-.js.br +0 -0
- package/client/assets/Modal-krcwDRb-.js.gz +0 -0
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js +0 -2
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js.gz +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js +0 -2
- package/client/assets/OperatorExport-C50KHBrD.js.br +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js.gz +0 -0
- package/client/assets/OperatorExport-C50KHBrD.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-MGJ1uE5W.js.br +0 -0
- package/client/assets/OverviewWrapper-MGJ1uE5W.js.gz +0 -0
- 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-CJ-GLvVG.js +0 -2
- package/client/assets/ProjectInfo-CJ-GLvVG.js.br +0 -0
- package/client/assets/ProjectInfo-CJ-GLvVG.js.gz +0 -0
- package/client/assets/ProtectRoute-DJ9xZnPI.js +0 -2
- package/client/assets/ProtectRoute-DJ9xZnPI.js.br +0 -0
- package/client/assets/ProtectRoute-DJ9xZnPI.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js +0 -2
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.br +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.map +0 -1
- package/client/assets/ProtectedCuesheet-CMTscjjR.css.br +0 -0
- package/client/assets/ProtectedCuesheet-CMTscjjR.css.gz +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.js +0 -3
- package/client/assets/ProtectedEditor-Bl4wV72N.js.br +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.js.gz +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.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/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-D9tXNXPy.js +0 -2
- package/client/assets/RundownEntry-D9tXNXPy.js.br +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.js.gz +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.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-D6uAmFbb.js +0 -3
- package/client/assets/RundownExport-D6uAmFbb.js.br +0 -0
- package/client/assets/RundownExport-D6uAmFbb.js.gz +0 -0
- package/client/assets/RundownExport-D6uAmFbb.js.map +0 -1
- package/client/assets/Select-BLA-yQMq.js +0 -2
- package/client/assets/Select-BLA-yQMq.js.br +0 -0
- package/client/assets/Select-BLA-yQMq.js.gz +0 -0
- package/client/assets/Studio-DbP92DTf.js +0 -2
- package/client/assets/Studio-DbP92DTf.js.br +0 -0
- package/client/assets/Studio-DbP92DTf.js.gz +0 -0
- package/client/assets/Studio-DbP92DTf.js.map +0 -1
- package/client/assets/StyleEditor-DNjZ46Qf.js.br +0 -0
- package/client/assets/StyleEditor-DNjZ46Qf.js.gz +0 -0
- package/client/assets/SuperscriptTime-C8ypTVpH.js +0 -2
- package/client/assets/SuperscriptTime-C8ypTVpH.js.br +0 -0
- package/client/assets/SuperscriptTime-C8ypTVpH.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-DlEBhXe0.js +0 -2
- package/client/assets/TimeElements-DlEBhXe0.js.br +0 -0
- package/client/assets/TimeElements-DlEBhXe0.js.gz +0 -0
- package/client/assets/TimeElements-DlEBhXe0.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-DU09ewqh.js +0 -2
- package/client/assets/TimeInput-DU09ewqh.js.br +0 -0
- package/client/assets/TimeInput-DU09ewqh.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-DTwqRihn.js +0 -2
- package/client/assets/TimelinePage-DTwqRihn.js.br +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js.gz +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js.map +0 -1
- package/client/assets/Timer-jjWAunJc.js +0 -2
- package/client/assets/Timer-jjWAunJc.js.br +0 -0
- package/client/assets/Timer-jjWAunJc.js.gz +0 -0
- package/client/assets/Timer-jjWAunJc.js.map +0 -1
- package/client/assets/TimerControlExport-D8kqHQB0.css.br +0 -0
- package/client/assets/TimerControlExport-D8kqHQB0.css.gz +0 -0
- package/client/assets/TimerControlExport-i0ZDpUx7.js +0 -2
- package/client/assets/TimerControlExport-i0ZDpUx7.js.br +0 -0
- package/client/assets/TimerControlExport-i0ZDpUx7.js.gz +0 -0
- package/client/assets/TitleCard-BgOtucv6.js +0 -2
- package/client/assets/TitleCard-BgOtucv6.js.br +0 -0
- package/client/assets/TitleCard-BgOtucv6.js.gz +0 -0
- package/client/assets/Tooltip-C0rGHLsB.js.br +0 -0
- package/client/assets/Tooltip-C0rGHLsB.js.gz +0 -0
- package/client/assets/ViewLogo--9miplQv.js +0 -2
- package/client/assets/ViewLogo--9miplQv.js.br +0 -0
- package/client/assets/ViewLogo--9miplQv.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-BFu_0oIb.js +0 -2
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.br +0 -0
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.gz +0 -0
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.map +0 -1
- package/client/assets/dateConfig-WYqMzV9D.js.br +0 -0
- package/client/assets/dateConfig-WYqMzV9D.js.gz +0 -0
- package/client/assets/editorSettings-CCHx-wCx.js.br +0 -0
- package/client/assets/editorSettings-CCHx-wCx.js.gz +0 -0
- package/client/assets/getProgress-B94Ieskb.js.br +0 -0
- package/client/assets/getProgress-B94Ieskb.js.gz +0 -0
- package/client/assets/index-De0uf0Ta.css.br +0 -0
- package/client/assets/index-De0uf0Ta.css.gz +0 -0
- package/client/assets/index-njXwwjfn.js +0 -3
- package/client/assets/index-njXwwjfn.js.br +0 -0
- package/client/assets/index-njXwwjfn.js.gz +0 -0
- package/client/assets/index-njXwwjfn.js.map +0 -1
- package/client/assets/offset-D1q-72D-.js +0 -2
- package/client/assets/offset-D1q-72D-.js.br +0 -0
- package/client/assets/offset-D1q-72D-.js.gz +0 -0
- package/client/assets/offset-D1q-72D-.js.map +0 -1
- package/client/assets/parseUserTime-Bc1pSJR2.js +0 -2
- package/client/assets/parseUserTime-Bc1pSJR2.js.br +0 -0
- package/client/assets/parseUserTime-Bc1pSJR2.js.gz +0 -0
- package/client/assets/playbackstate-BpzbtG9F.js +0 -2
- package/client/assets/playbackstate-BpzbtG9F.js.br +0 -0
- package/client/assets/playbackstate-BpzbtG9F.js.gz +0 -0
- package/client/assets/presentation.utils-B2baBe3j.js.br +0 -0
- package/client/assets/presentation.utils-B2baBe3j.js.gz +0 -0
- package/client/assets/rundownUtils-H6xvQyre.js.br +0 -0
- package/client/assets/rundownUtils-H6xvQyre.js.gz +0 -0
- package/client/assets/useCustomFields-Da0Li7nQ.js +0 -2
- package/client/assets/useCustomFields-Da0Li7nQ.js.br +0 -0
- package/client/assets/useCustomFields-Da0Li7nQ.js.gz +0 -0
- package/client/assets/useFollowComponent-Qo3FobyV.js.br +0 -0
- package/client/assets/useFollowComponent-Qo3FobyV.js.gz +0 -0
- package/client/assets/useProjectData-DW06zQvF.js.br +0 -0
- package/client/assets/useProjectData-DW06zQvF.js.gz +0 -0
- package/client/assets/useReport-DhFY2L8v.js +0 -2
- package/client/assets/useReport-DhFY2L8v.js.br +0 -0
- package/client/assets/useReport-DhFY2L8v.js.gz +0 -0
- package/client/assets/useRundown-ihoU8qBi.js.br +0 -0
- package/client/assets/useRundown-ihoU8qBi.js.gz +0 -0
- package/client/assets/useWindowTitle-B2UzPuki.js +0 -2
- package/client/assets/useWindowTitle-B2UzPuki.js.br +0 -0
- package/client/assets/useWindowTitle-B2UzPuki.js.gz +0 -0
- package/client/assets/validateEvent-BJMwP_mq.js.br +0 -0
- package/client/assets/validateEvent-BJMwP_mq.js.gz +0 -0
- package/client/assets/vendor-9UkPSc5K.js.br +0 -0
- package/client/assets/vendor-9UkPSc5K.js.gz +0 -0
- package/client/assets/viewLoader.utils-DQGhrjSp.js.br +0 -0
- package/client/assets/viewLoader.utils-DQGhrjSp.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-9UkPSc5K.js";import{L as g,T as p}from"./EditorUtils-CFE106qQ.js";import{T as S,A as W,s as ge}from"./TimeInput-DU09ewqh.js";import{u as T,m as ve}from"./dateConfig-WYqMzV9D.js";import{u as J}from"./useCustomFields-Da0Li7nQ.js";import{T as O,E as P}from"./validateEvent-BJMwP_mq.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-njXwwjfn.js";import{S as R}from"./Select-BLA-yQMq.js";import{S as ae}from"./useProjectData-DW06zQvF.js";import{T as I}from"./Tooltip-C0rGHLsB.js";import{p as ie}from"./parseUserTime-Bc1pSJR2.js";import{S as Q,u as re,T as te}from"./Modal-krcwDRb-.js";import{g as Ee}from"./offset-D1q-72D-.js";import{T as ke}from"./editorSettings-CCHx-wCx.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-DcWPGKNK.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MilestoneEditor-DcWPGKNK.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,2 +0,0 @@
|
|
|
1
|
-
import{e as i,k as w,j as a,br as N,h as k,bs as b,bt as g,bu as y,bv as h,bw as m,bx as x,by as j,D,p as $,q as v,s as C,t as I}from"./vendor-9UkPSc5K.js";import{aw as E,aE as S,bx as M,i as P,ai as A}from"./index-njXwwjfn.js";import{s as u,d as T}from"./useProjectData-DW06zQvF.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new s.Error().stack;e&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[e]="512a43b9-7ad4-4f5d-8c3d-dfbd53802719",s._sentryDebugIdIdentifier="sentry-dbid-512a43b9-7ad4-4f5d-8c3d-dfbd53802719")}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 as(s,e){return(await i.put(`${c}/trigger/${s}`,e)).data}function es(s){return i.delete(`${c}/trigger/${s}`)}async function ts(s){return(await i.post(`${c}/automation`,s)).data}async function ns(s,e){return(await i.put(`${c}/automation/${s}`,e)).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:e,isFetching:n,isError:o,refetch:t}=w({queryKey:M,queryFn:F,placeholderData:(r,p)=>r,retry:5,retryDelay:r=>r*2500,refetchInterval:S,networkMode:"always"});return{data:s??O,status:e,isFetching:n,isError:o,refetch:t}}const B="_tag_1hjkh_17",q={tag:B};function cs({children:s}){return a.jsx("span",{className:q.tag,children:s})}function R({color:s,isSelected:e,onClick:n}){const o=r=>{n==null||n(s),r.preventDefault(),r.stopPropagation()},t=P([u.swatch,e&&u.selected,n&&u.selectable]);return s?a.jsx("div",{className:t,style:{backgroundColor:`${s}`},onClick:o}):a.jsx("div",{className:t,onClick:o,children:a.jsx(N,{})})}const f=["","#FFCC78","#FFAB33","#77C785","#339E4E","#779BE7","#3E75E8","#FF7878","#ED3333","#A790F5","#8064E1","#9d9d9d","#ececec"];function ds(s){const{value:e,name:n,handleChange:o}=s,t=k.useCallback(r=>{r!==e&&o(n,r)},[o,n,e]);return a.jsxs("div",{className:u.list,children:[f.map(r=>a.jsx(R,{color:r,onClick:t,isSelected:e===r},r)),a.jsx(T,{color:e,onChange:t,isSelected:!f.includes(e)})]})}const Q="_positioner_18ray_17",U="_popup_18ray_21",K="_item_18ray_39",z="_separator_18ray_75",d={positioner:Q,popup:U,item:K,separator:z};function ls({items:s,children:e,...n}){return a.jsxs(b,{children:[a.jsx(g,{...n,children:e}),a.jsx(y,{children:a.jsx(h,{className:d.positioner,align:"start",sideOffset:8,children:a.jsx(m,{className:d.popup,children:s.map((o,t)=>o.type==="divider"?a.jsx(x,{className:d.separator},t):a.jsxs(j,{className:d.item,onClick:o.onClick,disabled:o.disabled,"data-type":o.type,children:[o.icon&&a.jsx(o.icon,{}),o.label]},t))})})})]})}function us({items:s,isOpen:e,position:n,onClose:o}){return a.jsxs(b,{open:e,onOpenChange:t=>{t||o()},children:[a.jsx(g,{style:{position:"fixed",left:n.x,top:n.y},"aria-hidden":!0}),a.jsx(y,{children:a.jsx(h,{className:d.positioner,align:"start",sideOffset:8,alignOffset:8,children:a.jsx(m,{className:d.popup,children:s.map((t,r)=>t.type==="divider"?a.jsx(x,{className:d.separator},r):a.jsxs(j,{className:d.item,onClick:t.onClick,disabled:t.disabled,children:[t.icon&&a.jsx(t.icon,{}),t.label]},r))})})})]})}const G="_modal_4rabb_17",H="_backdrop_4rabb_34",J="_title_4rabb_44",L="_body_4rabb_53",W="_footer_4rabb_61",l={modal:G,backdrop:H,title:J,body:L,footer:W};function ps({isOpen:s,title:e,showCloseButton:n,showBackdrop:o,bodyElements:t,footerElements:r,onClose:p}){return a.jsx(D,{open:s,onOpenChange:_=>{_||p()},dismissible:!1,children:a.jsxs($,{children:[o&&a.jsx(v,{className:l.backdrop}),a.jsxs(C,{className:l.modal,children:[a.jsxs("div",{className:l.title,children:[e,n&&a.jsx(A,{variant:"subtle-white",onClick:p,children:a.jsx(I,{})})]}),a.jsx("div",{className:l.body,children:t}),a.jsx("div",{className:l.footer,children:r})]})]})})}export{ls as D,ps as M,us as P,ds as S,cs as T,ns as a,ts as b,as as c,os as d,V as e,ss as f,es as g,R as h,rs as t,is as u};
|
|
2
|
-
//# sourceMappingURL=Modal-krcwDRb-.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as r}from"./vendor-9UkPSc5K.js";import{g as a}from"./getProgress-B94Ieskb.js";import{i as l}from"./index-njXwwjfn.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-BXQbpM-j.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-9UkPSc5K.js";import{P as ae}from"./ProtectRoute-DJ9xZnPI.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-njXwwjfn.js";import{t as Ee,i as H,j as Ce}from"./useRundown-ihoU8qBi.js";import{E as Ne}from"./EmptyPage-BSzsxpGg.js";import{m as Pe,e as Te,O as I,i as U,g as z,V as Fe}from"./ViewParamsEditor-BFu_0oIb.js";import{u as ke}from"./useFollowComponent-Qo3FobyV.js";import{u as De}from"./useWindowTitle-B2UzPuki.js";import{T as qe}from"./editorSettings-CCHx-wCx.js";import{u as Le}from"./dateConfig-WYqMzV9D.js";import{F as Me}from"./FollowButton-Mox6N4JW.js";import{D as Re}from"./DelayIndicator-CFCDQ7FN.js";import{f as Be,T as Ie,C as Ue}from"./TimeElements-DlEBhXe0.js";import{M as Ae}from"./MultiPartProgressBar-BXQbpM-j.js";import{g as Ve,a as $e}from"./viewLoader.utils-DQGhrjSp.js";import{u as We}from"./useCustomFields-Da0Li7nQ.js";import"./useProjectData-DW06zQvF.js";import"./Empty-C-JO_XAr.js";import"./Select-BLA-yQMq.js";import"./validateEvent-BJMwP_mq.js";import"./parseUserTime-Bc1pSJR2.js";import"./rundownUtils-H6xvQyre.js";import"./Tooltip-C0rGHLsB.js";import"./offset-D1q-72D-.js";import"./playbackstate-BpzbtG9F.js";import"./getProgress-B94Ieskb.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]="40fb587a-8b70-4475-8ef7-61c053843665",t._sentryDebugIdIdentifier="sentry-dbid-40fb587a-8b70-4475-8ef7-61c053843665")}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-C50KHBrD.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OperatorExport-C50KHBrD.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":"s3DAkBA,SAAwBA,GAAUC,EAAuB,CACjD,KAAA,CAAE,MAAAC,EAAO,QAAAC,CAAA,EAAYF,EAErB,CAAE,YAAAG,CAAY,EAAIC,GAAgB,EAClC,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtCC,EAAWC,EAAAA,OAA8B,IAAI,KAA4B,EAEzEC,EAAa,SAAY,CACzB,GAAA,CAACF,EAAS,QAAS,OACvBF,EAAW,EAAI,EAEf,MAAMK,EAAoC,CAAE,GAAIV,EAAM,EAAG,EAEhDO,EAAA,QAAQ,QAASI,GAAY,CAChCA,EAAQ,QAAQ,OAASA,EAAQ,cAAgBA,EAAQ,QACvDD,EAAY,OACdA,EAAY,OAAOC,EAAQ,QAAQ,KAAK,EAAIA,EAAQ,MAEpD,OAAO,OAAOD,EAAa,CAAE,OAAQ,CAAE,CAACC,EAAQ,QAAQ,KAAK,EAAGA,EAAQ,OAAS,EAErF,CACD,EAEGD,EAAY,QACd,MAAMR,EAAYQ,CAAW,EAG/BL,EAAW,EAAK,EACRJ,EAAA,CACV,EAGE,OAAAW,EAAA,IAACC,GAAA,CACC,KAAI,GACJ,aAAeC,GAAW,CACnBA,GAAgBb,EAAA,CACvB,EAEA,SAAAW,EAAA,IAACG,GAAA,CACC,SAAAC,EAAAA,KAACC,GAAA,CAAa,UAAWC,EAAM,UAC7B,SAAA,CAACF,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,MACnB,SAAA,CAAA,yBAAyBlB,EAAM,GAAG,GACnCY,EAAAA,IAACO,GAAW,CAAA,QAAQ,eAAe,QAASlB,EAAS,SAAUG,EAC7D,SAACQ,EAAA,IAAAQ,GAAA,CAAQ,CAAA,CACX,CAAA,CAAA,EACF,EACAR,EAAAA,IAAC,OAAI,UAAWM,EAAM,KACnB,SAAMlB,EAAA,cAAc,IAAKqB,UAErBC,WACC,CAAA,SAAA,CAAAV,EAAA,IAAC,QAAM,CAAA,QAASS,EAAM,GAAI,UAAWH,EAAM,MAAO,MAAO,CAAE,YAAaG,EAAM,MAAO,EAClF,WAAM,MACT,EACAT,EAAA,IAACW,GAAA,CACC,KAAMF,EAAM,GACZ,IAAMV,GAAY,CACZA,GAASJ,EAAS,QAAQ,KAAKI,CAAO,CAC5C,EACA,YAAa,iBAAiBU,EAAM,KAAK,SACzC,aAAcA,EAAM,MACpB,aAAYA,EAAM,GAClB,SAAUjB,EACV,KAAM,CAAA,CAAA,CACR,CAAA,EAdaiB,EAAM,EAerB,CAEH,EACH,EAECL,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,OACpB,SAAA,CAACN,EAAAA,IAAAY,EAAA,CAAO,QAAQ,SAAS,KAAK,QAAQ,QAASvB,EAAS,SAAUG,EAAS,SAE3E,QAAA,CAAA,EACAQ,EAAAA,IAACY,EAAO,CAAA,QAAQ,UAAU,KAAK,QAAQ,QAASf,EAAY,SAAUL,EAAS,SAE/E,MAAA,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAEJ,CCnFA,SAAwBqB,GAAY1B,EAAyB,CAC3D,KAAM,CAAE,MAAA2B,EAAO,YAAAC,EAAa,gBAAAC,EAAiB,UAAAC,CAAc,EAAA9B,EAC3D,IAAI+B,EAAUC,GAAcL,EAAOC,GAAeC,EAAkB,EAAI,CAAC,EAEzE,OAAIA,IACFE,EAAUE,GAAkBF,CAAO,GAGjCH,IACFG,EAAUG,GAAcH,CAAO,GAG1BlB,EAAAA,IAAC,MAAI,CAAA,UAAAiB,EAAuB,SAAQC,CAAA,CAAA,CAC7C,4fCGeI,EAAAA,EAAAA,KAAKC,EAAa,EACjC,SAASA,GAAc,CACrB,GAAAC,EACA,OAAAC,EACA,IAAAC,EACA,KAAAC,EACA,UAAAC,EACA,UAAAC,EACA,SAAAC,EACA,MAAAC,EACA,UAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,OAAAC,EACA,YAAAC,EACA,UAAAC,EACA,WAAAC,EACA,SAAAC,EACA,YAAAC,CACF,EAAuB,CAIf,MAAAC,EAAmBrD,GAA2B,CAElDA,GAAA,MAAAA,EAAO,iBACHkD,GACFE,EAAY,CAAE,GAAAhB,EAAI,IAAAE,EAAK,cAAeY,EAAY,CAEtD,EAEMI,EAAgBC,GAAaF,CAAe,EAC5CG,EAAanB,GAAUoB,GAAoBpB,CAAM,EAEjDqB,EAAkBC,EAAG,CACzBzC,EAAM,MACN4B,GAAc5B,EAAM,QACpB6B,GAAU7B,EAAM,IAAA,CACjB,EAGC,OAAAF,EAAA,KAAC,MAAI,CAAA,UAAW0C,EAAiB,cAAapB,EAAK,IAAKU,EAAa,cAAeK,EAAkB,GAAGC,EACvG,SAAA,CAAA1C,MAAC,MAAI,CAAA,UAAWM,EAAM,OAAQ,MAAO,CAAE,GAAGsC,CAAW,EACnD,eAAC,OAAK,CAAA,UAAWtC,EAAM,IAAM,UAAI,CAAA,EACnC,EAECF,EAAA,KAAA,OAAA,CAAK,UAAWE,EAAM,UACpB,SAAA,CAAA+B,SAAc,OAAK,CAAA,UAAW/B,EAAM,aAAe,SAAA0C,GAAenB,CAAS,EAAE,EAC7EF,CAAA,EACD,EACD3B,EAAA,IAAA,OAAA,CAAK,UAAWM,EAAM,eAAiB,SAAUsB,EAAA,EAClD5B,EAAA,IAACiD,GAAA,CACC,UAAApB,EACA,OAAAM,EACA,WAAAD,EACA,MAAAH,EACA,UAAAC,EACA,SAAAO,EACA,iBAAAN,CAAA,CACF,EACC7B,EAAA,KAAA,OAAA,CAAK,UAAWE,EAAM,YACrB,SAAA,CAACN,EAAAA,IAAAkD,GAAA,CAAe,WAAYnB,CAAO,CAAA,EAClC/B,EAAAA,IAAAa,GAAA,CAAY,UAAWkC,EAAG,CAACb,GAAc5B,EAAM,KAAK,CAAC,EAAG,MAAOwB,EAAU,gBAAe,EAAC,CAAA,CAAA,EAC5F,EAEC9B,EAAA,IAAA,MAAA,CAAI,UAAWM,EAAM,OACnB,SACEgC,EAAA,OAAQ7B,GAAUA,EAAM,KAAK,EAC7B,IAAKA,GAAU,CACR,MAAA0C,EAAeJ,EAAG,CAACzC,EAAM,MAAQG,EAAM,OAA0B,KAAjBH,EAAM,QAAe,CAAC,EAC5E,cACG,MACC,CAAA,SAAA,CAACN,EAAAA,IAAA,OAAA,CAAK,UAAWmD,EAAc,MAAO,CAAE,gBAAiB1C,EAAM,MAC5D,EAAA,SAAAA,EAAM,KACT,CAAA,EACCT,EAAAA,IAAA,OAAA,CAAK,UAAWM,EAAM,MAAO,MAAO,CAAE,MAAOG,EAAM,MAAA,EACjD,SAAAA,EAAM,KACT,CAAA,CAAA,CAAA,EANQA,EAAM,EAOhB,CAAA,CAEH,CACL,CAAA,CAAA,EACF,CAEJ,CAWA,SAASwC,GAAsB,CAC7B,UAAApB,EACA,OAAAM,EACA,WAAAD,EACA,MAAAH,EACA,UAAAC,EACA,SAAAO,EACA,iBAAAN,CACF,EAA+B,CAC7B,OAAIE,EACMnC,EAAA,IAAA,OAAA,CAAK,UAAWM,EAAM,UAAW,SAAI,OAAA,EAG3C4B,EACMlC,EAAA,IAAA,OAAA,CAAK,UAAWM,EAAM,UAAW,SAAI,OAAA,EAI7CN,EAAA,IAACoD,GAAA,CACC,UAAAvB,EACA,MAAAE,EACA,UAAAC,EACA,SAAAO,EACA,iBAAAN,CAAA,CACF,CAEJ,CASA,SAASmB,GAAU,CAAE,UAAAvB,EAAW,MAAAE,EAAO,UAAAC,EAAW,SAAAO,EAAU,iBAAAN,GAAoC,CAExF,MAAAoB,EAAYC,GAA0B,CAAE,UAAAzB,EAAW,MAAAE,EAAO,UAAAC,GAAa,CAAE,SAAAO,EAAU,iBAAAN,EAAkB,EAGrGsB,EADQF,EAAYG,GACM,MAAQ,GAAGC,GAAe,KAAK,IAAIJ,CAAS,EAAGA,EAAY,EAAIK,EAAiB,CAAC,GAEjH,aAAQ,OAAK,CAAA,UAAWpD,EAAM,UAAW,cAAY,aAAc,SAAgBiD,EAAA,CACrF,0CClKejC,GAAAA,EAAAA,KAAKqC,EAAa,EACjC,SAASA,GAAc,CAAE,MAAAC,GAAwB,CAC/C,OAAQ5D,EAAA,IAAA,MAAA,CAAI,UAAWM,GAAM,MAAQ,SAAMsD,EAAA,CAC7C,mNCAwB,SAAAC,GAAkB,CAAE,aAAAC,GAAwC,CAClF,KAAM,CAAE,QAAAC,EAAS,SAAAjC,EAAU,YAAAkC,EAAa,WAAAC,CAAA,EAAeC,GAAgB,EAGrE,OAAAlE,EAAA,IAACmE,GAAA,CACC,IAAKJ,EACL,SAAUjC,EACV,YAAagC,EAAa,YAC1B,QAASE,EACT,aAAcF,EAAa,aAC3B,OAAQG,EACR,YAAaH,EAAa,YAC1B,UAAWM,EAAO,iBAClB,kBAAiB,EAAA,CACnB,CAEJ,CCvBA,SAAwBC,IAAkB,CACxC,OACGjE,EAAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,OACpB,SAAA,CAACN,EAAAA,IAAAsE,GAAA,CAAc,UAAWhE,EAAM,YAAc,CAAA,EAC7CN,EAAAA,IAAAuE,GAAA,CAAc,UAAWjE,EAAM,OAAS,CAAA,CAAA,EAC3C,CAEJ,CCJA,SAAwBkE,IAAY,CAC5B,KAAA,CAAE,KAAAC,CAAK,EAAIC,GAAgB,EAEjC,OACGtE,EAAAA,KAAA,MAAA,CAAI,UAAWgE,EAAO,UACrB,SAAA,CAAApE,EAAA,IAACqE,GAAgB,EAAA,EAChBI,GAAQzE,EAAAA,IAAC6D,GAAkB,CAAA,aAAcY,CAAM,CAAA,CAAA,EAClD,CAEJ,CCFa,MAAAE,GAAqB,CAACC,EAA4BC,IAAqC,CAC5F,MAAAC,EAAeC,GAA4BH,EAAc,CAC7D,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,QAAS,MAAO,OAAQ,EACjC,CAAE,MAAO,OAAQ,MAAO,MAAO,CAAA,CAChC,EACKI,EAAoBC,GAA6BL,CAAY,EAE5D,MAAA,CACL,CAAE,MAAOM,EAAY,aAAc,YAAa,GAAM,QAAS,CAACC,GAAcN,CAAU,CAAC,CAAE,EAC3F,CACE,MAAOK,EAAY,YACnB,YAAa,GACb,QAAS,CACP,CACE,GAAI,OACJ,MAAO,kBACP,YAAa,8CACb,KAAM,SACN,OAAQJ,EACR,aAAc,OAChB,EACA,CACE,GAAI,gBACJ,MAAO,uBACP,YAAa,+CACb,KAAM,SACN,OAAQA,EACR,aAAc,MAChB,EACA,CACE,GAAI,YACJ,MAAO,mBACP,YAAa,oCACb,KAAM,eACN,OAAQE,CACV,EACA,CACE,GAAI,aACJ,MAAO,oBACP,YAAa,8DACb,KAAM,UACN,aAAc,EAAA,CAChB,CAEJ,EACA,CACE,MAAOE,EAAY,kBACnB,YAAa,GACb,QAAS,CACP,CACE,GAAI,WACJ,MAAO,mBACP,YAAa,0CACb,KAAM,UACN,aAAc,EAChB,EACA,CACE,GAAI,YACJ,MAAO,qBACP,YAAa,oDACb,KAAM,UACN,aAAc,EAAA,CAChB,CACF,CAEJ,CACF,EAeA,SAASE,GAAqBC,EAA+BC,EAAkD,CAEvG,MAAAC,EAAYC,IAAgBF,GAAA,YAAAA,EAAe,IAAIE,KAAQH,EAAa,IAAIG,CAAG,EAG3EC,EAAkBD,GAClBF,GAAA,MAAAA,EAAe,IAAIE,GACdF,EAAc,OAAOE,CAAG,EAE1BH,EAAa,OAAOG,CAAG,EAIzB,MAAA,CACL,WAAYD,EAAS,MAAM,EAC3B,gBAAiBA,EAAS,eAAe,EACzC,UAAWE,EAAe,WAAW,EACrC,WAAYC,EAAgBH,EAAS,YAAY,CAAC,EAClD,SAAUG,EAAgBH,EAAS,UAAU,CAAC,EAC9C,UAAWG,EAAgBH,EAAS,WAAW,CAAC,CAClD,CACF,CAKO,SAASI,IAAsC,CAC9C,KAAA,CAACN,CAAY,EAAIO,GAAgB,EACjCC,EAAcC,MAAIC,EAAa,EAO9B,OALSC,EAAAA,QAAQ,IAAM,CAC5B,MAAMV,EAAgBO,EAAc,IAAI,gBAAgBA,EAAY,MAAM,EAAI,OACvE,OAAAT,GAAqBC,EAAcC,CAAa,CAAA,EACtD,CAACO,EAAaR,CAAY,CAAC,CAGhC,CC9HO,SAASY,EACd7G,EACAuC,EACAC,EACAsE,EACAtB,EACA,CACA,MAAMuB,EAAYxE,EAAOyE,EAAiBhH,EAAOuC,CAAI,GAAK,GAAKvC,EAAM,MAC/DiH,EAAiBD,EAAiBhH,EAAOwC,CAAS,GAAK,GAIvD0E,EADyBJ,EAAc,OAAQzF,GAAU,OAAO,OAAOmE,EAAcnE,CAAK,CAAC,EACnD,OAAmB,CAAC8F,EAAK/E,IAAO,CACtE,MAAAf,EAAQmE,EAAapD,CAAE,EAC7B,OAAIf,GACF8F,EAAI,KAAK,CACP,GAAA/E,EACA,MAAOf,EAAM,MACb,OAAQA,EAAM,OACd,MAAOrB,EAAM,OAAOoC,CAAE,CAAA,CACvB,EAEI+E,CACT,EAAG,EAAE,EAEE,MAAA,CAAE,UAAAJ,EAAW,eAAAE,EAAgB,eAAAC,CAAe,CACrD,CCjBO,SAASE,IAA0C,CACxD,KAAM,CAAE,KAAMC,EAAS,gBAAAC,EAAiB,OAAQC,GAAkBC,GAAuB,EACnF,CAAE,KAAMhC,EAAc,OAAQiC,CAAA,EAAsBC,GAAgB,EACpE,CAAE,KAAMC,EAAU,OAAQC,CAAA,EAAmBC,GAAY,EAExD,MAAA,CACL,KAAM,CACJ,QAAAR,EACA,gBAAAC,EACA,aAAA9B,EACA,SAAAmC,CACF,EACA,OAAQG,GAAqB,CAACP,EAAeE,EAAmBG,CAAc,CAAC,CACjF,CACF,qLCJMG,EAAiB,GAEvB,SAAwBC,IAAiB,CACvC,KAAM,CAAE,KAAA3C,EAAM,OAAA4C,CAAO,EAAIb,GAAgB,EAIzC,OAFAc,GAAe,UAAU,EAErBD,IAAW,gBACLE,GAAO,EAAA,EAGbF,IAAW,QACNrH,EAAA,IAACwH,GAAU,CAAA,KAAK,4DAA6D,CAAA,EAG/ExH,MAACyH,GAAU,CAAA,GAAGhD,CAAM,CAAA,CAC7B,CAEA,SAASgD,GAAS,CAAE,QAAAhB,EAAS,gBAAAC,EAAiB,aAAA9B,EAAc,SAAAmC,GAA0B,CAC9E,KAAA,CAAE,gBAAAW,CAAgB,EAAIC,GAAmB,EACzC,CAAE,UAAAC,EAAW,WAAAC,EAAY,gBAAAC,EAAiB,WAAAC,EAAY,SAAAC,EAAU,UAAA3F,GAAcsD,GAAmB,EAEjG,CAACsC,EAAgBC,CAAiB,EAAIxI,EAAAA,SAAS,EAAK,EACpD,CAACyI,EAAWC,CAAY,EAAI1I,EAAAA,SAA2B,IAAI,EAE3D,CAAC2I,EAAgBC,CAAiB,EAAI5I,EAAAA,SAAS,EAAK,EACpD0C,EAAcxC,SAA8B,IAAI,EAChD2I,EAAY3I,SAA8B,IAAI,EAC9C4I,EAAoBC,GAAmB,CAC3C,UAAWrG,EACX,UAAAmG,EACA,SAAU,CAACF,EACX,UAAWlB,EACX,cAAeO,CAAA,CAChB,EAEKgB,EAAY9I,SAA8B,IAAI,EAGpD+I,EAAAA,UAAU,IAAM,OACTjB,GACEW,IACOO,EAAAL,EAAA,UAAA,MAAAK,EAAS,SAAS,EAAG,EAGlC,EAAA,CAAClB,EAAiBW,EAAgBE,CAAS,CAAC,EAE/C,MAAMM,EAAe,IAAM,CACrBnB,GACgBc,EAAA,EAEpBF,EAAkB,EAAK,CACzB,EAcMQ,EAAwBC,GAXL,IAAM,CACzB,GAAA3G,GAAA,MAAAA,EAAa,UAAWmG,GAAA,MAAAA,EAAW,SAAS,CACxC,MAAAS,EAAe5G,EAAY,QAAQ,sBAAsB,EACzD6G,EAAeV,EAAU,QAAQ,sBAAsB,EAC7D,GAAIS,GAAgBC,EAAc,CAC1B,MAAAC,EAAkBF,EAAa,IAAMC,EAAa,IAClDE,EAA4BD,EAAkB,IAAMA,EAAkB/B,EAC5EmB,EAAkBa,CAAyB,CAAA,CAC7C,CAEJ,EACyD,GAAI,EAEvDC,EAAe,IAAM,CACrBV,EAAU,SACZ,aAAaA,EAAU,OAAO,EAEtBA,EAAA,QAAU,WAAW,IAAM,CACnCR,EAAkB,EAAK,GACtB,GAAG,EAENA,EAAkB,EAAI,EAEAY,EAAA,CACxB,EAEMO,EAAaC,cAAalK,GAAqB,CACtCgJ,EAAA,CAAE,GAAGhJ,EAAO,CAC3B,EAAG,EAAE,EAGCmK,EAAgBC,GAAiBzC,GAAA,YAAAA,EAAU,UAAU,EACrD0C,EAAkBzD,UAAQ,IAAMrB,GAAmBC,EAAc2E,CAAa,EAAG,CAAC3E,EAAc2E,CAAa,CAAC,EAE9GG,EAAU3B,GAAcH,EAAU,OAExC,cACG,MAAI,CAAA,UAAWtH,EAAM,kBAAmB,cAAY,gBACnD,SAAA,CAAAN,EAAA,IAAC2J,GAAiB,CAAA,OAAQC,GAAW,SAAU,YAAaH,EAAiB,EAC5EtB,SAAcjJ,GAAU,CAAA,MAAOiJ,EAAW,QAAS,IAAMC,EAAa,IAAI,EAAG,QAE7E5D,GAAU,EAAA,EAEVkF,GACC1J,EAAA,IAAC,MAAI,CAAA,UAAW+C,EAAG,CAACzC,EAAM,WAAY2H,GAAkB3H,EAAM,IAAI,CAAC,EAAG,SAAiC,mCAAA,CAAA,EAGxGN,EAAA,IAAA,MAAA,CAAI,UAAWM,EAAM,eAAgB,QAAS8I,EAAc,YAAaA,EAAc,IAAKb,EAC1F,SAAA9B,EAAQ,MAAM,IAAKoD,GAAY,CACxB,MAAAC,EAAQrD,EAAQ,QAAQoD,CAAO,EACjC,GAAAE,EAAcD,CAAK,EAAG,CACxB,KAAM,CAAE,OAAA3H,EAAQ,iBAAAF,EAAkB,SAAA+H,EAAU,SAAAzH,CAAS,EAAImE,EAAgBmD,CAAO,EAE3E,GAAA7B,GAAY7F,GAAW2H,EAAM,KACzB,OAAA,KAGT,KAAM,CAAE,UAAA3D,EAAW,eAAAE,EAAgB,eAAAC,CAAmB,EAAAL,EACpD6D,EACAjC,EACAC,EACAF,EACAhD,CACF,EAGE,OAAA5E,EAAA,IAACuB,EAAA,CAEC,GAAIuI,EAAM,GACV,OAAQA,EAAM,OACd,IAAKA,EAAM,IACX,KAAM3D,EACN,UAAWE,EACX,UAAWyD,EAAM,UACjB,SAAUA,EAAM,SAChB,MAAOA,EAAM,MACb,UAAWA,EAAM,UACjB,iBAAA7H,EACA,WAAY+H,EACZ,OAAA7H,EACA,YAAa6H,EAAW5H,EAAc,OACtC,UAAAC,EACA,WAAYiE,EACZ,SAAA/D,EACA,YAAamH,EAAUL,EAAa,IAAM,EAAA,EAjBrCS,EAAM,EAkBb,CAAA,CAIA,OAAAG,GAAcH,CAAK,SAElBpJ,WACC,CAAA,SAAA,CAAAV,EAAA,IAAC2D,GAA6B,CAAA,MAAOmG,EAAM,KAAA,EAAvBA,EAAM,EAAwB,EACjDA,EAAM,QAAQ,IAAKI,GAAkB,CAC9B,MAAAC,EAAc1D,EAAQ,QAAQyD,CAAa,EAC7C,GAAA,CAACH,EAAcI,CAAW,EACrB,OAAA,KAGT,KAAM,CAAE,OAAAhI,EAAQ,SAAA6H,EAAU,iBAAA/H,EAAkB,SAAAM,CAAS,EAAImE,EAAgBwD,CAAa,EAGjF,GAAAlC,GAAY7F,GAAWgI,EAAY,KAC/B,OAAA,KAGT,KAAM,CAAE,UAAAhE,EAAW,eAAAE,EAAgB,eAAAC,EAAmB,EAAAL,EACpDkE,EACAtC,EACAC,EACAF,EACAhD,CACF,EAGE,OAAA5E,EAAA,IAACuB,EAAA,CAEC,GAAI4I,EAAY,GAChB,OAAQA,EAAY,OACpB,IAAKA,EAAY,IACjB,KAAMhE,EACN,UAAWE,EACX,UAAW8D,EAAY,UACvB,SAAUA,EAAY,SACtB,MAAOA,EAAY,MACnB,UAAWA,EAAY,UACvB,iBAAAlI,EACA,WAAY+H,EACZ,OAAA7H,EACA,YAAa6H,EAAW5H,EAAc,OACtC,UAAAC,EACA,WAAYiE,GACZ,SAAA/D,EACA,YAAamH,EAAUL,EAAa,IAAM,EAAA,EAjBrCc,EAAY,EAkBnB,CAEH,CAAA,CAAA,CAAA,EA7CYL,EAAM,EA8CrB,EAGG,IACR,CAAA,EACH,EACC9J,EAAA,IAAAoK,GAAA,CAAa,UAAW/B,EAAgB,eAAgBQ,CAAc,CAAA,CAAA,EACzE,CAEJ,CC9NA,SAAwBwB,IAAiB,CACvC,aACGC,GAAa,CAAA,WAAW,WACvB,SAAAtK,MAACyH,IAAS,CAAA,EACZ,CAEJ"}
|
|
@@ -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
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._blink_1cc8f_1{animation:_blink_1cc8f_1 1s step-start infinite}@keyframes _blink_1cc8f_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1cc8f_13{transform:rotate(45deg)}._radioGroup_1cc8f_17{display:flex;color:#4c4c4c;font-size:calc(1rem - 2px);color:#f6f6f6}._radioGroup_1cc8f_17[data-disabled] ._item_1cc8f_23{opacity:.4;cursor:not-allowed}._horizontal_1cc8f_28{align-items:center;flex-direction:row;gap:1rem;width:100%}._vertical_1cc8f_35{align-items:start;flex-direction:column}._item_1cc8f_23{display:flex;align-items:center;gap:.5rem;height:2rem}._item_1cc8f_23:has([data-checked]){color:#f6f6f6}._radio_1cc8f_17{box-sizing:border-box;display:flex;width:16px;height:16px;align-items:center;justify-content:center;border-radius:100%;outline:0;border:none}._radio_1cc8f_17[data-unchecked]{border:1px solid #262626;background-color:#262626}._radio_1cc8f_17[data-checked]{background-color:#2b5abc}._radio_1cc8f_17:focus-visible{outline:2px solid #578AF4;outline-offset:2px}._indicator_1cc8f_73{display:grid;place-content:center}._indicator_1cc8f_73[data-unchecked]{display:none}._indicator_1cc8f_73:before{content:"";border-radius:100%;width:6px;height:6px;aspect-ratio:1;background-color:#f6f6f6}._blink_1wch9_1{animation:_blink_1wch9_1 1s step-start infinite}@keyframes _blink_1wch9_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1wch9_13{transform:rotate(45deg)}._twoCols_1wch9_17{display:grid;grid-template-columns:max-content max-content;column-gap:3rem}._grid_1wch9_23{display:grid;grid-template-columns:repeat(3,max-content);column-gap:1rem;row-gap:.5rem;align-content:start}._inline_1wch9_31{display:flex;gap:.5rem}._blink_kmiy6_1{animation:_blink_kmiy6_1 1s step-start infinite}@keyframes _blink_kmiy6_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_kmiy6_13{transform:rotate(45deg)}._qrCode_kmiy6_17{padding:.5rem;background:#f6f6f6;border-radius:3px}._column_kmiy6_23{margin-top:1rem;display:flex;flex-direction:column;gap:.5rem;color:#b1b1b1;-webkit-user-select:text;user-select:text}._copiableLink_kmiy6_32{-webkit-user-select:text;user-select:text;color:#f6f6f6;white-space:nowrap;overflow-x:auto}._shareInline_kmiy6_39{display:grid;grid-template-columns:1fr 172px;gap:1rem}._end_kmiy6_45{padding-right:2rem}._blink_g70eo_1{animation:_blink_g70eo_1 1s step-start infinite}@keyframes _blink_g70eo_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_g70eo_13{transform:rotate(45deg)}._title_g70eo_17{font-size:1.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._description_g70eo_24{font-size:1rem;color:#b1b1b1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._blink_zh5tn_1{animation:_blink_zh5tn_1 1s step-start infinite}@keyframes _blink_zh5tn_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_zh5tn_13{transform:rotate(45deg)}._overview_zh5tn_17{grid-area:overview;font-size:calc(1rem - 2px);display:flex;overflow:hidden}._isOffline_zh5tn_24 ._info_zh5tn_24{opacity:.4}._isOffline_zh5tn_24:after{content:"Disconnected";position:absolute;padding-inline:.5rem;bottom:.5rem;right:.5rem;background-color:#d20300;border-radius:2px;font-size:calc(1rem - 2px);z-index:1000}._nav_zh5tn_39{display:flex;align-items:center;gap:.5rem}._info_zh5tn_24{flex:1;padding-left:1rem;display:flex;align-items:center;justify-content:space-between}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,ac as f}from"./vendor-9UkPSc5K.js";import{u as m,L as u,f as j,O as o}from"./index-njXwwjfn.js";import{E as l}from"./EmptyPage-BSzsxpGg.js";import{V as x}from"./ViewLogo--9miplQv.js";import{V as a}from"./ViewParamsEditor-BFu_0oIb.js";import{u as _}from"./useWindowTitle-B2UzPuki.js";import{u as h}from"./useProjectData-DW06zQvF.js";import"./Empty-C-JO_XAr.js";import"./Select-BLA-yQMq.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]="ce864784-26a5-4afd-b831-7fdb93549169",s._sentryDebugIdIdentifier="sentry-dbid-ce864784-26a5-4afd-b831-7fdb93549169")}catch{}})();function g(){const s=m(t=>t.mirror),{data:r,status:n}=h();return{data:{projectData:r,isMirrored:s},status:n}}function V(){const{data:s,status:r}=g();return _("Project info"),r==="pending"?e.jsx(u,{}):r==="error"?e.jsx(l,{text:"There was an error fetching data, please refresh the page."}):e.jsx(v,{...s})}function v({projectData:s,isMirrored:r}){const{getLocalizedString:n}=j();return!s||Object.values(s).every(i=>!i||i&&Array.isArray(i)&&i.length===0)?e.jsxs(e.Fragment,{children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),e.jsx(l,{text:n("common.no_data")}),";"]}):e.jsxs("div",{className:`project ${r?"mirror":""}`,"data-testid":"project-view",children:[e.jsx(a,{target:o.ProjectInfo,viewOptions:[]}),s.logo&&e.jsx(x,{name:s.logo,className:"logo"}),e.jsxs("div",{className:"info",children:[s.title&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.title")}),e.jsx("div",{className:"info__value",children:s.title})]}),s.description&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.description")}),e.jsx("div",{className:"info__value",children:s.description})]}),s.info&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.info")}),e.jsx("div",{className:"info__value",children:s.info})]}),s.url&&e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:n("project.url")}),e.jsxs("a",{href:s.url,target:"_blank",rel:"noreferrer",className:"info__value link",children:[s.url," ",e.jsx(f,{style:{fontSize:"1em"}})]})]}),s.custom.map((i,d)=>{const c=!!i.url;return e.jsxs("div",{className:"info__custom",children:[c&&e.jsx("div",{className:"info__image-container",children:e.jsx("img",{className:"info__image",src:i.url,loading:"lazy"})}),e.jsxs("div",{children:[e.jsx("div",{className:"info__label",children:i.title}),e.jsx("div",{className:"info__value",children:i.value})]})]},`${i.title}-${d}`)})]})]})}export{V as default};
|
|
2
|
-
//# sourceMappingURL=ProjectInfo-CJ-GLvVG.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as l,j as t,A as f}from"./vendor-9UkPSc5K.js";import{i as h,af as p,ai as b,bN as g,S as x}from"./index-njXwwjfn.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="85a7d0ce-b73e-4216-b0cc-3068e25ab5bf",e._sentryDebugIdIdentifier="sentry-dbid-85a7d0ce-b73e-4216-b0cc-3068e25ab5bf")}catch{}})();const y="_container_o8th0_17",_="_pin_o8th0_27",m="_pinFailed_o8th0_51",d={container:y,pin:_,pinFailed:m};function v({permission:e,handleValidation:n}){const[s,o]=l.useState(""),[i,r]=l.useState(!1),u=()=>{n(s)||(r(!0),o(""))},c=a=>{o(a),i&&r(!1)};return t.jsxs("div",{className:d.container,children:[`Ontime ${e}`,t.jsxs("form",{onSubmit:a=>{a.preventDefault(),u()},className:h([d.pin,i&&d.pinFailed]),children:[t.jsx(p,{type:"password",maxLength:4,height:"large",value:s,onChange:a=>c(a.target.value)}),t.jsx(b,{type:"submit",variant:"primary","aria-label":"Enter",children:t.jsx(f,{})})]})]})}function w({permission:e,children:n}){const{editorAuth:s,operatorAuth:o,validate:i}=l.useContext(g),r=l.useCallback(c=>i(c,e),[e,i]);return x||(e==="editor"?s:e==="operator"?o:!1)?t.jsx(t.Fragment,{children:n}):t.jsx(v,{permission:e,handleValidation:r})}export{w as P};
|
|
2
|
-
//# sourceMappingURL=ProtectRoute-DJ9xZnPI.js.map
|
|
Binary file
|
|
Binary file
|