@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{h as p,l as U,j as i,y as W}from"./vendor-9UkPSc5K.js";import{r as w,P as q,H as E,l as N,M as C,g as O,I as F,i as b,J as G,q as $,f as B,v as M,d as J,L as Q,o as K,h as X,O as Y,s as Z}from"./index-njXwwjfn.js";import{E as tt}from"./EmptyPage-BSzsxpGg.js";import{V as et}from"./ViewLogo--9miplQv.js";import{O as I,i as H,V as st}from"./ViewParamsEditor-BFu_0oIb.js";import{u as nt}from"./useWindowTitle-B2UzPuki.js";import{S as it}from"./SuperscriptTime-C8ypTVpH.js";import{i as j,a as v,d as ot,u as at}from"./useRundown-ihoU8qBi.js";import{g as rt,a as lt}from"./viewLoader.utils-DQGhrjSp.js";import{g as ct,a as z,b as ut,c as mt}from"./rundownUtils-H6xvQyre.js";import{g as dt}from"./getProgress-B94Ieskb.js";import{u as ft}from"./useProjectData-DW06zQvF.js";import"./Empty-C-JO_XAr.js";import"./Select-BLA-yQMq.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="dfaa0d47-8699-4c7a-a83a-9e2e9fabfe7e",e._sentryDebugIdIdentifier="sentry-dbid-dfaa0d47-8699-4c7a-a83a-9e2e9fabfe7e")}catch{}})();function ht(e,t){if(!t)return 0;const s=e.timeStart+e.dayOffset*w,n=t.timeStart+t.duration+t.dayOffset*w;return s===n?0:(s>n,s-n)}function D(e,t,s){if(!t.current)return;if(!(e!=null&&e.current)){t.current.scrollTo({left:0,behavior:"smooth"});return}const n=e.current.getBoundingClientRect(),a=t.current.getBoundingClientRect(),o=n.left-a.left+t.current.scrollLeft-s;t.current.scrollTo({left:o,behavior:"smooth"})}function pt({followRef:e,scrollRef:t,doFollow:s,selectedEventId:n,leftOffset:a=0,setScrollFlag:o}){return p.useEffect(()=>{!s||!t.current||(o==null||o(!0),window.requestAnimationFrame(()=>{D(n!==null?e:null,t,a),o==null||o(!1)}))},[e,t,s,a,o,n]),p.useCallback((u=e,m=t,c=a)=>{m.current&&D(n!==null?u:null,m,c)},[e,t,a,n])}const xt=e=>[{title:I.ClockOptions,collapsible:!0,options:[rt(e)]},{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:"autosize",title:"Autosize timeline",description:"Timeline will adjust sizes to help with readability and automatically scroll if necessary",type:"boolean",defaultValue:!1}]}];function gt(e,t){const s=n=>(t==null?void 0:t.get(n))??e.get(n);return{hidePast:H(s("hidePast")),autosize:H(s("autosize"))}}function R(){const[e]=U(),t=p.use(q);return p.useMemo(()=>{const n=t?new URLSearchParams(t.search):void 0;return gt(e,n)},[t,e])}function _t(e,t,s,n,a){const r=(t<e?t+w:t)-e,u=n*a/r;return{left:(s-e)*a/r,width:u}}function yt(e){return Math.floor(e/E)}function bt(e){return Math.ceil(e/E)}function Tt(e,t){const s=[];for(let n=e;n<t;n++)s.push(n);return s}function jt(e,t){return t==="done"||t==="live"?t:e<=0?"pending":N(e,e>C*2)}function wt(e,t){const{hidePast:s}=R();return p.useMemo(()=>{if(e.length===0)return{scopedRundown:[],firstStart:0,totalDuration:0};const a=[];let o=t?1/0:-1,r=null,u=0,m=null;for(let c=0;c<e.length;c++){const l=e[c];if(j(l)&&v(l)){if(l.id===t&&(o=c),s&&c<o)continue;a.push(l),r===null&&(r=l.timeStart);const d=ht(l,m);d===0?u+=l.duration:d>0?u+=d+l.duration:d<0&&(u+=Math.max(l.duration+d,0)),ot(l,m)&&(m=l)}}return{scopedRundown:a,firstStart:r??0,totalDuration:u}},[s,e,t])}function St(e,t){var o,r;if(e.length===0)return{now:null,next:null,followedBy:null};let s=t?ct(e,t):null;j(s)||(s=null);const n=s?(o=z(e,s.id))==null?void 0:o.nextEvent:ut(e).firstEvent,a=n?(r=z(e,n.id))==null?void 0:r.nextEvent:null;return{now:s,next:n,followedBy:a}}function vt(e,t,s,n,a,o=100){let r=1/0;const u=e.map(({start:l,duration:d})=>{const g=_t(t,s,l,d,n);return r=Math.min(r,g.width),g});if(!a)return{positions:u,scale:1,totalWidth:n};const m=r<o?o/r:1;return m===1?{positions:u,scale:1,totalWidth:n}:{positions:u.map(l=>({left:l.left*m,width:l.width*m})),scale:m,totalWidth:n*m}}const Et="_markers_gfywu_17",Nt={markers:Et};function Pt(e){const{startHour:t,endHour:s}=e,n=Tt(t,s);return i.jsx("div",{className:Nt.markers,children:n.map(a=>i.jsx("span",{},a))})}const Lt="_timelineContainer_4bums_21",kt="_scroll_4bums_26",Ct="_timeline_4bums_21",Ot="_column_4bums_37",Mt="_maybeInline_4bums_45",Bt="_timelineBlock_4bums_52",It="_smallArea_4bums_64",Ht="_content_4bums_64",zt="_timeOverview_4bums_68",Dt="_hide_4bums_72",At="_status_4bums_98",Vt="_delay_4bums_105",$t="_cross_4bums_115",Rt="_separeLeft_4bums_121",h={timelineContainer:Lt,scroll:kt,timeline:Ct,column:Ot,maybeInline:Mt,timelineBlock:Bt,smallArea:It,content:Ht,timeOverview:zt,hide:Dt,status:At,delay:Vt,cross:$t,separeLeft:Rt},A={format12:"hh:mm a",format24:"HH:mm"};function Ut({colour:e,delay:t,duration:s,hasLink:n,left:a,status:o,start:r,dayOffset:u,totalGap:m,isLinkedToLoaded:c,title:l,width:d,cue:g,ref:S}){const P=O(r,A),L=N(s),y=r+t,T=t>0,f=F(e,.7),x=d>25,_=d<40;return i.jsxs("div",{ref:S,className:b([h.column,_&&h.smallArea]),style:{"--color":e,"--lighter":f??"",left:`${a}px`,width:`${d}px`},"data-testid":g,children:[o==="live"?i.jsx(Wt,{}):i.jsx("div",{"data-status":o,className:h.timelineBlock}),i.jsxs("div",{className:b([h.content,d<20&&h.hide,!n&&h.separeLeft]),"data-status":o,style:{"--color":e},children:[i.jsxs("div",{className:h.maybeInline,children:[i.jsx("div",{className:b([T&&h.cross]),children:P}),T&&i.jsx("div",{className:h.delay,children:O(y,A)}),_&&i.jsx(V,{delay:t,start:r,dayOffset:u,totalGap:m,isLinkedToLoaded:c,status:o})]}),x&&i.jsxs(i.Fragment,{children:[!_&&i.jsx(V,{delay:t,start:r,dayOffset:u,totalGap:m,isLinkedToLoaded:c,status:o}),i.jsx("div",{children:l})]})]}),i.jsx("div",{className:h.timeOverview,"data-status":o,children:o!=="done"&&i.jsx("div",{className:h.duration,children:L})})]})}function V({delay:e,start:t,dayOffset:s,totalGap:n,isLinkedToLoaded:a,status:o}){const r=$(),{getLocalizedString:u}=B(),{timeToStart:m}=M({timeStart:t,delay:e,dayOffset:s,totalGap:n,isLinkedToLoaded:a,countToEnd:!1,duration:0},r);let c=jt(m,o);return c==="live"?c=u("timeline.live"):c==="pending"&&(c=u("timeline.due")),i.jsx("div",{className:h.status,children:c})}function Wt(){const{current:e,duration:t}=G(),s=dt(e,t);return i.jsx("div",{"data-status":"live",className:h.timelineBlock,style:{"--progress":`${s}%`}})}const qt=p.memo(Ft);function Ft({firstStart:e,rundown:t,selectedEventId:s,totalDuration:n}){const{width:a}=W(),{hidePast:o,autosize:r}=R(),u=p.useRef(null),m=p.useRef(null),{lastEvent:c}=mt(t),l=yt(e),d=bt(e+n+((c==null?void 0:c.delay)??0)),g=l*E,S=d*E;pt({followRef:u,scrollRef:m,doFollow:r,selectedEventId:s,leftOffset:o?0:a/6});const{positions:P,totalWidth:L}=p.useMemo(()=>{const f=t.filter(x=>j(x)&&v(x)).map(x=>({start:x.timeStart+(x.dayOffset??0)*w+(x.delay??0),duration:x.duration}));return vt(f,g,S,a,r)},[t,g,S,a,r]);if(n===0)return null;let y=s?"done":"future";const T={};return t.forEach(f=>{j(f)&&v(f)&&(y==="live"&&(y="future"),f.id===s&&(y="live"),T[f.id]=y)}),i.jsx("div",{ref:m,className:b([h.timelineContainer,r&&h.scroll]),children:i.jsxs("div",{className:h.timeline,style:{width:L},children:[i.jsx(Pt,{startHour:l,endHour:d}),t.map((f,x)=>{if(!j(f)||!v(f))return null;const _=P[x];return _?i.jsx(Ut,{ref:f.id===s?u:void 0,colour:f.colour,delay:f.delay??0,duration:f.duration,hasLink:!!f.linkStart,left:_.left,status:T[f.id],start:f.timeStart+(f.dayOffset??0)*w,totalGap:f.totalGap,isLinkedToLoaded:f.isLinkedToLoaded,dayOffset:f.dayOffset,title:f.title,cue:f.cue,width:_.width},f.id):null})]})})}const k=p.memo(Gt);function Gt({category:e,content:t,title:s,status:n}){const a=b(["section",e==="now"&&"section--now"]),o=b(["section-content",t?`section-content--${e}`:"section-content--subdue"]);return i.jsxs("div",{className:a,"data-testid":e,children:[i.jsxs("div",{className:"section-title",children:[i.jsx("span",{className:"section-title__label",children:s}),n&&i.jsx("span",{className:"section-title__status",children:n})]}),i.jsx("div",{className:o,children:t??"-"})]})}function Jt({now:e,next:t,followedBy:s}){const{getLocalizedString:n}=B(),a=$(),o=(e==null?void 0:e.title)??"-",r=n("timeline.due").toUpperCase(),u=t!==null?t.title:"-",m=s!==null?s.title:"-";let c,l;if(t!==null){const{timeToStart:d}=M(t,a);d<=0?c=r:c=N(d,d>C*2)}if(s!==null){const{timeToStart:d}=M(s,a);d<=0?l=r:l=N(d,d>C*2)}return i.jsxs("div",{className:"title-grid",children:[i.jsx(k,{title:n("timeline.live"),content:o,category:"now"}),i.jsx(k,{title:n("common.next"),status:c,content:u,category:"next"}),i.jsx(k,{title:n("timeline.followedby"),status:l,content:m,category:"followedBy"})]})}function Qt(){const{data:e,status:t}=at(),{data:s,status:n}=ft(),{data:a,status:o}=J();return{data:{events:e,projectData:s,settings:a},status:lt([t,n,o])}}function de(){const{data:e,status:t}=Qt();return nt("Timeline"),t==="pending"?i.jsx(Q,{}):t==="error"?i.jsx(tt,{text:"There was an error fetching data, please refresh the page."}):i.jsx(Kt,{...e})}function Kt({events:e,projectData:t,settings:s}){const{selectedEventId:n}=K(),{scopedRundown:a,firstStart:o,totalDuration:r}=wt(e,n),{now:u,next:m,followedBy:c}=p.useMemo(()=>St(a,n),[a,n]),l=X(s==null?void 0:s.timeFormat),d=p.useMemo(()=>xt(l),[l]);return i.jsxs("div",{className:"timeline","data-testid":"timeline-view",children:[i.jsx(st,{target:Y.Timeline,viewOptions:d}),i.jsxs("div",{className:"project-header",children:[(t==null?void 0:t.logo)&&i.jsx(et,{name:t.logo,className:"logo"}),i.jsx("div",{className:"title",children:t.title}),i.jsx(Xt,{})]}),i.jsx(Jt,{now:u,next:m,followedBy:c}),i.jsx(qt,{firstStart:o,rundown:a,selectedEventId:n,totalDuration:r})]})}function Xt(){const{getLocalizedString:e}=B(),{clock:t}=Z(),s=O(t);return i.jsxs("div",{className:"clock-container",children:[i.jsx("div",{className:"label",children:e("common.time_now")}),i.jsx(it,{time:s,className:"time"})]})}export{de as default};
|
|
2
|
-
//# sourceMappingURL=TimelinePage-DTwqRihn.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TimelinePage-DTwqRihn.js","sources":["../../../../packages/utils/src/date-utils/getTimeFrom.ts","../../src/common/hooks/useHorizontalFollowComponent.ts","../../src/views/timeline/timeline.options.ts","../../src/views/timeline/timeline.utils.ts","../../src/views/timeline/timeline-markers/TimelineMarkers.tsx","../../src/views/timeline/TimelineEntry.tsx","../../src/views/timeline/Timeline.tsx","../../src/views/timeline/timeline-section/TimelineSection.tsx","../../src/views/timeline/TimelineSections.tsx","../../src/views/timeline/useTimelineData.ts","../../src/views/timeline/TimelinePage.tsx"],"sourcesContent":["import type { OntimeEvent } from 'ontime-types';\n\nimport { dayInMs } from './conversionUtils.js';\n\n/**\n * Utility returns the gap from a previous given event\n */\nexport function getTimeFrom(\n current: Pick<OntimeEvent, 'timeStart' | 'dayOffset'>,\n previous: Pick<OntimeEvent, 'timeStart' | 'duration' | 'dayOffset'> | null,\n): number {\n // there is no previous event\n if (!previous) {\n return 0;\n }\n\n const normalisedCurrentStart = current.timeStart + current.dayOffset * dayInMs;\n const normalisedPreviousEnd = previous.timeStart + previous.duration + previous.dayOffset * dayInMs;\n\n // event is linked to previous\n if (normalisedCurrentStart === normalisedPreviousEnd) {\n return 0;\n }\n\n // event has a gap from previous\n if (normalisedCurrentStart > normalisedPreviousEnd) {\n // time from previous is difference between start and previous end\n return normalisedCurrentStart - normalisedPreviousEnd;\n }\n\n // event overlaps with previous\n return normalisedCurrentStart - normalisedPreviousEnd;\n}\n","import { RefObject, useCallback, useEffect } from 'react';\nimport { EntryId } from 'ontime-types';\n\nfunction scrollToComponent<ComponentRef extends HTMLElement, ScrollRef extends HTMLElement>(\n componentRef: RefObject<ComponentRef> | null,\n scrollRef: RefObject<ScrollRef>,\n leftOffset: number,\n) {\n if (!scrollRef.current) {\n return;\n }\n\n if (!componentRef?.current) {\n // If no target component, scroll to start\n scrollRef.current.scrollTo({ left: 0, behavior: 'smooth' });\n return;\n }\n\n const componentRect = componentRef.current.getBoundingClientRect();\n const scrollRect = scrollRef.current.getBoundingClientRect();\n const left = componentRect.left - scrollRect.left + scrollRef.current.scrollLeft - leftOffset;\n\n scrollRef.current.scrollTo({ left, behavior: 'smooth' });\n}\n\ninterface UseHorizontalFollowComponentOptions {\n followRef: RefObject<HTMLElement | null>;\n scrollRef: RefObject<HTMLElement | null>;\n doFollow: boolean;\n selectedEventId: EntryId | null;\n leftOffset?: number;\n setScrollFlag?: (newValue: boolean) => void;\n}\n\n/**\n * This is a copy of useFollowComponent, but for horizontal scrolling\n * Designed with the timeline component in mind\n */\nexport default function useHorizontalFollowComponent({\n followRef,\n scrollRef,\n doFollow,\n selectedEventId,\n leftOffset = 0,\n setScrollFlag,\n}: UseHorizontalFollowComponentOptions) {\n useEffect(() => {\n if (!doFollow || !scrollRef.current) {\n return;\n }\n\n setScrollFlag?.(true);\n // Use requestAnimationFrame to ensure the component is fully loaded\n window.requestAnimationFrame(() => {\n scrollToComponent(\n selectedEventId !== null ? (followRef as RefObject<HTMLElement>) : null,\n scrollRef as RefObject<HTMLElement>,\n leftOffset,\n );\n setScrollFlag?.(false);\n });\n }, [followRef, scrollRef, doFollow, leftOffset, setScrollFlag, selectedEventId]);\n\n const scrollToRefComponent = useCallback(\n (componentRef = followRef, containerRef = scrollRef, offset = leftOffset) => {\n if (containerRef.current) {\n scrollToComponent(\n selectedEventId !== null ? (componentRef as RefObject<HTMLElement>) : null,\n containerRef as RefObject<HTMLElement>,\n offset,\n );\n }\n },\n [followRef, scrollRef, leftOffset, selectedEventId],\n );\n\n return scrollToRefComponent;\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\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 { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../features/viewers/common/viewUtils';\n\nexport const getTimelineOptions = (timeFormat: string): ViewOption[] => {\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\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: 'autosize',\n title: 'Autosize timeline',\n description: 'Timeline will adjust sizes to help with readability and automatically scroll if necessary',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype TimelineOptions = {\n hidePast: boolean;\n autosize: 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): TimelineOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n return {\n hidePast: isStringBoolean(getValue('hidePast')),\n autosize: isStringBoolean(getValue('autosize')),\n };\n}\n\n/**\n * Hook exposes the timeline view options\n */\nexport function useTimelineOptions(): TimelineOptions {\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 { useMemo } from 'react';\nimport { isOntimeEvent, isPlayableEvent, MaybeString, OntimeEntry, OntimeEvent, PlayableEvent } from 'ontime-types';\nimport {\n dayInMs,\n getEventWithId,\n getFirstEvent,\n getNextEvent,\n getTimeFrom,\n isNewLatest,\n MILLIS_PER_HOUR,\n MILLIS_PER_MINUTE,\n} from 'ontime-utils';\n\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatDuration } from '../../common/utils/time';\n\nimport { useTimelineOptions } from './timeline.options';\nimport type { ProgressStatus } from './TimelineEntry';\n\ntype CSSPosition = {\n left: number;\n width: number;\n};\n\n/**\n * Calculates the base position and width of an element based on schedule\n * The scaling of these values (if needed) is handled by calculateTimelineLayout\n */\nexport function getElementPosition(\n scheduleStart: number,\n scheduleEnd: number,\n eventStart: number,\n eventDuration: number,\n containerWidth: number,\n): CSSPosition {\n const normalEnd = scheduleEnd < scheduleStart ? scheduleEnd + dayInMs : scheduleEnd;\n const totalDuration = normalEnd - scheduleStart;\n\n // Calculate proportional width and position\n const width = (eventDuration * containerWidth) / totalDuration;\n const left = ((eventStart - scheduleStart) * containerWidth) / totalDuration;\n\n return { left, width };\n}\n\n/**\n * Gets rounded down hour for a given time\n */\nexport function getStartHour(startTime: number): number {\n const hours = Math.floor(startTime / MILLIS_PER_HOUR);\n return hours;\n}\n\n/**\n * Gets rounded up hour for a given time\n */\nexport function getEndHour(endTime: number): number {\n const hours = Math.ceil(endTime / MILLIS_PER_HOUR);\n return hours;\n}\n\n/**\n * converts a time span into an array of hours\n */\nexport function makeTimelineSections(firstHour: number, lastHour: number) {\n const timelineSections = [];\n for (let i = firstHour; i < lastHour; i++) {\n timelineSections.push(i);\n }\n return timelineSections;\n}\n\n/**\n * Returns a formatted label for a progress status\n */\nexport function getStatusLabel(timeToStart: number, status: ProgressStatus): string {\n if (status === 'done' || status === 'live') {\n return status;\n }\n\n if (timeToStart <= 0) {\n return 'pending';\n }\n\n return formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 2);\n}\n\ninterface ScopedRundownData {\n scopedRundown: ExtendedEntry<PlayableEvent>[];\n firstStart: number;\n totalDuration: number;\n}\n\nexport function useScopedRundown(\n rundown: ExtendedEntry<OntimeEntry>[],\n selectedEventId: MaybeString,\n): ScopedRundownData {\n const { hidePast } = useTimelineOptions();\n\n const data = useMemo(() => {\n if (rundown.length === 0) {\n return { scopedRundown: [], firstStart: 0, totalDuration: 0 };\n }\n\n const scopedRundown: ExtendedEntry<PlayableEvent>[] = [];\n let selectedIndex = selectedEventId ? Infinity : -1;\n let firstStart = null;\n let totalDuration = 0;\n let lastEntry: ExtendedEntry<PlayableEvent> | null = null;\n\n for (let i = 0; i < rundown.length; i++) {\n const currentEntry = rundown[i];\n // we only deal with playableEvents\n if (isOntimeEvent(currentEntry) && isPlayableEvent(currentEntry)) {\n if (currentEntry.id === selectedEventId) {\n selectedIndex = i;\n }\n\n // maybe filter past\n if (hidePast && i < selectedIndex) {\n continue;\n }\n\n // add to scopedRundown\n scopedRundown.push(currentEntry);\n\n /**\n * Derive timers\n * This logic is partially from rundownCache.generate\n * With the addition of deriving the current day offset\n */\n if (firstStart === null) {\n firstStart = currentEntry.timeStart;\n }\n\n const timeFromPrevious: number = getTimeFrom(currentEntry, lastEntry);\n\n if (timeFromPrevious === 0) {\n totalDuration += currentEntry.duration;\n } else if (timeFromPrevious > 0) {\n totalDuration += timeFromPrevious + currentEntry.duration;\n } else if (timeFromPrevious < 0) {\n totalDuration += Math.max(currentEntry.duration + timeFromPrevious, 0);\n }\n if (isNewLatest(currentEntry, lastEntry)) {\n lastEntry = currentEntry;\n }\n }\n }\n\n return { scopedRundown, firstStart: firstStart ?? 0, totalDuration };\n }, [hidePast, rundown, selectedEventId]);\n\n return data;\n}\n\ntype UpcomingEvents = {\n now: ExtendedEntry<OntimeEvent> | null;\n next: ExtendedEntry<OntimeEvent> | null;\n followedBy: ExtendedEntry<OntimeEvent> | null;\n};\n\n/**\n * Returns upcoming events from current: now, next and followedBy\n */\nexport function getUpcomingEvents(events: ExtendedEntry<PlayableEvent>[], selectedId: MaybeString): UpcomingEvents {\n if (events.length === 0) {\n return { now: null, next: null, followedBy: null };\n }\n\n let now = selectedId ? (getEventWithId(events, selectedId) as ExtendedEntry<OntimeEvent>) : null;\n if (!isOntimeEvent(now)) {\n now = null;\n }\n\n const next = now\n ? (getNextEvent(events, now.id)?.nextEvent as ExtendedEntry<OntimeEvent> | null)\n : (getFirstEvent(events).firstEvent as ExtendedEntry<OntimeEvent> | null);\n const followedBy = next ? (getNextEvent(events, next.id)?.nextEvent as ExtendedEntry<OntimeEvent> | null) : null;\n\n // Return the titles, handling nulls appropriately\n return {\n now,\n next,\n followedBy,\n };\n}\n\n/**\n * Utility function calculates time to start\n */\nexport function getTimeToStart(now: number, start: number, delay: number, offset: number): number {\n return start + delay - now + offset;\n}\n\ninterface TimelineLayout {\n positions: CSSPosition[];\n scale: number;\n totalWidth: number;\n}\n\n/**\n * Calculates positions for all events and applies scaling if needed\n */\nexport function calculateTimelineLayout(\n events: Array<{ start: number; duration: number }>,\n scheduleStart: number,\n scheduleEnd: number,\n containerWidth: number,\n canScroll: boolean,\n minWidth = 100,\n): TimelineLayout {\n // Calculate positions and track minimum width\n let smallestWidth = Infinity;\n const positions = events.map(({ start, duration }) => {\n const position = getElementPosition(scheduleStart, scheduleEnd, start, duration, containerWidth);\n smallestWidth = Math.min(smallestWidth, position.width);\n return position;\n });\n\n if (!canScroll) {\n return {\n positions: positions,\n scale: 1,\n totalWidth: containerWidth,\n };\n }\n\n // Determine if scaling is needed\n const scale = smallestWidth < minWidth ? minWidth / smallestWidth : 1;\n\n // If no scaling is needed, return base positions\n if (scale === 1) {\n return {\n positions,\n scale: 1,\n totalWidth: containerWidth,\n };\n }\n\n // Apply scale to all positions\n const scaledPositions = positions.map((pos) => ({\n left: pos.left * scale,\n width: pos.width * scale,\n }));\n\n return {\n positions: scaledPositions,\n scale,\n totalWidth: containerWidth * scale,\n };\n}\n","import { makeTimelineSections } from '../timeline.utils';\n\nimport style from './TimelineMarkers.module.scss';\n\ninterface TimelineMarkersProps {\n startHour: number;\n endHour: number;\n}\n\n/** Creates a line for every hour in the timeline */\nexport default function TimelineMarkers(props: TimelineMarkersProps) {\n const { startHour, endHour } = props;\n\n const elements = makeTimelineSections(startHour, endHour);\n\n return (\n <div className={style.markers}>\n {elements.map((tag) => (\n <span key={tag} />\n ))}\n </div>\n );\n}\n","import { RefObject } from 'react';\n\nimport { useExpectedStartData, useTimer } from '../../common/hooks/useSocket';\nimport { getProgress } from '../../common/utils/getProgress';\nimport { alpha, cx } from '../../common/utils/styleUtils';\nimport { formatDuration, formatTime, getExpectedTimesFromExtendedEvent } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\n\nimport { getStatusLabel } from './timeline.utils';\n\nimport style from './Timeline.module.scss';\n\nexport type ProgressStatus = 'done' | 'live' | 'future';\n\ninterface TimelineEntryProps {\n colour: string;\n delay: number;\n duration: number;\n hasLink: boolean;\n left: number;\n status: ProgressStatus;\n start: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n title: string;\n width: number;\n cue: string;\n ref?: RefObject<HTMLDivElement | null>;\n}\n\nconst formatOptions = {\n format12: 'hh:mm a',\n format24: 'HH:mm',\n};\n\nexport function TimelineEntry({\n colour,\n delay,\n duration,\n hasLink,\n left,\n status,\n start,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n title,\n width,\n cue,\n ref,\n}: TimelineEntryProps) {\n const formattedStartTime = formatTime(start, formatOptions);\n const formattedDuration = formatDuration(duration);\n const delayedStart = start + delay;\n const hasDelay = delay > 0;\n\n const lighterColour = alpha(colour, 0.7);\n const showTitle = width > 25;\n const smallArea = width < 40;\n\n return (\n <div\n ref={ref}\n className={cx([style.column, smallArea && style.smallArea])}\n style={{\n '--color': colour,\n '--lighter': lighterColour ?? '',\n left: `${left}px`,\n width: `${width}px`,\n }}\n data-testid={cue}\n >\n {status === 'live' ? <ActiveBlock /> : <div data-status={status} className={style.timelineBlock} />}\n <div\n className={cx([style.content, width < 20 && style.hide, !hasLink && style.separeLeft])}\n data-status={status}\n style={{\n '--color': colour,\n }}\n >\n <div className={style.maybeInline}>\n <div className={cx([hasDelay && style.cross])}>{formattedStartTime}</div>\n {hasDelay && <div className={style.delay}>{formatTime(delayedStart, formatOptions)}</div>}\n {smallArea && (\n <TimelineEntryStatus\n delay={delay}\n start={start}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n status={status}\n />\n )}\n </div>\n {showTitle && (\n <>\n {!smallArea && (\n <TimelineEntryStatus\n delay={delay}\n start={start}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n status={status}\n />\n )}\n <div>{title}</div>\n </>\n )}\n </div>\n <div className={style.timeOverview} data-status={status}>\n {status !== 'done' && <div className={style.duration}>{formattedDuration}</div>}\n </div>\n </div>\n );\n}\n\ninterface TimelineEntryStatusProps {\n delay: number;\n start: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n status: ProgressStatus;\n}\n\n// extract component to isolate re-renders provoked by the clock changes\nfunction TimelineEntryStatus({\n delay,\n start,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n status,\n}: TimelineEntryStatusProps) {\n const state = useExpectedStartData();\n\n const { getLocalizedString } = useTranslation();\n\n const { timeToStart } = getExpectedTimesFromExtendedEvent(\n { timeStart: start, delay, dayOffset, totalGap, isLinkedToLoaded, countToEnd: false, duration: 0 },\n state,\n );\n\n let statusText = getStatusLabel(timeToStart, status);\n if (statusText === 'live') {\n statusText = getLocalizedString('timeline.live');\n } else if (statusText === 'pending') {\n statusText = getLocalizedString('timeline.due');\n }\n\n return <div className={style.status}>{statusText}</div>;\n}\n\n/** Generates a block level progress bar */\nfunction ActiveBlock() {\n const { current, duration } = useTimer();\n const progress = getProgress(current, duration);\n return <div data-status='live' className={style.timelineBlock} style={{ '--progress': `${progress}%` }} />;\n}\n","import { memo, useMemo, useRef } from 'react';\nimport { useViewportSize } from '@mantine/hooks';\nimport { isOntimeEvent, isPlayableEvent, OntimeEntry, PlayableEvent } from 'ontime-types';\nimport { dayInMs, getLastEvent, MILLIS_PER_HOUR } from 'ontime-utils';\n\nimport useHorizontalFollowComponent from '../../common/hooks/useHorizontalFollowComponent';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport TimelineMarkers from './timeline-markers/TimelineMarkers';\nimport { useTimelineOptions } from './timeline.options';\nimport { calculateTimelineLayout, getEndHour, getStartHour } from './timeline.utils';\nimport { ProgressStatus, TimelineEntry } from './TimelineEntry';\n\nimport style from './Timeline.module.scss';\n\ninterface TimelineProps {\n firstStart: number;\n rundown: ExtendedEntry<OntimeEntry>[];\n selectedEventId: string | null;\n totalDuration: number;\n}\n\nexport default memo(Timeline);\nfunction Timeline({ firstStart, rundown, selectedEventId, totalDuration }: TimelineProps) {\n const { width: screenWidth } = useViewportSize();\n const { hidePast, autosize } = useTimelineOptions();\n const selectedRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n const { lastEvent } = getLastEvent(rundown);\n const startHour = getStartHour(firstStart);\n const endHour = getEndHour(firstStart + totalDuration + (lastEvent?.delay ?? 0));\n const scheduleStart = startHour * MILLIS_PER_HOUR;\n const scheduleEnd = endHour * MILLIS_PER_HOUR;\n\n // use horizontal follow when scroll is enabled\n useHorizontalFollowComponent({\n followRef: selectedRef,\n scrollRef: scrollContainerRef,\n doFollow: autosize,\n selectedEventId: selectedEventId,\n // No offset when hiding past events to ensure content starts at 0\n leftOffset: hidePast ? 0 : screenWidth / 6,\n });\n\n const { positions, totalWidth } = useMemo(() => {\n const playableEvents = rundown\n .filter((event): event is ExtendedEntry<PlayableEvent> => isOntimeEvent(event) && isPlayableEvent(event))\n .map((event) => ({\n start: event.timeStart + (event.dayOffset ?? 0) * dayInMs + (event.delay ?? 0),\n duration: event.duration,\n }));\n\n return calculateTimelineLayout(playableEvents, scheduleStart, scheduleEnd, screenWidth, autosize);\n }, [rundown, scheduleStart, scheduleEnd, screenWidth, autosize]);\n\n if (totalDuration === 0) {\n return null;\n }\n\n // Pre-calculate event statuses\n let currentStatus: ProgressStatus = selectedEventId ? 'done' : 'future';\n const statusMap: Record<string, ProgressStatus> = {};\n rundown.forEach((event) => {\n if (isOntimeEvent(event) && isPlayableEvent(event)) {\n if (currentStatus === 'live') {\n currentStatus = 'future';\n }\n if (event.id === selectedEventId) {\n currentStatus = 'live';\n }\n statusMap[event.id] = currentStatus;\n }\n });\n\n return (\n <div ref={scrollContainerRef} className={cx([style.timelineContainer, autosize && style.scroll])}>\n <div className={style.timeline} style={{ width: totalWidth }}>\n <TimelineMarkers startHour={startHour} endHour={endHour} />\n {rundown.map((event, index) => {\n if (!isOntimeEvent(event) || !isPlayableEvent(event)) {\n return null;\n }\n\n const position = positions[index];\n if (!position) return null;\n\n return (\n <TimelineEntry\n key={event.id}\n ref={event.id === selectedEventId ? selectedRef : undefined}\n colour={event.colour}\n delay={event.delay ?? 0}\n duration={event.duration}\n hasLink={Boolean(event.linkStart)}\n left={position.left}\n status={statusMap[event.id]}\n start={event.timeStart + (event.dayOffset ?? 0) * dayInMs}\n totalGap={event.totalGap}\n isLinkedToLoaded={event.isLinkedToLoaded}\n dayOffset={event.dayOffset}\n title={event.title}\n cue={event.cue}\n width={position.width}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","import { memo } from 'react';\nimport { MaybeString } from 'ontime-types';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\ninterface SectionProps {\n category: 'now' | 'next' | 'followedBy';\n content: MaybeString;\n title: string;\n status?: string;\n}\n\nexport default memo(TimelineSection);\n\nfunction TimelineSection({ category, content, title, status }: SectionProps) {\n const sectionClasses = cx(['section', category === 'now' && 'section--now']);\n const contentClasses = cx(['section-content', content ? `section-content--${category}` : 'section-content--subdue']);\n return (\n <div className={sectionClasses} data-testid={category}>\n <div className='section-title'>\n <span className='section-title__label'>{title}</span>\n {status && <span className='section-title__status'>{status}</span>}\n </div>\n <div className={contentClasses}>{content ?? '-'}</div>\n </div>\n );\n}\n","import { OntimeEvent } from 'ontime-types';\nimport { MILLIS_PER_MINUTE } from 'ontime-utils';\n\nimport { useExpectedStartData } from '../../common/hooks/useSocket';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatDuration, getExpectedTimesFromExtendedEvent } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\n\nimport TimelineSection from './timeline-section/TimelineSection';\n\ninterface TimelineSectionsProps {\n now: ExtendedEntry<OntimeEvent> | null;\n next: ExtendedEntry<OntimeEvent> | null;\n followedBy: ExtendedEntry<OntimeEvent> | null;\n}\n\nexport default function TimelineSections({ now, next, followedBy }: TimelineSectionsProps) {\n const { getLocalizedString } = useTranslation();\n const state = useExpectedStartData();\n\n // gather card data\n const titleNow = now?.title ?? '-';\n const dueText = getLocalizedString('timeline.due').toUpperCase();\n const nextText = next !== null ? next.title : '-';\n const followedByText = followedBy !== null ? followedBy.title : '-';\n let nextStatus: string | undefined;\n let followedByStatus: string | undefined;\n\n if (next !== null) {\n const { timeToStart } = getExpectedTimesFromExtendedEvent(next, state);\n if (timeToStart <= 0) {\n nextStatus = dueText;\n } else {\n nextStatus = formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 2);\n }\n }\n\n if (followedBy !== null) {\n const { timeToStart } = getExpectedTimesFromExtendedEvent(followedBy, state);\n if (timeToStart <= 0) {\n followedByStatus = dueText;\n } else {\n followedByStatus = formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 2);\n }\n }\n\n return (\n <div className='title-grid'>\n <TimelineSection title={getLocalizedString('timeline.live')} content={titleNow} category='now' />\n <TimelineSection\n title={getLocalizedString('common.next')}\n status={nextStatus}\n content={nextText}\n category='next'\n />\n <TimelineSection\n title={getLocalizedString('timeline.followedby')}\n status={followedByStatus}\n content={followedByText}\n category='followedBy'\n />\n </div>\n );\n}\n","import { OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimelineData {\n events: ExtendedEntry<OntimeEntry>[];\n projectData: ProjectData;\n settings: Settings;\n}\n\nexport function useTimelineData(): ViewData<TimelineData> {\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundownWithMetadata();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n\n return {\n data: {\n events: rundownData,\n projectData,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useClock, useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport Timeline from './Timeline';\nimport { getTimelineOptions } from './timeline.options';\nimport { getUpcomingEvents, useScopedRundown } from './timeline.utils';\nimport TimelineSections from './TimelineSections';\nimport { TimelineData, useTimelineData } from './useTimelineData';\n\nimport './TimelinePage.scss';\n\nexport default function TimelinePageLoader() {\n const { data, status } = useTimelineData();\n\n useWindowTitle('Timeline');\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 <TimelinePage {...data} />;\n}\n\nfunction TimelinePage({ events, projectData, settings }: TimelineData) {\n const { selectedEventId } = useSelectedEventId();\n // holds copy of the rundown with only relevant events\n const { scopedRundown, firstStart, totalDuration } = useScopedRundown(events, selectedEventId);\n\n // gather card options\n const { now, next, followedBy } = useMemo(() => {\n return getUpcomingEvents(scopedRundown, selectedEventId);\n }, [scopedRundown, selectedEventId]);\n\n // populate options\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const progressOptions = useMemo(() => getTimelineOptions(defaultFormat), [defaultFormat]);\n\n return (\n <div className='timeline' data-testid='timeline-view'>\n <ViewParamsEditor target={OntimeView.Timeline} viewOptions={progressOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <TimelineClock />\n </div>\n\n <TimelineSections now={now} next={next} followedBy={followedBy} />\n\n <Timeline\n firstStart={firstStart}\n rundown={scopedRundown}\n selectedEventId={selectedEventId}\n totalDuration={totalDuration}\n />\n </div>\n );\n}\n\nfunction TimelineClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["getTimeFrom","current","previous","normalisedCurrentStart","dayInMs","normalisedPreviousEnd","scrollToComponent","componentRef","scrollRef","leftOffset","componentRect","scrollRect","left","useHorizontalFollowComponent","followRef","doFollow","selectedEventId","setScrollFlag","useEffect","useCallback","containerRef","offset","getTimelineOptions","timeFormat","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","isStringBoolean","useTimelineOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","getElementPosition","scheduleStart","scheduleEnd","eventStart","eventDuration","containerWidth","totalDuration","width","getStartHour","startTime","MILLIS_PER_HOUR","getEndHour","endTime","makeTimelineSections","firstHour","lastHour","timelineSections","i","getStatusLabel","timeToStart","status","formatDuration","MILLIS_PER_MINUTE","useScopedRundown","rundown","hidePast","scopedRundown","selectedIndex","firstStart","lastEntry","currentEntry","isOntimeEvent","isPlayableEvent","timeFromPrevious","isNewLatest","getUpcomingEvents","events","selectedId","now","getEventWithId","next","_a","getNextEvent","getFirstEvent","followedBy","_b","calculateTimelineLayout","canScroll","minWidth","smallestWidth","positions","start","duration","position","scale","pos","TimelineMarkers","props","startHour","endHour","elements","jsx","style","tag","formatOptions","TimelineEntry","colour","delay","hasLink","dayOffset","totalGap","isLinkedToLoaded","title","cue","ref","formattedStartTime","formatTime","formattedDuration","delayedStart","hasDelay","lighterColour","alpha","showTitle","smallArea","jsxs","cx","ActiveBlock","TimelineEntryStatus","Fragment","state","useExpectedStartData","getLocalizedString","useTranslation","getExpectedTimesFromExtendedEvent","statusText","useTimer","progress","getProgress","memo","Timeline","screenWidth","useViewportSize","autosize","selectedRef","useRef","scrollContainerRef","lastEvent","getLastEvent","totalWidth","playableEvents","event","currentStatus","statusMap","index","TimelineSection","category","content","sectionClasses","contentClasses","TimelineSections","titleNow","dueText","nextText","followedByText","nextStatus","followedByStatus","useTimelineData","rundownData","rundownStatus","useFlatRundownWithMetadata","projectData","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","aggregateQueryStatus","TimelinePageLoader","data","useWindowTitle","Loader","EmptyPage","TimelinePage","useSelectedEventId","defaultFormat","getDefaultFormat","progressOptions","ViewParamsEditor","OntimeView","ViewLogo","TimelineClock","clock","useClock","formattedClock","SuperscriptTime"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as p,j as r,l as be}from"./vendor-9UkPSc5K.js";import{P as xe,T as m,a as v,b as C,u as Se,c as Te,d as Ce,L as ke,e as Me,f as Oe,g as Pe,h as Ne,i as h,O as ze}from"./index-njXwwjfn.js";import{M as Fe}from"./MultiPartProgressBar-BXQbpM-j.js";import{E as je}from"./EmptyPage-BSzsxpGg.js";import{T as W}from"./TitleCard-BgOtucv6.js";import{V as Ve}from"./ViewLogo--9miplQv.js";import{m as I,O as y,a as A,i as u,g,b as _,c as De,V as Le}from"./ViewParamsEditor-BFu_0oIb.js";import{u as Ee}from"./useWindowTitle-B2UzPuki.js";import{S as He}from"./SuperscriptTime-C8ypTVpH.js";import{g as Be}from"./presentation.utils-B2baBe3j.js";import{g as We,h as Ie,s as Ae,a as Re}from"./viewLoader.utils-DQGhrjSp.js";import{v as Ze}from"./validateEvent-BJMwP_mq.js";import{i as _e}from"./playbackstate-BpzbtG9F.js";import{u as $e}from"./useCustomFields-Da0Li7nQ.js";import{u as Ue}from"./useProjectData-DW06zQvF.js";import"./getProgress-B94Ieskb.js";import"./Empty-C-JO_XAr.js";import"./Select-BLA-yQMq.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},o=new e.Error().stack;o&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[o]="57ca8c42-a9df-4648-a933-09882e19b930",e._sentryDebugIdIdentifier="sentry-dbid-57ca8c42-a9df-4648-a933-09882e19b930")}catch{}})();const Ke=(e,o,t)=>{for(;e<o;){const i=Math.floor((e+o)/2);if(i===e)break;t(i)?e=i:o=i}return e};function R({children:e,mode:o="multi",min:t=16,max:i=256,...n}){const d=p.useRef(null),a=p.useCallback(()=>{const s=d.current;return s?s.scrollHeight>s.clientHeight||s.scrollWidth>s.clientWidth:!1},[]),l=p.useCallback(()=>{const s=d.current;if(!s)return;const c=s.style.visibility;s.style.visibility="hidden";const f=Ke(t,i+1,w=>(s.style.fontSize=`${w}px`,!a()));s.style.fontSize=`${f}px`,s.style.visibility=c},[a,t,i]);return p.useEffect(()=>{const s=d.current;if(!s)return;l();const c=new ResizeObserver(l);return c.observe(s),()=>c.disconnect()},[e,o,l]),r.jsx("div",{ref:d,style:{whiteSpace:o==="single"?"nowrap":"normal"},...n,children:e})}const Qe=[{value:"no-overrides",label:"No Overrides"},{value:m.CountUp,label:"Count Up"},{value:m.CountDown,label:"Count Down"},{value:m.Clock,label:"Clock"}],qe=(e,o)=>{const t=I(o,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),i=I(o,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]);return[{title:y.ClockOptions,collapsible:!0,options:[We(e)]},{title:y.TimerOptions,collapsible:!0,options:[Ie,Ae,{id:"timerType",title:"Timer type",description:"Override the timer type",type:"option",values:Qe,defaultValue:"no-overrides"},{id:"freezeOvertime",title:"Freeze Overtime",description:"If active, the timer will not count into negative numbers",type:"boolean",defaultValue:!1},{id:"freezeMessage",title:"Freeze Message",description:"An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)",type:"string",defaultValue:"",placeholder:"e.g. Time is up!"},{id:"hidePhase",title:"Hide progress styles",description:"Whether to suppress the progress styles (warning, danger and overtime)",type:"boolean",defaultValue:!1}]},{title:y.DataSources,collapsible:!0,options:[{id:"main",title:"Main text",description:"Select the data source for the main text",type:"option",values:t,defaultValue:"title"},{id:"secondary-src",title:"Secondary text",description:"Select the data source for the secondary text",type:"option",values:i,defaultValue:"none"}]},{title:y.ElementVisibility,collapsible:!0,options:[{id:"hideClock",title:"Hide Time Now",description:"Hides the Time Now field",type:"boolean",defaultValue:!1},{id:"hideCards",title:"Hide Cards",description:"Hides the Now and Next cards",type:"boolean",defaultValue:!1},{id:"hideProgress",title:"Hide progress bar",description:"Hides the progress bar",type:"boolean",defaultValue:!1},{id:"hideMessage",title:"Hide Timer Message",description:"Prevents displaying fullscreen messages in the timer",type:"boolean",defaultValue:!1},{id:"hideSecondary",title:"Hide Auxiliary timer / Secondary message",description:"Prevents the screen from displaying the secondary timer field",type:"boolean",defaultValue:!1},{id:"hideLogo",title:"Hide the project logo",description:"Prevents the screen from displaying the given project logo",type:"boolean",defaultValue:!1}]},{title:y.StyleOverride,collapsible:!0,options:[{id:"font",title:"Font",description:"Font family, will use the fonts available in the system",type:"string",placeholder:"Open Sans (default)"},{id:"keyColour",title:"Key Colour",description:"Background or key colour for entire view. Default: #101010",type:"colour",defaultValue:"101010"},{id:"timerColour",title:"Timer Colour",description:"Timer colour. Default: #f6f6f6",type:"colour",defaultValue:"f6f6f6"}]}]};function Ge(e,o){const t=n=>(o==null?void 0:o.get(n))??e.get(n),i=Ze(t("timerType"),m.None);return{hideClock:u(t("hideClock")),hideCards:u(t("hideCards")),hideProgress:u(t("hideProgress")),hideMessage:u(t("hideMessage")),hideSecondary:u(t("hideSecondary")),hideLogo:u(t("hideLogo")),hideTimerSeconds:u(t("hideTimerSeconds")),removeLeadingZeros:!u(t("showLeadingZeros")),mainSource:t("main"),secondarySource:t("secondary-src"),timerType:i===m.None?void 0:i,freezeOvertime:u(t("freezeOvertime")),freezeMessage:t("freezeMessage")??"",hidePhase:u(t("hidePhase")),font:t("font")??void 0,keyColour:A(t("keyColour")),timerColour:A(t("timerColour"))}}function Je(){const[e]=be(),o=p.use(xe);return p.useMemo(()=>{const i=o?new URLSearchParams(o.search):void 0;return Ge(e,i)},[o,e])}function Xe(e){return e.text!==""&&e.visible}function Ye(e){return e===C.Play||e===C.Roll}function et(e,o){return(e??0)+(o??0)}function tt(e){return e!==m.None&&e!==m.Clock}function ot(e){return e!==m.Clock}const Z={4:28,5:28,6:25,8:18,9:18};function it(e,o){const t=e.length;let i=100/(t-1)*1.25;Z[t]&&(i=Z[t]);let n=i*.325;return o&&(i*=.6,o.length>25&&(n=100/(o.length-1)*1.8)),{timerFontSize:i,externalFontSize:n}}function st(e,o,t,i,n,d){return d?{showEndMessage:!1,showFinished:!1,showWarning:!1,showDanger:!1}:e===m.CountDown||o?{showEndMessage:t===v.Overtime&&i&&n!=="",showFinished:t===v.Overtime,showWarning:t===v.Warning,showDanger:t===v.Danger}:{showEndMessage:!1,showFinished:!1,showWarning:!1,showDanger:!1}}function rt(e,o,t,i,n,d){if(!d){if(e.timer.secondarySource==="aux1"||e.timer.secondarySource==="aux2"||e.timer.secondarySource==="aux3")return _(o,m.CountDown,t,{removeSeconds:i,removeLeadingZero:n});if(e.timer.secondarySource==="secondary"&&e.secondary)return e.secondary}}function nt(e,o,t,i,n,d){if(n===C.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const a=_e(n)&&d!==v.Pending,l=a?g(e,t??"title"):void 0,s=a?g(e,i):void 0,c=a?g(o,t??"title"):g(e,t??"title"),f=a?g(o,i):g(e,i);return{showNow:!!l||!!s,nowMain:l,nowSecondary:s,showNext:!!c||!!f,nextMain:c,nextSecondary:f}}function at(){const e=Se(c=>c.mirror),{data:o,status:t}=Ue(),{data:i,status:n}=Te(),{data:d,status:a}=Ce(),{data:l,status:s}=$e();return{data:{customFields:l,projectData:o,isMirrored:e,settings:d,viewSettings:i},status:Re([t,n,a,s])}}function Ot(){const{data:e,status:o}=at();return Ee("Timer"),o==="pending"?r.jsx(ke,{}):o==="error"?r.jsx(je,{text:"There was an error fetching data, please refresh the page."}):r.jsx(lt,{...e})}function lt({customFields:e,projectData:o,isMirrored:t,settings:i,viewSettings:n}){const{eventNext:d,eventNow:a,message:l,time:s,clock:c,timerTypeNow:f,countToEndNow:w,auxTimer:x}=Me(),{hideClock:$,hideCards:U,hideProgress:K,hideMessage:Q,hideSecondary:q,hideLogo:G,hideTimerSeconds:k,removeLeadingZeros:M,mainSource:J,secondarySource:X,timerType:O,freezeOvertime:P,freezeMessage:N,hidePhase:Y,font:z,keyColour:F,timerColour:ee}=Je(),{getLocalizedString:j}=Oe(),V=j("common.minutes"),b=O??f,D=Xe(l.timer),{showEndMessage:te,showFinished:S,showWarning:oe,showDanger:ie}=st(f,w,s.phase,P,N,Y),L=Ye(s.playback),se=!$&&ot(b),re=!K&&tt(b),{showNow:ne,nowMain:ae,nowSecondary:le,showNext:de,nextMain:ce,nextSecondary:ue}=nt(a,d,J,X,s.playback,s.phase),me=et(s.duration,s.addedTime),fe=Pe(c),he=De(P,f,w,c,s,O),E=_(he,b,V,{removeSeconds:k,removeLeadingZero:M}),pe=l.timer.secondarySource==="aux1"?x.aux1:l.timer.secondarySource==="aux2"?x.aux2:l.timer.secondarySource==="aux3"?x.aux3:null,T=rt(l,pe,V,k,M,q),H=Be(n,ee,oe,ie),{timerFontSize:ge,externalFontSize:ye}=it(E,T),ve={...F&&{"--timer-bg":F},...H&&{"--timer-colour":H},...z&&{"--timer-font":z}},B=Ne(i==null?void 0:i.timeFormat),we=p.useMemo(()=>qe(B,e),[e,B]);return r.jsxs("div",{"data-testid":"timer-view",className:h(["stage-timer",t&&"mirror",S&&"stage-timer--finished"]),style:ve,children:[!G&&(o==null?void 0:o.logo)&&r.jsx(Ve,{name:o.logo,className:"logo"}),r.jsx(Le,{target:ze.Timer,viewOptions:we}),r.jsx("div",{className:h(["blackout",l.timer.blackout&&"blackout--active"])}),!Q&&r.jsx("div",{className:h(["message-overlay",D&&"message-overlay--active"]),children:r.jsx(R,{mode:"multi",min:32,max:256,className:h(["message",l.timer.blink&&"blink"]),children:l.timer.text})}),se&&r.jsxs("div",{className:"clock-container",children:[r.jsx("div",{className:"label",children:j("common.time_now")}),r.jsx(He,{time:fe,className:"clock"})]}),r.jsxs("div",{className:h(["timer-container",l.timer.blink&&!D&&"blink"]),children:[te?r.jsx(R,{mode:"multi",min:64,max:256,className:"end-message",children:N}):r.jsx("div",{className:h(["timer",!L&&"timer--paused",S&&"timer--finished"]),style:{fontSize:`${ge}vw`},"data-type":b,"data-phase":s.phase,children:E}),r.jsx("div",{className:h(["secondary",!T&&"secondary--hidden"]),style:{fontSize:`${ye}vw`},children:T})]}),re&&r.jsx(Fe,{className:h(["progress-container",!L&&"progress-container--paused"]),now:s.current,complete:me,normalColor:n.normalColor,warning:a==null?void 0:a.timeWarning,warningColor:n.warningColor,danger:a==null?void 0:a.timeDanger,dangerColor:n.dangerColor,hideOvertime:!S}),!U&&r.jsxs(r.Fragment,{children:[ne&&r.jsx(W,{className:"event now",label:"now",title:ae,secondary:le}),de&&r.jsx(W,{className:"event next",label:"next",title:ce,secondary:ue})]})]})}export{Ot as default};
|
|
2
|
-
//# sourceMappingURL=Timer-jjWAunJc.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Timer-jjWAunJc.js","sources":["../../src/common/components/fit-text/fitText.utils.ts","../../src/common/components/fit-text/FitText.tsx","../../src/views/timer/timer.options.ts","../../src/views/timer/timer.utils.ts","../../src/views/timer/useTimerData.ts","../../src/views/timer/Timer.tsx"],"sourcesContent":["/**\n * @param low inclusive, must be true on predicate function\n * @param high exclusive,\n * @param predicate predicate function\n */\nexport const bsearch = (low: number, high: number, predicate: (mid: number) => boolean): number => {\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (mid === low) break;\n\n if (predicate(mid)) {\n low = mid;\n } else {\n high = mid;\n }\n }\n return low;\n};\n","/**\n * Copied from\n * https://github.com/namhong2001/react-textfit/blob/master/index.tsx\n */\n\nimport { HTMLAttributes, PropsWithChildren, useCallback, useEffect, useRef } from 'react';\n\nimport { bsearch } from './fitText.utils';\n\ninterface FitTextProps extends HTMLAttributes<HTMLDivElement> {\n mode?: 'single' | 'multi';\n min?: number; // inclusive\n max?: number; // inclusive\n}\n\nexport function FitText({\n children,\n mode = 'multi',\n min = 16,\n max = 256,\n ...elementProps\n}: PropsWithChildren<FitTextProps>) {\n const ref = useRef<HTMLDivElement>(null);\n\n const isOverflown = useCallback(() => {\n const el = ref.current;\n if (!el) return false;\n return el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;\n }, []);\n\n const setFontSize = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n\n const originVisibility = el.style.visibility;\n\n el.style.visibility = 'hidden';\n const fontSize = bsearch(min, max + 1, (mid) => {\n el.style.fontSize = `${mid}px`;\n return !isOverflown();\n });\n el.style.fontSize = `${fontSize}px`;\n el.style.visibility = originVisibility;\n }, [isOverflown, min, max]);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n setFontSize();\n const observer = new ResizeObserver(setFontSize);\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [children, mode, setFontSize]);\n\n return (\n <div\n ref={ref}\n style={{\n whiteSpace: mode === 'single' ? 'nowrap' : 'normal',\n }}\n {...elementProps}\n >\n {children}\n </div>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, TimerType } from 'ontime-types';\nimport { validateTimerType } from 'ontime-utils';\n\nimport type { SelectOption } from '../../common/components/select/Select';\nimport {\n getTimeOption,\n hideTimerSeconds,\n showLeadingZeros,\n} 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 { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean, makeColourString } from '../../features/viewers/common/viewUtils';\n\n// manually match the properties of TimerType excluding the None\nconst timerDisplayOptions: SelectOption[] = [\n { value: 'no-overrides', label: 'No Overrides' },\n { value: TimerType.CountUp, label: 'Count Up' },\n { value: TimerType.CountDown, label: 'Count Down' },\n { value: TimerType.Clock, label: 'Clock' },\n];\n\nexport const getTimerOptions = (timeFormat: string, customFields: CustomFields): ViewOption[] => {\n const mainOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.TimerOptions,\n collapsible: true,\n options: [\n hideTimerSeconds,\n showLeadingZeros,\n {\n id: 'timerType',\n title: 'Timer type',\n description: 'Override the timer type',\n type: 'option',\n values: timerDisplayOptions,\n defaultValue: 'no-overrides',\n },\n {\n id: 'freezeOvertime',\n title: 'Freeze Overtime',\n description: 'If active, the timer will not count into negative numbers',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'freezeMessage',\n title: 'Freeze Message',\n description:\n 'An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)',\n type: 'string',\n defaultValue: '',\n placeholder: 'e.g. Time is up!',\n },\n {\n id: 'hidePhase',\n title: 'Hide progress styles',\n description: 'Whether to suppress the progress styles (warning, danger and overtime)',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main text',\n description: 'Select the data source for the main text',\n type: 'option',\n values: mainOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary text',\n description: 'Select the data source for the secondary text',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hideClock',\n title: 'Hide Time Now',\n description: 'Hides the Time Now field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideCards',\n title: 'Hide Cards',\n description: 'Hides the Now and Next cards',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideProgress',\n title: 'Hide progress bar',\n description: 'Hides the progress bar',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideMessage',\n title: 'Hide Timer Message',\n description: 'Prevents displaying fullscreen messages in the timer',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideSecondary',\n title: 'Hide Auxiliary timer / Secondary message',\n description: 'Prevents the screen from displaying the secondary timer field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideLogo',\n title: 'Hide the project logo',\n description: 'Prevents the screen from displaying the given project logo',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.StyleOverride,\n collapsible: true,\n options: [\n {\n id: 'font',\n title: 'Font',\n description: 'Font family, will use the fonts available in the system',\n type: 'string',\n placeholder: 'Open Sans (default)',\n },\n {\n id: 'keyColour',\n title: 'Key Colour',\n description: 'Background or key colour for entire view. Default: #101010',\n type: 'colour',\n defaultValue: '101010',\n },\n {\n id: 'timerColour',\n title: 'Timer Colour',\n description: 'Timer colour. Default: #f6f6f6',\n type: 'colour',\n defaultValue: 'f6f6f6',\n },\n ],\n },\n ];\n};\n\ntype TimerOptions = {\n hideClock: boolean;\n hideCards: boolean;\n hideProgress: boolean;\n hideMessage: boolean;\n hideSecondary: boolean;\n hideLogo: boolean;\n hideTimerSeconds: boolean;\n removeLeadingZeros: boolean;\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n timerType?: TimerType;\n freezeOvertime: boolean;\n freezeMessage: string;\n hidePhase: boolean;\n font?: string;\n keyColour?: string;\n timerColour?: string;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallbacks are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): TimerOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Get timerType from either source\n const timerType = validateTimerType(getValue('timerType'), TimerType.None);\n\n return {\n hideClock: isStringBoolean(getValue('hideClock')),\n hideCards: isStringBoolean(getValue('hideCards')),\n hideProgress: isStringBoolean(getValue('hideProgress')),\n hideMessage: isStringBoolean(getValue('hideMessage')),\n hideSecondary: isStringBoolean(getValue('hideSecondary')),\n hideLogo: isStringBoolean(getValue('hideLogo')),\n hideTimerSeconds: isStringBoolean(getValue('hideTimerSeconds')),\n removeLeadingZeros: !isStringBoolean(getValue('showLeadingZeros')),\n\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n\n // none doesnt make sense as a configuration of the view\n timerType: timerType === TimerType.None ? undefined : timerType,\n freezeOvertime: isStringBoolean(getValue('freezeOvertime')),\n freezeMessage: getValue('freezeMessage') ?? '',\n hidePhase: isStringBoolean(getValue('hidePhase')),\n\n font: getValue('font') ?? undefined,\n keyColour: makeColourString(getValue('keyColour')),\n timerColour: makeColourString(getValue('timerColour')),\n };\n}\n\n/**\n * Hook exposes the timer view options\n */\nexport function useTimerOptions(): TimerOptions {\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 { MaybeNumber, MessageState, OntimeEvent, Playback, TimerMessage, TimerPhase, TimerType } from 'ontime-types';\nimport { isPlaybackActive } from 'ontime-utils';\n\nimport { getFormattedTimer, getPropertyValue } from '../../features/viewers/common/viewUtils';\n\n/**\n * Whether a message should be shown\n */\nexport function getShowMessage(message: TimerMessage): boolean {\n return message.text !== '' && message.visible;\n}\n\n/**\n * Whether the playback is playing\n */\nexport function getIsPlaying(playback: Playback): boolean {\n return playback === Playback.Play || playback === Playback.Roll;\n}\n\n/**\n * Gets the total time from the duration and added time of an event\n */\nexport function getTotalTime(duration: MaybeNumber, addedTime: MaybeNumber): number {\n return (duration ?? 0) + (addedTime ?? 0);\n}\n\n/**\n * Whether the progress bar should be shown for this timer type\n */\nexport function getShowProgressBar(timerType: TimerType) {\n return timerType !== TimerType.None && timerType !== TimerType.Clock;\n}\n\n/**\n * Whether the clock should be shown with this timer type\n */\nexport function getShowClock(timerType: TimerType) {\n return timerType !== TimerType.Clock;\n}\n\nconst fontSizeMap: { [key: number]: number } = {\n 4: 28, // 9:01\n 5: 28, // -9:01, 10:01, 9 min\n 6: 25, // -10:01, 10 min\n 8: 18, // 23:01:01\n 9: 18, // -23:01:01\n};\n\n/**\n * Finds a font size that fits the timer in the screen\n * Unfortunately hand tweaked\n */\nexport function getEstimatedFontSize(stageTimer: string, secondaryContent?: string) {\n const stageTimerCharacters = stageTimer.length;\n let timerFontSize = (100 / (stageTimerCharacters - 1)) * 1.25;\n\n if (fontSizeMap[stageTimerCharacters]) {\n timerFontSize = fontSizeMap[stageTimerCharacters];\n }\n\n let externalFontSize = timerFontSize * 0.325;\n if (secondaryContent) {\n // we need to shrink the timer if the external is going to be there\n // this number has been tweaked to fit in a landscape mobile screen\n timerFontSize *= 0.6;\n if (secondaryContent.length > 25) {\n externalFontSize = (100 / (secondaryContent.length - 1)) * 1.8;\n }\n }\n\n return {\n timerFontSize,\n externalFontSize,\n };\n}\n\n/**\n * which, if any, modifier should be shown at any time\n */\nexport function getShowModifiers(\n timerType: TimerType,\n countToEnd: boolean,\n phase: TimerPhase,\n freezeOvertime: boolean,\n freezeMessage: string,\n hidePhase: boolean,\n) {\n if (hidePhase) {\n return {\n showEndMessage: false,\n showFinished: false,\n showWarning: false,\n showDanger: false,\n };\n }\n\n const showModifiers = timerType === TimerType.CountDown || countToEnd;\n if (!showModifiers) {\n return {\n showEndMessage: false,\n showFinished: false,\n showWarning: false,\n showDanger: false,\n };\n }\n\n return {\n showEndMessage: phase === TimerPhase.Overtime && freezeOvertime && freezeMessage !== '',\n showFinished: phase === TimerPhase.Overtime,\n showWarning: phase === TimerPhase.Warning,\n showDanger: phase === TimerPhase.Danger,\n };\n}\n\n/**\n * What, if anything, should be displayed in the secondary field\n */\nexport function getSecondaryDisplay(\n message: MessageState,\n currentAux: MaybeNumber,\n localisedMinutes: string,\n removeSeconds: boolean,\n removeLeadingZero: boolean,\n hideSecondary: boolean,\n): string | undefined {\n if (hideSecondary) {\n return;\n }\n if (\n message.timer.secondarySource === 'aux1' ||\n message.timer.secondarySource === 'aux2' ||\n message.timer.secondarySource === 'aux3'\n ) {\n return getFormattedTimer(currentAux, TimerType.CountDown, localisedMinutes, {\n removeSeconds,\n removeLeadingZero,\n });\n }\n if (message.timer.secondarySource === 'secondary' && message.secondary) {\n return message.secondary;\n }\n return;\n}\n\n/**\n * What should we be showing in the cards?\n */\nexport function getCardData(\n eventNow: OntimeEvent | null,\n eventNext: OntimeEvent | null,\n mainSource: keyof OntimeEvent | null,\n secondarySource: keyof OntimeEvent | null,\n playback: Playback,\n phase: TimerPhase,\n) {\n if (playback === Playback.Stop) {\n return {\n showNow: false,\n nowMain: undefined,\n nowSecondary: undefined,\n showNext: false,\n nextMain: undefined,\n nextSecondary: undefined,\n };\n }\n\n // pending roll timers would be classified as active\n const hasActiveTimer = isPlaybackActive(playback) && phase !== TimerPhase.Pending;\n\n // if we are loaded, we show the upcoming event as next\n const nowMain = hasActiveTimer ? getPropertyValue(eventNow, mainSource ?? 'title') : undefined;\n const nowSecondary = hasActiveTimer ? getPropertyValue(eventNow, secondarySource) : undefined;\n const nextMain = hasActiveTimer\n ? getPropertyValue(eventNext, mainSource ?? 'title')\n : getPropertyValue(eventNow, mainSource ?? 'title');\n const nextSecondary = hasActiveTimer\n ? getPropertyValue(eventNext, secondarySource)\n : getPropertyValue(eventNow, secondarySource);\n\n return {\n showNow: Boolean(nowMain) || Boolean(nowSecondary),\n nowMain,\n nowSecondary,\n showNext: Boolean(nextMain) || Boolean(nextSecondary),\n nextMain,\n nextSecondary,\n };\n}\n","import { CustomFields, ProjectData, Settings, ViewSettings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport useViewSettings from '../../common/hooks-query/useViewSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimerData {\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n viewSettings: ViewSettings;\n}\n\nexport function useTimerData(): ViewData<TimerData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: viewSettings, status: viewSettingsStatus } = useViewSettings();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n customFields,\n projectData,\n isMirrored,\n settings,\n viewSettings,\n },\n status: aggregateQueryStatus([projectDataStatus, viewSettingsStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\nimport { FitText } from '../../common/components/fit-text/FitText';\nimport MultiPartProgressBar from '../../common/components/multi-part-progress-bar/MultiPartProgressBar';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useTimerSocket } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getFormattedTimer, getTimerByType } from '../../features/viewers/common/viewUtils';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport { getTimerColour } from '../utils/presentation.utils';\n\nimport { getTimerOptions, useTimerOptions } from './timer.options';\nimport {\n getCardData,\n getEstimatedFontSize,\n getIsPlaying,\n getSecondaryDisplay,\n getShowClock,\n getShowMessage,\n getShowModifiers,\n getShowProgressBar,\n getTotalTime,\n} from './timer.utils';\nimport { TimerData, useTimerData } from './useTimerData';\n\nimport './Timer.scss';\n\nexport default function TimerLoader() {\n const { data, status } = useTimerData();\n\n useWindowTitle('Timer');\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 <Timer {...data} />;\n}\n\nfunction Timer({ customFields, projectData, isMirrored, settings, viewSettings }: TimerData) {\n const { eventNext, eventNow, message, time, clock, timerTypeNow, countToEndNow, auxTimer } = useTimerSocket();\n const {\n hideClock,\n hideCards,\n hideProgress,\n hideMessage,\n hideSecondary,\n hideLogo,\n hideTimerSeconds,\n removeLeadingZeros,\n mainSource,\n secondarySource,\n timerType,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n font,\n keyColour,\n timerColour,\n } = useTimerOptions();\n\n const { getLocalizedString } = useTranslation();\n const localisedMinutes = getLocalizedString('common.minutes');\n\n // gather modifiers\n const viewTimerType = timerType ?? timerTypeNow;\n const showOverlay = getShowMessage(message.timer);\n const { showEndMessage, showFinished, showWarning, showDanger } = getShowModifiers(\n timerTypeNow,\n countToEndNow,\n time.phase,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n );\n const isPlaying = getIsPlaying(time.playback);\n const showClock = !hideClock && getShowClock(viewTimerType);\n const showProgressBar = !hideProgress && getShowProgressBar(viewTimerType);\n\n // gather card data\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n mainSource,\n secondarySource,\n time.playback,\n time.phase,\n );\n\n // gather timer data\n const totalTime = getTotalTime(time.duration, time.addedTime);\n const formattedClock = formatTime(clock);\n const stageTimer = getTimerByType(freezeOvertime, timerTypeNow, countToEndNow, clock, time, timerType);\n const display = getFormattedTimer(stageTimer, viewTimerType, localisedMinutes, {\n removeSeconds: hideTimerSeconds,\n removeLeadingZero: removeLeadingZeros,\n });\n\n const currentAux = (() => {\n if (message.timer.secondarySource === 'aux1') {\n return auxTimer.aux1;\n }\n if (message.timer.secondarySource === 'aux2') {\n return auxTimer.aux2;\n }\n if (message.timer.secondarySource === 'aux3') {\n return auxTimer.aux3;\n }\n return null;\n })();\n\n const secondaryContent = getSecondaryDisplay(\n message,\n currentAux,\n localisedMinutes,\n hideTimerSeconds,\n removeLeadingZeros,\n hideSecondary,\n );\n\n // gather presentation styles\n const resolvedTimerColour = getTimerColour(viewSettings, timerColour, showWarning, showDanger);\n const { timerFontSize, externalFontSize } = getEstimatedFontSize(display, secondaryContent);\n const userStyles = {\n ...(keyColour && { '--timer-bg': keyColour }),\n ...(resolvedTimerColour && { '--timer-colour': resolvedTimerColour }),\n ...(font && { '--timer-font': font }),\n };\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const timerOptions = useMemo(() => getTimerOptions(defaultFormat, customFields), [customFields, defaultFormat]);\n\n return (\n <div\n data-testid='timer-view'\n className={cx(['stage-timer', isMirrored && 'mirror', showFinished && 'stage-timer--finished'])}\n style={userStyles}\n >\n {!hideLogo && projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n\n <ViewParamsEditor target={OntimeView.Timer} viewOptions={timerOptions} />\n\n <div className={cx(['blackout', message.timer.blackout && 'blackout--active'])} />\n\n {!hideMessage && (\n <div className={cx(['message-overlay', showOverlay && 'message-overlay--active'])}>\n <FitText mode='multi' min={32} max={256} className={cx(['message', message.timer.blink && 'blink'])}>\n {message.timer.text}\n </FitText>\n </div>\n )}\n\n {showClock && (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='clock' />\n </div>\n )}\n\n <div className={cx(['timer-container', message.timer.blink && !showOverlay && 'blink'])}>\n {showEndMessage ? (\n <FitText mode='multi' min={64} max={256} className='end-message'>\n {freezeMessage}\n </FitText>\n ) : (\n <div\n className={cx(['timer', !isPlaying && 'timer--paused', showFinished && 'timer--finished'])}\n style={{ fontSize: `${timerFontSize}vw` }}\n data-type={viewTimerType}\n data-phase={time.phase}\n >\n {display}\n </div>\n )}\n <div\n className={cx(['secondary', !secondaryContent && 'secondary--hidden'])}\n style={{ fontSize: `${externalFontSize}vw` }}\n >\n {secondaryContent}\n </div>\n </div>\n\n {showProgressBar && (\n <MultiPartProgressBar\n className={cx(['progress-container', !isPlaying && 'progress-container--paused'])}\n now={time.current}\n complete={totalTime}\n normalColor={viewSettings.normalColor}\n warning={eventNow?.timeWarning}\n warningColor={viewSettings.warningColor}\n danger={eventNow?.timeDanger}\n dangerColor={viewSettings.dangerColor}\n hideOvertime={!showFinished}\n />\n )}\n\n {!hideCards && (\n <>\n {showNow && <TitleCard className='event now' label='now' title={nowMain} secondary={nowSecondary} />}\n {showNext && <TitleCard className='event next' label='next' title={nextMain} secondary={nextSecondary} />}\n </>\n )}\n </div>\n );\n}\n"],"names":["bsearch","low","high","predicate","mid","FitText","children","mode","min","max","elementProps","ref","useRef","isOverflown","useCallback","el","setFontSize","originVisibility","fontSize","useEffect","observer","jsx","timerDisplayOptions","TimerType","getTimerOptions","timeFormat","customFields","mainOptions","makeOptionsFromCustomFields","secondaryOptions","OptionTitle","getTimeOption","hideTimerSeconds","showLeadingZeros","getOptionsFromParams","searchParams","defaultValues","getValue","key","timerType","validateTimerType","isStringBoolean","makeColourString","useTimerOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","getShowMessage","message","getIsPlaying","playback","Playback","getTotalTime","duration","addedTime","getShowProgressBar","getShowClock","fontSizeMap","getEstimatedFontSize","stageTimer","secondaryContent","stageTimerCharacters","timerFontSize","externalFontSize","getShowModifiers","countToEnd","phase","freezeOvertime","freezeMessage","hidePhase","TimerPhase","getSecondaryDisplay","currentAux","localisedMinutes","removeSeconds","removeLeadingZero","hideSecondary","getFormattedTimer","getCardData","eventNow","eventNext","mainSource","secondarySource","hasActiveTimer","isPlaybackActive","nowMain","getPropertyValue","nowSecondary","nextMain","nextSecondary","useTimerData","isMirrored","useViewOptionsStore","state","projectData","projectDataStatus","useProjectData","viewSettings","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","TimerLoader","data","status","useWindowTitle","Loader","EmptyPage","Timer","time","clock","timerTypeNow","countToEndNow","auxTimer","useTimerSocket","hideClock","hideCards","hideProgress","hideMessage","hideLogo","removeLeadingZeros","font","keyColour","timerColour","getLocalizedString","useTranslation","viewTimerType","showOverlay","showEndMessage","showFinished","showWarning","showDanger","isPlaying","showClock","showProgressBar","showNow","showNext","totalTime","formattedClock","formatTime","getTimerByType","display","resolvedTimerColour","getTimerColour","userStyles","defaultFormat","getDefaultFormat","timerOptions","jsxs","cx","ViewLogo","ViewParamsEditor","OntimeView","SuperscriptTime","MultiPartProgressBar","Fragment","TitleCard"],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as w,j as t,ax as W,bK as Y,T as Z,aL as tt,x as et,bL as $,bM as q,bN as E,bO as st,bP as at,bQ as nt}from"./vendor-9UkPSc5K.js";import{C as it}from"./EditorUtils-CFE106qQ.js";import{b as n,a as T,i as M,H as ot,bB as c,bC as lt,bD as P,bE as h,bF as I,bG as rt,y as g,bg as S,J as ct,l as A,r as dt,bH as mt,av as ut,bv as xt,b6 as pt,bw as _t}from"./index-njXwwjfn.js";import{P as bt}from"./ProtectRoute-DJ9xZnPI.js";import{T as z,A as ht}from"./TimeInput-DU09ewqh.js";import{p as L}from"./parseUserTime-Bc1pSJR2.js";import{T as R}from"./Tooltip-C0rGHLsB.js";import{u as yt}from"./useReport-DhFY2L8v.js";import{s as B}from"./Editor.module-DvV2efYs.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]="feb26a1e-b919-4a09-a97c-e027a3c6bb53",e._sentryDebugIdIdentifier="sentry-dbid-feb26a1e-b919-4a09-a97c-e027a3c6bb53")}catch{}})();function jt(e,s){return{start:e!==n.Stop&&e!==n.Play,pause:e===n.Play,roll:e!==n.Roll&&s!==T.Overtime,stop:e!==n.Stop,reload:e!==n.Stop&&e!==n.Roll}}const ft="_blink_yewzx_1",vt="_fourtyfive_yewzx_13",gt="_tapButton_yewzx_17",kt="_neutral_yewzx_29",Ct="_active_yewzx_51",Nt="_play_yewzx_66",Tt="_roll_yewzx_93",wt="_pause_yewzx_120",It="_ontime_yewzx_147",Pt="_stop_yewzx_174",St="_square_yewzx_201",At="_tight_yewzx_206",Rt="_fill_yewzx_211",f={blink:ft,fourtyfive:vt,tapButton:gt,neutral:kt,active:Ct,play:Nt,roll:Tt,pause:wt,ontime:It,stop:Pt,square:St,tight:At,fill:Rt},r=w.forwardRef((e,s)=>{const{children:a,disabled:i,onClick:l,theme:o="neutral",aspect:m="normal",active:u,className:x}=e;return t.jsx("button",{className:M([f.tapButton,x,f[o],f[m],u&&f.active]),disabled:i,type:"button",onClick:l,ref:s,children:a})});r.displayName="TabButton";const Bt="_addTime_18oax_17",Dt="_addButtons_18oax_24",$t="_tallButtons_18oax_30",v={addTime:Bt,addButtons:Dt,tallButtons:$t};function qt(e){const{playback:s}=e,[a,i]=W({key:"add-time",defaultValue:3e5}),l=(x,k)=>{const _=L(k);i(Math.min(_,ot))},o=x=>{x==="add"?c.addTime(a):c.addTime(-1*a)},u=!(s===n.Play||s===n.Pause)||a===0;return t.jsxs("div",{className:v.addTime,children:[t.jsx(z,{name:"addtime",submitHandler:l,time:a,placeholder:"Add time"}),t.jsxs("div",{className:v.addButtons,children:[t.jsx(r,{onClick:()=>o("remove"),disabled:u,className:v.tallButtons,children:t.jsx(Y,{})}),t.jsx(r,{onClick:()=>o("add"),disabled:u,className:v.tallButtons,children:t.jsx(Z,{})})]})]})}const Et="_label_u5jlo_17",Mt="_controls_u5jlo_24",zt="_input_u5jlo_28",Lt="_twoSides_u5jlo_34",Ft="_fakeInput_u5jlo_42",y={label:Et,controls:Mt,input:zt,twoSides:Lt,fakeInput:Ft};function C({index:e}){const{playback:s,direction:a}=lt(e),{stop:i,setDirection:l}=I,o=()=>{const x=a===h.CountDown?h.CountUp:h.CountDown;l(e,x)},m=s!==P.Stop,u=s===P.Start?"pause":"play";return t.jsxs("label",{className:y.label,children:["Aux Timer ",e,t.jsxs("div",{className:y.controls,children:[t.jsxs("div",{className:y.input,children:[t.jsx(Ot,{index:e,isActive:m}),t.jsxs(r,{onClick:o,aspect:"tight",disabled:m,children:[a===h.CountDown&&t.jsx(tt,{"data-testid":`aux-timer-direction-${e}`}),a===h.CountUp&&t.jsx(et,{"data-testid":`aux-timer-direction-${e}`})]})]}),t.jsxs("div",{className:y.twoSides,children:[t.jsx(Ut,{index:e,action:u}),t.jsx(r,{onClick:()=>i(e),theme:n.Stop,disabled:!m,children:t.jsx($,{"data-testid":`aux-timer-stop-${e}`})})]})]})]})}function Ot({index:e,isActive:s}){const a=rt(e),{setDuration:i}=I,l=(o,m)=>{const u=L(m);i(e,u)};return s?t.jsx("div",{className:y.fakeInput,"data-testid":`time-label-aux${e}`,children:g(a)}):t.jsx(z,{submitHandler:l,name:`aux${e}`,time:a,placeholder:`Aux ${e}`})}function Ut({index:e,action:s}){const{start:a,pause:i}=I;return s==="play"?t.jsx(r,{onClick:()=>a(e),theme:n.Play,children:t.jsx(q,{"data-testid":`aux-timer-start-${e}`})}):t.jsx(r,{onClick:()=>i(e),theme:n.Pause,children:t.jsx(E,{"data-testid":`aux-timer-pause-${e}`})})}const Ht="_buttonContainer_1mqxq_17",Xt="_go_1mqxq_25",Gt="_playbackContainer_1mqxq_30",Vt="_transportContainer_1mqxq_37",Jt="_extra_1mqxq_44",Kt="_invertX_1mqxq_51",p={buttonContainer:Ht,go:Xt,playbackContainer:Gt,transportContainer:Vt,extra:Jt,invertX:Kt};function Qt(e){const{playback:s,numEvents:a,selectedEventIndex:i,timerPhase:l}=e,o=s===n.Roll,m=s===n.Play,u=s===n.Pause,x=s===n.Armed,k=i===0,_=i===a-1,j=a===0,F=o||j,O=o||j||_,U=o||j||k,b=jt(s,l),H=!b.start,X=!b.pause,G=!b.roll||j,V=!b.stop,J=!b.reload,[K,Q]=w.useMemo(()=>x?[c.start,"Start"]:_?[c.stop,"Finish"]:i===null?[c.startNext,"Start"]:[c.startNext,"Next"],[x,_,i]);return t.jsxs("div",{className:p.buttonContainer,children:[t.jsx(r,{disabled:F,onClick:K,aspect:"fill",className:p.go,children:Q}),t.jsxs("div",{className:p.playbackContainer,children:[t.jsx(r,{onClick:c.start,disabled:H,theme:n.Play,active:m,children:t.jsx(q,{})}),t.jsx(r,{onClick:c.pause,disabled:X,theme:n.Pause,active:u,children:t.jsx(E,{})})]}),t.jsxs("div",{className:p.transportContainer,children:[t.jsx(r,{onClick:c.previous,disabled:U,children:t.jsx(st,{})}),t.jsx(r,{onClick:c.next,disabled:O,children:t.jsx(at,{})})]}),t.jsxs("div",{className:p.extra,children:[t.jsx(r,{onClick:c.roll,disabled:G,theme:n.Roll,active:o,children:"Roll"}),t.jsx(r,{onClick:c.reload,disabled:J,children:t.jsx(nt,{className:p.invertX})}),t.jsx(r,{onClick:c.stop,disabled:V,theme:n.Stop,children:t.jsx($,{})})]})]})}const Wt="_timer_1f17d_21",Yt="_finished_1f17d_33",Zt="_muted_1f17d_36",N={timer:Wt,finished:Yt,muted:Zt};function te(e){const{time:s}=e,a=(s??0)<0,i=s==null?S:g(s,{fallback:S}).replace("-",""),l=M([N.timer,a?N.finished:null,s===null&&N.muted]);return t.jsx("div",{className:l,children:i})}const ee="_timeContainer_g12ye_17",se="_indicators_g12ye_25",ae="_indicatorRoll_g12ye_34",ne="_indicatorDelay_g12ye_35",ie="_indicatorNegative_g12ye_36",oe="_status_g12ye_65",le="_tag_g12ye_73",re="_time_g12ye_17",ce="_rolltag_g12ye_84",d={timeContainer:ee,indicators:se,indicatorRoll:ae,indicatorDelay:ne,indicatorNegative:ie,status:oe,tag:le,time:re,rolltag:ce};function de(e){return e>0?`Added ${A(e,!1)}`:e<0?`Removed ${A(Math.abs(e),!1)}`:""}function me({children:e}){const s=ct(),a=s.playback===n.Roll,i=s.phase===T.Pending,l=s.phase===T.Overtime,o=!!s.addedTime,m=a?"Roll mode active":"",u=de(s.addedTime);return t.jsxs("div",{className:d.timeContainer,children:[t.jsxs("div",{className:d.indicators,children:[t.jsx(R,{text:m,render:t.jsx("div",{}),className:d.indicatorRoll,"data-active":a}),t.jsx("div",{className:d.indicatorNegative,"data-active":l}),t.jsx(R,{text:u,render:t.jsx("div",{}),className:d.indicatorDelay,"data-active":o})]}),t.jsx(te,{time:i?s.secondaryTimer:s.current}),t.jsx("div",{className:d.status,children:i?t.jsx("span",{className:d.rolltag,children:"Roll: Countdown to start"}):t.jsx(ue,{startedAt:s.startedAt,expectedFinish:s.expectedFinish,playback:s.playback})}),e]})}function ue({startedAt:e,expectedFinish:s,playback:a}){if(a===n.Stop)return t.jsx(xe,{});const i=g(e),l=s!==null?s%dt:null,o=g(l);return t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:d.start,children:[t.jsx("span",{className:d.tag,children:"Started at"}),t.jsx("span",{className:d.time,children:i})]}),t.jsxs("span",{className:d.finish,children:[t.jsx("span",{className:d.tag,children:"Expect end"}),t.jsx("span",{className:d.time,children:o})]})]})}function xe(){const{data:e}=yt();return Object.keys(e).length>0?t.jsx(ht,{search:"settings=sharing__report",children:"Go to report management"}):null}const pe="_mainContainer_1qlxm_17",_e="_auxTimers_1qlxm_22",D={mainContainer:pe,auxTimers:_e};function be(){const e=mt();return t.jsxs("div",{className:D.mainContainer,children:[t.jsx(me,{children:t.jsx(qt,{playback:e.playback})}),t.jsx(Qt,{playback:e.playback,numEvents:e.numEvents,selectedEventIndex:e.selectedEventIndex,timerPhase:e.timerPhase}),t.jsxs("div",{className:D.auxTimers,children:[t.jsx(C,{index:1}),t.jsx(C,{index:2}),t.jsx(C,{index:3})]})]})}const we=w.memo(he);function he(){const e=window.location.pathname.includes("/timercontrol");return t.jsx(bt,{permission:"editor",children:t.jsxs("div",{className:B.playback,"data-testid":"panel-timer-control",children:[!e&&t.jsx(it,{onClick:s=>ut("timercontrol",s)}),e&&t.jsx(xt,{suppressSettings:!0,isNavigationLocked:pt()}),t.jsx("div",{className:B.content,children:t.jsx(_t,{children:t.jsx(be,{})})})]})})}export{we as default};
|
|
2
|
-
//# sourceMappingURL=TimerControlExport-i0ZDpUx7.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as o,j as t}from"./vendor-9UkPSc5K.js";import{f,i as d}from"./index-njXwwjfn.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},a=new e.Error().stack;a&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[a]="29859e0e-217f-40fd-a5bb-3eb2e5252a5d",e._sentryDebugIdIdentifier="sentry-dbid-29859e0e-217f-40fd-a5bb-3eb2e5252a5d")}catch{}})();const b=o.forwardRef((e,a)=>{const{label:s,title:n,secondary:r,className:l=""}=e,{getLocalizedString:i}=f(),c=s==="now";return t.jsxs("div",{className:d(["title-card",l]),ref:a,children:[t.jsx("span",{className:"title-card__title",children:n}),t.jsx("span",{className:d(["title-card__label",c&&"title-card__label--accent"]),children:s&&i(`common.${s}`)}),t.jsx("div",{className:"title-card__secondary",children:r})]})});b.displayName="TitleCard";export{b as T};
|
|
2
|
-
//# sourceMappingURL=TitleCard-BgOtucv6.js.map
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as n}from"./vendor-9UkPSc5K.js";import{K as t}from"./index-njXwwjfn.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},o=new e.Error().stack;o&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[o]="8aa200f6-d28e-4b17-9248-a3b00508174d",e._sentryDebugIdIdentifier="sentry-dbid-8aa200f6-d28e-4b17-9248-a3b00508174d")}catch{}})();function r(e){const{name:o,className:s}=e;return n.jsx("div",{className:s,children:n.jsx("img",{alt:"",src:`${t}/${o}`,className:"viewLogo"})})}export{r as V};
|
|
2
|
-
//# sourceMappingURL=ViewLogo--9miplQv.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._blink_gc8wt_1{animation:_blink_gc8wt_1 1s step-start infinite}@keyframes _blink_gc8wt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_gc8wt_13{transform:rotate(45deg)}._presetSection_gc8wt_17{background-color:#101010;display:flex;flex-direction:column;gap:.25rem;padding:1rem .5rem;margin-bottom:1rem;max-height:10rem;overflow-y:auto;scrollbar-gutter:stable}._preset_gc8wt_17{display:flex;align-items:center;gap:.5rem}._preset_gc8wt_17._active_gc8wt_34{color:#578af4}._presetActions_gc8wt_38{margin-left:auto}._blink_4jmjk_1{animation:_blink_4jmjk_1 1s step-start infinite}@keyframes _blink_4jmjk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_4jmjk_13{transform:rotate(45deg)}._inline_4jmjk_17{display:flex;align-items:center;gap:.5rem}._input_4jmjk_23{color:#e2e2e2;border:1px solid transparent;border-radius:3px;background-color:#262626;padding:0 1rem;font-size:1rem;height:2.5rem;outline:none}._input_4jmjk_23:hover{background-color:#2d2d2d}._input_4jmjk_23:focus{background-color:#404040;color:#f6f6f6;border:1px solid #578AF4}._blink_1b4uk_1{animation:_blink_1b4uk_1 1s step-start infinite}@keyframes _blink_1b4uk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1b4uk_13{transform:rotate(45deg)}._inline_1b4uk_17{display:inline-flex;align-items:center;flex-wrap:wrap;gap:1rem}._toggleSelect_1b4uk_24{display:flex;align-items:center;gap:.25rem;padding-inline:.5rem;height:2.5rem;background:#303030;color:#f6f6f6;line-height:1em;border-radius:3px}._toggleSelect_1b4uk_24:hover:not(:disabled):not(:active){background:#404040;color:#578af4}._toggleSelect_1b4uk_24:active:not(:disabled){background:#2d2d2d;border-color:#202020}._toggleSelect_1b4uk_24:after{content:"";margin-left:.25rem;width:.75em;height:.75em;background:var(--user-bg);border-radius:50%}._empty_1b4uk_52{color:#f6f6f6}._blink_r3z5t_1{animation:_blink_r3z5t_1 1s step-start infinite}@keyframes _blink_r3z5t_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_r3z5t_13{transform:rotate(45deg)}._section_r3z5t_17{color:#f6f6f6;font-size:1rem}._sectionHeader_r3z5t_22{display:flex;justify-content:space-between;align-items:center;height:2rem}._sectionHeader_r3z5t_22._collapsible_r3z5t_28{cursor:pointer}._label_r3z5t_32{margin-top:1rem;font-size:calc(1rem - 2px);color:#b1b1b1;display:flex;flex-direction:column;gap:.25rem}._title_r3z5t_41{font-size:calc(1rem - 2px);display:block;width:100%}._description_r3z5t_47{font-size:calc(1rem - 2px);display:block;color:#6c6c6c}._closed_r3z5t_53{transition:rotate .3s cubic-bezier(.45,1.005,0,1.005);rotate:0deg}._open_r3z5t_58{transition:rotate .3s cubic-bezier(.45,1.005,0,1.005);rotate:180deg}._hidden_r3z5t_63{display:none}._blink_1pnpt_1{animation:_blink_1pnpt_1 1s step-start infinite}@keyframes _blink_1pnpt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1pnpt_13{transform:rotate(45deg)}._drawerFooter_1pnpt_17{display:flex;justify-content:end;gap:1rem}._drawerFooter_1pnpt_17 button{padding:0 2em}._backdrop_1pnpt_26{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000000b3;transition:opacity .3s cubic-bezier(.45,1.005,0,1.005)}._backdrop_1pnpt_26[data-starting-style],._backdrop_1pnpt_26[data-ending-style]{opacity:0}._drawer_1pnpt_17{box-sizing:border-box;position:fixed;top:0;right:0;bottom:0;width:40rem;max-width:100vw;height:100vh;height:100dvh;display:flex;flex-direction:column;padding-block:1rem 1.5rem;background-color:#202020;color:#f6f6f6;border-left:1px solid #2d2d2d}._drawer_1pnpt_17[data-open]{transform:translate(0);transition:transform .3s cubic-bezier(.45,1.005,0,1.005)}._drawer_1pnpt_17[data-starting-style],._drawer_1pnpt_17[data-ending-style]{transform:translate(100%);transition:transform .5s cubic-bezier(.45,1.005,0,1.005)}@media (max-width: 500px){._drawer_1pnpt_17{width:100vw}}._header_1pnpt_67{padding-inline:1rem;display:flex;align-items:center;justify-content:space-between;height:3.5rem;font-weight:600;font-size:1.25rem}._body_1pnpt_77{flex:1;padding-inline:1rem;padding-bottom:10vh;overflow-y:auto}._footer_1pnpt_84{display:flex;padding-inline:1rem;gap:1rem;align-items:center;justify-content:flex-end}._sectionList_1pnpt_92{display:flex;flex-direction:column;gap:2rem;padding-right:.5rem}._info_1pnpt_99{margin-bottom:1rem}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{l as j,j as a,h as d,ax as k,aT as N,D as V,p as E,q as D,s as F,G as $,t as I}from"./vendor-9UkPSc5K.js";import{bf as z,i as b,B as S,T as p,A as L,bg as A,g as M,M as H,y as T,z as O,bc as R,af as v,c as U,bh as B,ai as W}from"./index-njXwwjfn.js";import{C as q,I as Z}from"./useWindowTitle-B2UzPuki.js";import{S as G}from"./Select-BLA-yQMq.js";import{d as J,S as K}from"./useProjectData-DW06zQvF.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]="febe8e87-d847-429f-9c29-c4086796e76a",e._sentryDebugIdIdentifier="sentry-dbid-febe8e87-d847-429f-9c29-c4086796e76a")}catch{}})();function Re(e,s=[],n=!0){const t=[...s];for(const[r,o]of Object.entries(e))n&&o.type==="image"||t.push({value:`custom-${r}`,label:`Custom: ${o.label}`});return t}function Ue(e,s=!0){const n=[];for(const[t,r]of Object.entries(e))s&&r.type==="image"||n.push({value:t,label:r.label,colour:r.colour||"transparent"});return n}function Be(e,s=[]){const n=e.custom.map((t,r)=>({value:`${r}-${t.title}`,label:t.title}));return[...s,...n]}function Q(e){return e.startsWith("#")?e.substring(1):e}function X(e){const s={defaultValues:{},colorFields:new Set,booleanFields:new Set,isPersistedField:new Set,persistedValues:{}};return e.forEach(n=>{n.options.forEach(t=>{t.type==="persist"?(s.isPersistedField.add(t.id),t.values&&(s.persistedValues[t.id]=t.values)):s.defaultValues[t.id]=String(t.defaultValue),t.type==="colour"?s.colorFields.add(t.id):t.type==="boolean"&&s.booleanFields.add(t.id)})}),s}function Y(e,s){const n=new URLSearchParams,t=new Set,r=X(s),o=(i,l)=>{const c=`${i}:${l}`;t.has(c)||(t.add(c),n.append(i,l))};return Object.entries(r.persistedValues).forEach(([i,l])=>{l.forEach(c=>{c&&o(i,c)})}),Object.entries(e).forEach(([i,l])=>{typeof l=="string"&&l.length&&(r.isPersistedField.has(i)&&(Array.from(t).forEach(c=>{c.startsWith(`${i}:`)&&t.delete(c)}),n.delete(i)),l.split(",").forEach(c=>{const m=r.colorFields.has(i)?Q(c):r.booleanFields.has(i)?c==="on"?"true":"false":c;(r.isPersistedField.has(i)||r.defaultValues[i]!==m)&&o(i,m)}))}),n}const ee="_presetSection_gc8wt_17",se="_preset_gc8wt_17",te="_active_gc8wt_34",ne="_presetActions_gc8wt_38",g={presetSection:ee,preset:se,active:te,presetActions:ne};function ae({target:e}){const{viewPresets:s}=z(e),[n,t]=j(),r=o=>{const i=new URLSearchParams(o.search);i.set("alias",o.alias),t(i)};return s.length===0?null:a.jsx("div",{className:g.presetSection,children:s.map(o=>{const i=n.get("alias")===o.alias;return a.jsxs("div",{className:b([g.preset,i&&g.active]),children:[a.jsx("div",{children:o.alias}),a.jsx(S,{variant:i?"ghosted":"subtle-white",onClick:()=>r(o),disabled:i,className:g.presetActions,children:i?"Applied":"Apply"})]},o.alias)})})}var y=(e=>(e.ClockOptions="Clock Options",e.TimerOptions="Timer Options",e.DataSources="Data sources",e.ElementVisibility="Element visibility",e.BehaviourOptions="View behaviour",e.StyleOverride="View style override",e.Animation="View animation",e.Schedule="Schedule options",e.Hidden="Hidden options",e))(y||{});function We(e,s,n,t,r,o){if(!r)return null;const i=o??s;if(n)return r.current===null?null:e?Math.max(r.current,0):r.current;switch(i){case p.CountDown:return r.current===null?null:e?Math.max(r.current,0):r.current;case p.CountUp:return Math.abs(r.elapsed??0);case p.Clock:return t;case p.None:return null;default:return null}}function re(e){return e===null?!1:(e==null?void 0:e.toLowerCase())==="true"||e==="1"}function qe(e){if(e)return e.startsWith("#")?e:`#${e}`}function Ze(e,s){var n;if(!(!e||typeof s!="string"||s==="none")){if(s.startsWith("custom-")){const t=s.split("custom-")[1];return(n=e.custom)==null?void 0:n[t]}return e[s]}}function Ge(e,s,n,t){if(e==null||s===p.None)return t.removeSeconds?L:A;if(s===p.Clock)return M(e);let r=e;t.removeSeconds&&r<-1e3&&s!==p.CountUp&&(r-=H);let o=T(r,{direction:s});return t.removeLeadingZero&&(o=O(o)),t.removeSeconds&&(o=oe(o,n)),o}function oe(e,s){return e=R(e),e.length<3?`${e} ${s}`:e}const ie="_inline_4jmjk_17",le={inline:ie},x=e=>e.startsWith("#")?e:`#${e}`;function ce({name:e,value:s}){const[n,t]=d.useState(()=>x(s));return d.useEffect(()=>{t(x(s))},[s]),a.jsxs("div",{className:le.inline,children:[a.jsx(J,{color:n,onChange:t,alwaysDisplayColor:!0}),a.jsx("span",{children:n}),a.jsx("input",{type:"hidden",name:e,value:n})]})}const ue="_inline_1b4uk_17",de="_toggleSelect_1b4uk_24",fe="_empty_1b4uk_52",_={inline:ue,toggleSelect:de,empty:fe};function w({paramField:e}){const[s]=j(),{id:n,type:t,defaultValue:r}=e;if(t==="persist")return!e.values||!e.values.length?null:a.jsx("input",{hidden:!0,name:n,readOnly:!0,value:e.values.join(",")});if(t==="option"){const c=s.get(n)||r;return e.values.length===0?a.jsx("span",{className:_.empty,children:"No options available"}):a.jsx(pe,{id:n,initialValue:c,options:e.values})}if(t==="multi-option"){const l=s.getAll(n);return a.jsx(me,{paramField:e,options:l.length?l:e.defaultValue??[""]})}if(t==="boolean")return a.jsx(he,{id:n,initialValue:re(s.get(n))??r});if(t==="number"){const{placeholder:l}=e,c=s.get(n)??r;return a.jsx(v,{height:"large",type:"number",step:"any",name:n,defaultValue:c,placeholder:l})}if(t==="colour")return a.jsx(ce,{name:n,value:s.get(n)??r});const o=s.get(n)??r??"",{placeholder:i}=e;return a.jsx(ge,{id:n,initialValue:o,placeholder:i})}function me({paramField:e,options:s}){const{id:n,values:t}=e,[r,o]=d.useState(s);d.useEffect(()=>{o(s)},[s]);const i=(l,c)=>{o(c?m=>[...m,l]:m=>m.filter(u=>u!==l))};return t.length===0?a.jsx("span",{className:_.empty,children:"No options available"}):a.jsxs(a.Fragment,{children:[a.jsx("input",{name:n,hidden:!0,readOnly:!0,value:r.join(",")}),a.jsx("div",{className:_.inline,children:t.map(l=>a.jsxs("label",{className:_.toggleSelect,style:{"--user-bg":l.colour},children:[a.jsx(q,{checked:r.includes(l.value),onCheckedChange:c=>i(l.value,c)}),l.label]},l.value))})]})}function he({id:e,initialValue:s}){const[n,t]=d.useState(s);return d.useEffect(()=>{t(s)},[s]),a.jsx(K,{size:"large",name:e,checked:n,onCheckedChange:t})}function pe({id:e,initialValue:s,options:n}){const[t,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),a.jsx(G,{size:"large",name:e,options:n,value:t,onValueChange:o=>r(o)})}function ge({id:e,initialValue:s,...n}){const[t,r]=d.useState(s);return d.useEffect(()=>{r(s)},[s]),a.jsx(v,{height:"large",name:e,value:t,onChange:o=>r(o.target.value),...n})}const _e="_section_r3z5t_17",be="_sectionHeader_r3z5t_22",Se="_collapsible_r3z5t_28",je="_label_r3z5t_32",xe="_title_r3z5t_41",ve="_description_r3z5t_47",ye="_closed_r3z5t_53",we="_open_r3z5t_58",Ce="_hidden_r3z5t_63",f={section:_e,sectionHeader:be,collapsible:Se,label:je,title:xe,description:ve,closed:ye,open:we,hidden:Ce};function Pe({title:e,collapsible:s,options:n}){const[t,r]=k({key:`params-${e}`,defaultValue:!1}),o=()=>{s&&r(i=>!i)};return a.jsx("section",{className:f.section,children:e===y.Hidden?a.jsx(Ne,{options:n}):a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:b([f.sectionHeader,s&&f.collapsible]),onClick:o,children:[e,s&&a.jsx(N,{className:b([t?f.closed:f.open])})]}),a.jsx(ke,{options:n,collapsed:t})]})})}function ke({options:e,collapsed:s}){return a.jsx(a.Fragment,{children:e.map(n=>a.jsxs("label",{className:b([f.label,s&&f.hidden]),children:[a.jsx("span",{className:f.title,children:n.title}),a.jsx("span",{className:f.description,children:n.description}),a.jsx(w,{paramField:n})]},n.title))})}function Ne({options:e}){return a.jsx(a.Fragment,{children:e.map((s,n)=>a.jsx(w,{paramField:s},s.title+n))})}const Ve="_backdrop_1pnpt_26",Ee="_drawer_1pnpt_17",De="_header_1pnpt_67",Fe="_body_1pnpt_77",$e="_footer_1pnpt_84",Ie="_sectionList_1pnpt_92",ze="_info_1pnpt_99",h={backdrop:Ve,drawer:Ee,header:De,body:Fe,footer:$e,sectionList:Ie,info:ze},Je=d.memo(Le);function Le({target:e,viewOptions:s}){const[n,t]=j(),{data:r}=U(),{isOpen:o,close:i}=B(),l=()=>{i()},c=()=>{t()},m=u=>{u.preventDefault();const C=Object.fromEntries(new FormData(u.currentTarget)),P=Y(C,s);t(P)};return a.jsx(V,{open:o,onOpenChange:u=>{u||l()},children:a.jsxs(E,{children:[a.jsx(D,{className:h.backdrop}),a.jsxs(F,{className:h.drawer,children:[a.jsxs("div",{className:h.header,children:[a.jsx($,{children:"Customise"}),a.jsx(W,{variant:"subtle-white",size:"large","data-testid":"close-view-params",onClick:l,children:a.jsx(I,{})})]}),a.jsxs("div",{className:h.body,children:[r.overrideStyles&&a.jsx(Z,{className:h.info,children:"This view style is being modified by a custom CSS file."}),a.jsx(ae,{target:e}),a.jsx("form",{id:"edit-params-form",onSubmit:m,className:h.sectionList,children:s.map(u=>a.jsx(Pe,{title:u.title,collapsible:u.collapsible,options:u.options},u.title))})]}),a.jsxs("div",{className:h.footer,children:[a.jsx(S,{variant:"subtle",size:"large",onClick:c,type:"reset",children:"Reset to default"}),a.jsx(S,{variant:"primary",size:"large",form:"edit-params-form",type:"submit","data-testid":"apply-view-params",children:"Apply"})]})]})]})})}export{y as O,Je as V,qe as a,Ge as b,We as c,Be as d,Ue as e,Ze as g,re as i,Re as m};
|
|
2
|
-
//# sourceMappingURL=ViewParamsEditor-BFu_0oIb.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ViewParamsEditor-BFu_0oIb.js","sources":["../../src/common/components/view-params-editor/viewParams.utils.ts","../../src/common/components/view-params-editor/ViewParamsPresets.tsx","../../src/common/components/view-params-editor/constants.ts","../../src/features/viewers/common/viewUtils.ts","../../src/common/components/view-params-editor/InlineColourPicker.tsx","../../src/common/components/view-params-editor/ParamInput.tsx","../../src/common/components/view-params-editor/ViewParamsSection.tsx","../../src/common/components/view-params-editor/ViewParamsEditor.tsx"],"sourcesContent":["import type { CustomFields, ProjectData } from 'ontime-types';\n\nimport type { SelectOption } from '../select/Select';\n\nimport type { MultiselectOption, ViewOption } from './viewParams.types';\n\n/**\n * Creates a list of custom fields for a select\n * Filters out image type custom fields\n */\nexport function makeOptionsFromCustomFields(\n customFields: CustomFields,\n additionalOptions: SelectOption[] = [],\n filterImageType = true,\n): SelectOption[] {\n const options: SelectOption[] = [...additionalOptions];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: `custom-${key}`,\n label: `Custom: ${value.label}`,\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a multiselect component from custom fields\n * Filters out image type custom fields\n */\nexport function makeCustomFieldSelectOptions(customFields: CustomFields, filterImageType = true): MultiselectOption[] {\n const options: MultiselectOption[] = [];\n\n // Add custom fields first\n for (const [key, value] of Object.entries(customFields)) {\n if (filterImageType && value.type === 'image') {\n continue;\n }\n\n options.push({\n value: key,\n label: value.label,\n colour: value.colour || 'transparent',\n });\n }\n\n return options;\n}\n\n/**\n * Creates data for a select element that displays project custom data\n */\nexport function makeProjectDataOptions(\n projectData: ProjectData,\n additionalOptions: SelectOption[] = [],\n): SelectOption[] {\n const generatedOptions = projectData.custom.map((entry, index) => {\n return {\n value: `${index}-${entry.title}`,\n label: entry.title,\n };\n });\n\n return [...additionalOptions, ...generatedOptions];\n}\n\ntype ViewParamsObj = { [key: string]: string | FormDataEntryValue };\n\n/**\n * Utility remove the # character from a hex string\n */\nfunction sanitiseColour(colour: string) {\n if (colour.startsWith('#')) {\n return colour.substring(1);\n }\n return colour;\n}\n\ntype FieldMetadata = {\n defaultValues: Record<string, string>;\n colorFields: Set<string>;\n booleanFields: Set<string>;\n isPersistedField: Set<string>;\n persistedValues: Record<string, string[]>;\n};\n\n/**\n * Utility collects metadata about fields from view options\n * - where are the default values\n * - which fields are colours\n * - which fields are persisted\n */\nfunction collectFieldMetadata(paramFields: ViewOption[]): FieldMetadata {\n const metadata: FieldMetadata = {\n defaultValues: {},\n colorFields: new Set(),\n booleanFields: new Set(),\n isPersistedField: new Set(),\n persistedValues: {},\n };\n\n paramFields.forEach((section) => {\n section.options.forEach((option) => {\n if (option.type === 'persist') {\n metadata.isPersistedField.add(option.id);\n if (option.values) {\n metadata.persistedValues[option.id] = option.values;\n }\n } else {\n metadata.defaultValues[option.id] = String(option.defaultValue);\n }\n\n if (option.type === 'colour') {\n metadata.colorFields.add(option.id);\n } else if (option.type === 'boolean') {\n metadata.booleanFields.add(option.id);\n }\n });\n });\n\n return metadata;\n}\n\n/**\n * Makes a new URLSearchParams object from the given params object\n * @param paramsObj - The object containing parameters to be converted\n * @param paramFields - The view options that define the parameters\n * @returns A new URLSearchParams object with the parameters\n */\nexport function getURLSearchParamsFromObj(paramsObj: ViewParamsObj, paramFields: ViewOption[]) {\n const newSearchParams = new URLSearchParams();\n const addedPairs = new Set<string>();\n const metadata = collectFieldMetadata(paramFields);\n\n // Utility function to safely add params without duplicates\n const addUniqueParam = (id: string, value: string) => {\n const pair = `${id}:${value}`;\n if (!addedPairs.has(pair)) {\n addedPairs.add(pair);\n newSearchParams.append(id, value);\n }\n };\n\n // First add all persisted values\n Object.entries(metadata.persistedValues).forEach(([id, values]) => {\n values.forEach((value) => {\n if (value) {\n addUniqueParam(id, value);\n }\n });\n });\n\n // Then process user-provided values\n Object.entries(paramsObj).forEach(([id, value]) => {\n if (typeof value === 'string' && value.length) {\n // For persisted fields, clear existing values before adding new ones\n if (metadata.isPersistedField.has(id)) {\n // Clear tracking of previous values for this field\n Array.from(addedPairs).forEach((pair) => {\n if (pair.startsWith(`${id}:`)) {\n addedPairs.delete(pair);\n }\n });\n newSearchParams.delete(id);\n }\n\n // Process and add new values\n value.split(',').forEach((v) => {\n // some field types need extra processing\n const processedValue = (() => {\n if (metadata.colorFields.has(id)) {\n return sanitiseColour(v);\n }\n if (metadata.booleanFields.has(id)) {\n return v === 'on' ? 'true' : 'false';\n }\n return v;\n })();\n if (metadata.isPersistedField.has(id) || metadata.defaultValues[id] !== processedValue) {\n addUniqueParam(id, processedValue);\n }\n });\n }\n });\n\n return newSearchParams;\n}\n","import { useSearchParams } from 'react-router';\nimport { OntimeView, URLPreset } from 'ontime-types';\n\nimport { useViewUrlPresets } from '../../hooks-query/useUrlPresets';\nimport { cx } from '../../utils/styleUtils';\nimport Button from '../buttons/Button';\n\nimport style from './ViewParamsPresets.module.scss';\n\n/**\n * Shows a list of presets for the current view\n */\nexport function ViewParamsPresets({ target }: { target: OntimeView }) {\n const { viewPresets } = useViewUrlPresets(target);\n const [searchParams, setSearchParams] = useSearchParams();\n\n const handleRecall = (preset: URLPreset) => {\n const newSearch = new URLSearchParams(preset.search);\n newSearch.set('alias', preset.alias);\n setSearchParams(newSearch);\n };\n\n if (viewPresets.length === 0) {\n return null;\n }\n\n return (\n <div className={style.presetSection}>\n {viewPresets.map((preset) => {\n const active = searchParams.get('alias') === preset.alias;\n return (\n <div key={preset.alias} className={cx([style.preset, active && style.active])}>\n <div>{preset.alias}</div>\n <Button\n variant={active ? 'ghosted' : 'subtle-white'}\n onClick={() => handleRecall(preset)}\n disabled={active}\n className={style.presetActions}\n >\n {active ? 'Applied' : 'Apply'}\n </Button>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * Gathers possible titles for view options\n */\nexport enum OptionTitle {\n ClockOptions = 'Clock Options',\n TimerOptions = 'Timer Options',\n DataSources = 'Data sources',\n ElementVisibility = 'Element visibility',\n BehaviourOptions = 'View behaviour',\n StyleOverride = 'View style override',\n Animation = 'View animation',\n Schedule = 'Schedule options',\n\n /** rendered as hidden inputs */\n Hidden = 'Hidden options',\n}\n","import { MaybeNumber, MaybeString, OntimeEvent, TimerState, TimerType } from 'ontime-types';\nimport { MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString, removeLeadingZero, removeSeconds } from 'ontime-utils';\n\nimport { timerPlaceholder, timerPlaceholderMin } from '../../../common/utils/styleUtils';\nimport { formatTime } from '../../../common/utils/time';\n\n/**\n * Gathers all options that affect which timer is displayed and selects the correct data source to display\n * it also handles edge cases such as freezing on end\n */\nexport function getTimerByType(\n freezeEnd: boolean,\n timerTypeNow: TimerType,\n countToEndNow: boolean,\n clock: number,\n timerObject: Pick<TimerState, 'current' | 'elapsed'>,\n timerTypeOverride?: TimerType,\n): number | null {\n if (!timerObject) {\n return null;\n }\n\n const viewTimerType = timerTypeOverride ?? timerTypeNow;\n\n if (countToEndNow) {\n if (timerObject.current === null) {\n return null;\n }\n return freezeEnd ? Math.max(timerObject.current, 0) : timerObject.current;\n }\n\n switch (viewTimerType) {\n case TimerType.CountDown:\n if (timerObject.current === null) {\n return null;\n }\n return freezeEnd ? Math.max(timerObject.current, 0) : timerObject.current;\n case TimerType.CountUp:\n return Math.abs(timerObject.elapsed ?? 0);\n case TimerType.Clock:\n return clock;\n case TimerType.None:\n return null;\n default: {\n viewTimerType satisfies never;\n return null;\n }\n }\n}\n\n/**\n * Parses a string to semantically verify if it represents a true value\n * Used in the context of parsing search params and local storage items which can be strings or null\n */\nexport function isStringBoolean(text: string | null) {\n if (text === null) {\n return false;\n }\n return text?.toLowerCase() === 'true' || text === '1';\n}\n\n/**\n * Prepares a colour string for use in views\n * Colours in params do not have the #prefix\n */\nexport function makeColourString(hex: string | null): string | undefined {\n if (!hex) {\n return undefined;\n }\n // ensure the hex starts with a #\n return hex.startsWith('#') ? hex : `#${hex}`;\n}\n\n/**\n * Retrieves a dynamic property from an event\n * Considers custom fields\n */\nexport function getPropertyValue(event: OntimeEvent | null, property: MaybeString): string | undefined {\n if (!event || typeof property !== 'string' || property === 'none') {\n return undefined;\n }\n\n if (property.startsWith('custom-')) {\n const field = property.split('custom-')[1];\n return event.custom?.[field];\n }\n\n return event[property as keyof OntimeEvent] as string;\n}\n\ntype FormattingOptions = {\n removeSeconds: boolean;\n removeLeadingZero: boolean;\n};\n\nexport function getFormattedTimer(\n timer: MaybeNumber,\n timerType: TimerType,\n localisedMinutes: string,\n options: FormattingOptions,\n): string {\n if (timer == null || timerType === TimerType.None) {\n return options.removeSeconds ? timerPlaceholderMin : timerPlaceholder;\n }\n\n if (timerType === TimerType.Clock) {\n return formatTime(timer);\n }\n\n let timeToParse = timer;\n if (options.removeSeconds) {\n const isNegative = timeToParse < -MILLIS_PER_SECOND && timerType !== TimerType.CountUp;\n if (isNegative) {\n // in negative numbers, we need to round down\n timeToParse -= MILLIS_PER_MINUTE;\n }\n }\n\n let display = millisToString(timeToParse, { direction: timerType });\n if (options.removeLeadingZero) {\n display = removeLeadingZero(display);\n }\n\n if (options.removeSeconds) {\n display = formatDisplayWithMinutes(display, localisedMinutes);\n }\n return display;\n}\n\nfunction formatDisplayWithMinutes(display: string, localisedMinutes: string): string {\n display = removeSeconds(display);\n return display.length < 3 ? `${display} ${localisedMinutes}` : display;\n}\n","import { useEffect, useState } from 'react';\n\nimport SwatchPicker from '../input/colour-input/SwatchPicker';\n\nimport style from './InlineColourPicker.module.scss';\n\ninterface InlineColourPickerProps {\n name: string;\n value: string;\n}\n\nconst ensureHex = (value: string) => {\n if (!value.startsWith('#')) {\n return `#${value}`;\n }\n return value;\n};\n\nexport default function InlineColourPicker({ name, value }: InlineColourPickerProps) {\n const [colour, setColour] = useState(() => ensureHex(value));\n\n useEffect(() => {\n setColour(ensureHex(value));\n }, [value]);\n\n return (\n <div className={style.inline}>\n <SwatchPicker color={colour} onChange={setColour} alwaysDisplayColor />\n <span>{colour}</span>\n <input type='hidden' name={name} value={colour} />\n </div>\n );\n}\n","import { ComponentProps, useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { isStringBoolean } from '../../../features/viewers/common/viewUtils';\nimport Checkbox from '../checkbox/Checkbox';\nimport Input from '../input/input/Input';\nimport Select, { SelectOption } from '../select/Select';\nimport Switch from '../switch/Switch';\n\nimport InlineColourPicker from './InlineColourPicker';\nimport { ParamField } from './viewParams.types';\n\nimport style from './ParamInput.module.scss';\n\ninterface ParamInputProps {\n paramField: ParamField;\n}\n\nexport default function ParamInput({ paramField }: ParamInputProps) {\n const [searchParams] = useSearchParams();\n const { id, type, defaultValue } = paramField;\n\n if (type === 'persist') {\n if (!paramField.values || !paramField.values.length) {\n return null;\n }\n return <input hidden name={id} readOnly value={paramField.values.join(',')} />;\n }\n\n if (type === 'option') {\n const optionFromParams = searchParams.get(id);\n const defaultOptionValue = optionFromParams || defaultValue;\n\n if (paramField.values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return <ControlledSelect id={id} initialValue={defaultOptionValue} options={paramField.values} />;\n }\n\n if (type === 'multi-option') {\n const optionFromParams = searchParams.getAll(id);\n\n return (\n <MultiOption\n paramField={paramField}\n options={optionFromParams.length ? optionFromParams : paramField.defaultValue ?? ['']}\n />\n );\n }\n\n if (type === 'boolean') {\n return <ControlledSwitch id={id} initialValue={isStringBoolean(searchParams.get(id)) ?? defaultValue} />;\n }\n\n if (type === 'number') {\n const { placeholder } = paramField;\n const defaultNumberValue = searchParams.get(id) ?? defaultValue;\n\n return (\n <Input\n height='large'\n type='number'\n step='any'\n name={id}\n defaultValue={defaultNumberValue}\n placeholder={placeholder}\n />\n );\n }\n\n if (type === 'colour') {\n return <InlineColourPicker name={id} value={searchParams.get(id) ?? defaultValue} />;\n }\n\n const defaultStringValue = searchParams.get(id) ?? defaultValue ?? '';\n const { placeholder } = paramField;\n\n return <ControlledInput id={id} initialValue={defaultStringValue} placeholder={placeholder} />;\n}\n\ninterface EditFormMultiOptionProps {\n paramField: ParamField & { type: 'multi-option' };\n options: string[];\n}\n\nfunction MultiOption({ paramField, options }: EditFormMultiOptionProps) {\n const { id, values } = paramField;\n const [paramState, setParamState] = useState<string[]>(options);\n\n // synchronise options\n useEffect(() => {\n setParamState(options);\n }, [options]);\n\n const toggleValue = (value: string, checked: boolean) => {\n if (checked) {\n setParamState((prev) => [...prev, value]);\n } else {\n setParamState((prev) => prev.filter((v) => v !== value));\n }\n };\n\n if (values.length === 0) {\n return <span className={style.empty}>No options available</span>;\n }\n\n return (\n <>\n <input name={id} hidden readOnly value={paramState.join(',')} />\n <div className={style.inline}>\n {values.map((option) => {\n return (\n <label\n key={option.value}\n className={style.toggleSelect}\n style={{\n '--user-bg': option.colour,\n }}\n >\n <Checkbox\n checked={paramState.includes(option.value)}\n onCheckedChange={(checked) => toggleValue(option.value, checked as boolean)}\n />\n {option.label}\n </label>\n );\n })}\n </div>\n </>\n );\n}\n\ninterface ControlledSwitchProps {\n id: string;\n initialValue: boolean;\n}\nfunction ControlledSwitch({ id, initialValue }: ControlledSwitchProps) {\n const [checked, setChecked] = useState(initialValue);\n\n // synchronise checked state\n useEffect(() => {\n setChecked(initialValue);\n }, [initialValue]);\n\n return <Switch size='large' name={id} checked={checked} onCheckedChange={setChecked} />;\n}\n\ninterface ControlledSelectProps {\n id: string;\n initialValue?: string;\n options: SelectOption[];\n}\nfunction ControlledSelect({ id, initialValue, options }: ControlledSelectProps) {\n const [selected, setSelected] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setSelected(initialValue);\n }, [initialValue]);\n\n return (\n <Select size='large' name={id} options={options} value={selected} onValueChange={(value) => setSelected(value)} />\n );\n}\n\ninterface ControlledInputProps<T extends number | string> extends ComponentProps<typeof Input> {\n id: string;\n initialValue: T;\n}\nfunction ControlledInput<T extends number | string>({ id, initialValue, ...inputProps }: ControlledInputProps<T>) {\n const [value, setValue] = useState(initialValue);\n\n // synchronise selected state\n useEffect(() => {\n setValue(initialValue);\n }, [initialValue]);\n\n return (\n <Input\n height='large'\n name={id}\n value={value}\n onChange={(event) => setValue(event.target.value as T)}\n {...inputProps}\n />\n );\n}\n","import { IoChevronDown } from 'react-icons/io5';\nimport { useLocalStorage } from '@mantine/hooks';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport { OptionTitle } from './constants';\nimport ParamInput from './ParamInput';\nimport { type ParamField } from './viewParams.types';\n\nimport style from './ViewParamsSection.module.scss';\n\ninterface ViewParamsSectionProps {\n title: string;\n collapsible?: boolean;\n options: ParamField[];\n}\n\nexport default function ViewParamsSection({ title, collapsible, options }: ViewParamsSectionProps) {\n const [collapsed, setCollapsed] = useLocalStorage({ key: `params-${title}`, defaultValue: false });\n\n const handleCollapse = () => {\n if (collapsible) {\n setCollapsed((prev) => !prev);\n }\n };\n\n return (\n <section className={style.section}>\n {title === OptionTitle.Hidden ? (\n <HiddenContents options={options} />\n ) : (\n <>\n <div className={cx([style.sectionHeader, collapsible && style.collapsible])} onClick={handleCollapse}>\n {title}\n {collapsible && <IoChevronDown className={cx([collapsed ? style.closed : style.open])} />}\n </div>\n <SectionContents options={options} collapsed={collapsed} />\n </>\n )}\n </section>\n );\n}\n\ninterface SectionContentsProps {\n options: ParamField[];\n collapsed: boolean;\n}\n\nfunction SectionContents({ options, collapsed }: SectionContentsProps) {\n return (\n <>\n {options.map((option) => {\n return (\n <label key={option.title} className={cx([style.label, collapsed && style.hidden])}>\n <span className={style.title}>{option.title}</span>\n <span className={style.description}>{option.description}</span>\n <ParamInput paramField={option} />\n </label>\n );\n })}\n </>\n );\n}\n\nfunction HiddenContents({ options }: { options: ParamField[] }) {\n return (\n <>\n {options.map((option, index) => {\n return <ParamInput key={option.title + index} paramField={option} />;\n })}\n </>\n );\n}\n","import { FormEvent, memo } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { useSearchParams } from 'react-router';\nimport { Dialog } from '@base-ui-components/react/dialog';\nimport { OntimeView } from 'ontime-types';\n\nimport useViewSettings from '../../hooks-query/useViewSettings';\nimport Button from '../buttons/Button';\nimport IconButton from '../buttons/IconButton';\nimport Info from '../info/Info';\n\nimport { ViewOption } from './viewParams.types';\nimport { getURLSearchParamsFromObj } from './viewParams.utils';\nimport { useViewParamsEditorStore } from './viewParamsEditor.store';\nimport { ViewParamsPresets } from './ViewParamsPresets';\nimport ViewParamsSection from './ViewParamsSection';\n\nimport style from './ViewParamsEditor.module.scss';\n\ninterface EditFormDrawerProps {\n target: OntimeView;\n viewOptions: ViewOption[];\n}\n\nexport default memo(ViewParamsEditor);\nfunction ViewParamsEditor({ target, viewOptions }: EditFormDrawerProps) {\n const [_, setSearchParams] = useSearchParams();\n const { data: viewSettings } = useViewSettings();\n const { isOpen, close } = useViewParamsEditorStore();\n\n const handleClose = () => {\n close();\n };\n\n const resetParams = () => {\n setSearchParams();\n };\n\n const onParamsFormSubmit = (formEvent: FormEvent<HTMLFormElement>) => {\n formEvent.preventDefault();\n\n const newParamsObject = Object.fromEntries(new FormData(formEvent.currentTarget));\n const newSearchParams = getURLSearchParamsFromObj(newParamsObject, viewOptions);\n setSearchParams(newSearchParams);\n };\n\n return (\n <Dialog.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) {\n handleClose();\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Backdrop className={style.backdrop} />\n <Dialog.Popup className={style.drawer}>\n <div className={style.header}>\n <Dialog.Title>Customise</Dialog.Title>\n <IconButton variant='subtle-white' size='large' data-testid='close-view-params' onClick={handleClose}>\n <IoClose />\n </IconButton>\n </div>\n <div className={style.body}>\n {viewSettings.overrideStyles && (\n <Info className={style.info}>This view style is being modified by a custom CSS file.</Info>\n )}\n <ViewParamsPresets target={target} />\n <form id='edit-params-form' onSubmit={onParamsFormSubmit} className={style.sectionList}>\n {viewOptions.map((section) => (\n <ViewParamsSection\n key={section.title}\n title={section.title}\n collapsible={section.collapsible}\n options={section.options}\n />\n ))}\n </form>\n </div>\n <div className={style.footer}>\n <Button variant='subtle' size='large' onClick={resetParams} type='reset'>\n Reset to default\n </Button>\n <Button\n variant='primary'\n size='large'\n form='edit-params-form'\n type='submit'\n data-testid='apply-view-params'\n >\n Apply\n </Button>\n </div>\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n"],"names":["makeOptionsFromCustomFields","customFields","additionalOptions","filterImageType","options","key","value","makeCustomFieldSelectOptions","makeProjectDataOptions","projectData","generatedOptions","entry","index","sanitiseColour","colour","collectFieldMetadata","paramFields","metadata","section","option","getURLSearchParamsFromObj","paramsObj","newSearchParams","addedPairs","addUniqueParam","id","pair","values","v","processedValue","ViewParamsPresets","target","viewPresets","useViewUrlPresets","searchParams","setSearchParams","useSearchParams","handleRecall","preset","newSearch","jsx","style","active","jsxs","cx","Button","OptionTitle","getTimerByType","freezeEnd","timerTypeNow","countToEndNow","clock","timerObject","timerTypeOverride","viewTimerType","TimerType","isStringBoolean","text","makeColourString","hex","getPropertyValue","event","property","field","_a","getFormattedTimer","timer","timerType","localisedMinutes","timerPlaceholderMin","timerPlaceholder","formatTime","timeToParse","MILLIS_PER_MINUTE","display","millisToString","removeLeadingZero","formatDisplayWithMinutes","removeSeconds","ensureHex","InlineColourPicker","name","setColour","useState","useEffect","SwatchPicker","ParamInput","paramField","type","defaultValue","defaultOptionValue","ControlledSelect","optionFromParams","MultiOption","ControlledSwitch","placeholder","defaultNumberValue","Input","defaultStringValue","ControlledInput","paramState","setParamState","toggleValue","checked","prev","Fragment","Checkbox","initialValue","setChecked","Switch","selected","setSelected","Select","inputProps","setValue","ViewParamsSection","title","collapsible","collapsed","setCollapsed","useLocalStorage","handleCollapse","HiddenContents","IoChevronDown","SectionContents","memo","ViewParamsEditor","viewOptions","_","viewSettings","useViewSettings","isOpen","close","useViewParamsEditorStore","handleClose","resetParams","onParamsFormSubmit","formEvent","newParamsObject","Dialog.Root","open","Dialog.Portal","Dialog.Backdrop","Dialog.Popup","Dialog.Title","IconButton","IoClose","Info"],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|