@getontime/cli 4.0.0-beta.5 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/assets/Backstage-ZSqb8OU6.js +2 -0
- package/client/assets/Backstage-ZSqb8OU6.js.br +0 -0
- package/client/assets/Backstage-ZSqb8OU6.js.gz +0 -0
- package/client/assets/Backstage-ZSqb8OU6.js.map +1 -0
- package/client/assets/Countdown-DVRZbeRP.js +2 -0
- package/client/assets/Countdown-DVRZbeRP.js.br +0 -0
- package/client/assets/Countdown-DVRZbeRP.js.gz +0 -0
- package/client/assets/{Countdown-BaaR4j9x.js.map → Countdown-DVRZbeRP.js.map} +1 -1
- package/client/assets/CustomTranslationModal-D_Cy0d_H.js +2 -0
- package/client/assets/CustomTranslationModal-D_Cy0d_H.js.br +0 -0
- package/client/assets/CustomTranslationModal-D_Cy0d_H.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-CcNNjbmZ.js.map → CustomTranslationModal-D_Cy0d_H.js.map} +1 -1
- package/client/assets/{DelayIndicator-DXDACqpc.js → DelayIndicator-B_JKLKYW.js} +2 -2
- package/client/assets/DelayIndicator-B_JKLKYW.js.br +0 -0
- package/client/assets/DelayIndicator-B_JKLKYW.js.gz +0 -0
- package/client/assets/{DelayIndicator-DXDACqpc.js.map → DelayIndicator-B_JKLKYW.js.map} +1 -1
- package/client/assets/{EditorFeatureWrapper-CX6wzTmM.js → EditorFeatureWrapper-DzBxDvRn.js} +2 -2
- package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-CX6wzTmM.js.map → EditorFeatureWrapper-DzBxDvRn.js.map} +1 -1
- package/client/assets/{EditorUtils-DxjFOwpn.js → EditorUtils-De0umjb-.js} +2 -2
- package/client/assets/EditorUtils-De0umjb-.js.br +0 -0
- package/client/assets/EditorUtils-De0umjb-.js.gz +0 -0
- package/client/assets/{EditorUtils-DxjFOwpn.js.map → EditorUtils-De0umjb-.js.map} +1 -1
- package/client/assets/{Empty-DiBXyIA8.js → Empty-BYF0tVRk.js} +2 -2
- package/client/assets/Empty-BYF0tVRk.js.br +2 -0
- package/client/assets/Empty-BYF0tVRk.js.gz +0 -0
- package/client/assets/{Empty-DiBXyIA8.js.map → Empty-BYF0tVRk.js.map} +1 -1
- package/client/assets/{EmptyPage-X6EO1Y5W.js → EmptyPage-DYH2bswA.js} +2 -2
- package/client/assets/EmptyPage-DYH2bswA.js.br +0 -0
- package/client/assets/EmptyPage-DYH2bswA.js.gz +0 -0
- package/client/assets/{EmptyPage-X6EO1Y5W.js.map → EmptyPage-DYH2bswA.js.map} +1 -1
- package/client/assets/{FollowButton-Cr-HA2-6.js → FollowButton-DyWsvyFF.js} +2 -2
- package/client/assets/FollowButton-DyWsvyFF.js.br +0 -0
- package/client/assets/FollowButton-DyWsvyFF.js.gz +0 -0
- package/client/assets/{FollowButton-Cr-HA2-6.js.map → FollowButton-DyWsvyFF.js.map} +1 -1
- package/client/assets/{MessageControlExport-VUkIayAJ.js → MessageControlExport-yLGU2dMq.js} +2 -2
- package/client/assets/MessageControlExport-yLGU2dMq.js.br +0 -0
- package/client/assets/MessageControlExport-yLGU2dMq.js.gz +0 -0
- package/client/assets/{MessageControlExport-VUkIayAJ.js.map → MessageControlExport-yLGU2dMq.js.map} +1 -1
- package/client/assets/MilestoneEditor-GkzJ-h1C.js +2 -0
- package/client/assets/MilestoneEditor-GkzJ-h1C.js.br +0 -0
- package/client/assets/MilestoneEditor-GkzJ-h1C.js.gz +0 -0
- package/client/assets/{MilestoneEditor-Da8oxrHI.js.map → MilestoneEditor-GkzJ-h1C.js.map} +1 -1
- package/client/assets/Modal-BKL-5GzU.js +2 -0
- package/client/assets/Modal-BKL-5GzU.js.br +0 -0
- package/client/assets/Modal-BKL-5GzU.js.gz +0 -0
- package/client/assets/Modal-BKL-5GzU.js.map +1 -0
- package/client/assets/Modal-BgJx3SNK.css +1 -0
- package/client/assets/Modal-BgJx3SNK.css.br +0 -0
- package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
- package/client/assets/{MultiPartProgressBar-mGPuP1Wd.js → MultiPartProgressBar-BITERKS0.js} +2 -2
- package/client/assets/MultiPartProgressBar-BITERKS0.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BITERKS0.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-mGPuP1Wd.js.map → MultiPartProgressBar-BITERKS0.js.map} +1 -1
- package/client/assets/OperatorExport-DMZ6eQfT.js +2 -0
- package/client/assets/OperatorExport-DMZ6eQfT.js.br +0 -0
- package/client/assets/OperatorExport-DMZ6eQfT.js.gz +0 -0
- package/client/assets/OperatorExport-DMZ6eQfT.js.map +1 -0
- package/client/assets/{OverviewWrapper-BMuW_wiO.js → OverviewWrapper-riM6vPno.js} +2 -2
- package/client/assets/OverviewWrapper-riM6vPno.js.br +0 -0
- package/client/assets/OverviewWrapper-riM6vPno.js.gz +0 -0
- package/client/assets/{OverviewWrapper-BMuW_wiO.js.map → OverviewWrapper-riM6vPno.js.map} +1 -1
- package/client/assets/{ProjectInfo-BYi1lzPk.js → ProjectInfo-DxtMq70a.js} +2 -2
- package/client/assets/ProjectInfo-DxtMq70a.js.br +0 -0
- package/client/assets/ProjectInfo-DxtMq70a.js.gz +0 -0
- package/client/assets/{ProjectInfo-BYi1lzPk.js.map → ProjectInfo-DxtMq70a.js.map} +1 -1
- package/client/assets/{ProtectRoute-DnUCrlh6.js → ProtectRoute-p1fmtLeu.js} +2 -2
- package/client/assets/ProtectRoute-p1fmtLeu.js.br +0 -0
- package/client/assets/ProtectRoute-p1fmtLeu.js.gz +0 -0
- package/client/assets/{ProtectRoute-DnUCrlh6.js.map → ProtectRoute-p1fmtLeu.js.map} +1 -1
- package/client/assets/ProtectedCuesheet-CvRnqT0z.js +2 -0
- package/client/assets/ProtectedCuesheet-CvRnqT0z.js.br +0 -0
- package/client/assets/ProtectedCuesheet-CvRnqT0z.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-CvRnqT0z.js.map +1 -0
- package/client/assets/ProtectedEditor-BoiAT_IR.css +1 -0
- package/client/assets/ProtectedEditor-BoiAT_IR.css.br +0 -0
- package/client/assets/ProtectedEditor-BoiAT_IR.css.gz +0 -0
- package/client/assets/ProtectedEditor-D4UXj1xL.js +3 -0
- package/client/assets/ProtectedEditor-D4UXj1xL.js.br +0 -0
- package/client/assets/ProtectedEditor-D4UXj1xL.js.gz +0 -0
- package/client/assets/ProtectedEditor-D4UXj1xL.js.map +1 -0
- package/client/assets/RundownEntry-B1dSz1wu.js +2 -0
- package/client/assets/RundownEntry-B1dSz1wu.js.br +0 -0
- package/client/assets/RundownEntry-B1dSz1wu.js.gz +0 -0
- package/client/assets/{RundownEntry-Dl4Cb_pZ.js.map → RundownEntry-B1dSz1wu.js.map} +1 -1
- package/client/assets/RundownExport-WjLpncYT.js +3 -0
- package/client/assets/RundownExport-WjLpncYT.js.br +0 -0
- package/client/assets/RundownExport-WjLpncYT.js.gz +0 -0
- package/client/assets/{RundownExport-BPDLhvsM.js.map → RundownExport-WjLpncYT.js.map} +1 -1
- package/client/assets/{Select-CUjlJirY.js → Select-niU9Razm.js} +2 -2
- package/client/assets/Select-niU9Razm.js.br +0 -0
- package/client/assets/Select-niU9Razm.js.gz +0 -0
- package/client/assets/{Select-CUjlJirY.js.map → Select-niU9Razm.js.map} +1 -1
- package/client/assets/Studio-CWdJq4bx.js +2 -0
- package/client/assets/Studio-CWdJq4bx.js.br +0 -0
- package/client/assets/Studio-CWdJq4bx.js.gz +0 -0
- package/client/assets/{Studio-BLCIas53.js.map → Studio-CWdJq4bx.js.map} +1 -1
- package/client/assets/{StyleEditor-DTNiR-0P.js → StyleEditor-BIFjHsgD.js} +2 -2
- package/client/assets/StyleEditor-BIFjHsgD.js.br +0 -0
- package/client/assets/StyleEditor-BIFjHsgD.js.gz +0 -0
- package/client/assets/{StyleEditor-DTNiR-0P.js.map → StyleEditor-BIFjHsgD.js.map} +1 -1
- package/client/assets/SuperscriptTime-DCTyUARx.js +2 -0
- package/client/assets/SuperscriptTime-DCTyUARx.js.br +0 -0
- package/client/assets/SuperscriptTime-DCTyUARx.js.gz +0 -0
- package/client/assets/SuperscriptTime-DCTyUARx.js.map +1 -0
- package/client/assets/TimeElements-DBVGVx71.js +2 -0
- package/client/assets/TimeElements-DBVGVx71.js.br +0 -0
- package/client/assets/TimeElements-DBVGVx71.js.gz +0 -0
- package/client/assets/{TimeElements-rlwX9Mgy.js.map → TimeElements-DBVGVx71.js.map} +1 -1
- package/client/assets/{TimeInput-C0_Nl63x.js → TimeInput-wQ67FbW6.js} +2 -2
- package/client/assets/TimeInput-wQ67FbW6.js.br +0 -0
- package/client/assets/TimeInput-wQ67FbW6.js.gz +0 -0
- package/client/assets/{TimeInput-C0_Nl63x.js.map → TimeInput-wQ67FbW6.js.map} +1 -1
- package/client/assets/TimelinePage-DZefE2vQ.js +2 -0
- package/client/assets/TimelinePage-DZefE2vQ.js.br +0 -0
- package/client/assets/TimelinePage-DZefE2vQ.js.gz +0 -0
- package/client/assets/{TimelinePage-BC-pnISF.js.map → TimelinePage-DZefE2vQ.js.map} +1 -1
- package/client/assets/Timer-Bs450x86.js +2 -0
- package/client/assets/Timer-Bs450x86.js.br +0 -0
- package/client/assets/Timer-Bs450x86.js.gz +0 -0
- package/client/assets/Timer-Bs450x86.js.map +1 -0
- package/client/assets/{TimerControlExport-C_Jbwxog.js → TimerControlExport-C1C_vBX4.js} +2 -2
- package/client/assets/TimerControlExport-C1C_vBX4.js.br +0 -0
- package/client/assets/TimerControlExport-C1C_vBX4.js.gz +0 -0
- package/client/assets/{TimerControlExport-C_Jbwxog.js.map → TimerControlExport-C1C_vBX4.js.map} +1 -1
- package/client/assets/{TitleCard-C-Tw72nZ.js → TitleCard-B4N-kCM3.js} +2 -2
- package/client/assets/TitleCard-B4N-kCM3.js.br +0 -0
- package/client/assets/TitleCard-B4N-kCM3.js.gz +0 -0
- package/client/assets/{TitleCard-C-Tw72nZ.js.map → TitleCard-B4N-kCM3.js.map} +1 -1
- package/client/assets/{Tooltip-BZrLdTBU.js → Tooltip-DJ8Y4CO4.js} +2 -2
- package/client/assets/Tooltip-DJ8Y4CO4.js.br +0 -0
- package/client/assets/Tooltip-DJ8Y4CO4.js.gz +0 -0
- package/client/assets/{Tooltip-BZrLdTBU.js.map → Tooltip-DJ8Y4CO4.js.map} +1 -1
- package/client/assets/{ViewLogo-CdsW41HC.js → ViewLogo-Dd60EREE.js} +2 -2
- package/client/assets/ViewLogo-Dd60EREE.js.br +0 -0
- package/client/assets/ViewLogo-Dd60EREE.js.gz +0 -0
- package/client/assets/{ViewLogo-CdsW41HC.js.map → ViewLogo-Dd60EREE.js.map} +1 -1
- package/client/assets/{ViewParamsEditor-kNKEOAwm.css → ViewParamsEditor-1Ok39npF.css} +1 -1
- package/client/assets/ViewParamsEditor-1Ok39npF.css.br +0 -0
- package/client/assets/ViewParamsEditor-1Ok39npF.css.gz +0 -0
- package/client/assets/{ViewParamsEditor-YoYxps2g.js → ViewParamsEditor-BWEYbq_S.js} +2 -2
- package/client/assets/ViewParamsEditor-BWEYbq_S.js.br +0 -0
- package/client/assets/ViewParamsEditor-BWEYbq_S.js.gz +0 -0
- package/client/assets/{ViewParamsEditor-YoYxps2g.js.map → ViewParamsEditor-BWEYbq_S.js.map} +1 -1
- package/client/assets/{dateConfig-CqC6Ta_8.js → dateConfig-8rhb0Dbh.js} +2 -2
- package/client/assets/dateConfig-8rhb0Dbh.js.br +0 -0
- package/client/assets/dateConfig-8rhb0Dbh.js.gz +0 -0
- package/client/assets/{dateConfig-CqC6Ta_8.js.map → dateConfig-8rhb0Dbh.js.map} +1 -1
- package/client/assets/{editorSettings-CL1TjKzU.js → editorSettings-LMnfWux6.js} +2 -2
- package/client/assets/editorSettings-LMnfWux6.js.br +0 -0
- package/client/assets/editorSettings-LMnfWux6.js.gz +0 -0
- package/client/assets/{editorSettings-CL1TjKzU.js.map → editorSettings-LMnfWux6.js.map} +1 -1
- package/client/assets/{getProgress-Dh-Yy44B.js → getProgress-CyJTu6f5.js} +2 -2
- package/client/assets/getProgress-CyJTu6f5.js.br +0 -0
- package/client/assets/getProgress-CyJTu6f5.js.gz +0 -0
- package/client/assets/{getProgress-Dh-Yy44B.js.map → getProgress-CyJTu6f5.js.map} +1 -1
- package/client/assets/index-5QAOtSTh.js +3 -0
- package/client/assets/index-5QAOtSTh.js.br +0 -0
- package/client/assets/index-5QAOtSTh.js.gz +0 -0
- package/client/assets/index-5QAOtSTh.js.map +1 -0
- package/client/assets/{index-pvMSlFrO.css → index-De0uf0Ta.css} +1 -1
- package/client/assets/index-De0uf0Ta.css.br +0 -0
- package/client/assets/index-De0uf0Ta.css.gz +0 -0
- package/client/assets/{offset-BnfjZ6JI.js → offset-CLDSqOP5.js} +2 -2
- package/client/assets/offset-CLDSqOP5.js.br +0 -0
- package/client/assets/offset-CLDSqOP5.js.gz +0 -0
- package/client/assets/{offset-BnfjZ6JI.js.map → offset-CLDSqOP5.js.map} +1 -1
- package/client/assets/{parseUserTime-DNXIMX9s.js → parseUserTime-CCDHpp7D.js} +2 -2
- package/client/assets/parseUserTime-CCDHpp7D.js.br +0 -0
- package/client/assets/parseUserTime-CCDHpp7D.js.gz +0 -0
- package/client/assets/{parseUserTime-DNXIMX9s.js.map → parseUserTime-CCDHpp7D.js.map} +1 -1
- package/client/assets/{playbackstate-DzSEaiNW.js → playbackstate-6lBh6omZ.js} +2 -2
- package/client/assets/playbackstate-6lBh6omZ.js.br +0 -0
- package/client/assets/playbackstate-6lBh6omZ.js.gz +0 -0
- package/client/assets/{playbackstate-DzSEaiNW.js.map → playbackstate-6lBh6omZ.js.map} +1 -1
- package/client/assets/{presentation.utils-BfcniGcl.js → presentation.utils-BUIuV_2e.js} +2 -2
- package/client/assets/presentation.utils-BUIuV_2e.js.br +0 -0
- package/client/assets/presentation.utils-BUIuV_2e.js.gz +0 -0
- package/client/assets/{presentation.utils-BfcniGcl.js.map → presentation.utils-BUIuV_2e.js.map} +1 -1
- package/client/assets/{rundownUtils-CPBsEZ2m.js → rundownUtils-Cnd2prRX.js} +2 -2
- package/client/assets/rundownUtils-Cnd2prRX.js.br +0 -0
- package/client/assets/rundownUtils-Cnd2prRX.js.gz +0 -0
- package/client/assets/{rundownUtils-CPBsEZ2m.js.map → rundownUtils-Cnd2prRX.js.map} +1 -1
- package/client/assets/{useCustomFields-DY13Ir96.js → useCustomFields-BuxKsqGS.js} +2 -2
- package/client/assets/useCustomFields-BuxKsqGS.js.br +0 -0
- package/client/assets/useCustomFields-BuxKsqGS.js.gz +0 -0
- package/client/assets/{useCustomFields-DY13Ir96.js.map → useCustomFields-BuxKsqGS.js.map} +1 -1
- package/client/assets/{useFollowComponent-C42-1XCu.js → useFollowComponent-iGQv4zoS.js} +2 -2
- package/client/assets/useFollowComponent-iGQv4zoS.js.br +0 -0
- package/client/assets/useFollowComponent-iGQv4zoS.js.gz +0 -0
- package/client/assets/{useFollowComponent-C42-1XCu.js.map → useFollowComponent-iGQv4zoS.js.map} +1 -1
- package/client/assets/{useProjectData-BF2F6qPB.js → useProjectData-CetvEK9E.js} +2 -2
- package/client/assets/useProjectData-CetvEK9E.js.br +0 -0
- package/client/assets/useProjectData-CetvEK9E.js.gz +0 -0
- package/client/assets/{useProjectData-BF2F6qPB.js.map → useProjectData-CetvEK9E.js.map} +1 -1
- package/client/assets/useReport-PEFRsOhF.js +2 -0
- package/client/assets/useReport-PEFRsOhF.js.br +0 -0
- package/client/assets/useReport-PEFRsOhF.js.gz +0 -0
- package/client/assets/{useReport-DPqY9XXp.js.map → useReport-PEFRsOhF.js.map} +1 -1
- package/client/assets/{useRundown-uuXixjnX.js → useRundown-D8CYATNi.js} +2 -2
- package/client/assets/useRundown-D8CYATNi.js.br +0 -0
- package/client/assets/useRundown-D8CYATNi.js.gz +0 -0
- package/client/assets/{useRundown-uuXixjnX.js.map → useRundown-D8CYATNi.js.map} +1 -1
- package/client/assets/{useWindowTitle-BQ1kqXfk.js → useWindowTitle-b5fN0StF.js} +2 -2
- package/client/assets/useWindowTitle-b5fN0StF.js.br +0 -0
- package/client/assets/useWindowTitle-b5fN0StF.js.gz +0 -0
- package/client/assets/{useWindowTitle-BQ1kqXfk.js.map → useWindowTitle-b5fN0StF.js.map} +1 -1
- package/client/assets/{validateEvent-Cy-jEiwB.js → validateEvent-Bvgk1E-Y.js} +2 -2
- package/client/assets/validateEvent-Bvgk1E-Y.js.br +0 -0
- package/client/assets/validateEvent-Bvgk1E-Y.js.gz +0 -0
- package/client/assets/{validateEvent-Cy-jEiwB.js.map → validateEvent-Bvgk1E-Y.js.map} +1 -1
- package/client/assets/{vendor-Cnciq4o_.js → vendor-Cu5xgv5K.js} +3 -3
- package/client/assets/vendor-Cu5xgv5K.js.br +0 -0
- package/client/assets/vendor-Cu5xgv5K.js.gz +0 -0
- package/client/assets/{vendor-Cnciq4o_.js.map → vendor-Cu5xgv5K.js.map} +1 -1
- package/client/assets/{common.options-p5f_zJ2-.js → viewLoader.utils-BPhACxyG.js} +2 -2
- package/client/assets/viewLoader.utils-BPhACxyG.js.br +0 -0
- package/client/assets/viewLoader.utils-BPhACxyG.js.gz +0 -0
- package/client/assets/viewLoader.utils-BPhACxyG.js.map +1 -0
- package/client/index.html +3 -3
- package/package.json +1 -1
- package/server/index.cjs +103 -103
- package/client/assets/Backstage-B-_iTDRg.js +0 -2
- package/client/assets/Backstage-B-_iTDRg.js.br +0 -0
- package/client/assets/Backstage-B-_iTDRg.js.gz +0 -0
- package/client/assets/Backstage-B-_iTDRg.js.map +0 -1
- package/client/assets/Countdown-BaaR4j9x.js +0 -2
- package/client/assets/Countdown-BaaR4j9x.js.br +0 -0
- package/client/assets/Countdown-BaaR4j9x.js.gz +0 -0
- package/client/assets/CustomTranslationModal-CcNNjbmZ.js +0 -2
- package/client/assets/CustomTranslationModal-CcNNjbmZ.js.br +0 -0
- package/client/assets/CustomTranslationModal-CcNNjbmZ.js.gz +0 -0
- package/client/assets/DelayIndicator-DXDACqpc.js.br +0 -0
- package/client/assets/DelayIndicator-DXDACqpc.js.gz +0 -0
- package/client/assets/DropdownMenu-Bn0VHzKx.js +0 -2
- package/client/assets/DropdownMenu-Bn0VHzKx.js.br +0 -0
- package/client/assets/DropdownMenu-Bn0VHzKx.js.gz +0 -0
- package/client/assets/DropdownMenu-Bn0VHzKx.js.map +0 -1
- package/client/assets/DropdownMenu-ByBDeesm.css +0 -1
- package/client/assets/DropdownMenu-ByBDeesm.css.br +0 -0
- package/client/assets/DropdownMenu-ByBDeesm.css.gz +0 -0
- package/client/assets/EditorFeatureWrapper-CX6wzTmM.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-CX6wzTmM.js.gz +0 -0
- package/client/assets/EditorUtils-DxjFOwpn.js.br +0 -0
- package/client/assets/EditorUtils-DxjFOwpn.js.gz +0 -0
- package/client/assets/Empty-DiBXyIA8.js.br +0 -2
- package/client/assets/Empty-DiBXyIA8.js.gz +0 -0
- package/client/assets/EmptyPage-X6EO1Y5W.js.br +0 -0
- package/client/assets/EmptyPage-X6EO1Y5W.js.gz +0 -0
- package/client/assets/FollowButton-Cr-HA2-6.js.br +0 -0
- package/client/assets/FollowButton-Cr-HA2-6.js.gz +0 -0
- package/client/assets/MessageControlExport-VUkIayAJ.js.br +0 -0
- package/client/assets/MessageControlExport-VUkIayAJ.js.gz +0 -0
- package/client/assets/MilestoneEditor-Da8oxrHI.js +0 -2
- package/client/assets/MilestoneEditor-Da8oxrHI.js.br +0 -0
- package/client/assets/MilestoneEditor-Da8oxrHI.js.gz +0 -0
- package/client/assets/MultiPartProgressBar-mGPuP1Wd.js.br +0 -0
- package/client/assets/MultiPartProgressBar-mGPuP1Wd.js.gz +0 -0
- package/client/assets/OperatorExport-BeuWuV6I.js +0 -2
- package/client/assets/OperatorExport-BeuWuV6I.js.br +0 -0
- package/client/assets/OperatorExport-BeuWuV6I.js.gz +0 -0
- package/client/assets/OperatorExport-BeuWuV6I.js.map +0 -1
- package/client/assets/OverviewWrapper-BMuW_wiO.js.br +0 -0
- package/client/assets/OverviewWrapper-BMuW_wiO.js.gz +0 -0
- package/client/assets/ProjectInfo-BYi1lzPk.js.br +0 -0
- package/client/assets/ProjectInfo-BYi1lzPk.js.gz +0 -0
- package/client/assets/ProtectRoute-DnUCrlh6.js.br +0 -0
- package/client/assets/ProtectRoute-DnUCrlh6.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-CQOB7ipQ.js +0 -2
- package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.br +0 -0
- package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-CQOB7ipQ.js.map +0 -1
- package/client/assets/ProtectedEditor-C4beOxz1.css +0 -1
- package/client/assets/ProtectedEditor-C4beOxz1.css.br +0 -0
- package/client/assets/ProtectedEditor-C4beOxz1.css.gz +0 -0
- package/client/assets/ProtectedEditor-KcsoZKKo.js +0 -3
- package/client/assets/ProtectedEditor-KcsoZKKo.js.br +0 -0
- package/client/assets/ProtectedEditor-KcsoZKKo.js.gz +0 -0
- package/client/assets/ProtectedEditor-KcsoZKKo.js.map +0 -1
- package/client/assets/RundownEntry-Dl4Cb_pZ.js +0 -2
- package/client/assets/RundownEntry-Dl4Cb_pZ.js.br +0 -0
- package/client/assets/RundownEntry-Dl4Cb_pZ.js.gz +0 -0
- package/client/assets/RundownExport-BPDLhvsM.js +0 -3
- package/client/assets/RundownExport-BPDLhvsM.js.br +0 -0
- package/client/assets/RundownExport-BPDLhvsM.js.gz +0 -0
- package/client/assets/Select-CUjlJirY.js.br +0 -0
- package/client/assets/Select-CUjlJirY.js.gz +0 -0
- package/client/assets/Studio-BLCIas53.js +0 -2
- package/client/assets/Studio-BLCIas53.js.br +0 -0
- package/client/assets/Studio-BLCIas53.js.gz +0 -0
- package/client/assets/StyleEditor-DTNiR-0P.js.br +0 -0
- package/client/assets/StyleEditor-DTNiR-0P.js.gz +0 -0
- package/client/assets/TimeElements-rlwX9Mgy.js +0 -2
- package/client/assets/TimeElements-rlwX9Mgy.js.br +0 -0
- package/client/assets/TimeElements-rlwX9Mgy.js.gz +0 -0
- package/client/assets/TimeInput-C0_Nl63x.js.br +0 -0
- package/client/assets/TimeInput-C0_Nl63x.js.gz +0 -0
- package/client/assets/TimelinePage-BC-pnISF.js +0 -2
- package/client/assets/TimelinePage-BC-pnISF.js.br +0 -0
- package/client/assets/TimelinePage-BC-pnISF.js.gz +0 -0
- package/client/assets/Timer-DgmA0De-.js +0 -2
- package/client/assets/Timer-DgmA0De-.js.br +0 -0
- package/client/assets/Timer-DgmA0De-.js.gz +0 -0
- package/client/assets/Timer-DgmA0De-.js.map +0 -1
- package/client/assets/TimerControlExport-C_Jbwxog.js.br +0 -0
- package/client/assets/TimerControlExport-C_Jbwxog.js.gz +0 -0
- package/client/assets/TitleCard-C-Tw72nZ.js.br +0 -0
- package/client/assets/TitleCard-C-Tw72nZ.js.gz +0 -0
- package/client/assets/Tooltip-BZrLdTBU.js.br +0 -0
- package/client/assets/Tooltip-BZrLdTBU.js.gz +0 -0
- package/client/assets/ViewLogo-CdsW41HC.js.br +0 -0
- package/client/assets/ViewLogo-CdsW41HC.js.gz +0 -0
- package/client/assets/ViewParamsEditor-YoYxps2g.js.br +0 -0
- package/client/assets/ViewParamsEditor-YoYxps2g.js.gz +0 -0
- package/client/assets/ViewParamsEditor-kNKEOAwm.css.br +0 -0
- package/client/assets/ViewParamsEditor-kNKEOAwm.css.gz +0 -0
- package/client/assets/common.options-p5f_zJ2-.js.br +0 -0
- package/client/assets/common.options-p5f_zJ2-.js.gz +0 -0
- package/client/assets/common.options-p5f_zJ2-.js.map +0 -1
- package/client/assets/dateConfig-CqC6Ta_8.js.br +0 -0
- package/client/assets/dateConfig-CqC6Ta_8.js.gz +0 -0
- package/client/assets/editorSettings-CL1TjKzU.js.br +0 -0
- package/client/assets/editorSettings-CL1TjKzU.js.gz +0 -0
- package/client/assets/getProgress-Dh-Yy44B.js.br +0 -0
- package/client/assets/getProgress-Dh-Yy44B.js.gz +0 -0
- package/client/assets/index-DdPXqLQ6.js +0 -3
- package/client/assets/index-DdPXqLQ6.js.br +0 -0
- package/client/assets/index-DdPXqLQ6.js.gz +0 -0
- package/client/assets/index-DdPXqLQ6.js.map +0 -1
- package/client/assets/index-pvMSlFrO.css.br +0 -0
- package/client/assets/index-pvMSlFrO.css.gz +0 -0
- package/client/assets/offset-BnfjZ6JI.js.br +0 -2
- package/client/assets/offset-BnfjZ6JI.js.gz +0 -0
- package/client/assets/parseUserTime-DNXIMX9s.js.br +0 -0
- package/client/assets/parseUserTime-DNXIMX9s.js.gz +0 -0
- package/client/assets/playbackstate-DzSEaiNW.js.br +0 -0
- package/client/assets/playbackstate-DzSEaiNW.js.gz +0 -0
- package/client/assets/presentation.utils-BfcniGcl.js.br +0 -0
- package/client/assets/presentation.utils-BfcniGcl.js.gz +0 -0
- package/client/assets/rundownUtils-CPBsEZ2m.js.br +0 -0
- package/client/assets/rundownUtils-CPBsEZ2m.js.gz +0 -0
- package/client/assets/useCustomFields-DY13Ir96.js.br +0 -0
- package/client/assets/useCustomFields-DY13Ir96.js.gz +0 -0
- package/client/assets/useFollowComponent-C42-1XCu.js.br +0 -0
- package/client/assets/useFollowComponent-C42-1XCu.js.gz +0 -0
- package/client/assets/useProjectData-BF2F6qPB.js.br +0 -0
- package/client/assets/useProjectData-BF2F6qPB.js.gz +0 -0
- package/client/assets/useReport-DPqY9XXp.js +0 -2
- package/client/assets/useReport-DPqY9XXp.js.br +0 -0
- package/client/assets/useReport-DPqY9XXp.js.gz +0 -0
- package/client/assets/useRundown-uuXixjnX.js.br +0 -0
- package/client/assets/useRundown-uuXixjnX.js.gz +0 -0
- package/client/assets/useWindowTitle-BQ1kqXfk.js.br +0 -0
- package/client/assets/useWindowTitle-BQ1kqXfk.js.gz +0 -0
- package/client/assets/validateEvent-Cy-jEiwB.js.br +0 -0
- package/client/assets/validateEvent-Cy-jEiwB.js.gz +0 -0
- package/client/assets/vendor-Cnciq4o_.js.br +0 -0
- package/client/assets/vendor-Cnciq4o_.js.gz +0 -0
- package/client/assets/viewLoader.utils-CYlNKkLE.js +0 -2
- package/client/assets/viewLoader.utils-CYlNKkLE.js.br +0 -0
- package/client/assets/viewLoader.utils-CYlNKkLE.js.gz +0 -0
- package/client/assets/viewLoader.utils-CYlNKkLE.js.map +0 -1
- /package/client/assets/{viewLoader-Bk5IU6zG.css → SuperscriptTime-Bk5IU6zG.css} +0 -0
- /package/client/assets/{viewLoader-Bk5IU6zG.css.br → SuperscriptTime-Bk5IU6zG.css.br} +0 -0
- /package/client/assets/{viewLoader-Bk5IU6zG.css.gz → SuperscriptTime-Bk5IU6zG.css.gz} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{h as _,j as e,aY as Ue,aZ as Oe,a_ as Ge,aE as W,aF as Z,bg as J,cg as He,t as Ke,f as Ve,bq as qe,ch as Qe,ci as We,bQ as Ze,bM as ie,bN as Je,bS as Xe,cj as Ye,x as et,bR as tt,br as nt,aL as st,bP as rt,ck as ot,am as it,bl as at,cl as lt,ah as Q,aD as ct,T as dt,K as ut,aK as pt}from"./vendor-Cu5xgv5K.js";import{y as A,af as ae,i as R,B as ne,n as mt,be as le,l as X,M as ce,bd as ft,ai as G,bP as D,J as _t,b as se,T as H,bQ as bt,aA as de}from"./index-5QAOtSTh.js";import{i as vt,q as yt,k as gt}from"./useRundown-D8CYATNi.js";import{u as z}from"./dateConfig-8rhb0Dbh.js";import{T as xt,u as ue,a as pe,g as ht,c as jt}from"./RundownExport-WjLpncYT.js";import{p as wt}from"./parseUserTime-CCDHpp7D.js";import{E as K}from"./validateEvent-Bvgk1E-Y.js";import{T as w}from"./Tooltip-DJ8Y4CO4.js";import{a as Et,u as kt}from"./MilestoneEditor-GkzJ-h1C.js";import{u as It}from"./useReport-PEFRsOhF.js";import{i as me}from"./playbackstate-6lBh6omZ.js";import{g as St}from"./getProgress-CyJTu6f5.js";import"./useProjectData-CetvEK9E.js";import"./editorSettings-LMnfWux6.js";import"./rundownUtils-Cnd2prRX.js";import"./EditorUtils-De0umjb-.js";import"./ProtectRoute-p1fmtLeu.js";import"./Modal-BKL-5GzU.js";import"./Empty-BYF0tVRk.js";import"./useFollowComponent-iGQv4zoS.js";import"./offset-CLDSqOP5.js";import"./TimeInput-wQ67FbW6.js";import"./useCustomFields-BuxKsqGS.js";import"./Select-niU9Razm.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new n.Error().stack;t&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[t]="2b9d6ea1-c62f-4b8d-a7ba-8b2d8eb04bfc",n._sentryDebugIdIdentifier="sentry-dbid-2b9d6ea1-c62f-4b8d-a7ba-8b2d8eb04bfc")}catch{}})();function Ct(n){const t=_.useRef(n);t.current=_.useMemo(()=>n,[n]);const s=_.useRef(void 0);return s.current||(s.current=function(...r){return t.current.apply(this,r)}),s.current}const Nt="_radioGroup_1a3sr_17",Tt="_item_1a3sr_23",Rt="_radio_1a3sr_17",zt="_indicator_1a3sr_55",P={radioGroup:Nt,item:Tt,radio:Rt,indicator:zt};function $t({items:n,onValueChange:t,...s}){return e.jsx(Ue,{onValueChange:r=>t==null?void 0:t(r),className:P.radioGroup,...s,children:n.map(r=>e.jsxs("label",{className:P.item,children:[e.jsx(Oe,{value:r.value.toString(),className:P.radio,children:e.jsx(Ge,{className:P.indicator})}),r.label]},r.value.toString()))})}const At="_delayInput_ksn92_17",Dt="_inputField_ksn92_23",re={delayInput:At,inputField:Dt};function Pt(n){const{eventId:t,duration:s}=n,{updateEntry:r}=z(),[l,i]=_.useState(""),c=_.useRef(null),d=_.useRef(!1);_.useEffect(()=>{typeof s>"u"||i(A(s))},[s]);const u=o=>{if(d.current){d.current=!1;return}const g=o.startsWith("-");let v=wt(o);g&&(v=v*-1),v!==s&&(p(v),i(A(v)))},p=o=>{r({id:t,duration:o})},f=()=>{var o;return(o=c.current)==null?void 0:o.select()},m=o=>{var g,v;o.key==="Enter"?((g=c.current)==null||g.blur(),u(o.target.value)):o.key==="Tab"?u(o.target.value):o.key==="Escape"&&(d.current=!0,i(A(s)),(v=c.current)==null||v.blur())},y=o=>{o==="add"?s<0&&p(s*-1):o==="subtract"&&s>0&&p(s*-1)},b=l.startsWith("-")?"subtract":"add";return e.jsxs("div",{className:re.delayInput,children:[e.jsx(ae,{ref:c,"data-testid":"delay-input",className:re.inputField,placeholder:"-",onFocus:f,onChange:o=>i(o.target.value),onBlur:o=>u(o.target.value),onKeyDown:m,value:l,maxLength:9}),e.jsx($t,{onValueChange:y,value:b,items:[{value:"add",label:"Add time"},{value:"subtract",label:"Subtract time"}]})]})}const Mt="_delay_tel5v_17",Lt="_hasCursor_tel5v_34",Ft="_drag_tel5v_38",V={delay:Mt,hasCursor:Lt,drag:Ft};function Bt({data:n,hasCursor:t}){const{applyDelay:s,deleteEntry:r}=z(),l=_.useRef(null),{attributes:i,listeners:c,setNodeRef:d,isDragging:u,transform:p,transition:f}=W({id:n.id,data:{type:"delay"},animateLayoutChanges:()=>!1}),m={zIndex:u?2:"inherit",transform:Z.Translate.toString(p),transition:f};_.useEffect(()=>{var o;t&&((o=l==null?void 0:l.current)==null||o.focus())},[t]);const y=()=>{s(n.id)},b=()=>{r([n.id])};return e.jsxs("div",{className:R([V.delay,t?V.hasCursor:null]),ref:d,style:m,"data-testid":"rundown-delay",children:[e.jsx("span",{className:V.drag,ref:l,...i,...c,children:e.jsx(J,{})}),e.jsx(Pt,{eventId:n.id,duration:n.duration}),e.jsxs(ne,{onClick:y,variant:"ghosted-white",children:[e.jsx(He,{})," Make permanent"]}),e.jsxs(ne,{onClick:b,variant:"ghosted-white",children:[e.jsx(Ke,{}),"Cancel"]})]})}const Ut=Ve(n=>({selectedEventId:null,setSelectedEventId:t=>n(()=>({selectedEventId:t})),clearSelectedEventId:()=>n(()=>({selectedEventId:null}))})),Ot="_blink_1imw4_1",Gt="_fourtyfive_1imw4_13",Ht="_chip_1imw4_17",Kt="_over_1imw4_23",Vt="_under_1imw4_26",qt="_due_1imw4_29",L={blink:Ot,fourtyfive:Gt,chip:Ht,over:Kt,under:Vt,due:qt};function Qt({timeStart:n,delay:t,dayOffset:s,isPast:r,isLoaded:l,className:i,totalGap:c,id:d,duration:u,isLinkedToLoaded:p}){const{playback:f}=mt();if(l)return null;const m=me(f);return!m||r?e.jsx(Zt,{className:i,id:d,duration:u}):m?e.jsx(w,{text:"Expected time until start",render:e.jsx("span",{}),className:i,children:e.jsx(Wt,{timeStart:n,delay:t,dayOffset:s,totalGap:c,isLinkedToLoaded:p})}):null}function Wt({timeStart:n,delay:t,dayOffset:s,totalGap:r,isLinkedToLoaded:l}){const i=ft({timeStart:n,delay:t,dayOffset:s},{totalGap:r,isLinkedToLoaded:l}),c=i<le,d=c?"DUE":`${X(Math.abs(i),i>2*ce)}`;return e.jsx("div",{className:R([L.chip,c&&L.due]),children:d})}function Zt(n){const{className:t,id:s,duration:r}=n,{data:l}=It(),i=l[s],[c,d,u]=_.useMemo(()=>{if(!i)return[null,"none",""];const{startedAt:p,endedAt:f}=i;if(!p||!f)return[null,"none",""];const y=f-p-r,b=Math.abs(y);if(b<le)return["ontime","under","Event finished on time"];const o=y>0,g=A(b),v=`Event ran ${o?"over":"under"} time by ${g}`;return[`${o?"+":"-"}${X(b,b>2*ce)}`,o?"over":"under",v]},[i,r]);return c?e.jsx(w,{text:u,render:e.jsx("span",{}),className:R([L.chip,L[d],t]),children:c==="ontime"?e.jsx(qe,{size:"1.1rem"}):c}):null}const Jt="_blink_t5zwd_1",Xt="_fourtyfive_t5zwd_13",Yt="_rundownEvent_t5zwd_17",en="_loaded_t5zwd_39",tn="_play_t5zwd_42",nn="_roll_t5zwd_47",sn="_pause_t5zwd_52",rn="_selected_t5zwd_57",on="_hasCursor_t5zwd_60",an="_past_t5zwd_63",ln="_skip_t5zwd_63",cn="_timerNote_t5zwd_63",dn="_statusElements_t5zwd_64",un="_eventTitle_t5zwd_65",pn="_eventNote_t5zwd_66",mn="_eventTimers_t5zwd_67",fn="_eventStatus_t5zwd_68",_n="_playbackActions_t5zwd_69",bn="_binder_t5zwd_70",vn="_drag_t5zwd_97",yn="_cue_t5zwd_115",gn="_chipSection_t5zwd_143",xn="_titleSection_t5zwd_147",hn="_nextTag_t5zwd_153",jn="_progressBg_t5zwd_166",wn="_hidden_t5zwd_175",En="_flip_t5zwd_179",kn="_statusIcon_t5zwd_213",In="_active_t5zwd_217",Sn="_disabled_t5zwd_220",a={blink:Jt,fourtyfive:Xt,rundownEvent:Yt,loaded:en,play:tn,roll:nn,pause:sn,selected:rn,hasCursor:on,past:an,skip:ln,timerNote:cn,statusElements:dn,eventTitle:un,eventNote:pn,eventTimers:mn,eventStatus:fn,playbackActions:_n,binder:bn,drag:vn,cue:yn,chipSection:gn,titleSection:xn,nextTag:hn,progressBg:jn,hidden:wn,flip:En,statusIcon:kn,active:In,disabled:Sn},Cn=_.memo(Nn);function Nn({eventId:n,skip:t,isPlaying:s,isPaused:r,loaded:l,disablePlayback:i}){const{updateEntry:c}=z(),d=m=>{m.stopPropagation(),c({id:n,skip:!t})},u=m=>{m.stopPropagation(),s?D.pause():r?D.start():D.startEvent(n)},p=m=>{m.stopPropagation(),D.loadEvent(n)},f=r?{tooltip:"Continue event",backgroundColor:"#339E4E"}:s?{tooltip:"Pause event",backgroundColor:"#c05621"}:{tooltip:"Start event",backgroundColor:void 0};return e.jsxs("div",{className:a.playbackActions,children:[e.jsx(w,{text:"Skip event",render:e.jsx(G,{variant:"subtle-white"}),onClick:d,tabIndex:-1,disabled:l,style:{background:t?"#9A0000":void 0},"aria-label":"Skip event",children:t?e.jsx(Qe,{}):e.jsx(We,{})}),e.jsx(w,{text:"Load event",render:e.jsx(G,{variant:"subtle-white"}),onClick:p,tabIndex:-1,disabled:i,"aria-label":"Load event",children:e.jsx(Ze,{className:a.flip})}),e.jsx(w,{text:f.tooltip,render:e.jsx(G,{variant:"subtle-white"}),onClick:u,tabIndex:-1,disabled:i,style:{backgroundColor:f.backgroundColor},"aria-label":s?"Pause event":"Start event",children:s?e.jsx(Je,{}):e.jsx(ie,{})})]})}const Tn="_progressBar_1glmb_17",Rn={progressBar:Tn};function zn(){const n=_t(),t=St(n.current,n.duration);return e.jsx("div",{className:Rn.progressBar,style:{width:`${t}%`}})}const $n=_.memo(An);function An({eventId:n,timeStart:t,timeEnd:s,duration:r,timeStrategy:l,linkStart:i,countToEnd:c,endAction:d,timerType:u,title:p,note:f,delay:m,isNext:y,skip:b=!1,loaded:o,playback:g,isRolling:v,dayOffset:C,isPast:I,totalGap:N,isLinkedToLoaded:T,hasTriggers:x}){const[h,F]=_.useState(!1);_.useEffect(()=>{F(!0)},[]);const B=g===se.Play,U=g===se.Pause;return h?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:a.eventTimers,children:e.jsx(Et,{eventId:n,timeStart:t,timeEnd:s,duration:r,delay:m,timeStrategy:l,linkStart:i,countToEnd:c})}),e.jsxs("div",{className:a.titleSection,children:[e.jsx(xt,{title:p,entryId:n,placeholder:"Event title",className:a.eventTitle}),y&&e.jsx("span",{className:a.nextTag,children:"UP NEXT"})]}),e.jsx(Cn,{eventId:n,skip:b,isPlaying:B,isPaused:U,loaded:o,disablePlayback:b||v}),!b&&e.jsx(Qt,{className:a.chipSection,id:n,timeStart:t,delay:m,dayOffset:C,isLinkedToLoaded:T,isPast:I,isLoaded:o,totalGap:N,duration:r}),e.jsxs("div",{className:a.statusElements,id:"entry-status","data-timertype":u,children:[e.jsx("span",{className:a.eventNote,children:f}),e.jsx("div",{className:o?a.progressBg:`${a.progressBg} ${a.hidden}`,children:o&&e.jsx(zn,{})}),e.jsxs("div",{className:a.eventStatus,tabIndex:-1,children:[e.jsx(w,{text:`Time type: ${u}`,render:e.jsx("span",{}),children:e.jsx(Pn,{type:u,className:a.statusIcon})}),e.jsx(w,{text:`End action: ${d}`,render:e.jsx("span",{}),children:e.jsx(Dn,{action:d,className:a.statusIcon})}),e.jsx(w,{text:`${c?"Count to End":"Count duration"}`,render:e.jsx("span",{}),children:e.jsx(Xe,{className:`${a.statusIcon} ${c?a.active:a.disabled}`})}),e.jsx(w,{text:"Event has Triggers",render:e.jsx("span",{}),children:e.jsx(Ye,{className:`${a.statusIcon} ${x?a.active:a.disabled}`})})]})]})]}):null}function Dn(n){const{action:t,className:s}=n,r=R([t!==K.None&&a.active,s]);return t===K.LoadNext?e.jsx(rt,{className:r}):t===K.PlayNext?e.jsx(ot,{className:r}):e.jsx(ie,{className:s})}function Pn(n){const{type:t,className:s}=n;return t===H.CountUp?e.jsx(et,{className:s}):t===H.Clock?e.jsx(tt,{className:s}):t===H.None?e.jsx(nt,{className:s}):e.jsx(st,{className:s})}function Mn(n,t){if(!t)return;const s=Math.max(0,n+t);return`New start ${bt(A(s))}`}function Ln(n,t){if(n===0)return t?"(next day)":void 0;const s=X(Math.abs(n),!1);return`${n<0?"Overlap":"Gap"} ${s}${t?" (next day)":""}`}const Fn="_indicators_duajo_18",Bn="_delay_duajo_29",Un="_gap_duajo_36",q={indicators:Fn,delay:Bn,gap:Un};function On({timeStart:n,delay:t,gap:s,isNextDay:r}){const l=Ln(s,r),i=Mn(n,t);return e.jsxs("div",{className:q.indicators,children:[i&&e.jsx("div",{className:q.delay,children:i}),l&&e.jsx("div",{className:q.gap,children:l})]})}function Gn({eventId:n,cue:t,timeStart:s,timeEnd:r,duration:l,timeStrategy:i,linkStart:c,flag:d,countToEnd:u,eventIndex:p,endAction:f,timerType:m,title:y,note:b,delay:o,colour:g,isPast:v,isNext:C,skip:I=!1,parent:N,loaded:T,hasCursor:x,playback:h,isRolling:F,gap:B,isNextDay:U,dayOffset:fe,totalGap:_e,isLinkedToLoaded:be,hasTriggers:ve,createCloneEvent:ye}){const{selectedEventId:$,setSelectedEventId:ge,clearSelectedEventId:xe}=Ut(),{updateEntry:he,batchUpdateEvents:Y,deleteEntry:ee,groupEntries:je,swapEvents:we}=z(),{selectedEvents:S,unselect:Ee,setSelectedEvents:ke,clearSelectedEvents:te}=ue(),E=_.useRef(null),[Ie,Se]=_.useState(!1),[Ce]=pe(S.size>1?[{type:"item",label:"Link to previous",icon:it,onClick:()=>{Y({linkStart:!0},Array.from(S))}},{type:"item",label:"Unlink from previous",icon:at,onClick:()=>{Y({linkStart:!1},Array.from(S))}},{type:"divider"},{type:"item",label:"Group",icon:lt,onClick:()=>{je(Array.from(S)),te()},disabled:N!==null},{type:"divider"},{type:"item",label:"Delete",icon:Q,onClick:()=>{te(),ee(Array.from(S))}}]:[{type:"item",label:d?"Remove flag":"Add flag",icon:ct,onClick:()=>{he({id:n,flag:!d})}},{type:"divider"},{type:"item",label:"Add to swap",icon:dt,onClick:()=>ge(n)},{type:"item",label:`Swap this event with ${$??""}`,icon:ut,onClick:()=>{$&&(we($,n),xe())},disabled:$==null||$===n},{type:"item",label:"Clone",icon:pt,onClick:ye},{type:"divider"},{type:"item",label:"Delete",icon:Q,onClick:()=>{ee([n]),Ee(n)}}]),{isDragging:Ne,attributes:Te,listeners:Re,setNodeRef:ze,transform:$e,transition:Ae}=W({id:n,data:{type:"event",parent:N},animateLayoutChanges:()=>!1}),De={zIndex:Ne?2:"inherit",transform:Z.Translate.toString($e),transition:Ae},Pe=g&&de(g);_.useEffect(()=>{if(!x||(E==null?void 0:E.current)==null)return;const k=document.activeElement,j=E.current.closest("#event-group");j&&!j.contains(k)&&E.current.focus()},[x]),_.useLayoutEffect(()=>{const k=new IntersectionObserver(([O])=>{O.isIntersecting&&Se(!0)},{root:null,threshold:1}),j=E.current;return j&&k.observe(j),()=>{j&&k.unobserve(j)}},[E]);const Me=S.has(n),Le=R([a.rundownEvent,I?a.skip:null,v?a.past:null,T?a.loaded:null,h?a[h]:null,Me?a.selected:null,x?a.hasCursor:null]),Fe=k=>{if(k.stopPropagation(),S.size>1&&k.button===2)return;const j=p-1,O=ht(k);ke({id:n,index:j,selectMode:O})},Be=h?me(h):!1;return e.jsxs("div",{className:Le,ref:ze,style:De,onClick:Fe,onContextMenu:Ce,"data-testid":"rundown-event",...Be?{"data-running":!0}:{},children:[e.jsx(On,{timeStart:s,delay:o,gap:B,isNextDay:U}),e.jsxs("div",{className:a.binder,style:{...Pe},tabIndex:-1,children:[e.jsx("span",{className:a.drag,ref:E,...Te,...Re,children:e.jsx(J,{})}),e.jsx("span",{className:a.cue,children:t})]}),Ie&&e.jsx($n,{timeStart:s,timeEnd:r,duration:l,linkStart:c,countToEnd:u,timeStrategy:i,eventId:n,eventIndex:p,endAction:f,timerType:m,title:y,note:b,delay:o,isNext:C,skip:I,loaded:T,playback:h,isRolling:F,dayOffset:fe,isPast:v,totalGap:_e,isLinkedToLoaded:be,hasTriggers:ve})]})}const Hn="_milestone_102sw_17",Kn="_hasCursor_102sw_35",Vn="_binder_102sw_39",qn="_drag_102sw_47",M={milestone:Hn,hasCursor:Kn,binder:Vn,drag:qn};function Qn({colour:n,cue:t,entryId:s,hasCursor:r,title:l}){const i=_.useRef(null),{updateEntry:c,deleteEntry:d}=z(),{selectedEvents:u,setSingleEntrySelection:p}=ue(),[f]=pe([{type:"item",label:"Delete",icon:Q,onClick:()=>d([s])}]),{attributes:m,listeners:y,setNodeRef:b,isDragging:o,transform:g,transition:v}=W({id:s,data:{type:"milestone"},animateLayoutChanges:()=>!1}),C=x=>{x.stopPropagation(),!(u.size>1&&x.button===2)&&p({id:s})},I=(x,h)=>{c({id:s,[x]:h})},N={zIndex:o?2:"inherit",transform:Z.Translate.toString(g),transition:v},T=n&&de(n);return e.jsxs("div",{className:R([M.milestone,r?M.hasCursor:null]),ref:b,onClick:C,onContextMenu:f,style:N,"data-testid":"rundown-milestone",children:[e.jsx("div",{className:M.binder,style:{...T},children:e.jsx("span",{className:M.drag,ref:i,...m,...y,children:e.jsx(J,{})})}),e.jsx(oe,{field:"cue",initialValue:t,placeholder:"Cue",submitHandler:I}),e.jsx(oe,{field:"title",initialValue:l,placeholder:"Title",submitHandler:I})]})}function oe({field:n,initialValue:t,placeholder:s,submitHandler:r}){const l=_.useRef(null),i=_.useCallback(f=>r(n,f),[n,r]),{value:c,onChange:d,onBlur:u,onKeyDown:p}=kt(t,i,l,{submitOnEnter:!0});return e.jsx(ae,{id:n,ref:l,fluid:!0,value:c,placeholder:s,onChange:d,onBlur:u,onKeyDown:p})}function gs({isPast:n,data:t,loaded:s,hasCursor:r,isNext:l,playback:i,isRolling:c,eventIndex:d,isNextDay:u,totalGap:p,isLinkedToLoaded:f}){const{addEntry:m}=z(),y=Ct(()=>{const b=jt(t);m(b,{after:t.id})});return vt(t)?e.jsx(Gn,{eventId:t.id,eventIndex:d,cue:t.cue,timeStart:t.timeStart,timeEnd:t.timeEnd,duration:t.duration,timeStrategy:t.timeStrategy,linkStart:t.linkStart,flag:t.flag,countToEnd:t.countToEnd,endAction:t.endAction,timerType:t.timerType,title:t.title,note:t.note,delay:t.delay,colour:t.colour,isPast:n,isNext:l,skip:t.skip,parent:t.parent,loaded:s,hasCursor:r,playback:i,isRolling:c,gap:t.gap,isNextDay:u,dayOffset:t.dayOffset,totalGap:p,isLinkedToLoaded:f,createCloneEvent:y,hasTriggers:t.triggers.length>0}):yt(t)?e.jsx(Bt,{data:t,hasCursor:r}):gt(t)?e.jsx(Qn,{colour:t.colour,cue:t.cue,entryId:t.id,hasCursor:r,title:t.title}):null}export{gs as default};
|
|
2
|
+
//# sourceMappingURL=RundownEntry-B1dSz1wu.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RundownEntry-Dl4Cb_pZ.js","sources":["../../src/common/hooks/useMemoisedFn.ts","../../src/common/components/input/delay-input/BlockRadio.tsx","../../src/common/components/input/delay-input/DelayInput.tsx","../../src/features/rundown/rundown-delay/RundownDelay.tsx","../../src/features/rundown/useEventIdSwapping.ts","../../src/features/rundown/rundown-event/composite/RundownEventChip.tsx","../../src/features/rundown/rundown-event/composite/RundownEventPlayback.tsx","../../src/features/rundown/rundown-event/composite/RundownEventProgressBar.tsx","../../src/features/rundown/rundown-event/RundownEventInner.tsx","../../src/features/rundown/rundown-event/rundownEvent.utils.ts","../../src/features/rundown/rundown-event/RundownIndicators.tsx","../../src/features/rundown/rundown-event/RundownEvent.tsx","../../src/features/rundown/rundown-milestone/RundownMilestone.tsx","../../src/features/rundown/RundownEntry.tsx"],"sourcesContent":["/**\n * Shamelessly from https://ahooks.js.org/hooks/use-memoized-fn/\n * Interesting technique discussed by Dan Abramov\n * https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n */\n\nimport { useMemo, useRef } from 'react';\n\nimport { isDev } from '../../externals';\n\ntype noop = (this: any, ...args: any[]) => any;\n\ntype PickFunction<T extends noop> = (this: ThisParameterType<T>, ...args: Parameters<T>) => ReturnType<T>;\n\nconst isFunction = (value: unknown): value is (...args: any) => any => typeof value === 'function';\n\nexport default function useMemoisedFn<T extends noop>(fn: T) {\n if (isDev) {\n if (!isFunction(fn)) {\n console.error(`useMemoisedFn expected function as parameter, got ${typeof fn}`);\n }\n }\n\n const fnRef = useRef<T>(fn);\n\n // why not write `fnRef.current = fn`?\n // https://github.com/alibaba/hooks/issues/728\n fnRef.current = useMemo(() => fn, [fn]);\n\n const memoizedFn = useRef<PickFunction<T>>(undefined);\n if (!memoizedFn.current) {\n memoizedFn.current = function (this, ...args) {\n return fnRef.current.apply(this, args);\n };\n }\n\n return memoizedFn.current as T;\n}\n","import { Radio } from '@base-ui-components/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui-components/react/radio-group';\n\nimport style from './BlockRadio.module.scss';\n\ninterface BlockRadioProps<T extends string | number | boolean> extends Omit<BaseRadioGroup.Props, 'onValueChange'> {\n items: {\n value: T;\n label: string;\n }[];\n onValueChange?: (value: T) => void;\n}\n\nexport default function BlockRadio<T extends string | number | boolean>({\n items,\n onValueChange,\n ...elementProps\n}: BlockRadioProps<T>) {\n return (\n <BaseRadioGroup\n onValueChange={(value) => onValueChange?.(value as T)}\n className={style.radioGroup}\n {...elementProps}\n >\n {items.map((item) => (\n <label className={style.item} key={item.value.toString()}>\n <Radio.Root value={item.value.toString()} className={style.radio}>\n <Radio.Indicator className={style.indicator} />\n </Radio.Root>\n {item.label}\n </label>\n ))}\n </BaseRadioGroup>\n );\n}\n","import { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { useEntryActions } from '../../../hooks/useEntryAction';\nimport Input from '../input/Input';\n\nimport BlockRadio from './BlockRadio';\n\nimport style from './DelayInput.module.scss';\n\ninterface DelayInputProps {\n eventId: string;\n duration: number;\n}\n\nexport default function DelayInput(props: DelayInputProps) {\n const { eventId, duration } = props;\n const { updateEntry } = useEntryActions();\n\n const [value, setValue] = useState<string>('');\n const inputRef = useRef<HTMLInputElement | null>(null);\n // avoid wrong submit on cancel\n const ignoreChangeRef = useRef(false);\n\n // set internal value on duration change\n useEffect(() => {\n if (typeof duration === 'undefined') {\n return;\n }\n setValue(millisToString(duration));\n }, [duration]);\n\n /**\n * @description Prepare delay value for update\n * @param {string} newValue string to be parsed\n */\n const validateAndSubmit = (newValue: string) => {\n if (ignoreChangeRef.current) {\n ignoreChangeRef.current = false;\n return;\n }\n\n const isNegative = newValue.startsWith('-');\n let newMillis = parseUserTime(newValue);\n\n if (isNegative) {\n newMillis = newMillis * -1;\n }\n\n if (newMillis === duration) {\n return;\n }\n\n submitChange(newMillis);\n setValue(millisToString(newMillis));\n };\n\n const submitChange = (value: number) => {\n updateEntry({\n id: eventId,\n duration: value,\n });\n };\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = () => inputRef.current?.select();\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n validateAndSubmit((event.target as HTMLInputElement).value);\n } else if (event.key === 'Tab') {\n validateAndSubmit((event.target as HTMLInputElement).value);\n } else if (event.key === 'Escape') {\n ignoreChangeRef.current = true;\n setValue(millisToString(duration));\n inputRef.current?.blur();\n }\n };\n\n /**\n * @description handles direction change to delay\n * @param newDirection\n */\n const handleSlipChange = (newDirection: 'add' | 'subtract') => {\n if (newDirection === 'add') {\n // add time\n if (duration < 0) {\n submitChange(duration * -1);\n }\n } else if (newDirection === 'subtract') {\n // subtract time\n if (duration > 0) {\n submitChange(duration * -1);\n }\n }\n };\n\n const checkedOption = value.startsWith('-') ? 'subtract' : 'add';\n\n return (\n <div className={style.delayInput}>\n <Input\n ref={inputRef}\n data-testid='delay-input'\n className={style.inputField}\n placeholder='-'\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={(event) => validateAndSubmit(event.target.value)}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={9}\n />\n <BlockRadio\n onValueChange={handleSlipChange}\n value={checkedOption}\n items={[\n { value: 'add', label: 'Add time' },\n { value: 'subtract', label: 'Subtract time' },\n ]}\n />\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { IoCheckmarkDone, IoClose, IoReorderTwo } from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { OntimeDelay } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport DelayInput from '../../../common/components/input/delay-input/DelayInput';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './RundownDelay.module.scss';\n\ninterface RundownDelayProps {\n data: OntimeDelay;\n hasCursor: boolean;\n}\n\nexport default function RundownDelay({ data, hasCursor }: RundownDelayProps) {\n const { applyDelay, deleteEntry } = useEntryActions();\n const handleRef = useRef<null | HTMLSpanElement>(null);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n isDragging,\n transform,\n transition,\n } = useSortable({\n id: data.id,\n data: {\n type: 'delay',\n },\n animateLayoutChanges: () => false,\n });\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n useEffect(() => {\n if (hasCursor) {\n handleRef?.current?.focus();\n }\n }, [hasCursor]);\n\n const applyDelayHandler = () => {\n applyDelay(data.id);\n };\n\n const cancelDelayHandler = () => {\n deleteEntry([data.id]);\n };\n\n return (\n <div\n className={cx([style.delay, hasCursor ? style.hasCursor : null])}\n ref={setNodeRef}\n style={dragStyle}\n data-testid='rundown-delay'\n >\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n <DelayInput eventId={data.id} duration={data.duration} />\n <Button onClick={applyDelayHandler} variant='ghosted-white'>\n <IoCheckmarkDone /> Make permanent\n </Button>\n <Button onClick={cancelDelayHandler} variant='ghosted-white'>\n <IoClose />\n Cancel\n </Button>\n </div>\n );\n}\n","import { create } from 'zustand';\n\ninterface EventIdSwappingStore {\n selectedEventId: string | null;\n setSelectedEventId: (newEventId: string | null) => void;\n clearSelectedEventId: () => void;\n}\n\nexport const useEventIdSwapping = create<EventIdSwappingStore>((set) => ({\n selectedEventId: null,\n setSelectedEventId: (newEventId) => set(() => ({ selectedEventId: newEventId })),\n clearSelectedEventId: () => set(() => ({ selectedEventId: null })),\n}));\n","import { useMemo } from 'react';\nimport { IoCheckmarkCircle } from 'react-icons/io5';\nimport { isPlaybackActive, MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString } from 'ontime-utils';\n\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { usePlayback } from '../../../../common/hooks/useSocket';\nimport useReport from '../../../../common/hooks-query/useReport';\nimport { cx } from '../../../../common/utils/styleUtils';\nimport { formatDuration, useTimeUntilExpectedStart } from '../../../../common/utils/time';\n\nimport style from './RundownEventChip.module.scss';\n\ninterface RundownEventChipProps {\n id: string;\n timeStart: number;\n delay: number;\n dayOffset: number;\n isPast: boolean;\n isLoaded: boolean;\n className: string;\n totalGap: number;\n duration: number;\n isLinkedToLoaded: boolean;\n}\n\nexport default function RundownEventChip({\n timeStart,\n delay,\n dayOffset,\n isPast,\n isLoaded,\n className,\n totalGap,\n id,\n duration,\n isLinkedToLoaded,\n}: RundownEventChipProps) {\n const { playback } = usePlayback();\n\n if (isLoaded) {\n return null;\n }\n\n const playbackActive = isPlaybackActive(playback);\n\n if (!playbackActive || isPast) {\n return <EventReport className={className} id={id} duration={duration} />;\n }\n\n if (playbackActive) {\n // we extracted the component to avoid unnecessary calculations and re-renders\n return (\n <Tooltip text='Expected time until start' render={<span />} className={className}>\n <EventUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n </Tooltip>\n );\n }\n\n return null;\n}\n\ninterface EventUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\n\nfunction EventUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: EventUntilProps) {\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n const isDue = timeUntil < MILLIS_PER_SECOND;\n\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return <div className={cx([style.chip, isDue && style.due])}>{timeUntilString}</div>;\n}\n\ninterface EventReportProps {\n className: string;\n id: string;\n duration: number;\n}\n\nfunction EventReport(props: EventReportProps) {\n const { className, id, duration } = props;\n const { data } = useReport();\n const currentReport = data[id];\n\n const [value, overUnderStyle, tooltip] = useMemo(() => {\n if (!currentReport) {\n return [null, 'none', ''];\n }\n\n const { startedAt, endedAt } = currentReport;\n if (!startedAt || !endedAt) {\n return [null, 'none', ''];\n }\n\n const actualDuration = endedAt - startedAt;\n const difference = actualDuration - duration;\n const absDifference = Math.abs(difference);\n\n if (absDifference < MILLIS_PER_SECOND) {\n return ['ontime', 'under', 'Event finished on time'];\n }\n\n const isOver = difference > 0;\n\n const fullTimeValue = millisToString(absDifference);\n\n const tooltip = `Event ran ${isOver ? 'over' : 'under'} time by ${fullTimeValue}`;\n\n const value = `${isOver ? '+' : '-'}${formatDuration(absDifference, absDifference > 2 * MILLIS_PER_MINUTE)}`;\n return [value, isOver ? 'over' : 'under', tooltip];\n }, [currentReport, duration]);\n\n if (!value) {\n return null;\n }\n\n return (\n <Tooltip text={tooltip} render={<span />} className={cx([style.chip, style[overUnderStyle], className])}>\n {value === 'ontime' ? <IoCheckmarkCircle size='1.1rem' /> : value}\n </Tooltip>\n );\n}\n","import { memo, MouseEvent } from 'react';\nimport { IoPause, IoPlay, IoReload, IoRemoveCircle, IoRemoveCircleOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { setEventPlayback } from '../../../../common/hooks/useSocket';\n\nimport style from '../RundownEvent.module.scss';\n\ninterface RundownEventPlaybackProps {\n eventId: string;\n skip: boolean;\n isPlaying: boolean;\n isPaused: boolean;\n loaded: boolean;\n disablePlayback: boolean;\n}\n\nexport default memo(RundownEventPlayback);\nfunction RundownEventPlayback({\n eventId,\n skip,\n isPlaying,\n isPaused,\n loaded,\n disablePlayback,\n}: RundownEventPlaybackProps) {\n const { updateEntry } = useEntryActions();\n\n const toggleSkip = (event: MouseEvent) => {\n event.stopPropagation();\n updateEntry({ id: eventId, skip: !skip });\n };\n\n const actionHandler = (event: MouseEvent) => {\n event.stopPropagation();\n // is playing -> pause\n // is paused -> continue\n // otherwise -> start\n if (isPlaying) {\n setEventPlayback.pause();\n } else if (isPaused) {\n setEventPlayback.start();\n } else {\n setEventPlayback.startEvent(eventId);\n }\n };\n\n const load = (event: MouseEvent) => {\n event.stopPropagation();\n setEventPlayback.loadEvent(eventId);\n };\n\n const playButtonStyles: { tooltip: string; backgroundColor: string | undefined } = (() => {\n if (isPaused) {\n return {\n tooltip: 'Continue event',\n backgroundColor: '#339E4E',\n };\n }\n\n if (isPlaying) {\n return {\n tooltip: 'Pause event',\n backgroundColor: '#c05621',\n };\n }\n return {\n tooltip: 'Start event',\n backgroundColor: undefined,\n };\n })();\n\n return (\n <div className={style.playbackActions}>\n <Tooltip\n text='Skip event'\n render={<IconButton variant='subtle-white' />}\n onClick={toggleSkip}\n tabIndex={-1}\n disabled={loaded}\n style={{\n background: skip ? '#9A0000' : undefined,\n }}\n aria-label='Skip event'\n >\n {skip ? <IoRemoveCircle /> : <IoRemoveCircleOutline />}\n </Tooltip>\n\n <Tooltip\n text='Load event'\n render={<IconButton variant='subtle-white' />}\n onClick={load}\n tabIndex={-1}\n disabled={disablePlayback}\n aria-label='Load event'\n >\n <IoReload className={style.flip} />\n </Tooltip>\n\n <Tooltip\n text={playButtonStyles.tooltip}\n render={<IconButton variant='subtle-white' />}\n onClick={actionHandler}\n tabIndex={-1}\n disabled={disablePlayback}\n style={{\n backgroundColor: playButtonStyles.backgroundColor,\n }}\n aria-label={isPlaying ? 'Pause event' : 'Start event'}\n >\n {!isPlaying ? <IoPlay /> : <IoPause />}\n </Tooltip>\n </div>\n );\n}\n","import { useTimer } from '../../../../common/hooks/useSocket';\nimport { getProgress } from '../../../../common/utils/getProgress';\n\nimport style from './RundownEventProgressBar.module.scss';\n\nexport default function RundownEventProgressBar() {\n const timer = useTimer();\n\n const progress = getProgress(timer.current, timer.duration);\n\n return <div className={style.progressBar} style={{ width: `${progress}%` }} />;\n}\n","import { memo, useEffect, useState } from 'react';\nimport {\n IoArrowDown,\n IoArrowUp,\n IoBan,\n IoFlash,\n IoPlay,\n IoPlayForward,\n IoPlaySkipForward,\n IoTime,\n} from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { EndAction, Playback, TimerType, TimeStrategy } from 'ontime-types';\n\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { cx } from '../../../common/utils/styleUtils';\nimport TitleEditor from '../common/TitleEditor';\nimport TimeInputFlow from '../time-input-flow/TimeInputFlow';\n\nimport RundownEventChip from './composite/RundownEventChip';\nimport EventBlockPlayback from './composite/RundownEventPlayback';\nimport EventBlockProgressBar from './composite/RundownEventProgressBar';\n\nimport style from './RundownEvent.module.scss';\n\ninterface RundownEventInnerProps {\n eventId: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n countToEnd: boolean;\n eventIndex: number;\n endAction: EndAction;\n timerType: TimerType;\n title: string;\n note: string;\n delay: number;\n isNext: boolean;\n skip: boolean;\n loaded: boolean;\n playback?: Playback;\n isRolling: boolean;\n dayOffset: number;\n isPast: boolean;\n totalGap: number;\n isLinkedToLoaded: boolean;\n hasTriggers: boolean;\n}\n\nexport default memo(RundownEventInner);\nfunction RundownEventInner({\n eventId,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n countToEnd,\n endAction,\n timerType,\n title,\n note,\n delay,\n isNext,\n skip = false,\n loaded,\n playback,\n isRolling,\n dayOffset,\n isPast,\n totalGap,\n isLinkedToLoaded,\n hasTriggers,\n}: RundownEventInnerProps) {\n const [renderInner, setRenderInner] = useState(false);\n\n useEffect(() => {\n setRenderInner(true);\n }, []);\n\n const eventIsPlaying = playback === Playback.Play;\n const eventIsPaused = playback === Playback.Pause;\n\n const playBtnStyles = { _hover: {} };\n if (!skip && eventIsPlaying) {\n playBtnStyles._hover = { bg: '#c05621' }; // $ontime-paused\n } else if (!skip && !eventIsPlaying) {\n playBtnStyles._hover = {};\n }\n\n return !renderInner ? null : (\n <>\n <div className={style.eventTimers}>\n <TimeInputFlow\n eventId={eventId}\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n delay={delay}\n timeStrategy={timeStrategy}\n linkStart={linkStart}\n countToEnd={countToEnd}\n />\n </div>\n <div className={style.titleSection}>\n <TitleEditor title={title} entryId={eventId} placeholder='Event title' className={style.eventTitle} />\n {isNext && <span className={style.nextTag}>UP NEXT</span>}\n </div>\n <EventBlockPlayback\n eventId={eventId}\n skip={skip}\n isPlaying={eventIsPlaying}\n isPaused={eventIsPaused}\n loaded={loaded}\n disablePlayback={skip || isRolling}\n />\n {!skip && (\n <RundownEventChip\n className={style.chipSection}\n id={eventId}\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isPast={isPast}\n isLoaded={loaded}\n totalGap={totalGap}\n duration={duration}\n />\n )}\n <div className={style.statusElements} id='entry-status' data-timertype={timerType}>\n <span className={style.eventNote}>{note}</span>\n <div className={loaded ? style.progressBg : `${style.progressBg} ${style.hidden}`}>\n {loaded && <EventBlockProgressBar />}\n </div>\n <div className={style.eventStatus} tabIndex={-1}>\n <Tooltip text={`Time type: ${timerType}`} render={<span />}>\n <TimerIcon type={timerType} className={style.statusIcon} />\n </Tooltip>\n <Tooltip text={`End action: ${endAction}`} render={<span />}>\n <EndActionIcon action={endAction} className={style.statusIcon} />\n </Tooltip>\n <Tooltip text={`${countToEnd ? 'Count to End' : 'Count duration'}`} render={<span />}>\n <LuArrowDownToLine className={`${style.statusIcon} ${countToEnd ? style.active : style.disabled}`} />\n </Tooltip>\n <Tooltip text='Event has Triggers' render={<span />}>\n <IoFlash className={`${style.statusIcon} ${hasTriggers ? style.active : style.disabled}`} />\n </Tooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction EndActionIcon(props: { action: EndAction; className: string }) {\n const { action, className } = props;\n const maybeActiveClasses = cx([action !== EndAction.None && style.active, className]);\n\n if (action === EndAction.LoadNext) {\n return <IoPlaySkipForward className={maybeActiveClasses} />;\n }\n if (action === EndAction.PlayNext) {\n return <IoPlayForward className={maybeActiveClasses} />;\n }\n return <IoPlay className={className} />;\n}\n\nfunction TimerIcon(props: { type: TimerType; className: string }) {\n const { type, className } = props;\n if (type === TimerType.CountUp) {\n return <IoArrowUp className={className} />;\n }\n if (type === TimerType.Clock) {\n return <IoTime className={className} />;\n }\n if (type === TimerType.None) {\n return <IoBan className={className} />;\n }\n return <IoArrowDown className={className} />;\n}\n","import { millisToString, removeTrailingZero } from 'ontime-utils';\n\nimport { formatDuration } from '../../../common/utils/time';\n\nexport function formatDelay(timeStart: number, delay: number): string | undefined {\n if (!delay) return;\n\n const delayedStart = Math.max(0, timeStart + delay);\n\n const timeTag = removeTrailingZero(millisToString(delayedStart));\n return `New start ${timeTag}`;\n}\nexport function formatGap(gap: number, isNextDay: boolean) {\n if (gap === 0) {\n if (isNextDay) {\n // We show a next day warning even if there is no gap\n return '(next day)';\n }\n return;\n }\n\n const gapString = formatDuration(Math.abs(gap), false);\n return `${gap < 0 ? 'Overlap' : 'Gap'} ${gapString}${isNextDay ? ' (next day)' : ''}`;\n}\n","import { formatDelay, formatGap } from './rundownEvent.utils';\n\nimport style from './RundownIndicators.module.scss';\n\ninterface RundownIndicatorProps {\n timeStart: number;\n isNextDay: boolean;\n delay: number;\n gap: number;\n}\n\nexport default function RundownIndicators({ timeStart, delay, gap, isNextDay }: RundownIndicatorProps) {\n const hasGap = formatGap(gap, isNextDay);\n const hasDelay = formatDelay(timeStart, delay);\n\n return (\n <div className={style.indicators}>\n {hasDelay && <div className={style.delay}>{hasDelay}</div>}\n {hasGap && <div className={style.gap}>{hasGap}</div>}\n </div>\n );\n}\n","import { MouseEvent, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport {\n IoAdd,\n IoDuplicateOutline,\n IoFolder,\n IoLink,\n IoReorderTwo,\n IoSwapVertical,\n IoTrash,\n IoUnlink,\n} from 'react-icons/io5';\nimport { TbFlagFilled } from 'react-icons/tb';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EndAction, EntryId, Playback, TimerType, TimeStrategy } from 'ontime-types';\nimport { isPlaybackActive } from 'ontime-utils';\n\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { useEventIdSwapping } from '../useEventIdSwapping';\nimport { getSelectionMode, useEventSelection } from '../useEventSelection';\n\nimport RundownEventInner from './RundownEventInner';\nimport RundownIndicators from './RundownIndicators';\n\nimport style from './RundownEvent.module.scss';\n\ninterface RundownEventProps {\n eventId: EntryId;\n cue: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n flag: boolean;\n countToEnd: boolean;\n eventIndex: number;\n endAction: EndAction;\n timerType: TimerType;\n title: string;\n note: string;\n delay: number;\n colour: string;\n isPast: boolean;\n isNext: boolean;\n skip: boolean;\n parent: EntryId | null;\n loaded: boolean;\n hasCursor: boolean;\n playback?: Playback;\n isRolling: boolean;\n gap: number;\n isNextDay: boolean;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n createCloneEvent: () => void;\n hasTriggers: boolean;\n}\n\nexport default function RundownEvent({\n eventId,\n cue,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n flag,\n countToEnd,\n eventIndex,\n endAction,\n timerType,\n title,\n note,\n delay,\n colour,\n isPast,\n isNext,\n skip = false,\n parent,\n loaded,\n hasCursor,\n playback,\n isRolling,\n gap,\n isNextDay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n hasTriggers,\n createCloneEvent,\n}: RundownEventProps) {\n const { selectedEventId, setSelectedEventId, clearSelectedEventId } = useEventIdSwapping();\n const { updateEntry, batchUpdateEvents, deleteEntry, groupEntries, swapEvents } = useEntryActions();\n\n const { selectedEvents, unselect, setSelectedEvents, clearSelectedEvents } = useEventSelection();\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>(\n selectedEvents.size > 1\n ? [\n {\n type: 'item',\n label: 'Link to previous',\n icon: IoLink,\n onClick: () => {\n batchUpdateEvents({ linkStart: true }, Array.from(selectedEvents));\n },\n },\n {\n type: 'item',\n label: 'Unlink from previous',\n icon: IoUnlink,\n onClick: () => {\n batchUpdateEvents({ linkStart: false }, Array.from(selectedEvents));\n },\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Group',\n icon: IoFolder,\n onClick: () => {\n groupEntries(Array.from(selectedEvents));\n clearSelectedEvents();\n },\n disabled: parent !== null,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => {\n clearSelectedEvents();\n deleteEntry(Array.from(selectedEvents));\n },\n },\n ]\n : [\n {\n type: 'item',\n label: flag ? 'Remove flag' : 'Add flag',\n icon: TbFlagFilled,\n onClick: () => {\n updateEntry({ id: eventId, flag: !flag });\n },\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Add to swap',\n icon: IoAdd,\n onClick: () => setSelectedEventId(eventId),\n },\n {\n type: 'item',\n label: `Swap this event with ${selectedEventId ?? ''}`,\n icon: IoSwapVertical,\n onClick: () => {\n if (!selectedEventId) return;\n swapEvents(selectedEventId, eventId);\n clearSelectedEventId();\n },\n disabled: selectedEventId == null || selectedEventId === eventId,\n },\n {\n type: 'item',\n label: 'Clone',\n icon: IoDuplicateOutline,\n onClick: createCloneEvent,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => {\n deleteEntry([eventId]);\n unselect(eventId);\n },\n },\n ],\n );\n\n const {\n isDragging,\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n } = useSortable({\n id: eventId,\n data: {\n type: 'event',\n parent,\n },\n animateLayoutChanges: () => false,\n });\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const binderColours = colour && getAccessibleColour(colour);\n\n // move focus to element if necessary\n useEffect(() => {\n if (!hasCursor || handleRef?.current == null) {\n return;\n }\n\n const elementInFocus = document.activeElement;\n // we know the group is the grandparent of our binder\n const blockElement = handleRef.current.closest('#event-group');\n\n // we only move focus if the block doesnt already contain focus\n if (blockElement && !blockElement.contains(elementInFocus)) {\n handleRef.current.focus();\n }\n }, [hasCursor]);\n\n useLayoutEffect(() => {\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n }\n },\n {\n root: null,\n threshold: 1,\n },\n );\n\n const handleRefCurrent = handleRef.current;\n if (handleRefCurrent) {\n observer.observe(handleRefCurrent);\n }\n\n return () => {\n if (handleRefCurrent) {\n observer.unobserve(handleRefCurrent);\n }\n };\n }, [handleRef]);\n\n const isSelected = selectedEvents.has(eventId);\n const blockClasses = cx([\n style.rundownEvent,\n skip ? style.skip : null,\n isPast ? style.past : null,\n loaded ? style.loaded : null,\n playback ? style[playback] : null,\n isSelected ? style.selected : null,\n hasCursor ? style.hasCursor : null,\n ]);\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n const index = eventIndex - 1;\n const editMode = getSelectionMode(event);\n setSelectedEvents({ id: eventId, index, selectMode: editMode });\n };\n\n const isPlaying = playback ? isPlaybackActive(playback) : false;\n\n return (\n <div\n className={blockClasses}\n ref={setNodeRef}\n style={dragStyle}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n data-testid='rundown-event'\n {...(isPlaying ? { 'data-running': true } : {})}\n >\n <RundownIndicators timeStart={timeStart} delay={delay} gap={gap} isNextDay={isNextDay} />\n\n <div className={style.binder} style={{ ...binderColours }} tabIndex={-1}>\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n <span className={style.cue}>{cue}</span>\n </div>\n\n {isVisible && (\n <RundownEventInner\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n linkStart={linkStart}\n countToEnd={countToEnd}\n timeStrategy={timeStrategy}\n eventId={eventId}\n eventIndex={eventIndex}\n endAction={endAction}\n timerType={timerType}\n title={title}\n note={note}\n delay={delay}\n isNext={isNext}\n skip={skip}\n loaded={loaded}\n playback={playback}\n isRolling={isRolling}\n dayOffset={dayOffset}\n isPast={isPast}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n hasTriggers={hasTriggers}\n />\n )}\n </div>\n );\n}\n","import { MouseEvent, useCallback, useRef } from 'react';\nimport { IoReorderTwo, IoTrash } from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EntryId } from 'ontime-types';\n\nimport Input from '../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput';\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownMilestone.module.scss';\n\ninterface RundownMilestoneProps {\n colour: string;\n cue: string;\n entryId: EntryId;\n hasCursor: boolean;\n title: string;\n}\n\nexport default function RundownMilestone({ colour, cue, entryId, hasCursor, title }: RundownMilestoneProps) {\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const { updateEntry, deleteEntry } = useEntryActions();\n const { selectedEvents, setSingleEntrySelection } = useEventSelection();\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>([\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => deleteEntry([entryId]),\n },\n ]);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n isDragging,\n transform,\n transition,\n } = useSortable({\n id: entryId,\n data: {\n type: 'milestone',\n },\n animateLayoutChanges: () => false,\n });\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n setSingleEntrySelection({ id: entryId });\n };\n\n const handleUpdate = (field: 'cue' | 'title', value: string) => {\n updateEntry({ id: entryId, [field]: value });\n };\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const binderColours = colour && getAccessibleColour(colour);\n\n return (\n <div\n className={cx([style.milestone, hasCursor ? style.hasCursor : null])}\n ref={setNodeRef}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n style={dragStyle}\n data-testid='rundown-milestone'\n >\n <div className={style.binder} style={{ ...binderColours }}>\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n </div>\n <MilestoneTextInput field='cue' initialValue={cue} placeholder='Cue' submitHandler={handleUpdate} />\n <MilestoneTextInput field='title' initialValue={title} placeholder='Title' submitHandler={handleUpdate} />\n </div>\n );\n}\n\ninterface MilestoneTextInputProps {\n field: 'cue' | 'title';\n initialValue: string;\n placeholder?: string;\n submitHandler: (field: 'cue' | 'title', value: string) => void;\n}\n\nfunction MilestoneTextInput({ field, initialValue, placeholder, submitHandler }: MilestoneTextInputProps) {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n return (\n <Input\n id={field}\n ref={ref}\n fluid\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import {\n isOntimeDelay,\n isOntimeEvent,\n isOntimeMilestone,\n OntimeEntry,\n OntimeEvent,\n Playback,\n SupportedEntry,\n} from 'ontime-types';\n\nimport { useEntryActions } from '../../common/hooks/useEntryAction';\nimport useMemoisedFn from '../../common/hooks/useMemoisedFn';\nimport { cloneEvent } from '../../common/utils/clone';\n\nimport RundownDelay from './rundown-delay/RundownDelay';\nimport RundownEvent from './rundown-event/RundownEvent';\nimport RundownMilestone from './rundown-milestone/RundownMilestone';\n\ninterface RundownEntryProps {\n type: SupportedEntry;\n isPast: boolean;\n data: OntimeEntry;\n loaded: boolean;\n eventIndex: number;\n hasCursor: boolean;\n isNext: boolean;\n isNextDay: boolean;\n playback?: Playback; // we only care about this if this event is playing\n isRolling: boolean; // we need to know even if not related to this event\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\n\nexport default function RundownEntry({\n isPast,\n data,\n loaded,\n hasCursor,\n isNext,\n playback,\n isRolling,\n eventIndex,\n isNextDay,\n totalGap,\n isLinkedToLoaded,\n}: RundownEntryProps) {\n const { addEntry } = useEntryActions();\n\n const createCloneEvent = useMemoisedFn(() => {\n const newEvent = cloneEvent(data as OntimeEvent);\n addEntry(newEvent, { after: data.id });\n });\n\n if (isOntimeEvent(data)) {\n return (\n <RundownEvent\n eventId={data.id}\n eventIndex={eventIndex}\n cue={data.cue}\n timeStart={data.timeStart}\n timeEnd={data.timeEnd}\n duration={data.duration}\n timeStrategy={data.timeStrategy}\n linkStart={data.linkStart}\n flag={data.flag}\n countToEnd={data.countToEnd}\n endAction={data.endAction}\n timerType={data.timerType}\n title={data.title}\n note={data.note}\n delay={data.delay}\n colour={data.colour}\n isPast={isPast}\n isNext={isNext}\n skip={data.skip}\n parent={data.parent}\n loaded={loaded}\n hasCursor={hasCursor}\n playback={playback}\n isRolling={isRolling}\n gap={data.gap}\n isNextDay={isNextDay}\n dayOffset={data.dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n createCloneEvent={createCloneEvent}\n hasTriggers={data.triggers.length > 0}\n />\n );\n } else if (isOntimeDelay(data)) {\n return <RundownDelay data={data} hasCursor={hasCursor} />;\n } else if (isOntimeMilestone(data)) {\n return (\n <RundownMilestone\n colour={data.colour}\n cue={data.cue}\n entryId={data.id}\n hasCursor={hasCursor}\n title={data.title}\n />\n );\n }\n return null;\n}\n"],"names":["useMemoisedFn","fn","fnRef","useRef","useMemo","memoizedFn","args","BlockRadio","items","onValueChange","elementProps","jsx","BaseRadioGroup","value","style","item","Radio.Root","Radio.Indicator","DelayInput","props","eventId","duration","updateEntry","useEntryActions","setValue","useState","inputRef","ignoreChangeRef","useEffect","millisToString","validateAndSubmit","newValue","isNegative","newMillis","parseUserTime","submitChange","handleFocus","_a","onKeyDownHandler","event","_b","handleSlipChange","newDirection","checkedOption","jsxs","Input","RundownDelay","data","hasCursor","applyDelay","deleteEntry","handleRef","dragAttributes","dragListeners","setNodeRef","isDragging","transform","transition","useSortable","dragStyle","CSS","applyDelayHandler","cancelDelayHandler","cx","IoReorderTwo","Button","IoCheckmarkDone","IoClose","useEventIdSwapping","create","set","newEventId","RundownEventChip","timeStart","delay","dayOffset","isPast","isLoaded","className","totalGap","id","isLinkedToLoaded","playback","usePlayback","playbackActive","isPlaybackActive","EventReport","Tooltip","EventUntil","timeUntil","useTimeUntilExpectedStart","isDue","MILLIS_PER_SECOND","timeUntilString","formatDuration","MILLIS_PER_MINUTE","useReport","currentReport","overUnderStyle","tooltip","startedAt","endedAt","difference","absDifference","isOver","fullTimeValue","IoCheckmarkCircle","memo","RundownEventPlayback","skip","isPlaying","isPaused","loaded","disablePlayback","toggleSkip","actionHandler","setEventPlayback","load","playButtonStyles","IconButton","IoRemoveCircle","IoRemoveCircleOutline","IoReload","IoPause","IoPlay","RundownEventProgressBar","timer","useTimer","progress","getProgress","RundownEventInner","timeEnd","timeStrategy","linkStart","countToEnd","endAction","timerType","title","note","isNext","isRolling","hasTriggers","renderInner","setRenderInner","eventIsPlaying","Playback","eventIsPaused","Fragment","TimeInputFlow","TitleEditor","EventBlockPlayback","EventBlockProgressBar","TimerIcon","EndActionIcon","LuArrowDownToLine","IoFlash","action","maybeActiveClasses","EndAction","IoPlaySkipForward","IoPlayForward","type","TimerType","IoArrowUp","IoTime","IoBan","IoArrowDown","formatDelay","delayedStart","removeTrailingZero","formatGap","gap","isNextDay","gapString","RundownIndicators","hasGap","hasDelay","RundownEvent","cue","flag","eventIndex","colour","parent","createCloneEvent","selectedEventId","setSelectedEventId","clearSelectedEventId","batchUpdateEvents","groupEntries","swapEvents","selectedEvents","unselect","setSelectedEvents","clearSelectedEvents","useEventSelection","isVisible","setIsVisible","onContextMenu","useContextMenu","IoLink","IoUnlink","IoFolder","IoTrash","TbFlagFilled","IoAdd","IoSwapVertical","IoDuplicateOutline","binderColours","getAccessibleColour","elementInFocus","blockElement","useLayoutEffect","observer","entry","handleRefCurrent","isSelected","blockClasses","handleFocusClick","index","editMode","getSelectionMode","RundownMilestone","entryId","setSingleEntrySelection","handleUpdate","field","MilestoneTextInput","initialValue","placeholder","submitHandler","ref","submitCallback","useCallback","onChange","onBlur","onKeyDown","useReactiveTextInput","RundownEntry","addEntry","newEvent","cloneEvent","isOntimeEvent","isOntimeDelay","isOntimeMilestone"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RundownEntry-B1dSz1wu.js","sources":["../../src/common/hooks/useMemoisedFn.ts","../../src/common/components/input/delay-input/BlockRadio.tsx","../../src/common/components/input/delay-input/DelayInput.tsx","../../src/features/rundown/rundown-delay/RundownDelay.tsx","../../src/features/rundown/useEventIdSwapping.ts","../../src/features/rundown/rundown-event/composite/RundownEventChip.tsx","../../src/features/rundown/rundown-event/composite/RundownEventPlayback.tsx","../../src/features/rundown/rundown-event/composite/RundownEventProgressBar.tsx","../../src/features/rundown/rundown-event/RundownEventInner.tsx","../../src/features/rundown/rundown-event/rundownEvent.utils.ts","../../src/features/rundown/rundown-event/RundownIndicators.tsx","../../src/features/rundown/rundown-event/RundownEvent.tsx","../../src/features/rundown/rundown-milestone/RundownMilestone.tsx","../../src/features/rundown/RundownEntry.tsx"],"sourcesContent":["/**\n * Shamelessly from https://ahooks.js.org/hooks/use-memoized-fn/\n * Interesting technique discussed by Dan Abramov\n * https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n */\n\nimport { useMemo, useRef } from 'react';\n\nimport { isDev } from '../../externals';\n\ntype noop = (this: any, ...args: any[]) => any;\n\ntype PickFunction<T extends noop> = (this: ThisParameterType<T>, ...args: Parameters<T>) => ReturnType<T>;\n\nconst isFunction = (value: unknown): value is (...args: any) => any => typeof value === 'function';\n\nexport default function useMemoisedFn<T extends noop>(fn: T) {\n if (isDev) {\n if (!isFunction(fn)) {\n console.error(`useMemoisedFn expected function as parameter, got ${typeof fn}`);\n }\n }\n\n const fnRef = useRef<T>(fn);\n\n // why not write `fnRef.current = fn`?\n // https://github.com/alibaba/hooks/issues/728\n fnRef.current = useMemo(() => fn, [fn]);\n\n const memoizedFn = useRef<PickFunction<T>>(undefined);\n if (!memoizedFn.current) {\n memoizedFn.current = function (this, ...args) {\n return fnRef.current.apply(this, args);\n };\n }\n\n return memoizedFn.current as T;\n}\n","import { Radio } from '@base-ui-components/react/radio';\nimport { RadioGroup as BaseRadioGroup } from '@base-ui-components/react/radio-group';\n\nimport style from './BlockRadio.module.scss';\n\ninterface BlockRadioProps<T extends string | number | boolean> extends Omit<BaseRadioGroup.Props, 'onValueChange'> {\n items: {\n value: T;\n label: string;\n }[];\n onValueChange?: (value: T) => void;\n}\n\nexport default function BlockRadio<T extends string | number | boolean>({\n items,\n onValueChange,\n ...elementProps\n}: BlockRadioProps<T>) {\n return (\n <BaseRadioGroup\n onValueChange={(value) => onValueChange?.(value as T)}\n className={style.radioGroup}\n {...elementProps}\n >\n {items.map((item) => (\n <label className={style.item} key={item.value.toString()}>\n <Radio.Root value={item.value.toString()} className={style.radio}>\n <Radio.Indicator className={style.indicator} />\n </Radio.Root>\n {item.label}\n </label>\n ))}\n </BaseRadioGroup>\n );\n}\n","import { KeyboardEvent, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { useEntryActions } from '../../../hooks/useEntryAction';\nimport Input from '../input/Input';\n\nimport BlockRadio from './BlockRadio';\n\nimport style from './DelayInput.module.scss';\n\ninterface DelayInputProps {\n eventId: string;\n duration: number;\n}\n\nexport default function DelayInput(props: DelayInputProps) {\n const { eventId, duration } = props;\n const { updateEntry } = useEntryActions();\n\n const [value, setValue] = useState<string>('');\n const inputRef = useRef<HTMLInputElement | null>(null);\n // avoid wrong submit on cancel\n const ignoreChangeRef = useRef(false);\n\n // set internal value on duration change\n useEffect(() => {\n if (typeof duration === 'undefined') {\n return;\n }\n setValue(millisToString(duration));\n }, [duration]);\n\n /**\n * @description Prepare delay value for update\n * @param {string} newValue string to be parsed\n */\n const validateAndSubmit = (newValue: string) => {\n if (ignoreChangeRef.current) {\n ignoreChangeRef.current = false;\n return;\n }\n\n const isNegative = newValue.startsWith('-');\n let newMillis = parseUserTime(newValue);\n\n if (isNegative) {\n newMillis = newMillis * -1;\n }\n\n if (newMillis === duration) {\n return;\n }\n\n submitChange(newMillis);\n setValue(millisToString(newMillis));\n };\n\n const submitChange = (value: number) => {\n updateEntry({\n id: eventId,\n duration: value,\n });\n };\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = () => inputRef.current?.select();\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n validateAndSubmit((event.target as HTMLInputElement).value);\n } else if (event.key === 'Tab') {\n validateAndSubmit((event.target as HTMLInputElement).value);\n } else if (event.key === 'Escape') {\n ignoreChangeRef.current = true;\n setValue(millisToString(duration));\n inputRef.current?.blur();\n }\n };\n\n /**\n * @description handles direction change to delay\n * @param newDirection\n */\n const handleSlipChange = (newDirection: 'add' | 'subtract') => {\n if (newDirection === 'add') {\n // add time\n if (duration < 0) {\n submitChange(duration * -1);\n }\n } else if (newDirection === 'subtract') {\n // subtract time\n if (duration > 0) {\n submitChange(duration * -1);\n }\n }\n };\n\n const checkedOption = value.startsWith('-') ? 'subtract' : 'add';\n\n return (\n <div className={style.delayInput}>\n <Input\n ref={inputRef}\n data-testid='delay-input'\n className={style.inputField}\n placeholder='-'\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={(event) => validateAndSubmit(event.target.value)}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={9}\n />\n <BlockRadio\n onValueChange={handleSlipChange}\n value={checkedOption}\n items={[\n { value: 'add', label: 'Add time' },\n { value: 'subtract', label: 'Subtract time' },\n ]}\n />\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { IoCheckmarkDone, IoClose, IoReorderTwo } from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { OntimeDelay } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport DelayInput from '../../../common/components/input/delay-input/DelayInput';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './RundownDelay.module.scss';\n\ninterface RundownDelayProps {\n data: OntimeDelay;\n hasCursor: boolean;\n}\n\nexport default function RundownDelay({ data, hasCursor }: RundownDelayProps) {\n const { applyDelay, deleteEntry } = useEntryActions();\n const handleRef = useRef<null | HTMLSpanElement>(null);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n isDragging,\n transform,\n transition,\n } = useSortable({\n id: data.id,\n data: {\n type: 'delay',\n },\n animateLayoutChanges: () => false,\n });\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n useEffect(() => {\n if (hasCursor) {\n handleRef?.current?.focus();\n }\n }, [hasCursor]);\n\n const applyDelayHandler = () => {\n applyDelay(data.id);\n };\n\n const cancelDelayHandler = () => {\n deleteEntry([data.id]);\n };\n\n return (\n <div\n className={cx([style.delay, hasCursor ? style.hasCursor : null])}\n ref={setNodeRef}\n style={dragStyle}\n data-testid='rundown-delay'\n >\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n <DelayInput eventId={data.id} duration={data.duration} />\n <Button onClick={applyDelayHandler} variant='ghosted-white'>\n <IoCheckmarkDone /> Make permanent\n </Button>\n <Button onClick={cancelDelayHandler} variant='ghosted-white'>\n <IoClose />\n Cancel\n </Button>\n </div>\n );\n}\n","import { create } from 'zustand';\n\ninterface EventIdSwappingStore {\n selectedEventId: string | null;\n setSelectedEventId: (newEventId: string | null) => void;\n clearSelectedEventId: () => void;\n}\n\nexport const useEventIdSwapping = create<EventIdSwappingStore>((set) => ({\n selectedEventId: null,\n setSelectedEventId: (newEventId) => set(() => ({ selectedEventId: newEventId })),\n clearSelectedEventId: () => set(() => ({ selectedEventId: null })),\n}));\n","import { useMemo } from 'react';\nimport { IoCheckmarkCircle } from 'react-icons/io5';\nimport { isPlaybackActive, MILLIS_PER_MINUTE, MILLIS_PER_SECOND, millisToString } from 'ontime-utils';\n\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { usePlayback } from '../../../../common/hooks/useSocket';\nimport useReport from '../../../../common/hooks-query/useReport';\nimport { cx } from '../../../../common/utils/styleUtils';\nimport { formatDuration, useTimeUntilExpectedStart } from '../../../../common/utils/time';\n\nimport style from './RundownEventChip.module.scss';\n\ninterface RundownEventChipProps {\n id: string;\n timeStart: number;\n delay: number;\n dayOffset: number;\n isPast: boolean;\n isLoaded: boolean;\n className: string;\n totalGap: number;\n duration: number;\n isLinkedToLoaded: boolean;\n}\n\nexport default function RundownEventChip({\n timeStart,\n delay,\n dayOffset,\n isPast,\n isLoaded,\n className,\n totalGap,\n id,\n duration,\n isLinkedToLoaded,\n}: RundownEventChipProps) {\n const { playback } = usePlayback();\n\n if (isLoaded) {\n return null;\n }\n\n const playbackActive = isPlaybackActive(playback);\n\n if (!playbackActive || isPast) {\n return <EventReport className={className} id={id} duration={duration} />;\n }\n\n if (playbackActive) {\n // we extracted the component to avoid unnecessary calculations and re-renders\n return (\n <Tooltip text='Expected time until start' render={<span />} className={className}>\n <EventUntil\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n />\n </Tooltip>\n );\n }\n\n return null;\n}\n\ninterface EventUntilProps {\n timeStart: number;\n delay: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\n\nfunction EventUntil({ timeStart, delay, dayOffset, totalGap, isLinkedToLoaded }: EventUntilProps) {\n const timeUntil = useTimeUntilExpectedStart({ timeStart, delay, dayOffset }, { totalGap, isLinkedToLoaded });\n const isDue = timeUntil < MILLIS_PER_SECOND;\n\n const timeUntilString = isDue ? 'DUE' : `${formatDuration(Math.abs(timeUntil), timeUntil > 2 * MILLIS_PER_MINUTE)}`;\n\n return <div className={cx([style.chip, isDue && style.due])}>{timeUntilString}</div>;\n}\n\ninterface EventReportProps {\n className: string;\n id: string;\n duration: number;\n}\n\nfunction EventReport(props: EventReportProps) {\n const { className, id, duration } = props;\n const { data } = useReport();\n const currentReport = data[id];\n\n const [value, overUnderStyle, tooltip] = useMemo(() => {\n if (!currentReport) {\n return [null, 'none', ''];\n }\n\n const { startedAt, endedAt } = currentReport;\n if (!startedAt || !endedAt) {\n return [null, 'none', ''];\n }\n\n const actualDuration = endedAt - startedAt;\n const difference = actualDuration - duration;\n const absDifference = Math.abs(difference);\n\n if (absDifference < MILLIS_PER_SECOND) {\n return ['ontime', 'under', 'Event finished on time'];\n }\n\n const isOver = difference > 0;\n\n const fullTimeValue = millisToString(absDifference);\n\n const tooltip = `Event ran ${isOver ? 'over' : 'under'} time by ${fullTimeValue}`;\n\n const value = `${isOver ? '+' : '-'}${formatDuration(absDifference, absDifference > 2 * MILLIS_PER_MINUTE)}`;\n return [value, isOver ? 'over' : 'under', tooltip];\n }, [currentReport, duration]);\n\n if (!value) {\n return null;\n }\n\n return (\n <Tooltip text={tooltip} render={<span />} className={cx([style.chip, style[overUnderStyle], className])}>\n {value === 'ontime' ? <IoCheckmarkCircle size='1.1rem' /> : value}\n </Tooltip>\n );\n}\n","import { memo, MouseEvent } from 'react';\nimport { IoPause, IoPlay, IoReload, IoRemoveCircle, IoRemoveCircleOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../../common/components/buttons/IconButton';\nimport Tooltip from '../../../../common/components/tooltip/Tooltip';\nimport { useEntryActions } from '../../../../common/hooks/useEntryAction';\nimport { setEventPlayback } from '../../../../common/hooks/useSocket';\n\nimport style from '../RundownEvent.module.scss';\n\ninterface RundownEventPlaybackProps {\n eventId: string;\n skip: boolean;\n isPlaying: boolean;\n isPaused: boolean;\n loaded: boolean;\n disablePlayback: boolean;\n}\n\nexport default memo(RundownEventPlayback);\nfunction RundownEventPlayback({\n eventId,\n skip,\n isPlaying,\n isPaused,\n loaded,\n disablePlayback,\n}: RundownEventPlaybackProps) {\n const { updateEntry } = useEntryActions();\n\n const toggleSkip = (event: MouseEvent) => {\n event.stopPropagation();\n updateEntry({ id: eventId, skip: !skip });\n };\n\n const actionHandler = (event: MouseEvent) => {\n event.stopPropagation();\n // is playing -> pause\n // is paused -> continue\n // otherwise -> start\n if (isPlaying) {\n setEventPlayback.pause();\n } else if (isPaused) {\n setEventPlayback.start();\n } else {\n setEventPlayback.startEvent(eventId);\n }\n };\n\n const load = (event: MouseEvent) => {\n event.stopPropagation();\n setEventPlayback.loadEvent(eventId);\n };\n\n const playButtonStyles: { tooltip: string; backgroundColor: string | undefined } = (() => {\n if (isPaused) {\n return {\n tooltip: 'Continue event',\n backgroundColor: '#339E4E',\n };\n }\n\n if (isPlaying) {\n return {\n tooltip: 'Pause event',\n backgroundColor: '#c05621',\n };\n }\n return {\n tooltip: 'Start event',\n backgroundColor: undefined,\n };\n })();\n\n return (\n <div className={style.playbackActions}>\n <Tooltip\n text='Skip event'\n render={<IconButton variant='subtle-white' />}\n onClick={toggleSkip}\n tabIndex={-1}\n disabled={loaded}\n style={{\n background: skip ? '#9A0000' : undefined,\n }}\n aria-label='Skip event'\n >\n {skip ? <IoRemoveCircle /> : <IoRemoveCircleOutline />}\n </Tooltip>\n\n <Tooltip\n text='Load event'\n render={<IconButton variant='subtle-white' />}\n onClick={load}\n tabIndex={-1}\n disabled={disablePlayback}\n aria-label='Load event'\n >\n <IoReload className={style.flip} />\n </Tooltip>\n\n <Tooltip\n text={playButtonStyles.tooltip}\n render={<IconButton variant='subtle-white' />}\n onClick={actionHandler}\n tabIndex={-1}\n disabled={disablePlayback}\n style={{\n backgroundColor: playButtonStyles.backgroundColor,\n }}\n aria-label={isPlaying ? 'Pause event' : 'Start event'}\n >\n {!isPlaying ? <IoPlay /> : <IoPause />}\n </Tooltip>\n </div>\n );\n}\n","import { useTimer } from '../../../../common/hooks/useSocket';\nimport { getProgress } from '../../../../common/utils/getProgress';\n\nimport style from './RundownEventProgressBar.module.scss';\n\nexport default function RundownEventProgressBar() {\n const timer = useTimer();\n\n const progress = getProgress(timer.current, timer.duration);\n\n return <div className={style.progressBar} style={{ width: `${progress}%` }} />;\n}\n","import { memo, useEffect, useState } from 'react';\nimport {\n IoArrowDown,\n IoArrowUp,\n IoBan,\n IoFlash,\n IoPlay,\n IoPlayForward,\n IoPlaySkipForward,\n IoTime,\n} from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { EndAction, Playback, TimerType, TimeStrategy } from 'ontime-types';\n\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { cx } from '../../../common/utils/styleUtils';\nimport TitleEditor from '../common/TitleEditor';\nimport TimeInputFlow from '../time-input-flow/TimeInputFlow';\n\nimport RundownEventChip from './composite/RundownEventChip';\nimport EventBlockPlayback from './composite/RundownEventPlayback';\nimport EventBlockProgressBar from './composite/RundownEventProgressBar';\n\nimport style from './RundownEvent.module.scss';\n\ninterface RundownEventInnerProps {\n eventId: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n countToEnd: boolean;\n eventIndex: number;\n endAction: EndAction;\n timerType: TimerType;\n title: string;\n note: string;\n delay: number;\n isNext: boolean;\n skip: boolean;\n loaded: boolean;\n playback?: Playback;\n isRolling: boolean;\n dayOffset: number;\n isPast: boolean;\n totalGap: number;\n isLinkedToLoaded: boolean;\n hasTriggers: boolean;\n}\n\nexport default memo(RundownEventInner);\nfunction RundownEventInner({\n eventId,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n countToEnd,\n endAction,\n timerType,\n title,\n note,\n delay,\n isNext,\n skip = false,\n loaded,\n playback,\n isRolling,\n dayOffset,\n isPast,\n totalGap,\n isLinkedToLoaded,\n hasTriggers,\n}: RundownEventInnerProps) {\n const [renderInner, setRenderInner] = useState(false);\n\n useEffect(() => {\n setRenderInner(true);\n }, []);\n\n const eventIsPlaying = playback === Playback.Play;\n const eventIsPaused = playback === Playback.Pause;\n\n const playBtnStyles = { _hover: {} };\n if (!skip && eventIsPlaying) {\n playBtnStyles._hover = { bg: '#c05621' }; // $ontime-paused\n } else if (!skip && !eventIsPlaying) {\n playBtnStyles._hover = {};\n }\n\n return !renderInner ? null : (\n <>\n <div className={style.eventTimers}>\n <TimeInputFlow\n eventId={eventId}\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n delay={delay}\n timeStrategy={timeStrategy}\n linkStart={linkStart}\n countToEnd={countToEnd}\n />\n </div>\n <div className={style.titleSection}>\n <TitleEditor title={title} entryId={eventId} placeholder='Event title' className={style.eventTitle} />\n {isNext && <span className={style.nextTag}>UP NEXT</span>}\n </div>\n <EventBlockPlayback\n eventId={eventId}\n skip={skip}\n isPlaying={eventIsPlaying}\n isPaused={eventIsPaused}\n loaded={loaded}\n disablePlayback={skip || isRolling}\n />\n {!skip && (\n <RundownEventChip\n className={style.chipSection}\n id={eventId}\n timeStart={timeStart}\n delay={delay}\n dayOffset={dayOffset}\n isLinkedToLoaded={isLinkedToLoaded}\n isPast={isPast}\n isLoaded={loaded}\n totalGap={totalGap}\n duration={duration}\n />\n )}\n <div className={style.statusElements} id='entry-status' data-timertype={timerType}>\n <span className={style.eventNote}>{note}</span>\n <div className={loaded ? style.progressBg : `${style.progressBg} ${style.hidden}`}>\n {loaded && <EventBlockProgressBar />}\n </div>\n <div className={style.eventStatus} tabIndex={-1}>\n <Tooltip text={`Time type: ${timerType}`} render={<span />}>\n <TimerIcon type={timerType} className={style.statusIcon} />\n </Tooltip>\n <Tooltip text={`End action: ${endAction}`} render={<span />}>\n <EndActionIcon action={endAction} className={style.statusIcon} />\n </Tooltip>\n <Tooltip text={`${countToEnd ? 'Count to End' : 'Count duration'}`} render={<span />}>\n <LuArrowDownToLine className={`${style.statusIcon} ${countToEnd ? style.active : style.disabled}`} />\n </Tooltip>\n <Tooltip text='Event has Triggers' render={<span />}>\n <IoFlash className={`${style.statusIcon} ${hasTriggers ? style.active : style.disabled}`} />\n </Tooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction EndActionIcon(props: { action: EndAction; className: string }) {\n const { action, className } = props;\n const maybeActiveClasses = cx([action !== EndAction.None && style.active, className]);\n\n if (action === EndAction.LoadNext) {\n return <IoPlaySkipForward className={maybeActiveClasses} />;\n }\n if (action === EndAction.PlayNext) {\n return <IoPlayForward className={maybeActiveClasses} />;\n }\n return <IoPlay className={className} />;\n}\n\nfunction TimerIcon(props: { type: TimerType; className: string }) {\n const { type, className } = props;\n if (type === TimerType.CountUp) {\n return <IoArrowUp className={className} />;\n }\n if (type === TimerType.Clock) {\n return <IoTime className={className} />;\n }\n if (type === TimerType.None) {\n return <IoBan className={className} />;\n }\n return <IoArrowDown className={className} />;\n}\n","import { millisToString, removeTrailingZero } from 'ontime-utils';\n\nimport { formatDuration } from '../../../common/utils/time';\n\nexport function formatDelay(timeStart: number, delay: number): string | undefined {\n if (!delay) return;\n\n const delayedStart = Math.max(0, timeStart + delay);\n\n const timeTag = removeTrailingZero(millisToString(delayedStart));\n return `New start ${timeTag}`;\n}\nexport function formatGap(gap: number, isNextDay: boolean) {\n if (gap === 0) {\n if (isNextDay) {\n // We show a next day warning even if there is no gap\n return '(next day)';\n }\n return;\n }\n\n const gapString = formatDuration(Math.abs(gap), false);\n return `${gap < 0 ? 'Overlap' : 'Gap'} ${gapString}${isNextDay ? ' (next day)' : ''}`;\n}\n","import { formatDelay, formatGap } from './rundownEvent.utils';\n\nimport style from './RundownIndicators.module.scss';\n\ninterface RundownIndicatorProps {\n timeStart: number;\n isNextDay: boolean;\n delay: number;\n gap: number;\n}\n\nexport default function RundownIndicators({ timeStart, delay, gap, isNextDay }: RundownIndicatorProps) {\n const hasGap = formatGap(gap, isNextDay);\n const hasDelay = formatDelay(timeStart, delay);\n\n return (\n <div className={style.indicators}>\n {hasDelay && <div className={style.delay}>{hasDelay}</div>}\n {hasGap && <div className={style.gap}>{hasGap}</div>}\n </div>\n );\n}\n","import { MouseEvent, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport {\n IoAdd,\n IoDuplicateOutline,\n IoFolder,\n IoLink,\n IoReorderTwo,\n IoSwapVertical,\n IoTrash,\n IoUnlink,\n} from 'react-icons/io5';\nimport { TbFlagFilled } from 'react-icons/tb';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EndAction, EntryId, Playback, TimerType, TimeStrategy } from 'ontime-types';\nimport { isPlaybackActive } from 'ontime-utils';\n\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { useEventIdSwapping } from '../useEventIdSwapping';\nimport { getSelectionMode, useEventSelection } from '../useEventSelection';\n\nimport RundownEventInner from './RundownEventInner';\nimport RundownIndicators from './RundownIndicators';\n\nimport style from './RundownEvent.module.scss';\n\ninterface RundownEventProps {\n eventId: EntryId;\n cue: string;\n timeStart: number;\n timeEnd: number;\n duration: number;\n timeStrategy: TimeStrategy;\n linkStart: boolean;\n flag: boolean;\n countToEnd: boolean;\n eventIndex: number;\n endAction: EndAction;\n timerType: TimerType;\n title: string;\n note: string;\n delay: number;\n colour: string;\n isPast: boolean;\n isNext: boolean;\n skip: boolean;\n parent: EntryId | null;\n loaded: boolean;\n hasCursor: boolean;\n playback?: Playback;\n isRolling: boolean;\n gap: number;\n isNextDay: boolean;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n createCloneEvent: () => void;\n hasTriggers: boolean;\n}\n\nexport default function RundownEvent({\n eventId,\n cue,\n timeStart,\n timeEnd,\n duration,\n timeStrategy,\n linkStart,\n flag,\n countToEnd,\n eventIndex,\n endAction,\n timerType,\n title,\n note,\n delay,\n colour,\n isPast,\n isNext,\n skip = false,\n parent,\n loaded,\n hasCursor,\n playback,\n isRolling,\n gap,\n isNextDay,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n hasTriggers,\n createCloneEvent,\n}: RundownEventProps) {\n const { selectedEventId, setSelectedEventId, clearSelectedEventId } = useEventIdSwapping();\n const { updateEntry, batchUpdateEvents, deleteEntry, groupEntries, swapEvents } = useEntryActions();\n\n const { selectedEvents, unselect, setSelectedEvents, clearSelectedEvents } = useEventSelection();\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>(\n selectedEvents.size > 1\n ? [\n {\n type: 'item',\n label: 'Link to previous',\n icon: IoLink,\n onClick: () => {\n batchUpdateEvents({ linkStart: true }, Array.from(selectedEvents));\n },\n },\n {\n type: 'item',\n label: 'Unlink from previous',\n icon: IoUnlink,\n onClick: () => {\n batchUpdateEvents({ linkStart: false }, Array.from(selectedEvents));\n },\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Group',\n icon: IoFolder,\n onClick: () => {\n groupEntries(Array.from(selectedEvents));\n clearSelectedEvents();\n },\n disabled: parent !== null,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => {\n clearSelectedEvents();\n deleteEntry(Array.from(selectedEvents));\n },\n },\n ]\n : [\n {\n type: 'item',\n label: flag ? 'Remove flag' : 'Add flag',\n icon: TbFlagFilled,\n onClick: () => {\n updateEntry({ id: eventId, flag: !flag });\n },\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Add to swap',\n icon: IoAdd,\n onClick: () => setSelectedEventId(eventId),\n },\n {\n type: 'item',\n label: `Swap this event with ${selectedEventId ?? ''}`,\n icon: IoSwapVertical,\n onClick: () => {\n if (!selectedEventId) return;\n swapEvents(selectedEventId, eventId);\n clearSelectedEventId();\n },\n disabled: selectedEventId == null || selectedEventId === eventId,\n },\n {\n type: 'item',\n label: 'Clone',\n icon: IoDuplicateOutline,\n onClick: createCloneEvent,\n },\n { type: 'divider' },\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => {\n deleteEntry([eventId]);\n unselect(eventId);\n },\n },\n ],\n );\n\n const {\n isDragging,\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n transform,\n transition,\n } = useSortable({\n id: eventId,\n data: {\n type: 'event',\n parent,\n },\n animateLayoutChanges: () => false,\n });\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const binderColours = colour && getAccessibleColour(colour);\n\n // move focus to element if necessary\n useEffect(() => {\n if (!hasCursor || handleRef?.current == null) {\n return;\n }\n\n const elementInFocus = document.activeElement;\n // we know the group is the grandparent of our binder\n const blockElement = handleRef.current.closest('#event-group');\n\n // we only move focus if the block doesnt already contain focus\n if (blockElement && !blockElement.contains(elementInFocus)) {\n handleRef.current.focus();\n }\n }, [hasCursor]);\n\n useLayoutEffect(() => {\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n }\n },\n {\n root: null,\n threshold: 1,\n },\n );\n\n const handleRefCurrent = handleRef.current;\n if (handleRefCurrent) {\n observer.observe(handleRefCurrent);\n }\n\n return () => {\n if (handleRefCurrent) {\n observer.unobserve(handleRefCurrent);\n }\n };\n }, [handleRef]);\n\n const isSelected = selectedEvents.has(eventId);\n const blockClasses = cx([\n style.rundownEvent,\n skip ? style.skip : null,\n isPast ? style.past : null,\n loaded ? style.loaded : null,\n playback ? style[playback] : null,\n isSelected ? style.selected : null,\n hasCursor ? style.hasCursor : null,\n ]);\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n const index = eventIndex - 1;\n const editMode = getSelectionMode(event);\n setSelectedEvents({ id: eventId, index, selectMode: editMode });\n };\n\n const isPlaying = playback ? isPlaybackActive(playback) : false;\n\n return (\n <div\n className={blockClasses}\n ref={setNodeRef}\n style={dragStyle}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n data-testid='rundown-event'\n {...(isPlaying ? { 'data-running': true } : {})}\n >\n <RundownIndicators timeStart={timeStart} delay={delay} gap={gap} isNextDay={isNextDay} />\n\n <div className={style.binder} style={{ ...binderColours }} tabIndex={-1}>\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n <span className={style.cue}>{cue}</span>\n </div>\n\n {isVisible && (\n <RundownEventInner\n timeStart={timeStart}\n timeEnd={timeEnd}\n duration={duration}\n linkStart={linkStart}\n countToEnd={countToEnd}\n timeStrategy={timeStrategy}\n eventId={eventId}\n eventIndex={eventIndex}\n endAction={endAction}\n timerType={timerType}\n title={title}\n note={note}\n delay={delay}\n isNext={isNext}\n skip={skip}\n loaded={loaded}\n playback={playback}\n isRolling={isRolling}\n dayOffset={dayOffset}\n isPast={isPast}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n hasTriggers={hasTriggers}\n />\n )}\n </div>\n );\n}\n","import { MouseEvent, useCallback, useRef } from 'react';\nimport { IoReorderTwo, IoTrash } from 'react-icons/io5';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { EntryId } from 'ontime-types';\n\nimport Input from '../../../common/components/input/input/Input';\nimport useReactiveTextInput from '../../../common/components/input/text-input/useReactiveTextInput';\nimport { useContextMenu } from '../../../common/hooks/useContextMenu';\nimport { useEntryActions } from '../../../common/hooks/useEntryAction';\nimport { cx, getAccessibleColour } from '../../../common/utils/styleUtils';\nimport { useEventSelection } from '../useEventSelection';\n\nimport style from './RundownMilestone.module.scss';\n\ninterface RundownMilestoneProps {\n colour: string;\n cue: string;\n entryId: EntryId;\n hasCursor: boolean;\n title: string;\n}\n\nexport default function RundownMilestone({ colour, cue, entryId, hasCursor, title }: RundownMilestoneProps) {\n const handleRef = useRef<null | HTMLSpanElement>(null);\n const { updateEntry, deleteEntry } = useEntryActions();\n const { selectedEvents, setSingleEntrySelection } = useEventSelection();\n\n const [onContextMenu] = useContextMenu<HTMLDivElement>([\n {\n type: 'item',\n label: 'Delete',\n icon: IoTrash,\n onClick: () => deleteEntry([entryId]),\n },\n ]);\n\n const {\n attributes: dragAttributes,\n listeners: dragListeners,\n setNodeRef,\n isDragging,\n transform,\n transition,\n } = useSortable({\n id: entryId,\n data: {\n type: 'milestone',\n },\n animateLayoutChanges: () => false,\n });\n\n const handleFocusClick = (event: MouseEvent) => {\n event.stopPropagation();\n\n // event.button === 2 is a right-click\n // disable selection if the user selected events and right clicks\n // so the context menu shows up\n if (selectedEvents.size > 1 && event.button === 2) {\n return;\n }\n\n // UI indexes are 1 based\n setSingleEntrySelection({ id: entryId });\n };\n\n const handleUpdate = (field: 'cue' | 'title', value: string) => {\n updateEntry({ id: entryId, [field]: value });\n };\n\n const dragStyle = {\n zIndex: isDragging ? 2 : 'inherit',\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const binderColours = colour && getAccessibleColour(colour);\n\n return (\n <div\n className={cx([style.milestone, hasCursor ? style.hasCursor : null])}\n ref={setNodeRef}\n onClick={handleFocusClick}\n onContextMenu={onContextMenu}\n style={dragStyle}\n data-testid='rundown-milestone'\n >\n <div className={style.binder} style={{ ...binderColours }}>\n <span className={style.drag} ref={handleRef} {...dragAttributes} {...dragListeners}>\n <IoReorderTwo />\n </span>\n </div>\n <MilestoneTextInput field='cue' initialValue={cue} placeholder='Cue' submitHandler={handleUpdate} />\n <MilestoneTextInput field='title' initialValue={title} placeholder='Title' submitHandler={handleUpdate} />\n </div>\n );\n}\n\ninterface MilestoneTextInputProps {\n field: 'cue' | 'title';\n initialValue: string;\n placeholder?: string;\n submitHandler: (field: 'cue' | 'title', value: string) => void;\n}\n\nfunction MilestoneTextInput({ field, initialValue, placeholder, submitHandler }: MilestoneTextInputProps) {\n const ref = useRef<HTMLInputElement | null>(null);\n const submitCallback = useCallback((newValue: string) => submitHandler(field, newValue), [field, submitHandler]);\n const { value, onChange, onBlur, onKeyDown } = useReactiveTextInput(initialValue, submitCallback, ref, {\n submitOnEnter: true,\n });\n\n return (\n <Input\n id={field}\n ref={ref}\n fluid\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import {\n isOntimeDelay,\n isOntimeEvent,\n isOntimeMilestone,\n OntimeEntry,\n OntimeEvent,\n Playback,\n SupportedEntry,\n} from 'ontime-types';\n\nimport { useEntryActions } from '../../common/hooks/useEntryAction';\nimport useMemoisedFn from '../../common/hooks/useMemoisedFn';\nimport { cloneEvent } from '../../common/utils/clone';\n\nimport RundownDelay from './rundown-delay/RundownDelay';\nimport RundownEvent from './rundown-event/RundownEvent';\nimport RundownMilestone from './rundown-milestone/RundownMilestone';\n\ninterface RundownEntryProps {\n type: SupportedEntry;\n isPast: boolean;\n data: OntimeEntry;\n loaded: boolean;\n eventIndex: number;\n hasCursor: boolean;\n isNext: boolean;\n isNextDay: boolean;\n playback?: Playback; // we only care about this if this event is playing\n isRolling: boolean; // we need to know even if not related to this event\n totalGap: number;\n isLinkedToLoaded: boolean;\n}\n\nexport default function RundownEntry({\n isPast,\n data,\n loaded,\n hasCursor,\n isNext,\n playback,\n isRolling,\n eventIndex,\n isNextDay,\n totalGap,\n isLinkedToLoaded,\n}: RundownEntryProps) {\n const { addEntry } = useEntryActions();\n\n const createCloneEvent = useMemoisedFn(() => {\n const newEvent = cloneEvent(data as OntimeEvent);\n addEntry(newEvent, { after: data.id });\n });\n\n if (isOntimeEvent(data)) {\n return (\n <RundownEvent\n eventId={data.id}\n eventIndex={eventIndex}\n cue={data.cue}\n timeStart={data.timeStart}\n timeEnd={data.timeEnd}\n duration={data.duration}\n timeStrategy={data.timeStrategy}\n linkStart={data.linkStart}\n flag={data.flag}\n countToEnd={data.countToEnd}\n endAction={data.endAction}\n timerType={data.timerType}\n title={data.title}\n note={data.note}\n delay={data.delay}\n colour={data.colour}\n isPast={isPast}\n isNext={isNext}\n skip={data.skip}\n parent={data.parent}\n loaded={loaded}\n hasCursor={hasCursor}\n playback={playback}\n isRolling={isRolling}\n gap={data.gap}\n isNextDay={isNextDay}\n dayOffset={data.dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n createCloneEvent={createCloneEvent}\n hasTriggers={data.triggers.length > 0}\n />\n );\n } else if (isOntimeDelay(data)) {\n return <RundownDelay data={data} hasCursor={hasCursor} />;\n } else if (isOntimeMilestone(data)) {\n return (\n <RundownMilestone\n colour={data.colour}\n cue={data.cue}\n entryId={data.id}\n hasCursor={hasCursor}\n title={data.title}\n />\n );\n }\n return null;\n}\n"],"names":["useMemoisedFn","fn","fnRef","useRef","useMemo","memoizedFn","args","BlockRadio","items","onValueChange","elementProps","jsx","BaseRadioGroup","value","style","item","Radio.Root","Radio.Indicator","DelayInput","props","eventId","duration","updateEntry","useEntryActions","setValue","useState","inputRef","ignoreChangeRef","useEffect","millisToString","validateAndSubmit","newValue","isNegative","newMillis","parseUserTime","submitChange","handleFocus","_a","onKeyDownHandler","event","_b","handleSlipChange","newDirection","checkedOption","jsxs","Input","RundownDelay","data","hasCursor","applyDelay","deleteEntry","handleRef","dragAttributes","dragListeners","setNodeRef","isDragging","transform","transition","useSortable","dragStyle","CSS","applyDelayHandler","cancelDelayHandler","cx","IoReorderTwo","Button","IoCheckmarkDone","IoClose","useEventIdSwapping","create","set","newEventId","RundownEventChip","timeStart","delay","dayOffset","isPast","isLoaded","className","totalGap","id","isLinkedToLoaded","playback","usePlayback","playbackActive","isPlaybackActive","EventReport","Tooltip","EventUntil","timeUntil","useTimeUntilExpectedStart","isDue","MILLIS_PER_SECOND","timeUntilString","formatDuration","MILLIS_PER_MINUTE","useReport","currentReport","overUnderStyle","tooltip","startedAt","endedAt","difference","absDifference","isOver","fullTimeValue","IoCheckmarkCircle","memo","RundownEventPlayback","skip","isPlaying","isPaused","loaded","disablePlayback","toggleSkip","actionHandler","setEventPlayback","load","playButtonStyles","IconButton","IoRemoveCircle","IoRemoveCircleOutline","IoReload","IoPause","IoPlay","RundownEventProgressBar","timer","useTimer","progress","getProgress","RundownEventInner","timeEnd","timeStrategy","linkStart","countToEnd","endAction","timerType","title","note","isNext","isRolling","hasTriggers","renderInner","setRenderInner","eventIsPlaying","Playback","eventIsPaused","Fragment","TimeInputFlow","TitleEditor","EventBlockPlayback","EventBlockProgressBar","TimerIcon","EndActionIcon","LuArrowDownToLine","IoFlash","action","maybeActiveClasses","EndAction","IoPlaySkipForward","IoPlayForward","type","TimerType","IoArrowUp","IoTime","IoBan","IoArrowDown","formatDelay","delayedStart","removeTrailingZero","formatGap","gap","isNextDay","gapString","RundownIndicators","hasGap","hasDelay","RundownEvent","cue","flag","eventIndex","colour","parent","createCloneEvent","selectedEventId","setSelectedEventId","clearSelectedEventId","batchUpdateEvents","groupEntries","swapEvents","selectedEvents","unselect","setSelectedEvents","clearSelectedEvents","useEventSelection","isVisible","setIsVisible","onContextMenu","useContextMenu","IoLink","IoUnlink","IoFolder","IoTrash","TbFlagFilled","IoAdd","IoSwapVertical","IoDuplicateOutline","binderColours","getAccessibleColour","elementInFocus","blockElement","useLayoutEffect","observer","entry","handleRefCurrent","isSelected","blockClasses","handleFocusClick","index","editMode","getSelectionMode","RundownMilestone","entryId","setSingleEntrySelection","handleUpdate","field","MilestoneTextInput","initialValue","placeholder","submitHandler","ref","submitCallback","useCallback","onChange","onBlur","onKeyDown","useReactiveTextInput","RundownEntry","addEntry","newEvent","cloneEvent","isOntimeEvent","isOntimeDelay","isOntimeMilestone"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./RundownEntry-B1dSz1wu.js","./vendor-Cu5xgv5K.js","./vendor-4xP-6xVS.css","./index-5QAOtSTh.js","./index-De0uf0Ta.css","./useRundown-D8CYATNi.js","./useProjectData-CetvEK9E.js","./useProjectData-Cw1aXCwD.css","./dateConfig-8rhb0Dbh.js","./validateEvent-Bvgk1E-Y.js","./editorSettings-LMnfWux6.js","./editorSettings-BqHbWs9b.css","./parseUserTime-CCDHpp7D.js","./rundownUtils-Cnd2prRX.js","./Tooltip-DJ8Y4CO4.js","./Tooltip-CKb7gU2M.css","./MilestoneEditor-GkzJ-h1C.js","./EditorUtils-De0umjb-.js","./EditorUtils-BXko-IuN.css","./TimeInput-wQ67FbW6.js","./TimeInput-BrVdiuOQ.css","./useCustomFields-BuxKsqGS.js","./Select-niU9Razm.js","./Select-Cd08aEcf.css","./Modal-BKL-5GzU.js","./Modal-BgJx3SNK.css","./offset-CLDSqOP5.js","./MilestoneEditor-906SVj5M.css","./useReport-PEFRsOhF.js","./playbackstate-6lBh6omZ.js","./getProgress-CyJTu6f5.js","./ProtectRoute-p1fmtLeu.js","./ProtectRoute-Bm5sjStK.css","./Empty-BYF0tVRk.js","./Empty-DvR62o5B.css","./useFollowComponent-iGQv4zoS.js","./RundownEntry-3gFEEUnw.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{f as we,h as f,j as e,aN as te,be as xt,C as He,M as Ye,aM as P,ah as Xe,aO as be,aP as pe,aQ as Y,T as q,aK as ht,bf as pt,aE as Je,aF as Ze,bg as ft,b2 as mt,aT as jt,ax as yt,ay as gt,az as _t,bh as vt,aH as Et,bi as wt,aD as bt,aC as Ct,$ as kt}from"./vendor-Cu5xgv5K.js";import{T as Nt,S as Ce,C as St}from"./EditorUtils-De0umjb-.js";import{bq as De,ax as Ie,an as Ae,af as et,b0 as B,b4 as ce,B as Q,aF as Mt,br as tt,bn as fe,bs as nt,i as X,ai as st,aA as Dt,l as ye,g as Re,M as It,bt as At,b as Rt,bu as Gt,bv as Ge,bw as ge,av as Ot}from"./index-5QAOtSTh.js";import{P as Oe}from"./ProtectRoute-p1fmtLeu.js";import{i as ee,h as Pt,q as Bt,k as rt,j as ae,c as $t,S as j,t as Pe,r as Tt}from"./useRundown-D8CYATNi.js";import{s as _e,E as Ft,M as Kt,G as Vt,u as qt}from"./MilestoneEditor-GkzJ-h1C.js";import{M as Lt,P as Wt,D as zt}from"./Modal-BKL-5GzU.js";import{E as ot}from"./Empty-BYF0tVRk.js";import{u as ne,c as lt,a as Be}from"./dateConfig-8rhb0Dbh.js";import{u as Ut}from"./useFollowComponent-iGQv4zoS.js";import{g as Qt}from"./offset-CLDSqOP5.js";import{d as ve,e as $e,f as Te,h as Ht,i as Yt,j as Xt}from"./rundownUtils-Cnd2prRX.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new t.Error().stack;r&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[r]="e48c0a08-9686-4196-a984-6b6295406be8",t._sentryDebugIdIdentifier="sentry-dbid-e48c0a08-9686-4196-a984-6b6295406be8")}catch{}})();function Jt(t,r,n){if(r===n)return t;const s=[...t],[i]=s.splice(r,1);return s.splice(n,0,i),s}function ke(){const t=navigator.userAgent.toLowerCase();return t.includes("macintosh")||t.includes("mac os")}const V=ke()?"Option":"Alt",Z=ke()?"Cmd":"Ctrl",ue=we()((t,r)=>({selectedEvents:new Set,anchoredIndex:null,cursor:null,entryMode:null,setSingleEntrySelection:({id:n})=>{t({selectedEvents:new Set([n]),anchoredIndex:null,cursor:n,entryMode:"single"})},setSelectedEvents:({id:n,index:s,selectMode:i})=>{const{selectedEvents:o,anchoredIndex:m,entryMode:w}=r();if(w==="single")return t({selectedEvents:new Set([n]),anchoredIndex:s,cursor:n,entryMode:"event"});if(i==="click")return t({selectedEvents:new Set([n]),anchoredIndex:s,cursor:n,entryMode:"event"});if(i==="ctrl"){const _=De.getQueryData(Ie);if(!_)return;if(!o.has(n))return t({selectedEvents:o.add(n),anchoredIndex:s,cursor:n,entryMode:"event"});o.delete(n);const R=_.order.findIndex((N,G)=>G>s&&ee(_.entries[N])&&o.has(N));return t({selectedEvents:o,anchoredIndex:R<0?_.order.length-1:R,entryMode:"event"})}if(i==="shift"){const _=De.getQueryData(Ie);if(!_)return;const R=[];_.flatOrder.forEach(g=>{const M=_.entries[g];ee(M)&&R.push(M.id)});const N=m===null?0:Math.min(m,s),G=m===null?s:Math.max(m,s+1),u=R.slice(N,G);return t({selectedEvents:new Set([...o,...u]),anchoredIndex:s,entryMode:"event"})}},clearSelectedEvents:()=>t({selectedEvents:new Set,anchoredIndex:null,cursor:null,entryMode:null}),clearMultiSelect:()=>{const{selectedEvents:n}=r(),[s]=n;t({selectedEvents:new Set(s?[s]:[]),anchoredIndex:null,entryMode:null})},unselect:n=>{const{entryMode:s,selectedEvents:i}=r();i.delete(n),t({selectedEvents:i,entryMode:i.size===0?null:s})}}));function Qs(t){return ke()&&t.metaKey||t.ctrlKey?"ctrl":t.shiftKey?"shift":"click"}const Zt="_footer_44w0f_17",en={footer:Zt},tn=f.memo(nn);function nn({id:t,cue:r}){const n=`/ontime/load/id "${t}"`,s=`/ontime/load/cue "${r}"`;return e.jsxs("div",{className:en.footer,children:[e.jsx(Ae,{copyValue:n,children:n}),e.jsx(Ae,{copyValue:s,children:s})]})}const sn="_entryEditor_103di_17",rn="_shortcutSection_103di_28",on="_shortcuts_103di_35",ln="_spacer_103di_48",dn="_prompt_103di_52",an="_divider_103di_56",cn="_kbd_103di_62",U={entryEditor:sn,shortcutSection:rn,shortcuts:on,spacer:ln,prompt:dn,divider:an,kbd:cn},un=f.memo(xn);function xn(){return e.jsx("div",{className:U.entryEditor,"data-testid":"editor-container",children:e.jsxs("div",{className:U.shortcutSection,children:[e.jsx(Nt,{className:U.prompt,children:"Rundown shortcuts"}),e.jsx("table",{className:U.shortcuts,children:e.jsxs("tbody",{children:[e.jsxs("tr",{children:[e.jsx("td",{children:"Find in rundown"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"F"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Open Settings"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:","})]})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Select entry"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Select group"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Deselect entry"}),e.jsx("td",{children:e.jsx(a,{children:"Esc"})})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Reorder selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"↑"}),e.jsx(y,{children:"/"}),e.jsx(a,{children:"↓"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Copy selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"C"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Paste above"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"V"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Paste below"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"V"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Delete selected entry"}),e.jsxs("td",{children:[e.jsx(a,{children:Z}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Backspace"})]})]}),e.jsx("tr",{className:U.spacer}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add event below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"E"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add event above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"E"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add group below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"G"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add group above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"M"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add milestone below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"G"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add milestone above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"M"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add delay below"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"D"})]})]}),e.jsxs("tr",{children:[e.jsx("td",{children:"Add delay above"}),e.jsxs("td",{children:[e.jsx(a,{children:V}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"Shift"}),e.jsx(y,{children:"+"}),e.jsx(a,{children:"D"})]})]})]})})]})})}function y({children:t}){return e.jsx("span",{className:U.divider,children:t})}function a({children:t}){return e.jsx("span",{className:U.kbd,children:t})}function hn(){const t=ue(i=>i.selectedEvents),{data:r}=Pt(),[n,s]=f.useState(null);return f.useEffect(()=>{if(r.order.length===0){s(null);return}const i=Array.from(t).at(0);if(!i){s(null);return}const o=r.entries[i];o&&!Bt(o)?s(o):s(null)},[r.order,r.entries,t]),n?ee(n)?e.jsxs("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:[e.jsx(Ft,{event:n}),e.jsx(tn,{id:n.id,cue:n.cue})]}):rt(n)?e.jsx("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:e.jsx(Kt,{milestone:n})}):ae(n)?e.jsx("div",{className:_e.rundownEditor,"data-testid":"editor-container",children:e.jsx(Vt,{group:n})}):null:e.jsx(un,{})}const Fe=12;function pn(){const{data:t,rundownId:r}=$t(),[n,s]=f.useState([]),[i,o]=f.useState(null),m=f.useRef(""),w=ue(u=>u.setSelectedEvents),[_,R]=te({key:`rundown.${r}-editor-collapsed-groups`,defaultValue:[]}),N=f.useCallback(u=>{if(!t||t.length===0){o("No data");return}if(o(null),u.target.value===""){s([]);return}const g=u.target.value.toLowerCase();if(m.current=g,g.startsWith("index ")){const v=g.slice(6).trim(),{results:p,error:b}=se(v);s(p),o(b);return}if(g.startsWith("cue ")){const v=g.slice(4).trim(),{results:p,error:b}=T(v);s(p),o(b);return}const M=g.startsWith("title ")?g.slice(6).trim():g,{results:$,error:K}=re(M);s($),o(K);function se(v){const p=Number(v);if(isNaN(p)||p<1)return{results:[],error:"Invalid index"};if(p>t.length)return{results:[],error:null};let b=1;const S=[];for(let C=0;C<t.length;C++){const h=t[C];if(ee(h)){if(b===p){S.push({type:j.Event,id:h.id,index:C,eventIndex:b,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent});break}b++}}return{results:S,error:null}}function T(v){let p=1,b=Fe;const S=[];for(let C=0;C<t.length&&!(b<=0);C++){const h=t[C];ee(h)&&(h.cue.toLowerCase().includes(v)&&(b--,S.push({type:j.Event,id:h.id,index:C,eventIndex:p,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent})),p++)}return{results:S,error:null}}function re(v){let p=1,b=Fe;const S=[];for(let C=0;C<t.length&&!(b<=0);C++){const h=t[C];ee(h)?(h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Event,id:h.id,index:C,eventIndex:p,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent})),p++):ae(h)?h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Group,id:h.id,index:C,title:h.title,colour:h.colour})):rt(h)&&h.title.toLowerCase().includes(v)&&(b--,S.push({type:j.Milestone,id:h.id,index:C,title:h.title,cue:h.cue,colour:h.colour,parent:h.parent}))}return{results:S,error:null}}},[t]),G=f.useCallback(u=>{if("parent"in u&&u.parent!==null){const M=[...new Set(_)].filter($=>$!==u.parent);R(M)}w({id:u.id,index:u.index,selectMode:"click"})},[_,R,w]);return f.useEffect(()=>{s([]),o(null),m.current&&N({target:{value:m.current}})},[t,N]),{find:N,select:G,results:n,error:i}}const fn="_entry_15pki_17",mn="_empty_15pki_18",jn="_error_15pki_19",yn="_data_15pki_40",gn="_index_15pki_46",_n="_title_15pki_55",vn="_cue_15pki_58",En="_footer_15pki_66",wn="_em_15pki_18",bn="_scrollContainer_15pki_76",F={entry:fn,empty:mn,error:jn,data:yn,index:gn,title:_n,cue:vn,footer:En,em:wn,scrollContainer:bn};function Cn({isOpen:t,onClose:r}){const{find:n,select:s,results:i,error:o}=pn(),[m,w]=f.useState(0),_=xt(n,100),R=u=>{i.length!==0&&(u.key==="ArrowDown"&&w(g=>(g+1)%i.length),u.key==="ArrowUp"&&w(g=>(g-1+i.length)%i.length),u.key==="Enter"&&(u.preventDefault(),u.stopPropagation(),N()))},N=()=>{const u=i[m];s(u),r()},G=u=>{const M=u.target.closest("li");if(M){const $=Number(M.dataset.index);isNaN($)||w($)}};return e.jsx(Lt,{title:"",isOpen:t,onClose:r,showBackdrop:!0,bodyElements:e.jsxs("div",{onKeyDown:R,children:[e.jsx(et,{height:"large",fluid:!0,onChange:_,placeholder:"Search..."}),e.jsxs("ul",{className:F.scrollContainer,onMouseMove:G,children:[o&&e.jsx("li",{className:F.error,children:o}),i.length===0&&e.jsx("li",{className:F.empty,children:"No results"}),i.length>0&&i.map((u,g)=>{const M=m===g,$=u.type===j.Event?u.eventIndex:"-",K="cue"in u?u.cue:"";return e.jsxs("li",{className:F.entry,"data-selected":M,"data-index":g,onClick:N,children:[e.jsxs("div",{className:F.data,children:[e.jsx("div",{className:F.index,style:{"--color":u.colour},children:$}),e.jsx("div",{className:F.cue,children:K}),e.jsx("div",{className:F.title,children:u.title})]}),M&&e.jsx("span",{children:"Go ⏎"})]},u.id)})]})]}),footerElements:e.jsxs("div",{className:F.footer,children:["Use the keywords ",e.jsx("span",{className:F.em,children:"cue"}),", ",e.jsx("span",{className:F.em,children:"index"})," or",e.jsx("span",{className:F.em,children:"title"})," to filter search."]})})}const Ke=f.memo(kn);function kn(){const[t,r]=He();return Ye([["mod + f",r.toggle],["Escape",r.close]]),t?e.jsx(Cn,{isOpen:t,onClose:r.close}):null}const it=we(t=>({position:{x:0,y:0},options:[],isOpen:!1,setContextMenu:(r,n)=>t(()=>({position:r,options:n,isOpen:!0})),setIsOpen:r=>t(()=>({isOpen:r}))}));function Ve({children:t}){const{position:r,options:n,isOpen:s,setIsOpen:i}=it(),o=()=>i(!1);return s?e.jsxs(e.Fragment,{children:[t,e.jsx(Wt,{isOpen:!0,position:r,onClose:o,items:n})]}):t}const Nn="_header_156wk_17",Sn="_group_156wk_28",Mn="_radioButton_156wk_39",Dn="_apart_156wk_70",In="_separator_156wk_74",A={header:Nn,group:Sn,radioButton:Mn,apart:Dn,separator:In},An=f.memo(Rn);function Rn(){const[t,r]=He(),n=ue(m=>m.clearSelectedEvents),[s]=te({key:ce.editorMode,defaultValue:B.Edit}),{deleteAllEntries:i}=ne(),o=f.useCallback(()=>{i(),n(),r.close()},[n,i,r]);return e.jsxs(e.Fragment,{children:[e.jsxs(P,{render:e.jsx(Q,{variant:"subtle-destructive"}),onClick:r.open,disabled:s===B.Run,className:A.apart,children:[e.jsx(Xe,{}),"Clear all"]}),e.jsx(Mt,{isOpen:t,onClose:r.close,title:"Clear rundown",showBackdrop:!0,showCloseButton:!0,bodyElements:e.jsxs(e.Fragment,{children:["You will lose all data in your rundown. ",e.jsx("br",{})," Are you sure?"]}),footerElements:e.jsxs(e.Fragment,{children:[e.jsx(Q,{variant:"ghosted-white",size:"large",onClick:r.close,children:"Cancel"}),e.jsx(Q,{variant:"destructive",size:"large",onClick:o,children:"Delete all"})]})})]})}const Gn=f.memo(On);function On(){const[t,r]=te({key:ce.editorMode,defaultValue:B.Edit}),{offsetMode:n}=tt(),s=o=>{const m=o.at(0);m&&r(m)},i=o=>{const m=o.at(0);m&&nt(m)};return e.jsxs(be,{className:A.header,children:[e.jsxs(pe,{value:[t],onValueChange:s,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:B.Run,className:A.radioButton,children:"Run"}),e.jsx(P,{render:e.jsx(Y,{}),value:B.Edit,className:A.radioButton,children:"Edit"})]}),e.jsx(Ce,{className:A.separator}),e.jsxs(pe,{value:[n],onValueChange:i,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:fe.Absolute,className:A.radioButton,children:"Absolute"}),e.jsx(P,{render:e.jsx(Y,{}),value:fe.Relative,className:A.radioButton,children:"Relative"})]}),e.jsx(An,{})]})}const Pn=f.memo(Bn);function Bn(){const[t,r]=te({key:ce.editorMode,defaultValue:B.Edit}),{offsetMode:n}=tt(),s=o=>{const m=o.at(0);m&&r(m)},i=o=>{const m=o.at(0);m&&nt(m)};return e.jsxs(be,{className:A.header,children:[e.jsxs(pe,{value:[t],onValueChange:s,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:B.Run,className:A.radioButton,children:"Run"}),e.jsx(P,{render:e.jsx(Y,{}),value:B.Edit,className:A.radioButton,children:"Edit"})]}),e.jsx(Ce,{className:A.separator}),e.jsxs(pe,{value:[n],onValueChange:i,className:A.group,children:[e.jsx(P,{render:e.jsx(Y,{}),value:fe.Absolute,className:A.radioButton,children:"Absolute"}),e.jsx(P,{render:e.jsx(Y,{}),value:fe.Relative,className:A.radioButton,children:"Relative"})]})]})}const $n=we()(t=>({entryCopyId:null,setEntryCopyId:r=>t({entryCopyId:r})})),Tn=t=>({type:j.Event,flag:t.flag,title:t.title,note:t.note,timeStart:t.timeStart,duration:t.duration,timeEnd:t.timeEnd,timerType:t.timerType,timeStrategy:t.timeStrategy,countToEnd:t.countToEnd,linkStart:t.linkStart,endAction:t.endAction,skip:t.skip,colour:t.colour,parent:t.parent,revision:0,delay:t.delay,dayOffset:t.dayOffset,gap:0,timeWarning:t.timeWarning,timeDanger:t.timeDanger,triggers:structuredClone(t.triggers),custom:structuredClone(t.custom)}),Fn="_quickAdd_96pwt_17",Kn="_indent_96pwt_24",qe={quickAdd:Fn,indent:Kn},Ee=f.memo(Vn);function Vn({previousEventId:t,parentGroup:r,backgroundColor:n}){const{addEntry:s}=ne(),i=()=>{s({type:j.Event,parent:r},{after:t,lastEventId:t})},o=()=>{s({type:j.Delay,parent:r},{lastEventId:t,after:t})},m=()=>{s({type:j.Milestone,parent:r},{lastEventId:t,after:t})},w=()=>{r===null&&s({type:j.Group},{lastEventId:t,after:t})},_=n===""?"#9d9d9d":n;return e.jsxs(be,{className:X([qe.quickAdd,!!r&&qe.indent]),style:_?{"--user-bg":_}:{},"data-testid":"quick-add-buttons",children:[e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:i,children:[e.jsx(q,{}),"Event"]}),e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:o,children:[e.jsx(q,{}),"Delay"]}),e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:m,children:[e.jsx(q,{}),"Milestone"]}),r===null&&e.jsxs(P,{render:e.jsx(Q,{size:"small"}),onClick:w,children:[e.jsx(q,{}),"Group"]})]})}const qn="_quickAdd_fgq5o_17",Ln="_addButton_fgq5o_27",Le={quickAdd:qn,addButton:Ln},We=f.memo(Wn);function Wn({referenceEntryId:t,parentGroup:r,placement:n}){const{addEntry:s}=ne(),i=o=>{n==="before"?s({type:o,parent:o!==j.Group?r:null},{before:t}):s({type:o,parent:o!==j.Group?r:null},{lastEventId:t,after:t})};return e.jsx("div",{className:Le.quickAdd,"data-testid":"quick-add-inline",children:e.jsx(zt,{items:[{type:"item",icon:q,label:"Add Event",onClick:()=>i(j.Event)},{type:"item",icon:q,label:"Add Delay",onClick:()=>i(j.Delay)},{type:"item",icon:q,label:"Add Milestone",onClick:()=>i(j.Milestone)},{type:"item",icon:q,label:"Add Group",onClick:()=>i(j.Group),disabled:r!==null}],render:e.jsx(st,{size:"small",variant:"primary",className:Le.addButton}),children:e.jsx(q,{})})})}const zn=t=>{const r=it(s=>s.setContextMenu);return[s=>{s.preventDefault();const{pageX:i,pageY:o}=s;return r({x:i,y:o},t)}]},Un="_noTitle_zrdm3_26",ze={noTitle:Un};function Qn({title:t,entryId:r,placeholder:n,className:s}){const{updateEntry:i}=ne(),o=f.useRef(null),m=f.useCallback(u=>{if(u===t)return;const g=u.trim();i({id:r,title:g})},[t,i,r]),{value:w,onChange:_,onBlur:R,onKeyDown:N}=qt(t,m,o,{submitOnEnter:!0}),G=X([s,ze.eventTitle,w?null:ze.noTitle]);return e.jsx(et,{"data-testid":"entry__title",variant:"ghosted",fluid:!0,ref:o,value:w,className:G,placeholder:n,onChange:_,onBlur:R,onKeyDown:N})}const Hn="_blink_6ndm2_1",Yn="_fourtyfive_6ndm2_13",Xn="_group_6ndm2_17",Jn="_hasCursor_6ndm2_31",Zn="_expanded_6ndm2_34",es="_binder_6ndm2_39",ts="_header_6ndm2_54",ns="_titleRow_6ndm2_62",ss="_metaRow_6ndm2_67",rs="_metaEntry_6ndm2_73",os="_strike_6ndm2_81",ls="_over_6ndm2_85",is="_under_6ndm2_89",ds="_drag_6ndm2_93",as="_isDragging_6ndm2_111",cs="_notAllowed_6ndm2_114",I={blink:Hn,fourtyfive:Yn,group:Xn,hasCursor:Jn,expanded:Zn,binder:es,header:ts,titleRow:ns,metaRow:ss,metaEntry:rs,strike:os,over:ls,under:is,drag:ds,isDragging:as,notAllowed:cs};function us({data:t,hasCursor:r,collapsed:n,onCollapse:s}){var h,oe;const i=f.useRef(null),{clone:o,ungroup:m,deleteEntry:w}=ne(),{selectedEvents:_,setSingleEntrySelection:R}=ue(),[N]=zn([{type:"item",label:"Clone Group",icon:ht,onClick:()=>o(t.id)},{type:"item",label:"Ungroup",icon:pt,onClick:()=>m(t.id),disabled:t.entries.length===0},{type:"divider"},{type:"item",label:"Delete Group",icon:Xe,onClick:()=>w([t.id])}]),{attributes:G,listeners:u,setNodeRef:g,transform:M,transition:$,isDragging:K,isOver:se,over:T}=Je({id:t.id,data:{type:"group"},animateLayoutChanges:()=>!1}),re=O=>{O.stopPropagation(),!(_.size>1&&O.button===2)&&R({id:t.id})},v=t.colour&&Dt(t.colour),p=K&&(T==null?void 0:T.id)&<((h=T.data.current)==null?void 0:h.type,(oe=T.data.current)==null?void 0:oe.parent),[b,S]=(()=>{if(t.targetDuration===null)return[null,null];const O=t.duration-t.targetDuration;if(O===0)return[null,"under"];const le=Math.abs(O);return[`${O<0?"-":"+"}${ye(le,le>2*It)}`,Qt(O)]})(),C={zIndex:K?2:"inherit",transform:Ze.Translate.toString(M),transition:$,cursor:se?p?"grabbing":"no-drop":"inherit"};return e.jsxs("div",{className:X([I.group,r&&I.hasCursor,!n&&I.expanded]),ref:g,onClick:re,onContextMenu:N,style:{...C,"--user-bg":t.colour||"#929292"},"data-testid":"rundown-group",children:[e.jsx("div",{className:I.binder,style:{...v},tabIndex:-1,children:e.jsx("span",{className:X([I.drag,K&&I.isDragging,K&&!p&&I.notAllowed]),ref:i,...G,...u,children:e.jsx(ft,{})})}),e.jsxs("div",{className:I.header,children:[e.jsxs("div",{className:I.titleRow,children:[e.jsx(Qn,{title:t.title,entryId:t.id,placeholder:"Group title"}),e.jsx(st,{"aria-label":"Collapse",variant:"subtle-white",onClick:()=>s(!n,t.id),children:n?e.jsx(mt,{}):e.jsx(jt,{})})]}),e.jsxs("div",{className:I.metaRow,children:[e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Start"}),e.jsx("div",{children:Re(t.timeStart)})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"End"}),e.jsx("div",{children:Re(t.timeEnd)})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Duration"}),b===null?e.jsx("div",{className:X([S!==null&&I[S]]),children:ye(t.duration)}):e.jsxs("div",{children:[e.jsx("span",{className:I.strike,children:ye(t.duration)}),e.jsx("span",{className:X([S!==null&&I[S]]),children:b})]})]}),e.jsxs("div",{className:I.metaEntry,children:[e.jsx("div",{children:"Entries"}),e.jsx("div",{children:t.entries.length})]})]})]})]})}const xs="_groupEnd_1mlc9_17",hs={groupEnd:xs};function ps({id:t,colour:r}){const{attributes:n,listeners:s,setNodeRef:i,transform:o,transition:m}=Je({id:t,data:{type:"end-group"},animateLayoutChanges:()=>!1,disabled:!0}),w={transform:Ze.Transform.toString(o),transition:m};return e.jsx("div",{className:hs.groupEnd,ref:i,...n,...s,style:{...w,...r?{"--user-bg":r}:{}},tabIndex:-1})}const fs="_empty_pqnxu_17",ms="_inline_pqnxu_22",Ue={empty:fs,inline:ms};function js(t){const{handleAddNew:r}=t;return e.jsxs("div",{className:Ue.empty,children:[e.jsx(ot,{injectedStyles:{marginTop:"5vh",marginBottom:"3rem"}}),e.jsxs("div",{className:Ue.inline,children:[e.jsxs(Q,{onClick:()=>r(j.Event),variant:"primary",size:"large",children:[e.jsx(q,{}),"Create Event"]}),e.jsx(Ce,{}),e.jsxs(Q,{onClick:()=>r(j.Group),variant:"primary",size:"large",children:[e.jsx(q,{})," Create Group"]})]})]})}const ys="_rundownWrapper_qmpnm_17",gs="_rundownContainer_qmpnm_22",_s="_list_qmpnm_28",vs="_spacer_qmpnm_44",Es="_entryWrapper_qmpnm_48",ws="_entryIndex_qmpnm_55",bs="_flag_qmpnm_66",Cs="_index_qmpnm_72",ks="_entry_qmpnm_48",z={rundownWrapper:ys,rundownContainer:gs,list:_s,spacer:vs,entryWrapper:Es,entryIndex:ws,flag:bs,index:Cs,entry:ks},Ns=f.lazy(()=>kt(()=>import("./RundownEntry-B1dSz1wu.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36]),import.meta.url));function Ss({data:t,rundownMetadata:r}){var Me;const{order:n,entries:s,id:i}=t,o=At(),[m,w]=f.useState(()=>Be(n,s)),[_,R]=f.useState(r),[N,G]=te({key:`rundown.${i}-editor-collapsed-groups`,defaultValue:[]}),{addEntry:u,deleteEntry:g,move:M,reorderEntry:$}=ne(),{entryCopyId:K,setEntryCopyId:se}=$n(),[T]=te({key:ce.editorMode,defaultValue:B.Edit}),{clearSelectedEvents:re,setSelectedEvents:v,cursor:p}=ue(),b=f.useRef(null),S=f.useRef(null);Ut({followRef:b,scrollRef:S,doFollow:!0,followTrigger:T===B.Edit?p:o==null?void 0:o.selectedEventId});const C=yt(gt(Ct,{activationConstraint:{distance:10}})),h=f.useCallback(d=>{if(!d)return;const{entry:c,index:l}=ve(s,n,d);g([d]),c&&l!==null&&v({id:c.id,selectMode:"click",index:l})},[s,n,g,v]),oe=f.useCallback((d,c,l=!1)=>{var k;const x=l?((k=ve(s,n,d??"").entry)==null?void 0:k.id)??null:d;if(c===null)return;const E=s[c];if((E==null?void 0:E.type)===j.Event){const D=Tn(E);u(D,{after:x??void 0})}},[u,n,s]),O=f.useCallback((d,c,l=!1)=>{u(d,{after:c&&!l?c:void 0,before:c&&l?c:void 0,lastEventId:!l&&c?c:void 0})},[u]),le=f.useCallback((d,c)=>{if(n.length<1)return;let l=d;if(d===null){const E=c==="up"?$e(s,n):Te(s,n);if(ae(E)){v({id:E.id,selectMode:"click",index:c==="up"?n.length:0});return}l=(E==null?void 0:E.id)??null}if(l===null)return;const x=c==="up"?Ht(s,n,l):Yt(s,n,l);x.entry!==null&&x.index!==null&&v({id:x.entry.id,selectMode:"click",index:x.index})},[n,s,v]),Ne=f.useCallback((d,c)=>{if(n.length<1)return;if(d===null){const x=c==="up"?$e(s,n):Te(s,n);x!==null&&v({id:x.id,selectMode:"click",index:c==="up"?n.length:0});return}const l=c==="up"?ve(s,n,d):Xt(s,n,d);l.entry!==null&&l.index!==null&&v({id:l.entry.id,selectMode:"click",index:l.index})},[n,s,v]),J=f.useCallback(d=>!!N.find(c=>c===d),[N]),ie=f.useCallback((d,c)=>{G(l=>{const x=J(c);return d&&!x?[...new Set(l).add(c)]:!d&&x?[...l].filter(E=>E!==c):l})},[J,G]),Se=f.useCallback(async(d,c)=>{if(d==null)return;const l=await M(d,c);l&&ie(!1,l)},[ie,M]);Ye([["alt + ArrowDown",()=>Ne(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + ArrowUp",()=>Ne(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + ArrowDown",()=>le(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + ArrowUp",()=>le(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + mod + ArrowDown",()=>Se(p,"down"),{preventDefault:!0,usePhysicalKeys:!0}],["alt + mod + ArrowUp",()=>Se(p,"up"),{preventDefault:!0,usePhysicalKeys:!0}],["Escape",()=>re(),{preventDefault:!0,usePhysicalKeys:!0}],["mod + Backspace",()=>h(p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + E",()=>O({type:j.Event},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + E",()=>O({type:j.Event},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + G",()=>O({type:j.Group},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + G",()=>O({type:j.Group},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + D",()=>O({type:j.Delay},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + D",()=>O({type:j.Delay},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + M",()=>O({type:j.Milestone},p),{preventDefault:!0,usePhysicalKeys:!0}],["alt + shift + M",()=>O({type:j.Milestone},p,!0),{preventDefault:!0,usePhysicalKeys:!0}],["mod + C",()=>se(p)],["mod + V",()=>oe(p,K)],["mod + shift + V",()=>oe(p,K,!0),{preventDefault:!0,usePhysicalKeys:!0}],["alt + backspace",()=>h(p),{preventDefault:!0,usePhysicalKeys:!0}]]),f.useEffect(()=>{w(Be(n,s)),R(r)},[n,s,r]),f.useEffect(()=>{var l;if(T!==B.Run||!(o!=null&&o.selectedEventId))return;const d=n.findIndex(x=>x===o.selectedEventId),c=(l=s[o.selectedEventId])==null?void 0:l.parent;c&&G(x=>[...x].filter(E=>E!==c)),v({id:o.selectedEventId,selectMode:"click",index:d})},[T,s,o.selectedEventId,n,G,v]);const dt=d=>{var he;const{active:c,over:l}=d;if(!(l!=null&&l.id)||c.id===l.id||!c.data.current||!l.data.current)return;const x=c.data.current.sortable.index,E=l.data.current.sortable.index;let k=x<E?"after":"before",D=l.id;const xe=((he=c.data.current)==null?void 0:he.type)===j.Group;if(xe&&!lt(l.data.current.type,l.data.current.parent,k,J(D)))return;if(D.startsWith("end-"))D=D.replace("end-",""),k==="before"&&(k="insert");else{const L=t.entries[D];ae(L)&&k==="after"&&(xe?D=L.id:L.entries.length===0?(D=L.id,k="insert"):(D=L.entries[0],k="before"))}const me=structuredClone(m);w(L=>Jt(L,x,E)),$(c.id,D,k).catch(L=>{w(me)})},at=d=>{var l;((l=d.active.data.current)==null?void 0:l.type)===j.Group&&ie(!0,d.active.id)},ct=d=>{var x,E,k,D;if(((x=d.active.data.current)==null?void 0:x.type)==="group"||((k=(E=d.over)==null?void 0:E.data.current)==null?void 0:k.type)!=="group")return;const c=(D=d.over)==null?void 0:D.id;J(c)&&ie(!1,c)};if(m.length<1)return e.jsx(js,{handleAddNew:d=>u({type:d})});const de=T===B.Edit;return e.jsx("div",{className:z.rundownContainer,ref:S,"data-testid":"rundown",children:e.jsx(_t,{onDragEnd:dt,onDragStart:at,onDragOver:ct,sensors:C,collisionDetection:vt,children:e.jsx(Et,{items:m,strategy:wt,children:e.jsxs("div",{className:z.list,children:[de&&e.jsx(Ee,{previousEventId:null,parentGroup:null}),m.map((d,c)=>{if(d.startsWith("end-")){const je=d.split("end-")[1],ut=J(je),W=_[je];return ut?null:e.jsxs(f.Fragment,{children:[de&&(W==null?void 0:W.groupEntries)===0&&e.jsx(Ee,{previousEventId:null,parentGroup:je,backgroundColor:W==null?void 0:W.groupColour}),e.jsx(ps,{id:d,colour:W==null?void 0:W.groupColour},d)]},d)}const l=s[d],x=_[d];if(!l||!x||l.type!==j.Group&&x.groupId!==null&&J(x.groupId))return null;const E=(o==null?void 0:o.nextEventId)===l.id,k=l.id===p,D=x.groupColour===""?"#9d9d9d":x.groupColour,xe=c===0,me=d===n.at(-1),he=x.thisId!==x.groupId?x.groupId:null,L=x.groupId;return e.jsxs(f.Fragment,{children:[de&&k&&!xe&&e.jsx(We,{placement:"before",referenceEntryId:l.id,parentGroup:he}),ae(l)?e.jsx(us,{data:l,hasCursor:k,collapsed:J(l.id),onCollapse:ie}):e.jsxs("div",{className:z.entryWrapper,"data-testid":`entry-${x.eventIndex}`,style:D?{"--user-bg":D}:{},children:[ee(l)&&e.jsxs("div",{className:z.entryIndex,children:[l.flag&&e.jsx(bt,{className:z.flag}),e.jsx("div",{className:z.index,children:x.eventIndex})]}),e.jsx("div",{className:z.entry,ref:k?b:void 0,children:e.jsx(Ns,{type:l.type,isPast:x.isPast,eventIndex:x.eventIndex,data:l,loaded:x.isLoaded,hasCursor:k,isNext:E,isNextDay:x.isNextDay,playback:x.isLoaded?o.playback:void 0,isRolling:o.playback===Rt.Roll,totalGap:x.totalGap,isLinkedToLoaded:x.isLinkedToLoaded})},l.id)]}),de&&k&&!me&&e.jsx(We,{placement:"after",referenceEntryId:l.id,parentGroup:L})]},l.id)}),de&&e.jsx(Ee,{previousEventId:((Me=_[Pe])==null?void 0:Me.groupId)??_[Pe].thisId,parentGroup:null}),e.jsx("div",{className:z.spacer})]})})})})}function Qe({isSmallDevice:t}){const{data:r,status:n,rundownMetadata:s}=Tt();return e.jsxs("div",{className:z.rundownWrapper,children:[t?e.jsx(Pn,{}):e.jsx(Gn,{}),n==="success"&&r&&s?e.jsx(Ss,{data:r,rundownMetadata:s}):e.jsx(ot,{text:"Connecting to server"})]})}const Ms="_rundownExport_h38r0_21",Ds="_extracted_h38r0_25",Is="_list_h38r0_25",As="_side_h38r0_29",Rs="_rundown_h38r0_21",H={rundownExport:Ms,extracted:Ds,list:Is,side:As,rundown:Rs},Gs=f.memo(Os);function Os(){const t=window.location.pathname.includes("/rundown"),[r]=te({key:ce.editorMode,defaultValue:B.Edit});if(Gt()&&t)return e.jsx(Oe,{permission:"editor",children:e.jsxs("div",{className:X([H.rundownExport,H.extracted]),"data-target":"small-device","data-testid":"panel-rundown",children:[e.jsx(Ke,{}),e.jsx(Ge,{suppressSettings:!0}),e.jsx("div",{className:H.rundown,children:e.jsx(ge,{children:e.jsx(Ve,{children:e.jsx(Qe,{isSmallDevice:!0})})})})]})});const s=t&&r==="run";return e.jsx(Oe,{permission:"editor",children:e.jsxs("div",{className:X([H.rundownExport,t&&H.extracted]),"data-testid":"panel-rundown",children:[e.jsx(Ke,{}),t&&e.jsx(Ge,{suppressSettings:!0}),e.jsxs("div",{className:H.rundown,children:[e.jsx("div",{className:H.list,children:e.jsxs(ge,{children:[!t&&e.jsx(St,{onClick:i=>Ot("rundown",i)}),e.jsx(Ve,{children:e.jsx(Qe,{})})]})}),!s&&e.jsx("div",{className:H.side,children:e.jsx(ge,{children:e.jsx(hn,{})})})]})]})})}const Hs=Object.freeze(Object.defineProperty({__proto__:null,default:Gs},Symbol.toStringTag,{value:"Module"}));export{Hs as R,Qn as T,zn as a,Tn as c,Qs as g,ue as u};
|
|
3
|
+
//# sourceMappingURL=RundownExport-WjLpncYT.js.map
|
|
Binary file
|
|
Binary file
|