@getontime/cli 4.2.1 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/assets/Backstage-D2lEbqUt.js +2 -0
- package/client/assets/Backstage-D2lEbqUt.js.br +0 -0
- package/client/assets/Backstage-D2lEbqUt.js.gz +0 -0
- package/client/assets/Backstage-D2lEbqUt.js.map +1 -0
- package/client/assets/Countdown-VV03STbF.js +2 -0
- package/client/assets/Countdown-VV03STbF.js.br +0 -0
- package/client/assets/Countdown-VV03STbF.js.gz +0 -0
- package/client/assets/Countdown-VV03STbF.js.map +1 -0
- package/client/assets/CustomTranslationModal-D1nM9W1Z.js +2 -0
- package/client/assets/CustomTranslationModal-D1nM9W1Z.js.br +0 -0
- package/client/assets/CustomTranslationModal-D1nM9W1Z.js.gz +0 -0
- package/client/assets/{CustomTranslationModal-CtBvokyt.js.map → CustomTranslationModal-D1nM9W1Z.js.map} +1 -1
- package/client/assets/DelayIndicator-Co5rMYw9.js +2 -0
- package/client/assets/DelayIndicator-Co5rMYw9.js.br +0 -0
- package/client/assets/DelayIndicator-Co5rMYw9.js.gz +0 -0
- package/client/assets/{DelayIndicator-BFZFpsY5.js.map → DelayIndicator-Co5rMYw9.js.map} +1 -1
- package/client/assets/EditorFeatureWrapper-_t_4D7Es.js +2 -0
- package/client/assets/EditorFeatureWrapper-_t_4D7Es.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-_t_4D7Es.js.gz +0 -0
- package/client/assets/{EditorFeatureWrapper-DaMxgBMP.js.map → EditorFeatureWrapper-_t_4D7Es.js.map} +1 -1
- package/client/assets/EditorUtils-C3QoonjM.js +2 -0
- package/client/assets/EditorUtils-C3QoonjM.js.br +0 -0
- package/client/assets/EditorUtils-C3QoonjM.js.gz +0 -0
- package/client/assets/{EditorUtils-DoaSwWiz.js.map → EditorUtils-C3QoonjM.js.map} +1 -1
- package/client/assets/EditorUtils-L4Sg72o_.css +1 -0
- package/client/assets/EditorUtils-L4Sg72o_.css.br +0 -0
- package/client/assets/EditorUtils-L4Sg72o_.css.gz +0 -0
- package/client/assets/{Empty-D1UteOYj.js → Empty-DJMjfXnt.js} +2 -2
- package/client/assets/Empty-DJMjfXnt.js.br +2 -0
- package/client/assets/Empty-DJMjfXnt.js.gz +0 -0
- package/client/assets/{Empty-D1UteOYj.js.map → Empty-DJMjfXnt.js.map} +1 -1
- package/client/assets/{EmptyPage-DeRjpRKZ.js → EmptyPage-BlXZqoIr.js} +2 -2
- package/client/assets/EmptyPage-BlXZqoIr.js.br +0 -0
- package/client/assets/EmptyPage-BlXZqoIr.js.gz +0 -0
- package/client/assets/{EmptyPage-DeRjpRKZ.js.map → EmptyPage-BlXZqoIr.js.map} +1 -1
- package/client/assets/{FollowButton-FodezDem.js → FollowButton-Dy5n1J2c.js} +2 -2
- package/client/assets/FollowButton-Dy5n1J2c.js.br +0 -0
- package/client/assets/FollowButton-Dy5n1J2c.js.gz +0 -0
- package/client/assets/{FollowButton-FodezDem.js.map → FollowButton-Dy5n1J2c.js.map} +1 -1
- package/client/assets/MessageControlExport-CWQX8mH0.js +3 -0
- package/client/assets/MessageControlExport-CWQX8mH0.js.br +0 -0
- package/client/assets/MessageControlExport-CWQX8mH0.js.gz +0 -0
- package/client/assets/MessageControlExport-CWQX8mH0.js.map +1 -0
- package/client/assets/MessageControlExport-D_pNX6Vj.css +1 -0
- package/client/assets/MessageControlExport-D_pNX6Vj.css.br +0 -0
- package/client/assets/MessageControlExport-D_pNX6Vj.css.gz +0 -0
- package/client/assets/MilestoneEditor-CxWZdQ1B.js +2 -0
- package/client/assets/MilestoneEditor-CxWZdQ1B.js.br +0 -0
- package/client/assets/MilestoneEditor-CxWZdQ1B.js.gz +0 -0
- package/client/assets/MilestoneEditor-CxWZdQ1B.js.map +1 -0
- package/client/assets/Modal-ePA-Go14.js +2 -0
- package/client/assets/Modal-ePA-Go14.js.br +0 -0
- package/client/assets/Modal-ePA-Go14.js.gz +0 -0
- package/client/assets/Modal-ePA-Go14.js.map +1 -0
- package/client/assets/{MultiPartProgressBar-BKHk19Hb.js → MultiPartProgressBar-GQaCHX4z.js} +2 -2
- package/client/assets/MultiPartProgressBar-GQaCHX4z.js.br +0 -0
- package/client/assets/MultiPartProgressBar-GQaCHX4z.js.gz +0 -0
- package/client/assets/{MultiPartProgressBar-BKHk19Hb.js.map → MultiPartProgressBar-GQaCHX4z.js.map} +1 -1
- package/client/assets/OperatorExport-CA5WcIt5.css +1 -0
- package/client/assets/OperatorExport-CA5WcIt5.css.br +0 -0
- package/client/assets/OperatorExport-CA5WcIt5.css.gz +0 -0
- package/client/assets/OperatorExport-CRS08UXj.js +2 -0
- package/client/assets/OperatorExport-CRS08UXj.js.br +0 -0
- package/client/assets/OperatorExport-CRS08UXj.js.gz +0 -0
- package/client/assets/OperatorExport-CRS08UXj.js.map +1 -0
- package/client/assets/OverviewWrapper-BNRb3Ub_.js +2 -0
- package/client/assets/OverviewWrapper-BNRb3Ub_.js.br +0 -0
- package/client/assets/OverviewWrapper-BNRb3Ub_.js.gz +0 -0
- package/client/assets/OverviewWrapper-BNRb3Ub_.js.map +1 -0
- package/client/assets/{PipHost-B9-cZ8Lm.js → PipHost-DNfEY6RN.js} +2 -2
- package/client/assets/PipHost-DNfEY6RN.js.br +0 -0
- package/client/assets/PipHost-DNfEY6RN.js.gz +0 -0
- package/client/assets/PipHost-DNfEY6RN.js.map +1 -0
- package/client/assets/ProjectInfo-KPf-pM8y.js +2 -0
- package/client/assets/ProjectInfo-KPf-pM8y.js.br +0 -0
- package/client/assets/ProjectInfo-KPf-pM8y.js.gz +0 -0
- package/client/assets/{ProjectInfo-Dp1TZyBd.js.map → ProjectInfo-KPf-pM8y.js.map} +1 -1
- package/client/assets/{ProtectRoute-EejQ5o_H.js → ProtectRoute-DW_vXgYI.js} +2 -2
- package/client/assets/ProtectRoute-DW_vXgYI.js.br +0 -0
- package/client/assets/ProtectRoute-DW_vXgYI.js.gz +0 -0
- package/client/assets/{ProtectRoute-EejQ5o_H.js.map → ProtectRoute-DW_vXgYI.js.map} +1 -1
- package/client/assets/ProtectedCuesheet-CCVDLsK-.js +2 -0
- package/client/assets/ProtectedCuesheet-CCVDLsK-.js.br +0 -0
- package/client/assets/ProtectedCuesheet-CCVDLsK-.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-CCVDLsK-.js.map +1 -0
- package/client/assets/ProtectedCuesheet-DPO7xYMb.css +1 -0
- package/client/assets/ProtectedCuesheet-DPO7xYMb.css.br +0 -0
- package/client/assets/ProtectedCuesheet-DPO7xYMb.css.gz +0 -0
- package/client/assets/{ProtectedEditor-Dw0pWw0J.css → ProtectedEditor-BtSuTFlT.css} +1 -1
- package/client/assets/ProtectedEditor-BtSuTFlT.css.br +0 -0
- package/client/assets/{ProtectedEditor-Dw0pWw0J.css.gz → ProtectedEditor-BtSuTFlT.css.gz} +0 -0
- package/client/assets/ProtectedEditor-Ddu9vBS8.js +3 -0
- package/client/assets/ProtectedEditor-Ddu9vBS8.js.br +0 -0
- package/client/assets/ProtectedEditor-Ddu9vBS8.js.gz +0 -0
- package/client/assets/ProtectedEditor-Ddu9vBS8.js.map +1 -0
- package/client/assets/RundownEntry-CpspmKD0.js +2 -0
- package/client/assets/RundownEntry-CpspmKD0.js.br +0 -0
- package/client/assets/RundownEntry-CpspmKD0.js.gz +0 -0
- package/client/assets/RundownEntry-CpspmKD0.js.map +1 -0
- package/client/assets/{RundownExport-DtSvAfBG.css → RundownExport-Bgtg_idR.css} +1 -1
- package/client/assets/RundownExport-Bgtg_idR.css.br +0 -0
- package/client/assets/RundownExport-Bgtg_idR.css.gz +0 -0
- package/client/assets/RundownExport-DhCryTUp.js +3 -0
- package/client/assets/RundownExport-DhCryTUp.js.br +0 -0
- package/client/assets/RundownExport-DhCryTUp.js.gz +0 -0
- package/client/assets/RundownExport-DhCryTUp.js.map +1 -0
- package/client/assets/{Select-cHK8JrMG.js → Select-ASOzxGFV.js} +2 -2
- package/client/assets/Select-ASOzxGFV.js.br +0 -0
- package/client/assets/Select-ASOzxGFV.js.gz +0 -0
- package/client/assets/Select-ASOzxGFV.js.map +1 -0
- package/client/assets/Studio-D7evHV2Q.js +2 -0
- package/client/assets/Studio-D7evHV2Q.js.br +0 -0
- package/client/assets/Studio-D7evHV2Q.js.gz +0 -0
- package/client/assets/Studio-D7evHV2Q.js.map +1 -0
- package/client/assets/{StyleEditor-RZvkKHdf.js → StyleEditor-DYybY9tA.js} +2 -2
- package/client/assets/StyleEditor-DYybY9tA.js.br +0 -0
- package/client/assets/StyleEditor-DYybY9tA.js.gz +0 -0
- package/client/assets/{StyleEditor-RZvkKHdf.js.map → StyleEditor-DYybY9tA.js.map} +1 -1
- package/client/assets/{SuperscriptPeriod-DaZq1rr6.js → SuperscriptPeriod-NmBzJhFK.js} +2 -2
- package/client/assets/SuperscriptPeriod-NmBzJhFK.js.br +0 -0
- package/client/assets/SuperscriptPeriod-NmBzJhFK.js.gz +0 -0
- package/client/assets/SuperscriptPeriod-NmBzJhFK.js.map +1 -0
- package/client/assets/SuperscriptTime-CA_8XRM6.js +2 -0
- package/client/assets/SuperscriptTime-CA_8XRM6.js.br +0 -0
- package/client/assets/SuperscriptTime-CA_8XRM6.js.gz +0 -0
- package/client/assets/SuperscriptTime-CA_8XRM6.js.map +1 -0
- package/client/assets/SwatchPicker-C8eFQKBd.js +2 -0
- package/client/assets/SwatchPicker-C8eFQKBd.js.br +0 -0
- package/client/assets/SwatchPicker-C8eFQKBd.js.gz +0 -0
- package/client/assets/SwatchPicker-C8eFQKBd.js.map +1 -0
- package/client/assets/{TimeElements-dIvFHgcd.js → TimeElements-D3dl9gAM.js} +2 -2
- package/client/assets/TimeElements-D3dl9gAM.js.br +0 -0
- package/client/assets/TimeElements-D3dl9gAM.js.gz +0 -0
- package/client/assets/TimeElements-D3dl9gAM.js.map +1 -0
- package/client/assets/TimeInput-DR-NCEhH.js +2 -0
- package/client/assets/TimeInput-DR-NCEhH.js.br +0 -0
- package/client/assets/TimeInput-DR-NCEhH.js.gz +0 -0
- package/client/assets/{TimeInput-Duzx40TC.js.map → TimeInput-DR-NCEhH.js.map} +1 -1
- package/client/assets/TimelinePage-BfTV9IdT.js +2 -0
- package/client/assets/TimelinePage-BfTV9IdT.js.br +0 -0
- package/client/assets/TimelinePage-BfTV9IdT.js.gz +0 -0
- package/client/assets/TimelinePage-BfTV9IdT.js.map +1 -0
- package/client/assets/Timer-DvqDm4yX.js +2 -0
- package/client/assets/Timer-DvqDm4yX.js.br +0 -0
- package/client/assets/Timer-DvqDm4yX.js.gz +0 -0
- package/client/assets/Timer-DvqDm4yX.js.map +1 -0
- package/client/assets/TimerControlExport-CQQ2KxqK.js +2 -0
- package/client/assets/TimerControlExport-CQQ2KxqK.js.br +0 -0
- package/client/assets/TimerControlExport-CQQ2KxqK.js.gz +0 -0
- package/client/assets/{TimerControlExport-GJn4WWdH.js.map → TimerControlExport-CQQ2KxqK.js.map} +1 -1
- package/client/assets/{TimerControlExport-DavNxY9p.css → TimerControlExport-cJRa5GUp.css} +1 -1
- package/client/assets/TimerControlExport-cJRa5GUp.css.br +0 -0
- package/client/assets/{TimerControlExport-DavNxY9p.css.gz → TimerControlExport-cJRa5GUp.css.gz} +0 -0
- package/client/assets/{TitleCard-BqbrUnHO.js → TitleCard-AESdy7kI.js} +2 -2
- package/client/assets/TitleCard-AESdy7kI.js.br +0 -0
- package/client/assets/TitleCard-AESdy7kI.js.gz +0 -0
- package/client/assets/{TitleCard-BqbrUnHO.js.map → TitleCard-AESdy7kI.js.map} +1 -1
- package/client/assets/{Tooltip-BQBvaIZx.js → Tooltip-BTK4bJkV.js} +2 -2
- package/client/assets/Tooltip-BTK4bJkV.js.br +0 -0
- package/client/assets/Tooltip-BTK4bJkV.js.gz +0 -0
- package/client/assets/Tooltip-BTK4bJkV.js.map +1 -0
- package/client/assets/ViewLogo-BZVUUIZA.js +2 -0
- package/client/assets/ViewLogo-BZVUUIZA.js.br +0 -0
- package/client/assets/ViewLogo-BZVUUIZA.js.gz +0 -0
- package/client/assets/ViewLogo-BZVUUIZA.js.map +1 -0
- package/client/assets/ViewParamsEditor-CBnRitZ4.js +2 -0
- package/client/assets/ViewParamsEditor-CBnRitZ4.js.br +0 -0
- package/client/assets/ViewParamsEditor-CBnRitZ4.js.gz +0 -0
- package/client/assets/ViewParamsEditor-CBnRitZ4.js.map +1 -0
- package/client/assets/{dateConfig-BU1RZfIK.js → dateConfig-Crm-Cu2y.js} +2 -2
- package/client/assets/dateConfig-Crm-Cu2y.js.br +0 -0
- package/client/assets/dateConfig-Crm-Cu2y.js.gz +0 -0
- package/client/assets/{dateConfig-BU1RZfIK.js.map → dateConfig-Crm-Cu2y.js.map} +1 -1
- package/client/assets/{editorSettings-BMt-7s8I.js → editorSettings-CRJwIW7V.js} +2 -2
- package/client/assets/editorSettings-CRJwIW7V.js.br +0 -0
- package/client/assets/editorSettings-CRJwIW7V.js.gz +0 -0
- package/client/assets/{editorSettings-BMt-7s8I.js.map → editorSettings-CRJwIW7V.js.map} +1 -1
- package/client/assets/{getProgress-sdxPEEPi.js → getProgress-fD6vhbNF.js} +2 -2
- package/client/assets/getProgress-fD6vhbNF.js.br +0 -0
- package/client/assets/getProgress-fD6vhbNF.js.gz +0 -0
- package/client/assets/{getProgress-sdxPEEPi.js.map → getProgress-fD6vhbNF.js.map} +1 -1
- package/client/assets/index-B1K7rED_.js +3 -0
- package/client/assets/index-B1K7rED_.js.br +0 -0
- package/client/assets/index-B1K7rED_.js.gz +0 -0
- package/client/assets/index-B1K7rED_.js.map +1 -0
- package/client/assets/{index-BuJoGGff.css → index-BAvwULMi.css} +1 -1
- package/client/assets/index-BAvwULMi.css.br +0 -0
- package/client/assets/index-BAvwULMi.css.gz +0 -0
- package/client/assets/{offset-BS90Rks2.js → offset-FplkvYRD.js} +2 -2
- package/client/assets/offset-FplkvYRD.js.br +0 -0
- package/client/assets/offset-FplkvYRD.js.gz +0 -0
- package/client/assets/{offset-BS90Rks2.js.map → offset-FplkvYRD.js.map} +1 -1
- package/client/assets/{parseUserTime-DZJMcfuJ.js → parseUserTime-0pNWLcr0.js} +2 -2
- package/client/assets/parseUserTime-0pNWLcr0.js.br +0 -0
- package/client/assets/parseUserTime-0pNWLcr0.js.gz +0 -0
- package/client/assets/{parseUserTime-DZJMcfuJ.js.map → parseUserTime-0pNWLcr0.js.map} +1 -1
- package/client/assets/{playbackstate-CWexoP3a.js → playbackstate-1HCEpVh5.js} +2 -2
- package/client/assets/playbackstate-1HCEpVh5.js.br +0 -0
- package/client/assets/playbackstate-1HCEpVh5.js.gz +0 -0
- package/client/assets/{playbackstate-CWexoP3a.js.map → playbackstate-1HCEpVh5.js.map} +1 -1
- package/client/assets/{presentation.utils-Zo5hNQje.js → presentation.utils-CLt2UhON.js} +2 -2
- package/client/assets/presentation.utils-CLt2UhON.js.br +0 -0
- package/client/assets/presentation.utils-CLt2UhON.js.gz +0 -0
- package/client/assets/{presentation.utils-Zo5hNQje.js.map → presentation.utils-CLt2UhON.js.map} +1 -1
- package/client/assets/rundownUtils-D1oJpMdx.js +2 -0
- package/client/assets/rundownUtils-D1oJpMdx.js.br +0 -0
- package/client/assets/rundownUtils-D1oJpMdx.js.gz +0 -0
- package/client/assets/{rundownUtils-Dl1x6NDv.js.map → rundownUtils-D1oJpMdx.js.map} +1 -1
- package/client/assets/{timer.utils-BnMyVO6Z.js → timer.utils-FiqT1yNa.js} +2 -2
- package/client/assets/timer.utils-FiqT1yNa.js.br +0 -0
- package/client/assets/timer.utils-FiqT1yNa.js.gz +0 -0
- package/client/assets/timer.utils-FiqT1yNa.js.map +1 -0
- package/client/assets/{useCustomFields-CcTb-GQM.js → useCustomFields-nW-_Zyfw.js} +2 -2
- package/client/assets/useCustomFields-nW-_Zyfw.js.br +0 -0
- package/client/assets/useCustomFields-nW-_Zyfw.js.gz +0 -0
- package/client/assets/{useCustomFields-CcTb-GQM.js.map → useCustomFields-nW-_Zyfw.js.map} +1 -1
- package/client/assets/{useFollowComponent-BjhV6Uv8.js → useFollowComponent-4cbKEsVz.js} +2 -2
- package/client/assets/useFollowComponent-4cbKEsVz.js.br +0 -0
- package/client/assets/useFollowComponent-4cbKEsVz.js.gz +0 -0
- package/client/assets/{useFollowComponent-BjhV6Uv8.js.map → useFollowComponent-4cbKEsVz.js.map} +1 -1
- package/client/assets/useProjectData-DP-pr73E.js +2 -0
- package/client/assets/useProjectData-DP-pr73E.js.br +0 -0
- package/client/assets/useProjectData-DP-pr73E.js.gz +0 -0
- package/client/assets/useProjectData-DP-pr73E.js.map +1 -0
- package/client/assets/{useReport-zMbyWwpn.js → useReport-6XA_s2Vc.js} +2 -2
- package/client/assets/useReport-6XA_s2Vc.js.br +0 -0
- package/client/assets/useReport-6XA_s2Vc.js.gz +0 -0
- package/client/assets/{useReport-zMbyWwpn.js.map → useReport-6XA_s2Vc.js.map} +1 -1
- package/client/assets/useRundown-BGhL8DEI.js +2 -0
- package/client/assets/useRundown-BGhL8DEI.js.br +0 -0
- package/client/assets/useRundown-BGhL8DEI.js.gz +0 -0
- package/client/assets/useRundown-BGhL8DEI.js.map +1 -0
- package/client/assets/{useWindowTitle-mLKt65i7.js → useWindowTitle-ahZQIheF.js} +2 -2
- package/client/assets/useWindowTitle-ahZQIheF.js.br +0 -0
- package/client/assets/useWindowTitle-ahZQIheF.js.gz +0 -0
- package/client/assets/useWindowTitle-ahZQIheF.js.map +1 -0
- package/client/assets/{validateEvent-CUmvjN95.js → validateEvent-jVIMKhmx.js} +2 -2
- package/client/assets/validateEvent-jVIMKhmx.js.br +0 -0
- package/client/assets/validateEvent-jVIMKhmx.js.gz +0 -0
- package/client/assets/{validateEvent-CUmvjN95.js.map → validateEvent-jVIMKhmx.js.map} +1 -1
- package/client/assets/vendor-DmGkEtRj.js +74 -0
- package/client/assets/vendor-DmGkEtRj.js.br +0 -0
- package/client/assets/vendor-DmGkEtRj.js.gz +0 -0
- package/client/assets/{vendor-Cdwxo8bP.js.map → vendor-DmGkEtRj.js.map} +1 -1
- package/client/assets/{viewLoader.utils-DuXjY5zb.js → viewLoader.utils-Bniie8Op.js} +2 -2
- package/client/assets/viewLoader.utils-Bniie8Op.js.br +0 -0
- package/client/assets/viewLoader.utils-Bniie8Op.js.gz +0 -0
- package/client/assets/{viewLoader.utils-DuXjY5zb.js.map → viewLoader.utils-Bniie8Op.js.map} +1 -1
- package/client/assets/{viewUtils-dKRKkb_F.js → viewUtils-VNLYoR28.js} +2 -2
- package/client/assets/viewUtils-VNLYoR28.js.br +0 -0
- package/client/assets/viewUtils-VNLYoR28.js.gz +0 -0
- package/client/assets/viewUtils-VNLYoR28.js.map +1 -0
- package/client/index.html +3 -3
- package/package.json +1 -1
- package/server/index.cjs +102 -102
- package/client/assets/Backstage-WSlbFC9X.js +0 -2
- 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 +0 -1
- package/client/assets/Countdown-B32qlxYT.js +0 -2
- 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 +0 -1
- package/client/assets/CustomTranslationModal-CtBvokyt.js +0 -2
- package/client/assets/CustomTranslationModal-CtBvokyt.js.br +0 -0
- package/client/assets/CustomTranslationModal-CtBvokyt.js.gz +0 -0
- package/client/assets/DelayIndicator-BFZFpsY5.js +0 -2
- package/client/assets/DelayIndicator-BFZFpsY5.js.br +0 -0
- package/client/assets/DelayIndicator-BFZFpsY5.js.gz +0 -0
- package/client/assets/Editor-B_NlyOLw.css +0 -1
- package/client/assets/Editor-B_NlyOLw.css.br +0 -0
- package/client/assets/Editor-B_NlyOLw.css.gz +0 -0
- package/client/assets/Editor.module-DvV2efYs.js +0 -2
- package/client/assets/Editor.module-DvV2efYs.js.br +0 -0
- package/client/assets/Editor.module-DvV2efYs.js.gz +0 -0
- package/client/assets/Editor.module-DvV2efYs.js.map +0 -1
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js +0 -2
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js.br +0 -0
- package/client/assets/EditorFeatureWrapper-DaMxgBMP.js.gz +0 -0
- package/client/assets/EditorUtils-CgF7UfHP.css +0 -1
- package/client/assets/EditorUtils-CgF7UfHP.css.br +0 -0
- package/client/assets/EditorUtils-CgF7UfHP.css.gz +0 -0
- package/client/assets/EditorUtils-DoaSwWiz.js +0 -2
- package/client/assets/EditorUtils-DoaSwWiz.js.br +0 -0
- package/client/assets/EditorUtils-DoaSwWiz.js.gz +0 -0
- package/client/assets/Empty-D1UteOYj.js.br +0 -0
- package/client/assets/Empty-D1UteOYj.js.gz +0 -0
- package/client/assets/EmptyPage-DeRjpRKZ.js.br +0 -0
- package/client/assets/EmptyPage-DeRjpRKZ.js.gz +0 -0
- package/client/assets/FollowButton-FodezDem.js.br +0 -0
- package/client/assets/FollowButton-FodezDem.js.gz +0 -0
- package/client/assets/MessageControlExport-CFGgiwk_.js +0 -3
- 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 +0 -1
- package/client/assets/MessageControlExport-DjoUioWA.css +0 -1
- package/client/assets/MessageControlExport-DjoUioWA.css.br +0 -0
- package/client/assets/MessageControlExport-DjoUioWA.css.gz +0 -0
- package/client/assets/MilestoneEditor-B5BdJ5ju.js +0 -2
- 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 +0 -1
- package/client/assets/Modal-B8ZZbVMg.js +0 -2
- package/client/assets/Modal-B8ZZbVMg.js.br +0 -0
- package/client/assets/Modal-B8ZZbVMg.js.gz +0 -0
- package/client/assets/Modal-B8ZZbVMg.js.map +0 -1
- package/client/assets/MultiPartProgressBar-BKHk19Hb.js.br +0 -0
- package/client/assets/MultiPartProgressBar-BKHk19Hb.js.gz +0 -0
- package/client/assets/OperatorExport-BiBcgVKc.css +0 -1
- package/client/assets/OperatorExport-BiBcgVKc.css.br +0 -0
- package/client/assets/OperatorExport-BiBcgVKc.css.gz +0 -0
- package/client/assets/OperatorExport-DQM14DsN.js +0 -2
- 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 +0 -1
- package/client/assets/OverviewWrapper-D1hUkrRi.js +0 -2
- package/client/assets/OverviewWrapper-D1hUkrRi.js.br +0 -0
- package/client/assets/OverviewWrapper-D1hUkrRi.js.gz +0 -0
- package/client/assets/OverviewWrapper-D1hUkrRi.js.map +0 -1
- 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 +0 -1
- package/client/assets/ProjectInfo-Dp1TZyBd.js +0 -2
- package/client/assets/ProjectInfo-Dp1TZyBd.js.br +0 -0
- package/client/assets/ProjectInfo-Dp1TZyBd.js.gz +0 -0
- package/client/assets/ProtectRoute-EejQ5o_H.js.br +0 -0
- package/client/assets/ProtectRoute-EejQ5o_H.js.gz +0 -0
- package/client/assets/ProtectedCuesheet-C_tKodwo.css +0 -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 +0 -2
- 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 +0 -1
- package/client/assets/ProtectedEditor-B0l0X3QP.js +0 -3
- 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 +0 -1
- package/client/assets/ProtectedEditor-Dw0pWw0J.css.br +0 -0
- package/client/assets/RundownEntry-CwiStTnR.js +0 -2
- 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 +0 -1
- package/client/assets/RundownExport-CCaOfHIr.js +0 -3
- 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 +0 -1
- package/client/assets/RundownExport-DtSvAfBG.css.br +0 -0
- package/client/assets/RundownExport-DtSvAfBG.css.gz +0 -0
- package/client/assets/Select-cHK8JrMG.js.br +0 -0
- package/client/assets/Select-cHK8JrMG.js.gz +0 -0
- package/client/assets/Select-cHK8JrMG.js.map +0 -1
- package/client/assets/Studio-BzwFDYzk.js +0 -2
- 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 +0 -1
- package/client/assets/StyleEditor-RZvkKHdf.js.br +0 -0
- package/client/assets/StyleEditor-RZvkKHdf.js.gz +0 -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 +0 -1
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js +0 -2
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js.br +0 -0
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js.gz +0 -0
- package/client/assets/SuperscriptTime-Mc0ZGBMo.js.map +0 -1
- 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 +0 -1
- package/client/assets/TimeInput-Duzx40TC.js +0 -2
- package/client/assets/TimeInput-Duzx40TC.js.br +0 -0
- package/client/assets/TimeInput-Duzx40TC.js.gz +0 -0
- package/client/assets/TimelinePage-C-OHrCR8.js +0 -2
- 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 +0 -1
- package/client/assets/Timer-CGqVtVEC.js +0 -2
- 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 +0 -1
- package/client/assets/TimerControlExport-DavNxY9p.css.br +0 -0
- package/client/assets/TimerControlExport-GJn4WWdH.js +0 -2
- package/client/assets/TimerControlExport-GJn4WWdH.js.br +0 -0
- package/client/assets/TimerControlExport-GJn4WWdH.js.gz +0 -0
- package/client/assets/TitleCard-BqbrUnHO.js.br +0 -0
- package/client/assets/TitleCard-BqbrUnHO.js.gz +0 -0
- package/client/assets/Tooltip-BQBvaIZx.js.br +0 -0
- package/client/assets/Tooltip-BQBvaIZx.js.gz +0 -0
- package/client/assets/Tooltip-BQBvaIZx.js.map +0 -1
- package/client/assets/ViewLogo-BdL1hUV1.js +0 -2
- package/client/assets/ViewLogo-BdL1hUV1.js.br +0 -0
- package/client/assets/ViewLogo-BdL1hUV1.js.gz +0 -0
- package/client/assets/ViewLogo-BdL1hUV1.js.map +0 -1
- package/client/assets/ViewParamsEditor-CFedpp6w.js +0 -2
- 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 +0 -1
- package/client/assets/dateConfig-BU1RZfIK.js.br +0 -0
- package/client/assets/dateConfig-BU1RZfIK.js.gz +0 -0
- package/client/assets/editorSettings-BMt-7s8I.js.br +0 -0
- package/client/assets/editorSettings-BMt-7s8I.js.gz +0 -0
- package/client/assets/getProgress-sdxPEEPi.js.br +0 -0
- package/client/assets/getProgress-sdxPEEPi.js.gz +0 -0
- package/client/assets/index-BuJoGGff.css.br +0 -0
- package/client/assets/index-BuJoGGff.css.gz +0 -0
- package/client/assets/index-CoGiopcb.js +0 -3
- 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 +0 -1
- package/client/assets/offset-BS90Rks2.js.br +0 -0
- package/client/assets/offset-BS90Rks2.js.gz +0 -0
- package/client/assets/parseUserTime-DZJMcfuJ.js.br +0 -0
- package/client/assets/parseUserTime-DZJMcfuJ.js.gz +0 -0
- package/client/assets/playbackstate-CWexoP3a.js.br +0 -0
- package/client/assets/playbackstate-CWexoP3a.js.gz +0 -0
- package/client/assets/presentation.utils-Zo5hNQje.js.br +0 -0
- package/client/assets/presentation.utils-Zo5hNQje.js.gz +0 -0
- package/client/assets/rundownUtils-Dl1x6NDv.js +0 -2
- package/client/assets/rundownUtils-Dl1x6NDv.js.br +0 -0
- package/client/assets/rundownUtils-Dl1x6NDv.js.gz +0 -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 +0 -1
- package/client/assets/useCustomFields-CcTb-GQM.js.br +0 -0
- package/client/assets/useCustomFields-CcTb-GQM.js.gz +0 -0
- package/client/assets/useFollowComponent-BjhV6Uv8.js.br +0 -0
- package/client/assets/useFollowComponent-BjhV6Uv8.js.gz +0 -0
- package/client/assets/useProjectData-B5mjXsMj.js +0 -2
- package/client/assets/useProjectData-B5mjXsMj.js.br +0 -0
- package/client/assets/useProjectData-B5mjXsMj.js.gz +0 -0
- package/client/assets/useProjectData-B5mjXsMj.js.map +0 -1
- package/client/assets/useReport-zMbyWwpn.js.br +0 -0
- package/client/assets/useReport-zMbyWwpn.js.gz +0 -0
- package/client/assets/useRundown-CHsh5rnl.js +0 -2
- 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 +0 -1
- package/client/assets/useWindowTitle-mLKt65i7.js.br +0 -0
- package/client/assets/useWindowTitle-mLKt65i7.js.gz +0 -0
- package/client/assets/useWindowTitle-mLKt65i7.js.map +0 -1
- package/client/assets/validateEvent-CUmvjN95.js.br +0 -0
- package/client/assets/validateEvent-CUmvjN95.js.gz +0 -0
- package/client/assets/vendor-Cdwxo8bP.js +0 -75
- package/client/assets/vendor-Cdwxo8bP.js.br +0 -0
- package/client/assets/vendor-Cdwxo8bP.js.gz +0 -0
- package/client/assets/viewLoader.utils-DuXjY5zb.js.br +0 -0
- package/client/assets/viewLoader.utils-DuXjY5zb.js.gz +0 -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 +0 -1
- /package/client/assets/{useProjectData-Cw1aXCwD.css → SwatchPicker-Cw1aXCwD.css} +0 -0
- /package/client/assets/{useProjectData-Cw1aXCwD.css.br → SwatchPicker-Cw1aXCwD.css.br} +0 -0
- /package/client/assets/{useProjectData-Cw1aXCwD.css.gz → SwatchPicker-Cw1aXCwD.css.gz} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,l as K,h as l,o as se,ab as ne}from"./vendor-DmGkEtRj.js";import{e as o,q as ae,w as ie,f,P as re,h as R,x as D,y as oe,u as ce,b as le,L as de,d as U,z as ue,m as me,r as he,g as xe,O as fe,v as pe,A as ve}from"./index-B1K7rED_.js";import{g as ge}from"./getProgress-fD6vhbNF.js";import{E as ye}from"./Empty-DJMjfXnt.js";import{E as _e}from"./EmptyPage-BlXZqoIr.js";import{T as A}from"./TitleCard-AESdy7kI.js";import{V as je}from"./ViewLogo-BZVUUIZA.js";import{O as M,m as W,a as Ne,V as we}from"./ViewParamsEditor-CBnRitZ4.js";import{u as Se}from"./useWindowTitle-ahZQIheF.js";import{i as q,b as be,c as Ee}from"./useRundown-BGhL8DEI.js";import{i as G,b as L}from"./viewUtils-VNLYoR28.js";import{g as ke}from"./offset-FplkvYRD.js";import{S as w}from"./SuperscriptPeriod-NmBzJhFK.js";import{S as C}from"./SuperscriptTime-CA_8XRM6.js";import{g as Pe,a as Ie}from"./viewLoader.utils-Bniie8Op.js";import{u as Te}from"./useCustomFields-nW-_Zyfw.js";import{u as Oe}from"./useProjectData-DP-pr73E.js";import"./Select-ASOzxGFV.js";import"./SwatchPicker-C8eFQKBd.js";/* empty css */(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]="cbb06a40-e589-4c06-9ce3-6a33e15541cd",t._sentryDebugIdIdentifier="sentry-dbid-cbb06a40-e589-4c06-9ce3-6a33e15541cd")}catch{}})();function Ce(t){const{current:s,duration:n,className:a}=t,i=ge(s,n);return e.jsx("div",{className:`progress-bar__bg ${a}`,children:e.jsx("div",{className:"progress-bar__indicator",style:{width:`${i}%`}})})}const Fe=t=>({title:M.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 Ve(t){return{filter:t.get("filter"),cycleInterval:Number(t.get("cycleInterval"))||10,stopCycle:G(t.get("stopCycle")),showExpected:G(t.get("showExpected"))}}function Z(){const[t]=K();return l.useMemo(()=>Ve(t),[t])}const J=l.createContext(void 0),Be=({children:t,selectedEventId:s})=>{const{cycleInterval:n,stopCycle:a,filter:i}=Z(),r=l.useCallback(u=>{if(i){const P=i.startsWith("custom-")?i.slice(7):i;return q(u)&&!!u.custom[P]}return q(u)},[i]),{data:c}=be(r),[h,x]=l.useState(-1),[p,g]=l.useState(0),[v,d]=l.useState(0),F=l.useRef(-1),j=l.useRef(void 0),S=l.useRef(null);l.useLayoutEffect(()=>{if(!S.current)return;const u=Array.from(S.current.children);if(u.length===0)return;const P=S.current.clientHeight;let b=0,V=1,I=1,_=-1,T=!1;for(let m=0;m<u.length;m++){const N=u[m].clientHeight,H=b+N>P;H&&(b=0,I+=1),m<h?O(u[m]):_===-1?(T=!0,V=I):H&&(T=!1),T?(_=m,B(u[m],b)):O(u[m]),b+=N}d(V),g(I),F.current=_;function B(m,N){m.style.top=`${N}px`}function O(m){m.style.top="-1000px"}},[h,c]),l.useEffect(()=>{if(a){d(1),x(0);return}j.current&&clearInterval(j.current);const u=setInterval(()=>{x(v===p?0:F.current+1)},n*1e3);return j.current=u,()=>clearInterval(j.current)},[n,p,a,v]);let y=c.findIndex(u=>u.id===s);const k=c.slice(y+1);return y=0,e.jsx(J,{value:{events:k,selectedEventId:s,numPages:p,visiblePage:v,containerRef:S},children:t})},X=()=>{const t=l.use(J);if(!t)throw new Error("useSchedule() can only be used inside a ScheduleContext");return t},E={format12:"h:mm a",format24:"HH:mm"};function He({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:c,duration:h,skip:x,title:p,timeEnd:g,cue:v}){const{showExpected:d}=Z();return e.jsxs("li",{className:o(["entry",x&&"entry--skip"]),"data-testid":v,children:[e.jsx("div",{className:"entry-times",children:d?e.jsx(Re,{timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:h,colour:c}):n>0?e.jsx(Me,{timeStart:t,delay:n,colour:c,timeEnd:g}):e.jsx(Le,{timeStart:t,timeEnd:g,colour:c})}),e.jsx("div",{className:"entry-title",children:p})]})}function Le({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(w,{time:a}),"→",e.jsx(w,{time:i})]})}function Me({timeStart:t,timeEnd:s,colour:n,delay:a}){const i=f(t,E),r=f(s,E),c=f(t+a,E),h=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(w,{time:i}),"→",e.jsx(w,{time:r})]}),e.jsxs("span",{className:"entry-times--delay",children:[e.jsx(w,{time:c}),"→",e.jsx(w,{time:h})]})]})}function Re({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:c,duration:h}){const x=ae(),{expectedStart:p,expectedEnd:g,plannedEnd:v}=ie({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:h},x);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:c}}),e.jsx(Q,{expectedTime:p,plannedTime:t}),"→",e.jsx(Q,{expectedTime:g,plannedTime:v})]})}function Q({expectedTime:t,plannedTime:s}){const n=f(t),a=ke(t-s);return e.jsx(w,{className:`entry-times--${a}`,time:n})}function $e({className:t}){const{events:s,containerRef:n}=X();return(s==null?void 0:s.length)<1?null:e.jsx("ul",{className:o(["schedule",t]),ref:n,children:s.map(a=>e.jsx(He,{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 ze({className:t}){const{numPages:s,visiblePage:n}=X();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 De=l.memo(Ae);function Ae(t){const{selectedId:s}=t;return e.jsxs(Be,{selectedEventId:s,children:[e.jsx(ze,{className:"schedule-nav-container"}),e.jsx($e,{className:"schedule-container"})]})}const We=(t,s,n)=>{const a=W(s,[{value:"none",label:"None"}]),i=W(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]),r=Ne(n,[{value:"none",label:"None"}]);return[{title:M.ClockOptions,collapsible:!0,options:[Pe(t)]},{title:M.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"}]},Fe(a),{title:M.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 qe(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 Ge(){const[t]=K(),s=l.use(re);return l.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return qe(t,a)},[s,t])}function Qe(t){return(t??0)<0}function Ke(t){return t!==R.Stop}function Ue(t,s){return t===R.Roll&&s===oe.Pending}function Ze(t,s,n,a,i){if(i===R.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const r=L(t,n)||D,c=L(t,a),h=L(s,n)||D,x=L(s,a);return{showNow:t!==null,nowMain:r,nowSecondary:c,showNext:s!==null,nextMain:h,nextSecondary:x}}function Je(){const t=ce(p=>p.mirror),{data:s,status:n}=Ee(),{data:a,status:i}=Oe(),{data:r,status:c}=le(),{data:h,status:x}=Te();return{data:{events:s,customFields:h,projectData:a,isMirrored:t,settings:r},status:Ie([n,i,c,x])}}function jt(){const{data:t,status:s}=Je();return Se("Backstage"),s==="pending"?e.jsx(de,{}):s==="error"?e.jsx(_e,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Xe,{...t})}function Xe({events:t,customFields:s,projectData:n,isMirrored:a,settings:i}){const{getLocalizedString:r}=U(),{secondarySource:c,extraInfo:h}=Ge(),{eventNext:x,eventNow:p,rundown:g,selectedEventId:v,time:d}=ue(),[F,j]=l.useState(!1),{height:S}=se();l.useEffect(()=>{j(!1);const te=setTimeout(()=>{j(!0)},10);return()=>clearTimeout(te)},[v]);const y=t.length>0,{showNow:k,nowMain:u,nowSecondary:P,showNext:b,nextMain:V,nextSecondary:I}=Ze(p,x,"title",c,d.playback),_=Ue(d.playback,d.phase),T=_?f(d.secondaryTimer):f(d.startedAt),B=(()=>{if(!k&&y)return f(g.plannedStart,{format12:"h:mm a",format24:"HH:mm"})})(),O=(()=>{if(!k&&y)return f(g.plannedEnd,{format12:"h:mm a",format24:"HH:mm"})})();let m=me(d.current,{fallback:ve});m=he(m);const N=Math.max(window.innerWidth/15,72),H=Ke(d.playback),$=y&&S>420,Y=B&&O,z=xe(i==null?void 0:i.timeFormat),ee=l.useMemo(()=>We(z,s,n),[z,s,n]);return e.jsxs("div",{className:`backstage ${a?"mirror":""}`,"data-testid":"backstage-view",children:[e.jsx(we,{target:fe.Backstage,viewOptions:ee}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(je,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(et,{})]}),H&&e.jsx(Ce,{className:"progress-container",current:d.current,duration:d.duration}),!y&&e.jsx(ye,{text:r("common.no_data"),className:"empty-container"}),e.jsxs("div",{className:"card-container",children:[k&&e.jsxs("div",{className:o(["event","now",F&&"blink"]),children:[e.jsx(A,{title:u,secondary:P}),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(C,{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.expected_finish")}),Qe(d.current)?e.jsx("div",{className:"time-entry__value",children:r("countdown.overtime")}):e.jsx(C,{time:f(d.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:m})]})]})]}),Y&&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(C,{time:B,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(C,{time:O,className:"time-entry__value"})]})]})]}),b&&y&&e.jsx(A,{className:"event",label:"next",title:V,secondary:I})]}),$&&e.jsx(De,{selectedId:v}),e.jsxs("div",{className:o(["info",!$&&"info--stretch"]),children:[h&&e.jsx(Ye,{projectData:n,size:N,source:h}),e.jsxs("div",{className:"info-card",children:[n.url&&e.jsx(ne,{value:n.url,size:N,level:"L",className:"info-card__qr"}),n.info&&e.jsx("div",{className:"info-card__message",children:n.info})]})]})]})}function Ye({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 et(){const{getLocalizedString:t}=U(),{clock:s}=pe(),n=f(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(C,{time:n,className:"time"})]})}export{jt as default};
|
|
2
|
+
//# sourceMappingURL=Backstage-D2lEbqUt.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Backstage-D2lEbqUt.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 '../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 {\n createContext,\n PropsWithChildren,\n RefObject,\n use,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} 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\n const filterCallback = useCallback(\n (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 [filter],\n );\n\n const { data: events } = usePartialRundown(filterCallback);\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 SuperscriptPeriod from '../superscript-time/SuperscriptPeriod';\n\nimport { useScheduleOptions } from './schedule.options';\n\nimport './Schedule.scss';\n\nconst formatOptions = {\n format12: 'h: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 <SuperscriptPeriod time={start} />\n →\n <SuperscriptPeriod 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 <SuperscriptPeriod time={start} />\n →\n <SuperscriptPeriod time={end} />\n </span>\n <span className='entry-times--delay'>\n <SuperscriptPeriod time={delayedStart} />\n →\n <SuperscriptPeriod 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 <SuperscriptPeriod 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 '../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 { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport ScheduleExport from '../common/schedule/ScheduleExport';\nimport SuperscriptTime from '../common/superscript-time/SuperscriptTime';\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: 'h: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: 'h: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","width","getScheduleOptions","customFieldOptions","title","OptionTitle","Schedule","collapsible","options","id","description","type","values","defaultValue","getScheduleOptionsFromParams","searchParams","filter","get","cycleInterval","Number","stopCycle","isStringBoolean","showExpected","useScheduleOptions","useSearchParams","useMemo","ScheduleContext","createContext","undefined","ScheduleProvider","children","selectedEventId","filterCallback","useCallback","entry","customKey","startsWith","slice","isOntimeEvent","Boolean","custom","data","events","usePartialRundown","firstIndex","setFirstIndex","useState","numPages","setNumPages","visiblePage","setVisiblePage","lastIndex","useRef","paginator","containerRef","useLayoutEffect","Array","from","length","containerHeight","clientHeight","currentPageHeight","currentPage","lastVisibleIndex","isShowingElements","i","currentElementHeight","isNextPage","showElement","element","yPosition","style","top","hideElement","useEffect","clearInterval","interval","setInterval","selectedEventIndex","findIndex","event","viewEvents","useSchedule","context","use","Error","formatOptions","format12","format24","ScheduleItem","timeStart","dayOffset","delay","totalGap","isLinkedToLoaded","countToEnd","colour","skip","timeEnd","cue","jsxs","cx","ExpectedScheduleItem","DelayedScheduleItem","PlannedScheduleItem","start","formatTime","end","Fragment","backgroundColor","SuperscriptPeriod","delayedStart","delayedEnd","expectedStartData","useExpectedStartData","expectedStart","expectedEnd","plannedEnd","getExpectedTimesFromExtendedEvent","ExpectedTime","expectedTime","plannedTime","timeDisplay","expectedState","getOffsetState","map","ScheduleNav","keys","memo","ScheduleExport","selectedId","getBackstageOptions","timeFormat","customFields","projectData","makeOptionsFromCustomFields","value","label","secondaryOptions","projectDataOptions","makeProjectDataOptions","ClockOptions","getTimeOption","DataSources","ElementVisibility","getOptionsFromParams","defaultValues","getValue","key","secondarySource","extraInfo","useBackstageOptions","maybePreset","PresetContext","URLSearchParams","search","isOvertime","getShowProgressBar","playback","Playback","Stop","getIsPendingStart","phase","Roll","TimerPhase","Pending","getCardData","eventNow","eventNext","mainSource","showNow","nowMain","nowSecondary","showNext","nextMain","nextSecondary","getPropertyValue","enDash","useBackstageData","isMirrored","useViewOptionsStore","state","mirror","rundownData","status","rundownStatus","useFlatRundown","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","BackstageLoader","useWindowTitle","Loader","EmptyPage","Backstage","getLocalizedString","useTranslation","rundown","time","useBackstageSocket","blinkClass","setBlinkClass","height","screenHeight","useViewportSize","timer","setTimeout","clearTimeout","hasEvents","isPendingStart","startedAt","secondaryTimer","scheduledStart","plannedStart","scheduledEnd","displayTimer","millisToString","fallback","timerPlaceholderMin","removeLeadingZero","qrSize","Math","max","window","innerWidth","showProgress","showSchedule","showPending","defaultFormat","getDefaultFormat","backstageOptions","ViewParamsEditor","OntimeView","logo","ViewLogo","BackstageClock","Empty","TitleCard","SuperscriptTime","expectedFinish","ExtraInfo","url","QRCode","info","size","source","find","index","currentTarget","display","clock","useClock","formattedClock"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{l as tt,h as g,j as t,x as et,a8 as st,v as nt,a9 as ot,aa as B,T as H}from"./vendor-DmGkEtRj.js";import{P as at,h as E,i as V,j as rt,d as O,f as I,M as A,r as it,m as ct,k as lt,F as dt,l as ut,e as D,B as w,n as mt,o as pt,p as $,q as W,s as ft,t as xt,u as ht,b as gt,L as St,g as jt,O as yt,v as wt}from"./index-B1K7rED_.js";import{u as bt,i as vt,a as _t}from"./useRundown-BGhL8DEI.js";import{E as P}from"./Empty-DJMjfXnt.js";import{E as Ct}from"./EmptyPage-BlXZqoIr.js";import{V as Nt}from"./ViewLogo-BZVUUIZA.js";import{m as kt,O as F,V as Dt}from"./ViewParamsEditor-CBnRitZ4.js";import{u as Ft}from"./useWindowTitle-ahZQIheF.js";import{S as T}from"./SuperscriptTime-CA_8XRM6.js";import{g as Et,a as Ot}from"./viewLoader.utils-Bniie8Op.js";import{i as Tt,b as G}from"./viewUtils-VNLYoR28.js";import{u as Lt}from"./useFollowComponent-4cbKEsVz.js";import{u as q}from"./useReport-6XA_s2Vc.js";import{g as U}from"./offset-FplkvYRD.js";import{F as At}from"./FollowButton-Dy5n1J2c.js";import{u as Pt}from"./useCustomFields-nW-_Zyfw.js";import{u as It}from"./useProjectData-DP-pr73E.js";import"./Select-ASOzxGFV.js";import"./SwatchPicker-C8eFQKBd.js";/* empty css */(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]="f89901f5-866a-4f6d-ab05-5dee52a5677c",e._sentryDebugIdIdentifier="sentry-dbid-f89901f5-866a-4f6d-ab05-5dee52a5677c")}catch{}})();const Rt=(e,s,o)=>{const a=kt(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]);return[{title:F.ClockOptions,collapsible:!0,options:[Et(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 Mt(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:Tt(o("showExpected"))}}function R(){const[e]=tt(),s=g.use(at);return g.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return Mt(e,a)},[s,e])}const N="h:mm a",k="HH:mm";function zt(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():c<A*10?it(ct(c)):lt(c,c>A*10).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:I(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 Ht(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 Ut(e,s){return s.filter(o=>e.includes(o.id))}function Bt(e,s){return Math.abs(e-s)>A}function Vt(e,s,o,a,n,r,c){const{totalGap:m,isLinkedToLoaded:d}=e,i=V(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=dt,preferredFormat24:a=ut,className:n}=e,r=I(s,{format12:o,format24:a});return t.jsx(T,{className:n,time:r})}function $t({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=Ht(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 a",preferredFormat24:"HH:mm"}),"→",t.jsx(_,{value:i.timeEnd,preferredFormat12:"h:mm a",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 Wt({subscribedEvents:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=R(),{playback:n}=mt(),{selectedEventId:r}=pt(),c=$(!0),{data:m}=q(),{offset:d,currentDay:i,actualStart:l,plannedStart:p,mode:f}=W(),x=g.useRef(null),[S,b]=g.useState(!1),j=g.useRef(null),h=g.useRef(null),Z=Lt({followRef:j,scrollRef:h,doFollow:!S,topOffset:0,followTrigger:r});g.useEffect(()=>{var u;r||S||(u=h.current)==null||u.scrollTo(0,0)},[r,S,h]);const J=()=>{r&&Z(),b(!1)},X=xt(()=>{if(j!=null&&j.current&&(h!=null&&h.current)){const u=j.current.getBoundingClientRect(),C=h.current.getBoundingClientRect();if(u&&C){const v=u.top-C.top,L=v<-8||v>50;b(L)}}},1e3),M=()=>{x.current&&clearTimeout(x.current),X()};return t.jsxs("div",{className:"list-container",onWheel:M,onTouchMove:M,ref:h,children:[e.map(u=>{const C=G(u,o),v=zt(u.id,r,n),L=!v&&u.id===r,z=Vt(u,i,l,p,d,f,m),Y=u.title.length?u.title:" ";return t.jsxs("div",{ref:v?j:void 0,className:D(["sub",v&&"sub--live",L&&"sub--armed"]),"data-testid":u.cue,children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":u.colour}}),t.jsx(Q,{event:z,showExpected:a}),t.jsx(Gt,{event:z}),t.jsx("div",{className:D(["sub__title",!u.title&&"subdued"]),children:Y}),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(B,{})," Edit"]})}),t.jsx(At,{isVisible:S,onClickHandler:J})]})}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*ft,i=o&&Bt(d,c),l=i?"sub__schedule--strike":r!==0?"sub__schedule--delayed":"",p=`sub__schedule--${U(c-d)}`,f=d+n+r,x=m?Math.max(c+n,f):c+n,S=`sub__schedule--${U(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:S,preferredFormat12:N,preferredFormat24:k})]})]})}function Gt({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 qt({subscribedEvent:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=R(),n=$(!0),{data:r}=q(),{offset:c,currentDay:m,actualStart:d,plannedStart:i,mode:l}=W(),{totalGap:p,isLinkedToLoaded:f}=e,x=V(e,{currentDay:m,totalGap:p,actualStart:d,plannedStart:i,isLinkedToLoaded:f,offset:c,mode:l}),{endedAt:S}=r[e.id]??{endedAt:null},b={...e,expectedStart:x,endedAt:S},j=e.title.length?e.title:" ",h=G(e,o);return t.jsxs("div",{className:"single-container","data-testid":"countdown-event",children:[t.jsx(Kt,{event:b}),t.jsxs("div",{className:"event__title",style:{borderColor:b.colour},children:[t.jsx(Q,{event:b,showExpected:a}),j,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(B,{})," Edit"]})})]})}function Kt({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=ht(i=>i.mirror),{data:s,status:o}=bt(),{data:a,status:n}=It(),{data:r,status:c}=gt(),{data:m,status:d}=Pt();return{data:{customFields:m,rundownData:s,projectData:a,isMirrored:e,settings:r},status:Ot([o,n,c,d])}}function ye(){const{data:e,status:s}=Qt();return Ft("Countdown"),s==="pending"?t.jsx(St,{}):s==="error"?t.jsx(Ct,{text:"There was an error fetching data, please refresh the page."}):t.jsx(Zt,{...e})}function Zt({customFields:e,rundownData:s,projectData:o,isMirrored:a,settings:n}){const{getLocalizedString:r}=O(),{subscriptions:c}=R(),[m,d]=g.useState(!1),i=s.filter(x=>vt(x)&&_t(x)),l=i.length>0,p=jt(n==null?void 0:n.timeFormat),f=g.useMemo(()=>Rt(p,e,c),[p,e,c]);return t.jsxs("div",{className:`countdown ${a?"mirror":""}`,"data-testid":"countdown-view",children:[t.jsx(Dt,{target:yt.Countdown,viewOptions:f}),t.jsxs("div",{className:"project-header",children:[(o==null?void 0:o.logo)&&t.jsx(Nt,{name:o.logo,className:"logo"}),t.jsx("div",{className:"title",children:o.title}),t.jsx(Xt,{})]}),!l&&t.jsx(P,{text:r("common.no_data"),className:"empty-container"}),l&&m&&t.jsx($t,{events:i,subscriptions:c,disableEdit:()=>d(!1)}),l&&!m&&t.jsx(Jt,{playableEvents:i,subscriptions:c,goToEditMode:()=>d(!0)})]})}function Jt({playableEvents:e,subscriptions:s,goToEditMode:o}){const{getLocalizedString:a}=O();if(s.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(P,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(H,{})," Add"]})]});const n=Ut(s,e);if(n.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(P,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(H,{})," Add"]})]});if(n.length===1){const r=n.at(0);return r?t.jsx(qt,{subscribedEvent:r,goToEditMode:o}):null}return t.jsx(Wt,{subscribedEvents:n,goToEditMode:o})}function Xt(){const{getLocalizedString:e}=O(),{clock:s}=wt(),o=I(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{ye as default};
|
|
2
|
+
//# sourceMappingURL=Countdown-VV03STbF.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Countdown-VV03STbF.js","sources":["../../src/views/countdown/countdown.options.ts","../../src/views/countdown/countdown.utils.ts","../../src/views/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 '../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, millisToString, removeLeadingZero } from 'ontime-utils';\n\nimport { useCountdownSocket } from '../../common/hooks/useSocket';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\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\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 if (value < MILLIS_PER_MINUTE * 10) {\n return removeLeadingZero(millisToString(value));\n }\n\n return formatDuration(value, value > MILLIS_PER_MINUTE * 10)\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 '../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 a' preferredFormat24='HH:mm' />\n →\n <ClockTime value={event.timeEnd} preferredFormat12='h:mm a' 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 '../common/clock-time/ClockTime';\nimport SuperscriptTime from '../common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../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 '../common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../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 { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport SuperscriptTime from '../common/superscript-time/SuperscriptTime';\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","value","label","title","OptionTitle","ClockOptions","collapsible","options","getTimeOption","DataSources","id","description","type","values","defaultValue","BehaviourOptions","Hidden","getOptionsFromParams","searchParams","defaultValues","getValue","key","get","subscriptions","has","getAll","secondarySource","showExpected","isStringBoolean","useCountdownOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","URLSearchParams","search","undefined","preferredFormat12","preferredFormat24","getIsLive","currentId","selectedId","playback","Playback","Armed","timerProgress","future","due","live","pending","loaded","done","useSubscriptionDisplayData","subscribedEvent","current","clock","useCountdownSocket","getLocalizedString","useTranslation","bigDuration","toUpperCase","MILLIS_PER_MINUTE","removeLeadingZero","millisToString","formatDuration","replace","isLoaded","status","statusDisplay","timeDisplay","duration","Stop","isPast","formatTime","endedAt","format12","format24","expectedStart","makeSubscriptionsUrl","urlRef","url","URL","newParams","entries","append","forEach","toString","getOrderedSubscriptions","playableEvents","filter","event","includes","isOutsideRange","a","b","Math","abs","extendEventData","currentDay","actualStart","plannedStart","offset","mode","reportData","totalGap","isLinkedToLoaded","getExpectedStart","ClockTime","props","FORMAT_12","FORMAT_24","className","formattedTime","jsx","SuperscriptTime","CountdownSelect","events","disableEdit","selected","setSelected","useState","navigate","useNavigate","toggleSelect","entryId","prev","applySelection","filteredSelected","some","window","location","href","selectedIds","Set","jsxs","map","index","isSelected","e","stopPropagation","cx","colour","timeStart","timeEnd","Button","IoArrowBack","length","IoClose","IoSaveOutline","CountdownSubscriptions","subscribedEvents","goToEditMode","usePlayback","selectedEventId","useSelectedEventId","showFab","useFadeOutOnInactivity","data","useReport","useExpectedStartData","timeoutId","useRef","lockAutoScroll","setLockAutoScroll","selectedRef","scrollRef","scrollToComponent","useFollowComponent","followRef","doFollow","topOffset","followTrigger","useEffect","scrollTo","handleOffset","throttledHandleScroll","throttle","handleUserScroll","selectedRect","getBoundingClientRect","scrollerRect","distanceFromTop","top","hasScrolledOutOfThreshold","handleScroll","clearTimeout","secondaryData","getPropertyValue","isLive","isArmed","countdownEvent","cue","ScheduleTime","SubscriptionStatus","IoPencil","FollowButton","delay","countToEnd","dayOffset","dayInMs","isExpectedValueShow","plannedStateClass","expectedStateClass","getOffsetState","plannedEnd","expectedEnd","max","expectedEndClass","Fragment","SingleEventCountdown","borderColor","useCountdownData","isMirrored","useViewOptionsStore","state","mirror","rundownData","rundownStatus","useFlatRundownWithMetadata","projectData","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","CountdownLoader","useWindowTitle","Loader","EmptyPage","Countdown","editMode","setEditMode","entry","isOntimeEvent","isPlayableEvent","hasEvents","defaultFormat","getDefaultFormat","countdownOptions","ViewParamsEditor","OntimeView","logo","ViewLogo","CountdownClock","Empty","CountdownContents","IoAdd","at","useClock","formattedClock"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{h as w,ad as I,j as e}from"./vendor-DmGkEtRj.js";import{d as v,bS as c,Y as S,a9 as u,B as m,$ as T,ae as _,af as C,ag as D,ah as O,ai as B}from"./index-B1K7rED_.js";import{I as M}from"./useWindowTitle-ahZQIheF.js";import{M as F}from"./Modal-ePA-Go14.js";import"./SwatchPicker-C8eFQKBd.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},a=new s.Error().stack;a&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[a]="7fd9cea8-0643-4e7a-b8d1-20f96e168cc8",s._sentryDebugIdIdentifier="sentry-dbid-7fd9cea8-0643-4e7a-b8d1-20f96e168cc8")}catch{}})();function K({isOpen:s,onClose:a}){const{userTranslation:i,postUserTranslation:f}=v(),h=w.useMemo(()=>{const t={};return Object.keys(c).forEach(r=>{t[l(r)]=i[r]||""}),t},[i]),{handleSubmit:p,register:b,reset:g,formState:{isSubmitting:d,isDirty:x,errors:n,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:a,showCloseButton:!0,showBackdrop:!0,bodyElements:e.jsxs(T,{as:"form",onSubmit:p(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(c).map(([t,r])=>{var o;return e.jsxs(C,{children:[e.jsx(D,{title:r,description:"",error:(o=n[l(t)])==null?void 0:o.message}),e.jsx(O,{maxLength:150,...b(l(t),{required:"This field is required"}),placeholder:r})]},t)})})]}),footerElements:e.jsxs("div",{children:[(n==null?void 0:n.root)&&e.jsx(S,{children:n.root.message}),e.jsx(u,{align:"apart",children:e.jsxs(u,{children:[e.jsx(m,{size:"large",onClick:a,children:"Cancel"}),e.jsx(m,{variant:"primary",size:"large",type:"submit",form:"custom-translations-form",disabled:d||!x||!j,loading:d,children:"Save changes"})]})})]})})}function l(s){return s.replace(".","_")}function L(s){return s.replace("_",".")}export{K as default};
|
|
2
|
+
//# sourceMappingURL=CustomTranslationModal-D1nM9W1Z.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomTranslationModal-
|
|
1
|
+
{"version":3,"file":"CustomTranslationModal-D1nM9W1Z.js","sources":["../../src/features/app-settings/panel/settings-panel/composite/CustomTranslationModal.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { langEn, TranslationObject } from 'ontime-types';\n\nimport { maybeAxiosError } from '../../../../../common/api/utils';\nimport Button from '../../../../../common/components/buttons/Button';\nimport Info from '../../../../../common/components/info/Info';\nimport Input from '../../../../../common/components/input/input/Input';\nimport Modal from '../../../../../common/components/modal/Modal';\nimport { useTranslation } from '../../../../../translation/TranslationProvider';\nimport * as Panel from '../../../panel-utils/PanelUtils';\n\ninterface CustomTranslationModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function CustomTranslationModal({ isOpen, onClose }: CustomTranslationModalProps) {\n const { userTranslation, postUserTranslation } = useTranslation();\n\n const defaultValues = useMemo(() => {\n const values: Record<string, string> = {};\n Object.keys(langEn).forEach((key) => {\n values[toFormKey(key)] = userTranslation[key as keyof TranslationObject] || '';\n });\n return values;\n }, [userTranslation]);\n\n const {\n handleSubmit,\n register,\n reset,\n formState: { isSubmitting, isDirty, errors, isValid },\n setError,\n } = useForm({\n defaultValues,\n resetOptions: {\n keepDirtyValues: true,\n },\n mode: 'onChange',\n });\n\n const onSubmit = async (formData: Record<string, string>) => {\n try {\n const translationData: Record<string, string> = {};\n Object.keys(formData).forEach((key) => {\n translationData[toApiKey(key)] = formData[key];\n });\n\n await postUserTranslation(translationData as TranslationObject);\n reset(formData);\n } catch (error) {\n setError('root', { message: maybeAxiosError(error) });\n }\n };\n\n return (\n <Modal\n title='Edit custom translations'\n isOpen={isOpen}\n onClose={onClose}\n showCloseButton\n showBackdrop\n bodyElements={\n <Panel.Section as='form' onSubmit={handleSubmit(onSubmit)} id='custom-translations-form'>\n <Info>\n Provide custom translations for the public views of Ontime. <br />\n You will need to activate this in the settings by selecting "Custom" as the views language.\n </Info>\n <Panel.ListGroup>\n {Object.entries(langEn).map(([key, value]) => (\n <Panel.ListItem key={key}>\n <Panel.Field title={value} description='' error={errors[toFormKey(key)]?.message} />\n <Input\n maxLength={150}\n {...register(toFormKey(key), {\n required: 'This field is required',\n })}\n placeholder={value}\n />\n </Panel.ListItem>\n ))}\n </Panel.ListGroup>\n </Panel.Section>\n }\n footerElements={\n <div>\n {errors?.root && <Panel.Error>{errors.root.message}</Panel.Error>}\n <Panel.InlineElements align='apart'>\n <Panel.InlineElements>\n <Button size='large' onClick={onClose}>\n Cancel\n </Button>\n <Button\n variant='primary'\n size='large'\n type='submit'\n form='custom-translations-form'\n disabled={isSubmitting || !isDirty || !isValid}\n loading={isSubmitting}\n >\n Save changes\n </Button>\n </Panel.InlineElements>\n </Panel.InlineElements>\n </div>\n }\n />\n );\n}\n\nfunction toFormKey(key: string) {\n return key.replace('.', '_');\n}\n\nfunction toApiKey(key: string) {\n return key.replace('_', '.');\n}\n"],"names":["CustomTranslationModal","isOpen","onClose","userTranslation","postUserTranslation","useTranslation","defaultValues","useMemo","values","Object","keys","langEn","forEach","key","toFormKey","handleSubmit","register","reset","formState","isSubmitting","isDirty","errors","isValid","setError","useForm","resetOptions","keepDirtyValues","mode","onSubmit","formData","translationData","toApiKey","error","message","maybeAxiosError","jsx","Modal","Panel.Section","jsxs","Info","Panel.ListGroup","entries","map","value","Panel.ListItem","Panel.Field","Input","required","root","Panel.Error","Panel.InlineElements","Button","replace"],"mappings":"moBAiBA,SAAwBA,EAAuB,CAAEC,OAAAA,EAAQC,QAAAA,CAAqC,EAAG,CACzF,KAAA,CAAEC,gBAAAA,EAAiBC,oBAAAA,GAAwBC,EAAe,EAE1DC,EAAgBC,EAAAA,QAAQ,IAAM,CAClC,MAAMC,EAAiC,CAAC,EACxCC,cAAOC,KAAKC,CAAM,EAAEC,QAAiBC,GAAA,CACnCL,EAAOM,EAAUD,CAAG,CAAC,EAAIV,EAAgBU,CAA8B,GAAK,EAAA,CAC7E,EACML,CAAAA,EACN,CAACL,CAAe,CAAC,EAEd,CACJY,aAAAA,EACAC,SAAAA,EACAC,MAAAA,EACAC,UAAW,CAAEC,aAAAA,EAAcC,QAAAA,EAASC,OAAAA,EAAQC,QAAAA,CAAQ,EACpDC,SAAAA,GACEC,EAAQ,CACVlB,cAAAA,EACAmB,aAAc,CACZC,gBAAiB,EACnB,EACAC,KAAM,UAAA,CACP,EAEKC,EAAW,MAAOC,GAAqC,CACvD,GAAA,CACF,MAAMC,EAA0C,CAAC,EACjDrB,OAAOC,KAAKmB,CAAQ,EAAEjB,QAAiBC,GAAA,CACrCiB,EAAgBC,EAASlB,CAAG,CAAC,EAAIgB,EAAShB,CAAG,CAAA,CAC9C,EAED,MAAMT,EAAoB0B,CAAoC,EAC9Db,EAAMY,CAAQ,QACPG,EAAO,CACdT,EAAS,OAAQ,CAAEU,QAASC,EAAgBF,CAAK,CAAA,CAAG,CAAA,CAExD,EAGE,OAAAG,MAACC,GACC,MAAM,2BACN,OAAAnC,EACA,QAAAC,EACA,gBAAe,GACf,aAAY,GACZ,oBACGmC,EAAA,CAAc,GAAG,OAAO,SAAUtB,EAAaa,CAAQ,EAAG,GAAG,2BAC5D,SAAA,CAAAU,OAACC,EAAI,CAAA,SAAA,CAAA,qEAC0D,KAAE,EAAA,EAAA,6FAAA,EAEjE,QACCC,EAAA,CACE/B,SAAAA,OAAOgC,QAAQ9B,CAAM,EAAE+B,IAAI,CAAC,CAAC7B,EAAK8B,CAAK,IACrCL,OAAAA,OAAAA,EAAAA,KAAAM,EAAA,CACC,SAAA,CAAAT,EAAAA,IAACU,EAAA,CAAY,MAAOF,EAAO,YAAY,GAAG,OAAOtB,EAAAA,EAAOP,EAAUD,CAAG,CAAC,IAArBQ,YAAAA,EAAwBY,OAAQ,CAAA,EACjFE,MAACW,GACC,UAAW,IACX,GAAI9B,EAASF,EAAUD,CAAG,EAAG,CAC3BkC,SAAU,wBAAA,CACX,EACD,YAAaJ,CAAM,CAAA,CAAA,CAPF9B,EAAAA,CASrB,EACD,CACH,CAAA,CACF,CAAA,CAAA,EAEF,eACEyB,EAAA,KAAC,MACEjB,CAAAA,SAAAA,EAAAA,GAAAA,YAAAA,EAAQ2B,OAASb,EAAAA,IAAAc,EAAA,CAAa5B,SAAAA,EAAO2B,KAAKf,QAAQ,EACnDE,MAACe,EAAA,CAAqB,MAAM,QAC1B,SAAAZ,EAAA,KAACY,EAAA,CACC,SAAA,CAAAf,MAACgB,EAAO,CAAA,KAAK,QAAQ,QAASjD,EAAQ,SAEtC,SAAA,QACCiD,EACC,CAAA,QAAQ,UACR,KAAK,QACL,KAAK,SACL,KAAK,2BACL,SAAUhC,GAAgB,CAACC,GAAW,CAACE,EACvC,QAASH,EAAa,SAGxB,cAAA,CAAA,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAAA,CACF,CAEF,CAAA,CAEN,CAEA,SAASL,EAAUD,EAAa,CACvBA,OAAAA,EAAIuC,QAAQ,IAAK,GAAG,CAC7B,CAEA,SAASrB,EAASlB,EAAa,CACtBA,OAAAA,EAAIuC,QAAQ,IAAK,GAAG,CAC7B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as n,aT as s,b1 as l}from"./vendor-DmGkEtRj.js";import{m as d}from"./dateConfig-Crm-Cu2y.js";import{T as a}from"./Tooltip-BTK4bJkV.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]="1764823d-c9db-4b10-ac8d-69264d062deb",o._sentryDebugIdIdentifier="sentry-dbid-1764823d-c9db-4b10-ac8d-69264d062deb")}catch{}})();const i="_delaySymbol_1i27r_17",y={delaySymbol:i};function u(o){const{delayValue:e,tooltipPrefix:t}=o;if(typeof e!="number"||e===0)return null;const r=t?`${t} ${d(e)}`:d(e);return n.jsx(a,{text:r,render:n.jsx("span",{}),className:y.delaySymbol,children:e<0?n.jsx(s,{}):n.jsx(l,{})})}export{u as D};
|
|
2
|
+
//# sourceMappingURL=DelayIndicator-Co5rMYw9.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DelayIndicator-
|
|
1
|
+
{"version":3,"file":"DelayIndicator-Co5rMYw9.js","sources":["../../src/common/components/delay-indicator/DelayIndicator.tsx"],"sourcesContent":["import { IoChevronDown, IoChevronUp } from 'react-icons/io5';\n\nimport { millisToDelayString } from '../../utils/dateConfig';\nimport Tooltip from '../tooltip/Tooltip';\n\nimport style from './DelayIndicator.module.scss';\n\ninterface DelayIndicatorProps {\n delayValue?: number;\n tooltipPrefix?: string;\n}\n\nexport default function DelayIndicator(props: DelayIndicatorProps) {\n const { delayValue, tooltipPrefix } = props;\n\n if (typeof delayValue !== 'number' || delayValue === 0) {\n return null;\n }\n\n const delayString = tooltipPrefix\n ? `${tooltipPrefix} ${millisToDelayString(delayValue)}`\n : millisToDelayString(delayValue);\n\n return (\n <Tooltip text={delayString} render={<span />} className={style.delaySymbol}>\n {delayValue < 0 ? <IoChevronDown /> : <IoChevronUp />}\n </Tooltip>\n );\n}\n"],"names":["DelayIndicator","props","delayValue","tooltipPrefix","delayString","millisToDelayString","Tooltip","jsx","style","delaySymbol","IoChevronDown","IoChevronUp"],"mappings":"4hBAYA,SAAwBA,EAAeC,EAA4B,CAC3D,KAAA,CAAEC,WAAAA,EAAYC,cAAAA,CAAAA,EAAkBF,EAEtC,GAAI,OAAOC,GAAe,UAAYA,IAAe,EAC5C,OAAA,KAGHE,MAAAA,EAAcD,EAChB,GAAGA,CAAa,IAAIE,EAAoBH,CAAU,CAAC,GACnDG,EAAoBH,CAAU,EAElC,aACGI,EAAQ,CAAA,KAAMF,EAAa,OAAQG,EAAAA,IAAC,SAAO,EAAE,UAAWC,EAAMC,YAC5DP,WAAa,EAAIK,MAACG,GAAgB,CAAA,EAAGH,EAAA,IAACI,IAAc,CACvD,CAAA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as t}from"./vendor-DmGkEtRj.js";import{P as o}from"./ProtectRoute-DW_vXgYI.js";import"./index-B1K7rED_.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]="9cf1f835-699d-4ef4-b407-91766bc17fe8",e._sentryDebugIdIdentifier="sentry-dbid-9cf1f835-699d-4ef4-b407-91766bc17fe8")}catch{}})();const s="_wrapper_1t7jb_17",n={wrapper:s};function a({children:e}){return t.jsx(o,{permission:"editor",children:t.jsx("div",{className:n.wrapper,children:e})})}export{a as default};
|
|
2
|
+
//# sourceMappingURL=EditorFeatureWrapper-_t_4D7Es.js.map
|
|
Binary file
|
|
Binary file
|
package/client/assets/{EditorFeatureWrapper-DaMxgBMP.js.map → EditorFeatureWrapper-_t_4D7Es.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorFeatureWrapper-
|
|
1
|
+
{"version":3,"file":"EditorFeatureWrapper-_t_4D7Es.js","sources":["../../src/features/EditorFeatureWrapper.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\n\nimport ProtectRoute from '../common/components/protect-route/ProtectRoute';\n\nimport style from './EditorFeatureWrapper.module.scss';\n\nexport default function EditorFeatureWrapper({ children }: PropsWithChildren) {\n return (\n <ProtectRoute permission='editor'>\n <div className={style.wrapper}>{children}</div>\n </ProtectRoute>\n );\n}\n"],"names":["EditorFeatureWrapper","children","jsx","ProtectRoute","style","wrapper"],"mappings":"wfAMA,SAAwBA,EAAqB,CAAEC,SAAAA,CAA4B,EAAG,CAE1E,OAAAC,EAAA,IAACC,EAAa,CAAA,WAAW,SACvB,SAAAD,EAAAA,IAAC,OAAI,UAAWE,EAAMC,QAAUJ,SAAAA,CAAAA,CAAS,CAC3C,CAAA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as n,y as c,c8 as l}from"./vendor-DmGkEtRj.js";import{e as s}from"./index-B1K7rED_.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]="b1dc205d-c664-4aef-8bd6-f7e0f3bd28e0",e._sentryDebugIdIdentifier="sentry-dbid-b1dc205d-c664-4aef-8bd6-f7e0f3bd28e0")}catch{}})();const i="_blink_cv4kp_1",f="_fourtyfive_cv4kp_13",_="_arrow_cv4kp_17",p="_corner_cv4kp_21",d="_offsetCorner_cv4kp_39",u="_header_cv4kp_43",b="_title_cv4kp_47",v="_label_cv4kp_55",k="_separator_cv4kp_63",y="_horizontal_cv4kp_66",m="_vertical_cv4kp_70",x="_panel_cv4kp_75",t={blink:i,fourtyfive:f,arrow:_,corner:p,offsetCorner:d,header:u,title:b,label:v,separator:k,horizontal:y,vertical:m,panel:x};function j({className:e,...r}){return n.jsx(c,{className:s([t.corner,t.arrow,e]),...r})}function g({className:e,...r}){return n.jsx(l,{className:s([t.corner,t.offsetCorner,e]),...r})}function C({className:e,pipElement:r,onExtractClick:o}){return n.jsxs(n.Fragment,{children:[n.jsx(c,{className:s([t.corner,t.arrow,e]),onClick:o}),r]})}function I({children:e,className:r,...o}){const a=s([t.title,r]);return n.jsx("h3",{className:a,...o,children:e})}function N({children:e,className:r,...o}){const a=s([t.label,r]);return n.jsx("label",{className:a,...o,children:e})}function P({className:e,orientation:r="vertical",...o}){return n.jsx("div",{className:s([t.separator,t[r],e]),role:"separator",...o})}function T({className:e,...r}){return n.jsx("div",{className:s([t.panel,e]),...r})}export{j as C,N as L,T as P,P as S,I as T,C as a,g as b};
|
|
2
|
+
//# sourceMappingURL=EditorUtils-C3QoonjM.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorUtils-
|
|
1
|
+
{"version":3,"file":"EditorUtils-C3QoonjM.js","sources":["../../src/common/components/editor-utils/EditorUtils.tsx"],"sourcesContent":["import type { HTMLAttributes, JSX, LabelHTMLAttributes, MouseEventHandler } from 'react';\nimport { IconBaseProps } from 'react-icons';\nimport { IoArrowUp } from 'react-icons/io5';\nimport { TbPictureInPictureOff } from 'react-icons/tb';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './EditorUtils.module.scss';\n\nexport function CornerExtract({ className, ...elementProps }: IconBaseProps) {\n return <IoArrowUp className={cx([style.corner, style.arrow, className])} {...elementProps} />;\n}\n\nexport function CornerPipButton({ className, ...elementProps }: IconBaseProps) {\n return <TbPictureInPictureOff className={cx([style.corner, style.offsetCorner, className])} {...elementProps} />;\n}\n\ninterface ExtractAndPip extends IconBaseProps {\n onExtractClick: MouseEventHandler<SVGElement>;\n pipElement: JSX.Element;\n}\n\nexport function CornerWithPip({ className, pipElement, onExtractClick }: ExtractAndPip) {\n return (\n <>\n <IoArrowUp className={cx([style.corner, style.arrow, className])} onClick={onExtractClick} />\n {/* the pip element returns the icon button */}\n {pipElement}\n </>\n );\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\nexport function Panel({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cx([style.panel, className])} {...props} />;\n}\n"],"names":["CornerExtract","className","elementProps","jsx","IoArrowUp","cx","style","corner","arrow","CornerPipButton","TbPictureInPictureOff","offsetCorner","CornerWithPip","pipElement","onExtractClick","jsxs","Fragment","Title","children","classes","title","Label","label","Separator","orientation","separator","Panel","props","panel"],"mappings":"u0BASO,SAASA,EAAc,CAAEC,UAAAA,EAAW,GAAGC,CAA4B,EAAG,CAC3E,OAAQC,EAAA,IAAAC,EAAA,CAAU,UAAWC,EAAG,CAACC,EAAMC,OAAQD,EAAME,MAAOP,CAAS,CAAC,EAAG,GAAIC,CAAgB,CAAA,CAC/F,CAEO,SAASO,EAAgB,CAAER,UAAAA,EAAW,GAAGC,CAA4B,EAAG,CAC7E,OAAQC,EAAA,IAAAO,EAAA,CAAsB,UAAWL,EAAG,CAACC,EAAMC,OAAQD,EAAMK,aAAcV,CAAS,CAAC,EAAG,GAAIC,CAAgB,CAAA,CAClH,CAOO,SAASU,EAAc,CAAEX,UAAAA,EAAWY,WAAAA,EAAYC,eAAAA,CAA8B,EAAG,CACtF,OAEIC,EAAA,KAAAC,WAAA,CAAA,SAAA,CAAAb,EAAAA,IAACC,EAAU,CAAA,UAAWC,EAAG,CAACC,EAAMC,OAAQD,EAAME,MAAOP,CAAS,CAAC,EAAG,QAASa,CAAe,CAAA,EAEzFD,CAAAA,EACH,CAEJ,CAEO,SAASI,EAAM,CAAEC,SAAAA,EAAUjB,UAAAA,EAAW,GAAGC,CAAiD,EAAG,CAClG,MAAMiB,EAAUd,EAAG,CAACC,EAAMc,MAAOnB,CAAS,CAAC,EAC3C,aACG,KAAG,CAAA,UAAWkB,EAAajB,GAAAA,EACzBgB,SAAAA,EACH,CAEJ,CAEO,SAASG,EAAM,CAAEH,SAAAA,EAAUjB,UAAAA,EAAW,GAAGC,CAAoD,EAAG,CACrG,MAAMiB,EAAUd,EAAG,CAACC,EAAMgB,MAAOrB,CAAS,CAAC,EAC3C,aACG,QAAM,CAAA,UAAWkB,EAAajB,GAAAA,EAC5BgB,SAAAA,EACH,CAEJ,CAMO,SAASK,EAAU,CAAEtB,UAAAA,EAAWuB,YAAAA,EAAc,WAAY,GAAGtB,CAA6B,EAAG,CAClG,aAAQ,MAAI,CAAA,UAAWG,EAAG,CAACC,EAAMmB,UAAWnB,EAAMkB,CAAW,EAAGvB,CAAS,CAAC,EAAG,KAAK,YAAgBC,GAAAA,EAAgB,CACpH,CAEO,SAASwB,EAAM,CAAEzB,UAAAA,EAAW,GAAG0B,CAAsC,EAAG,CACtE,OAAAxB,MAAC,MAAI,CAAA,UAAWE,EAAG,CAACC,EAAMsB,MAAO3B,CAAS,CAAC,EAAG,GAAI0B,CAAS,CAAA,CACpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._blink_cv4kp_1{animation:_blink_cv4kp_1 1s step-start infinite}@keyframes _blink_cv4kp_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_cv4kp_13,._arrow_cv4kp_17{transform:rotate(45deg)}._corner_cv4kp_21{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_cv4kp_21:hover{color:#ff7597;background-color:#404040;outline:2px solid #404040}._offsetCorner_cv4kp_39{right:2rem}._header_cv4kp_43{font-size:1.5rem}._title_cv4kp_47{font-size:1rem;color:#e2e2e2;display:flex;align-items:center;justify-content:space-between}._label_cv4kp_55{display:block;font-size:calc(1rem - 3px);color:#8a8a8a;margin-bottom:.25rem;max-width:max-content}._separator_cv4kp_63{background-color:#ffffff1a}._separator_cv4kp_63._horizontal_cv4kp_66{width:100%;height:1px}._separator_cv4kp_63._vertical_cv4kp_70{width:1px;height:.75em}._panel_cv4kp_75{position:relative;border-radius:8px;background-color:#1a1a1a;padding:1rem}
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as n}from"./vendor-
|
|
2
|
-
//# sourceMappingURL=Empty-
|
|
1
|
+
import{j as n}from"./vendor-DmGkEtRj.js";import{e as o,b3 as i}from"./index-B1K7rED_.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]="5e34981c-83a5-4af3-95d9-4ce18c546fea",e._sentryDebugIdIdentifier="sentry-dbid-5e34981c-83a5-4af3-95d9-4ce18c546fea")}catch{}})();const r="_emptyContainer_xiuvv_17",d="_empty_xiuvv_17",y="_text_xiuvv_26",s={emptyContainer:r,empty:d,text:y};function p({text:e,className:t,injectedStyles:a}){return n.jsxs("div",{className:o([s.emptyContainer,t]),style:a,children:[n.jsx(i,{className:s.empty}),e&&n.jsx("span",{className:s.text,children:e})]})}export{p as E};
|
|
2
|
+
//# sourceMappingURL=Empty-DJMjfXnt.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
% �Z����2Tl!�'.�MM��0p��h���-ufi����p�[{ �/�7�,��1�P}#�X���.�mN�Gg���g}ABY� �nS�������Uc~r����1��Vw��m� {W�݃ɴ!�P$���2� \�}�+
|
|
2
|
+
"���E*v�ԇ�o���?;�G�k5�6�ȧ^����-�%h7�2���ŋDz��p�C��i�RjШj�3��zz/��1�!e�n��{����nH��dd�#�ʘ�;�J��p�<�ot�`ZQ�A��9.�7�c"1u�Z�H/�?�Y_�E���%�vdR���#�?U@j�#������Tz�T�*`�$��6��}]�������k���s��3�ڟ�xy�� �{M�/o���X��`�h�
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Empty-
|
|
1
|
+
{"version":3,"file":"Empty-DJMjfXnt.js","sources":["../../src/common/components/state/Empty.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\n\nimport EmptyImage from '../../../assets/images/empty.svg?react';\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './Empty.module.scss';\n\ninterface EmptyProps {\n text?: string;\n injectedStyles?: CSSProperties;\n className?: string;\n}\n\nexport default function Empty({ text, className, injectedStyles }: EmptyProps) {\n return (\n <div className={cx([style.emptyContainer, className])} style={injectedStyles}>\n <EmptyImage className={style.empty} />\n {text && <span className={style.text}>{text}</span>}\n </div>\n );\n}\n"],"names":["Empty","text","className","injectedStyles","jsxs","cx","style","emptyContainer","jsx","EmptyImage","empty"],"mappings":"iiBAaA,SAAwBA,EAAM,CAAEC,KAAAA,EAAMC,UAAAA,EAAWC,eAAAA,CAA2B,EAAG,CAE3E,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAWC,EAAG,CAACC,EAAMC,eAAgBL,CAAS,CAAC,EAAG,MAAOC,EAC5D,SAAA,CAACK,EAAAA,IAAAC,EAAA,CAAW,UAAWH,EAAMI,KAAM,CAAA,EAClCT,GAASO,EAAAA,IAAA,OAAA,CAAK,UAAWF,EAAML,KAAOA,SAAKA,CAAA,CAAA,CAAA,EAC9C,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as n}from"./vendor-
|
|
2
|
-
//# sourceMappingURL=EmptyPage-
|
|
1
|
+
import{j as n}from"./vendor-DmGkEtRj.js";import{E as s}from"./Empty-DJMjfXnt.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]="69d7b7b6-39fb-426b-829e-7c9bb40c44a4",e._sentryDebugIdIdentifier="sentry-dbid-69d7b7b6-39fb-426b-829e-7c9bb40c44a4")}catch{}})();const b="_page_27rqx_22",d={page:b};function i({text:e,injectedStyles:t}){return n.jsx("div",{className:d.page,children:n.jsx(s,{text:e,injectedStyles:t})})}export{i as E};
|
|
2
|
+
//# sourceMappingURL=EmptyPage-BlXZqoIr.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyPage-
|
|
1
|
+
{"version":3,"file":"EmptyPage-BlXZqoIr.js","sources":["../../src/common/components/state/EmptyPage.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\n\nimport Empty from './Empty';\n\nimport style from './EmptyPage.module.scss';\n\ninterface EmptyPageProps {\n text?: string;\n injectedStyles?: CSSProperties;\n}\n\nexport default function EmptyPage({ text, injectedStyles }: EmptyPageProps) {\n return (\n <div className={style.page}>\n <Empty text={text} injectedStyles={injectedStyles} />\n </div>\n );\n}\n"],"names":["EmptyPage","text","injectedStyles","jsx","style","page","Empty"],"mappings":"+cAWA,SAAwBA,EAAU,CAAEC,KAAAA,EAAMC,eAAAA,CAA+B,EAAG,CAExE,OAAAC,EAAA,IAAC,OAAI,UAAWC,EAAMC,KACpB,SAACF,EAAAA,IAAAG,EAAA,CAAM,KAAAL,EAAY,eAAAC,CAAA,CAA+B,CACpD,CAAA,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e,b0 as l}from"./vendor-
|
|
2
|
-
//# sourceMappingURL=FollowButton-
|
|
1
|
+
import{j as e,b0 as l}from"./vendor-DmGkEtRj.js";import{e as i}from"./index-B1K7rED_.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]="0d5341b7-51cf-4254-b3d4-95bbf4808c9e",o._sentryDebugIdIdentifier="sentry-dbid-0d5341b7-51cf-4254-b3d4-95bbf4808c9e")}catch{}})();const f="_followButton_58wqq_17",b="_hidden_58wqq_38",s={followButton:f,hidden:b};function u(o){const{isVisible:t,onClickHandler:n}=o,d=i([s.followButton,!t&&s.hidden]);return e.jsxs("button",{className:d,onClick:n,type:"button",children:[e.jsx(l,{}),"Follow"]})}export{u as F};
|
|
2
|
+
//# sourceMappingURL=FollowButton-Dy5n1J2c.js.map
|
|
Binary file
|
|
Binary file
|