@getontime/cli 4.4.0 → 4.4.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.
Files changed (376) hide show
  1. package/client/assets/{Backstage-ScLTYJAt.js → Backstage-BY9GL_rk.js} +2 -2
  2. package/client/assets/Backstage-BY9GL_rk.js.br +0 -0
  3. package/client/assets/Backstage-BY9GL_rk.js.gz +0 -0
  4. package/client/assets/{Backstage-ScLTYJAt.js.map → Backstage-BY9GL_rk.js.map} +1 -1
  5. package/client/assets/{Countdown-DA_Lph2k.js → Countdown-CXFgDHND.js} +2 -2
  6. package/client/assets/Countdown-CXFgDHND.js.br +0 -0
  7. package/client/assets/Countdown-CXFgDHND.js.gz +0 -0
  8. package/client/assets/{Countdown-DA_Lph2k.js.map → Countdown-CXFgDHND.js.map} +1 -1
  9. package/client/assets/{CuesheetTable-C7hP6tMi.js → CuesheetTable-BLICUNky.js} +2 -2
  10. package/client/assets/CuesheetTable-BLICUNky.js.br +0 -0
  11. package/client/assets/CuesheetTable-BLICUNky.js.gz +0 -0
  12. package/client/assets/{CuesheetTable-C7hP6tMi.js.map → CuesheetTable-BLICUNky.js.map} +1 -1
  13. package/client/assets/CustomTranslationModal-4PVZBtkC.js +2 -0
  14. package/client/assets/CustomTranslationModal-4PVZBtkC.js.br +0 -0
  15. package/client/assets/CustomTranslationModal-4PVZBtkC.js.gz +0 -0
  16. package/client/assets/{CustomTranslationModal-0ROtCxPC.js.map → CustomTranslationModal-4PVZBtkC.js.map} +1 -1
  17. package/client/assets/DelayIndicator-DUbpd6DG.js +2 -0
  18. package/client/assets/DelayIndicator-DUbpd6DG.js.br +0 -0
  19. package/client/assets/DelayIndicator-DUbpd6DG.js.gz +0 -0
  20. package/client/assets/DelayIndicator-DUbpd6DG.js.map +1 -0
  21. package/client/assets/{EditorFeatureWrapper-B_KH_YqU.js → EditorFeatureWrapper-CV_zaDoG.js} +2 -2
  22. package/client/assets/EditorFeatureWrapper-CV_zaDoG.js.br +0 -0
  23. package/client/assets/EditorFeatureWrapper-CV_zaDoG.js.gz +0 -0
  24. package/client/assets/{EditorFeatureWrapper-B_KH_YqU.js.map → EditorFeatureWrapper-CV_zaDoG.js.map} +1 -1
  25. package/client/assets/{EditorUtils-BxN0w0-D.js → EditorUtils-CLBWDP4k.js} +2 -2
  26. package/client/assets/EditorUtils-CLBWDP4k.js.br +0 -0
  27. package/client/assets/EditorUtils-CLBWDP4k.js.gz +0 -0
  28. package/client/assets/{EditorUtils-BxN0w0-D.js.map → EditorUtils-CLBWDP4k.js.map} +1 -1
  29. package/client/assets/{EmptyPage-CcO33dlE.js → EmptyPage-DmpOAg7R.js} +2 -2
  30. package/client/assets/EmptyPage-DmpOAg7R.js.br +2 -0
  31. package/client/assets/EmptyPage-DmpOAg7R.js.gz +0 -0
  32. package/client/assets/{EmptyPage-CcO33dlE.js.map → EmptyPage-DmpOAg7R.js.map} +1 -1
  33. package/client/assets/{FollowButton-DJCtYYXt.js → FollowButton-CAUWz5Ma.js} +2 -2
  34. package/client/assets/FollowButton-CAUWz5Ma.js.br +0 -0
  35. package/client/assets/FollowButton-CAUWz5Ma.js.gz +0 -0
  36. package/client/assets/{FollowButton-DJCtYYXt.js.map → FollowButton-CAUWz5Ma.js.map} +1 -1
  37. package/client/assets/{MessageControlExport-DGo2ZNMw.js → MessageControlExport-Dm8IjSr4.js} +3 -3
  38. package/client/assets/MessageControlExport-Dm8IjSr4.js.br +0 -0
  39. package/client/assets/MessageControlExport-Dm8IjSr4.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-DGo2ZNMw.js.map → MessageControlExport-Dm8IjSr4.js.map} +1 -1
  41. package/client/assets/{MultiPartProgressBar-IIU35-x9.js → MultiPartProgressBar-Fp-sTN2u.js} +2 -2
  42. package/client/assets/MultiPartProgressBar-Fp-sTN2u.js.br +0 -0
  43. package/client/assets/MultiPartProgressBar-Fp-sTN2u.js.gz +0 -0
  44. package/client/assets/{MultiPartProgressBar-IIU35-x9.js.map → MultiPartProgressBar-Fp-sTN2u.js.map} +1 -1
  45. package/client/assets/{OperatorExport-C-KafSVE.js → OperatorExport-CE4ajLPS.js} +2 -2
  46. package/client/assets/OperatorExport-CE4ajLPS.js.br +0 -0
  47. package/client/assets/OperatorExport-CE4ajLPS.js.gz +0 -0
  48. package/client/assets/{OperatorExport-C-KafSVE.js.map → OperatorExport-CE4ajLPS.js.map} +1 -1
  49. package/client/assets/{OverviewWrapper-B6AeBRb6.js → OverviewWrapper-BNnAIUP1.js} +2 -2
  50. package/client/assets/OverviewWrapper-BNnAIUP1.js.br +0 -0
  51. package/client/assets/OverviewWrapper-BNnAIUP1.js.gz +0 -0
  52. package/client/assets/{OverviewWrapper-B6AeBRb6.js.map → OverviewWrapper-BNnAIUP1.js.map} +1 -1
  53. package/client/assets/{PipHost-BueqKsmJ.js → PipHost-CbNFsfqp.js} +2 -2
  54. package/client/assets/PipHost-CbNFsfqp.js.br +0 -0
  55. package/client/assets/PipHost-CbNFsfqp.js.gz +0 -0
  56. package/client/assets/{PipHost-BueqKsmJ.js.map → PipHost-CbNFsfqp.js.map} +1 -1
  57. package/client/assets/{ProjectInfo-DiD9lzzx.js → ProjectInfo-Bf5z4Xsv.js} +2 -2
  58. package/client/assets/ProjectInfo-Bf5z4Xsv.js.br +0 -0
  59. package/client/assets/ProjectInfo-Bf5z4Xsv.js.gz +0 -0
  60. package/client/assets/{ProjectInfo-DiD9lzzx.js.map → ProjectInfo-Bf5z4Xsv.js.map} +1 -1
  61. package/client/assets/{ProtectRoute-CcDK6JVA.js → ProtectRoute-CCHzyy0I.js} +2 -2
  62. package/client/assets/ProtectRoute-CCHzyy0I.js.br +0 -0
  63. package/client/assets/ProtectRoute-CCHzyy0I.js.gz +0 -0
  64. package/client/assets/{ProtectRoute-CcDK6JVA.js.map → ProtectRoute-CCHzyy0I.js.map} +1 -1
  65. package/client/assets/ProtectedCuesheet-COI1W_V3.js +2 -0
  66. package/client/assets/ProtectedCuesheet-COI1W_V3.js.br +0 -0
  67. package/client/assets/ProtectedCuesheet-COI1W_V3.js.gz +0 -0
  68. package/client/assets/{ProtectedCuesheet-D19INqhI.js.map → ProtectedCuesheet-COI1W_V3.js.map} +1 -1
  69. package/client/assets/ProtectedEditor-BvTFmv-F.js +3 -0
  70. package/client/assets/ProtectedEditor-BvTFmv-F.js.br +0 -0
  71. package/client/assets/ProtectedEditor-BvTFmv-F.js.gz +0 -0
  72. package/client/assets/ProtectedEditor-BvTFmv-F.js.map +1 -0
  73. package/client/assets/RundownExport-C_q3KYN_.js +2 -0
  74. package/client/assets/RundownExport-C_q3KYN_.js.br +0 -0
  75. package/client/assets/RundownExport-C_q3KYN_.js.gz +0 -0
  76. package/client/assets/RundownExport-C_q3KYN_.js.map +1 -0
  77. package/client/assets/RundownExport-CzaSrbaj.css +1 -0
  78. package/client/assets/RundownExport-CzaSrbaj.css.br +0 -0
  79. package/client/assets/RundownExport-CzaSrbaj.css.gz +0 -0
  80. package/client/assets/Select-DQwYPDyI.js +2 -0
  81. package/client/assets/Select-DQwYPDyI.js.br +0 -0
  82. package/client/assets/Select-DQwYPDyI.js.gz +0 -0
  83. package/client/assets/{Select-B3zdv0Ng.js.map → Select-DQwYPDyI.js.map} +1 -1
  84. package/client/assets/{Studio-DS_uXtgn.js → Studio-DzXTmBx4.js} +2 -2
  85. package/client/assets/Studio-DzXTmBx4.js.br +0 -0
  86. package/client/assets/Studio-DzXTmBx4.js.gz +0 -0
  87. package/client/assets/{Studio-DS_uXtgn.js.map → Studio-DzXTmBx4.js.map} +1 -1
  88. package/client/assets/StyleEditor-ClMEMaWh.js +2 -0
  89. package/client/assets/StyleEditor-ClMEMaWh.js.br +0 -0
  90. package/client/assets/StyleEditor-ClMEMaWh.js.gz +0 -0
  91. package/client/assets/{StyleEditor-DcyJgmAF.js.map → StyleEditor-ClMEMaWh.js.map} +1 -1
  92. package/client/assets/{SuperscriptPeriod-DswX2aei.js → SuperscriptPeriod-CBiZU34J.js} +2 -2
  93. package/client/assets/SuperscriptPeriod-CBiZU34J.js.br +0 -0
  94. package/client/assets/SuperscriptPeriod-CBiZU34J.js.gz +0 -0
  95. package/client/assets/{SuperscriptPeriod-DswX2aei.js.map → SuperscriptPeriod-CBiZU34J.js.map} +1 -1
  96. package/client/assets/{SuperscriptTime-COS4JWHJ.js → SuperscriptTime-DP1CDlOX.js} +2 -2
  97. package/client/assets/SuperscriptTime-DP1CDlOX.js.br +0 -0
  98. package/client/assets/SuperscriptTime-DP1CDlOX.js.gz +0 -0
  99. package/client/assets/{SuperscriptTime-COS4JWHJ.js.map → SuperscriptTime-DP1CDlOX.js.map} +1 -1
  100. package/client/assets/SwatchPicker-Dyxkxf3_.js +2 -0
  101. package/client/assets/SwatchPicker-Dyxkxf3_.js.br +0 -0
  102. package/client/assets/SwatchPicker-Dyxkxf3_.js.gz +0 -0
  103. package/client/assets/{SwatchPicker-DPyJv7aS.js.map → SwatchPicker-Dyxkxf3_.js.map} +1 -1
  104. package/client/assets/TimeElements-pDYJeFbV.js +2 -0
  105. package/client/assets/TimeElements-pDYJeFbV.js.br +0 -0
  106. package/client/assets/TimeElements-pDYJeFbV.js.gz +0 -0
  107. package/client/assets/{TimeElements-8rNLGU60.js.map → TimeElements-pDYJeFbV.js.map} +1 -1
  108. package/client/assets/{TimeInput-OX4LMRQl.js → TimeInput-DTWDnaum.js} +2 -2
  109. package/client/assets/TimeInput-DTWDnaum.js.br +0 -0
  110. package/client/assets/TimeInput-DTWDnaum.js.gz +0 -0
  111. package/client/assets/{TimeInput-OX4LMRQl.js.map → TimeInput-DTWDnaum.js.map} +1 -1
  112. package/client/assets/{TimelinePage-7kRpUl6P.js → TimelinePage-DbLt9rQi.js} +2 -2
  113. package/client/assets/TimelinePage-DbLt9rQi.js.br +0 -0
  114. package/client/assets/TimelinePage-DbLt9rQi.js.gz +0 -0
  115. package/client/assets/{TimelinePage-7kRpUl6P.js.map → TimelinePage-DbLt9rQi.js.map} +1 -1
  116. package/client/assets/{Timer-Bg9pVhup.js → Timer-BfyVKQ8U.js} +2 -2
  117. package/client/assets/Timer-BfyVKQ8U.js.br +0 -0
  118. package/client/assets/Timer-BfyVKQ8U.js.gz +0 -0
  119. package/client/assets/{Timer-Bg9pVhup.js.map → Timer-BfyVKQ8U.js.map} +1 -1
  120. package/client/assets/TimerControlExport-BJfhJc07.js +2 -0
  121. package/client/assets/TimerControlExport-BJfhJc07.js.br +0 -0
  122. package/client/assets/TimerControlExport-BJfhJc07.js.gz +0 -0
  123. package/client/assets/{TimerControlExport-BNfZ99Im.js.map → TimerControlExport-BJfhJc07.js.map} +1 -1
  124. package/client/assets/TimerDisplay-Dgmbqf65.js +2 -0
  125. package/client/assets/TimerDisplay-Dgmbqf65.js.br +0 -0
  126. package/client/assets/TimerDisplay-Dgmbqf65.js.gz +0 -0
  127. package/client/assets/{TimerDisplay-DQQ7sMDc.js.map → TimerDisplay-Dgmbqf65.js.map} +1 -1
  128. package/client/assets/{TitleCard-De0WhlN2.js → TitleCard-MUurHeZ7.js} +2 -2
  129. package/client/assets/TitleCard-MUurHeZ7.js.br +0 -0
  130. package/client/assets/TitleCard-MUurHeZ7.js.gz +0 -0
  131. package/client/assets/{TitleCard-De0WhlN2.js.map → TitleCard-MUurHeZ7.js.map} +1 -1
  132. package/client/assets/Tooltip-DXph8P8p.js +2 -0
  133. package/client/assets/Tooltip-DXph8P8p.js.br +0 -0
  134. package/client/assets/Tooltip-DXph8P8p.js.gz +0 -0
  135. package/client/assets/{Tooltip-B4PEP32j.js.map → Tooltip-DXph8P8p.js.map} +1 -1
  136. package/client/assets/{ViewLogo-CHqiH4C0.js → ViewLogo-Ckp7i75x.js} +2 -2
  137. package/client/assets/ViewLogo-Ckp7i75x.js.br +0 -0
  138. package/client/assets/ViewLogo-Ckp7i75x.js.gz +0 -0
  139. package/client/assets/{ViewLogo-CHqiH4C0.js.map → ViewLogo-Ckp7i75x.js.map} +1 -1
  140. package/client/assets/{ViewParamsEditor-BHIK3qtx.js → ViewParamsEditor-Cxngd15h.js} +2 -2
  141. package/client/assets/ViewParamsEditor-Cxngd15h.js.br +0 -0
  142. package/client/assets/ViewParamsEditor-Cxngd15h.js.gz +0 -0
  143. package/client/assets/{ViewParamsEditor-BHIK3qtx.js.map → ViewParamsEditor-Cxngd15h.js.map} +1 -1
  144. package/client/assets/{editorSettings-VcitNPq1.js → editorSettings-D4jfu68W.js} +2 -2
  145. package/client/assets/editorSettings-D4jfu68W.js.br +0 -0
  146. package/client/assets/editorSettings-D4jfu68W.js.gz +0 -0
  147. package/client/assets/{editorSettings-VcitNPq1.js.map → editorSettings-D4jfu68W.js.map} +1 -1
  148. package/client/assets/{getProgress-mRMYlU96.js → getProgress-B9UANc25.js} +2 -2
  149. package/client/assets/getProgress-B9UANc25.js.br +0 -0
  150. package/client/assets/getProgress-B9UANc25.js.gz +0 -0
  151. package/client/assets/{getProgress-mRMYlU96.js.map → getProgress-B9UANc25.js.map} +1 -1
  152. package/client/assets/index-2lQ-45a9.js +3 -0
  153. package/client/assets/index-2lQ-45a9.js.br +0 -0
  154. package/client/assets/index-2lQ-45a9.js.gz +0 -0
  155. package/client/assets/index-2lQ-45a9.js.map +1 -0
  156. package/client/assets/{offset-Bs6CY1IK.js → offset-DAyBfv5b.js} +2 -2
  157. package/client/assets/offset-DAyBfv5b.js.br +4 -0
  158. package/client/assets/offset-DAyBfv5b.js.gz +0 -0
  159. package/client/assets/{offset-Bs6CY1IK.js.map → offset-DAyBfv5b.js.map} +1 -1
  160. package/client/assets/{parseUserTime-CI7s8pYc.js → parseUserTime-WkVNjkkE.js} +2 -2
  161. package/client/assets/parseUserTime-WkVNjkkE.js.br +0 -0
  162. package/client/assets/parseUserTime-WkVNjkkE.js.gz +0 -0
  163. package/client/assets/{parseUserTime-CI7s8pYc.js.map → parseUserTime-WkVNjkkE.js.map} +1 -1
  164. package/client/assets/{playbackstate-DisgQbHM.js → playbackstate-znZk3SSJ.js} +2 -2
  165. package/client/assets/playbackstate-znZk3SSJ.js.br +0 -0
  166. package/client/assets/playbackstate-znZk3SSJ.js.gz +0 -0
  167. package/client/assets/{playbackstate-DisgQbHM.js.map → playbackstate-znZk3SSJ.js.map} +1 -1
  168. package/client/assets/{presentation.utils-Bv3PuMWv.js → presentation.utils-CjjYs5II.js} +2 -2
  169. package/client/assets/presentation.utils-CjjYs5II.js.br +0 -0
  170. package/client/assets/presentation.utils-CjjYs5II.js.gz +0 -0
  171. package/client/assets/{presentation.utils-Bv3PuMWv.js.map → presentation.utils-CjjYs5II.js.map} +1 -1
  172. package/client/assets/rundownUtils-BTQ3EeqN.js +2 -0
  173. package/client/assets/rundownUtils-BTQ3EeqN.js.br +0 -0
  174. package/client/assets/rundownUtils-BTQ3EeqN.js.gz +0 -0
  175. package/client/assets/rundownUtils-BTQ3EeqN.js.map +1 -0
  176. package/client/assets/{timer.utils-P25ngopd.js → timer.utils-B-Ui91P7.js} +2 -2
  177. package/client/assets/timer.utils-B-Ui91P7.js.br +0 -0
  178. package/client/assets/timer.utils-B-Ui91P7.js.gz +0 -0
  179. package/client/assets/{timer.utils-P25ngopd.js.map → timer.utils-B-Ui91P7.js.map} +1 -1
  180. package/client/assets/useCustomFields-zr9SUl5o.js +2 -0
  181. package/client/assets/useCustomFields-zr9SUl5o.js.br +0 -0
  182. package/client/assets/useCustomFields-zr9SUl5o.js.gz +0 -0
  183. package/client/assets/useCustomFields-zr9SUl5o.js.map +1 -0
  184. package/client/assets/useEventSelection-B9mbj1cM.js +2 -0
  185. package/client/assets/useEventSelection-B9mbj1cM.js.br +0 -0
  186. package/client/assets/useEventSelection-B9mbj1cM.js.gz +0 -0
  187. package/client/assets/useEventSelection-B9mbj1cM.js.map +1 -0
  188. package/client/assets/useProjectData-DD_BQ9eJ.js +2 -0
  189. package/client/assets/useProjectData-DD_BQ9eJ.js.br +0 -0
  190. package/client/assets/useProjectData-DD_BQ9eJ.js.gz +0 -0
  191. package/client/assets/useProjectData-DD_BQ9eJ.js.map +1 -0
  192. package/client/assets/useReport-DozG5uz5.js +2 -0
  193. package/client/assets/useReport-DozG5uz5.js.br +0 -0
  194. package/client/assets/useReport-DozG5uz5.js.gz +0 -0
  195. package/client/assets/useReport-DozG5uz5.js.map +1 -0
  196. package/client/assets/useRundown-D6vokFHi.js +2 -0
  197. package/client/assets/useRundown-D6vokFHi.js.br +0 -0
  198. package/client/assets/useRundown-D6vokFHi.js.gz +0 -0
  199. package/client/assets/useRundown-D6vokFHi.js.map +1 -0
  200. package/client/assets/{useSelectAndRevealEntry-CzSIOtzH.js → useSelectAndRevealEntry-Dd6MpVHe.js} +2 -2
  201. package/client/assets/useSelectAndRevealEntry-Dd6MpVHe.js.br +0 -0
  202. package/client/assets/useSelectAndRevealEntry-Dd6MpVHe.js.gz +0 -0
  203. package/client/assets/{useSelectAndRevealEntry-CzSIOtzH.js.map → useSelectAndRevealEntry-Dd6MpVHe.js.map} +1 -1
  204. package/client/assets/{useWindowTitle-Cl1AVD9_.js → useWindowTitle-bg-fLPOk.js} +2 -2
  205. package/client/assets/useWindowTitle-bg-fLPOk.js.br +0 -0
  206. package/client/assets/useWindowTitle-bg-fLPOk.js.gz +0 -0
  207. package/client/assets/{useWindowTitle-Cl1AVD9_.js.map → useWindowTitle-bg-fLPOk.js.map} +1 -1
  208. package/client/assets/validateEvent-BUgLWn7x.js +2 -0
  209. package/client/assets/validateEvent-BUgLWn7x.js.br +0 -0
  210. package/client/assets/validateEvent-BUgLWn7x.js.gz +0 -0
  211. package/client/assets/{validateEvent-DhFtLvz_.js.map → validateEvent-BUgLWn7x.js.map} +1 -1
  212. package/client/assets/{vendor-dQa48psh.js → vendor-CKDP5hij.js} +12 -12
  213. package/client/assets/vendor-CKDP5hij.js.br +0 -0
  214. package/client/assets/vendor-CKDP5hij.js.gz +0 -0
  215. package/client/assets/{vendor-dQa48psh.js.map → vendor-CKDP5hij.js.map} +1 -1
  216. package/client/assets/{viewLoader.utils-ndDejZHN.js → viewLoader.utils-Bn5zu5sz.js} +2 -2
  217. package/client/assets/viewLoader.utils-Bn5zu5sz.js.br +0 -0
  218. package/client/assets/viewLoader.utils-Bn5zu5sz.js.gz +0 -0
  219. package/client/assets/{viewLoader.utils-ndDejZHN.js.map → viewLoader.utils-Bn5zu5sz.js.map} +1 -1
  220. package/client/assets/{viewUtils-rcOl1-o8.js → viewUtils-DQFwr7hm.js} +2 -2
  221. package/client/assets/viewUtils-DQFwr7hm.js.br +0 -0
  222. package/client/assets/viewUtils-DQFwr7hm.js.gz +0 -0
  223. package/client/assets/{viewUtils-rcOl1-o8.js.map → viewUtils-DQFwr7hm.js.map} +1 -1
  224. package/client/index.html +2 -2
  225. package/package.json +1 -1
  226. package/server/index.cjs +87 -87
  227. package/client/assets/Backstage-ScLTYJAt.js.br +0 -0
  228. package/client/assets/Backstage-ScLTYJAt.js.gz +0 -0
  229. package/client/assets/Countdown-DA_Lph2k.js.br +0 -0
  230. package/client/assets/Countdown-DA_Lph2k.js.gz +0 -0
  231. package/client/assets/CuesheetTable-C7hP6tMi.js.br +0 -0
  232. package/client/assets/CuesheetTable-C7hP6tMi.js.gz +0 -0
  233. package/client/assets/CustomTranslationModal-0ROtCxPC.js +0 -2
  234. package/client/assets/CustomTranslationModal-0ROtCxPC.js.br +0 -0
  235. package/client/assets/CustomTranslationModal-0ROtCxPC.js.gz +0 -0
  236. package/client/assets/DelayIndicator-OEjcqoIx.js +0 -2
  237. package/client/assets/DelayIndicator-OEjcqoIx.js.br +0 -0
  238. package/client/assets/DelayIndicator-OEjcqoIx.js.gz +0 -0
  239. package/client/assets/DelayIndicator-OEjcqoIx.js.map +0 -1
  240. package/client/assets/EditorFeatureWrapper-B_KH_YqU.js.br +0 -0
  241. package/client/assets/EditorFeatureWrapper-B_KH_YqU.js.gz +0 -0
  242. package/client/assets/EditorUtils-BxN0w0-D.js.br +0 -0
  243. package/client/assets/EditorUtils-BxN0w0-D.js.gz +0 -0
  244. package/client/assets/EmptyPage-CcO33dlE.js.br +0 -0
  245. package/client/assets/EmptyPage-CcO33dlE.js.gz +0 -0
  246. package/client/assets/FollowButton-DJCtYYXt.js.br +0 -0
  247. package/client/assets/FollowButton-DJCtYYXt.js.gz +0 -0
  248. package/client/assets/MessageControlExport-DGo2ZNMw.js.br +0 -0
  249. package/client/assets/MessageControlExport-DGo2ZNMw.js.gz +0 -0
  250. package/client/assets/MultiPartProgressBar-IIU35-x9.js.br +0 -0
  251. package/client/assets/MultiPartProgressBar-IIU35-x9.js.gz +0 -0
  252. package/client/assets/OperatorExport-C-KafSVE.js.br +0 -0
  253. package/client/assets/OperatorExport-C-KafSVE.js.gz +0 -0
  254. package/client/assets/OverviewWrapper-B6AeBRb6.js.br +0 -0
  255. package/client/assets/OverviewWrapper-B6AeBRb6.js.gz +0 -0
  256. package/client/assets/PipHost-BueqKsmJ.js.br +0 -0
  257. package/client/assets/PipHost-BueqKsmJ.js.gz +0 -0
  258. package/client/assets/ProjectInfo-DiD9lzzx.js.br +0 -0
  259. package/client/assets/ProjectInfo-DiD9lzzx.js.gz +0 -0
  260. package/client/assets/ProtectRoute-CcDK6JVA.js.br +0 -0
  261. package/client/assets/ProtectRoute-CcDK6JVA.js.gz +0 -0
  262. package/client/assets/ProtectedCuesheet-D19INqhI.js +0 -2
  263. package/client/assets/ProtectedCuesheet-D19INqhI.js.br +0 -0
  264. package/client/assets/ProtectedCuesheet-D19INqhI.js.gz +0 -0
  265. package/client/assets/ProtectedEditor-BVabJfIz.js +0 -3
  266. package/client/assets/ProtectedEditor-BVabJfIz.js.br +0 -0
  267. package/client/assets/ProtectedEditor-BVabJfIz.js.gz +0 -0
  268. package/client/assets/ProtectedEditor-BVabJfIz.js.map +0 -1
  269. package/client/assets/RundownEntry-C5kdIHbb.js +0 -2
  270. package/client/assets/RundownEntry-C5kdIHbb.js.br +0 -0
  271. package/client/assets/RundownEntry-C5kdIHbb.js.gz +0 -0
  272. package/client/assets/RundownEntry-C5kdIHbb.js.map +0 -1
  273. package/client/assets/RundownEntry-jE09YkV2.css +0 -1
  274. package/client/assets/RundownEntry-jE09YkV2.css.br +0 -0
  275. package/client/assets/RundownEntry-jE09YkV2.css.gz +0 -0
  276. package/client/assets/RundownExport-BFn7H24P.css +0 -1
  277. package/client/assets/RundownExport-BFn7H24P.css.br +0 -0
  278. package/client/assets/RundownExport-BFn7H24P.css.gz +0 -0
  279. package/client/assets/RundownExport-DhzzqPCD.js +0 -3
  280. package/client/assets/RundownExport-DhzzqPCD.js.br +0 -0
  281. package/client/assets/RundownExport-DhzzqPCD.js.gz +0 -0
  282. package/client/assets/RundownExport-DhzzqPCD.js.map +0 -1
  283. package/client/assets/Select-B3zdv0Ng.js +0 -2
  284. package/client/assets/Select-B3zdv0Ng.js.br +0 -0
  285. package/client/assets/Select-B3zdv0Ng.js.gz +0 -0
  286. package/client/assets/Studio-DS_uXtgn.js.br +0 -0
  287. package/client/assets/Studio-DS_uXtgn.js.gz +0 -0
  288. package/client/assets/StyleEditor-DcyJgmAF.js +0 -2
  289. package/client/assets/StyleEditor-DcyJgmAF.js.br +0 -0
  290. package/client/assets/StyleEditor-DcyJgmAF.js.gz +0 -0
  291. package/client/assets/SuperscriptPeriod-DswX2aei.js.br +0 -0
  292. package/client/assets/SuperscriptPeriod-DswX2aei.js.gz +0 -0
  293. package/client/assets/SuperscriptTime-COS4JWHJ.js.br +0 -0
  294. package/client/assets/SuperscriptTime-COS4JWHJ.js.gz +0 -0
  295. package/client/assets/SwatchPicker-DPyJv7aS.js +0 -2
  296. package/client/assets/SwatchPicker-DPyJv7aS.js.br +0 -0
  297. package/client/assets/SwatchPicker-DPyJv7aS.js.gz +0 -0
  298. package/client/assets/TimeElements-8rNLGU60.js +0 -2
  299. package/client/assets/TimeElements-8rNLGU60.js.br +0 -0
  300. package/client/assets/TimeElements-8rNLGU60.js.gz +0 -0
  301. package/client/assets/TimeInput-OX4LMRQl.js.br +0 -0
  302. package/client/assets/TimeInput-OX4LMRQl.js.gz +0 -0
  303. package/client/assets/TimelinePage-7kRpUl6P.js.br +0 -0
  304. package/client/assets/TimelinePage-7kRpUl6P.js.gz +0 -0
  305. package/client/assets/Timer-Bg9pVhup.js.br +0 -0
  306. package/client/assets/Timer-Bg9pVhup.js.gz +0 -0
  307. package/client/assets/TimerControlExport-BNfZ99Im.js +0 -2
  308. package/client/assets/TimerControlExport-BNfZ99Im.js.br +0 -0
  309. package/client/assets/TimerControlExport-BNfZ99Im.js.gz +0 -0
  310. package/client/assets/TimerDisplay-DQQ7sMDc.js +0 -2
  311. package/client/assets/TimerDisplay-DQQ7sMDc.js.br +0 -0
  312. package/client/assets/TimerDisplay-DQQ7sMDc.js.gz +0 -0
  313. package/client/assets/TitleCard-De0WhlN2.js.br +0 -0
  314. package/client/assets/TitleCard-De0WhlN2.js.gz +0 -0
  315. package/client/assets/Tooltip-B4PEP32j.js +0 -2
  316. package/client/assets/Tooltip-B4PEP32j.js.br +0 -0
  317. package/client/assets/Tooltip-B4PEP32j.js.gz +0 -0
  318. package/client/assets/ViewLogo-CHqiH4C0.js.br +0 -0
  319. package/client/assets/ViewLogo-CHqiH4C0.js.gz +0 -0
  320. package/client/assets/ViewParamsEditor-BHIK3qtx.js.br +0 -0
  321. package/client/assets/ViewParamsEditor-BHIK3qtx.js.gz +0 -0
  322. package/client/assets/editorSettings-VcitNPq1.js.br +0 -0
  323. package/client/assets/editorSettings-VcitNPq1.js.gz +0 -0
  324. package/client/assets/getProgress-mRMYlU96.js.br +0 -0
  325. package/client/assets/getProgress-mRMYlU96.js.gz +0 -0
  326. package/client/assets/index-DYkg-xOk.js +0 -3
  327. package/client/assets/index-DYkg-xOk.js.br +0 -0
  328. package/client/assets/index-DYkg-xOk.js.gz +0 -0
  329. package/client/assets/index-DYkg-xOk.js.map +0 -1
  330. package/client/assets/offset-Bs6CY1IK.js.br +0 -3
  331. package/client/assets/offset-Bs6CY1IK.js.gz +0 -0
  332. package/client/assets/parseUserTime-CI7s8pYc.js.br +0 -0
  333. package/client/assets/parseUserTime-CI7s8pYc.js.gz +0 -0
  334. package/client/assets/playbackstate-DisgQbHM.js.br +0 -0
  335. package/client/assets/playbackstate-DisgQbHM.js.gz +0 -0
  336. package/client/assets/presentation.utils-Bv3PuMWv.js.br +0 -0
  337. package/client/assets/presentation.utils-Bv3PuMWv.js.gz +0 -0
  338. package/client/assets/rundownUtils-CJxEqFha.js +0 -2
  339. package/client/assets/rundownUtils-CJxEqFha.js.br +0 -0
  340. package/client/assets/rundownUtils-CJxEqFha.js.gz +0 -0
  341. package/client/assets/rundownUtils-CJxEqFha.js.map +0 -1
  342. package/client/assets/timer.utils-P25ngopd.js.br +0 -0
  343. package/client/assets/timer.utils-P25ngopd.js.gz +0 -0
  344. package/client/assets/useCustomFields-DUYgd-E7.js +0 -2
  345. package/client/assets/useCustomFields-DUYgd-E7.js.br +0 -0
  346. package/client/assets/useCustomFields-DUYgd-E7.js.gz +0 -0
  347. package/client/assets/useCustomFields-DUYgd-E7.js.map +0 -1
  348. package/client/assets/useEventSelection-R7JdgAzy.js +0 -2
  349. package/client/assets/useEventSelection-R7JdgAzy.js.br +0 -0
  350. package/client/assets/useEventSelection-R7JdgAzy.js.gz +0 -0
  351. package/client/assets/useEventSelection-R7JdgAzy.js.map +0 -1
  352. package/client/assets/useProjectData-DdITd09M.js +0 -2
  353. package/client/assets/useProjectData-DdITd09M.js.br +0 -0
  354. package/client/assets/useProjectData-DdITd09M.js.gz +0 -0
  355. package/client/assets/useProjectData-DdITd09M.js.map +0 -1
  356. package/client/assets/useReport-CR0k0b85.js +0 -2
  357. package/client/assets/useReport-CR0k0b85.js.br +0 -0
  358. package/client/assets/useReport-CR0k0b85.js.gz +0 -0
  359. package/client/assets/useReport-CR0k0b85.js.map +0 -1
  360. package/client/assets/useRundown-CR9Ah1Fa.js +0 -2
  361. package/client/assets/useRundown-CR9Ah1Fa.js.br +0 -0
  362. package/client/assets/useRundown-CR9Ah1Fa.js.gz +0 -0
  363. package/client/assets/useRundown-CR9Ah1Fa.js.map +0 -1
  364. package/client/assets/useSelectAndRevealEntry-CzSIOtzH.js.br +0 -0
  365. package/client/assets/useSelectAndRevealEntry-CzSIOtzH.js.gz +0 -0
  366. package/client/assets/useWindowTitle-Cl1AVD9_.js.br +0 -0
  367. package/client/assets/useWindowTitle-Cl1AVD9_.js.gz +0 -0
  368. package/client/assets/validateEvent-DhFtLvz_.js +0 -2
  369. package/client/assets/validateEvent-DhFtLvz_.js.br +0 -0
  370. package/client/assets/validateEvent-DhFtLvz_.js.gz +0 -0
  371. package/client/assets/vendor-dQa48psh.js.br +0 -0
  372. package/client/assets/vendor-dQa48psh.js.gz +0 -0
  373. package/client/assets/viewLoader.utils-ndDejZHN.js.br +0 -0
  374. package/client/assets/viewLoader.utils-ndDejZHN.js.gz +0 -0
  375. package/client/assets/viewUtils-rcOl1-o8.js.br +0 -0
  376. package/client/assets/viewUtils-rcOl1-o8.js.gz +0 -0
@@ -1,2 +1,2 @@
1
- import{j as e,l as K,h as d,o as ne,ab as ae}from"./vendor-dQa48psh.js";import{e as c,q as ie,w as re,f as x,P as oe,h as $,x as A,y as ce,u as le,b as de,L as ue,d as U,z as me,m as he,r as fe,g as xe,O as pe,v as ve,A as ge}from"./index-DYkg-xOk.js";import{g as ye}from"./getProgress-mRMYlU96.js";import{E as _e,a as je}from"./EmptyPage-CcO33dlE.js";import{T as W}from"./TitleCard-De0WhlN2.js";import{V as Ne}from"./ViewLogo-CHqiH4C0.js";import{O as L,m as R,a as be,V as we}from"./ViewParamsEditor-BHIK3qtx.js";import{u as Se}from"./useWindowTitle-Cl1AVD9_.js";import{i as q,c as Ee,d as ke}from"./useRundown-CR9Ah1Fa.js";import{i as G,b as H}from"./viewUtils-rcOl1-o8.js";import{g as Pe}from"./offset-Bs6CY1IK.js";import{S as w}from"./SuperscriptPeriod-DswX2aei.js";import{S as F}from"./SuperscriptTime-COS4JWHJ.js";import{g as Ie,a as Te}from"./viewLoader.utils-ndDejZHN.js";import{u as Oe}from"./useCustomFields-DUYgd-E7.js";import{u as Ce}from"./useProjectData-DdITd09M.js";import"./SwatchPicker-DPyJv7aS.js";import"./Select-B3zdv0Ng.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]="64c49b4c-b04f-453b-af3b-c1af84b1b719",t._sentryDebugIdIdentifier="sentry-dbid-64c49b4c-b04f-453b-af3b-c1af84b1b719")}catch{}})();function Fe(t){const{current:s,duration:n,className:a}=t,i=ye(s,n);return e.jsx("div",{className:`progress-bar__bg ${a}`,children:e.jsx("div",{className:"progress-bar__indicator",style:{width:`${i}%`}})})}const Ve=t=>({title:L.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 Be(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 d.useMemo(()=>Be(t),[t])}const J=d.createContext(void 0),He=({children:t,selectedEventId:s})=>{const{cycleInterval:n,stopCycle:a,filter:i}=Z(),r=d.useCallback(l=>{if(i){const P=i.startsWith("custom-")?i.slice(7):i;return q(l)&&!!l.custom[P]}return q(l)},[i]),{data:o}=Ee(r),[m,h]=d.useState(-1),[p,g]=d.useState(0),[v,j]=d.useState(0),f=d.useRef(-1),S=d.useRef(void 0),N=d.useRef(null);d.useLayoutEffect(()=>{if(!N.current)return;const l=Array.from(N.current.children);if(l.length===0)return;const P=N.current.clientHeight;let E=0,B=1,I=1,T=-1,y=!1;for(let u=0;u<l.length;u++){const _=l[u].clientHeight,C=E+_>P;C&&(E=0,I+=1),u<m?O(l[u]):T===-1?(y=!0,B=I):C&&(y=!1),y?(T=u,M(l[u],E)):O(l[u]),E+=_}j(B),g(I),f.current=T;function M(u,_){u.style.top=`${_}px`}function O(u){u.style.top="-1000px"}},[m,o]),d.useEffect(()=>{if(a){j(1),h(0);return}S.current&&clearInterval(S.current);const l=setInterval(()=>{h(v===p?0:f.current+1)},n*1e3);return S.current=l,()=>clearInterval(S.current)},[n,p,a,v]);let V=o.findIndex(l=>l.id===s);const b=o.slice(V+1);return V=0,e.jsx(J,{value:{events:b,selectedEventId:s,numPages:p,visiblePage:v,containerRef:N},children:t})},X=()=>{const t=d.use(J);if(!t)throw new Error("useSchedule() can only be used inside a ScheduleContext");return t},k={format12:"h:mm a",format24:"HH:mm"};function Le({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:o,duration:m,skip:h,title:p,timeEnd:g,cue:v}){const{showExpected:j}=Z();return e.jsxs("li",{className:c(["entry",h&&"entry--skip"]),"data-testid":v,children:[e.jsx("div",{className:"entry-times",children:j?e.jsx($e,{timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:m,colour:o}):n>0?e.jsx(Re,{timeStart:t,delay:n,colour:o,timeEnd:g}):e.jsx(Me,{timeStart:t,timeEnd:g,colour:o})}),e.jsx("div",{className:"entry-title",children:p})]})}function Me({timeStart:t,timeEnd:s,colour:n}){const a=x(t,k),i=x(s,k);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 Re({timeStart:t,timeEnd:s,colour:n,delay:a}){const i=x(t,k),r=x(s,k),o=x(t+a,k),m=x(s+a,k);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:o}),"→",e.jsx(w,{time:m})]})]})}function $e({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:o,duration:m}){const h=ie(),{expectedStart:p,expectedEnd:g,plannedEnd:v}=re({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:m},h);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:o}}),e.jsx(Q,{expectedTime:p,plannedTime:t}),"→",e.jsx(Q,{expectedTime:g,plannedTime:v})]})}function Q({expectedTime:t,plannedTime:s}){const n=x(t),a=Pe(t-s);return e.jsx(w,{className:`entry-times--${a}`,time:n})}function ze({className:t}){const{events:s,containerRef:n}=X();return(s==null?void 0:s.length)<1?null:e.jsx("ul",{className:c(["schedule",t]),ref:n,children:s.map(a=>e.jsx(Le,{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 De({className:t}){const{numPages:s,visiblePage:n}=X();return s>10?e.jsxs("div",{className:c(["schedule-nav",t]),children:[e.jsx("div",{className:c(["schedule-nav__item",n===1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===5&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item","schedule-nav__item--indeterminate",n>5&&n<s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s-3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s-2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s-1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s&&"schedule-nav__item--selected"])})]}):e.jsx("div",{className:c(["schedule-nav",t]),children:s>1&&[...Array(s).keys()].map(a=>e.jsx("div",{className:c(["schedule-nav__item",a+1===n&&"schedule-nav__item--selected"])},a))})}const Ae=d.memo(We);function We(t){const{selectedId:s}=t;return e.jsxs(He,{selectedEventId:s,children:[e.jsx(De,{className:"schedule-nav-container"}),e.jsx(ze,{className:"schedule-container"})]})}const qe=(t,s,n)=>{const a=R(s,[{value:"none",label:"None"}]),i=R(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]),r=be(n,[{value:"none",label:"None"}]),o=R(s,[{value:"title",label:"Title"}]);return[{title:L.ClockOptions,collapsible:!0,options:[Ie(t)]},{title:L.DataSources,collapsible:!0,options:[{id:"main",title:"Main text",description:"Select the data source for the main text",type:"option",values:o,defaultValue:"title"},{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"}]},Ve(a),{title:L.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 Ge(t,s){const n=a=>(s==null?void 0:s.get(a))??t.get(a);return{mainSource:n("main"),secondarySource:n("secondary-src"),extraInfo:n("extra-info")}}function Qe(){const[t]=K(),s=d.use(oe);return d.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return Ge(t,a)},[s,t])}function Ke(t){return(t??0)<0}function Ue(t){return t!==$.Stop}function Ze(t,s){return t===$.Roll&&s===ce.Pending}function Je(t,s,n,a,i){if(i===$.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const r=H(t,n??"title")||A,o=H(t,a),m=H(s,n??"title")||A,h=H(s,a);return{showNow:t!==null,nowMain:r,nowSecondary:o,showNext:s!==null,nextMain:m,nextSecondary:h}}function Xe(){const t=le(p=>p.mirror),{data:s,status:n}=ke(),{data:a,status:i}=Ce(),{data:r,status:o}=de(),{data:m,status:h}=Oe();return{data:{events:s,customFields:m,projectData:a,isMirrored:t,settings:r},status:Te([n,i,o,h])}}function jt(){const{data:t,status:s}=Xe();return Se("Backstage"),s==="pending"?e.jsx(ue,{}):s==="error"?e.jsx(_e,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Ye,{...t})}function Ye({events:t,customFields:s,projectData:n,isMirrored:a,settings:i}){const{getLocalizedString:r}=U(),{mainSource:o,secondarySource:m,extraInfo:h}=Qe(),{eventNext:p,eventNow:g,rundown:v,selectedEventId:j,time:f}=me(),[S,N]=d.useState(!1),{height:V}=ne();d.useEffect(()=>{N(!1);const se=setTimeout(()=>{N(!0)},10);return()=>clearTimeout(se)},[j]);const b=t.length>0,{showNow:l,nowMain:P,nowSecondary:E,showNext:B,nextMain:I,nextSecondary:T}=Je(g,p,o,m,f.playback),y=Ze(f.playback,f.phase),M=y?x(f.secondaryTimer):x(f.startedAt),O=(()=>{if(!l&&b)return x(v.plannedStart,{format12:"h:mm a",format24:"HH:mm"})})(),u=(()=>{if(!l&&b)return x(v.plannedEnd,{format12:"h:mm a",format24:"HH:mm"})})();let _=he(f.current,{fallback:ge});_=fe(_);const C=Math.max(window.innerWidth/15,72),Y=Ue(f.playback),z=b&&V>420,ee=O&&u,D=xe(i==null?void 0:i.timeFormat),te=d.useMemo(()=>qe(D,s,n),[D,s,n]);return e.jsxs("div",{className:`backstage ${a?"mirror":""}`,"data-testid":"backstage-view",children:[e.jsx(we,{target:pe.Backstage,viewOptions:te}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(Ne,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(tt,{})]}),Y&&e.jsx(Fe,{className:"progress-container",current:f.current,duration:f.duration}),!b&&e.jsx(je,{text:r("common.no_data"),className:"empty-container"}),e.jsxs("div",{className:"card-container",children:[l&&e.jsxs("div",{className:c(["event","now",S&&"blink"]),children:[e.jsx(W,{title:P,secondary:E}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:c(["time-entry__label",y&&"time-entry--pending"]),children:r(y?"countdown.waiting":"common.started_at")}),e.jsx(F,{time:M,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")}),Ke(f.current)?e.jsx("div",{className:"time-entry__value",children:r("countdown.overtime")}):e.jsx(F,{time:x(f.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:_})]})]})]}),ee&&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:c(["time-entry__label",y&&"time-entry--pending"]),children:r("common.scheduled_start")}),e.jsx(F,{time:O,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(F,{time:u,className:"time-entry__value"})]})]})]}),B&&b&&e.jsx(W,{className:"event",label:"next",title:I,secondary:T})]}),z&&e.jsx(Ae,{selectedId:j}),e.jsxs("div",{className:c(["info",!z&&"info--stretch"]),children:[h&&e.jsx(et,{projectData:n,size:C,source:h}),e.jsxs("div",{className:"info-card",children:[n.url&&e.jsx(ae,{value:n.url,size:C,level:"L",className:"info-card__qr"}),n.info&&e.jsx("div",{className:"info-card__message",children:n.info})]})]})]})}function et({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 tt(){const{getLocalizedString:t}=U(),s=ve(),n=x(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(F,{time:n,className:"time"})]})}export{jt as default};
2
- //# sourceMappingURL=Backstage-ScLTYJAt.js.map
1
+ import{j as e,l as K,h as d,o as ne,ab as ae}from"./vendor-CKDP5hij.js";import{e as c,q as ie,w as re,f as x,P as oe,h as $,x as A,y as ce,u as le,b as de,L as ue,d as U,z as me,m as he,r as fe,g as xe,O as pe,v as ve,A as ge}from"./index-2lQ-45a9.js";import{g as ye}from"./getProgress-B9UANc25.js";import{E as _e,a as je}from"./EmptyPage-DmpOAg7R.js";import{T as W}from"./TitleCard-MUurHeZ7.js";import{V as Ne}from"./ViewLogo-Ckp7i75x.js";import{O as L,m as R,a as be,V as we}from"./ViewParamsEditor-Cxngd15h.js";import{u as Se}from"./useWindowTitle-bg-fLPOk.js";import{i as q,c as Ee,d as ke}from"./useRundown-D6vokFHi.js";import{i as G,b as H}from"./viewUtils-DQFwr7hm.js";import{g as Pe}from"./offset-DAyBfv5b.js";import{S as w}from"./SuperscriptPeriod-CBiZU34J.js";import{S as F}from"./SuperscriptTime-DP1CDlOX.js";import{g as Ie,a as Te}from"./viewLoader.utils-Bn5zu5sz.js";import{u as Oe}from"./useCustomFields-zr9SUl5o.js";import{u as Ce}from"./useProjectData-DD_BQ9eJ.js";import"./SwatchPicker-Dyxkxf3_.js";import"./Select-DQwYPDyI.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]="64c49b4c-b04f-453b-af3b-c1af84b1b719",t._sentryDebugIdIdentifier="sentry-dbid-64c49b4c-b04f-453b-af3b-c1af84b1b719")}catch{}})();function Fe(t){const{current:s,duration:n,className:a}=t,i=ye(s,n);return e.jsx("div",{className:`progress-bar__bg ${a}`,children:e.jsx("div",{className:"progress-bar__indicator",style:{width:`${i}%`}})})}const Ve=t=>({title:L.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 Be(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 d.useMemo(()=>Be(t),[t])}const J=d.createContext(void 0),He=({children:t,selectedEventId:s})=>{const{cycleInterval:n,stopCycle:a,filter:i}=Z(),r=d.useCallback(l=>{if(i){const P=i.startsWith("custom-")?i.slice(7):i;return q(l)&&!!l.custom[P]}return q(l)},[i]),{data:o}=Ee(r),[m,h]=d.useState(-1),[p,g]=d.useState(0),[v,j]=d.useState(0),f=d.useRef(-1),S=d.useRef(void 0),N=d.useRef(null);d.useLayoutEffect(()=>{if(!N.current)return;const l=Array.from(N.current.children);if(l.length===0)return;const P=N.current.clientHeight;let E=0,B=1,I=1,T=-1,y=!1;for(let u=0;u<l.length;u++){const _=l[u].clientHeight,C=E+_>P;C&&(E=0,I+=1),u<m?O(l[u]):T===-1?(y=!0,B=I):C&&(y=!1),y?(T=u,M(l[u],E)):O(l[u]),E+=_}j(B),g(I),f.current=T;function M(u,_){u.style.top=`${_}px`}function O(u){u.style.top="-1000px"}},[m,o]),d.useEffect(()=>{if(a){j(1),h(0);return}S.current&&clearInterval(S.current);const l=setInterval(()=>{h(v===p?0:f.current+1)},n*1e3);return S.current=l,()=>clearInterval(S.current)},[n,p,a,v]);let V=o.findIndex(l=>l.id===s);const b=o.slice(V+1);return V=0,e.jsx(J,{value:{events:b,selectedEventId:s,numPages:p,visiblePage:v,containerRef:N},children:t})},X=()=>{const t=d.use(J);if(!t)throw new Error("useSchedule() can only be used inside a ScheduleContext");return t},k={format12:"h:mm a",format24:"HH:mm"};function Le({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:o,duration:m,skip:h,title:p,timeEnd:g,cue:v}){const{showExpected:j}=Z();return e.jsxs("li",{className:c(["entry",h&&"entry--skip"]),"data-testid":v,children:[e.jsx("div",{className:"entry-times",children:j?e.jsx($e,{timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:m,colour:o}):n>0?e.jsx(Re,{timeStart:t,delay:n,colour:o,timeEnd:g}):e.jsx(Me,{timeStart:t,timeEnd:g,colour:o})}),e.jsx("div",{className:"entry-title",children:p})]})}function Me({timeStart:t,timeEnd:s,colour:n}){const a=x(t,k),i=x(s,k);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 Re({timeStart:t,timeEnd:s,colour:n,delay:a}){const i=x(t,k),r=x(s,k),o=x(t+a,k),m=x(s+a,k);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:o}),"→",e.jsx(w,{time:m})]})]})}function $e({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:o,duration:m}){const h=ie(),{expectedStart:p,expectedEnd:g,plannedEnd:v}=re({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:m},h);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:o}}),e.jsx(Q,{expectedTime:p,plannedTime:t}),"→",e.jsx(Q,{expectedTime:g,plannedTime:v})]})}function Q({expectedTime:t,plannedTime:s}){const n=x(t),a=Pe(t-s);return e.jsx(w,{className:`entry-times--${a}`,time:n})}function ze({className:t}){const{events:s,containerRef:n}=X();return(s==null?void 0:s.length)<1?null:e.jsx("ul",{className:c(["schedule",t]),ref:n,children:s.map(a=>e.jsx(Le,{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 De({className:t}){const{numPages:s,visiblePage:n}=X();return s>10?e.jsxs("div",{className:c(["schedule-nav",t]),children:[e.jsx("div",{className:c(["schedule-nav__item",n===1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===5&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item","schedule-nav__item--indeterminate",n>5&&n<s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s-3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s-2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s-1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:c(["schedule-nav__item",n===s&&"schedule-nav__item--selected"])})]}):e.jsx("div",{className:c(["schedule-nav",t]),children:s>1&&[...Array(s).keys()].map(a=>e.jsx("div",{className:c(["schedule-nav__item",a+1===n&&"schedule-nav__item--selected"])},a))})}const Ae=d.memo(We);function We(t){const{selectedId:s}=t;return e.jsxs(He,{selectedEventId:s,children:[e.jsx(De,{className:"schedule-nav-container"}),e.jsx(ze,{className:"schedule-container"})]})}const qe=(t,s,n)=>{const a=R(s,[{value:"none",label:"None"}]),i=R(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]),r=be(n,[{value:"none",label:"None"}]),o=R(s,[{value:"title",label:"Title"}]);return[{title:L.ClockOptions,collapsible:!0,options:[Ie(t)]},{title:L.DataSources,collapsible:!0,options:[{id:"main",title:"Main text",description:"Select the data source for the main text",type:"option",values:o,defaultValue:"title"},{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"}]},Ve(a),{title:L.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 Ge(t,s){const n=a=>(s==null?void 0:s.get(a))??t.get(a);return{mainSource:n("main"),secondarySource:n("secondary-src"),extraInfo:n("extra-info")}}function Qe(){const[t]=K(),s=d.use(oe);return d.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return Ge(t,a)},[s,t])}function Ke(t){return(t??0)<0}function Ue(t){return t!==$.Stop}function Ze(t,s){return t===$.Roll&&s===ce.Pending}function Je(t,s,n,a,i){if(i===$.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const r=H(t,n??"title")||A,o=H(t,a),m=H(s,n??"title")||A,h=H(s,a);return{showNow:t!==null,nowMain:r,nowSecondary:o,showNext:s!==null,nextMain:m,nextSecondary:h}}function Xe(){const t=le(p=>p.mirror),{data:s,status:n}=ke(),{data:a,status:i}=Ce(),{data:r,status:o}=de(),{data:m,status:h}=Oe();return{data:{events:s,customFields:m,projectData:a,isMirrored:t,settings:r},status:Te([n,i,o,h])}}function jt(){const{data:t,status:s}=Xe();return Se("Backstage"),s==="pending"?e.jsx(ue,{}):s==="error"?e.jsx(_e,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Ye,{...t})}function Ye({events:t,customFields:s,projectData:n,isMirrored:a,settings:i}){const{getLocalizedString:r}=U(),{mainSource:o,secondarySource:m,extraInfo:h}=Qe(),{eventNext:p,eventNow:g,rundown:v,selectedEventId:j,time:f}=me(),[S,N]=d.useState(!1),{height:V}=ne();d.useEffect(()=>{N(!1);const se=setTimeout(()=>{N(!0)},10);return()=>clearTimeout(se)},[j]);const b=t.length>0,{showNow:l,nowMain:P,nowSecondary:E,showNext:B,nextMain:I,nextSecondary:T}=Je(g,p,o,m,f.playback),y=Ze(f.playback,f.phase),M=y?x(f.secondaryTimer):x(f.startedAt),O=(()=>{if(!l&&b)return x(v.plannedStart,{format12:"h:mm a",format24:"HH:mm"})})(),u=(()=>{if(!l&&b)return x(v.plannedEnd,{format12:"h:mm a",format24:"HH:mm"})})();let _=he(f.current,{fallback:ge});_=fe(_);const C=Math.max(window.innerWidth/15,72),Y=Ue(f.playback),z=b&&V>420,ee=O&&u,D=xe(i==null?void 0:i.timeFormat),te=d.useMemo(()=>qe(D,s,n),[D,s,n]);return e.jsxs("div",{className:`backstage ${a?"mirror":""}`,"data-testid":"backstage-view",children:[e.jsx(we,{target:pe.Backstage,viewOptions:te}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(Ne,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(tt,{})]}),Y&&e.jsx(Fe,{className:"progress-container",current:f.current,duration:f.duration}),!b&&e.jsx(je,{text:r("common.no_data"),className:"empty-container"}),e.jsxs("div",{className:"card-container",children:[l&&e.jsxs("div",{className:c(["event","now",S&&"blink"]),children:[e.jsx(W,{title:P,secondary:E}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:c(["time-entry__label",y&&"time-entry--pending"]),children:r(y?"countdown.waiting":"common.started_at")}),e.jsx(F,{time:M,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")}),Ke(f.current)?e.jsx("div",{className:"time-entry__value",children:r("countdown.overtime")}):e.jsx(F,{time:x(f.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:_})]})]})]}),ee&&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:c(["time-entry__label",y&&"time-entry--pending"]),children:r("common.scheduled_start")}),e.jsx(F,{time:O,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(F,{time:u,className:"time-entry__value"})]})]})]}),B&&b&&e.jsx(W,{className:"event",label:"next",title:I,secondary:T})]}),z&&e.jsx(Ae,{selectedId:j}),e.jsxs("div",{className:c(["info",!z&&"info--stretch"]),children:[h&&e.jsx(et,{projectData:n,size:C,source:h}),e.jsxs("div",{className:"info-card",children:[n.url&&e.jsx(ae,{value:n.url,size:C,level:"L",className:"info-card__qr"}),n.info&&e.jsx("div",{className:"info-card__message",children:n.info})]})]})]})}function et({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 tt(){const{getLocalizedString:t}=U(),s=ve(),n=x(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(F,{time:n,className:"time"})]})}export{jt as default};
2
+ //# sourceMappingURL=Backstage-BY9GL_rk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Backstage-ScLTYJAt.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 const mainOptions = makeOptionsFromCustomFields(customFields, [{ value: 'title', label: 'Title' }]);\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: 'main',\n title: 'Main text',\n description: 'Select the data source for the main text',\n type: 'option',\n values: mainOptions,\n defaultValue: 'title',\n },\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 mainSource: keyof OntimeEvent | null;\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 mainSource: getValue('main') as keyof OntimeEvent | null,\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 { mainSource, 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 mainSource,\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","mainOptions","ClockOptions","getTimeOption","DataSources","ElementVisibility","getOptionsFromParams","defaultValues","getValue","key","mainSource","secondarySource","extraInfo","useBackstageOptions","maybePreset","PresetContext","URLSearchParams","search","isOvertime","getShowProgressBar","playback","Playback","Stop","getIsPendingStart","phase","Roll","TimerPhase","Pending","getCardData","eventNow","eventNext","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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"}
1
+ {"version":3,"file":"Backstage-BY9GL_rk.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 const mainOptions = makeOptionsFromCustomFields(customFields, [{ value: 'title', label: 'Title' }]);\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: 'main',\n title: 'Main text',\n description: 'Select the data source for the main text',\n type: 'option',\n values: mainOptions,\n defaultValue: 'title',\n },\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 mainSource: keyof OntimeEvent | null;\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 mainSource: getValue('main') as keyof OntimeEvent | null,\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 { mainSource, 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 mainSource,\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","mainOptions","ClockOptions","getTimeOption","DataSources","ElementVisibility","getOptionsFromParams","defaultValues","getValue","key","mainSource","secondarySource","extraInfo","useBackstageOptions","maybePreset","PresetContext","URLSearchParams","search","isOvertime","getShowProgressBar","playback","Playback","Stop","getIsPendingStart","phase","Roll","TimerPhase","Pending","getCardData","eventNow","eventNext","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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"}
@@ -1,2 +1,2 @@
1
- import{l as ne,h as S,j as e,x as ae,a8 as oe,v as re,a9 as ie,aa as K,T as W}from"./vendor-dQa48psh.js";import{P as ce,h as T,i as Q,j as le,d as A,f as H,M as z,r as de,m as ue,k as me,F as pe,l as fe,e as F,B as j,n as he,o as xe,p as Z,q as J,s as ge,t as Se,u as ye,b as je,L as be,g as we,O as ve,v as _e}from"./index-DYkg-xOk.js";import{a as Ne,i as Ce,b as ke}from"./useRundown-CR9Ah1Fa.js";import{E as De,a as P}from"./EmptyPage-CcO33dlE.js";import{V as Ee}from"./ViewLogo-CHqiH4C0.js";import{m as $,O as k,V as Fe}from"./ViewParamsEditor-BHIK3qtx.js";import{u as Oe}from"./useWindowTitle-Cl1AVD9_.js";import{S as I}from"./SuperscriptTime-COS4JWHJ.js";import{g as Te,a as Pe}from"./viewLoader.utils-ndDejZHN.js";import{i as G,b as L}from"./viewUtils-rcOl1-o8.js";import{u as Le,F as Ae}from"./FollowButton-DJCtYYXt.js";import{u as X}from"./useReport-CR0k0b85.js";import{g as q}from"./offset-Bs6CY1IK.js";import{u as Ie}from"./useCustomFields-DUYgd-E7.js";import{u as Re}from"./useProjectData-DdITd09M.js";import"./SwatchPicker-DPyJv7aS.js";import"./Select-B3zdv0Ng.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]="7963a1bc-b986-4d54-a567-0f424e07ce65",t._sentryDebugIdIdentifier="sentry-dbid-7963a1bc-b986-4d54-a567-0f424e07ce65")}catch{}})();const Me=(t,s,n)=>{const o=$(s,[{value:"title",label:"Title"}]),a=$(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]);return[{title:k.ClockOptions,collapsible:!0,options:[Te(t)]},{title:k.DataSources,collapsible:!0,options:[{id:"main",title:"Main text",description:"Select the data source for the main text",type:"option",values:o,defaultValue:"title"},{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:k.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:k.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1}]},{title:k.Hidden,options:[{id:"sub",title:"Event subscription",description:"The events to follow",values:n,type:"persist"}]}]};function ze(t,s){const n=a=>(s==null?void 0:s.get(a))??t.get(a);return{subscriptions:(a=>s!=null&&s.has(a)?s.getAll(a):t.getAll(a))("sub"),mainSource:n("main"),secondarySource:n("secondary-src"),showExpected:G(n("showExpected")),hidePast:G(n("hidePast"))}}function R(){const[t]=ne(),s=S.use(ce);return S.useMemo(()=>{const o=s?new URLSearchParams(s.search):void 0;return ze(t,o)},[s,t])}const D="h:mm a",E="HH:mm";function He(t,s,n){return t===s&&n!==T.Armed}const y={future:"countdown.to_start",due:"timeline.due",live:"countdown.running",pending:"countdown.waiting",loaded:"countdown.loaded",done:"countdown.ended"};function Y(t){const{playback:s,current:n,clock:o}=le(),{getLocalizedString:a}=A(),c=r=>r<=0?a("countdown.overtime").toUpperCase():r<z*10?de(ue(r)):me(r,r>z*10).replace("m",`${a("common.minutes")} `).replace("s",a("common.seconds"));return t.isLoaded?s===T.Armed?{status:"loaded",statusDisplay:a(y.loaded),timeDisplay:c(t.duration)}:{status:"live",statusDisplay:a(y.live),timeDisplay:c(n??0)}:s===T.Stop||s===T.Armed?{status:"pending",statusDisplay:a(y.pending),timeDisplay:" "}:t.isPast?{status:"done",statusDisplay:a(y.done),timeDisplay:H(t.endedAt,{format12:D,format24:E})}:t.expectedStart-o<=0?{status:"due",statusDisplay:a(y.future),timeDisplay:a(y.due).toUpperCase()}:{status:"future",statusDisplay:a(y.future),timeDisplay:c(t.expectedStart-o)}}function Ue(t,s){const n=new URL(t),o=new URLSearchParams;for(const[a,c]of n.searchParams.entries())a!=="sub"&&o.append(a,c);return s.forEach(a=>{o.append("sub",a)}),n.search=o.toString(),n}function Be(t,s){return s.filter(n=>t.includes(n.id))}function Ve(t,s){return Math.abs(t-s)>z}function We(t,s,n,o,a,c,r){const{totalGap:d,isLinkedToLoaded:u}=t,i=Q(t,{currentDay:s,totalGap:d,actualStart:n,plannedStart:o,isLinkedToLoaded:u,offset:a,mode:c}),{endedAt:l}=r[t.id]??{endedAt:null};return{...t,expectedStart:i,endedAt:l}}function N(t){const{value:s,preferredFormat12:n=pe,preferredFormat24:o=fe,className:a}=t,c=H(s,{format12:n,format24:o});return e.jsx(I,{className:a,time:c})}function $e({events:t,subscriptions:s,disableEdit:n}){const[o,a]=S.useState(s),c=ae(),r=i=>{a(l=>l.includes(i)?l.filter(m=>m!==i):[...l,i])},d=()=>{const i=o.filter(m=>t.some(p=>p.id===m)),l=Ue(window.location.href,i);n(),a([]),c(l.search.toString())},u=new Set(o);return e.jsxs("div",{className:"list-container",children:[t.map((i,l)=>{const m=i.title||"{no title}",p=u.has(i.id);return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>r(i.id),onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(r(i.id),h.stopPropagation())},className:F(["sub",p&&"sub--selected"]),children:[e.jsx("div",{className:"sub__binder",style:{"--user-color":(i==null?void 0:i.colour)??""}}),e.jsxs("div",{className:"sub__schedule",children:[e.jsx(N,{value:i.timeStart,preferredFormat12:"h:mm a",preferredFormat24:"HH:mm"}),"→",e.jsx(N,{value:i.timeEnd,preferredFormat12:"h:mm a",preferredFormat24:"HH:mm"})]}),e.jsx("div",{className:"sub__label",children:p?"Click to remove":"Click to add"}),e.jsx("div",{className:"sub__title",children:m})]},l)}),e.jsxs("div",{className:"fab-container",children:[e.jsxs(j,{variant:"subtle",size:"xlarge",onClick:n,children:[e.jsx(oe,{})," Go back"]}),e.jsxs(j,{variant:"subtle",size:"xlarge",onClick:()=>a([]),disabled:o.length===0,children:[e.jsx(re,{})," Clear"]}),e.jsxs(j,{variant:"primary",size:"xlarge",disabled:t.length<1,onClick:d,children:[e.jsx(ie,{})," Save"]})]})]})}function Ge({subscribedEvents:t,goToEditMode:s}){const{mainSource:n,secondarySource:o,showExpected:a}=R(),c=he(),r=xe(),d=Z(!0),{data:u}=X(),{offset:i,currentDay:l,actualStart:m,plannedStart:p,mode:h}=J(),b=S.useRef(null),[w,v]=S.useState(!1),x=S.useRef(null),g=S.useRef(null),O=Le({followRef:x,scrollRef:g,doFollow:!w,topOffset:0,followTrigger:r});S.useEffect(()=>{var f;r||w||(f=g.current)==null||f.scrollTo(0,0)},[r,w,g]);const te=()=>{r&&O(),v(!1)},se=Se(()=>{if(x!=null&&x.current&&(g!=null&&g.current)){const f=x.current.getBoundingClientRect(),C=g.current.getBoundingClientRect();if(f&&C){const _=f.top-C.top,M=_<-8||_>50;v(M)}}},1e3),U=()=>{b.current&&clearTimeout(b.current),se()};return e.jsxs("div",{className:"list-container",onWheel:U,onTouchMove:U,ref:g,children:[t.map(f=>{const C=L(f,o),_=He(f.id,r,c),M=!_&&f.id===r,B=We(f,l,m,p,i,h,u),V=L(f,n??"title");return e.jsxs("div",{ref:_?x:void 0,className:F(["sub",_&&"sub--live",M&&"sub--armed"]),"data-testid":f.cue,children:[e.jsx("div",{className:"sub__binder",style:{"--user-color":f.colour}}),e.jsx(ee,{event:B,showExpected:a}),e.jsx(qe,{event:B}),e.jsx("div",{className:F(["sub__title",!V&&"subdued"]),children:V}),C&&e.jsx("div",{className:"sub__secondary",children:C})]},f.id)}),e.jsx("div",{className:F(["fab-container",!d&&"fab-container--hidden"]),children:e.jsxs(j,{variant:"primary",size:"xlarge",onClick:s,children:[e.jsx(K,{})," Edit"]})}),e.jsx(Ae,{isVisible:w,onClickHandler:te})]})}function ee(t){const{event:s,showExpected:n}=t,{timeStart:o,duration:a,delay:c,expectedStart:r,countToEnd:d}=s,u=o+c+s.dayOffset*ge,i=n&&Ve(u,r),l=i?"sub__schedule--strike":c!==0?"sub__schedule--delayed":"",m=`sub__schedule--${q(r-u)}`,p=u+a+c,h=d?Math.max(r+a,p):r+a,b=`sub__schedule--${q(h-p)}`;return e.jsxs("div",{className:"sub__schedule",children:[e.jsx(N,{value:u,preferredFormat12:D,preferredFormat24:E,className:l}),!i&&e.jsxs(e.Fragment,{children:["→",e.jsx(N,{value:p,preferredFormat12:D,preferredFormat24:E,className:l})]}),i&&e.jsxs(e.Fragment,{children:[e.jsx(N,{value:r,className:m,preferredFormat12:D,preferredFormat24:E}),"→",e.jsx(N,{value:h,className:b,preferredFormat12:D,preferredFormat24:E})]})]})}function qe({event:t}){const{status:s,statusDisplay:n,timeDisplay:o}=Y(t);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"sub__status",children:n}),s==="done"?e.jsx(I,{className:"sub__timer",time:o}):e.jsx("div",{className:"sub__timer",children:o})]})}function Ke({subscribedEvent:t,goToEditMode:s}){const{mainSource:n,secondarySource:o,showExpected:a}=R(),c=Z(!0),{data:r}=X(),{offset:d,currentDay:u,actualStart:i,plannedStart:l,mode:m}=J(),{totalGap:p,isLinkedToLoaded:h}=t,b=Q(t,{currentDay:u,totalGap:p,actualStart:i,plannedStart:l,isLinkedToLoaded:h,offset:d,mode:m}),{endedAt:w}=r[t.id]??{endedAt:null},v={...t,expectedStart:b,endedAt:w},x=L(t,n??"title"),g=x!=null&&x.length?x:" ",O=L(t,o);return e.jsxs("div",{className:"single-container","data-testid":"countdown-event",children:[e.jsx(Qe,{event:v}),e.jsxs("div",{className:"event__title",style:{borderColor:v.colour},children:[e.jsx(ee,{event:v,showExpected:a}),g,O&&e.jsx("div",{className:"secondary",children:O})]}),e.jsx("div",{className:F(["fab-container",!c&&"fab-container--hidden"]),children:e.jsxs(j,{variant:"primary",size:"xlarge",onClick:s,children:[e.jsx(K,{})," Edit"]})})]})}function Qe({event:t}){const{status:s,statusDisplay:n,timeDisplay:o}=Y(t);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"event__status",children:n}),s==="done"?e.jsx(I,{className:"event__timer",time:o}):e.jsx("div",{className:"event__timer",children:o})]})}function Ze(){const t=ye(i=>i.mirror),{data:s,status:n}=Ne(),{data:o,status:a}=Re(),{data:c,status:r}=je(),{data:d,status:u}=Ie();return{data:{customFields:d,rundownData:s,projectData:o,isMirrored:t,settings:c},status:Pe([n,a,r,u])}}function yt(){const{data:t,status:s}=Ze();return Oe("Countdown"),s==="pending"?e.jsx(be,{}):s==="error"?e.jsx(De,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Je,{...t})}function Je({customFields:t,rundownData:s,projectData:n,isMirrored:o,settings:a}){const{getLocalizedString:c}=A(),{subscriptions:r}=R(),[d,u]=S.useState(!1),i=s.filter(h=>Ce(h)&&ke(h)),l=i.length>0,m=we(a==null?void 0:a.timeFormat),p=S.useMemo(()=>Me(m,t,r),[m,t,r]);return e.jsxs("div",{className:`countdown ${o?"mirror":""}`,"data-testid":"countdown-view",children:[e.jsx(Fe,{target:ve.Countdown,viewOptions:p}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(Ee,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(Ye,{})]}),!l&&e.jsx(P,{text:c("common.no_data"),className:"empty-container"}),l&&d&&e.jsx($e,{events:i,subscriptions:r,disableEdit:()=>u(!1)}),l&&!d&&e.jsx(Xe,{playableEvents:i,subscriptions:r,goToEditMode:()=>u(!0)})]})}function Xe({playableEvents:t,subscriptions:s,goToEditMode:n}){const{getLocalizedString:o}=A(),{hidePast:a}=R();if(s.length===0)return e.jsxs("div",{className:"empty-container",children:[e.jsx(P,{text:o("countdown.select_event"),className:"empty-container"}),e.jsxs(j,{variant:"primary",size:"xlarge",onClick:n,children:[e.jsx(W,{})," Add"]})]});const c=Be(s,t),r=a?c.filter(d=>!d.isPast):c;if(c.length===0)return e.jsxs("div",{className:"empty-container",children:[e.jsx(P,{text:o("countdown.select_event"),className:"empty-container"}),e.jsxs(j,{variant:"primary",size:"xlarge",onClick:n,children:[e.jsx(W,{})," Add"]})]});if(c.length===1&&r.length===1){const d=c.at(0);return d?e.jsx(Ke,{subscribedEvent:d,goToEditMode:n}):null}return r.length===0?e.jsx("div",{className:"empty-container",children:e.jsx(P,{text:o("countdown.all_have_finished"),className:"empty-container"})}):e.jsx(Ge,{subscribedEvents:r,goToEditMode:n})}function Ye(){const{getLocalizedString:t}=A(),s=_e(),n=H(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(I,{time:n,className:"time"})]})}export{yt as default};
2
- //# sourceMappingURL=Countdown-DA_Lph2k.js.map
1
+ import{l as ne,h as S,j as e,x as ae,a8 as oe,v as re,a9 as ie,aa as K,T as W}from"./vendor-CKDP5hij.js";import{P as ce,h as T,i as Q,j as le,d as A,f as H,M as z,r as de,m as ue,k as me,F as pe,l as fe,e as F,B as j,n as he,o as xe,p as Z,q as J,s as ge,t as Se,u as ye,b as je,L as be,g as we,O as ve,v as _e}from"./index-2lQ-45a9.js";import{a as Ne,i as Ce,b as ke}from"./useRundown-D6vokFHi.js";import{E as De,a as P}from"./EmptyPage-DmpOAg7R.js";import{V as Ee}from"./ViewLogo-Ckp7i75x.js";import{m as $,O as k,V as Fe}from"./ViewParamsEditor-Cxngd15h.js";import{u as Oe}from"./useWindowTitle-bg-fLPOk.js";import{S as I}from"./SuperscriptTime-DP1CDlOX.js";import{g as Te,a as Pe}from"./viewLoader.utils-Bn5zu5sz.js";import{i as G,b as L}from"./viewUtils-DQFwr7hm.js";import{u as Le,F as Ae}from"./FollowButton-CAUWz5Ma.js";import{u as X}from"./useReport-DozG5uz5.js";import{g as q}from"./offset-DAyBfv5b.js";import{u as Ie}from"./useCustomFields-zr9SUl5o.js";import{u as Re}from"./useProjectData-DD_BQ9eJ.js";import"./SwatchPicker-Dyxkxf3_.js";import"./Select-DQwYPDyI.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]="7963a1bc-b986-4d54-a567-0f424e07ce65",t._sentryDebugIdIdentifier="sentry-dbid-7963a1bc-b986-4d54-a567-0f424e07ce65")}catch{}})();const Me=(t,s,n)=>{const o=$(s,[{value:"title",label:"Title"}]),a=$(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]);return[{title:k.ClockOptions,collapsible:!0,options:[Te(t)]},{title:k.DataSources,collapsible:!0,options:[{id:"main",title:"Main text",description:"Select the data source for the main text",type:"option",values:o,defaultValue:"title"},{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:k.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:k.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1}]},{title:k.Hidden,options:[{id:"sub",title:"Event subscription",description:"The events to follow",values:n,type:"persist"}]}]};function ze(t,s){const n=a=>(s==null?void 0:s.get(a))??t.get(a);return{subscriptions:(a=>s!=null&&s.has(a)?s.getAll(a):t.getAll(a))("sub"),mainSource:n("main"),secondarySource:n("secondary-src"),showExpected:G(n("showExpected")),hidePast:G(n("hidePast"))}}function R(){const[t]=ne(),s=S.use(ce);return S.useMemo(()=>{const o=s?new URLSearchParams(s.search):void 0;return ze(t,o)},[s,t])}const D="h:mm a",E="HH:mm";function He(t,s,n){return t===s&&n!==T.Armed}const y={future:"countdown.to_start",due:"timeline.due",live:"countdown.running",pending:"countdown.waiting",loaded:"countdown.loaded",done:"countdown.ended"};function Y(t){const{playback:s,current:n,clock:o}=le(),{getLocalizedString:a}=A(),c=r=>r<=0?a("countdown.overtime").toUpperCase():r<z*10?de(ue(r)):me(r,r>z*10).replace("m",`${a("common.minutes")} `).replace("s",a("common.seconds"));return t.isLoaded?s===T.Armed?{status:"loaded",statusDisplay:a(y.loaded),timeDisplay:c(t.duration)}:{status:"live",statusDisplay:a(y.live),timeDisplay:c(n??0)}:s===T.Stop||s===T.Armed?{status:"pending",statusDisplay:a(y.pending),timeDisplay:" "}:t.isPast?{status:"done",statusDisplay:a(y.done),timeDisplay:H(t.endedAt,{format12:D,format24:E})}:t.expectedStart-o<=0?{status:"due",statusDisplay:a(y.future),timeDisplay:a(y.due).toUpperCase()}:{status:"future",statusDisplay:a(y.future),timeDisplay:c(t.expectedStart-o)}}function Ue(t,s){const n=new URL(t),o=new URLSearchParams;for(const[a,c]of n.searchParams.entries())a!=="sub"&&o.append(a,c);return s.forEach(a=>{o.append("sub",a)}),n.search=o.toString(),n}function Be(t,s){return s.filter(n=>t.includes(n.id))}function Ve(t,s){return Math.abs(t-s)>z}function We(t,s,n,o,a,c,r){const{totalGap:d,isLinkedToLoaded:u}=t,i=Q(t,{currentDay:s,totalGap:d,actualStart:n,plannedStart:o,isLinkedToLoaded:u,offset:a,mode:c}),{endedAt:l}=r[t.id]??{endedAt:null};return{...t,expectedStart:i,endedAt:l}}function N(t){const{value:s,preferredFormat12:n=pe,preferredFormat24:o=fe,className:a}=t,c=H(s,{format12:n,format24:o});return e.jsx(I,{className:a,time:c})}function $e({events:t,subscriptions:s,disableEdit:n}){const[o,a]=S.useState(s),c=ae(),r=i=>{a(l=>l.includes(i)?l.filter(m=>m!==i):[...l,i])},d=()=>{const i=o.filter(m=>t.some(p=>p.id===m)),l=Ue(window.location.href,i);n(),a([]),c(l.search.toString())},u=new Set(o);return e.jsxs("div",{className:"list-container",children:[t.map((i,l)=>{const m=i.title||"{no title}",p=u.has(i.id);return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>r(i.id),onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(r(i.id),h.stopPropagation())},className:F(["sub",p&&"sub--selected"]),children:[e.jsx("div",{className:"sub__binder",style:{"--user-color":(i==null?void 0:i.colour)??""}}),e.jsxs("div",{className:"sub__schedule",children:[e.jsx(N,{value:i.timeStart,preferredFormat12:"h:mm a",preferredFormat24:"HH:mm"}),"→",e.jsx(N,{value:i.timeEnd,preferredFormat12:"h:mm a",preferredFormat24:"HH:mm"})]}),e.jsx("div",{className:"sub__label",children:p?"Click to remove":"Click to add"}),e.jsx("div",{className:"sub__title",children:m})]},l)}),e.jsxs("div",{className:"fab-container",children:[e.jsxs(j,{variant:"subtle",size:"xlarge",onClick:n,children:[e.jsx(oe,{})," Go back"]}),e.jsxs(j,{variant:"subtle",size:"xlarge",onClick:()=>a([]),disabled:o.length===0,children:[e.jsx(re,{})," Clear"]}),e.jsxs(j,{variant:"primary",size:"xlarge",disabled:t.length<1,onClick:d,children:[e.jsx(ie,{})," Save"]})]})]})}function Ge({subscribedEvents:t,goToEditMode:s}){const{mainSource:n,secondarySource:o,showExpected:a}=R(),c=he(),r=xe(),d=Z(!0),{data:u}=X(),{offset:i,currentDay:l,actualStart:m,plannedStart:p,mode:h}=J(),b=S.useRef(null),[w,v]=S.useState(!1),x=S.useRef(null),g=S.useRef(null),O=Le({followRef:x,scrollRef:g,doFollow:!w,topOffset:0,followTrigger:r});S.useEffect(()=>{var f;r||w||(f=g.current)==null||f.scrollTo(0,0)},[r,w,g]);const te=()=>{r&&O(),v(!1)},se=Se(()=>{if(x!=null&&x.current&&(g!=null&&g.current)){const f=x.current.getBoundingClientRect(),C=g.current.getBoundingClientRect();if(f&&C){const _=f.top-C.top,M=_<-8||_>50;v(M)}}},1e3),U=()=>{b.current&&clearTimeout(b.current),se()};return e.jsxs("div",{className:"list-container",onWheel:U,onTouchMove:U,ref:g,children:[t.map(f=>{const C=L(f,o),_=He(f.id,r,c),M=!_&&f.id===r,B=We(f,l,m,p,i,h,u),V=L(f,n??"title");return e.jsxs("div",{ref:_?x:void 0,className:F(["sub",_&&"sub--live",M&&"sub--armed"]),"data-testid":f.cue,children:[e.jsx("div",{className:"sub__binder",style:{"--user-color":f.colour}}),e.jsx(ee,{event:B,showExpected:a}),e.jsx(qe,{event:B}),e.jsx("div",{className:F(["sub__title",!V&&"subdued"]),children:V}),C&&e.jsx("div",{className:"sub__secondary",children:C})]},f.id)}),e.jsx("div",{className:F(["fab-container",!d&&"fab-container--hidden"]),children:e.jsxs(j,{variant:"primary",size:"xlarge",onClick:s,children:[e.jsx(K,{})," Edit"]})}),e.jsx(Ae,{isVisible:w,onClickHandler:te})]})}function ee(t){const{event:s,showExpected:n}=t,{timeStart:o,duration:a,delay:c,expectedStart:r,countToEnd:d}=s,u=o+c+s.dayOffset*ge,i=n&&Ve(u,r),l=i?"sub__schedule--strike":c!==0?"sub__schedule--delayed":"",m=`sub__schedule--${q(r-u)}`,p=u+a+c,h=d?Math.max(r+a,p):r+a,b=`sub__schedule--${q(h-p)}`;return e.jsxs("div",{className:"sub__schedule",children:[e.jsx(N,{value:u,preferredFormat12:D,preferredFormat24:E,className:l}),!i&&e.jsxs(e.Fragment,{children:["→",e.jsx(N,{value:p,preferredFormat12:D,preferredFormat24:E,className:l})]}),i&&e.jsxs(e.Fragment,{children:[e.jsx(N,{value:r,className:m,preferredFormat12:D,preferredFormat24:E}),"→",e.jsx(N,{value:h,className:b,preferredFormat12:D,preferredFormat24:E})]})]})}function qe({event:t}){const{status:s,statusDisplay:n,timeDisplay:o}=Y(t);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"sub__status",children:n}),s==="done"?e.jsx(I,{className:"sub__timer",time:o}):e.jsx("div",{className:"sub__timer",children:o})]})}function Ke({subscribedEvent:t,goToEditMode:s}){const{mainSource:n,secondarySource:o,showExpected:a}=R(),c=Z(!0),{data:r}=X(),{offset:d,currentDay:u,actualStart:i,plannedStart:l,mode:m}=J(),{totalGap:p,isLinkedToLoaded:h}=t,b=Q(t,{currentDay:u,totalGap:p,actualStart:i,plannedStart:l,isLinkedToLoaded:h,offset:d,mode:m}),{endedAt:w}=r[t.id]??{endedAt:null},v={...t,expectedStart:b,endedAt:w},x=L(t,n??"title"),g=x!=null&&x.length?x:" ",O=L(t,o);return e.jsxs("div",{className:"single-container","data-testid":"countdown-event",children:[e.jsx(Qe,{event:v}),e.jsxs("div",{className:"event__title",style:{borderColor:v.colour},children:[e.jsx(ee,{event:v,showExpected:a}),g,O&&e.jsx("div",{className:"secondary",children:O})]}),e.jsx("div",{className:F(["fab-container",!c&&"fab-container--hidden"]),children:e.jsxs(j,{variant:"primary",size:"xlarge",onClick:s,children:[e.jsx(K,{})," Edit"]})})]})}function Qe({event:t}){const{status:s,statusDisplay:n,timeDisplay:o}=Y(t);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"event__status",children:n}),s==="done"?e.jsx(I,{className:"event__timer",time:o}):e.jsx("div",{className:"event__timer",children:o})]})}function Ze(){const t=ye(i=>i.mirror),{data:s,status:n}=Ne(),{data:o,status:a}=Re(),{data:c,status:r}=je(),{data:d,status:u}=Ie();return{data:{customFields:d,rundownData:s,projectData:o,isMirrored:t,settings:c},status:Pe([n,a,r,u])}}function yt(){const{data:t,status:s}=Ze();return Oe("Countdown"),s==="pending"?e.jsx(be,{}):s==="error"?e.jsx(De,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Je,{...t})}function Je({customFields:t,rundownData:s,projectData:n,isMirrored:o,settings:a}){const{getLocalizedString:c}=A(),{subscriptions:r}=R(),[d,u]=S.useState(!1),i=s.filter(h=>Ce(h)&&ke(h)),l=i.length>0,m=we(a==null?void 0:a.timeFormat),p=S.useMemo(()=>Me(m,t,r),[m,t,r]);return e.jsxs("div",{className:`countdown ${o?"mirror":""}`,"data-testid":"countdown-view",children:[e.jsx(Fe,{target:ve.Countdown,viewOptions:p}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(Ee,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(Ye,{})]}),!l&&e.jsx(P,{text:c("common.no_data"),className:"empty-container"}),l&&d&&e.jsx($e,{events:i,subscriptions:r,disableEdit:()=>u(!1)}),l&&!d&&e.jsx(Xe,{playableEvents:i,subscriptions:r,goToEditMode:()=>u(!0)})]})}function Xe({playableEvents:t,subscriptions:s,goToEditMode:n}){const{getLocalizedString:o}=A(),{hidePast:a}=R();if(s.length===0)return e.jsxs("div",{className:"empty-container",children:[e.jsx(P,{text:o("countdown.select_event"),className:"empty-container"}),e.jsxs(j,{variant:"primary",size:"xlarge",onClick:n,children:[e.jsx(W,{})," Add"]})]});const c=Be(s,t),r=a?c.filter(d=>!d.isPast):c;if(c.length===0)return e.jsxs("div",{className:"empty-container",children:[e.jsx(P,{text:o("countdown.select_event"),className:"empty-container"}),e.jsxs(j,{variant:"primary",size:"xlarge",onClick:n,children:[e.jsx(W,{})," Add"]})]});if(c.length===1&&r.length===1){const d=c.at(0);return d?e.jsx(Ke,{subscribedEvent:d,goToEditMode:n}):null}return r.length===0?e.jsx("div",{className:"empty-container",children:e.jsx(P,{text:o("countdown.all_have_finished"),className:"empty-container"})}):e.jsx(Ge,{subscribedEvents:r,goToEditMode:n})}function Ye(){const{getLocalizedString:t}=A(),s=_e(),n=H(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(I,{time:n,className:"time"})]})}export{yt as default};
2
+ //# sourceMappingURL=Countdown-CXFgDHND.js.map