@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MilestoneEditor-Bge8xLrV.js","sources":["../../../../packages/types/src/definitions/core/TimerLifecycle.type.ts","../../../../packages/utils/src/cue-utils/cueUtils.ts","../../src/features/rundown/entry-editor/composite/EventEditorImage.tsx","../../src/common/components/input/auto-textarea/AutoTextarea.tsx","../../src/common/components/input/text-input/useReactiveTextInput.tsx","../../src/features/rundown/entry-editor/composite/EventTextArea.tsx","../../src/features/rundown/entry-editor/composite/EventTextInput.tsx","../../src/features/rundown/entry-editor/composite/EventEditorCustomFields.tsx","../../src/features/rundown/time-input-flow/TimeInputGroup.tsx","../../src/features/rundown/time-input-flow/TimeInputFlow.tsx","../../src/features/rundown/entry-editor/composite/EventEditorTimes.tsx","../../src/features/rundown/entry-editor/composite/EventEditorTitles.tsx","../../src/features/rundown/entry-editor/composite/eventTrigger.constants.ts","../../src/features/rundown/entry-editor/composite/EventEditorTriggers.tsx","../../src/features/rundown/entry-editor/EventEditor.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput.tsx","../../src/common/components/input/time-input/NullableTimeInput.tsx","../../src/features/rundown/entry-editor/composite/TargetDurationInput.tsx","../../src/features/rundown/entry-editor/GroupEditor.tsx","../../src/features/rundown/entry-editor/MilestoneEditor.tsx"],"sourcesContent":["export enum TimerLifeCycle {\n onLoad = 'onLoad',\n onStart = 'onStart',\n onPause = 'onPause',\n onStop = 'onStop',\n onClock = 'onClock',\n onUpdate = 'onUpdate',\n onFinish = 'onFinish',\n onWarning = 'onWarning',\n onDanger = 'onDanger',\n}\n\nexport type TimerLifeCycleKey = keyof typeof TimerLifeCycle;\n\nexport const timerLifecycleValues = Object.keys(TimerLifeCycle);\n","import type { EntryId, OntimeEntry, RundownEntries } from 'ontime-types';\nimport { isOntimeEvent } from 'ontime-types';\n\nimport { getFirstEventNormal, getNextEventNormal, getPreviousEventNormal } from '../rundown-utils/rundownUtils.js';\nimport { isNumeric } from '../types/types.js';\n\n// Zero or more non-digit characters at the beginning ((\\D*)).\n// One or more digits ((\\d+)).\n// Optionally, a decimal part starting with a dot ((\\.\\d+)?).\nconst regex = /^(\\D*)(\\d+)(\\.\\d+)?$/;\n\n/**\n * Finds if last characters in input are a number and increments\n */\nexport function getIncrement(input: string): string {\n // Check if the input string contains a number at the end\n const match = regex.exec(input);\n if (match) {\n // If a number is found, extract the non-numeric prefix, integer part, and decimal part\n // eslint-disable-next-line prefer-const -- some items in the destructuring are modified\n let [, prefix, integerPart, decimalPart] = match;\n\n if (decimalPart) {\n if (decimalPart === '.99') {\n decimalPart = '.100';\n } else {\n const addDecimal = `${'0'.repeat(decimalPart.length - 2)}1`;\n const incrementedDecimal = (Number(decimalPart) + Number(`0.${addDecimal}`)).toFixed(decimalPart.length - 1);\n decimalPart = incrementedDecimal.toString().replace('0.', '.');\n }\n return `${prefix}${integerPart}${decimalPart}`;\n }\n const incrementedInteger = Number(integerPart) + 1;\n integerPart = incrementedInteger.toString();\n return `${prefix}${integerPart}`;\n }\n // If no number is found, append \"2\" to the string and return the updated string\n return `${input}2`;\n}\n\n/**\n * Gets suitable name for a new event cue\n */\nexport function getCueCandidate(entries: RundownEntries, order: EntryId[], insertAfterId: EntryId | null): string {\n // we did not provide a element to go after, we attempt to go first so only need to check for a cue with value 1\n if (insertAfterId === null || order.length === 0) {\n return addAtTop();\n }\n\n // get the given event, or any before that\n let previousEvent: OntimeEntry | null | undefined = entries[insertAfterId];\n\n if (!isOntimeEvent(previousEvent)) {\n previousEvent = getPreviousEventNormal(entries, order, insertAfterId).previousEvent;\n if (!isOntimeEvent(previousEvent)) {\n return addAtTop();\n }\n }\n\n // the cue is based on the previous event cue\n const cue = getIncrement(previousEvent.cue);\n const { nextEvent } = getNextEventNormal(entries, order, insertAfterId);\n\n // if increment is clashing with next, we add a decimal instead\n if (cue !== nextEvent?.cue) {\n return cue;\n }\n\n // there is a clash, bt the cue is a pure number\n if (isNumeric(cue)) {\n return incrementDecimal(previousEvent.cue);\n }\n\n /**\n * at this point, we know the cue is not numeric\n * but the increment failed, so we have a numeric ending\n * eg. Presenter 1 .... Presenter 2 -> Presenter1.1\n * eg. Presenter 1.1 .... Presenter 1.2 -> Presenter1.1.1\n */\n return `${previousEvent.cue}.1`;\n\n function incrementDecimal(cue: string) {\n const n = Number(cue);\n return (n + 0.1).toString();\n }\n\n function addAtTop() {\n const firstEventCue = getFirstEventNormal(entries, order).firstEvent?.cue;\n if (firstEventCue === '1') {\n return '0.1';\n }\n return '1';\n }\n}\n\nexport function sanitiseCue(cue: string) {\n return cue.replaceAll(' ', '').replaceAll(',', '.');\n}\n","import style from './EventEditorImage.module.scss';\n\ninterface EventEditorImageProps {\n src: string;\n}\n\nexport default function EventEditorImage({ src }: EventEditorImageProps) {\n return (\n <div className={style.imageContainer}>\n {Boolean(src) && <img loading='lazy' src={src} />}\n <div className={style.imageOverlay} />\n </div>\n );\n}\n","import { RefObject, useEffect } from 'react';\n// @ts-expect-error no types from library\nimport autosize from 'autosize/dist/autosize';\n\nimport Textarea, { type TextareaProps } from '../textarea/Textarea';\n\ninterface AutoTextAreaProps extends TextareaProps {\n inputref: RefObject<HTMLTextAreaElement | null>;\n}\n\n/**\n * A textarea that automatically resizes based on its content\n */\nexport function AutoTextarea({ value, inputref, ...textAreaProps }: AutoTextAreaProps) {\n // when the value changes, we use the ref to reapply autosize\n useEffect(() => {\n const node = inputref.current;\n autosize(inputref.current);\n\n return () => {\n autosize.destroy(node);\n };\n }, [inputref, value]);\n\n return <Textarea ref={inputref} value={value} {...textAreaProps} />;\n}\n","import { ChangeEvent, KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getHotkeyHandler, HotkeyItem } from '@mantine/hooks';\n\ninterface UseReactiveTextInputReturn {\n value: string;\n onChange: (event: ChangeEvent) => void;\n onBlur: (event: ChangeEvent) => void;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n}\n\nexport default function useReactiveTextInput(\n initialText: string,\n submitCallback: (newValue: string) => void,\n ref: RefObject<HTMLInputElement | HTMLTextAreaElement | null>,\n options?: {\n submitOnEnter?: boolean;\n submitOnCtrlEnter?: boolean;\n onCancelUpdate?: () => void;\n allowSubmitSameValue?: boolean;\n allowKeyboardNavigation?: boolean;\n },\n): UseReactiveTextInputReturn {\n const [text, setText] = useState<string>(initialText);\n // track whether we are submitting via a submit key (eg enter) and avoid submitting again on blur\n const isKeyboardSubmitting = useRef(false);\n\n useEffect(() => {\n if (typeof initialText === 'undefined') {\n setText('');\n } else {\n setText(initialText);\n }\n }, [initialText]);\n\n /**\n * @description Handles Input value change\n * @param {string} newValue\n */\n const handleChange = useCallback(\n (newValue: string) => {\n if (newValue !== text) {\n setText(newValue);\n }\n },\n [text],\n );\n\n /**\n * @description Handles submit events\n * @param {string} valueToSubmit\n */\n const handleSubmit = useCallback(\n (valueToSubmit: string) => {\n // No need to update if it hasn't changed\n if (valueToSubmit === initialText && !options?.allowSubmitSameValue) {\n options?.onCancelUpdate?.();\n } else {\n const cleanVal = valueToSubmit.trim();\n submitCallback(cleanVal);\n if (cleanVal !== valueToSubmit) {\n setText(cleanVal);\n }\n }\n\n setTimeout(() => {\n if (options?.allowKeyboardNavigation) {\n ref.current?.parentElement?.focus(); // Focus on parent element to continue keyboard navigation\n } else {\n ref.current?.blur();\n }\n }); // Immediate timeout to ensure text is set before blurring\n },\n [initialText, options, ref, submitCallback],\n );\n\n /**\n * @description Handles escape events\n * @param {string} valueToSubmit\n */\n const handleEscape = useCallback(() => {\n // No need to update if it hasn't changed\n setText(initialText);\n // force the text to be the initial value\n if (ref.current) {\n ref.current.value = initialText;\n }\n options?.onCancelUpdate?.();\n setTimeout(() => ref.current?.blur()); // Immediate timeout to ensure text is set before blurring\n }, [initialText, options, ref]);\n\n const keyHandler = useMemo(() => {\n const hotKeys: HotkeyItem[] = [\n [\n 'Escape',\n (event) => {\n event.preventDefault();\n handleEscape();\n },\n { preventDefault: true },\n ],\n ];\n\n if (options?.submitOnEnter) {\n hotKeys.push([\n 'Enter',\n () => {\n isKeyboardSubmitting.current = true;\n handleSubmit(text);\n // clear flag after blur has been processed\n setTimeout(() => {\n isKeyboardSubmitting.current = false;\n }, 0);\n },\n ]);\n }\n\n if (options?.submitOnCtrlEnter) {\n hotKeys.push([\n 'mod + Enter',\n () => {\n isKeyboardSubmitting.current = true;\n handleSubmit(text);\n // clear flag after blur has been processed\n setTimeout(() => {\n isKeyboardSubmitting.current = false;\n }, 0);\n },\n ]);\n }\n\n const hotKeyHandler = getHotkeyHandler(hotKeys);\n\n return (event: KeyboardEvent<HTMLElement>) => {\n // allow moving in input field with arrow keys\n if (\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown'\n ) {\n event.stopPropagation();\n }\n\n hotKeyHandler(event);\n };\n }, [handleEscape, handleSubmit, options?.submitOnCtrlEnter, options?.submitOnEnter, text]);\n\n return {\n value: text,\n onChange: (event: ChangeEvent) => handleChange((event.target as HTMLInputElement).value),\n onBlur: (event: ChangeEvent) => {\n if (!isKeyboardSubmitting.current) {\n handleSubmit((event.target as HTMLInputElement).value);\n }\n },\n onKeyDown: keyHandler,\n };\n}\n","import { type CSSProperties, useCallback, useRef } from 'react';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport { AutoTextarea } from '../../../../common/components/input/auto-textarea/AutoTextarea';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\nimport { EventEditorUpdateFields } from '../EventEditor';\n\ninterface CountedTextAreaProps {\n className?: string;\n field: EventEditorUpdateFields;\n label: string;\n initialValue: string;\n style?: CSSProperties;\n submitHandler: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EventTextArea({\n className,\n field,\n label,\n initialValue,\n style: givenStyles,\n submitHandler,\n}: CountedTextAreaProps) {\n const ref = useRef<HTMLTextAreaElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnCtrlEnter: true,\n });\n\n return (\n <div>\n <Editor.Label className={className} htmlFor={field} style={givenStyles}>\n {label}\n </Editor.Label>\n <AutoTextarea\n id={field}\n inputref={ref}\n rows={1}\n data-testid='input-textarea'\n fluid\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n}\n","import { useCallback, useRef } from 'react';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport Input, { type InputProps } from '../../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\nimport { EventEditorUpdateFields } from '../EventEditor';\nimport { GroupEditorUpdateTextFields } from '../GroupEditor';\n\ninterface EntryEditorTextInputProps extends InputProps {\n field: EventEditorUpdateFields | GroupEditorUpdateTextFields;\n label: string;\n initialValue: string;\n placeholder?: string;\n submitHandler: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EntryEditorTextInput({\n className,\n field,\n label,\n initialValue,\n style: givenStyles,\n submitHandler,\n maxLength,\n placeholder,\n}: EntryEditorTextInputProps) {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n return (\n <div>\n <Editor.Label className={className} htmlFor={field} style={givenStyles}>\n {label}\n </Editor.Label>\n <Input\n id={field}\n ref={ref}\n maxLength={maxLength}\n fluid\n data-testid='input-textfield'\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n}\n","import { CSSProperties, Fragment } from 'react';\nimport { CustomFields, OntimeEvent, OntimeGroup, OntimeMilestone } from 'ontime-types';\n\nimport { getAccessibleColour } from '../../../../common/utils/styleUtils';\nimport { EventEditorUpdateFields } from '../EventEditor';\n\nimport EventEditorImage from './EventEditorImage';\nimport EventTextArea from './EventTextArea';\nimport EntryEditorTextInput from './EventTextInput';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EntryEditorCustomFieldsProps {\n fields: CustomFields;\n entry: OntimeEvent | OntimeGroup | OntimeMilestone;\n handleSubmit: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EntryEditorCustomFields({\n fields: customFields,\n handleSubmit,\n entry,\n}: EntryEditorCustomFieldsProps) {\n return (\n <Fragment>\n {Object.keys(customFields).map((fieldKey) => {\n const key = `${entry.id}-${fieldKey}`;\n const fieldName = `custom-${fieldKey}`;\n const initialValue = entry.custom[fieldKey] ?? '';\n const { backgroundColor, color } = getAccessibleColour(customFields[fieldKey].colour);\n const labelText = customFields[fieldKey].label;\n\n if (customFields[fieldKey].type === 'text') {\n return (\n <EventTextArea\n key={key}\n field={fieldName}\n label={labelText}\n initialValue={initialValue}\n submitHandler={handleSubmit}\n className={style.decorated}\n style={{ '--decorator-bg': backgroundColor, '--decorator-color': color } as CSSProperties}\n />\n );\n }\n\n if (customFields[fieldKey].type === 'image') {\n return (\n <div key={key} className={style.customImage}>\n <EntryEditorTextInput\n key={key}\n field={fieldName}\n label={labelText}\n initialValue={initialValue}\n placeholder='Paste image URL'\n submitHandler={handleSubmit}\n className={style.decorated}\n maxLength={255}\n style={{ '--decorator-bg': backgroundColor, '--decorator-color': color } as CSSProperties}\n />\n <EventEditorImage src={initialValue} />\n </div>\n );\n }\n\n // we should have exhausted all types by now\n return null;\n })}\n </Fragment>\n );\n}\n","import { PropsWithChildren } from 'react';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TimeInputGroup.module.scss';\n\ninterface TimeInputGroupProps {\n hasDelay?: boolean;\n}\n\nexport default function TimeInputGroup({ hasDelay, children }: PropsWithChildren<TimeInputGroupProps>) {\n return <div className={cx([style.inputGroup, hasDelay && style.delayed])}>{children}</div>;\n}\n","import { memo } from 'react';\nimport { IoAlertCircleOutline, IoLink, IoLockClosed, IoLockOpenOutline, IoUnlink } from 'react-icons/io5';\nimport { TimeField, TimeStrategy } from 'ontime-types';\nimport { dayInMs } from 'ontime-utils';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport TimeInput from '../../../common/components/input/time-input/TimeInput';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\n\nimport TimeInputGroup from './TimeInputGroup';\n\nimport style from './TimeInputFlow.module.scss';\n\ninterface TimeInputFlowProps {\n eventId: string;\n countToEnd: boolean;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n delay: number;\n showLabels?: boolean;\n}\n\nexport default memo(TimeInputFlow);\nfunction TimeInputFlow({\n eventId,\n countToEnd,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n delay,\n showLabels,\n}: TimeInputFlowProps) {\n const { updateEntry, updateTimer } = useEntryActions();\n\n // In sync with EventEditorTimes\n const handleSubmit = (field: TimeField, value: string) => {\n updateTimer(eventId, field, value);\n };\n\n const handleChangeStrategy = (timeStrategy: TimeStrategy) => {\n updateEntry({ id: eventId, timeStrategy });\n };\n\n const handleLink = (doLink: boolean) => {\n updateEntry({ id: eventId, linkStart: doLink });\n };\n\n const warnings = [];\n if (timeStart + duration > dayInMs) {\n warnings.push('Over midnight');\n }\n\n if (countToEnd) {\n warnings.push('Count to End');\n }\n\n const hasDelay = delay !== 0;\n const isLockedEnd = timeStrategy === TimeStrategy.LockEnd;\n const isLockedDuration = timeStrategy === TimeStrategy.LockDuration;\n\n return (\n <>\n <div>\n {showLabels && <Editor.Label className={style.sectionTitle}>Start time</Editor.Label>}\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='timeStart'\n submitHandler={handleSubmit}\n time={timeStart}\n placeholder='Start'\n align='left'\n disabled={linkStart}\n />\n <Tooltip\n text='Link start to previous end'\n onClick={() => handleLink(!linkStart)}\n render={<IconButton variant='subtle-white' className={linkStart ? style.active : style.inactive} />}\n >\n <span className={style.fourtyfive}>{linkStart ? <IoLink /> : <IoUnlink />}</span>\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n <div>\n {showLabels && <Editor.Label>End time</Editor.Label>}\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='timeEnd'\n submitHandler={handleSubmit}\n time={timeEnd}\n placeholder='End'\n align='left'\n disabled={isLockedDuration}\n />\n <Tooltip\n text='Lock end'\n render={<IconButton variant='subtle-white' className={isLockedEnd ? style.active : style.inactive} />}\n onClick={() => handleChangeStrategy(TimeStrategy.LockEnd)}\n data-testid='lock__end'\n >\n {isLockedEnd ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n <div>\n {showLabels && <Editor.Label>Duration</Editor.Label>}\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='duration'\n submitHandler={handleSubmit}\n time={duration}\n placeholder='Duration'\n align='left'\n disabled={isLockedEnd}\n />\n <Tooltip\n text='Lock duration'\n render={<IconButton variant='subtle-white' className={isLockedDuration ? style.active : style.inactive} />}\n onClick={() => handleChangeStrategy(TimeStrategy.LockDuration)}\n data-testid='lock__duration'\n >\n {isLockedDuration ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n {warnings.length > 0 && (\n <Tooltip text={warnings.join(' - ')} className={style.timerNote} data-testid='event-warning' render={<span />}>\n <IoAlertCircleOutline />\n </Tooltip>\n )}\n </>\n );\n}\n","import { memo } from 'react';\nimport { IoInformationCircle } from 'react-icons/io5';\nimport { EndAction, TimerType, TimeStrategy } from 'ontime-types';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport Select from '../../../../common/components/select/Select';\nimport Switch from '../../../../common/components/switch/Switch';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { millisToDelayString } from '../../../../common/utils/dateConfig';\nimport TimeInputFlow from '../../time-input-flow/TimeInputFlow';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EventEditorTimesProps {\n eventId: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n countToEnd: boolean;\n delay: number;\n endAction: EndAction;\n timerType: TimerType;\n timeWarning: number;\n timeDanger: number;\n}\n\ntype HandledActions = 'countToEnd' | 'timerType' | 'endAction' | 'timeWarning' | 'timeDanger';\n\nexport default memo(EventEditorTimes);\nfunction EventEditorTimes({\n eventId,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n countToEnd,\n delay,\n endAction,\n timerType,\n timeWarning,\n timeDanger,\n}: EventEditorTimesProps) {\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = (field: HandledActions, value: string | boolean) => {\n if (field === 'countToEnd') {\n updateEntry({ id: eventId, countToEnd: value as boolean });\n return;\n }\n\n if (field === 'timeWarning' || field === 'timeDanger') {\n const newTime = parseUserTime(value as string);\n updateEntry({ id: eventId, [field]: newTime });\n return;\n }\n\n if (field === 'timerType' || field === 'endAction') {\n updateEntry({ id: eventId, [field]: value });\n return;\n }\n };\n\n const hasDelay = delay !== 0;\n const delayLabel = hasDelay\n ? `Event is ${millisToDelayString(delay, 'expanded')}. New schedule ${millisToString(\n timeStart + delay,\n )} → ${millisToString(timeEnd + delay)}`\n : '';\n\n return (\n <>\n <div className={style.column}>\n <Editor.Title>Event schedule</Editor.Title>\n <div>\n <div className={style.inline}>\n <TimeInputFlow\n eventId={eventId}\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n timeStrategy={timeStrategy}\n linkStart={linkStart}\n delay={delay}\n countToEnd={countToEnd}\n showLabels\n />\n </div>\n <div className={style.delayLabel}>{delayLabel}</div>\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>Event Behaviour</Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='endAction'>End Action</Editor.Label>\n <Select\n value={endAction}\n onValueChange={(value) => handleSubmit('endAction', value)}\n options={[\n { value: EndAction.None, label: 'None' },\n { value: EndAction.LoadNext, label: 'Load next event' },\n { value: EndAction.PlayNext, label: 'Play next event' },\n ]}\n />\n </div>\n <div>\n <Editor.Label htmlFor='countToEnd'>Count to End</Editor.Label>\n <Editor.Label className={style.switchLabel}>\n <Switch\n id='countToEnd'\n checked={countToEnd}\n onCheckedChange={(value) => handleSubmit('countToEnd', value)}\n />\n {countToEnd ? 'On' : 'Off'}\n </Editor.Label>\n </div>\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n <Tooltip\n text='Changes how the timer is displayed in different views. It is not reflected in the rundown'\n render={<span />}\n >\n Display Options\n <IoInformationCircle className={style.tooltipIcon} />\n </Tooltip>\n </Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='timerType'>Timer Type</Editor.Label>\n <Select\n value={timerType}\n onValueChange={(value) => handleSubmit('timerType', value)}\n options={[\n { value: TimerType.CountDown, label: 'Count down' },\n { value: TimerType.CountUp, label: 'Count up' },\n { value: TimerType.Clock, label: 'Clock' },\n { value: TimerType.None, label: 'None' },\n ]}\n />\n </div>\n\n <div className={style.inline}>\n <div>\n <Editor.Label htmlFor='timeWarning'>Warning Time</Editor.Label>\n <TimeInput\n id='timeWarning'\n name='timeWarning'\n submitHandler={handleSubmit}\n time={timeWarning}\n placeholder='Duration'\n />\n </div>\n <div>\n <Editor.Label htmlFor='timeDanger'>Danger Time</Editor.Label>\n <TimeInput\n id='timeDanger'\n name='timeDanger'\n submitHandler={handleSubmit}\n time={timeDanger}\n placeholder='Duration'\n />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n}\n","import { memo } from 'react';\nimport { sanitiseCue } from 'ontime-utils';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../../common/components/input/colour-input/SwatchSelect';\nimport Input from '../../../../common/components/input/input/Input';\nimport Switch from '../../../../common/components/switch/Switch';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\n\nimport EventTextArea from './EventTextArea';\nimport EntryEditorTextInput from './EventTextInput';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EventEditorTitlesProps {\n eventId: string;\n cue: string;\n flag: boolean;\n title: string;\n note: string;\n colour: string;\n}\n\nexport default memo(EventEditorTitles);\nfunction EventEditorTitles({ eventId, cue, flag, title, note, colour }: EventEditorTitlesProps) {\n const { updateEntry } = useEntryActions();\n\n const cueSubmitHandler = (_field: string, newValue: string) => {\n updateEntry({ id: eventId, cue: sanitiseCue(newValue) });\n };\n\n const flagSubmitHandler = (newValue: boolean) => {\n updateEntry({ id: eventId, flag: newValue });\n };\n\n const textSubmitHandler = (field: string, newValue: string) => {\n updateEntry({ id: eventId, [field]: newValue });\n };\n\n return (\n <div className={style.column}>\n <Editor.Title>Event Data</Editor.Title>\n <div className={style.splitThree}>\n <div>\n <Editor.Label htmlFor='eventId'>Event ID (read only)</Editor.Label>\n <Input id='eventId' data-testid='input-textfield' value={eventId} readOnly fluid />\n </div>\n <EntryEditorTextInput\n field='cue'\n label='Cue'\n initialValue={cue}\n submitHandler={cueSubmitHandler}\n maxLength={10}\n />\n <div>\n <Editor.Label htmlFor='flag'>Flag</Editor.Label>\n <Editor.Label className={style.switchLabel}>\n <Switch id='flag' checked={flag} onCheckedChange={flagSubmitHandler} />\n {flag ? 'On' : 'Off'}\n </Editor.Label>\n </div>\n </div>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={colour} handleChange={textSubmitHandler} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={title} submitHandler={textSubmitHandler} />\n <EventTextArea field='note' label='Note' initialValue={note} submitHandler={textSubmitHandler} />\n </div>\n );\n}\n","import { TimerLifeCycle } from 'ontime-types';\n\nexport const eventTriggerOptions: TimerLifeCycle[] = [\n TimerLifeCycle.onLoad,\n TimerLifeCycle.onStart,\n TimerLifeCycle.onPause,\n TimerLifeCycle.onFinish,\n TimerLifeCycle.onWarning,\n TimerLifeCycle.onDanger,\n];\n","import { Fragment, useCallback, useMemo, useState } from 'react';\nimport { IoAlertCircle, IoCheckmarkCircle, IoTrash } from 'react-icons/io5';\nimport { TimerLifeCycle, timerLifecycleValues, Trigger } from 'ontime-types';\nimport { generateId } from 'ontime-utils';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport Select from '../../../../common/components/select/Select';\nimport Tag from '../../../../common/components/tag/Tag';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport useAutomationSettings from '../../../../common/hooks-query/useAutomationSettings';\n\nimport { eventTriggerOptions } from './eventTrigger.constants';\n\nimport style from './EventEditorTriggers.module.scss';\n\ninterface EventEditorTriggersProps {\n eventId: string;\n triggers: Trigger[];\n}\n\nexport default function EventEditorTriggers({ triggers, eventId }: EventEditorTriggersProps) {\n const showTriggers = triggers.length > 0;\n\n return (\n <>\n {showTriggers && <ExistingEventTriggers triggers={triggers} eventId={eventId} />}\n <EventTriggerForm triggers={triggers} eventId={eventId} />\n </>\n );\n}\n\ninterface EventTriggerFormProps {\n eventId: string;\n triggers?: Trigger[];\n}\n\nfunction EventTriggerForm({ eventId, triggers }: EventTriggerFormProps) {\n const { data: automationSettings } = useAutomationSettings();\n const { updateEntry } = useEntryActions();\n const [automationId, setAutomationId] = useState<string | undefined>(undefined);\n const [cycleValue, setCycleValue] = useState(TimerLifeCycle.onStart);\n\n const handleSubmit = (triggerLifeCycle: TimerLifeCycle, automationId: string) => {\n const newTriggers = triggers ?? new Array<Trigger>();\n const id = generateId();\n newTriggers.push({ id, title: '', trigger: triggerLifeCycle, automationId });\n updateEntry({ id: eventId, triggers: newTriggers });\n };\n\n const getValidationError = (cycle: TimerLifeCycle, automationId?: string): string | undefined => {\n if (automationId === undefined) {\n return 'Select an automation';\n }\n if (!Object.keys(automationSettings.automations).includes(automationId)) {\n return 'This automation does not exist';\n }\n if (triggers === undefined) {\n return;\n }\n return Object.values(triggers).some((t) => t.automationId === automationId && t.trigger === cycle)\n ? 'Automation can only be used once'\n : undefined;\n };\n\n const validationError = getValidationError(cycleValue, automationId);\n\n const triggerOptions = useMemo(\n () => [\n { value: null, label: 'Select Trigger' },\n ...eventTriggerOptions.map((cycle) => ({ value: cycle, label: cycle })),\n ],\n [], // eventTriggerOptions is a constant, no need for dependency\n );\n\n const automationOptions = useMemo(\n () => [\n { value: null, label: 'Select Automation' },\n ...Object.values(automationSettings.automations).map(({ id, title }) => ({ value: id, label: title })),\n ],\n [automationSettings.automations], // This needs to be a dependency as it can change\n );\n\n return (\n <div className={style.triggerForm}>\n <Select\n value={cycleValue}\n onValueChange={(value) => {\n if (value !== null) setCycleValue(value);\n }}\n options={triggerOptions}\n />\n\n <Select\n value={automationId ?? null}\n onValueChange={(value) => {\n if (value !== null) setAutomationId(value);\n }}\n options={automationOptions}\n />\n\n <Button\n disabled={validationError !== undefined}\n onClick={() => automationId && handleSubmit(cycleValue, automationId)}\n >\n Add\n </Button>\n {validationError !== undefined ? (\n <Tooltip text={validationError} render={<span />}>\n <IoAlertCircle className={style.errorLabel} />\n </Tooltip>\n ) : (\n <IoCheckmarkCircle className={style.success} />\n )}\n </div>\n );\n}\n\ninterface ExistingEventTriggersProps {\n eventId: string;\n triggers: Trigger[];\n}\n\nfunction ExistingEventTriggers({ eventId, triggers }: ExistingEventTriggersProps) {\n const { updateEntry } = useEntryActions();\n const { data: automationSettings } = useAutomationSettings();\n\n const handleDelete = useCallback(\n (triggerId: string) => {\n const newTriggers = triggers.filter((trigger) => trigger.id !== triggerId);\n updateEntry({ id: eventId, triggers: newTriggers });\n },\n [eventId, triggers, updateEntry],\n );\n\n const filteredTriggers: Record<string, Trigger[]> = {};\n\n // sort triggers out into groups by the Lifecycle they are on\n timerLifecycleValues.forEach((triggerType) => {\n const thisTriggerType = triggers.filter((trigger) => trigger.trigger === triggerType);\n if (thisTriggerType.length) {\n Object.assign(filteredTriggers, { [triggerType]: thisTriggerType });\n }\n });\n\n return (\n <div>\n {Object.entries(filteredTriggers).map(([triggerLifeCycle, triggerGroup]) => (\n <Fragment key={triggerLifeCycle}>\n {triggerGroup.map((trigger) => {\n const { id, automationId } = trigger;\n const automationTitle = automationSettings.automations[automationId]?.title ?? '<MISSING AUTOMATION>';\n return (\n <div key={id} className={style.trigger}>\n <Tag>{triggerLifeCycle}</Tag>\n <Tag>{automationTitle}</Tag>\n <IconButton variant='ghosted-destructive' onClick={() => handleDelete(id)}>\n <IoTrash />\n </IconButton>\n </div>\n );\n })}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { OntimeEvent } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventEditorTimes from './composite/EventEditorTimes';\nimport EventEditorTitles from './composite/EventEditorTitles';\nimport EventEditorTriggers from './composite/EventEditorTriggers';\n\nimport style from './EntryEditor.module.scss';\n\n// any of the titles + colour + custom field labels\nexport type EventEditorUpdateFields = 'cue' | 'title' | 'note' | 'colour' | string;\n\ninterface EventEditorProps {\n event: OntimeEvent;\n}\n\nexport default function EventEditor({ event }: EventEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const isEditor = window.location.pathname.includes('editor');\n\n const handleSubmit = useCallback(\n (field: EventEditorUpdateFields, value: string) => {\n if (field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: event.id, custom: { [fieldLabel]: value } });\n } else {\n updateEntry({ id: event.id, [field]: value });\n }\n },\n [event.id, updateEntry],\n );\n\n return (\n <div className={style.content}>\n <EventEditorTimes\n key={`${event.id}-times`}\n eventId={event.id}\n timeStart={event.timeStart}\n timeEnd={event.timeEnd}\n duration={event.duration}\n timeStrategy={event.timeStrategy}\n linkStart={event.linkStart}\n countToEnd={event.countToEnd}\n delay={event.delay}\n endAction={event.endAction}\n timerType={event.timerType}\n timeWarning={event.timeWarning}\n timeDanger={event.timeDanger}\n />\n <EventEditorTitles\n key={`${event.id}-titles`}\n eventId={event.id}\n cue={event.cue}\n flag={event.flag}\n title={event.title}\n note={event.note}\n colour={event.colour}\n />\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={event} />\n </div>\n <div className={style.column}>\n <Editor.Title>\n Automations\n {isEditor && <AppLink search='settings=automation'>Manage Automations</AppLink>}\n </Editor.Title>\n <EventEditorTriggers triggers={event.triggers} eventId={event.id} />\n </div>\n </div>\n );\n}\n","import { forwardRef, HTMLAttributes, memo, PropsWithChildren, useImperativeHandle, useRef } from 'react';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './TextLikeInput.module.scss';\n\ninterface TextLikeInputProps extends HTMLAttributes<HTMLSpanElement> {\n offset?: 'over' | 'under' | 'muted' | null;\n muted?: boolean;\n disabled?: boolean;\n}\n\nconst TextLikeInput = forwardRef(\n (\n { offset, muted, disabled, children, className, ...elementProps }: PropsWithChildren<TextLikeInputProps>,\n textRef,\n ) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const classes = cx([\n style.textInput,\n offset && style[offset],\n muted && style.muted,\n disabled && style.disabled,\n className,\n ]);\n\n useImperativeHandle(textRef, () => {\n return {\n focusParentElement() {\n ref.current?.parentElement?.focus();\n },\n };\n });\n\n return (\n <div className={classes} tabIndex={disabled ? -1 : 0} {...elementProps} ref={ref}>\n {children}\n </div>\n );\n },\n);\n\nTextLikeInput.displayName = 'TextLikeInput';\n\nexport default memo(TextLikeInput);\n","import { FocusEvent, KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { cx } from '../../../utils/styleUtils';\nimport Input from '../input/Input';\n\nimport style from './TimeInput.module.scss';\n\ninterface NullableTimeInputProps<T extends string> {\n id?: T;\n name: T;\n submitHandler: (field: T, value: number) => void;\n time?: number | null;\n emptyDisplay: string;\n placeholder?: string;\n disabled?: boolean;\n align?: 'left' | 'center';\n className?: string;\n}\n\n/**\n * Similar to TimeInput, but allows clearing the time value\n */\nexport default function NullableTimeInput<T extends string>({\n id,\n name,\n submitHandler,\n time,\n emptyDisplay,\n placeholder,\n disabled,\n align = 'center',\n className,\n}: NullableTimeInputProps<T>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [value, setValue] = useState<string>('');\n const ignoreChange = useRef(false);\n\n /**\n * @description Resets input value to given\n */\n const resetValue = useCallback(() => {\n if (typeof time !== 'number' || isNaN(time)) {\n setValue(emptyDisplay);\n } else {\n setValue(millisToString(time));\n }\n }, [emptyDisplay, time]);\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = useCallback(() => {\n inputRef.current?.select();\n }, []);\n\n /**\n * @description Submit handler\n * @param {string} newValue\n */\n const handleSubmit = useCallback(\n (newValue: string) => {\n // skip if user deleted and time is already null\n if (newValue === '' && time === null) {\n return false;\n }\n\n // skip if the value evaluates to the same thing\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis === time) {\n return false;\n }\n\n submitHandler(name, valueInMillis);\n return true;\n },\n [name, submitHandler, time],\n );\n\n /**\n * @description Prepare time fields\n * @param {string} value string to be parsed\n */\n const validateAndSubmit = useCallback(\n (newValue: string) => {\n const success = handleSubmit(newValue);\n if (!success) {\n resetValue();\n }\n },\n [handleSubmit, resetValue],\n );\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n }\n if (event.key === 'Escape') {\n ignoreChange.current = true;\n inputRef.current?.blur();\n resetValue();\n }\n },\n [resetValue],\n );\n\n const onBlurHandler = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (ignoreChange.current) {\n ignoreChange.current = false;\n return;\n }\n validateAndSubmit((event.target as HTMLInputElement).value);\n },\n [validateAndSubmit],\n );\n\n useEffect(() => {\n resetValue();\n }, [resetValue]);\n\n return (\n <Input\n id={id}\n disabled={disabled}\n ref={inputRef}\n data-testid={`time-input-${name}`}\n className={cx([style.timeInput, className])}\n placeholder={placeholder}\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlurHandler}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={8}\n autoComplete='off'\n style={{\n textAlign: align,\n }}\n />\n );\n}\n","import { IoLockClosed, IoLockOpenOutline } from 'react-icons/io5';\nimport { MaybeNumber } from 'ontime-types';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport NullableTimeInput from '../../../../common/components/input/time-input/NullableTimeInput';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { cx, enDash } from '../../../../common/utils/styleUtils';\nimport TimeInputGroup from '../../time-input-flow/TimeInputGroup';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface TargetDurationInputProps {\n duration: MaybeNumber;\n targetDuration: MaybeNumber;\n submitHandler: (field: 'targetDuration', value: MaybeNumber) => void;\n}\n\nexport default function TargetDurationInput({ duration, targetDuration, submitHandler }: TargetDurationInputProps) {\n const isLocked = targetDuration !== null;\n\n return (\n <div>\n <Editor.Label htmlFor='targetDuration'>Target duration</Editor.Label>\n <TimeInputGroup hasDelay={isLocked && targetDuration !== duration}>\n <NullableTimeInput\n name='targetDuration'\n time={targetDuration}\n submitHandler={submitHandler}\n emptyDisplay={enDash}\n className={isLocked ? '' : style.inactive}\n />\n <Tooltip\n text='Lock to target duration'\n className={cx([style.timeAction, isLocked && style.active])}\n onClick={() => submitHandler('targetDuration', isLocked ? null : duration)}\n data-testid='lock__duration'\n render={<IconButton variant='subtle-white' className={isLocked ? style.active : style.inactive} />}\n >\n {isLocked ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { MaybeNumber, OntimeGroup } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { cx, enDash, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport TextLikeInput from '../../../views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventTextArea from './composite/EventTextArea';\nimport EntryEditorTextInput from './composite/EventTextInput';\nimport TargetDurationInput from './composite/TargetDurationInput';\n\nimport style from './EntryEditor.module.scss';\n\n// title + colour + custom field labels\nexport type GroupEditorUpdateTextFields = 'title' | 'colour' | string;\nexport type GroupEditorUpdateMaybeNumberFields = 'targetDuration';\n\ninterface GroupEditorProps {\n group: OntimeGroup;\n}\n\nexport default function GroupEditor({ group }: GroupEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = useCallback(\n (field: GroupEditorUpdateTextFields | GroupEditorUpdateMaybeNumberFields, value: string | MaybeNumber) => {\n // Handle custom fields\n if (typeof field === 'string' && field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: group.id, custom: { [fieldLabel]: value as string } });\n return;\n }\n\n if (field === 'targetDuration') {\n return updateEntry({ id: group.id, targetDuration: value as MaybeNumber });\n }\n\n // all other strings are text fields\n return updateEntry({ id: group.id, [field]: value as string });\n },\n [group.id, updateEntry],\n );\n\n const isEditor = window.location.pathname.includes('editor');\n const planOffset = group.targetDuration === null ? null : group.duration - group.targetDuration;\n const planOffsetLabel = planOffset !== null ? getOffsetState(planOffset) : null;\n\n return (\n <div className={style.content}>\n <div className={style.column}>\n <Editor.Title>Group schedule</Editor.Title>\n <div className={style.inline}>\n <div>\n {\n // TODO: format with user time settings\n }\n <Editor.Label>First event start</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.timeStart, { fallback: timerPlaceholder })}\n </TextLikeInput>\n </div>\n <div>\n <Editor.Label>Last event end</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.timeEnd, { fallback: timerPlaceholder })}\n </TextLikeInput>\n </div>\n <div>\n <Editor.Label htmlFor='duration'>Scheduled duration</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.duration, { fallback: enDash })}\n </TextLikeInput>\n </div>\n </div>\n <div className={style.inline}>\n <div>\n <Editor.Label htmlFor='eventId'>Plan offset</Editor.Label>\n <TextLikeInput\n offset={planOffsetLabel}\n className={cx([style.textLikeInput, planOffset === null && style.inactive])}\n disabled\n >\n {planOffset !== null && planOffset > 0 ? '+' : ''}\n {millisToString(planOffset, { fallback: enDash })}\n </TextLikeInput>\n </div>\n <TargetDurationInput\n duration={group.duration}\n targetDuration={group.targetDuration}\n submitHandler={handleSubmit}\n />\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>Group data</Editor.Title>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={group.colour} handleChange={handleSubmit} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={group.title} submitHandler={handleSubmit} />\n <EventTextArea field='note' label='Note' initialValue={group.note} submitHandler={handleSubmit} />\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={group} />\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { OntimeMilestone } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect';\nimport Input from '../../../common/components/input/input/Input';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventTextArea from './composite/EventTextArea';\nimport EntryEditorTextInput from './composite/EventTextInput';\n\nimport style from './EntryEditor.module.scss';\n\n// cue + title + colour + custom field labels\nexport type MilestoneEditorUpdateTextFields = 'cue' | 'title' | 'colour' | string;\n\ninterface MilestoneEditorProps {\n milestone: OntimeMilestone;\n}\nexport default function MilestoneEditor({ milestone }: MilestoneEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = useCallback(\n (field: MilestoneEditorUpdateTextFields, value: string) => {\n // Handle custom fields\n if (typeof field === 'string' && field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: milestone.id, custom: { [fieldLabel]: value } });\n return;\n }\n // all other strings are text fields\n return updateEntry({ id: milestone.id, [field]: value });\n },\n [milestone.id, updateEntry],\n );\n\n const isEditor = window.location.pathname.includes('editor');\n\n return (\n <div className={style.content}>\n <div className={style.column}>\n <Editor.Title>Milestone data</Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='entryId'>Milestone ID (read only)</Editor.Label>\n <Input id='entryId' data-testid='input-textfield' value={milestone.id} readOnly fluid />\n </div>\n <EntryEditorTextInput\n field='cue'\n label='Cue'\n initialValue={milestone.cue}\n submitHandler={handleSubmit}\n maxLength={10}\n />\n </div>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={milestone.colour} handleChange={handleSubmit} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={milestone.title} submitHandler={handleSubmit} />\n <EventTextArea field='note' label='Note' initialValue={milestone.note} submitHandler={handleSubmit} />\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={milestone} />\n </div>\n </div>\n );\n}\n"],"names":["TimerLifeCycle","timerLifecycleValues","sanitiseCue","cue","EventEditorImage","src","jsxs","style","jsx","AutoTextarea","value","inputref","textAreaProps","useEffect","node","autosize","Textarea","useReactiveTextInput","initialText","submitCallback","ref","options","text","setText","useState","isKeyboardSubmitting","useRef","handleChange","useCallback","newValue","handleSubmit","valueToSubmit","_a","cleanVal","_b","_c","handleEscape","keyHandler","useMemo","hotKeys","event","hotKeyHandler","getHotkeyHandler","EventTextArea","className","field","label","initialValue","givenStyles","submitHandler","onChange","onBlur","onKeyDown","Editor.Label","EntryEditorTextInput","maxLength","placeholder","Input","EntryEditorCustomFields","customFields","entry","Fragment","fieldKey","key","fieldName","backgroundColor","color","getAccessibleColour","labelText","TimeInputGroup","hasDelay","children","cx","memo","TimeInputFlow","eventId","countToEnd","timeStart","timeEnd","duration","timeStrategy","linkStart","delay","showLabels","updateEntry","updateTimer","useEntryActions","handleChangeStrategy","handleLink","doLink","warnings","dayInMs","isLockedEnd","TimeStrategy","isLockedDuration","TimeInput","Tooltip","IconButton","IoLink","IoUnlink","IoLockClosed","IoLockOpenOutline","IoAlertCircleOutline","EventEditorTimes","endAction","timerType","timeWarning","timeDanger","newTime","parseUserTime","delayLabel","millisToDelayString","millisToString","Editor.Title","Select","EndAction","Switch","IoInformationCircle","TimerType","EventEditorTitles","flag","title","note","colour","cueSubmitHandler","_field","flagSubmitHandler","textSubmitHandler","SwatchSelect","eventTriggerOptions","EventEditorTriggers","triggers","showTriggers","ExistingEventTriggers","EventTriggerForm","automationSettings","useAutomationSettings","automationId","setAutomationId","cycleValue","setCycleValue","triggerLifeCycle","newTriggers","id","generateId","validationError","cycle","t","triggerOptions","automationOptions","Button","IoAlertCircle","IoCheckmarkCircle","handleDelete","triggerId","trigger","filteredTriggers","triggerType","thisTriggerType","triggerGroup","automationTitle","Tag","IoTrash","EventEditor","useCustomFields","isEditor","fieldLabel","AppLink","TextLikeInput","forwardRef","offset","muted","disabled","elementProps","textRef","classes","useImperativeHandle","NullableTimeInput","name","time","emptyDisplay","align","inputRef","setValue","ignoreChange","resetValue","handleFocus","valueInMillis","validateAndSubmit","onKeyDownHandler","onBlurHandler","TargetDurationInput","targetDuration","isLocked","enDash","GroupEditor","group","planOffset","planOffsetLabel","getOffsetState","timerPlaceholder","MilestoneEditor","milestone"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MilestoneEditor-DcWPGKNK.js","sources":["../../../../packages/types/src/definitions/core/TimerLifecycle.type.ts","../../../../packages/utils/src/cue-utils/cueUtils.ts","../../src/features/rundown/entry-editor/composite/EventEditorImage.tsx","../../src/common/components/input/auto-textarea/AutoTextarea.tsx","../../src/common/components/input/text-input/useReactiveTextInput.tsx","../../src/features/rundown/entry-editor/composite/EventTextArea.tsx","../../src/features/rundown/entry-editor/composite/EventTextInput.tsx","../../src/features/rundown/entry-editor/composite/EventEditorCustomFields.tsx","../../src/features/rundown/time-input-flow/TimeInputGroup.tsx","../../src/features/rundown/time-input-flow/TimeInputFlow.tsx","../../src/features/rundown/entry-editor/composite/EventEditorTimes.tsx","../../src/features/rundown/entry-editor/composite/EventEditorTitles.tsx","../../src/features/rundown/entry-editor/composite/eventTrigger.constants.ts","../../src/features/rundown/entry-editor/composite/EventEditorTriggers.tsx","../../src/features/rundown/entry-editor/EventEditor.tsx","../../src/views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput.tsx","../../src/common/components/input/time-input/NullableTimeInput.tsx","../../src/features/rundown/entry-editor/composite/TargetDurationInput.tsx","../../src/features/rundown/entry-editor/GroupEditor.tsx","../../src/features/rundown/entry-editor/MilestoneEditor.tsx"],"sourcesContent":["export enum TimerLifeCycle {\n onLoad = 'onLoad',\n onStart = 'onStart',\n onPause = 'onPause',\n onStop = 'onStop',\n onClock = 'onClock',\n onUpdate = 'onUpdate',\n onFinish = 'onFinish',\n onWarning = 'onWarning',\n onDanger = 'onDanger',\n}\n\nexport type TimerLifeCycleKey = keyof typeof TimerLifeCycle;\n\nexport const timerLifecycleValues = Object.keys(TimerLifeCycle);\n","import type { EntryId, OntimeEntry, RundownEntries } from 'ontime-types';\nimport { isOntimeEvent } from 'ontime-types';\n\nimport { getFirstEventNormal, getNextEventNormal, getPreviousEventNormal } from '../rundown-utils/rundownUtils.js';\nimport { isNumeric } from '../types/types.js';\n\n// Zero or more non-digit characters at the beginning ((\\D*)).\n// One or more digits ((\\d+)).\n// Optionally, a decimal part starting with a dot ((\\.\\d+)?).\nconst regex = /^(\\D*)(\\d+)(\\.\\d+)?$/;\n\n/**\n * Finds if last characters in input are a number and increments\n */\nexport function getIncrement(input: string): string {\n // Check if the input string contains a number at the end\n const match = regex.exec(input);\n if (match) {\n // If a number is found, extract the non-numeric prefix, integer part, and decimal part\n // eslint-disable-next-line prefer-const -- some items in the destructuring are modified\n let [, prefix, integerPart, decimalPart] = match;\n\n if (decimalPart) {\n if (decimalPart === '.99') {\n decimalPart = '.100';\n } else {\n const addDecimal = `${'0'.repeat(decimalPart.length - 2)}1`;\n const incrementedDecimal = (Number(decimalPart) + Number(`0.${addDecimal}`)).toFixed(decimalPart.length - 1);\n decimalPart = incrementedDecimal.toString().replace('0.', '.');\n }\n return `${prefix}${integerPart}${decimalPart}`;\n }\n const incrementedInteger = Number(integerPart) + 1;\n integerPart = incrementedInteger.toString();\n return `${prefix}${integerPart}`;\n }\n // If no number is found, append \"2\" to the string and return the updated string\n return `${input}2`;\n}\n\n/**\n * Gets suitable name for a new event cue\n */\nexport function getCueCandidate(entries: RundownEntries, order: EntryId[], insertAfterId: EntryId | null): string {\n // we did not provide a element to go after, we attempt to go first so only need to check for a cue with value 1\n if (insertAfterId === null || order.length === 0) {\n return addAtTop();\n }\n\n // get the given event, or any before that\n let previousEvent: OntimeEntry | null | undefined = entries[insertAfterId];\n\n if (!isOntimeEvent(previousEvent)) {\n previousEvent = getPreviousEventNormal(entries, order, insertAfterId).previousEvent;\n if (!isOntimeEvent(previousEvent)) {\n return addAtTop();\n }\n }\n\n // the cue is based on the previous event cue\n const cue = getIncrement(previousEvent.cue);\n const { nextEvent } = getNextEventNormal(entries, order, insertAfterId);\n\n // if increment is clashing with next, we add a decimal instead\n if (cue !== nextEvent?.cue) {\n return cue;\n }\n\n // there is a clash, bt the cue is a pure number\n if (isNumeric(cue)) {\n return incrementDecimal(previousEvent.cue);\n }\n\n /**\n * at this point, we know the cue is not numeric\n * but the increment failed, so we have a numeric ending\n * eg. Presenter 1 .... Presenter 2 -> Presenter1.1\n * eg. Presenter 1.1 .... Presenter 1.2 -> Presenter1.1.1\n */\n return `${previousEvent.cue}.1`;\n\n function incrementDecimal(cue: string) {\n const n = Number(cue);\n return (n + 0.1).toString();\n }\n\n function addAtTop() {\n const firstEventCue = getFirstEventNormal(entries, order).firstEvent?.cue;\n if (firstEventCue === '1') {\n return '0.1';\n }\n return '1';\n }\n}\n\nexport function sanitiseCue(cue: string) {\n return cue.replaceAll(' ', '').replaceAll(',', '.');\n}\n","import style from './EventEditorImage.module.scss';\n\ninterface EventEditorImageProps {\n src: string;\n}\n\nexport default function EventEditorImage({ src }: EventEditorImageProps) {\n return (\n <div className={style.imageContainer}>\n {Boolean(src) && <img loading='lazy' src={src} />}\n <div className={style.imageOverlay} />\n </div>\n );\n}\n","import { RefObject, useEffect } from 'react';\n// @ts-expect-error no types from library\nimport autosize from 'autosize/dist/autosize';\n\nimport Textarea, { type TextareaProps } from '../textarea/Textarea';\n\ninterface AutoTextAreaProps extends TextareaProps {\n inputref: RefObject<HTMLTextAreaElement | null>;\n}\n\n/**\n * A textarea that automatically resizes based on its content\n */\nexport function AutoTextarea({ value, inputref, ...textAreaProps }: AutoTextAreaProps) {\n // when the value changes, we use the ref to reapply autosize\n useEffect(() => {\n const node = inputref.current;\n autosize(inputref.current);\n\n return () => {\n autosize.destroy(node);\n };\n }, [inputref, value]);\n\n return <Textarea ref={inputref} value={value} {...textAreaProps} />;\n}\n","import { ChangeEvent, KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { getHotkeyHandler, HotkeyItem } from '@mantine/hooks';\n\ninterface UseReactiveTextInputReturn {\n value: string;\n onChange: (event: ChangeEvent) => void;\n onBlur: (event: ChangeEvent) => void;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n}\n\nexport default function useReactiveTextInput(\n initialText: string,\n submitCallback: (newValue: string) => void,\n ref: RefObject<HTMLInputElement | HTMLTextAreaElement | null>,\n options?: {\n submitOnEnter?: boolean;\n submitOnCtrlEnter?: boolean;\n onCancelUpdate?: () => void;\n allowSubmitSameValue?: boolean;\n allowKeyboardNavigation?: boolean;\n },\n): UseReactiveTextInputReturn {\n const [text, setText] = useState<string>(initialText);\n // track whether we are submitting via a submit key (eg enter) and avoid submitting again on blur\n const isKeyboardSubmitting = useRef(false);\n\n useEffect(() => {\n if (typeof initialText === 'undefined') {\n setText('');\n } else {\n setText(initialText);\n }\n }, [initialText]);\n\n /**\n * @description Handles Input value change\n * @param {string} newValue\n */\n const handleChange = useCallback(\n (newValue: string) => {\n if (newValue !== text) {\n setText(newValue);\n }\n },\n [text],\n );\n\n /**\n * @description Handles submit events\n * @param {string} valueToSubmit\n */\n const handleSubmit = useCallback(\n (valueToSubmit: string) => {\n // No need to update if it hasn't changed\n if (valueToSubmit === initialText && !options?.allowSubmitSameValue) {\n options?.onCancelUpdate?.();\n } else {\n const cleanVal = valueToSubmit.trim();\n submitCallback(cleanVal);\n if (cleanVal !== valueToSubmit) {\n setText(cleanVal);\n }\n }\n\n setTimeout(() => {\n if (options?.allowKeyboardNavigation) {\n ref.current?.parentElement?.focus(); // Focus on parent element to continue keyboard navigation\n } else {\n ref.current?.blur();\n }\n }); // Immediate timeout to ensure text is set before blurring\n },\n [initialText, options, ref, submitCallback],\n );\n\n /**\n * @description Handles escape events\n * @param {string} valueToSubmit\n */\n const handleEscape = useCallback(() => {\n // No need to update if it hasn't changed\n setText(initialText);\n // force the text to be the initial value\n if (ref.current) {\n ref.current.value = initialText;\n }\n options?.onCancelUpdate?.();\n setTimeout(() => ref.current?.blur()); // Immediate timeout to ensure text is set before blurring\n }, [initialText, options, ref]);\n\n const keyHandler = useMemo(() => {\n const hotKeys: HotkeyItem[] = [\n [\n 'Escape',\n (event) => {\n event.preventDefault();\n handleEscape();\n },\n { preventDefault: true },\n ],\n ];\n\n if (options?.submitOnEnter) {\n hotKeys.push([\n 'Enter',\n () => {\n isKeyboardSubmitting.current = true;\n handleSubmit(text);\n // clear flag after blur has been processed\n setTimeout(() => {\n isKeyboardSubmitting.current = false;\n }, 0);\n },\n ]);\n }\n\n if (options?.submitOnCtrlEnter) {\n hotKeys.push([\n 'mod + Enter',\n () => {\n isKeyboardSubmitting.current = true;\n handleSubmit(text);\n // clear flag after blur has been processed\n setTimeout(() => {\n isKeyboardSubmitting.current = false;\n }, 0);\n },\n ]);\n }\n\n const hotKeyHandler = getHotkeyHandler(hotKeys);\n\n return (event: KeyboardEvent<HTMLElement>) => {\n // allow moving in input field with arrow keys\n if (\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown'\n ) {\n event.stopPropagation();\n }\n\n hotKeyHandler(event);\n };\n }, [handleEscape, handleSubmit, options?.submitOnCtrlEnter, options?.submitOnEnter, text]);\n\n return {\n value: text,\n onChange: (event: ChangeEvent) => handleChange((event.target as HTMLInputElement).value),\n onBlur: (event: ChangeEvent) => {\n if (!isKeyboardSubmitting.current) {\n handleSubmit((event.target as HTMLInputElement).value);\n }\n },\n onKeyDown: keyHandler,\n };\n}\n","import { type CSSProperties, useCallback, useRef } from 'react';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport { AutoTextarea } from '../../../../common/components/input/auto-textarea/AutoTextarea';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\nimport { EventEditorUpdateFields } from '../EventEditor';\n\ninterface CountedTextAreaProps {\n className?: string;\n field: EventEditorUpdateFields;\n label: string;\n initialValue: string;\n style?: CSSProperties;\n submitHandler: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EventTextArea({\n className,\n field,\n label,\n initialValue,\n style: givenStyles,\n submitHandler,\n}: CountedTextAreaProps) {\n const ref = useRef<HTMLTextAreaElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnCtrlEnter: true,\n });\n\n return (\n <div>\n <Editor.Label className={className} htmlFor={field} style={givenStyles}>\n {label}\n </Editor.Label>\n <AutoTextarea\n id={field}\n inputref={ref}\n rows={1}\n data-testid='input-textarea'\n fluid\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n}\n","import { useCallback, useRef } from 'react';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport Input, { type InputProps } from '../../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../../common/components/input/text-input/useReactiveTextInput';\nimport { EventEditorUpdateFields } from '../EventEditor';\nimport { GroupEditorUpdateTextFields } from '../GroupEditor';\n\ninterface EntryEditorTextInputProps extends InputProps {\n field: EventEditorUpdateFields | GroupEditorUpdateTextFields;\n label: string;\n initialValue: string;\n placeholder?: string;\n submitHandler: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EntryEditorTextInput({\n className,\n field,\n label,\n initialValue,\n style: givenStyles,\n submitHandler,\n maxLength,\n placeholder,\n}: EntryEditorTextInputProps) {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n return (\n <div>\n <Editor.Label className={className} htmlFor={field} style={givenStyles}>\n {label}\n </Editor.Label>\n <Input\n id={field}\n ref={ref}\n maxLength={maxLength}\n fluid\n data-testid='input-textfield'\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n </div>\n );\n}\n","import { CSSProperties, Fragment } from 'react';\nimport { CustomFields, OntimeEvent, OntimeGroup, OntimeMilestone } from 'ontime-types';\n\nimport { getAccessibleColour } from '../../../../common/utils/styleUtils';\nimport { EventEditorUpdateFields } from '../EventEditor';\n\nimport EventEditorImage from './EventEditorImage';\nimport EventTextArea from './EventTextArea';\nimport EntryEditorTextInput from './EventTextInput';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EntryEditorCustomFieldsProps {\n fields: CustomFields;\n entry: OntimeEvent | OntimeGroup | OntimeMilestone;\n handleSubmit: (field: EventEditorUpdateFields, value: string) => void;\n}\n\nexport default function EntryEditorCustomFields({\n fields: customFields,\n handleSubmit,\n entry,\n}: EntryEditorCustomFieldsProps) {\n return (\n <Fragment>\n {Object.keys(customFields).map((fieldKey) => {\n const key = `${entry.id}-${fieldKey}`;\n const fieldName = `custom-${fieldKey}`;\n const initialValue = entry.custom[fieldKey] ?? '';\n const { backgroundColor, color } = getAccessibleColour(customFields[fieldKey].colour);\n const labelText = customFields[fieldKey].label;\n\n if (customFields[fieldKey].type === 'text') {\n return (\n <EventTextArea\n key={key}\n field={fieldName}\n label={labelText}\n initialValue={initialValue}\n submitHandler={handleSubmit}\n className={style.decorated}\n style={{ '--decorator-bg': backgroundColor, '--decorator-color': color } as CSSProperties}\n />\n );\n }\n\n if (customFields[fieldKey].type === 'image') {\n return (\n <div key={key} className={style.customImage}>\n <EntryEditorTextInput\n key={key}\n field={fieldName}\n label={labelText}\n initialValue={initialValue}\n placeholder='Paste image URL'\n submitHandler={handleSubmit}\n className={style.decorated}\n maxLength={255}\n style={{ '--decorator-bg': backgroundColor, '--decorator-color': color } as CSSProperties}\n />\n <EventEditorImage src={initialValue} />\n </div>\n );\n }\n\n // we should have exhausted all types by now\n return null;\n })}\n </Fragment>\n );\n}\n","import { PropsWithChildren } from 'react';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TimeInputGroup.module.scss';\n\ninterface TimeInputGroupProps {\n hasDelay?: boolean;\n}\n\nexport default function TimeInputGroup({ hasDelay, children }: PropsWithChildren<TimeInputGroupProps>) {\n return <div className={cx([style.inputGroup, hasDelay && style.delayed])}>{children}</div>;\n}\n","import { memo } from 'react';\nimport { IoAlertCircleOutline, IoLink, IoLockClosed, IoLockOpenOutline, IoUnlink } from 'react-icons/io5';\nimport { TimeField, TimeStrategy } from 'ontime-types';\nimport { dayInMs } from 'ontime-utils';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport TimeInput from '../../../common/components/input/time-input/TimeInput';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\n\nimport TimeInputGroup from './TimeInputGroup';\n\nimport style from './TimeInputFlow.module.scss';\n\ninterface TimeInputFlowProps {\n eventId: string;\n countToEnd: boolean;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n delay: number;\n showLabels?: boolean;\n}\n\nexport default memo(TimeInputFlow);\nfunction TimeInputFlow({\n eventId,\n countToEnd,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n delay,\n showLabels,\n}: TimeInputFlowProps) {\n const { updateEntry, updateTimer } = useEntryActions();\n\n // In sync with EventEditorTimes\n const handleSubmit = (field: TimeField, value: string) => {\n updateTimer(eventId, field, value);\n };\n\n const handleChangeStrategy = (timeStrategy: TimeStrategy) => {\n updateEntry({ id: eventId, timeStrategy });\n };\n\n const handleLink = (doLink: boolean) => {\n updateEntry({ id: eventId, linkStart: doLink });\n };\n\n const warnings = [];\n if (timeStart + duration > dayInMs) {\n warnings.push('Over midnight');\n }\n\n if (countToEnd) {\n warnings.push('Count to End');\n }\n\n const hasDelay = delay !== 0;\n const isLockedEnd = timeStrategy === TimeStrategy.LockEnd;\n const isLockedDuration = timeStrategy === TimeStrategy.LockDuration;\n\n return (\n <>\n <div>\n {showLabels && <Editor.Label className={style.sectionTitle}>Start time</Editor.Label>}\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='timeStart'\n submitHandler={handleSubmit}\n time={timeStart}\n placeholder='Start'\n align='left'\n disabled={linkStart}\n />\n <Tooltip\n text='Link start to previous end'\n onClick={() => handleLink(!linkStart)}\n render={<IconButton variant='subtle-white' className={linkStart ? style.active : style.inactive} />}\n >\n <span className={style.fourtyfive}>{linkStart ? <IoLink /> : <IoUnlink />}</span>\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n <div>\n {showLabels && <Editor.Label>End time</Editor.Label>}\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='timeEnd'\n submitHandler={handleSubmit}\n time={timeEnd}\n placeholder='End'\n align='left'\n disabled={isLockedDuration}\n />\n <Tooltip\n text='Lock end'\n render={<IconButton variant='subtle-white' className={isLockedEnd ? style.active : style.inactive} />}\n onClick={() => handleChangeStrategy(TimeStrategy.LockEnd)}\n data-testid='lock__end'\n >\n {isLockedEnd ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n <div>\n {showLabels && <Editor.Label>Duration</Editor.Label>}\n <TimeInputGroup hasDelay={hasDelay}>\n <TimeInput\n name='duration'\n submitHandler={handleSubmit}\n time={duration}\n placeholder='Duration'\n align='left'\n disabled={isLockedEnd}\n />\n <Tooltip\n text='Lock duration'\n render={<IconButton variant='subtle-white' className={isLockedDuration ? style.active : style.inactive} />}\n onClick={() => handleChangeStrategy(TimeStrategy.LockDuration)}\n data-testid='lock__duration'\n >\n {isLockedDuration ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n\n {warnings.length > 0 && (\n <Tooltip text={warnings.join(' - ')} className={style.timerNote} data-testid='event-warning' render={<span />}>\n <IoAlertCircleOutline />\n </Tooltip>\n )}\n </>\n );\n}\n","import { memo } from 'react';\nimport { IoInformationCircle } from 'react-icons/io5';\nimport { EndAction, TimerType, TimeStrategy } from 'ontime-types';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport TimeInput from '../../../../common/components/input/time-input/TimeInput';\nimport Select from '../../../../common/components/select/Select';\nimport Switch from '../../../../common/components/switch/Switch';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { millisToDelayString } from '../../../../common/utils/dateConfig';\nimport TimeInputFlow from '../../time-input-flow/TimeInputFlow';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EventEditorTimesProps {\n eventId: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n countToEnd: boolean;\n delay: number;\n endAction: EndAction;\n timerType: TimerType;\n timeWarning: number;\n timeDanger: number;\n}\n\ntype HandledActions = 'countToEnd' | 'timerType' | 'endAction' | 'timeWarning' | 'timeDanger';\n\nexport default memo(EventEditorTimes);\nfunction EventEditorTimes({\n eventId,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n countToEnd,\n delay,\n endAction,\n timerType,\n timeWarning,\n timeDanger,\n}: EventEditorTimesProps) {\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = (field: HandledActions, value: string | boolean) => {\n if (field === 'countToEnd') {\n updateEntry({ id: eventId, countToEnd: value as boolean });\n return;\n }\n\n if (field === 'timeWarning' || field === 'timeDanger') {\n const newTime = parseUserTime(value as string);\n updateEntry({ id: eventId, [field]: newTime });\n return;\n }\n\n if (field === 'timerType' || field === 'endAction') {\n updateEntry({ id: eventId, [field]: value });\n return;\n }\n };\n\n const hasDelay = delay !== 0;\n const delayLabel = hasDelay\n ? `Event is ${millisToDelayString(delay, 'expanded')}. New schedule ${millisToString(\n timeStart + delay,\n )} → ${millisToString(timeEnd + delay)}`\n : '';\n\n return (\n <>\n <div className={style.column}>\n <Editor.Title>Event schedule</Editor.Title>\n <div>\n <div className={style.inline}>\n <TimeInputFlow\n eventId={eventId}\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n timeStrategy={timeStrategy}\n linkStart={linkStart}\n delay={delay}\n countToEnd={countToEnd}\n showLabels\n />\n </div>\n <div className={style.delayLabel}>{delayLabel}</div>\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>Event Behaviour</Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='endAction'>End Action</Editor.Label>\n <Select\n value={endAction}\n onValueChange={(value) => handleSubmit('endAction', value)}\n options={[\n { value: EndAction.None, label: 'None' },\n { value: EndAction.LoadNext, label: 'Load next event' },\n { value: EndAction.PlayNext, label: 'Play next event' },\n ]}\n />\n </div>\n <div>\n <Editor.Label htmlFor='countToEnd'>Count to End</Editor.Label>\n <Editor.Label className={style.switchLabel}>\n <Switch\n id='countToEnd'\n checked={countToEnd}\n onCheckedChange={(value) => handleSubmit('countToEnd', value)}\n />\n {countToEnd ? 'On' : 'Off'}\n </Editor.Label>\n </div>\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n <Tooltip\n text='Changes how the timer is displayed in different views. It is not reflected in the rundown'\n render={<span />}\n >\n Display Options\n <IoInformationCircle className={style.tooltipIcon} />\n </Tooltip>\n </Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='timerType'>Timer Type</Editor.Label>\n <Select\n value={timerType}\n onValueChange={(value) => handleSubmit('timerType', value)}\n options={[\n { value: TimerType.CountDown, label: 'Count down' },\n { value: TimerType.CountUp, label: 'Count up' },\n { value: TimerType.Clock, label: 'Clock' },\n { value: TimerType.None, label: 'None' },\n ]}\n />\n </div>\n\n <div className={style.inline}>\n <div>\n <Editor.Label htmlFor='timeWarning'>Warning Time</Editor.Label>\n <TimeInput\n id='timeWarning'\n name='timeWarning'\n submitHandler={handleSubmit}\n time={timeWarning}\n placeholder='Duration'\n />\n </div>\n <div>\n <Editor.Label htmlFor='timeDanger'>Danger Time</Editor.Label>\n <TimeInput\n id='timeDanger'\n name='timeDanger'\n submitHandler={handleSubmit}\n time={timeDanger}\n placeholder='Duration'\n />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n}\n","import { memo } from 'react';\nimport { sanitiseCue } from 'ontime-utils';\n\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../../common/components/input/colour-input/SwatchSelect';\nimport Input from '../../../../common/components/input/input/Input';\nimport Switch from '../../../../common/components/switch/Switch';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\n\nimport EventTextArea from './EventTextArea';\nimport EntryEditorTextInput from './EventTextInput';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface EventEditorTitlesProps {\n eventId: string;\n cue: string;\n flag: boolean;\n title: string;\n note: string;\n colour: string;\n}\n\nexport default memo(EventEditorTitles);\nfunction EventEditorTitles({ eventId, cue, flag, title, note, colour }: EventEditorTitlesProps) {\n const { updateEntry } = useEntryActions();\n\n const cueSubmitHandler = (_field: string, newValue: string) => {\n updateEntry({ id: eventId, cue: sanitiseCue(newValue) });\n };\n\n const flagSubmitHandler = (newValue: boolean) => {\n updateEntry({ id: eventId, flag: newValue });\n };\n\n const textSubmitHandler = (field: string, newValue: string) => {\n updateEntry({ id: eventId, [field]: newValue });\n };\n\n return (\n <div className={style.column}>\n <Editor.Title>Event Data</Editor.Title>\n <div className={style.splitThree}>\n <div>\n <Editor.Label htmlFor='eventId'>Event ID (read only)</Editor.Label>\n <Input id='eventId' data-testid='input-textfield' value={eventId} readOnly fluid />\n </div>\n <EntryEditorTextInput\n field='cue'\n label='Cue'\n initialValue={cue}\n submitHandler={cueSubmitHandler}\n maxLength={10}\n />\n <div>\n <Editor.Label htmlFor='flag'>Flag</Editor.Label>\n <Editor.Label className={style.switchLabel}>\n <Switch id='flag' checked={flag} onCheckedChange={flagSubmitHandler} />\n {flag ? 'On' : 'Off'}\n </Editor.Label>\n </div>\n </div>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={colour} handleChange={textSubmitHandler} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={title} submitHandler={textSubmitHandler} />\n <EventTextArea field='note' label='Note' initialValue={note} submitHandler={textSubmitHandler} />\n </div>\n );\n}\n","import { TimerLifeCycle } from 'ontime-types';\n\nexport const eventTriggerOptions: TimerLifeCycle[] = [\n TimerLifeCycle.onLoad,\n TimerLifeCycle.onStart,\n TimerLifeCycle.onPause,\n TimerLifeCycle.onFinish,\n TimerLifeCycle.onWarning,\n TimerLifeCycle.onDanger,\n];\n","import { Fragment, useCallback, useMemo, useState } from 'react';\nimport { IoAlertCircle, IoCheckmarkCircle, IoTrash } from 'react-icons/io5';\nimport { TimerLifeCycle, timerLifecycleValues, Trigger } from 'ontime-types';\nimport { generateId } from 'ontime-utils';\n\nimport Button from '../../../../common/components/buttons/Button';\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport Select from '../../../../common/components/select/Select';\nimport Tag from '../../../../common/components/tag/Tag';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport useAutomationSettings from '../../../../common/hooks-query/useAutomationSettings';\n\nimport { eventTriggerOptions } from './eventTrigger.constants';\n\nimport style from './EventEditorTriggers.module.scss';\n\ninterface EventEditorTriggersProps {\n eventId: string;\n triggers: Trigger[];\n}\n\nexport default function EventEditorTriggers({ triggers, eventId }: EventEditorTriggersProps) {\n const showTriggers = triggers.length > 0;\n\n return (\n <>\n {showTriggers && <ExistingEventTriggers triggers={triggers} eventId={eventId} />}\n <EventTriggerForm triggers={triggers} eventId={eventId} />\n </>\n );\n}\n\ninterface EventTriggerFormProps {\n eventId: string;\n triggers?: Trigger[];\n}\n\nfunction EventTriggerForm({ eventId, triggers }: EventTriggerFormProps) {\n const { data: automationSettings } = useAutomationSettings();\n const { updateEntry } = useEntryActions();\n const [automationId, setAutomationId] = useState<string | undefined>(undefined);\n const [cycleValue, setCycleValue] = useState(TimerLifeCycle.onStart);\n\n const handleSubmit = (triggerLifeCycle: TimerLifeCycle, automationId: string) => {\n const newTriggers = triggers ?? new Array<Trigger>();\n const id = generateId();\n newTriggers.push({ id, title: '', trigger: triggerLifeCycle, automationId });\n updateEntry({ id: eventId, triggers: newTriggers });\n };\n\n const getValidationError = (cycle: TimerLifeCycle, automationId?: string): string | undefined => {\n if (automationId === undefined) {\n return 'Select an automation';\n }\n if (!Object.keys(automationSettings.automations).includes(automationId)) {\n return 'This automation does not exist';\n }\n if (triggers === undefined) {\n return;\n }\n return Object.values(triggers).some((t) => t.automationId === automationId && t.trigger === cycle)\n ? 'Automation can only be used once'\n : undefined;\n };\n\n const validationError = getValidationError(cycleValue, automationId);\n\n const triggerOptions = useMemo(\n () => [\n { value: null, label: 'Select Trigger' },\n ...eventTriggerOptions.map((cycle) => ({ value: cycle, label: cycle })),\n ],\n [], // eventTriggerOptions is a constant, no need for dependency\n );\n\n const automationOptions = useMemo(\n () => [\n { value: null, label: 'Select Automation' },\n ...Object.values(automationSettings.automations).map(({ id, title }) => ({ value: id, label: title })),\n ],\n [automationSettings.automations], // This needs to be a dependency as it can change\n );\n\n return (\n <div className={style.triggerForm}>\n <Select\n value={cycleValue}\n onValueChange={(value) => {\n if (value !== null) setCycleValue(value);\n }}\n options={triggerOptions}\n />\n\n <Select\n value={automationId ?? null}\n onValueChange={(value) => {\n if (value !== null) setAutomationId(value);\n }}\n options={automationOptions}\n />\n\n <Button\n disabled={validationError !== undefined}\n onClick={() => automationId && handleSubmit(cycleValue, automationId)}\n >\n Add\n </Button>\n {validationError !== undefined ? (\n <Tooltip text={validationError} render={<span />}>\n <IoAlertCircle className={style.errorLabel} />\n </Tooltip>\n ) : (\n <IoCheckmarkCircle className={style.success} />\n )}\n </div>\n );\n}\n\ninterface ExistingEventTriggersProps {\n eventId: string;\n triggers: Trigger[];\n}\n\nfunction ExistingEventTriggers({ eventId, triggers }: ExistingEventTriggersProps) {\n const { updateEntry } = useEntryActions();\n const { data: automationSettings } = useAutomationSettings();\n\n const handleDelete = useCallback(\n (triggerId: string) => {\n const newTriggers = triggers.filter((trigger) => trigger.id !== triggerId);\n updateEntry({ id: eventId, triggers: newTriggers });\n },\n [eventId, triggers, updateEntry],\n );\n\n const filteredTriggers: Record<string, Trigger[]> = {};\n\n // sort triggers out into groups by the Lifecycle they are on\n timerLifecycleValues.forEach((triggerType) => {\n const thisTriggerType = triggers.filter((trigger) => trigger.trigger === triggerType);\n if (thisTriggerType.length) {\n Object.assign(filteredTriggers, { [triggerType]: thisTriggerType });\n }\n });\n\n return (\n <div>\n {Object.entries(filteredTriggers).map(([triggerLifeCycle, triggerGroup]) => (\n <Fragment key={triggerLifeCycle}>\n {triggerGroup.map((trigger) => {\n const { id, automationId } = trigger;\n const automationTitle = automationSettings.automations[automationId]?.title ?? '<MISSING AUTOMATION>';\n return (\n <div key={id} className={style.trigger}>\n <Tag>{triggerLifeCycle}</Tag>\n <Tag>{automationTitle}</Tag>\n <IconButton variant='ghosted-destructive' onClick={() => handleDelete(id)}>\n <IoTrash />\n </IconButton>\n </div>\n );\n })}\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { OntimeEvent } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventEditorTimes from './composite/EventEditorTimes';\nimport EventEditorTitles from './composite/EventEditorTitles';\nimport EventEditorTriggers from './composite/EventEditorTriggers';\n\nimport style from './EntryEditor.module.scss';\n\n// any of the titles + colour + custom field labels\nexport type EventEditorUpdateFields = 'cue' | 'title' | 'note' | 'colour' | string;\n\ninterface EventEditorProps {\n event: OntimeEvent;\n}\n\nexport default function EventEditor({ event }: EventEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const isEditor = window.location.pathname.includes('editor');\n\n const handleSubmit = useCallback(\n (field: EventEditorUpdateFields, value: string) => {\n if (field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: event.id, custom: { [fieldLabel]: value } });\n } else {\n updateEntry({ id: event.id, [field]: value });\n }\n },\n [event.id, updateEntry],\n );\n\n return (\n <div className={style.content}>\n <EventEditorTimes\n key={`${event.id}-times`}\n eventId={event.id}\n timeStart={event.timeStart}\n timeEnd={event.timeEnd}\n duration={event.duration}\n timeStrategy={event.timeStrategy}\n linkStart={event.linkStart}\n countToEnd={event.countToEnd}\n delay={event.delay}\n endAction={event.endAction}\n timerType={event.timerType}\n timeWarning={event.timeWarning}\n timeDanger={event.timeDanger}\n />\n <EventEditorTitles\n key={`${event.id}-titles`}\n eventId={event.id}\n cue={event.cue}\n flag={event.flag}\n title={event.title}\n note={event.note}\n colour={event.colour}\n />\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={event} />\n </div>\n <div className={style.column}>\n <Editor.Title>\n Automations\n {isEditor && <AppLink search='settings=automation'>Manage Automations</AppLink>}\n </Editor.Title>\n <EventEditorTriggers triggers={event.triggers} eventId={event.id} />\n </div>\n </div>\n );\n}\n","import { forwardRef, HTMLAttributes, memo, PropsWithChildren, useImperativeHandle, useRef } from 'react';\n\nimport { cx } from '../../../../common/utils/styleUtils';\n\nimport style from './TextLikeInput.module.scss';\n\ninterface TextLikeInputProps extends HTMLAttributes<HTMLSpanElement> {\n offset?: 'over' | 'under' | 'muted' | null;\n muted?: boolean;\n disabled?: boolean;\n}\n\nconst TextLikeInput = forwardRef(\n (\n { offset, muted, disabled, children, className, ...elementProps }: PropsWithChildren<TextLikeInputProps>,\n textRef,\n ) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const classes = cx([\n style.textInput,\n offset && style[offset],\n muted && style.muted,\n disabled && style.disabled,\n className,\n ]);\n\n useImperativeHandle(textRef, () => {\n return {\n focusParentElement() {\n ref.current?.parentElement?.focus();\n },\n };\n });\n\n return (\n <div className={classes} tabIndex={disabled ? -1 : 0} {...elementProps} ref={ref}>\n {children}\n </div>\n );\n },\n);\n\nTextLikeInput.displayName = 'TextLikeInput';\n\nexport default memo(TextLikeInput);\n","import { FocusEvent, KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { cx } from '../../../utils/styleUtils';\nimport Input from '../input/Input';\n\nimport style from './TimeInput.module.scss';\n\ninterface NullableTimeInputProps<T extends string> {\n id?: T;\n name: T;\n submitHandler: (field: T, value: number) => void;\n time?: number | null;\n emptyDisplay: string;\n placeholder?: string;\n disabled?: boolean;\n align?: 'left' | 'center';\n className?: string;\n}\n\n/**\n * Similar to TimeInput, but allows clearing the time value\n */\nexport default function NullableTimeInput<T extends string>({\n id,\n name,\n submitHandler,\n time,\n emptyDisplay,\n placeholder,\n disabled,\n align = 'center',\n className,\n}: NullableTimeInputProps<T>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [value, setValue] = useState<string>('');\n const ignoreChange = useRef(false);\n\n /**\n * @description Resets input value to given\n */\n const resetValue = useCallback(() => {\n if (typeof time !== 'number' || isNaN(time)) {\n setValue(emptyDisplay);\n } else {\n setValue(millisToString(time));\n }\n }, [emptyDisplay, time]);\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = useCallback(() => {\n inputRef.current?.select();\n }, []);\n\n /**\n * @description Submit handler\n * @param {string} newValue\n */\n const handleSubmit = useCallback(\n (newValue: string) => {\n // skip if user deleted and time is already null\n if (newValue === '' && time === null) {\n return false;\n }\n\n // skip if the value evaluates to the same thing\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis === time) {\n return false;\n }\n\n submitHandler(name, valueInMillis);\n return true;\n },\n [name, submitHandler, time],\n );\n\n /**\n * @description Prepare time fields\n * @param {string} value string to be parsed\n */\n const validateAndSubmit = useCallback(\n (newValue: string) => {\n const success = handleSubmit(newValue);\n if (!success) {\n resetValue();\n }\n },\n [handleSubmit, resetValue],\n );\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n }\n if (event.key === 'Escape') {\n ignoreChange.current = true;\n inputRef.current?.blur();\n resetValue();\n }\n },\n [resetValue],\n );\n\n const onBlurHandler = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (ignoreChange.current) {\n ignoreChange.current = false;\n return;\n }\n validateAndSubmit((event.target as HTMLInputElement).value);\n },\n [validateAndSubmit],\n );\n\n useEffect(() => {\n resetValue();\n }, [resetValue]);\n\n return (\n <Input\n id={id}\n disabled={disabled}\n ref={inputRef}\n data-testid={`time-input-${name}`}\n className={cx([style.timeInput, className])}\n placeholder={placeholder}\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlurHandler}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={8}\n autoComplete='off'\n style={{\n textAlign: align,\n }}\n />\n );\n}\n","import { IoLockClosed, IoLockOpenOutline } from 'react-icons/io5';\nimport { MaybeNumber } from 'ontime-types';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport * as Editor from '../../../../common/components/editor-utils/EditorUtils';\nimport NullableTimeInput from '../../../../common/components/input/time-input/NullableTimeInput';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { cx, enDash } from '../../../../common/utils/styleUtils';\nimport TimeInputGroup from '../../time-input-flow/TimeInputGroup';\n\nimport style from '../EntryEditor.module.scss';\n\ninterface TargetDurationInputProps {\n duration: MaybeNumber;\n targetDuration: MaybeNumber;\n submitHandler: (field: 'targetDuration', value: MaybeNumber) => void;\n}\n\nexport default function TargetDurationInput({ duration, targetDuration, submitHandler }: TargetDurationInputProps) {\n const isLocked = targetDuration !== null;\n\n return (\n <div>\n <Editor.Label htmlFor='targetDuration'>Target duration</Editor.Label>\n <TimeInputGroup hasDelay={isLocked && targetDuration !== duration}>\n <NullableTimeInput\n name='targetDuration'\n time={targetDuration}\n submitHandler={submitHandler}\n emptyDisplay={enDash}\n className={isLocked ? '' : style.inactive}\n />\n <Tooltip\n text='Lock to target duration'\n className={cx([style.timeAction, isLocked && style.active])}\n onClick={() => submitHandler('targetDuration', isLocked ? null : duration)}\n data-testid='lock__duration'\n render={<IconButton variant='subtle-white' className={isLocked ? style.active : style.inactive} />}\n >\n {isLocked ? <IoLockClosed /> : <IoLockOpenOutline />}\n </Tooltip>\n </TimeInputGroup>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { MaybeNumber, OntimeGroup } from 'ontime-types';\nimport { millisToString } from 'ontime-utils';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { cx, enDash, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport TextLikeInput from '../../../views/cuesheet/cuesheet-table/cuesheet-table-elements/TextLikeInput';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventTextArea from './composite/EventTextArea';\nimport EntryEditorTextInput from './composite/EventTextInput';\nimport TargetDurationInput from './composite/TargetDurationInput';\n\nimport style from './EntryEditor.module.scss';\n\n// title + colour + custom field labels\nexport type GroupEditorUpdateTextFields = 'title' | 'colour' | string;\nexport type GroupEditorUpdateMaybeNumberFields = 'targetDuration';\n\ninterface GroupEditorProps {\n group: OntimeGroup;\n}\n\nexport default function GroupEditor({ group }: GroupEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = useCallback(\n (field: GroupEditorUpdateTextFields | GroupEditorUpdateMaybeNumberFields, value: string | MaybeNumber) => {\n // Handle custom fields\n if (typeof field === 'string' && field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: group.id, custom: { [fieldLabel]: value as string } });\n return;\n }\n\n if (field === 'targetDuration') {\n return updateEntry({ id: group.id, targetDuration: value as MaybeNumber });\n }\n\n // all other strings are text fields\n return updateEntry({ id: group.id, [field]: value as string });\n },\n [group.id, updateEntry],\n );\n\n const isEditor = window.location.pathname.includes('editor');\n const planOffset = group.targetDuration === null ? null : group.duration - group.targetDuration;\n const planOffsetLabel = planOffset !== null ? getOffsetState(planOffset) : null;\n\n return (\n <div className={style.content}>\n <div className={style.column}>\n <Editor.Title>Group schedule</Editor.Title>\n <div className={style.inline}>\n <div>\n {\n // TODO: format with user time settings\n }\n <Editor.Label>First event start</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.timeStart, { fallback: timerPlaceholder })}\n </TextLikeInput>\n </div>\n <div>\n <Editor.Label>Last event end</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.timeEnd, { fallback: timerPlaceholder })}\n </TextLikeInput>\n </div>\n <div>\n <Editor.Label htmlFor='duration'>Scheduled duration</Editor.Label>\n <TextLikeInput className={style.textLikeInput} disabled>\n {millisToString(group.duration, { fallback: enDash })}\n </TextLikeInput>\n </div>\n </div>\n <div className={style.inline}>\n <div>\n <Editor.Label htmlFor='eventId'>Plan offset</Editor.Label>\n <TextLikeInput\n offset={planOffsetLabel}\n className={cx([style.textLikeInput, planOffset === null && style.inactive])}\n disabled\n >\n {planOffset !== null && planOffset > 0 ? '+' : ''}\n {millisToString(planOffset, { fallback: enDash })}\n </TextLikeInput>\n </div>\n <TargetDurationInput\n duration={group.duration}\n targetDuration={group.targetDuration}\n submitHandler={handleSubmit}\n />\n </div>\n </div>\n\n <div className={style.column}>\n <Editor.Title>Group data</Editor.Title>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={group.colour} handleChange={handleSubmit} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={group.title} submitHandler={handleSubmit} />\n <EventTextArea field='note' label='Note' initialValue={group.note} submitHandler={handleSubmit} />\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={group} />\n </div>\n </div>\n );\n}\n","import { useCallback } from 'react';\nimport { OntimeMilestone } from 'ontime-types';\n\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport SwatchSelect from '../../../common/components/input/colour-input/SwatchSelect';\nimport Input from '../../../common/components/input/input/Input';\nimport AppLink from '../../../common/components/link/app-link/AppLink';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport useCustomFields from '../../../common/hooks-query/useCustomFields';\n\nimport EntryEditorCustomFields from './composite/EventEditorCustomFields';\nimport EventTextArea from './composite/EventTextArea';\nimport EntryEditorTextInput from './composite/EventTextInput';\n\nimport style from './EntryEditor.module.scss';\n\n// cue + title + colour + custom field labels\nexport type MilestoneEditorUpdateTextFields = 'cue' | 'title' | 'colour' | string;\n\ninterface MilestoneEditorProps {\n milestone: OntimeMilestone;\n}\nexport default function MilestoneEditor({ milestone }: MilestoneEditorProps) {\n const { data: customFields } = useCustomFields();\n const { updateEntry } = useEntryActions();\n\n const handleSubmit = useCallback(\n (field: MilestoneEditorUpdateTextFields, value: string) => {\n // Handle custom fields\n if (typeof field === 'string' && field.startsWith('custom-')) {\n const fieldLabel = field.split('custom-')[1];\n updateEntry({ id: milestone.id, custom: { [fieldLabel]: value } });\n return;\n }\n // all other strings are text fields\n return updateEntry({ id: milestone.id, [field]: value });\n },\n [milestone.id, updateEntry],\n );\n\n const isEditor = window.location.pathname.includes('editor');\n\n return (\n <div className={style.content}>\n <div className={style.column}>\n <Editor.Title>Milestone data</Editor.Title>\n <div className={style.splitTwo}>\n <div>\n <Editor.Label htmlFor='entryId'>Milestone ID (read only)</Editor.Label>\n <Input id='entryId' data-testid='input-textfield' value={milestone.id} readOnly fluid />\n </div>\n <EntryEditorTextInput\n field='cue'\n label='Cue'\n initialValue={milestone.cue}\n submitHandler={handleSubmit}\n maxLength={10}\n />\n </div>\n <div>\n <Editor.Label>Colour</Editor.Label>\n <SwatchSelect name='colour' value={milestone.colour} handleChange={handleSubmit} />\n </div>\n <EntryEditorTextInput field='title' label='Title' initialValue={milestone.title} submitHandler={handleSubmit} />\n <EventTextArea field='note' label='Note' initialValue={milestone.note} submitHandler={handleSubmit} />\n </div>\n\n <div className={style.column}>\n <Editor.Title>\n Custom Fields\n {isEditor && <AppLink search='settings=manage__custom'>Manage Custom Fields</AppLink>}\n </Editor.Title>\n <EntryEditorCustomFields fields={customFields} handleSubmit={handleSubmit} entry={milestone} />\n </div>\n </div>\n );\n}\n"],"names":["TimerLifeCycle","timerLifecycleValues","sanitiseCue","cue","EventEditorImage","src","jsxs","style","jsx","AutoTextarea","value","inputref","textAreaProps","useEffect","node","autosize","Textarea","useReactiveTextInput","initialText","submitCallback","ref","options","text","setText","useState","isKeyboardSubmitting","useRef","handleChange","useCallback","newValue","handleSubmit","valueToSubmit","_a","cleanVal","_b","_c","handleEscape","keyHandler","useMemo","hotKeys","event","hotKeyHandler","getHotkeyHandler","EventTextArea","className","field","label","initialValue","givenStyles","submitHandler","onChange","onBlur","onKeyDown","Editor.Label","EntryEditorTextInput","maxLength","placeholder","Input","EntryEditorCustomFields","customFields","entry","Fragment","fieldKey","key","fieldName","backgroundColor","color","getAccessibleColour","labelText","TimeInputGroup","hasDelay","children","cx","memo","TimeInputFlow","eventId","countToEnd","timeStart","timeEnd","duration","timeStrategy","linkStart","delay","showLabels","updateEntry","updateTimer","useEntryActions","handleChangeStrategy","handleLink","doLink","warnings","dayInMs","isLockedEnd","TimeStrategy","isLockedDuration","TimeInput","Tooltip","IconButton","IoLink","IoUnlink","IoLockClosed","IoLockOpenOutline","IoAlertCircleOutline","EventEditorTimes","endAction","timerType","timeWarning","timeDanger","newTime","parseUserTime","delayLabel","millisToDelayString","millisToString","Editor.Title","Select","EndAction","Switch","IoInformationCircle","TimerType","EventEditorTitles","flag","title","note","colour","cueSubmitHandler","_field","flagSubmitHandler","textSubmitHandler","SwatchSelect","eventTriggerOptions","EventEditorTriggers","triggers","showTriggers","ExistingEventTriggers","EventTriggerForm","automationSettings","useAutomationSettings","automationId","setAutomationId","cycleValue","setCycleValue","triggerLifeCycle","newTriggers","id","generateId","validationError","cycle","t","triggerOptions","automationOptions","Button","IoAlertCircle","IoCheckmarkCircle","handleDelete","triggerId","trigger","filteredTriggers","triggerType","thisTriggerType","triggerGroup","automationTitle","Tag","IoTrash","EventEditor","useCustomFields","isEditor","fieldLabel","AppLink","TextLikeInput","forwardRef","offset","muted","disabled","elementProps","textRef","classes","useImperativeHandle","NullableTimeInput","name","time","emptyDisplay","align","inputRef","setValue","ignoreChange","resetValue","handleFocus","valueInMillis","validateAndSubmit","onKeyDownHandler","onBlurHandler","TargetDurationInput","targetDuration","isLocked","enDash","GroupEditor","group","planOffset","planOffsetLabel","getOffsetState","timerPlaceholder","MilestoneEditor","milestone"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._blink_1hjkh_1{animation:_blink_1hjkh_1 1s step-start infinite}@keyframes _blink_1hjkh_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1hjkh_13{transform:rotate(45deg)}._tag_1hjkh_17{font-size:calc(1rem - 3px);letter-spacing:.5px;background-color:#4c4c4c;color:#f6f6f6;border-radius:2px;padding:0 .25rem;white-space:nowrap}._blink_18ray_1{animation:_blink_18ray_1 1s step-start infinite}@keyframes _blink_18ray_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_18ray_13{transform:rotate(45deg)}._positioner_18ray_17{outline:0}._popup_18ray_21{box-sizing:border-box;padding-block:.25rem;color:#f6f6f6;background-color:#202020;font-size:calc(1rem - 2px);border-radius:3px;border:1px solid #404040;box-shadow:#00000026 0 3px 3px;outline:none;transform-origin:var(--transform-origin);transition:transform .15s,opacity .15s}._popup_18ray_21[data-starting-style],._popup_18ray_21[data-ending-style]{opacity:0;transform:scale(.9)}._item_18ray_39{outline:0;cursor:default;padding-block:.5rem;padding-inline:1rem 2rem;display:flex;gap:.5rem;line-height:1em}._item_18ray_39 svg{color:#9d9d9d}._item_18ray_39[data-disabled]{opacity:.4;cursor:not-allowed}._item_18ray_39[data-highlighted]{z-index:0;position:relative}._item_18ray_39[data-highlighted]:not([data-disabled]):before{content:"";z-index:-1;position:absolute;inset-block:0;inset-inline:.25rem;border-radius:3px;background-color:#404040}._item_18ray_39[data-type=destructive]{color:#fa5656}._item_18ray_39[data-type=destructive] svg{color:#fa5656}._separator_18ray_75{margin:.25rem .75rem;height:1px;background-color:#ffffff12}._blink_4rabb_1{animation:_blink_4rabb_1 1s step-start infinite}@keyframes _blink_4rabb_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_4rabb_13{transform:rotate(45deg)}._modal_4rabb_17{position:fixed;top:10vh;left:50%;transform:translate(-50%);padding-inline:1rem;min-width:min(880px,90vw);min-height:min(200px,10vh);max-width:min(1200px,90vw);background-color:#202020;color:#f6f6f6;border-radius:3px;box-shadow:#00000026 0 3px 3px;border:1px solid #2d2d2d;outline:none}._backdrop_4rabb_34{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000000b3;transition:opacity .3s cubic-bezier(.45,1.005,0,1.005)}._backdrop_4rabb_34[data-starting-style],._backdrop_4rabb_34[data-ending-style]{opacity:0}._title_4rabb_44{font-size:1rem;font-weight:600;padding-block:1rem;display:flex;align-items:center;justify-content:space-between}._body_4rabb_53{display:flex;flex-direction:column;gap:.5rem;max-height:60vh;overflow-y:auto}._footer_4rabb_61{padding-block:1rem;display:flex;align-items:center;justify-content:end;gap:1rem}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{e as i,k as w,j as a,br as N,h as k,bs as b,bt as g,bu as y,bv as h,bw as m,bx as x,by as j,D,p as $,q as v,s as C,t as I}from"./vendor-9UkPSc5K.js";import{aw as E,aE as S,bx as M,i as P,ai as A}from"./index-njXwwjfn.js";import{s as u,d as T}from"./useProjectData-DW06zQvF.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new s.Error().stack;e&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[e]="512a43b9-7ad4-4f5d-8c3d-dfbd53802719",s._sentryDebugIdIdentifier="sentry-dbid-512a43b9-7ad4-4f5d-8c3d-dfbd53802719")}catch{}})();const c=`${E}/automations`;async function F(){return(await i.get(c)).data}async function V(s){return(await i.post(c,s)).data}async function ss(s){return(await i.post(`${c}/trigger`,s)).data}async function as(s,e){return(await i.put(`${c}/trigger/${s}`,e)).data}function es(s){return i.delete(`${c}/trigger/${s}`)}async function ts(s){return(await i.post(`${c}/automation`,s)).data}async function ns(s,e){return(await i.put(`${c}/automation/${s}`,e)).data}function os(s){return i.delete(`${c}/automation/${s}`)}function rs(s){return i.post(`${c}/test`,s)}const O={enabledAutomations:!1,enabledOscIn:!1,oscPortIn:8888,triggers:[],automations:{}};function is(){const{data:s,status:e,isFetching:n,isError:o,refetch:t}=w({queryKey:M,queryFn:F,placeholderData:(r,p)=>r,retry:5,retryDelay:r=>r*2500,refetchInterval:S,networkMode:"always"});return{data:s??O,status:e,isFetching:n,isError:o,refetch:t}}const B="_tag_1hjkh_17",q={tag:B};function cs({children:s}){return a.jsx("span",{className:q.tag,children:s})}function R({color:s,isSelected:e,onClick:n}){const o=r=>{n==null||n(s),r.preventDefault(),r.stopPropagation()},t=P([u.swatch,e&&u.selected,n&&u.selectable]);return s?a.jsx("div",{className:t,style:{backgroundColor:`${s}`},onClick:o}):a.jsx("div",{className:t,onClick:o,children:a.jsx(N,{})})}const f=["","#FFCC78","#FFAB33","#77C785","#339E4E","#779BE7","#3E75E8","#FF7878","#ED3333","#A790F5","#8064E1","#9d9d9d","#ececec"];function ds(s){const{value:e,name:n,handleChange:o}=s,t=k.useCallback(r=>{r!==e&&o(n,r)},[o,n,e]);return a.jsxs("div",{className:u.list,children:[f.map(r=>a.jsx(R,{color:r,onClick:t,isSelected:e===r},r)),a.jsx(T,{color:e,onChange:t,isSelected:!f.includes(e)})]})}const Q="_positioner_18ray_17",U="_popup_18ray_21",K="_item_18ray_39",z="_separator_18ray_75",d={positioner:Q,popup:U,item:K,separator:z};function ls({items:s,children:e,...n}){return a.jsxs(b,{children:[a.jsx(g,{...n,children:e}),a.jsx(y,{children:a.jsx(h,{className:d.positioner,align:"start",sideOffset:8,children:a.jsx(m,{className:d.popup,children:s.map((o,t)=>o.type==="divider"?a.jsx(x,{className:d.separator},t):a.jsxs(j,{className:d.item,onClick:o.onClick,disabled:o.disabled,"data-type":o.type,children:[o.icon&&a.jsx(o.icon,{}),o.label]},t))})})})]})}function us({items:s,isOpen:e,position:n,onClose:o}){return a.jsxs(b,{open:e,onOpenChange:t=>{t||o()},children:[a.jsx(g,{style:{position:"fixed",left:n.x,top:n.y},"aria-hidden":!0}),a.jsx(y,{children:a.jsx(h,{className:d.positioner,align:"start",sideOffset:8,alignOffset:8,children:a.jsx(m,{className:d.popup,children:s.map((t,r)=>t.type==="divider"?a.jsx(x,{className:d.separator},r):a.jsxs(j,{className:d.item,onClick:t.onClick,disabled:t.disabled,children:[t.icon&&a.jsx(t.icon,{}),t.label]},r))})})})]})}const G="_modal_4rabb_17",H="_backdrop_4rabb_34",J="_title_4rabb_44",L="_body_4rabb_53",W="_footer_4rabb_61",l={modal:G,backdrop:H,title:J,body:L,footer:W};function ps({isOpen:s,title:e,showCloseButton:n,showBackdrop:o,bodyElements:t,footerElements:r,onClose:p}){return a.jsx(D,{open:s,onOpenChange:_=>{_||p()},dismissible:!1,children:a.jsxs($,{children:[o&&a.jsx(v,{className:l.backdrop}),a.jsxs(C,{className:l.modal,children:[a.jsxs("div",{className:l.title,children:[e,n&&a.jsx(A,{variant:"subtle-white",onClick:p,children:a.jsx(I,{})})]}),a.jsx("div",{className:l.body,children:t}),a.jsx("div",{className:l.footer,children:r})]})]})})}export{ls as D,ps as M,us as P,ds as S,cs as T,ns as a,ts as b,as as c,os as d,V as e,ss as f,es as g,R as h,rs as t,is as u};
|
|
2
|
+
//# sourceMappingURL=Modal-krcwDRb-.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal-krcwDRb-.js","sources":["../../src/common/api/automation.ts","../../src/common/models/AutomationSettings.ts","../../src/common/hooks-query/useAutomationSettings.ts","../../src/common/components/tag/Tag.tsx","../../src/common/components/input/colour-input/Swatch.tsx","../../src/common/components/input/colour-input/SwatchSelect.tsx","../../src/common/components/dropdown-menu/DropdownMenu.tsx","../../src/common/components/modal/Modal.tsx"],"sourcesContent":["import axios from 'axios';\nimport type {\n Automation,\n AutomationDTO,\n AutomationOutput,\n AutomationSettings,\n Trigger,\n TriggerDTO,\n} from 'ontime-types';\n\nimport { apiEntryUrl } from './constants';\n\nconst automationsPath = `${apiEntryUrl}/automations`;\n\n/**\n * HTTP request to get the automations settings\n */\nexport async function getAutomationSettings(): Promise<AutomationSettings> {\n const res = await axios.get(automationsPath);\n return res.data;\n}\n\n/**\n * HTTP request to edit the automations settings\n */\nexport async function editAutomationSettings(\n automationSettings: Partial<AutomationSettings>,\n): Promise<AutomationSettings> {\n const res = await axios.post(automationsPath, automationSettings);\n return res.data;\n}\n\n/**\n * HTTP request to create a new automation trigger\n */\nexport async function addTrigger(trigger: TriggerDTO): Promise<Trigger> {\n const res = await axios.post(`${automationsPath}/trigger`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to update an automation trigger\n */\nexport async function editTrigger(id: string, trigger: Trigger): Promise<Trigger> {\n const res = await axios.put(`${automationsPath}/trigger/${id}`, trigger);\n return res.data;\n}\n\n/**\n * HTTP request to delete an automation trigger\n */\nexport function deleteTrigger(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/trigger/${id}`);\n}\n\n/**\n * HTTP request to create a new automation\n */\nexport async function addAutomation(automation: AutomationDTO): Promise<Automation> {\n const res = await axios.post(`${automationsPath}/automation`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to update a automation\n */\nexport async function editAutomation(id: string, automation: Automation): Promise<Automation> {\n const res = await axios.put(`${automationsPath}/automation/${id}`, automation);\n return res.data;\n}\n\n/**\n * HTTP request to delete a automation\n */\nexport function deleteAutomation(id: string): Promise<void> {\n return axios.delete(`${automationsPath}/automation/${id}`);\n}\n\n/**\n * HTTP request to test automation output\n * The return is irrelevant as we care for the resolution of the promise\n */\nexport function testOutput(output: AutomationOutput): Promise<void> {\n return axios.post(`${automationsPath}/test`, output);\n}\n","import { AutomationSettings } from 'ontime-types';\n\nexport const automationPlaceholderSettings: AutomationSettings = {\n enabledAutomations: false,\n enabledOscIn: false,\n oscPortIn: 8888,\n triggers: [],\n automations: {},\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport { queryRefetchIntervalSlow } from '../../ontimeConfig';\nimport { getAutomationSettings } from '../api/automation';\nimport { AUTOMATION } from '../api/constants';\nimport { automationPlaceholderSettings } from '../models/AutomationSettings';\n\nexport default function useAutomationSettings() {\n const { data, status, isFetching, isError, refetch } = useQuery({\n queryKey: AUTOMATION,\n queryFn: getAutomationSettings,\n placeholderData: (previousData, _previousQuery) => previousData,\n retry: 5,\n retryDelay: (attempt: number) => attempt * 2500,\n refetchInterval: queryRefetchIntervalSlow,\n networkMode: 'always',\n });\n\n return { data: data ?? automationPlaceholderSettings, status, isFetching, isError, refetch };\n}\n","import { ReactNode } from 'react';\n\nimport style from './Tag.module.scss';\n\nexport default function Tag({ children }: { children: ReactNode }) {\n return <span className={style.tag}>{children}</span>;\n}\n","import { MouseEvent } from 'react';\nimport { IoBan } from 'react-icons/io5';\n\nimport { cx } from '../../../utils/styleUtils';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface SwatchProps {\n color: string;\n onClick?: (color: string) => void;\n isSelected?: boolean;\n}\n\nexport default function Swatch({ color, isSelected, onClick }: SwatchProps) {\n const handleClick = (event: MouseEvent) => {\n onClick?.(color);\n event.preventDefault();\n event.stopPropagation();\n };\n\n const classes = cx([style.swatch, isSelected && style.selected, onClick && style.selectable]);\n\n if (!color) {\n return (\n <div className={classes} onClick={handleClick}>\n <IoBan />\n </div>\n );\n }\n return <div className={classes} style={{ backgroundColor: `${color}` }} onClick={handleClick} />;\n}\n","import { useCallback } from 'react';\n\nimport Swatch from './Swatch';\nimport SwatchPicker from './SwatchPicker';\n\nimport style from './SwatchSelect.module.scss';\n\ninterface ColourInputProps {\n value: string;\n name: 'colour';\n handleChange: (newValue: 'colour', name: string) => void;\n}\n\nconst colours = [\n '',\n '#FFCC78', // $orange-400\n '#FFAB33', // $orange-600\n '#77C785', // $green-400\n '#339E4E', // $green-600\n '#779BE7', // $blue-400\n '#3E75E8', // $blue-600\n '#FF7878', // $red-400\n '#ED3333', // $red-600\n '#A790F5', // $violet-400\n '#8064E1', // $violet-600\n '#9d9d9d', // $gray-500\n '#ececec', // $gray-100\n];\n\nexport default function SwatchSelect(props: ColourInputProps) {\n const { value, name, handleChange } = props;\n\n const setColour = useCallback(\n (newValue: string) => {\n if (newValue !== value) {\n handleChange(name, newValue);\n }\n },\n [handleChange, name, value],\n );\n\n return (\n <div className={style.list}>\n {colours.map((colour) => (\n <Swatch key={colour} color={colour} onClick={setColour} isSelected={value === colour} />\n ))}\n <SwatchPicker color={value} onChange={setColour} isSelected={!colours.includes(value)} />\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\nimport { IconType } from 'react-icons';\nimport { Menu as BaseMenu } from '@base-ui-components/react/menu';\n\nimport style from './DropdownMenu.module.scss';\n\ntype DropdownMenuItemDivider = { type: 'divider' };\ntype DropdownMenuItem = {\n type: 'item' | 'destructive';\n label: string;\n icon?: IconType;\n disabled?: boolean;\n onClick: () => void;\n};\n\nexport type DropdownMenuOption = DropdownMenuItemDivider | DropdownMenuItem;\n\ninterface DropdownMenuProps extends BaseMenu.Trigger.Props {\n items: DropdownMenuOption[];\n}\n\nexport function DropdownMenu({ items, children, ...triggerProps }: PropsWithChildren<DropdownMenuProps>) {\n return (\n <BaseMenu.Root>\n <BaseMenu.Trigger {...triggerProps}>{children}</BaseMenu.Trigger>\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item key={index} className={style.item} onClick={item.onClick} disabled={item.disabled} data-type={item.type}>\n {item.icon && <item.icon />}\n {item.label}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n\ninterface PositionedDropdownMenuProps {\n items: Array<DropdownMenuItemDivider | DropdownMenuItem>;\n isOpen: boolean;\n onClose: () => void;\n position: { x: number; y: number };\n}\n\nexport function PositionedDropdownMenu({ items, isOpen, position, onClose }: PositionedDropdownMenuProps) {\n return (\n <BaseMenu.Root\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n >\n <BaseMenu.Trigger style={{ position: 'fixed', left: position.x, top: position.y }} aria-hidden />\n <BaseMenu.Portal>\n <BaseMenu.Positioner className={style.positioner} align='start' sideOffset={8} alignOffset={8}>\n <BaseMenu.Popup className={style.popup}>\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return <BaseMenu.Separator key={index} className={style.separator} />;\n }\n return (\n <BaseMenu.Item key={index} className={style.item} onClick={item.onClick} disabled={item.disabled}>\n {item.icon && <item.icon />}\n {item.label}\n </BaseMenu.Item>\n );\n })}\n </BaseMenu.Popup>\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n </BaseMenu.Root>\n );\n}\n","import type { ReactNode } from 'react';\nimport { IoClose } from 'react-icons/io5';\nimport { Dialog as BaseDialog } from '@base-ui-components/react/dialog';\n\nimport IconButton from '../buttons/IconButton';\n\nimport style from './Modal.module.scss';\n\ninterface ModalProps {\n isOpen: boolean;\n title?: string;\n showCloseButton?: boolean;\n showBackdrop?: boolean;\n bodyElements: ReactNode;\n footerElements?: ReactNode;\n onClose: () => void;\n}\n\nexport default function Modal({\n isOpen,\n title,\n showCloseButton,\n showBackdrop,\n bodyElements,\n footerElements,\n onClose,\n}: ModalProps) {\n return (\n <BaseDialog.Root\n open={isOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) onClose();\n }}\n dismissible={false}\n >\n <BaseDialog.Portal>\n {showBackdrop && <BaseDialog.Backdrop className={style.backdrop} />}\n <BaseDialog.Popup className={style.modal}>\n <div className={style.title}>\n {title}\n {showCloseButton && (\n <IconButton variant='subtle-white' onClick={onClose}>\n <IoClose />\n </IconButton>\n )}\n </div>\n <div className={style.body}>{bodyElements}</div>\n <div className={style.footer}>{footerElements}</div>\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n );\n}\n"],"names":["automationsPath","apiEntryUrl","getAutomationSettings","axios","editAutomationSettings","automationSettings","addTrigger","trigger","editTrigger","id","deleteTrigger","addAutomation","automation","editAutomation","deleteAutomation","testOutput","output","automationPlaceholderSettings","useAutomationSettings","data","status","isFetching","isError","refetch","useQuery","AUTOMATION","previousData","_previousQuery","attempt","queryRefetchIntervalSlow","Tag","children","jsx","style","Swatch","color","isSelected","onClick","handleClick","event","classes","cx","IoBan","colours","SwatchSelect","props","value","name","handleChange","setColour","useCallback","newValue","jsxs","colour","SwatchPicker","DropdownMenu","items","triggerProps","BaseMenu.Root","BaseMenu.Trigger","BaseMenu.Portal","BaseMenu.Positioner","BaseMenu.Popup","item","index","BaseMenu.Separator","BaseMenu.Item","PositionedDropdownMenu","isOpen","position","onClose","open","Modal","title","showCloseButton","showBackdrop","bodyElements","footerElements","BaseDialog.Root","BaseDialog.Portal","BaseDialog.Backdrop","BaseDialog.Popup","IconButton","IoClose"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as r}from"./vendor-
|
|
2
|
-
//# sourceMappingURL=MultiPartProgressBar-
|
|
1
|
+
import{j as r}from"./vendor-9UkPSc5K.js";import{g as a}from"./getProgress-B94Ieskb.js";import{i as l}from"./index-njXwwjfn.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="f258f155-d8d7-41b3-af14-ea50747aa7a5",e._sentryDebugIdIdentifier="sentry-dbid-f258f155-d8d7-41b3-af14-ea50747aa7a5")}catch{}})();function j(e){const{now:s,complete:i,normalColor:g,warning:o,warningColor:m,danger:n,dangerColor:c,hidden:b,hideOvertime:u,ignoreCssOverride:f,className:p=""}=e,_=100-a(s,i),t=n?100-a(n,i):0,h=o?100-t-a(o,i):0,d=s!==null&&s<0&&!u;return r.jsx("div",{className:l(["multiprogress-bar",b&&"multiprogress-bar--hidden",f&&"multiprogress-bar--ignore-css-override",p]),children:s!==null&&r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"multiprogress-bar__bg",children:[r.jsx("div",{className:"multiprogress-bar__bg-normal",style:{backgroundColor:g}}),r.jsx("div",{className:"multiprogress-bar__bg-warning",style:{width:`${h}%`,backgroundColor:m}}),r.jsx("div",{className:l(["multiprogress-bar__bg-danger",d&&"multiprogress-bar__bg-danger--overtime"]),style:{width:`${t}%`,backgroundColor:d?void 0:c}})]}),r.jsx("div",{className:"multiprogress-bar__indicator",children:r.jsx("div",{className:"multiprogress-bar__indicator-bar",style:{width:`${_}%`}})})]})})}export{j as M};
|
|
2
|
+
//# sourceMappingURL=MultiPartProgressBar-BXQbpM-j.js.map
|
|
Binary file
|
|
Binary file
|
package/client/assets/{MultiPartProgressBar-D3jJZjb5.js.map → MultiPartProgressBar-BXQbpM-j.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiPartProgressBar-
|
|
1
|
+
{"version":3,"file":"MultiPartProgressBar-BXQbpM-j.js","sources":["../../src/common/components/multi-part-progress-bar/MultiPartProgressBar.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\nimport { cx } from '../../utils/styleUtils';\n\nimport './MultiPartProgressBar.scss';\n\ninterface MultiPartProgressBar {\n now: MaybeNumber;\n complete: MaybeNumber;\n normalColor: string;\n warning?: MaybeNumber;\n warningColor: string;\n danger?: MaybeNumber;\n dangerColor: string;\n hidden?: boolean;\n hideOvertime?: boolean;\n ignoreCssOverride?: boolean;\n className?: string;\n}\n\nexport default function MultiPartProgressBar(props: MultiPartProgressBar) {\n const {\n now,\n complete,\n normalColor,\n warning,\n warningColor,\n danger,\n dangerColor,\n hidden,\n hideOvertime,\n ignoreCssOverride,\n className = '',\n } = props;\n\n const percentRemaining = 100 - getProgress(now, complete);\n const dangerWidth = danger ? 100 - getProgress(danger, complete) : 0;\n const warningWidth = warning ? 100 - dangerWidth - getProgress(warning, complete) : 0;\n const isOvertime = now !== null && now < 0;\n const showOvertime = isOvertime && !hideOvertime;\n\n return (\n <div\n className={cx([\n 'multiprogress-bar',\n hidden && 'multiprogress-bar--hidden',\n ignoreCssOverride && 'multiprogress-bar--ignore-css-override',\n className,\n ])}\n >\n {now !== null && (\n <>\n <div className='multiprogress-bar__bg'>\n <div className='multiprogress-bar__bg-normal' style={{ backgroundColor: normalColor }} />\n <div\n className='multiprogress-bar__bg-warning'\n style={{ width: `${warningWidth}%`, backgroundColor: warningColor }}\n />\n <div\n className={cx(['multiprogress-bar__bg-danger', showOvertime && 'multiprogress-bar__bg-danger--overtime'])}\n style={{ width: `${dangerWidth}%`, backgroundColor: showOvertime ? undefined : dangerColor }}\n />\n </div>\n <div className='multiprogress-bar__indicator'>\n <div className='multiprogress-bar__indicator-bar' style={{ width: `${percentRemaining}%` }} />\n </div>\n </>\n )}\n </div>\n );\n}\n"],"names":["MultiPartProgressBar","props","now","complete","normalColor","warning","warningColor","danger","dangerColor","hidden","hideOvertime","ignoreCssOverride","className","percentRemaining","getProgress","dangerWidth","warningWidth","showOvertime","jsx","cx","jsxs","Fragment"],"mappings":"ydAqBA,SAAwBA,EAAqBC,EAA6B,CAClE,KAAA,CACJ,IAAAC,EACA,SAAAC,EACA,YAAAC,EACA,QAAAC,EACA,aAAAC,EACA,OAAAC,EACA,YAAAC,EACA,OAAAC,EACA,aAAAC,EACA,kBAAAC,EACA,UAAAC,EAAY,EAAA,EACVX,EAEEY,EAAmB,IAAMC,EAAYZ,EAAKC,CAAQ,EAClDY,EAAcR,EAAS,IAAMO,EAAYP,EAAQJ,CAAQ,EAAI,EAC7Da,EAAeX,EAAU,IAAMU,EAAcD,EAAYT,EAASF,CAAQ,EAAI,EAE9Ec,EADaf,IAAQ,MAAQA,EAAM,GACN,CAACQ,EAGlC,OAAAQ,EAAA,IAAC,MAAA,CACC,UAAWC,EAAG,CACZ,oBACAV,GAAU,4BACVE,GAAqB,yCACrBC,CAAA,CACD,EAEA,SAAAV,IAAQ,MAELkB,EAAA,KAAAC,EAAA,SAAA,CAAA,SAAA,CAACD,EAAAA,KAAA,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAF,MAAC,OAAI,UAAU,+BAA+B,MAAO,CAAE,gBAAiBd,GAAe,EACvFc,EAAA,IAAC,MAAA,CACC,UAAU,gCACV,MAAO,CAAE,MAAO,GAAGF,CAAY,IAAK,gBAAiBV,CAAa,CAAA,CACpE,EACAY,EAAA,IAAC,MAAA,CACC,UAAWC,EAAG,CAAC,+BAAgCF,GAAgB,wCAAwC,CAAC,EACxG,MAAO,CAAE,MAAO,GAAGF,CAAW,IAAK,gBAAiBE,EAAe,OAAYT,CAAY,CAAA,CAAA,CAC7F,EACF,EACCU,EAAA,IAAA,MAAA,CAAI,UAAU,+BACb,eAAC,MAAI,CAAA,UAAU,mCAAmC,MAAO,CAAE,MAAO,GAAGL,CAAgB,KAAO,CAC9F,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ"}
|