@getontime/cli 4.0.2 → 4.1.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-CAjkmeJm.js → Backstage-BhtXVpms.js} +2 -2
- package/client/assets/Backstage-BhtXVpms.js.br +0 -0
- package/client/assets/Backstage-BhtXVpms.js.gz +0 -0
- package/client/assets/{Backstage-CAjkmeJm.js.map → Backstage-BhtXVpms.js.map} +1 -1
- package/client/assets/{Countdown-ChuA9az_.js → Countdown-NmGi1KMx.js} +2 -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 +1 -0
- package/client/assets/{CustomTranslationModal-C3R_2T5s.js → CustomTranslationModal-BBNxpds0.js} +2 -2
- package/client/assets/CustomTranslationModal-BBNxpds0.js.br +0 -0
- package/client/assets/CustomTranslationModal-BBNxpds0.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-C3R_2T5s.js.map → CustomTranslationModal-BBNxpds0.js.map} +1 -1
- package/client/assets/{DelayIndicator-vT7n8ypf.js → DelayIndicator-CFCDQ7FN.js} +2 -2
- package/client/assets/DelayIndicator-CFCDQ7FN.js.br +0 -0
- package/client/assets/DelayIndicator-CFCDQ7FN.js.gz +0 -0
- package/client/assets/{DelayIndicator-vT7n8ypf.js.map → DelayIndicator-CFCDQ7FN.js.map} +1 -1
- package/client/assets/{EditorFeatureWrapper-DHfuO3EA.js → EditorFeatureWrapper-D55c8JBz.js} +2 -2
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-DHfuO3EA.js.map → EditorFeatureWrapper-D55c8JBz.js.map} +1 -1
- package/client/assets/{EditorUtils-Da5ALK1P.js → EditorUtils-CFE106qQ.js} +2 -2
- package/client/assets/EditorUtils-CFE106qQ.js.br +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js.gz +0 -0
- package/client/assets/{EditorUtils-Da5ALK1P.js.map → EditorUtils-CFE106qQ.js.map} +1 -1
- package/client/assets/{Empty-gWT_HMeu.js → Empty-C-JO_XAr.js} +2 -2
- package/client/assets/Empty-C-JO_XAr.js.br +2 -0
- package/client/assets/Empty-C-JO_XAr.js.gz +0 -0
- package/client/assets/{Empty-gWT_HMeu.js.map → Empty-C-JO_XAr.js.map} +1 -1
- package/client/assets/{EmptyPage-Dcbg6rmF.js → EmptyPage-BSzsxpGg.js} +2 -2
- package/client/assets/EmptyPage-BSzsxpGg.js.br +1 -0
- package/client/assets/EmptyPage-BSzsxpGg.js.gz +0 -0
- package/client/assets/{EmptyPage-Dcbg6rmF.js.map → EmptyPage-BSzsxpGg.js.map} +1 -1
- package/client/assets/{FollowButton-CSqJSvix.js → FollowButton-Mox6N4JW.js} +2 -2
- package/client/assets/FollowButton-Mox6N4JW.js.br +0 -0
- package/client/assets/FollowButton-Mox6N4JW.js.gz +0 -0
- package/client/assets/{FollowButton-CSqJSvix.js.map → FollowButton-Mox6N4JW.js.map} +1 -1
- package/client/assets/MessageControlExport-BL2ip9qN.js +2 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js.br +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js.gz +0 -0
- package/client/assets/{MessageControlExport-lXK21piH.js.map → MessageControlExport-BL2ip9qN.js.map} +1 -1
- package/client/assets/{MilestoneEditor-Bge8xLrV.js → MilestoneEditor-DcWPGKNK.js} +2 -2
- package/client/assets/MilestoneEditor-DcWPGKNK.js.br +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js.gz +0 -0
- package/client/assets/{MilestoneEditor-Bge8xLrV.js.map → MilestoneEditor-DcWPGKNK.js.map} +1 -1
- package/client/assets/Modal-D3tAPV2u.css +1 -0
- package/client/assets/Modal-D3tAPV2u.css.br +0 -0
- package/client/assets/Modal-D3tAPV2u.css.gz +0 -0
- package/client/assets/Modal-krcwDRb-.js +2 -0
- package/client/assets/Modal-krcwDRb-.js.br +0 -0
- package/client/assets/Modal-krcwDRb-.js.gz +0 -0
- package/client/assets/Modal-krcwDRb-.js.map +1 -0
- package/client/assets/{MultiPartProgressBar-D3jJZjb5.js → MultiPartProgressBar-BXQbpM-j.js} +2 -2
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-D3jJZjb5.js.map → MultiPartProgressBar-BXQbpM-j.js.map} +1 -1
- package/client/assets/{OperatorExport-BUhxjLUx.js → OperatorExport-C50KHBrD.js} +2 -2
- package/client/assets/OperatorExport-C50KHBrD.js.br +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js.gz +0 -0
- package/client/assets/{OperatorExport-BUhxjLUx.js.map → OperatorExport-C50KHBrD.js.map} +1 -1
- package/client/assets/OverviewWrapper-MGJ1uE5W.js +2 -0
- package/client/assets/OverviewWrapper-MGJ1uE5W.js.br +0 -0
- package/client/assets/OverviewWrapper-MGJ1uE5W.js.gz +0 -0
- package/client/assets/OverviewWrapper-MGJ1uE5W.js.map +1 -0
- package/client/assets/{ProjectInfo-z4k3cipS.js → ProjectInfo-CJ-GLvVG.js} +2 -2
- package/client/assets/ProjectInfo-CJ-GLvVG.js.br +0 -0
- package/client/assets/ProjectInfo-CJ-GLvVG.js.gz +0 -0
- package/client/assets/{ProjectInfo-z4k3cipS.js.map → ProjectInfo-CJ-GLvVG.js.map} +1 -1
- package/client/assets/{ProtectRoute-CrcWfOlG.js → ProtectRoute-DJ9xZnPI.js} +2 -2
- package/client/assets/ProtectRoute-DJ9xZnPI.js.br +0 -0
- package/client/assets/ProtectRoute-DJ9xZnPI.js.gz +0 -0
- package/client/assets/{ProtectRoute-CrcWfOlG.js.map → ProtectRoute-DJ9xZnPI.js.map} +1 -1
- package/client/assets/{ProtectedCuesheet-Deo4Aw6f.js → ProtectedCuesheet-B8tg6Mmo.js} +2 -2
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.br +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.gz +0 -0
- package/client/assets/{ProtectedCuesheet-Deo4Aw6f.js.map → ProtectedCuesheet-B8tg6Mmo.js.map} +1 -1
- package/client/assets/ProtectedEditor-Bl4wV72N.js +3 -0
- 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 +1 -0
- package/client/assets/{RundownEntry-D61IqkXb.js → RundownEntry-D9tXNXPy.js} +2 -2
- package/client/assets/RundownEntry-D9tXNXPy.js.br +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.js.gz +0 -0
- package/client/assets/{RundownEntry-D61IqkXb.js.map → RundownEntry-D9tXNXPy.js.map} +1 -1
- package/client/assets/RundownExport-D6uAmFbb.js +3 -0
- 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 +1 -0
- package/client/assets/{Select-CedN80WS.js → Select-BLA-yQMq.js} +2 -2
- package/client/assets/Select-BLA-yQMq.js.br +0 -0
- package/client/assets/Select-BLA-yQMq.js.gz +0 -0
- package/client/assets/{Select-CedN80WS.js.map → Select-BLA-yQMq.js.map} +1 -1
- package/client/assets/{Studio-DUzPBS6P.js → Studio-DbP92DTf.js} +2 -2
- package/client/assets/Studio-DbP92DTf.js.br +0 -0
- package/client/assets/Studio-DbP92DTf.js.gz +0 -0
- package/client/assets/{Studio-DUzPBS6P.js.map → Studio-DbP92DTf.js.map} +1 -1
- package/client/assets/{StyleEditor-D2z65PB7.js → StyleEditor-DNjZ46Qf.js} +2 -2
- package/client/assets/StyleEditor-DNjZ46Qf.js.br +0 -0
- package/client/assets/StyleEditor-DNjZ46Qf.js.gz +0 -0
- package/client/assets/{StyleEditor-D2z65PB7.js.map → StyleEditor-DNjZ46Qf.js.map} +1 -1
- package/client/assets/{SuperscriptTime-CIrcMcyg.js → SuperscriptTime-C8ypTVpH.js} +2 -2
- package/client/assets/SuperscriptTime-C8ypTVpH.js.br +0 -0
- package/client/assets/SuperscriptTime-C8ypTVpH.js.gz +0 -0
- package/client/assets/{SuperscriptTime-CIrcMcyg.js.map → SuperscriptTime-C8ypTVpH.js.map} +1 -1
- package/client/assets/{TimeElements-CALNfv6u.js → TimeElements-DlEBhXe0.js} +2 -2
- package/client/assets/TimeElements-DlEBhXe0.js.br +0 -0
- package/client/assets/TimeElements-DlEBhXe0.js.gz +0 -0
- package/client/assets/{TimeElements-CALNfv6u.js.map → TimeElements-DlEBhXe0.js.map} +1 -1
- package/client/assets/{TimeInput-Dg1naiy3.js → TimeInput-DU09ewqh.js} +2 -2
- package/client/assets/TimeInput-DU09ewqh.js.br +0 -0
- package/client/assets/TimeInput-DU09ewqh.js.gz +0 -0
- package/client/assets/{TimeInput-Dg1naiy3.js.map → TimeInput-DU09ewqh.js.map} +1 -1
- package/client/assets/{TimelinePage-Cwm0svjN.js → TimelinePage-DTwqRihn.js} +2 -2
- package/client/assets/TimelinePage-DTwqRihn.js.br +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js.gz +0 -0
- package/client/assets/{TimelinePage-Cwm0svjN.js.map → TimelinePage-DTwqRihn.js.map} +1 -1
- package/client/assets/{Timer-BvEmZbmF.css → Timer-B7nk3TMf.css} +1 -1
- package/client/assets/Timer-B7nk3TMf.css.br +0 -0
- package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
- package/client/assets/{Timer-BVXskRjc.js → Timer-jjWAunJc.js} +2 -2
- package/client/assets/Timer-jjWAunJc.js.br +0 -0
- package/client/assets/Timer-jjWAunJc.js.gz +0 -0
- package/client/assets/{Timer-BVXskRjc.js.map → Timer-jjWAunJc.js.map} +1 -1
- package/client/assets/TimerControlExport-i0ZDpUx7.js +2 -0
- package/client/assets/TimerControlExport-i0ZDpUx7.js.br +0 -0
- package/client/assets/TimerControlExport-i0ZDpUx7.js.gz +0 -0
- package/client/assets/{TimerControlExport-C8ECtLBd.js.map → TimerControlExport-i0ZDpUx7.js.map} +1 -1
- package/client/assets/{TitleCard-CZl9wSHS.js → TitleCard-BgOtucv6.js} +2 -2
- package/client/assets/TitleCard-BgOtucv6.js.br +0 -0
- package/client/assets/TitleCard-BgOtucv6.js.gz +0 -0
- package/client/assets/{TitleCard-CZl9wSHS.js.map → TitleCard-BgOtucv6.js.map} +1 -1
- package/client/assets/{Tooltip-D9XRnwOW.js → Tooltip-C0rGHLsB.js} +2 -2
- package/client/assets/Tooltip-C0rGHLsB.js.br +0 -0
- package/client/assets/Tooltip-C0rGHLsB.js.gz +0 -0
- package/client/assets/{Tooltip-D9XRnwOW.js.map → Tooltip-C0rGHLsB.js.map} +1 -1
- package/client/assets/{ViewLogo-_3Z1hIHi.js → ViewLogo--9miplQv.js} +2 -2
- package/client/assets/ViewLogo--9miplQv.js.br +0 -0
- package/client/assets/ViewLogo--9miplQv.js.gz +0 -0
- package/client/assets/{ViewLogo-_3Z1hIHi.js.map → ViewLogo--9miplQv.js.map} +1 -1
- package/client/assets/{ViewParamsEditor-Bca1TIDW.js → ViewParamsEditor-BFu_0oIb.js} +2 -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-Bca1TIDW.js.map → ViewParamsEditor-BFu_0oIb.js.map} +1 -1
- package/client/assets/{dateConfig-DRQGMWDF.js → dateConfig-WYqMzV9D.js} +2 -2
- package/client/assets/dateConfig-WYqMzV9D.js.br +0 -0
- package/client/assets/dateConfig-WYqMzV9D.js.gz +0 -0
- package/client/assets/{dateConfig-DRQGMWDF.js.map → dateConfig-WYqMzV9D.js.map} +1 -1
- package/client/assets/{editorSettings-BU0pTMSY.js → editorSettings-CCHx-wCx.js} +2 -2
- package/client/assets/editorSettings-CCHx-wCx.js.br +0 -0
- package/client/assets/editorSettings-CCHx-wCx.js.gz +0 -0
- package/client/assets/{editorSettings-BU0pTMSY.js.map → editorSettings-CCHx-wCx.js.map} +1 -1
- package/client/assets/{getProgress-Cw79NL_O.js → getProgress-B94Ieskb.js} +2 -2
- package/client/assets/getProgress-B94Ieskb.js.br +0 -0
- package/client/assets/getProgress-B94Ieskb.js.gz +0 -0
- package/client/assets/{getProgress-Cw79NL_O.js.map → getProgress-B94Ieskb.js.map} +1 -1
- package/client/assets/{index-BQEUaoAf.js → index-njXwwjfn.js} +3 -3
- package/client/assets/index-njXwwjfn.js.br +0 -0
- package/client/assets/index-njXwwjfn.js.gz +0 -0
- package/client/assets/{index-BQEUaoAf.js.map → index-njXwwjfn.js.map} +1 -1
- package/client/assets/{offset-DJAHqjFW.js → offset-D1q-72D-.js} +2 -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-DJAHqjFW.js.map → offset-D1q-72D-.js.map} +1 -1
- package/client/assets/{parseUserTime-BeTKj08M.js → parseUserTime-Bc1pSJR2.js} +2 -2
- package/client/assets/parseUserTime-Bc1pSJR2.js.br +0 -0
- package/client/assets/parseUserTime-Bc1pSJR2.js.gz +0 -0
- package/client/assets/{parseUserTime-BeTKj08M.js.map → parseUserTime-Bc1pSJR2.js.map} +1 -1
- package/client/assets/{playbackstate-B_khF6xU.js → playbackstate-BpzbtG9F.js} +2 -2
- package/client/assets/playbackstate-BpzbtG9F.js.br +0 -0
- package/client/assets/playbackstate-BpzbtG9F.js.gz +0 -0
- package/client/assets/{playbackstate-B_khF6xU.js.map → playbackstate-BpzbtG9F.js.map} +1 -1
- package/client/assets/{presentation.utils-KwY-ACf7.js → presentation.utils-B2baBe3j.js} +2 -2
- package/client/assets/presentation.utils-B2baBe3j.js.br +0 -0
- package/client/assets/presentation.utils-B2baBe3j.js.gz +0 -0
- package/client/assets/{presentation.utils-KwY-ACf7.js.map → presentation.utils-B2baBe3j.js.map} +1 -1
- package/client/assets/{rundownUtils-BZHazkXR.js → rundownUtils-H6xvQyre.js} +2 -2
- package/client/assets/rundownUtils-H6xvQyre.js.br +0 -0
- package/client/assets/rundownUtils-H6xvQyre.js.gz +0 -0
- package/client/assets/{rundownUtils-BZHazkXR.js.map → rundownUtils-H6xvQyre.js.map} +1 -1
- package/client/assets/{useCustomFields-DqCYz8Kt.js → useCustomFields-Da0Li7nQ.js} +2 -2
- package/client/assets/useCustomFields-Da0Li7nQ.js.br +0 -0
- package/client/assets/useCustomFields-Da0Li7nQ.js.gz +0 -0
- package/client/assets/{useCustomFields-DqCYz8Kt.js.map → useCustomFields-Da0Li7nQ.js.map} +1 -1
- package/client/assets/{useFollowComponent-Ctfhf2or.js → useFollowComponent-Qo3FobyV.js} +2 -2
- package/client/assets/useFollowComponent-Qo3FobyV.js.br +0 -0
- package/client/assets/useFollowComponent-Qo3FobyV.js.gz +0 -0
- package/client/assets/{useFollowComponent-Ctfhf2or.js.map → useFollowComponent-Qo3FobyV.js.map} +1 -1
- package/client/assets/{useProjectData-C1hVamxc.js → useProjectData-DW06zQvF.js} +2 -2
- package/client/assets/useProjectData-DW06zQvF.js.br +0 -0
- package/client/assets/useProjectData-DW06zQvF.js.gz +0 -0
- package/client/assets/{useProjectData-C1hVamxc.js.map → useProjectData-DW06zQvF.js.map} +1 -1
- package/client/assets/{useReport-B4dMYcNL.js → useReport-DhFY2L8v.js} +2 -2
- package/client/assets/useReport-DhFY2L8v.js.br +0 -0
- package/client/assets/useReport-DhFY2L8v.js.gz +0 -0
- package/client/assets/{useReport-B4dMYcNL.js.map → useReport-DhFY2L8v.js.map} +1 -1
- package/client/assets/useRundown-ihoU8qBi.js +2 -0
- package/client/assets/useRundown-ihoU8qBi.js.br +0 -0
- package/client/assets/useRundown-ihoU8qBi.js.gz +0 -0
- package/client/assets/useRundown-ihoU8qBi.js.map +1 -0
- package/client/assets/{useWindowTitle-DqdFTWns.js → useWindowTitle-B2UzPuki.js} +2 -2
- package/client/assets/useWindowTitle-B2UzPuki.js.br +0 -0
- package/client/assets/useWindowTitle-B2UzPuki.js.gz +0 -0
- package/client/assets/{useWindowTitle-DqdFTWns.js.map → useWindowTitle-B2UzPuki.js.map} +1 -1
- package/client/assets/{validateEvent-P9sf7C10.js → validateEvent-BJMwP_mq.js} +2 -2
- package/client/assets/validateEvent-BJMwP_mq.js.br +0 -0
- package/client/assets/validateEvent-BJMwP_mq.js.gz +0 -0
- package/client/assets/{validateEvent-P9sf7C10.js.map → validateEvent-BJMwP_mq.js.map} +1 -1
- package/client/assets/{vendor-CCiSQ9k9.js → vendor-9UkPSc5K.js} +3 -3
- package/client/assets/vendor-9UkPSc5K.js.br +0 -0
- package/client/assets/vendor-9UkPSc5K.js.gz +0 -0
- package/client/assets/{vendor-CCiSQ9k9.js.map → vendor-9UkPSc5K.js.map} +1 -1
- package/client/assets/{viewLoader.utils-CmM-4-pk.js → viewLoader.utils-DQGhrjSp.js} +2 -2
- package/client/assets/viewLoader.utils-DQGhrjSp.js.br +0 -0
- package/client/assets/viewLoader.utils-DQGhrjSp.js.gz +0 -0
- package/client/assets/{viewLoader.utils-CmM-4-pk.js.map → viewLoader.utils-DQGhrjSp.js.map} +1 -1
- package/client/index.html +2 -2
- package/package.json +1 -1
- package/server/index.cjs +82 -82
- package/client/assets/Backstage-CAjkmeJm.js.br +0 -0
- package/client/assets/Backstage-CAjkmeJm.js.gz +0 -0
- package/client/assets/Countdown-ChuA9az_.js.br +0 -0
- package/client/assets/Countdown-ChuA9az_.js.gz +0 -0
- package/client/assets/Countdown-ChuA9az_.js.map +0 -1
- package/client/assets/CustomTranslationModal-C3R_2T5s.js.br +0 -0
- package/client/assets/CustomTranslationModal-C3R_2T5s.js.gz +0 -0
- package/client/assets/DelayIndicator-vT7n8ypf.js.br +0 -0
- package/client/assets/DelayIndicator-vT7n8ypf.js.gz +0 -0
- package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.gz +0 -0
- package/client/assets/EditorUtils-Da5ALK1P.js.br +0 -0
- package/client/assets/EditorUtils-Da5ALK1P.js.gz +0 -0
- package/client/assets/Empty-gWT_HMeu.js.br +0 -0
- package/client/assets/Empty-gWT_HMeu.js.gz +0 -0
- package/client/assets/EmptyPage-Dcbg6rmF.js.br +0 -0
- package/client/assets/EmptyPage-Dcbg6rmF.js.gz +0 -0
- package/client/assets/FollowButton-CSqJSvix.js.br +0 -0
- package/client/assets/FollowButton-CSqJSvix.js.gz +0 -0
- package/client/assets/MessageControlExport-lXK21piH.js +0 -2
- package/client/assets/MessageControlExport-lXK21piH.js.br +0 -0
- package/client/assets/MessageControlExport-lXK21piH.js.gz +0 -0
- package/client/assets/MilestoneEditor-Bge8xLrV.js.br +0 -0
- package/client/assets/MilestoneEditor-Bge8xLrV.js.gz +0 -0
- package/client/assets/Modal-BgJx3SNK.css +0 -1
- package/client/assets/Modal-BgJx3SNK.css.br +0 -0
- package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
- package/client/assets/Modal-C2sFA0zf.js +0 -2
- package/client/assets/Modal-C2sFA0zf.js.br +0 -0
- package/client/assets/Modal-C2sFA0zf.js.gz +0 -0
- package/client/assets/Modal-C2sFA0zf.js.map +0 -1
- package/client/assets/MultiPartProgressBar-D3jJZjb5.js.br +0 -0
- package/client/assets/MultiPartProgressBar-D3jJZjb5.js.gz +0 -0
- package/client/assets/OperatorExport-BUhxjLUx.js.br +0 -0
- package/client/assets/OperatorExport-BUhxjLUx.js.gz +0 -0
- package/client/assets/OverviewWrapper-BveJ6GjK.js +0 -2
- package/client/assets/OverviewWrapper-BveJ6GjK.js.br +0 -0
- package/client/assets/OverviewWrapper-BveJ6GjK.js.gz +0 -0
- package/client/assets/OverviewWrapper-BveJ6GjK.js.map +0 -1
- package/client/assets/ProjectInfo-z4k3cipS.js.br +0 -0
- package/client/assets/ProjectInfo-z4k3cipS.js.gz +0 -0
- package/client/assets/ProtectRoute-CrcWfOlG.js.br +0 -0
- package/client/assets/ProtectRoute-CrcWfOlG.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.br +0 -0
- package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.gz +0 -0
- package/client/assets/ProtectedEditor-C_SYWpL2.js +0 -3
- package/client/assets/ProtectedEditor-C_SYWpL2.js.br +0 -0
- package/client/assets/ProtectedEditor-C_SYWpL2.js.gz +0 -0
- package/client/assets/ProtectedEditor-C_SYWpL2.js.map +0 -1
- package/client/assets/RundownEntry-D61IqkXb.js.br +0 -0
- package/client/assets/RundownEntry-D61IqkXb.js.gz +0 -0
- package/client/assets/RundownExport-C6YhMGOC.js +0 -3
- package/client/assets/RundownExport-C6YhMGOC.js.br +0 -0
- package/client/assets/RundownExport-C6YhMGOC.js.gz +0 -0
- package/client/assets/RundownExport-C6YhMGOC.js.map +0 -1
- package/client/assets/Select-CedN80WS.js.br +0 -0
- package/client/assets/Select-CedN80WS.js.gz +0 -0
- package/client/assets/Studio-DUzPBS6P.js.br +0 -0
- package/client/assets/Studio-DUzPBS6P.js.gz +0 -0
- package/client/assets/StyleEditor-D2z65PB7.js.br +0 -0
- package/client/assets/StyleEditor-D2z65PB7.js.gz +0 -0
- package/client/assets/SuperscriptTime-CIrcMcyg.js.br +0 -0
- package/client/assets/SuperscriptTime-CIrcMcyg.js.gz +0 -0
- package/client/assets/TimeElements-CALNfv6u.js.br +0 -0
- package/client/assets/TimeElements-CALNfv6u.js.gz +0 -0
- package/client/assets/TimeInput-Dg1naiy3.js.br +0 -0
- package/client/assets/TimeInput-Dg1naiy3.js.gz +0 -0
- package/client/assets/TimelinePage-Cwm0svjN.js.br +0 -0
- package/client/assets/TimelinePage-Cwm0svjN.js.gz +0 -0
- package/client/assets/Timer-BVXskRjc.js.br +0 -0
- package/client/assets/Timer-BVXskRjc.js.gz +0 -0
- package/client/assets/Timer-BvEmZbmF.css.br +0 -0
- package/client/assets/Timer-BvEmZbmF.css.gz +0 -0
- package/client/assets/TimerControlExport-C8ECtLBd.js +0 -2
- package/client/assets/TimerControlExport-C8ECtLBd.js.br +0 -0
- package/client/assets/TimerControlExport-C8ECtLBd.js.gz +0 -0
- package/client/assets/TitleCard-CZl9wSHS.js.br +0 -0
- package/client/assets/TitleCard-CZl9wSHS.js.gz +0 -0
- package/client/assets/Tooltip-D9XRnwOW.js.br +0 -4
- package/client/assets/Tooltip-D9XRnwOW.js.gz +0 -0
- package/client/assets/ViewLogo-_3Z1hIHi.js.br +0 -0
- package/client/assets/ViewLogo-_3Z1hIHi.js.gz +0 -0
- package/client/assets/ViewParamsEditor-Bca1TIDW.js.br +0 -0
- package/client/assets/ViewParamsEditor-Bca1TIDW.js.gz +0 -0
- package/client/assets/dateConfig-DRQGMWDF.js.br +0 -0
- package/client/assets/dateConfig-DRQGMWDF.js.gz +0 -0
- package/client/assets/editorSettings-BU0pTMSY.js.br +0 -0
- package/client/assets/editorSettings-BU0pTMSY.js.gz +0 -0
- package/client/assets/getProgress-Cw79NL_O.js.br +0 -0
- package/client/assets/getProgress-Cw79NL_O.js.gz +0 -0
- package/client/assets/index-BQEUaoAf.js.br +0 -0
- package/client/assets/index-BQEUaoAf.js.gz +0 -0
- package/client/assets/offset-DJAHqjFW.js.br +0 -0
- package/client/assets/offset-DJAHqjFW.js.gz +0 -0
- package/client/assets/parseUserTime-BeTKj08M.js.br +0 -0
- package/client/assets/parseUserTime-BeTKj08M.js.gz +0 -0
- package/client/assets/playbackstate-B_khF6xU.js.br +0 -0
- package/client/assets/playbackstate-B_khF6xU.js.gz +0 -0
- package/client/assets/presentation.utils-KwY-ACf7.js.br +0 -0
- package/client/assets/presentation.utils-KwY-ACf7.js.gz +0 -0
- package/client/assets/rundownUtils-BZHazkXR.js.br +0 -0
- package/client/assets/rundownUtils-BZHazkXR.js.gz +0 -0
- package/client/assets/useCustomFields-DqCYz8Kt.js.br +0 -0
- package/client/assets/useCustomFields-DqCYz8Kt.js.gz +0 -0
- package/client/assets/useFollowComponent-Ctfhf2or.js.br +0 -0
- package/client/assets/useFollowComponent-Ctfhf2or.js.gz +0 -0
- package/client/assets/useProjectData-C1hVamxc.js.br +0 -0
- package/client/assets/useProjectData-C1hVamxc.js.gz +0 -0
- package/client/assets/useReport-B4dMYcNL.js.br +0 -0
- package/client/assets/useReport-B4dMYcNL.js.gz +0 -0
- package/client/assets/useRundown-BfpjcCEJ.js +0 -2
- package/client/assets/useRundown-BfpjcCEJ.js.br +0 -0
- package/client/assets/useRundown-BfpjcCEJ.js.gz +0 -0
- package/client/assets/useRundown-BfpjcCEJ.js.map +0 -1
- package/client/assets/useWindowTitle-DqdFTWns.js.br +0 -0
- package/client/assets/useWindowTitle-DqdFTWns.js.gz +0 -0
- package/client/assets/validateEvent-P9sf7C10.js.br +0 -3
- package/client/assets/validateEvent-P9sf7C10.js.gz +0 -0
- package/client/assets/vendor-CCiSQ9k9.js.br +0 -0
- package/client/assets/vendor-CCiSQ9k9.js.gz +0 -0
- package/client/assets/viewLoader.utils-CmM-4-pk.js.br +0 -0
- package/client/assets/viewLoader.utils-CmM-4-pk.js.gz +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./RundownEntry-D61IqkXb.js","./vendor-CCiSQ9k9.js","./vendor-4xP-6xVS.css","./index-BQEUaoAf.js","./index-De0uf0Ta.css","./useRundown-BfpjcCEJ.js","./useProjectData-C1hVamxc.js","./useProjectData-Cw1aXCwD.css","./dateConfig-DRQGMWDF.js","./validateEvent-P9sf7C10.js","./editorSettings-BU0pTMSY.js","./editorSettings-BqHbWs9b.css","./parseUserTime-BeTKj08M.js","./rundownUtils-BZHazkXR.js","./Tooltip-D9XRnwOW.js","./Tooltip-CKb7gU2M.css","./MilestoneEditor-Bge8xLrV.js","./EditorUtils-Da5ALK1P.js","./EditorUtils-BXko-IuN.css","./TimeInput-Dg1naiy3.js","./TimeInput-BrVdiuOQ.css","./useCustomFields-DqCYz8Kt.js","./Select-CedN80WS.js","./Select-Cd08aEcf.css","./Modal-C2sFA0zf.js","./Modal-BgJx3SNK.css","./offset-DJAHqjFW.js","./MilestoneEditor-906SVj5M.css","./useReport-B4dMYcNL.js","./playbackstate-B_khF6xU.js","./getProgress-Cw79NL_O.js","./ProtectRoute-CrcWfOlG.js","./ProtectRoute-Bm5sjStK.css","./Empty-gWT_HMeu.js","./Empty-DvR62o5B.css","./useFollowComponent-Ctfhf2or.js","./RundownEntry-3gFEEUnw.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{f as we,h as f,j as e,aN as te,be as xt,C as He,M as Ye,aM as P,ah as Xe,aO as be,aP as pe,aQ as Y,T as L,aK as ht,bf as pt,aE as Je,aF as Ze,bg as ft,b2 as mt,aT as jt,ax as yt,ay as gt,az as _t,bh as vt,aH as Et,bi as wt,aD as bt,aC as Ct,$ as kt}from"./vendor-CCiSQ9k9.js";import{T as Nt,S as Ce,C as St}from"./EditorUtils-Da5ALK1P.js";import{bq as De,ax as Ie,an as Ae,af as et,b0 as B,b4 as ce,B as Q,aF as Mt,br as tt,bn as fe,bs as nt,i as X,ai as st,aA as Dt,l as ye,g as Re,M as It,bt as At,b as Rt,bu as Gt,bv as Ge,bw as ge,av as Ot}from"./index-BQEUaoAf.js";import{P as Oe}from"./ProtectRoute-CrcWfOlG.js";import{i as ee,h as Pt,q as Bt,k as rt,j as ae,c as $t,S as j,t as Pe,r as Tt}from"./useRundown-BfpjcCEJ.js";import{s as _e,E as Ft,M as Kt,G as Vt,u as Lt}from"./MilestoneEditor-Bge8xLrV.js";import{M as qt,P as Wt,D as zt}from"./Modal-C2sFA0zf.js";import{E as ot}from"./Empty-gWT_HMeu.js";import{u as ne,c as lt,a as Be}from"./dateConfig-DRQGMWDF.js";import{u as Ut}from"./useFollowComponent-Ctfhf2or.js";import{g as Qt}from"./offset-DJAHqjFW.js";import{d as ve,e as $e,f as Te,h as Ht,i as Yt,j as Xt}from"./rundownUtils-BZHazkXR.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new t.Error().stack;r&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[r]="b62d5d6c-1a29-44da-aae4-f06d0c6adde5",t._sentryDebugIdIdentifier="sentry-dbid-b62d5d6c-1a29-44da-aae4-f06d0c6adde5")}catch{}})();function Jt(t,r,n){if(r===n)return t;const s=[...t],[i]=s.splice(r,1);return s.splice(n,0,i),s}function ke(){const t=navigator.userAgent.toLowerCase();return t.includes("macintosh")||t.includes("mac os")}const V=ke()?"Option":"Alt",Z=ke()?"Cmd":"Ctrl",ue=we()((t,r)=>({selectedEvents:new Set,anchoredIndex:null,cursor:null,entryMode:null,setSingleEntrySelection:({id:n})=>{t({selectedEvents:new Set([n]),anchoredIndex:null,cursor:n,entryMode:"single"})},setSelectedEvents:({id:n,index:s,selectMode:i})=>{const{selectedEvents:o,anchoredIndex:m,entryMode:w}=r();if(w==="single")return t({selectedEvents:new Set([n]),anchoredIndex:s,cursor:n,entryMode:"event"});if(i==="click")return t({selectedEvents:new Set([n]),anchoredIndex:s,cursor:n,entryMode:"event"});if(i==="ctrl"){const _=De.getQueryData(Ie);if(!_)return;if(!o.has(n))return t({selectedEvents:o.add(n),anchoredIndex:s,cursor:n,entryMode:"event"});o.delete(n);const R=_.order.findIndex((N,G)=>G>s&&ee(_.entries[N])&&o.has(N));return t({selectedEvents:o,anchoredIndex:R<0?_.order.length-1:R,entryMode:"event"})}if(i==="shift"){const _=De.getQueryData(Ie);if(!_)return;const R=[];_.flatOrder.forEach(g=>{const M=_.entries[g];ee(M)&&R.push(M.id)});const N=m===null?0:Math.min(m,s),G=m===null?s:Math.max(m,s+1),u=R.slice(N,G);return t({selectedEvents:new Set([...o,...u]),anchoredIndex:s,entryMode:"event"})}},clearSelectedEvents:()=>t({selectedEvents:new Set,anchoredIndex:null,cursor:null,entryMode:null}),clearMultiSelect:()=>{const{selectedEvents:n}=r(),[s]=n;t({selectedEvents:new Set(s?[s]:[]),anchoredIndex:null,entryMode:null})},unselect:n=>{const{entryMode:s,selectedEvents:i}=r();i.delete(n),t({selectedEvents:i,entryMode:i.size===0?null:s})}}));function Qs(t){return ke()&&t.metaKey||t.ctrlKey?"ctrl":t.shiftKey?"shift":"click"}const Zt="_footer_44w0f_17",en={footer:Zt},tn=f.memo(nn);function nn({id:t,cue:r}){const n=`/ontime/load/id "${t}"`,s=`/ontime/load/cue "${r}"`;return e.jsxs("div",{className:en.footer,children:[e.jsx(Ae,{copyValue:n,children:n}),e.jsx(Ae,{copyValue:s,children:s})]})}const sn="_entryEditor_103di_17",rn="_shortcutSection_103di_28",on="_shortcuts_103di_35",ln="_spacer_103di_48",dn="_prompt_103di_52",an="_divider_103di_56",cn="_kbd_103di_62",U={entryEditor:sn,shortcutSection:rn,shortcuts:on,spacer:ln,prompt:dn,divider:an,kbd:cn},un=f.memo(xn);function xn(){return e.jsx("div",{className:U.entryEditor,"data-testid":"editor-container",children:e.jsxs("div",{className:U.shortcutSection,children:[e.jsx(Nt,{className:U.prompt,children:"Rundown shortcuts"}),e.jsx("table",{className:U.shortcuts,children:e.jsxs("tbody",{children:[e.jsxs("tr",{children:[e.jsx("td",{children:"Find in rundown"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"F"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Open Settings"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:","})]})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Select entry"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Select group"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Deselect entry"}),e.jsx("td",{children:e.jsx(a,{children:"Esc"})})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Reorder selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Copy selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"C"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Paste above"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"V"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Paste below"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"V"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Delete selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Backspace"})]})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add event below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"E"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add event above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"E"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add group below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"G"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add group above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"M"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add milestone below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"G"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add milestone above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"M"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add delay below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"D"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add delay above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"D"})]})]})]})})]})})}function y({children:t}){return e.jsx("span",{className:U.divider,children:t})}function a({children:t}){return e.jsx("span",{className:U.kbd,children:t})}function hn(){const t=ue(i=>i.selectedEvents),{data:r}=Pt(),[n,s]=f.useState(null);return f.useEffect(()=>{if(r.order.length===0){s(null);return}const i=Array.from(t).at(0);if(!i){s(null);return}const o=r.entries[i];o&&!Bt(o)?s(o):s(null)},[r.order,r.entries,t]),n?ee(n)?e.jsxs("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:[e.jsx(Ft,{event:n}),e.jsx(tn,{id:n.id,cue:n.cue})]}):rt(n)?e.jsx("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:e.jsx(Kt,{milestone:n})}):ae(n)?e.jsx("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:e.jsx(Vt,{group:n})}):null:e.jsx(un,{})}const Fe=12;function pn(){const{data:t,rundownId:r}=$t(),[n,s]=f.useState([]),[i,o]=f.useState(null),m=f.useRef(""),w=ue(u=>u.setSelectedEvents),[_,R]=te({key:`rundown.${r}-editor-collapsed-groups`,defaultValue:[]}),N=f.useCallback(u=>{if(!t||t.length===0){o("No data");return}if(o(null),u.target.value===""){s([]);return}const g=u.target.value.toLowerCase();if(m.current=g,g.startsWith("index ")){const v=g.slice(6).trim(),{results:p,error:b}=se(v);s(p),o(b);return}if(g.startsWith("cue ")){const v=g.slice(4).trim(),{results:p,error:b}=T(v);s(p),o(b);return}const M=g.startsWith("title ")?g.slice(6).trim():g,{results:$,error:K}=re(M);s($),o(K);function se(v){const p=Number(v);if(isNaN(p)||p<1)return{results:[],error:"Invalid index"};if(p>t.length)return{results:[],error:null};let b=1;const S=[];for(let C=0;C<t.length;C++){const h=t[C];if(ee(h)){if(b===p){S.push({type:j.Event,id:h.id,index:C,eventIndex:b,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent});break}b++}}return{results:S,error:null}}function T(v){let p=1,b=Fe;const S=[];for(let C=0;C<t.length&&!(b<=0);C++){const h=t[C];ee(h)&&(h.cue.toLowerCase().includes(v)&&(b--,S.push({type:j.Event,id:h.id,index:C,eventIndex:p,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent})),p++)}return{results:S,error:null}}function re(v){let p=1,b=Fe;const S=[];for(let C=0;C<t.length&&!(b<=0);C++){const h=t[C];ee(h)?(h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Event,id:h.id,index:C,eventIndex:p,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent})),p++):ae(h)?h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Group,id:h.id,index:C,title:h.title,colour:h.colour})):rt(h)&&h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Milestone,id:h.id,index:C,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent}))}return{results:S,error:null}}},[t]),G=f.useCallback(u=>{if("parent"in u&&u.parent!==null){const M=[...new Set(_)].filter($=>$!==u.parent);R(M)}w({id:u.id,index:u.index,selectMode:"click"})},[_,R,w]);return f.useEffect(()=>{s([]),o(null),m.current&&N({target:{value:m.current}})},[t,N]),{find:N,select:G,results:n,error:i}}const fn="_entry_15pki_17",mn="_empty_15pki_18",jn="_error_15pki_19",yn="_data_15pki_40",gn="_index_15pki_46",_n="_title_15pki_55",vn="_cue_15pki_58",En="_footer_15pki_66",wn="_em_15pki_18",bn="_scrollContainer_15pki_76",F={entry:fn,empty:mn,error:jn,data:yn,index:gn,title:_n,cue:vn,footer:En,em:wn,scrollContainer:bn};function Cn({isOpen:t,onClose:r}){const{find:n,select:s,results:i,error:o}=pn(),[m,w]=f.useState(0),_=xt(n,100),R=u=>{i.length!==0&&(u.key==="ArrowDown"&&w(g=>(g+1)%i.length),u.key==="ArrowUp"&&w(g=>(g-1+i.length)%i.length),u.key==="Enter"&&(u.preventDefault(),u.stopPropagation(),N()))},N=()=>{const u=i[m];s(u),r()},G=u=>{const M=u.target.closest("li");if(M){const $=Number(M.dataset.index);isNaN($)||w($)}};return e.jsx(qt,{title:"",isOpen:t,onClose:r,showBackdrop:!0,bodyElements:e.jsxs("div",{onKeyDown:R,children:[e.jsx(et,{height:"large",fluid:!0,onChange:_,placeholder:"Search..."}),e.jsxs("ul",{className:F.scrollContainer,onMouseMove:G,children:[o&&e.jsx("li",{className:F.error,children:o}),i.length===0&&e.jsx("li",{className:F.empty,children:"No results"}),i.length>0&&i.map((u,g)=>{const M=m===g,$=u.type===j.Event?u.eventIndex:"-",K="cue"in u?u.cue:"";return e.jsxs("li",{className:F.entry,"data-selected":M,"data-index":g,onClick:N,children:[e.jsxs("div",{className:F.data,children:[e.jsx("div",{className:F.index,style:{"--color":u.colour},children:$}),e.jsx("div",{className:F.cue,children:K}),e.jsx("div",{className:F.title,children:u.title})]}),M&&e.jsx("span",{children:"Go ⏎"})]},u.id)})]})]}),footerElements:e.jsxs("div",{className:F.footer,children:["Use the keywords ",e.jsx("span",{className:F.em,children:"cue"}),", ",e.jsx("span",{className:F.em,children:"index"})," or",e.jsx("span",{className:F.em,children:"title"})," to filter search."]})})}const Ke=f.memo(kn);function kn(){const[t,r]=He();return Ye([["mod + f",r.toggle],["Escape",r.close]]),t?e.jsx(Cn,{isOpen:t,onClose:r.close}):null}const it=we(t=>({position:{x:0,y:0},options:[],isOpen:!1,setContextMenu:(r,n)=>t(()=>({position:r,options:n,isOpen:!0})),setIsOpen:r=>t(()=>({isOpen:r}))}));function Ve({children:t}){const{position:r,options:n,isOpen:s,setIsOpen:i}=it(),o=()=>i(!1);return s?e.jsxs(e.Fragment,{children:[t,e.jsx(Wt,{isOpen:!0,position:r,onClose:o,items:n})]}):t}const Nn="_header_156wk_17",Sn="_group_156wk_28",Mn="_radioButton_156wk_39",Dn="_apart_156wk_70",In="_separator_156wk_74",A={header:Nn,group:Sn,radioButton:Mn,apart:Dn,separator:In},An=f.memo(Rn);function Rn(){const[t,r]=He(),n=ue(m=>m.clearSelectedEvents),[s]=te({key:ce.editorMode,defaultValue:B.Edit}),{deleteAllEntries:i}=ne(),o=f.useCallback(()=>{i(),n(),r.close()},[n,i,r]);return e.jsxs(e.Fragment,{children:[e.jsxs(P,{render:e.jsx(Q,{variant:"subtle-destructive"}),onClick:r.open,disabled:s===B.Run,className:A.apart,children:[e.jsx(Xe,{}),"Clear all"]}),e.jsx(Mt,{isOpen:t,onClose:r.close,title:"Clear rundown",showBackdrop:!0,showCloseButton:!0,bodyElements:e.jsxs(e.Fragment,{children:["You will lose all data in your rundown. ",e.jsx("br",{})," Are you sure?"]}),footerElements:e.jsxs(e.Fragment,{children:[e.jsx(Q,{variant:"ghosted-white",size:"large",onClick:r.close,children:"Cancel"}),e.jsx(Q,{variant:"destructive",size:"large",onClick:o,children:"Delete all"})]})})]})}const Gn=f.memo(On);function On(){const[t,r]=te({key:ce.editorMode,defaultValue:B.Edit}),{offsetMode:n}=tt(),s=o=>{const m=o.at(0);m&&r(m)},i=o=>{const m=o.at(0);m&&nt(m)};return e.jsxs(be,{className:A.header,children:[e.jsxs(pe,{value:[t],onValueChange:s,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:B.Run,className:A.radioButton,children:"Run"}),e.jsx(P,{render:e.jsx(Y,{}),value:B.Edit,className:A.radioButton,children:"Edit"})]}),e.jsx(Ce,{className:A.separator}),e.jsxs(pe,{value:[n],onValueChange:i,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:fe.Absolute,className:A.radioButton,children:"Absolute"}),e.jsx(P,{render:e.jsx(Y,{}),value:fe.Relative,className:A.radioButton,children:"Relative"})]}),e.jsx(An,{})]})}const Pn=f.memo(Bn);function Bn(){const[t,r]=te({key:ce.editorMode,defaultValue:B.Edit}),{offsetMode:n}=tt(),s=o=>{const m=o.at(0);m&&r(m)},i=o=>{const m=o.at(0);m&&nt(m)};return e.jsxs(be,{className:A.header,children:[e.jsxs(pe,{value:[t],onValueChange:s,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:B.Run,className:A.radioButton,children:"Run"}),e.jsx(P,{render:e.jsx(Y,{}),value:B.Edit,className:A.radioButton,children:"Edit"})]}),e.jsx(Ce,{className:A.separator}),e.jsxs(pe,{value:[n],onValueChange:i,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:fe.Absolute,className:A.radioButton,children:"Absolute"}),e.jsx(P,{render:e.jsx(Y,{}),value:fe.Relative,className:A.radioButton,children:"Relative"})]})]})}const $n=we()(t=>({entryCopyId:null,setEntryCopyId:r=>t({entryCopyId:r})})),Tn=t=>({type:j.Event,flag:t.flag,title:t.title,note:t.note,timeStart:t.timeStart,duration:t.duration,timeEnd:t.timeEnd,timerType:t.timerType,timeStrategy:t.timeStrategy,countToEnd:t.countToEnd,linkStart:t.linkStart,endAction:t.endAction,skip:t.skip,colour:t.colour,parent:t.parent,revision:0,delay:t.delay,dayOffset:t.dayOffset,gap:0,timeWarning:t.timeWarning,timeDanger:t.timeDanger,triggers:structuredClone(t.triggers),custom:structuredClone(t.custom)}),Fn="_quickAdd_96pwt_17",Kn="_indent_96pwt_24",Le={quickAdd:Fn,indent:Kn},Ee=f.memo(Vn);function Vn({previousEventId:t,parentGroup:r,backgroundColor:n}){const{addEntry:s}=ne(),i=()=>{s({type:j.Event,parent:r},{after:t,lastEventId:t})},o=()=>{s({type:j.Delay,parent:r},{lastEventId:t,after:t})},m=()=>{s({type:j.Milestone,parent:r},{lastEventId:t,after:t})},w=()=>{r===null&&s({type:j.Group},{lastEventId:t,after:t})},_=n===""?"#9d9d9d":n;return e.jsxs(be,{className:X([Le.quickAdd,!!r&&Le.indent]),style:_?{"--user-bg":_}:{},"data-testid":"quick-add-buttons",children:[e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:i,children:[e.jsx(L,{}),"Event"]}),e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:o,children:[e.jsx(L,{}),"Delay"]}),e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:m,children:[e.jsx(L,{}),"Milestone"]}),r===null&&e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:w,children:[e.jsx(L,{}),"Group"]})]})}const Ln="_quickAdd_gr8nb_17",qn="_addButton_gr8nb_35",qe={quickAdd:Ln,addButton:qn},We=f.memo(Wn);function Wn({referenceEntryId:t,parentGroup:r,placement:n}){const{addEntry:s}=ne(),i=o=>{n==="before"?s({type:o,parent:o!==j.Group?r:null},{before:t}):s({type:o,parent:o!==j.Group?r:null},{lastEventId:t,after:t})};return e.jsx("div",{className:qe.quickAdd,"data-testid":"quick-add-inline",children:e.jsx(zt,{items:[{type:"item",icon:L,label:"Add Event",onClick:()=>i(j.Event)},{type:"item",icon:L,label:"Add Delay",onClick:()=>i(j.Delay)},{type:"item",icon:L,label:"Add Milestone",onClick:()=>i(j.Milestone)},{type:"item",icon:L,label:"Add Group",onClick:()=>i(j.Group),disabled:r!==null}],render:e.jsx(st,{size:"small",variant:"primary",className:qe.addButton}),children:e.jsx(L,{})})})}const zn=t=>{const r=it(s=>s.setContextMenu);return[s=>{s.preventDefault();const{pageX:i,pageY:o}=s;return r({x:i,y:o},t)}]},Un="_noTitle_zrdm3_26",ze={noTitle:Un};function Qn({title:t,entryId:r,placeholder:n,className:s}){const{updateEntry:i}=ne(),o=f.useRef(null),m=f.useCallback(u=>{if(u===t)return;const g=u.trim();i({id:r,title:g})},[t,i,r]),{value:w,onChange:_,onBlur:R,onKeyDown:N}=Lt(t,m,o,{submitOnEnter:!0}),G=X([s,ze.eventTitle,w?null:ze.noTitle]);return e.jsx(et,{"data-testid":"entry__title",variant:"ghosted",fluid:!0,ref:o,value:w,className:G,placeholder:n,onChange:_,onBlur:R,onKeyDown:N})}const Hn="_blink_6ndm2_1",Yn="_fourtyfive_6ndm2_13",Xn="_group_6ndm2_17",Jn="_hasCursor_6ndm2_31",Zn="_expanded_6ndm2_34",es="_binder_6ndm2_39",ts="_header_6ndm2_54",ns="_titleRow_6ndm2_62",ss="_metaRow_6ndm2_67",rs="_metaEntry_6ndm2_73",os="_strike_6ndm2_81",ls="_over_6ndm2_85",is="_under_6ndm2_89",ds="_drag_6ndm2_93",as="_isDragging_6ndm2_111",cs="_notAllowed_6ndm2_114",I={blink:Hn,fourtyfive:Yn,group:Xn,hasCursor:Jn,expanded:Zn,binder:es,header:ts,titleRow:ns,metaRow:ss,metaEntry:rs,strike:os,over:ls,under:is,drag:ds,isDragging:as,notAllowed:cs};function us({data:t,hasCursor:r,collapsed:n,onCollapse:s}){var h,oe;const i=f.useRef(null),{clone:o,ungroup:m,deleteEntry:w}=ne(),{selectedEvents:_,setSingleEntrySelection:R}=ue(),[N]=zn([{type:"item",label:"Clone Group",icon:ht,onClick:()=>o(t.id)},{type:"item",label:"Ungroup",icon:pt,onClick:()=>m(t.id),disabled:t.entries.length===0},{type:"divider"},{type:"item",label:"Delete Group",icon:Xe,onClick:()=>w([t.id])}]),{attributes:G,listeners:u,setNodeRef:g,transform:M,transition:$,isDragging:K,isOver:se,over:T}=Je({id:t.id,data:{type:"group"},animateLayoutChanges:()=>!1}),re=O=>{O.stopPropagation(),!(_.size>1&&O.button===2)&&R({id:t.id})},v=t.colour&&Dt(t.colour),p=K&&(T==null?void 0:T.id)&<((h=T.data.current)==null?void 0:h.type,(oe=T.data.current)==null?void 0:oe.parent),[b,S]=(()=>{if(t.targetDuration===null)return[null,null];const O=t.duration-t.targetDuration;if(O===0)return[null,"under"];const le=Math.abs(O);return[`${O<0?"-":"+"}${ye(le,le>2*It)}`,Qt(O)]})(),C={zIndex:K?2:"inherit",transform:Ze.Translate.toString(M),transition:$,cursor:se?p?"grabbing":"no-drop":"inherit"};return e.jsxs("div",{className:X([I.group,r&&I.hasCursor,!n&&I.expanded]),ref:g,onClick:re,onContextMenu:N,style:{...C,"--user-bg":t.colour||"#929292"},"data-testid":"rundown-group",children:[e.jsx("div",{className:I.binder,style:{...v},tabIndex:-1,children:e.jsx("span",{className:X([I.drag,K&&I.isDragging,K&&!p&&I.notAllowed]),ref:i,...G,...u,children:e.jsx(ft,{})})}),e.jsxs("div",{className:I.header,children:[e.jsxs("div",{className:I.titleRow,children:[e.jsx(Qn,{title:t.title,entryId:t.id,placeholder:"Group title"}),e.jsx(st,{"aria-label":"Collapse",variant:"subtle-white",onClick:()=>s(!n,t.id),children:n?e.jsx(mt,{}):e.jsx(jt,{})})]}),e.jsxs("div",{className:I.metaRow,children:[e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Start"}),e.jsx("div",{children:Re(t.timeStart)})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"End"}),e.jsx("div",{children:Re(t.timeEnd)})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Duration"}),b===null?e.jsx("div",{className:X([S!==null&&I[S]]),children:ye(t.duration)}):e.jsxs("div",{children:[e.jsx("span",{className:I.strike,children:ye(t.duration)}),e.jsx("span",{className:X([S!==null&&I[S]]),children:b})]})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Entries"}),e.jsx("div",{children:t.entries.length})]})]})]})]})}const xs="_groupEnd_1mlc9_17",hs={groupEnd:xs};function ps({id:t,colour:r}){const{attributes:n,listeners:s,setNodeRef:i,transform:o,transition:m}=Je({id:t,data:{type:"end-group"},animateLayoutChanges:()=>!1,disabled:!0}),w={transform:Ze.Transform.toString(o),transition:m};return e.jsx("div",{className:hs.groupEnd,ref:i,...n,...s,style:{...w,...r?{"--user-bg":r}:{}},tabIndex:-1})}const fs="_empty_pqnxu_17",ms="_inline_pqnxu_22",Ue={empty:fs,inline:ms};function js(t){const{handleAddNew:r}=t;return e.jsxs("div",{className:Ue.empty,children:[e.jsx(ot,{injectedStyles:{marginTop:"5vh",marginBottom:"3rem"}}),e.jsxs("div",{className:Ue.inline,children:[e.jsxs(Q,{onClick:()=>r(j.Event),variant:"primary",size:"large",children:[e.jsx(L,{}),"Create Event"]}),e.jsx(Ce,{}),e.jsxs(Q,{onClick:()=>r(j.Group),variant:"primary",size:"large",children:[e.jsx(L,{})," Create Group"]})]})]})}const ys="_rundownWrapper_qmpnm_17",gs="_rundownContainer_qmpnm_22",_s="_list_qmpnm_28",vs="_spacer_qmpnm_44",Es="_entryWrapper_qmpnm_48",ws="_entryIndex_qmpnm_55",bs="_flag_qmpnm_66",Cs="_index_qmpnm_72",ks="_entry_qmpnm_48",z={rundownWrapper:ys,rundownContainer:gs,list:_s,spacer:vs,entryWrapper:Es,entryIndex:ws,flag:bs,index:Cs,entry:ks},Ns=f.lazy(()=>kt(()=>import("./RundownEntry-D61IqkXb.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36]),import.meta.url));function Ss({data:t,rundownMetadata:r}){var Me;const{order:n,entries:s,id:i}=t,o=At(),[m,w]=f.useState(()=>Be(n,s)),[_,R]=f.useState(r),[N,G]=te({key:`rundown.${i}-editor-collapsed-groups`,defaultValue:[]}),{addEntry:u,deleteEntry:g,move:M,reorderEntry:$}=ne(),{entryCopyId:K,setEntryCopyId:se}=$n(),[T]=te({key:ce.editorMode,defaultValue:B.Edit}),{clearSelectedEvents:re,setSelectedEvents:v,cursor:p}=ue(),b=f.useRef(null),S=f.useRef(null);Ut({followRef:b,scrollRef:S,doFollow:!0,followTrigger:T===B.Edit?p:o==null?void 0:o.selectedEventId});const C=yt(gt(Ct,{activationConstraint:{distance:10}})),h=f.useCallback(d=>{if(!d)return;const{entry:c,index:l}=ve(s,n,d);g([d]),c&&l!==null&&v({id:c.id,selectMode:"click",index:l})},[s,n,g,v]),oe=f.useCallback((d,c,l=!1)=>{var k;const x=l?((k=ve(s,n,d??"").entry)==null?void 0:k.id)??null:d;if(c===null)return;const E=s[c];if((E==null?void 0:E.type)===j.Event){const D=Tn(E);u(D,{after:x??void 0})}},[u,n,s]),O=f.useCallback((d,c,l=!1)=>{u(d,{after:c&&!l?c:void 0,before:c&&l?c:void 0,lastEventId:!l&&c?c:void 0})},[u]),le=f.useCallback((d,c)=>{if(n.length<1)return;let l=d;if(d===null){const E=c==="up"?$e(s,n):Te(s,n);if(ae(E)){v({id:E.id,selectMode:"click",index:c==="up"?n.length:0});return}l=(E==null?void 0:E.id)??null}if(l===null)return;const x=c==="up"?Ht(s,n,l):Yt(s,n,l);x.entry!==null&&x.index!==null&&v({id:x.entry.id,selectMode:"click",index:x.index})},[n,s,v]),Ne=f.useCallback((d,c)=>{if(n.length<1)return;if(d===null){const x=c==="up"?$e(s,n):Te(s,n);x!==null&&v({id:x.id,selectMode:"click",index:c==="up"?n.length:0});return}const l=c==="up"?ve(s,n,d):Xt(s,n,d);l.entry!==null&&l.index!==null&&v({id:l.entry.id,selectMode:"click",index:l.index})},[n,s,v]),J=f.useCallback(d=>!!N.find(c=>c===d),[N]),ie=f.useCallback((d,c)=>{G(l=>{const x=J(c);return d&&!x?[...new Set(l).add(c)]:!d&&x?[...l].filter(E=>E!==c):l})},[J,G]),Se=f.useCallback(async(d,c)=>{if(d==null)return;const l=await M(d,c);l&&ie(!1,l)},[ie,M]);Ye([["alt + ArrowDown",()=>Ne(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + ArrowUp",()=>Ne(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + ArrowDown",()=>le(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + ArrowUp",()=>le(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + mod + ArrowDown",()=>Se(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + mod + ArrowUp",()=>Se(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["Escape",()=>re(),{preventDefault:!0,usePhysicalKeys:!0}],["mod + Backspace",()=>h(p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + E",()=>O({type:j.Event},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + E",()=>O({type:j.Event},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + G",()=>O({type:j.Group},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + G",()=>O({type:j.Group},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + D",()=>O({type:j.Delay},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + D",()=>O({type:j.Delay},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + M",()=>O({type:j.Milestone},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + M",()=>O({type:j.Milestone},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["mod + C",()=>se(p)],["mod + V",()=>oe(p,K)],["mod + shift + V",()=>oe(p,K,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + backspace",()=>h(p),{preventDefault:!0,usePhysicalKeys:!0}]]),f.useEffect(()=>{w(Be(n,s)),R(r)},[n,s,r]),f.useEffect(()=>{var l;if(T!==B.Run||!(o!=null&&o.selectedEventId))return;const d=n.findIndex(x=>x===o.selectedEventId),c=(l=s[o.selectedEventId])==null?void 0:l.parent;c&&G(x=>[...x].filter(E=>E!==c)),v({id:o.selectedEventId,selectMode:"click",index:d})},[T,s,o.selectedEventId,n,G,v]);const dt=d=>{var he;const{active:c,over:l}=d;if(!(l!=null&&l.id)||c.id===l.id||!c.data.current||!l.data.current)return;const x=c.data.current.sortable.index,E=l.data.current.sortable.index;let k=x<E?"after":"before",D=l.id;const xe=((he=c.data.current)==null?void 0:he.type)===j.Group;if(xe&&!lt(l.data.current.type,l.data.current.parent,k,J(D)))return;if(D.startsWith("end-"))D=D.replace("end-",""),k==="before"&&(k="insert");else{const q=t.entries[D];ae(q)&&k==="after"&&(xe?D=q.id:q.entries.length===0?(D=q.id,k="insert"):(D=q.entries[0],k="before"))}const me=structuredClone(m);w(q=>Jt(q,x,E)),$(c.id,D,k).catch(q=>{w(me)})},at=d=>{var l;((l=d.active.data.current)==null?void 0:l.type)===j.Group&&ie(!0,d.active.id)},ct=d=>{var x,E,k,D;if(((x=d.active.data.current)==null?void 0:x.type)==="group"||((k=(E=d.over)==null?void 0:E.data.current)==null?void 0:k.type)!=="group")return;const c=(D=d.over)==null?void 0:D.id;J(c)&&ie(!1,c)};if(m.length<1)return e.jsx(js,{handleAddNew:d=>u({type:d})});const de=T===B.Edit;return e.jsx("div",{className:z.rundownContainer,ref:S,"data-testid":"rundown",children:e.jsx(_t,{onDragEnd:dt,onDragStart:at,onDragOver:ct,sensors:C,collisionDetection:vt,children:e.jsx(Et,{items:m,strategy:wt,children:e.jsxs("div",{className:z.list,children:[de&&e.jsx(Ee,{previousEventId:null,parentGroup:null}),m.map((d,c)=>{if(d.startsWith("end-")){const je=d.split("end-")[1],ut=J(je),W=_[je];return ut?null:e.jsxs(f.Fragment,{children:[de&&(W==null?void 0:W.groupEntries)===0&&e.jsx(Ee,{previousEventId:null,parentGroup:je,backgroundColor:W==null?void 0:W.groupColour}),e.jsx(ps,{id:d,colour:W==null?void 0:W.groupColour},d)]},d)}const l=s[d],x=_[d];if(!l||!x||l.type!==j.Group&&x.groupId!==null&&J(x.groupId))return null;const E=(o==null?void 0:o.nextEventId)===l.id,k=l.id===p,D=x.groupColour===""?"#9d9d9d":x.groupColour,xe=c===0,me=d===n.at(-1),he=x.thisId!==x.groupId?x.groupId:null,q=x.groupId;return e.jsxs(f.Fragment,{children:[de&&k&&!xe&&e.jsx(We,{placement:"before",referenceEntryId:l.id,parentGroup:he}),ae(l)?e.jsx(us,{data:l,hasCursor:k,collapsed:J(l.id),onCollapse:ie}):e.jsxs("div",{className:z.entryWrapper,"data-testid":`entry-${x.eventIndex}`,style:D?{"--user-bg":D}:{},children:[ee(l)&&e.jsxs("div",{className:z.entryIndex,children:[l.flag&&e.jsx(bt,{className:z.flag}),e.jsx("div",{className:z.index,children:x.eventIndex})]}),e.jsx("div",{className:z.entry,ref:k?b:void 0,children:e.jsx(Ns,{type:l.type,isPast:x.isPast,eventIndex:x.eventIndex,data:l,loaded:x.isLoaded,hasCursor:k,isNext:E,isNextDay:x.isNextDay,playback:x.isLoaded?o.playback:void 0,isRolling:o.playback===Rt.Roll,totalGap:x.totalGap,isLinkedToLoaded:x.isLinkedToLoaded})},l.id)]}),de&&k&&!me&&e.jsx(We,{placement:"after",referenceEntryId:l.id,parentGroup:q})]},l.id)}),de&&e.jsx(Ee,{previousEventId:((Me=_[Pe])==null?void 0:Me.groupId)??_[Pe].thisId,parentGroup:null}),e.jsx("div",{className:z.spacer})]})})})})}function Qe({isSmallDevice:t}){const{data:r,status:n,rundownMetadata:s}=Tt();return e.jsxs("div",{className:z.rundownWrapper,children:[t?e.jsx(Pn,{}):e.jsx(Gn,{}),n==="success"&&r&&s?e.jsx(Ss,{data:r,rundownMetadata:s}):e.jsx(ot,{text:"Connecting to server"})]})}const Ms="_rundownExport_h38r0_21",Ds="_extracted_h38r0_25",Is="_list_h38r0_25",As="_side_h38r0_29",Rs="_rundown_h38r0_21",H={rundownExport:Ms,extracted:Ds,list:Is,side:As,rundown:Rs},Gs=f.memo(Os);function Os(){const t=window.location.pathname.includes("/rundown"),[r]=te({key:ce.editorMode,defaultValue:B.Edit});if(Gt()&&t)return e.jsx(Oe,{permission:"editor",children:e.jsxs("div",{className:X([H.rundownExport,H.extracted]),"data-target":"small-device","data-testid":"panel-rundown",children:[e.jsx(Ke,{}),e.jsx(Ge,{suppressSettings:!0}),e.jsx("div",{className:H.rundown,children:e.jsx(ge,{children:e.jsx(Ve,{children:e.jsx(Qe,{isSmallDevice:!0})})})})]})});const s=t&&r==="run";return e.jsx(Oe,{permission:"editor",children:e.jsxs("div",{className:X([H.rundownExport,t&&H.extracted]),"data-testid":"panel-rundown",children:[e.jsx(Ke,{}),t&&e.jsx(Ge,{suppressSettings:!0}),e.jsxs("div",{className:H.rundown,children:[e.jsx("div",{className:H.list,children:e.jsxs(ge,{children:[!t&&e.jsx(St,{onClick:i=>Ot("rundown",i)}),e.jsx(Ve,{children:e.jsx(Qe,{})})]})}),!s&&e.jsx("div",{className:H.side,children:e.jsx(ge,{children:e.jsx(hn,{})})})]})]})})}const Hs=Object.freeze(Object.defineProperty({__proto__:null,default:Gs},Symbol.toStringTag,{value:"Module"}));export{Hs as R,Qn as T,zn as a,Tn as c,Qs as g,ue as u};
|
|
3
|
-
//# sourceMappingURL=RundownExport-C6YhMGOC.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["reorderArray","array","fromIndex","toIndex","modifiedArray","reorderedItem","isMacOS","userAgent","deviceAlt","deviceMod","useEventSelection","create","set","get","id","index","selectMode","selectedEvents","anchoredIndex","entryMode","rundownData","ontimeQueryClient","RUNDOWN","nextIndex","eventId","i","isOntimeEvent","eventIds","event","start","end","selectedEventIds","firstSelected","getSelectionMode","memo","EventEditorFooter","cue","loadById","loadByCue","jsxs","style","jsx","CopyTag","EventEditorEmpty","Editor.Title","Kbd","AuxKey","children","RundownEntryEditor","state","data","useRundown","entry","setEntry","useState","useEffect","selectedEventId","isOntimeDelay","EventEditor","isOntimeMilestone","MilestoneEditor","isOntimeGroup","GroupEditor","maxResults","useFinder","rundownId","useFlatRundown","results","setResults","error","setError","lastSearchString","useRef","setSelectedEvents","collapsedGroups","setCollapsedGroups","useSessionStorage","find","useCallback","searchValue","searchString","searchByIndex","searchByCue","searchByTitle","searchIndex","eventIndex","SupportedEntry","remaining","select","selectedEvent","newGroups","Finder","isOpen","onClose","selected","setSelected","debouncedFind","useDebouncedCallback","navigate","prev","submit","handleMouseMoveEvent","li","Modal","Input","isSelected","displayIndex","displayCue","FinderPlacement","handler","useDisclosure","useHotkeys","useContextMenuStore","position","options","newIsOpen","RundownContextMenu","setIsOpen","Fragment","PositionedDropdownMenu","RundownMenu","handlers","clearSelectedEvents","editorMode","sessionKeys","AppMode","deleteAllEntries","useEntryActions","deleteAll","Toolbar.Button","Button","IoTrash","Dialog","RundownHeader","setEditorMode","offsetMode","useOffsetMode","toggleAppMode","mode","newValue","toggleOffsetMode","setOffsetMode","Toolbar.Root","ToggleGroup","Toggle","Editor.Separator","OffsetMode","useEntryCopy","entryCopyId","cloneEvent","QuickAddButtons","previousEventId","parentGroup","backgroundColor","addEntry","addEvent","addDelay","addMilestone","addGroup","groupColour","cx","IoAdd","QuickAddInline","referenceEntryId","placement","handleAddEntry","type","DropdownMenu","IconButton","useContextMenu","setContextMenu","contextMenuEvent","pageX","pageY","TitleEditor","title","entryId","placeholder","className","updateEntry","ref","submitCallback","text","cleanVal","value","onChange","onBlur","onKeyDown","useReactiveTextInput","classes","RundownGroup","hasCursor","collapsed","onCollapse","handleRef","clone","ungroup","deleteEntry","setSingleEntrySelection","onContextMenu","IoDuplicateOutline","IoFolderOpenOutline","dragAttributes","dragListeners","setNodeRef","transform","transition","isDragging","isOver","over","useSortable","handleFocusClick","binderColours","getAccessibleColour","isValidDrop","canDrop","_a","_b","planOffset","planOffsetLabel","offset","absOffset","formatDuration","MILLIS_PER_MINUTE","getOffsetState","dragStyle","CSS","IoReorderTwo","IoChevronUp","IoChevronDown","formatTime","RundownGroupEnd","colour","RundownEmpty","props","handleAddNew","Empty","RundownEntry","lazy","__vitePreload","Rundown","rundownMetadata","order","entries","featureData","useRundownEditor","sortableData","setSortableData","makeSortableList","metadata","setMetadata","move","reorderEntry","setEntryCopyId","cursor","cursorRef","scrollRef","useFollowComponent","sensors","useSensors","useSensor","PointerSensor","deleteAtCursor","getPreviousNormal","insertCopyAtId","atId","copyId","above","adjustedCursor","cloneEntry","newEvent","insertAtId","patch","selectGroup","direction","newCursor","getLastNormal","getFirstNormal","getPreviousGroupNormal","getNextGroupNormal","selectEntry","getNextNormal","getIsCollapsed","groupId","handleCollapseGroup","isCollapsed","moveEntry","movedIntoGroupId","maybeParent","handleOnDragEnd","active","destinationId","isDraggingGroup","group","currentEntries","_","collapseDraggedGroups","expandOverGroup","_c","_d","isEditMode","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","parentId","isGroupCollapsed","parentMetadata","entryMetadata","isNext","isFirst","isLast","parentIdForBefore","parentIdForAfter","TbFlagFilled","Playback","lastMetadataKey","RundownWrapper","isSmallDevice","status","useRundownWithMetadata","styles","RundownHeaderMobile","RundownExport","isExtracted","useIsSmallDevice","ProtectRoute","ViewNavigationMenu","ErrorBoundary","hideSideBar","Corner","handleLinks"],"ignoreList":[],"sources":["../../../../packages/utils/src/common/arrayUtils.ts","../../src/common/utils/deviceUtils.ts","../../src/features/rundown/useEventSelection.ts","../../src/features/rundown/entry-editor/composite/EventEditorFooter.tsx","../../src/features/rundown/entry-editor/EventEditorEmpty.tsx","../../src/features/rundown/entry-editor/RundownEntryEditor.tsx","../../src/views/editor/finder/useFinder.tsx","../../src/views/editor/finder/Finder.tsx","../../src/features/rundown/placements/FinderPlacement.tsx","../../src/features/rundown/rundown-context-menu/RundownContextMenu.tsx","../../src/features/rundown/rundown-header/RundownMenu.tsx","../../src/features/rundown/rundown-header/RundownHeader.tsx","../../src/features/rundown/rundown-header/RundownHeaderMobile.tsx","../../src/common/stores/entryCopyStore.ts","../../src/common/utils/clone.ts","../../src/features/rundown/entry-editor/quick-add-buttons/QuickAddButtons.tsx","../../src/features/rundown/entry-editor/quick-add-cursor/QuickAddInline.tsx","../../src/common/hooks/useContextMenu.tsx","../../src/features/rundown/common/TitleEditor.tsx","../../src/features/rundown/rundown-group/RundownGroup.tsx","../../src/features/rundown/rundown-group/RundownGroupEnd.tsx","../../src/features/rundown/RundownEmpty.tsx","../../src/features/rundown/Rundown.tsx","../../src/features/rundown/RundownWrapper.tsx","../../src/features/rundown/RundownExport.tsx"],"sourcesContent":["/**\n * Inserts an item in an array at a given index\n * @param index\n * @param item\n * @param array\n */\nexport function insertAtIndex<T>(index: number, item: T, array: T[]): T[] {\n const modifiedArray = [...array];\n\n // Insert at beginning\n if (index === 0) {\n modifiedArray.unshift(item);\n }\n\n // insert at end\n else if (index >= modifiedArray.length) {\n modifiedArray.push(item);\n }\n\n // insert in the middle\n else {\n modifiedArray.splice(index, 0, item);\n }\n\n return modifiedArray;\n}\n\n/**\n * Inserts an array into another one of the same type at a given index\n */\nexport function mergeAtIndex<T>(index: number, newArray: T[], currentArray: T[]): T[] {\n // Insert at beginning\n if (index === 0) {\n return [...newArray, ...currentArray];\n }\n\n // insert at end\n else if (index >= currentArray.length) {\n return [...currentArray, ...newArray];\n }\n\n // insert in the middle\n return currentArray.toSpliced(index, 0, ...newArray);\n}\n\n/**\n * Deletes array element at a given index\n * @param index\n * @param array\n */\nexport function deleteAtIndex<T>(index: number, array: T[]) {\n return array.filter((_, i) => i !== index);\n}\n\n/**\n * Reorders two objects in an array\n */\nexport function reorderArray<T>(array: T[], fromIndex: number, toIndex: number): T[] {\n if (fromIndex === toIndex) {\n return array; // No change needed, return the original array\n }\n\n const modifiedArray = [...array];\n\n // delete in from\n const [reorderedItem] = modifiedArray.splice(fromIndex, 1);\n\n // reinsert item at to\n modifiedArray.splice(toIndex, 0, reorderedItem);\n return modifiedArray;\n}\n","export function isMacOS() {\n const userAgent = navigator.userAgent.toLowerCase();\n return userAgent.includes('macintosh') || userAgent.includes('mac os');\n}\n\nexport const deviceAlt = isMacOS() ? 'Option' : 'Alt';\n\nexport const deviceMod = isMacOS() ? 'Cmd' : 'Ctrl';\n","import { MouseEvent } from 'react';\nimport { EntryId, isOntimeEvent, MaybeNumber, MaybeString, Rundown } from 'ontime-types';\nimport { create } from 'zustand';\n\nimport { RUNDOWN } from '../../common/api/constants';\nimport { ontimeQueryClient } from '../../common/queryClient';\nimport { isMacOS } from '../../common/utils/deviceUtils';\n\ntype SelectionMode = 'shift' | 'click' | 'ctrl';\n\ninterface EventSelectionStore {\n selectedEvents: Set<EntryId>;\n anchoredIndex: MaybeNumber;\n cursor: MaybeString;\n entryMode: 'event' | 'single' | null;\n setSingleEntrySelection: (selectionArgs: { id: EntryId }) => void;\n setSelectedEvents: (selectionArgs: { id: EntryId; index: number; selectMode: SelectionMode }) => void;\n clearSelectedEvents: () => void;\n clearMultiSelect: () => void;\n unselect: (id: EntryId) => void;\n}\n\nexport const useEventSelection = create<EventSelectionStore>()((set, get) => ({\n selectedEvents: new Set(),\n anchoredIndex: null,\n cursor: null,\n entryMode: null,\n setSingleEntrySelection: ({ id }) => {\n set({ selectedEvents: new Set([id]), anchoredIndex: null, cursor: id, entryMode: 'single' });\n },\n setSelectedEvents: ({ id, index, selectMode }) => {\n const { selectedEvents, anchoredIndex, entryMode } = get();\n\n // if we are in single mode, we replace the selection and change the mode\n if (entryMode === 'single') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on click, we replace selection with event\n if (selectMode === 'click') {\n return set({ selectedEvents: new Set([id]), anchoredIndex: index, cursor: id, entryMode: 'event' });\n }\n\n // on ctrl + click, we toggle the selection of that event\n if (selectMode === 'ctrl') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // if it doesnt exist, simply add to the list and set an anchor\n if (!selectedEvents.has(id)) {\n return set({\n selectedEvents: selectedEvents.add(id),\n anchoredIndex: index,\n cursor: id,\n entryMode: 'event',\n });\n }\n\n // if event is already selected, we remove it from selection\n // and set the anchor to the event after\n selectedEvents.delete(id);\n\n const nextIndex = rundownData.order.findIndex(\n (eventId, i) => i > index && isOntimeEvent(rundownData.entries[eventId]) && selectedEvents.has(eventId),\n );\n\n // if we didnt find anything after, set the anchor to the last event\n return set({\n selectedEvents,\n anchoredIndex: nextIndex < 0 ? rundownData.order.length - 1 : nextIndex,\n entryMode: 'event',\n });\n }\n\n // on shift + click, we select a range of events up to the clicked event\n if (selectMode === 'shift') {\n const rundownData = ontimeQueryClient.getQueryData<Rundown>(RUNDOWN);\n if (!rundownData) return;\n\n // get list of rundown with only ontime events\n const eventIds: EntryId[] = [];\n rundownData.flatOrder.forEach((eventId) => {\n const event = rundownData.entries[eventId];\n if (isOntimeEvent(event)) {\n eventIds.push(event.id);\n }\n });\n\n const start = anchoredIndex === null ? 0 : Math.min(anchoredIndex, index);\n const end = anchoredIndex === null ? index : Math.max(anchoredIndex, index + 1);\n\n // create new set with range of ids from start to end\n const selectedEventIds = eventIds.slice(start, end);\n\n return set({\n selectedEvents: new Set([...selectedEvents, ...selectedEventIds]),\n anchoredIndex: index,\n entryMode: 'event',\n });\n }\n },\n clearSelectedEvents: () => set({ selectedEvents: new Set(), anchoredIndex: null, cursor: null, entryMode: null }),\n clearMultiSelect: () => {\n const { selectedEvents } = get();\n const [firstSelected] = selectedEvents;\n set({\n selectedEvents: new Set(firstSelected ? [firstSelected] : []),\n anchoredIndex: null,\n entryMode: null,\n });\n },\n unselect: (id: string) => {\n const { entryMode, selectedEvents } = get();\n selectedEvents.delete(id);\n set({\n selectedEvents,\n entryMode: selectedEvents.size === 0 ? null : entryMode,\n });\n },\n}));\n\nexport function getSelectionMode(event: MouseEvent): SelectionMode {\n if ((isMacOS() && event.metaKey) || event.ctrlKey) {\n return 'ctrl';\n }\n\n if (event.shiftKey) {\n return 'shift';\n }\n\n return 'click';\n}\n","import { memo } from 'react';\n\nimport CopyTag from '../../../../common/components/copy-tag/CopyTag';\n\nimport style from './EventEditorFooter.module.scss';\n\ninterface EventEditorFooterProps {\n id: string;\n cue: string;\n}\n\nexport default memo(EventEditorFooter);\nfunction EventEditorFooter({ id, cue }: EventEditorFooterProps) {\n const loadById = `/ontime/load/id \"${id}\"`;\n const loadByCue = `/ontime/load/cue \"${cue}\"`;\n\n return (\n <div className={style.footer}>\n <CopyTag copyValue={loadById}>{loadById}</CopyTag>\n <CopyTag copyValue={loadByCue}>{loadByCue}</CopyTag>\n </div>\n );\n}\n","import { memo, PropsWithChildren } from 'react';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { deviceAlt, deviceMod } from '../../../common/utils/deviceUtils';\n\nimport style from './EventEditorEmpty.module.scss';\n\nexport default memo(EventEditorEmpty);\n\nfunction EventEditorEmpty() {\n return (\n <div className={style.entryEditor} data-testid='editor-container'>\n <div className={style.shortcutSection}>\n <Editor.Title className={style.prompt}>Rundown shortcuts</Editor.Title>\n <table className={style.shortcuts}>\n <tbody>\n <tr>\n <td>Find in rundown</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>F</Kbd>\n </td>\n </tr>\n <tr>\n <td>Open Settings</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>,</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Select entry</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Select group</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Deselect entry</td>\n <td>\n <Kbd>Esc</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Reorder selected entry</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>↑</Kbd>\n <AuxKey>/</AuxKey>\n <Kbd>↓</Kbd>\n </td>\n </tr>\n <tr>\n <td>Copy selected entry</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>C</Kbd>\n </td>\n </tr>\n <tr>\n <td>Paste above</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>V</Kbd>\n </td>\n </tr>\n <tr>\n <td>Paste below</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>V</Kbd>\n </td>\n </tr>\n <tr>\n <td>Delete selected entry</td>\n <td>\n <Kbd>{deviceMod}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Backspace</Kbd>\n </td>\n </tr>\n <tr className={style.spacer} />\n <tr>\n <td>Add event below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>E</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add event above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>E</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add group below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>G</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add group above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>M</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add milestone below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>G</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add milestone above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>M</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add delay below</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>D</Kbd>\n </td>\n </tr>\n <tr>\n <td>Add delay above</td>\n <td>\n <Kbd>{deviceAlt}</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>Shift</Kbd>\n <AuxKey>+</AuxKey>\n <Kbd>D</Kbd>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction AuxKey({ children }: PropsWithChildren) {\n return <span className={style.divider}>{children}</span>;\n}\n\nfunction Kbd({ children }: PropsWithChildren) {\n return <span className={style.kbd}>{children}</span>;\n}\n","import { useEffect, useState } from 'react';\nimport {\n isOntimeDelay,\n isOntimeEvent,\n isOntimeGroup,\n isOntimeMilestone,\n OntimeEvent,\n OntimeGroup,\n OntimeMilestone,\n} from 'ontime-types';\n\nimport useRundown from '../../../common/hooks-query/useRundown';\nimport { useEventSelection } from '../useEventSelection';\n\nimport EventEditorFooter from './composite/EventEditorFooter';\nimport EventEditor from './EventEditor';\nimport EventEditorEmpty from './EventEditorEmpty';\nimport GroupEditor from './GroupEditor';\nimport MilestoneEditor from './MilestoneEditor';\n\nimport style from './EntryEditor.module.scss';\n\nexport default function RundownEntryEditor() {\n const selectedEvents = useEventSelection((state) => state.selectedEvents);\n const { data } = useRundown();\n\n const [entry, setEntry] = useState<OntimeEvent | OntimeGroup | OntimeMilestone | null>(null);\n\n useEffect(() => {\n if (data.order.length === 0) {\n setEntry(null);\n return;\n }\n\n const selectedEventId = Array.from(selectedEvents).at(0);\n if (!selectedEventId) {\n setEntry(null);\n return;\n }\n const event = data.entries[selectedEventId];\n\n if (event && !isOntimeDelay(event)) {\n setEntry(event);\n } else {\n setEntry(null);\n }\n }, [data.order, data.entries, selectedEvents]);\n\n if (!entry) {\n return <EventEditorEmpty />;\n }\n\n if (isOntimeEvent(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <EventEditor event={entry} />\n <EventEditorFooter id={entry.id} cue={entry.cue} />\n </div>\n );\n }\n\n if (isOntimeMilestone(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <MilestoneEditor milestone={entry} />\n </div>\n );\n }\n\n if (isOntimeGroup(entry)) {\n return (\n <div className={style.rundownEditor} data-testid='editor-container'>\n <GroupEditor group={entry} />\n </div>\n );\n }\n\n return null;\n}\n","import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { EntryId, isOntimeEvent, isOntimeGroup, isOntimeMilestone, MaybeString, SupportedEntry } from 'ontime-types';\n\nimport { useFlatRundown } from '../../../common/hooks-query/useRundown';\nimport { useEventSelection } from '../../../features/rundown/useEventSelection';\n\nconst maxResults = 12;\n\ntype FilterableGroup = {\n type: SupportedEntry.Group;\n id: EntryId;\n index: number;\n title: string;\n colour: string;\n};\n\ntype FilterableEvent = {\n type: SupportedEntry.Event;\n id: EntryId;\n index: number;\n eventIndex: number;\n title: string;\n cue: string;\n colour: string;\n parent: MaybeString;\n};\n\ntype FilterableMilestone = {\n type: SupportedEntry.Milestone;\n id: EntryId;\n index: number;\n title: string;\n cue: string;\n colour: string;\n parent: MaybeString;\n};\n\ntype FilterableEntry = FilterableGroup | FilterableEvent | FilterableMilestone;\n\nexport default function useFinder() {\n const { data, rundownId } = useFlatRundown();\n const [results, setResults] = useState<FilterableEntry[]>([]);\n const [error, setError] = useState<MaybeString>(null);\n const lastSearchString = useRef('');\n\n const setSelectedEvents = useEventSelection((state) => state.setSelectedEvents);\n\n const [collapsedGroups, setCollapsedGroups] = useSessionStorage<EntryId[]>({\n // we ensure that this is unique to the rundown\n key: `rundown.${rundownId}-editor-collapsed-groups`,\n defaultValue: [],\n });\n\n /** Filters the rundown to a given evaluation */\n const find = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (!data || data.length === 0) {\n setError('No data');\n return;\n }\n setError(null);\n\n if (event.target.value === '') {\n setResults([]);\n return;\n }\n\n const searchValue = event.target.value.toLowerCase();\n lastSearchString.current = searchValue;\n\n if (searchValue.startsWith('index ')) {\n const searchString = searchValue.slice('index '.length).trim();\n const { results, error } = searchByIndex(searchString);\n setResults(results);\n setError(error);\n return;\n }\n\n if (searchValue.startsWith('cue ')) {\n const searchString = searchValue.slice('cue '.length).trim();\n const { results, error } = searchByCue(searchString);\n setResults(results);\n setError(error);\n return;\n }\n\n const searchString = searchValue.startsWith('title ') ? searchValue.slice('title '.length).trim() : searchValue;\n const { results, error } = searchByTitle(searchString);\n setResults(results);\n setError(error);\n\n /** Returns a single item with a matching index */\n function searchByIndex(searchString: string) {\n const searchIndex = Number(searchString);\n if (isNaN(searchIndex) || searchIndex < 1) {\n return { results: [], error: 'Invalid index' };\n }\n\n if (searchIndex > data.length) {\n return { results: [], error: null };\n }\n\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n const results: FilterableEvent[] = [];\n for (let i = 0; i < data.length; i++) {\n const event = data[i];\n if (isOntimeEvent(event)) {\n if (eventIndex === searchIndex) {\n results.push({\n type: SupportedEntry.Event,\n id: event.id,\n index: i,\n eventIndex,\n title: event.title,\n cue: event.cue,\n colour: event.colour,\n parent: event.parent,\n } satisfies FilterableEvent);\n break;\n }\n eventIndex++;\n }\n }\n\n return { results, error: null };\n }\n\n /** Returns maxResults of OntimeEvents that match the cue field */\n function searchByCue(searchString: string) {\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n // limit amount of results we show\n let remaining = maxResults;\n const results: FilterableEvent[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (remaining <= 0) {\n break;\n }\n const event = data[i];\n if (isOntimeEvent(event)) {\n if (event.cue.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Event,\n id: event.id,\n index: i,\n eventIndex,\n title: event.title,\n cue: event.cue,\n colour: event.colour,\n parent: event.parent,\n } satisfies FilterableEvent);\n }\n eventIndex++;\n }\n }\n return { results, error: null };\n }\n\n /** Returns maxResults of OntimeEvents that match the title field*/\n function searchByTitle(searchString: string) {\n // indexes exposed to the UI are 1-based\n let eventIndex = 1;\n // limit amount of results we show\n let remaining = maxResults;\n const results: FilterableEntry[] = [];\n\n for (let i = 0; i < data.length; i++) {\n if (remaining <= 0) {\n break;\n }\n\n const entry = data[i];\n if (isOntimeEvent(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Event,\n id: entry.id,\n index: i,\n eventIndex,\n title: entry.title,\n cue: entry.cue,\n colour: entry.colour,\n parent: entry.parent,\n } satisfies FilterableEvent);\n }\n eventIndex++;\n } else if (isOntimeGroup(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Group,\n id: entry.id,\n index: i,\n title: entry.title,\n colour: entry.colour,\n } satisfies FilterableGroup);\n }\n } else if (isOntimeMilestone(entry)) {\n if (entry.title.toLowerCase().includes(searchString)) {\n remaining--;\n results.push({\n type: SupportedEntry.Milestone,\n id: entry.id,\n index: i,\n title: entry.title,\n cue: entry.cue,\n colour: entry.colour,\n parent: entry.parent,\n } satisfies FilterableMilestone);\n }\n }\n }\n return { results, error: null };\n }\n },\n [data],\n );\n\n const select = useCallback(\n (selectedEvent: FilterableEntry) => {\n // First expand the parent group if this is an event inside a group\n if ('parent' in selectedEvent && selectedEvent.parent !== null) {\n // Try direct state update instead of using callback\n const currentGroups = [...new Set(collapsedGroups)];\n const newGroups = currentGroups.filter((id) => id !== selectedEvent.parent);\n // Force a direct update\n setCollapsedGroups(newGroups);\n }\n\n // Then select the event\n setSelectedEvents({ id: selectedEvent.id, index: selectedEvent.index, selectMode: 'click' });\n },\n [collapsedGroups, setCollapsedGroups, setSelectedEvents],\n );\n\n /** clear results when source data changes */\n useEffect(() => {\n setResults([]);\n setError(null);\n // fake a submit event to re-run the search\n if (lastSearchString.current) {\n find({ target: { value: lastSearchString.current } } as ChangeEvent<HTMLInputElement>);\n }\n }, [data, find]);\n\n return { find, select, results, error };\n}\n","import { KeyboardEvent, useState } from 'react';\nimport { useDebouncedCallback } from '@mantine/hooks';\nimport { SupportedEntry } from 'ontime-types';\n\nimport Input from '../../../common/components/input/input/Input';\nimport Modal from '../../../common/components/modal/Modal';\n\nimport useFinder from './useFinder';\n\nimport style from './Finder.module.scss';\n\ninterface FinderProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function Finder({ isOpen, onClose }: FinderProps) {\n const { find, select, results, error } = useFinder();\n const [selected, setSelected] = useState(0);\n\n const debouncedFind = useDebouncedCallback(find, 100);\n\n const navigate = (event: KeyboardEvent<HTMLDivElement>) => {\n // all operations need results\n if (results.length === 0) {\n return;\n }\n if (event.key === 'ArrowDown') {\n setSelected((prev) => (prev + 1) % results.length);\n }\n if (event.key === 'ArrowUp') {\n setSelected((prev) => (prev - 1 + results.length) % results.length);\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n submit();\n }\n };\n\n const submit = () => {\n const selectedEvent = results[selected];\n select(selectedEvent);\n onClose();\n };\n\n const handleMouseMoveEvent = (event: React.MouseEvent<HTMLUListElement>) => {\n const target = event.target as HTMLElement;\n const li = target.closest('li');\n if (li) {\n const index = Number(li.dataset.index);\n if (!isNaN(index)) {\n setSelected(index);\n }\n }\n };\n\n return (\n <Modal\n title=''\n isOpen={isOpen}\n onClose={onClose}\n showBackdrop\n bodyElements={\n <div onKeyDown={navigate}>\n <Input height='large' fluid onChange={debouncedFind} placeholder='Search...' />\n <ul className={style.scrollContainer} onMouseMove={handleMouseMoveEvent}>\n {error && <li className={style.error}>{error}</li>}\n {results.length === 0 && <li className={style.empty}>No results</li>}\n {results.length > 0 &&\n results.map((entry, index) => {\n const isSelected = selected === index;\n const displayIndex = entry.type === SupportedEntry.Event ? entry.eventIndex : '-';\n const displayCue = 'cue' in entry ? entry.cue : '';\n\n return (\n <li\n key={entry.id}\n className={style.entry}\n data-selected={isSelected}\n data-index={index}\n onClick={submit}\n >\n <div className={style.data}>\n <div className={style.index} style={{ '--color': entry.colour }}>\n {displayIndex}\n </div>\n <div className={style.cue}>{displayCue}</div>\n <div className={style.title}>{entry.title}</div>\n </div>\n {isSelected && <span>Go ⏎</span>}\n </li>\n );\n })}\n </ul>\n </div>\n }\n footerElements={\n <div className={style.footer}>\n Use the keywords <span className={style.em}>cue</span>, <span className={style.em}>index</span> or\n <span className={style.em}>title</span> to filter search.\n </div>\n }\n />\n );\n}\n","import { memo } from 'react';\nimport { useDisclosure, useHotkeys } from '@mantine/hooks';\n\nimport Finder from '../../../views/editor/finder/Finder';\n\nexport default memo(FinderPlacement);\n\nfunction FinderPlacement() {\n const [isOpen, handler] = useDisclosure();\n\n useHotkeys([\n ['mod + f', handler.toggle],\n ['Escape', handler.close],\n ]);\n\n if (isOpen) {\n return <Finder isOpen={isOpen} onClose={handler.close} />;\n }\n\n return null;\n}\n","import type { PropsWithChildren } from 'react';\nimport { create } from 'zustand';\n\nimport { DropdownMenuOption, PositionedDropdownMenu } from '../../../common/components/dropdown-menu/DropdownMenu';\n\ntype Position = {\n x: number;\n y: number;\n};\n\ntype ContextMenuStore = {\n position: Position;\n options: DropdownMenuOption[];\n isOpen: boolean;\n setContextMenu: (position: Position, options: DropdownMenuOption[]) => void;\n setIsOpen: (newIsOpen: boolean) => void;\n};\n\nexport const useContextMenuStore = create<ContextMenuStore>((set) => ({\n position: { x: 0, y: 0 },\n options: [],\n isOpen: false,\n setContextMenu: (position, options) => set(() => ({ position, options, isOpen: true })),\n setIsOpen: (newIsOpen) => set(() => ({ isOpen: newIsOpen })),\n}));\n\nexport function RundownContextMenu({ children }: PropsWithChildren) {\n const { position, options, isOpen, setIsOpen } = useContextMenuStore();\n\n const onClose = () => {\n return setIsOpen(false);\n };\n\n if (!isOpen) {\n return children;\n }\n\n return (\n <>\n {children}\n <PositionedDropdownMenu isOpen position={position} onClose={onClose} items={options} />\n </>\n );\n}\n","import { memo, useCallback } from 'react';\nimport { IoTrash } from 'react-icons/io5';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useDisclosure, useSessionStorage } from '@mantine/hooks';\n\nimport Button from '../../../common/components/buttons/Button';\nimport Dialog from '../../../common/components/dialog/Dialog';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownMenu);\nfunction RundownMenu() {\n const [isOpen, handlers] = useDisclosure();\n\n const clearSelectedEvents = useEventSelection((state) => state.clearSelectedEvents);\n const [editorMode] = useSessionStorage({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n const { deleteAllEntries } = useEntryActions();\n\n const deleteAll = useCallback(() => {\n deleteAllEntries();\n clearSelectedEvents();\n handlers.close();\n }, [clearSelectedEvents, deleteAllEntries, handlers]);\n\n return (\n <>\n <Toolbar.Button\n render={<Button variant='subtle-destructive' />}\n onClick={handlers.open}\n disabled={editorMode === AppMode.Run}\n className={style.apart}\n >\n <IoTrash />\n Clear all\n </Toolbar.Button>\n <Dialog\n isOpen={isOpen}\n onClose={handlers.close}\n title='Clear rundown'\n showBackdrop\n showCloseButton\n bodyElements={\n <>\n You will lose all data in your rundown. <br /> Are you sure?\n </>\n }\n footerElements={\n <>\n <Button variant='ghosted-white' size='large' onClick={handlers.close}>\n Cancel\n </Button>\n <Button variant='destructive' size='large' onClick={deleteAll}>\n Delete all\n </Button>\n </>\n }\n />\n </>\n );\n}\n","import { memo } from 'react';\nimport { Toggle } from '@base-ui-components/react/toggle';\nimport { ToggleGroup } from '@base-ui-components/react/toggle-group';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { OffsetMode } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { setOffsetMode, useOffsetMode } from '../../../common/hooks/useSocket';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\n\nimport RundownMenu from './RundownMenu';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownHeader);\nfunction RundownHeader() {\n const [editorMode, setEditorMode] = useSessionStorage({ key: sessionKeys.editorMode, defaultValue: AppMode.Edit });\n\n const { offsetMode } = useOffsetMode();\n\n const toggleAppMode = (mode: AppMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setEditorMode(newValue);\n };\n\n const toggleOffsetMode = (mode: OffsetMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setOffsetMode(newValue);\n };\n\n return (\n <Toolbar.Root className={style.header}>\n <ToggleGroup value={[editorMode]} onValueChange={toggleAppMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={AppMode.Run} className={style.radioButton}>\n Run\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={AppMode.Edit} className={style.radioButton}>\n Edit\n </Toolbar.Button>\n </ToggleGroup>\n\n <Editor.Separator className={style.separator} />\n\n <ToggleGroup value={[offsetMode]} onValueChange={toggleOffsetMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Absolute} className={style.radioButton}>\n Absolute\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Relative} className={style.radioButton}>\n Relative\n </Toolbar.Button>\n </ToggleGroup>\n\n <RundownMenu />\n </Toolbar.Root>\n );\n}\n","import { memo } from 'react';\nimport { Toggle } from '@base-ui-components/react/toggle';\nimport { ToggleGroup } from '@base-ui-components/react/toggle-group';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { useSessionStorage } from '@mantine/hooks';\nimport { OffsetMode } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport { setOffsetMode, useOffsetMode } from '../../../common/hooks/useSocket';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\n\nimport style from './RundownHeader.module.scss';\n\nexport default memo(RundownHeader);\nfunction RundownHeader() {\n const [editorMode, setEditorMode] = useSessionStorage<AppMode>({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n\n const { offsetMode } = useOffsetMode();\n\n const toggleAppMode = (mode: AppMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setEditorMode(newValue);\n };\n\n const toggleOffsetMode = (mode: OffsetMode[]) => {\n // we need to stop user from deselecting a mode\n const newValue = mode.at(0);\n if (!newValue) return;\n setOffsetMode(newValue);\n };\n\n return (\n <Toolbar.Root className={style.header}>\n <ToggleGroup value={[editorMode]} onValueChange={toggleAppMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={AppMode.Run} className={style.radioButton}>\n Run\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={AppMode.Edit} className={style.radioButton}>\n Edit\n </Toolbar.Button>\n </ToggleGroup>\n\n <Editor.Separator className={style.separator} />\n\n <ToggleGroup value={[offsetMode]} onValueChange={toggleOffsetMode} className={style.group}>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Absolute} className={style.radioButton}>\n Absolute\n </Toolbar.Button>\n <Toolbar.Button render={<Toggle />} value={OffsetMode.Relative} className={style.radioButton}>\n Relative\n </Toolbar.Button>\n </ToggleGroup>\n </Toolbar.Root>\n );\n}\n","import { create } from 'zustand';\n\ntype EntryCopyStore = {\n entryCopyId: string | null;\n setEntryCopyId: (eventId: string | null) => void;\n};\n\nexport const useEntryCopy = create<EntryCopyStore>()((set) => ({\n entryCopyId: null,\n setEntryCopyId: (entryCopyId: string | null) => set({ entryCopyId }),\n}));\n","import { OntimeEvent, SupportedEntry } from 'ontime-types';\n\n/**\n * @description Creates a safe duplicate of an event\n * @param {OntimeEvent} event\n * @param {string} [after]\n * @return {OntimeEvent} clean event\n */\ntype ClonedEvent = Omit<OntimeEvent, 'id' | 'cue'>;\nexport const cloneEvent = (event: OntimeEvent): ClonedEvent => {\n return {\n type: SupportedEntry.Event,\n flag: event.flag,\n title: event.title,\n note: event.note,\n timeStart: event.timeStart,\n duration: event.duration,\n timeEnd: event.timeEnd,\n timerType: event.timerType,\n timeStrategy: event.timeStrategy,\n countToEnd: event.countToEnd,\n linkStart: event.linkStart,\n endAction: event.endAction,\n skip: event.skip,\n colour: event.colour,\n parent: event.parent,\n revision: 0,\n delay: event.delay, // the events will be collocated, so having the same metadata is a good start\n dayOffset: event.dayOffset,\n gap: 0,\n timeWarning: event.timeWarning,\n timeDanger: event.timeDanger,\n triggers: structuredClone(event.triggers),\n custom: structuredClone(event.custom),\n };\n};\n","import { memo } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { Toolbar } from '@base-ui-components/react/toolbar';\nimport { MaybeString, SupportedEntry } from 'ontime-types';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './QuickAddButtons.module.scss';\n\ninterface QuickAddButtonsProps {\n previousEventId: MaybeString;\n parentGroup: MaybeString;\n backgroundColor?: string;\n}\n\nexport default memo(QuickAddButtons);\nfunction QuickAddButtons({ previousEventId, parentGroup, backgroundColor }: QuickAddButtonsProps) {\n const { addEntry } = useEntryActions();\n\n const addEvent = () => {\n addEntry(\n {\n type: SupportedEntry.Event,\n parent: parentGroup,\n },\n {\n after: previousEventId,\n lastEventId: previousEventId,\n },\n );\n };\n\n const addDelay = () => {\n addEntry(\n { type: SupportedEntry.Delay, parent: parentGroup },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n const addMilestone = () => {\n addEntry(\n { type: SupportedEntry.Milestone, parent: parentGroup },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n const addGroup = () => {\n if (parentGroup !== null) {\n return;\n }\n addEntry(\n { type: SupportedEntry.Group },\n {\n lastEventId: previousEventId,\n after: previousEventId,\n },\n );\n };\n\n /**\n * If the colour is empty string ''\n * ie: we are inside a group, but there is no defined colour\n * we default to $gray-500 #9d9d9d\n */\n const groupColour = backgroundColor === '' ? '#9d9d9d' : backgroundColor;\n\n return (\n <Toolbar.Root\n className={cx([style.quickAdd, Boolean(parentGroup) && style.indent])}\n style={groupColour ? { '--user-bg': groupColour } : {}}\n data-testid='quick-add-buttons'\n >\n <Toolbar.Button render={<Button size='small' />} onClick={addEvent}>\n <IoAdd />\n Event\n </Toolbar.Button>\n\n <Toolbar.Button render={<Button size='small' />} onClick={addDelay}>\n <IoAdd />\n Delay\n </Toolbar.Button>\n\n <Toolbar.Button render={<Button size='small' />} onClick={addMilestone}>\n <IoAdd />\n Milestone\n </Toolbar.Button>\n\n {parentGroup === null && (\n <Toolbar.Button render={<Button size='small' />} onClick={addGroup}>\n <IoAdd />\n Group\n </Toolbar.Button>\n )}\n </Toolbar.Root>\n );\n}\n","import { memo } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { MaybeString, SupportedEntry } from 'ontime-types';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport { DropdownMenu } from '../../../../common/components/dropdown-menu/DropdownMenu';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\n\nimport style from './QuickAddInline.module.scss';\n\ninterface QuickAddInlineProps {\n referenceEntryId: MaybeString;\n parentGroup: MaybeString;\n placement: 'before' | 'after';\n}\n\nexport default memo(QuickAddInline);\nfunction QuickAddInline({ referenceEntryId, parentGroup, placement }: QuickAddInlineProps) {\n const { addEntry } = useEntryActions();\n\n const handleAddEntry = (type: SupportedEntry) => {\n if (placement === 'before') {\n addEntry(\n { type, parent: type !== SupportedEntry.Group ? parentGroup : null },\n {\n before: referenceEntryId,\n },\n );\n } else {\n addEntry(\n { type, parent: type !== SupportedEntry.Group ? parentGroup : null },\n {\n lastEventId: referenceEntryId,\n after: referenceEntryId,\n },\n );\n }\n };\n\n return (\n <div className={style.quickAdd} data-testid='quick-add-inline'>\n <DropdownMenu\n items={[\n { type: 'item', icon: IoAdd, label: 'Add Event', onClick: () => handleAddEntry(SupportedEntry.Event) },\n { type: 'item', icon: IoAdd, label: 'Add Delay', onClick: () => handleAddEntry(SupportedEntry.Delay) },\n {\n type: 'item',\n icon: IoAdd,\n label: 'Add Milestone',\n onClick: () => handleAddEntry(SupportedEntry.Milestone),\n },\n {\n type: 'item',\n icon: IoAdd,\n label: 'Add Group',\n onClick: () => handleAddEntry(SupportedEntry.Group),\n disabled: parentGroup !== null,\n },\n ]}\n render={<IconButton size='small' variant='primary' className={style.addButton} />}\n >\n <IoAdd />\n </DropdownMenu>\n </div>\n );\n}\n","import { MouseEvent } from 'react';\n\nimport { useContextMenuStore } from '../../features/rundown/rundown-context-menu/RundownContextMenu';\nimport { DropdownMenuOption } from '../components/dropdown-menu/DropdownMenu';\n\nexport const useContextMenu = <T extends HTMLElement>(options: DropdownMenuOption[]) => {\n const setContextMenu = useContextMenuStore((state) => state.setContextMenu);\n\n const localCreateContextMenu = (contextMenuEvent: MouseEvent<T, globalThis.MouseEvent>) => {\n // prevent browser default context menu from showing up\n contextMenuEvent.preventDefault();\n\n const { pageX, pageY } = contextMenuEvent;\n return setContextMenu({ x: pageX, y: pageY }, options);\n };\n\n return [localCreateContextMenu];\n};\n","import { useCallback, useRef } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TitleEditor.module.scss';\n\ninterface TitleEditorProps {\n title: string;\n entryId: string;\n placeholder: string;\n className?: string;\n}\n\nexport default function TitleEditor({ title, entryId, placeholder, className }: TitleEditorProps) {\n const { updateEntry } = useEntryActions();\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback(\n (text: string) => {\n if (text === title) {\n return;\n }\n\n const cleanVal = text.trim();\n updateEntry({ id: entryId, title: cleanVal });\n },\n [title, updateEntry, entryId],\n );\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(title, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n const classes = cx([className, style.eventTitle, !value ? style.noTitle : null]);\n\n return (\n <Input\n data-testid='entry__title'\n variant='ghosted'\n fluid\n ref={ref}\n value={value}\n className={classes}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import { MouseEvent, useRef } from 'react';\nimport {\n IoChevronDown,\n IoChevronUp,\n IoDuplicateOutline,\n IoFolderOpenOutline,\n IoReorderTwo,\n IoTrash,\n} from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EntryId, OntimeGroup } from 'ontime-types';\nimport { MILLIS_PER_MINUTE } from 'ontime-utils';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { formatDuration, formatTime } from '../../../common/utils/time';\nimport TitleEditor from '../common/TitleEditor';\nimport { canDrop } from '../rundown.utils';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownGroup.module.scss';\n\ninterface RundownGroupProps {\n data: OntimeGroup;\n hasCursor: boolean;\n collapsed: boolean;\n onCollapse: (collapsed: boolean, groupId: EntryId) => void;\n}\n\n//TODO: the group should maybe include a multiple day indicator\nexport default function RundownGroup({ data, hasCursor, collapsed, onCollapse }: RundownGroupProps) {\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const { clone, ungroup, deleteEntry } = useEntryActions();\n const { selectedEvents, setSingleEntrySelection } = useEventSelection();\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>([\n {\n type: 'item',\n label: 'Clone Group',\n icon: IoDuplicateOutline,\n onClick: () => clone(data.id),\n },\n {\n type: 'item',\n label: 'Ungroup',\n icon: IoFolderOpenOutline,\n onClick: () => ungroup(data.id),\n disabled: data.entries.length === 0,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete Group',\n icon: IoTrash,\n onClick: () => deleteEntry([data.id]),\n },\n ]);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n isOver,\n over,\n } = useSortable({\n id: data.id,\n data: {\n type: 'group',\n },\n animateLayoutChanges: () => false,\n });\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n setSingleEntrySelection({ id: data.id });\n };\n\n const binderColours = data.colour && getAccessibleColour(data.colour);\n const isValidDrop = isDragging && over?.id && canDrop(over.data.current?.type, over.data.current?.parent);\n\n const [planOffset, planOffsetLabel] = (() => {\n if (data.targetDuration === null) {\n return [null, null];\n }\n\n const offset = data.duration - data.targetDuration;\n if (offset === 0) {\n return [null, 'under'];\n }\n const absOffset = Math.abs(offset);\n return [\n `${offset < 0 ? '-' : '+'}${formatDuration(absOffset, absOffset > 2 * MILLIS_PER_MINUTE)}`,\n getOffsetState(offset),\n ];\n })();\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n cursor: isOver ? (isValidDrop ? 'grabbing' : 'no-drop') : 'inherit',\n };\n\n return (\n <div\n className={cx([style.group, hasCursor && style.hasCursor, !collapsed && style.expanded])}\n ref={setNodeRef}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n style={{\n ...dragStyle,\n '--user-bg': data.colour || '#929292',\n }}\n data-testid='rundown-group'\n >\n <div className={style.binder} style={{ ...binderColours }} tabIndex={-1}>\n <span\n className={cx([style.drag, isDragging && style.isDragging, isDragging && !isValidDrop && style.notAllowed])}\n ref={handleRef}\n {...dragAttributes}\n {...dragListeners}\n >\n <IoReorderTwo />\n </span>\n </div>\n <div className={style.header}>\n <div className={style.titleRow}>\n <TitleEditor title={data.title} entryId={data.id} placeholder='Group title' />\n <IconButton aria-label='Collapse' variant='subtle-white' onClick={() => onCollapse(!collapsed, data.id)}>\n {collapsed ? <IoChevronUp /> : <IoChevronDown />}\n </IconButton>\n </div>\n <div className={style.metaRow}>\n <div className={style.metaEntry}>\n <div>Start</div>\n <div>{formatTime(data.timeStart)}</div>\n </div>\n <div className={style.metaEntry}>\n <div>End</div>\n <div>{formatTime(data.timeEnd)}</div>\n </div>\n <div className={style.metaEntry}>\n <div>Duration</div>\n {planOffset === null ? (\n <div className={cx([planOffsetLabel !== null && style[planOffsetLabel]])}>\n {formatDuration(data.duration)}\n </div>\n ) : (\n <div>\n <span className={style.strike}>{formatDuration(data.duration)}</span>\n <span className={cx([planOffsetLabel !== null && style[planOffsetLabel]])}>{planOffset}</span>\n </div>\n )}\n </div>\n <div className={style.metaEntry}>\n <div>Entries</div>\n <div>{data.entries.length}</div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nimport style from './RundownGroupEnd.module.scss';\n\ninterface RundownGroupEndProps {\n id: string;\n colour?: string;\n}\n\nexport default function RundownGroupEnd({ id, colour }: RundownGroupEndProps) {\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n } = useSortable({\n id,\n data: {\n type: 'end-group',\n },\n animateLayoutChanges: () => false,\n disabled: true, // we do not want to drag end groups\n });\n\n const dragStyle = {\n transform: CSS.Transform.toString(transform),\n transition,\n };\n\n return (\n <div\n className={style.groupEnd}\n ref={setNodeRef}\n {...dragAttributes}\n {...dragListeners}\n style={{\n ...dragStyle,\n ...(colour ? { '--user-bg': colour } : {}),\n }}\n tabIndex={-1}\n />\n );\n}\n","import { IoAdd } from 'react-icons/io5';\nimport { SupportedEntry } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport * as Editor from '../../common/components/editor-utils/EditorUtils';\nimport Empty from '../../common/components/state/Empty';\n\nimport style from './Empty.module.scss';\n\ninterface RundownEmptyProps {\n handleAddNew: (type: SupportedEntry) => void;\n}\n\nexport default function RundownEmpty(props: RundownEmptyProps) {\n const { handleAddNew } = props;\n\n return (\n <div className={style.empty}>\n <Empty injectedStyles={{ marginTop: '5vh', marginBottom: '3rem' }} />\n <div className={style.inline}>\n <Button onClick={() => handleAddNew(SupportedEntry.Event)} variant='primary' size='large'>\n <IoAdd />\n Create Event\n </Button>\n\n <Editor.Separator />\n\n <Button onClick={() => handleAddNew(SupportedEntry.Group)} variant='primary' size='large'>\n <IoAdd /> Create Group\n </Button>\n </div>\n </div>\n );\n}\n","import { Fragment, lazy, useCallback, useEffect, useRef, useState } from 'react';\nimport { TbFlagFilled } from 'react-icons/tb';\nimport {\n closestCenter,\n DndContext,\n DragEndEvent,\n DragOverEvent,\n DragStartEvent,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { useHotkeys, useSessionStorage } from '@mantine/hooks';\nimport {\n type EntryId,\n type MaybeString,\n type Rundown,\n isOntimeEvent,\n isOntimeGroup,\n OntimeEntry,\n Playback,\n SupportedEntry,\n} from 'ontime-types';\nimport {\n getFirstNormal,\n getLastNormal,\n getNextGroupNormal,\n getNextNormal,\n getPreviousGroupNormal,\n getPreviousNormal,\n reorderArray,\n} from 'ontime-utils';\n\nimport { useEntryActions } from '../../common/hooks/useEntryAction';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useRundownEditor } from '../../common/hooks/useSocket';\nimport { useEntryCopy } from '../../common/stores/entryCopyStore';\nimport { cloneEvent } from '../../common/utils/clone';\nimport { lastMetadataKey, RundownMetadataObject } from '../../common/utils/rundownMetadata';\nimport { AppMode, sessionKeys } from '../../ontimeConfig';\n\nimport QuickAddButtons from './entry-editor/quick-add-buttons/QuickAddButtons';\nimport QuickAddInline from './entry-editor/quick-add-cursor/QuickAddInline';\nimport RundownGroup from './rundown-group/RundownGroup';\nimport RundownGroupEnd from './rundown-group/RundownGroupEnd';\nimport { canDrop, makeSortableList } from './rundown.utils';\nimport RundownEmpty from './RundownEmpty';\nimport { useEventSelection } from './useEventSelection';\n\nimport style from './Rundown.module.scss';\n\nconst RundownEntry = lazy(() => import('./RundownEntry'));\n\ninterface RundownProps {\n data: Rundown;\n rundownMetadata: RundownMetadataObject;\n}\n\nexport default function Rundown({ data, rundownMetadata }: RundownProps) {\n const { order, entries, id } = data;\n // we create a copy of the rundown with a data structured aligned with what dnd-kit needs\n const featureData = useRundownEditor();\n const [sortableData, setSortableData] = useState<EntryId[]>(() => makeSortableList(order, entries));\n const [metadata, setMetadata] = useState(rundownMetadata);\n const [collapsedGroups, setCollapsedGroups] = useSessionStorage<EntryId[]>({\n // we ensure that this is unique to the rundown\n key: `rundown.${id}-editor-collapsed-groups`,\n defaultValue: [],\n });\n\n const { addEntry, deleteEntry, move, reorderEntry } = useEntryActions();\n\n const { entryCopyId, setEntryCopyId } = useEntryCopy();\n\n // cursor\n const [editorMode] = useSessionStorage<AppMode>({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n const { clearSelectedEvents, setSelectedEvents, cursor } = useEventSelection();\n\n const cursorRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n useFollowComponent({\n followRef: cursorRef,\n scrollRef,\n doFollow: true,\n followTrigger: editorMode === AppMode.Edit ? cursor : featureData?.selectedEventId,\n });\n\n // DND KIT\n const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 10 } }));\n\n const deleteAtCursor = useCallback(\n (cursor: string | null) => {\n if (!cursor) return;\n const { entry, index } = getPreviousNormal(entries, order, cursor);\n deleteEntry([cursor]);\n if (entry && index !== null) {\n setSelectedEvents({ id: entry.id, selectMode: 'click', index });\n }\n },\n [entries, order, deleteEntry, setSelectedEvents],\n );\n\n const insertCopyAtId = useCallback(\n (atId: string | null, copyId: string | null, above = false) => {\n const adjustedCursor = above ? getPreviousNormal(entries, order, atId ?? '').entry?.id ?? null : atId;\n if (copyId === null) {\n // we cant clone without selection\n return;\n }\n const cloneEntry = entries[copyId];\n if (cloneEntry?.type === SupportedEntry.Event) {\n //if we don't have a cursor add the new event on top\n const newEvent = cloneEvent(cloneEntry);\n addEntry(newEvent, { after: adjustedCursor ?? undefined });\n }\n },\n [addEntry, order, entries],\n );\n\n /**\n * Add a new item referring to an existing one\n */\n const insertAtId = useCallback(\n (patch: Partial<OntimeEntry> & { type: SupportedEntry }, id: MaybeString, above = false) => {\n addEntry(patch, {\n after: id && !above ? id : undefined,\n before: id && above ? id : undefined,\n lastEventId: !above && id ? id : undefined,\n });\n },\n [addEntry],\n );\n\n const selectGroup = useCallback(\n (cursor: string | null, direction: 'up' | 'down') => {\n if (order.length < 1) {\n return;\n }\n let newCursor = cursor;\n if (cursor === null) {\n // there is no cursor, we select the first or last depending on direction\n const selected = direction === 'up' ? getLastNormal(entries, order) : getFirstNormal(entries, order);\n\n if (isOntimeGroup(selected)) {\n setSelectedEvents({ id: selected.id, selectMode: 'click', index: direction === 'up' ? order.length : 0 });\n return;\n }\n newCursor = selected?.id ?? null;\n }\n\n if (newCursor === null) {\n return;\n }\n\n // otherwise we select the next or previous\n const selected =\n direction === 'up'\n ? getPreviousGroupNormal(entries, order, newCursor)\n : getNextGroupNormal(entries, order, newCursor);\n\n if (selected.entry !== null && selected.index !== null) {\n setSelectedEvents({ id: selected.entry.id, selectMode: 'click', index: selected.index });\n }\n },\n [order, entries, setSelectedEvents],\n );\n\n const selectEntry = useCallback(\n (cursor: string | null, direction: 'up' | 'down') => {\n if (order.length < 1) {\n return;\n }\n\n if (cursor === null) {\n // there is no cursor, we select the first or last depending on direction if it exists\n const selected = direction === 'up' ? getLastNormal(entries, order) : getFirstNormal(entries, order);\n if (selected !== null) {\n setSelectedEvents({ id: selected.id, selectMode: 'click', index: direction === 'up' ? order.length : 0 });\n }\n return;\n }\n\n // otherwise we select the next or previous\n const selected =\n direction === 'up' ? getPreviousNormal(entries, order, cursor) : getNextNormal(entries, order, cursor);\n\n if (selected.entry !== null && selected.index !== null) {\n setSelectedEvents({ id: selected.entry.id, selectMode: 'click', index: selected.index });\n }\n },\n [order, entries, setSelectedEvents],\n );\n\n /**\n * Checks whether a group is collapsed\n */\n const getIsCollapsed = useCallback(\n (groupId: EntryId): boolean => {\n return Boolean(collapsedGroups.find((id) => id === groupId));\n },\n [collapsedGroups],\n );\n\n /**\n * Handles logic for collapsing groups\n */\n const handleCollapseGroup = useCallback(\n (collapsed: boolean, groupId: EntryId) => {\n setCollapsedGroups((prev) => {\n const isCollapsed = getIsCollapsed(groupId);\n if (collapsed && !isCollapsed) {\n const newSet = new Set(prev).add(groupId);\n return [...newSet];\n }\n if (!collapsed && isCollapsed) {\n return [...prev].filter((id) => id !== groupId);\n }\n return prev;\n });\n },\n [getIsCollapsed, setCollapsedGroups],\n );\n\n const moveEntry = useCallback(\n async (cursor: EntryId | null, direction: 'up' | 'down') => {\n if (cursor == null) {\n return;\n }\n\n const movedIntoGroupId = await move(cursor, direction);\n // if we are moving into a group, we need to make sure it is expanded\n if (movedIntoGroupId) {\n handleCollapseGroup(false, movedIntoGroupId);\n }\n },\n [handleCollapseGroup, move],\n );\n\n // shortcuts\n useHotkeys([\n ['alt + ArrowDown', () => selectEntry(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + ArrowUp', () => selectEntry(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['alt + shift + ArrowDown', () => selectGroup(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + shift + ArrowUp', () => selectGroup(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['alt + mod + ArrowDown', () => moveEntry(cursor, 'down'), { preventDefault: true, usePhysicalKeys: true }],\n ['alt + mod + ArrowUp', () => moveEntry(cursor, 'up'), { preventDefault: true, usePhysicalKeys: true }],\n\n ['Escape', () => clearSelectedEvents(), { preventDefault: true, usePhysicalKeys: true }],\n\n ['mod + Backspace', () => deleteAtCursor(cursor), { preventDefault: true, usePhysicalKeys: true }],\n\n [\n 'alt + E',\n () => insertAtId({ type: SupportedEntry.Event }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + E',\n () => insertAtId({ type: SupportedEntry.Event }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + G',\n () => insertAtId({ type: SupportedEntry.Group }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + G',\n () => insertAtId({ type: SupportedEntry.Group }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + D',\n () => insertAtId({ type: SupportedEntry.Delay }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + D',\n () => insertAtId({ type: SupportedEntry.Delay }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n [\n 'alt + M',\n () => insertAtId({ type: SupportedEntry.Milestone }, cursor),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n [\n 'alt + shift + M',\n () => insertAtId({ type: SupportedEntry.Milestone }, cursor, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n ['mod + C', () => setEntryCopyId(cursor)],\n ['mod + V', () => insertCopyAtId(cursor, entryCopyId)],\n [\n 'mod + shift + V',\n () => insertCopyAtId(cursor, entryCopyId, true),\n { preventDefault: true, usePhysicalKeys: true },\n ],\n\n ['alt + backspace', () => deleteAtCursor(cursor), { preventDefault: true, usePhysicalKeys: true }],\n ]);\n\n // we copy the state from the store here\n // to workaround async updates on the drag mutations\n useEffect(() => {\n setSortableData(makeSortableList(order, entries));\n setMetadata(rundownMetadata);\n }, [order, entries, rundownMetadata]);\n\n // in run mode, we follow the playback selection and open groups as needed\n useEffect(() => {\n if (editorMode !== AppMode.Run || !featureData?.selectedEventId) {\n return;\n }\n const index = order.findIndex((id) => id === featureData.selectedEventId);\n // @ts-expect-error -- but we safely check if the parent property exists\n const maybeParent = entries[featureData.selectedEventId]?.parent;\n if (maybeParent) {\n // open the group\n setCollapsedGroups((prev) => [...prev].filter((id) => id !== maybeParent));\n }\n\n setSelectedEvents({ id: featureData.selectedEventId, selectMode: 'click', index });\n }, [editorMode, entries, featureData.selectedEventId, order, setCollapsedGroups, setSelectedEvents]);\n\n /**\n * On drag end, we reorder the events\n */\n const handleOnDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over?.id || active.id === over.id) {\n return;\n }\n\n if (!active.data.current || !over.data.current) {\n return;\n }\n\n const fromIndex: number = active.data.current.sortable.index;\n const toIndex: number = over.data.current.sortable.index;\n let placement: 'before' | 'after' | 'insert' = fromIndex < toIndex ? 'after' : 'before';\n\n let destinationId = over.id as EntryId;\n const isDraggingGroup = active.data.current?.type === SupportedEntry.Group;\n\n // prevent dropping a group inside another\n if (\n isDraggingGroup &&\n !canDrop(over.data.current.type, over.data.current.parent, placement, getIsCollapsed(destinationId))\n ) {\n return;\n }\n\n /**\n * We need to specially handle the end-group\n * Dragging before a end-group will add the entry to the end of the group\n * Dragging after a end-group will add the event after the group itself\n * Dragging to the top of a group either place before first entry or if no entries do insert\n */\n if (destinationId.startsWith('end-')) {\n destinationId = destinationId.replace('end-', '');\n // if we are moving before the end, we use the insert operation\n if (placement === 'before') {\n placement = 'insert';\n }\n } else {\n const group = data.entries[destinationId];\n // if dragging into a group\n if (isOntimeGroup(group) && placement === 'after') {\n if (isDraggingGroup) {\n // ... and the dragged entry is a group, we know that the group is collapsed, because of the safe check canDrop from before\n // so we can safely push the dragged event after the group\n destinationId = group.id;\n } else if (group.entries.length === 0) {\n // ... and the group is entry, we insert\n destinationId = group.id;\n placement = 'insert';\n } else {\n // otherwise we add it to before the first group child\n destinationId = group.entries[0];\n placement = 'before';\n }\n }\n }\n\n // keep copy of the current state in case we need to revert\n const currentEntries = structuredClone(sortableData);\n // we keep a copy of the state as a hack to handle inconsistencies between dnd-kit and async store updates\n setSortableData((currentEntries) => {\n return reorderArray(currentEntries, fromIndex, toIndex);\n });\n reorderEntry(active.id as EntryId, destinationId, placement).catch((_) => {\n setSortableData(currentEntries);\n });\n };\n\n /**\n * When we drag a group, we force collapse it\n * This avoids strange scenarios like dropping a group inside itself\n */\n const collapseDraggedGroups = (event: DragStartEvent) => {\n const isGroup = event.active.data.current?.type === SupportedEntry.Group;\n if (isGroup) {\n handleCollapseGroup(true, event.active.id as EntryId);\n }\n };\n\n /**\n * When we drag over a group, we expand it if it is collapsed\n */\n const expandOverGroup = (event: DragOverEvent) => {\n // if we are dragging a group, the drop operation is invalid so we dont expand\n if (event.active.data.current?.type === 'group') {\n return;\n }\n if (event.over?.data.current?.type !== 'group') {\n return;\n }\n const groupId = event.over?.id as EntryId;\n const isCollapsed = getIsCollapsed(groupId);\n if (isCollapsed) {\n handleCollapseGroup(false, groupId);\n }\n };\n\n if (sortableData.length < 1) {\n return <RundownEmpty handleAddNew={(type: SupportedEntry) => addEntry({ type })} />;\n }\n\n // 1. gather presentation options\n const isEditMode = editorMode === AppMode.Edit;\n\n return (\n <div className={style.rundownContainer} ref={scrollRef} data-testid='rundown'>\n <DndContext\n onDragEnd={handleOnDragEnd}\n onDragStart={collapseDraggedGroups}\n onDragOver={expandOverGroup}\n sensors={sensors}\n collisionDetection={closestCenter}\n >\n <SortableContext items={sortableData} strategy={verticalListSortingStrategy}>\n <div className={style.list}>\n {isEditMode && <QuickAddButtons previousEventId={null} parentGroup={null} />}\n {sortableData.map((entryId, index) => {\n // the entry might be a pseudo end-group which does not generate metadata and should not be processed\n if (entryId.startsWith('end-')) {\n const parentId = entryId.split('end-')[1];\n const isGroupCollapsed = getIsCollapsed(parentId);\n const parentMetadata = metadata[parentId];\n\n if (isGroupCollapsed) {\n return null;\n }\n\n // if the previous element is selected, it will have its own QuickAddInline\n // we use thisId instead of previousEntryId because the end-group does not process\n // and it does not cause the reassignment of the iteration id to the previous entry\n return (\n <Fragment key={entryId}>\n {isEditMode && parentMetadata?.groupEntries === 0 && (\n <QuickAddButtons\n previousEventId={null}\n parentGroup={parentId}\n backgroundColor={parentMetadata?.groupColour}\n />\n )}\n <RundownGroupEnd key={entryId} id={entryId} colour={parentMetadata?.groupColour} />\n </Fragment>\n );\n }\n\n // we iterate through a stateful copy of order to make the dnd operations smoother\n // this means that this can be out of sync with order until the useEffect runs\n // instead of writing all the logic guards, we simply short circuit rendering here\n const entry = entries[entryId];\n const entryMetadata = metadata[entryId];\n if (!entry || !entryMetadata) return null;\n\n // if the entry has a parent, and it is collapsed, render nothing\n if (\n entry.type !== SupportedEntry.Group &&\n entryMetadata.groupId !== null &&\n getIsCollapsed(entryMetadata.groupId)\n ) {\n return null;\n }\n\n const isNext = featureData?.nextEventId === entry.id;\n const hasCursor = entry.id === cursor;\n\n /**\n * Outside a group, the value will be undefined\n * If the colour is empty string ''\n * ie: we are inside a group, but there is no defined colour\n * we default to $gray-500 #9d9d9d\n */\n const groupColour = entryMetadata.groupColour === '' ? '#9d9d9d' : entryMetadata.groupColour;\n\n const isFirst = index === 0;\n const isLast = entryId === order.at(-1);\n\n /**\n * We need to provide the parent ID for the QuickAdd components\n * This should be different depending on whether we are adding before or after an element\n * - when adding before, we need to avoid a group referencing itself as the parent\n * - when adding after, we can use the group ID directly to insert at the top of the group\n */\n\n const parentIdForBefore = entryMetadata.thisId !== entryMetadata.groupId ? entryMetadata.groupId : null;\n const parentIdForAfter = entryMetadata.groupId;\n\n return (\n <Fragment key={entry.id}>\n {/**\n * Before the entry\n * - edit mode only\n * - if there is a cursor\n * - if it is not the first entry (the buttons would be there)\n */}\n {isEditMode && hasCursor && !isFirst && (\n <QuickAddInline placement='before' referenceEntryId={entry.id} parentGroup={parentIdForBefore} />\n )}\n {isOntimeGroup(entry) ? (\n <RundownGroup\n data={entry}\n hasCursor={hasCursor}\n collapsed={getIsCollapsed(entry.id)}\n onCollapse={handleCollapseGroup}\n />\n ) : (\n <div\n className={style.entryWrapper}\n data-testid={`entry-${entryMetadata.eventIndex}`}\n style={groupColour ? { '--user-bg': groupColour } : {}}\n >\n {isOntimeEvent(entry) && (\n <div className={style.entryIndex}>\n {entry.flag && <TbFlagFilled className={style.flag} />}\n <div className={style.index}>{entryMetadata.eventIndex}</div>\n </div>\n )}\n <div className={style.entry} key={entry.id} ref={hasCursor ? cursorRef : undefined}>\n <RundownEntry\n type={entry.type}\n isPast={entryMetadata.isPast}\n eventIndex={entryMetadata.eventIndex}\n data={entry}\n loaded={entryMetadata.isLoaded}\n hasCursor={hasCursor}\n isNext={isNext}\n isNextDay={entryMetadata.isNextDay}\n playback={entryMetadata.isLoaded ? featureData.playback : undefined}\n isRolling={featureData.playback === Playback.Roll}\n totalGap={entryMetadata.totalGap}\n isLinkedToLoaded={entryMetadata.isLinkedToLoaded}\n />\n </div>\n </div>\n )}\n {/**\n * After the entry\n * - edit mode only\n * - if there is a cursor\n * - if it is not the last entry (the buttons would be there)\n * - if the entry is not the group header\n */}\n {isEditMode && hasCursor && !isLast && (\n <QuickAddInline placement='after' referenceEntryId={entry.id} parentGroup={parentIdForAfter} />\n )}\n </Fragment>\n );\n })}\n {isEditMode && (\n <QuickAddButtons\n previousEventId={metadata[lastMetadataKey]?.groupId ?? metadata[lastMetadataKey].thisId}\n parentGroup={null}\n />\n )}\n <div className={style.spacer} />\n </div>\n </SortableContext>\n </DndContext>\n </div>\n );\n}\n","import Empty from '../../common/components/state/Empty';\nimport { useRundownWithMetadata } from '../../common/hooks-query/useRundown';\n\nimport RundownHeader from './rundown-header/RundownHeader';\nimport RundownHeaderMobile from './rundown-header/RundownHeaderMobile';\nimport Rundown from './Rundown';\n\nimport styles from './Rundown.module.scss';\n\ninterface RundownWrapperProps {\n isSmallDevice?: boolean;\n}\n\nexport default function RundownWrapper({ isSmallDevice }: RundownWrapperProps) {\n const { data, status, rundownMetadata } = useRundownWithMetadata();\n\n return (\n <div className={styles.rundownWrapper}>\n {isSmallDevice ? <RundownHeaderMobile /> : <RundownHeader />}\n {status === 'success' && data && rundownMetadata ? (\n <Rundown data={data} rundownMetadata={rundownMetadata} />\n ) : (\n <Empty text='Connecting to server' />\n )}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { useSessionStorage } from '@mantine/hooks';\n\nimport { Corner } from '../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../common/components/protect-route/ProtectRoute';\nimport { useIsSmallDevice } from '../../common/hooks/useIsSmallDevice';\nimport { handleLinks } from '../../common/utils/linkUtils';\nimport { cx } from '../../common/utils/styleUtils';\nimport { AppMode, sessionKeys } from '../../ontimeConfig';\n\nimport RundownEntryEditor from './entry-editor/RundownEntryEditor';\nimport FinderPlacement from './placements/FinderPlacement';\nimport { RundownContextMenu } from './rundown-context-menu/RundownContextMenu';\nimport RundownWrapper from './RundownWrapper';\n\nimport style from './RundownExport.module.scss';\n\nexport default memo(RundownExport);\n\nfunction RundownExport() {\n const isExtracted = window.location.pathname.includes('/rundown');\n const [editorMode] = useSessionStorage({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\n const isSmallDevice = useIsSmallDevice();\n\n if (isSmallDevice && isExtracted) {\n return (\n <ProtectRoute permission='editor'>\n <div\n className={cx([style.rundownExport, style.extracted])}\n data-target='small-device'\n data-testid='panel-rundown'\n >\n <FinderPlacement />\n <ViewNavigationMenu suppressSettings />\n <div className={style.rundown}>\n <ErrorBoundary>\n <RundownContextMenu>\n <RundownWrapper isSmallDevice />\n </RundownContextMenu>\n </ErrorBoundary>\n </div>\n </div>\n </ProtectRoute>\n );\n }\n\n const hideSideBar = isExtracted && editorMode === 'run';\n\n return (\n <ProtectRoute permission='editor'>\n <div className={cx([style.rundownExport, isExtracted && style.extracted])} data-testid='panel-rundown'>\n <FinderPlacement />\n {isExtracted && <ViewNavigationMenu suppressSettings />}\n <div className={style.rundown}>\n <div className={style.list}>\n <ErrorBoundary>\n {!isExtracted && <Corner onClick={(event) => handleLinks('rundown', event)} />}\n <RundownContextMenu>\n <RundownWrapper />\n </RundownContextMenu>\n </ErrorBoundary>\n </div>\n {!hideSideBar && (\n <div className={style.side}>\n <ErrorBoundary>\n <RundownEntryEditor />\n </ErrorBoundary>\n </div>\n )}\n </div>\n </div>\n </ProtectRoute>\n );\n}\n"],"file":"assets/RundownExport-C6YhMGOC.js"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as w,j as t,aw 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-CCiSQ9k9.js";import{C as ot}from"./EditorUtils-Da5ALK1P.js";import{b as n,a as N,i as M,H as it,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,bw as pt}from"./index-BQEUaoAf.js";import{P as _t}from"./ProtectRoute-CrcWfOlG.js";import{T as z,A as bt}from"./TimeInput-Dg1naiy3.js";import{p as L}from"./parseUserTime-BeTKj08M.js";import{T as R}from"./Tooltip-D9XRnwOW.js";import{u as ht}from"./useReport-B4dMYcNL.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]="433bb1cb-2fe3-4ba7-b99b-e94a3d0f8d76",e._sentryDebugIdIdentifier="sentry-dbid-433bb1cb-2fe3-4ba7-b99b-e94a3d0f8d76")}catch{}})();function yt(e,s){return{start:e!==n.Stop&&e!==n.Play,pause:e===n.Play,roll:e!==n.Roll&&s!==N.Overtime,stop:e!==n.Stop,reload:e!==n.Stop&&e!==n.Roll}}const jt="_blink_yewzx_1",ft="_fourtyfive_yewzx_13",vt="_tapButton_yewzx_17",gt="_neutral_yewzx_29",Ct="_active_yewzx_51",kt="_play_yewzx_66",Tt="_roll_yewzx_93",Nt="_pause_yewzx_120",wt="_ontime_yewzx_147",It="_stop_yewzx_174",Pt="_square_yewzx_201",St="_tight_yewzx_206",At="_fill_yewzx_211",f={blink:jt,fourtyfive:ft,tapButton:vt,neutral:gt,active:Ct,play:kt,roll:Tt,pause:Nt,ontime:wt,stop:It,square:Pt,tight:St,fill:At},r=w.forwardRef((e,s)=>{const{children:a,disabled:o,onClick:l,theme:i="neutral",aspect:m="normal",active:u,className:x}=e;return t.jsx("button",{className:M([f.tapButton,x,f[i],f[m],u&&f.active]),disabled:o,type:"button",onClick:l,ref:s,children:a})});r.displayName="TabButton";const Rt="_addTime_18oax_17",Bt="_addButtons_18oax_24",Dt="_tallButtons_18oax_30",v={addTime:Rt,addButtons:Bt,tallButtons:Dt};function $t(e){const{playback:s}=e,[a,o]=W({key:"add-time",defaultValue:3e5}),l=(x,C)=>{const _=L(C);o(Math.min(_,it))},i=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:()=>i("remove"),disabled:u,className:v.tallButtons,children:t.jsx(Y,{})}),t.jsx(r,{onClick:()=>i("add"),disabled:u,className:v.tallButtons,children:t.jsx(Z,{})})]})]})}const qt="_label_u5jlo_17",Et="_controls_u5jlo_24",Mt="_input_u5jlo_28",zt="_twoSides_u5jlo_34",Lt="_fakeInput_u5jlo_42",y={label:qt,controls:Et,input:Mt,twoSides:zt,fakeInput:Lt};function k({index:e}){const{playback:s,direction:a}=lt(e),{stop:o,setDirection:l}=I,i=()=>{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(Ft,{index:e,isActive:m}),t.jsxs(r,{onClick:i,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(Ot,{index:e,action:u}),t.jsx(r,{onClick:()=>o(e),theme:n.Stop,disabled:!m,children:t.jsx($,{"data-testid":`aux-timer-stop-${e}`})})]})]})]})}function Ft({index:e,isActive:s}){const a=rt(e),{setDuration:o}=I,l=(i,m)=>{const u=L(m);o(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 Ot({index:e,action:s}){const{start:a,pause:o}=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:()=>o(e),theme:n.Pause,children:t.jsx(E,{"data-testid":`aux-timer-pause-${e}`})})}const Ut="_buttonContainer_1mqxq_17",Ht="_go_1mqxq_25",Xt="_playbackContainer_1mqxq_30",Gt="_transportContainer_1mqxq_37",Vt="_extra_1mqxq_44",Jt="_invertX_1mqxq_51",p={buttonContainer:Ut,go:Ht,playbackContainer:Xt,transportContainer:Gt,extra:Vt,invertX:Jt};function Kt(e){const{playback:s,numEvents:a,selectedEventIndex:o,timerPhase:l}=e,i=s===n.Roll,m=s===n.Play,u=s===n.Pause,x=s===n.Armed,C=o===0,_=o===a-1,j=a===0,F=i||j,O=i||j||_,U=i||j||C,b=yt(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"]:o===null?[c.startNext,"Start"]:[c.startNext,"Next"],[x,_,o]);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:i,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 Qt="_timer_1f17d_21",Wt="_finished_1f17d_33",Yt="_muted_1f17d_36",T={timer:Qt,finished:Wt,muted:Yt};function Zt(e){const{time:s}=e,a=(s??0)<0,o=s==null?S:g(s,{fallback:S}).replace("-",""),l=M([T.timer,a?T.finished:null,s===null&&T.muted]);return t.jsx("div",{className:l,children:o})}const te="_timeContainer_g12ye_17",ee="_indicators_g12ye_25",se="_indicatorRoll_g12ye_34",ae="_indicatorDelay_g12ye_35",ne="_indicatorNegative_g12ye_36",oe="_status_g12ye_65",ie="_tag_g12ye_73",le="_time_g12ye_17",re="_rolltag_g12ye_84",d={timeContainer:te,indicators:ee,indicatorRoll:se,indicatorDelay:ae,indicatorNegative:ne,status:oe,tag:ie,time:le,rolltag:re};function ce(e){return e>0?`Added ${A(e,!1)}`:e<0?`Removed ${A(Math.abs(e),!1)}`:""}function de({children:e}){const s=ct(),a=s.playback===n.Roll,o=s.phase===N.Pending,l=s.phase===N.Overtime,i=!!s.addedTime,m=a?"Roll mode active":"",u=ce(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":i})]}),t.jsx(Zt,{time:o?s.secondaryTimer:s.current}),t.jsx("div",{className:d.status,children:o?t.jsx("span",{className:d.rolltag,children:"Roll: Countdown to start"}):t.jsx(me,{startedAt:s.startedAt,expectedFinish:s.expectedFinish,playback:s.playback})}),e]})}function me({startedAt:e,expectedFinish:s,playback:a}){if(a===n.Stop)return t.jsx(ue,{});const o=g(e),l=s!==null?s%dt:null,i=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:o})]}),t.jsxs("span",{className:d.finish,children:[t.jsx("span",{className:d.tag,children:"Expect end"}),t.jsx("span",{className:d.time,children:i})]})]})}function ue(){const{data:e}=ht();return Object.keys(e).length>0?t.jsx(bt,{search:"settings=sharing__report",children:"Go to report management"}):null}const xe="_mainContainer_1qlxm_17",pe="_auxTimers_1qlxm_22",D={mainContainer:xe,auxTimers:pe};function _e(){const e=mt();return t.jsxs("div",{className:D.mainContainer,children:[t.jsx(de,{children:t.jsx($t,{playback:e.playback})}),t.jsx(Kt,{playback:e.playback,numEvents:e.numEvents,selectedEventIndex:e.selectedEventIndex,timerPhase:e.timerPhase}),t.jsxs("div",{className:D.auxTimers,children:[t.jsx(k,{index:1}),t.jsx(k,{index:2}),t.jsx(k,{index:3})]})]})}const Ne=w.memo(be);function be(){const e=window.location.pathname.includes("/timercontrol");return t.jsx(_t,{permission:"editor",children:t.jsxs("div",{className:B.playback,"data-testid":"panel-timer-control",children:[!e&&t.jsx(ot,{onClick:s=>ut("timercontrol",s)}),e&&t.jsx(xt,{suppressSettings:!0}),t.jsx("div",{className:B.content,children:t.jsx(pt,{children:t.jsx(_e,{})})})]})})}export{Ne as default};
|
|
2
|
-
//# sourceMappingURL=TimerControlExport-C8ECtLBd.js.map
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
� dZN���rts�����d�aɜ-_^XY��EY#'���j�n�]���i|xA,�,��=�p!�Q<��O2CV `����
|
|
2
|
-
���;��A��86�ǟ���5e�hl'��~L���Gz%.�n~1�(���*�W��@�������w� ���v�%j��5�R����C�?�P��7 Ca��
|
|
3
|
-
�E� ��c2�x��0��f�����{�H����=G�ލ�Ki�ꍼ�'�L���2��b>������^\�����j�
|
|
4
|
-
E+� �XS��W�����.���2)��Q��;���>�H�L��A˰�B�:�়�� �},�زy�וy�(O)�+s��M���S��y�uF�f*�Ϩ��/?� >(|&7
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|