@getontime/cli 4.1.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/assets/Backstage-WSlbFC9X.js +2 -0
- package/client/assets/Backstage-WSlbFC9X.js.br +0 -0
- package/client/assets/Backstage-WSlbFC9X.js.gz +0 -0
- package/client/assets/Backstage-WSlbFC9X.js.map +1 -0
- package/client/assets/Countdown-B32qlxYT.js +2 -0
- package/client/assets/Countdown-B32qlxYT.js.br +0 -0
- package/client/assets/Countdown-B32qlxYT.js.gz +0 -0
- package/client/assets/Countdown-B32qlxYT.js.map +1 -0
- package/client/assets/CustomTranslationModal-CtBvokyt.js +2 -0
- package/client/assets/CustomTranslationModal-CtBvokyt.js.br +0 -0
- package/client/assets/CustomTranslationModal-CtBvokyt.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-BBNxpds0.js.map → CustomTranslationModal-CtBvokyt.js.map} +1 -1
- package/client/assets/DelayIndicator-BFZFpsY5.js +2 -0
- package/client/assets/DelayIndicator-BFZFpsY5.js.br +0 -0
- package/client/assets/DelayIndicator-BFZFpsY5.js.gz +0 -0
- package/client/assets/{DelayIndicator-CFCDQ7FN.js.map → DelayIndicator-BFZFpsY5.js.map} +1 -1
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js +2 -0
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-D55c8JBz.js.map → EditorFeatureWrapper-DaMxgBMP.js.map} +1 -1
- package/client/assets/EditorUtils-CgF7UfHP.css +1 -0
- package/client/assets/EditorUtils-CgF7UfHP.css.br +0 -0
- package/client/assets/EditorUtils-CgF7UfHP.css.gz +0 -0
- package/client/assets/EditorUtils-DoaSwWiz.js +2 -0
- package/client/assets/EditorUtils-DoaSwWiz.js.br +0 -0
- package/client/assets/EditorUtils-DoaSwWiz.js.gz +0 -0
- package/client/assets/EditorUtils-DoaSwWiz.js.map +1 -0
- package/client/assets/Empty-D1UteOYj.js +2 -0
- package/client/assets/Empty-D1UteOYj.js.br +0 -0
- package/client/assets/Empty-D1UteOYj.js.gz +0 -0
- package/client/assets/{Empty-C-JO_XAr.js.map → Empty-D1UteOYj.js.map} +1 -1
- package/client/assets/EmptyPage-DeRjpRKZ.js +2 -0
- package/client/assets/EmptyPage-DeRjpRKZ.js.br +0 -0
- package/client/assets/EmptyPage-DeRjpRKZ.js.gz +0 -0
- package/client/assets/{EmptyPage-BSzsxpGg.js.map → EmptyPage-DeRjpRKZ.js.map} +1 -1
- package/client/assets/FollowButton-FodezDem.js +2 -0
- package/client/assets/FollowButton-FodezDem.js.br +0 -0
- package/client/assets/FollowButton-FodezDem.js.gz +0 -0
- package/client/assets/{FollowButton-Mox6N4JW.js.map → FollowButton-FodezDem.js.map} +1 -1
- package/client/assets/MessageControlExport-CFGgiwk_.js +3 -0
- package/client/assets/MessageControlExport-CFGgiwk_.js.br +0 -0
- package/client/assets/MessageControlExport-CFGgiwk_.js.gz +0 -0
- package/client/assets/MessageControlExport-CFGgiwk_.js.map +1 -0
- package/client/assets/MessageControlExport-DjoUioWA.css +1 -0
- package/client/assets/MessageControlExport-DjoUioWA.css.br +0 -0
- package/client/assets/MessageControlExport-DjoUioWA.css.gz +0 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js +2 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js.br +0 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js.gz +0 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js.map +1 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css +1 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css.br +0 -0
- package/client/assets/MilestoneEditor-BqNKKlvI.css.gz +0 -0
- package/client/assets/Modal-B8ZZbVMg.js +2 -0
- package/client/assets/Modal-B8ZZbVMg.js.br +0 -0
- package/client/assets/Modal-B8ZZbVMg.js.gz +0 -0
- package/client/assets/{Modal-krcwDRb-.js.map → Modal-B8ZZbVMg.js.map} +1 -1
- package/client/assets/MultiPartProgressBar-BKHk19Hb.js +2 -0
- package/client/assets/MultiPartProgressBar-BKHk19Hb.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BKHk19Hb.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-BXQbpM-j.js.map → MultiPartProgressBar-BKHk19Hb.js.map} +1 -1
- package/client/assets/OperatorExport-BiBcgVKc.css +1 -0
- package/client/assets/OperatorExport-BiBcgVKc.css.br +0 -0
- package/client/assets/OperatorExport-BiBcgVKc.css.gz +0 -0
- package/client/assets/OperatorExport-DQM14DsN.js +2 -0
- package/client/assets/OperatorExport-DQM14DsN.js.br +0 -0
- package/client/assets/OperatorExport-DQM14DsN.js.gz +0 -0
- package/client/assets/OperatorExport-DQM14DsN.js.map +1 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css +1 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css.br +0 -0
- package/client/assets/OverviewWrapper-9aebU9w0.css.gz +0 -0
- package/client/assets/{OverviewWrapper-MGJ1uE5W.js → OverviewWrapper-D1hUkrRi.js} +2 -2
- package/client/assets/OverviewWrapper-D1hUkrRi.js.br +0 -0
- package/client/assets/OverviewWrapper-D1hUkrRi.js.gz +0 -0
- package/client/assets/{OverviewWrapper-MGJ1uE5W.js.map → OverviewWrapper-D1hUkrRi.js.map} +1 -1
- package/client/assets/PipHost-B9-cZ8Lm.js +2 -0
- package/client/assets/PipHost-B9-cZ8Lm.js.br +0 -0
- package/client/assets/PipHost-B9-cZ8Lm.js.gz +0 -0
- package/client/assets/PipHost-B9-cZ8Lm.js.map +1 -0
- package/client/assets/PipHost-DEhjTbGT.css +1 -0
- package/client/assets/PipHost-DEhjTbGT.css.br +0 -0
- package/client/assets/PipHost-DEhjTbGT.css.gz +0 -0
- package/client/assets/ProjectInfo-Dp1TZyBd.js +2 -0
- package/client/assets/ProjectInfo-Dp1TZyBd.js.br +0 -0
- package/client/assets/ProjectInfo-Dp1TZyBd.js.gz +0 -0
- package/client/assets/{ProjectInfo-CJ-GLvVG.js.map → ProjectInfo-Dp1TZyBd.js.map} +1 -1
- package/client/assets/ProtectRoute-EejQ5o_H.js +2 -0
- package/client/assets/ProtectRoute-EejQ5o_H.js.br +0 -0
- package/client/assets/ProtectRoute-EejQ5o_H.js.gz +0 -0
- package/client/assets/{ProtectRoute-DJ9xZnPI.js.map → ProtectRoute-EejQ5o_H.js.map} +1 -1
- package/client/assets/{ProtectedCuesheet-CMTscjjR.css → ProtectedCuesheet-C_tKodwo.css} +1 -1
- package/client/assets/ProtectedCuesheet-C_tKodwo.css.br +0 -0
- package/client/assets/ProtectedCuesheet-C_tKodwo.css.gz +0 -0
- package/client/assets/ProtectedCuesheet-DvYSgueA.js +2 -0
- package/client/assets/ProtectedCuesheet-DvYSgueA.js.br +0 -0
- package/client/assets/ProtectedCuesheet-DvYSgueA.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-DvYSgueA.js.map +1 -0
- package/client/assets/ProtectedEditor-B0l0X3QP.js +3 -0
- package/client/assets/ProtectedEditor-B0l0X3QP.js.br +0 -0
- package/client/assets/ProtectedEditor-B0l0X3QP.js.gz +0 -0
- package/client/assets/ProtectedEditor-B0l0X3QP.js.map +1 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css +1 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css.br +0 -0
- package/client/assets/ProtectedEditor-Dw0pWw0J.css.gz +0 -0
- package/client/assets/RundownEntry-Blq5OsMH.css +1 -0
- package/client/assets/RundownEntry-Blq5OsMH.css.br +0 -0
- package/client/assets/RundownEntry-Blq5OsMH.css.gz +0 -0
- package/client/assets/RundownEntry-CwiStTnR.js +2 -0
- package/client/assets/RundownEntry-CwiStTnR.js.br +0 -0
- package/client/assets/RundownEntry-CwiStTnR.js.gz +0 -0
- package/client/assets/RundownEntry-CwiStTnR.js.map +1 -0
- package/client/assets/RundownExport-CCaOfHIr.js +3 -0
- package/client/assets/RundownExport-CCaOfHIr.js.br +0 -0
- package/client/assets/RundownExport-CCaOfHIr.js.gz +0 -0
- package/client/assets/RundownExport-CCaOfHIr.js.map +1 -0
- package/client/assets/{RundownExport-1zBZurIG.css → RundownExport-DtSvAfBG.css} +1 -1
- package/client/assets/RundownExport-DtSvAfBG.css.br +0 -0
- package/client/assets/RundownExport-DtSvAfBG.css.gz +0 -0
- package/client/assets/{Select-BLA-yQMq.js → Select-cHK8JrMG.js} +2 -2
- package/client/assets/Select-cHK8JrMG.js.br +0 -0
- package/client/assets/Select-cHK8JrMG.js.gz +0 -0
- package/client/assets/{Select-BLA-yQMq.js.map → Select-cHK8JrMG.js.map} +1 -1
- package/client/assets/Studio-BzwFDYzk.js +2 -0
- package/client/assets/Studio-BzwFDYzk.js.br +0 -0
- package/client/assets/Studio-BzwFDYzk.js.gz +0 -0
- package/client/assets/Studio-BzwFDYzk.js.map +1 -0
- package/client/assets/StyleEditor-RZvkKHdf.js +2 -0
- package/client/assets/StyleEditor-RZvkKHdf.js.br +0 -0
- package/client/assets/StyleEditor-RZvkKHdf.js.gz +0 -0
- package/client/assets/{StyleEditor-DNjZ46Qf.js.map → StyleEditor-RZvkKHdf.js.map} +1 -1
- package/client/assets/SuperscriptPeriod-DaZq1rr6.js +2 -0
- package/client/assets/SuperscriptPeriod-DaZq1rr6.js.br +0 -0
- package/client/assets/SuperscriptPeriod-DaZq1rr6.js.gz +0 -0
- package/client/assets/SuperscriptPeriod-DaZq1rr6.js.map +1 -0
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js +2 -0
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js.br +0 -0
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js.gz +0 -0
- package/client/assets/{SuperscriptTime-C8ypTVpH.js.map → SuperscriptTime-Mc0ZGBMo.js.map} +1 -1
- package/client/assets/TimeElements-c2rTHN98.css +1 -0
- package/client/assets/TimeElements-c2rTHN98.css.br +0 -0
- package/client/assets/TimeElements-c2rTHN98.css.gz +0 -0
- package/client/assets/TimeElements-dIvFHgcd.js +2 -0
- package/client/assets/TimeElements-dIvFHgcd.js.br +0 -0
- package/client/assets/TimeElements-dIvFHgcd.js.gz +0 -0
- package/client/assets/TimeElements-dIvFHgcd.js.map +1 -0
- package/client/assets/{TimeInput-BrVdiuOQ.css → TimeInput-Cu-N5DmX.css} +1 -1
- package/client/assets/TimeInput-Cu-N5DmX.css.br +0 -0
- package/client/assets/TimeInput-Cu-N5DmX.css.gz +0 -0
- package/client/assets/TimeInput-Duzx40TC.js +2 -0
- package/client/assets/TimeInput-Duzx40TC.js.br +0 -0
- package/client/assets/TimeInput-Duzx40TC.js.gz +0 -0
- package/client/assets/{TimeInput-DU09ewqh.js.map → TimeInput-Duzx40TC.js.map} +1 -1
- package/client/assets/TimelinePage-C-OHrCR8.js +2 -0
- package/client/assets/TimelinePage-C-OHrCR8.js.br +0 -0
- package/client/assets/TimelinePage-C-OHrCR8.js.gz +0 -0
- package/client/assets/TimelinePage-C-OHrCR8.js.map +1 -0
- package/client/assets/TimelinePage-CcFl3uul.css +1 -0
- package/client/assets/TimelinePage-CcFl3uul.css.br +0 -0
- package/client/assets/TimelinePage-CcFl3uul.css.gz +0 -0
- package/client/assets/Timer-CGqVtVEC.js +2 -0
- package/client/assets/Timer-CGqVtVEC.js.br +0 -0
- package/client/assets/Timer-CGqVtVEC.js.gz +0 -0
- package/client/assets/Timer-CGqVtVEC.js.map +1 -0
- package/client/assets/{Timer-B7nk3TMf.css → Timer-Jjolf5Ra.css} +1 -1
- package/client/assets/Timer-Jjolf5Ra.css.br +0 -0
- package/client/assets/Timer-Jjolf5Ra.css.gz +0 -0
- package/client/assets/{TimerControlExport-D8kqHQB0.css → TimerControlExport-DavNxY9p.css} +1 -1
- package/client/assets/TimerControlExport-DavNxY9p.css.br +0 -0
- package/client/assets/TimerControlExport-DavNxY9p.css.gz +0 -0
- package/client/assets/TimerControlExport-GJn4WWdH.js +2 -0
- package/client/assets/TimerControlExport-GJn4WWdH.js.br +0 -0
- package/client/assets/TimerControlExport-GJn4WWdH.js.gz +0 -0
- package/client/assets/{TimerControlExport-i0ZDpUx7.js.map → TimerControlExport-GJn4WWdH.js.map} +1 -1
- package/client/assets/TitleCard-BqbrUnHO.js +2 -0
- package/client/assets/TitleCard-BqbrUnHO.js.br +0 -0
- package/client/assets/TitleCard-BqbrUnHO.js.gz +0 -0
- package/client/assets/{TitleCard-BgOtucv6.js.map → TitleCard-BqbrUnHO.js.map} +1 -1
- package/client/assets/Tooltip-BQBvaIZx.js +2 -0
- package/client/assets/Tooltip-BQBvaIZx.js.br +0 -0
- package/client/assets/Tooltip-BQBvaIZx.js.gz +0 -0
- package/client/assets/{Tooltip-C0rGHLsB.js.map → Tooltip-BQBvaIZx.js.map} +1 -1
- package/client/assets/ViewLogo-BdL1hUV1.js +2 -0
- package/client/assets/ViewLogo-BdL1hUV1.js.br +0 -0
- package/client/assets/ViewLogo-BdL1hUV1.js.gz +0 -0
- package/client/assets/{ViewLogo--9miplQv.js.map → ViewLogo-BdL1hUV1.js.map} +1 -1
- package/client/assets/ViewParamsEditor-CFedpp6w.js +2 -0
- package/client/assets/ViewParamsEditor-CFedpp6w.js.br +0 -0
- package/client/assets/ViewParamsEditor-CFedpp6w.js.gz +0 -0
- package/client/assets/ViewParamsEditor-CFedpp6w.js.map +1 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css +1 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css.br +0 -0
- package/client/assets/ViewParamsEditor-CupOV30k.css.gz +0 -0
- package/client/assets/dateConfig-BU1RZfIK.js +2 -0
- package/client/assets/dateConfig-BU1RZfIK.js.br +0 -0
- package/client/assets/dateConfig-BU1RZfIK.js.gz +0 -0
- package/client/assets/dateConfig-BU1RZfIK.js.map +1 -0
- package/client/assets/editorSettings-BMt-7s8I.js +2 -0
- package/client/assets/editorSettings-BMt-7s8I.js.br +0 -0
- package/client/assets/editorSettings-BMt-7s8I.js.gz +0 -0
- package/client/assets/{editorSettings-CCHx-wCx.js.map → editorSettings-BMt-7s8I.js.map} +1 -1
- package/client/assets/{getProgress-B94Ieskb.js → getProgress-sdxPEEPi.js} +2 -2
- package/client/assets/getProgress-sdxPEEPi.js.br +0 -0
- package/client/assets/getProgress-sdxPEEPi.js.gz +0 -0
- package/client/assets/{getProgress-B94Ieskb.js.map → getProgress-sdxPEEPi.js.map} +1 -1
- package/client/assets/{index-De0uf0Ta.css → index-BuJoGGff.css} +1 -1
- package/client/assets/index-BuJoGGff.css.br +0 -0
- package/client/assets/index-BuJoGGff.css.gz +0 -0
- package/client/assets/index-CoGiopcb.js +3 -0
- package/client/assets/index-CoGiopcb.js.br +0 -0
- package/client/assets/index-CoGiopcb.js.gz +0 -0
- package/client/assets/index-CoGiopcb.js.map +1 -0
- package/client/assets/offset-BS90Rks2.js +2 -0
- package/client/assets/offset-BS90Rks2.js.br +0 -0
- package/client/assets/offset-BS90Rks2.js.gz +0 -0
- package/client/assets/offset-BS90Rks2.js.map +1 -0
- package/client/assets/parseUserTime-DZJMcfuJ.js +2 -0
- package/client/assets/parseUserTime-DZJMcfuJ.js.br +0 -0
- package/client/assets/parseUserTime-DZJMcfuJ.js.gz +0 -0
- package/client/assets/{parseUserTime-Bc1pSJR2.js.map → parseUserTime-DZJMcfuJ.js.map} +1 -1
- package/client/assets/playbackstate-CWexoP3a.js +2 -0
- package/client/assets/playbackstate-CWexoP3a.js.br +0 -0
- package/client/assets/playbackstate-CWexoP3a.js.gz +0 -0
- package/client/assets/{playbackstate-BpzbtG9F.js.map → playbackstate-CWexoP3a.js.map} +1 -1
- package/client/assets/{presentation.utils-B2baBe3j.js → presentation.utils-Zo5hNQje.js} +2 -2
- package/client/assets/presentation.utils-Zo5hNQje.js.br +0 -0
- package/client/assets/presentation.utils-Zo5hNQje.js.gz +0 -0
- package/client/assets/{presentation.utils-B2baBe3j.js.map → presentation.utils-Zo5hNQje.js.map} +1 -1
- package/client/assets/rundownUtils-Dl1x6NDv.js +2 -0
- package/client/assets/rundownUtils-Dl1x6NDv.js.br +0 -0
- package/client/assets/rundownUtils-Dl1x6NDv.js.gz +0 -0
- package/client/assets/{rundownUtils-H6xvQyre.js.map → rundownUtils-Dl1x6NDv.js.map} +1 -1
- package/client/assets/timer.utils-BnMyVO6Z.js +2 -0
- package/client/assets/timer.utils-BnMyVO6Z.js.br +0 -0
- package/client/assets/timer.utils-BnMyVO6Z.js.gz +0 -0
- package/client/assets/timer.utils-BnMyVO6Z.js.map +1 -0
- package/client/assets/{useCustomFields-Da0Li7nQ.js → useCustomFields-CcTb-GQM.js} +2 -2
- package/client/assets/useCustomFields-CcTb-GQM.js.br +0 -0
- package/client/assets/useCustomFields-CcTb-GQM.js.gz +0 -0
- package/client/assets/{useCustomFields-Da0Li7nQ.js.map → useCustomFields-CcTb-GQM.js.map} +1 -1
- package/client/assets/useFollowComponent-BjhV6Uv8.js +2 -0
- package/client/assets/useFollowComponent-BjhV6Uv8.js.br +0 -0
- package/client/assets/useFollowComponent-BjhV6Uv8.js.gz +0 -0
- package/client/assets/{useFollowComponent-Qo3FobyV.js.map → useFollowComponent-BjhV6Uv8.js.map} +1 -1
- package/client/assets/{useProjectData-DW06zQvF.js → useProjectData-B5mjXsMj.js} +2 -2
- package/client/assets/useProjectData-B5mjXsMj.js.br +0 -0
- package/client/assets/useProjectData-B5mjXsMj.js.gz +0 -0
- package/client/assets/{useProjectData-DW06zQvF.js.map → useProjectData-B5mjXsMj.js.map} +1 -1
- package/client/assets/useReport-zMbyWwpn.js +2 -0
- package/client/assets/useReport-zMbyWwpn.js.br +0 -0
- package/client/assets/useReport-zMbyWwpn.js.gz +0 -0
- package/client/assets/{useReport-DhFY2L8v.js.map → useReport-zMbyWwpn.js.map} +1 -1
- package/client/assets/useRundown-CHsh5rnl.js +2 -0
- package/client/assets/useRundown-CHsh5rnl.js.br +0 -0
- package/client/assets/useRundown-CHsh5rnl.js.gz +0 -0
- package/client/assets/useRundown-CHsh5rnl.js.map +1 -0
- package/client/assets/useWindowTitle-mLKt65i7.js +2 -0
- package/client/assets/useWindowTitle-mLKt65i7.js.br +0 -0
- package/client/assets/useWindowTitle-mLKt65i7.js.gz +0 -0
- package/client/assets/{useWindowTitle-B2UzPuki.js.map → useWindowTitle-mLKt65i7.js.map} +1 -1
- package/client/assets/{validateEvent-BJMwP_mq.js → validateEvent-CUmvjN95.js} +2 -2
- package/client/assets/validateEvent-CUmvjN95.js.br +0 -0
- package/client/assets/validateEvent-CUmvjN95.js.gz +0 -0
- package/client/assets/{validateEvent-BJMwP_mq.js.map → validateEvent-CUmvjN95.js.map} +1 -1
- package/client/assets/{vendor-9UkPSc5K.js → vendor-Cdwxo8bP.js} +23 -23
- package/client/assets/vendor-Cdwxo8bP.js.br +0 -0
- package/client/assets/vendor-Cdwxo8bP.js.gz +0 -0
- package/client/assets/{vendor-9UkPSc5K.js.map → vendor-Cdwxo8bP.js.map} +1 -1
- package/client/assets/{viewLoader.utils-DQGhrjSp.js → viewLoader.utils-DuXjY5zb.js} +2 -2
- package/client/assets/viewLoader.utils-DuXjY5zb.js.br +0 -0
- package/client/assets/viewLoader.utils-DuXjY5zb.js.gz +0 -0
- package/client/assets/{viewLoader.utils-DQGhrjSp.js.map → viewLoader.utils-DuXjY5zb.js.map} +1 -1
- package/client/assets/viewUtils-dKRKkb_F.js +2 -0
- package/client/assets/viewUtils-dKRKkb_F.js.br +0 -0
- package/client/assets/viewUtils-dKRKkb_F.js.gz +0 -0
- package/client/assets/viewUtils-dKRKkb_F.js.map +1 -0
- package/client/index.html +3 -3
- package/package.json +1 -1
- package/server/index.cjs +97 -97
- package/client/assets/Backstage-BhtXVpms.js +0 -2
- package/client/assets/Backstage-BhtXVpms.js.br +0 -0
- package/client/assets/Backstage-BhtXVpms.js.gz +0 -0
- package/client/assets/Backstage-BhtXVpms.js.map +0 -1
- package/client/assets/Countdown-NmGi1KMx.js +0 -2
- package/client/assets/Countdown-NmGi1KMx.js.br +0 -0
- package/client/assets/Countdown-NmGi1KMx.js.gz +0 -0
- package/client/assets/Countdown-NmGi1KMx.js.map +0 -1
- package/client/assets/CustomTranslationModal-BBNxpds0.js +0 -2
- package/client/assets/CustomTranslationModal-BBNxpds0.js.br +0 -0
- package/client/assets/CustomTranslationModal-BBNxpds0.js.gz +0 -0
- package/client/assets/DelayIndicator-CFCDQ7FN.js +0 -2
- package/client/assets/DelayIndicator-CFCDQ7FN.js.br +0 -0
- package/client/assets/DelayIndicator-CFCDQ7FN.js.gz +0 -0
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js +0 -2
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-D55c8JBz.js.gz +0 -0
- package/client/assets/EditorUtils-BXko-IuN.css +0 -1
- package/client/assets/EditorUtils-BXko-IuN.css.br +0 -0
- package/client/assets/EditorUtils-BXko-IuN.css.gz +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js +0 -2
- package/client/assets/EditorUtils-CFE106qQ.js.br +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js.gz +0 -0
- package/client/assets/EditorUtils-CFE106qQ.js.map +0 -1
- package/client/assets/Empty-C-JO_XAr.js +0 -2
- package/client/assets/Empty-C-JO_XAr.js.br +0 -2
- package/client/assets/Empty-C-JO_XAr.js.gz +0 -0
- package/client/assets/EmptyPage-BSzsxpGg.js +0 -2
- package/client/assets/EmptyPage-BSzsxpGg.js.br +0 -1
- package/client/assets/EmptyPage-BSzsxpGg.js.gz +0 -0
- package/client/assets/FollowButton-Mox6N4JW.js +0 -2
- package/client/assets/FollowButton-Mox6N4JW.js.br +0 -0
- package/client/assets/FollowButton-Mox6N4JW.js.gz +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js +0 -2
- package/client/assets/MessageControlExport-BL2ip9qN.js.br +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js.gz +0 -0
- package/client/assets/MessageControlExport-BL2ip9qN.js.map +0 -1
- package/client/assets/MessageControlExport-DPgqVb-4.css +0 -1
- package/client/assets/MessageControlExport-DPgqVb-4.css.br +0 -0
- package/client/assets/MessageControlExport-DPgqVb-4.css.gz +0 -0
- package/client/assets/MilestoneEditor-906SVj5M.css +0 -1
- package/client/assets/MilestoneEditor-906SVj5M.css.br +0 -0
- package/client/assets/MilestoneEditor-906SVj5M.css.gz +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js +0 -2
- package/client/assets/MilestoneEditor-DcWPGKNK.js.br +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js.gz +0 -0
- package/client/assets/MilestoneEditor-DcWPGKNK.js.map +0 -1
- package/client/assets/Modal-krcwDRb-.js +0 -2
- package/client/assets/Modal-krcwDRb-.js.br +0 -0
- package/client/assets/Modal-krcwDRb-.js.gz +0 -0
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js +0 -2
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BXQbpM-j.js.gz +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js +0 -2
- package/client/assets/OperatorExport-C50KHBrD.js.br +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js.gz +0 -0
- package/client/assets/OperatorExport-C50KHBrD.js.map +0 -1
- package/client/assets/OperatorExport-QyLn8tmf.css +0 -1
- package/client/assets/OperatorExport-QyLn8tmf.css.br +0 -0
- package/client/assets/OperatorExport-QyLn8tmf.css.gz +0 -0
- package/client/assets/OverviewWrapper-MGJ1uE5W.js.br +0 -0
- package/client/assets/OverviewWrapper-MGJ1uE5W.js.gz +0 -0
- package/client/assets/OverviewWrapper-a18gep4m.css +0 -1
- package/client/assets/OverviewWrapper-a18gep4m.css.br +0 -0
- package/client/assets/OverviewWrapper-a18gep4m.css.gz +0 -0
- package/client/assets/ProjectInfo-CJ-GLvVG.js +0 -2
- package/client/assets/ProjectInfo-CJ-GLvVG.js.br +0 -0
- package/client/assets/ProjectInfo-CJ-GLvVG.js.gz +0 -0
- package/client/assets/ProtectRoute-DJ9xZnPI.js +0 -2
- package/client/assets/ProtectRoute-DJ9xZnPI.js.br +0 -0
- package/client/assets/ProtectRoute-DJ9xZnPI.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js +0 -2
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.br +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-B8tg6Mmo.js.map +0 -1
- package/client/assets/ProtectedCuesheet-CMTscjjR.css.br +0 -0
- package/client/assets/ProtectedCuesheet-CMTscjjR.css.gz +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.js +0 -3
- package/client/assets/ProtectedEditor-Bl4wV72N.js.br +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.js.gz +0 -0
- package/client/assets/ProtectedEditor-Bl4wV72N.js.map +0 -1
- package/client/assets/ProtectedEditor-BoiAT_IR.css +0 -1
- package/client/assets/ProtectedEditor-BoiAT_IR.css.br +0 -0
- package/client/assets/ProtectedEditor-BoiAT_IR.css.gz +0 -0
- package/client/assets/RundownEntry-3gFEEUnw.css +0 -1
- package/client/assets/RundownEntry-3gFEEUnw.css.br +0 -0
- package/client/assets/RundownEntry-3gFEEUnw.css.gz +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.js +0 -2
- package/client/assets/RundownEntry-D9tXNXPy.js.br +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.js.gz +0 -0
- package/client/assets/RundownEntry-D9tXNXPy.js.map +0 -1
- package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
- package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
- package/client/assets/RundownExport-D6uAmFbb.js +0 -3
- package/client/assets/RundownExport-D6uAmFbb.js.br +0 -0
- package/client/assets/RundownExport-D6uAmFbb.js.gz +0 -0
- package/client/assets/RundownExport-D6uAmFbb.js.map +0 -1
- package/client/assets/Select-BLA-yQMq.js.br +0 -0
- package/client/assets/Select-BLA-yQMq.js.gz +0 -0
- package/client/assets/Studio-DbP92DTf.js +0 -2
- package/client/assets/Studio-DbP92DTf.js.br +0 -0
- package/client/assets/Studio-DbP92DTf.js.gz +0 -0
- package/client/assets/Studio-DbP92DTf.js.map +0 -1
- package/client/assets/StyleEditor-DNjZ46Qf.js +0 -2
- package/client/assets/StyleEditor-DNjZ46Qf.js.br +0 -0
- package/client/assets/StyleEditor-DNjZ46Qf.js.gz +0 -0
- package/client/assets/SuperscriptTime-C8ypTVpH.js +0 -2
- package/client/assets/SuperscriptTime-C8ypTVpH.js.br +0 -0
- package/client/assets/SuperscriptTime-C8ypTVpH.js.gz +0 -0
- package/client/assets/TimeElements-BcQdm4ZV.css +0 -1
- package/client/assets/TimeElements-BcQdm4ZV.css.br +0 -0
- package/client/assets/TimeElements-BcQdm4ZV.css.gz +0 -0
- package/client/assets/TimeElements-DlEBhXe0.js +0 -2
- package/client/assets/TimeElements-DlEBhXe0.js.br +0 -0
- package/client/assets/TimeElements-DlEBhXe0.js.gz +0 -0
- package/client/assets/TimeElements-DlEBhXe0.js.map +0 -1
- package/client/assets/TimeInput-BrVdiuOQ.css.br +0 -0
- package/client/assets/TimeInput-BrVdiuOQ.css.gz +0 -0
- package/client/assets/TimeInput-DU09ewqh.js +0 -2
- package/client/assets/TimeInput-DU09ewqh.js.br +0 -0
- package/client/assets/TimeInput-DU09ewqh.js.gz +0 -0
- package/client/assets/TimelinePage-BJav6PAb.css +0 -1
- package/client/assets/TimelinePage-BJav6PAb.css.br +0 -0
- package/client/assets/TimelinePage-BJav6PAb.css.gz +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js +0 -2
- package/client/assets/TimelinePage-DTwqRihn.js.br +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js.gz +0 -0
- package/client/assets/TimelinePage-DTwqRihn.js.map +0 -1
- package/client/assets/Timer-B7nk3TMf.css.br +0 -0
- package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
- package/client/assets/Timer-jjWAunJc.js +0 -2
- package/client/assets/Timer-jjWAunJc.js.br +0 -0
- package/client/assets/Timer-jjWAunJc.js.gz +0 -0
- package/client/assets/Timer-jjWAunJc.js.map +0 -1
- package/client/assets/TimerControlExport-D8kqHQB0.css.br +0 -0
- package/client/assets/TimerControlExport-D8kqHQB0.css.gz +0 -0
- package/client/assets/TimerControlExport-i0ZDpUx7.js +0 -2
- package/client/assets/TimerControlExport-i0ZDpUx7.js.br +0 -0
- package/client/assets/TimerControlExport-i0ZDpUx7.js.gz +0 -0
- package/client/assets/TitleCard-BgOtucv6.js +0 -2
- package/client/assets/TitleCard-BgOtucv6.js.br +0 -0
- package/client/assets/TitleCard-BgOtucv6.js.gz +0 -0
- package/client/assets/Tooltip-C0rGHLsB.js +0 -2
- package/client/assets/Tooltip-C0rGHLsB.js.br +0 -0
- package/client/assets/Tooltip-C0rGHLsB.js.gz +0 -0
- package/client/assets/ViewLogo--9miplQv.js +0 -2
- package/client/assets/ViewLogo--9miplQv.js.br +0 -0
- package/client/assets/ViewLogo--9miplQv.js.gz +0 -0
- package/client/assets/ViewParamsEditor-1Ok39npF.css +0 -1
- package/client/assets/ViewParamsEditor-1Ok39npF.css.br +0 -0
- package/client/assets/ViewParamsEditor-1Ok39npF.css.gz +0 -0
- package/client/assets/ViewParamsEditor-BFu_0oIb.js +0 -2
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.br +0 -0
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.gz +0 -0
- package/client/assets/ViewParamsEditor-BFu_0oIb.js.map +0 -1
- package/client/assets/dateConfig-WYqMzV9D.js +0 -2
- package/client/assets/dateConfig-WYqMzV9D.js.br +0 -0
- package/client/assets/dateConfig-WYqMzV9D.js.gz +0 -0
- package/client/assets/dateConfig-WYqMzV9D.js.map +0 -1
- package/client/assets/editorSettings-CCHx-wCx.js +0 -2
- package/client/assets/editorSettings-CCHx-wCx.js.br +0 -0
- package/client/assets/editorSettings-CCHx-wCx.js.gz +0 -0
- package/client/assets/getProgress-B94Ieskb.js.br +0 -0
- package/client/assets/getProgress-B94Ieskb.js.gz +0 -0
- package/client/assets/index-De0uf0Ta.css.br +0 -0
- package/client/assets/index-De0uf0Ta.css.gz +0 -0
- package/client/assets/index-njXwwjfn.js +0 -3
- package/client/assets/index-njXwwjfn.js.br +0 -0
- package/client/assets/index-njXwwjfn.js.gz +0 -0
- package/client/assets/index-njXwwjfn.js.map +0 -1
- package/client/assets/offset-D1q-72D-.js +0 -2
- package/client/assets/offset-D1q-72D-.js.br +0 -0
- package/client/assets/offset-D1q-72D-.js.gz +0 -0
- package/client/assets/offset-D1q-72D-.js.map +0 -1
- package/client/assets/parseUserTime-Bc1pSJR2.js +0 -2
- package/client/assets/parseUserTime-Bc1pSJR2.js.br +0 -0
- package/client/assets/parseUserTime-Bc1pSJR2.js.gz +0 -0
- package/client/assets/playbackstate-BpzbtG9F.js +0 -2
- package/client/assets/playbackstate-BpzbtG9F.js.br +0 -0
- package/client/assets/playbackstate-BpzbtG9F.js.gz +0 -0
- package/client/assets/presentation.utils-B2baBe3j.js.br +0 -0
- package/client/assets/presentation.utils-B2baBe3j.js.gz +0 -0
- package/client/assets/rundownUtils-H6xvQyre.js +0 -2
- package/client/assets/rundownUtils-H6xvQyre.js.br +0 -0
- package/client/assets/rundownUtils-H6xvQyre.js.gz +0 -0
- package/client/assets/useCustomFields-Da0Li7nQ.js.br +0 -0
- package/client/assets/useCustomFields-Da0Li7nQ.js.gz +0 -0
- package/client/assets/useFollowComponent-Qo3FobyV.js +0 -2
- package/client/assets/useFollowComponent-Qo3FobyV.js.br +0 -0
- package/client/assets/useFollowComponent-Qo3FobyV.js.gz +0 -0
- package/client/assets/useProjectData-DW06zQvF.js.br +0 -0
- package/client/assets/useProjectData-DW06zQvF.js.gz +0 -0
- package/client/assets/useReport-DhFY2L8v.js +0 -2
- package/client/assets/useReport-DhFY2L8v.js.br +0 -0
- package/client/assets/useReport-DhFY2L8v.js.gz +0 -0
- package/client/assets/useRundown-ihoU8qBi.js +0 -2
- package/client/assets/useRundown-ihoU8qBi.js.br +0 -0
- package/client/assets/useRundown-ihoU8qBi.js.gz +0 -0
- package/client/assets/useRundown-ihoU8qBi.js.map +0 -1
- package/client/assets/useWindowTitle-B2UzPuki.js +0 -2
- package/client/assets/useWindowTitle-B2UzPuki.js.br +0 -0
- package/client/assets/useWindowTitle-B2UzPuki.js.gz +0 -0
- package/client/assets/validateEvent-BJMwP_mq.js.br +0 -0
- package/client/assets/validateEvent-BJMwP_mq.js.gz +0 -0
- package/client/assets/vendor-9UkPSc5K.js.br +0 -0
- package/client/assets/vendor-9UkPSc5K.js.gz +0 -0
- package/client/assets/viewLoader.utils-DQGhrjSp.js.br +0 -0
- package/client/assets/viewLoader.utils-DQGhrjSp.js.gz +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,l as G,h as d,y as te,ab as se}from"./vendor-9UkPSc5K.js";import{i as o,q as ne,v as ae,g as f,P as ie,b as L,w as $,a as re,u as oe,d as ce,L as le,f as Q,x as de,y as ue,z as me,h as he,O as xe,s as fe,A as pe}from"./index-njXwwjfn.js";import{g as ve}from"./getProgress-B94Ieskb.js";import{E as ge}from"./Empty-C-JO_XAr.js";import{E as ye}from"./EmptyPage-BSzsxpGg.js";import{T as z}from"./TitleCard-BgOtucv6.js";import{V as _e}from"./ViewLogo--9miplQv.js";import{O as B,i as D,m as A,d as je,g as V,V as Ne}from"./ViewParamsEditor-BFu_0oIb.js";import{u as we}from"./useWindowTitle-B2UzPuki.js";import{S as p}from"./SuperscriptTime-C8ypTVpH.js";import{b as Se,i as W,c as be}from"./useRundown-ihoU8qBi.js";import{g as Ee}from"./offset-D1q-72D-.js";import{g as ke,a as Pe}from"./viewLoader.utils-DQGhrjSp.js";import{u as Ie}from"./useCustomFields-Da0Li7nQ.js";import{u as Te}from"./useProjectData-DW06zQvF.js";import"./Select-BLA-yQMq.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="20d9b83a-1091-42b1-969f-47049994ca35",t._sentryDebugIdIdentifier="sentry-dbid-20d9b83a-1091-42b1-969f-47049994ca35")}catch{}})();function Oe(t){const{current:s,duration:n,className:a}=t,i=ve(s,n);return e.jsx("div",{className:`progress-bar__bg ${a}`,children:e.jsx("div",{className:"progress-bar__indicator",style:{width:`${i}%`}})})}const Ce=t=>({title:B.Schedule,collapsible:!0,options:[{id:"filter",title:"Filter",description:"Hide events without data in the selected custom field",type:"option",values:t,defaultValue:"none"},{id:"stopCycle",title:"Stop cycling through event pages",description:"Schedule will not auto-cycle through events",type:"boolean",defaultValue:!1},{id:"cycleInterval",title:"Cycle interval",description:"How long (in seconds) should each schedule page be shown.",type:"number",defaultValue:10},{id:"showExpected",title:"Show expected time",description:"Whether the times shown should account for the runtime offset.",type:"boolean",defaultValue:!1}]});function Fe(t){return{filter:t.get("filter"),cycleInterval:Number(t.get("cycleInterval"))||10,stopCycle:D(t.get("stopCycle")),showExpected:D(t.get("showExpected"))}}function K(){const[t]=G();return d.useMemo(()=>Fe(t),[t])}const U=d.createContext(void 0),Ve=({children:t,selectedEventId:s})=>{const{cycleInterval:n,stopCycle:a,filter:i}=K(),{data:r}=Se(c=>{if(i){const k=i.startsWith("custom-")?i.slice(7):i;return W(c)&&!!c.custom[k]}return W(c)}),[l,u]=d.useState(-1),[x,g]=d.useState(0),[v,y]=d.useState(0),m=d.useRef(-1),S=d.useRef(void 0),N=d.useRef(null);d.useLayoutEffect(()=>{if(!N.current)return;const c=Array.from(N.current.children);if(c.length===0)return;const k=N.current.clientHeight;let b=0,F=1,P=1,I=-1,_=!1;for(let h=0;h<c.length;h++){const j=c[h].clientHeight,O=b+j>k;O&&(b=0,P+=1),h<l?T(c[h]):I===-1?(_=!0,F=P):O&&(_=!1),_?(I=h,H(c[h],b)):T(c[h]),b+=j}y(F),g(P),m.current=I;function H(h,j){h.style.top=`${j}px`}function T(h){h.style.top="-1000px"}},[l,r]),d.useEffect(()=>{if(a){y(1),u(0);return}S.current&&clearInterval(S.current);const c=setInterval(()=>{u(v===x?0:m.current+1)},n*1e3);return S.current=c,()=>clearInterval(S.current)},[n,x,a,v]);let C=r.findIndex(c=>c.id===s);const w=r.slice(C+1);return C=0,e.jsx(U,{value:{events:w,selectedEventId:s,numPages:x,visiblePage:v,containerRef:N},children:t})},Z=()=>{const t=d.use(U);if(!t)throw new Error("useSchedule() can only be used inside a ScheduleContext");return t},E={format12:"hh:mm a",format24:"HH:mm"};function Be({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:l,duration:u,skip:x,title:g,timeEnd:v,cue:y}){const{showExpected:m}=K();return e.jsxs("li",{className:o(["entry",x&&"entry--skip"]),"data-testid":y,children:[e.jsx("div",{className:"entry-times",children:m?e.jsx(Me,{timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:u,colour:l}):n>0?e.jsx(Le,{timeStart:t,delay:n,colour:l,timeEnd:v}):e.jsx(He,{timeStart:t,timeEnd:v,colour:l})}),e.jsx("div",{className:"entry-title",children:g})]})}function He({timeStart:t,timeEnd:s,colour:n}){const a=f(t,E),i=f(s,E);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:n}}),e.jsx(p,{time:a}),"→",e.jsx(p,{time:i})]})}function Le({timeStart:t,timeEnd:s,colour:n,delay:a}){const i=f(t,E),r=f(s,E),l=f(t+a,E),u=f(s+a,E);return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"entry-times--delayed",children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:n}}),e.jsx(p,{time:i}),"→",e.jsx(p,{time:r})]}),e.jsxs("span",{className:"entry-times--delay",children:[e.jsx(p,{time:l}),"→",e.jsx(p,{time:u})]})]})}function Me({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:l,duration:u}){const x=ne(),{expectedStart:g,expectedEnd:v,plannedEnd:y}=ae({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:u},x);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:l}}),e.jsx(q,{expectedTime:g,plannedTime:t}),"→",e.jsx(q,{expectedTime:v,plannedTime:y})]})}function q({expectedTime:t,plannedTime:s}){const n=f(t),a=Ee(t-s);return e.jsx(p,{className:`entry-times--${a}`,time:n})}function Re({className:t}){const{events:s,containerRef:n}=Z();return(s==null?void 0:s.length)<1?null:e.jsx("ul",{className:o(["schedule",t]),ref:n,children:s.map(a=>e.jsx(Be,{timeStart:a.timeStart,dayOffset:a.dayOffset,delay:a.delay,totalGap:a.totalGap,isLinkedToLoaded:a.isLinkedToLoaded,countToEnd:a.countToEnd,duration:a.duration,colour:a.colour,skip:a.skip,title:a.title,timeEnd:a.timeEnd,cue:a.cue},a.id))})}function $e({className:t}){const{numPages:s,visiblePage:n}=Z();return s>10?e.jsxs("div",{className:o(["schedule-nav",t]),children:[e.jsx("div",{className:o(["schedule-nav__item",n===1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===5&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item","schedule-nav__item--indeterminate",n>5&&n<s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s&&"schedule-nav__item--selected"])})]}):e.jsx("div",{className:o(["schedule-nav",t]),children:s>1&&[...Array(s).keys()].map(a=>e.jsx("div",{className:o(["schedule-nav__item",a+1===n&&"schedule-nav__item--selected"])},a))})}const ze=d.memo(De);function De(t){const{selectedId:s}=t;return e.jsxs(Ve,{selectedEventId:s,children:[e.jsx($e,{className:"schedule-nav-container"}),e.jsx(Re,{className:"schedule-container"})]})}const Ae=(t,s,n)=>{const a=A(s,[{value:"none",label:"None"}]),i=A(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]),r=je(n,[{value:"none",label:"None"}]);return[{title:B.ClockOptions,collapsible:!0,options:[ke(t)]},{title:B.DataSources,collapsible:!0,options:[{id:"secondary-src",title:"Event secondary text",description:"Select the data source for auxiliary text shown in now and next cards",type:"option",values:i,defaultValue:"none"}]},Ce(a),{title:B.ElementVisibility,collapsible:!0,options:[{id:"extra-info",title:"Extra info",description:"Select a project data source to show in the view",type:"option",values:r,defaultValue:"none"}]}]};function We(t,s){const n=a=>(s==null?void 0:s.get(a))??t.get(a);return{secondarySource:n("secondary-src"),extraInfo:n("extra-info")}}function qe(){const[t]=G(),s=d.use(ie);return d.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return We(t,a)},[s,t])}function Ge(t){return(t??0)<0}function Qe(t){return t!==L.Stop}function Ke(t,s){return t===L.Roll&&s===re.Pending}function Ue(t,s,n,a,i){if(i===L.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const r=V(t,n)||$,l=V(t,a),u=V(s,n)||$,x=V(s,a);return{showNow:t!==null,nowMain:r,nowSecondary:l,showNext:s!==null,nextMain:u,nextSecondary:x}}function Ze(){const t=oe(g=>g.mirror),{data:s,status:n}=be(),{data:a,status:i}=Te(),{data:r,status:l}=ce(),{data:u,status:x}=Ie();return{data:{events:s,customFields:u,projectData:a,isMirrored:t,settings:r},status:Pe([n,i,l,x])}}function pt(){const{data:t,status:s}=Ze();return we("Backstage"),s==="pending"?e.jsx(le,{}):s==="error"?e.jsx(ye,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Je,{...t})}function Je({events:t,customFields:s,projectData:n,isMirrored:a,settings:i}){const{getLocalizedString:r}=Q(),{secondarySource:l,extraInfo:u}=qe(),{eventNext:x,eventNow:g,rundown:v,selectedEventId:y,time:m}=de(),[S,N]=d.useState(!1),{height:C}=te();d.useEffect(()=>{N(!1);const ee=setTimeout(()=>{N(!0)},10);return()=>clearTimeout(ee)},[y]);const w=t.length>0,{showNow:c,nowMain:k,nowSecondary:b,showNext:F,nextMain:P,nextSecondary:I}=Ue(g,x,"title",l,m.playback),_=Ke(m.playback,m.phase),H=_?f(m.secondaryTimer):f(m.startedAt),T=(()=>{if(!c&&w)return f(v.plannedStart,{format12:"hh:mm a",format24:"HH:mm"})})(),h=(()=>{if(!c&&w)return f(v.plannedEnd,{format12:"hh:mm a",format24:"HH:mm"})})();let j=ue(m.current,{fallback:pe});j=me(j);const O=Math.max(window.innerWidth/15,72),J=Qe(m.playback),M=w&&C>420,X=T&&h,R=he(i==null?void 0:i.timeFormat),Y=d.useMemo(()=>Ae(R,s,n),[R,s,n]);return e.jsxs("div",{className:`backstage ${a?"mirror":""}`,"data-testid":"backstage-view",children:[e.jsx(Ne,{target:xe.Backstage,viewOptions:Y}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(_e,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(Ye,{})]}),J&&e.jsx(Oe,{className:"progress-container",current:m.current,duration:m.duration}),!w&&e.jsx(ge,{text:r("common.no_data"),className:"empty-container"}),e.jsxs("div",{className:"card-container",children:[c&&e.jsxs("div",{className:o(["event","now",S&&"blink"]),children:[e.jsx(z,{title:k,secondary:b}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:o(["time-entry__label",_&&"time-entry--pending"]),children:r(_?"countdown.waiting":"common.started_at")}),e.jsx(p,{time:H,className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.expected_finish")}),Ge(m.current)?e.jsx("div",{className:"time-entry__value",children:r("countdown.overtime")}):e.jsx(p,{time:f(m.expectedFinish),className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.stage_timer")}),e.jsx("div",{className:"time-entry__value",children:j})]})]})]}),X&&e.jsxs("div",{className:"event",children:[e.jsx("div",{className:"title-card__placeholder",children:r("countdown.waiting")}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:o(["time-entry__label",_&&"time-entry--pending"]),children:r("common.scheduled_start")}),e.jsx(p,{time:T,className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.scheduled_end")}),e.jsx(p,{time:h,className:"time-entry__value"})]})]})]}),F&&w&&e.jsx(z,{className:"event",label:"next",title:P,secondary:I})]}),M&&e.jsx(ze,{selectedId:y}),e.jsxs("div",{className:o(["info",!M&&"info--stretch"]),children:[u&&e.jsx(Xe,{projectData:n,size:O,source:u}),e.jsxs("div",{className:"info-card",children:[n.url&&e.jsx(se,{value:n.url,size:O,level:"L",className:"info-card__qr"}),n.info&&e.jsx("div",{className:"info-card__message",children:n.info})]})]})]})}function Xe({projectData:t,size:s,source:n}){const a=t.custom.find((i,r)=>`${r}-${i.title}`===n);return a?e.jsxs("div",{className:"info-card",children:[a.url&&e.jsx("img",{className:"info-card__img",width:s,src:a.url,onError:i=>i.currentTarget.style.display="none"}),e.jsxs("div",{className:"info__column",children:[a.title&&e.jsx("div",{className:"info-card__label",children:a.title}),a.value&&e.jsx("div",{className:"info-card__message",children:a.value})]})]}):null}function Ye(){const{getLocalizedString:t}=Q(),{clock:s}=fe(),n=f(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(p,{time:n,className:"time"})]})}export{pt as default};
|
|
2
|
-
//# sourceMappingURL=Backstage-BhtXVpms.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Backstage-BhtXVpms.js","sources":["../../src/common/components/progress-bar/ProgressBar.tsx","../../src/views/common/schedule/schedule.options.ts","../../src/views/common/schedule/ScheduleContext.tsx","../../src/views/common/schedule/ScheduleItem.tsx","../../src/views/common/schedule/Schedule.tsx","../../src/views/common/schedule/ScheduleNav.tsx","../../src/views/common/schedule/ScheduleExport.tsx","../../src/views/backstage/backstage.options.ts","../../src/views/backstage/backstage.utils.ts","../../src/views/backstage/useBackstageData.ts","../../src/views/backstage/Backstage.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\n\nimport './ProgressBar.scss';\n\ninterface ProgressBarProps {\n current: MaybeNumber;\n duration: MaybeNumber;\n className?: string;\n}\n\nexport default function ProgressBar(props: ProgressBarProps) {\n const { current, duration, className } = props;\n const progress = getProgress(current, duration);\n\n return (\n <div className={`progress-bar__bg ${className}`}>\n <div className='progress-bar__indicator' style={{ width: `${progress}%` }} />\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { SelectOption } from '../../../common/components/select/Select';\nimport { OptionTitle } from '../../../common/components/view-params-editor/constants';\nimport type { ViewOption } from '../../../common/components/view-params-editor/viewParams.types';\nimport { isStringBoolean } from '../../../features/viewers/common/viewUtils';\n\nexport const getScheduleOptions = (customFieldOptions: SelectOption[]): ViewOption => ({\n title: OptionTitle.Schedule,\n collapsible: true,\n options: [\n {\n id: 'filter',\n title: 'Filter',\n description: 'Hide events without data in the selected custom field',\n type: 'option',\n values: customFieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'stopCycle',\n title: 'Stop cycling through event pages',\n description: 'Schedule will not auto-cycle through events',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'cycleInterval',\n title: 'Cycle interval',\n description: 'How long (in seconds) should each schedule page be shown.',\n type: 'number',\n defaultValue: 10,\n },\n {\n id: 'showExpected',\n title: 'Show expected time',\n description: 'Whether the times shown should account for the runtime offset.',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n});\n\ntype ScheduleOptions = {\n filter: string | null;\n cycleInterval: number;\n stopCycle: boolean;\n showExpected: boolean;\n};\n\nfunction getScheduleOptionsFromParams(searchParams: URLSearchParams): ScheduleOptions {\n return {\n filter: searchParams.get('filter'),\n cycleInterval: Number(searchParams.get('cycleInterval')) || 10,\n stopCycle: isStringBoolean(searchParams.get('stopCycle')),\n showExpected: isStringBoolean(searchParams.get('showExpected')),\n };\n}\n\n/**\n * Hook exposes the schedule component options\n */\nexport function useScheduleOptions() {\n const [searchParams] = useSearchParams();\n const options = useMemo(() => getScheduleOptionsFromParams(searchParams), [searchParams]);\n return options;\n}\n","import { createContext, PropsWithChildren, RefObject, use, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { EntryId, isOntimeEvent, OntimeEntry, OntimeEvent } from 'ontime-types';\n\nimport { usePartialRundown } from '../../../common/hooks-query/useRundown';\nimport { ExtendedEntry } from '../../../common/utils/rundownMetadata';\n\nimport { useScheduleOptions } from './schedule.options';\n\ninterface ScheduleContextState {\n events: ExtendedEntry<OntimeEvent>[];\n selectedEventId: string | null;\n numPages: number;\n visiblePage: number;\n containerRef: RefObject<HTMLUListElement | null>;\n}\n\nconst ScheduleContext = createContext<ScheduleContextState | undefined>(undefined);\n\ninterface ScheduleProviderProps {\n selectedEventId: EntryId | null;\n}\n\nexport const ScheduleProvider = ({ children, selectedEventId }: PropsWithChildren<ScheduleProviderProps>) => {\n const { cycleInterval, stopCycle, filter } = useScheduleOptions();\n const { data: events } = usePartialRundown((entry: ExtendedEntry<OntimeEntry>) => {\n if (filter) {\n // custom keys are prepended with custom-\n const customKey = filter.startsWith('custom-') ? filter.slice('custom-'.length) : filter;\n return isOntimeEvent(entry) && Boolean(entry.custom[customKey]);\n }\n return isOntimeEvent(entry);\n });\n\n const [firstIndex, setFirstIndex] = useState(-1);\n const [numPages, setNumPages] = useState(0);\n const [visiblePage, setVisiblePage] = useState(0);\n\n const lastIndex = useRef(-1);\n const paginator = useRef<NodeJS.Timeout>(undefined);\n\n const containerRef = useRef<HTMLUListElement>(null);\n\n // After the view is rendered, we paginate by hiding elements that dont fit\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n\n const children = Array.from(containerRef.current.children) as HTMLElement[];\n if (children.length === 0) {\n return;\n }\n\n const containerHeight = containerRef.current.clientHeight;\n let currentPageHeight = 0; // used to check when we need to paginate\n let currentPage = 1;\n let numPages = 1;\n let lastVisibleIndex = -1; // keep track of last index on screen\n let isShowingElements = false;\n\n for (let i = 0; i < children.length; i++) {\n const currentElementHeight = children[i].clientHeight;\n\n // can we fit this element in the current page?\n const isNextPage = currentPageHeight + currentElementHeight > containerHeight;\n if (isNextPage) {\n currentPageHeight = 0;\n numPages += 1;\n }\n\n // we hide elements that are before and after the first element to show\n if (i < firstIndex) {\n hideElement(children[i]);\n } else if (lastVisibleIndex === -1) {\n isShowingElements = true;\n currentPage = numPages;\n } else if (isNextPage) {\n isShowingElements = false;\n }\n\n if (!isShowingElements) {\n hideElement(children[i]);\n } else {\n lastVisibleIndex = i;\n showElement(children[i], currentPageHeight);\n }\n\n currentPageHeight += currentElementHeight;\n }\n\n setVisiblePage(currentPage);\n setNumPages(numPages);\n lastIndex.current = lastVisibleIndex;\n\n function showElement(element: HTMLElement, yPosition: number) {\n element.style.top = `${yPosition}px`;\n }\n\n function hideElement(element: HTMLElement) {\n element.style.top = `${-1000}px`;\n }\n // we need to add the events to make sure the effect runs on first render\n }, [firstIndex, events]);\n\n // schedule cycling through events\n useEffect(() => {\n if (stopCycle) {\n setVisiblePage(1);\n setFirstIndex(0);\n return;\n }\n\n if (paginator.current) {\n clearInterval(paginator.current);\n }\n\n const interval = setInterval(() => {\n // ensure we cycle back to the first event\n if (visiblePage === numPages) {\n setFirstIndex(0);\n } else {\n setFirstIndex(lastIndex.current + 1);\n }\n }, cycleInterval * 1000);\n paginator.current = interval;\n\n return () => clearInterval(paginator.current);\n }, [cycleInterval, numPages, stopCycle, visiblePage]);\n\n let selectedEventIndex = events.findIndex((event) => event.id === selectedEventId);\n\n // we want to show the event after the current\n const viewEvents = events.slice(selectedEventIndex + 1);\n selectedEventIndex = 0;\n\n return (\n <ScheduleContext\n value={{\n events: viewEvents as ExtendedEntry<OntimeEvent>[],\n selectedEventId,\n numPages,\n visiblePage,\n containerRef,\n }}\n >\n {children}\n </ScheduleContext>\n );\n};\n\nexport const useSchedule = () => {\n const context = use(ScheduleContext);\n if (!context) {\n throw new Error('useSchedule() can only be used inside a ScheduleContext');\n }\n return context;\n};\n","import { OntimeEvent } from 'ontime-types';\n\nimport { useExpectedStartData } from '../../../common/hooks/useSocket';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { ExtendedEntry } from '../../../common/utils/rundownMetadata';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { formatTime, getExpectedTimesFromExtendedEvent } from '../../../common/utils/time';\nimport SuperscriptTime from '../../../features/viewers/common/superscript-time/SuperscriptTime';\n\nimport { useScheduleOptions } from './schedule.options';\n\nimport './Schedule.scss';\n\nconst formatOptions = {\n format12: 'hh:mm a',\n format24: 'HH:mm',\n};\n\ntype ScheduleItemProps = Pick<\n ExtendedEntry<OntimeEvent>,\n | 'timeStart'\n | 'dayOffset'\n | 'delay'\n | 'totalGap'\n | 'isLinkedToLoaded'\n | 'countToEnd'\n | 'duration'\n | 'colour'\n | 'skip'\n | 'title'\n | 'timeEnd'\n | 'cue'\n>;\n\nexport default function ScheduleItem({\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n colour,\n duration,\n skip,\n title,\n timeEnd,\n cue,\n}: ScheduleItemProps) {\n const { showExpected } = useScheduleOptions();\n\n return (\n <li className={cx(['entry', skip && 'entry--skip'])} data-testid={cue}>\n <div className='entry-times'>\n {showExpected ? (\n <ExpectedScheduleItem\n timeStart={timeStart}\n dayOffset={dayOffset}\n delay={delay}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n countToEnd={countToEnd}\n duration={duration}\n colour={colour}\n />\n ) : delay > 0 ? (\n <DelayedScheduleItem timeStart={timeStart} delay={delay} colour={colour} timeEnd={timeEnd} />\n ) : (\n <PlannedScheduleItem timeStart={timeStart} timeEnd={timeEnd} colour={colour} />\n )}\n </div>\n <div className='entry-title'>{title}</div>\n </li>\n );\n}\n\nfunction PlannedScheduleItem({\n timeStart,\n timeEnd,\n colour,\n}: Pick<ScheduleItemProps, 'timeStart' | 'timeEnd' | 'colour'>) {\n const start = formatTime(timeStart, formatOptions);\n const end = formatTime(timeEnd, formatOptions);\n\n return (\n <>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <SuperscriptTime time={start} />\n →\n <SuperscriptTime time={end} />\n </>\n );\n}\n\nfunction DelayedScheduleItem({\n timeStart,\n timeEnd,\n colour,\n delay,\n}: Pick<ScheduleItemProps, 'timeStart' | 'timeEnd' | 'colour' | 'delay'>) {\n const start = formatTime(timeStart, formatOptions);\n const end = formatTime(timeEnd, formatOptions);\n const delayedStart = formatTime(timeStart + delay, formatOptions);\n const delayedEnd = formatTime(timeEnd + delay, formatOptions);\n\n return (\n <>\n <span className='entry-times--delayed'>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <SuperscriptTime time={start} />\n →\n <SuperscriptTime time={end} />\n </span>\n <span className='entry-times--delay'>\n <SuperscriptTime time={delayedStart} />\n →\n <SuperscriptTime time={delayedEnd} />\n </span>\n </>\n );\n}\n\nfunction ExpectedScheduleItem({\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n colour,\n duration,\n}: Omit<ScheduleItemProps, 'timeEnd' | 'cue' | 'skip' | 'title'>) {\n const expectedStartData = useExpectedStartData();\n const { expectedStart, expectedEnd, plannedEnd } = getExpectedTimesFromExtendedEvent(\n {\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n duration,\n },\n expectedStartData,\n );\n\n return (\n <>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <ExpectedTime expectedTime={expectedStart} plannedTime={timeStart} />\n →\n <ExpectedTime expectedTime={expectedEnd} plannedTime={plannedEnd} />\n </>\n );\n}\n\ninterface ExpectedTimeProps {\n expectedTime: number;\n plannedTime: number;\n}\n\nfunction ExpectedTime({ expectedTime, plannedTime }: ExpectedTimeProps) {\n const timeDisplay = formatTime(expectedTime);\n const expectedState = getOffsetState(expectedTime - plannedTime);\n return <SuperscriptTime className={`entry-times--${expectedState}`} time={timeDisplay} />;\n}\n","import { cx } from '../../../common/utils/styleUtils';\n\nimport { useSchedule } from './ScheduleContext';\nimport ScheduleItem from './ScheduleItem';\n\nimport './Schedule.scss';\n\ninterface ScheduleProps {\n className?: string;\n}\n\nexport default function Schedule({ className }: ScheduleProps) {\n const { events, containerRef } = useSchedule();\n\n if (events?.length < 1) {\n return null;\n }\n\n return (\n <ul className={cx(['schedule', className])} ref={containerRef}>\n {events.map((event) => {\n return (\n <ScheduleItem\n key={event.id}\n timeStart={event.timeStart}\n dayOffset={event.dayOffset}\n delay={event.delay}\n totalGap={event.totalGap}\n isLinkedToLoaded={event.isLinkedToLoaded}\n countToEnd={event.countToEnd}\n duration={event.duration}\n colour={event.colour}\n skip={event.skip}\n title={event.title}\n timeEnd={event.timeEnd}\n cue={event.cue}\n />\n );\n })}\n </ul>\n );\n}\n","import { cx } from '../../../common/utils/styleUtils';\n\nimport { useSchedule } from './ScheduleContext';\n\nimport './Schedule.scss';\n\ninterface ScheduleNavProps {\n className?: string;\n}\n\nexport default function ScheduleNav({ className }: ScheduleNavProps) {\n const { numPages, visiblePage } = useSchedule();\n\n // cap the amount of elements to 11\n if (numPages > 10) {\n return (\n <div className={cx(['schedule-nav', className])}>\n <div className={cx(['schedule-nav__item', visiblePage === 1 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 2 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 3 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 4 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 5 && 'schedule-nav__item--selected'])} />\n <div\n className={cx([\n 'schedule-nav__item',\n 'schedule-nav__item--indeterminate',\n visiblePage > 5 && visiblePage < numPages - 4 && 'schedule-nav__item--selected',\n ])}\n />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 4 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 3 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 2 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 1 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages && 'schedule-nav__item--selected'])} />\n </div>\n );\n }\n\n return (\n <div className={cx(['schedule-nav', className])}>\n {numPages > 1 &&\n [...Array(numPages).keys()].map((i) => (\n <div\n key={i}\n className={cx(['schedule-nav__item', i + 1 === visiblePage && 'schedule-nav__item--selected'])}\n />\n ))}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { MaybeString } from 'ontime-types';\n\nimport Schedule from './Schedule';\nimport { ScheduleProvider } from './ScheduleContext';\nimport ScheduleNav from './ScheduleNav';\n\ninterface ScheduleExportProps {\n selectedId: MaybeString;\n}\n\nexport default memo(ScheduleExport);\nfunction ScheduleExport(props: ScheduleExportProps) {\n const { selectedId } = props;\n return (\n <ScheduleProvider selectedEventId={selectedId}>\n <ScheduleNav className='schedule-nav-container' />\n <Schedule className='schedule-container' />\n </ScheduleProvider>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, ProjectData } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport {\n makeOptionsFromCustomFields,\n makeProjectDataOptions,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { getScheduleOptions } from '../common/schedule/schedule.options';\n\nexport const getBackstageOptions = (\n timeFormat: string,\n customFields: CustomFields,\n projectData: ProjectData,\n): ViewOption[] => {\n const customFieldOptions = makeOptionsFromCustomFields(customFields, [{ value: 'none', label: 'None' }]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'note', label: 'Note' },\n ]);\n const projectDataOptions = makeProjectDataOptions(projectData, [{ value: 'none', label: 'None' }]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'secondary-src',\n title: 'Event secondary text',\n description: 'Select the data source for auxiliary text shown in now and next cards',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n getScheduleOptions(customFieldOptions),\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'extra-info',\n title: 'Extra info',\n description: 'Select a project data source to show in the view',\n type: 'option',\n values: projectDataOptions,\n defaultValue: 'none',\n },\n ],\n },\n ];\n};\n\ntype BackstageOptions = {\n secondarySource: keyof OntimeEvent | null;\n extraInfo: string | null;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): BackstageOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n return {\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n extraInfo: getValue('extra-info'),\n };\n}\n\n/**\n * Hook exposes the backstage view options\n */\nexport function useBackstageOptions(): BackstageOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { MaybeNumber, OntimeEvent, Playback, TimerPhase } from 'ontime-types';\n\nimport { enDash } from '../../common/utils/styleUtils';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\n/**\n * Whether the current time is in overtime\n */\nexport function isOvertime(current: MaybeNumber): boolean {\n return (current ?? 0) < 0;\n}\n\n/**\n * Whether the progress bar should be shown\n */\nexport function getShowProgressBar(playback: Playback): boolean {\n return playback !== Playback.Stop;\n}\n\n/**\n * Whether the playback is pending start (ie: Roll mode waiting to start)\n */\nexport function getIsPendingStart(playback: Playback, phase: TimerPhase): boolean {\n return playback === Playback.Roll && phase === TimerPhase.Pending;\n}\n\n/**\n * What should we be showing in the cards?\n */\nexport function getCardData(\n eventNow: OntimeEvent | null,\n eventNext: OntimeEvent | null,\n mainSource: keyof OntimeEvent | null,\n secondarySource: keyof OntimeEvent | null,\n playback: Playback,\n) {\n if (playback === Playback.Stop) {\n return {\n showNow: false,\n nowMain: undefined,\n nowSecondary: undefined,\n showNext: false,\n nextMain: undefined,\n nextSecondary: undefined,\n };\n }\n\n // if we are loaded, we show the upcoming event as next\n const nowMain = getPropertyValue(eventNow, mainSource ?? 'title') || enDash;\n const nowSecondary = getPropertyValue(eventNow, secondarySource);\n const nextMain = getPropertyValue(eventNext, mainSource ?? 'title') || enDash;\n const nextSecondary = getPropertyValue(eventNext, secondarySource);\n\n return {\n showNow: eventNow !== null,\n nowMain,\n nowSecondary,\n showNext: eventNext !== null,\n nextMain,\n nextSecondary,\n };\n}\n","import { CustomFields, OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundown } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface BackstageData {\n events: OntimeEntry[];\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n}\n\nexport function useBackstageData(): ViewData<BackstageData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundown();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n events: rundownData,\n customFields,\n projectData,\n isMirrored,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport QRCode from 'react-qr-code';\nimport { useViewportSize } from '@mantine/hooks';\nimport { OntimeView, ProjectData } from 'ontime-types';\nimport { millisToString, removeLeadingZero } from 'ontime-utils';\n\nimport ProgressBar from '../../common/components/progress-bar/ProgressBar';\nimport Empty from '../../common/components/state/Empty';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useBackstageSocket, useClock } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx, timerPlaceholderMin } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport ScheduleExport from '../common/schedule/ScheduleExport';\n\nimport { getBackstageOptions, useBackstageOptions } from './backstage.options';\nimport { getCardData, getIsPendingStart, getShowProgressBar, isOvertime } from './backstage.utils';\nimport { BackstageData, useBackstageData } from './useBackstageData';\n\nimport './Backstage.scss';\n\nexport default function BackstageLoader() {\n const { data, status } = useBackstageData();\n\n useWindowTitle('Backstage');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Backstage {...data} />;\n}\n\nfunction Backstage({ events, customFields, projectData, isMirrored, settings }: BackstageData) {\n const { getLocalizedString } = useTranslation();\n const { secondarySource, extraInfo } = useBackstageOptions();\n const { eventNext, eventNow, rundown, selectedEventId, time } = useBackstageSocket();\n const [blinkClass, setBlinkClass] = useState(false);\n const { height: screenHeight } = useViewportSize();\n\n // blink on change\n useEffect(() => {\n setBlinkClass(false);\n\n const timer = setTimeout(() => {\n setBlinkClass(true);\n }, 10);\n\n return () => clearTimeout(timer);\n }, [selectedEventId]);\n\n // gather card data\n const hasEvents = events.length > 0;\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n 'title',\n secondarySource,\n time.playback,\n );\n\n // gather timer data\n const isPendingStart = getIsPendingStart(time.playback, time.phase);\n const startedAt = isPendingStart ? formatTime(time.secondaryTimer) : formatTime(time.startedAt);\n\n const scheduledStart = (() => {\n if (showNow) return undefined;\n if (!hasEvents) return undefined;\n return formatTime(rundown.plannedStart, { format12: 'hh:mm a', format24: 'HH:mm' });\n })();\n\n const scheduledEnd = (() => {\n if (showNow) return undefined;\n if (!hasEvents) return undefined;\n return formatTime(rundown.plannedEnd, { format12: 'hh:mm a', format24: 'HH:mm' });\n })();\n\n let displayTimer = millisToString(time.current, { fallback: timerPlaceholderMin });\n displayTimer = removeLeadingZero(displayTimer);\n\n // gather presentation styles\n const qrSize = Math.max(window.innerWidth / 15, 72);\n const showProgress = getShowProgressBar(time.playback);\n const showSchedule = hasEvents && screenHeight > 420; // in vertical screens we may not have space\n const showPending = scheduledStart && scheduledEnd;\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const backstageOptions = useMemo(\n () => getBackstageOptions(defaultFormat, customFields, projectData),\n [defaultFormat, customFields, projectData],\n );\n\n return (\n <div className={`backstage ${isMirrored ? 'mirror' : ''}`} data-testid='backstage-view'>\n <ViewParamsEditor target={OntimeView.Backstage} viewOptions={backstageOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <BackstageClock />\n </div>\n\n {showProgress && <ProgressBar className='progress-container' current={time.current} duration={time.duration} />}\n\n {!hasEvents && <Empty text={getLocalizedString('common.no_data')} className='empty-container' />}\n\n <div className='card-container'>\n {showNow && (\n <div className={cx(['event', 'now', blinkClass && 'blink'])}>\n <TitleCard title={nowMain} secondary={nowSecondary} />\n <div className='timer-group'>\n <div className='time-entry'>\n <div className={cx(['time-entry__label', isPendingStart && 'time-entry--pending'])}>\n {isPendingStart ? getLocalizedString('countdown.waiting') : getLocalizedString('common.started_at')}\n </div>\n <SuperscriptTime time={startedAt} className='time-entry__value' />\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.expected_finish')}</div>\n {isOvertime(time.current) ? (\n <div className='time-entry__value'>{getLocalizedString('countdown.overtime')}</div>\n ) : (\n <SuperscriptTime time={formatTime(time.expectedFinish)} className='time-entry__value' />\n )}\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.stage_timer')}</div>\n <div className='time-entry__value'>{displayTimer}</div>\n </div>\n </div>\n </div>\n )}\n\n {showPending && (\n <div className='event'>\n <div className='title-card__placeholder'>{getLocalizedString('countdown.waiting')}</div>\n <div className='timer-group'>\n <div className='time-entry'>\n <div className={cx(['time-entry__label', isPendingStart && 'time-entry--pending'])}>\n {getLocalizedString('common.scheduled_start')}\n </div>\n <SuperscriptTime time={scheduledStart} className='time-entry__value' />\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.scheduled_end')}</div>\n <SuperscriptTime time={scheduledEnd} className='time-entry__value' />\n </div>\n </div>\n </div>\n )}\n\n {showNext && hasEvents && (\n <TitleCard className='event' label='next' title={nextMain} secondary={nextSecondary} />\n )}\n </div>\n\n {showSchedule && <ScheduleExport selectedId={selectedEventId} />}\n\n <div className={cx(['info', !showSchedule && 'info--stretch'])}>\n {extraInfo && <ExtraInfo projectData={projectData} size={qrSize} source={extraInfo} />}\n <div className='info-card'>\n {projectData.url && <QRCode value={projectData.url} size={qrSize} level='L' className='info-card__qr' />}\n {projectData.info && <div className='info-card__message'>{projectData.info}</div>}\n </div>\n </div>\n </div>\n );\n}\n\ninterface ExtraInfoProps {\n projectData: ProjectData;\n size: number;\n source: string;\n}\nfunction ExtraInfo({ projectData, size, source }: ExtraInfoProps) {\n const info = projectData.custom.find((entry, index) => {\n const label = `${index}-${entry.title}`;\n return label === source;\n });\n\n if (!info) {\n return null;\n }\n\n return (\n <div className='info-card'>\n {info.url && (\n <img\n className='info-card__img'\n width={size}\n src={info.url}\n onError={(event) => (event.currentTarget.style.display = 'none')}\n />\n )}\n <div className='info__column'>\n {info.title && <div className='info-card__label'>{info.title}</div>}\n {info.value && <div className='info-card__message'>{info.value}</div>}\n </div>\n </div>\n );\n}\n\nfunction BackstageClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["ProgressBar","props","current","duration","className","progress","getProgress","jsx","getScheduleOptions","customFieldOptions","OptionTitle","getScheduleOptionsFromParams","searchParams","isStringBoolean","useScheduleOptions","useSearchParams","useMemo","ScheduleContext","createContext","ScheduleProvider","children","selectedEventId","cycleInterval","stopCycle","filter","events","usePartialRundown","entry","customKey","isOntimeEvent","firstIndex","setFirstIndex","useState","numPages","setNumPages","visiblePage","setVisiblePage","lastIndex","useRef","paginator","containerRef","useLayoutEffect","containerHeight","currentPageHeight","currentPage","lastVisibleIndex","isShowingElements","i","currentElementHeight","isNextPage","showElement","element","yPosition","hideElement","useEffect","interval","selectedEventIndex","event","viewEvents","useSchedule","context","use","formatOptions","ScheduleItem","timeStart","dayOffset","delay","totalGap","isLinkedToLoaded","countToEnd","colour","skip","title","timeEnd","cue","showExpected","jsxs","cx","ExpectedScheduleItem","DelayedScheduleItem","PlannedScheduleItem","start","formatTime","end","Fragment","SuperscriptTime","delayedStart","delayedEnd","expectedStartData","useExpectedStartData","expectedStart","expectedEnd","plannedEnd","getExpectedTimesFromExtendedEvent","ExpectedTime","expectedTime","plannedTime","timeDisplay","expectedState","getOffsetState","Schedule","ScheduleNav","memo","ScheduleExport","selectedId","getBackstageOptions","timeFormat","customFields","projectData","makeOptionsFromCustomFields","secondaryOptions","projectDataOptions","makeProjectDataOptions","getTimeOption","getOptionsFromParams","defaultValues","getValue","key","useBackstageOptions","maybePreset","PresetContext","isOvertime","getShowProgressBar","playback","Playback","getIsPendingStart","phase","TimerPhase","getCardData","eventNow","eventNext","mainSource","secondarySource","nowMain","getPropertyValue","enDash","nowSecondary","nextMain","nextSecondary","useBackstageData","isMirrored","useViewOptionsStore","state","rundownData","rundownStatus","useFlatRundown","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","BackstageLoader","data","status","useWindowTitle","Loader","EmptyPage","Backstage","getLocalizedString","useTranslation","extraInfo","rundown","time","useBackstageSocket","blinkClass","setBlinkClass","screenHeight","useViewportSize","timer","hasEvents","showNow","showNext","isPendingStart","startedAt","scheduledStart","scheduledEnd","displayTimer","millisToString","timerPlaceholderMin","removeLeadingZero","qrSize","showProgress","showSchedule","showPending","defaultFormat","getDefaultFormat","backstageOptions","ViewParamsEditor","OntimeView","ViewLogo","BackstageClock","Empty","TitleCard","ExtraInfo","QRCode","size","source","info","index","clock","useClock","formattedClock"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{l as tt,h as g,j as t,v as et,a8 as st,t as nt,a9 as ot,aa as U,T as z}from"./vendor-9UkPSc5K.js";import{P as at,b as E,j as B,k as rt,f as O,g as P,M as V,l as it,F as ct,m as lt,i as D,B as w,n as dt,o as ut,p as $,q as W,r as mt,t as pt,u as ft,d as xt,L as ht,h as gt,O as jt,s as St}from"./index-njXwwjfn.js";import{u as yt,i as wt,a as bt}from"./useRundown-ihoU8qBi.js";import{E as L}from"./Empty-C-JO_XAr.js";import{E as vt}from"./EmptyPage-BSzsxpGg.js";import{V as _t}from"./ViewLogo--9miplQv.js";import{m as Ct,O as F,i as Nt,g as G,V as kt}from"./ViewParamsEditor-BFu_0oIb.js";import{u as Dt}from"./useWindowTitle-B2UzPuki.js";import{S as T}from"./SuperscriptTime-C8ypTVpH.js";import{g as Ft,a as Et}from"./viewLoader.utils-DQGhrjSp.js";import{u as Ot}from"./useFollowComponent-Qo3FobyV.js";import{u as q}from"./useReport-DhFY2L8v.js";import{g as H}from"./offset-D1q-72D-.js";import{F as Tt}from"./FollowButton-Mox6N4JW.js";import{u as At}from"./useCustomFields-Da0Li7nQ.js";import{u as Lt}from"./useProjectData-DW06zQvF.js";import"./Select-BLA-yQMq.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="7eb8c97a-7df1-4ba7-9a75-a460f4b249ab",e._sentryDebugIdIdentifier="sentry-dbid-7eb8c97a-7df1-4ba7-9a75-a460f4b249ab")}catch{}})();const Pt=(e,s,o)=>{const a=Ct(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]);return[{title:F.ClockOptions,collapsible:!0,options:[Ft(e)]},{title:F.DataSources,collapsible:!0,options:[{id:"secondary-src",title:"Event secondary text",description:"Select the data source for auxiliary text shown in the card",type:"option",values:a,defaultValue:"none"}]},{title:F.BehaviourOptions,collapsible:!0,options:[{id:"showExpected",title:"Show expected time",description:"Whether the times shown should account for the runtime offset.",type:"boolean",defaultValue:!1}]},{title:F.Hidden,options:[{id:"sub",title:"Event subscription",description:"The events to follow",values:o,type:"persist"}]}]};function It(e,s){const o=n=>(s==null?void 0:s.get(n))??e.get(n);return{subscriptions:(n=>s!=null&&s.has(n)?s.getAll(n):e.getAll(n))("sub"),secondarySource:o("secondary-src"),showExpected:Nt(o("showExpected"))}}function I(){const[e]=tt(),s=g.use(at);return g.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return It(e,a)},[s,e])}const N="h:mm a",k="HH:mm";function Rt(e,s,o){return e===s&&o!==E.Armed}const y={future:"countdown.to_start",due:"timeline.due",live:"countdown.running",pending:"countdown.waiting",loaded:"countdown.loaded",done:"countdown.ended"};function K(e){const{playback:s,current:o,clock:a}=rt(),{getLocalizedString:n}=O(),r=c=>c<=0?n("countdown.overtime").toUpperCase():it(c,c>V*2).replace("m",`${n("common.minutes")} `).replace("s",n("common.seconds"));return e.isLoaded?s===E.Armed?{status:"loaded",statusDisplay:n(y.loaded),timeDisplay:r(e.duration)}:{status:"live",statusDisplay:n(y.live),timeDisplay:r(o??0)}:s===E.Stop||s===E.Armed?{status:"pending",statusDisplay:n(y.pending),timeDisplay:" "}:e.isPast?{status:"done",statusDisplay:n(y.done),timeDisplay:P(e.endedAt,{format12:N,format24:k})}:e.expectedStart-a<=0?{status:"due",statusDisplay:n(y.future),timeDisplay:n(y.due).toUpperCase()}:{status:"future",statusDisplay:n(y.future),timeDisplay:r(e.expectedStart-a)}}function Mt(e,s){const o=new URL(e),a=new URLSearchParams;for(const[n,r]of o.searchParams.entries())n!=="sub"&&a.append(n,r);return s.forEach(n=>{a.append("sub",n)}),o.search=a.toString(),o}function zt(e,s){return s.filter(o=>e.includes(o.id))}function Ht(e,s){return Math.abs(e-s)>V}function Ut(e,s,o,a,n,r,c){const{totalGap:m,isLinkedToLoaded:d}=e,i=B(e,{currentDay:s,totalGap:m,actualStart:o,plannedStart:a,isLinkedToLoaded:d,offset:n,mode:r}),{endedAt:l}=c[e.id]??{endedAt:null};return{...e,expectedStart:i,endedAt:l}}function _(e){const{value:s,preferredFormat12:o=ct,preferredFormat24:a=lt,className:n}=e,r=P(s,{format12:o,format24:a});return t.jsx(T,{className:n,time:r})}function Bt({events:e,subscriptions:s,disableEdit:o}){const[a,n]=g.useState(s),r=et(),c=i=>{n(l=>l.includes(i)?l.filter(p=>p!==i):[...l,i])},m=()=>{const i=a.filter(p=>e.some(f=>f.id===p)),l=Mt(window.location.href,i);o(),n([]),r(l.search.toString())},d=new Set(a);return t.jsxs("div",{className:"list-container",children:[e.map((i,l)=>{const p=i.title||"{no title}",f=d.has(i.id);return t.jsxs("div",{role:"button",tabIndex:0,onClick:()=>c(i.id),onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(c(i.id),x.stopPropagation())},className:D(["sub",f&&"sub--selected"]),children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":(i==null?void 0:i.colour)??""}}),t.jsxs("div",{className:"sub__schedule",children:[t.jsx(_,{value:i.timeStart,preferredFormat12:"h:mm",preferredFormat24:"HH:mm"}),"→",t.jsx(_,{value:i.timeEnd,preferredFormat12:"h:mm",preferredFormat24:"HH:mm"})]}),t.jsx("div",{className:"sub__label",children:f?"Click to remove":"Click to add"}),t.jsx("div",{className:"sub__title",children:p})]},l)}),t.jsxs("div",{className:"fab-container",children:[t.jsxs(w,{variant:"subtle",size:"xlarge",onClick:o,children:[t.jsx(st,{})," Go back"]}),t.jsxs(w,{variant:"subtle",size:"xlarge",onClick:()=>n([]),disabled:a.length===0,children:[t.jsx(nt,{})," Clear"]}),t.jsxs(w,{variant:"primary",size:"xlarge",disabled:e.length<1,onClick:m,children:[t.jsx(ot,{})," Save"]})]})]})}function Vt({subscribedEvents:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=I(),{playback:n}=dt(),{selectedEventId:r}=ut(),c=$(!0),{data:m}=q(),{offset:d,currentDay:i,actualStart:l,plannedStart:p,mode:f}=W(),x=g.useRef(null),[j,b]=g.useState(!1),S=g.useRef(null),h=g.useRef(null),J=Ot({followRef:S,scrollRef:h,doFollow:!j,topOffset:0,followTrigger:r});g.useEffect(()=>{var u;r||j||(u=h.current)==null||u.scrollTo(0,0)},[r,j,h]);const X=()=>{r&&J(),b(!1)},Y=pt(()=>{if(S!=null&&S.current&&(h!=null&&h.current)){const u=S.current.getBoundingClientRect(),C=h.current.getBoundingClientRect();if(u&&C){const v=u.top-C.top,A=v<-8||v>50;b(A)}}},1e3),R=()=>{x.current&&clearTimeout(x.current),Y()};return t.jsxs("div",{className:"list-container",onWheel:R,onTouchMove:R,ref:h,children:[e.map(u=>{const C=G(u,o),v=Rt(u.id,r,n),A=!v&&u.id===r,M=Ut(u,i,l,p,d,f,m),Z=u.title.length?u.title:" ";return t.jsxs("div",{ref:v?S:void 0,className:D(["sub",v&&"sub--live",A&&"sub--armed"]),"data-testid":u.cue,children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":u.colour}}),t.jsx(Q,{event:M,showExpected:a}),t.jsx($t,{event:M}),t.jsx("div",{className:D(["sub__title",!u.title&&"subdued"]),children:Z}),C&&t.jsx("div",{className:"sub__secondary",children:C})]},u.id)}),t.jsx("div",{className:D(["fab-container",!c&&"fab-container--hidden"]),children:t.jsxs(w,{variant:"primary",size:"xlarge",onClick:s,children:[t.jsx(U,{})," Edit"]})}),t.jsx(Tt,{isVisible:j,onClickHandler:X})]})}function Q(e){const{event:s,showExpected:o}=e,{timeStart:a,duration:n,delay:r,expectedStart:c,countToEnd:m}=s,d=a+r+s.dayOffset*mt,i=o&&Ht(d,c),l=i?"sub__schedule--strike":r!==0?"sub__schedule--delayed":"",p=`sub__schedule--${H(c-d)}`,f=d+n+r,x=m?Math.max(c+n,f):c+n,j=`sub__schedule--${H(x-f)}`;return t.jsxs("div",{className:"sub__schedule",children:[t.jsx(_,{value:d,preferredFormat12:N,preferredFormat24:k,className:l}),!i&&t.jsxs(t.Fragment,{children:["→",t.jsx(_,{value:f,preferredFormat12:N,preferredFormat24:k,className:l})]}),i&&t.jsxs(t.Fragment,{children:[t.jsx(_,{value:c,className:p,preferredFormat12:N,preferredFormat24:k}),"→",t.jsx(_,{value:x,className:j,preferredFormat12:N,preferredFormat24:k})]})]})}function $t({event:e}){const{status:s,statusDisplay:o,timeDisplay:a}=K(e);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"sub__status",children:o}),s==="done"?t.jsx(T,{className:"sub__timer",time:a}):t.jsx("div",{className:"sub__timer",children:a})]})}function Wt({subscribedEvent:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=I(),n=$(!0),{data:r}=q(),{offset:c,currentDay:m,actualStart:d,plannedStart:i,mode:l}=W(),{totalGap:p,isLinkedToLoaded:f}=e,x=B(e,{currentDay:m,totalGap:p,actualStart:d,plannedStart:i,isLinkedToLoaded:f,offset:c,mode:l}),{endedAt:j}=r[e.id]??{endedAt:null},b={...e,expectedStart:x,endedAt:j},S=e.title.length?e.title:" ",h=G(e,o);return t.jsxs("div",{className:"single-container","data-testid":"countdown-event",children:[t.jsx(Gt,{event:b}),t.jsxs("div",{className:"event__title",style:{borderColor:b.colour},children:[t.jsx(Q,{event:b,showExpected:a}),S,h&&t.jsx("div",{className:"secondary",children:h})]}),t.jsx("div",{className:D(["fab-container",!n&&"fab-container--hidden"]),children:t.jsxs(w,{variant:"primary",size:"xlarge",onClick:s,children:[t.jsx(U,{})," Edit"]})})]})}function Gt({event:e}){const{status:s,statusDisplay:o,timeDisplay:a}=K(e);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"event__status",children:o}),s==="done"?t.jsx(T,{className:"event__timer",time:a}):t.jsx("div",{className:"event__timer",children:a})]})}function qt(){const e=ft(i=>i.mirror),{data:s,status:o}=yt(),{data:a,status:n}=Lt(),{data:r,status:c}=xt(),{data:m,status:d}=At();return{data:{customFields:m,rundownData:s,projectData:a,isMirrored:e,settings:r},status:Et([o,n,c,d])}}function xe(){const{data:e,status:s}=qt();return Dt("Countdown"),s==="pending"?t.jsx(ht,{}):s==="error"?t.jsx(vt,{text:"There was an error fetching data, please refresh the page."}):t.jsx(Kt,{...e})}function Kt({customFields:e,rundownData:s,projectData:o,isMirrored:a,settings:n}){const{getLocalizedString:r}=O(),{subscriptions:c}=I(),[m,d]=g.useState(!1),i=s.filter(x=>wt(x)&&bt(x)),l=i.length>0,p=gt(n==null?void 0:n.timeFormat),f=g.useMemo(()=>Pt(p,e,c),[p,e,c]);return t.jsxs("div",{className:`countdown ${a?"mirror":""}`,"data-testid":"countdown-view",children:[t.jsx(kt,{target:jt.Countdown,viewOptions:f}),t.jsxs("div",{className:"project-header",children:[(o==null?void 0:o.logo)&&t.jsx(_t,{name:o.logo,className:"logo"}),t.jsx("div",{className:"title",children:o.title}),t.jsx(Jt,{})]}),!l&&t.jsx(L,{text:r("common.no_data"),className:"empty-container"}),l&&m&&t.jsx(Bt,{events:i,subscriptions:c,disableEdit:()=>d(!1)}),l&&!m&&t.jsx(Qt,{playableEvents:i,subscriptions:c,goToEditMode:()=>d(!0)})]})}function Qt({playableEvents:e,subscriptions:s,goToEditMode:o}){const{getLocalizedString:a}=O();if(s.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(L,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(z,{})," Add"]})]});const n=zt(s,e);if(n.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(L,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(z,{})," Add"]})]});if(n.length===1){const r=n.at(0);return r?t.jsx(Wt,{subscribedEvent:r,goToEditMode:o}):null}return t.jsx(Vt,{subscribedEvents:n,goToEditMode:o})}function Jt(){const{getLocalizedString:e}=O(),{clock:s}=St(),o=P(s);return t.jsxs("div",{className:"clock-container",children:[t.jsx("div",{className:"label",children:e("common.time_now")}),t.jsx(T,{time:o,className:"time"})]})}export{xe as default};
|
|
2
|
-
//# sourceMappingURL=Countdown-NmGi1KMx.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Countdown-NmGi1KMx.js","sources":["../../src/views/countdown/countdown.options.ts","../../src/views/countdown/countdown.utils.ts","../../src/features/viewers/common/clock-time/ClockTime.tsx","../../src/views/countdown/CountdownSelect.tsx","../../src/views/countdown/CountdownSubscriptions.tsx","../../src/views/countdown/SingleEventCountdown.tsx","../../src/views/countdown/useCountdownData.ts","../../src/views/countdown/Countdown.tsx"],"sourcesContent":["import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, EntryId, OntimeEvent } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../features/viewers/common/viewUtils';\n\nexport const getCountdownOptions = (\n timeFormat: string,\n customFields: CustomFields,\n persistedSubscriptions: EntryId[],\n): ViewOption[] => {\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'note', label: 'Note' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'secondary-src',\n title: 'Event secondary text',\n description: 'Select the data source for auxiliary text shown in the card',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.BehaviourOptions,\n collapsible: true,\n options: [\n {\n id: 'showExpected',\n title: 'Show expected time',\n description: 'Whether the times shown should account for the runtime offset.',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.Hidden,\n options: [\n {\n id: 'sub',\n title: 'Event subscription',\n description: 'The events to follow',\n values: persistedSubscriptions,\n type: 'persist',\n },\n ],\n },\n ];\n};\n\ntype CountdownOptions = {\n subscriptions: EntryId[];\n secondarySource: keyof OntimeEvent | null;\n showExpected: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): CountdownOptions {\n // Helper to get single value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Helper to get array values from either source\n const getArrayValues = (key: string): EntryId[] => {\n if (defaultValues?.has(key)) {\n return defaultValues.getAll(key) as EntryId[];\n }\n return searchParams.getAll(key) as EntryId[];\n };\n\n return {\n subscriptions: getArrayValues('sub'),\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n showExpected: isStringBoolean(getValue('showExpected')),\n };\n}\n\n/**\n * Hook exposes the countdown view options\n */\nexport function useCountdownOptions(): CountdownOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { EntryId, MaybeNumber, OffsetMode, OntimeEntry, OntimeEvent, OntimeReport, Playback } from 'ontime-types';\nimport { getExpectedStart, MILLIS_PER_MINUTE, removeSeconds } from 'ontime-utils';\n\nimport { useCountdownSocket } from '../../common/hooks/useSocket';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { timerPlaceholderMin } from '../../common/utils/styleUtils';\nimport { formatDuration, formatTime } from '../../common/utils/time';\nimport { type TranslationKey, useTranslation } from '../../translation/TranslationProvider';\n\n/**\n * Parses string as a title\n */\nexport function sanitiseTitle(title: string | null) {\n return title ?? '{no title}';\n}\n\nexport const preferredFormat12 = 'h:mm a';\nexport const preferredFormat24 = 'HH:mm';\n\n/**\n * Whether the current event is live\n */\nexport function getIsLive(currentId: EntryId, selectedId: EntryId | null, playback: Playback): boolean {\n return currentId === selectedId && playback !== Playback.Armed;\n}\n\nexport type ProgressStatus = 'future' | 'due' | 'live' | 'done' | 'pending' | 'loaded';\ntype TimerMessage = Record<ProgressStatus, TranslationKey>;\n\nexport const timerProgress: TimerMessage = {\n future: 'countdown.to_start',\n due: 'timeline.due',\n live: 'countdown.running',\n pending: 'countdown.waiting',\n loaded: 'countdown.loaded',\n done: 'countdown.ended',\n};\n\nexport function getFormattedTime(\n value: MaybeNumber,\n status: ProgressStatus,\n minText: string,\n secText: string,\n dueText: string,\n) {\n if (value === null) return timerPlaceholderMin;\n if (status === 'future' || status === 'live') {\n if (value <= 0) return dueText.toUpperCase();\n return formatDuration(value, value > MILLIS_PER_MINUTE * 2)\n .replace('m', `${minText} `)\n .replace('s', secText);\n }\n return removeSeconds(formatTime(value));\n}\n\n/**\n * Returns a parsed timer and relevant status message\n * Handles events in different days but disregards whether an event has actually played\n */\nexport function useSubscriptionDisplayData(\n subscribedEvent: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number },\n): { status: ProgressStatus; statusDisplay: string; timeDisplay: string } {\n const { playback, current, clock } = useCountdownSocket();\n const { getLocalizedString } = useTranslation();\n\n const bigDuration = (value: number) => {\n if (value <= 0) return getLocalizedString('countdown.overtime').toUpperCase();\n return formatDuration(value, value > MILLIS_PER_MINUTE * 2)\n .replace('m', `${getLocalizedString('common.minutes')} `)\n .replace('s', getLocalizedString('common.seconds'));\n };\n\n if (subscribedEvent.isLoaded) {\n if (playback === Playback.Armed) {\n return {\n status: 'loaded',\n statusDisplay: getLocalizedString(timerProgress['loaded']),\n timeDisplay: bigDuration(subscribedEvent.duration),\n };\n }\n\n return {\n status: 'live',\n statusDisplay: getLocalizedString(timerProgress['live']),\n timeDisplay: bigDuration(current ?? 0),\n };\n }\n\n if (playback === Playback.Stop || playback === Playback.Armed) {\n return {\n status: 'pending',\n statusDisplay: getLocalizedString(timerProgress['pending']),\n timeDisplay: ' ',\n };\n }\n\n if (subscribedEvent.isPast) {\n return {\n status: 'done',\n statusDisplay: getLocalizedString(timerProgress['done']),\n timeDisplay: formatTime(subscribedEvent.endedAt, { format12: preferredFormat12, format24: preferredFormat24 }),\n };\n }\n\n if (subscribedEvent.expectedStart - clock <= 0) {\n return {\n status: 'due',\n statusDisplay: getLocalizedString(timerProgress['future']), // We use future here on purpose for the look of it\n timeDisplay: getLocalizedString(timerProgress['due']).toUpperCase(),\n };\n }\n\n return {\n status: 'future',\n statusDisplay: getLocalizedString(timerProgress['future']),\n timeDisplay: bigDuration(subscribedEvent.expectedStart - clock),\n };\n}\n\n/**\n * Adds a set of subscriptions to the URL parameters\n */\nexport function makeSubscriptionsUrl(urlRef: string, subscriptions: EntryId[]) {\n const url = new URL(urlRef);\n const newParams = new URLSearchParams();\n\n // copy existing parameters except for 'sub'\n for (const [key, value] of url.searchParams.entries()) {\n if (key !== 'sub') {\n newParams.append(key, value);\n }\n }\n\n // add new subscriptions\n subscriptions.forEach((id) => {\n newParams.append('sub', id);\n });\n\n url.search = newParams.toString();\n\n return url;\n}\n\n/**\n * Returns an array of events subscribed events ordered by scheduled\n * Since the original array is already ordered, we simply filter out the events\n * which are not in the subscriptions list.\n */\nexport function getOrderedSubscriptions<T extends OntimeEntry>(subscriptions: EntryId[], playableEvents: T[]): T[] {\n return playableEvents.filter((event) => subscriptions.includes(event.id));\n}\n\n/**\n * Checks through the rundown whether the current event is linked to the loaded event\n */\nexport function isLinkedToLoadedEvent(events: OntimeEvent[], loadedId: EntryId | null, currentId: EntryId): boolean {\n // if nothing is loaded, we return true to simplify the logic\n if (!loadedId) {\n return true;\n }\n\n const loadedIndex = events.findIndex((event) => event.id === loadedId);\n if (loadedIndex === -1) {\n return true;\n }\n\n for (let i = loadedIndex; i < events.length; i++) {\n const event = events[i];\n if (event.id === currentId) {\n return true;\n }\n\n if (event.linkStart === null) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function isOutsideRange(a: number, b: number): boolean {\n return Math.abs(a - b) > MILLIS_PER_MINUTE;\n}\n\nexport type CountdownEvent = ExtendedEntry<OntimeEvent> & { expectedStart: number; endedAt: MaybeNumber };\n\nexport function extendEventData(\n event: ExtendedEntry<OntimeEvent>,\n currentDay: number,\n actualStart: MaybeNumber,\n plannedStart: MaybeNumber,\n offset: number,\n mode: OffsetMode,\n reportData: OntimeReport,\n): CountdownEvent {\n const { totalGap, isLinkedToLoaded } = event;\n const expectedStart = getExpectedStart(event, {\n currentDay,\n totalGap,\n actualStart,\n plannedStart,\n isLinkedToLoaded,\n offset,\n mode,\n });\n const { endedAt } = reportData[event.id] ?? { endedAt: null };\n return { ...event, expectedStart, endedAt };\n}\n","/**\n * encapsulate logic related to showing a clock timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\n\nimport { formatTime } from '../../../../common/utils/time';\nimport { FORMAT_12, FORMAT_24 } from '../../../../viewerConfig';\nimport SuperscriptTime from '../superscript-time/SuperscriptTime';\n\ninterface ClockTimeProps {\n value: MaybeNumber;\n preferredFormat12?: string;\n preferredFormat24?: string;\n className?: string;\n}\n\nexport default function ClockTime(props: ClockTimeProps) {\n const { value, preferredFormat12 = FORMAT_12, preferredFormat24 = FORMAT_24, className } = props;\n\n // TODO: should we get the params from URL here to see if the user is overriding the default?\n const formattedTime = formatTime(value, { format12: preferredFormat12, format24: preferredFormat24 });\n\n return <SuperscriptTime className={className} time={formattedTime} />;\n}\n","import { useState } from 'react';\nimport { IoArrowBack, IoClose, IoSaveOutline } from 'react-icons/io5';\nimport { useNavigate } from 'react-router';\nimport { EntryId, PlayableEvent } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport ClockTime from '../../features/viewers/common/clock-time/ClockTime';\n\nimport { makeSubscriptionsUrl } from './countdown.utils';\n\nimport './Countdown.scss';\n\ninterface CountdownSelectProps {\n events: ExtendedEntry<PlayableEvent>[];\n subscriptions: EntryId[];\n disableEdit: () => void;\n}\n\nexport default function CountdownSelect({ events, subscriptions, disableEdit }: CountdownSelectProps) {\n const [selected, setSelected] = useState<EntryId[]>(subscriptions);\n const navigate = useNavigate();\n\n /**\n * Toggles an entry from the selected set\n */\n const toggleSelect = (entryId: EntryId) => {\n setSelected((prev) => {\n if (prev.includes(entryId)) {\n // If the entry is already selected, remove it\n return prev.filter((id) => id !== entryId);\n }\n return [...prev, entryId];\n });\n };\n\n /**\n * Creates a URL with the selected subscriptions\n * and navigates to it\n */\n const applySelection = () => {\n // we remove events that no longer exist to avoid stale subscriptions\n const filteredSelected = selected.filter((id) => events.some((event) => event.id === id));\n const url = makeSubscriptionsUrl(window.location.href, filteredSelected);\n disableEdit();\n setSelected([]);\n navigate(url.search.toString());\n };\n\n // make a copy of the selected array for quick lookup\n const selectedIds = new Set(selected);\n\n return (\n <div className='list-container'>\n {events.map((event, index) => {\n const title = event.title || '{no title}';\n const isSelected = selectedIds.has(event.id);\n\n return (\n <div\n key={index}\n role='button'\n tabIndex={0}\n onClick={() => toggleSelect(event.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n toggleSelect(event.id);\n e.stopPropagation();\n }\n }}\n className={cx(['sub', isSelected && 'sub--selected'])}\n >\n <div className='sub__binder' style={{ '--user-color': event?.colour ?? '' }} />\n <div className='sub__schedule'>\n <ClockTime value={event.timeStart} preferredFormat12='h:mm' preferredFormat24='HH:mm' />\n →\n <ClockTime value={event.timeEnd} preferredFormat12='h:mm' preferredFormat24='HH:mm' />\n </div>\n <div className='sub__label'>{isSelected ? 'Click to remove' : 'Click to add'}</div>\n <div className='sub__title'>{title}</div>\n </div>\n );\n })}\n\n <div className='fab-container'>\n <Button variant='subtle' size='xlarge' onClick={disableEdit}>\n <IoArrowBack /> Go back\n </Button>\n <Button variant='subtle' size='xlarge' onClick={() => setSelected([])} disabled={selected.length === 0}>\n <IoClose /> Clear\n </Button>\n <Button variant='primary' size='xlarge' disabled={events.length < 1} onClick={applySelection}>\n <IoSaveOutline /> Save\n </Button>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { IoPencil } from 'react-icons/io5';\nimport { MaybeNumber, OntimeEvent } from 'ontime-types';\nimport { dayInMs } from 'ontime-utils';\n\nimport Button from '../../common/components/buttons/Button';\nimport { useFadeOutOnInactivity } from '../../common/hooks/useFadeOutOnInactivity';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useExpectedStartData, usePlayback, useSelectedEventId } from '../../common/hooks/useSocket';\nimport useReport from '../../common/hooks-query/useReport';\nimport { getOffsetState } from '../../common/utils/offset';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport FollowButton from '../../features/operator/follow-button/FollowButton';\nimport ClockTime from '../../features/viewers/common/clock-time/ClockTime';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\nimport { useCountdownOptions } from './countdown.options';\nimport {\n CountdownEvent,\n extendEventData,\n getIsLive,\n isOutsideRange,\n preferredFormat12,\n preferredFormat24,\n useSubscriptionDisplayData,\n} from './countdown.utils';\n\nimport './Countdown.scss';\n\ninterface CountdownSubscriptionsProps {\n subscribedEvents: ExtendedEntry<OntimeEvent>[];\n goToEditMode: () => void;\n}\n\nexport default function CountdownSubscriptions({ subscribedEvents, goToEditMode }: CountdownSubscriptionsProps) {\n const { secondarySource, showExpected } = useCountdownOptions();\n const { playback } = usePlayback();\n const { selectedEventId } = useSelectedEventId();\n const showFab = useFadeOutOnInactivity(true);\n\n const { data: reportData } = useReport();\n const { offset, currentDay, actualStart, plannedStart, mode } = useExpectedStartData();\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n const [lockAutoScroll, setLockAutoScroll] = useState(false);\n const selectedRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollToComponent = useFollowComponent({\n followRef: selectedRef,\n scrollRef,\n doFollow: !lockAutoScroll,\n topOffset: 0,\n followTrigger: selectedEventId,\n });\n\n // reset scroll if nothing is selected\n useEffect(() => {\n if (!selectedEventId) {\n if (!lockAutoScroll) {\n scrollRef.current?.scrollTo(0, 0);\n }\n }\n }, [selectedEventId, lockAutoScroll, scrollRef]);\n\n // scroll to component if user clicks the Follow button\n const handleOffset = () => {\n if (selectedEventId) {\n scrollToComponent();\n }\n setLockAutoScroll(false);\n };\n\n // prevent considering automated scrolls as user scrolls\n const handleUserScroll = () => {\n if (selectedRef?.current && scrollRef?.current) {\n const selectedRect = selectedRef.current.getBoundingClientRect();\n const scrollerRect = scrollRef.current.getBoundingClientRect();\n if (selectedRect && scrollerRect) {\n const distanceFromTop = selectedRect.top - scrollerRect.top;\n const hasScrolledOutOfThreshold = distanceFromTop < -8 || distanceFromTop > 50;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n // when the user scrolls we check if we need to show the button\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n\n throttledHandleScroll();\n };\n\n return (\n <div className='list-container' onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {subscribedEvents.map((event) => {\n const secondaryData = getPropertyValue(event, secondarySource);\n const isLive = getIsLive(event.id, selectedEventId, playback);\n const isArmed = !isLive && event.id === selectedEventId;\n const countdownEvent = extendEventData(event, currentDay, actualStart, plannedStart, offset, mode, reportData);\n const title = event.title.length ? event.title : ' '; // insert utf-8 empty space to avoid the line collapsing\n return (\n <div\n key={event.id}\n ref={isLive ? selectedRef : undefined}\n className={cx(['sub', isLive && 'sub--live', isArmed && 'sub--armed'])}\n data-testid={event.cue}\n >\n <div className='sub__binder' style={{ '--user-color': event.colour }} />\n <ScheduleTime event={countdownEvent} showExpected={showExpected} />\n <SubscriptionStatus event={countdownEvent} />\n <div className={cx(['sub__title', !event.title && 'subdued'])}>{title}</div>\n {secondaryData && <div className='sub__secondary'>{secondaryData}</div>}\n </div>\n );\n })}\n <div className={cx(['fab-container', !showFab && 'fab-container--hidden'])}>\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoPencil /> Edit\n </Button>\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n\ntype ScheduleTimeProps = {\n event: CountdownEvent;\n showExpected: boolean;\n};\n//TODO: consider relative mode\nexport function ScheduleTime(props: ScheduleTimeProps) {\n const { event, showExpected } = props;\n const { timeStart, duration, delay, expectedStart, countToEnd } = event;\n\n const plannedStart = timeStart + delay + event.dayOffset * dayInMs;\n\n // only show new exacted value if outside range of the planned value\n const isExpectedValueShow = showExpected && isOutsideRange(plannedStart, expectedStart);\n\n const plannedStateClass = isExpectedValueShow ? 'sub__schedule--strike' : delay !== 0 ? 'sub__schedule--delayed' : '';\n\n const expectedStateClass = `sub__schedule--${getOffsetState(expectedStart - plannedStart)}`;\n const plannedEnd = plannedStart + duration + delay;\n const expectedEnd = countToEnd ? Math.max(expectedStart + duration, plannedEnd) : expectedStart + duration;\n const expectedEndClass = `sub__schedule--${getOffsetState(expectedEnd - plannedEnd)}`;\n\n return (\n <div className='sub__schedule'>\n <ClockTime\n value={plannedStart}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n className={plannedStateClass}\n />\n {!isExpectedValueShow && (\n <>\n →\n <ClockTime\n value={plannedEnd}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n className={plannedStateClass}\n />\n </>\n )}\n {isExpectedValueShow && (\n <>\n <ClockTime\n value={expectedStart}\n className={expectedStateClass}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n />\n →\n <ClockTime\n value={expectedEnd}\n className={expectedEndClass}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n />\n </>\n )}\n </div>\n );\n}\n\ninterface SubscriptionStatusProps {\n event: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number };\n}\n\nfunction SubscriptionStatus({ event }: SubscriptionStatusProps) {\n const { status, statusDisplay, timeDisplay } = useSubscriptionDisplayData(event);\n\n return (\n <>\n <div className='sub__status'>{statusDisplay}</div>\n {status === 'done' ? (\n <SuperscriptTime className='sub__timer' time={timeDisplay} />\n ) : (\n <div className='sub__timer'>{timeDisplay}</div>\n )}\n </>\n );\n}\n","import { IoPencil } from 'react-icons/io5';\nimport { MaybeNumber, OntimeEvent } from 'ontime-types';\nimport { getExpectedStart } from 'ontime-utils';\n\nimport Button from '../../common/components/buttons/Button';\nimport { useFadeOutOnInactivity } from '../../common/hooks/useFadeOutOnInactivity';\nimport { useExpectedStartData } from '../../common/hooks/useSocket';\nimport useReport from '../../common/hooks-query/useReport';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\nimport { useCountdownOptions } from './countdown.options';\nimport { useSubscriptionDisplayData } from './countdown.utils';\nimport { ScheduleTime } from './CountdownSubscriptions';\n\nimport './SingleEventCountdown.scss';\n\ninterface SingleEventCountdownProps {\n subscribedEvent: ExtendedEntry<OntimeEvent>;\n goToEditMode: () => void;\n}\n\nexport default function SingleEventCountdown({ subscribedEvent, goToEditMode }: SingleEventCountdownProps) {\n const { secondarySource, showExpected } = useCountdownOptions();\n const showFab = useFadeOutOnInactivity(true);\n const { data: reportData } = useReport();\n\n const { offset, currentDay, actualStart, plannedStart, mode } = useExpectedStartData();\n const { totalGap, isLinkedToLoaded } = subscribedEvent;\n const expectedStart = getExpectedStart(subscribedEvent, {\n currentDay,\n totalGap,\n actualStart,\n plannedStart,\n isLinkedToLoaded,\n offset,\n mode,\n });\n\n const { endedAt } = reportData[subscribedEvent.id] ?? { endedAt: null };\n const countdownEvent = { ...subscribedEvent, expectedStart, endedAt };\n const title = subscribedEvent.title.length ? subscribedEvent.title : ' '; // insert utf-8 empty space to avoid the line collapsing\n const secondaryData = getPropertyValue(subscribedEvent, secondarySource);\n\n return (\n <div className='single-container' data-testid='countdown-event'>\n <SubscriptionStatus event={countdownEvent} />\n <div className='event__title' style={{ borderColor: countdownEvent.colour }}>\n <ScheduleTime event={countdownEvent} showExpected={showExpected} />\n {title}\n {secondaryData && <div className='secondary'>{secondaryData}</div>}\n </div>\n <div className={cx(['fab-container', !showFab && 'fab-container--hidden'])}>\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoPencil /> Edit\n </Button>\n </div>\n </div>\n );\n}\n\ninterface SubscriptionStatusProps {\n event: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number };\n}\n\nfunction SubscriptionStatus({ event }: SubscriptionStatusProps) {\n const { status, statusDisplay, timeDisplay } = useSubscriptionDisplayData(event);\n\n return (\n <>\n <div className='event__status'>{statusDisplay}</div>\n {status === 'done' ? (\n <SuperscriptTime className='event__timer' time={timeDisplay} />\n ) : (\n <div className='event__timer'>{timeDisplay}</div>\n )}\n </>\n );\n}\n","import { CustomFields, OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface CountdownData {\n customFields: CustomFields;\n rundownData: ExtendedEntry<OntimeEntry>[];\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n}\n\nexport function useCountdownData(): ViewData<CountdownData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundownWithMetadata();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n customFields,\n rundownData,\n projectData,\n isMirrored,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useMemo, useState } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { EntryId, isOntimeEvent, isPlayableEvent, OntimeEvent, OntimeView } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport Empty from '../../common/components/state/Empty';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useClock } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport { getCountdownOptions, useCountdownOptions } from './countdown.options';\nimport { getOrderedSubscriptions } from './countdown.utils';\nimport CountdownSelect from './CountdownSelect';\nimport CountdownSubscriptions from './CountdownSubscriptions';\nimport SingleEventCountdown from './SingleEventCountdown';\nimport { CountdownData, useCountdownData } from './useCountdownData';\n\nimport './Countdown.scss';\n\nexport default function CountdownLoader() {\n const { data, status } = useCountdownData();\n\n useWindowTitle('Countdown');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Countdown {...data} />;\n}\n\nfunction Countdown({ customFields, rundownData, projectData, isMirrored, settings }: CountdownData) {\n const { getLocalizedString } = useTranslation();\n const { subscriptions } = useCountdownOptions();\n\n const [editMode, setEditMode] = useState(false);\n\n // gather rundown data\n const playableEvents = rundownData.filter((entry) => isOntimeEvent(entry) && isPlayableEvent(entry));\n\n // gather presentation data\n const hasEvents = playableEvents.length > 0;\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const countdownOptions = useMemo(\n () => getCountdownOptions(defaultFormat, customFields, subscriptions),\n [defaultFormat, customFields, subscriptions],\n );\n\n return (\n <div className={`countdown ${isMirrored ? 'mirror' : ''}`} data-testid='countdown-view'>\n <ViewParamsEditor target={OntimeView.Countdown} viewOptions={countdownOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <CountdownClock />\n </div>\n\n {!hasEvents && <Empty text={getLocalizedString('common.no_data')} className='empty-container' />}\n\n {hasEvents && editMode && (\n <CountdownSelect events={playableEvents} subscriptions={subscriptions} disableEdit={() => setEditMode(false)} />\n )}\n\n {hasEvents && !editMode && (\n <CountdownContents\n playableEvents={playableEvents}\n subscriptions={subscriptions}\n goToEditMode={() => setEditMode(true)}\n />\n )}\n </div>\n );\n}\n\ninterface CountdownContentsProps {\n playableEvents: ExtendedEntry<OntimeEvent>[];\n subscriptions: EntryId[];\n goToEditMode: () => void;\n}\n\nfunction CountdownContents({ playableEvents, subscriptions, goToEditMode }: CountdownContentsProps) {\n const { getLocalizedString } = useTranslation();\n\n if (subscriptions.length === 0) {\n return (\n <div className='empty-container'>\n <Empty text={getLocalizedString('countdown.select_event')} className='empty-container' />\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoAdd /> Add\n </Button>\n </div>\n );\n }\n\n const subscribedEvents = getOrderedSubscriptions(subscriptions, playableEvents);\n\n if (subscribedEvents.length === 0) {\n return (\n <div className='empty-container'>\n <Empty text={getLocalizedString('countdown.select_event')} className='empty-container' />\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoAdd /> Add\n </Button>\n </div>\n );\n }\n\n if (subscribedEvents.length === 1) {\n const event = subscribedEvents.at(0);\n if (!event) return null;\n return <SingleEventCountdown subscribedEvent={event} goToEditMode={goToEditMode} />;\n }\n\n return <CountdownSubscriptions subscribedEvents={subscribedEvents} goToEditMode={goToEditMode} />;\n}\n\nfunction CountdownClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["getCountdownOptions","timeFormat","customFields","persistedSubscriptions","secondaryOptions","makeOptionsFromCustomFields","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","isStringBoolean","useCountdownOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","preferredFormat12","preferredFormat24","getIsLive","currentId","selectedId","playback","Playback","timerProgress","useSubscriptionDisplayData","subscribedEvent","current","clock","useCountdownSocket","getLocalizedString","useTranslation","bigDuration","value","formatDuration","MILLIS_PER_MINUTE","formatTime","makeSubscriptionsUrl","urlRef","subscriptions","url","newParams","id","getOrderedSubscriptions","playableEvents","event","isOutsideRange","a","b","extendEventData","currentDay","actualStart","plannedStart","offset","mode","reportData","totalGap","isLinkedToLoaded","expectedStart","getExpectedStart","endedAt","ClockTime","props","FORMAT_12","FORMAT_24","className","formattedTime","jsx","SuperscriptTime","CountdownSelect","events","disableEdit","selected","setSelected","useState","navigate","useNavigate","toggleSelect","entryId","prev","applySelection","filteredSelected","selectedIds","jsxs","index","title","isSelected","e","cx","Button","IoArrowBack","IoClose","IoSaveOutline","CountdownSubscriptions","subscribedEvents","goToEditMode","secondarySource","showExpected","usePlayback","selectedEventId","useSelectedEventId","showFab","useFadeOutOnInactivity","useReport","useExpectedStartData","timeoutId","useRef","lockAutoScroll","setLockAutoScroll","selectedRef","scrollRef","scrollToComponent","useFollowComponent","useEffect","_a","handleOffset","throttledHandleScroll","throttle","selectedRect","scrollerRect","distanceFromTop","hasScrolledOutOfThreshold","handleScroll","secondaryData","getPropertyValue","isLive","isArmed","countdownEvent","ScheduleTime","SubscriptionStatus","IoPencil","FollowButton","timeStart","duration","delay","countToEnd","dayInMs","isExpectedValueShow","plannedStateClass","expectedStateClass","getOffsetState","plannedEnd","expectedEnd","expectedEndClass","Fragment","status","statusDisplay","timeDisplay","SingleEventCountdown","useCountdownData","isMirrored","useViewOptionsStore","state","rundownData","rundownStatus","useFlatRundownWithMetadata","projectData","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","CountdownLoader","data","useWindowTitle","Loader","EmptyPage","Countdown","editMode","setEditMode","entry","isOntimeEvent","isPlayableEvent","hasEvents","defaultFormat","getDefaultFormat","countdownOptions","ViewParamsEditor","OntimeView","ViewLogo","CountdownClock","Empty","CountdownContents","IoAdd","useClock","formattedClock"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as w,ad as I,j as e}from"./vendor-9UkPSc5K.js";import{f as v,bO as d,X as S,a7 as u,B as m,_ as T,ac as _,ad as O,ae as C,af as D,ag as B}from"./index-njXwwjfn.js";import{I as M}from"./useWindowTitle-B2UzPuki.js";import{M as F}from"./Modal-krcwDRb-.js";import"./useProjectData-DW06zQvF.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new s.Error().stack;n&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[n]="c7ce6bf0-6312-4b11-a524-065c45c86de8",s._sentryDebugIdIdentifier="sentry-dbid-c7ce6bf0-6312-4b11-a524-065c45c86de8")}catch{}})();function K({isOpen:s,onClose:n}){const{userTranslation:i,postUserTranslation:f}=v(),h=w.useMemo(()=>{const t={};return Object.keys(d).forEach(r=>{t[l(r)]=i[r]||""}),t},[i]),{handleSubmit:b,register:p,reset:g,formState:{isSubmitting:c,isDirty:x,errors:a,isValid:j},setError:y}=I({defaultValues:h,resetOptions:{keepDirtyValues:!0},mode:"onChange"}),E=async t=>{try{const r={};Object.keys(t).forEach(o=>{r[L(o)]=t[o]}),await f(r),g(t)}catch(r){y("root",{message:B(r)})}};return e.jsx(F,{title:"Edit custom translations",isOpen:s,onClose:n,showCloseButton:!0,showBackdrop:!0,bodyElements:e.jsxs(T,{as:"form",onSubmit:b(E),id:"custom-translations-form",children:[e.jsxs(M,{children:["Provide custom translations for the public views of Ontime. ",e.jsx("br",{}),'You will need to activate this in the settings by selecting "Custom" as the views language.']}),e.jsx(_,{children:Object.entries(d).map(([t,r])=>{var o;return e.jsxs(O,{children:[e.jsx(C,{title:r,description:"",error:(o=a[l(t)])==null?void 0:o.message}),e.jsx(D,{maxLength:150,...p(l(t),{required:"This field is required"}),placeholder:r})]},t)})})]}),footerElements:e.jsxs("div",{children:[(a==null?void 0:a.root)&&e.jsx(S,{children:a.root.message}),e.jsx(u,{align:"apart",children:e.jsxs(u,{children:[e.jsx(m,{size:"large",onClick:n,children:"Cancel"}),e.jsx(m,{variant:"primary",size:"large",type:"submit",form:"custom-translations-form",disabled:c||!x||!j,loading:c,children:"Save changes"})]})})]})})}function l(s){return s.replace(".","_")}function L(s){return s.replace("_",".")}export{K as default};
|
|
2
|
-
//# sourceMappingURL=CustomTranslationModal-BBNxpds0.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as a,aT as s,b2 as l}from"./vendor-9UkPSc5K.js";import{m as t}from"./dateConfig-WYqMzV9D.js";import{T as d}from"./Tooltip-C0rGHLsB.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new o.Error().stack;e&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[e]="e74baa9a-fa50-4164-a40c-bed9689a6193",o._sentryDebugIdIdentifier="sentry-dbid-e74baa9a-fa50-4164-a40c-bed9689a6193")}catch{}})();const i="_delaySymbol_1i27r_17",y={delaySymbol:i};function m(o){const{delayValue:e,tooltipPrefix:n}=o;if(typeof e!="number"||e===0)return null;const r=n?`${n} ${t(e)}`:t(e);return a.jsx(d,{text:r,render:a.jsx("span",{}),className:y.delaySymbol,children:e<0?a.jsx(s,{}):a.jsx(l,{})})}export{m as D};
|
|
2
|
-
//# sourceMappingURL=DelayIndicator-CFCDQ7FN.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as t}from"./vendor-9UkPSc5K.js";import{P as o}from"./ProtectRoute-DJ9xZnPI.js";import"./index-njXwwjfn.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new e.Error().stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="8ca23f32-8b16-4bad-9476-9f27952185b5",e._sentryDebugIdIdentifier="sentry-dbid-8ca23f32-8b16-4bad-9476-9f27952185b5")}catch{}})();const s="_wrapper_1t7jb_17",n={wrapper:s};function p({children:e}){return t.jsx(o,{permission:"editor",children:t.jsx("div",{className:n.wrapper,children:e})})}export{p as default};
|
|
2
|
-
//# sourceMappingURL=EditorFeatureWrapper-D55c8JBz.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._blink_xcz5k_1{animation:_blink_xcz5k_1 1s step-start infinite}@keyframes _blink_xcz5k_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_xcz5k_13{transform:rotate(45deg)}._corner_xcz5k_17{transform:rotate(45deg);position:absolute;top:.5rem;right:.5rem;cursor:pointer;color:#f6f6f6;transition-property:color;transition-duration:.1s;border-radius:99px;background-color:#303030;outline:2px solid #303030}._corner_xcz5k_17:hover{color:#ff7597;background-color:#404040;outline:2px solid #404040}._header_xcz5k_36{font-size:1.5rem}._title_xcz5k_40{font-size:1rem;color:#e2e2e2;display:flex;align-items:center;justify-content:space-between}._label_xcz5k_48{display:block;font-size:calc(1rem - 3px);color:#b1b1b1;margin-bottom:.25rem;max-width:max-content}._separator_xcz5k_56{background-color:#ffffff1a}._separator_xcz5k_56._horizontal_xcz5k_59{width:100%;height:1px}._separator_xcz5k_56._vertical_xcz5k_63{width:1px;height:.75em}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as o,x as c}from"./vendor-9UkPSc5K.js";import{i as a}from"./index-njXwwjfn.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="ebb179af-b686-4c02-8241-b0ad08c460e9",e._sentryDebugIdIdentifier="sentry-dbid-ebb179af-b686-4c02-8241-b0ad08c460e9")}catch{}})();const l="_blink_xcz5k_1",i="_fourtyfive_xcz5k_13",_="_corner_xcz5k_17",b="_header_xcz5k_36",f="_title_xcz5k_40",d="_label_xcz5k_48",u="_separator_xcz5k_56",x="_horizontal_xcz5k_59",p="_vertical_xcz5k_63",s={blink:l,fourtyfive:i,corner:_,header:b,title:f,label:d,separator:u,horizontal:x,vertical:p};function z({className:e,...t}){return o.jsx(c,{className:a([s.corner,e]),...t})}function h({children:e,className:t,...r}){const n=a([s.title,t]);return o.jsx("h3",{className:n,...r,children:e})}function m({children:e,className:t,...r}){const n=a([s.label,t]);return o.jsx("label",{className:n,...r,children:e})}function v({className:e,orientation:t="vertical",...r}){return o.jsx("div",{className:a([s.separator,s[t],e]),role:"separator",...r})}export{z as C,m as L,v as S,h as T};
|
|
2
|
-
//# sourceMappingURL=EditorUtils-CFE106qQ.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditorUtils-CFE106qQ.js","sources":["../../src/common/components/editor-utils/EditorUtils.tsx"],"sourcesContent":["import type { HTMLAttributes, LabelHTMLAttributes } from 'react';\nimport { IconBaseProps } from 'react-icons';\nimport { IoArrowUp } from 'react-icons/io5';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './EditorUtils.module.scss';\n\nexport function Corner({ className, ...elementProps }: IconBaseProps) {\n return <IoArrowUp className={cx([style.corner, className])} {...elementProps} />;\n}\n\nexport function Title({ children, className, ...elementProps }: HTMLAttributes<HTMLHeadingElement>) {\n const classes = cx([style.title, className]);\n return (\n <h3 className={classes} {...elementProps}>\n {children}\n </h3>\n );\n}\n\nexport function Label({ children, className, ...elementProps }: LabelHTMLAttributes<HTMLLabelElement>) {\n const classes = cx([style.label, className]);\n return (\n <label className={classes} {...elementProps}>\n {children}\n </label>\n );\n}\n\ninterface SeparatorProps extends HTMLAttributes<HTMLDivElement> {\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport function Separator({ className, orientation = 'vertical', ...elementProps }: SeparatorProps) {\n return <div className={cx([style.separator, style[orientation], className])} role='separator' {...elementProps} />;\n}\n"],"names":["Corner","className","elementProps","jsx","IoArrowUp","cx","style","Title","children","classes","Label","Separator","orientation"],"mappings":"6tBAQO,SAASA,EAAO,CAAE,UAAAC,EAAW,GAAGC,GAA+B,CAC7D,OAAAC,MAACC,EAAU,CAAA,UAAWC,EAAG,CAACC,EAAM,OAAQL,CAAS,CAAC,EAAI,GAAGC,CAAc,CAAA,CAChF,CAEO,SAASK,EAAM,CAAE,SAAAC,EAAU,UAAAP,EAAW,GAAGC,GAAoD,CAClG,MAAMO,EAAUJ,EAAG,CAACC,EAAM,MAAOL,CAAS,CAAC,EAC3C,aACG,KAAG,CAAA,UAAWQ,EAAU,GAAGP,EACzB,SAAAM,EACH,CAEJ,CAEO,SAASE,EAAM,CAAE,SAAAF,EAAU,UAAAP,EAAW,GAAGC,GAAuD,CACrG,MAAMO,EAAUJ,EAAG,CAACC,EAAM,MAAOL,CAAS,CAAC,EAC3C,aACG,QAAM,CAAA,UAAWQ,EAAU,GAAGP,EAC5B,SAAAM,EACH,CAEJ,CAMO,SAASG,EAAU,CAAE,UAAAV,EAAW,YAAAW,EAAc,WAAY,GAAGV,GAAgC,CAClG,aAAQ,MAAI,CAAA,UAAWG,EAAG,CAACC,EAAM,UAAWA,EAAMM,CAAW,EAAGX,CAAS,CAAC,EAAG,KAAK,YAAa,GAAGC,EAAc,CAClH"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as n}from"./vendor-9UkPSc5K.js";import{i as o,b1 as a}from"./index-njXwwjfn.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="896b8487-ed05-4973-9a31-a50ff9e0836c",e._sentryDebugIdIdentifier="sentry-dbid-896b8487-ed05-4973-9a31-a50ff9e0836c")}catch{}})();const r="_emptyContainer_xiuvv_17",d="_empty_xiuvv_17",y="_text_xiuvv_26",s={emptyContainer:r,empty:d,text:y};function m({text:e,className:t,injectedStyles:i}){return n.jsxs("div",{className:o([s.emptyContainer,t]),style:i,children:[n.jsx(a,{className:s.empty}),e&&n.jsx("span",{className:s.text,children:e})]})}export{m as E};
|
|
2
|
-
//# sourceMappingURL=Empty-C-JO_XAr.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
% �~:�2�Q�����K�Rh�����F�wn��0K�0�����#x�H�~���eID��Ħ�EB*݀0݅�Mi�w���W�+H(�v��fS�t�^M�a�}��fü6����6�j���C>øIfd�J�<�{0�6$<��3ZD������3ą��7Ƚ�2!���R���OL@w�";D�C��ɟ4�8p�bj��i�6mD�I#�Ȳ��%D��E�C��:8�!��4�;)5hT�����^�#m�C�0�t��[vf����H��dd�#�ʘ��;+������R!��AeS(��:�.&S���eG�KQ!igN`�vdT���#�?U@j�;�O�٩D�T�*`�$��6��}]�������K���
|
|
2
|
-
s��3�ڟ�xy�� �{M��������uD�
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as n}from"./vendor-9UkPSc5K.js";import{E as s}from"./Empty-C-JO_XAr.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="6a2fc055-09c3-4c46-a7fd-6a27bcc357e8",e._sentryDebugIdIdentifier="sentry-dbid-6a2fc055-09c3-4c46-a7fd-6a27bcc357e8")}catch{}})();const a="_page_27rqx_22",d={page:a};function f({text:e,injectedStyles:t}){return n.jsx("div",{className:d.page,children:n.jsx(s,{text:e,injectedStyles:t})})}export{f as E};
|
|
2
|
-
//# sourceMappingURL=EmptyPage-BSzsxpGg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
� �ZM���n6�g���2Lܬa��Z�uQQa�����u��-��6F��Г>.�XNlϣ�9��¿f���_����4Բ���$�9����[�c�����9=���s�[�M�x�`��:��^�6å�+�Y�O���q�hCy�6K�|h0�s���^#rp������5�h�x��8(y��d��J�挟��\�Nv�0����X���t�]�9�E;��|��5���:�g��� $�,������%��K�D�QOr#�K]�P>���]��d�W�T�D�$wjtQ7G�"Q�=W7|��� ��Yvw}���5��Jgڤ�ɐN
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,b1 as d}from"./vendor-9UkPSc5K.js";import{i}from"./index-njXwwjfn.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new o.Error().stack;t&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[t]="0c586c03-1aa6-405b-816c-116786379711",o._sentryDebugIdIdentifier="sentry-dbid-0c586c03-1aa6-405b-816c-116786379711")}catch{}})();const c="_followButton_58wqq_17",r="_hidden_58wqq_38",s={followButton:c,hidden:r};function u(o){const{isVisible:t,onClickHandler:n}=o,l=i([s.followButton,!t&&s.hidden]);return e.jsxs("button",{className:l,onClick:n,type:"button",children:[e.jsx(d,{}),"Follow"]})}export{u as F};
|
|
2
|
-
//# sourceMappingURL=FollowButton-Mox6N4JW.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{h as l,j as e,aL as A,x as B,bR as L,br as P,bS as R,bT as S,bU as w}from"./vendor-9UkPSc5K.js";import{C as k,S as D}from"./EditorUtils-CFE106qQ.js";import{i as _,af as V,bI as F,c as O,T as d,bg as q,a as y,av as I,bJ as T,B as C,bK as o,bL as H,ai as N,bM as U,bv as $,b6 as z,bw as J}from"./index-njXwwjfn.js";import{P as K}from"./ProtectRoute-DJ9xZnPI.js";import{S as W}from"./Select-BLA-yQMq.js";import{T as b}from"./Tooltip-C0rGHLsB.js";import{s as j}from"./Editor.module-DvV2efYs.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="cc035f97-93b1-44dd-ac26-4b9c85ccc049",s._sentryDebugIdIdentifier="sentry-dbid-cc035f97-93b1-44dd-ac26-4b9c85ccc049")}catch{}})();const G="_label_o0qma_17",Q="_active_o0qma_21",X="_inputItems_o0qma_90",h={label:G,active:Q,inputItems:X};function E(s){const{label:t,placeholder:n,text:a,visible:u,changeHandler:f,children:c}=s,[m,x]=l.useState(a),i=l.useRef(null),p=l.useRef(0);l.useEffect(()=>{i.current&&i.current!==document.activeElement&&(i.current.selectionStart=p.current,i.current.selectionEnd=p.current)},[a]),l.useEffect(()=>{i.current!==document.activeElement&&x(a)},[a]);const v=g=>{p.current=g.target.selectionStart??0,x(g.target.value),f(g.target.value)};return e.jsxs("div",{className:h.inputRow,children:[e.jsx("label",{className:_([h.label,u??h.active]),htmlFor:t,children:t}),e.jsxs("div",{className:h.inputItems,children:[e.jsx(V,{id:t,ref:i,value:m,onChange:v,placeholder:n}),c]})]})}const Y="_blink_18658_1",Z="_previewContainer_18658_25",ee="_preview_18658_25",te="_options_18658_39",se="_eventStatus_18658_45",ne="_mainContent_18658_54",ae="_secondaryContent_18658_70",re="_blackout_18658_74",oe="_statusIcon_18658_83",r={blink:Y,previewContainer:Z,preview:ee,options:te,eventStatus:se,mainContent:ne,secondaryContent:ae,blackout:re,statusIcon:oe},ie={aux1:"Aux 1",aux2:"Aux 2",aux3:"Aux 3",secondary:"Secondary message"};function ce(){const{blink:s,blackout:t,countToEnd:n,phase:a,secondarySource:u,showTimerMessage:f,timerType:c}=F(),{data:m}=O(),x=f?"Message":c===d.None?q:a===y.Pending?"Standby to start":a===y.Overtime?"Timer Overtime":c===d.Clock?"Clock":n?"Count to End":"Timer",i=f||!u?null:ie[u],p=a===y.Warning?m.warningColor??"#ffa528":a===y.Danger?m.dangerColor??"#ff7300":m.normalColor??"#FFFC",v=x=="Timer",g=_([s&&r.blink,t&&r.blackout]);return e.jsxs("div",{className:r.preview,children:[e.jsx(k,{onClick:M=>I("timer",M)}),e.jsxs("div",{className:g,children:[e.jsx("div",{className:r.mainContent,"data-phase":v&&a,style:v?{"--override-colour":p}:{},children:x}),i!==null&&e.jsx("div",{className:r.secondaryContent,children:i})]}),e.jsxs("div",{className:r.eventStatus,children:[e.jsx(b,{text:"Time type: Count down",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.CountDown,children:e.jsx(A,{})}),e.jsx(b,{text:"Time type: Count up",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.CountUp,children:e.jsx(B,{})}),e.jsx(b,{text:"Time type: Clock",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.Clock,children:e.jsx(L,{})}),e.jsx(b,{text:"Time type: None",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.None,children:e.jsx(P,{})}),e.jsx(b,{text:n?"Count to end":"Count duration",render:e.jsx("span",{}),className:r.statusIcon,"data-active":n,children:e.jsx(R,{})})]})]})}function le(){const{blackout:s,blink:t}=T();return e.jsxs("div",{className:r.previewContainer,children:[e.jsx(ce,{}),e.jsxs("div",{className:r.options,children:[e.jsx(ue,{}),e.jsx(D,{orientation:"horizontal"}),e.jsx(C,{variant:t?"primary":"subtle",fluid:!0,onClick:()=>o.timerBlink(!t),"data-testid":"toggle timer blink",children:"Blink"}),e.jsx(C,{variant:s?"primary":"subtle",fluid:!0,onClick:()=>o.timerBlackout(!s),"data-testid":"toggle timer blackout",children:"Blackout screen"})]})]})}function ue(){const{secondarySource:s}=T(),[t,n]=l.useState("aux1");l.useEffect(()=>{s!==null&&n(s)},[s]);const a=()=>{s===t?o.timerSecondarySource(null):o.timerSecondarySource(t)};return e.jsxs(e.Fragment,{children:[e.jsx(W,{value:t,options:[{value:"aux1",label:"Aux 1"},{value:"aux2",label:"Aux 2"},{value:"aux3",label:"Aux 3"},{value:"secondary",label:"Secondary message"}],onValueChange:u=>{s!==null&&o.timerSecondarySource(u),n(u)}}),e.jsx(C,{variant:s!==null?"primary":"subtle",fluid:!0,onClick:a,"data-testid":"toggle secondary",children:"Show secondary"})]})}function de(){return e.jsxs(e.Fragment,{children:[e.jsx(le,{}),e.jsx(me,{}),e.jsx(xe,{})]})}function me(){const{text:s,visible:t}=H();return e.jsx(E,{label:"Timer Message",placeholder:"Message shown fullscreen in stage timer",text:s,visible:t,changeHandler:n=>o.timerText(n),children:e.jsx(N,{"aria-label":"Toggle timer message visibility",onClick:()=>o.timerVisible(!t),variant:t?"primary":"subtle",children:t?e.jsx(S,{}):e.jsx(w,{})})})}function xe(){const{text:s,visible:t}=U(),n=()=>{t?o.timerSecondarySource(null):o.timerSecondarySource("secondary")};return e.jsx(E,{label:"Secondary Message",placeholder:"Message shown as secondary text in stage timer",text:s,visible:t,changeHandler:a=>o.secondaryMessage(a),children:e.jsx(N,{"aria-label":"Toggle secondary message visibility",onClick:n,variant:t?"primary":"subtle",children:t?e.jsx(S,{}):e.jsx(w,{})})})}const Ce=l.memo(pe);function pe(){const s=window.location.pathname.includes("/messagecontrol"),t=_([j.content,j.contentColumnLayout]);return e.jsx(K,{permission:"editor",children:e.jsxs("div",{className:j.messages,"data-testid":"panel-messages-control",children:[!s&&e.jsx(k,{onClick:n=>I("messagecontrol",n)}),s&&e.jsx($,{suppressSettings:!0,isNavigationLocked:z()}),e.jsx("div",{className:t,children:e.jsx(J,{children:e.jsx(de,{})})})]})})}export{Ce as default};
|
|
2
|
-
//# sourceMappingURL=MessageControlExport-BL2ip9qN.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MessageControlExport-BL2ip9qN.js","sources":["../../src/features/control/message/InputRow.tsx","../../src/features/control/message/TimerPreview.tsx","../../src/features/control/message/TimerViewControl.tsx","../../src/features/control/message/MessageControl.tsx","../../src/features/control/message/MessageControlExport.tsx"],"sourcesContent":["import { PropsWithChildren, useEffect, useRef, useState } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './InputRow.module.scss';\n\ninterface InputRowProps {\n label: string;\n placeholder: string;\n text: string;\n visible: boolean;\n changeHandler: (newValue: string) => void;\n}\n\nexport default function InputRow(props: PropsWithChildren<InputRowProps>) {\n const { label, placeholder, text, visible, changeHandler, children } = props;\n\n const [value, setValue] = useState(text);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef(0);\n\n // sync cursor position with text\n useEffect(() => {\n if (inputRef.current && inputRef.current !== document.activeElement) {\n inputRef.current.selectionStart = cursorPositionRef.current;\n inputRef.current.selectionEnd = cursorPositionRef.current;\n }\n }, [text]);\n\n // synchronise external text\n useEffect(() => {\n if (inputRef.current !== document.activeElement) {\n setValue(text);\n }\n }, [text]);\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n cursorPositionRef.current = event.target.selectionStart ?? 0;\n setValue(event.target.value);\n changeHandler(event.target.value);\n };\n\n return (\n <div className={style.inputRow}>\n <label className={cx([style.label, visible ?? style.active])} htmlFor={label}>\n {label}\n </label>\n <div className={style.inputItems}>\n <Input id={label} ref={inputRef} value={value} onChange={handleInputChange} placeholder={placeholder} />\n {children}\n </div>\n </div>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoBan, IoTime } from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { TimerPhase, TimerType } from 'ontime-types';\n\nimport { Corner } from '../../../common/components/editor-utils/EditorUtils';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useMessagePreview } from '../../../common/hooks/useSocket';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { cx, timerPlaceholder } from '../../../common/utils/styleUtils';\n\nimport style from './MessageControl.module.scss';\n\nconst secondarySourceLabels: Record<string, string> = {\n aux1: 'Aux 1',\n aux2: 'Aux 2',\n aux3: 'Aux 3',\n secondary: 'Secondary message',\n};\n\nexport default function TimerPreview() {\n const { blink, blackout, countToEnd, phase, secondarySource, showTimerMessage, timerType } = useMessagePreview();\n const { data } = useViewSettings();\n\n const main = (() => {\n if (showTimerMessage) return 'Message';\n if (timerType === TimerType.None) return timerPlaceholder;\n if (phase === TimerPhase.Pending) return 'Standby to start';\n if (phase === TimerPhase.Overtime) return 'Timer Overtime';\n if (timerType === TimerType.Clock) return 'Clock';\n if (countToEnd) return 'Count to End';\n return 'Timer';\n })();\n\n const secondary = (() => {\n // message is a fullscreen overlay or secondary is not active\n if (showTimerMessage || !secondarySource) return null;\n\n // we need to check aux first since it takes priority\n return secondarySourceLabels[secondarySource];\n })();\n\n const overrideColour = (() => {\n // override fallback colours from starter project\n if (phase === TimerPhase.Warning) return data.warningColor ?? '#ffa528';\n if (phase === TimerPhase.Danger) return data.dangerColor ?? '#ff7300';\n return data.normalColor ?? '#FFFC';\n })();\n\n const showColourOverride = main == 'Timer';\n const contentClasses = cx([blink && style.blink, blackout && style.blackout]);\n\n return (\n <div className={style.preview}>\n <Corner onClick={(event) => handleLinks('timer', event)} />\n <div className={contentClasses}>\n <div\n className={style.mainContent}\n data-phase={showColourOverride && phase}\n style={showColourOverride ? { '--override-colour': overrideColour } : {}}\n >\n {main}\n </div>\n {secondary !== null && <div className={style.secondaryContent}>{secondary}</div>}\n </div>\n <div className={style.eventStatus}>\n <Tooltip\n text='Time type: Count down'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountDown}\n >\n <IoArrowDown />\n </Tooltip>\n <Tooltip\n text='Time type: Count up'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountUp}\n >\n <IoArrowUp />\n </Tooltip>\n <Tooltip\n text='Time type: Clock'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.Clock}\n >\n <IoTime />\n </Tooltip>\n <Tooltip\n text='Time type: None'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.None}\n >\n <IoBan />\n </Tooltip>\n <Tooltip\n text={countToEnd ? 'Count to end' : 'Count duration'}\n render={<span />}\n className={style.statusIcon}\n data-active={countToEnd}\n >\n <LuArrowDownToLine />\n </Tooltip>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { SecondarySource } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport Select from '../../../common/components/select/Select';\nimport { setMessage, useTimerViewControl } from '../../../common/hooks/useSocket';\n\nimport TimerPreview from './TimerPreview';\n\nimport style from './MessageControl.module.scss';\n\nexport default function TimerControlsPreview() {\n const { blackout, blink } = useTimerViewControl();\n\n return (\n <div className={style.previewContainer}>\n <TimerPreview />\n <div className={style.options}>\n <SecondarySourceControl />\n\n <Editor.Separator orientation='horizontal' />\n\n <Button\n variant={blink ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlink(!blink)}\n data-testid='toggle timer blink'\n >\n Blink\n </Button>\n <Button\n variant={blackout ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlackout(!blackout)}\n data-testid='toggle timer blackout'\n >\n Blackout screen\n </Button>\n </div>\n </div>\n );\n}\n\nfunction SecondarySourceControl() {\n const { secondarySource } = useTimerViewControl();\n const [value, setValue] = useState<SecondarySource>('aux1');\n\n // sync secondary source with external changes\n useEffect(() => {\n if (secondarySource !== null) {\n setValue(secondarySource);\n }\n }, [secondarySource]);\n\n const toggleSecondary = () => {\n if (secondarySource === value) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource(value);\n }\n };\n\n return (\n <>\n <Select\n value={value}\n options={[\n { value: 'aux1', label: 'Aux 1' },\n { value: 'aux2', label: 'Aux 2' },\n { value: 'aux3', label: 'Aux 3' },\n { value: 'secondary', label: 'Secondary message' },\n ]}\n onValueChange={(value) => {\n // we can only update the remote if it is enabled\n if (secondarySource !== null) {\n setMessage.timerSecondarySource(value as SecondarySource);\n }\n setValue(value as SecondarySource);\n }}\n />\n <Button\n variant={secondarySource !== null ? 'primary' : 'subtle'}\n fluid\n onClick={toggleSecondary}\n data-testid='toggle secondary'\n >\n Show secondary\n </Button>\n </>\n );\n}\n","import { IoEye, IoEyeOffOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport {\n setMessage,\n useExternalMessageInput as useSecondaryMessageInput,\n useTimerMessageInput,\n} from '../../../common/hooks/useSocket';\n\nimport InputRow from './InputRow';\nimport TimerControlsPreview from './TimerViewControl';\n\nexport default function MessageControl() {\n return (\n <>\n <TimerControlsPreview />\n <TimerMessageInput />\n <SecondaryInput />\n </>\n );\n}\n\nfunction TimerMessageInput() {\n const { text, visible } = useTimerMessageInput();\n\n return (\n <InputRow\n label='Timer Message'\n placeholder='Message shown fullscreen in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.timerText(newValue)}\n >\n <IconButton\n aria-label='Toggle timer message visibility'\n onClick={() => setMessage.timerVisible(!visible)}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n\nfunction SecondaryInput() {\n const { text, visible } = useSecondaryMessageInput();\n\n const toggleSecondary = () => {\n if (visible) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource('secondary');\n }\n };\n\n return (\n <InputRow\n label='Secondary Message'\n placeholder='Message shown as secondary text in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.secondaryMessage(newValue)}\n >\n <IconButton\n aria-label='Toggle secondary message visibility'\n onClick={toggleSecondary}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n","import { memo } from 'react';\n\nimport { Corner } from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { getIsNavigationLocked } from '../../../externals';\n\nimport MessageControl from './MessageControl';\n\nimport style from '../../../views/editor/Editor.module.scss';\n\nexport default memo(MessageControlExport);\nfunction MessageControlExport() {\n const isExtracted = window.location.pathname.includes('/messagecontrol');\n const classes = cx([style.content, style.contentColumnLayout]);\n\n return (\n <ProtectRoute permission='editor'>\n <div className={style.messages} data-testid='panel-messages-control'>\n {!isExtracted && <Corner onClick={(event) => handleLinks('messagecontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n\n <div className={classes}>\n <ErrorBoundary>\n <MessageControl />\n </ErrorBoundary>\n </div>\n </div>\n </ProtectRoute>\n );\n}\n"],"names":["InputRow","props","label","placeholder","text","visible","changeHandler","children","value","setValue","useState","inputRef","useRef","cursorPositionRef","useEffect","handleInputChange","event","jsxs","style","jsx","cx","Input","secondarySourceLabels","TimerPreview","blink","blackout","countToEnd","phase","secondarySource","showTimerMessage","timerType","useMessagePreview","data","useViewSettings","main","TimerType","timerPlaceholder","TimerPhase","secondary","overrideColour","showColourOverride","contentClasses","Corner","handleLinks","Tooltip","IoArrowDown","IoArrowUp","IoTime","IoBan","LuArrowDownToLine","TimerControlsPreview","useTimerViewControl","SecondarySourceControl","Editor.Separator","Button","setMessage","toggleSecondary","Fragment","Select","MessageControl","TimerMessageInput","SecondaryInput","useTimerMessageInput","newValue","IconButton","IoEye","IoEyeOffOutline","useSecondaryMessageInput","memo","MessageControlExport","isExtracted","classes","ProtectRoute","ViewNavigationMenu","getIsNavigationLocked","ErrorBoundary"],"mappings":"s7BAeA,SAAwBA,EAASC,EAAyC,CACxE,KAAM,CAAE,MAAAC,EAAO,YAAAC,EAAa,KAAAC,EAAM,QAAAC,EAAS,cAAAC,EAAe,SAAAC,GAAaN,EAEjE,CAACO,EAAOC,CAAQ,EAAIC,EAAAA,SAASN,CAAI,EACjCO,EAAWC,SAAyB,IAAI,EACxCC,EAAoBD,SAAO,CAAC,EAGlCE,EAAAA,UAAU,IAAM,CACVH,EAAS,SAAWA,EAAS,UAAY,SAAS,gBAC3CA,EAAA,QAAQ,eAAiBE,EAAkB,QAC3CF,EAAA,QAAQ,aAAeE,EAAkB,QACpD,EACC,CAACT,CAAI,CAAC,EAGTU,EAAAA,UAAU,IAAM,CACVH,EAAS,UAAY,SAAS,eAChCF,EAASL,CAAI,CACf,EACC,CAACA,CAAI,CAAC,EAEH,MAAAW,EAAqBC,GAA+C,CACtDH,EAAA,QAAUG,EAAM,OAAO,gBAAkB,EAClDP,EAAAO,EAAM,OAAO,KAAK,EACbV,EAAAU,EAAM,OAAO,KAAK,CAClC,EAEA,OACGC,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,SACpB,SAAA,CAAAC,EAAA,IAAC,QAAM,CAAA,UAAWC,EAAG,CAACF,EAAM,MAAOb,GAAWa,EAAM,MAAM,CAAC,EAAG,QAAShB,EACpE,SACHA,EAAA,EACCe,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,WACpB,SAAA,CAACC,EAAAA,IAAAE,EAAA,CAAM,GAAInB,EAAO,IAAKS,EAAU,MAAAH,EAAc,SAAUO,EAAmB,YAAAZ,CAA0B,CAAA,EACrGI,CAAA,CACH,CAAA,CAAA,EACF,CAEJ,gXCzCMe,GAAgD,CACpD,KAAM,QACN,KAAM,QACN,KAAM,QACN,UAAW,mBACb,EAEA,SAAwBC,IAAe,CAC/B,KAAA,CAAE,MAAAC,EAAO,SAAAC,EAAU,WAAAC,EAAY,MAAAC,EAAO,gBAAAC,EAAiB,iBAAAC,EAAkB,UAAAC,CAAU,EAAIC,EAAkB,EACzG,CAAE,KAAAC,CAAK,EAAIC,EAAgB,EAE3BC,EACAL,EAAyB,UACzBC,IAAcK,EAAU,KAAaC,EACrCT,IAAUU,EAAW,QAAgB,mBACrCV,IAAUU,EAAW,SAAiB,iBACtCP,IAAcK,EAAU,MAAc,QACtCT,EAAmB,eAChB,QAGHY,EAEAT,GAAoB,CAACD,EAAwB,KAG1CN,GAAsBM,CAAe,EAGxCW,EAEAZ,IAAUU,EAAW,QAAgBL,EAAK,cAAgB,UAC1DL,IAAUU,EAAW,OAAeL,EAAK,aAAe,UACrDA,EAAK,aAAe,QAGvBQ,EAAqBN,GAAQ,QAC7BO,EAAiBrB,EAAG,CAACI,GAASN,EAAM,MAAOO,GAAYP,EAAM,QAAQ,CAAC,EAE5E,OACGD,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,QACpB,SAAA,CAAAC,MAACuB,GAAO,QAAU1B,GAAU2B,EAAY,QAAS3B,CAAK,EAAG,EACzDC,EAAAA,KAAC,MAAI,CAAA,UAAWwB,EACd,SAAA,CAAAtB,EAAA,IAAC,MAAA,CACC,UAAWD,EAAM,YACjB,aAAYsB,GAAsBb,EAClC,MAAOa,EAAqB,CAAE,oBAAqBD,GAAmB,CAAC,EAEtE,SAAAL,CAAA,CACH,EACCI,IAAc,MAAQnB,EAAA,IAAC,OAAI,UAAWD,EAAM,iBAAmB,SAAUoB,CAAA,CAAA,CAAA,EAC5E,EACCrB,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,YACpB,SAAA,CAAAC,EAAA,IAACyB,EAAA,CACC,KAAK,wBACL,aAAS,OAAK,EAAA,EACd,UAAW1B,EAAM,WACjB,cAAaY,IAAcK,EAAU,UAErC,eAACU,EAAY,CAAA,CAAA,CAAA,CACf,EACA1B,EAAA,IAACyB,EAAA,CACC,KAAK,sBACL,aAAS,OAAK,EAAA,EACd,UAAW1B,EAAM,WACjB,cAAaY,IAAcK,EAAU,QAErC,eAACW,EAAU,CAAA,CAAA,CAAA,CACb,EACA3B,EAAA,IAACyB,EAAA,CACC,KAAK,mBACL,aAAS,OAAK,EAAA,EACd,UAAW1B,EAAM,WACjB,cAAaY,IAAcK,EAAU,MAErC,eAACY,EAAO,CAAA,CAAA,CAAA,CACV,EACA5B,EAAA,IAACyB,EAAA,CACC,KAAK,kBACL,aAAS,OAAK,EAAA,EACd,UAAW1B,EAAM,WACjB,cAAaY,IAAcK,EAAU,KAErC,eAACa,EAAM,CAAA,CAAA,CAAA,CACT,EACA7B,EAAA,IAACyB,EAAA,CACC,KAAMlB,EAAa,eAAiB,iBACpC,aAAS,OAAK,EAAA,EACd,UAAWR,EAAM,WACjB,cAAaQ,EAEb,eAACuB,EAAkB,CAAA,CAAA,CAAA,CAAA,CACrB,CACF,CAAA,CAAA,EACF,CAEJ,CCjGA,SAAwBC,IAAuB,CAC7C,KAAM,CAAE,SAAAzB,EAAU,MAAAD,CAAM,EAAI2B,EAAoB,EAEhD,OACGlC,EAAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,iBACpB,SAAA,CAAAC,EAAA,IAACI,GAAa,EAAA,EACbN,EAAA,KAAA,MAAA,CAAI,UAAWC,EAAM,QACpB,SAAA,CAAAC,EAAA,IAACiC,GAAuB,EAAA,EAEvBjC,EAAAA,IAAAkC,EAAA,CAAiB,YAAY,YAAa,CAAA,EAE3ClC,EAAA,IAACmC,EAAA,CACC,QAAS9B,EAAQ,UAAY,SAC7B,MAAK,GACL,QAAS,IAAM+B,EAAW,WAAW,CAAC/B,CAAK,EAC3C,cAAY,qBACb,SAAA,OAAA,CAED,EACAL,EAAA,IAACmC,EAAA,CACC,QAAS7B,EAAW,UAAY,SAChC,MAAK,GACL,QAAS,IAAM8B,EAAW,cAAc,CAAC9B,CAAQ,EACjD,cAAY,wBACb,SAAA,iBAAA,CAAA,CAED,CACF,CAAA,CAAA,EACF,CAEJ,CAEA,SAAS2B,IAAyB,CAC1B,KAAA,CAAE,gBAAAxB,CAAgB,EAAIuB,EAAoB,EAC1C,CAAC3C,EAAOC,CAAQ,EAAIC,EAAAA,SAA0B,MAAM,EAG1DI,EAAAA,UAAU,IAAM,CACVc,IAAoB,MACtBnB,EAASmB,CAAe,CAC1B,EACC,CAACA,CAAe,CAAC,EAEpB,MAAM4B,EAAkB,IAAM,CACxB5B,IAAoBpB,EACtB+C,EAAW,qBAAqB,IAAI,EAEpCA,EAAW,qBAAqB/C,CAAK,CAEzC,EAEA,OAEIS,EAAA,KAAAwC,WAAA,CAAA,SAAA,CAAAtC,EAAA,IAACuC,EAAA,CACC,MAAAlD,EACA,QAAS,CACP,CAAE,MAAO,OAAQ,MAAO,OAAQ,EAChC,CAAE,MAAO,OAAQ,MAAO,OAAQ,EAChC,CAAE,MAAO,OAAQ,MAAO,OAAQ,EAChC,CAAE,MAAO,YAAa,MAAO,mBAAoB,CACnD,EACA,cAAgBA,GAAU,CAEpBoB,IAAoB,MACtB2B,EAAW,qBAAqB/C,CAAwB,EAE1DC,EAASD,CAAwB,CAAA,CACnC,CACF,EACAW,EAAA,IAACmC,EAAA,CACC,QAAS1B,IAAoB,KAAO,UAAY,SAChD,MAAK,GACL,QAAS4B,EACT,cAAY,mBACb,SAAA,gBAAA,CAAA,CAED,EACF,CAEJ,CC/EA,SAAwBG,IAAiB,CACvC,OAEI1C,EAAA,KAAAwC,WAAA,CAAA,SAAA,CAAAtC,EAAA,IAAC+B,GAAqB,EAAA,QACrBU,GAAkB,EAAA,QAClBC,GAAe,CAAA,CAAA,CAAA,EAClB,CAEJ,CAEA,SAASD,IAAoB,CAC3B,KAAM,CAAE,KAAAxD,EAAM,QAAAC,CAAQ,EAAIyD,EAAqB,EAG7C,OAAA3C,EAAA,IAACnB,EAAA,CACC,MAAM,gBACN,YAAY,0CACZ,KAAAI,EACA,QAAAC,EACA,cAAgB0D,GAAaR,EAAW,UAAUQ,CAAQ,EAE1D,SAAA5C,EAAA,IAAC6C,EAAA,CACC,aAAW,kCACX,QAAS,IAAMT,EAAW,aAAa,CAAClD,CAAO,EAC/C,QAASA,EAAU,UAAY,SAE9B,SAAUA,EAAAc,MAAC8C,EAAM,CAAA,CAAA,QAAMC,EAAgB,CAAA,CAAA,CAAA,CAAA,CAC1C,CACF,CAEJ,CAEA,SAASL,IAAiB,CACxB,KAAM,CAAE,KAAAzD,EAAM,QAAAC,CAAQ,EAAI8D,EAAyB,EAE7CX,EAAkB,IAAM,CACxBnD,EACFkD,EAAW,qBAAqB,IAAI,EAEpCA,EAAW,qBAAqB,WAAW,CAE/C,EAGE,OAAApC,EAAA,IAACnB,EAAA,CACC,MAAM,oBACN,YAAY,iDACZ,KAAAI,EACA,QAAAC,EACA,cAAgB0D,GAAaR,EAAW,iBAAiBQ,CAAQ,EAEjE,SAAA5C,EAAA,IAAC6C,EAAA,CACC,aAAW,sCACX,QAASR,EACT,QAASnD,EAAU,UAAY,SAE9B,SAAUA,EAAAc,MAAC8C,EAAM,CAAA,CAAA,QAAMC,EAAgB,CAAA,CAAA,CAAA,CAAA,CAC1C,CACF,CAEJ,CC1DA,MAAeE,GAAAA,EAAAA,KAAKC,EAAoB,EACxC,SAASA,IAAuB,CAC9B,MAAMC,EAAc,OAAO,SAAS,SAAS,SAAS,iBAAiB,EACjEC,EAAUnD,EAAG,CAACF,EAAM,QAASA,EAAM,mBAAmB,CAAC,EAG3D,OAAAC,EAAAA,IAACqD,EAAa,CAAA,WAAW,SACvB,SAAAvD,EAAA,KAAC,OAAI,UAAWC,EAAM,SAAU,cAAY,yBACzC,SAAA,CAAC,CAAAoD,SAAgB5B,EAAO,CAAA,QAAU1B,GAAU2B,EAAY,iBAAkB3B,CAAK,EAAG,EAClFsD,GAAgBnD,EAAAA,IAAAsD,EAAA,CAAmB,iBAAgB,GAAC,mBAAoBC,IAAyB,EAElGvD,EAAAA,IAAC,OAAI,UAAWoD,EACd,eAACI,EACC,CAAA,SAAAxD,EAAA,IAACwC,GAAe,CAAA,CAAA,CAClB,CAAA,CACF,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._blink_o0qma_1{animation:_blink_o0qma_1 1s step-start infinite}@keyframes _blink_o0qma_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_o0qma_13{transform:rotate(45deg)}._label_o0qma_17{font-size:calc(1rem - 2px);color:#b1b1b1}._label_o0qma_17._active_o0qma_21{color:#779be7}._previewContainer_o0qma_25{display:grid;gap:.5rem;grid-template-columns:3fr 2fr}._preview_o0qma_25{background-color:#101010;display:grid;place-content:center;text-align:center;position:relative}._options_o0qma_39{display:flex;flex-direction:column;gap:.5rem}._eventStatus_o0qma_45{position:absolute;left:0;margin:.5rem .25rem;display:flex;flex-direction:column;gap:.25rem}._mainContent_o0qma_54{font-size:1rem;font-weight:600;width:100%;color:var(--override-colour, #f6f6f6)}._mainContent_o0qma_54[data-phase=pending]{color:#22a0e9}._mainContent_o0qma_54[data-phase=overtime]{color:#fa5656}._mainContent_o0qma_54[data-phase=none]{opacity:.4}._secondaryContent_o0qma_70{border-top:1px solid rgba(255,255,255,.07)}._blackout_o0qma_74{display:none}._timerIndicators_o0qma_78{display:flex;flex-direction:column}._statusIcon_o0qma_83{color:#404040}._statusIcon_o0qma_83[data-active=true]{color:#8bb33d}._inputItems_o0qma_90{display:grid;grid-template-columns:1fr auto;gap:.5rem;margin-top:.25rem}._blink_18658_1{animation:_blink_18658_1 1s step-start infinite}@keyframes _blink_18658_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_18658_13{transform:rotate(45deg)}._label_18658_17{font-size:calc(1rem - 2px);color:#b1b1b1}._label_18658_17._active_18658_21{color:#779be7}._previewContainer_18658_25{display:grid;gap:.5rem;grid-template-columns:3fr 2fr}._preview_18658_25{background-color:#101010;display:grid;place-content:center;text-align:center;position:relative}._options_18658_39{display:flex;flex-direction:column;gap:.5rem}._eventStatus_18658_45{position:absolute;left:0;margin:.5rem .25rem;display:flex;flex-direction:column;gap:.25rem}._mainContent_18658_54{font-size:1rem;font-weight:600;width:100%;color:var(--override-colour, #f6f6f6)}._mainContent_18658_54[data-phase=pending]{color:#22a0e9}._mainContent_18658_54[data-phase=overtime]{color:#fa5656}._mainContent_18658_54[data-phase=none]{opacity:.4}._secondaryContent_18658_70{border-top:1px solid rgba(255,255,255,.07)}._blackout_18658_74{display:none}._timerIndicators_18658_78{display:flex;flex-direction:column}._statusIcon_18658_83{color:#404040}._statusIcon_18658_83[data-active=true]{color:#8bb33d}
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@charset "UTF-8";._blink_1k5qa_1{animation:_blink_1k5qa_1 1s step-start infinite}@keyframes _blink_1k5qa_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1k5qa_13{transform:rotate(45deg)}._imageContainer_1k5qa_17{width:75px;height:75px;background-color:#202020;display:grid;place-content:center}._imageOverlay_1k5qa_25{width:100%;height:100%}._blink_nbvvy_2{animation:_blink_nbvvy_2 1s step-start infinite}@keyframes _blink_nbvvy_2{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_nbvvy_14{transform:rotate(45deg)}._cuesheetEditor_nbvvy_18,._rundownEditor_nbvvy_19{max-height:100%;display:flex;flex-direction:column;overflow-x:auto}._rundownEditor_nbvvy_19{min-width:36.5rem}._rundownEditor_nbvvy_19 ._content_nbvvy_29{overflow-y:scroll}._content_nbvvy_29{padding-inline:.5rem 1.5rem;padding-bottom:4rem;flex:1;display:flex;flex-direction:column;gap:1.5rem}._timeSettings_nbvvy_42,._column_nbvvy_48{display:flex;flex-direction:column;gap:1rem}._column_nbvvy_48 h3{margin-bottom:-.5rem}._decorated_nbvvy_57{color:var(--decorator-color, #f6f6f6);background-color:var(--decorator-bg, #2d2d2d);width:fit-content;padding-inline:.5rem;border-radius:2px}._delayLabel_nbvvy_65{font-size:calc(1rem - 3px);color:#e69056}._delayLabel_nbvvy_65:after{content:""}._switchLabel_nbvvy_73{display:flex;align-items:center;gap:.5rem;max-width:max-content;cursor:pointer;height:2rem;margin-bottom:0}._inline_nbvvy_83{display:flex;align-items:center;gap:1rem}._splitTwo_nbvvy_89{display:grid;grid-template-columns:1fr 1fr;column-gap:1rem;row-gap:1rem}._splitThree_nbvvy_96{display:grid;grid-template-columns:1fr 1fr 1fr;column-gap:1rem;row-gap:1rem}._tooltipIcon_nbvvy_103{color:#578af4;display:inline-block;font-size:1.25em;margin-left:.25em}._customImage_nbvvy_110{display:grid;grid-template-columns:1fr 72px;gap:1rem}._textLikeInput_nbvvy_117{background:transparent;justify-content:start;width:7.5em;border:1px solid transparent;border-bottom:1px solid #2d2d2d}._inactive_nbvvy_125{color:#8a8a8a}._active_nbvvy_129{color:#8bb33d}._blink_1e1jq_1{animation:_blink_1e1jq_1 1s step-start infinite}@keyframes _blink_1e1jq_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1e1jq_13{transform:rotate(45deg)}._inputGroup_1e1jq_17{border:1px solid transparent;width:fit-content;display:flex;align-items:center;border-radius:3px}._inputGroup_1e1jq_17._delayed_1e1jq_24{border:1px solid #E69056}._inputGroup_1e1jq_17 input{max-width:6.5em;border-radius:3px 0 0 3px;border:none;padding-right:0}._inputGroup_1e1jq_17 button{width:1.5rem;height:2rem;border-radius:0 3px 3px 0;border:none}._blink_w3aej_1{animation:_blink_w3aej_1 1s step-start infinite}@keyframes _blink_w3aej_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_w3aej_13{transform:rotate(45deg)}._fourtyfive_w3aej_13{transform:rotate(-45deg)}._timerNote_w3aej_21{width:1.25em;color:#578af4;font-size:1.5em}._inactive_w3aej_27{color:#8a8a8a}._active_w3aej_31{color:#8bb33d}._blink_l7413_1{animation:_blink_l7413_1 1s step-start infinite}@keyframes _blink_l7413_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_l7413_13{transform:rotate(45deg)}._triggerForm_l7413_17{padding-block:.5rem;display:grid;grid-template-columns:8rem 1fr auto 2rem;gap:.5rem;align-items:center}._trigger_l7413_17{padding:.25rem .5rem;display:grid;grid-template-columns:8rem 1fr 2rem;align-items:center}._trigger_l7413_17:nth-child(2n){background-color:#ffffff03}._trigger_l7413_17>span{width:fit-content}._errorLabel_l7413_38{color:#fa5656}._success_l7413_42{color:#55b469}._blink_1qqxl_1{animation:_blink_1qqxl_1 1s step-start infinite}@keyframes _blink_1qqxl_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1qqxl_13{transform:rotate(45deg)}._textInput_1qqxl_18{height:2rem;background-color:transparent;border-radius:3px;text-wrap:nowrap;display:flex;align-items:center;gap:.25rem;letter-spacing:.5px;font-size:1rem;font-variant-numeric:tabular-nums;overflow:hidden}._textInput_1qqxl_18._under_1qqxl_31{color:#55b469}._textInput_1qqxl_18._over_1qqxl_34{color:#f57c13}._textInput_1qqxl_18._muted_1qqxl_37{opacity:.4}._textInput_1qqxl_18:hover:not(._disabled_1qqxl_40){background-color:#2d2d2d;cursor:text}
|
|
Binary file
|
|
Binary file
|