@getontime/cli 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/client/assets/Backstage-CDH53Q_N.js +2 -0
  2. package/client/assets/Backstage-CDH53Q_N.js.br +0 -0
  3. package/client/assets/Backstage-CDH53Q_N.js.gz +0 -0
  4. package/client/assets/Backstage-CDH53Q_N.js.map +1 -0
  5. package/client/assets/Countdown-B-MuMf1C.js +2 -0
  6. package/client/assets/Countdown-B-MuMf1C.js.br +0 -0
  7. package/client/assets/Countdown-B-MuMf1C.js.gz +0 -0
  8. package/client/assets/Countdown-B-MuMf1C.js.map +1 -0
  9. package/client/assets/CustomTranslationModal-DiQbmcgD.js +2 -0
  10. package/client/assets/CustomTranslationModal-DiQbmcgD.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-DiQbmcgD.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-CJ9-aDjl.js.map → CustomTranslationModal-DiQbmcgD.js.map} +1 -1
  13. package/client/assets/DelayIndicator-D--91EO3.js +2 -0
  14. package/client/assets/DelayIndicator-D--91EO3.js.br +0 -0
  15. package/client/assets/DelayIndicator-D--91EO3.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-F4GdgsGh.js.map → DelayIndicator-D--91EO3.js.map} +1 -1
  17. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js +2 -0
  18. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-DwXUAV4k.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-eIpSr_UK.js.map → EditorFeatureWrapper-DwXUAV4k.js.map} +1 -1
  21. package/client/assets/EditorUtils-DuKjlUkF.js +2 -0
  22. package/client/assets/EditorUtils-DuKjlUkF.js.br +0 -0
  23. package/client/assets/EditorUtils-DuKjlUkF.js.gz +0 -0
  24. package/client/assets/{EditorUtils-Bd3J5Dvf.js.map → EditorUtils-DuKjlUkF.js.map} +1 -1
  25. package/client/assets/EditorUtils-L4Sg72o_.css +1 -0
  26. package/client/assets/EditorUtils-L4Sg72o_.css.br +0 -0
  27. package/client/assets/EditorUtils-L4Sg72o_.css.gz +0 -0
  28. package/client/assets/Empty-CJbZxh45.js +2 -0
  29. package/client/assets/Empty-CJbZxh45.js.br +0 -0
  30. package/client/assets/Empty-CJbZxh45.js.gz +0 -0
  31. package/client/assets/{Empty-C0IdV_kI.js.map → Empty-CJbZxh45.js.map} +1 -1
  32. package/client/assets/EmptyPage-Bc358YpE.js +2 -0
  33. package/client/assets/EmptyPage-Bc358YpE.js.br +5 -0
  34. package/client/assets/EmptyPage-Bc358YpE.js.gz +0 -0
  35. package/client/assets/{EmptyPage-Ct3d0DqJ.js.map → EmptyPage-Bc358YpE.js.map} +1 -1
  36. package/client/assets/FollowButton-C6Fvaqh0.js +2 -0
  37. package/client/assets/FollowButton-C6Fvaqh0.js.br +0 -0
  38. package/client/assets/FollowButton-C6Fvaqh0.js.gz +0 -0
  39. package/client/assets/{FollowButton-BG-ycRWu.js.map → FollowButton-C6Fvaqh0.js.map} +1 -1
  40. package/client/assets/MessageControlExport-D_pNX6Vj.css +1 -0
  41. package/client/assets/MessageControlExport-D_pNX6Vj.css.br +0 -0
  42. package/client/assets/MessageControlExport-D_pNX6Vj.css.gz +0 -0
  43. package/client/assets/MessageControlExport-GmOrvUik.js +3 -0
  44. package/client/assets/MessageControlExport-GmOrvUik.js.br +0 -0
  45. package/client/assets/MessageControlExport-GmOrvUik.js.gz +0 -0
  46. package/client/assets/MessageControlExport-GmOrvUik.js.map +1 -0
  47. package/client/assets/MilestoneEditor-BA0PVIQh.js +2 -0
  48. package/client/assets/MilestoneEditor-BA0PVIQh.js.br +0 -0
  49. package/client/assets/MilestoneEditor-BA0PVIQh.js.gz +0 -0
  50. package/client/assets/MilestoneEditor-BA0PVIQh.js.map +1 -0
  51. package/client/assets/Modal-BKx0PDGT.js +2 -0
  52. package/client/assets/Modal-BKx0PDGT.js.br +0 -0
  53. package/client/assets/Modal-BKx0PDGT.js.gz +0 -0
  54. package/client/assets/Modal-BKx0PDGT.js.map +1 -0
  55. package/client/assets/{MultiPartProgressBar-Cmw-gisu.js → MultiPartProgressBar-BXdLxJpy.js} +2 -2
  56. package/client/assets/MultiPartProgressBar-BXdLxJpy.js.br +0 -0
  57. package/client/assets/MultiPartProgressBar-BXdLxJpy.js.gz +0 -0
  58. package/client/assets/{MultiPartProgressBar-Cmw-gisu.js.map → MultiPartProgressBar-BXdLxJpy.js.map} +1 -1
  59. package/client/assets/OperatorExport-CA5WcIt5.css +1 -0
  60. package/client/assets/OperatorExport-CA5WcIt5.css.br +0 -0
  61. package/client/assets/OperatorExport-CA5WcIt5.css.gz +0 -0
  62. package/client/assets/OperatorExport-X7-qi2jv.js +2 -0
  63. package/client/assets/OperatorExport-X7-qi2jv.js.br +0 -0
  64. package/client/assets/OperatorExport-X7-qi2jv.js.gz +0 -0
  65. package/client/assets/OperatorExport-X7-qi2jv.js.map +1 -0
  66. package/client/assets/OverviewWrapper-BQb2xl_N.js +2 -0
  67. package/client/assets/OverviewWrapper-BQb2xl_N.js.br +0 -0
  68. package/client/assets/OverviewWrapper-BQb2xl_N.js.gz +0 -0
  69. package/client/assets/OverviewWrapper-BQb2xl_N.js.map +1 -0
  70. package/client/assets/PipHost-CvtlZIn7.js +2 -0
  71. package/client/assets/PipHost-CvtlZIn7.js.br +0 -0
  72. package/client/assets/PipHost-CvtlZIn7.js.gz +0 -0
  73. package/client/assets/PipHost-CvtlZIn7.js.map +1 -0
  74. package/client/assets/PipHost-DEhjTbGT.css +1 -0
  75. package/client/assets/PipHost-DEhjTbGT.css.br +0 -0
  76. package/client/assets/PipHost-DEhjTbGT.css.gz +0 -0
  77. package/client/assets/ProjectInfo-1tw48NHZ.js +2 -0
  78. package/client/assets/ProjectInfo-1tw48NHZ.js.br +0 -0
  79. package/client/assets/ProjectInfo-1tw48NHZ.js.gz +0 -0
  80. package/client/assets/{ProjectInfo-BduQgjcz.js.map → ProjectInfo-1tw48NHZ.js.map} +1 -1
  81. package/client/assets/ProtectRoute-BH-QvsU0.js +2 -0
  82. package/client/assets/ProtectRoute-BH-QvsU0.js.br +0 -0
  83. package/client/assets/ProtectRoute-BH-QvsU0.js.gz +0 -0
  84. package/client/assets/{ProtectRoute-Ci_AIozP.js.map → ProtectRoute-BH-QvsU0.js.map} +1 -1
  85. package/client/assets/ProtectedCuesheet-CYBIcg1c.js +2 -0
  86. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.br +0 -0
  87. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.gz +0 -0
  88. package/client/assets/ProtectedCuesheet-CYBIcg1c.js.map +1 -0
  89. package/client/assets/ProtectedCuesheet-DPO7xYMb.css +1 -0
  90. package/client/assets/ProtectedCuesheet-DPO7xYMb.css.br +0 -0
  91. package/client/assets/ProtectedCuesheet-DPO7xYMb.css.gz +0 -0
  92. package/client/assets/{ProtectedEditor-Dw0pWw0J.css → ProtectedEditor-BtSuTFlT.css} +1 -1
  93. package/client/assets/ProtectedEditor-BtSuTFlT.css.br +0 -0
  94. package/client/assets/{ProtectedEditor-Dw0pWw0J.css.gz → ProtectedEditor-BtSuTFlT.css.gz} +0 -0
  95. package/client/assets/ProtectedEditor-D_A75byA.js +3 -0
  96. package/client/assets/ProtectedEditor-D_A75byA.js.br +0 -0
  97. package/client/assets/ProtectedEditor-D_A75byA.js.gz +0 -0
  98. package/client/assets/ProtectedEditor-D_A75byA.js.map +1 -0
  99. package/client/assets/RundownEntry-bkqwx57t.js +2 -0
  100. package/client/assets/RundownEntry-bkqwx57t.js.br +0 -0
  101. package/client/assets/RundownEntry-bkqwx57t.js.gz +0 -0
  102. package/client/assets/RundownEntry-bkqwx57t.js.map +1 -0
  103. package/client/assets/{RundownExport-DtSvAfBG.css → RundownExport-Bgtg_idR.css} +1 -1
  104. package/client/assets/RundownExport-Bgtg_idR.css.br +0 -0
  105. package/client/assets/RundownExport-Bgtg_idR.css.gz +0 -0
  106. package/client/assets/RundownExport-EorsanA0.js +3 -0
  107. package/client/assets/RundownExport-EorsanA0.js.br +0 -0
  108. package/client/assets/RundownExport-EorsanA0.js.gz +0 -0
  109. package/client/assets/RundownExport-EorsanA0.js.map +1 -0
  110. package/client/assets/Select-BGGVCKqU.js +2 -0
  111. package/client/assets/Select-BGGVCKqU.js.br +0 -0
  112. package/client/assets/Select-BGGVCKqU.js.gz +0 -0
  113. package/client/assets/Select-BGGVCKqU.js.map +1 -0
  114. package/client/assets/Studio-BjNZ4l-W.js +2 -0
  115. package/client/assets/Studio-BjNZ4l-W.js.br +0 -0
  116. package/client/assets/Studio-BjNZ4l-W.js.gz +0 -0
  117. package/client/assets/Studio-BjNZ4l-W.js.map +1 -0
  118. package/client/assets/StyleEditor-CpciRLYh.js +2 -0
  119. package/client/assets/StyleEditor-CpciRLYh.js.br +0 -0
  120. package/client/assets/StyleEditor-CpciRLYh.js.gz +0 -0
  121. package/client/assets/{StyleEditor-BvcE8dkA.js.map → StyleEditor-CpciRLYh.js.map} +1 -1
  122. package/client/assets/SuperscriptPeriod-DsPdWN_s.js +2 -0
  123. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.br +0 -0
  124. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.gz +0 -0
  125. package/client/assets/SuperscriptPeriod-DsPdWN_s.js.map +1 -0
  126. package/client/assets/SuperscriptTime-CA6S2R55.js +2 -0
  127. package/client/assets/SuperscriptTime-CA6S2R55.js.br +0 -0
  128. package/client/assets/SuperscriptTime-CA6S2R55.js.gz +0 -0
  129. package/client/assets/SuperscriptTime-CA6S2R55.js.map +1 -0
  130. package/client/assets/SwatchPicker-Cm5Eicvv.js +2 -0
  131. package/client/assets/SwatchPicker-Cm5Eicvv.js.br +0 -0
  132. package/client/assets/SwatchPicker-Cm5Eicvv.js.gz +0 -0
  133. package/client/assets/SwatchPicker-Cm5Eicvv.js.map +1 -0
  134. package/client/assets/{TimeElements-XpRwBsaa.js → TimeElements-DbclWDbU.js} +2 -2
  135. package/client/assets/TimeElements-DbclWDbU.js.br +0 -0
  136. package/client/assets/TimeElements-DbclWDbU.js.gz +0 -0
  137. package/client/assets/TimeElements-DbclWDbU.js.map +1 -0
  138. package/client/assets/TimeInput-C8DQoFXv.js +2 -0
  139. package/client/assets/TimeInput-C8DQoFXv.js.br +0 -0
  140. package/client/assets/TimeInput-C8DQoFXv.js.gz +0 -0
  141. package/client/assets/{TimeInput-Bu_5GlHP.js.map → TimeInput-C8DQoFXv.js.map} +1 -1
  142. package/client/assets/TimelinePage-Cgtl1qNp.js +2 -0
  143. package/client/assets/TimelinePage-Cgtl1qNp.js.br +0 -0
  144. package/client/assets/TimelinePage-Cgtl1qNp.js.gz +0 -0
  145. package/client/assets/TimelinePage-Cgtl1qNp.js.map +1 -0
  146. package/client/assets/Timer-BbixOGdj.js +2 -0
  147. package/client/assets/Timer-BbixOGdj.js.br +0 -0
  148. package/client/assets/Timer-BbixOGdj.js.gz +0 -0
  149. package/client/assets/Timer-BbixOGdj.js.map +1 -0
  150. package/client/assets/{Timer-B7nk3TMf.css → Timer-Jjolf5Ra.css} +1 -1
  151. package/client/assets/Timer-Jjolf5Ra.css.br +0 -0
  152. package/client/assets/Timer-Jjolf5Ra.css.gz +0 -0
  153. package/client/assets/TimerControlExport-Dx3SSGNG.js +2 -0
  154. package/client/assets/TimerControlExport-Dx3SSGNG.js.br +0 -0
  155. package/client/assets/TimerControlExport-Dx3SSGNG.js.gz +0 -0
  156. package/client/assets/{TimerControlExport-4a3Cd9x8.js.map → TimerControlExport-Dx3SSGNG.js.map} +1 -1
  157. package/client/assets/{TimerControlExport-DavNxY9p.css → TimerControlExport-cJRa5GUp.css} +1 -1
  158. package/client/assets/TimerControlExport-cJRa5GUp.css.br +0 -0
  159. package/client/assets/{TimerControlExport-DavNxY9p.css.gz → TimerControlExport-cJRa5GUp.css.gz} +0 -0
  160. package/client/assets/TitleCard-Xdr7xwzU.js +2 -0
  161. package/client/assets/TitleCard-Xdr7xwzU.js.br +0 -0
  162. package/client/assets/TitleCard-Xdr7xwzU.js.gz +0 -0
  163. package/client/assets/{TitleCard-1U35ek0D.js.map → TitleCard-Xdr7xwzU.js.map} +1 -1
  164. package/client/assets/Tooltip-B5vsLcFu.js +2 -0
  165. package/client/assets/Tooltip-B5vsLcFu.js.br +0 -0
  166. package/client/assets/Tooltip-B5vsLcFu.js.gz +0 -0
  167. package/client/assets/Tooltip-B5vsLcFu.js.map +1 -0
  168. package/client/assets/ViewLogo-G7EosFIr.js +2 -0
  169. package/client/assets/ViewLogo-G7EosFIr.js.br +0 -0
  170. package/client/assets/ViewLogo-G7EosFIr.js.gz +0 -0
  171. package/client/assets/{ViewLogo-BHsV7Faa.js.map → ViewLogo-G7EosFIr.js.map} +1 -1
  172. package/client/assets/ViewParamsEditor-C2-TRP6e.js +2 -0
  173. package/client/assets/ViewParamsEditor-C2-TRP6e.js.br +0 -0
  174. package/client/assets/ViewParamsEditor-C2-TRP6e.js.gz +0 -0
  175. package/client/assets/ViewParamsEditor-C2-TRP6e.js.map +1 -0
  176. package/client/assets/dateConfig-D7xim1t4.js +2 -0
  177. package/client/assets/dateConfig-D7xim1t4.js.br +0 -0
  178. package/client/assets/dateConfig-D7xim1t4.js.gz +0 -0
  179. package/client/assets/dateConfig-D7xim1t4.js.map +1 -0
  180. package/client/assets/editorSettings-D2f7e1a6.js +2 -0
  181. package/client/assets/editorSettings-D2f7e1a6.js.br +0 -0
  182. package/client/assets/editorSettings-D2f7e1a6.js.gz +0 -0
  183. package/client/assets/{editorSettings-DH9ca-nB.js.map → editorSettings-D2f7e1a6.js.map} +1 -1
  184. package/client/assets/{getProgress-DlrSzpnf.js → getProgress-cLuBFPjh.js} +2 -2
  185. package/client/assets/getProgress-cLuBFPjh.js.br +0 -0
  186. package/client/assets/getProgress-cLuBFPjh.js.gz +0 -0
  187. package/client/assets/{getProgress-DlrSzpnf.js.map → getProgress-cLuBFPjh.js.map} +1 -1
  188. package/client/assets/index-B81u4hxi.js +3 -0
  189. package/client/assets/index-B81u4hxi.js.br +0 -0
  190. package/client/assets/index-B81u4hxi.js.gz +0 -0
  191. package/client/assets/index-B81u4hxi.js.map +1 -0
  192. package/client/assets/{index-BuJoGGff.css → index-D6S93MXv.css} +1 -1
  193. package/client/assets/index-D6S93MXv.css.br +0 -0
  194. package/client/assets/index-D6S93MXv.css.gz +0 -0
  195. package/client/assets/{offset-CLG4o744.js → offset-R98EXhWK.js} +2 -2
  196. package/client/assets/offset-R98EXhWK.js.br +0 -0
  197. package/client/assets/offset-R98EXhWK.js.gz +0 -0
  198. package/client/assets/{offset-CLG4o744.js.map → offset-R98EXhWK.js.map} +1 -1
  199. package/client/assets/parseUserTime-YeFR8t3F.js +2 -0
  200. package/client/assets/parseUserTime-YeFR8t3F.js.br +0 -0
  201. package/client/assets/parseUserTime-YeFR8t3F.js.gz +0 -0
  202. package/client/assets/{parseUserTime-Cp5iWS7y.js.map → parseUserTime-YeFR8t3F.js.map} +1 -1
  203. package/client/assets/{playbackstate-B3BKJ8cT.js → playbackstate-CPQdnF-k.js} +2 -2
  204. package/client/assets/playbackstate-CPQdnF-k.js.br +0 -0
  205. package/client/assets/playbackstate-CPQdnF-k.js.gz +0 -0
  206. package/client/assets/{playbackstate-B3BKJ8cT.js.map → playbackstate-CPQdnF-k.js.map} +1 -1
  207. package/client/assets/{presentation.utils-B-wIv_a5.js → presentation.utils-Cl-L3pHN.js} +2 -2
  208. package/client/assets/presentation.utils-Cl-L3pHN.js.br +0 -0
  209. package/client/assets/presentation.utils-Cl-L3pHN.js.gz +0 -0
  210. package/client/assets/{presentation.utils-B-wIv_a5.js.map → presentation.utils-Cl-L3pHN.js.map} +1 -1
  211. package/client/assets/{rundownUtils-DJKMt8Ih.js → rundownUtils-CtVGQDQn.js} +2 -2
  212. package/client/assets/rundownUtils-CtVGQDQn.js.br +0 -0
  213. package/client/assets/rundownUtils-CtVGQDQn.js.gz +0 -0
  214. package/client/assets/{rundownUtils-DJKMt8Ih.js.map → rundownUtils-CtVGQDQn.js.map} +1 -1
  215. package/client/assets/timer.utils-rGyI9NYa.js +2 -0
  216. package/client/assets/timer.utils-rGyI9NYa.js.br +0 -0
  217. package/client/assets/timer.utils-rGyI9NYa.js.gz +0 -0
  218. package/client/assets/timer.utils-rGyI9NYa.js.map +1 -0
  219. package/client/assets/useCustomFields-k4piRt9n.js +2 -0
  220. package/client/assets/useCustomFields-k4piRt9n.js.br +0 -0
  221. package/client/assets/useCustomFields-k4piRt9n.js.gz +0 -0
  222. package/client/assets/{useCustomFields-BUJkzZvM.js.map → useCustomFields-k4piRt9n.js.map} +1 -1
  223. package/client/assets/useFollowComponent-B7vvPzG2.js +2 -0
  224. package/client/assets/useFollowComponent-B7vvPzG2.js.br +0 -0
  225. package/client/assets/useFollowComponent-B7vvPzG2.js.gz +0 -0
  226. package/client/assets/{useFollowComponent-Eyo4hWVG.js.map → useFollowComponent-B7vvPzG2.js.map} +1 -1
  227. package/client/assets/useProjectData-DdgKoYzk.js +2 -0
  228. package/client/assets/useProjectData-DdgKoYzk.js.br +0 -0
  229. package/client/assets/useProjectData-DdgKoYzk.js.gz +0 -0
  230. package/client/assets/useProjectData-DdgKoYzk.js.map +1 -0
  231. package/client/assets/useReport-DSuFnUb9.js +2 -0
  232. package/client/assets/useReport-DSuFnUb9.js.br +0 -0
  233. package/client/assets/useReport-DSuFnUb9.js.gz +0 -0
  234. package/client/assets/{useReport-BUCsRa2T.js.map → useReport-DSuFnUb9.js.map} +1 -1
  235. package/client/assets/useRundown-Bn6ZPsz0.js +2 -0
  236. package/client/assets/useRundown-Bn6ZPsz0.js.br +0 -0
  237. package/client/assets/useRundown-Bn6ZPsz0.js.gz +0 -0
  238. package/client/assets/useRundown-Bn6ZPsz0.js.map +1 -0
  239. package/client/assets/useWindowTitle-Bpmo_HzW.js +2 -0
  240. package/client/assets/useWindowTitle-Bpmo_HzW.js.br +0 -0
  241. package/client/assets/useWindowTitle-Bpmo_HzW.js.gz +0 -0
  242. package/client/assets/useWindowTitle-Bpmo_HzW.js.map +1 -0
  243. package/client/assets/{validateEvent-3adKsP1N.js → validateEvent-Do8yE_DJ.js} +2 -2
  244. package/client/assets/validateEvent-Do8yE_DJ.js.br +3 -0
  245. package/client/assets/validateEvent-Do8yE_DJ.js.gz +0 -0
  246. package/client/assets/{validateEvent-3adKsP1N.js.map → validateEvent-Do8yE_DJ.js.map} +1 -1
  247. package/client/assets/vendor-q6fv0YT2.js +74 -0
  248. package/client/assets/vendor-q6fv0YT2.js.br +0 -0
  249. package/client/assets/vendor-q6fv0YT2.js.gz +0 -0
  250. package/client/assets/{vendor-BoH5HFNN.js.map → vendor-q6fv0YT2.js.map} +1 -1
  251. package/client/assets/{viewLoader.utils-BPOG1xso.js → viewLoader.utils-b42scp-I.js} +2 -2
  252. package/client/assets/viewLoader.utils-b42scp-I.js.br +0 -0
  253. package/client/assets/viewLoader.utils-b42scp-I.js.gz +0 -0
  254. package/client/assets/{viewLoader.utils-BPOG1xso.js.map → viewLoader.utils-b42scp-I.js.map} +1 -1
  255. package/client/assets/viewUtils-B8Dr4GHH.js +2 -0
  256. package/client/assets/viewUtils-B8Dr4GHH.js.br +0 -0
  257. package/client/assets/viewUtils-B8Dr4GHH.js.gz +0 -0
  258. package/client/assets/viewUtils-B8Dr4GHH.js.map +1 -0
  259. package/client/index.html +3 -3
  260. package/package.json +1 -1
  261. package/server/index.cjs +92 -92
  262. package/client/assets/Backstage-DG-hwPI3.js +0 -2
  263. package/client/assets/Backstage-DG-hwPI3.js.br +0 -0
  264. package/client/assets/Backstage-DG-hwPI3.js.gz +0 -0
  265. package/client/assets/Backstage-DG-hwPI3.js.map +0 -1
  266. package/client/assets/Countdown-C8LGl1pp.js +0 -2
  267. package/client/assets/Countdown-C8LGl1pp.js.br +0 -0
  268. package/client/assets/Countdown-C8LGl1pp.js.gz +0 -0
  269. package/client/assets/Countdown-C8LGl1pp.js.map +0 -1
  270. package/client/assets/CustomTranslationModal-CJ9-aDjl.js +0 -2
  271. package/client/assets/CustomTranslationModal-CJ9-aDjl.js.br +0 -0
  272. package/client/assets/CustomTranslationModal-CJ9-aDjl.js.gz +0 -0
  273. package/client/assets/DelayIndicator-F4GdgsGh.js +0 -2
  274. package/client/assets/DelayIndicator-F4GdgsGh.js.br +0 -0
  275. package/client/assets/DelayIndicator-F4GdgsGh.js.gz +0 -0
  276. package/client/assets/Editor-B_NlyOLw.css +0 -1
  277. package/client/assets/Editor-B_NlyOLw.css.br +0 -0
  278. package/client/assets/Editor-B_NlyOLw.css.gz +0 -0
  279. package/client/assets/Editor.module-DvV2efYs.js +0 -2
  280. package/client/assets/Editor.module-DvV2efYs.js.br +0 -0
  281. package/client/assets/Editor.module-DvV2efYs.js.gz +0 -0
  282. package/client/assets/Editor.module-DvV2efYs.js.map +0 -1
  283. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js +0 -2
  284. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js.br +0 -0
  285. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js.gz +0 -0
  286. package/client/assets/EditorUtils-Bd3J5Dvf.js +0 -2
  287. package/client/assets/EditorUtils-Bd3J5Dvf.js.br +0 -0
  288. package/client/assets/EditorUtils-Bd3J5Dvf.js.gz +0 -0
  289. package/client/assets/EditorUtils-CgF7UfHP.css +0 -1
  290. package/client/assets/EditorUtils-CgF7UfHP.css.br +0 -0
  291. package/client/assets/EditorUtils-CgF7UfHP.css.gz +0 -0
  292. package/client/assets/Empty-C0IdV_kI.js +0 -2
  293. package/client/assets/Empty-C0IdV_kI.js.br +0 -0
  294. package/client/assets/Empty-C0IdV_kI.js.gz +0 -0
  295. package/client/assets/EmptyPage-Ct3d0DqJ.js +0 -2
  296. package/client/assets/EmptyPage-Ct3d0DqJ.js.br +0 -0
  297. package/client/assets/EmptyPage-Ct3d0DqJ.js.gz +0 -0
  298. package/client/assets/FollowButton-BG-ycRWu.js +0 -2
  299. package/client/assets/FollowButton-BG-ycRWu.js.br +0 -0
  300. package/client/assets/FollowButton-BG-ycRWu.js.gz +0 -0
  301. package/client/assets/MessageControlExport-DjoUioWA.css +0 -1
  302. package/client/assets/MessageControlExport-DjoUioWA.css.br +0 -0
  303. package/client/assets/MessageControlExport-DjoUioWA.css.gz +0 -0
  304. package/client/assets/MessageControlExport-X-4dl9QT.js +0 -3
  305. package/client/assets/MessageControlExport-X-4dl9QT.js.br +0 -0
  306. package/client/assets/MessageControlExport-X-4dl9QT.js.gz +0 -0
  307. package/client/assets/MessageControlExport-X-4dl9QT.js.map +0 -1
  308. package/client/assets/MilestoneEditor-rgBQSXVU.js +0 -2
  309. package/client/assets/MilestoneEditor-rgBQSXVU.js.br +0 -0
  310. package/client/assets/MilestoneEditor-rgBQSXVU.js.gz +0 -0
  311. package/client/assets/MilestoneEditor-rgBQSXVU.js.map +0 -1
  312. package/client/assets/Modal-Bn1bZkwb.js +0 -2
  313. package/client/assets/Modal-Bn1bZkwb.js.br +0 -0
  314. package/client/assets/Modal-Bn1bZkwb.js.gz +0 -0
  315. package/client/assets/Modal-Bn1bZkwb.js.map +0 -1
  316. package/client/assets/MultiPartProgressBar-Cmw-gisu.js.br +0 -0
  317. package/client/assets/MultiPartProgressBar-Cmw-gisu.js.gz +0 -0
  318. package/client/assets/OperatorExport-BiBcgVKc.css +0 -1
  319. package/client/assets/OperatorExport-BiBcgVKc.css.br +0 -0
  320. package/client/assets/OperatorExport-BiBcgVKc.css.gz +0 -0
  321. package/client/assets/OperatorExport-CJd8jmY4.js +0 -2
  322. package/client/assets/OperatorExport-CJd8jmY4.js.br +0 -0
  323. package/client/assets/OperatorExport-CJd8jmY4.js.gz +0 -0
  324. package/client/assets/OperatorExport-CJd8jmY4.js.map +0 -1
  325. package/client/assets/OverviewWrapper-1Vj3_ojX.js +0 -2
  326. package/client/assets/OverviewWrapper-1Vj3_ojX.js.br +0 -0
  327. package/client/assets/OverviewWrapper-1Vj3_ojX.js.gz +0 -0
  328. package/client/assets/OverviewWrapper-1Vj3_ojX.js.map +0 -1
  329. package/client/assets/PipHost-BUF7n-lT.css +0 -1
  330. package/client/assets/PipHost-BUF7n-lT.css.br +0 -0
  331. package/client/assets/PipHost-BUF7n-lT.css.gz +0 -0
  332. package/client/assets/PipHost-D7liNR4M.js +0 -2
  333. package/client/assets/PipHost-D7liNR4M.js.br +0 -0
  334. package/client/assets/PipHost-D7liNR4M.js.gz +0 -0
  335. package/client/assets/PipHost-D7liNR4M.js.map +0 -1
  336. package/client/assets/ProjectInfo-BduQgjcz.js +0 -2
  337. package/client/assets/ProjectInfo-BduQgjcz.js.br +0 -0
  338. package/client/assets/ProjectInfo-BduQgjcz.js.gz +0 -0
  339. package/client/assets/ProtectRoute-Ci_AIozP.js +0 -2
  340. package/client/assets/ProtectRoute-Ci_AIozP.js.br +0 -0
  341. package/client/assets/ProtectRoute-Ci_AIozP.js.gz +0 -0
  342. package/client/assets/ProtectedCuesheet-C_tKodwo.css +0 -1
  343. package/client/assets/ProtectedCuesheet-C_tKodwo.css.br +0 -0
  344. package/client/assets/ProtectedCuesheet-C_tKodwo.css.gz +0 -0
  345. package/client/assets/ProtectedCuesheet-D_zdkwM-.js +0 -2
  346. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.br +0 -0
  347. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.gz +0 -0
  348. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.map +0 -1
  349. package/client/assets/ProtectedEditor-CNL2ig79.js +0 -3
  350. package/client/assets/ProtectedEditor-CNL2ig79.js.br +0 -0
  351. package/client/assets/ProtectedEditor-CNL2ig79.js.gz +0 -0
  352. package/client/assets/ProtectedEditor-CNL2ig79.js.map +0 -1
  353. package/client/assets/ProtectedEditor-Dw0pWw0J.css.br +0 -0
  354. package/client/assets/RundownEntry-Bs1ombtH.js +0 -2
  355. package/client/assets/RundownEntry-Bs1ombtH.js.br +0 -0
  356. package/client/assets/RundownEntry-Bs1ombtH.js.gz +0 -0
  357. package/client/assets/RundownEntry-Bs1ombtH.js.map +0 -1
  358. package/client/assets/RundownExport-BCT0ybxy.js +0 -3
  359. package/client/assets/RundownExport-BCT0ybxy.js.br +0 -0
  360. package/client/assets/RundownExport-BCT0ybxy.js.gz +0 -0
  361. package/client/assets/RundownExport-BCT0ybxy.js.map +0 -1
  362. package/client/assets/RundownExport-DtSvAfBG.css.br +0 -0
  363. package/client/assets/RundownExport-DtSvAfBG.css.gz +0 -0
  364. package/client/assets/Select-B5xNi_tM.js +0 -2
  365. package/client/assets/Select-B5xNi_tM.js.br +0 -0
  366. package/client/assets/Select-B5xNi_tM.js.gz +0 -0
  367. package/client/assets/Select-B5xNi_tM.js.map +0 -1
  368. package/client/assets/Studio-D4hRKhJ1.js +0 -2
  369. package/client/assets/Studio-D4hRKhJ1.js.br +0 -0
  370. package/client/assets/Studio-D4hRKhJ1.js.gz +0 -0
  371. package/client/assets/Studio-D4hRKhJ1.js.map +0 -1
  372. package/client/assets/StyleEditor-BvcE8dkA.js +0 -2
  373. package/client/assets/StyleEditor-BvcE8dkA.js.br +0 -3
  374. package/client/assets/StyleEditor-BvcE8dkA.js.gz +0 -0
  375. package/client/assets/SuperscriptPeriod-BmHAoSBy.js +0 -2
  376. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.br +0 -0
  377. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.gz +0 -0
  378. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.map +0 -1
  379. package/client/assets/SuperscriptTime-Nou92D8X.js +0 -2
  380. package/client/assets/SuperscriptTime-Nou92D8X.js.br +0 -0
  381. package/client/assets/SuperscriptTime-Nou92D8X.js.gz +0 -0
  382. package/client/assets/SuperscriptTime-Nou92D8X.js.map +0 -1
  383. package/client/assets/TimeElements-XpRwBsaa.js.br +0 -0
  384. package/client/assets/TimeElements-XpRwBsaa.js.gz +0 -0
  385. package/client/assets/TimeElements-XpRwBsaa.js.map +0 -1
  386. package/client/assets/TimeInput-Bu_5GlHP.js +0 -2
  387. package/client/assets/TimeInput-Bu_5GlHP.js.br +0 -0
  388. package/client/assets/TimeInput-Bu_5GlHP.js.gz +0 -0
  389. package/client/assets/TimelinePage-CQqUB1KT.js +0 -2
  390. package/client/assets/TimelinePage-CQqUB1KT.js.br +0 -0
  391. package/client/assets/TimelinePage-CQqUB1KT.js.gz +0 -0
  392. package/client/assets/TimelinePage-CQqUB1KT.js.map +0 -1
  393. package/client/assets/Timer-B7nk3TMf.css.br +0 -0
  394. package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
  395. package/client/assets/Timer-CIr2L3gJ.js +0 -2
  396. package/client/assets/Timer-CIr2L3gJ.js.br +0 -0
  397. package/client/assets/Timer-CIr2L3gJ.js.gz +0 -0
  398. package/client/assets/Timer-CIr2L3gJ.js.map +0 -1
  399. package/client/assets/TimerControlExport-4a3Cd9x8.js +0 -2
  400. package/client/assets/TimerControlExport-4a3Cd9x8.js.br +0 -0
  401. package/client/assets/TimerControlExport-4a3Cd9x8.js.gz +0 -0
  402. package/client/assets/TimerControlExport-DavNxY9p.css.br +0 -0
  403. package/client/assets/TitleCard-1U35ek0D.js +0 -2
  404. package/client/assets/TitleCard-1U35ek0D.js.br +0 -0
  405. package/client/assets/TitleCard-1U35ek0D.js.gz +0 -0
  406. package/client/assets/Tooltip-B8y25e3n.js +0 -2
  407. package/client/assets/Tooltip-B8y25e3n.js.br +0 -0
  408. package/client/assets/Tooltip-B8y25e3n.js.gz +0 -0
  409. package/client/assets/Tooltip-B8y25e3n.js.map +0 -1
  410. package/client/assets/ViewLogo-BHsV7Faa.js +0 -2
  411. package/client/assets/ViewLogo-BHsV7Faa.js.br +0 -0
  412. package/client/assets/ViewLogo-BHsV7Faa.js.gz +0 -0
  413. package/client/assets/ViewParamsEditor-BMHXOv-K.js +0 -2
  414. package/client/assets/ViewParamsEditor-BMHXOv-K.js.br +0 -0
  415. package/client/assets/ViewParamsEditor-BMHXOv-K.js.gz +0 -0
  416. package/client/assets/ViewParamsEditor-BMHXOv-K.js.map +0 -1
  417. package/client/assets/dateConfig-_BhycZza.js +0 -2
  418. package/client/assets/dateConfig-_BhycZza.js.br +0 -0
  419. package/client/assets/dateConfig-_BhycZza.js.gz +0 -0
  420. package/client/assets/dateConfig-_BhycZza.js.map +0 -1
  421. package/client/assets/editorSettings-DH9ca-nB.js +0 -2
  422. package/client/assets/editorSettings-DH9ca-nB.js.br +0 -0
  423. package/client/assets/editorSettings-DH9ca-nB.js.gz +0 -0
  424. package/client/assets/getProgress-DlrSzpnf.js.br +0 -0
  425. package/client/assets/getProgress-DlrSzpnf.js.gz +0 -0
  426. package/client/assets/index-BuJoGGff.css.br +0 -0
  427. package/client/assets/index-BuJoGGff.css.gz +0 -0
  428. package/client/assets/index-CDBQg2fh.js +0 -3
  429. package/client/assets/index-CDBQg2fh.js.br +0 -0
  430. package/client/assets/index-CDBQg2fh.js.gz +0 -0
  431. package/client/assets/index-CDBQg2fh.js.map +0 -1
  432. package/client/assets/offset-CLG4o744.js.br +0 -0
  433. package/client/assets/offset-CLG4o744.js.gz +0 -0
  434. package/client/assets/parseUserTime-Cp5iWS7y.js +0 -2
  435. package/client/assets/parseUserTime-Cp5iWS7y.js.br +0 -0
  436. package/client/assets/parseUserTime-Cp5iWS7y.js.gz +0 -0
  437. package/client/assets/playbackstate-B3BKJ8cT.js.br +0 -0
  438. package/client/assets/playbackstate-B3BKJ8cT.js.gz +0 -0
  439. package/client/assets/presentation.utils-B-wIv_a5.js.br +0 -0
  440. package/client/assets/presentation.utils-B-wIv_a5.js.gz +0 -0
  441. package/client/assets/rundownUtils-DJKMt8Ih.js.br +0 -0
  442. package/client/assets/rundownUtils-DJKMt8Ih.js.gz +0 -0
  443. package/client/assets/timer.utils-ByC_bcT9.js +0 -2
  444. package/client/assets/timer.utils-ByC_bcT9.js.br +0 -0
  445. package/client/assets/timer.utils-ByC_bcT9.js.gz +0 -0
  446. package/client/assets/timer.utils-ByC_bcT9.js.map +0 -1
  447. package/client/assets/useCustomFields-BUJkzZvM.js +0 -2
  448. package/client/assets/useCustomFields-BUJkzZvM.js.br +0 -2
  449. package/client/assets/useCustomFields-BUJkzZvM.js.gz +0 -0
  450. package/client/assets/useFollowComponent-Eyo4hWVG.js +0 -2
  451. package/client/assets/useFollowComponent-Eyo4hWVG.js.br +0 -0
  452. package/client/assets/useFollowComponent-Eyo4hWVG.js.gz +0 -0
  453. package/client/assets/useProjectData-DGA6K2Zs.js +0 -2
  454. package/client/assets/useProjectData-DGA6K2Zs.js.br +0 -0
  455. package/client/assets/useProjectData-DGA6K2Zs.js.gz +0 -0
  456. package/client/assets/useProjectData-DGA6K2Zs.js.map +0 -1
  457. package/client/assets/useReport-BUCsRa2T.js +0 -2
  458. package/client/assets/useReport-BUCsRa2T.js.br +0 -0
  459. package/client/assets/useReport-BUCsRa2T.js.gz +0 -0
  460. package/client/assets/useRundown-BFae0_bU.js +0 -2
  461. package/client/assets/useRundown-BFae0_bU.js.br +0 -0
  462. package/client/assets/useRundown-BFae0_bU.js.gz +0 -0
  463. package/client/assets/useRundown-BFae0_bU.js.map +0 -1
  464. package/client/assets/useWindowTitle-DU8NlxIu.js +0 -2
  465. package/client/assets/useWindowTitle-DU8NlxIu.js.br +0 -0
  466. package/client/assets/useWindowTitle-DU8NlxIu.js.gz +0 -0
  467. package/client/assets/useWindowTitle-DU8NlxIu.js.map +0 -1
  468. package/client/assets/validateEvent-3adKsP1N.js.br +0 -0
  469. package/client/assets/validateEvent-3adKsP1N.js.gz +0 -0
  470. package/client/assets/vendor-BoH5HFNN.js +0 -75
  471. package/client/assets/vendor-BoH5HFNN.js.br +0 -0
  472. package/client/assets/vendor-BoH5HFNN.js.gz +0 -0
  473. package/client/assets/viewLoader.utils-BPOG1xso.js.br +0 -0
  474. package/client/assets/viewLoader.utils-BPOG1xso.js.gz +0 -0
  475. package/client/assets/viewUtils-DI8_kmUZ.js +0 -2
  476. package/client/assets/viewUtils-DI8_kmUZ.js.br +0 -0
  477. package/client/assets/viewUtils-DI8_kmUZ.js.gz +0 -0
  478. package/client/assets/viewUtils-DI8_kmUZ.js.map +0 -1
  479. /package/client/assets/{useProjectData-Cw1aXCwD.css → SwatchPicker-Cw1aXCwD.css} +0 -0
  480. /package/client/assets/{useProjectData-Cw1aXCwD.css.br → SwatchPicker-Cw1aXCwD.css.br} +0 -0
  481. /package/client/assets/{useProjectData-Cw1aXCwD.css.gz → SwatchPicker-Cw1aXCwD.css.gz} +0 -0
@@ -1,2 +0,0 @@
1
- import{j as e,l as Q,h as d,o as se,ab as ne}from"./vendor-BoH5HFNN.js";import{e as o,q as ae,w as ie,f as x,P as re,h as M,x as z,y as oe,u as ce,b as le,L as de,d as K,z as ue,m as me,r as he,g as fe,O as xe,v as pe,A as ve}from"./index-CDBQg2fh.js";import{g as ge}from"./getProgress-DlrSzpnf.js";import{E as ye}from"./Empty-C0IdV_kI.js";import{E as _e}from"./EmptyPage-Ct3d0DqJ.js";import{T as D}from"./TitleCard-1U35ek0D.js";import{V as je}from"./ViewLogo-BHsV7Faa.js";import{O as H,m as A,a as Ne,V as we}from"./ViewParamsEditor-BMHXOv-K.js";import{u as be}from"./useWindowTitle-DU8NlxIu.js";import{S as C}from"./SuperscriptTime-Nou92D8X.js";import{b as Se,i as W,c as Ee}from"./useRundown-BFae0_bU.js";import{i as q,b as B}from"./viewUtils-DI8_kmUZ.js";import{g as ke}from"./offset-CLG4o744.js";import{S as w}from"./SuperscriptPeriod-BmHAoSBy.js";import{g as Pe,a as Ie}from"./viewLoader.utils-BPOG1xso.js";import{u as Te}from"./useCustomFields-BUJkzZvM.js";import{u as Oe}from"./useProjectData-DGA6K2Zs.js";import"./Select-B5xNi_tM.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]="bc80bc7b-7935-41d4-bac1-77f157eefe86",t._sentryDebugIdIdentifier="sentry-dbid-bc80bc7b-7935-41d4-bac1-77f157eefe86")}catch{}})();function Ce(t){const{current:s,duration:n,className:a}=t,i=ge(s,n);return e.jsx("div",{className:`progress-bar__bg ${a}`,children:e.jsx("div",{className:"progress-bar__indicator",style:{width:`${i}%`}})})}const Fe=t=>({title:H.Schedule,collapsible:!0,options:[{id:"filter",title:"Filter",description:"Hide events without data in the selected custom field",type:"option",values:t,defaultValue:"none"},{id:"stopCycle",title:"Stop cycling through event pages",description:"Schedule will not auto-cycle through events",type:"boolean",defaultValue:!1},{id:"cycleInterval",title:"Cycle interval",description:"How long (in seconds) should each schedule page be shown.",type:"number",defaultValue:10},{id:"showExpected",title:"Show expected time",description:"Whether the times shown should account for the runtime offset.",type:"boolean",defaultValue:!1}]});function Ve(t){return{filter:t.get("filter"),cycleInterval:Number(t.get("cycleInterval"))||10,stopCycle:q(t.get("stopCycle")),showExpected:q(t.get("showExpected"))}}function U(){const[t]=Q();return d.useMemo(()=>Ve(t),[t])}const Z=d.createContext(void 0),Be=({children:t,selectedEventId:s})=>{const{cycleInterval:n,stopCycle:a,filter:i}=U(),{data:r}=Se(c=>{if(i){const k=i.startsWith("custom-")?i.slice(7):i;return W(c)&&!!c.custom[k]}return W(c)}),[l,u]=d.useState(-1),[f,v]=d.useState(0),[p,g]=d.useState(0),m=d.useRef(-1),b=d.useRef(void 0),j=d.useRef(null);d.useLayoutEffect(()=>{if(!j.current)return;const c=Array.from(j.current.children);if(c.length===0)return;const k=j.current.clientHeight;let S=0,V=1,P=1,I=-1,y=!1;for(let h=0;h<c.length;h++){const _=c[h].clientHeight,O=S+_>k;O&&(S=0,P+=1),h<l?T(c[h]):I===-1?(y=!0,V=P):O&&(y=!1),y?(I=h,L(c[h],S)):T(c[h]),S+=_}g(V),v(P),m.current=I;function L(h,_){h.style.top=`${_}px`}function T(h){h.style.top="-1000px"}},[l,r]),d.useEffect(()=>{if(a){g(1),u(0);return}b.current&&clearInterval(b.current);const c=setInterval(()=>{u(p===f?0:m.current+1)},n*1e3);return b.current=c,()=>clearInterval(b.current)},[n,f,a,p]);let F=r.findIndex(c=>c.id===s);const N=r.slice(F+1);return F=0,e.jsx(Z,{value:{events:N,selectedEventId:s,numPages:f,visiblePage:p,containerRef:j},children:t})},J=()=>{const t=d.use(Z);if(!t)throw new Error("useSchedule() can only be used inside a ScheduleContext");return t},E={format12:"h:mm a",format24:"HH:mm"};function He({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:l,duration:u,skip:f,title:v,timeEnd:p,cue:g}){const{showExpected:m}=U();return e.jsxs("li",{className:o(["entry",f&&"entry--skip"]),"data-testid":g,children:[e.jsx("div",{className:"entry-times",children:m?e.jsx(Re,{timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:u,colour:l}):n>0?e.jsx(Me,{timeStart:t,delay:n,colour:l,timeEnd:p}):e.jsx(Le,{timeStart:t,timeEnd:p,colour:l})}),e.jsx("div",{className:"entry-title",children:v})]})}function Le({timeStart:t,timeEnd:s,colour:n}){const a=x(t,E),i=x(s,E);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:n}}),e.jsx(w,{time:a}),"→",e.jsx(w,{time:i})]})}function Me({timeStart:t,timeEnd:s,colour:n,delay:a}){const i=x(t,E),r=x(s,E),l=x(t+a,E),u=x(s+a,E);return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"entry-times--delayed",children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:n}}),e.jsx(w,{time:i}),"→",e.jsx(w,{time:r})]}),e.jsxs("span",{className:"entry-times--delay",children:[e.jsx(w,{time:l}),"→",e.jsx(w,{time:u})]})]})}function Re({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:l,duration:u}){const f=ae(),{expectedStart:v,expectedEnd:p,plannedEnd:g}=ie({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:u},f);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:l}}),e.jsx(G,{expectedTime:v,plannedTime:t}),"→",e.jsx(G,{expectedTime:p,plannedTime:g})]})}function G({expectedTime:t,plannedTime:s}){const n=x(t),a=ke(t-s);return e.jsx(w,{className:`entry-times--${a}`,time:n})}function $e({className:t}){const{events:s,containerRef:n}=J();return(s==null?void 0:s.length)<1?null:e.jsx("ul",{className:o(["schedule",t]),ref:n,children:s.map(a=>e.jsx(He,{timeStart:a.timeStart,dayOffset:a.dayOffset,delay:a.delay,totalGap:a.totalGap,isLinkedToLoaded:a.isLinkedToLoaded,countToEnd:a.countToEnd,duration:a.duration,colour:a.colour,skip:a.skip,title:a.title,timeEnd:a.timeEnd,cue:a.cue},a.id))})}function ze({className:t}){const{numPages:s,visiblePage:n}=J();return s>10?e.jsxs("div",{className:o(["schedule-nav",t]),children:[e.jsx("div",{className:o(["schedule-nav__item",n===1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===5&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item","schedule-nav__item--indeterminate",n>5&&n<s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s&&"schedule-nav__item--selected"])})]}):e.jsx("div",{className:o(["schedule-nav",t]),children:s>1&&[...Array(s).keys()].map(a=>e.jsx("div",{className:o(["schedule-nav__item",a+1===n&&"schedule-nav__item--selected"])},a))})}const De=d.memo(Ae);function Ae(t){const{selectedId:s}=t;return e.jsxs(Be,{selectedEventId:s,children:[e.jsx(ze,{className:"schedule-nav-container"}),e.jsx($e,{className:"schedule-container"})]})}const We=(t,s,n)=>{const a=A(s,[{value:"none",label:"None"}]),i=A(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]),r=Ne(n,[{value:"none",label:"None"}]);return[{title:H.ClockOptions,collapsible:!0,options:[Pe(t)]},{title:H.DataSources,collapsible:!0,options:[{id:"secondary-src",title:"Event secondary text",description:"Select the data source for auxiliary text shown in now and next cards",type:"option",values:i,defaultValue:"none"}]},Fe(a),{title:H.ElementVisibility,collapsible:!0,options:[{id:"extra-info",title:"Extra info",description:"Select a project data source to show in the view",type:"option",values:r,defaultValue:"none"}]}]};function qe(t,s){const n=a=>(s==null?void 0:s.get(a))??t.get(a);return{secondarySource:n("secondary-src"),extraInfo:n("extra-info")}}function Ge(){const[t]=Q(),s=d.use(re);return d.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return qe(t,a)},[s,t])}function Qe(t){return(t??0)<0}function Ke(t){return t!==M.Stop}function Ue(t,s){return t===M.Roll&&s===oe.Pending}function Ze(t,s,n,a,i){if(i===M.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const r=B(t,n)||z,l=B(t,a),u=B(s,n)||z,f=B(s,a);return{showNow:t!==null,nowMain:r,nowSecondary:l,showNext:s!==null,nextMain:u,nextSecondary:f}}function Je(){const t=ce(v=>v.mirror),{data:s,status:n}=Ee(),{data:a,status:i}=Oe(),{data:r,status:l}=le(),{data:u,status:f}=Te();return{data:{events:s,customFields:u,projectData:a,isMirrored:t,settings:r},status:Ie([n,i,l,f])}}function _t(){const{data:t,status:s}=Je();return be("Backstage"),s==="pending"?e.jsx(de,{}):s==="error"?e.jsx(_e,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Xe,{...t})}function Xe({events:t,customFields:s,projectData:n,isMirrored:a,settings:i}){const{getLocalizedString:r}=K(),{secondarySource:l,extraInfo:u}=Ge(),{eventNext:f,eventNow:v,rundown:p,selectedEventId:g,time:m}=ue(),[b,j]=d.useState(!1),{height:F}=se();d.useEffect(()=>{j(!1);const te=setTimeout(()=>{j(!0)},10);return()=>clearTimeout(te)},[g]);const N=t.length>0,{showNow:c,nowMain:k,nowSecondary:S,showNext:V,nextMain:P,nextSecondary:I}=Ze(v,f,"title",l,m.playback),y=Ue(m.playback,m.phase),L=y?x(m.secondaryTimer):x(m.startedAt),T=(()=>{if(!c&&N)return x(p.plannedStart,{format12:"h:mm a",format24:"HH:mm"})})(),h=(()=>{if(!c&&N)return x(p.plannedEnd,{format12:"h:mm a",format24:"HH:mm"})})();let _=me(m.current,{fallback:ve});_=he(_);const O=Math.max(window.innerWidth/15,72),X=Ke(m.playback),R=N&&F>420,Y=T&&h,$=fe(i==null?void 0:i.timeFormat),ee=d.useMemo(()=>We($,s,n),[$,s,n]);return e.jsxs("div",{className:`backstage ${a?"mirror":""}`,"data-testid":"backstage-view",children:[e.jsx(we,{target:xe.Backstage,viewOptions:ee}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(je,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(et,{})]}),X&&e.jsx(Ce,{className:"progress-container",current:m.current,duration:m.duration}),!N&&e.jsx(ye,{text:r("common.no_data"),className:"empty-container"}),e.jsxs("div",{className:"card-container",children:[c&&e.jsxs("div",{className:o(["event","now",b&&"blink"]),children:[e.jsx(D,{title:k,secondary:S}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:o(["time-entry__label",y&&"time-entry--pending"]),children:r(y?"countdown.waiting":"common.started_at")}),e.jsx(C,{time:L,className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.expected_finish")}),Qe(m.current)?e.jsx("div",{className:"time-entry__value",children:r("countdown.overtime")}):e.jsx(C,{time:x(m.expectedFinish),className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.stage_timer")}),e.jsx("div",{className:"time-entry__value",children:_})]})]})]}),Y&&e.jsxs("div",{className:"event",children:[e.jsx("div",{className:"title-card__placeholder",children:r("countdown.waiting")}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:o(["time-entry__label",y&&"time-entry--pending"]),children:r("common.scheduled_start")}),e.jsx(C,{time:T,className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.scheduled_end")}),e.jsx(C,{time:h,className:"time-entry__value"})]})]})]}),V&&N&&e.jsx(D,{className:"event",label:"next",title:P,secondary:I})]}),R&&e.jsx(De,{selectedId:g}),e.jsxs("div",{className:o(["info",!R&&"info--stretch"]),children:[u&&e.jsx(Ye,{projectData:n,size:O,source:u}),e.jsxs("div",{className:"info-card",children:[n.url&&e.jsx(ne,{value:n.url,size:O,level:"L",className:"info-card__qr"}),n.info&&e.jsx("div",{className:"info-card__message",children:n.info})]})]})]})}function Ye({projectData:t,size:s,source:n}){const a=t.custom.find((i,r)=>`${r}-${i.title}`===n);return a?e.jsxs("div",{className:"info-card",children:[a.url&&e.jsx("img",{className:"info-card__img",width:s,src:a.url,onError:i=>i.currentTarget.style.display="none"}),e.jsxs("div",{className:"info__column",children:[a.title&&e.jsx("div",{className:"info-card__label",children:a.title}),a.value&&e.jsx("div",{className:"info-card__message",children:a.value})]})]}):null}function et(){const{getLocalizedString:t}=K(),{clock:s}=pe(),n=x(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(C,{time:n,className:"time"})]})}export{_t as default};
2
- //# sourceMappingURL=Backstage-DG-hwPI3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Backstage-DG-hwPI3.js","sources":["../../src/common/components/progress-bar/ProgressBar.tsx","../../src/views/common/schedule/schedule.options.ts","../../src/views/common/schedule/ScheduleContext.tsx","../../src/views/common/schedule/ScheduleItem.tsx","../../src/views/common/schedule/Schedule.tsx","../../src/views/common/schedule/ScheduleNav.tsx","../../src/views/common/schedule/ScheduleExport.tsx","../../src/views/backstage/backstage.options.ts","../../src/views/backstage/backstage.utils.ts","../../src/views/backstage/useBackstageData.ts","../../src/views/backstage/Backstage.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\n\nimport './ProgressBar.scss';\n\ninterface ProgressBarProps {\n current: MaybeNumber;\n duration: MaybeNumber;\n className?: string;\n}\n\nexport default function ProgressBar(props: ProgressBarProps) {\n const { current, duration, className } = props;\n const progress = getProgress(current, duration);\n\n return (\n <div className={`progress-bar__bg ${className}`}>\n <div className='progress-bar__indicator' style={{ width: `${progress}%` }} />\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { SelectOption } from '../../../common/components/select/Select';\nimport { OptionTitle } from '../../../common/components/view-params-editor/constants';\nimport type { ViewOption } from '../../../common/components/view-params-editor/viewParams.types';\nimport { isStringBoolean } from '../../../features/viewers/common/viewUtils';\n\nexport const getScheduleOptions = (customFieldOptions: SelectOption[]): ViewOption => ({\n title: OptionTitle.Schedule,\n collapsible: true,\n options: [\n {\n id: 'filter',\n title: 'Filter',\n description: 'Hide events without data in the selected custom field',\n type: 'option',\n values: customFieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'stopCycle',\n title: 'Stop cycling through event pages',\n description: 'Schedule will not auto-cycle through events',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'cycleInterval',\n title: 'Cycle interval',\n description: 'How long (in seconds) should each schedule page be shown.',\n type: 'number',\n defaultValue: 10,\n },\n {\n id: 'showExpected',\n title: 'Show expected time',\n description: 'Whether the times shown should account for the runtime offset.',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n});\n\ntype ScheduleOptions = {\n filter: string | null;\n cycleInterval: number;\n stopCycle: boolean;\n showExpected: boolean;\n};\n\nfunction getScheduleOptionsFromParams(searchParams: URLSearchParams): ScheduleOptions {\n return {\n filter: searchParams.get('filter'),\n cycleInterval: Number(searchParams.get('cycleInterval')) || 10,\n stopCycle: isStringBoolean(searchParams.get('stopCycle')),\n showExpected: isStringBoolean(searchParams.get('showExpected')),\n };\n}\n\n/**\n * Hook exposes the schedule component options\n */\nexport function useScheduleOptions() {\n const [searchParams] = useSearchParams();\n const options = useMemo(() => getScheduleOptionsFromParams(searchParams), [searchParams]);\n return options;\n}\n","import { createContext, PropsWithChildren, RefObject, use, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { EntryId, isOntimeEvent, OntimeEntry, OntimeEvent } from 'ontime-types';\n\nimport { usePartialRundown } from '../../../common/hooks-query/useRundown';\nimport { ExtendedEntry } from '../../../common/utils/rundownMetadata';\n\nimport { useScheduleOptions } from './schedule.options';\n\ninterface ScheduleContextState {\n events: ExtendedEntry<OntimeEvent>[];\n selectedEventId: string | null;\n numPages: number;\n visiblePage: number;\n containerRef: RefObject<HTMLUListElement | null>;\n}\n\nconst ScheduleContext = createContext<ScheduleContextState | undefined>(undefined);\n\ninterface ScheduleProviderProps {\n selectedEventId: EntryId | null;\n}\n\nexport const ScheduleProvider = ({ children, selectedEventId }: PropsWithChildren<ScheduleProviderProps>) => {\n const { cycleInterval, stopCycle, filter } = useScheduleOptions();\n const { data: events } = usePartialRundown((entry: ExtendedEntry<OntimeEntry>) => {\n if (filter) {\n // custom keys are prepended with custom-\n const customKey = filter.startsWith('custom-') ? filter.slice('custom-'.length) : filter;\n return isOntimeEvent(entry) && Boolean(entry.custom[customKey]);\n }\n return isOntimeEvent(entry);\n });\n\n const [firstIndex, setFirstIndex] = useState(-1);\n const [numPages, setNumPages] = useState(0);\n const [visiblePage, setVisiblePage] = useState(0);\n\n const lastIndex = useRef(-1);\n const paginator = useRef<NodeJS.Timeout>(undefined);\n\n const containerRef = useRef<HTMLUListElement>(null);\n\n // After the view is rendered, we paginate by hiding elements that dont fit\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n\n const children = Array.from(containerRef.current.children) as HTMLElement[];\n if (children.length === 0) {\n return;\n }\n\n const containerHeight = containerRef.current.clientHeight;\n let currentPageHeight = 0; // used to check when we need to paginate\n let currentPage = 1;\n let numPages = 1;\n let lastVisibleIndex = -1; // keep track of last index on screen\n let isShowingElements = false;\n\n for (let i = 0; i < children.length; i++) {\n const currentElementHeight = children[i].clientHeight;\n\n // can we fit this element in the current page?\n const isNextPage = currentPageHeight + currentElementHeight > containerHeight;\n if (isNextPage) {\n currentPageHeight = 0;\n numPages += 1;\n }\n\n // we hide elements that are before and after the first element to show\n if (i < firstIndex) {\n hideElement(children[i]);\n } else if (lastVisibleIndex === -1) {\n isShowingElements = true;\n currentPage = numPages;\n } else if (isNextPage) {\n isShowingElements = false;\n }\n\n if (!isShowingElements) {\n hideElement(children[i]);\n } else {\n lastVisibleIndex = i;\n showElement(children[i], currentPageHeight);\n }\n\n currentPageHeight += currentElementHeight;\n }\n\n setVisiblePage(currentPage);\n setNumPages(numPages);\n lastIndex.current = lastVisibleIndex;\n\n function showElement(element: HTMLElement, yPosition: number) {\n element.style.top = `${yPosition}px`;\n }\n\n function hideElement(element: HTMLElement) {\n element.style.top = `${-1000}px`;\n }\n // we need to add the events to make sure the effect runs on first render\n }, [firstIndex, events]);\n\n // schedule cycling through events\n useEffect(() => {\n if (stopCycle) {\n setVisiblePage(1);\n setFirstIndex(0);\n return;\n }\n\n if (paginator.current) {\n clearInterval(paginator.current);\n }\n\n const interval = setInterval(() => {\n // ensure we cycle back to the first event\n if (visiblePage === numPages) {\n setFirstIndex(0);\n } else {\n setFirstIndex(lastIndex.current + 1);\n }\n }, cycleInterval * 1000);\n paginator.current = interval;\n\n return () => clearInterval(paginator.current);\n }, [cycleInterval, numPages, stopCycle, visiblePage]);\n\n let selectedEventIndex = events.findIndex((event) => event.id === selectedEventId);\n\n // we want to show the event after the current\n const viewEvents = events.slice(selectedEventIndex + 1);\n selectedEventIndex = 0;\n\n return (\n <ScheduleContext\n value={{\n events: viewEvents as ExtendedEntry<OntimeEvent>[],\n selectedEventId,\n numPages,\n visiblePage,\n containerRef,\n }}\n >\n {children}\n </ScheduleContext>\n );\n};\n\nexport const useSchedule = () => {\n const context = use(ScheduleContext);\n if (!context) {\n throw new Error('useSchedule() can only be used inside a ScheduleContext');\n }\n return context;\n};\n","import { OntimeEvent } from 'ontime-types';\n\nimport { useExpectedStartData } from '../../../common/hooks/useSocket';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { ExtendedEntry } from '../../../common/utils/rundownMetadata';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { formatTime, getExpectedTimesFromExtendedEvent } from '../../../common/utils/time';\nimport SuperscriptPeriod from '../../../features/viewers/common/superscript-time/SuperscriptPeriod';\n\nimport { useScheduleOptions } from './schedule.options';\n\nimport './Schedule.scss';\n\nconst formatOptions = {\n format12: 'h:mm a',\n format24: 'HH:mm',\n};\n\ntype ScheduleItemProps = Pick<\n ExtendedEntry<OntimeEvent>,\n | 'timeStart'\n | 'dayOffset'\n | 'delay'\n | 'totalGap'\n | 'isLinkedToLoaded'\n | 'countToEnd'\n | 'duration'\n | 'colour'\n | 'skip'\n | 'title'\n | 'timeEnd'\n | 'cue'\n>;\n\nexport default function ScheduleItem({\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n colour,\n duration,\n skip,\n title,\n timeEnd,\n cue,\n}: ScheduleItemProps) {\n const { showExpected } = useScheduleOptions();\n\n return (\n <li className={cx(['entry', skip && 'entry--skip'])} data-testid={cue}>\n <div className='entry-times'>\n {showExpected ? (\n <ExpectedScheduleItem\n timeStart={timeStart}\n dayOffset={dayOffset}\n delay={delay}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n countToEnd={countToEnd}\n duration={duration}\n colour={colour}\n />\n ) : delay > 0 ? (\n <DelayedScheduleItem timeStart={timeStart} delay={delay} colour={colour} timeEnd={timeEnd} />\n ) : (\n <PlannedScheduleItem timeStart={timeStart} timeEnd={timeEnd} colour={colour} />\n )}\n </div>\n <div className='entry-title'>{title}</div>\n </li>\n );\n}\n\nfunction PlannedScheduleItem({\n timeStart,\n timeEnd,\n colour,\n}: Pick<ScheduleItemProps, 'timeStart' | 'timeEnd' | 'colour'>) {\n const start = formatTime(timeStart, formatOptions);\n const end = formatTime(timeEnd, formatOptions);\n\n return (\n <>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <SuperscriptPeriod time={start} />\n →\n <SuperscriptPeriod time={end} />\n </>\n );\n}\n\nfunction DelayedScheduleItem({\n timeStart,\n timeEnd,\n colour,\n delay,\n}: Pick<ScheduleItemProps, 'timeStart' | 'timeEnd' | 'colour' | 'delay'>) {\n const start = formatTime(timeStart, formatOptions);\n const end = formatTime(timeEnd, formatOptions);\n const delayedStart = formatTime(timeStart + delay, formatOptions);\n const delayedEnd = formatTime(timeEnd + delay, formatOptions);\n\n return (\n <>\n <span className='entry-times--delayed'>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <SuperscriptPeriod time={start} />\n →\n <SuperscriptPeriod time={end} />\n </span>\n <span className='entry-times--delay'>\n <SuperscriptPeriod time={delayedStart} />\n →\n <SuperscriptPeriod time={delayedEnd} />\n </span>\n </>\n );\n}\n\nfunction ExpectedScheduleItem({\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n colour,\n duration,\n}: Omit<ScheduleItemProps, 'timeEnd' | 'cue' | 'skip' | 'title'>) {\n const expectedStartData = useExpectedStartData();\n const { expectedStart, expectedEnd, plannedEnd } = getExpectedTimesFromExtendedEvent(\n {\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n duration,\n },\n expectedStartData,\n );\n\n return (\n <>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <ExpectedTime expectedTime={expectedStart} plannedTime={timeStart} />\n →\n <ExpectedTime expectedTime={expectedEnd} plannedTime={plannedEnd} />\n </>\n );\n}\n\ninterface ExpectedTimeProps {\n expectedTime: number;\n plannedTime: number;\n}\n\nfunction ExpectedTime({ expectedTime, plannedTime }: ExpectedTimeProps) {\n const timeDisplay = formatTime(expectedTime);\n const expectedState = getOffsetState(expectedTime - plannedTime);\n return <SuperscriptPeriod className={`entry-times--${expectedState}`} time={timeDisplay} />;\n}\n","import { cx } from '../../../common/utils/styleUtils';\n\nimport { useSchedule } from './ScheduleContext';\nimport ScheduleItem from './ScheduleItem';\n\nimport './Schedule.scss';\n\ninterface ScheduleProps {\n className?: string;\n}\n\nexport default function Schedule({ className }: ScheduleProps) {\n const { events, containerRef } = useSchedule();\n\n if (events?.length < 1) {\n return null;\n }\n\n return (\n <ul className={cx(['schedule', className])} ref={containerRef}>\n {events.map((event) => {\n return (\n <ScheduleItem\n key={event.id}\n timeStart={event.timeStart}\n dayOffset={event.dayOffset}\n delay={event.delay}\n totalGap={event.totalGap}\n isLinkedToLoaded={event.isLinkedToLoaded}\n countToEnd={event.countToEnd}\n duration={event.duration}\n colour={event.colour}\n skip={event.skip}\n title={event.title}\n timeEnd={event.timeEnd}\n cue={event.cue}\n />\n );\n })}\n </ul>\n );\n}\n","import { cx } from '../../../common/utils/styleUtils';\n\nimport { useSchedule } from './ScheduleContext';\n\nimport './Schedule.scss';\n\ninterface ScheduleNavProps {\n className?: string;\n}\n\nexport default function ScheduleNav({ className }: ScheduleNavProps) {\n const { numPages, visiblePage } = useSchedule();\n\n // cap the amount of elements to 11\n if (numPages > 10) {\n return (\n <div className={cx(['schedule-nav', className])}>\n <div className={cx(['schedule-nav__item', visiblePage === 1 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 2 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 3 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 4 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 5 && 'schedule-nav__item--selected'])} />\n <div\n className={cx([\n 'schedule-nav__item',\n 'schedule-nav__item--indeterminate',\n visiblePage > 5 && visiblePage < numPages - 4 && 'schedule-nav__item--selected',\n ])}\n />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 4 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 3 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 2 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 1 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages && 'schedule-nav__item--selected'])} />\n </div>\n );\n }\n\n return (\n <div className={cx(['schedule-nav', className])}>\n {numPages > 1 &&\n [...Array(numPages).keys()].map((i) => (\n <div\n key={i}\n className={cx(['schedule-nav__item', i + 1 === visiblePage && 'schedule-nav__item--selected'])}\n />\n ))}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { MaybeString } from 'ontime-types';\n\nimport Schedule from './Schedule';\nimport { ScheduleProvider } from './ScheduleContext';\nimport ScheduleNav from './ScheduleNav';\n\ninterface ScheduleExportProps {\n selectedId: MaybeString;\n}\n\nexport default memo(ScheduleExport);\nfunction ScheduleExport(props: ScheduleExportProps) {\n const { selectedId } = props;\n return (\n <ScheduleProvider selectedEventId={selectedId}>\n <ScheduleNav className='schedule-nav-container' />\n <Schedule className='schedule-container' />\n </ScheduleProvider>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, ProjectData } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport {\n makeOptionsFromCustomFields,\n makeProjectDataOptions,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { getScheduleOptions } from '../common/schedule/schedule.options';\n\nexport const getBackstageOptions = (\n timeFormat: string,\n customFields: CustomFields,\n projectData: ProjectData,\n): ViewOption[] => {\n const customFieldOptions = makeOptionsFromCustomFields(customFields, [{ value: 'none', label: 'None' }]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'note', label: 'Note' },\n ]);\n const projectDataOptions = makeProjectDataOptions(projectData, [{ value: 'none', label: 'None' }]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'secondary-src',\n title: 'Event secondary text',\n description: 'Select the data source for auxiliary text shown in now and next cards',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n getScheduleOptions(customFieldOptions),\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'extra-info',\n title: 'Extra info',\n description: 'Select a project data source to show in the view',\n type: 'option',\n values: projectDataOptions,\n defaultValue: 'none',\n },\n ],\n },\n ];\n};\n\ntype BackstageOptions = {\n secondarySource: keyof OntimeEvent | null;\n extraInfo: string | null;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): BackstageOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n return {\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n extraInfo: getValue('extra-info'),\n };\n}\n\n/**\n * Hook exposes the backstage view options\n */\nexport function useBackstageOptions(): BackstageOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { MaybeNumber, OntimeEvent, Playback, TimerPhase } from 'ontime-types';\n\nimport { enDash } from '../../common/utils/styleUtils';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\n/**\n * Whether the current time is in overtime\n */\nexport function isOvertime(current: MaybeNumber): boolean {\n return (current ?? 0) < 0;\n}\n\n/**\n * Whether the progress bar should be shown\n */\nexport function getShowProgressBar(playback: Playback): boolean {\n return playback !== Playback.Stop;\n}\n\n/**\n * Whether the playback is pending start (ie: Roll mode waiting to start)\n */\nexport function getIsPendingStart(playback: Playback, phase: TimerPhase): boolean {\n return playback === Playback.Roll && phase === TimerPhase.Pending;\n}\n\n/**\n * What should we be showing in the cards?\n */\nexport function getCardData(\n eventNow: OntimeEvent | null,\n eventNext: OntimeEvent | null,\n mainSource: keyof OntimeEvent | null,\n secondarySource: keyof OntimeEvent | null,\n playback: Playback,\n) {\n if (playback === Playback.Stop) {\n return {\n showNow: false,\n nowMain: undefined,\n nowSecondary: undefined,\n showNext: false,\n nextMain: undefined,\n nextSecondary: undefined,\n };\n }\n\n // if we are loaded, we show the upcoming event as next\n const nowMain = getPropertyValue(eventNow, mainSource ?? 'title') || enDash;\n const nowSecondary = getPropertyValue(eventNow, secondarySource);\n const nextMain = getPropertyValue(eventNext, mainSource ?? 'title') || enDash;\n const nextSecondary = getPropertyValue(eventNext, secondarySource);\n\n return {\n showNow: eventNow !== null,\n nowMain,\n nowSecondary,\n showNext: eventNext !== null,\n nextMain,\n nextSecondary,\n };\n}\n","import { CustomFields, OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundown } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface BackstageData {\n events: OntimeEntry[];\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n}\n\nexport function useBackstageData(): ViewData<BackstageData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundown();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n events: rundownData,\n customFields,\n projectData,\n isMirrored,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport QRCode from 'react-qr-code';\nimport { useViewportSize } from '@mantine/hooks';\nimport { OntimeView, ProjectData } from 'ontime-types';\nimport { millisToString, removeLeadingZero } from 'ontime-utils';\n\nimport ProgressBar from '../../common/components/progress-bar/ProgressBar';\nimport Empty from '../../common/components/state/Empty';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useBackstageSocket, useClock } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx, timerPlaceholderMin } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport ScheduleExport from '../common/schedule/ScheduleExport';\n\nimport { getBackstageOptions, useBackstageOptions } from './backstage.options';\nimport { getCardData, getIsPendingStart, getShowProgressBar, isOvertime } from './backstage.utils';\nimport { BackstageData, useBackstageData } from './useBackstageData';\n\nimport './Backstage.scss';\n\nexport default function BackstageLoader() {\n const { data, status } = useBackstageData();\n\n useWindowTitle('Backstage');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Backstage {...data} />;\n}\n\nfunction Backstage({ events, customFields, projectData, isMirrored, settings }: BackstageData) {\n const { getLocalizedString } = useTranslation();\n const { secondarySource, extraInfo } = useBackstageOptions();\n const { eventNext, eventNow, rundown, selectedEventId, time } = useBackstageSocket();\n const [blinkClass, setBlinkClass] = useState(false);\n const { height: screenHeight } = useViewportSize();\n\n // blink on change\n useEffect(() => {\n setBlinkClass(false);\n\n const timer = setTimeout(() => {\n setBlinkClass(true);\n }, 10);\n\n return () => clearTimeout(timer);\n }, [selectedEventId]);\n\n // gather card data\n const hasEvents = events.length > 0;\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n 'title',\n secondarySource,\n time.playback,\n );\n\n // gather timer data\n const isPendingStart = getIsPendingStart(time.playback, time.phase);\n const startedAt = isPendingStart ? formatTime(time.secondaryTimer) : formatTime(time.startedAt);\n\n const scheduledStart = (() => {\n if (showNow) return undefined;\n if (!hasEvents) return undefined;\n return formatTime(rundown.plannedStart, { format12: '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","getScheduleOptions","customFieldOptions","OptionTitle","getScheduleOptionsFromParams","searchParams","isStringBoolean","useScheduleOptions","useSearchParams","useMemo","ScheduleContext","createContext","ScheduleProvider","children","selectedEventId","cycleInterval","stopCycle","filter","events","usePartialRundown","entry","customKey","isOntimeEvent","firstIndex","setFirstIndex","useState","numPages","setNumPages","visiblePage","setVisiblePage","lastIndex","useRef","paginator","containerRef","useLayoutEffect","containerHeight","currentPageHeight","currentPage","lastVisibleIndex","isShowingElements","i","currentElementHeight","isNextPage","showElement","element","yPosition","hideElement","useEffect","interval","selectedEventIndex","event","viewEvents","useSchedule","context","use","formatOptions","ScheduleItem","timeStart","dayOffset","delay","totalGap","isLinkedToLoaded","countToEnd","colour","skip","title","timeEnd","cue","showExpected","jsxs","cx","ExpectedScheduleItem","DelayedScheduleItem","PlannedScheduleItem","start","formatTime","end","Fragment","SuperscriptPeriod","delayedStart","delayedEnd","expectedStartData","useExpectedStartData","expectedStart","expectedEnd","plannedEnd","getExpectedTimesFromExtendedEvent","ExpectedTime","expectedTime","plannedTime","timeDisplay","expectedState","getOffsetState","Schedule","ScheduleNav","memo","ScheduleExport","selectedId","getBackstageOptions","timeFormat","customFields","projectData","makeOptionsFromCustomFields","secondaryOptions","projectDataOptions","makeProjectDataOptions","getTimeOption","getOptionsFromParams","defaultValues","getValue","key","useBackstageOptions","maybePreset","PresetContext","isOvertime","getShowProgressBar","playback","Playback","getIsPendingStart","phase","TimerPhase","getCardData","eventNow","eventNext","mainSource","secondarySource","nowMain","getPropertyValue","enDash","nowSecondary","nextMain","nextSecondary","useBackstageData","isMirrored","useViewOptionsStore","state","rundownData","rundownStatus","useFlatRundown","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","BackstageLoader","data","status","useWindowTitle","Loader","EmptyPage","Backstage","getLocalizedString","useTranslation","extraInfo","rundown","time","useBackstageSocket","blinkClass","setBlinkClass","screenHeight","useViewportSize","timer","hasEvents","showNow","showNext","isPendingStart","startedAt","scheduledStart","scheduledEnd","displayTimer","millisToString","timerPlaceholderMin","removeLeadingZero","qrSize","showProgress","showSchedule","showPending","defaultFormat","getDefaultFormat","backstageOptions","ViewParamsEditor","OntimeView","ViewLogo","BackstageClock","Empty","TitleCard","SuperscriptTime","ExtraInfo","QRCode","size","source","info","index","clock","useClock","formattedClock"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{l as tt,h as g,j as t,x as et,a8 as st,v as nt,a9 as ot,aa as B,T as H}from"./vendor-BoH5HFNN.js";import{P as at,h as E,i as V,j as rt,d as O,f as I,M as A,r as it,m as ct,k as lt,F as dt,l as ut,e as D,B as w,n as mt,o as pt,p as $,q as W,s as ft,t as xt,u as ht,b as gt,L as St,g as jt,O as yt,v as wt}from"./index-CDBQg2fh.js";import{u as bt,i as vt,a as _t}from"./useRundown-BFae0_bU.js";import{E as P}from"./Empty-C0IdV_kI.js";import{E as Ct}from"./EmptyPage-Ct3d0DqJ.js";import{V as Nt}from"./ViewLogo-BHsV7Faa.js";import{m as kt,O as F,V as Dt}from"./ViewParamsEditor-BMHXOv-K.js";import{u as Ft}from"./useWindowTitle-DU8NlxIu.js";import{S as T}from"./SuperscriptTime-Nou92D8X.js";import{g as Et,a as Ot}from"./viewLoader.utils-BPOG1xso.js";import{i as Tt,b as G}from"./viewUtils-DI8_kmUZ.js";import{u as Lt}from"./useFollowComponent-Eyo4hWVG.js";import{u as q}from"./useReport-BUCsRa2T.js";import{g as U}from"./offset-CLG4o744.js";import{F as At}from"./FollowButton-BG-ycRWu.js";import{u as Pt}from"./useCustomFields-BUJkzZvM.js";import{u as It}from"./useProjectData-DGA6K2Zs.js";import"./Select-B5xNi_tM.js";/* empty css */(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="fc2989e6-d35f-4c35-9876-abe9a5457732",e._sentryDebugIdIdentifier="sentry-dbid-fc2989e6-d35f-4c35-9876-abe9a5457732")}catch{}})();const Rt=(e,s,o)=>{const a=kt(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]);return[{title:F.ClockOptions,collapsible:!0,options:[Et(e)]},{title:F.DataSources,collapsible:!0,options:[{id:"secondary-src",title:"Event secondary text",description:"Select the data source for auxiliary text shown in the card",type:"option",values:a,defaultValue:"none"}]},{title:F.BehaviourOptions,collapsible:!0,options:[{id:"showExpected",title:"Show expected time",description:"Whether the times shown should account for the runtime offset.",type:"boolean",defaultValue:!1}]},{title:F.Hidden,options:[{id:"sub",title:"Event subscription",description:"The events to follow",values:o,type:"persist"}]}]};function Mt(e,s){const o=n=>(s==null?void 0:s.get(n))??e.get(n);return{subscriptions:(n=>s!=null&&s.has(n)?s.getAll(n):e.getAll(n))("sub"),secondarySource:o("secondary-src"),showExpected:Tt(o("showExpected"))}}function R(){const[e]=tt(),s=g.use(at);return g.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return Mt(e,a)},[s,e])}const N="h:mm a",k="HH:mm";function zt(e,s,o){return e===s&&o!==E.Armed}const y={future:"countdown.to_start",due:"timeline.due",live:"countdown.running",pending:"countdown.waiting",loaded:"countdown.loaded",done:"countdown.ended"};function K(e){const{playback:s,current:o,clock:a}=rt(),{getLocalizedString:n}=O(),r=c=>c<=0?n("countdown.overtime").toUpperCase():c<A*10?it(ct(c)):lt(c,c>A*10).replace("m",`${n("common.minutes")} `).replace("s",n("common.seconds"));return e.isLoaded?s===E.Armed?{status:"loaded",statusDisplay:n(y.loaded),timeDisplay:r(e.duration)}:{status:"live",statusDisplay:n(y.live),timeDisplay:r(o??0)}:s===E.Stop||s===E.Armed?{status:"pending",statusDisplay:n(y.pending),timeDisplay:" "}:e.isPast?{status:"done",statusDisplay:n(y.done),timeDisplay:I(e.endedAt,{format12:N,format24:k})}:e.expectedStart-a<=0?{status:"due",statusDisplay:n(y.future),timeDisplay:n(y.due).toUpperCase()}:{status:"future",statusDisplay:n(y.future),timeDisplay:r(e.expectedStart-a)}}function Ht(e,s){const o=new URL(e),a=new URLSearchParams;for(const[n,r]of o.searchParams.entries())n!=="sub"&&a.append(n,r);return s.forEach(n=>{a.append("sub",n)}),o.search=a.toString(),o}function Ut(e,s){return s.filter(o=>e.includes(o.id))}function Bt(e,s){return Math.abs(e-s)>A}function Vt(e,s,o,a,n,r,c){const{totalGap:m,isLinkedToLoaded:d}=e,i=V(e,{currentDay:s,totalGap:m,actualStart:o,plannedStart:a,isLinkedToLoaded:d,offset:n,mode:r}),{endedAt:l}=c[e.id]??{endedAt:null};return{...e,expectedStart:i,endedAt:l}}function _(e){const{value:s,preferredFormat12:o=dt,preferredFormat24:a=ut,className:n}=e,r=I(s,{format12:o,format24:a});return t.jsx(T,{className:n,time:r})}function $t({events:e,subscriptions:s,disableEdit:o}){const[a,n]=g.useState(s),r=et(),c=i=>{n(l=>l.includes(i)?l.filter(p=>p!==i):[...l,i])},m=()=>{const i=a.filter(p=>e.some(f=>f.id===p)),l=Ht(window.location.href,i);o(),n([]),r(l.search.toString())},d=new Set(a);return t.jsxs("div",{className:"list-container",children:[e.map((i,l)=>{const p=i.title||"{no title}",f=d.has(i.id);return t.jsxs("div",{role:"button",tabIndex:0,onClick:()=>c(i.id),onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(c(i.id),x.stopPropagation())},className:D(["sub",f&&"sub--selected"]),children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":(i==null?void 0:i.colour)??""}}),t.jsxs("div",{className:"sub__schedule",children:[t.jsx(_,{value:i.timeStart,preferredFormat12:"h:mm a",preferredFormat24:"HH:mm"}),"→",t.jsx(_,{value:i.timeEnd,preferredFormat12:"h:mm a",preferredFormat24:"HH:mm"})]}),t.jsx("div",{className:"sub__label",children:f?"Click to remove":"Click to add"}),t.jsx("div",{className:"sub__title",children:p})]},l)}),t.jsxs("div",{className:"fab-container",children:[t.jsxs(w,{variant:"subtle",size:"xlarge",onClick:o,children:[t.jsx(st,{})," Go back"]}),t.jsxs(w,{variant:"subtle",size:"xlarge",onClick:()=>n([]),disabled:a.length===0,children:[t.jsx(nt,{})," Clear"]}),t.jsxs(w,{variant:"primary",size:"xlarge",disabled:e.length<1,onClick:m,children:[t.jsx(ot,{})," Save"]})]})]})}function Wt({subscribedEvents:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=R(),{playback:n}=mt(),{selectedEventId:r}=pt(),c=$(!0),{data:m}=q(),{offset:d,currentDay:i,actualStart:l,plannedStart:p,mode:f}=W(),x=g.useRef(null),[S,b]=g.useState(!1),j=g.useRef(null),h=g.useRef(null),Z=Lt({followRef:j,scrollRef:h,doFollow:!S,topOffset:0,followTrigger:r});g.useEffect(()=>{var u;r||S||(u=h.current)==null||u.scrollTo(0,0)},[r,S,h]);const J=()=>{r&&Z(),b(!1)},X=xt(()=>{if(j!=null&&j.current&&(h!=null&&h.current)){const u=j.current.getBoundingClientRect(),C=h.current.getBoundingClientRect();if(u&&C){const v=u.top-C.top,L=v<-8||v>50;b(L)}}},1e3),M=()=>{x.current&&clearTimeout(x.current),X()};return t.jsxs("div",{className:"list-container",onWheel:M,onTouchMove:M,ref:h,children:[e.map(u=>{const C=G(u,o),v=zt(u.id,r,n),L=!v&&u.id===r,z=Vt(u,i,l,p,d,f,m),Y=u.title.length?u.title:" ";return t.jsxs("div",{ref:v?j:void 0,className:D(["sub",v&&"sub--live",L&&"sub--armed"]),"data-testid":u.cue,children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":u.colour}}),t.jsx(Q,{event:z,showExpected:a}),t.jsx(Gt,{event:z}),t.jsx("div",{className:D(["sub__title",!u.title&&"subdued"]),children:Y}),C&&t.jsx("div",{className:"sub__secondary",children:C})]},u.id)}),t.jsx("div",{className:D(["fab-container",!c&&"fab-container--hidden"]),children:t.jsxs(w,{variant:"primary",size:"xlarge",onClick:s,children:[t.jsx(B,{})," Edit"]})}),t.jsx(At,{isVisible:S,onClickHandler:J})]})}function Q(e){const{event:s,showExpected:o}=e,{timeStart:a,duration:n,delay:r,expectedStart:c,countToEnd:m}=s,d=a+r+s.dayOffset*ft,i=o&&Bt(d,c),l=i?"sub__schedule--strike":r!==0?"sub__schedule--delayed":"",p=`sub__schedule--${U(c-d)}`,f=d+n+r,x=m?Math.max(c+n,f):c+n,S=`sub__schedule--${U(x-f)}`;return t.jsxs("div",{className:"sub__schedule",children:[t.jsx(_,{value:d,preferredFormat12:N,preferredFormat24:k,className:l}),!i&&t.jsxs(t.Fragment,{children:["→",t.jsx(_,{value:f,preferredFormat12:N,preferredFormat24:k,className:l})]}),i&&t.jsxs(t.Fragment,{children:[t.jsx(_,{value:c,className:p,preferredFormat12:N,preferredFormat24:k}),"→",t.jsx(_,{value:x,className:S,preferredFormat12:N,preferredFormat24:k})]})]})}function Gt({event:e}){const{status:s,statusDisplay:o,timeDisplay:a}=K(e);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"sub__status",children:o}),s==="done"?t.jsx(T,{className:"sub__timer",time:a}):t.jsx("div",{className:"sub__timer",children:a})]})}function qt({subscribedEvent:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=R(),n=$(!0),{data:r}=q(),{offset:c,currentDay:m,actualStart:d,plannedStart:i,mode:l}=W(),{totalGap:p,isLinkedToLoaded:f}=e,x=V(e,{currentDay:m,totalGap:p,actualStart:d,plannedStart:i,isLinkedToLoaded:f,offset:c,mode:l}),{endedAt:S}=r[e.id]??{endedAt:null},b={...e,expectedStart:x,endedAt:S},j=e.title.length?e.title:" ",h=G(e,o);return t.jsxs("div",{className:"single-container","data-testid":"countdown-event",children:[t.jsx(Kt,{event:b}),t.jsxs("div",{className:"event__title",style:{borderColor:b.colour},children:[t.jsx(Q,{event:b,showExpected:a}),j,h&&t.jsx("div",{className:"secondary",children:h})]}),t.jsx("div",{className:D(["fab-container",!n&&"fab-container--hidden"]),children:t.jsxs(w,{variant:"primary",size:"xlarge",onClick:s,children:[t.jsx(B,{})," Edit"]})})]})}function Kt({event:e}){const{status:s,statusDisplay:o,timeDisplay:a}=K(e);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"event__status",children:o}),s==="done"?t.jsx(T,{className:"event__timer",time:a}):t.jsx("div",{className:"event__timer",children:a})]})}function Qt(){const e=ht(i=>i.mirror),{data:s,status:o}=bt(),{data:a,status:n}=It(),{data:r,status:c}=gt(),{data:m,status:d}=Pt();return{data:{customFields:m,rundownData:s,projectData:a,isMirrored:e,settings:r},status:Ot([o,n,c,d])}}function je(){const{data:e,status:s}=Qt();return Ft("Countdown"),s==="pending"?t.jsx(St,{}):s==="error"?t.jsx(Ct,{text:"There was an error fetching data, please refresh the page."}):t.jsx(Zt,{...e})}function Zt({customFields:e,rundownData:s,projectData:o,isMirrored:a,settings:n}){const{getLocalizedString:r}=O(),{subscriptions:c}=R(),[m,d]=g.useState(!1),i=s.filter(x=>vt(x)&&_t(x)),l=i.length>0,p=jt(n==null?void 0:n.timeFormat),f=g.useMemo(()=>Rt(p,e,c),[p,e,c]);return t.jsxs("div",{className:`countdown ${a?"mirror":""}`,"data-testid":"countdown-view",children:[t.jsx(Dt,{target:yt.Countdown,viewOptions:f}),t.jsxs("div",{className:"project-header",children:[(o==null?void 0:o.logo)&&t.jsx(Nt,{name:o.logo,className:"logo"}),t.jsx("div",{className:"title",children:o.title}),t.jsx(Xt,{})]}),!l&&t.jsx(P,{text:r("common.no_data"),className:"empty-container"}),l&&m&&t.jsx($t,{events:i,subscriptions:c,disableEdit:()=>d(!1)}),l&&!m&&t.jsx(Jt,{playableEvents:i,subscriptions:c,goToEditMode:()=>d(!0)})]})}function Jt({playableEvents:e,subscriptions:s,goToEditMode:o}){const{getLocalizedString:a}=O();if(s.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(P,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(H,{})," Add"]})]});const n=Ut(s,e);if(n.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(P,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(H,{})," Add"]})]});if(n.length===1){const r=n.at(0);return r?t.jsx(qt,{subscribedEvent:r,goToEditMode:o}):null}return t.jsx(Wt,{subscribedEvents:n,goToEditMode:o})}function Xt(){const{getLocalizedString:e}=O(),{clock:s}=wt(),o=I(s);return t.jsxs("div",{className:"clock-container",children:[t.jsx("div",{className:"label",children:e("common.time_now")}),t.jsx(T,{time:o,className:"time"})]})}export{je as default};
2
- //# sourceMappingURL=Countdown-C8LGl1pp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Countdown-C8LGl1pp.js","sources":["../../src/views/countdown/countdown.options.ts","../../src/views/countdown/countdown.utils.ts","../../src/features/viewers/common/clock-time/ClockTime.tsx","../../src/views/countdown/CountdownSelect.tsx","../../src/views/countdown/CountdownSubscriptions.tsx","../../src/views/countdown/SingleEventCountdown.tsx","../../src/views/countdown/useCountdownData.ts","../../src/views/countdown/Countdown.tsx"],"sourcesContent":["import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, EntryId, OntimeEvent } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../features/viewers/common/viewUtils';\n\nexport const getCountdownOptions = (\n timeFormat: string,\n customFields: CustomFields,\n persistedSubscriptions: EntryId[],\n): ViewOption[] => {\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'note', label: 'Note' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'secondary-src',\n title: 'Event secondary text',\n description: 'Select the data source for auxiliary text shown in the card',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.BehaviourOptions,\n collapsible: true,\n options: [\n {\n id: 'showExpected',\n title: 'Show expected time',\n description: 'Whether the times shown should account for the runtime offset.',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.Hidden,\n options: [\n {\n id: 'sub',\n title: 'Event subscription',\n description: 'The events to follow',\n values: persistedSubscriptions,\n type: 'persist',\n },\n ],\n },\n ];\n};\n\ntype CountdownOptions = {\n subscriptions: EntryId[];\n secondarySource: keyof OntimeEvent | null;\n showExpected: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): CountdownOptions {\n // Helper to get single value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Helper to get array values from either source\n const getArrayValues = (key: string): EntryId[] => {\n if (defaultValues?.has(key)) {\n return defaultValues.getAll(key) as EntryId[];\n }\n return searchParams.getAll(key) as EntryId[];\n };\n\n return {\n subscriptions: getArrayValues('sub'),\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n showExpected: isStringBoolean(getValue('showExpected')),\n };\n}\n\n/**\n * Hook exposes the countdown view options\n */\nexport function useCountdownOptions(): CountdownOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { EntryId, MaybeNumber, OffsetMode, OntimeEntry, OntimeEvent, OntimeReport, Playback } from 'ontime-types';\nimport { getExpectedStart, MILLIS_PER_MINUTE, millisToString, removeLeadingZero } from 'ontime-utils';\n\nimport { useCountdownSocket } from '../../common/hooks/useSocket';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatDuration, formatTime } from '../../common/utils/time';\nimport { type TranslationKey, useTranslation } from '../../translation/TranslationProvider';\n\n/**\n * Parses string as a title\n */\nexport function sanitiseTitle(title: string | null) {\n return title ?? '{no title}';\n}\n\nexport const preferredFormat12 = 'h:mm a';\nexport const preferredFormat24 = 'HH:mm';\n\n/**\n * Whether the current event is live\n */\nexport function getIsLive(currentId: EntryId, selectedId: EntryId | null, playback: Playback): boolean {\n return currentId === selectedId && playback !== Playback.Armed;\n}\n\nexport type ProgressStatus = 'future' | 'due' | 'live' | 'done' | 'pending' | 'loaded';\ntype TimerMessage = Record<ProgressStatus, TranslationKey>;\n\nexport const timerProgress: TimerMessage = {\n future: 'countdown.to_start',\n due: 'timeline.due',\n live: 'countdown.running',\n pending: 'countdown.waiting',\n loaded: 'countdown.loaded',\n done: 'countdown.ended',\n};\n\n/**\n * Returns a parsed timer and relevant status message\n * Handles events in different days but disregards whether an event has actually played\n */\nexport function useSubscriptionDisplayData(\n subscribedEvent: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number },\n): { status: ProgressStatus; statusDisplay: string; timeDisplay: string } {\n const { playback, current, clock } = useCountdownSocket();\n const { getLocalizedString } = useTranslation();\n\n const bigDuration = (value: number) => {\n if (value <= 0) return getLocalizedString('countdown.overtime').toUpperCase();\n if (value < MILLIS_PER_MINUTE * 10) {\n return removeLeadingZero(millisToString(value));\n }\n\n return formatDuration(value, value > MILLIS_PER_MINUTE * 10)\n .replace('m', `${getLocalizedString('common.minutes')} `)\n .replace('s', getLocalizedString('common.seconds'));\n };\n\n if (subscribedEvent.isLoaded) {\n if (playback === Playback.Armed) {\n return {\n status: 'loaded',\n statusDisplay: getLocalizedString(timerProgress['loaded']),\n timeDisplay: bigDuration(subscribedEvent.duration),\n };\n }\n\n return {\n status: 'live',\n statusDisplay: getLocalizedString(timerProgress['live']),\n timeDisplay: bigDuration(current ?? 0),\n };\n }\n\n if (playback === Playback.Stop || playback === Playback.Armed) {\n return {\n status: 'pending',\n statusDisplay: getLocalizedString(timerProgress['pending']),\n timeDisplay: ' ',\n };\n }\n\n if (subscribedEvent.isPast) {\n return {\n status: 'done',\n statusDisplay: getLocalizedString(timerProgress['done']),\n timeDisplay: formatTime(subscribedEvent.endedAt, { format12: preferredFormat12, format24: preferredFormat24 }),\n };\n }\n\n if (subscribedEvent.expectedStart - clock <= 0) {\n return {\n status: 'due',\n statusDisplay: getLocalizedString(timerProgress['future']), // We use future here on purpose for the look of it\n timeDisplay: getLocalizedString(timerProgress['due']).toUpperCase(),\n };\n }\n\n return {\n status: 'future',\n statusDisplay: getLocalizedString(timerProgress['future']),\n timeDisplay: bigDuration(subscribedEvent.expectedStart - clock),\n };\n}\n\n/**\n * Adds a set of subscriptions to the URL parameters\n */\nexport function makeSubscriptionsUrl(urlRef: string, subscriptions: EntryId[]) {\n const url = new URL(urlRef);\n const newParams = new URLSearchParams();\n\n // copy existing parameters except for 'sub'\n for (const [key, value] of url.searchParams.entries()) {\n if (key !== 'sub') {\n newParams.append(key, value);\n }\n }\n\n // add new subscriptions\n subscriptions.forEach((id) => {\n newParams.append('sub', id);\n });\n\n url.search = newParams.toString();\n\n return url;\n}\n\n/**\n * Returns an array of events subscribed events ordered by scheduled\n * Since the original array is already ordered, we simply filter out the events\n * which are not in the subscriptions list.\n */\nexport function getOrderedSubscriptions<T extends OntimeEntry>(subscriptions: EntryId[], playableEvents: T[]): T[] {\n return playableEvents.filter((event) => subscriptions.includes(event.id));\n}\n\n/**\n * Checks through the rundown whether the current event is linked to the loaded event\n */\nexport function isLinkedToLoadedEvent(events: OntimeEvent[], loadedId: EntryId | null, currentId: EntryId): boolean {\n // if nothing is loaded, we return true to simplify the logic\n if (!loadedId) {\n return true;\n }\n\n const loadedIndex = events.findIndex((event) => event.id === loadedId);\n if (loadedIndex === -1) {\n return true;\n }\n\n for (let i = loadedIndex; i < events.length; i++) {\n const event = events[i];\n if (event.id === currentId) {\n return true;\n }\n\n if (event.linkStart === null) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function isOutsideRange(a: number, b: number): boolean {\n return Math.abs(a - b) > MILLIS_PER_MINUTE;\n}\n\nexport type CountdownEvent = ExtendedEntry<OntimeEvent> & { expectedStart: number; endedAt: MaybeNumber };\n\nexport function extendEventData(\n event: ExtendedEntry<OntimeEvent>,\n currentDay: number,\n actualStart: MaybeNumber,\n plannedStart: MaybeNumber,\n offset: number,\n mode: OffsetMode,\n reportData: OntimeReport,\n): CountdownEvent {\n const { totalGap, isLinkedToLoaded } = event;\n const expectedStart = getExpectedStart(event, {\n currentDay,\n totalGap,\n actualStart,\n plannedStart,\n isLinkedToLoaded,\n offset,\n mode,\n });\n const { endedAt } = reportData[event.id] ?? { endedAt: null };\n return { ...event, expectedStart, endedAt };\n}\n","/**\n * encapsulate logic related to showing a clock timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\n\nimport { formatTime } from '../../../../common/utils/time';\nimport { FORMAT_12, FORMAT_24 } from '../../../../viewerConfig';\nimport SuperscriptTime from '../superscript-time/SuperscriptTime';\n\ninterface ClockTimeProps {\n value: MaybeNumber;\n preferredFormat12?: string;\n preferredFormat24?: string;\n className?: string;\n}\n\nexport default function ClockTime(props: ClockTimeProps) {\n const { value, preferredFormat12 = FORMAT_12, preferredFormat24 = FORMAT_24, className } = props;\n\n // TODO: should we get the params from URL here to see if the user is overriding the default?\n const formattedTime = formatTime(value, { format12: preferredFormat12, format24: preferredFormat24 });\n\n return <SuperscriptTime className={className} time={formattedTime} />;\n}\n","import { useState } from 'react';\nimport { IoArrowBack, IoClose, IoSaveOutline } from 'react-icons/io5';\nimport { useNavigate } from 'react-router';\nimport { EntryId, PlayableEvent } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport ClockTime from '../../features/viewers/common/clock-time/ClockTime';\n\nimport { makeSubscriptionsUrl } from './countdown.utils';\n\nimport './Countdown.scss';\n\ninterface CountdownSelectProps {\n events: ExtendedEntry<PlayableEvent>[];\n subscriptions: EntryId[];\n disableEdit: () => void;\n}\n\nexport default function CountdownSelect({ events, subscriptions, disableEdit }: CountdownSelectProps) {\n const [selected, setSelected] = useState<EntryId[]>(subscriptions);\n const navigate = useNavigate();\n\n /**\n * Toggles an entry from the selected set\n */\n const toggleSelect = (entryId: EntryId) => {\n setSelected((prev) => {\n if (prev.includes(entryId)) {\n // If the entry is already selected, remove it\n return prev.filter((id) => id !== entryId);\n }\n return [...prev, entryId];\n });\n };\n\n /**\n * Creates a URL with the selected subscriptions\n * and navigates to it\n */\n const applySelection = () => {\n // we remove events that no longer exist to avoid stale subscriptions\n const filteredSelected = selected.filter((id) => events.some((event) => event.id === id));\n const url = makeSubscriptionsUrl(window.location.href, filteredSelected);\n disableEdit();\n setSelected([]);\n navigate(url.search.toString());\n };\n\n // make a copy of the selected array for quick lookup\n const selectedIds = new Set(selected);\n\n return (\n <div className='list-container'>\n {events.map((event, index) => {\n const title = event.title || '{no title}';\n const isSelected = selectedIds.has(event.id);\n\n return (\n <div\n key={index}\n role='button'\n tabIndex={0}\n onClick={() => toggleSelect(event.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n toggleSelect(event.id);\n e.stopPropagation();\n }\n }}\n className={cx(['sub', isSelected && 'sub--selected'])}\n >\n <div className='sub__binder' style={{ '--user-color': event?.colour ?? '' }} />\n <div className='sub__schedule'>\n <ClockTime value={event.timeStart} preferredFormat12='h:mm a' preferredFormat24='HH:mm' />\n →\n <ClockTime value={event.timeEnd} preferredFormat12='h:mm a' preferredFormat24='HH:mm' />\n </div>\n <div className='sub__label'>{isSelected ? 'Click to remove' : 'Click to add'}</div>\n <div className='sub__title'>{title}</div>\n </div>\n );\n })}\n\n <div className='fab-container'>\n <Button variant='subtle' size='xlarge' onClick={disableEdit}>\n <IoArrowBack /> Go back\n </Button>\n <Button variant='subtle' size='xlarge' onClick={() => setSelected([])} disabled={selected.length === 0}>\n <IoClose /> Clear\n </Button>\n <Button variant='primary' size='xlarge' disabled={events.length < 1} onClick={applySelection}>\n <IoSaveOutline /> Save\n </Button>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { IoPencil } from 'react-icons/io5';\nimport { MaybeNumber, OntimeEvent } from 'ontime-types';\nimport { dayInMs } from 'ontime-utils';\n\nimport Button from '../../common/components/buttons/Button';\nimport { useFadeOutOnInactivity } from '../../common/hooks/useFadeOutOnInactivity';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useExpectedStartData, usePlayback, useSelectedEventId } from '../../common/hooks/useSocket';\nimport useReport from '../../common/hooks-query/useReport';\nimport { getOffsetState } from '../../common/utils/offset';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport FollowButton from '../../features/operator/follow-button/FollowButton';\nimport ClockTime from '../../features/viewers/common/clock-time/ClockTime';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\nimport { useCountdownOptions } from './countdown.options';\nimport {\n CountdownEvent,\n extendEventData,\n getIsLive,\n isOutsideRange,\n preferredFormat12,\n preferredFormat24,\n useSubscriptionDisplayData,\n} from './countdown.utils';\n\nimport './Countdown.scss';\n\ninterface CountdownSubscriptionsProps {\n subscribedEvents: ExtendedEntry<OntimeEvent>[];\n goToEditMode: () => void;\n}\n\nexport default function CountdownSubscriptions({ subscribedEvents, goToEditMode }: CountdownSubscriptionsProps) {\n const { secondarySource, showExpected } = useCountdownOptions();\n const { playback } = usePlayback();\n const { selectedEventId } = useSelectedEventId();\n const showFab = useFadeOutOnInactivity(true);\n\n const { data: reportData } = useReport();\n const { offset, currentDay, actualStart, plannedStart, mode } = useExpectedStartData();\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n const [lockAutoScroll, setLockAutoScroll] = useState(false);\n const selectedRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollToComponent = useFollowComponent({\n followRef: selectedRef,\n scrollRef,\n doFollow: !lockAutoScroll,\n topOffset: 0,\n followTrigger: selectedEventId,\n });\n\n // reset scroll if nothing is selected\n useEffect(() => {\n if (!selectedEventId) {\n if (!lockAutoScroll) {\n scrollRef.current?.scrollTo(0, 0);\n }\n }\n }, [selectedEventId, lockAutoScroll, scrollRef]);\n\n // scroll to component if user clicks the Follow button\n const handleOffset = () => {\n if (selectedEventId) {\n scrollToComponent();\n }\n setLockAutoScroll(false);\n };\n\n // prevent considering automated scrolls as user scrolls\n const handleUserScroll = () => {\n if (selectedRef?.current && scrollRef?.current) {\n const selectedRect = selectedRef.current.getBoundingClientRect();\n const scrollerRect = scrollRef.current.getBoundingClientRect();\n if (selectedRect && scrollerRect) {\n const distanceFromTop = selectedRect.top - scrollerRect.top;\n const hasScrolledOutOfThreshold = distanceFromTop < -8 || distanceFromTop > 50;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n // when the user scrolls we check if we need to show the button\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n\n throttledHandleScroll();\n };\n\n return (\n <div className='list-container' onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {subscribedEvents.map((event) => {\n const secondaryData = getPropertyValue(event, secondarySource);\n const isLive = getIsLive(event.id, selectedEventId, playback);\n const isArmed = !isLive && event.id === selectedEventId;\n const countdownEvent = extendEventData(event, currentDay, actualStart, plannedStart, offset, mode, reportData);\n const title = event.title.length ? event.title : ' '; // insert utf-8 empty space to avoid the line collapsing\n return (\n <div\n key={event.id}\n ref={isLive ? selectedRef : undefined}\n className={cx(['sub', isLive && 'sub--live', isArmed && 'sub--armed'])}\n data-testid={event.cue}\n >\n <div className='sub__binder' style={{ '--user-color': event.colour }} />\n <ScheduleTime event={countdownEvent} showExpected={showExpected} />\n <SubscriptionStatus event={countdownEvent} />\n <div className={cx(['sub__title', !event.title && 'subdued'])}>{title}</div>\n {secondaryData && <div className='sub__secondary'>{secondaryData}</div>}\n </div>\n );\n })}\n <div className={cx(['fab-container', !showFab && 'fab-container--hidden'])}>\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoPencil /> Edit\n </Button>\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n\ntype ScheduleTimeProps = {\n event: CountdownEvent;\n showExpected: boolean;\n};\n//TODO: consider relative mode\nexport function ScheduleTime(props: ScheduleTimeProps) {\n const { event, showExpected } = props;\n const { timeStart, duration, delay, expectedStart, countToEnd } = event;\n\n const plannedStart = timeStart + delay + event.dayOffset * dayInMs;\n\n // only show new exacted value if outside range of the planned value\n const isExpectedValueShow = showExpected && isOutsideRange(plannedStart, expectedStart);\n\n const plannedStateClass = isExpectedValueShow ? 'sub__schedule--strike' : delay !== 0 ? 'sub__schedule--delayed' : '';\n\n const expectedStateClass = `sub__schedule--${getOffsetState(expectedStart - plannedStart)}`;\n const plannedEnd = plannedStart + duration + delay;\n const expectedEnd = countToEnd ? Math.max(expectedStart + duration, plannedEnd) : expectedStart + duration;\n const expectedEndClass = `sub__schedule--${getOffsetState(expectedEnd - plannedEnd)}`;\n\n return (\n <div className='sub__schedule'>\n <ClockTime\n value={plannedStart}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n className={plannedStateClass}\n />\n {!isExpectedValueShow && (\n <>\n →\n <ClockTime\n value={plannedEnd}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n className={plannedStateClass}\n />\n </>\n )}\n {isExpectedValueShow && (\n <>\n <ClockTime\n value={expectedStart}\n className={expectedStateClass}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n />\n →\n <ClockTime\n value={expectedEnd}\n className={expectedEndClass}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n />\n </>\n )}\n </div>\n );\n}\n\ninterface SubscriptionStatusProps {\n event: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number };\n}\n\nfunction SubscriptionStatus({ event }: SubscriptionStatusProps) {\n const { status, statusDisplay, timeDisplay } = useSubscriptionDisplayData(event);\n\n return (\n <>\n <div className='sub__status'>{statusDisplay}</div>\n {status === 'done' ? (\n <SuperscriptTime className='sub__timer' time={timeDisplay} />\n ) : (\n <div className='sub__timer'>{timeDisplay}</div>\n )}\n </>\n );\n}\n","import { IoPencil } from 'react-icons/io5';\nimport { MaybeNumber, OntimeEvent } from 'ontime-types';\nimport { getExpectedStart } from 'ontime-utils';\n\nimport Button from '../../common/components/buttons/Button';\nimport { useFadeOutOnInactivity } from '../../common/hooks/useFadeOutOnInactivity';\nimport { useExpectedStartData } from '../../common/hooks/useSocket';\nimport useReport from '../../common/hooks-query/useReport';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\nimport { useCountdownOptions } from './countdown.options';\nimport { useSubscriptionDisplayData } from './countdown.utils';\nimport { ScheduleTime } from './CountdownSubscriptions';\n\nimport './SingleEventCountdown.scss';\n\ninterface SingleEventCountdownProps {\n subscribedEvent: ExtendedEntry<OntimeEvent>;\n goToEditMode: () => void;\n}\n\nexport default function SingleEventCountdown({ subscribedEvent, goToEditMode }: SingleEventCountdownProps) {\n const { secondarySource, showExpected } = useCountdownOptions();\n const showFab = useFadeOutOnInactivity(true);\n const { data: reportData } = useReport();\n\n const { offset, currentDay, actualStart, plannedStart, mode } = useExpectedStartData();\n const { totalGap, isLinkedToLoaded } = subscribedEvent;\n const expectedStart = getExpectedStart(subscribedEvent, {\n currentDay,\n totalGap,\n actualStart,\n plannedStart,\n isLinkedToLoaded,\n offset,\n mode,\n });\n\n const { endedAt } = reportData[subscribedEvent.id] ?? { endedAt: null };\n const countdownEvent = { ...subscribedEvent, expectedStart, endedAt };\n const title = subscribedEvent.title.length ? subscribedEvent.title : ' '; // insert utf-8 empty space to avoid the line collapsing\n const secondaryData = getPropertyValue(subscribedEvent, secondarySource);\n\n return (\n <div className='single-container' data-testid='countdown-event'>\n <SubscriptionStatus event={countdownEvent} />\n <div className='event__title' style={{ borderColor: countdownEvent.colour }}>\n <ScheduleTime event={countdownEvent} showExpected={showExpected} />\n {title}\n {secondaryData && <div className='secondary'>{secondaryData}</div>}\n </div>\n <div className={cx(['fab-container', !showFab && 'fab-container--hidden'])}>\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoPencil /> Edit\n </Button>\n </div>\n </div>\n );\n}\n\ninterface SubscriptionStatusProps {\n event: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number };\n}\n\nfunction SubscriptionStatus({ event }: SubscriptionStatusProps) {\n const { status, statusDisplay, timeDisplay } = useSubscriptionDisplayData(event);\n\n return (\n <>\n <div className='event__status'>{statusDisplay}</div>\n {status === 'done' ? (\n <SuperscriptTime className='event__timer' time={timeDisplay} />\n ) : (\n <div className='event__timer'>{timeDisplay}</div>\n )}\n </>\n );\n}\n","import { CustomFields, OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface CountdownData {\n customFields: CustomFields;\n rundownData: ExtendedEntry<OntimeEntry>[];\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n}\n\nexport function useCountdownData(): ViewData<CountdownData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundownWithMetadata();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n customFields,\n rundownData,\n projectData,\n isMirrored,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useMemo, useState } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { EntryId, isOntimeEvent, isPlayableEvent, OntimeEvent, OntimeView } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport Empty from '../../common/components/state/Empty';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useClock } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport { getCountdownOptions, useCountdownOptions } from './countdown.options';\nimport { getOrderedSubscriptions } from './countdown.utils';\nimport CountdownSelect from './CountdownSelect';\nimport CountdownSubscriptions from './CountdownSubscriptions';\nimport SingleEventCountdown from './SingleEventCountdown';\nimport { CountdownData, useCountdownData } from './useCountdownData';\n\nimport './Countdown.scss';\n\nexport default function CountdownLoader() {\n const { data, status } = useCountdownData();\n\n useWindowTitle('Countdown');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Countdown {...data} />;\n}\n\nfunction Countdown({ customFields, rundownData, projectData, isMirrored, settings }: CountdownData) {\n const { getLocalizedString } = useTranslation();\n const { subscriptions } = useCountdownOptions();\n\n const [editMode, setEditMode] = useState(false);\n\n // gather rundown data\n const playableEvents = rundownData.filter((entry) => isOntimeEvent(entry) && isPlayableEvent(entry));\n\n // gather presentation data\n const hasEvents = playableEvents.length > 0;\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const countdownOptions = useMemo(\n () => getCountdownOptions(defaultFormat, customFields, subscriptions),\n [defaultFormat, customFields, subscriptions],\n );\n\n return (\n <div className={`countdown ${isMirrored ? 'mirror' : ''}`} data-testid='countdown-view'>\n <ViewParamsEditor target={OntimeView.Countdown} viewOptions={countdownOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <CountdownClock />\n </div>\n\n {!hasEvents && <Empty text={getLocalizedString('common.no_data')} className='empty-container' />}\n\n {hasEvents && editMode && (\n <CountdownSelect events={playableEvents} subscriptions={subscriptions} disableEdit={() => setEditMode(false)} />\n )}\n\n {hasEvents && !editMode && (\n <CountdownContents\n playableEvents={playableEvents}\n subscriptions={subscriptions}\n goToEditMode={() => setEditMode(true)}\n />\n )}\n </div>\n );\n}\n\ninterface CountdownContentsProps {\n playableEvents: ExtendedEntry<OntimeEvent>[];\n subscriptions: EntryId[];\n goToEditMode: () => void;\n}\n\nfunction CountdownContents({ playableEvents, subscriptions, goToEditMode }: CountdownContentsProps) {\n const { getLocalizedString } = useTranslation();\n\n if (subscriptions.length === 0) {\n return (\n <div className='empty-container'>\n <Empty text={getLocalizedString('countdown.select_event')} className='empty-container' />\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoAdd /> Add\n </Button>\n </div>\n );\n }\n\n const subscribedEvents = getOrderedSubscriptions(subscriptions, playableEvents);\n\n if (subscribedEvents.length === 0) {\n return (\n <div className='empty-container'>\n <Empty text={getLocalizedString('countdown.select_event')} className='empty-container' />\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoAdd /> Add\n </Button>\n </div>\n );\n }\n\n if (subscribedEvents.length === 1) {\n const event = subscribedEvents.at(0);\n if (!event) return null;\n return <SingleEventCountdown subscribedEvent={event} goToEditMode={goToEditMode} />;\n }\n\n return <CountdownSubscriptions subscribedEvents={subscribedEvents} goToEditMode={goToEditMode} />;\n}\n\nfunction CountdownClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["getCountdownOptions","timeFormat","customFields","persistedSubscriptions","secondaryOptions","makeOptionsFromCustomFields","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","isStringBoolean","useCountdownOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","preferredFormat12","preferredFormat24","getIsLive","currentId","selectedId","playback","Playback","timerProgress","useSubscriptionDisplayData","subscribedEvent","current","clock","useCountdownSocket","getLocalizedString","useTranslation","bigDuration","value","MILLIS_PER_MINUTE","removeLeadingZero","millisToString","formatDuration","formatTime","makeSubscriptionsUrl","urlRef","subscriptions","url","newParams","id","getOrderedSubscriptions","playableEvents","event","isOutsideRange","a","b","extendEventData","currentDay","actualStart","plannedStart","offset","mode","reportData","totalGap","isLinkedToLoaded","expectedStart","getExpectedStart","endedAt","ClockTime","props","FORMAT_12","FORMAT_24","className","formattedTime","jsx","SuperscriptTime","CountdownSelect","events","disableEdit","selected","setSelected","useState","navigate","useNavigate","toggleSelect","entryId","prev","applySelection","filteredSelected","selectedIds","jsxs","index","title","isSelected","e","cx","Button","IoArrowBack","IoClose","IoSaveOutline","CountdownSubscriptions","subscribedEvents","goToEditMode","secondarySource","showExpected","usePlayback","selectedEventId","useSelectedEventId","showFab","useFadeOutOnInactivity","useReport","useExpectedStartData","timeoutId","useRef","lockAutoScroll","setLockAutoScroll","selectedRef","scrollRef","scrollToComponent","useFollowComponent","useEffect","_a","handleOffset","throttledHandleScroll","throttle","selectedRect","scrollerRect","distanceFromTop","hasScrolledOutOfThreshold","handleScroll","secondaryData","getPropertyValue","isLive","isArmed","countdownEvent","ScheduleTime","SubscriptionStatus","IoPencil","FollowButton","timeStart","duration","delay","countToEnd","dayInMs","isExpectedValueShow","plannedStateClass","expectedStateClass","getOffsetState","plannedEnd","expectedEnd","expectedEndClass","Fragment","status","statusDisplay","timeDisplay","SingleEventCountdown","useCountdownData","isMirrored","useViewOptionsStore","state","rundownData","rundownStatus","useFlatRundownWithMetadata","projectData","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","CountdownLoader","data","useWindowTitle","Loader","EmptyPage","Countdown","editMode","setEditMode","entry","isOntimeEvent","isPlayableEvent","hasEvents","defaultFormat","getDefaultFormat","countdownOptions","ViewParamsEditor","OntimeView","ViewLogo","CountdownClock","Empty","CountdownContents","IoAdd","useClock","formattedClock"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{h as w,ad as I,j as e}from"./vendor-BoH5HFNN.js";import{d as v,bS as c,Y as S,a9 as u,B as m,$ as T,ae as _,af as C,ag as D,ah as O,ai as B}from"./index-CDBQg2fh.js";import{I as M}from"./useWindowTitle-DU8NlxIu.js";import{M as F}from"./Modal-Bn1bZkwb.js";import"./useProjectData-DGA6K2Zs.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},a=new s.Error().stack;a&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[a]="d32045aa-bb88-41cf-bb2c-8a799e119051",s._sentryDebugIdIdentifier="sentry-dbid-d32045aa-bb88-41cf-bb2c-8a799e119051")}catch{}})();function K({isOpen:s,onClose:a}){const{userTranslation:i,postUserTranslation:f}=v(),b=w.useMemo(()=>{const t={};return Object.keys(c).forEach(r=>{t[l(r)]=i[r]||""}),t},[i]),{handleSubmit:h,register:p,reset:g,formState:{isSubmitting:d,isDirty:x,errors:n,isValid:j},setError:y}=I({defaultValues:b,resetOptions:{keepDirtyValues:!0},mode:"onChange"}),E=async t=>{try{const r={};Object.keys(t).forEach(o=>{r[L(o)]=t[o]}),await f(r),g(t)}catch(r){y("root",{message:B(r)})}};return e.jsx(F,{title:"Edit custom translations",isOpen:s,onClose:a,showCloseButton:!0,showBackdrop:!0,bodyElements:e.jsxs(T,{as:"form",onSubmit:h(E),id:"custom-translations-form",children:[e.jsxs(M,{children:["Provide custom translations for the public views of Ontime. ",e.jsx("br",{}),'You will need to activate this in the settings by selecting "Custom" as the views language.']}),e.jsx(_,{children:Object.entries(c).map(([t,r])=>{var o;return e.jsxs(C,{children:[e.jsx(D,{title:r,description:"",error:(o=n[l(t)])==null?void 0:o.message}),e.jsx(O,{maxLength:150,...p(l(t),{required:"This field is required"}),placeholder:r})]},t)})})]}),footerElements:e.jsxs("div",{children:[(n==null?void 0:n.root)&&e.jsx(S,{children:n.root.message}),e.jsx(u,{align:"apart",children:e.jsxs(u,{children:[e.jsx(m,{size:"large",onClick:a,children:"Cancel"}),e.jsx(m,{variant:"primary",size:"large",type:"submit",form:"custom-translations-form",disabled:d||!x||!j,loading:d,children:"Save changes"})]})})]})})}function l(s){return s.replace(".","_")}function L(s){return s.replace("_",".")}export{K as default};
2
- //# sourceMappingURL=CustomTranslationModal-CJ9-aDjl.js.map
@@ -1,2 +0,0 @@
1
- import{j as a,aT as s,b1 as d}from"./vendor-BoH5HFNN.js";import{m as t}from"./dateConfig-_BhycZza.js";import{T as l}from"./Tooltip-B8y25e3n.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new o.Error().stack;e&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[e]="bae15aeb-624d-4bed-a246-46ba5a304a4d",o._sentryDebugIdIdentifier="sentry-dbid-bae15aeb-624d-4bed-a246-46ba5a304a4d")}catch{}})();const i="_delaySymbol_1i27r_17",y={delaySymbol:i};function m(o){const{delayValue:e,tooltipPrefix:n}=o;if(typeof e!="number"||e===0)return null;const r=n?`${n} ${t(e)}`:t(e);return a.jsx(l,{text:r,render:a.jsx("span",{}),className:y.delaySymbol,children:e<0?a.jsx(s,{}):a.jsx(d,{})})}export{m as D};
2
- //# sourceMappingURL=DelayIndicator-F4GdgsGh.js.map
@@ -1 +0,0 @@
1
- ._blink_ipg21_1{animation:_blink_ipg21_1 1s step-start infinite}@keyframes _blink_ipg21_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_ipg21_13{transform:rotate(45deg)}:root{--editor--panel__br: 8px}._mainContainer_ipg21_21{background-color:#101010;width:100%;height:100%;color:#f6f6f6;padding:.5rem;display:grid;grid-template-columns:auto;grid-template-rows:3.5rem 1fr;grid-template-areas:"overview" "main";gap:.5rem}._panelContainer_ipg21_34{grid-area:main;display:flex;gap:.5rem;overflow:hidden}._panelContainer_ipg21_34 ._rundown_ipg21_40,._panelContainer_ipg21_34 ._playback_ipg21_41,._panelContainer_ipg21_34 ._messages_ipg21_42{position:relative;border-radius:var(--editor--panel__br);background-color:#1a1a1a;padding:1rem}._left_ipg21_49{flex:1 2 auto;min-width:27rem;max-width:30rem;display:flex;flex-direction:column;gap:.5rem}._messages_ipg21_42{flex:1}._content_ipg21_62{padding-top:1.5rem}._contentColumnLayout_ipg21_66{display:flex;flex-direction:column;gap:1rem;color:#f6f6f6}
@@ -1,2 +0,0 @@
1
- (function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new n.Error().stack;e&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[e]="d8d0d11b-7aec-4dae-a1a3-5ddff73e2280",n._sentryDebugIdIdentifier="sentry-dbid-d8d0d11b-7aec-4dae-a1a3-5ddff73e2280")}catch{}})();const t="_mainContainer_ipg21_21",a="_panelContainer_ipg21_34",o="_playback_ipg21_41",s="_messages_ipg21_42",d="_left_ipg21_49",i="_content_ipg21_62",_="_contentColumnLayout_ipg21_66",l={mainContainer:t,panelContainer:a,playback:o,messages:s,left:d,content:i,contentColumnLayout:_};export{l as s};
2
- //# sourceMappingURL=Editor.module-DvV2efYs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Editor.module-DvV2efYs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- import{j as t}from"./vendor-BoH5HFNN.js";import{P as o}from"./ProtectRoute-Ci_AIozP.js";import"./index-CDBQg2fh.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new e.Error().stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="b1150934-0a22-40d0-8921-e46a51e6f2a7",e._sentryDebugIdIdentifier="sentry-dbid-b1150934-0a22-40d0-8921-e46a51e6f2a7")}catch{}})();const s="_wrapper_1t7jb_17",n={wrapper:s};function f({children:e}){return t.jsx(o,{permission:"editor",children:t.jsx("div",{className:n.wrapper,children:e})})}export{f as default};
2
- //# sourceMappingURL=EditorFeatureWrapper-eIpSr_UK.js.map
@@ -1,2 +0,0 @@
1
- import{j as n,y as c,c7 as l}from"./vendor-BoH5HFNN.js";import{e as s}from"./index-CDBQg2fh.js";(function(){try{var r=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new r.Error().stack;e&&(r._sentryDebugIds=r._sentryDebugIds||{},r._sentryDebugIds[e]="69ab4378-bb83-4b30-b534-fd564b4c0844",r._sentryDebugIdIdentifier="sentry-dbid-69ab4378-bb83-4b30-b534-fd564b4c0844")}catch{}})();const i="_blink_149c1_1",f="_fourtyfive_149c1_13",_="_arrow_149c1_17",b="_corner_149c1_21",u="_offsetCorner_149c1_39",d="_header_149c1_43",p="_title_149c1_47",y="_label_149c1_55",h="_separator_149c1_63",m="_horizontal_149c1_66",x="_vertical_149c1_70",t={blink:i,fourtyfive:f,arrow:_,corner:b,offsetCorner:u,header:d,title:p,label:y,separator:h,horizontal:m,vertical:x};function j({className:r,...e}){return n.jsx(c,{className:s([t.corner,t.arrow,r]),...e})}function v({className:r,...e}){return n.jsx(l,{className:s([t.corner,t.offsetCorner,r]),...e})}function C({className:r,pipElement:e,onExtractClick:o}){return n.jsxs(n.Fragment,{children:[n.jsx(c,{className:s([t.corner,t.arrow,r]),onClick:o}),e]})}function I({children:r,className:e,...o}){const a=s([t.title,e]);return n.jsx("h3",{className:a,...o,children:r})}function N({children:r,className:e,...o}){const a=s([t.label,e]);return n.jsx("label",{className:a,...o,children:r})}function k({className:r,orientation:e="vertical",...o}){return n.jsx("div",{className:s([t.separator,t[e],r]),role:"separator",...o})}export{j as C,N as L,k as S,I as T,C as a,v as b};
2
- //# sourceMappingURL=EditorUtils-Bd3J5Dvf.js.map
@@ -1 +0,0 @@
1
- ._blink_149c1_1{animation:_blink_149c1_1 1s step-start infinite}@keyframes _blink_149c1_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_149c1_13,._arrow_149c1_17{transform:rotate(45deg)}._corner_149c1_21{position:absolute;top:.5rem;right:.5rem;cursor:pointer;color:#f6f6f6;transition-property:color;transition-duration:.1s;border-radius:99px;background-color:#303030;outline:2px solid #303030}._corner_149c1_21:hover{color:#ff7597;background-color:#404040;outline:2px solid #404040}._offsetCorner_149c1_39{right:2rem}._header_149c1_43{font-size:1.5rem}._title_149c1_47{font-size:1rem;color:#e2e2e2;display:flex;align-items:center;justify-content:space-between}._label_149c1_55{display:block;font-size:calc(1rem - 3px);color:#8a8a8a;margin-bottom:.25rem;max-width:max-content}._separator_149c1_63{background-color:#ffffff1a}._separator_149c1_63._horizontal_149c1_66{width:100%;height:1px}._separator_149c1_63._vertical_149c1_70{width:1px;height:.75em}
@@ -1,2 +0,0 @@
1
- import{j as n}from"./vendor-BoH5HFNN.js";import{e as o,b3 as i}from"./index-CDBQg2fh.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="c7a1900b-199a-4e78-a9cd-bb3545928e75",e._sentryDebugIdIdentifier="sentry-dbid-c7a1900b-199a-4e78-a9cd-bb3545928e75")}catch{}})();const r="_emptyContainer_xiuvv_17",d="_empty_xiuvv_17",y="_text_xiuvv_26",s={emptyContainer:r,empty:d,text:y};function m({text:e,className:t,injectedStyles:a}){return n.jsxs("div",{className:o([s.emptyContainer,t]),style:a,children:[n.jsx(i,{className:s.empty}),e&&n.jsx("span",{className:s.text,children:e})]})}export{m as E};
2
- //# sourceMappingURL=Empty-C0IdV_kI.js.map
Binary file
Binary file
@@ -1,2 +0,0 @@
1
- import{j as t}from"./vendor-BoH5HFNN.js";import{E as n}from"./Empty-C0IdV_kI.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},d=new e.Error().stack;d&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[d]="f3ec53d6-40d7-4d9c-9d40-3f20aa0b0f42",e._sentryDebugIdIdentifier="sentry-dbid-f3ec53d6-40d7-4d9c-9d40-3f20aa0b0f42")}catch{}})();const s="_page_27rqx_22",a={page:s};function i({text:e,injectedStyles:d}){return t.jsx("div",{className:a.page,children:t.jsx(n,{text:e,injectedStyles:d})})}export{i as E};
2
- //# sourceMappingURL=EmptyPage-Ct3d0DqJ.js.map
@@ -1,2 +0,0 @@
1
- import{j as e,b0 as l}from"./vendor-BoH5HFNN.js";import{e as i}from"./index-CDBQg2fh.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new o.Error().stack;t&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[t]="99f9d08b-bd23-41b1-870a-c71440e67668",o._sentryDebugIdIdentifier="sentry-dbid-99f9d08b-bd23-41b1-870a-c71440e67668")}catch{}})();const f="_followButton_58wqq_17",r="_hidden_58wqq_38",s={followButton:f,hidden:r};function u(o){const{isVisible:t,onClickHandler:n}=o,d=i([s.followButton,!t&&s.hidden]);return e.jsxs("button",{className:d,onClick:n,type:"button",children:[e.jsx(l,{}),"Follow"]})}export{u as F};
2
- //# sourceMappingURL=FollowButton-BG-ycRWu.js.map
@@ -1 +0,0 @@
1
- ._blink_1doij_1{animation:_blink_1doij_1 1s step-start infinite}@keyframes _blink_1doij_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1doij_13{transform:rotate(45deg)}._label_1doij_17{font-size:calc(1rem - 2px);color:#8a8a8a}._label_1doij_17._active_1doij_21{color:#779be7}._previewContainer_1doij_25{display:grid;gap:.5rem;grid-template-columns:3fr 2fr}._preview_1doij_25{background-color:#101010;display:grid;place-content:center;text-align:center;position:relative}._options_1doij_39{display:flex;flex-direction:column;gap:.5rem}._eventStatus_1doij_45{position:absolute;left:0;margin:.5rem .25rem;display:flex;flex-direction:column;gap:.25rem}._mainContent_1doij_54{font-size:1rem;font-weight:600;width:100%;color:var(--override-colour, #f6f6f6)}._mainContent_1doij_54[data-phase=pending]{color:#22a0e9}._mainContent_1doij_54[data-phase=overtime]{color:#fa5656}._mainContent_1doij_54[data-phase=none]{opacity:.4}._secondaryContent_1doij_70{border-top:1px solid rgba(255,255,255,.07)}._blackout_1doij_74{display:none}._timerIndicators_1doij_78{display:flex;flex-direction:column}._statusIcon_1doij_83{color:#404040}._statusIcon_1doij_83[data-active=true]{color:#77c785}._inputItems_1doij_90{display:grid;grid-template-columns:1fr auto;gap:.5rem;margin-top:.25rem}._blink_12rr3_1{animation:_blink_12rr3_1 1s step-start infinite}@keyframes _blink_12rr3_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_12rr3_13{transform:rotate(45deg)}._label_12rr3_17{font-size:calc(1rem - 2px);color:#8a8a8a}._label_12rr3_17._active_12rr3_21{color:#779be7}._previewContainer_12rr3_25{display:grid;gap:.5rem;grid-template-columns:3fr 2fr}._preview_12rr3_25{background-color:#101010;display:grid;place-content:center;text-align:center;position:relative}._options_12rr3_39{display:flex;flex-direction:column;gap:.5rem}._eventStatus_12rr3_45{position:absolute;left:0;margin:.5rem .25rem;display:flex;flex-direction:column;gap:.25rem}._mainContent_12rr3_54{font-size:1rem;font-weight:600;width:100%;color:var(--override-colour, #f6f6f6)}._mainContent_12rr3_54[data-phase=pending]{color:#22a0e9}._mainContent_12rr3_54[data-phase=overtime]{color:#fa5656}._mainContent_12rr3_54[data-phase=none]{opacity:.4}._secondaryContent_12rr3_70{border-top:1px solid rgba(255,255,255,.07)}._blackout_12rr3_74{display:none}._timerIndicators_12rr3_78{display:flex;flex-direction:column}._statusIcon_12rr3_83{color:#404040}._statusIcon_12rr3_83[data-active=true]{color:#77c785}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./PipHost-D7liNR4M.js","./vendor-BoH5HFNN.js","./vendor-4xP-6xVS.css","./EditorUtils-Bd3J5Dvf.js","./index-CDBQg2fh.js","./index-BuJoGGff.css","./EditorUtils-CgF7UfHP.css","./timer.utils-ByC_bcT9.js","./viewUtils-DI8_kmUZ.js","./playbackstate-B3BKJ8cT.js","./MultiPartProgressBar-Cmw-gisu.js","./getProgress-DlrSzpnf.js","./MultiPartProgressBar-1_EFIx1M.css","./presentation.utils-B-wIv_a5.js","./PipHost-BUF7n-lT.css"])))=>i.map(i=>d[i]);
2
- import{h as o,j as e,$ as P,av as M,y as R,bQ as A,bq as B,bR as D,bS as S,bT as w}from"./vendor-BoH5HFNN.js";import{a as L,S as V,C as O}from"./EditorUtils-Bd3J5Dvf.js";import{e as _,ah as F,bM as $,a as H,T as d,bk as z,y,ax as k,bN as I,B as C,bO as i,bP as Q,ak as T,bQ as U,bz as W,b8 as q,bA as G}from"./index-CDBQg2fh.js";import{P as J}from"./ProtectRoute-Ci_AIozP.js";import{S as K}from"./Select-B5xNi_tM.js";import{T as g}from"./Tooltip-B8y25e3n.js";import{s as h}from"./Editor.module-DvV2efYs.js";(function(){try{var n=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new n.Error().stack;t&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[t]="019f0901-4466-4fad-bec7-e4265a1cf5fd",n._sentryDebugIdIdentifier="sentry-dbid-019f0901-4466-4fad-bec7-e4265a1cf5fd")}catch{}})();const X="_label_1doij_17",Y="_active_1doij_21",Z="_inputItems_1doij_90",j={label:X,active:Y,inputItems:Z};function N(n){const{label:t,placeholder:s,text:r,visible:u,changeHandler:b,children:l}=n,[m,x]=o.useState(r),c=o.useRef(null),p=o.useRef(0);o.useEffect(()=>{c.current&&c.current!==document.activeElement&&(c.current.selectionStart=p.current,c.current.selectionEnd=p.current)},[r]),o.useEffect(()=>{c.current!==document.activeElement&&x(r)},[r]);const v=f=>{p.current=f.target.selectionStart??0,x(f.target.value),b(f.target.value)};return e.jsxs("div",{className:j.inputRow,children:[e.jsx("label",{className:_([j.label,u??j.active]),htmlFor:t,children:t}),e.jsxs("div",{className:j.inputItems,children:[e.jsx(F,{id:t,ref:c,value:m,onChange:v,placeholder:s}),l]})]})}const ee="documentPictureInPicture"in window,te=o.lazy(()=>P(()=>import("./PipHost-D7liNR4M.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]),import.meta.url)),ne=o.memo(se);function se(){return ee?e.jsx(o.Suspense,{fallback:null,children:e.jsx(te,{})}):null}const re="_blink_12rr3_1",ae="_previewContainer_12rr3_25",oe="_preview_12rr3_25",ie="_options_12rr3_39",ce="_eventStatus_12rr3_45",le="_mainContent_12rr3_54",ue="_secondaryContent_12rr3_70",de="_blackout_12rr3_74",me="_statusIcon_12rr3_83",a={blink:re,previewContainer:ae,preview:oe,options:ie,eventStatus:ce,mainContent:le,secondaryContent:ue,blackout:de,statusIcon:me},xe={aux1:"Aux 1",aux2:"Aux 2",aux3:"Aux 3",secondary:"Secondary message"};function pe(){const{blink:n,blackout:t,countToEnd:s,phase:r,secondarySource:u,showTimerMessage:b,timerType:l}=$(),{data:m}=H(),x=b?"Message":l===d.None?z:r===y.Pending?"Standby to start":r===y.Overtime?"Timer Overtime":l===d.Clock?"Clock":s?"Count to End":"Timer",c=b||!u?null:xe[u],p=r===y.Warning?m.warningColor??"#ffa528":r===y.Danger?m.dangerColor??"#ff7300":m.normalColor??"#FFFC",v=x=="Timer",f=_([n&&a.blink,t&&a.blackout]);return e.jsxs("div",{className:a.preview,children:[e.jsx(L,{onExtractClick:E=>k("timer",E),pipElement:e.jsx(ne,{})}),e.jsxs("div",{className:f,children:[e.jsx("div",{className:a.mainContent,"data-phase":v&&r,style:v?{"--override-colour":p}:{},children:x}),c!==null&&e.jsx("div",{className:a.secondaryContent,children:c})]}),e.jsxs("div",{className:a.eventStatus,children:[e.jsx(g,{text:"Time type: Count down",render:e.jsx("span",{}),className:a.statusIcon,"data-active":l===d.CountDown,children:e.jsx(M,{})}),e.jsx(g,{text:"Time type: Count up",render:e.jsx("span",{}),className:a.statusIcon,"data-active":l===d.CountUp,children:e.jsx(R,{})}),e.jsx(g,{text:"Time type: Clock",render:e.jsx("span",{}),className:a.statusIcon,"data-active":l===d.Clock,children:e.jsx(A,{})}),e.jsx(g,{text:"Time type: None",render:e.jsx("span",{}),className:a.statusIcon,"data-active":l===d.None,children:e.jsx(B,{})}),e.jsx(g,{text:s?"Count to end":"Count duration",render:e.jsx("span",{}),className:a.statusIcon,"data-active":s,children:e.jsx(D,{})})]})]})}function fe(){const{blackout:n,blink:t}=I();return e.jsxs("div",{className:a.previewContainer,children:[e.jsx(pe,{}),e.jsxs("div",{className:a.options,children:[e.jsx(ge,{}),e.jsx(V,{orientation:"horizontal"}),e.jsx(C,{variant:t?"primary":"subtle",fluid:!0,onClick:()=>i.timerBlink(!t),"data-testid":"toggle timer blink",children:"Blink"}),e.jsx(C,{variant:n?"primary":"subtle",fluid:!0,onClick:()=>i.timerBlackout(!n),"data-testid":"toggle timer blackout",children:"Blackout screen"})]})]})}function ge(){const{secondarySource:n}=I(),[t,s]=o.useState("aux1");o.useEffect(()=>{n!==null&&s(n)},[n]);const r=()=>{n===t?i.timerSecondarySource(null):i.timerSecondarySource(t)};return e.jsxs(e.Fragment,{children:[e.jsx(K,{value:t,options:[{value:"aux1",label:"Aux 1"},{value:"aux2",label:"Aux 2"},{value:"aux3",label:"Aux 3"},{value:"secondary",label:"Secondary message"}],onValueChange:u=>{n!==null&&i.timerSecondarySource(u),s(u)}}),e.jsx(C,{variant:n!==null?"primary":"subtle",fluid:!0,onClick:r,"data-testid":"toggle secondary",children:"Show secondary"})]})}function be(){return e.jsxs(e.Fragment,{children:[e.jsx(fe,{}),e.jsx(ve,{}),e.jsx(ye,{})]})}function ve(){const{text:n,visible:t}=Q();return e.jsx(N,{label:"Timer Message",placeholder:"Message shown fullscreen in stage timer",text:n,visible:t,changeHandler:s=>i.timerText(s),children:e.jsx(T,{"aria-label":"Toggle timer message visibility",onClick:()=>i.timerVisible(!t),variant:t?"primary":"subtle",children:t?e.jsx(S,{}):e.jsx(w,{})})})}function ye(){const{text:n,visible:t}=U(),s=()=>{t?i.timerSecondarySource(null):i.timerSecondarySource("secondary")};return e.jsx(N,{label:"Secondary Message",placeholder:"Message shown as secondary text in stage timer",text:n,visible:t,changeHandler:r=>i.secondaryMessage(r),children:e.jsx(T,{"aria-label":"Toggle secondary message visibility",onClick:s,variant:t?"primary":"subtle",children:t?e.jsx(S,{}):e.jsx(w,{})})})}const Te=o.memo(je);function je(){const n=window.location.pathname.includes("/messagecontrol"),t=_([h.content,h.contentColumnLayout]);return e.jsx(J,{permission:"editor",children:e.jsxs("div",{className:h.messages,"data-testid":"panel-messages-control",children:[!n&&e.jsx(O,{onClick:s=>k("messagecontrol",s)}),n&&e.jsx(W,{suppressSettings:!0,isNavigationLocked:q()}),e.jsx("div",{className:t,children:e.jsx(G,{children:e.jsx(be,{})})})]})})}export{Te as default};
3
- //# sourceMappingURL=MessageControlExport-X-4dl9QT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":["InputRow","props","label","placeholder","text","visible","changeHandler","children","value","setValue","useState","inputRef","useRef","cursorPositionRef","useEffect","handleInputChange","event","jsxs","style","jsx","cx","Input","isPipSupported","PipTimerHost","lazy","__vitePreload","memo","PipRoot","Suspense","secondarySourceLabels","TimerPreview","blink","blackout","countToEnd","phase","secondarySource","showTimerMessage","timerType","useMessagePreview","data","useViewSettings","main","TimerType","timerPlaceholder","TimerPhase","secondary","overrideColour","showColourOverride","contentClasses","CornerWithPip","handleLinks","Tooltip","IoArrowDown","IoArrowUp","IoTime","IoBan","LuArrowDownToLine","TimerControlsPreview","useTimerViewControl","SecondarySourceControl","Editor.Separator","Button","setMessage","toggleSecondary","Fragment","Select","MessageControl","TimerMessageInput","SecondaryInput","useTimerMessageInput","newValue","IconButton","IoEye","IoEyeOffOutline","useSecondaryMessageInput","MessageControlExport","isExtracted","classes","ProtectRoute","CornerExtract","ViewNavigationMenu","getIsNavigationLocked","ErrorBoundary"],"ignoreList":[],"sources":["../../src/features/control/message/InputRow.tsx","../../src/views/editor/pip-timer/pip.utils.ts","../../src/views/editor/pip-timer/PipRoot.tsx","../../src/features/control/message/TimerPreview.tsx","../../src/features/control/message/TimerViewControl.tsx","../../src/features/control/message/MessageControl.tsx","../../src/features/control/message/MessageControlExport.tsx"],"sourcesContent":["import { PropsWithChildren, useEffect, useRef, useState } from 'react';\n\nimport Input from '../../../common/components/input/input/Input';\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './InputRow.module.scss';\n\ninterface InputRowProps {\n label: string;\n placeholder: string;\n text: string;\n visible: boolean;\n changeHandler: (newValue: string) => void;\n}\n\nexport default function InputRow(props: PropsWithChildren<InputRowProps>) {\n const { label, placeholder, text, visible, changeHandler, children } = props;\n\n const [value, setValue] = useState(text);\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef(0);\n\n // sync cursor position with text\n useEffect(() => {\n if (inputRef.current && inputRef.current !== document.activeElement) {\n inputRef.current.selectionStart = cursorPositionRef.current;\n inputRef.current.selectionEnd = cursorPositionRef.current;\n }\n }, [text]);\n\n // synchronise external text\n useEffect(() => {\n if (inputRef.current !== document.activeElement) {\n setValue(text);\n }\n }, [text]);\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n cursorPositionRef.current = event.target.selectionStart ?? 0;\n setValue(event.target.value);\n changeHandler(event.target.value);\n };\n\n return (\n <div className={style.inputRow}>\n <label className={cx([style.label, visible ?? style.active])} htmlFor={label}>\n {label}\n </label>\n <div className={style.inputItems}>\n <Input id={label} ref={inputRef} value={value} onChange={handleInputChange} placeholder={placeholder} />\n {children}\n </div>\n </div>\n );\n}\n","export const isPipSupported = 'documentPictureInPicture' in window;\n","import { lazy, memo, Suspense } from 'react';\n\nimport { isPipSupported } from './pip.utils';\n\nconst PipTimerHost = lazy(() => import('./PipHost'));\n\nexport default memo(PipRoot);\nfunction PipRoot() {\n if (!isPipSupported) {\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <PipTimerHost />\n </Suspense>\n );\n}\n","import { IoArrowDown, IoArrowUp, IoBan, IoTime } from 'react-icons/io5';\nimport { LuArrowDownToLine } from 'react-icons/lu';\nimport { TimerPhase, TimerType } from 'ontime-types';\n\nimport { CornerWithPip } from '../../../common/components/editor-utils/EditorUtils';\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport { useMessagePreview } from '../../../common/hooks/useSocket';\nimport useViewSettings from '../../../common/hooks-query/useViewSettings';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { cx, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport PipRoot from '../../../views/editor/pip-timer/PipRoot';\n\nimport style from './MessageControl.module.scss';\n\nconst secondarySourceLabels: Record<string, string> = {\n aux1: 'Aux 1',\n aux2: 'Aux 2',\n aux3: 'Aux 3',\n secondary: 'Secondary message',\n};\n\nexport default function TimerPreview() {\n const { blink, blackout, countToEnd, phase, secondarySource, showTimerMessage, timerType } = useMessagePreview();\n const { data } = useViewSettings();\n\n const main = (() => {\n if (showTimerMessage) return 'Message';\n if (timerType === TimerType.None) return timerPlaceholder;\n if (phase === TimerPhase.Pending) return 'Standby to start';\n if (phase === TimerPhase.Overtime) return 'Timer Overtime';\n if (timerType === TimerType.Clock) return 'Clock';\n if (countToEnd) return 'Count to End';\n return 'Timer';\n })();\n\n const secondary = (() => {\n // message is a fullscreen overlay or secondary is not active\n if (showTimerMessage || !secondarySource) return null;\n\n // we need to check aux first since it takes priority\n return secondarySourceLabels[secondarySource];\n })();\n\n const overrideColour = (() => {\n // override fallback colours from starter project\n if (phase === TimerPhase.Warning) return data.warningColor ?? '#ffa528';\n if (phase === TimerPhase.Danger) return data.dangerColor ?? '#ff7300';\n return data.normalColor ?? '#FFFC';\n })();\n\n const showColourOverride = main == 'Timer';\n const contentClasses = cx([blink && style.blink, blackout && style.blackout]);\n\n return (\n <div className={style.preview}>\n <CornerWithPip onExtractClick={(event) => handleLinks('timer', event)} pipElement={<PipRoot />} />\n <div className={contentClasses}>\n <div\n className={style.mainContent}\n data-phase={showColourOverride && phase}\n style={showColourOverride ? { '--override-colour': overrideColour } : {}}\n >\n {main}\n </div>\n {secondary !== null && <div className={style.secondaryContent}>{secondary}</div>}\n </div>\n <div className={style.eventStatus}>\n <Tooltip\n text='Time type: Count down'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountDown}\n >\n <IoArrowDown />\n </Tooltip>\n <Tooltip\n text='Time type: Count up'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.CountUp}\n >\n <IoArrowUp />\n </Tooltip>\n <Tooltip\n text='Time type: Clock'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.Clock}\n >\n <IoTime />\n </Tooltip>\n <Tooltip\n text='Time type: None'\n render={<span />}\n className={style.statusIcon}\n data-active={timerType === TimerType.None}\n >\n <IoBan />\n </Tooltip>\n <Tooltip\n text={countToEnd ? 'Count to end' : 'Count duration'}\n render={<span />}\n className={style.statusIcon}\n data-active={countToEnd}\n >\n <LuArrowDownToLine />\n </Tooltip>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { SecondarySource } from 'ontime-types';\n\nimport Button from '../../../common/components/buttons/Button';\nimport * as Editor from '../../../common/components/editor-utils/EditorUtils';\nimport Select from '../../../common/components/select/Select';\nimport { setMessage, useTimerViewControl } from '../../../common/hooks/useSocket';\n\nimport TimerPreview from './TimerPreview';\n\nimport style from './MessageControl.module.scss';\n\nexport default function TimerControlsPreview() {\n const { blackout, blink } = useTimerViewControl();\n\n return (\n <div className={style.previewContainer}>\n <TimerPreview />\n <div className={style.options}>\n <SecondarySourceControl />\n\n <Editor.Separator orientation='horizontal' />\n\n <Button\n variant={blink ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlink(!blink)}\n data-testid='toggle timer blink'\n >\n Blink\n </Button>\n <Button\n variant={blackout ? 'primary' : 'subtle'}\n fluid\n onClick={() => setMessage.timerBlackout(!blackout)}\n data-testid='toggle timer blackout'\n >\n Blackout screen\n </Button>\n </div>\n </div>\n );\n}\n\nfunction SecondarySourceControl() {\n const { secondarySource } = useTimerViewControl();\n const [value, setValue] = useState<SecondarySource>('aux1');\n\n // sync secondary source with external changes\n useEffect(() => {\n if (secondarySource !== null) {\n setValue(secondarySource);\n }\n }, [secondarySource]);\n\n const toggleSecondary = () => {\n if (secondarySource === value) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource(value);\n }\n };\n\n return (\n <>\n <Select\n value={value}\n options={[\n { value: 'aux1', label: 'Aux 1' },\n { value: 'aux2', label: 'Aux 2' },\n { value: 'aux3', label: 'Aux 3' },\n { value: 'secondary', label: 'Secondary message' },\n ]}\n onValueChange={(value) => {\n // we can only update the remote if it is enabled\n if (secondarySource !== null) {\n setMessage.timerSecondarySource(value as SecondarySource);\n }\n setValue(value as SecondarySource);\n }}\n />\n <Button\n variant={secondarySource !== null ? 'primary' : 'subtle'}\n fluid\n onClick={toggleSecondary}\n data-testid='toggle secondary'\n >\n Show secondary\n </Button>\n </>\n );\n}\n","import { IoEye, IoEyeOffOutline } from 'react-icons/io5';\n\nimport IconButton from '../../../common/components/buttons/IconButton';\nimport {\n setMessage,\n useExternalMessageInput as useSecondaryMessageInput,\n useTimerMessageInput,\n} from '../../../common/hooks/useSocket';\n\nimport InputRow from './InputRow';\nimport TimerControlsPreview from './TimerViewControl';\n\nexport default function MessageControl() {\n return (\n <>\n <TimerControlsPreview />\n <TimerMessageInput />\n <SecondaryInput />\n </>\n );\n}\n\nfunction TimerMessageInput() {\n const { text, visible } = useTimerMessageInput();\n\n return (\n <InputRow\n label='Timer Message'\n placeholder='Message shown fullscreen in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.timerText(newValue)}\n >\n <IconButton\n aria-label='Toggle timer message visibility'\n onClick={() => setMessage.timerVisible(!visible)}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n\nfunction SecondaryInput() {\n const { text, visible } = useSecondaryMessageInput();\n\n const toggleSecondary = () => {\n if (visible) {\n setMessage.timerSecondarySource(null);\n } else {\n setMessage.timerSecondarySource('secondary');\n }\n };\n\n return (\n <InputRow\n label='Secondary Message'\n placeholder='Message shown as secondary text in stage timer'\n text={text}\n visible={visible}\n changeHandler={(newValue) => setMessage.secondaryMessage(newValue)}\n >\n <IconButton\n aria-label='Toggle secondary message visibility'\n onClick={toggleSecondary}\n variant={visible ? 'primary' : 'subtle'}\n >\n {visible ? <IoEye /> : <IoEyeOffOutline />}\n </IconButton>\n </InputRow>\n );\n}\n","import { memo } from 'react';\n\nimport { CornerExtract } from '../../../common/components/editor-utils/EditorUtils';\nimport ErrorBoundary from '../../../common/components/error-boundary/ErrorBoundary';\nimport ViewNavigationMenu from '../../../common/components/navigation-menu/ViewNavigationMenu';\nimport ProtectRoute from '../../../common/components/protect-route/ProtectRoute';\nimport { handleLinks } from '../../../common/utils/linkUtils';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { getIsNavigationLocked } from '../../../externals';\n\nimport MessageControl from './MessageControl';\n\nimport style from '../../../views/editor/Editor.module.scss';\n\nexport default memo(MessageControlExport);\nfunction MessageControlExport() {\n const isExtracted = window.location.pathname.includes('/messagecontrol');\n const classes = cx([style.content, style.contentColumnLayout]);\n\n return (\n <ProtectRoute permission='editor'>\n <div className={style.messages} data-testid='panel-messages-control'>\n {!isExtracted && <CornerExtract onClick={(event) => handleLinks('messagecontrol', event)} />}\n {isExtracted && <ViewNavigationMenu suppressSettings isNavigationLocked={getIsNavigationLocked()} />}\n\n <div className={classes}>\n <ErrorBoundary>\n <MessageControl />\n </ErrorBoundary>\n </div>\n </div>\n </ProtectRoute>\n );\n}\n"],"file":"assets/MessageControlExport-X-4dl9QT.js"}