@getontime/cli 4.3.0 → 4.3.1
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-CDH53Q_N.js → Backstage-D2lEbqUt.js} +2 -2
- package/client/assets/Backstage-D2lEbqUt.js.br +0 -0
- package/client/assets/Backstage-D2lEbqUt.js.gz +0 -0
- package/client/assets/{Backstage-CDH53Q_N.js.map → Backstage-D2lEbqUt.js.map} +1 -1
- package/client/assets/{Countdown-B-MuMf1C.js → Countdown-VV03STbF.js} +2 -2
- package/client/assets/Countdown-VV03STbF.js.br +0 -0
- package/client/assets/Countdown-VV03STbF.js.gz +0 -0
- package/client/assets/{Countdown-B-MuMf1C.js.map → Countdown-VV03STbF.js.map} +1 -1
- package/client/assets/{CustomTranslationModal-DiQbmcgD.js → CustomTranslationModal-D1nM9W1Z.js} +2 -2
- package/client/assets/CustomTranslationModal-D1nM9W1Z.js.br +0 -0
- package/client/assets/CustomTranslationModal-D1nM9W1Z.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-DiQbmcgD.js.map → CustomTranslationModal-D1nM9W1Z.js.map} +1 -1
- package/client/assets/{DelayIndicator-D--91EO3.js → DelayIndicator-Co5rMYw9.js} +2 -2
- package/client/assets/DelayIndicator-Co5rMYw9.js.br +0 -0
- package/client/assets/DelayIndicator-Co5rMYw9.js.gz +0 -0
- package/client/assets/{DelayIndicator-D--91EO3.js.map → DelayIndicator-Co5rMYw9.js.map} +1 -1
- package/client/assets/{EditorFeatureWrapper-DwXUAV4k.js → EditorFeatureWrapper-_t_4D7Es.js} +2 -2
- package/client/assets/EditorFeatureWrapper-_t_4D7Es.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-_t_4D7Es.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-DwXUAV4k.js.map → EditorFeatureWrapper-_t_4D7Es.js.map} +1 -1
- package/client/assets/{EditorUtils-DuKjlUkF.js → EditorUtils-C3QoonjM.js} +2 -2
- package/client/assets/EditorUtils-C3QoonjM.js.br +0 -0
- package/client/assets/EditorUtils-C3QoonjM.js.gz +0 -0
- package/client/assets/{EditorUtils-DuKjlUkF.js.map → EditorUtils-C3QoonjM.js.map} +1 -1
- package/client/assets/{Empty-CJbZxh45.js → Empty-DJMjfXnt.js} +2 -2
- package/client/assets/Empty-DJMjfXnt.js.br +2 -0
- package/client/assets/Empty-DJMjfXnt.js.gz +0 -0
- package/client/assets/{Empty-CJbZxh45.js.map → Empty-DJMjfXnt.js.map} +1 -1
- package/client/assets/{EmptyPage-Bc358YpE.js → EmptyPage-BlXZqoIr.js} +2 -2
- package/client/assets/EmptyPage-BlXZqoIr.js.br +0 -0
- package/client/assets/EmptyPage-BlXZqoIr.js.gz +0 -0
- package/client/assets/{EmptyPage-Bc358YpE.js.map → EmptyPage-BlXZqoIr.js.map} +1 -1
- package/client/assets/{FollowButton-C6Fvaqh0.js → FollowButton-Dy5n1J2c.js} +2 -2
- package/client/assets/FollowButton-Dy5n1J2c.js.br +0 -0
- package/client/assets/FollowButton-Dy5n1J2c.js.gz +0 -0
- package/client/assets/{FollowButton-C6Fvaqh0.js.map → FollowButton-Dy5n1J2c.js.map} +1 -1
- package/client/assets/{MessageControlExport-GmOrvUik.js → MessageControlExport-CWQX8mH0.js} +3 -3
- package/client/assets/MessageControlExport-CWQX8mH0.js.br +0 -0
- package/client/assets/MessageControlExport-CWQX8mH0.js.gz +0 -0
- package/client/assets/{MessageControlExport-GmOrvUik.js.map → MessageControlExport-CWQX8mH0.js.map} +1 -1
- package/client/assets/{MilestoneEditor-BA0PVIQh.js → MilestoneEditor-CxWZdQ1B.js} +2 -2
- package/client/assets/MilestoneEditor-CxWZdQ1B.js.br +0 -0
- package/client/assets/MilestoneEditor-CxWZdQ1B.js.gz +0 -0
- package/client/assets/{MilestoneEditor-BA0PVIQh.js.map → MilestoneEditor-CxWZdQ1B.js.map} +1 -1
- package/client/assets/{Modal-BKx0PDGT.js → Modal-ePA-Go14.js} +2 -2
- package/client/assets/Modal-ePA-Go14.js.br +0 -0
- package/client/assets/Modal-ePA-Go14.js.gz +0 -0
- package/client/assets/{Modal-BKx0PDGT.js.map → Modal-ePA-Go14.js.map} +1 -1
- package/client/assets/{MultiPartProgressBar-BXdLxJpy.js → MultiPartProgressBar-GQaCHX4z.js} +2 -2
- package/client/assets/MultiPartProgressBar-GQaCHX4z.js.br +0 -0
- package/client/assets/MultiPartProgressBar-GQaCHX4z.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-BXdLxJpy.js.map → MultiPartProgressBar-GQaCHX4z.js.map} +1 -1
- package/client/assets/{OperatorExport-X7-qi2jv.js → OperatorExport-CRS08UXj.js} +2 -2
- package/client/assets/OperatorExport-CRS08UXj.js.br +0 -0
- package/client/assets/OperatorExport-CRS08UXj.js.gz +0 -0
- package/client/assets/{OperatorExport-X7-qi2jv.js.map → OperatorExport-CRS08UXj.js.map} +1 -1
- package/client/assets/{OverviewWrapper-BQb2xl_N.js → OverviewWrapper-BNRb3Ub_.js} +2 -2
- package/client/assets/OverviewWrapper-BNRb3Ub_.js.br +0 -0
- package/client/assets/OverviewWrapper-BNRb3Ub_.js.gz +0 -0
- package/client/assets/{OverviewWrapper-BQb2xl_N.js.map → OverviewWrapper-BNRb3Ub_.js.map} +1 -1
- package/client/assets/{PipHost-CvtlZIn7.js → PipHost-DNfEY6RN.js} +2 -2
- package/client/assets/PipHost-DNfEY6RN.js.br +0 -0
- package/client/assets/PipHost-DNfEY6RN.js.gz +0 -0
- package/client/assets/{PipHost-CvtlZIn7.js.map → PipHost-DNfEY6RN.js.map} +1 -1
- package/client/assets/{ProjectInfo-1tw48NHZ.js → ProjectInfo-KPf-pM8y.js} +2 -2
- package/client/assets/ProjectInfo-KPf-pM8y.js.br +0 -0
- package/client/assets/ProjectInfo-KPf-pM8y.js.gz +0 -0
- package/client/assets/{ProjectInfo-1tw48NHZ.js.map → ProjectInfo-KPf-pM8y.js.map} +1 -1
- package/client/assets/{ProtectRoute-BH-QvsU0.js → ProtectRoute-DW_vXgYI.js} +2 -2
- package/client/assets/ProtectRoute-DW_vXgYI.js.br +0 -0
- package/client/assets/ProtectRoute-DW_vXgYI.js.gz +0 -0
- package/client/assets/{ProtectRoute-BH-QvsU0.js.map → ProtectRoute-DW_vXgYI.js.map} +1 -1
- package/client/assets/{ProtectedCuesheet-CYBIcg1c.js → ProtectedCuesheet-CCVDLsK-.js} +2 -2
- package/client/assets/ProtectedCuesheet-CCVDLsK-.js.br +0 -0
- package/client/assets/ProtectedCuesheet-CCVDLsK-.js.gz +0 -0
- package/client/assets/{ProtectedCuesheet-CYBIcg1c.js.map → ProtectedCuesheet-CCVDLsK-.js.map} +1 -1
- package/client/assets/{ProtectedEditor-D_A75byA.js → ProtectedEditor-Ddu9vBS8.js} +3 -3
- package/client/assets/ProtectedEditor-Ddu9vBS8.js.br +0 -0
- package/client/assets/ProtectedEditor-Ddu9vBS8.js.gz +0 -0
- package/client/assets/ProtectedEditor-Ddu9vBS8.js.map +1 -0
- package/client/assets/{RundownEntry-bkqwx57t.js → RundownEntry-CpspmKD0.js} +2 -2
- package/client/assets/RundownEntry-CpspmKD0.js.br +0 -0
- package/client/assets/RundownEntry-CpspmKD0.js.gz +0 -0
- package/client/assets/{RundownEntry-bkqwx57t.js.map → RundownEntry-CpspmKD0.js.map} +1 -1
- package/client/assets/{RundownExport-EorsanA0.js → RundownExport-DhCryTUp.js} +3 -3
- package/client/assets/RundownExport-DhCryTUp.js.br +0 -0
- package/client/assets/RundownExport-DhCryTUp.js.gz +0 -0
- package/client/assets/{RundownExport-EorsanA0.js.map → RundownExport-DhCryTUp.js.map} +1 -1
- package/client/assets/{Select-BGGVCKqU.js → Select-ASOzxGFV.js} +2 -2
- package/client/assets/Select-ASOzxGFV.js.br +0 -0
- package/client/assets/Select-ASOzxGFV.js.gz +0 -0
- package/client/assets/{Select-BGGVCKqU.js.map → Select-ASOzxGFV.js.map} +1 -1
- package/client/assets/{Studio-BjNZ4l-W.js → Studio-D7evHV2Q.js} +2 -2
- package/client/assets/Studio-D7evHV2Q.js.br +0 -0
- package/client/assets/Studio-D7evHV2Q.js.gz +0 -0
- package/client/assets/{Studio-BjNZ4l-W.js.map → Studio-D7evHV2Q.js.map} +1 -1
- package/client/assets/{StyleEditor-CpciRLYh.js → StyleEditor-DYybY9tA.js} +2 -2
- package/client/assets/StyleEditor-DYybY9tA.js.br +0 -0
- package/client/assets/StyleEditor-DYybY9tA.js.gz +0 -0
- package/client/assets/{StyleEditor-CpciRLYh.js.map → StyleEditor-DYybY9tA.js.map} +1 -1
- package/client/assets/{SuperscriptPeriod-DsPdWN_s.js → SuperscriptPeriod-NmBzJhFK.js} +2 -2
- package/client/assets/SuperscriptPeriod-NmBzJhFK.js.br +0 -0
- package/client/assets/SuperscriptPeriod-NmBzJhFK.js.gz +0 -0
- package/client/assets/{SuperscriptPeriod-DsPdWN_s.js.map → SuperscriptPeriod-NmBzJhFK.js.map} +1 -1
- package/client/assets/{SuperscriptTime-CA6S2R55.js → SuperscriptTime-CA_8XRM6.js} +2 -2
- package/client/assets/SuperscriptTime-CA_8XRM6.js.br +0 -0
- package/client/assets/SuperscriptTime-CA_8XRM6.js.gz +0 -0
- package/client/assets/{SuperscriptTime-CA6S2R55.js.map → SuperscriptTime-CA_8XRM6.js.map} +1 -1
- package/client/assets/{SwatchPicker-Cm5Eicvv.js → SwatchPicker-C8eFQKBd.js} +2 -2
- package/client/assets/SwatchPicker-C8eFQKBd.js.br +0 -0
- package/client/assets/SwatchPicker-C8eFQKBd.js.gz +0 -0
- package/client/assets/{SwatchPicker-Cm5Eicvv.js.map → SwatchPicker-C8eFQKBd.js.map} +1 -1
- package/client/assets/{TimeElements-DbclWDbU.js → TimeElements-D3dl9gAM.js} +2 -2
- package/client/assets/TimeElements-D3dl9gAM.js.br +0 -0
- package/client/assets/TimeElements-D3dl9gAM.js.gz +0 -0
- package/client/assets/{TimeElements-DbclWDbU.js.map → TimeElements-D3dl9gAM.js.map} +1 -1
- package/client/assets/{TimeInput-C8DQoFXv.js → TimeInput-DR-NCEhH.js} +2 -2
- package/client/assets/TimeInput-DR-NCEhH.js.br +0 -0
- package/client/assets/TimeInput-DR-NCEhH.js.gz +0 -0
- package/client/assets/{TimeInput-C8DQoFXv.js.map → TimeInput-DR-NCEhH.js.map} +1 -1
- package/client/assets/{TimelinePage-Cgtl1qNp.js → TimelinePage-BfTV9IdT.js} +2 -2
- package/client/assets/TimelinePage-BfTV9IdT.js.br +0 -0
- package/client/assets/TimelinePage-BfTV9IdT.js.gz +0 -0
- package/client/assets/{TimelinePage-Cgtl1qNp.js.map → TimelinePage-BfTV9IdT.js.map} +1 -1
- package/client/assets/{Timer-BbixOGdj.js → Timer-DvqDm4yX.js} +2 -2
- package/client/assets/Timer-DvqDm4yX.js.br +0 -0
- package/client/assets/Timer-DvqDm4yX.js.gz +0 -0
- package/client/assets/{Timer-BbixOGdj.js.map → Timer-DvqDm4yX.js.map} +1 -1
- package/client/assets/{TimerControlExport-Dx3SSGNG.js → TimerControlExport-CQQ2KxqK.js} +2 -2
- package/client/assets/TimerControlExport-CQQ2KxqK.js.br +0 -0
- package/client/assets/TimerControlExport-CQQ2KxqK.js.gz +0 -0
- package/client/assets/{TimerControlExport-Dx3SSGNG.js.map → TimerControlExport-CQQ2KxqK.js.map} +1 -1
- package/client/assets/{TitleCard-Xdr7xwzU.js → TitleCard-AESdy7kI.js} +2 -2
- package/client/assets/TitleCard-AESdy7kI.js.br +0 -0
- package/client/assets/TitleCard-AESdy7kI.js.gz +0 -0
- package/client/assets/{TitleCard-Xdr7xwzU.js.map → TitleCard-AESdy7kI.js.map} +1 -1
- package/client/assets/{Tooltip-B5vsLcFu.js → Tooltip-BTK4bJkV.js} +2 -2
- package/client/assets/Tooltip-BTK4bJkV.js.br +0 -0
- package/client/assets/Tooltip-BTK4bJkV.js.gz +0 -0
- package/client/assets/{Tooltip-B5vsLcFu.js.map → Tooltip-BTK4bJkV.js.map} +1 -1
- package/client/assets/ViewLogo-BZVUUIZA.js +2 -0
- package/client/assets/ViewLogo-BZVUUIZA.js.br +0 -0
- package/client/assets/ViewLogo-BZVUUIZA.js.gz +0 -0
- package/client/assets/ViewLogo-BZVUUIZA.js.map +1 -0
- package/client/assets/{ViewParamsEditor-C2-TRP6e.js → ViewParamsEditor-CBnRitZ4.js} +2 -2
- package/client/assets/ViewParamsEditor-CBnRitZ4.js.br +0 -0
- package/client/assets/ViewParamsEditor-CBnRitZ4.js.gz +0 -0
- package/client/assets/{ViewParamsEditor-C2-TRP6e.js.map → ViewParamsEditor-CBnRitZ4.js.map} +1 -1
- package/client/assets/{dateConfig-D7xim1t4.js → dateConfig-Crm-Cu2y.js} +2 -2
- package/client/assets/dateConfig-Crm-Cu2y.js.br +0 -0
- package/client/assets/dateConfig-Crm-Cu2y.js.gz +0 -0
- package/client/assets/{dateConfig-D7xim1t4.js.map → dateConfig-Crm-Cu2y.js.map} +1 -1
- package/client/assets/{editorSettings-D2f7e1a6.js → editorSettings-CRJwIW7V.js} +2 -2
- package/client/assets/editorSettings-CRJwIW7V.js.br +0 -0
- package/client/assets/editorSettings-CRJwIW7V.js.gz +0 -0
- package/client/assets/{editorSettings-D2f7e1a6.js.map → editorSettings-CRJwIW7V.js.map} +1 -1
- package/client/assets/{getProgress-cLuBFPjh.js → getProgress-fD6vhbNF.js} +2 -2
- package/client/assets/getProgress-fD6vhbNF.js.br +0 -0
- package/client/assets/getProgress-fD6vhbNF.js.gz +0 -0
- package/client/assets/{getProgress-cLuBFPjh.js.map → getProgress-fD6vhbNF.js.map} +1 -1
- package/client/assets/{index-B81u4hxi.js → index-B1K7rED_.js} +3 -3
- package/client/assets/index-B1K7rED_.js.br +0 -0
- package/client/assets/index-B1K7rED_.js.gz +0 -0
- package/client/assets/index-B1K7rED_.js.map +1 -0
- package/client/assets/{index-D6S93MXv.css → index-BAvwULMi.css} +1 -1
- package/client/assets/index-BAvwULMi.css.br +0 -0
- package/client/assets/{index-D6S93MXv.css.gz → index-BAvwULMi.css.gz} +0 -0
- package/client/assets/{offset-R98EXhWK.js → offset-FplkvYRD.js} +2 -2
- package/client/assets/offset-FplkvYRD.js.br +0 -0
- package/client/assets/offset-FplkvYRD.js.gz +0 -0
- package/client/assets/{offset-R98EXhWK.js.map → offset-FplkvYRD.js.map} +1 -1
- package/client/assets/{parseUserTime-YeFR8t3F.js → parseUserTime-0pNWLcr0.js} +2 -2
- package/client/assets/parseUserTime-0pNWLcr0.js.br +0 -0
- package/client/assets/parseUserTime-0pNWLcr0.js.gz +0 -0
- package/client/assets/{parseUserTime-YeFR8t3F.js.map → parseUserTime-0pNWLcr0.js.map} +1 -1
- package/client/assets/{playbackstate-CPQdnF-k.js → playbackstate-1HCEpVh5.js} +2 -2
- package/client/assets/playbackstate-1HCEpVh5.js.br +0 -0
- package/client/assets/playbackstate-1HCEpVh5.js.gz +0 -0
- package/client/assets/{playbackstate-CPQdnF-k.js.map → playbackstate-1HCEpVh5.js.map} +1 -1
- package/client/assets/{presentation.utils-Cl-L3pHN.js → presentation.utils-CLt2UhON.js} +2 -2
- package/client/assets/presentation.utils-CLt2UhON.js.br +0 -0
- package/client/assets/presentation.utils-CLt2UhON.js.gz +0 -0
- package/client/assets/{presentation.utils-Cl-L3pHN.js.map → presentation.utils-CLt2UhON.js.map} +1 -1
- package/client/assets/{rundownUtils-CtVGQDQn.js → rundownUtils-D1oJpMdx.js} +2 -2
- package/client/assets/rundownUtils-D1oJpMdx.js.br +0 -0
- package/client/assets/rundownUtils-D1oJpMdx.js.gz +0 -0
- package/client/assets/{rundownUtils-CtVGQDQn.js.map → rundownUtils-D1oJpMdx.js.map} +1 -1
- package/client/assets/{timer.utils-rGyI9NYa.js → timer.utils-FiqT1yNa.js} +2 -2
- package/client/assets/timer.utils-FiqT1yNa.js.br +0 -0
- package/client/assets/timer.utils-FiqT1yNa.js.gz +0 -0
- package/client/assets/{timer.utils-rGyI9NYa.js.map → timer.utils-FiqT1yNa.js.map} +1 -1
- package/client/assets/{useCustomFields-k4piRt9n.js → useCustomFields-nW-_Zyfw.js} +2 -2
- package/client/assets/useCustomFields-nW-_Zyfw.js.br +0 -0
- package/client/assets/useCustomFields-nW-_Zyfw.js.gz +0 -0
- package/client/assets/{useCustomFields-k4piRt9n.js.map → useCustomFields-nW-_Zyfw.js.map} +1 -1
- package/client/assets/{useFollowComponent-B7vvPzG2.js → useFollowComponent-4cbKEsVz.js} +2 -2
- package/client/assets/useFollowComponent-4cbKEsVz.js.br +0 -0
- package/client/assets/useFollowComponent-4cbKEsVz.js.gz +0 -0
- package/client/assets/{useFollowComponent-B7vvPzG2.js.map → useFollowComponent-4cbKEsVz.js.map} +1 -1
- package/client/assets/{useProjectData-DdgKoYzk.js → useProjectData-DP-pr73E.js} +2 -2
- package/client/assets/useProjectData-DP-pr73E.js.br +0 -0
- package/client/assets/useProjectData-DP-pr73E.js.gz +0 -0
- package/client/assets/{useProjectData-DdgKoYzk.js.map → useProjectData-DP-pr73E.js.map} +1 -1
- package/client/assets/{useReport-DSuFnUb9.js → useReport-6XA_s2Vc.js} +2 -2
- package/client/assets/useReport-6XA_s2Vc.js.br +0 -0
- package/client/assets/useReport-6XA_s2Vc.js.gz +0 -0
- package/client/assets/{useReport-DSuFnUb9.js.map → useReport-6XA_s2Vc.js.map} +1 -1
- package/client/assets/{useRundown-Bn6ZPsz0.js → useRundown-BGhL8DEI.js} +2 -2
- package/client/assets/useRundown-BGhL8DEI.js.br +0 -0
- package/client/assets/useRundown-BGhL8DEI.js.gz +0 -0
- package/client/assets/{useRundown-Bn6ZPsz0.js.map → useRundown-BGhL8DEI.js.map} +1 -1
- package/client/assets/{useWindowTitle-Bpmo_HzW.js → useWindowTitle-ahZQIheF.js} +2 -2
- package/client/assets/useWindowTitle-ahZQIheF.js.br +0 -0
- package/client/assets/useWindowTitle-ahZQIheF.js.gz +0 -0
- package/client/assets/{useWindowTitle-Bpmo_HzW.js.map → useWindowTitle-ahZQIheF.js.map} +1 -1
- package/client/assets/{validateEvent-Do8yE_DJ.js → validateEvent-jVIMKhmx.js} +2 -2
- package/client/assets/validateEvent-jVIMKhmx.js.br +0 -0
- package/client/assets/validateEvent-jVIMKhmx.js.gz +0 -0
- package/client/assets/{validateEvent-Do8yE_DJ.js.map → validateEvent-jVIMKhmx.js.map} +1 -1
- package/client/assets/{vendor-q6fv0YT2.js → vendor-DmGkEtRj.js} +2 -2
- package/client/assets/vendor-DmGkEtRj.js.br +0 -0
- package/client/assets/vendor-DmGkEtRj.js.gz +0 -0
- package/client/assets/{vendor-q6fv0YT2.js.map → vendor-DmGkEtRj.js.map} +1 -1
- package/client/assets/{viewLoader.utils-b42scp-I.js → viewLoader.utils-Bniie8Op.js} +2 -2
- package/client/assets/viewLoader.utils-Bniie8Op.js.br +0 -0
- package/client/assets/viewLoader.utils-Bniie8Op.js.gz +0 -0
- package/client/assets/{viewLoader.utils-b42scp-I.js.map → viewLoader.utils-Bniie8Op.js.map} +1 -1
- package/client/assets/{viewUtils-B8Dr4GHH.js → viewUtils-VNLYoR28.js} +2 -2
- package/client/assets/viewUtils-VNLYoR28.js.br +0 -0
- package/client/assets/viewUtils-VNLYoR28.js.gz +0 -0
- package/client/assets/{viewUtils-B8Dr4GHH.js.map → viewUtils-VNLYoR28.js.map} +1 -1
- package/client/index.html +3 -3
- package/package.json +1 -1
- package/server/index.cjs +74 -74
- package/client/assets/Backstage-CDH53Q_N.js.br +0 -0
- package/client/assets/Backstage-CDH53Q_N.js.gz +0 -0
- package/client/assets/Countdown-B-MuMf1C.js.br +0 -0
- package/client/assets/Countdown-B-MuMf1C.js.gz +0 -0
- package/client/assets/CustomTranslationModal-DiQbmcgD.js.br +0 -0
- package/client/assets/CustomTranslationModal-DiQbmcgD.js.gz +0 -0
- package/client/assets/DelayIndicator-D--91EO3.js.br +0 -0
- package/client/assets/DelayIndicator-D--91EO3.js.gz +0 -0
- package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.gz +0 -0
- package/client/assets/EditorUtils-DuKjlUkF.js.br +0 -0
- package/client/assets/EditorUtils-DuKjlUkF.js.gz +0 -0
- package/client/assets/Empty-CJbZxh45.js.br +0 -0
- package/client/assets/Empty-CJbZxh45.js.gz +0 -0
- package/client/assets/EmptyPage-Bc358YpE.js.br +0 -5
- package/client/assets/EmptyPage-Bc358YpE.js.gz +0 -0
- package/client/assets/FollowButton-C6Fvaqh0.js.br +0 -0
- package/client/assets/FollowButton-C6Fvaqh0.js.gz +0 -0
- package/client/assets/MessageControlExport-GmOrvUik.js.br +0 -0
- package/client/assets/MessageControlExport-GmOrvUik.js.gz +0 -0
- package/client/assets/MilestoneEditor-BA0PVIQh.js.br +0 -0
- package/client/assets/MilestoneEditor-BA0PVIQh.js.gz +0 -0
- package/client/assets/Modal-BKx0PDGT.js.br +0 -0
- package/client/assets/Modal-BKx0PDGT.js.gz +0 -0
- package/client/assets/MultiPartProgressBar-BXdLxJpy.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BXdLxJpy.js.gz +0 -0
- package/client/assets/OperatorExport-X7-qi2jv.js.br +0 -0
- package/client/assets/OperatorExport-X7-qi2jv.js.gz +0 -0
- package/client/assets/OverviewWrapper-BQb2xl_N.js.br +0 -0
- package/client/assets/OverviewWrapper-BQb2xl_N.js.gz +0 -0
- package/client/assets/PipHost-CvtlZIn7.js.br +0 -0
- package/client/assets/PipHost-CvtlZIn7.js.gz +0 -0
- package/client/assets/ProjectInfo-1tw48NHZ.js.br +0 -0
- package/client/assets/ProjectInfo-1tw48NHZ.js.gz +0 -0
- package/client/assets/ProtectRoute-BH-QvsU0.js.br +0 -0
- package/client/assets/ProtectRoute-BH-QvsU0.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-CYBIcg1c.js.br +0 -0
- package/client/assets/ProtectedCuesheet-CYBIcg1c.js.gz +0 -0
- package/client/assets/ProtectedEditor-D_A75byA.js.br +0 -0
- package/client/assets/ProtectedEditor-D_A75byA.js.gz +0 -0
- package/client/assets/ProtectedEditor-D_A75byA.js.map +0 -1
- package/client/assets/RundownEntry-bkqwx57t.js.br +0 -0
- package/client/assets/RundownEntry-bkqwx57t.js.gz +0 -0
- package/client/assets/RundownExport-EorsanA0.js.br +0 -0
- package/client/assets/RundownExport-EorsanA0.js.gz +0 -0
- package/client/assets/Select-BGGVCKqU.js.br +0 -0
- package/client/assets/Select-BGGVCKqU.js.gz +0 -0
- package/client/assets/Studio-BjNZ4l-W.js.br +0 -0
- package/client/assets/Studio-BjNZ4l-W.js.gz +0 -0
- package/client/assets/StyleEditor-CpciRLYh.js.br +0 -0
- package/client/assets/StyleEditor-CpciRLYh.js.gz +0 -0
- package/client/assets/SuperscriptPeriod-DsPdWN_s.js.br +0 -0
- package/client/assets/SuperscriptPeriod-DsPdWN_s.js.gz +0 -0
- package/client/assets/SuperscriptTime-CA6S2R55.js.br +0 -0
- package/client/assets/SuperscriptTime-CA6S2R55.js.gz +0 -0
- package/client/assets/SwatchPicker-Cm5Eicvv.js.br +0 -0
- package/client/assets/SwatchPicker-Cm5Eicvv.js.gz +0 -0
- package/client/assets/TimeElements-DbclWDbU.js.br +0 -0
- package/client/assets/TimeElements-DbclWDbU.js.gz +0 -0
- package/client/assets/TimeInput-C8DQoFXv.js.br +0 -0
- package/client/assets/TimeInput-C8DQoFXv.js.gz +0 -0
- package/client/assets/TimelinePage-Cgtl1qNp.js.br +0 -0
- package/client/assets/TimelinePage-Cgtl1qNp.js.gz +0 -0
- package/client/assets/Timer-BbixOGdj.js.br +0 -0
- package/client/assets/Timer-BbixOGdj.js.gz +0 -0
- package/client/assets/TimerControlExport-Dx3SSGNG.js.br +0 -0
- package/client/assets/TimerControlExport-Dx3SSGNG.js.gz +0 -0
- package/client/assets/TitleCard-Xdr7xwzU.js.br +0 -0
- package/client/assets/TitleCard-Xdr7xwzU.js.gz +0 -0
- package/client/assets/Tooltip-B5vsLcFu.js.br +0 -0
- package/client/assets/Tooltip-B5vsLcFu.js.gz +0 -0
- package/client/assets/ViewLogo-G7EosFIr.js +0 -2
- package/client/assets/ViewLogo-G7EosFIr.js.br +0 -0
- package/client/assets/ViewLogo-G7EosFIr.js.gz +0 -0
- package/client/assets/ViewLogo-G7EosFIr.js.map +0 -1
- package/client/assets/ViewParamsEditor-C2-TRP6e.js.br +0 -0
- package/client/assets/ViewParamsEditor-C2-TRP6e.js.gz +0 -0
- package/client/assets/dateConfig-D7xim1t4.js.br +0 -0
- package/client/assets/dateConfig-D7xim1t4.js.gz +0 -0
- package/client/assets/editorSettings-D2f7e1a6.js.br +0 -0
- package/client/assets/editorSettings-D2f7e1a6.js.gz +0 -0
- package/client/assets/getProgress-cLuBFPjh.js.br +0 -0
- package/client/assets/getProgress-cLuBFPjh.js.gz +0 -0
- package/client/assets/index-B81u4hxi.js.br +0 -0
- package/client/assets/index-B81u4hxi.js.gz +0 -0
- package/client/assets/index-B81u4hxi.js.map +0 -1
- package/client/assets/index-D6S93MXv.css.br +0 -0
- package/client/assets/offset-R98EXhWK.js.br +0 -0
- package/client/assets/offset-R98EXhWK.js.gz +0 -0
- package/client/assets/parseUserTime-YeFR8t3F.js.br +0 -0
- package/client/assets/parseUserTime-YeFR8t3F.js.gz +0 -0
- package/client/assets/playbackstate-CPQdnF-k.js.br +0 -0
- package/client/assets/playbackstate-CPQdnF-k.js.gz +0 -0
- package/client/assets/presentation.utils-Cl-L3pHN.js.br +0 -0
- package/client/assets/presentation.utils-Cl-L3pHN.js.gz +0 -0
- package/client/assets/rundownUtils-CtVGQDQn.js.br +0 -0
- package/client/assets/rundownUtils-CtVGQDQn.js.gz +0 -0
- package/client/assets/timer.utils-rGyI9NYa.js.br +0 -0
- package/client/assets/timer.utils-rGyI9NYa.js.gz +0 -0
- package/client/assets/useCustomFields-k4piRt9n.js.br +0 -0
- package/client/assets/useCustomFields-k4piRt9n.js.gz +0 -0
- package/client/assets/useFollowComponent-B7vvPzG2.js.br +0 -0
- package/client/assets/useFollowComponent-B7vvPzG2.js.gz +0 -0
- package/client/assets/useProjectData-DdgKoYzk.js.br +0 -0
- package/client/assets/useProjectData-DdgKoYzk.js.gz +0 -0
- package/client/assets/useReport-DSuFnUb9.js.br +0 -0
- package/client/assets/useReport-DSuFnUb9.js.gz +0 -0
- package/client/assets/useRundown-Bn6ZPsz0.js.br +0 -0
- package/client/assets/useRundown-Bn6ZPsz0.js.gz +0 -0
- package/client/assets/useWindowTitle-Bpmo_HzW.js.br +0 -0
- package/client/assets/useWindowTitle-Bpmo_HzW.js.gz +0 -0
- package/client/assets/validateEvent-Do8yE_DJ.js.br +0 -3
- package/client/assets/validateEvent-Do8yE_DJ.js.gz +0 -0
- package/client/assets/vendor-q6fv0YT2.js.br +0 -0
- package/client/assets/vendor-q6fv0YT2.js.gz +0 -0
- package/client/assets/viewLoader.utils-b42scp-I.js.br +0 -0
- package/client/assets/viewLoader.utils-b42scp-I.js.gz +0 -0
- package/client/assets/viewUtils-B8Dr4GHH.js.br +0 -0
- package/client/assets/viewUtils-B8Dr4GHH.js.gz +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e,aY as ze,aZ as Ge,a_ as qe,h as _,aG as Q,aH as X,bf as Y,ch as He,v as Ke,f as Ve,bq as We,ci as Ze,cj as Qe,bQ as Xe,bM as le,bN as Ye,aN as Je,bS as et,ck as tt,y as st,bR as nt,br as ot,av as rt,bP as it,cl as at,am as lt,bl as ct,cm as ut,ah as Z,aF as dt,T as pt,K as mt,ar as ft}from"./vendor-q6fv0YT2.js";import{m as A,ah as ce,e as N,B as ne,n as _t,bg as ue,k as J,M as de,bf as bt,ak as q,bT as M,K as ht,b2 as oe,b6 as yt,h as re,T as H,bU as vt,aC as pe}from"./index-B81u4hxi.js";import{i as gt,s as xt,k as jt}from"./useRundown-Bn6ZPsz0.js";import{u as D}from"./dateConfig-D7xim1t4.js";import{p as Et}from"./parseUserTime-YeFR8t3F.js";import{T as kt,u as me,a as fe,g as St}from"./RundownExport-EorsanA0.js";import{E as K}from"./validateEvent-Do8yE_DJ.js";import{T as E}from"./Tooltip-B5vsLcFu.js";import{a as It,u as Ct}from"./MilestoneEditor-BA0PVIQh.js";import{u as Nt}from"./useReport-DSuFnUb9.js";import{i as _e}from"./playbackstate-CPQdnF-k.js";import{g as wt}from"./getProgress-cLuBFPjh.js";import"./editorSettings-D2f7e1a6.js";import"./rundownUtils-CtVGQDQn.js";import"./EditorUtils-DuKjlUkF.js";import"./ProtectRoute-BH-QvsU0.js";import"./Modal-BKx0PDGT.js";import"./SwatchPicker-Cm5Eicvv.js";import"./Empty-CJbZxh45.js";import"./useFollowComponent-B7vvPzG2.js";import"./offset-R98EXhWK.js";import"./TimeInput-C8DQoFXv.js";import"./useCustomFields-k4piRt9n.js";import"./Select-BGGVCKqU.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="28290648-811f-44d4-bd37-80b15f8e88a4",s._sentryDebugIdIdentifier="sentry-dbid-28290648-811f-44d4-bd37-80b15f8e88a4")}catch{}})();const Tt="_radioGroup_sxz6b_17",Rt="_item_sxz6b_23",$t="_radio_sxz6b_17",At="_indicator_sxz6b_55",P={radioGroup:Tt,item:Rt,radio:$t,indicator:At};function Dt({items:s,onValueChange:t,...n}){return e.jsx(ze,{onValueChange:o=>t==null?void 0:t(o),className:P.radioGroup,...n,children:s.map(o=>e.jsxs("label",{className:P.item,children:[e.jsx(Ge,{value:o.value.toString(),className:P.radio,children:e.jsx(qe,{className:P.indicator})}),o.label]},o.value.toString()))})}const Mt="_delayInput_ksn92_17",Pt="_inputField_ksn92_23",ie={delayInput:Mt,inputField:Pt};function Lt(s){const{eventId:t,duration:n}=s,{updateEntry:o}=D(),[l,i]=_.useState(""),c=_.useRef(null),u=_.useRef(!1);_.useEffect(()=>{typeof n>"u"||i(A(n))},[n]);const d=r=>{if(u.current){u.current=!1;return}const y=r.startsWith("-");let b=Et(r);y&&(b=b*-1),b!==n&&(p(b),i(A(b)))},p=r=>{o({id:t,duration:r})},m=()=>{var r;return(r=c.current)==null?void 0:r.select()},f=r=>{var y,b;r.key==="Enter"?((y=c.current)==null||y.blur(),d(r.target.value)):r.key==="Tab"?d(r.target.value):r.key==="Escape"&&(u.current=!0,i(A(n)),(b=c.current)==null||b.blur())},v=r=>{r==="add"?n<0&&p(n*-1):r==="subtract"&&n>0&&p(n*-1)},h=l.startsWith("-")?"subtract":"add";return e.jsxs("div",{className:ie.delayInput,children:[e.jsx(ce,{ref:c,"data-testid":"delay-input",className:ie.inputField,placeholder:"-",onFocus:m,onChange:r=>i(r.target.value),onBlur:r=>d(r.target.value),onKeyDown:f,value:l,maxLength:9}),e.jsx(Dt,{onValueChange:v,value:h,items:[{value:"add",label:"Add time"},{value:"subtract",label:"Subtract time"}]})]})}const Bt="_delay_tel5v_17",Ft="_hasCursor_tel5v_34",Ut="_drag_tel5v_38",V={delay:Bt,hasCursor:Ft,drag:Ut};function Ot({data:s,hasCursor:t}){const{applyDelay:n,deleteEntry:o}=D(),l=_.useRef(null),{attributes:i,listeners:c,setNodeRef:u,isDragging:d,transform:p,transition:m}=Q({id:s.id,data:{type:"delay"},animateLayoutChanges:()=>!1}),f={zIndex:d?2:"inherit",transform:X.Translate.toString(p),transition:m};_.useEffect(()=>{var r;t&&((r=l==null?void 0:l.current)==null||r.focus())},[t]);const v=()=>{n(s.id)},h=()=>{o([s.id])};return e.jsxs("div",{className:N([V.delay,t?V.hasCursor:null]),ref:u,style:f,"data-testid":"rundown-delay",children:[e.jsx("span",{className:V.drag,ref:l,...i,...c,children:e.jsx(Y,{})}),e.jsx(Lt,{eventId:s.id,duration:s.duration}),e.jsxs(ne,{onClick:v,variant:"ghosted-white",children:[e.jsx(He,{})," Make permanent"]}),e.jsxs(ne,{onClick:h,variant:"ghosted-white",children:[e.jsx(Ke,{}),"Cancel"]})]})}const zt=Ve(s=>({selectedEventId:null,setSelectedEventId:t=>s(()=>({selectedEventId:t})),clearSelectedEventId:()=>s(()=>({selectedEventId:null}))})),Gt="_blink_1uqu6_1",qt="_fourtyfive_1uqu6_13",Ht="_chip_1uqu6_17",Kt="_over_1uqu6_23",Vt="_under_1uqu6_26",Wt="_due_1uqu6_29",B={blink:Gt,fourtyfive:qt,chip:Ht,over:Kt,under:Vt,due:Wt};function Zt({timeStart:s,delay:t,dayOffset:n,isPast:o,isLoaded:l,className:i,totalGap:c,id:u,duration:d,isLinkedToLoaded:p}){const{playback:m}=_t();if(l)return null;const f=_e(m);return!f||o?e.jsx(Xt,{className:i,id:u,duration:d}):f?e.jsx(E,{text:"Expected time until start",render:e.jsx("span",{}),className:i,children:e.jsx(Qt,{timeStart:s,delay:t,dayOffset:n,totalGap:c,isLinkedToLoaded:p})}):null}function Qt({timeStart:s,delay:t,dayOffset:n,totalGap:o,isLinkedToLoaded:l}){const i=bt({timeStart:s,delay:t,dayOffset:n},{totalGap:o,isLinkedToLoaded:l}),c=i<ue,u=c?"DUE":`${J(Math.abs(i),i>2*de)}`;return e.jsx("div",{className:N([B.chip,c&&B.due]),children:u})}function Xt(s){const{className:t,id:n,duration:o}=s,{data:l}=Nt(),i=l[n],[c,u,d]=_.useMemo(()=>{if(!i)return[null,"none",""];const{startedAt:p,endedAt:m}=i;if(!p||!m)return[null,"none",""];const v=m-p-o,h=Math.abs(v);if(h<ue)return["ontime","under","Event finished on time"];const r=v>0,y=A(h),b=`Event ran ${r?"over":"under"} time by ${y}`;return[`${r?"+":"-"}${J(h,h>2*de)}`,r?"over":"under",b]},[i,o]);return c?e.jsx(E,{text:d,render:e.jsx("span",{}),className:N([B.chip,B[u],t]),children:c==="ontime"?e.jsx(We,{size:"1.1rem"}):c}):null}const Yt="_blink_bc2h9_1",Jt="_fourtyfive_bc2h9_13",es="_rundownEvent_bc2h9_17",ts="_loaded_bc2h9_39",ss="_play_bc2h9_42",ns="_roll_bc2h9_47",os="_pause_bc2h9_52",rs="_selected_bc2h9_57",is="_hasCursor_bc2h9_60",as="_past_bc2h9_63",ls="_skip_bc2h9_63",cs="_timerNote_bc2h9_63",us="_statusElements_bc2h9_64",ds="_eventTitle_bc2h9_65",ps="_eventNote_bc2h9_66",ms="_eventTimers_bc2h9_67",fs="_eventStatus_bc2h9_68",_s="_playbackActions_bc2h9_69",bs="_binder_bc2h9_70",hs="_drag_bc2h9_97",ys="_cue_bc2h9_115",vs="_editMode_bc2h9_143",gs="_chipSection_bc2h9_148",xs="_titleSection_bc2h9_152",js="_nextTag_bc2h9_158",Es="_progressBg_bc2h9_171",ks="_hidden_bc2h9_180",Ss="_flip_bc2h9_184",Is="_statusIcon_bc2h9_218",Cs="_active_bc2h9_222",Ns="_disabled_bc2h9_225",a={blink:Yt,fourtyfive:Jt,rundownEvent:es,loaded:ts,play:ss,roll:ns,pause:os,selected:rs,hasCursor:is,past:as,skip:ls,timerNote:cs,statusElements:us,eventTitle:ds,eventNote:ps,eventTimers:ms,eventStatus:fs,playbackActions:_s,binder:bs,drag:hs,cue:ys,editMode:vs,chipSection:gs,titleSection:xs,nextTag:js,progressBg:Es,hidden:ks,flip:Ss,statusIcon:Is,active:Cs,disabled:Ns},ws=_.memo(Ts);function Ts({eventId:s,skip:t,isPlaying:n,isPaused:o,loaded:l,disablePlayback:i}){const{updateEntry:c}=D(),u=f=>{f.stopPropagation(),c({id:s,skip:!t})},d=f=>{f.stopPropagation(),n?M.pause():o?M.start():M.startEvent(s)},p=f=>{f.stopPropagation(),M.loadEvent(s)},m=o?{tooltip:"Continue event",backgroundColor:"#339E4E"}:n?{tooltip:"Pause event",backgroundColor:"#c05621"}:{tooltip:"Start event",backgroundColor:void 0};return e.jsxs("div",{className:a.playbackActions,children:[e.jsx(E,{text:"Skip event",render:e.jsx(q,{variant:"subtle-white"}),onClick:u,tabIndex:-1,disabled:l,style:{background:t?"#9A0000":void 0},"aria-label":"Skip event",children:t?e.jsx(Ze,{}):e.jsx(Qe,{})}),e.jsx(E,{text:"Load event",render:e.jsx(q,{variant:"subtle-white"}),onClick:p,tabIndex:-1,disabled:i,"aria-label":"Load event",children:e.jsx(Xe,{className:a.flip})}),e.jsx(E,{text:m.tooltip,render:e.jsx(q,{variant:"subtle-white"}),onClick:d,tabIndex:-1,disabled:i,style:{backgroundColor:m.backgroundColor},"aria-label":n?"Pause event":"Start event",children:n?e.jsx(Ye,{}):e.jsx(le,{})})]})}const Rs="_progressBar_1glmb_17",$s={progressBar:Rs};function As(){const s=ht(),t=wt(s.current,s.duration);return e.jsx("div",{className:$s.progressBar,style:{width:`${t}%`}})}const Ds=_.memo(Ms);function Ms({eventId:s,timeStart:t,timeEnd:n,duration:o,timeStrategy:l,linkStart:i,countToEnd:c,endAction:u,timerType:d,title:p,note:m,delay:f,isNext:v,skip:h=!1,loaded:r,playback:y,isRolling:b,dayOffset:w,isPast:I,totalGap:T,isLinkedToLoaded:R,hasTriggers:g}){const[x,F]=_.useState(!1),[U]=Je({key:yt.editorMode,defaultValue:oe.Edit});_.useEffect(()=>{F(!0)},[]);const O=y===re.Play,z=y===re.Pause;return x?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:N([a.eventTimers,U===oe.Edit&&a.editMode]),children:e.jsx(It,{eventId:s,timeStart:t,timeEnd:n,duration:o,delay:f,timeStrategy:l,linkStart:i,countToEnd:c})}),e.jsxs("div",{className:a.titleSection,children:[e.jsx(kt,{title:p,entryId:s,placeholder:"Event title",className:a.eventTitle}),v&&e.jsx("span",{className:a.nextTag,children:"UP NEXT"})]}),e.jsx(ws,{eventId:s,skip:h,isPlaying:O,isPaused:z,loaded:r,disablePlayback:h||b}),!h&&e.jsx(Zt,{className:a.chipSection,id:s,timeStart:t,delay:f,dayOffset:w,isLinkedToLoaded:R,isPast:I,isLoaded:r,totalGap:T,duration:o}),e.jsxs("div",{className:a.statusElements,id:"entry-status","data-timertype":d,children:[e.jsx("span",{className:a.eventNote,children:m}),e.jsx("div",{className:r?a.progressBg:`${a.progressBg} ${a.hidden}`,children:r&&e.jsx(As,{})}),e.jsxs("div",{className:a.eventStatus,tabIndex:-1,children:[e.jsx(E,{text:`Time type: ${d}`,render:e.jsx("span",{}),children:e.jsx(Ls,{type:d,className:a.statusIcon})}),e.jsx(E,{text:`End action: ${u}`,render:e.jsx("span",{}),children:e.jsx(Ps,{action:u,className:a.statusIcon})}),e.jsx(E,{text:`${c?"Count to End":"Count duration"}`,render:e.jsx("span",{}),children:e.jsx(et,{className:`${a.statusIcon} ${c?a.active:a.disabled}`})}),e.jsx(E,{text:"Event has Triggers",render:e.jsx("span",{}),children:e.jsx(tt,{className:`${a.statusIcon} ${g?a.active:a.disabled}`})})]})]})]}):null}function Ps(s){const{action:t,className:n}=s,o=N([t!==K.None&&a.active,n]);return t===K.LoadNext?e.jsx(it,{className:o}):t===K.PlayNext?e.jsx(at,{className:o}):e.jsx(le,{className:n})}function Ls(s){const{type:t,className:n}=s;return t===H.CountUp?e.jsx(st,{className:n}):t===H.Clock?e.jsx(nt,{className:n}):t===H.None?e.jsx(ot,{className:n}):e.jsx(rt,{className:n})}function Bs(s,t){if(!t)return;const n=Math.max(0,s+t);return`New start ${vt(A(n))}`}function Fs(s,t){if(s===0)return t?"(next day)":void 0;const n=J(Math.abs(s),!1);return`${s<0?"Overlap":"Gap"} ${n}${t?" (next day)":""}`}const Us="_indicators_duajo_18",Os="_delay_duajo_29",zs="_gap_duajo_36",W={indicators:Us,delay:Os,gap:zs};function Gs({timeStart:s,delay:t,gap:n,isNextDay:o}){const l=Fs(n,o),i=Bs(s,t);return e.jsxs("div",{className:W.indicators,children:[i&&e.jsx("div",{className:W.delay,children:i}),l&&e.jsx("div",{className:W.gap,children:l})]})}function qs({eventId:s,cue:t,timeStart:n,timeEnd:o,duration:l,timeStrategy:i,linkStart:c,flag:u,countToEnd:d,eventIndex:p,endAction:m,timerType:f,title:v,note:h,delay:r,colour:y,isPast:b,isNext:w,skip:I=!1,parent:T,loaded:R,hasCursor:g,playback:x,isRolling:F,gap:U,isNextDay:O,dayOffset:z,totalGap:be,isLinkedToLoaded:he,hasTriggers:ye}){const{selectedEventId:$,setSelectedEventId:ve,clearSelectedEventId:ge}=zt(),{updateEntry:xe,batchUpdateEvents:ee,clone:je,deleteEntry:te,groupEntries:Ee,swapEvents:ke}=D(),{selectedEvents:C,unselect:Se,setSelectedEvents:Ie,clearSelectedEvents:se}=me(),k=_.useRef(null),[Ce,Ne]=_.useState(!1),[we]=fe(C.size>1?[{type:"item",label:"Link to previous",icon:lt,onClick:()=>{ee({linkStart:!0},Array.from(C))}},{type:"item",label:"Unlink from previous",icon:ct,onClick:()=>{ee({linkStart:!1},Array.from(C))}},{type:"divider"},{type:"item",label:"Group",icon:ut,onClick:()=>{Ee(Array.from(C)),se()},disabled:T!==null},{type:"divider"},{type:"item",label:"Delete",icon:Z,onClick:()=>{se(),te(Array.from(C))}}]:[{type:"item",label:u?"Remove flag":"Add flag",icon:dt,onClick:()=>{xe({id:s,flag:!u})}},{type:"divider"},{type:"item",label:"Add to swap",icon:pt,onClick:()=>ve(s)},{type:"item",label:`Swap this event with ${$??""}`,icon:mt,onClick:()=>{$&&(ke($,s),ge())},disabled:$==null||$===s},{type:"item",label:"Clone",icon:ft,onClick:()=>je(s,{after:s})},{type:"divider"},{type:"item",label:"Delete",icon:Z,onClick:()=>{te([s]),Se(s)}}]),{isDragging:Te,attributes:Re,listeners:$e,setNodeRef:Ae,transform:De,transition:Me}=Q({id:s,data:{type:"event",parent:T},animateLayoutChanges:()=>!1}),Pe={zIndex:Te?2:"inherit",transform:X.Translate.toString(De),transition:Me},Le=y&&pe(y);_.useEffect(()=>{if(!g||(k==null?void 0:k.current)==null)return;const S=document.activeElement,j=k.current.closest("#event-group");j&&!j.contains(S)&&k.current.focus()},[g]),_.useLayoutEffect(()=>{const S=new IntersectionObserver(([G])=>{G.isIntersecting&&Ne(!0)},{root:null,threshold:1}),j=k.current;return j&&S.observe(j),()=>{j&&S.unobserve(j)}},[k]);const Be=C.has(s),Fe=N([a.rundownEvent,I?a.skip:null,b?a.past:null,R?a.loaded:null,x?a[x]:null,Be?a.selected:null,g?a.hasCursor:null]),Ue=S=>{if(S.stopPropagation(),C.size>1&&S.button===2)return;const j=p-1,G=St(S);Ie({id:s,index:j,selectMode:G})},Oe=x?_e(x):!1;return e.jsxs("div",{className:Fe,ref:Ae,style:Pe,onClick:Ue,onContextMenu:we,"data-testid":"rundown-event",...Oe?{"data-running":!0}:{},children:[e.jsx(Gs,{timeStart:n,delay:r,gap:U,isNextDay:O}),e.jsxs("div",{className:a.binder,style:{...Le},tabIndex:-1,children:[e.jsx("span",{className:a.drag,ref:k,...Re,...$e,children:e.jsx(Y,{})}),e.jsx("span",{className:a.cue,children:t})]}),Ce&&e.jsx(Ds,{timeStart:n,timeEnd:o,duration:l,linkStart:c,countToEnd:d,timeStrategy:i,eventId:s,eventIndex:p,endAction:m,timerType:f,title:v,note:h,delay:r,isNext:w,skip:I,loaded:R,playback:x,isRolling:F,dayOffset:z,isPast:b,totalGap:be,isLinkedToLoaded:he,hasTriggers:ye})]})}const Hs="_milestone_102sw_17",Ks="_hasCursor_102sw_35",Vs="_binder_102sw_39",Ws="_drag_102sw_47",L={milestone:Hs,hasCursor:Ks,binder:Vs,drag:Ws};function Zs({colour:s,cue:t,entryId:n,hasCursor:o,title:l}){const i=_.useRef(null),{updateEntry:c,deleteEntry:u}=D(),{selectedEvents:d,setSingleEntrySelection:p}=me(),[m]=fe([{type:"item",label:"Delete",icon:Z,onClick:()=>u([n])}]),{attributes:f,listeners:v,setNodeRef:h,isDragging:r,transform:y,transition:b}=Q({id:n,data:{type:"milestone"},animateLayoutChanges:()=>!1}),w=g=>{g.stopPropagation(),!(d.size>1&&g.button===2)&&p({id:n})},I=(g,x)=>{c({id:n,[g]:x})},T={zIndex:r?2:"inherit",transform:X.Translate.toString(y),transition:b},R=s&&pe(s);return e.jsxs("div",{className:N([L.milestone,o?L.hasCursor:null]),ref:h,onClick:w,onContextMenu:m,style:T,"data-testid":"rundown-milestone",children:[e.jsx("div",{className:L.binder,style:{...R},children:e.jsx("span",{className:L.drag,ref:i,...f,...v,children:e.jsx(Y,{})})}),e.jsx(ae,{field:"cue",initialValue:t,placeholder:"Cue",submitHandler:I}),e.jsx(ae,{field:"title",initialValue:l,placeholder:"Title",submitHandler:I})]})}function ae({field:s,initialValue:t,placeholder:n,submitHandler:o}){const l=_.useRef(null),i=_.useCallback(m=>o(s,m),[s,o]),{value:c,onChange:u,onBlur:d,onKeyDown:p}=Ct(t,i,l,{submitOnEnter:!0});return e.jsx(ce,{id:s,ref:l,fluid:!0,value:c,placeholder:n,onChange:u,onBlur:d,onKeyDown:p})}function xn({isPast:s,data:t,loaded:n,hasCursor:o,isNext:l,playback:i,isRolling:c,eventIndex:u,isNextDay:d,totalGap:p,isLinkedToLoaded:m}){return gt(t)?e.jsx(qs,{eventId:t.id,eventIndex:u,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:s,isNext:l,skip:t.skip,parent:t.parent,loaded:n,hasCursor:o,playback:i,isRolling:c,gap:t.gap,isNextDay:d,dayOffset:t.dayOffset,totalGap:p,isLinkedToLoaded:m,hasTriggers:t.triggers.length>0}):xt(t)?e.jsx(Ot,{data:t,hasCursor:o}):jt(t)?e.jsx(Zs,{colour:t.colour,cue:t.cue,entryId:t.id,hasCursor:o,title:t.title}):null}export{xn as default};
|
|
2
|
-
//# sourceMappingURL=RundownEntry-
|
|
1
|
+
import{j as e,aY as ze,aZ as Ge,a_ as qe,h as _,aG as Q,aH as X,bf as Y,ch as He,v as Ke,f as Ve,bq as We,ci as Ze,cj as Qe,bQ as Xe,bM as le,bN as Ye,aN as Je,bS as et,ck as tt,y as st,bR as nt,br as ot,av as rt,bP as it,cl as at,am as lt,bl as ct,cm as ut,ah as Z,aF as dt,T as pt,K as mt,ar as ft}from"./vendor-DmGkEtRj.js";import{m as A,ah as ce,e as N,B as ne,n as _t,bg as ue,k as J,M as de,bf as bt,ak as q,bT as M,K as ht,b2 as oe,b6 as yt,h as re,T as H,bU as vt,aC as pe}from"./index-B1K7rED_.js";import{i as gt,s as xt,k as jt}from"./useRundown-BGhL8DEI.js";import{u as D}from"./dateConfig-Crm-Cu2y.js";import{p as Et}from"./parseUserTime-0pNWLcr0.js";import{T as kt,u as me,a as fe,g as St}from"./RundownExport-DhCryTUp.js";import{E as K}from"./validateEvent-jVIMKhmx.js";import{T as E}from"./Tooltip-BTK4bJkV.js";import{a as It,u as Ct}from"./MilestoneEditor-CxWZdQ1B.js";import{u as Nt}from"./useReport-6XA_s2Vc.js";import{i as _e}from"./playbackstate-1HCEpVh5.js";import{g as wt}from"./getProgress-fD6vhbNF.js";import"./editorSettings-CRJwIW7V.js";import"./rundownUtils-D1oJpMdx.js";import"./EditorUtils-C3QoonjM.js";import"./ProtectRoute-DW_vXgYI.js";import"./Modal-ePA-Go14.js";import"./SwatchPicker-C8eFQKBd.js";import"./Empty-DJMjfXnt.js";import"./useFollowComponent-4cbKEsVz.js";import"./offset-FplkvYRD.js";import"./TimeInput-DR-NCEhH.js";import"./useCustomFields-nW-_Zyfw.js";import"./Select-ASOzxGFV.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="28290648-811f-44d4-bd37-80b15f8e88a4",s._sentryDebugIdIdentifier="sentry-dbid-28290648-811f-44d4-bd37-80b15f8e88a4")}catch{}})();const Tt="_radioGroup_sxz6b_17",Rt="_item_sxz6b_23",$t="_radio_sxz6b_17",At="_indicator_sxz6b_55",P={radioGroup:Tt,item:Rt,radio:$t,indicator:At};function Dt({items:s,onValueChange:t,...n}){return e.jsx(ze,{onValueChange:o=>t==null?void 0:t(o),className:P.radioGroup,...n,children:s.map(o=>e.jsxs("label",{className:P.item,children:[e.jsx(Ge,{value:o.value.toString(),className:P.radio,children:e.jsx(qe,{className:P.indicator})}),o.label]},o.value.toString()))})}const Mt="_delayInput_ksn92_17",Pt="_inputField_ksn92_23",ie={delayInput:Mt,inputField:Pt};function Lt(s){const{eventId:t,duration:n}=s,{updateEntry:o}=D(),[l,i]=_.useState(""),c=_.useRef(null),u=_.useRef(!1);_.useEffect(()=>{typeof n>"u"||i(A(n))},[n]);const d=r=>{if(u.current){u.current=!1;return}const y=r.startsWith("-");let b=Et(r);y&&(b=b*-1),b!==n&&(p(b),i(A(b)))},p=r=>{o({id:t,duration:r})},m=()=>{var r;return(r=c.current)==null?void 0:r.select()},f=r=>{var y,b;r.key==="Enter"?((y=c.current)==null||y.blur(),d(r.target.value)):r.key==="Tab"?d(r.target.value):r.key==="Escape"&&(u.current=!0,i(A(n)),(b=c.current)==null||b.blur())},v=r=>{r==="add"?n<0&&p(n*-1):r==="subtract"&&n>0&&p(n*-1)},h=l.startsWith("-")?"subtract":"add";return e.jsxs("div",{className:ie.delayInput,children:[e.jsx(ce,{ref:c,"data-testid":"delay-input",className:ie.inputField,placeholder:"-",onFocus:m,onChange:r=>i(r.target.value),onBlur:r=>d(r.target.value),onKeyDown:f,value:l,maxLength:9}),e.jsx(Dt,{onValueChange:v,value:h,items:[{value:"add",label:"Add time"},{value:"subtract",label:"Subtract time"}]})]})}const Bt="_delay_tel5v_17",Ft="_hasCursor_tel5v_34",Ut="_drag_tel5v_38",V={delay:Bt,hasCursor:Ft,drag:Ut};function Ot({data:s,hasCursor:t}){const{applyDelay:n,deleteEntry:o}=D(),l=_.useRef(null),{attributes:i,listeners:c,setNodeRef:u,isDragging:d,transform:p,transition:m}=Q({id:s.id,data:{type:"delay"},animateLayoutChanges:()=>!1}),f={zIndex:d?2:"inherit",transform:X.Translate.toString(p),transition:m};_.useEffect(()=>{var r;t&&((r=l==null?void 0:l.current)==null||r.focus())},[t]);const v=()=>{n(s.id)},h=()=>{o([s.id])};return e.jsxs("div",{className:N([V.delay,t?V.hasCursor:null]),ref:u,style:f,"data-testid":"rundown-delay",children:[e.jsx("span",{className:V.drag,ref:l,...i,...c,children:e.jsx(Y,{})}),e.jsx(Lt,{eventId:s.id,duration:s.duration}),e.jsxs(ne,{onClick:v,variant:"ghosted-white",children:[e.jsx(He,{})," Make permanent"]}),e.jsxs(ne,{onClick:h,variant:"ghosted-white",children:[e.jsx(Ke,{}),"Cancel"]})]})}const zt=Ve(s=>({selectedEventId:null,setSelectedEventId:t=>s(()=>({selectedEventId:t})),clearSelectedEventId:()=>s(()=>({selectedEventId:null}))})),Gt="_blink_1uqu6_1",qt="_fourtyfive_1uqu6_13",Ht="_chip_1uqu6_17",Kt="_over_1uqu6_23",Vt="_under_1uqu6_26",Wt="_due_1uqu6_29",B={blink:Gt,fourtyfive:qt,chip:Ht,over:Kt,under:Vt,due:Wt};function Zt({timeStart:s,delay:t,dayOffset:n,isPast:o,isLoaded:l,className:i,totalGap:c,id:u,duration:d,isLinkedToLoaded:p}){const{playback:m}=_t();if(l)return null;const f=_e(m);return!f||o?e.jsx(Xt,{className:i,id:u,duration:d}):f?e.jsx(E,{text:"Expected time until start",render:e.jsx("span",{}),className:i,children:e.jsx(Qt,{timeStart:s,delay:t,dayOffset:n,totalGap:c,isLinkedToLoaded:p})}):null}function Qt({timeStart:s,delay:t,dayOffset:n,totalGap:o,isLinkedToLoaded:l}){const i=bt({timeStart:s,delay:t,dayOffset:n},{totalGap:o,isLinkedToLoaded:l}),c=i<ue,u=c?"DUE":`${J(Math.abs(i),i>2*de)}`;return e.jsx("div",{className:N([B.chip,c&&B.due]),children:u})}function Xt(s){const{className:t,id:n,duration:o}=s,{data:l}=Nt(),i=l[n],[c,u,d]=_.useMemo(()=>{if(!i)return[null,"none",""];const{startedAt:p,endedAt:m}=i;if(!p||!m)return[null,"none",""];const v=m-p-o,h=Math.abs(v);if(h<ue)return["ontime","under","Event finished on time"];const r=v>0,y=A(h),b=`Event ran ${r?"over":"under"} time by ${y}`;return[`${r?"+":"-"}${J(h,h>2*de)}`,r?"over":"under",b]},[i,o]);return c?e.jsx(E,{text:d,render:e.jsx("span",{}),className:N([B.chip,B[u],t]),children:c==="ontime"?e.jsx(We,{size:"1.1rem"}):c}):null}const Yt="_blink_bc2h9_1",Jt="_fourtyfive_bc2h9_13",es="_rundownEvent_bc2h9_17",ts="_loaded_bc2h9_39",ss="_play_bc2h9_42",ns="_roll_bc2h9_47",os="_pause_bc2h9_52",rs="_selected_bc2h9_57",is="_hasCursor_bc2h9_60",as="_past_bc2h9_63",ls="_skip_bc2h9_63",cs="_timerNote_bc2h9_63",us="_statusElements_bc2h9_64",ds="_eventTitle_bc2h9_65",ps="_eventNote_bc2h9_66",ms="_eventTimers_bc2h9_67",fs="_eventStatus_bc2h9_68",_s="_playbackActions_bc2h9_69",bs="_binder_bc2h9_70",hs="_drag_bc2h9_97",ys="_cue_bc2h9_115",vs="_editMode_bc2h9_143",gs="_chipSection_bc2h9_148",xs="_titleSection_bc2h9_152",js="_nextTag_bc2h9_158",Es="_progressBg_bc2h9_171",ks="_hidden_bc2h9_180",Ss="_flip_bc2h9_184",Is="_statusIcon_bc2h9_218",Cs="_active_bc2h9_222",Ns="_disabled_bc2h9_225",a={blink:Yt,fourtyfive:Jt,rundownEvent:es,loaded:ts,play:ss,roll:ns,pause:os,selected:rs,hasCursor:is,past:as,skip:ls,timerNote:cs,statusElements:us,eventTitle:ds,eventNote:ps,eventTimers:ms,eventStatus:fs,playbackActions:_s,binder:bs,drag:hs,cue:ys,editMode:vs,chipSection:gs,titleSection:xs,nextTag:js,progressBg:Es,hidden:ks,flip:Ss,statusIcon:Is,active:Cs,disabled:Ns},ws=_.memo(Ts);function Ts({eventId:s,skip:t,isPlaying:n,isPaused:o,loaded:l,disablePlayback:i}){const{updateEntry:c}=D(),u=f=>{f.stopPropagation(),c({id:s,skip:!t})},d=f=>{f.stopPropagation(),n?M.pause():o?M.start():M.startEvent(s)},p=f=>{f.stopPropagation(),M.loadEvent(s)},m=o?{tooltip:"Continue event",backgroundColor:"#339E4E"}:n?{tooltip:"Pause event",backgroundColor:"#c05621"}:{tooltip:"Start event",backgroundColor:void 0};return e.jsxs("div",{className:a.playbackActions,children:[e.jsx(E,{text:"Skip event",render:e.jsx(q,{variant:"subtle-white"}),onClick:u,tabIndex:-1,disabled:l,style:{background:t?"#9A0000":void 0},"aria-label":"Skip event",children:t?e.jsx(Ze,{}):e.jsx(Qe,{})}),e.jsx(E,{text:"Load event",render:e.jsx(q,{variant:"subtle-white"}),onClick:p,tabIndex:-1,disabled:i,"aria-label":"Load event",children:e.jsx(Xe,{className:a.flip})}),e.jsx(E,{text:m.tooltip,render:e.jsx(q,{variant:"subtle-white"}),onClick:d,tabIndex:-1,disabled:i,style:{backgroundColor:m.backgroundColor},"aria-label":n?"Pause event":"Start event",children:n?e.jsx(Ye,{}):e.jsx(le,{})})]})}const Rs="_progressBar_1glmb_17",$s={progressBar:Rs};function As(){const s=ht(),t=wt(s.current,s.duration);return e.jsx("div",{className:$s.progressBar,style:{width:`${t}%`}})}const Ds=_.memo(Ms);function Ms({eventId:s,timeStart:t,timeEnd:n,duration:o,timeStrategy:l,linkStart:i,countToEnd:c,endAction:u,timerType:d,title:p,note:m,delay:f,isNext:v,skip:h=!1,loaded:r,playback:y,isRolling:b,dayOffset:w,isPast:I,totalGap:T,isLinkedToLoaded:R,hasTriggers:g}){const[x,F]=_.useState(!1),[U]=Je({key:yt.editorMode,defaultValue:oe.Edit});_.useEffect(()=>{F(!0)},[]);const O=y===re.Play,z=y===re.Pause;return x?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:N([a.eventTimers,U===oe.Edit&&a.editMode]),children:e.jsx(It,{eventId:s,timeStart:t,timeEnd:n,duration:o,delay:f,timeStrategy:l,linkStart:i,countToEnd:c})}),e.jsxs("div",{className:a.titleSection,children:[e.jsx(kt,{title:p,entryId:s,placeholder:"Event title",className:a.eventTitle}),v&&e.jsx("span",{className:a.nextTag,children:"UP NEXT"})]}),e.jsx(ws,{eventId:s,skip:h,isPlaying:O,isPaused:z,loaded:r,disablePlayback:h||b}),!h&&e.jsx(Zt,{className:a.chipSection,id:s,timeStart:t,delay:f,dayOffset:w,isLinkedToLoaded:R,isPast:I,isLoaded:r,totalGap:T,duration:o}),e.jsxs("div",{className:a.statusElements,id:"entry-status","data-timertype":d,children:[e.jsx("span",{className:a.eventNote,children:m}),e.jsx("div",{className:r?a.progressBg:`${a.progressBg} ${a.hidden}`,children:r&&e.jsx(As,{})}),e.jsxs("div",{className:a.eventStatus,tabIndex:-1,children:[e.jsx(E,{text:`Time type: ${d}`,render:e.jsx("span",{}),children:e.jsx(Ls,{type:d,className:a.statusIcon})}),e.jsx(E,{text:`End action: ${u}`,render:e.jsx("span",{}),children:e.jsx(Ps,{action:u,className:a.statusIcon})}),e.jsx(E,{text:`${c?"Count to End":"Count duration"}`,render:e.jsx("span",{}),children:e.jsx(et,{className:`${a.statusIcon} ${c?a.active:a.disabled}`})}),e.jsx(E,{text:"Event has Triggers",render:e.jsx("span",{}),children:e.jsx(tt,{className:`${a.statusIcon} ${g?a.active:a.disabled}`})})]})]})]}):null}function Ps(s){const{action:t,className:n}=s,o=N([t!==K.None&&a.active,n]);return t===K.LoadNext?e.jsx(it,{className:o}):t===K.PlayNext?e.jsx(at,{className:o}):e.jsx(le,{className:n})}function Ls(s){const{type:t,className:n}=s;return t===H.CountUp?e.jsx(st,{className:n}):t===H.Clock?e.jsx(nt,{className:n}):t===H.None?e.jsx(ot,{className:n}):e.jsx(rt,{className:n})}function Bs(s,t){if(!t)return;const n=Math.max(0,s+t);return`New start ${vt(A(n))}`}function Fs(s,t){if(s===0)return t?"(next day)":void 0;const n=J(Math.abs(s),!1);return`${s<0?"Overlap":"Gap"} ${n}${t?" (next day)":""}`}const Us="_indicators_duajo_18",Os="_delay_duajo_29",zs="_gap_duajo_36",W={indicators:Us,delay:Os,gap:zs};function Gs({timeStart:s,delay:t,gap:n,isNextDay:o}){const l=Fs(n,o),i=Bs(s,t);return e.jsxs("div",{className:W.indicators,children:[i&&e.jsx("div",{className:W.delay,children:i}),l&&e.jsx("div",{className:W.gap,children:l})]})}function qs({eventId:s,cue:t,timeStart:n,timeEnd:o,duration:l,timeStrategy:i,linkStart:c,flag:u,countToEnd:d,eventIndex:p,endAction:m,timerType:f,title:v,note:h,delay:r,colour:y,isPast:b,isNext:w,skip:I=!1,parent:T,loaded:R,hasCursor:g,playback:x,isRolling:F,gap:U,isNextDay:O,dayOffset:z,totalGap:be,isLinkedToLoaded:he,hasTriggers:ye}){const{selectedEventId:$,setSelectedEventId:ve,clearSelectedEventId:ge}=zt(),{updateEntry:xe,batchUpdateEvents:ee,clone:je,deleteEntry:te,groupEntries:Ee,swapEvents:ke}=D(),{selectedEvents:C,unselect:Se,setSelectedEvents:Ie,clearSelectedEvents:se}=me(),k=_.useRef(null),[Ce,Ne]=_.useState(!1),[we]=fe(C.size>1?[{type:"item",label:"Link to previous",icon:lt,onClick:()=>{ee({linkStart:!0},Array.from(C))}},{type:"item",label:"Unlink from previous",icon:ct,onClick:()=>{ee({linkStart:!1},Array.from(C))}},{type:"divider"},{type:"item",label:"Group",icon:ut,onClick:()=>{Ee(Array.from(C)),se()},disabled:T!==null},{type:"divider"},{type:"item",label:"Delete",icon:Z,onClick:()=>{se(),te(Array.from(C))}}]:[{type:"item",label:u?"Remove flag":"Add flag",icon:dt,onClick:()=>{xe({id:s,flag:!u})}},{type:"divider"},{type:"item",label:"Add to swap",icon:pt,onClick:()=>ve(s)},{type:"item",label:`Swap this event with ${$??""}`,icon:mt,onClick:()=>{$&&(ke($,s),ge())},disabled:$==null||$===s},{type:"item",label:"Clone",icon:ft,onClick:()=>je(s,{after:s})},{type:"divider"},{type:"item",label:"Delete",icon:Z,onClick:()=>{te([s]),Se(s)}}]),{isDragging:Te,attributes:Re,listeners:$e,setNodeRef:Ae,transform:De,transition:Me}=Q({id:s,data:{type:"event",parent:T},animateLayoutChanges:()=>!1}),Pe={zIndex:Te?2:"inherit",transform:X.Translate.toString(De),transition:Me},Le=y&&pe(y);_.useEffect(()=>{if(!g||(k==null?void 0:k.current)==null)return;const S=document.activeElement,j=k.current.closest("#event-group");j&&!j.contains(S)&&k.current.focus()},[g]),_.useLayoutEffect(()=>{const S=new IntersectionObserver(([G])=>{G.isIntersecting&&Ne(!0)},{root:null,threshold:1}),j=k.current;return j&&S.observe(j),()=>{j&&S.unobserve(j)}},[k]);const Be=C.has(s),Fe=N([a.rundownEvent,I?a.skip:null,b?a.past:null,R?a.loaded:null,x?a[x]:null,Be?a.selected:null,g?a.hasCursor:null]),Ue=S=>{if(S.stopPropagation(),C.size>1&&S.button===2)return;const j=p-1,G=St(S);Ie({id:s,index:j,selectMode:G})},Oe=x?_e(x):!1;return e.jsxs("div",{className:Fe,ref:Ae,style:Pe,onClick:Ue,onContextMenu:we,"data-testid":"rundown-event",...Oe?{"data-running":!0}:{},children:[e.jsx(Gs,{timeStart:n,delay:r,gap:U,isNextDay:O}),e.jsxs("div",{className:a.binder,style:{...Le},tabIndex:-1,children:[e.jsx("span",{className:a.drag,ref:k,...Re,...$e,children:e.jsx(Y,{})}),e.jsx("span",{className:a.cue,children:t})]}),Ce&&e.jsx(Ds,{timeStart:n,timeEnd:o,duration:l,linkStart:c,countToEnd:d,timeStrategy:i,eventId:s,eventIndex:p,endAction:m,timerType:f,title:v,note:h,delay:r,isNext:w,skip:I,loaded:R,playback:x,isRolling:F,dayOffset:z,isPast:b,totalGap:be,isLinkedToLoaded:he,hasTriggers:ye})]})}const Hs="_milestone_102sw_17",Ks="_hasCursor_102sw_35",Vs="_binder_102sw_39",Ws="_drag_102sw_47",L={milestone:Hs,hasCursor:Ks,binder:Vs,drag:Ws};function Zs({colour:s,cue:t,entryId:n,hasCursor:o,title:l}){const i=_.useRef(null),{updateEntry:c,deleteEntry:u}=D(),{selectedEvents:d,setSingleEntrySelection:p}=me(),[m]=fe([{type:"item",label:"Delete",icon:Z,onClick:()=>u([n])}]),{attributes:f,listeners:v,setNodeRef:h,isDragging:r,transform:y,transition:b}=Q({id:n,data:{type:"milestone"},animateLayoutChanges:()=>!1}),w=g=>{g.stopPropagation(),!(d.size>1&&g.button===2)&&p({id:n})},I=(g,x)=>{c({id:n,[g]:x})},T={zIndex:r?2:"inherit",transform:X.Translate.toString(y),transition:b},R=s&&pe(s);return e.jsxs("div",{className:N([L.milestone,o?L.hasCursor:null]),ref:h,onClick:w,onContextMenu:m,style:T,"data-testid":"rundown-milestone",children:[e.jsx("div",{className:L.binder,style:{...R},children:e.jsx("span",{className:L.drag,ref:i,...f,...v,children:e.jsx(Y,{})})}),e.jsx(ae,{field:"cue",initialValue:t,placeholder:"Cue",submitHandler:I}),e.jsx(ae,{field:"title",initialValue:l,placeholder:"Title",submitHandler:I})]})}function ae({field:s,initialValue:t,placeholder:n,submitHandler:o}){const l=_.useRef(null),i=_.useCallback(m=>o(s,m),[s,o]),{value:c,onChange:u,onBlur:d,onKeyDown:p}=Ct(t,i,l,{submitOnEnter:!0});return e.jsx(ce,{id:s,ref:l,fluid:!0,value:c,placeholder:n,onChange:u,onBlur:d,onKeyDown:p})}function xn({isPast:s,data:t,loaded:n,hasCursor:o,isNext:l,playback:i,isRolling:c,eventIndex:u,isNextDay:d,totalGap:p,isLinkedToLoaded:m}){return gt(t)?e.jsx(qs,{eventId:t.id,eventIndex:u,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:s,isNext:l,skip:t.skip,parent:t.parent,loaded:n,hasCursor:o,playback:i,isRolling:c,gap:t.gap,isNextDay:d,dayOffset:t.dayOffset,totalGap:p,isLinkedToLoaded:m,hasTriggers:t.triggers.length>0}):xt(t)?e.jsx(Ot,{data:t,hasCursor:o}):jt(t)?e.jsx(Zs,{colour:t.colour,cue:t.cue,entryId:t.id,hasCursor:o,title:t.title}):null}export{xn as default};
|
|
2
|
+
//# sourceMappingURL=RundownEntry-CpspmKD0.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RundownEntry-bkqwx57t.js","sources":["../../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":["import { Radio } from '@base-ui/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui/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 { useSessionStorage } from '@mantine/hooks';\nimport { EndAction, Playback, TimerType, TimeStrategy } from 'ontime-types';\n\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\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 const [editorMode] = useSessionStorage({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\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={cx([style.eventTimers, editorMode === AppMode.Edit && style.editMode])}>\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 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}: RundownEventProps) {\n const { selectedEventId, setSelectedEventId, clearSelectedEventId } = useEventIdSwapping();\n const { updateEntry, batchUpdateEvents, clone, 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: () => clone(eventId, { after: eventId }),\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 { isOntimeDelay, isOntimeEvent, isOntimeMilestone, OntimeEntry, Playback, SupportedEntry } from 'ontime-types';\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 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 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":["BlockRadio","items","onValueChange","elementProps","BaseRadioGroup","value","style","radioGroup","map","item","jsx","Radio.Root","toString","radio","Radio.Indicator","indicator","label","DelayInput","props","eventId","duration","updateEntry","useEntryActions","setValue","useState","inputRef","useRef","ignoreChangeRef","useEffect","millisToString","validateAndSubmit","newValue","current","isNegative","startsWith","newMillis","parseUserTime","submitChange","id","handleFocus","select","onKeyDownHandler","event","key","blur","target","handleSlipChange","newDirection","checkedOption","jsxs","delayInput","Input","inputField","RundownDelay","data","hasCursor","applyDelay","deleteEntry","handleRef","attributes","dragAttributes","listeners","dragListeners","setNodeRef","isDragging","transform","transition","useSortable","type","animateLayoutChanges","dragStyle","zIndex","CSS","Translate","focus","applyDelayHandler","cancelDelayHandler","cx","delay","drag","IoReorderTwo","Button","IoCheckmarkDone","IoClose","useEventIdSwapping","create","set","selectedEventId","setSelectedEventId","newEventId","clearSelectedEventId","RundownEventChip","timeStart","dayOffset","isPast","isLoaded","className","totalGap","isLinkedToLoaded","playback","usePlayback","playbackActive","isPlaybackActive","EventReport","Tooltip","EventUntil","timeUntil","useTimeUntilExpectedStart","isDue","MILLIS_PER_SECOND","timeUntilString","formatDuration","Math","abs","MILLIS_PER_MINUTE","chip","due","useReport","currentReport","overUnderStyle","tooltip","useMemo","startedAt","endedAt","difference","absDifference","isOver","fullTimeValue","IoCheckmarkCircle","memo","RundownEventPlayback","skip","isPlaying","isPaused","loaded","disablePlayback","toggleSkip","stopPropagation","actionHandler","setEventPlayback","pause","start","startEvent","load","loadEvent","playButtonStyles","backgroundColor","undefined","playbackActions","IconButton","background","IoRemoveCircle","IoRemoveCircleOutline","IoReload","flip","IoPause","IoPlay","RundownEventProgressBar","timer","useTimer","progress","getProgress","progressBar","width","RundownEventInner","timeEnd","timeStrategy","linkStart","countToEnd","endAction","timerType","title","note","isNext","isRolling","hasTriggers","renderInner","setRenderInner","editorMode","useSessionStorage","sessionKeys","defaultValue","AppMode","Edit","eventIsPlaying","Playback","Play","eventIsPaused","Pause","Fragment","eventTimers","editMode","TimeInputFlow","titleSection","TitleEditor","eventTitle","nextTag","EventBlockPlayback","chipSection","statusElements","eventNote","progressBg","hidden","EventBlockProgressBar","eventStatus","TimerIcon","statusIcon","EndActionIcon","LuArrowDownToLine","active","disabled","IoFlash","action","maybeActiveClasses","EndAction","None","LoadNext","IoPlaySkipForward","PlayNext","IoPlayForward","TimerType","CountUp","IoArrowUp","Clock","IoTime","IoBan","IoArrowDown","formatDelay","delayedStart","max","removeTrailingZero","formatGap","gap","isNextDay","gapString","RundownIndicators","hasGap","hasDelay","indicators","RundownEvent","cue","flag","eventIndex","colour","parent","batchUpdateEvents","clone","groupEntries","swapEvents","selectedEvents","unselect","setSelectedEvents","clearSelectedEvents","useEventSelection","isVisible","setIsVisible","onContextMenu","useContextMenu","size","icon","IoLink","onClick","Array","from","IoUnlink","IoFolder","IoTrash","TbFlagFilled","IoAdd","IoSwapVertical","IoDuplicateOutline","after","binderColours","getAccessibleColour","elementInFocus","document","activeElement","blockElement","closest","contains","useLayoutEffect","observer","IntersectionObserver","entry","isIntersecting","root","threshold","handleRefCurrent","observe","unobserve","isSelected","has","blockClasses","rundownEvent","past","selected","handleFocusClick","button","index","getSelectionMode","selectMode","binder","RundownMilestone","entryId","setSingleEntrySelection","handleUpdate","field","milestone","MilestoneTextInput","initialValue","placeholder","submitHandler","ref","submitCallback","useCallback","onChange","onBlur","onKeyDown","useReactiveTextInput","submitOnEnter","RundownEntry","isOntimeEvent","triggers","length","isOntimeDelay","isOntimeMilestone"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RundownEntry-CpspmKD0.js","sources":["../../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":["import { Radio } from '@base-ui/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui/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 { useSessionStorage } from '@mantine/hooks';\nimport { EndAction, Playback, TimerType, TimeStrategy } from 'ontime-types';\n\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { AppMode, sessionKeys } from '../../../ontimeConfig';\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 const [editorMode] = useSessionStorage({\n key: sessionKeys.editorMode,\n defaultValue: AppMode.Edit,\n });\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={cx([style.eventTimers, editorMode === AppMode.Edit && style.editMode])}>\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 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}: RundownEventProps) {\n const { selectedEventId, setSelectedEventId, clearSelectedEventId } = useEventIdSwapping();\n const { updateEntry, batchUpdateEvents, clone, 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: () => clone(eventId, { after: eventId }),\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 { isOntimeDelay, isOntimeEvent, isOntimeMilestone, OntimeEntry, Playback, SupportedEntry } from 'ontime-types';\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 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 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":["BlockRadio","items","onValueChange","elementProps","BaseRadioGroup","value","style","radioGroup","map","item","jsx","Radio.Root","toString","radio","Radio.Indicator","indicator","label","DelayInput","props","eventId","duration","updateEntry","useEntryActions","setValue","useState","inputRef","useRef","ignoreChangeRef","useEffect","millisToString","validateAndSubmit","newValue","current","isNegative","startsWith","newMillis","parseUserTime","submitChange","id","handleFocus","select","onKeyDownHandler","event","key","blur","target","handleSlipChange","newDirection","checkedOption","jsxs","delayInput","Input","inputField","RundownDelay","data","hasCursor","applyDelay","deleteEntry","handleRef","attributes","dragAttributes","listeners","dragListeners","setNodeRef","isDragging","transform","transition","useSortable","type","animateLayoutChanges","dragStyle","zIndex","CSS","Translate","focus","applyDelayHandler","cancelDelayHandler","cx","delay","drag","IoReorderTwo","Button","IoCheckmarkDone","IoClose","useEventIdSwapping","create","set","selectedEventId","setSelectedEventId","newEventId","clearSelectedEventId","RundownEventChip","timeStart","dayOffset","isPast","isLoaded","className","totalGap","isLinkedToLoaded","playback","usePlayback","playbackActive","isPlaybackActive","EventReport","Tooltip","EventUntil","timeUntil","useTimeUntilExpectedStart","isDue","MILLIS_PER_SECOND","timeUntilString","formatDuration","Math","abs","MILLIS_PER_MINUTE","chip","due","useReport","currentReport","overUnderStyle","tooltip","useMemo","startedAt","endedAt","difference","absDifference","isOver","fullTimeValue","IoCheckmarkCircle","memo","RundownEventPlayback","skip","isPlaying","isPaused","loaded","disablePlayback","toggleSkip","stopPropagation","actionHandler","setEventPlayback","pause","start","startEvent","load","loadEvent","playButtonStyles","backgroundColor","undefined","playbackActions","IconButton","background","IoRemoveCircle","IoRemoveCircleOutline","IoReload","flip","IoPause","IoPlay","RundownEventProgressBar","timer","useTimer","progress","getProgress","progressBar","width","RundownEventInner","timeEnd","timeStrategy","linkStart","countToEnd","endAction","timerType","title","note","isNext","isRolling","hasTriggers","renderInner","setRenderInner","editorMode","useSessionStorage","sessionKeys","defaultValue","AppMode","Edit","eventIsPlaying","Playback","Play","eventIsPaused","Pause","Fragment","eventTimers","editMode","TimeInputFlow","titleSection","TitleEditor","eventTitle","nextTag","EventBlockPlayback","chipSection","statusElements","eventNote","progressBg","hidden","EventBlockProgressBar","eventStatus","TimerIcon","statusIcon","EndActionIcon","LuArrowDownToLine","active","disabled","IoFlash","action","maybeActiveClasses","EndAction","None","LoadNext","IoPlaySkipForward","PlayNext","IoPlayForward","TimerType","CountUp","IoArrowUp","Clock","IoTime","IoBan","IoArrowDown","formatDelay","delayedStart","max","removeTrailingZero","formatGap","gap","isNextDay","gapString","RundownIndicators","hasGap","hasDelay","indicators","RundownEvent","cue","flag","eventIndex","colour","parent","batchUpdateEvents","clone","groupEntries","swapEvents","selectedEvents","unselect","setSelectedEvents","clearSelectedEvents","useEventSelection","isVisible","setIsVisible","onContextMenu","useContextMenu","size","icon","IoLink","onClick","Array","from","IoUnlink","IoFolder","IoTrash","TbFlagFilled","IoAdd","IoSwapVertical","IoDuplicateOutline","after","binderColours","getAccessibleColour","elementInFocus","document","activeElement","blockElement","closest","contains","useLayoutEffect","observer","IntersectionObserver","entry","isIntersecting","root","threshold","handleRefCurrent","observe","unobserve","isSelected","has","blockClasses","rundownEvent","past","selected","handleFocusClick","button","index","getSelectionMode","selectMode","binder","RundownMilestone","entryId","setSingleEntrySelection","handleUpdate","field","milestone","MilestoneTextInput","initialValue","placeholder","submitHandler","ref","submitCallback","useCallback","onChange","onBlur","onKeyDown","useReactiveTextInput","submitOnEnter","RundownEntry","isOntimeEvent","triggers","length","isOntimeDelay","isOntimeMilestone"],"mappings":"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"}
|