@getontime/cli 4.0.0 → 4.0.2
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-ZSqb8OU6.js → Backstage-CAjkmeJm.js} +2 -2
- package/client/assets/Backstage-CAjkmeJm.js.br +0 -0
- package/client/assets/Backstage-CAjkmeJm.js.gz +0 -0
- package/client/assets/{Backstage-ZSqb8OU6.js.map → Backstage-CAjkmeJm.js.map} +1 -1
- package/client/assets/{Countdown-DVRZbeRP.js → Countdown-ChuA9az_.js} +2 -2
- package/client/assets/Countdown-ChuA9az_.js.br +0 -0
- package/client/assets/Countdown-ChuA9az_.js.gz +0 -0
- package/client/assets/{Countdown-DVRZbeRP.js.map → Countdown-ChuA9az_.js.map} +1 -1
- package/client/assets/{CustomTranslationModal-D_Cy0d_H.js → CustomTranslationModal-C3R_2T5s.js} +2 -2
- package/client/assets/CustomTranslationModal-C3R_2T5s.js.br +0 -0
- package/client/assets/CustomTranslationModal-C3R_2T5s.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-D_Cy0d_H.js.map → CustomTranslationModal-C3R_2T5s.js.map} +1 -1
- package/client/assets/{DelayIndicator-B_JKLKYW.js → DelayIndicator-vT7n8ypf.js} +2 -2
- package/client/assets/DelayIndicator-vT7n8ypf.js.br +0 -0
- package/client/assets/DelayIndicator-vT7n8ypf.js.gz +0 -0
- package/client/assets/{DelayIndicator-B_JKLKYW.js.map → DelayIndicator-vT7n8ypf.js.map} +1 -1
- package/client/assets/{EditorFeatureWrapper-DzBxDvRn.js → EditorFeatureWrapper-DHfuO3EA.js} +2 -2
- package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-DzBxDvRn.js.map → EditorFeatureWrapper-DHfuO3EA.js.map} +1 -1
- package/client/assets/{EditorUtils-De0umjb-.js → EditorUtils-Da5ALK1P.js} +2 -2
- package/client/assets/EditorUtils-Da5ALK1P.js.br +0 -0
- package/client/assets/EditorUtils-Da5ALK1P.js.gz +0 -0
- package/client/assets/{EditorUtils-De0umjb-.js.map → EditorUtils-Da5ALK1P.js.map} +1 -1
- package/client/assets/{Empty-BYF0tVRk.js → Empty-gWT_HMeu.js} +2 -2
- package/client/assets/Empty-gWT_HMeu.js.br +0 -0
- package/client/assets/Empty-gWT_HMeu.js.gz +0 -0
- package/client/assets/{Empty-BYF0tVRk.js.map → Empty-gWT_HMeu.js.map} +1 -1
- package/client/assets/{EmptyPage-DYH2bswA.js → EmptyPage-Dcbg6rmF.js} +2 -2
- package/client/assets/EmptyPage-Dcbg6rmF.js.br +0 -0
- package/client/assets/EmptyPage-Dcbg6rmF.js.gz +0 -0
- package/client/assets/{EmptyPage-DYH2bswA.js.map → EmptyPage-Dcbg6rmF.js.map} +1 -1
- package/client/assets/{FollowButton-DyWsvyFF.js → FollowButton-CSqJSvix.js} +2 -2
- package/client/assets/FollowButton-CSqJSvix.js.br +0 -0
- package/client/assets/FollowButton-CSqJSvix.js.gz +0 -0
- package/client/assets/{FollowButton-DyWsvyFF.js.map → FollowButton-CSqJSvix.js.map} +1 -1
- package/client/assets/{MessageControlExport-yLGU2dMq.js → MessageControlExport-lXK21piH.js} +2 -2
- package/client/assets/MessageControlExport-lXK21piH.js.br +0 -0
- package/client/assets/MessageControlExport-lXK21piH.js.gz +0 -0
- package/client/assets/{MessageControlExport-yLGU2dMq.js.map → MessageControlExport-lXK21piH.js.map} +1 -1
- package/client/assets/{MilestoneEditor-GkzJ-h1C.js → MilestoneEditor-Bge8xLrV.js} +2 -2
- package/client/assets/MilestoneEditor-Bge8xLrV.js.br +0 -0
- package/client/assets/MilestoneEditor-Bge8xLrV.js.gz +0 -0
- package/client/assets/{MilestoneEditor-GkzJ-h1C.js.map → MilestoneEditor-Bge8xLrV.js.map} +1 -1
- package/client/assets/{Modal-BKL-5GzU.js → Modal-C2sFA0zf.js} +2 -2
- package/client/assets/Modal-C2sFA0zf.js.br +0 -0
- package/client/assets/Modal-C2sFA0zf.js.gz +0 -0
- package/client/assets/{Modal-BKL-5GzU.js.map → Modal-C2sFA0zf.js.map} +1 -1
- package/client/assets/{MultiPartProgressBar-BITERKS0.js → MultiPartProgressBar-D3jJZjb5.js} +2 -2
- package/client/assets/MultiPartProgressBar-D3jJZjb5.js.br +0 -0
- package/client/assets/MultiPartProgressBar-D3jJZjb5.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-BITERKS0.js.map → MultiPartProgressBar-D3jJZjb5.js.map} +1 -1
- package/client/assets/{OperatorExport-DMZ6eQfT.js → OperatorExport-BUhxjLUx.js} +2 -2
- package/client/assets/OperatorExport-BUhxjLUx.js.br +0 -0
- package/client/assets/OperatorExport-BUhxjLUx.js.gz +0 -0
- package/client/assets/{OperatorExport-DMZ6eQfT.js.map → OperatorExport-BUhxjLUx.js.map} +1 -1
- package/client/assets/{OverviewWrapper-riM6vPno.js → OverviewWrapper-BveJ6GjK.js} +2 -2
- package/client/assets/OverviewWrapper-BveJ6GjK.js.br +0 -0
- package/client/assets/OverviewWrapper-BveJ6GjK.js.gz +0 -0
- package/client/assets/{OverviewWrapper-riM6vPno.js.map → OverviewWrapper-BveJ6GjK.js.map} +1 -1
- package/client/assets/{ProjectInfo-DxtMq70a.js → ProjectInfo-z4k3cipS.js} +2 -2
- package/client/assets/ProjectInfo-z4k3cipS.js.br +0 -0
- package/client/assets/ProjectInfo-z4k3cipS.js.gz +0 -0
- package/client/assets/{ProjectInfo-DxtMq70a.js.map → ProjectInfo-z4k3cipS.js.map} +1 -1
- package/client/assets/{ProtectRoute-p1fmtLeu.js → ProtectRoute-CrcWfOlG.js} +2 -2
- package/client/assets/ProtectRoute-CrcWfOlG.js.br +0 -0
- package/client/assets/ProtectRoute-CrcWfOlG.js.gz +0 -0
- package/client/assets/{ProtectRoute-p1fmtLeu.js.map → ProtectRoute-CrcWfOlG.js.map} +1 -1
- package/client/assets/{ProtectedCuesheet-CvRnqT0z.js → ProtectedCuesheet-Deo4Aw6f.js} +2 -2
- package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.br +0 -0
- package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.gz +0 -0
- package/client/assets/{ProtectedCuesheet-CvRnqT0z.js.map → ProtectedCuesheet-Deo4Aw6f.js.map} +1 -1
- package/client/assets/{ProtectedEditor-D4UXj1xL.js → ProtectedEditor-C_SYWpL2.js} +3 -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-D4UXj1xL.js.map → ProtectedEditor-C_SYWpL2.js.map} +1 -1
- package/client/assets/{RundownEntry-B1dSz1wu.js → RundownEntry-D61IqkXb.js} +2 -2
- package/client/assets/RundownEntry-D61IqkXb.js.br +0 -0
- package/client/assets/RundownEntry-D61IqkXb.js.gz +0 -0
- package/client/assets/{RundownEntry-B1dSz1wu.js.map → RundownEntry-D61IqkXb.js.map} +1 -1
- package/client/assets/RundownExport-1zBZurIG.css +1 -0
- package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
- package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
- package/client/assets/{RundownExport-WjLpncYT.js → RundownExport-C6YhMGOC.js} +3 -3
- package/client/assets/RundownExport-C6YhMGOC.js.br +0 -0
- package/client/assets/RundownExport-C6YhMGOC.js.gz +0 -0
- package/client/assets/{RundownExport-WjLpncYT.js.map → RundownExport-C6YhMGOC.js.map} +1 -1
- package/client/assets/{Select-niU9Razm.js → Select-CedN80WS.js} +2 -2
- package/client/assets/Select-CedN80WS.js.br +0 -0
- package/client/assets/Select-CedN80WS.js.gz +0 -0
- package/client/assets/{Select-niU9Razm.js.map → Select-CedN80WS.js.map} +1 -1
- package/client/assets/{Studio-CWdJq4bx.js → Studio-DUzPBS6P.js} +2 -2
- package/client/assets/Studio-DUzPBS6P.js.br +0 -0
- package/client/assets/Studio-DUzPBS6P.js.gz +0 -0
- package/client/assets/{Studio-CWdJq4bx.js.map → Studio-DUzPBS6P.js.map} +1 -1
- package/client/assets/{StyleEditor-BIFjHsgD.js → StyleEditor-D2z65PB7.js} +2 -2
- package/client/assets/StyleEditor-D2z65PB7.js.br +0 -0
- package/client/assets/StyleEditor-D2z65PB7.js.gz +0 -0
- package/client/assets/{StyleEditor-BIFjHsgD.js.map → StyleEditor-D2z65PB7.js.map} +1 -1
- package/client/assets/{SuperscriptTime-DCTyUARx.js → SuperscriptTime-CIrcMcyg.js} +2 -2
- package/client/assets/SuperscriptTime-CIrcMcyg.js.br +0 -0
- package/client/assets/SuperscriptTime-CIrcMcyg.js.gz +0 -0
- package/client/assets/{SuperscriptTime-DCTyUARx.js.map → SuperscriptTime-CIrcMcyg.js.map} +1 -1
- package/client/assets/{TimeElements-DBVGVx71.js → TimeElements-CALNfv6u.js} +2 -2
- package/client/assets/TimeElements-CALNfv6u.js.br +0 -0
- package/client/assets/TimeElements-CALNfv6u.js.gz +0 -0
- package/client/assets/{TimeElements-DBVGVx71.js.map → TimeElements-CALNfv6u.js.map} +1 -1
- package/client/assets/{TimeInput-wQ67FbW6.js → TimeInput-Dg1naiy3.js} +2 -2
- package/client/assets/TimeInput-Dg1naiy3.js.br +0 -0
- package/client/assets/TimeInput-Dg1naiy3.js.gz +0 -0
- package/client/assets/{TimeInput-wQ67FbW6.js.map → TimeInput-Dg1naiy3.js.map} +1 -1
- package/client/assets/{TimelinePage-DZefE2vQ.js → TimelinePage-Cwm0svjN.js} +2 -2
- package/client/assets/TimelinePage-Cwm0svjN.js.br +0 -0
- package/client/assets/TimelinePage-Cwm0svjN.js.gz +0 -0
- package/client/assets/{TimelinePage-DZefE2vQ.js.map → TimelinePage-Cwm0svjN.js.map} +1 -1
- package/client/assets/Timer-BVXskRjc.js +2 -0
- package/client/assets/Timer-BVXskRjc.js.br +0 -0
- package/client/assets/Timer-BVXskRjc.js.gz +0 -0
- package/client/assets/Timer-BVXskRjc.js.map +1 -0
- package/client/assets/Timer-BvEmZbmF.css +1 -0
- package/client/assets/Timer-BvEmZbmF.css.br +0 -0
- package/client/assets/Timer-BvEmZbmF.css.gz +0 -0
- package/client/assets/{TimerControlExport-C1C_vBX4.js → TimerControlExport-C8ECtLBd.js} +2 -2
- package/client/assets/TimerControlExport-C8ECtLBd.js.br +0 -0
- package/client/assets/TimerControlExport-C8ECtLBd.js.gz +0 -0
- package/client/assets/{TimerControlExport-C1C_vBX4.js.map → TimerControlExport-C8ECtLBd.js.map} +1 -1
- package/client/assets/{TitleCard-B4N-kCM3.js → TitleCard-CZl9wSHS.js} +2 -2
- package/client/assets/TitleCard-CZl9wSHS.js.br +0 -0
- package/client/assets/TitleCard-CZl9wSHS.js.gz +0 -0
- package/client/assets/{TitleCard-B4N-kCM3.js.map → TitleCard-CZl9wSHS.js.map} +1 -1
- package/client/assets/{Tooltip-DJ8Y4CO4.js → Tooltip-D9XRnwOW.js} +2 -2
- package/client/assets/Tooltip-D9XRnwOW.js.br +4 -0
- package/client/assets/Tooltip-D9XRnwOW.js.gz +0 -0
- package/client/assets/{Tooltip-DJ8Y4CO4.js.map → Tooltip-D9XRnwOW.js.map} +1 -1
- package/client/assets/{ViewLogo-Dd60EREE.js → ViewLogo-_3Z1hIHi.js} +2 -2
- package/client/assets/ViewLogo-_3Z1hIHi.js.br +0 -0
- package/client/assets/ViewLogo-_3Z1hIHi.js.gz +0 -0
- package/client/assets/{ViewLogo-Dd60EREE.js.map → ViewLogo-_3Z1hIHi.js.map} +1 -1
- package/client/assets/{ViewParamsEditor-BWEYbq_S.js → ViewParamsEditor-Bca1TIDW.js} +2 -2
- package/client/assets/ViewParamsEditor-Bca1TIDW.js.br +0 -0
- package/client/assets/ViewParamsEditor-Bca1TIDW.js.gz +0 -0
- package/client/assets/{ViewParamsEditor-BWEYbq_S.js.map → ViewParamsEditor-Bca1TIDW.js.map} +1 -1
- package/client/assets/{dateConfig-8rhb0Dbh.js → dateConfig-DRQGMWDF.js} +2 -2
- package/client/assets/dateConfig-DRQGMWDF.js.br +0 -0
- package/client/assets/dateConfig-DRQGMWDF.js.gz +0 -0
- package/client/assets/{dateConfig-8rhb0Dbh.js.map → dateConfig-DRQGMWDF.js.map} +1 -1
- package/client/assets/{editorSettings-LMnfWux6.js → editorSettings-BU0pTMSY.js} +2 -2
- package/client/assets/editorSettings-BU0pTMSY.js.br +0 -0
- package/client/assets/editorSettings-BU0pTMSY.js.gz +0 -0
- package/client/assets/{editorSettings-LMnfWux6.js.map → editorSettings-BU0pTMSY.js.map} +1 -1
- package/client/assets/{getProgress-CyJTu6f5.js → getProgress-Cw79NL_O.js} +2 -2
- package/client/assets/getProgress-Cw79NL_O.js.br +0 -0
- package/client/assets/getProgress-Cw79NL_O.js.gz +0 -0
- package/client/assets/{getProgress-CyJTu6f5.js.map → getProgress-Cw79NL_O.js.map} +1 -1
- package/client/assets/{index-5QAOtSTh.js → index-BQEUaoAf.js} +3 -3
- package/client/assets/index-BQEUaoAf.js.br +0 -0
- package/client/assets/index-BQEUaoAf.js.gz +0 -0
- package/client/assets/{index-5QAOtSTh.js.map → index-BQEUaoAf.js.map} +1 -1
- package/client/assets/{offset-CLDSqOP5.js → offset-DJAHqjFW.js} +2 -2
- package/client/assets/offset-DJAHqjFW.js.br +0 -0
- package/client/assets/offset-DJAHqjFW.js.gz +0 -0
- package/client/assets/{offset-CLDSqOP5.js.map → offset-DJAHqjFW.js.map} +1 -1
- package/client/assets/{parseUserTime-CCDHpp7D.js → parseUserTime-BeTKj08M.js} +2 -2
- package/client/assets/parseUserTime-BeTKj08M.js.br +0 -0
- package/client/assets/parseUserTime-BeTKj08M.js.gz +0 -0
- package/client/assets/{parseUserTime-CCDHpp7D.js.map → parseUserTime-BeTKj08M.js.map} +1 -1
- package/client/assets/{playbackstate-6lBh6omZ.js → playbackstate-B_khF6xU.js} +2 -2
- package/client/assets/playbackstate-B_khF6xU.js.br +0 -0
- package/client/assets/playbackstate-B_khF6xU.js.gz +0 -0
- package/client/assets/{playbackstate-6lBh6omZ.js.map → playbackstate-B_khF6xU.js.map} +1 -1
- package/client/assets/{presentation.utils-BUIuV_2e.js → presentation.utils-KwY-ACf7.js} +2 -2
- 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/{presentation.utils-BUIuV_2e.js.map → presentation.utils-KwY-ACf7.js.map} +1 -1
- package/client/assets/{rundownUtils-Cnd2prRX.js → rundownUtils-BZHazkXR.js} +2 -2
- package/client/assets/rundownUtils-BZHazkXR.js.br +0 -0
- package/client/assets/rundownUtils-BZHazkXR.js.gz +0 -0
- package/client/assets/{rundownUtils-Cnd2prRX.js.map → rundownUtils-BZHazkXR.js.map} +1 -1
- package/client/assets/{useCustomFields-BuxKsqGS.js → useCustomFields-DqCYz8Kt.js} +2 -2
- package/client/assets/useCustomFields-DqCYz8Kt.js.br +0 -0
- package/client/assets/useCustomFields-DqCYz8Kt.js.gz +0 -0
- package/client/assets/{useCustomFields-BuxKsqGS.js.map → useCustomFields-DqCYz8Kt.js.map} +1 -1
- package/client/assets/{useFollowComponent-iGQv4zoS.js → useFollowComponent-Ctfhf2or.js} +2 -2
- package/client/assets/useFollowComponent-Ctfhf2or.js.br +0 -0
- package/client/assets/useFollowComponent-Ctfhf2or.js.gz +0 -0
- package/client/assets/{useFollowComponent-iGQv4zoS.js.map → useFollowComponent-Ctfhf2or.js.map} +1 -1
- package/client/assets/{useProjectData-CetvEK9E.js → useProjectData-C1hVamxc.js} +2 -2
- package/client/assets/useProjectData-C1hVamxc.js.br +0 -0
- package/client/assets/useProjectData-C1hVamxc.js.gz +0 -0
- package/client/assets/{useProjectData-CetvEK9E.js.map → useProjectData-C1hVamxc.js.map} +1 -1
- package/client/assets/{useReport-PEFRsOhF.js → useReport-B4dMYcNL.js} +2 -2
- package/client/assets/useReport-B4dMYcNL.js.br +0 -0
- package/client/assets/useReport-B4dMYcNL.js.gz +0 -0
- package/client/assets/{useReport-PEFRsOhF.js.map → useReport-B4dMYcNL.js.map} +1 -1
- package/client/assets/useRundown-BfpjcCEJ.js +2 -0
- package/client/assets/useRundown-BfpjcCEJ.js.br +0 -0
- package/client/assets/useRundown-BfpjcCEJ.js.gz +0 -0
- package/client/assets/{useRundown-D8CYATNi.js.map → useRundown-BfpjcCEJ.js.map} +1 -1
- package/client/assets/{useWindowTitle-b5fN0StF.js → useWindowTitle-DqdFTWns.js} +2 -2
- package/client/assets/useWindowTitle-DqdFTWns.js.br +0 -0
- package/client/assets/useWindowTitle-DqdFTWns.js.gz +0 -0
- package/client/assets/{useWindowTitle-b5fN0StF.js.map → useWindowTitle-DqdFTWns.js.map} +1 -1
- package/client/assets/{validateEvent-Bvgk1E-Y.js → validateEvent-P9sf7C10.js} +2 -2
- package/client/assets/validateEvent-P9sf7C10.js.br +3 -0
- package/client/assets/validateEvent-P9sf7C10.js.gz +0 -0
- package/client/assets/{validateEvent-Bvgk1E-Y.js.map → validateEvent-P9sf7C10.js.map} +1 -1
- package/client/assets/{vendor-Cu5xgv5K.js → vendor-CCiSQ9k9.js} +2 -2
- package/client/assets/vendor-CCiSQ9k9.js.br +0 -0
- package/client/assets/vendor-CCiSQ9k9.js.gz +0 -0
- package/client/assets/{vendor-Cu5xgv5K.js.map → vendor-CCiSQ9k9.js.map} +1 -1
- package/client/assets/{viewLoader.utils-BPhACxyG.js → viewLoader.utils-CmM-4-pk.js} +2 -2
- package/client/assets/viewLoader.utils-CmM-4-pk.js.br +0 -0
- package/client/assets/viewLoader.utils-CmM-4-pk.js.gz +0 -0
- package/client/assets/{viewLoader.utils-BPhACxyG.js.map → viewLoader.utils-CmM-4-pk.js.map} +1 -1
- package/client/index.html +2 -2
- package/external/demo/app.js +2 -2
- package/package.json +1 -1
- package/server/index.cjs +66 -57
- package/client/assets/Backstage-ZSqb8OU6.js.br +0 -0
- package/client/assets/Backstage-ZSqb8OU6.js.gz +0 -0
- package/client/assets/Countdown-DVRZbeRP.js.br +0 -0
- package/client/assets/Countdown-DVRZbeRP.js.gz +0 -0
- package/client/assets/CustomTranslationModal-D_Cy0d_H.js.br +0 -0
- package/client/assets/CustomTranslationModal-D_Cy0d_H.js.gz +0 -0
- package/client/assets/DelayIndicator-B_JKLKYW.js.br +0 -0
- package/client/assets/DelayIndicator-B_JKLKYW.js.gz +0 -0
- package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.gz +0 -0
- package/client/assets/EditorUtils-De0umjb-.js.br +0 -0
- package/client/assets/EditorUtils-De0umjb-.js.gz +0 -0
- package/client/assets/Empty-BYF0tVRk.js.br +0 -2
- package/client/assets/Empty-BYF0tVRk.js.gz +0 -0
- package/client/assets/EmptyPage-DYH2bswA.js.br +0 -0
- package/client/assets/EmptyPage-DYH2bswA.js.gz +0 -0
- package/client/assets/FollowButton-DyWsvyFF.js.br +0 -0
- package/client/assets/FollowButton-DyWsvyFF.js.gz +0 -0
- package/client/assets/MessageControlExport-yLGU2dMq.js.br +0 -0
- package/client/assets/MessageControlExport-yLGU2dMq.js.gz +0 -0
- package/client/assets/MilestoneEditor-GkzJ-h1C.js.br +0 -0
- package/client/assets/MilestoneEditor-GkzJ-h1C.js.gz +0 -0
- package/client/assets/Modal-BKL-5GzU.js.br +0 -0
- package/client/assets/Modal-BKL-5GzU.js.gz +0 -0
- package/client/assets/MultiPartProgressBar-BITERKS0.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BITERKS0.js.gz +0 -0
- package/client/assets/OperatorExport-DMZ6eQfT.js.br +0 -0
- package/client/assets/OperatorExport-DMZ6eQfT.js.gz +0 -0
- package/client/assets/OverviewWrapper-riM6vPno.js.br +0 -0
- package/client/assets/OverviewWrapper-riM6vPno.js.gz +0 -0
- package/client/assets/ProjectInfo-DxtMq70a.js.br +0 -0
- package/client/assets/ProjectInfo-DxtMq70a.js.gz +0 -0
- package/client/assets/ProtectRoute-p1fmtLeu.js.br +0 -0
- package/client/assets/ProtectRoute-p1fmtLeu.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-CvRnqT0z.js.br +0 -0
- package/client/assets/ProtectedCuesheet-CvRnqT0z.js.gz +0 -0
- package/client/assets/ProtectedEditor-D4UXj1xL.js.br +0 -0
- package/client/assets/ProtectedEditor-D4UXj1xL.js.gz +0 -0
- package/client/assets/RundownEntry-B1dSz1wu.js.br +0 -0
- package/client/assets/RundownEntry-B1dSz1wu.js.gz +0 -0
- package/client/assets/RundownExport-CUtaG16H.css +0 -1
- package/client/assets/RundownExport-CUtaG16H.css.br +0 -0
- package/client/assets/RundownExport-CUtaG16H.css.gz +0 -0
- package/client/assets/RundownExport-WjLpncYT.js.br +0 -0
- package/client/assets/RundownExport-WjLpncYT.js.gz +0 -0
- package/client/assets/Select-niU9Razm.js.br +0 -0
- package/client/assets/Select-niU9Razm.js.gz +0 -0
- package/client/assets/Studio-CWdJq4bx.js.br +0 -0
- package/client/assets/Studio-CWdJq4bx.js.gz +0 -0
- package/client/assets/StyleEditor-BIFjHsgD.js.br +0 -0
- package/client/assets/StyleEditor-BIFjHsgD.js.gz +0 -0
- package/client/assets/SuperscriptTime-DCTyUARx.js.br +0 -0
- package/client/assets/SuperscriptTime-DCTyUARx.js.gz +0 -0
- package/client/assets/TimeElements-DBVGVx71.js.br +0 -0
- package/client/assets/TimeElements-DBVGVx71.js.gz +0 -0
- package/client/assets/TimeInput-wQ67FbW6.js.br +0 -0
- package/client/assets/TimeInput-wQ67FbW6.js.gz +0 -0
- package/client/assets/TimelinePage-DZefE2vQ.js.br +0 -0
- package/client/assets/TimelinePage-DZefE2vQ.js.gz +0 -0
- package/client/assets/Timer-Bs450x86.js +0 -2
- package/client/assets/Timer-Bs450x86.js.br +0 -0
- package/client/assets/Timer-Bs450x86.js.gz +0 -0
- package/client/assets/Timer-Bs450x86.js.map +0 -1
- package/client/assets/Timer-DGNfbBKM.css +0 -1
- package/client/assets/Timer-DGNfbBKM.css.br +0 -0
- package/client/assets/Timer-DGNfbBKM.css.gz +0 -0
- package/client/assets/TimerControlExport-C1C_vBX4.js.br +0 -0
- package/client/assets/TimerControlExport-C1C_vBX4.js.gz +0 -0
- package/client/assets/TitleCard-B4N-kCM3.js.br +0 -0
- package/client/assets/TitleCard-B4N-kCM3.js.gz +0 -0
- package/client/assets/Tooltip-DJ8Y4CO4.js.br +0 -0
- package/client/assets/Tooltip-DJ8Y4CO4.js.gz +0 -0
- package/client/assets/ViewLogo-Dd60EREE.js.br +0 -0
- package/client/assets/ViewLogo-Dd60EREE.js.gz +0 -0
- package/client/assets/ViewParamsEditor-BWEYbq_S.js.br +0 -0
- package/client/assets/ViewParamsEditor-BWEYbq_S.js.gz +0 -0
- package/client/assets/dateConfig-8rhb0Dbh.js.br +0 -0
- package/client/assets/dateConfig-8rhb0Dbh.js.gz +0 -0
- package/client/assets/editorSettings-LMnfWux6.js.br +0 -0
- package/client/assets/editorSettings-LMnfWux6.js.gz +0 -0
- package/client/assets/getProgress-CyJTu6f5.js.br +0 -0
- package/client/assets/getProgress-CyJTu6f5.js.gz +0 -0
- package/client/assets/index-5QAOtSTh.js.br +0 -0
- package/client/assets/index-5QAOtSTh.js.gz +0 -0
- package/client/assets/offset-CLDSqOP5.js.br +0 -0
- package/client/assets/offset-CLDSqOP5.js.gz +0 -0
- package/client/assets/parseUserTime-CCDHpp7D.js.br +0 -0
- package/client/assets/parseUserTime-CCDHpp7D.js.gz +0 -0
- package/client/assets/playbackstate-6lBh6omZ.js.br +0 -0
- package/client/assets/playbackstate-6lBh6omZ.js.gz +0 -0
- package/client/assets/presentation.utils-BUIuV_2e.js.br +0 -0
- package/client/assets/presentation.utils-BUIuV_2e.js.gz +0 -0
- package/client/assets/rundownUtils-Cnd2prRX.js.br +0 -0
- package/client/assets/rundownUtils-Cnd2prRX.js.gz +0 -0
- package/client/assets/useCustomFields-BuxKsqGS.js.br +0 -0
- package/client/assets/useCustomFields-BuxKsqGS.js.gz +0 -0
- package/client/assets/useFollowComponent-iGQv4zoS.js.br +0 -0
- package/client/assets/useFollowComponent-iGQv4zoS.js.gz +0 -0
- package/client/assets/useProjectData-CetvEK9E.js.br +0 -0
- package/client/assets/useProjectData-CetvEK9E.js.gz +0 -0
- package/client/assets/useReport-PEFRsOhF.js.br +0 -0
- package/client/assets/useReport-PEFRsOhF.js.gz +0 -0
- package/client/assets/useRundown-D8CYATNi.js +0 -2
- package/client/assets/useRundown-D8CYATNi.js.br +0 -0
- package/client/assets/useRundown-D8CYATNi.js.gz +0 -0
- package/client/assets/useWindowTitle-b5fN0StF.js.br +0 -0
- package/client/assets/useWindowTitle-b5fN0StF.js.gz +0 -0
- package/client/assets/validateEvent-Bvgk1E-Y.js.br +0 -0
- package/client/assets/validateEvent-Bvgk1E-Y.js.gz +0 -0
- package/client/assets/vendor-Cu5xgv5K.js.br +0 -0
- package/client/assets/vendor-Cu5xgv5K.js.gz +0 -0
- package/client/assets/viewLoader.utils-BPhACxyG.js.br +0 -0
- package/client/assets/viewLoader.utils-BPhACxyG.js.gz +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{h as _,j as e,aY as Ue,aZ as Oe,a_ as Ge,aE as W,aF as Z,bg as J,cg as He,t as Ke,f as Ve,bq as qe,ch as Qe,ci as We,bQ as Ze,bM as ie,bN as Je,bS as Xe,cj as Ye,x as et,bR as tt,br as nt,aL as st,bP as rt,ck as ot,am as it,bl as at,cl as lt,ah as Q,aD as ct,T as dt,K as ut,aK as pt}from"./vendor-Cu5xgv5K.js";import{y as A,af as ae,i as R,B as ne,n as mt,be as le,l as X,M as ce,bd as ft,ai as G,bP as D,J as _t,b as se,T as H,bQ as bt,aA as de}from"./index-5QAOtSTh.js";import{i as vt,q as yt,k as gt}from"./useRundown-D8CYATNi.js";import{u as z}from"./dateConfig-8rhb0Dbh.js";import{T as xt,u as ue,a as pe,g as ht,c as jt}from"./RundownExport-WjLpncYT.js";import{p as wt}from"./parseUserTime-CCDHpp7D.js";import{E as K}from"./validateEvent-Bvgk1E-Y.js";import{T as w}from"./Tooltip-DJ8Y4CO4.js";import{a as Et,u as kt}from"./MilestoneEditor-GkzJ-h1C.js";import{u as It}from"./useReport-PEFRsOhF.js";import{i as me}from"./playbackstate-6lBh6omZ.js";import{g as St}from"./getProgress-CyJTu6f5.js";import"./useProjectData-CetvEK9E.js";import"./editorSettings-LMnfWux6.js";import"./rundownUtils-Cnd2prRX.js";import"./EditorUtils-De0umjb-.js";import"./ProtectRoute-p1fmtLeu.js";import"./Modal-BKL-5GzU.js";import"./Empty-BYF0tVRk.js";import"./useFollowComponent-iGQv4zoS.js";import"./offset-CLDSqOP5.js";import"./TimeInput-wQ67FbW6.js";import"./useCustomFields-BuxKsqGS.js";import"./Select-niU9Razm.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new n.Error().stack;t&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[t]="2b9d6ea1-c62f-4b8d-a7ba-8b2d8eb04bfc",n._sentryDebugIdIdentifier="sentry-dbid-2b9d6ea1-c62f-4b8d-a7ba-8b2d8eb04bfc")}catch{}})();function Ct(n){const t=_.useRef(n);t.current=_.useMemo(()=>n,[n]);const s=_.useRef(void 0);return s.current||(s.current=function(...r){return t.current.apply(this,r)}),s.current}const Nt="_radioGroup_1a3sr_17",Tt="_item_1a3sr_23",Rt="_radio_1a3sr_17",zt="_indicator_1a3sr_55",P={radioGroup:Nt,item:Tt,radio:Rt,indicator:zt};function $t({items:n,onValueChange:t,...s}){return e.jsx(Ue,{onValueChange:r=>t==null?void 0:t(r),className:P.radioGroup,...s,children:n.map(r=>e.jsxs("label",{className:P.item,children:[e.jsx(Oe,{value:r.value.toString(),className:P.radio,children:e.jsx(Ge,{className:P.indicator})}),r.label]},r.value.toString()))})}const At="_delayInput_ksn92_17",Dt="_inputField_ksn92_23",re={delayInput:At,inputField:Dt};function Pt(n){const{eventId:t,duration:s}=n,{updateEntry:r}=z(),[l,i]=_.useState(""),c=_.useRef(null),d=_.useRef(!1);_.useEffect(()=>{typeof s>"u"||i(A(s))},[s]);const u=o=>{if(d.current){d.current=!1;return}const g=o.startsWith("-");let v=wt(o);g&&(v=v*-1),v!==s&&(p(v),i(A(v)))},p=o=>{r({id:t,duration:o})},f=()=>{var o;return(o=c.current)==null?void 0:o.select()},m=o=>{var g,v;o.key==="Enter"?((g=c.current)==null||g.blur(),u(o.target.value)):o.key==="Tab"?u(o.target.value):o.key==="Escape"&&(d.current=!0,i(A(s)),(v=c.current)==null||v.blur())},y=o=>{o==="add"?s<0&&p(s*-1):o==="subtract"&&s>0&&p(s*-1)},b=l.startsWith("-")?"subtract":"add";return e.jsxs("div",{className:re.delayInput,children:[e.jsx(ae,{ref:c,"data-testid":"delay-input",className:re.inputField,placeholder:"-",onFocus:f,onChange:o=>i(o.target.value),onBlur:o=>u(o.target.value),onKeyDown:m,value:l,maxLength:9}),e.jsx($t,{onValueChange:y,value:b,items:[{value:"add",label:"Add time"},{value:"subtract",label:"Subtract time"}]})]})}const Mt="_delay_tel5v_17",Lt="_hasCursor_tel5v_34",Ft="_drag_tel5v_38",V={delay:Mt,hasCursor:Lt,drag:Ft};function Bt({data:n,hasCursor:t}){const{applyDelay:s,deleteEntry:r}=z(),l=_.useRef(null),{attributes:i,listeners:c,setNodeRef:d,isDragging:u,transform:p,transition:f}=W({id:n.id,data:{type:"delay"},animateLayoutChanges:()=>!1}),m={zIndex:u?2:"inherit",transform:Z.Translate.toString(p),transition:f};_.useEffect(()=>{var o;t&&((o=l==null?void 0:l.current)==null||o.focus())},[t]);const y=()=>{s(n.id)},b=()=>{r([n.id])};return e.jsxs("div",{className:R([V.delay,t?V.hasCursor:null]),ref:d,style:m,"data-testid":"rundown-delay",children:[e.jsx("span",{className:V.drag,ref:l,...i,...c,children:e.jsx(J,{})}),e.jsx(Pt,{eventId:n.id,duration:n.duration}),e.jsxs(ne,{onClick:y,variant:"ghosted-white",children:[e.jsx(He,{})," Make permanent"]}),e.jsxs(ne,{onClick:b,variant:"ghosted-white",children:[e.jsx(Ke,{}),"Cancel"]})]})}const Ut=Ve(n=>({selectedEventId:null,setSelectedEventId:t=>n(()=>({selectedEventId:t})),clearSelectedEventId:()=>n(()=>({selectedEventId:null}))})),Ot="_blink_1imw4_1",Gt="_fourtyfive_1imw4_13",Ht="_chip_1imw4_17",Kt="_over_1imw4_23",Vt="_under_1imw4_26",qt="_due_1imw4_29",L={blink:Ot,fourtyfive:Gt,chip:Ht,over:Kt,under:Vt,due:qt};function Qt({timeStart:n,delay:t,dayOffset:s,isPast:r,isLoaded:l,className:i,totalGap:c,id:d,duration:u,isLinkedToLoaded:p}){const{playback:f}=mt();if(l)return null;const m=me(f);return!m||r?e.jsx(Zt,{className:i,id:d,duration:u}):m?e.jsx(w,{text:"Expected time until start",render:e.jsx("span",{}),className:i,children:e.jsx(Wt,{timeStart:n,delay:t,dayOffset:s,totalGap:c,isLinkedToLoaded:p})}):null}function Wt({timeStart:n,delay:t,dayOffset:s,totalGap:r,isLinkedToLoaded:l}){const i=ft({timeStart:n,delay:t,dayOffset:s},{totalGap:r,isLinkedToLoaded:l}),c=i<le,d=c?"DUE":`${X(Math.abs(i),i>2*ce)}`;return e.jsx("div",{className:R([L.chip,c&&L.due]),children:d})}function Zt(n){const{className:t,id:s,duration:r}=n,{data:l}=It(),i=l[s],[c,d,u]=_.useMemo(()=>{if(!i)return[null,"none",""];const{startedAt:p,endedAt:f}=i;if(!p||!f)return[null,"none",""];const y=f-p-r,b=Math.abs(y);if(b<le)return["ontime","under","Event finished on time"];const o=y>0,g=A(b),v=`Event ran ${o?"over":"under"} time by ${g}`;return[`${o?"+":"-"}${X(b,b>2*ce)}`,o?"over":"under",v]},[i,r]);return c?e.jsx(w,{text:u,render:e.jsx("span",{}),className:R([L.chip,L[d],t]),children:c==="ontime"?e.jsx(qe,{size:"1.1rem"}):c}):null}const Jt="_blink_t5zwd_1",Xt="_fourtyfive_t5zwd_13",Yt="_rundownEvent_t5zwd_17",en="_loaded_t5zwd_39",tn="_play_t5zwd_42",nn="_roll_t5zwd_47",sn="_pause_t5zwd_52",rn="_selected_t5zwd_57",on="_hasCursor_t5zwd_60",an="_past_t5zwd_63",ln="_skip_t5zwd_63",cn="_timerNote_t5zwd_63",dn="_statusElements_t5zwd_64",un="_eventTitle_t5zwd_65",pn="_eventNote_t5zwd_66",mn="_eventTimers_t5zwd_67",fn="_eventStatus_t5zwd_68",_n="_playbackActions_t5zwd_69",bn="_binder_t5zwd_70",vn="_drag_t5zwd_97",yn="_cue_t5zwd_115",gn="_chipSection_t5zwd_143",xn="_titleSection_t5zwd_147",hn="_nextTag_t5zwd_153",jn="_progressBg_t5zwd_166",wn="_hidden_t5zwd_175",En="_flip_t5zwd_179",kn="_statusIcon_t5zwd_213",In="_active_t5zwd_217",Sn="_disabled_t5zwd_220",a={blink:Jt,fourtyfive:Xt,rundownEvent:Yt,loaded:en,play:tn,roll:nn,pause:sn,selected:rn,hasCursor:on,past:an,skip:ln,timerNote:cn,statusElements:dn,eventTitle:un,eventNote:pn,eventTimers:mn,eventStatus:fn,playbackActions:_n,binder:bn,drag:vn,cue:yn,chipSection:gn,titleSection:xn,nextTag:hn,progressBg:jn,hidden:wn,flip:En,statusIcon:kn,active:In,disabled:Sn},Cn=_.memo(Nn);function Nn({eventId:n,skip:t,isPlaying:s,isPaused:r,loaded:l,disablePlayback:i}){const{updateEntry:c}=z(),d=m=>{m.stopPropagation(),c({id:n,skip:!t})},u=m=>{m.stopPropagation(),s?D.pause():r?D.start():D.startEvent(n)},p=m=>{m.stopPropagation(),D.loadEvent(n)},f=r?{tooltip:"Continue event",backgroundColor:"#339E4E"}:s?{tooltip:"Pause event",backgroundColor:"#c05621"}:{tooltip:"Start event",backgroundColor:void 0};return e.jsxs("div",{className:a.playbackActions,children:[e.jsx(w,{text:"Skip event",render:e.jsx(G,{variant:"subtle-white"}),onClick:d,tabIndex:-1,disabled:l,style:{background:t?"#9A0000":void 0},"aria-label":"Skip event",children:t?e.jsx(Qe,{}):e.jsx(We,{})}),e.jsx(w,{text:"Load event",render:e.jsx(G,{variant:"subtle-white"}),onClick:p,tabIndex:-1,disabled:i,"aria-label":"Load event",children:e.jsx(Ze,{className:a.flip})}),e.jsx(w,{text:f.tooltip,render:e.jsx(G,{variant:"subtle-white"}),onClick:u,tabIndex:-1,disabled:i,style:{backgroundColor:f.backgroundColor},"aria-label":s?"Pause event":"Start event",children:s?e.jsx(Je,{}):e.jsx(ie,{})})]})}const Tn="_progressBar_1glmb_17",Rn={progressBar:Tn};function zn(){const n=_t(),t=St(n.current,n.duration);return e.jsx("div",{className:Rn.progressBar,style:{width:`${t}%`}})}const $n=_.memo(An);function An({eventId:n,timeStart:t,timeEnd:s,duration:r,timeStrategy:l,linkStart:i,countToEnd:c,endAction:d,timerType:u,title:p,note:f,delay:m,isNext:y,skip:b=!1,loaded:o,playback:g,isRolling:v,dayOffset:C,isPast:I,totalGap:N,isLinkedToLoaded:T,hasTriggers:x}){const[h,F]=_.useState(!1);_.useEffect(()=>{F(!0)},[]);const B=g===se.Play,U=g===se.Pause;return h?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:a.eventTimers,children:e.jsx(Et,{eventId:n,timeStart:t,timeEnd:s,duration:r,delay:m,timeStrategy:l,linkStart:i,countToEnd:c})}),e.jsxs("div",{className:a.titleSection,children:[e.jsx(xt,{title:p,entryId:n,placeholder:"Event title",className:a.eventTitle}),y&&e.jsx("span",{className:a.nextTag,children:"UP NEXT"})]}),e.jsx(Cn,{eventId:n,skip:b,isPlaying:B,isPaused:U,loaded:o,disablePlayback:b||v}),!b&&e.jsx(Qt,{className:a.chipSection,id:n,timeStart:t,delay:m,dayOffset:C,isLinkedToLoaded:T,isPast:I,isLoaded:o,totalGap:N,duration:r}),e.jsxs("div",{className:a.statusElements,id:"entry-status","data-timertype":u,children:[e.jsx("span",{className:a.eventNote,children:f}),e.jsx("div",{className:o?a.progressBg:`${a.progressBg} ${a.hidden}`,children:o&&e.jsx(zn,{})}),e.jsxs("div",{className:a.eventStatus,tabIndex:-1,children:[e.jsx(w,{text:`Time type: ${u}`,render:e.jsx("span",{}),children:e.jsx(Pn,{type:u,className:a.statusIcon})}),e.jsx(w,{text:`End action: ${d}`,render:e.jsx("span",{}),children:e.jsx(Dn,{action:d,className:a.statusIcon})}),e.jsx(w,{text:`${c?"Count to End":"Count duration"}`,render:e.jsx("span",{}),children:e.jsx(Xe,{className:`${a.statusIcon} ${c?a.active:a.disabled}`})}),e.jsx(w,{text:"Event has Triggers",render:e.jsx("span",{}),children:e.jsx(Ye,{className:`${a.statusIcon} ${x?a.active:a.disabled}`})})]})]})]}):null}function Dn(n){const{action:t,className:s}=n,r=R([t!==K.None&&a.active,s]);return t===K.LoadNext?e.jsx(rt,{className:r}):t===K.PlayNext?e.jsx(ot,{className:r}):e.jsx(ie,{className:s})}function Pn(n){const{type:t,className:s}=n;return t===H.CountUp?e.jsx(et,{className:s}):t===H.Clock?e.jsx(tt,{className:s}):t===H.None?e.jsx(nt,{className:s}):e.jsx(st,{className:s})}function Mn(n,t){if(!t)return;const s=Math.max(0,n+t);return`New start ${bt(A(s))}`}function Ln(n,t){if(n===0)return t?"(next day)":void 0;const s=X(Math.abs(n),!1);return`${n<0?"Overlap":"Gap"} ${s}${t?" (next day)":""}`}const Fn="_indicators_duajo_18",Bn="_delay_duajo_29",Un="_gap_duajo_36",q={indicators:Fn,delay:Bn,gap:Un};function On({timeStart:n,delay:t,gap:s,isNextDay:r}){const l=Ln(s,r),i=Mn(n,t);return e.jsxs("div",{className:q.indicators,children:[i&&e.jsx("div",{className:q.delay,children:i}),l&&e.jsx("div",{className:q.gap,children:l})]})}function Gn({eventId:n,cue:t,timeStart:s,timeEnd:r,duration:l,timeStrategy:i,linkStart:c,flag:d,countToEnd:u,eventIndex:p,endAction:f,timerType:m,title:y,note:b,delay:o,colour:g,isPast:v,isNext:C,skip:I=!1,parent:N,loaded:T,hasCursor:x,playback:h,isRolling:F,gap:B,isNextDay:U,dayOffset:fe,totalGap:_e,isLinkedToLoaded:be,hasTriggers:ve,createCloneEvent:ye}){const{selectedEventId:$,setSelectedEventId:ge,clearSelectedEventId:xe}=Ut(),{updateEntry:he,batchUpdateEvents:Y,deleteEntry:ee,groupEntries:je,swapEvents:we}=z(),{selectedEvents:S,unselect:Ee,setSelectedEvents:ke,clearSelectedEvents:te}=ue(),E=_.useRef(null),[Ie,Se]=_.useState(!1),[Ce]=pe(S.size>1?[{type:"item",label:"Link to previous",icon:it,onClick:()=>{Y({linkStart:!0},Array.from(S))}},{type:"item",label:"Unlink from previous",icon:at,onClick:()=>{Y({linkStart:!1},Array.from(S))}},{type:"divider"},{type:"item",label:"Group",icon:lt,onClick:()=>{je(Array.from(S)),te()},disabled:N!==null},{type:"divider"},{type:"item",label:"Delete",icon:Q,onClick:()=>{te(),ee(Array.from(S))}}]:[{type:"item",label:d?"Remove flag":"Add flag",icon:ct,onClick:()=>{he({id:n,flag:!d})}},{type:"divider"},{type:"item",label:"Add to swap",icon:dt,onClick:()=>ge(n)},{type:"item",label:`Swap this event with ${$??""}`,icon:ut,onClick:()=>{$&&(we($,n),xe())},disabled:$==null||$===n},{type:"item",label:"Clone",icon:pt,onClick:ye},{type:"divider"},{type:"item",label:"Delete",icon:Q,onClick:()=>{ee([n]),Ee(n)}}]),{isDragging:Ne,attributes:Te,listeners:Re,setNodeRef:ze,transform:$e,transition:Ae}=W({id:n,data:{type:"event",parent:N},animateLayoutChanges:()=>!1}),De={zIndex:Ne?2:"inherit",transform:Z.Translate.toString($e),transition:Ae},Pe=g&&de(g);_.useEffect(()=>{if(!x||(E==null?void 0:E.current)==null)return;const k=document.activeElement,j=E.current.closest("#event-group");j&&!j.contains(k)&&E.current.focus()},[x]),_.useLayoutEffect(()=>{const k=new IntersectionObserver(([O])=>{O.isIntersecting&&Se(!0)},{root:null,threshold:1}),j=E.current;return j&&k.observe(j),()=>{j&&k.unobserve(j)}},[E]);const Me=S.has(n),Le=R([a.rundownEvent,I?a.skip:null,v?a.past:null,T?a.loaded:null,h?a[h]:null,Me?a.selected:null,x?a.hasCursor:null]),Fe=k=>{if(k.stopPropagation(),S.size>1&&k.button===2)return;const j=p-1,O=ht(k);ke({id:n,index:j,selectMode:O})},Be=h?me(h):!1;return e.jsxs("div",{className:Le,ref:ze,style:De,onClick:Fe,onContextMenu:Ce,"data-testid":"rundown-event",...Be?{"data-running":!0}:{},children:[e.jsx(On,{timeStart:s,delay:o,gap:B,isNextDay:U}),e.jsxs("div",{className:a.binder,style:{...Pe},tabIndex:-1,children:[e.jsx("span",{className:a.drag,ref:E,...Te,...Re,children:e.jsx(J,{})}),e.jsx("span",{className:a.cue,children:t})]}),Ie&&e.jsx($n,{timeStart:s,timeEnd:r,duration:l,linkStart:c,countToEnd:u,timeStrategy:i,eventId:n,eventIndex:p,endAction:f,timerType:m,title:y,note:b,delay:o,isNext:C,skip:I,loaded:T,playback:h,isRolling:F,dayOffset:fe,isPast:v,totalGap:_e,isLinkedToLoaded:be,hasTriggers:ve})]})}const Hn="_milestone_102sw_17",Kn="_hasCursor_102sw_35",Vn="_binder_102sw_39",qn="_drag_102sw_47",M={milestone:Hn,hasCursor:Kn,binder:Vn,drag:qn};function Qn({colour:n,cue:t,entryId:s,hasCursor:r,title:l}){const i=_.useRef(null),{updateEntry:c,deleteEntry:d}=z(),{selectedEvents:u,setSingleEntrySelection:p}=ue(),[f]=pe([{type:"item",label:"Delete",icon:Q,onClick:()=>d([s])}]),{attributes:m,listeners:y,setNodeRef:b,isDragging:o,transform:g,transition:v}=W({id:s,data:{type:"milestone"},animateLayoutChanges:()=>!1}),C=x=>{x.stopPropagation(),!(u.size>1&&x.button===2)&&p({id:s})},I=(x,h)=>{c({id:s,[x]:h})},N={zIndex:o?2:"inherit",transform:Z.Translate.toString(g),transition:v},T=n&&de(n);return e.jsxs("div",{className:R([M.milestone,r?M.hasCursor:null]),ref:b,onClick:C,onContextMenu:f,style:N,"data-testid":"rundown-milestone",children:[e.jsx("div",{className:M.binder,style:{...T},children:e.jsx("span",{className:M.drag,ref:i,...m,...y,children:e.jsx(J,{})})}),e.jsx(oe,{field:"cue",initialValue:t,placeholder:"Cue",submitHandler:I}),e.jsx(oe,{field:"title",initialValue:l,placeholder:"Title",submitHandler:I})]})}function oe({field:n,initialValue:t,placeholder:s,submitHandler:r}){const l=_.useRef(null),i=_.useCallback(f=>r(n,f),[n,r]),{value:c,onChange:d,onBlur:u,onKeyDown:p}=kt(t,i,l,{submitOnEnter:!0});return e.jsx(ae,{id:n,ref:l,fluid:!0,value:c,placeholder:s,onChange:d,onBlur:u,onKeyDown:p})}function gs({isPast:n,data:t,loaded:s,hasCursor:r,isNext:l,playback:i,isRolling:c,eventIndex:d,isNextDay:u,totalGap:p,isLinkedToLoaded:f}){const{addEntry:m}=z(),y=Ct(()=>{const b=jt(t);m(b,{after:t.id})});return vt(t)?e.jsx(Gn,{eventId:t.id,eventIndex:d,cue:t.cue,timeStart:t.timeStart,timeEnd:t.timeEnd,duration:t.duration,timeStrategy:t.timeStrategy,linkStart:t.linkStart,flag:t.flag,countToEnd:t.countToEnd,endAction:t.endAction,timerType:t.timerType,title:t.title,note:t.note,delay:t.delay,colour:t.colour,isPast:n,isNext:l,skip:t.skip,parent:t.parent,loaded:s,hasCursor:r,playback:i,isRolling:c,gap:t.gap,isNextDay:u,dayOffset:t.dayOffset,totalGap:p,isLinkedToLoaded:f,createCloneEvent:y,hasTriggers:t.triggers.length>0}):yt(t)?e.jsx(Bt,{data:t,hasCursor:r}):gt(t)?e.jsx(Qn,{colour:t.colour,cue:t.cue,entryId:t.id,hasCursor:r,title:t.title}):null}export{gs as default};
|
|
2
|
-
//# sourceMappingURL=RundownEntry-
|
|
1
|
+
import{h as _,j as e,aY as Ue,aZ as Oe,a_ as Ge,aE as W,aF as Z,bg as J,cg as He,t as Ke,f as Ve,bq as qe,ch as Qe,ci as We,bQ as Ze,bM as ie,bN as Je,bS as Xe,cj as Ye,x as et,bR as tt,br as nt,aL as st,bP as rt,ck as ot,am as it,bl as at,cl as lt,ah as Q,aD as ct,T as dt,K as ut,aK as pt}from"./vendor-CCiSQ9k9.js";import{y as A,af as ae,i as R,B as ne,n as mt,be as le,l as X,M as ce,bd as ft,ai as G,bP as D,J as _t,b as se,T as H,bQ as bt,aA as de}from"./index-BQEUaoAf.js";import{i as vt,q as yt,k as gt}from"./useRundown-BfpjcCEJ.js";import{u as z}from"./dateConfig-DRQGMWDF.js";import{T as xt,u as ue,a as pe,g as ht,c as jt}from"./RundownExport-C6YhMGOC.js";import{p as wt}from"./parseUserTime-BeTKj08M.js";import{E as K}from"./validateEvent-P9sf7C10.js";import{T as w}from"./Tooltip-D9XRnwOW.js";import{a as Et,u as kt}from"./MilestoneEditor-Bge8xLrV.js";import{u as It}from"./useReport-B4dMYcNL.js";import{i as me}from"./playbackstate-B_khF6xU.js";import{g as St}from"./getProgress-Cw79NL_O.js";import"./useProjectData-C1hVamxc.js";import"./editorSettings-BU0pTMSY.js";import"./rundownUtils-BZHazkXR.js";import"./EditorUtils-Da5ALK1P.js";import"./ProtectRoute-CrcWfOlG.js";import"./Modal-C2sFA0zf.js";import"./Empty-gWT_HMeu.js";import"./useFollowComponent-Ctfhf2or.js";import"./offset-DJAHqjFW.js";import"./TimeInput-Dg1naiy3.js";import"./useCustomFields-DqCYz8Kt.js";import"./Select-CedN80WS.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new n.Error().stack;t&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[t]="2b9d6ea1-c62f-4b8d-a7ba-8b2d8eb04bfc",n._sentryDebugIdIdentifier="sentry-dbid-2b9d6ea1-c62f-4b8d-a7ba-8b2d8eb04bfc")}catch{}})();function Ct(n){const t=_.useRef(n);t.current=_.useMemo(()=>n,[n]);const s=_.useRef(void 0);return s.current||(s.current=function(...r){return t.current.apply(this,r)}),s.current}const Nt="_radioGroup_1a3sr_17",Tt="_item_1a3sr_23",Rt="_radio_1a3sr_17",zt="_indicator_1a3sr_55",P={radioGroup:Nt,item:Tt,radio:Rt,indicator:zt};function $t({items:n,onValueChange:t,...s}){return e.jsx(Ue,{onValueChange:r=>t==null?void 0:t(r),className:P.radioGroup,...s,children:n.map(r=>e.jsxs("label",{className:P.item,children:[e.jsx(Oe,{value:r.value.toString(),className:P.radio,children:e.jsx(Ge,{className:P.indicator})}),r.label]},r.value.toString()))})}const At="_delayInput_ksn92_17",Dt="_inputField_ksn92_23",re={delayInput:At,inputField:Dt};function Pt(n){const{eventId:t,duration:s}=n,{updateEntry:r}=z(),[l,i]=_.useState(""),c=_.useRef(null),d=_.useRef(!1);_.useEffect(()=>{typeof s>"u"||i(A(s))},[s]);const u=o=>{if(d.current){d.current=!1;return}const g=o.startsWith("-");let v=wt(o);g&&(v=v*-1),v!==s&&(p(v),i(A(v)))},p=o=>{r({id:t,duration:o})},f=()=>{var o;return(o=c.current)==null?void 0:o.select()},m=o=>{var g,v;o.key==="Enter"?((g=c.current)==null||g.blur(),u(o.target.value)):o.key==="Tab"?u(o.target.value):o.key==="Escape"&&(d.current=!0,i(A(s)),(v=c.current)==null||v.blur())},y=o=>{o==="add"?s<0&&p(s*-1):o==="subtract"&&s>0&&p(s*-1)},b=l.startsWith("-")?"subtract":"add";return e.jsxs("div",{className:re.delayInput,children:[e.jsx(ae,{ref:c,"data-testid":"delay-input",className:re.inputField,placeholder:"-",onFocus:f,onChange:o=>i(o.target.value),onBlur:o=>u(o.target.value),onKeyDown:m,value:l,maxLength:9}),e.jsx($t,{onValueChange:y,value:b,items:[{value:"add",label:"Add time"},{value:"subtract",label:"Subtract time"}]})]})}const Mt="_delay_tel5v_17",Lt="_hasCursor_tel5v_34",Ft="_drag_tel5v_38",V={delay:Mt,hasCursor:Lt,drag:Ft};function Bt({data:n,hasCursor:t}){const{applyDelay:s,deleteEntry:r}=z(),l=_.useRef(null),{attributes:i,listeners:c,setNodeRef:d,isDragging:u,transform:p,transition:f}=W({id:n.id,data:{type:"delay"},animateLayoutChanges:()=>!1}),m={zIndex:u?2:"inherit",transform:Z.Translate.toString(p),transition:f};_.useEffect(()=>{var o;t&&((o=l==null?void 0:l.current)==null||o.focus())},[t]);const y=()=>{s(n.id)},b=()=>{r([n.id])};return e.jsxs("div",{className:R([V.delay,t?V.hasCursor:null]),ref:d,style:m,"data-testid":"rundown-delay",children:[e.jsx("span",{className:V.drag,ref:l,...i,...c,children:e.jsx(J,{})}),e.jsx(Pt,{eventId:n.id,duration:n.duration}),e.jsxs(ne,{onClick:y,variant:"ghosted-white",children:[e.jsx(He,{})," Make permanent"]}),e.jsxs(ne,{onClick:b,variant:"ghosted-white",children:[e.jsx(Ke,{}),"Cancel"]})]})}const Ut=Ve(n=>({selectedEventId:null,setSelectedEventId:t=>n(()=>({selectedEventId:t})),clearSelectedEventId:()=>n(()=>({selectedEventId:null}))})),Ot="_blink_1imw4_1",Gt="_fourtyfive_1imw4_13",Ht="_chip_1imw4_17",Kt="_over_1imw4_23",Vt="_under_1imw4_26",qt="_due_1imw4_29",L={blink:Ot,fourtyfive:Gt,chip:Ht,over:Kt,under:Vt,due:qt};function Qt({timeStart:n,delay:t,dayOffset:s,isPast:r,isLoaded:l,className:i,totalGap:c,id:d,duration:u,isLinkedToLoaded:p}){const{playback:f}=mt();if(l)return null;const m=me(f);return!m||r?e.jsx(Zt,{className:i,id:d,duration:u}):m?e.jsx(w,{text:"Expected time until start",render:e.jsx("span",{}),className:i,children:e.jsx(Wt,{timeStart:n,delay:t,dayOffset:s,totalGap:c,isLinkedToLoaded:p})}):null}function Wt({timeStart:n,delay:t,dayOffset:s,totalGap:r,isLinkedToLoaded:l}){const i=ft({timeStart:n,delay:t,dayOffset:s},{totalGap:r,isLinkedToLoaded:l}),c=i<le,d=c?"DUE":`${X(Math.abs(i),i>2*ce)}`;return e.jsx("div",{className:R([L.chip,c&&L.due]),children:d})}function Zt(n){const{className:t,id:s,duration:r}=n,{data:l}=It(),i=l[s],[c,d,u]=_.useMemo(()=>{if(!i)return[null,"none",""];const{startedAt:p,endedAt:f}=i;if(!p||!f)return[null,"none",""];const y=f-p-r,b=Math.abs(y);if(b<le)return["ontime","under","Event finished on time"];const o=y>0,g=A(b),v=`Event ran ${o?"over":"under"} time by ${g}`;return[`${o?"+":"-"}${X(b,b>2*ce)}`,o?"over":"under",v]},[i,r]);return c?e.jsx(w,{text:u,render:e.jsx("span",{}),className:R([L.chip,L[d],t]),children:c==="ontime"?e.jsx(qe,{size:"1.1rem"}):c}):null}const Jt="_blink_t5zwd_1",Xt="_fourtyfive_t5zwd_13",Yt="_rundownEvent_t5zwd_17",en="_loaded_t5zwd_39",tn="_play_t5zwd_42",nn="_roll_t5zwd_47",sn="_pause_t5zwd_52",rn="_selected_t5zwd_57",on="_hasCursor_t5zwd_60",an="_past_t5zwd_63",ln="_skip_t5zwd_63",cn="_timerNote_t5zwd_63",dn="_statusElements_t5zwd_64",un="_eventTitle_t5zwd_65",pn="_eventNote_t5zwd_66",mn="_eventTimers_t5zwd_67",fn="_eventStatus_t5zwd_68",_n="_playbackActions_t5zwd_69",bn="_binder_t5zwd_70",vn="_drag_t5zwd_97",yn="_cue_t5zwd_115",gn="_chipSection_t5zwd_143",xn="_titleSection_t5zwd_147",hn="_nextTag_t5zwd_153",jn="_progressBg_t5zwd_166",wn="_hidden_t5zwd_175",En="_flip_t5zwd_179",kn="_statusIcon_t5zwd_213",In="_active_t5zwd_217",Sn="_disabled_t5zwd_220",a={blink:Jt,fourtyfive:Xt,rundownEvent:Yt,loaded:en,play:tn,roll:nn,pause:sn,selected:rn,hasCursor:on,past:an,skip:ln,timerNote:cn,statusElements:dn,eventTitle:un,eventNote:pn,eventTimers:mn,eventStatus:fn,playbackActions:_n,binder:bn,drag:vn,cue:yn,chipSection:gn,titleSection:xn,nextTag:hn,progressBg:jn,hidden:wn,flip:En,statusIcon:kn,active:In,disabled:Sn},Cn=_.memo(Nn);function Nn({eventId:n,skip:t,isPlaying:s,isPaused:r,loaded:l,disablePlayback:i}){const{updateEntry:c}=z(),d=m=>{m.stopPropagation(),c({id:n,skip:!t})},u=m=>{m.stopPropagation(),s?D.pause():r?D.start():D.startEvent(n)},p=m=>{m.stopPropagation(),D.loadEvent(n)},f=r?{tooltip:"Continue event",backgroundColor:"#339E4E"}:s?{tooltip:"Pause event",backgroundColor:"#c05621"}:{tooltip:"Start event",backgroundColor:void 0};return e.jsxs("div",{className:a.playbackActions,children:[e.jsx(w,{text:"Skip event",render:e.jsx(G,{variant:"subtle-white"}),onClick:d,tabIndex:-1,disabled:l,style:{background:t?"#9A0000":void 0},"aria-label":"Skip event",children:t?e.jsx(Qe,{}):e.jsx(We,{})}),e.jsx(w,{text:"Load event",render:e.jsx(G,{variant:"subtle-white"}),onClick:p,tabIndex:-1,disabled:i,"aria-label":"Load event",children:e.jsx(Ze,{className:a.flip})}),e.jsx(w,{text:f.tooltip,render:e.jsx(G,{variant:"subtle-white"}),onClick:u,tabIndex:-1,disabled:i,style:{backgroundColor:f.backgroundColor},"aria-label":s?"Pause event":"Start event",children:s?e.jsx(Je,{}):e.jsx(ie,{})})]})}const Tn="_progressBar_1glmb_17",Rn={progressBar:Tn};function zn(){const n=_t(),t=St(n.current,n.duration);return e.jsx("div",{className:Rn.progressBar,style:{width:`${t}%`}})}const $n=_.memo(An);function An({eventId:n,timeStart:t,timeEnd:s,duration:r,timeStrategy:l,linkStart:i,countToEnd:c,endAction:d,timerType:u,title:p,note:f,delay:m,isNext:y,skip:b=!1,loaded:o,playback:g,isRolling:v,dayOffset:C,isPast:I,totalGap:N,isLinkedToLoaded:T,hasTriggers:x}){const[h,F]=_.useState(!1);_.useEffect(()=>{F(!0)},[]);const B=g===se.Play,U=g===se.Pause;return h?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:a.eventTimers,children:e.jsx(Et,{eventId:n,timeStart:t,timeEnd:s,duration:r,delay:m,timeStrategy:l,linkStart:i,countToEnd:c})}),e.jsxs("div",{className:a.titleSection,children:[e.jsx(xt,{title:p,entryId:n,placeholder:"Event title",className:a.eventTitle}),y&&e.jsx("span",{className:a.nextTag,children:"UP NEXT"})]}),e.jsx(Cn,{eventId:n,skip:b,isPlaying:B,isPaused:U,loaded:o,disablePlayback:b||v}),!b&&e.jsx(Qt,{className:a.chipSection,id:n,timeStart:t,delay:m,dayOffset:C,isLinkedToLoaded:T,isPast:I,isLoaded:o,totalGap:N,duration:r}),e.jsxs("div",{className:a.statusElements,id:"entry-status","data-timertype":u,children:[e.jsx("span",{className:a.eventNote,children:f}),e.jsx("div",{className:o?a.progressBg:`${a.progressBg} ${a.hidden}`,children:o&&e.jsx(zn,{})}),e.jsxs("div",{className:a.eventStatus,tabIndex:-1,children:[e.jsx(w,{text:`Time type: ${u}`,render:e.jsx("span",{}),children:e.jsx(Pn,{type:u,className:a.statusIcon})}),e.jsx(w,{text:`End action: ${d}`,render:e.jsx("span",{}),children:e.jsx(Dn,{action:d,className:a.statusIcon})}),e.jsx(w,{text:`${c?"Count to End":"Count duration"}`,render:e.jsx("span",{}),children:e.jsx(Xe,{className:`${a.statusIcon} ${c?a.active:a.disabled}`})}),e.jsx(w,{text:"Event has Triggers",render:e.jsx("span",{}),children:e.jsx(Ye,{className:`${a.statusIcon} ${x?a.active:a.disabled}`})})]})]})]}):null}function Dn(n){const{action:t,className:s}=n,r=R([t!==K.None&&a.active,s]);return t===K.LoadNext?e.jsx(rt,{className:r}):t===K.PlayNext?e.jsx(ot,{className:r}):e.jsx(ie,{className:s})}function Pn(n){const{type:t,className:s}=n;return t===H.CountUp?e.jsx(et,{className:s}):t===H.Clock?e.jsx(tt,{className:s}):t===H.None?e.jsx(nt,{className:s}):e.jsx(st,{className:s})}function Mn(n,t){if(!t)return;const s=Math.max(0,n+t);return`New start ${bt(A(s))}`}function Ln(n,t){if(n===0)return t?"(next day)":void 0;const s=X(Math.abs(n),!1);return`${n<0?"Overlap":"Gap"} ${s}${t?" (next day)":""}`}const Fn="_indicators_duajo_18",Bn="_delay_duajo_29",Un="_gap_duajo_36",q={indicators:Fn,delay:Bn,gap:Un};function On({timeStart:n,delay:t,gap:s,isNextDay:r}){const l=Ln(s,r),i=Mn(n,t);return e.jsxs("div",{className:q.indicators,children:[i&&e.jsx("div",{className:q.delay,children:i}),l&&e.jsx("div",{className:q.gap,children:l})]})}function Gn({eventId:n,cue:t,timeStart:s,timeEnd:r,duration:l,timeStrategy:i,linkStart:c,flag:d,countToEnd:u,eventIndex:p,endAction:f,timerType:m,title:y,note:b,delay:o,colour:g,isPast:v,isNext:C,skip:I=!1,parent:N,loaded:T,hasCursor:x,playback:h,isRolling:F,gap:B,isNextDay:U,dayOffset:fe,totalGap:_e,isLinkedToLoaded:be,hasTriggers:ve,createCloneEvent:ye}){const{selectedEventId:$,setSelectedEventId:ge,clearSelectedEventId:xe}=Ut(),{updateEntry:he,batchUpdateEvents:Y,deleteEntry:ee,groupEntries:je,swapEvents:we}=z(),{selectedEvents:S,unselect:Ee,setSelectedEvents:ke,clearSelectedEvents:te}=ue(),E=_.useRef(null),[Ie,Se]=_.useState(!1),[Ce]=pe(S.size>1?[{type:"item",label:"Link to previous",icon:it,onClick:()=>{Y({linkStart:!0},Array.from(S))}},{type:"item",label:"Unlink from previous",icon:at,onClick:()=>{Y({linkStart:!1},Array.from(S))}},{type:"divider"},{type:"item",label:"Group",icon:lt,onClick:()=>{je(Array.from(S)),te()},disabled:N!==null},{type:"divider"},{type:"item",label:"Delete",icon:Q,onClick:()=>{te(),ee(Array.from(S))}}]:[{type:"item",label:d?"Remove flag":"Add flag",icon:ct,onClick:()=>{he({id:n,flag:!d})}},{type:"divider"},{type:"item",label:"Add to swap",icon:dt,onClick:()=>ge(n)},{type:"item",label:`Swap this event with ${$??""}`,icon:ut,onClick:()=>{$&&(we($,n),xe())},disabled:$==null||$===n},{type:"item",label:"Clone",icon:pt,onClick:ye},{type:"divider"},{type:"item",label:"Delete",icon:Q,onClick:()=>{ee([n]),Ee(n)}}]),{isDragging:Ne,attributes:Te,listeners:Re,setNodeRef:ze,transform:$e,transition:Ae}=W({id:n,data:{type:"event",parent:N},animateLayoutChanges:()=>!1}),De={zIndex:Ne?2:"inherit",transform:Z.Translate.toString($e),transition:Ae},Pe=g&&de(g);_.useEffect(()=>{if(!x||(E==null?void 0:E.current)==null)return;const k=document.activeElement,j=E.current.closest("#event-group");j&&!j.contains(k)&&E.current.focus()},[x]),_.useLayoutEffect(()=>{const k=new IntersectionObserver(([O])=>{O.isIntersecting&&Se(!0)},{root:null,threshold:1}),j=E.current;return j&&k.observe(j),()=>{j&&k.unobserve(j)}},[E]);const Me=S.has(n),Le=R([a.rundownEvent,I?a.skip:null,v?a.past:null,T?a.loaded:null,h?a[h]:null,Me?a.selected:null,x?a.hasCursor:null]),Fe=k=>{if(k.stopPropagation(),S.size>1&&k.button===2)return;const j=p-1,O=ht(k);ke({id:n,index:j,selectMode:O})},Be=h?me(h):!1;return e.jsxs("div",{className:Le,ref:ze,style:De,onClick:Fe,onContextMenu:Ce,"data-testid":"rundown-event",...Be?{"data-running":!0}:{},children:[e.jsx(On,{timeStart:s,delay:o,gap:B,isNextDay:U}),e.jsxs("div",{className:a.binder,style:{...Pe},tabIndex:-1,children:[e.jsx("span",{className:a.drag,ref:E,...Te,...Re,children:e.jsx(J,{})}),e.jsx("span",{className:a.cue,children:t})]}),Ie&&e.jsx($n,{timeStart:s,timeEnd:r,duration:l,linkStart:c,countToEnd:u,timeStrategy:i,eventId:n,eventIndex:p,endAction:f,timerType:m,title:y,note:b,delay:o,isNext:C,skip:I,loaded:T,playback:h,isRolling:F,dayOffset:fe,isPast:v,totalGap:_e,isLinkedToLoaded:be,hasTriggers:ve})]})}const Hn="_milestone_102sw_17",Kn="_hasCursor_102sw_35",Vn="_binder_102sw_39",qn="_drag_102sw_47",M={milestone:Hn,hasCursor:Kn,binder:Vn,drag:qn};function Qn({colour:n,cue:t,entryId:s,hasCursor:r,title:l}){const i=_.useRef(null),{updateEntry:c,deleteEntry:d}=z(),{selectedEvents:u,setSingleEntrySelection:p}=ue(),[f]=pe([{type:"item",label:"Delete",icon:Q,onClick:()=>d([s])}]),{attributes:m,listeners:y,setNodeRef:b,isDragging:o,transform:g,transition:v}=W({id:s,data:{type:"milestone"},animateLayoutChanges:()=>!1}),C=x=>{x.stopPropagation(),!(u.size>1&&x.button===2)&&p({id:s})},I=(x,h)=>{c({id:s,[x]:h})},N={zIndex:o?2:"inherit",transform:Z.Translate.toString(g),transition:v},T=n&&de(n);return e.jsxs("div",{className:R([M.milestone,r?M.hasCursor:null]),ref:b,onClick:C,onContextMenu:f,style:N,"data-testid":"rundown-milestone",children:[e.jsx("div",{className:M.binder,style:{...T},children:e.jsx("span",{className:M.drag,ref:i,...m,...y,children:e.jsx(J,{})})}),e.jsx(oe,{field:"cue",initialValue:t,placeholder:"Cue",submitHandler:I}),e.jsx(oe,{field:"title",initialValue:l,placeholder:"Title",submitHandler:I})]})}function oe({field:n,initialValue:t,placeholder:s,submitHandler:r}){const l=_.useRef(null),i=_.useCallback(f=>r(n,f),[n,r]),{value:c,onChange:d,onBlur:u,onKeyDown:p}=kt(t,i,l,{submitOnEnter:!0});return e.jsx(ae,{id:n,ref:l,fluid:!0,value:c,placeholder:s,onChange:d,onBlur:u,onKeyDown:p})}function gs({isPast:n,data:t,loaded:s,hasCursor:r,isNext:l,playback:i,isRolling:c,eventIndex:d,isNextDay:u,totalGap:p,isLinkedToLoaded:f}){const{addEntry:m}=z(),y=Ct(()=>{const b=jt(t);m(b,{after:t.id})});return vt(t)?e.jsx(Gn,{eventId:t.id,eventIndex:d,cue:t.cue,timeStart:t.timeStart,timeEnd:t.timeEnd,duration:t.duration,timeStrategy:t.timeStrategy,linkStart:t.linkStart,flag:t.flag,countToEnd:t.countToEnd,endAction:t.endAction,timerType:t.timerType,title:t.title,note:t.note,delay:t.delay,colour:t.colour,isPast:n,isNext:l,skip:t.skip,parent:t.parent,loaded:s,hasCursor:r,playback:i,isRolling:c,gap:t.gap,isNextDay:u,dayOffset:t.dayOffset,totalGap:p,isLinkedToLoaded:f,createCloneEvent:y,hasTriggers:t.triggers.length>0}):yt(t)?e.jsx(Bt,{data:t,hasCursor:r}):gt(t)?e.jsx(Qn,{colour:t.colour,cue:t.cue,entryId:t.id,hasCursor:r,title:t.title}):null}export{gs as default};
|
|
2
|
+
//# sourceMappingURL=RundownEntry-D61IqkXb.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RundownEntry-B1dSz1wu.js","sources":["../../src/common/hooks/useMemoisedFn.ts","../../src/common/components/input/delay-input/BlockRadio.tsx","../../src/common/components/input/delay-input/DelayInput.tsx","../../src/features/rundown/rundown-delay/RundownDelay.tsx","../../src/features/rundown/useEventIdSwapping.ts","../../src/features/rundown/rundown-event/composite/RundownEventChip.tsx","../../src/features/rundown/rundown-event/composite/RundownEventPlayback.tsx","../../src/features/rundown/rundown-event/composite/RundownEventProgressBar.tsx","../../src/features/rundown/rundown-event/RundownEventInner.tsx","../../src/features/rundown/rundown-event/rundownEvent.utils.ts","../../src/features/rundown/rundown-event/RundownIndicators.tsx","../../src/features/rundown/rundown-event/RundownEvent.tsx","../../src/features/rundown/rundown-milestone/RundownMilestone.tsx","../../src/features/rundown/RundownEntry.tsx"],"sourcesContent":["/**\n * Shamelessly from https://ahooks.js.org/hooks/use-memoized-fn/\n * Interesting technique discussed by Dan Abramov\n * https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n */\n\nimport { useMemo, useRef } from 'react';\n\nimport { isDev } from '../../externals';\n\ntype noop = (this: any, ...args: any[]) => any;\n\ntype PickFunction<T extends noop> = (this: ThisParameterType<T>, ...args: Parameters<T>) => ReturnType<T>;\n\nconst isFunction = (value: unknown): value is (...args: any) => any => typeof value === 'function';\n\nexport default function useMemoisedFn<T extends noop>(fn: T) {\n if (isDev) {\n if (!isFunction(fn)) {\n console.error(`useMemoisedFn expected function as parameter, got ${typeof fn}`);\n }\n }\n\n const fnRef = useRef<T>(fn);\n\n // why not write `fnRef.current = fn`?\n // https://github.com/alibaba/hooks/issues/728\n fnRef.current = useMemo(() => fn, [fn]);\n\n const memoizedFn = useRef<PickFunction<T>>(undefined);\n if (!memoizedFn.current) {\n memoizedFn.current = function (this, ...args) {\n return fnRef.current.apply(this, args);\n };\n }\n\n return memoizedFn.current as T;\n}\n","import { Radio } from '@base-ui-components/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui-components/react/radio-group';\n\nimport style from './BlockRadio.module.scss';\n\ninterface BlockRadioProps<T extends string | number | boolean> extends Omit<BaseRadioGroup.Props, 'onValueChange'> {\n items: {\n value: T;\n label: string;\n }[];\n onValueChange?: (value: T) => void;\n}\n\nexport default function BlockRadio<T extends string | number | boolean>({\n items,\n onValueChange,\n ...elementProps\n}: BlockRadioProps<T>) {\n return (\n <BaseRadioGroup\n onValueChange={(value) => onValueChange?.(value as T)}\n className={style.radioGroup}\n {...elementProps}\n >\n {items.map((item) => (\n <label className={style.item} key={item.value.toString()}>\n <Radio.Root value={item.value.toString()} className={style.radio}>\n <Radio.Indicator className={style.indicator} />\n </Radio.Root>\n {item.label}\n </label>\n ))}\n </BaseRadioGroup>\n );\n}\n","import { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { useEntryActions } from '../../../hooks/useEntryAction';\nimport Input from '../input/Input';\n\nimport BlockRadio from './BlockRadio';\n\nimport style from './DelayInput.module.scss';\n\ninterface DelayInputProps {\n eventId: string;\n duration: number;\n}\n\nexport default function DelayInput(props: DelayInputProps) {\n const { eventId, duration } = props;\n const { updateEntry } = useEntryActions();\n\n const [value, setValue] = useState<string>('');\n const inputRef = useRef<HTMLInputElement | null>(null);\n // avoid wrong submit on cancel\n const ignoreChangeRef = useRef(false);\n\n // set internal value on duration change\n useEffect(() => {\n if (typeof duration === 'undefined') {\n return;\n }\n setValue(millisToString(duration));\n }, [duration]);\n\n /**\n * @description Prepare delay value for update\n * @param {string} newValue string to be parsed\n */\n const validateAndSubmit = (newValue: string) => {\n if (ignoreChangeRef.current) {\n ignoreChangeRef.current = false;\n return;\n }\n\n const isNegative = newValue.startsWith('-');\n let newMillis = parseUserTime(newValue);\n\n if (isNegative) {\n newMillis = newMillis * -1;\n }\n\n if (newMillis === duration) {\n return;\n }\n\n submitChange(newMillis);\n setValue(millisToString(newMillis));\n };\n\n const submitChange = (value: number) => {\n updateEntry({\n id: eventId,\n duration: value,\n });\n };\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = () => inputRef.current?.select();\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n validateAndSubmit((event.target as HTMLInputElement).value);\n } else if (event.key === 'Tab') {\n validateAndSubmit((event.target as HTMLInputElement).value);\n } else if (event.key === 'Escape') {\n ignoreChangeRef.current = true;\n setValue(millisToString(duration));\n inputRef.current?.blur();\n }\n };\n\n /**\n * @description handles direction change to delay\n * @param newDirection\n */\n const handleSlipChange = (newDirection: 'add' | 'subtract') => {\n if (newDirection === 'add') {\n // add time\n if (duration < 0) {\n submitChange(duration * -1);\n }\n } else if (newDirection === 'subtract') {\n // subtract time\n if (duration > 0) {\n submitChange(duration * -1);\n }\n }\n };\n\n const checkedOption = value.startsWith('-') ? 'subtract' : 'add';\n\n return (\n <div className={style.delayInput}>\n <Input\n ref={inputRef}\n data-testid='delay-input'\n className={style.inputField}\n placeholder='-'\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={(event) => validateAndSubmit(event.target.value)}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={9}\n />\n <BlockRadio\n onValueChange={handleSlipChange}\n value={checkedOption}\n items={[\n { value: 'add', label: 'Add time' },\n { value: 'subtract', label: 'Subtract time' },\n ]}\n />\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { IoCheckmarkDone, IoClose, IoReorderTwo } from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { OntimeDelay } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport DelayInput from '../../../common/components/input/delay-input/DelayInput';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './RundownDelay.module.scss';\n\ninterface RundownDelayProps {\n data: OntimeDelay;\n hasCursor: boolean;\n}\n\nexport default function RundownDelay({ data, hasCursor }: RundownDelayProps) {\n const { applyDelay, deleteEntry } = useEntryActions();\n const handleRef = useRef<null | HTMLSpanElement>(null);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n isDragging,\n transform,\n transition,\n } = useSortable({\n id: data.id,\n data: {\n type: 'delay',\n },\n animateLayoutChanges: () => false,\n });\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n useEffect(() => {\n if (hasCursor) {\n handleRef?.current?.focus();\n }\n }, [hasCursor]);\n\n const applyDelayHandler = () => {\n applyDelay(data.id);\n };\n\n const cancelDelayHandler = () => {\n deleteEntry([data.id]);\n };\n\n return (\n <div\n className={cx([style.delay, hasCursor ? style.hasCursor : null])}\n ref={setNodeRef}\n style={dragStyle}\n data-testid='rundown-delay'\n >\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n <DelayInput eventId={data.id} duration={data.duration} />\n <Button onClick={applyDelayHandler} variant='ghosted-white'>\n <IoCheckmarkDone /> Make permanent\n </Button>\n <Button onClick={cancelDelayHandler} variant='ghosted-white'>\n <IoClose />\n Cancel\n </Button>\n </div>\n );\n}\n","import { create } from 'zustand';\n\ninterface EventIdSwappingStore {\n selectedEventId: string | null;\n setSelectedEventId: (newEventId: string | null) => void;\n clearSelectedEventId: () => void;\n}\n\nexport const useEventIdSwapping = create<EventIdSwappingStore>((set) => ({\n selectedEventId: null,\n setSelectedEventId: (newEventId) => set(() => ({ selectedEventId: newEventId })),\n clearSelectedEventId: () => set(() => ({ selectedEventId: null })),\n}));\n","import { useMemo } from 'react';\nimport { IoCheckmarkCircle } from 'react-icons/io5';\nimport { isPlaybackActive, MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString } from 'ontime-utils';\n\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { usePlayback } from '../../../../common/hooks/useSocket';\nimport useReport from '../../../../common/hooks-query/useReport';\nimport { cx } from '../../../../common/utils/styleUtils';\nimport { formatDuration, useTimeUntilExpectedStart } from '../../../../common/utils/time';\n\nimport style from './RundownEventChip.module.scss';\n\ninterface RundownEventChipProps {\n id: string;\n timeStart: number;\n delay: number;\n dayOffset: number;\n isPast: boolean;\n isLoaded: boolean;\n className: string;\n totalGap: number;\n duration: number;\n isLinkedToLoaded: boolean;\n}\n\nexport default function RundownEventChip({\n timeStart,\n delay,\n dayOffset,\n isPast,\n isLoaded,\n className,\n totalGap,\n id,\n duration,\n isLinkedToLoaded,\n}: RundownEventChipProps) {\n const { playback } = usePlayback();\n\n if (isLoaded) {\n return null;\n }\n\n const playbackActive = isPlaybackActive(playback);\n\n if (!playbackActive || isPast) {\n return <EventReport className={className} id={id} duration={duration} />;\n }\n\n if (playbackActive) {\n // we extracted the component to avoid unnecessary calculations and re-renders\n return (\n <Tooltip text='Expected time until start' render={<span />} className={className}>\n <EventUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n </Tooltip>\n );\n }\n\n return null;\n}\n\ninterface EventUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\n\nfunction EventUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: EventUntilProps) {\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n const isDue = timeUntil < MILLIS_PER_SECOND;\n\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return <div className={cx([style.chip, isDue && style.due])}>{timeUntilString}</div>;\n}\n\ninterface EventReportProps {\n className: string;\n id: string;\n duration: number;\n}\n\nfunction EventReport(props: EventReportProps) {\n const { className, id, duration } = props;\n const { data } = useReport();\n const currentReport = data[id];\n\n const [value, overUnderStyle, tooltip] = useMemo(() => {\n if (!currentReport) {\n return [null, 'none', ''];\n }\n\n const { startedAt, endedAt } = currentReport;\n if (!startedAt || !endedAt) {\n return [null, 'none', ''];\n }\n\n const actualDuration = endedAt - startedAt;\n const difference = actualDuration - duration;\n const absDifference = Math.abs(difference);\n\n if (absDifference < MILLIS_PER_SECOND) {\n return ['ontime', 'under', 'Event finished on time'];\n }\n\n const isOver = difference > 0;\n\n const fullTimeValue = millisToString(absDifference);\n\n const tooltip = `Event ran ${isOver ? 'over' : 'under'} time by ${fullTimeValue}`;\n\n const value = `${isOver ? '+' : '-'}${formatDuration(absDifference, absDifference > 2 * MILLIS_PER_MINUTE)}`;\n return [value, isOver ? 'over' : 'under', tooltip];\n }, [currentReport, duration]);\n\n if (!value) {\n return null;\n }\n\n return (\n <Tooltip text={tooltip} render={<span />} className={cx([style.chip, style[overUnderStyle], className])}>\n {value === 'ontime' ? <IoCheckmarkCircle size='1.1rem' /> : value}\n </Tooltip>\n );\n}\n","import { memo, MouseEvent } from 'react';\nimport { IoPause, IoPlay, IoReload, IoRemoveCircle, IoRemoveCircleOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { setEventPlayback } from '../../../../common/hooks/useSocket';\n\nimport style from '../RundownEvent.module.scss';\n\ninterface RundownEventPlaybackProps {\n eventId: string;\n skip: boolean;\n isPlaying: boolean;\n isPaused: boolean;\n loaded: boolean;\n disablePlayback: boolean;\n}\n\nexport default memo(RundownEventPlayback);\nfunction RundownEventPlayback({\n eventId,\n skip,\n isPlaying,\n isPaused,\n loaded,\n disablePlayback,\n}: RundownEventPlaybackProps) {\n const { updateEntry } = useEntryActions();\n\n const toggleSkip = (event: MouseEvent) => {\n event.stopPropagation();\n updateEntry({ id: eventId, skip: !skip });\n };\n\n const actionHandler = (event: MouseEvent) => {\n event.stopPropagation();\n // is playing -> pause\n // is paused -> continue\n // otherwise -> start\n if (isPlaying) {\n setEventPlayback.pause();\n } else if (isPaused) {\n setEventPlayback.start();\n } else {\n setEventPlayback.startEvent(eventId);\n }\n };\n\n const load = (event: MouseEvent) => {\n event.stopPropagation();\n setEventPlayback.loadEvent(eventId);\n };\n\n const playButtonStyles: { tooltip: string; backgroundColor: string | undefined } = (() => {\n if (isPaused) {\n return {\n tooltip: 'Continue event',\n backgroundColor: '#339E4E',\n };\n }\n\n if (isPlaying) {\n return {\n tooltip: 'Pause event',\n backgroundColor: '#c05621',\n };\n }\n return {\n tooltip: 'Start event',\n backgroundColor: undefined,\n };\n })();\n\n return (\n <div className={style.playbackActions}>\n <Tooltip\n text='Skip event'\n render={<IconButton variant='subtle-white' />}\n onClick={toggleSkip}\n tabIndex={-1}\n disabled={loaded}\n style={{\n background: skip ? '#9A0000' : undefined,\n }}\n aria-label='Skip event'\n >\n {skip ? <IoRemoveCircle /> : <IoRemoveCircleOutline />}\n </Tooltip>\n\n <Tooltip\n text='Load event'\n render={<IconButton variant='subtle-white' />}\n onClick={load}\n tabIndex={-1}\n disabled={disablePlayback}\n aria-label='Load event'\n >\n <IoReload className={style.flip} />\n </Tooltip>\n\n <Tooltip\n text={playButtonStyles.tooltip}\n render={<IconButton variant='subtle-white' />}\n onClick={actionHandler}\n tabIndex={-1}\n disabled={disablePlayback}\n style={{\n backgroundColor: playButtonStyles.backgroundColor,\n }}\n aria-label={isPlaying ? 'Pause event' : 'Start event'}\n >\n {!isPlaying ? <IoPlay /> : <IoPause />}\n </Tooltip>\n </div>\n );\n}\n","import { useTimer } from '../../../../common/hooks/useSocket';\nimport { getProgress } from '../../../../common/utils/getProgress';\n\nimport style from './RundownEventProgressBar.module.scss';\n\nexport default function RundownEventProgressBar() {\n const timer = useTimer();\n\n const progress = getProgress(timer.current, timer.duration);\n\n return <div className={style.progressBar} style={{ width: `${progress}%` }} />;\n}\n","import { memo, useEffect, useState } from 'react';\nimport {\n IoArrowDown,\n IoArrowUp,\n IoBan,\n IoFlash,\n IoPlay,\n IoPlayForward,\n IoPlaySkipForward,\n IoTime,\n} from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { EndAction, Playback, TimerType, TimeStrategy } from 'ontime-types';\n\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { cx } from '../../../common/utils/styleUtils';\nimport TitleEditor from '../common/TitleEditor';\nimport TimeInputFlow from '../time-input-flow/TimeInputFlow';\n\nimport RundownEventChip from './composite/RundownEventChip';\nimport EventBlockPlayback from './composite/RundownEventPlayback';\nimport EventBlockProgressBar from './composite/RundownEventProgressBar';\n\nimport style from './RundownEvent.module.scss';\n\ninterface RundownEventInnerProps {\n eventId: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n countToEnd: boolean;\n eventIndex: number;\n endAction: EndAction;\n timerType: TimerType;\n title: string;\n note: string;\n delay: number;\n isNext: boolean;\n skip: boolean;\n loaded: boolean;\n playback?: Playback;\n isRolling: boolean;\n dayOffset: number;\n isPast: boolean;\n totalGap: number;\n isLinkedToLoaded: boolean;\n hasTriggers: boolean;\n}\n\nexport default memo(RundownEventInner);\nfunction RundownEventInner({\n eventId,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n countToEnd,\n endAction,\n timerType,\n title,\n note,\n delay,\n isNext,\n skip = false,\n loaded,\n playback,\n isRolling,\n dayOffset,\n isPast,\n totalGap,\n isLinkedToLoaded,\n hasTriggers,\n}: RundownEventInnerProps) {\n const [renderInner, setRenderInner] = useState(false);\n\n useEffect(() => {\n setRenderInner(true);\n }, []);\n\n const eventIsPlaying = playback === Playback.Play;\n const eventIsPaused = playback === Playback.Pause;\n\n const playBtnStyles = { _hover: {} };\n if (!skip && eventIsPlaying) {\n playBtnStyles._hover = { bg: '#c05621' }; // $ontime-paused\n } else if (!skip && !eventIsPlaying) {\n playBtnStyles._hover = {};\n }\n\n return !renderInner ? null : (\n <>\n <div className={style.eventTimers}>\n <TimeInputFlow\n eventId={eventId}\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n delay={delay}\n timeStrategy={timeStrategy}\n linkStart={linkStart}\n countToEnd={countToEnd}\n />\n </div>\n <div className={style.titleSection}>\n <TitleEditor title={title} entryId={eventId} placeholder='Event title' className={style.eventTitle} />\n {isNext && <span className={style.nextTag}>UP NEXT</span>}\n </div>\n <EventBlockPlayback\n eventId={eventId}\n skip={skip}\n isPlaying={eventIsPlaying}\n isPaused={eventIsPaused}\n loaded={loaded}\n disablePlayback={skip || isRolling}\n />\n {!skip && (\n <RundownEventChip\n className={style.chipSection}\n id={eventId}\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isPast={isPast}\n isLoaded={loaded}\n totalGap={totalGap}\n duration={duration}\n />\n )}\n <div className={style.statusElements} id='entry-status' data-timertype={timerType}>\n <span className={style.eventNote}>{note}</span>\n <div className={loaded ? style.progressBg : `${style.progressBg} ${style.hidden}`}>\n {loaded && <EventBlockProgressBar />}\n </div>\n <div className={style.eventStatus} tabIndex={-1}>\n <Tooltip text={`Time type: ${timerType}`} render={<span />}>\n <TimerIcon type={timerType} className={style.statusIcon} />\n </Tooltip>\n <Tooltip text={`End action: ${endAction}`} render={<span />}>\n <EndActionIcon action={endAction} className={style.statusIcon} />\n </Tooltip>\n <Tooltip text={`${countToEnd ? 'Count to End' : 'Count duration'}`} render={<span />}>\n <LuArrowDownToLine className={`${style.statusIcon} ${countToEnd ? style.active : style.disabled}`} />\n </Tooltip>\n <Tooltip text='Event has Triggers' render={<span />}>\n <IoFlash className={`${style.statusIcon} ${hasTriggers ? style.active : style.disabled}`} />\n </Tooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction EndActionIcon(props: { action: EndAction; className: string }) {\n const { action, className } = props;\n const maybeActiveClasses = cx([action !== EndAction.None && style.active, className]);\n\n if (action === EndAction.LoadNext) {\n return <IoPlaySkipForward className={maybeActiveClasses} />;\n }\n if (action === EndAction.PlayNext) {\n return <IoPlayForward className={maybeActiveClasses} />;\n }\n return <IoPlay className={className} />;\n}\n\nfunction TimerIcon(props: { type: TimerType; className: string }) {\n const { type, className } = props;\n if (type === TimerType.CountUp) {\n return <IoArrowUp className={className} />;\n }\n if (type === TimerType.Clock) {\n return <IoTime className={className} />;\n }\n if (type === TimerType.None) {\n return <IoBan className={className} />;\n }\n return <IoArrowDown className={className} />;\n}\n","import { millisToString, removeTrailingZero } from 'ontime-utils';\n\nimport { formatDuration } from '../../../common/utils/time';\n\nexport function formatDelay(timeStart: number, delay: number): string | undefined {\n if (!delay) return;\n\n const delayedStart = Math.max(0, timeStart + delay);\n\n const timeTag = removeTrailingZero(millisToString(delayedStart));\n return `New start ${timeTag}`;\n}\nexport function formatGap(gap: number, isNextDay: boolean) {\n if (gap === 0) {\n if (isNextDay) {\n // We show a next day warning even if there is no gap\n return '(next day)';\n }\n return;\n }\n\n const gapString = formatDuration(Math.abs(gap), false);\n return `${gap < 0 ? 'Overlap' : 'Gap'} ${gapString}${isNextDay ? ' (next day)' : ''}`;\n}\n","import { formatDelay, formatGap } from './rundownEvent.utils';\n\nimport style from './RundownIndicators.module.scss';\n\ninterface RundownIndicatorProps {\n timeStart: number;\n isNextDay: boolean;\n delay: number;\n gap: number;\n}\n\nexport default function RundownIndicators({ timeStart, delay, gap, isNextDay }: RundownIndicatorProps) {\n const hasGap = formatGap(gap, isNextDay);\n const hasDelay = formatDelay(timeStart, delay);\n\n return (\n <div className={style.indicators}>\n {hasDelay && <div className={style.delay}>{hasDelay}</div>}\n {hasGap && <div className={style.gap}>{hasGap}</div>}\n </div>\n );\n}\n","import { MouseEvent, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport {\n IoAdd,\n IoDuplicateOutline,\n IoFolder,\n IoLink,\n IoReorderTwo,\n IoSwapVertical,\n IoTrash,\n IoUnlink,\n} from 'react-icons/io5';\nimport { TbFlagFilled } from 'react-icons/tb';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EndAction, EntryId, Playback, TimerType, TimeStrategy } from 'ontime-types';\nimport { isPlaybackActive } from 'ontime-utils';\n\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { useEventIdSwapping } from '../useEventIdSwapping';\nimport { getSelectionMode, useEventSelection } from '../useEventSelection';\n\nimport RundownEventInner from './RundownEventInner';\nimport RundownIndicators from './RundownIndicators';\n\nimport style from './RundownEvent.module.scss';\n\ninterface RundownEventProps {\n eventId: EntryId;\n cue: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n flag: boolean;\n countToEnd: boolean;\n eventIndex: number;\n endAction: EndAction;\n timerType: TimerType;\n title: string;\n note: string;\n delay: number;\n colour: string;\n isPast: boolean;\n isNext: boolean;\n skip: boolean;\n parent: EntryId | null;\n loaded: boolean;\n hasCursor: boolean;\n playback?: Playback;\n isRolling: boolean;\n gap: number;\n isNextDay: boolean;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n createCloneEvent: () => void;\n hasTriggers: boolean;\n}\n\nexport default function RundownEvent({\n eventId,\n cue,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n flag,\n countToEnd,\n eventIndex,\n endAction,\n timerType,\n title,\n note,\n delay,\n colour,\n isPast,\n isNext,\n skip = false,\n parent,\n loaded,\n hasCursor,\n playback,\n isRolling,\n gap,\n isNextDay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n hasTriggers,\n createCloneEvent,\n}: RundownEventProps) {\n const { selectedEventId, setSelectedEventId, clearSelectedEventId } = useEventIdSwapping();\n const { updateEntry, batchUpdateEvents, deleteEntry, groupEntries, swapEvents } = useEntryActions();\n\n const { selectedEvents, unselect, setSelectedEvents, clearSelectedEvents } = useEventSelection();\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>(\n selectedEvents.size > 1\n ? [\n {\n type: 'item',\n label: 'Link to previous',\n icon: IoLink,\n onClick: () => {\n batchUpdateEvents({ linkStart: true }, Array.from(selectedEvents));\n },\n },\n {\n type: 'item',\n label: 'Unlink from previous',\n icon: IoUnlink,\n onClick: () => {\n batchUpdateEvents({ linkStart: false }, Array.from(selectedEvents));\n },\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Group',\n icon: IoFolder,\n onClick: () => {\n groupEntries(Array.from(selectedEvents));\n clearSelectedEvents();\n },\n disabled: parent !== null,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => {\n clearSelectedEvents();\n deleteEntry(Array.from(selectedEvents));\n },\n },\n ]\n : [\n {\n type: 'item',\n label: flag ? 'Remove flag' : 'Add flag',\n icon: TbFlagFilled,\n onClick: () => {\n updateEntry({ id: eventId, flag: !flag });\n },\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Add to swap',\n icon: IoAdd,\n onClick: () => setSelectedEventId(eventId),\n },\n {\n type: 'item',\n label: `Swap this event with ${selectedEventId ?? ''}`,\n icon: IoSwapVertical,\n onClick: () => {\n if (!selectedEventId) return;\n swapEvents(selectedEventId, eventId);\n clearSelectedEventId();\n },\n disabled: selectedEventId == null || selectedEventId === eventId,\n },\n {\n type: 'item',\n label: 'Clone',\n icon: IoDuplicateOutline,\n onClick: createCloneEvent,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => {\n deleteEntry([eventId]);\n unselect(eventId);\n },\n },\n ],\n );\n\n const {\n isDragging,\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n } = useSortable({\n id: eventId,\n data: {\n type: 'event',\n parent,\n },\n animateLayoutChanges: () => false,\n });\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const binderColours = colour && getAccessibleColour(colour);\n\n // move focus to element if necessary\n useEffect(() => {\n if (!hasCursor || handleRef?.current == null) {\n return;\n }\n\n const elementInFocus = document.activeElement;\n // we know the group is the grandparent of our binder\n const blockElement = handleRef.current.closest('#event-group');\n\n // we only move focus if the block doesnt already contain focus\n if (blockElement && !blockElement.contains(elementInFocus)) {\n handleRef.current.focus();\n }\n }, [hasCursor]);\n\n useLayoutEffect(() => {\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n }\n },\n {\n root: null,\n threshold: 1,\n },\n );\n\n const handleRefCurrent = handleRef.current;\n if (handleRefCurrent) {\n observer.observe(handleRefCurrent);\n }\n\n return () => {\n if (handleRefCurrent) {\n observer.unobserve(handleRefCurrent);\n }\n };\n }, [handleRef]);\n\n const isSelected = selectedEvents.has(eventId);\n const blockClasses = cx([\n style.rundownEvent,\n skip ? style.skip : null,\n isPast ? style.past : null,\n loaded ? style.loaded : null,\n playback ? style[playback] : null,\n isSelected ? style.selected : null,\n hasCursor ? style.hasCursor : null,\n ]);\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n const index = eventIndex - 1;\n const editMode = getSelectionMode(event);\n setSelectedEvents({ id: eventId, index, selectMode: editMode });\n };\n\n const isPlaying = playback ? isPlaybackActive(playback) : false;\n\n return (\n <div\n className={blockClasses}\n ref={setNodeRef}\n style={dragStyle}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n data-testid='rundown-event'\n {...(isPlaying ? { 'data-running': true } : {})}\n >\n <RundownIndicators timeStart={timeStart} delay={delay} gap={gap} isNextDay={isNextDay} />\n\n <div className={style.binder} style={{ ...binderColours }} tabIndex={-1}>\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n <span className={style.cue}>{cue}</span>\n </div>\n\n {isVisible && (\n <RundownEventInner\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n linkStart={linkStart}\n countToEnd={countToEnd}\n timeStrategy={timeStrategy}\n eventId={eventId}\n eventIndex={eventIndex}\n endAction={endAction}\n timerType={timerType}\n title={title}\n note={note}\n delay={delay}\n isNext={isNext}\n skip={skip}\n loaded={loaded}\n playback={playback}\n isRolling={isRolling}\n dayOffset={dayOffset}\n isPast={isPast}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n hasTriggers={hasTriggers}\n />\n )}\n </div>\n );\n}\n","import { MouseEvent, useCallback, useRef } from 'react';\nimport { IoReorderTwo, IoTrash } from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EntryId } from 'ontime-types';\n\nimport Input from '../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput';\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownMilestone.module.scss';\n\ninterface RundownMilestoneProps {\n colour: string;\n cue: string;\n entryId: EntryId;\n hasCursor: boolean;\n title: string;\n}\n\nexport default function RundownMilestone({ colour, cue, entryId, hasCursor, title }: RundownMilestoneProps) {\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const { updateEntry, deleteEntry } = useEntryActions();\n const { selectedEvents, setSingleEntrySelection } = useEventSelection();\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>([\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => deleteEntry([entryId]),\n },\n ]);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n isDragging,\n transform,\n transition,\n } = useSortable({\n id: entryId,\n data: {\n type: 'milestone',\n },\n animateLayoutChanges: () => false,\n });\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n setSingleEntrySelection({ id: entryId });\n };\n\n const handleUpdate = (field: 'cue' | 'title', value: string) => {\n updateEntry({ id: entryId, [field]: value });\n };\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const binderColours = colour && getAccessibleColour(colour);\n\n return (\n <div\n className={cx([style.milestone, hasCursor ? style.hasCursor : null])}\n ref={setNodeRef}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n style={dragStyle}\n data-testid='rundown-milestone'\n >\n <div className={style.binder} style={{ ...binderColours }}>\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n </div>\n <MilestoneTextInput field='cue' initialValue={cue} placeholder='Cue' submitHandler={handleUpdate} />\n <MilestoneTextInput field='title' initialValue={title} placeholder='Title' submitHandler={handleUpdate} />\n </div>\n );\n}\n\ninterface MilestoneTextInputProps {\n field: 'cue' | 'title';\n initialValue: string;\n placeholder?: string;\n submitHandler: (field: 'cue' | 'title', value: string) => void;\n}\n\nfunction MilestoneTextInput({ field, initialValue, placeholder, submitHandler }: MilestoneTextInputProps) {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n return (\n <Input\n id={field}\n ref={ref}\n fluid\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import {\n isOntimeDelay,\n isOntimeEvent,\n isOntimeMilestone,\n OntimeEntry,\n OntimeEvent,\n Playback,\n SupportedEntry,\n} from 'ontime-types';\n\nimport { useEntryActions } from '../../common/hooks/useEntryAction';\nimport useMemoisedFn from '../../common/hooks/useMemoisedFn';\nimport { cloneEvent } from '../../common/utils/clone';\n\nimport RundownDelay from './rundown-delay/RundownDelay';\nimport RundownEvent from './rundown-event/RundownEvent';\nimport RundownMilestone from './rundown-milestone/RundownMilestone';\n\ninterface RundownEntryProps {\n type: SupportedEntry;\n isPast: boolean;\n data: OntimeEntry;\n loaded: boolean;\n eventIndex: number;\n hasCursor: boolean;\n isNext: boolean;\n isNextDay: boolean;\n playback?: Playback; // we only care about this if this event is playing\n isRolling: boolean; // we need to know even if not related to this event\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\n\nexport default function RundownEntry({\n isPast,\n data,\n loaded,\n hasCursor,\n isNext,\n playback,\n isRolling,\n eventIndex,\n isNextDay,\n totalGap,\n isLinkedToLoaded,\n}: RundownEntryProps) {\n const { addEntry } = useEntryActions();\n\n const createCloneEvent = useMemoisedFn(() => {\n const newEvent = cloneEvent(data as OntimeEvent);\n addEntry(newEvent, { after: data.id });\n });\n\n if (isOntimeEvent(data)) {\n return (\n <RundownEvent\n eventId={data.id}\n eventIndex={eventIndex}\n cue={data.cue}\n timeStart={data.timeStart}\n timeEnd={data.timeEnd}\n duration={data.duration}\n timeStrategy={data.timeStrategy}\n linkStart={data.linkStart}\n flag={data.flag}\n countToEnd={data.countToEnd}\n endAction={data.endAction}\n timerType={data.timerType}\n title={data.title}\n note={data.note}\n delay={data.delay}\n colour={data.colour}\n isPast={isPast}\n isNext={isNext}\n skip={data.skip}\n parent={data.parent}\n loaded={loaded}\n hasCursor={hasCursor}\n playback={playback}\n isRolling={isRolling}\n gap={data.gap}\n isNextDay={isNextDay}\n dayOffset={data.dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n createCloneEvent={createCloneEvent}\n hasTriggers={data.triggers.length > 0}\n />\n );\n } else if (isOntimeDelay(data)) {\n return <RundownDelay data={data} hasCursor={hasCursor} />;\n } else if (isOntimeMilestone(data)) {\n return (\n <RundownMilestone\n colour={data.colour}\n cue={data.cue}\n entryId={data.id}\n hasCursor={hasCursor}\n title={data.title}\n />\n );\n }\n return null;\n}\n"],"names":["useMemoisedFn","fn","fnRef","useRef","useMemo","memoizedFn","args","BlockRadio","items","onValueChange","elementProps","jsx","BaseRadioGroup","value","style","item","Radio.Root","Radio.Indicator","DelayInput","props","eventId","duration","updateEntry","useEntryActions","setValue","useState","inputRef","ignoreChangeRef","useEffect","millisToString","validateAndSubmit","newValue","isNegative","newMillis","parseUserTime","submitChange","handleFocus","_a","onKeyDownHandler","event","_b","handleSlipChange","newDirection","checkedOption","jsxs","Input","RundownDelay","data","hasCursor","applyDelay","deleteEntry","handleRef","dragAttributes","dragListeners","setNodeRef","isDragging","transform","transition","useSortable","dragStyle","CSS","applyDelayHandler","cancelDelayHandler","cx","IoReorderTwo","Button","IoCheckmarkDone","IoClose","useEventIdSwapping","create","set","newEventId","RundownEventChip","timeStart","delay","dayOffset","isPast","isLoaded","className","totalGap","id","isLinkedToLoaded","playback","usePlayback","playbackActive","isPlaybackActive","EventReport","Tooltip","EventUntil","timeUntil","useTimeUntilExpectedStart","isDue","MILLIS_PER_SECOND","timeUntilString","formatDuration","MILLIS_PER_MINUTE","useReport","currentReport","overUnderStyle","tooltip","startedAt","endedAt","difference","absDifference","isOver","fullTimeValue","IoCheckmarkCircle","memo","RundownEventPlayback","skip","isPlaying","isPaused","loaded","disablePlayback","toggleSkip","actionHandler","setEventPlayback","load","playButtonStyles","IconButton","IoRemoveCircle","IoRemoveCircleOutline","IoReload","IoPause","IoPlay","RundownEventProgressBar","timer","useTimer","progress","getProgress","RundownEventInner","timeEnd","timeStrategy","linkStart","countToEnd","endAction","timerType","title","note","isNext","isRolling","hasTriggers","renderInner","setRenderInner","eventIsPlaying","Playback","eventIsPaused","Fragment","TimeInputFlow","TitleEditor","EventBlockPlayback","EventBlockProgressBar","TimerIcon","EndActionIcon","LuArrowDownToLine","IoFlash","action","maybeActiveClasses","EndAction","IoPlaySkipForward","IoPlayForward","type","TimerType","IoArrowUp","IoTime","IoBan","IoArrowDown","formatDelay","delayedStart","removeTrailingZero","formatGap","gap","isNextDay","gapString","RundownIndicators","hasGap","hasDelay","RundownEvent","cue","flag","eventIndex","colour","parent","createCloneEvent","selectedEventId","setSelectedEventId","clearSelectedEventId","batchUpdateEvents","groupEntries","swapEvents","selectedEvents","unselect","setSelectedEvents","clearSelectedEvents","useEventSelection","isVisible","setIsVisible","onContextMenu","useContextMenu","IoLink","IoUnlink","IoFolder","IoTrash","TbFlagFilled","IoAdd","IoSwapVertical","IoDuplicateOutline","binderColours","getAccessibleColour","elementInFocus","blockElement","useLayoutEffect","observer","entry","handleRefCurrent","isSelected","blockClasses","handleFocusClick","index","editMode","getSelectionMode","RundownMilestone","entryId","setSingleEntrySelection","handleUpdate","field","MilestoneTextInput","initialValue","placeholder","submitHandler","ref","submitCallback","useCallback","onChange","onBlur","onKeyDown","useReactiveTextInput","RundownEntry","addEntry","newEvent","cloneEvent","isOntimeEvent","isOntimeDelay","isOntimeMilestone"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RundownEntry-D61IqkXb.js","sources":["../../src/common/hooks/useMemoisedFn.ts","../../src/common/components/input/delay-input/BlockRadio.tsx","../../src/common/components/input/delay-input/DelayInput.tsx","../../src/features/rundown/rundown-delay/RundownDelay.tsx","../../src/features/rundown/useEventIdSwapping.ts","../../src/features/rundown/rundown-event/composite/RundownEventChip.tsx","../../src/features/rundown/rundown-event/composite/RundownEventPlayback.tsx","../../src/features/rundown/rundown-event/composite/RundownEventProgressBar.tsx","../../src/features/rundown/rundown-event/RundownEventInner.tsx","../../src/features/rundown/rundown-event/rundownEvent.utils.ts","../../src/features/rundown/rundown-event/RundownIndicators.tsx","../../src/features/rundown/rundown-event/RundownEvent.tsx","../../src/features/rundown/rundown-milestone/RundownMilestone.tsx","../../src/features/rundown/RundownEntry.tsx"],"sourcesContent":["/**\n * Shamelessly from https://ahooks.js.org/hooks/use-memoized-fn/\n * Interesting technique discussed by Dan Abramov\n * https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n */\n\nimport { useMemo, useRef } from 'react';\n\nimport { isDev } from '../../externals';\n\ntype noop = (this: any, ...args: any[]) => any;\n\ntype PickFunction<T extends noop> = (this: ThisParameterType<T>, ...args: Parameters<T>) => ReturnType<T>;\n\nconst isFunction = (value: unknown): value is (...args: any) => any => typeof value === 'function';\n\nexport default function useMemoisedFn<T extends noop>(fn: T) {\n if (isDev) {\n if (!isFunction(fn)) {\n console.error(`useMemoisedFn expected function as parameter, got ${typeof fn}`);\n }\n }\n\n const fnRef = useRef<T>(fn);\n\n // why not write `fnRef.current = fn`?\n // https://github.com/alibaba/hooks/issues/728\n fnRef.current = useMemo(() => fn, [fn]);\n\n const memoizedFn = useRef<PickFunction<T>>(undefined);\n if (!memoizedFn.current) {\n memoizedFn.current = function (this, ...args) {\n return fnRef.current.apply(this, args);\n };\n }\n\n return memoizedFn.current as T;\n}\n","import { Radio } from '@base-ui-components/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui-components/react/radio-group';\n\nimport style from './BlockRadio.module.scss';\n\ninterface BlockRadioProps<T extends string | number | boolean> extends Omit<BaseRadioGroup.Props, 'onValueChange'> {\n items: {\n value: T;\n label: string;\n }[];\n onValueChange?: (value: T) => void;\n}\n\nexport default function BlockRadio<T extends string | number | boolean>({\n items,\n onValueChange,\n ...elementProps\n}: BlockRadioProps<T>) {\n return (\n <BaseRadioGroup\n onValueChange={(value) => onValueChange?.(value as T)}\n className={style.radioGroup}\n {...elementProps}\n >\n {items.map((item) => (\n <label className={style.item} key={item.value.toString()}>\n <Radio.Root value={item.value.toString()} className={style.radio}>\n <Radio.Indicator className={style.indicator} />\n </Radio.Root>\n {item.label}\n </label>\n ))}\n </BaseRadioGroup>\n );\n}\n","import { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { useEntryActions } from '../../../hooks/useEntryAction';\nimport Input from '../input/Input';\n\nimport BlockRadio from './BlockRadio';\n\nimport style from './DelayInput.module.scss';\n\ninterface DelayInputProps {\n eventId: string;\n duration: number;\n}\n\nexport default function DelayInput(props: DelayInputProps) {\n const { eventId, duration } = props;\n const { updateEntry } = useEntryActions();\n\n const [value, setValue] = useState<string>('');\n const inputRef = useRef<HTMLInputElement | null>(null);\n // avoid wrong submit on cancel\n const ignoreChangeRef = useRef(false);\n\n // set internal value on duration change\n useEffect(() => {\n if (typeof duration === 'undefined') {\n return;\n }\n setValue(millisToString(duration));\n }, [duration]);\n\n /**\n * @description Prepare delay value for update\n * @param {string} newValue string to be parsed\n */\n const validateAndSubmit = (newValue: string) => {\n if (ignoreChangeRef.current) {\n ignoreChangeRef.current = false;\n return;\n }\n\n const isNegative = newValue.startsWith('-');\n let newMillis = parseUserTime(newValue);\n\n if (isNegative) {\n newMillis = newMillis * -1;\n }\n\n if (newMillis === duration) {\n return;\n }\n\n submitChange(newMillis);\n setValue(millisToString(newMillis));\n };\n\n const submitChange = (value: number) => {\n updateEntry({\n id: eventId,\n duration: value,\n });\n };\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = () => inputRef.current?.select();\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n validateAndSubmit((event.target as HTMLInputElement).value);\n } else if (event.key === 'Tab') {\n validateAndSubmit((event.target as HTMLInputElement).value);\n } else if (event.key === 'Escape') {\n ignoreChangeRef.current = true;\n setValue(millisToString(duration));\n inputRef.current?.blur();\n }\n };\n\n /**\n * @description handles direction change to delay\n * @param newDirection\n */\n const handleSlipChange = (newDirection: 'add' | 'subtract') => {\n if (newDirection === 'add') {\n // add time\n if (duration < 0) {\n submitChange(duration * -1);\n }\n } else if (newDirection === 'subtract') {\n // subtract time\n if (duration > 0) {\n submitChange(duration * -1);\n }\n }\n };\n\n const checkedOption = value.startsWith('-') ? 'subtract' : 'add';\n\n return (\n <div className={style.delayInput}>\n <Input\n ref={inputRef}\n data-testid='delay-input'\n className={style.inputField}\n placeholder='-'\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={(event) => validateAndSubmit(event.target.value)}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={9}\n />\n <BlockRadio\n onValueChange={handleSlipChange}\n value={checkedOption}\n items={[\n { value: 'add', label: 'Add time' },\n { value: 'subtract', label: 'Subtract time' },\n ]}\n />\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { IoCheckmarkDone, IoClose, IoReorderTwo } from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { OntimeDelay } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport DelayInput from '../../../common/components/input/delay-input/DelayInput';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './RundownDelay.module.scss';\n\ninterface RundownDelayProps {\n data: OntimeDelay;\n hasCursor: boolean;\n}\n\nexport default function RundownDelay({ data, hasCursor }: RundownDelayProps) {\n const { applyDelay, deleteEntry } = useEntryActions();\n const handleRef = useRef<null | HTMLSpanElement>(null);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n isDragging,\n transform,\n transition,\n } = useSortable({\n id: data.id,\n data: {\n type: 'delay',\n },\n animateLayoutChanges: () => false,\n });\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n useEffect(() => {\n if (hasCursor) {\n handleRef?.current?.focus();\n }\n }, [hasCursor]);\n\n const applyDelayHandler = () => {\n applyDelay(data.id);\n };\n\n const cancelDelayHandler = () => {\n deleteEntry([data.id]);\n };\n\n return (\n <div\n className={cx([style.delay, hasCursor ? style.hasCursor : null])}\n ref={setNodeRef}\n style={dragStyle}\n data-testid='rundown-delay'\n >\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n <DelayInput eventId={data.id} duration={data.duration} />\n <Button onClick={applyDelayHandler} variant='ghosted-white'>\n <IoCheckmarkDone /> Make permanent\n </Button>\n <Button onClick={cancelDelayHandler} variant='ghosted-white'>\n <IoClose />\n Cancel\n </Button>\n </div>\n );\n}\n","import { create } from 'zustand';\n\ninterface EventIdSwappingStore {\n selectedEventId: string | null;\n setSelectedEventId: (newEventId: string | null) => void;\n clearSelectedEventId: () => void;\n}\n\nexport const useEventIdSwapping = create<EventIdSwappingStore>((set) => ({\n selectedEventId: null,\n setSelectedEventId: (newEventId) => set(() => ({ selectedEventId: newEventId })),\n clearSelectedEventId: () => set(() => ({ selectedEventId: null })),\n}));\n","import { useMemo } from 'react';\nimport { IoCheckmarkCircle } from 'react-icons/io5';\nimport { isPlaybackActive, MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString } from 'ontime-utils';\n\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { usePlayback } from '../../../../common/hooks/useSocket';\nimport useReport from '../../../../common/hooks-query/useReport';\nimport { cx } from '../../../../common/utils/styleUtils';\nimport { formatDuration, useTimeUntilExpectedStart } from '../../../../common/utils/time';\n\nimport style from './RundownEventChip.module.scss';\n\ninterface RundownEventChipProps {\n id: string;\n timeStart: number;\n delay: number;\n dayOffset: number;\n isPast: boolean;\n isLoaded: boolean;\n className: string;\n totalGap: number;\n duration: number;\n isLinkedToLoaded: boolean;\n}\n\nexport default function RundownEventChip({\n timeStart,\n delay,\n dayOffset,\n isPast,\n isLoaded,\n className,\n totalGap,\n id,\n duration,\n isLinkedToLoaded,\n}: RundownEventChipProps) {\n const { playback } = usePlayback();\n\n if (isLoaded) {\n return null;\n }\n\n const playbackActive = isPlaybackActive(playback);\n\n if (!playbackActive || isPast) {\n return <EventReport className={className} id={id} duration={duration} />;\n }\n\n if (playbackActive) {\n // we extracted the component to avoid unnecessary calculations and re-renders\n return (\n <Tooltip text='Expected time until start' render={<span />} className={className}>\n <EventUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n </Tooltip>\n );\n }\n\n return null;\n}\n\ninterface EventUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\n\nfunction EventUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: EventUntilProps) {\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n const isDue = timeUntil < MILLIS_PER_SECOND;\n\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return <div className={cx([style.chip, isDue && style.due])}>{timeUntilString}</div>;\n}\n\ninterface EventReportProps {\n className: string;\n id: string;\n duration: number;\n}\n\nfunction EventReport(props: EventReportProps) {\n const { className, id, duration } = props;\n const { data } = useReport();\n const currentReport = data[id];\n\n const [value, overUnderStyle, tooltip] = useMemo(() => {\n if (!currentReport) {\n return [null, 'none', ''];\n }\n\n const { startedAt, endedAt } = currentReport;\n if (!startedAt || !endedAt) {\n return [null, 'none', ''];\n }\n\n const actualDuration = endedAt - startedAt;\n const difference = actualDuration - duration;\n const absDifference = Math.abs(difference);\n\n if (absDifference < MILLIS_PER_SECOND) {\n return ['ontime', 'under', 'Event finished on time'];\n }\n\n const isOver = difference > 0;\n\n const fullTimeValue = millisToString(absDifference);\n\n const tooltip = `Event ran ${isOver ? 'over' : 'under'} time by ${fullTimeValue}`;\n\n const value = `${isOver ? '+' : '-'}${formatDuration(absDifference, absDifference > 2 * MILLIS_PER_MINUTE)}`;\n return [value, isOver ? 'over' : 'under', tooltip];\n }, [currentReport, duration]);\n\n if (!value) {\n return null;\n }\n\n return (\n <Tooltip text={tooltip} render={<span />} className={cx([style.chip, style[overUnderStyle], className])}>\n {value === 'ontime' ? <IoCheckmarkCircle size='1.1rem' /> : value}\n </Tooltip>\n );\n}\n","import { memo, MouseEvent } from 'react';\nimport { IoPause, IoPlay, IoReload, IoRemoveCircle, IoRemoveCircleOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { setEventPlayback } from '../../../../common/hooks/useSocket';\n\nimport style from '../RundownEvent.module.scss';\n\ninterface RundownEventPlaybackProps {\n eventId: string;\n skip: boolean;\n isPlaying: boolean;\n isPaused: boolean;\n loaded: boolean;\n disablePlayback: boolean;\n}\n\nexport default memo(RundownEventPlayback);\nfunction RundownEventPlayback({\n eventId,\n skip,\n isPlaying,\n isPaused,\n loaded,\n disablePlayback,\n}: RundownEventPlaybackProps) {\n const { updateEntry } = useEntryActions();\n\n const toggleSkip = (event: MouseEvent) => {\n event.stopPropagation();\n updateEntry({ id: eventId, skip: !skip });\n };\n\n const actionHandler = (event: MouseEvent) => {\n event.stopPropagation();\n // is playing -> pause\n // is paused -> continue\n // otherwise -> start\n if (isPlaying) {\n setEventPlayback.pause();\n } else if (isPaused) {\n setEventPlayback.start();\n } else {\n setEventPlayback.startEvent(eventId);\n }\n };\n\n const load = (event: MouseEvent) => {\n event.stopPropagation();\n setEventPlayback.loadEvent(eventId);\n };\n\n const playButtonStyles: { tooltip: string; backgroundColor: string | undefined } = (() => {\n if (isPaused) {\n return {\n tooltip: 'Continue event',\n backgroundColor: '#339E4E',\n };\n }\n\n if (isPlaying) {\n return {\n tooltip: 'Pause event',\n backgroundColor: '#c05621',\n };\n }\n return {\n tooltip: 'Start event',\n backgroundColor: undefined,\n };\n })();\n\n return (\n <div className={style.playbackActions}>\n <Tooltip\n text='Skip event'\n render={<IconButton variant='subtle-white' />}\n onClick={toggleSkip}\n tabIndex={-1}\n disabled={loaded}\n style={{\n background: skip ? '#9A0000' : undefined,\n }}\n aria-label='Skip event'\n >\n {skip ? <IoRemoveCircle /> : <IoRemoveCircleOutline />}\n </Tooltip>\n\n <Tooltip\n text='Load event'\n render={<IconButton variant='subtle-white' />}\n onClick={load}\n tabIndex={-1}\n disabled={disablePlayback}\n aria-label='Load event'\n >\n <IoReload className={style.flip} />\n </Tooltip>\n\n <Tooltip\n text={playButtonStyles.tooltip}\n render={<IconButton variant='subtle-white' />}\n onClick={actionHandler}\n tabIndex={-1}\n disabled={disablePlayback}\n style={{\n backgroundColor: playButtonStyles.backgroundColor,\n }}\n aria-label={isPlaying ? 'Pause event' : 'Start event'}\n >\n {!isPlaying ? <IoPlay /> : <IoPause />}\n </Tooltip>\n </div>\n );\n}\n","import { useTimer } from '../../../../common/hooks/useSocket';\nimport { getProgress } from '../../../../common/utils/getProgress';\n\nimport style from './RundownEventProgressBar.module.scss';\n\nexport default function RundownEventProgressBar() {\n const timer = useTimer();\n\n const progress = getProgress(timer.current, timer.duration);\n\n return <div className={style.progressBar} style={{ width: `${progress}%` }} />;\n}\n","import { memo, useEffect, useState } from 'react';\nimport {\n IoArrowDown,\n IoArrowUp,\n IoBan,\n IoFlash,\n IoPlay,\n IoPlayForward,\n IoPlaySkipForward,\n IoTime,\n} from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { EndAction, Playback, TimerType, TimeStrategy } from 'ontime-types';\n\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { cx } from '../../../common/utils/styleUtils';\nimport TitleEditor from '../common/TitleEditor';\nimport TimeInputFlow from '../time-input-flow/TimeInputFlow';\n\nimport RundownEventChip from './composite/RundownEventChip';\nimport EventBlockPlayback from './composite/RundownEventPlayback';\nimport EventBlockProgressBar from './composite/RundownEventProgressBar';\n\nimport style from './RundownEvent.module.scss';\n\ninterface RundownEventInnerProps {\n eventId: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n countToEnd: boolean;\n eventIndex: number;\n endAction: EndAction;\n timerType: TimerType;\n title: string;\n note: string;\n delay: number;\n isNext: boolean;\n skip: boolean;\n loaded: boolean;\n playback?: Playback;\n isRolling: boolean;\n dayOffset: number;\n isPast: boolean;\n totalGap: number;\n isLinkedToLoaded: boolean;\n hasTriggers: boolean;\n}\n\nexport default memo(RundownEventInner);\nfunction RundownEventInner({\n eventId,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n countToEnd,\n endAction,\n timerType,\n title,\n note,\n delay,\n isNext,\n skip = false,\n loaded,\n playback,\n isRolling,\n dayOffset,\n isPast,\n totalGap,\n isLinkedToLoaded,\n hasTriggers,\n}: RundownEventInnerProps) {\n const [renderInner, setRenderInner] = useState(false);\n\n useEffect(() => {\n setRenderInner(true);\n }, []);\n\n const eventIsPlaying = playback === Playback.Play;\n const eventIsPaused = playback === Playback.Pause;\n\n const playBtnStyles = { _hover: {} };\n if (!skip && eventIsPlaying) {\n playBtnStyles._hover = { bg: '#c05621' }; // $ontime-paused\n } else if (!skip && !eventIsPlaying) {\n playBtnStyles._hover = {};\n }\n\n return !renderInner ? null : (\n <>\n <div className={style.eventTimers}>\n <TimeInputFlow\n eventId={eventId}\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n delay={delay}\n timeStrategy={timeStrategy}\n linkStart={linkStart}\n countToEnd={countToEnd}\n />\n </div>\n <div className={style.titleSection}>\n <TitleEditor title={title} entryId={eventId} placeholder='Event title' className={style.eventTitle} />\n {isNext && <span className={style.nextTag}>UP NEXT</span>}\n </div>\n <EventBlockPlayback\n eventId={eventId}\n skip={skip}\n isPlaying={eventIsPlaying}\n isPaused={eventIsPaused}\n loaded={loaded}\n disablePlayback={skip || isRolling}\n />\n {!skip && (\n <RundownEventChip\n className={style.chipSection}\n id={eventId}\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isPast={isPast}\n isLoaded={loaded}\n totalGap={totalGap}\n duration={duration}\n />\n )}\n <div className={style.statusElements} id='entry-status' data-timertype={timerType}>\n <span className={style.eventNote}>{note}</span>\n <div className={loaded ? style.progressBg : `${style.progressBg} ${style.hidden}`}>\n {loaded && <EventBlockProgressBar />}\n </div>\n <div className={style.eventStatus} tabIndex={-1}>\n <Tooltip text={`Time type: ${timerType}`} render={<span />}>\n <TimerIcon type={timerType} className={style.statusIcon} />\n </Tooltip>\n <Tooltip text={`End action: ${endAction}`} render={<span />}>\n <EndActionIcon action={endAction} className={style.statusIcon} />\n </Tooltip>\n <Tooltip text={`${countToEnd ? 'Count to End' : 'Count duration'}`} render={<span />}>\n <LuArrowDownToLine className={`${style.statusIcon} ${countToEnd ? style.active : style.disabled}`} />\n </Tooltip>\n <Tooltip text='Event has Triggers' render={<span />}>\n <IoFlash className={`${style.statusIcon} ${hasTriggers ? style.active : style.disabled}`} />\n </Tooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction EndActionIcon(props: { action: EndAction; className: string }) {\n const { action, className } = props;\n const maybeActiveClasses = cx([action !== EndAction.None && style.active, className]);\n\n if (action === EndAction.LoadNext) {\n return <IoPlaySkipForward className={maybeActiveClasses} />;\n }\n if (action === EndAction.PlayNext) {\n return <IoPlayForward className={maybeActiveClasses} />;\n }\n return <IoPlay className={className} />;\n}\n\nfunction TimerIcon(props: { type: TimerType; className: string }) {\n const { type, className } = props;\n if (type === TimerType.CountUp) {\n return <IoArrowUp className={className} />;\n }\n if (type === TimerType.Clock) {\n return <IoTime className={className} />;\n }\n if (type === TimerType.None) {\n return <IoBan className={className} />;\n }\n return <IoArrowDown className={className} />;\n}\n","import { millisToString, removeTrailingZero } from 'ontime-utils';\n\nimport { formatDuration } from '../../../common/utils/time';\n\nexport function formatDelay(timeStart: number, delay: number): string | undefined {\n if (!delay) return;\n\n const delayedStart = Math.max(0, timeStart + delay);\n\n const timeTag = removeTrailingZero(millisToString(delayedStart));\n return `New start ${timeTag}`;\n}\nexport function formatGap(gap: number, isNextDay: boolean) {\n if (gap === 0) {\n if (isNextDay) {\n // We show a next day warning even if there is no gap\n return '(next day)';\n }\n return;\n }\n\n const gapString = formatDuration(Math.abs(gap), false);\n return `${gap < 0 ? 'Overlap' : 'Gap'} ${gapString}${isNextDay ? ' (next day)' : ''}`;\n}\n","import { formatDelay, formatGap } from './rundownEvent.utils';\n\nimport style from './RundownIndicators.module.scss';\n\ninterface RundownIndicatorProps {\n timeStart: number;\n isNextDay: boolean;\n delay: number;\n gap: number;\n}\n\nexport default function RundownIndicators({ timeStart, delay, gap, isNextDay }: RundownIndicatorProps) {\n const hasGap = formatGap(gap, isNextDay);\n const hasDelay = formatDelay(timeStart, delay);\n\n return (\n <div className={style.indicators}>\n {hasDelay && <div className={style.delay}>{hasDelay}</div>}\n {hasGap && <div className={style.gap}>{hasGap}</div>}\n </div>\n );\n}\n","import { MouseEvent, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport {\n IoAdd,\n IoDuplicateOutline,\n IoFolder,\n IoLink,\n IoReorderTwo,\n IoSwapVertical,\n IoTrash,\n IoUnlink,\n} from 'react-icons/io5';\nimport { TbFlagFilled } from 'react-icons/tb';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EndAction, EntryId, Playback, TimerType, TimeStrategy } from 'ontime-types';\nimport { isPlaybackActive } from 'ontime-utils';\n\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { useEventIdSwapping } from '../useEventIdSwapping';\nimport { getSelectionMode, useEventSelection } from '../useEventSelection';\n\nimport RundownEventInner from './RundownEventInner';\nimport RundownIndicators from './RundownIndicators';\n\nimport style from './RundownEvent.module.scss';\n\ninterface RundownEventProps {\n eventId: EntryId;\n cue: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n flag: boolean;\n countToEnd: boolean;\n eventIndex: number;\n endAction: EndAction;\n timerType: TimerType;\n title: string;\n note: string;\n delay: number;\n colour: string;\n isPast: boolean;\n isNext: boolean;\n skip: boolean;\n parent: EntryId | null;\n loaded: boolean;\n hasCursor: boolean;\n playback?: Playback;\n isRolling: boolean;\n gap: number;\n isNextDay: boolean;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n createCloneEvent: () => void;\n hasTriggers: boolean;\n}\n\nexport default function RundownEvent({\n eventId,\n cue,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n flag,\n countToEnd,\n eventIndex,\n endAction,\n timerType,\n title,\n note,\n delay,\n colour,\n isPast,\n isNext,\n skip = false,\n parent,\n loaded,\n hasCursor,\n playback,\n isRolling,\n gap,\n isNextDay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n hasTriggers,\n createCloneEvent,\n}: RundownEventProps) {\n const { selectedEventId, setSelectedEventId, clearSelectedEventId } = useEventIdSwapping();\n const { updateEntry, batchUpdateEvents, deleteEntry, groupEntries, swapEvents } = useEntryActions();\n\n const { selectedEvents, unselect, setSelectedEvents, clearSelectedEvents } = useEventSelection();\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>(\n selectedEvents.size > 1\n ? [\n {\n type: 'item',\n label: 'Link to previous',\n icon: IoLink,\n onClick: () => {\n batchUpdateEvents({ linkStart: true }, Array.from(selectedEvents));\n },\n },\n {\n type: 'item',\n label: 'Unlink from previous',\n icon: IoUnlink,\n onClick: () => {\n batchUpdateEvents({ linkStart: false }, Array.from(selectedEvents));\n },\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Group',\n icon: IoFolder,\n onClick: () => {\n groupEntries(Array.from(selectedEvents));\n clearSelectedEvents();\n },\n disabled: parent !== null,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => {\n clearSelectedEvents();\n deleteEntry(Array.from(selectedEvents));\n },\n },\n ]\n : [\n {\n type: 'item',\n label: flag ? 'Remove flag' : 'Add flag',\n icon: TbFlagFilled,\n onClick: () => {\n updateEntry({ id: eventId, flag: !flag });\n },\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Add to swap',\n icon: IoAdd,\n onClick: () => setSelectedEventId(eventId),\n },\n {\n type: 'item',\n label: `Swap this event with ${selectedEventId ?? ''}`,\n icon: IoSwapVertical,\n onClick: () => {\n if (!selectedEventId) return;\n swapEvents(selectedEventId, eventId);\n clearSelectedEventId();\n },\n disabled: selectedEventId == null || selectedEventId === eventId,\n },\n {\n type: 'item',\n label: 'Clone',\n icon: IoDuplicateOutline,\n onClick: createCloneEvent,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => {\n deleteEntry([eventId]);\n unselect(eventId);\n },\n },\n ],\n );\n\n const {\n isDragging,\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n } = useSortable({\n id: eventId,\n data: {\n type: 'event',\n parent,\n },\n animateLayoutChanges: () => false,\n });\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const binderColours = colour && getAccessibleColour(colour);\n\n // move focus to element if necessary\n useEffect(() => {\n if (!hasCursor || handleRef?.current == null) {\n return;\n }\n\n const elementInFocus = document.activeElement;\n // we know the group is the grandparent of our binder\n const blockElement = handleRef.current.closest('#event-group');\n\n // we only move focus if the block doesnt already contain focus\n if (blockElement && !blockElement.contains(elementInFocus)) {\n handleRef.current.focus();\n }\n }, [hasCursor]);\n\n useLayoutEffect(() => {\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n }\n },\n {\n root: null,\n threshold: 1,\n },\n );\n\n const handleRefCurrent = handleRef.current;\n if (handleRefCurrent) {\n observer.observe(handleRefCurrent);\n }\n\n return () => {\n if (handleRefCurrent) {\n observer.unobserve(handleRefCurrent);\n }\n };\n }, [handleRef]);\n\n const isSelected = selectedEvents.has(eventId);\n const blockClasses = cx([\n style.rundownEvent,\n skip ? style.skip : null,\n isPast ? style.past : null,\n loaded ? style.loaded : null,\n playback ? style[playback] : null,\n isSelected ? style.selected : null,\n hasCursor ? style.hasCursor : null,\n ]);\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n const index = eventIndex - 1;\n const editMode = getSelectionMode(event);\n setSelectedEvents({ id: eventId, index, selectMode: editMode });\n };\n\n const isPlaying = playback ? isPlaybackActive(playback) : false;\n\n return (\n <div\n className={blockClasses}\n ref={setNodeRef}\n style={dragStyle}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n data-testid='rundown-event'\n {...(isPlaying ? { 'data-running': true } : {})}\n >\n <RundownIndicators timeStart={timeStart} delay={delay} gap={gap} isNextDay={isNextDay} />\n\n <div className={style.binder} style={{ ...binderColours }} tabIndex={-1}>\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n <span className={style.cue}>{cue}</span>\n </div>\n\n {isVisible && (\n <RundownEventInner\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n linkStart={linkStart}\n countToEnd={countToEnd}\n timeStrategy={timeStrategy}\n eventId={eventId}\n eventIndex={eventIndex}\n endAction={endAction}\n timerType={timerType}\n title={title}\n note={note}\n delay={delay}\n isNext={isNext}\n skip={skip}\n loaded={loaded}\n playback={playback}\n isRolling={isRolling}\n dayOffset={dayOffset}\n isPast={isPast}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n hasTriggers={hasTriggers}\n />\n )}\n </div>\n );\n}\n","import { MouseEvent, useCallback, useRef } from 'react';\nimport { IoReorderTwo, IoTrash } from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EntryId } from 'ontime-types';\n\nimport Input from '../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput';\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownMilestone.module.scss';\n\ninterface RundownMilestoneProps {\n colour: string;\n cue: string;\n entryId: EntryId;\n hasCursor: boolean;\n title: string;\n}\n\nexport default function RundownMilestone({ colour, cue, entryId, hasCursor, title }: RundownMilestoneProps) {\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const { updateEntry, deleteEntry } = useEntryActions();\n const { selectedEvents, setSingleEntrySelection } = useEventSelection();\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>([\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => deleteEntry([entryId]),\n },\n ]);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n isDragging,\n transform,\n transition,\n } = useSortable({\n id: entryId,\n data: {\n type: 'milestone',\n },\n animateLayoutChanges: () => false,\n });\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n setSingleEntrySelection({ id: entryId });\n };\n\n const handleUpdate = (field: 'cue' | 'title', value: string) => {\n updateEntry({ id: entryId, [field]: value });\n };\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const binderColours = colour && getAccessibleColour(colour);\n\n return (\n <div\n className={cx([style.milestone, hasCursor ? style.hasCursor : null])}\n ref={setNodeRef}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n style={dragStyle}\n data-testid='rundown-milestone'\n >\n <div className={style.binder} style={{ ...binderColours }}>\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n </div>\n <MilestoneTextInput field='cue' initialValue={cue} placeholder='Cue' submitHandler={handleUpdate} />\n <MilestoneTextInput field='title' initialValue={title} placeholder='Title' submitHandler={handleUpdate} />\n </div>\n );\n}\n\ninterface MilestoneTextInputProps {\n field: 'cue' | 'title';\n initialValue: string;\n placeholder?: string;\n submitHandler: (field: 'cue' | 'title', value: string) => void;\n}\n\nfunction MilestoneTextInput({ field, initialValue, placeholder, submitHandler }: MilestoneTextInputProps) {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n return (\n <Input\n id={field}\n ref={ref}\n fluid\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import {\n isOntimeDelay,\n isOntimeEvent,\n isOntimeMilestone,\n OntimeEntry,\n OntimeEvent,\n Playback,\n SupportedEntry,\n} from 'ontime-types';\n\nimport { useEntryActions } from '../../common/hooks/useEntryAction';\nimport useMemoisedFn from '../../common/hooks/useMemoisedFn';\nimport { cloneEvent } from '../../common/utils/clone';\n\nimport RundownDelay from './rundown-delay/RundownDelay';\nimport RundownEvent from './rundown-event/RundownEvent';\nimport RundownMilestone from './rundown-milestone/RundownMilestone';\n\ninterface RundownEntryProps {\n type: SupportedEntry;\n isPast: boolean;\n data: OntimeEntry;\n loaded: boolean;\n eventIndex: number;\n hasCursor: boolean;\n isNext: boolean;\n isNextDay: boolean;\n playback?: Playback; // we only care about this if this event is playing\n isRolling: boolean; // we need to know even if not related to this event\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\n\nexport default function RundownEntry({\n isPast,\n data,\n loaded,\n hasCursor,\n isNext,\n playback,\n isRolling,\n eventIndex,\n isNextDay,\n totalGap,\n isLinkedToLoaded,\n}: RundownEntryProps) {\n const { addEntry } = useEntryActions();\n\n const createCloneEvent = useMemoisedFn(() => {\n const newEvent = cloneEvent(data as OntimeEvent);\n addEntry(newEvent, { after: data.id });\n });\n\n if (isOntimeEvent(data)) {\n return (\n <RundownEvent\n eventId={data.id}\n eventIndex={eventIndex}\n cue={data.cue}\n timeStart={data.timeStart}\n timeEnd={data.timeEnd}\n duration={data.duration}\n timeStrategy={data.timeStrategy}\n linkStart={data.linkStart}\n flag={data.flag}\n countToEnd={data.countToEnd}\n endAction={data.endAction}\n timerType={data.timerType}\n title={data.title}\n note={data.note}\n delay={data.delay}\n colour={data.colour}\n isPast={isPast}\n isNext={isNext}\n skip={data.skip}\n parent={data.parent}\n loaded={loaded}\n hasCursor={hasCursor}\n playback={playback}\n isRolling={isRolling}\n gap={data.gap}\n isNextDay={isNextDay}\n dayOffset={data.dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n createCloneEvent={createCloneEvent}\n hasTriggers={data.triggers.length > 0}\n />\n );\n } else if (isOntimeDelay(data)) {\n return <RundownDelay data={data} hasCursor={hasCursor} />;\n } else if (isOntimeMilestone(data)) {\n return (\n <RundownMilestone\n colour={data.colour}\n cue={data.cue}\n entryId={data.id}\n hasCursor={hasCursor}\n title={data.title}\n />\n );\n }\n return null;\n}\n"],"names":["useMemoisedFn","fn","fnRef","useRef","useMemo","memoizedFn","args","BlockRadio","items","onValueChange","elementProps","jsx","BaseRadioGroup","value","style","item","Radio.Root","Radio.Indicator","DelayInput","props","eventId","duration","updateEntry","useEntryActions","setValue","useState","inputRef","ignoreChangeRef","useEffect","millisToString","validateAndSubmit","newValue","isNegative","newMillis","parseUserTime","submitChange","handleFocus","_a","onKeyDownHandler","event","_b","handleSlipChange","newDirection","checkedOption","jsxs","Input","RundownDelay","data","hasCursor","applyDelay","deleteEntry","handleRef","dragAttributes","dragListeners","setNodeRef","isDragging","transform","transition","useSortable","dragStyle","CSS","applyDelayHandler","cancelDelayHandler","cx","IoReorderTwo","Button","IoCheckmarkDone","IoClose","useEventIdSwapping","create","set","newEventId","RundownEventChip","timeStart","delay","dayOffset","isPast","isLoaded","className","totalGap","id","isLinkedToLoaded","playback","usePlayback","playbackActive","isPlaybackActive","EventReport","Tooltip","EventUntil","timeUntil","useTimeUntilExpectedStart","isDue","MILLIS_PER_SECOND","timeUntilString","formatDuration","MILLIS_PER_MINUTE","useReport","currentReport","overUnderStyle","tooltip","startedAt","endedAt","difference","absDifference","isOver","fullTimeValue","IoCheckmarkCircle","memo","RundownEventPlayback","skip","isPlaying","isPaused","loaded","disablePlayback","toggleSkip","actionHandler","setEventPlayback","load","playButtonStyles","IconButton","IoRemoveCircle","IoRemoveCircleOutline","IoReload","IoPause","IoPlay","RundownEventProgressBar","timer","useTimer","progress","getProgress","RundownEventInner","timeEnd","timeStrategy","linkStart","countToEnd","endAction","timerType","title","note","isNext","isRolling","hasTriggers","renderInner","setRenderInner","eventIsPlaying","Playback","eventIsPaused","Fragment","TimeInputFlow","TitleEditor","EventBlockPlayback","EventBlockProgressBar","TimerIcon","EndActionIcon","LuArrowDownToLine","IoFlash","action","maybeActiveClasses","EndAction","IoPlaySkipForward","IoPlayForward","type","TimerType","IoArrowUp","IoTime","IoBan","IoArrowDown","formatDelay","delayedStart","removeTrailingZero","formatGap","gap","isNextDay","gapString","RundownIndicators","hasGap","hasDelay","RundownEvent","cue","flag","eventIndex","colour","parent","createCloneEvent","selectedEventId","setSelectedEventId","clearSelectedEventId","batchUpdateEvents","groupEntries","swapEvents","selectedEvents","unselect","setSelectedEvents","clearSelectedEvents","useEventSelection","isVisible","setIsVisible","onContextMenu","useContextMenu","IoLink","IoUnlink","IoFolder","IoTrash","TbFlagFilled","IoAdd","IoSwapVertical","IoDuplicateOutline","binderColours","getAccessibleColour","elementInFocus","blockElement","useLayoutEffect","observer","entry","handleRefCurrent","isSelected","blockClasses","handleFocusClick","index","editMode","getSelectionMode","RundownMilestone","entryId","setSingleEntrySelection","handleUpdate","field","MilestoneTextInput","initialValue","placeholder","submitHandler","ref","submitCallback","useCallback","onChange","onBlur","onKeyDown","useReactiveTextInput","RundownEntry","addEntry","newEvent","cloneEvent","isOntimeEvent","isOntimeDelay","isOntimeMilestone"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._blink_44w0f_1{animation:_blink_44w0f_1 1s step-start infinite}@keyframes _blink_44w0f_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_44w0f_13{transform:rotate(45deg)}._footer_44w0f_17{border-top:1px solid rgba(255,255,255,.1);padding-top:1rem;display:flex;flex-wrap:wrap;gap:.5rem}._blink_103di_1{animation:_blink_103di_1 1s step-start infinite}@keyframes _blink_103di_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_103di_13{transform:rotate(45deg)}._entryEditor_103di_17{color:#b1b1b1;height:100%;max-height:100%;overflow-y:auto;padding:.5rem;display:flex;flex-direction:column;overflow-x:auto}._shortcutSection_103di_28{flex:1;display:grid;place-content:center;gap:1rem}._shortcuts_103di_35{font-size:calc(1rem - 3px);border-collapse:separate;border-spacing:4rem 0}._shortcuts_103di_35 tr td:nth-child(odd){text-align:left}._shortcuts_103di_35 tr td:nth-child(2n){text-align:right;white-space:nowrap}._spacer_103di_48{height:1rem}._prompt_103di_52{margin-left:4rem}._divider_103di_56{display:inline-block;text-align:center;width:1em}._kbd_103di_62{font-family:monospace;white-space:nowrap;font-size:calc(1rem - 2px);padding:.125rem .5rem;background-color:#262626;color:#f6f6f6;border-radius:2px;font-weight:400;box-shadow:0 0 3px #0006}._blink_15pki_1{animation:_blink_15pki_1 1s step-start infinite}@keyframes _blink_15pki_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_15pki_13{transform:rotate(45deg)}._entry_15pki_17,._empty_15pki_18,._error_15pki_19{padding-inline:.5rem;font-size:1rem;height:3rem;display:flex;align-items:center;justify-content:space-between}._entry_15pki_17[data-selected=true]{background-color:#2b5abc}._empty_15pki_18{color:#b1b1b1}._error_15pki_19{color:#fa5656}._data_15pki_40{display:grid;grid-template-areas:"index cue" "index title";column-gap:1rem;grid-template-rows:min-content 1fr}._data_15pki_40 ._index_15pki_46{grid-area:index;background-color:var(--color, #404040);border-radius:2px;padding-block:.25rem;width:3.5rem;align-self:center;text-align:center}._data_15pki_40 ._title_15pki_55{grid-area:title}._data_15pki_40 ._cue_15pki_58{grid-area:cue;font-size:calc(1rem - 2px);color:#b1b1b1;max-height:1em;min-height:0}._footer_15pki_66{font-size:calc(1rem - 2px);color:#b1b1b1}._em_15pki_18{color:#f6f6f6;margin-inline:.25rem}._scrollContainer_15pki_76{max-height:70vh;overflow:auto;padding-top:1rem}._blink_156wk_1{animation:_blink_156wk_1 1s step-start infinite}@keyframes _blink_156wk_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_156wk_13{transform:rotate(45deg)}._header_156wk_17{padding-inline:1rem 2rem;display:flex;align-items:center}:is([data-target=small-device]) ._header_156wk_17{padding-inline:0;overflow-x:auto}._group_156wk_28{display:flex;align-items:center;gap:2px;padding-inline:2px;background:#2d2d2d;border-radius:3px;height:2rem}._radioButton_156wk_39{box-sizing:border-box;display:flex;align-items:center;justify-content:center;height:calc(2rem - 4px);padding-inline:1em;border:1px solid transparent;border-radius:3px;color:#b1b1b1;font-size:calc(1rem - 2px);font-weight:600}._radioButton_156wk_39:focus-visible{background:transparent;outline:1px solid #578AF4}._radioButton_156wk_39:hover:not(:disabled):not(:active){background:#404040}._radioButton_156wk_39:active{background:#2d2d2d}._radioButton_156wk_39[data-pressed]{background:#2b5abc;color:#f6f6f6}._radioButton_156wk_39[data-pressed]:hover:not(:disabled):not(:active){background:#3e75e8}._apart_156wk_70{margin-left:auto}._separator_156wk_74{margin-inline:1rem}._blink_96pwt_1{animation:_blink_96pwt_1 1s step-start infinite}@keyframes _blink_96pwt_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_96pwt_13{transform:rotate(45deg)}._quickAdd_96pwt_17{display:flex;align-items:center;gap:1rem;padding-block:.5rem;background:color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._quickAdd_96pwt_17._indent_96pwt_24{padding-left:calc(2em + .5rem)}._blink_gr8nb_1{animation:_blink_gr8nb_1 1s step-start infinite}@keyframes _blink_gr8nb_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_gr8nb_13{transform:rotate(45deg)}._quickAdd_gr8nb_17{display:flex;align-items:center;gap:1rem;height:0;position:relative;z-index:100}._quickAdd_gr8nb_17:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:#578af4}._addButton_gr8nb_35{position:relative}._blink_zrdm3_1{animation:_blink_zrdm3_1 1s step-start infinite}@keyframes _blink_zrdm3_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_zrdm3_13{transform:rotate(45deg)}._titleEditor_zrdm3_17{display:block;font-size:calc(1rem + 2px);max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._noTitle_zrdm3_26 ._preview_zrdm3_26{opacity:.4}._blink_6ndm2_1{animation:_blink_6ndm2_1 1s step-start infinite}@keyframes _blink_6ndm2_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_6ndm2_13{transform:rotate(45deg)}._group_6ndm2_17{box-sizing:content-box;border:1px solid rgba(255,255,255,.07);border-radius:3px;position:relative;color:#f6f6f6;overflow:hidden;min-width:32rem;margin-block:.5rem;display:grid;grid-template-columns:2rem 1fr;grid-template-areas:"binder header";align-items:center}._group_6ndm2_17._hasCursor_6ndm2_31{outline:1px solid #FFCC78}._group_6ndm2_17._expanded_6ndm2_34{margin-block:.5rem 0;border-radius:3px 3px 0 0;border-bottom:.25rem solid color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._group_6ndm2_17 ._binder_6ndm2_39{grid-area:binder;height:100%;background-color:var(--user-bg, #303030);color:#f6f6f6;font-size:1rem;display:grid;place-content:center;position:relative;cursor:pointer}._group_6ndm2_17 ._binder_6ndm2_39:focus{outline:1px solid #578AF4;outline-offset:-1px}._group_6ndm2_17 ._header_6ndm2_54{grid-area:header;padding-inline:.5rem;background-color:#303030;display:flex;flex-direction:column;gap:.5rem}._group_6ndm2_17 ._titleRow_6ndm2_62{display:flex;align-items:center;gap:.5rem}._group_6ndm2_17 ._metaRow_6ndm2_67{display:flex;gap:3rem;margin-bottom:.25rem;white-space:nowrap}._group_6ndm2_17 ._metaEntry_6ndm2_73{width:4.5em}._group_6ndm2_17 ._metaEntry_6ndm2_73 :first-child{font-size:calc(1rem - 3px);color:#b1b1b1}._strike_6ndm2_81{text-decoration:line-through}._over_6ndm2_85{color:#f57c13}._under_6ndm2_89{color:#55b469}._drag_6ndm2_93{font-size:20px;justify-self:center;opacity:.3;cursor:grab;transition:opacity .3s}._drag_6ndm2_93:hover{opacity:1}._drag_6ndm2_93:focus{box-shadow:none;outline:none}._drag_6ndm2_93{position:absolute;margin-top:.25rem}._drag_6ndm2_93._isDragging_6ndm2_111{cursor:grabbing}._drag_6ndm2_93._notAllowed_6ndm2_114{cursor:not-allowed}._blink_1mlc9_1{animation:_blink_1mlc9_1 1s step-start infinite}@keyframes _blink_1mlc9_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1mlc9_13{transform:rotate(45deg)}._groupEnd_1mlc9_17{cursor:default;height:1rem;background-color:var(--user-bg, #303030);border-radius:0 0 3px 3px;margin-bottom:.5rem}._blink_pqnxu_1{animation:_blink_pqnxu_1 1s step-start infinite}@keyframes _blink_pqnxu_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_pqnxu_13{transform:rotate(45deg)}._empty_pqnxu_17{padding-block:1.5rem;text-align:center}._inline_pqnxu_22{display:flex;align-items:center;justify-content:center;gap:1rem}._blink_qmpnm_1{animation:_blink_qmpnm_1 1s step-start infinite}@keyframes _blink_qmpnm_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_qmpnm_13{transform:rotate(45deg)}._rundownWrapper_qmpnm_17{height:calc(100% - 1.5rem);width:100%}._rundownContainer_qmpnm_22{margin-top:1rem;overflow-y:scroll;height:100%}._list_qmpnm_28{overflow-x:clip;display:flex;flex-direction:column;padding-inline:1rem}:is([data-target=small-device]) ._list_qmpnm_28{padding-inline:0;overflow-x:auto}._empty_qmpnm_39{opacity:.3;align-self:center}._spacer_qmpnm_44{min-height:50vh}._entryWrapper_qmpnm_48{display:flex;gap:.5rem;align-items:center;background:color-mix(in srgb,transparent 90%,var(--user-bg, transparent) 10%)}._entryIndex_qmpnm_55{padding-block:.25rem;display:grid;grid-template-rows:1fr 1fr 1fr;justify-items:end;min-width:2em;color:#b1b1b1;font-size:calc(1rem - 3px);height:6.5rem}._flag_qmpnm_66{grid-row:1;color:#8bb33d;font-size:1rem}._index_qmpnm_72{grid-row:2;align-content:center}._entry_qmpnm_48{flex:1}._blink_h38r0_1{animation:_blink_h38r0_1 1s step-start infinite}@keyframes _blink_h38r0_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_h38r0_13{transform:rotate(45deg)}:root{--editor--panel__br: 8px}._rundownExport_h38r0_21{height:100%;flex:1 1 auto}._rundownExport_h38r0_21._extracted_h38r0_25 ._list_h38r0_25,._rundownExport_h38r0_21._extracted_h38r0_25 ._side_h38r0_29{flex:1;max-width:none}._rundown_h38r0_21{display:flex;max-height:100%;height:100%}._list_h38r0_25{display:flex;position:relative;border-radius:var(--editor--panel__br);height:100%;background-color:#1a1a1a;padding:1rem;height:inherit;padding-inline:0;box-shadow:#00000026 3px 0 3px;flex:1 1 0;min-width:38rem;max-width:none;width:0}._side_h38r0_29{max-height:100%;margin:.5rem 0;padding:1rem;padding-right:0;background-color:#151515;border-radius:0 8px 8px 0;flex:1 1 0;min-width:36.5rem;width:0}
|
|
Binary file
|
|
Binary file
|