@getontime/cli 4.0.2 → 4.2.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 (490) hide show
  1. package/client/assets/Backstage-DG-hwPI3.js +2 -0
  2. package/client/assets/Backstage-DG-hwPI3.js.br +0 -0
  3. package/client/assets/Backstage-DG-hwPI3.js.gz +0 -0
  4. package/client/assets/Backstage-DG-hwPI3.js.map +1 -0
  5. package/client/assets/Countdown-C8LGl1pp.js +2 -0
  6. package/client/assets/Countdown-C8LGl1pp.js.br +0 -0
  7. package/client/assets/Countdown-C8LGl1pp.js.gz +0 -0
  8. package/client/assets/Countdown-C8LGl1pp.js.map +1 -0
  9. package/client/assets/CustomTranslationModal-CJ9-aDjl.js +2 -0
  10. package/client/assets/CustomTranslationModal-CJ9-aDjl.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-CJ9-aDjl.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-C3R_2T5s.js.map → CustomTranslationModal-CJ9-aDjl.js.map} +1 -1
  13. package/client/assets/DelayIndicator-F4GdgsGh.js +2 -0
  14. package/client/assets/DelayIndicator-F4GdgsGh.js.br +0 -0
  15. package/client/assets/DelayIndicator-F4GdgsGh.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-vT7n8ypf.js.map → DelayIndicator-F4GdgsGh.js.map} +1 -1
  17. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js +2 -0
  18. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-eIpSr_UK.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-DHfuO3EA.js.map → EditorFeatureWrapper-eIpSr_UK.js.map} +1 -1
  21. package/client/assets/EditorUtils-Bd3J5Dvf.js +2 -0
  22. package/client/assets/EditorUtils-Bd3J5Dvf.js.br +0 -0
  23. package/client/assets/EditorUtils-Bd3J5Dvf.js.gz +0 -0
  24. package/client/assets/EditorUtils-Bd3J5Dvf.js.map +1 -0
  25. package/client/assets/EditorUtils-CgF7UfHP.css +1 -0
  26. package/client/assets/EditorUtils-CgF7UfHP.css.br +0 -0
  27. package/client/assets/EditorUtils-CgF7UfHP.css.gz +0 -0
  28. package/client/assets/Empty-C0IdV_kI.js +2 -0
  29. package/client/assets/Empty-C0IdV_kI.js.br +0 -0
  30. package/client/assets/Empty-C0IdV_kI.js.gz +0 -0
  31. package/client/assets/{Empty-gWT_HMeu.js.map → Empty-C0IdV_kI.js.map} +1 -1
  32. package/client/assets/EmptyPage-Ct3d0DqJ.js +2 -0
  33. package/client/assets/EmptyPage-Ct3d0DqJ.js.br +0 -0
  34. package/client/assets/EmptyPage-Ct3d0DqJ.js.gz +0 -0
  35. package/client/assets/{EmptyPage-Dcbg6rmF.js.map → EmptyPage-Ct3d0DqJ.js.map} +1 -1
  36. package/client/assets/FollowButton-BG-ycRWu.js +2 -0
  37. package/client/assets/FollowButton-BG-ycRWu.js.br +0 -0
  38. package/client/assets/FollowButton-BG-ycRWu.js.gz +0 -0
  39. package/client/assets/{FollowButton-CSqJSvix.js.map → FollowButton-BG-ycRWu.js.map} +1 -1
  40. package/client/assets/MessageControlExport-DjoUioWA.css +1 -0
  41. package/client/assets/MessageControlExport-DjoUioWA.css.br +0 -0
  42. package/client/assets/MessageControlExport-DjoUioWA.css.gz +0 -0
  43. package/client/assets/MessageControlExport-X-4dl9QT.js +3 -0
  44. package/client/assets/MessageControlExport-X-4dl9QT.js.br +0 -0
  45. package/client/assets/MessageControlExport-X-4dl9QT.js.gz +0 -0
  46. package/client/assets/MessageControlExport-X-4dl9QT.js.map +1 -0
  47. package/client/assets/MilestoneEditor-BqNKKlvI.css +1 -0
  48. package/client/assets/MilestoneEditor-BqNKKlvI.css.br +0 -0
  49. package/client/assets/MilestoneEditor-BqNKKlvI.css.gz +0 -0
  50. package/client/assets/MilestoneEditor-rgBQSXVU.js +2 -0
  51. package/client/assets/MilestoneEditor-rgBQSXVU.js.br +0 -0
  52. package/client/assets/MilestoneEditor-rgBQSXVU.js.gz +0 -0
  53. package/client/assets/MilestoneEditor-rgBQSXVU.js.map +1 -0
  54. package/client/assets/Modal-Bn1bZkwb.js +2 -0
  55. package/client/assets/Modal-Bn1bZkwb.js.br +0 -0
  56. package/client/assets/Modal-Bn1bZkwb.js.gz +0 -0
  57. package/client/assets/Modal-Bn1bZkwb.js.map +1 -0
  58. package/client/assets/Modal-D3tAPV2u.css +1 -0
  59. package/client/assets/Modal-D3tAPV2u.css.br +0 -0
  60. package/client/assets/Modal-D3tAPV2u.css.gz +0 -0
  61. package/client/assets/MultiPartProgressBar-Cmw-gisu.js +2 -0
  62. package/client/assets/MultiPartProgressBar-Cmw-gisu.js.br +0 -0
  63. package/client/assets/MultiPartProgressBar-Cmw-gisu.js.gz +0 -0
  64. package/client/assets/{MultiPartProgressBar-D3jJZjb5.js.map → MultiPartProgressBar-Cmw-gisu.js.map} +1 -1
  65. package/client/assets/OperatorExport-BiBcgVKc.css +1 -0
  66. package/client/assets/OperatorExport-BiBcgVKc.css.br +0 -0
  67. package/client/assets/OperatorExport-BiBcgVKc.css.gz +0 -0
  68. package/client/assets/OperatorExport-CJd8jmY4.js +2 -0
  69. package/client/assets/OperatorExport-CJd8jmY4.js.br +0 -0
  70. package/client/assets/OperatorExport-CJd8jmY4.js.gz +0 -0
  71. package/client/assets/OperatorExport-CJd8jmY4.js.map +1 -0
  72. package/client/assets/OverviewWrapper-1Vj3_ojX.js +2 -0
  73. package/client/assets/OverviewWrapper-1Vj3_ojX.js.br +0 -0
  74. package/client/assets/OverviewWrapper-1Vj3_ojX.js.gz +0 -0
  75. package/client/assets/OverviewWrapper-1Vj3_ojX.js.map +1 -0
  76. package/client/assets/OverviewWrapper-9aebU9w0.css +1 -0
  77. package/client/assets/OverviewWrapper-9aebU9w0.css.br +0 -0
  78. package/client/assets/OverviewWrapper-9aebU9w0.css.gz +0 -0
  79. package/client/assets/PipHost-BUF7n-lT.css +1 -0
  80. package/client/assets/PipHost-BUF7n-lT.css.br +0 -0
  81. package/client/assets/PipHost-BUF7n-lT.css.gz +0 -0
  82. package/client/assets/PipHost-D7liNR4M.js +2 -0
  83. package/client/assets/PipHost-D7liNR4M.js.br +0 -0
  84. package/client/assets/PipHost-D7liNR4M.js.gz +0 -0
  85. package/client/assets/PipHost-D7liNR4M.js.map +1 -0
  86. package/client/assets/ProjectInfo-BduQgjcz.js +2 -0
  87. package/client/assets/ProjectInfo-BduQgjcz.js.br +0 -0
  88. package/client/assets/ProjectInfo-BduQgjcz.js.gz +0 -0
  89. package/client/assets/{ProjectInfo-z4k3cipS.js.map → ProjectInfo-BduQgjcz.js.map} +1 -1
  90. package/client/assets/ProtectRoute-Ci_AIozP.js +2 -0
  91. package/client/assets/ProtectRoute-Ci_AIozP.js.br +0 -0
  92. package/client/assets/ProtectRoute-Ci_AIozP.js.gz +0 -0
  93. package/client/assets/{ProtectRoute-CrcWfOlG.js.map → ProtectRoute-Ci_AIozP.js.map} +1 -1
  94. package/client/assets/{ProtectedCuesheet-CMTscjjR.css → ProtectedCuesheet-C_tKodwo.css} +1 -1
  95. package/client/assets/ProtectedCuesheet-C_tKodwo.css.br +0 -0
  96. package/client/assets/ProtectedCuesheet-C_tKodwo.css.gz +0 -0
  97. package/client/assets/ProtectedCuesheet-D_zdkwM-.js +2 -0
  98. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.br +0 -0
  99. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.gz +0 -0
  100. package/client/assets/ProtectedCuesheet-D_zdkwM-.js.map +1 -0
  101. package/client/assets/ProtectedEditor-CNL2ig79.js +3 -0
  102. package/client/assets/ProtectedEditor-CNL2ig79.js.br +0 -0
  103. package/client/assets/ProtectedEditor-CNL2ig79.js.gz +0 -0
  104. package/client/assets/ProtectedEditor-CNL2ig79.js.map +1 -0
  105. package/client/assets/ProtectedEditor-Dw0pWw0J.css +1 -0
  106. package/client/assets/ProtectedEditor-Dw0pWw0J.css.br +0 -0
  107. package/client/assets/ProtectedEditor-Dw0pWw0J.css.gz +0 -0
  108. package/client/assets/RundownEntry-Blq5OsMH.css +1 -0
  109. package/client/assets/RundownEntry-Blq5OsMH.css.br +0 -0
  110. package/client/assets/RundownEntry-Blq5OsMH.css.gz +0 -0
  111. package/client/assets/RundownEntry-Bs1ombtH.js +2 -0
  112. package/client/assets/RundownEntry-Bs1ombtH.js.br +0 -0
  113. package/client/assets/RundownEntry-Bs1ombtH.js.gz +0 -0
  114. package/client/assets/RundownEntry-Bs1ombtH.js.map +1 -0
  115. package/client/assets/RundownExport-BCT0ybxy.js +3 -0
  116. package/client/assets/RundownExport-BCT0ybxy.js.br +0 -0
  117. package/client/assets/RundownExport-BCT0ybxy.js.gz +0 -0
  118. package/client/assets/RundownExport-BCT0ybxy.js.map +1 -0
  119. package/client/assets/{RundownExport-1zBZurIG.css → RundownExport-DtSvAfBG.css} +1 -1
  120. package/client/assets/RundownExport-DtSvAfBG.css.br +0 -0
  121. package/client/assets/RundownExport-DtSvAfBG.css.gz +0 -0
  122. package/client/assets/Select-B5xNi_tM.js +2 -0
  123. package/client/assets/Select-B5xNi_tM.js.br +0 -0
  124. package/client/assets/Select-B5xNi_tM.js.gz +0 -0
  125. package/client/assets/{Select-CedN80WS.js.map → Select-B5xNi_tM.js.map} +1 -1
  126. package/client/assets/Studio-D4hRKhJ1.js +2 -0
  127. package/client/assets/Studio-D4hRKhJ1.js.br +0 -0
  128. package/client/assets/Studio-D4hRKhJ1.js.gz +0 -0
  129. package/client/assets/Studio-D4hRKhJ1.js.map +1 -0
  130. package/client/assets/{StyleEditor-D2z65PB7.js → StyleEditor-BvcE8dkA.js} +2 -2
  131. package/client/assets/StyleEditor-BvcE8dkA.js.br +3 -0
  132. package/client/assets/StyleEditor-BvcE8dkA.js.gz +0 -0
  133. package/client/assets/{StyleEditor-D2z65PB7.js.map → StyleEditor-BvcE8dkA.js.map} +1 -1
  134. package/client/assets/SuperscriptPeriod-BmHAoSBy.js +2 -0
  135. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.br +0 -0
  136. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.gz +0 -0
  137. package/client/assets/SuperscriptPeriod-BmHAoSBy.js.map +1 -0
  138. package/client/assets/SuperscriptTime-Nou92D8X.js +2 -0
  139. package/client/assets/SuperscriptTime-Nou92D8X.js.br +0 -0
  140. package/client/assets/SuperscriptTime-Nou92D8X.js.gz +0 -0
  141. package/client/assets/{SuperscriptTime-CIrcMcyg.js.map → SuperscriptTime-Nou92D8X.js.map} +1 -1
  142. package/client/assets/TimeElements-XpRwBsaa.js +2 -0
  143. package/client/assets/TimeElements-XpRwBsaa.js.br +0 -0
  144. package/client/assets/TimeElements-XpRwBsaa.js.gz +0 -0
  145. package/client/assets/TimeElements-XpRwBsaa.js.map +1 -0
  146. package/client/assets/TimeElements-c2rTHN98.css +1 -0
  147. package/client/assets/TimeElements-c2rTHN98.css.br +0 -0
  148. package/client/assets/TimeElements-c2rTHN98.css.gz +0 -0
  149. package/client/assets/TimeInput-Bu_5GlHP.js +2 -0
  150. package/client/assets/TimeInput-Bu_5GlHP.js.br +0 -0
  151. package/client/assets/TimeInput-Bu_5GlHP.js.gz +0 -0
  152. package/client/assets/{TimeInput-Dg1naiy3.js.map → TimeInput-Bu_5GlHP.js.map} +1 -1
  153. package/client/assets/{TimeInput-BrVdiuOQ.css → TimeInput-Cu-N5DmX.css} +1 -1
  154. package/client/assets/TimeInput-Cu-N5DmX.css.br +0 -0
  155. package/client/assets/TimeInput-Cu-N5DmX.css.gz +0 -0
  156. package/client/assets/TimelinePage-CQqUB1KT.js +2 -0
  157. package/client/assets/TimelinePage-CQqUB1KT.js.br +0 -0
  158. package/client/assets/TimelinePage-CQqUB1KT.js.gz +0 -0
  159. package/client/assets/TimelinePage-CQqUB1KT.js.map +1 -0
  160. package/client/assets/TimelinePage-CcFl3uul.css +1 -0
  161. package/client/assets/TimelinePage-CcFl3uul.css.br +0 -0
  162. package/client/assets/TimelinePage-CcFl3uul.css.gz +0 -0
  163. package/client/assets/{Timer-BvEmZbmF.css → Timer-B7nk3TMf.css} +1 -1
  164. package/client/assets/Timer-B7nk3TMf.css.br +0 -0
  165. package/client/assets/Timer-B7nk3TMf.css.gz +0 -0
  166. package/client/assets/Timer-CIr2L3gJ.js +2 -0
  167. package/client/assets/Timer-CIr2L3gJ.js.br +0 -0
  168. package/client/assets/Timer-CIr2L3gJ.js.gz +0 -0
  169. package/client/assets/Timer-CIr2L3gJ.js.map +1 -0
  170. package/client/assets/TimerControlExport-4a3Cd9x8.js +2 -0
  171. package/client/assets/TimerControlExport-4a3Cd9x8.js.br +0 -0
  172. package/client/assets/TimerControlExport-4a3Cd9x8.js.gz +0 -0
  173. package/client/assets/{TimerControlExport-C8ECtLBd.js.map → TimerControlExport-4a3Cd9x8.js.map} +1 -1
  174. package/client/assets/{TimerControlExport-D8kqHQB0.css → TimerControlExport-DavNxY9p.css} +1 -1
  175. package/client/assets/TimerControlExport-DavNxY9p.css.br +0 -0
  176. package/client/assets/TimerControlExport-DavNxY9p.css.gz +0 -0
  177. package/client/assets/TitleCard-1U35ek0D.js +2 -0
  178. package/client/assets/TitleCard-1U35ek0D.js.br +0 -0
  179. package/client/assets/TitleCard-1U35ek0D.js.gz +0 -0
  180. package/client/assets/{TitleCard-CZl9wSHS.js.map → TitleCard-1U35ek0D.js.map} +1 -1
  181. package/client/assets/{Tooltip-D9XRnwOW.js → Tooltip-B8y25e3n.js} +2 -2
  182. package/client/assets/Tooltip-B8y25e3n.js.br +0 -0
  183. package/client/assets/Tooltip-B8y25e3n.js.gz +0 -0
  184. package/client/assets/{Tooltip-D9XRnwOW.js.map → Tooltip-B8y25e3n.js.map} +1 -1
  185. package/client/assets/ViewLogo-BHsV7Faa.js +2 -0
  186. package/client/assets/ViewLogo-BHsV7Faa.js.br +0 -0
  187. package/client/assets/ViewLogo-BHsV7Faa.js.gz +0 -0
  188. package/client/assets/{ViewLogo-_3Z1hIHi.js.map → ViewLogo-BHsV7Faa.js.map} +1 -1
  189. package/client/assets/ViewParamsEditor-BMHXOv-K.js +2 -0
  190. package/client/assets/ViewParamsEditor-BMHXOv-K.js.br +0 -0
  191. package/client/assets/ViewParamsEditor-BMHXOv-K.js.gz +0 -0
  192. package/client/assets/ViewParamsEditor-BMHXOv-K.js.map +1 -0
  193. package/client/assets/ViewParamsEditor-CupOV30k.css +1 -0
  194. package/client/assets/ViewParamsEditor-CupOV30k.css.br +0 -0
  195. package/client/assets/ViewParamsEditor-CupOV30k.css.gz +0 -0
  196. package/client/assets/{dateConfig-DRQGMWDF.js → dateConfig-_BhycZza.js} +2 -2
  197. package/client/assets/dateConfig-_BhycZza.js.br +0 -0
  198. package/client/assets/dateConfig-_BhycZza.js.gz +0 -0
  199. package/client/assets/{dateConfig-DRQGMWDF.js.map → dateConfig-_BhycZza.js.map} +1 -1
  200. package/client/assets/{editorSettings-BU0pTMSY.js → editorSettings-DH9ca-nB.js} +2 -2
  201. package/client/assets/editorSettings-DH9ca-nB.js.br +0 -0
  202. package/client/assets/editorSettings-DH9ca-nB.js.gz +0 -0
  203. package/client/assets/{editorSettings-BU0pTMSY.js.map → editorSettings-DH9ca-nB.js.map} +1 -1
  204. package/client/assets/{getProgress-Cw79NL_O.js → getProgress-DlrSzpnf.js} +2 -2
  205. package/client/assets/getProgress-DlrSzpnf.js.br +0 -0
  206. package/client/assets/getProgress-DlrSzpnf.js.gz +0 -0
  207. package/client/assets/{getProgress-Cw79NL_O.js.map → getProgress-DlrSzpnf.js.map} +1 -1
  208. package/client/assets/{index-De0uf0Ta.css → index-BuJoGGff.css} +1 -1
  209. package/client/assets/index-BuJoGGff.css.br +0 -0
  210. package/client/assets/index-BuJoGGff.css.gz +0 -0
  211. package/client/assets/index-CDBQg2fh.js +3 -0
  212. package/client/assets/index-CDBQg2fh.js.br +0 -0
  213. package/client/assets/index-CDBQg2fh.js.gz +0 -0
  214. package/client/assets/index-CDBQg2fh.js.map +1 -0
  215. package/client/assets/offset-CLG4o744.js +2 -0
  216. package/client/assets/offset-CLG4o744.js.br +0 -0
  217. package/client/assets/offset-CLG4o744.js.gz +0 -0
  218. package/client/assets/offset-CLG4o744.js.map +1 -0
  219. package/client/assets/parseUserTime-Cp5iWS7y.js +2 -0
  220. package/client/assets/parseUserTime-Cp5iWS7y.js.br +0 -0
  221. package/client/assets/parseUserTime-Cp5iWS7y.js.gz +0 -0
  222. package/client/assets/{parseUserTime-BeTKj08M.js.map → parseUserTime-Cp5iWS7y.js.map} +1 -1
  223. package/client/assets/playbackstate-B3BKJ8cT.js +2 -0
  224. package/client/assets/playbackstate-B3BKJ8cT.js.br +0 -0
  225. package/client/assets/playbackstate-B3BKJ8cT.js.gz +0 -0
  226. package/client/assets/{playbackstate-B_khF6xU.js.map → playbackstate-B3BKJ8cT.js.map} +1 -1
  227. package/client/assets/{presentation.utils-KwY-ACf7.js → presentation.utils-B-wIv_a5.js} +2 -2
  228. package/client/assets/presentation.utils-B-wIv_a5.js.br +0 -0
  229. package/client/assets/presentation.utils-B-wIv_a5.js.gz +0 -0
  230. package/client/assets/{presentation.utils-KwY-ACf7.js.map → presentation.utils-B-wIv_a5.js.map} +1 -1
  231. package/client/assets/{rundownUtils-BZHazkXR.js → rundownUtils-DJKMt8Ih.js} +2 -2
  232. package/client/assets/rundownUtils-DJKMt8Ih.js.br +0 -0
  233. package/client/assets/rundownUtils-DJKMt8Ih.js.gz +0 -0
  234. package/client/assets/{rundownUtils-BZHazkXR.js.map → rundownUtils-DJKMt8Ih.js.map} +1 -1
  235. package/client/assets/timer.utils-ByC_bcT9.js +2 -0
  236. package/client/assets/timer.utils-ByC_bcT9.js.br +0 -0
  237. package/client/assets/timer.utils-ByC_bcT9.js.gz +0 -0
  238. package/client/assets/timer.utils-ByC_bcT9.js.map +1 -0
  239. package/client/assets/useCustomFields-BUJkzZvM.js +2 -0
  240. package/client/assets/useCustomFields-BUJkzZvM.js.br +2 -0
  241. package/client/assets/useCustomFields-BUJkzZvM.js.gz +0 -0
  242. package/client/assets/{useCustomFields-DqCYz8Kt.js.map → useCustomFields-BUJkzZvM.js.map} +1 -1
  243. package/client/assets/{useFollowComponent-Ctfhf2or.js → useFollowComponent-Eyo4hWVG.js} +2 -2
  244. package/client/assets/useFollowComponent-Eyo4hWVG.js.br +0 -0
  245. package/client/assets/useFollowComponent-Eyo4hWVG.js.gz +0 -0
  246. package/client/assets/{useFollowComponent-Ctfhf2or.js.map → useFollowComponent-Eyo4hWVG.js.map} +1 -1
  247. package/client/assets/{useProjectData-C1hVamxc.js → useProjectData-DGA6K2Zs.js} +2 -2
  248. package/client/assets/useProjectData-DGA6K2Zs.js.br +0 -0
  249. package/client/assets/useProjectData-DGA6K2Zs.js.gz +0 -0
  250. package/client/assets/{useProjectData-C1hVamxc.js.map → useProjectData-DGA6K2Zs.js.map} +1 -1
  251. package/client/assets/useReport-BUCsRa2T.js +2 -0
  252. package/client/assets/useReport-BUCsRa2T.js.br +0 -0
  253. package/client/assets/useReport-BUCsRa2T.js.gz +0 -0
  254. package/client/assets/{useReport-B4dMYcNL.js.map → useReport-BUCsRa2T.js.map} +1 -1
  255. package/client/assets/useRundown-BFae0_bU.js +2 -0
  256. package/client/assets/useRundown-BFae0_bU.js.br +0 -0
  257. package/client/assets/useRundown-BFae0_bU.js.gz +0 -0
  258. package/client/assets/useRundown-BFae0_bU.js.map +1 -0
  259. package/client/assets/useWindowTitle-DU8NlxIu.js +2 -0
  260. package/client/assets/useWindowTitle-DU8NlxIu.js.br +0 -0
  261. package/client/assets/useWindowTitle-DU8NlxIu.js.gz +0 -0
  262. package/client/assets/{useWindowTitle-DqdFTWns.js.map → useWindowTitle-DU8NlxIu.js.map} +1 -1
  263. package/client/assets/{validateEvent-P9sf7C10.js → validateEvent-3adKsP1N.js} +2 -2
  264. package/client/assets/validateEvent-3adKsP1N.js.br +0 -0
  265. package/client/assets/validateEvent-3adKsP1N.js.gz +0 -0
  266. package/client/assets/{validateEvent-P9sf7C10.js.map → validateEvent-3adKsP1N.js.map} +1 -1
  267. package/client/assets/{vendor-CCiSQ9k9.js → vendor-BoH5HFNN.js} +21 -21
  268. package/client/assets/vendor-BoH5HFNN.js.br +0 -0
  269. package/client/assets/vendor-BoH5HFNN.js.gz +0 -0
  270. package/client/assets/{vendor-CCiSQ9k9.js.map → vendor-BoH5HFNN.js.map} +1 -1
  271. package/client/assets/{viewLoader.utils-CmM-4-pk.js → viewLoader.utils-BPOG1xso.js} +2 -2
  272. package/client/assets/viewLoader.utils-BPOG1xso.js.br +0 -0
  273. package/client/assets/viewLoader.utils-BPOG1xso.js.gz +0 -0
  274. package/client/assets/{viewLoader.utils-CmM-4-pk.js.map → viewLoader.utils-BPOG1xso.js.map} +1 -1
  275. package/client/assets/viewUtils-DI8_kmUZ.js +2 -0
  276. package/client/assets/viewUtils-DI8_kmUZ.js.br +0 -0
  277. package/client/assets/viewUtils-DI8_kmUZ.js.gz +0 -0
  278. package/client/assets/viewUtils-DI8_kmUZ.js.map +1 -0
  279. package/client/index.html +3 -3
  280. package/package.json +1 -1
  281. package/server/index.cjs +90 -90
  282. package/client/assets/Backstage-CAjkmeJm.js +0 -2
  283. package/client/assets/Backstage-CAjkmeJm.js.br +0 -0
  284. package/client/assets/Backstage-CAjkmeJm.js.gz +0 -0
  285. package/client/assets/Backstage-CAjkmeJm.js.map +0 -1
  286. package/client/assets/Countdown-ChuA9az_.js +0 -2
  287. package/client/assets/Countdown-ChuA9az_.js.br +0 -0
  288. package/client/assets/Countdown-ChuA9az_.js.gz +0 -0
  289. package/client/assets/Countdown-ChuA9az_.js.map +0 -1
  290. package/client/assets/CustomTranslationModal-C3R_2T5s.js +0 -2
  291. package/client/assets/CustomTranslationModal-C3R_2T5s.js.br +0 -0
  292. package/client/assets/CustomTranslationModal-C3R_2T5s.js.gz +0 -0
  293. package/client/assets/DelayIndicator-vT7n8ypf.js +0 -2
  294. package/client/assets/DelayIndicator-vT7n8ypf.js.br +0 -0
  295. package/client/assets/DelayIndicator-vT7n8ypf.js.gz +0 -0
  296. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js +0 -2
  297. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.br +0 -0
  298. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.gz +0 -0
  299. package/client/assets/EditorUtils-BXko-IuN.css +0 -1
  300. package/client/assets/EditorUtils-BXko-IuN.css.br +0 -0
  301. package/client/assets/EditorUtils-BXko-IuN.css.gz +0 -0
  302. package/client/assets/EditorUtils-Da5ALK1P.js +0 -2
  303. package/client/assets/EditorUtils-Da5ALK1P.js.br +0 -0
  304. package/client/assets/EditorUtils-Da5ALK1P.js.gz +0 -0
  305. package/client/assets/EditorUtils-Da5ALK1P.js.map +0 -1
  306. package/client/assets/Empty-gWT_HMeu.js +0 -2
  307. package/client/assets/Empty-gWT_HMeu.js.br +0 -0
  308. package/client/assets/Empty-gWT_HMeu.js.gz +0 -0
  309. package/client/assets/EmptyPage-Dcbg6rmF.js +0 -2
  310. package/client/assets/EmptyPage-Dcbg6rmF.js.br +0 -0
  311. package/client/assets/EmptyPage-Dcbg6rmF.js.gz +0 -0
  312. package/client/assets/FollowButton-CSqJSvix.js +0 -2
  313. package/client/assets/FollowButton-CSqJSvix.js.br +0 -0
  314. package/client/assets/FollowButton-CSqJSvix.js.gz +0 -0
  315. package/client/assets/MessageControlExport-DPgqVb-4.css +0 -1
  316. package/client/assets/MessageControlExport-DPgqVb-4.css.br +0 -0
  317. package/client/assets/MessageControlExport-DPgqVb-4.css.gz +0 -0
  318. package/client/assets/MessageControlExport-lXK21piH.js +0 -2
  319. package/client/assets/MessageControlExport-lXK21piH.js.br +0 -0
  320. package/client/assets/MessageControlExport-lXK21piH.js.gz +0 -0
  321. package/client/assets/MessageControlExport-lXK21piH.js.map +0 -1
  322. package/client/assets/MilestoneEditor-906SVj5M.css +0 -1
  323. package/client/assets/MilestoneEditor-906SVj5M.css.br +0 -0
  324. package/client/assets/MilestoneEditor-906SVj5M.css.gz +0 -0
  325. package/client/assets/MilestoneEditor-Bge8xLrV.js +0 -2
  326. package/client/assets/MilestoneEditor-Bge8xLrV.js.br +0 -0
  327. package/client/assets/MilestoneEditor-Bge8xLrV.js.gz +0 -0
  328. package/client/assets/MilestoneEditor-Bge8xLrV.js.map +0 -1
  329. package/client/assets/Modal-BgJx3SNK.css +0 -1
  330. package/client/assets/Modal-BgJx3SNK.css.br +0 -0
  331. package/client/assets/Modal-BgJx3SNK.css.gz +0 -0
  332. package/client/assets/Modal-C2sFA0zf.js +0 -2
  333. package/client/assets/Modal-C2sFA0zf.js.br +0 -0
  334. package/client/assets/Modal-C2sFA0zf.js.gz +0 -0
  335. package/client/assets/Modal-C2sFA0zf.js.map +0 -1
  336. package/client/assets/MultiPartProgressBar-D3jJZjb5.js +0 -2
  337. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.br +0 -0
  338. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.gz +0 -0
  339. package/client/assets/OperatorExport-BUhxjLUx.js +0 -2
  340. package/client/assets/OperatorExport-BUhxjLUx.js.br +0 -0
  341. package/client/assets/OperatorExport-BUhxjLUx.js.gz +0 -0
  342. package/client/assets/OperatorExport-BUhxjLUx.js.map +0 -1
  343. package/client/assets/OperatorExport-QyLn8tmf.css +0 -1
  344. package/client/assets/OperatorExport-QyLn8tmf.css.br +0 -0
  345. package/client/assets/OperatorExport-QyLn8tmf.css.gz +0 -0
  346. package/client/assets/OverviewWrapper-BveJ6GjK.js +0 -2
  347. package/client/assets/OverviewWrapper-BveJ6GjK.js.br +0 -0
  348. package/client/assets/OverviewWrapper-BveJ6GjK.js.gz +0 -0
  349. package/client/assets/OverviewWrapper-BveJ6GjK.js.map +0 -1
  350. package/client/assets/OverviewWrapper-a18gep4m.css +0 -1
  351. package/client/assets/OverviewWrapper-a18gep4m.css.br +0 -0
  352. package/client/assets/OverviewWrapper-a18gep4m.css.gz +0 -0
  353. package/client/assets/ProjectInfo-z4k3cipS.js +0 -2
  354. package/client/assets/ProjectInfo-z4k3cipS.js.br +0 -0
  355. package/client/assets/ProjectInfo-z4k3cipS.js.gz +0 -0
  356. package/client/assets/ProtectRoute-CrcWfOlG.js +0 -2
  357. package/client/assets/ProtectRoute-CrcWfOlG.js.br +0 -0
  358. package/client/assets/ProtectRoute-CrcWfOlG.js.gz +0 -0
  359. package/client/assets/ProtectedCuesheet-CMTscjjR.css.br +0 -0
  360. package/client/assets/ProtectedCuesheet-CMTscjjR.css.gz +0 -0
  361. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js +0 -2
  362. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.br +0 -0
  363. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.gz +0 -0
  364. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.map +0 -1
  365. package/client/assets/ProtectedEditor-BoiAT_IR.css +0 -1
  366. package/client/assets/ProtectedEditor-BoiAT_IR.css.br +0 -0
  367. package/client/assets/ProtectedEditor-BoiAT_IR.css.gz +0 -0
  368. package/client/assets/ProtectedEditor-C_SYWpL2.js +0 -3
  369. package/client/assets/ProtectedEditor-C_SYWpL2.js.br +0 -0
  370. package/client/assets/ProtectedEditor-C_SYWpL2.js.gz +0 -0
  371. package/client/assets/ProtectedEditor-C_SYWpL2.js.map +0 -1
  372. package/client/assets/RundownEntry-3gFEEUnw.css +0 -1
  373. package/client/assets/RundownEntry-3gFEEUnw.css.br +0 -0
  374. package/client/assets/RundownEntry-3gFEEUnw.css.gz +0 -0
  375. package/client/assets/RundownEntry-D61IqkXb.js +0 -2
  376. package/client/assets/RundownEntry-D61IqkXb.js.br +0 -0
  377. package/client/assets/RundownEntry-D61IqkXb.js.gz +0 -0
  378. package/client/assets/RundownEntry-D61IqkXb.js.map +0 -1
  379. package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
  380. package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
  381. package/client/assets/RundownExport-C6YhMGOC.js +0 -3
  382. package/client/assets/RundownExport-C6YhMGOC.js.br +0 -0
  383. package/client/assets/RundownExport-C6YhMGOC.js.gz +0 -0
  384. package/client/assets/RundownExport-C6YhMGOC.js.map +0 -1
  385. package/client/assets/Select-CedN80WS.js +0 -2
  386. package/client/assets/Select-CedN80WS.js.br +0 -0
  387. package/client/assets/Select-CedN80WS.js.gz +0 -0
  388. package/client/assets/Studio-DUzPBS6P.js +0 -2
  389. package/client/assets/Studio-DUzPBS6P.js.br +0 -0
  390. package/client/assets/Studio-DUzPBS6P.js.gz +0 -0
  391. package/client/assets/Studio-DUzPBS6P.js.map +0 -1
  392. package/client/assets/StyleEditor-D2z65PB7.js.br +0 -0
  393. package/client/assets/StyleEditor-D2z65PB7.js.gz +0 -0
  394. package/client/assets/SuperscriptTime-CIrcMcyg.js +0 -2
  395. package/client/assets/SuperscriptTime-CIrcMcyg.js.br +0 -0
  396. package/client/assets/SuperscriptTime-CIrcMcyg.js.gz +0 -0
  397. package/client/assets/TimeElements-BcQdm4ZV.css +0 -1
  398. package/client/assets/TimeElements-BcQdm4ZV.css.br +0 -0
  399. package/client/assets/TimeElements-BcQdm4ZV.css.gz +0 -0
  400. package/client/assets/TimeElements-CALNfv6u.js +0 -2
  401. package/client/assets/TimeElements-CALNfv6u.js.br +0 -0
  402. package/client/assets/TimeElements-CALNfv6u.js.gz +0 -0
  403. package/client/assets/TimeElements-CALNfv6u.js.map +0 -1
  404. package/client/assets/TimeInput-BrVdiuOQ.css.br +0 -0
  405. package/client/assets/TimeInput-BrVdiuOQ.css.gz +0 -0
  406. package/client/assets/TimeInput-Dg1naiy3.js +0 -2
  407. package/client/assets/TimeInput-Dg1naiy3.js.br +0 -0
  408. package/client/assets/TimeInput-Dg1naiy3.js.gz +0 -0
  409. package/client/assets/TimelinePage-BJav6PAb.css +0 -1
  410. package/client/assets/TimelinePage-BJav6PAb.css.br +0 -0
  411. package/client/assets/TimelinePage-BJav6PAb.css.gz +0 -0
  412. package/client/assets/TimelinePage-Cwm0svjN.js +0 -2
  413. package/client/assets/TimelinePage-Cwm0svjN.js.br +0 -0
  414. package/client/assets/TimelinePage-Cwm0svjN.js.gz +0 -0
  415. package/client/assets/TimelinePage-Cwm0svjN.js.map +0 -1
  416. package/client/assets/Timer-BVXskRjc.js +0 -2
  417. package/client/assets/Timer-BVXskRjc.js.br +0 -0
  418. package/client/assets/Timer-BVXskRjc.js.gz +0 -0
  419. package/client/assets/Timer-BVXskRjc.js.map +0 -1
  420. package/client/assets/Timer-BvEmZbmF.css.br +0 -0
  421. package/client/assets/Timer-BvEmZbmF.css.gz +0 -0
  422. package/client/assets/TimerControlExport-C8ECtLBd.js +0 -2
  423. package/client/assets/TimerControlExport-C8ECtLBd.js.br +0 -0
  424. package/client/assets/TimerControlExport-C8ECtLBd.js.gz +0 -0
  425. package/client/assets/TimerControlExport-D8kqHQB0.css.br +0 -0
  426. package/client/assets/TimerControlExport-D8kqHQB0.css.gz +0 -0
  427. package/client/assets/TitleCard-CZl9wSHS.js +0 -2
  428. package/client/assets/TitleCard-CZl9wSHS.js.br +0 -0
  429. package/client/assets/TitleCard-CZl9wSHS.js.gz +0 -0
  430. package/client/assets/Tooltip-D9XRnwOW.js.br +0 -4
  431. package/client/assets/Tooltip-D9XRnwOW.js.gz +0 -0
  432. package/client/assets/ViewLogo-_3Z1hIHi.js +0 -2
  433. package/client/assets/ViewLogo-_3Z1hIHi.js.br +0 -0
  434. package/client/assets/ViewLogo-_3Z1hIHi.js.gz +0 -0
  435. package/client/assets/ViewParamsEditor-1Ok39npF.css +0 -1
  436. package/client/assets/ViewParamsEditor-1Ok39npF.css.br +0 -0
  437. package/client/assets/ViewParamsEditor-1Ok39npF.css.gz +0 -0
  438. package/client/assets/ViewParamsEditor-Bca1TIDW.js +0 -2
  439. package/client/assets/ViewParamsEditor-Bca1TIDW.js.br +0 -0
  440. package/client/assets/ViewParamsEditor-Bca1TIDW.js.gz +0 -0
  441. package/client/assets/ViewParamsEditor-Bca1TIDW.js.map +0 -1
  442. package/client/assets/dateConfig-DRQGMWDF.js.br +0 -0
  443. package/client/assets/dateConfig-DRQGMWDF.js.gz +0 -0
  444. package/client/assets/editorSettings-BU0pTMSY.js.br +0 -0
  445. package/client/assets/editorSettings-BU0pTMSY.js.gz +0 -0
  446. package/client/assets/getProgress-Cw79NL_O.js.br +0 -0
  447. package/client/assets/getProgress-Cw79NL_O.js.gz +0 -0
  448. package/client/assets/index-BQEUaoAf.js +0 -3
  449. package/client/assets/index-BQEUaoAf.js.br +0 -0
  450. package/client/assets/index-BQEUaoAf.js.gz +0 -0
  451. package/client/assets/index-BQEUaoAf.js.map +0 -1
  452. package/client/assets/index-De0uf0Ta.css.br +0 -0
  453. package/client/assets/index-De0uf0Ta.css.gz +0 -0
  454. package/client/assets/offset-DJAHqjFW.js +0 -2
  455. package/client/assets/offset-DJAHqjFW.js.br +0 -0
  456. package/client/assets/offset-DJAHqjFW.js.gz +0 -0
  457. package/client/assets/offset-DJAHqjFW.js.map +0 -1
  458. package/client/assets/parseUserTime-BeTKj08M.js +0 -2
  459. package/client/assets/parseUserTime-BeTKj08M.js.br +0 -0
  460. package/client/assets/parseUserTime-BeTKj08M.js.gz +0 -0
  461. package/client/assets/playbackstate-B_khF6xU.js +0 -2
  462. package/client/assets/playbackstate-B_khF6xU.js.br +0 -0
  463. package/client/assets/playbackstate-B_khF6xU.js.gz +0 -0
  464. package/client/assets/presentation.utils-KwY-ACf7.js.br +0 -0
  465. package/client/assets/presentation.utils-KwY-ACf7.js.gz +0 -0
  466. package/client/assets/rundownUtils-BZHazkXR.js.br +0 -0
  467. package/client/assets/rundownUtils-BZHazkXR.js.gz +0 -0
  468. package/client/assets/useCustomFields-DqCYz8Kt.js +0 -2
  469. package/client/assets/useCustomFields-DqCYz8Kt.js.br +0 -0
  470. package/client/assets/useCustomFields-DqCYz8Kt.js.gz +0 -0
  471. package/client/assets/useFollowComponent-Ctfhf2or.js.br +0 -0
  472. package/client/assets/useFollowComponent-Ctfhf2or.js.gz +0 -0
  473. package/client/assets/useProjectData-C1hVamxc.js.br +0 -0
  474. package/client/assets/useProjectData-C1hVamxc.js.gz +0 -0
  475. package/client/assets/useReport-B4dMYcNL.js +0 -2
  476. package/client/assets/useReport-B4dMYcNL.js.br +0 -0
  477. package/client/assets/useReport-B4dMYcNL.js.gz +0 -0
  478. package/client/assets/useRundown-BfpjcCEJ.js +0 -2
  479. package/client/assets/useRundown-BfpjcCEJ.js.br +0 -0
  480. package/client/assets/useRundown-BfpjcCEJ.js.gz +0 -0
  481. package/client/assets/useRundown-BfpjcCEJ.js.map +0 -1
  482. package/client/assets/useWindowTitle-DqdFTWns.js +0 -2
  483. package/client/assets/useWindowTitle-DqdFTWns.js.br +0 -0
  484. package/client/assets/useWindowTitle-DqdFTWns.js.gz +0 -0
  485. package/client/assets/validateEvent-P9sf7C10.js.br +0 -3
  486. package/client/assets/validateEvent-P9sf7C10.js.gz +0 -0
  487. package/client/assets/vendor-CCiSQ9k9.js.br +0 -0
  488. package/client/assets/vendor-CCiSQ9k9.js.gz +0 -0
  489. package/client/assets/viewLoader.utils-CmM-4-pk.js.br +0 -0
  490. package/client/assets/viewLoader.utils-CmM-4-pk.js.gz +0 -0
@@ -0,0 +1,2 @@
1
+ import{j as e,h as C,b2 as P,b3 as M,b4 as U,b5 as A,b6 as F,b7 as H,b8 as z}from"./vendor-BoH5HFNN.js";import{s as v,m as b,bk as m,A as V,e as d,bl as W,f as h,bm as q,x as w,bn as K,v as B,K as J,y as L,bo as Q,bp as X,bq as Y,br as I,T as E,bs as Z,bt as ee}from"./index-CDBQg2fh.js";import{T as f}from"./Tooltip-B8y25e3n.js";import{v as G}from"./useRundown-BFae0_bU.js";import{a as te,g as ae}from"./offset-CLG4o744.js";import{S as N}from"./SuperscriptPeriod-BmHAoSBy.js";import{i as g}from"./playbackstate-B3BKJ8cT.js";(function(){try{var a=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new a.Error().stack;n&&(a._sentryDebugIds=a._sentryDebugIds||{},a._sentryDebugIds[n]="9906ee58-be5e-4ed8-8d2f-9365abefa0d1",a._sentryDebugIdIdentifier="sentry-dbid-9906ee58-be5e-4ed8-8d2f-9365abefa0d1")}catch{}})();function S(a,n=3,s,l="due"){return a!==null&&a<=0?l:se(a,n,s)}function se(a,n=3,s){return b(a,{fallback:n===3?m:V,direction:s})}function R(a){return a!==null&&a>v?[a%v,Math.floor(a/v)]:[a,0]}const ne="_label_1ahsu_18",le="_clock_1ahsu_23",re="_column_1ahsu_35",ce="_over_1ahsu_47",ie="_under_1ahsu_48",o={label:ne,clock:le,column:re,over:ce,under:ie};function $({label:a,value:n,state:s="active",className:l,testId:c}){return e.jsxs("div",{className:d([o.column,l]),"data-state":s,children:[e.jsx("span",{className:o.label,children:a}),e.jsx("span",{className:o.clock,"data-testid":c,children:n})]})}function de({label:a,state:n="active",className:s,render:l}){return e.jsxs("div",{className:d([o.column,s]),"data-state":n,children:[e.jsx("span",{className:o.label,children:a}),l(o.clock)]})}function oe({state:a,value:n,testId:s}){return e.jsxs("div",{className:o.column,"data-state":a,children:[e.jsxs("div",{className:o.label,children:[e.jsx("span",{className:o.over,children:"Over"}),e.jsx("span",{children:"/"}),e.jsx("span",{className:o.under,children:"Under"})]}),e.jsx("span",{className:o.clock,"data-testid":s,children:n})]})}const ue="_column_1uyfj_17",me="_row_1uyfj_26",fe="_metadataRow_1uyfj_33",xe="_labelledElement_1uyfj_40",pe="_icon_1uyfj_46",be="_label_1uyfj_40",je="_time_1uyfj_58",Te="_daySpan_1uyfj_65",ve="_muted_1uyfj_80",ye="_labelTitle_1uyfj_84",_e="_dueTime_1uyfj_93",t={column:ue,row:me,metadataRow:fe,labelledElement:xe,icon:pe,label:be,time:je,daySpan:Te,muted:ve,labelTitle:ye,dueTime:_e};function Ce({shouldFormat:a}){const{plannedEnd:n,plannedStart:s,actualStart:l}=W(),c={format12:"hh:mm:ss a",format24:"HH:mm:ss"},u=s===null?m:a?h(s,c):b(s,{fallback:m}),x=l===null?m:a?h(l,c):b(l,{fallback:m}),[r,i]=C.useMemo(()=>R(n),[n]),j=r===null?m:a?h(r,c):b(r,{fallback:m}),p=i>0,T=p?`Planned end time (rundown spans over ${i+1} days)`:"Planned end time";return e.jsxs("div",{className:t.column,children:[e.jsxs("div",{className:t.row,children:[e.jsx("span",{className:t.label,children:"Start"}),e.jsx(f,{text:"Planned start time",render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(P,{className:t.icon}),e.jsx(N,{className:d([t.time,s===null&&t.muted]),time:u})]})}),e.jsx(f,{text:"Actual start time",render:e.jsxs("div",{className:t.labelledElement,"data-testid":"actual-start-time",children:[e.jsx(M,{className:t.icon}),e.jsx(N,{className:d([t.time,l===null&&t.muted]),time:x})]})})]}),e.jsxs("div",{className:t.row,children:[e.jsx("span",{className:t.label,children:"End"}),e.jsx(f,{text:T,render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(P,{className:t.icon}),e.jsx(N,{className:d([t.time,n===null&&t.muted]),time:j}),p&&e.jsx("span",{className:d([t.time,t.daySpan]),"data-day-offset":i})]})}),e.jsx(he,{shouldFormat:a})]})]})}function he({shouldFormat:a}){const{expectedEnd:n}=Q(),[s,l]=C.useMemo(()=>R(n),[n]),c=s===null?m:a?h(s,{format12:"hh:mm:ss a",format24:"HH:mm:ss"}):b(s,{fallback:m}),u=s!==null&&l>0,x=u?`Expected end time (rundown spans over ${l+1} days)`:"Expected end time";return e.jsx(f,{text:x,render:e.jsxs("div",{className:t.labelledElement,children:[e.jsx(U,{className:t.icon}),e.jsx(N,{className:d([t.time,s===null&&t.muted]),time:c}),u&&e.jsx("span",{className:d([t.time,t.daySpan]),"data-day-offset":l})]})})}function Ie(){return e.jsxs("div",{className:t.column,children:[e.jsx(Ne,{}),e.jsx(Ee,{})]})}function Ne(){const{clock:a,mode:n,groupExpectedEnd:s,actualGroupStart:l,currentDay:c,playback:u}=X(),{currentGroupId:x}=Y(),r=G(x),i=g(u),j=(()=>{if(!i||!r||r.timeStart===null)return null;const _=a+c*v;return n===I.Absolute?r.timeStart+r.duration-_:l+r.duration-_})(),p=S(j,3,E.CountDown),T=s!==null?s-a:null,y=S(T,3,E.CountDown);return e.jsxs("div",{className:t.metadataRow,children:[e.jsx("span",{className:r!=null&&r.title?t.labelTitle:t.label,children:`${(r==null?void 0:r.title)||"Group"} `}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to planned group end",render:e.jsx(A,{className:t.icon})}),e.jsx("span",{className:d([t.time,(!r||!i)&&t.muted,p==="due"&&t.dueTime]),children:p})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to expected group end",render:e.jsx(F,{className:t.icon})}),e.jsx("span",{className:d([t.time,!s&&t.muted,y==="due"&&t.dueTime]),children:y})]})]})}function Ee(){const{clock:a,mode:n,actualStart:s,plannedStart:l,playback:c,currentDay:u}=Z(),{id:x,expectedStart:r}=ee(),i=G(x),j=g(c),p=(()=>{if(!j||!i)return null;const D=i.timeStart+i.dayOffset*v,O=a+u*v;return n===I.Absolute?D-O:D+s-l-O})(),T=S(p,3,E.CountDown),y=r!==null?r-a:null,_=S(y,3,E.CountDown),k=(i==null?void 0:i.title)??null;return e.jsxs("div",{className:t.metadataRow,children:[e.jsx("span",{className:k?t.labelTitle:t.label,children:`${k||"Flag"} `}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to next flag planned start",render:e.jsx(H,{className:t.icon})}),e.jsx("span",{"data-testid":"flag-plannedStart",className:d([t.time,(!i||!j)&&t.muted,T==="due"&&t.dueTime]),children:T})]}),e.jsxs("div",{className:t.labelledElement,children:[e.jsx(f,{text:"Time to next flag expected start",render:e.jsx(z,{className:t.icon})}),e.jsx("span",{"data-testid":"flag-expectedStart",className:d([t.time,y===null&&t.muted,_==="due"&&t.dueTime]),children:_})]})]})}function Ge(){const{numEvents:a,selectedEventIndex:n}=q(),s=n!==null?n+1:w,l=a?`${s} of ${a||w}`:w;return e.jsx($,{label:"Progress",value:l,state:n===null?"muted":"active"})}function Re(){const{offset:a,playback:n}=K(),s=g(n),l=ae(s?a:null),c=te(s?a:null);return e.jsx(oe,{state:l,value:c,testId:"offset"})}function $e({shouldFormat:a,className:n}){const{clock:s}=B(),l=a?h(s):b(s);return e.jsx(de,{label:"Time now",className:n,render:c=>e.jsx(N,{className:c,time:l})})}function Me({className:a}){const n=J(),s=n.phase===L.Pending,l=s?"Count to start":"Running timer",c=b(s?n.secondaryTimer:n.current,{fallback:m}),u=s?"waiting":n.current===null?"muted":"active";return e.jsx($,{label:l,value:c,state:u,className:a})}export{$e as C,Ie as M,Re as O,Ge as P,Ce as S,Me as T,se as f};
2
+ //# sourceMappingURL=TimeElements-XpRwBsaa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeElements-XpRwBsaa.js","sources":["../../src/features/overview/overview.utils.ts","../../src/features/overview/composite/TimeLayout.tsx","../../src/features/overview/composite/TimeElements.tsx"],"sourcesContent":["import { MaybeNumber, TimerType } from 'ontime-types';\nimport { dayInMs, millisToString } from 'ontime-utils';\n\nimport { timerPlaceholder, timerPlaceholderMin } from '../../common/utils/styleUtils';\n\n/**\n * Composition to stop negative timers from being formatted\n * They should show a due string instead\n *\n * This is used for cases when a negative timer is unwanted\n * eg: count down to a milestone\n */\nexport function formatDueTime(\n time: MaybeNumber,\n segments: number = 3,\n direction?: TimerType.CountDown | TimerType.CountUp,\n dueString = 'due',\n): string {\n if (time !== null && time <= 0) return dueString;\n return formattedTime(time, segments, direction);\n}\n\n/**\n * Encapsulates the logic for formatting time in overview\n */\nexport function formattedTime(\n time: MaybeNumber,\n segments: number = 3,\n direction?: TimerType.CountDown | TimerType.CountUp,\n): string {\n return millisToString(time, { fallback: segments === 3 ? timerPlaceholder : timerPlaceholderMin, direction });\n}\n\n/**\n * Calculates how long a time is and how many days it spans\n */\nexport function calculateEndAndDaySpan(end: MaybeNumber): [MaybeNumber, number] {\n if (end !== null && end > dayInMs) {\n return [end % dayInMs, Math.floor(end / dayInMs)];\n }\n\n return [end, 0];\n}\n","import { ReactNode } from 'react';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './TimeLayout.module.scss';\n\ninterface TimeLayoutProps {\n label: string;\n value: string;\n state?: 'muted' | 'waiting' | 'active';\n daySpan?: number;\n className?: string;\n testId?: string;\n}\n\nexport function TimeColumn({ label, value, state = 'active', className, testId }: TimeLayoutProps) {\n return (\n <div className={cx([style.column, className])} data-state={state}>\n <span className={style.label}>{label}</span>\n <span className={style.clock} data-testid={testId}>\n {value}\n </span>\n </div>\n );\n}\n\ninterface WrappedInTimeColumnProps {\n label: string;\n state?: 'muted' | 'waiting' | 'active';\n className?: string;\n render: (className: string) => ReactNode;\n}\n\nexport function WrappedInTimeColumn({ label, state = 'active', className, render }: WrappedInTimeColumnProps) {\n return (\n <div className={cx([style.column, className])} data-state={state}>\n <span className={style.label}>{label}</span>\n {render(style.clock)}\n </div>\n );\n}\ninterface OverUnderProps {\n state: 'over' | 'under' | 'muted' | null;\n value: string;\n testId: string;\n}\n\nexport function OverUnder({ state, value, testId }: OverUnderProps) {\n return (\n <div className={style.column} data-state={state}>\n <div className={style.label}>\n <span className={style.over}>Over</span>\n <span>/</span>\n <span className={style.under}>Under</span>\n </div>\n <span className={style.clock} data-testid={testId}>\n {value}\n </span>\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport {\n TbCalendarClock,\n TbCalendarPin,\n TbCalendarStar,\n TbFlagPin,\n TbFlagStar,\n TbFolderPin,\n TbFolderStar,\n} from 'react-icons/tb';\nimport { OffsetMode, OntimeEvent, OntimeGroup, TimerPhase, TimerType } from 'ontime-types';\nimport { dayInMs, isPlaybackActive, millisToString } from 'ontime-utils';\n\nimport Tooltip from '../../../common/components/tooltip/Tooltip';\nimport {\n useClock,\n useCurrentGroupId,\n useFlagTimerOverView,\n useGroupTimerOverView,\n useNextFlag,\n useOffsetOverview,\n useProgressOverview,\n useRundownExpectedEnd,\n useStartTimesOverview,\n useTimer,\n} from '../../../common/hooks/useSocket';\nimport { useEntry } from '../../../common/hooks-query/useRundown';\nimport { getOffsetState, getOffsetText } from '../../../common/utils/offset';\nimport { cx, enDash, timerPlaceholder } from '../../../common/utils/styleUtils';\nimport { formatTime } from '../../../common/utils/time';\nimport SuperscriptPeriod from '../../viewers/common/superscript-time/SuperscriptPeriod';\nimport { calculateEndAndDaySpan, formatDueTime } from '../overview.utils';\n\nimport { OverUnder, TimeColumn, WrappedInTimeColumn } from './TimeLayout';\n\nimport style from './TimeElements.module.scss';\n\ninterface OverviewTimeElementsProps {\n shouldFormat?: boolean;\n}\n\nexport function StartTimes({ shouldFormat }: OverviewTimeElementsProps) {\n const { plannedEnd, plannedStart, actualStart } = useStartTimesOverview();\n\n const formatOptions = { format12: 'hh:mm:ss a', format24: 'HH:mm:ss' };\n\n const plannedStartText = (() => {\n if (plannedStart === null) return timerPlaceholder;\n if (shouldFormat) return formatTime(plannedStart, formatOptions);\n return millisToString(plannedStart, { fallback: timerPlaceholder });\n })();\n\n const actualStartText = (() => {\n if (actualStart === null) return timerPlaceholder;\n if (shouldFormat) return formatTime(actualStart, formatOptions);\n return millisToString(actualStart, { fallback: timerPlaceholder });\n })();\n\n const [maybePlannedEnd, maybePlannedDaySpan] = useMemo(() => calculateEndAndDaySpan(plannedEnd), [plannedEnd]);\n\n const plannedEndText = (() => {\n if (maybePlannedEnd === null) return timerPlaceholder;\n if (shouldFormat) return formatTime(maybePlannedEnd, formatOptions);\n return millisToString(maybePlannedEnd, { fallback: timerPlaceholder });\n })();\n\n const multipleDays = maybePlannedDaySpan > 0;\n const plannedEndTooltip = multipleDays\n ? `Planned end time (rundown spans over ${maybePlannedDaySpan + 1} days)`\n : 'Planned end time';\n\n return (\n <div className={style.column}>\n <div className={style.row}>\n <span className={style.label}>Start</span>\n <Tooltip\n text='Planned start time'\n render={\n <div className={style.labelledElement}>\n <TbCalendarPin className={style.icon} />\n <SuperscriptPeriod\n className={cx([style.time, plannedStart === null && style.muted])}\n time={plannedStartText}\n />\n </div>\n }\n />\n <Tooltip\n text='Actual start time'\n render={\n <div className={style.labelledElement} data-testid='actual-start-time'>\n <TbCalendarClock className={style.icon} />\n <SuperscriptPeriod\n className={cx([style.time, actualStart === null && style.muted])}\n time={actualStartText}\n />\n </div>\n }\n />\n </div>\n\n <div className={style.row}>\n <span className={style.label}>End</span>\n <Tooltip\n text={plannedEndTooltip}\n render={\n <div className={style.labelledElement}>\n <TbCalendarPin className={style.icon} />\n <SuperscriptPeriod\n className={cx([style.time, plannedEnd === null && style.muted])}\n time={plannedEndText}\n />\n {multipleDays && (\n <span className={cx([style.time, style.daySpan])} data-day-offset={maybePlannedDaySpan} />\n )}\n </div>\n }\n />\n <RundownExpectedEnd shouldFormat={shouldFormat} />\n </div>\n </div>\n );\n}\n\n/**\n * Shows the expected end for the rundown\n * Extracted to improve performance as this is a ticking value\n */\nfunction RundownExpectedEnd({ shouldFormat }: OverviewTimeElementsProps) {\n const { expectedEnd } = useRundownExpectedEnd();\n\n const [maybeExpectedEnd, maybeExpectedDaySpan] = useMemo(() => calculateEndAndDaySpan(expectedEnd), [expectedEnd]);\n const maybeExpectedEndText = (() => {\n if (maybeExpectedEnd === null) return timerPlaceholder;\n if (shouldFormat) return formatTime(maybeExpectedEnd, { format12: 'hh:mm:ss a', format24: 'HH:mm:ss' });\n return millisToString(maybeExpectedEnd, { fallback: timerPlaceholder });\n })();\n\n const multipleDays = maybeExpectedEnd !== null && maybeExpectedDaySpan > 0;\n const tooltip = multipleDays\n ? `Expected end time (rundown spans over ${maybeExpectedDaySpan + 1} days)`\n : 'Expected end time';\n\n return (\n <Tooltip\n text={tooltip}\n render={\n <div className={style.labelledElement}>\n <TbCalendarStar className={style.icon} />\n <SuperscriptPeriod\n className={cx([style.time, maybeExpectedEnd === null && style.muted])}\n time={maybeExpectedEndText}\n />\n {multipleDays && <span className={cx([style.time, style.daySpan])} data-day-offset={maybeExpectedDaySpan} />}\n </div>\n }\n />\n );\n}\n\nexport function MetadataTimes() {\n return (\n <div className={style.column}>\n <GroupTimes />\n <FlagTimes />\n </div>\n );\n}\n\nfunction GroupTimes() {\n const { clock, mode, groupExpectedEnd, actualGroupStart, currentDay, playback } = useGroupTimerOverView();\n const { currentGroupId } = useCurrentGroupId();\n const group = useEntry(currentGroupId) as OntimeGroup | null;\n\n const active = isPlaybackActive(playback);\n\n // the group end time dose not encode any day offsets so it is calculated with group start time and duration\n const plannedGroupEnd = (() => {\n if (!active) return null;\n if (!group || group.timeStart === null) return null;\n const normalizedClock = clock + currentDay * dayInMs;\n\n return mode === OffsetMode.Absolute\n ? group.timeStart + group.duration - normalizedClock\n : actualGroupStart + group.duration - normalizedClock;\n })();\n\n const plannedTimeUntilGroupEnd = formatDueTime(plannedGroupEnd, 3, TimerType.CountDown);\n\n const expectedGroupEnd = groupExpectedEnd !== null ? groupExpectedEnd - clock : null;\n const expectedTimeUntilGroupEnd = formatDueTime(expectedGroupEnd, 3, TimerType.CountDown);\n\n return (\n <div className={style.metadataRow}>\n <span className={group?.title ? style.labelTitle : style.label}>{`${group?.title || 'Group'} `}</span>\n <div className={style.labelledElement}>\n <Tooltip text='Time to planned group end' render={<TbFolderPin className={style.icon} />} />\n <span\n className={cx([\n style.time,\n (!group || !active) && style.muted,\n plannedTimeUntilGroupEnd === 'due' && style.dueTime,\n ])}\n >\n {plannedTimeUntilGroupEnd}\n </span>\n </div>\n <div className={style.labelledElement}>\n <Tooltip text='Time to expected group end' render={<TbFolderStar className={style.icon} />} />\n <span\n className={cx([\n style.time,\n !groupExpectedEnd && style.muted,\n expectedTimeUntilGroupEnd === 'due' && style.dueTime,\n ])}\n >\n {expectedTimeUntilGroupEnd}\n </span>\n </div>\n </div>\n );\n}\n\nfunction FlagTimes() {\n const { clock, mode, actualStart, plannedStart, playback, currentDay } = useFlagTimerOverView();\n const { id, expectedStart } = useNextFlag();\n const entry = useEntry(id) as OntimeEvent | null;\n\n const active = isPlaybackActive(playback);\n\n const plannedFlagStart = (() => {\n if (!active) return null;\n if (!entry) return null;\n const normalizedTimeStart = entry.timeStart + entry.dayOffset * dayInMs;\n const normalizedClock = clock + currentDay * dayInMs;\n return mode === OffsetMode.Absolute\n ? normalizedTimeStart - normalizedClock\n : normalizedTimeStart + actualStart - plannedStart - normalizedClock;\n })();\n\n const plannedTimeUntilDisplay = formatDueTime(plannedFlagStart, 3, TimerType.CountDown);\n\n const expectedTimeUntil = expectedStart !== null ? expectedStart - clock : null;\n const expectedTimeUntilDisplay = formatDueTime(expectedTimeUntil, 3, TimerType.CountDown);\n\n const title = entry?.title ?? null;\n\n return (\n <div className={style.metadataRow}>\n <span className={title ? style.labelTitle : style.label}>{`${title || 'Flag'} `}</span>\n <div className={style.labelledElement}>\n <Tooltip text='Time to next flag planned start' render={<TbFlagPin className={style.icon} />} />\n <span\n data-testid='flag-plannedStart'\n className={cx([\n style.time,\n (!entry || !active) && style.muted,\n plannedTimeUntilDisplay === 'due' && style.dueTime,\n ])}\n >\n {plannedTimeUntilDisplay}\n </span>\n </div>\n <div className={style.labelledElement}>\n <Tooltip text='Time to next flag expected start' render={<TbFlagStar className={style.icon} />} />\n <span\n data-testid='flag-expectedStart'\n className={cx([\n style.time,\n expectedTimeUntil === null && style.muted,\n expectedTimeUntilDisplay === 'due' && style.dueTime,\n ])}\n >\n {expectedTimeUntilDisplay}\n </span>\n </div>\n </div>\n );\n}\n\nexport function ProgressOverview() {\n const { numEvents, selectedEventIndex } = useProgressOverview();\n\n const current = selectedEventIndex !== null ? selectedEventIndex + 1 : enDash;\n const progressText = numEvents ? `${current} of ${numEvents || enDash}` : enDash;\n\n return <TimeColumn label='Progress' value={progressText} state={selectedEventIndex === null ? 'muted' : 'active'} />;\n}\n\nexport function OffsetOverview() {\n const { offset, playback } = useOffsetOverview();\n\n const isPlaying = isPlaybackActive(playback);\n const offsetState = getOffsetState(isPlaying ? offset : null);\n const offsetText = getOffsetText(isPlaying ? offset : null);\n\n return <OverUnder state={offsetState} value={offsetText} testId='offset' />;\n}\n\nexport function ClockOverview({ shouldFormat, className }: OverviewTimeElementsProps & { className?: string }) {\n const { clock } = useClock();\n const formattedClock = shouldFormat ? formatTime(clock) : millisToString(clock);\n\n return (\n <WrappedInTimeColumn\n label='Time now'\n className={className}\n render={(clockClasses) => <SuperscriptPeriod className={clockClasses} time={formattedClock} />}\n />\n );\n}\n\nexport function TimerOverview({ className }: { className?: string }) {\n const timer = useTimer();\n\n const isWaiting = timer.phase === TimerPhase.Pending;\n const title = isWaiting ? 'Count to start' : 'Running timer';\n const display = millisToString(isWaiting ? timer.secondaryTimer : timer.current, { fallback: timerPlaceholder });\n const timerState = (() => {\n if (isWaiting) return 'waiting';\n if (timer.current === null) return 'muted';\n return 'active';\n })();\n\n return <TimeColumn label={title} value={display} state={timerState} className={className} />;\n}\n"],"names":["formatDueTime","time","segments","direction","dueString","formattedTime","millisToString","timerPlaceholder","timerPlaceholderMin","calculateEndAndDaySpan","end","dayInMs","TimeColumn","label","value","state","className","testId","jsxs","cx","style","jsx","WrappedInTimeColumn","render","OverUnder","StartTimes","shouldFormat","plannedEnd","plannedStart","actualStart","useStartTimesOverview","formatOptions","plannedStartText","formatTime","actualStartText","maybePlannedEnd","maybePlannedDaySpan","useMemo","plannedEndText","multipleDays","plannedEndTooltip","Tooltip","TbCalendarPin","SuperscriptPeriod","TbCalendarClock","RundownExpectedEnd","expectedEnd","useRundownExpectedEnd","maybeExpectedEnd","maybeExpectedDaySpan","maybeExpectedEndText","tooltip","TbCalendarStar","MetadataTimes","GroupTimes","FlagTimes","clock","mode","groupExpectedEnd","actualGroupStart","currentDay","playback","useGroupTimerOverView","currentGroupId","useCurrentGroupId","group","useEntry","active","isPlaybackActive","plannedGroupEnd","normalizedClock","OffsetMode","plannedTimeUntilGroupEnd","TimerType","expectedGroupEnd","expectedTimeUntilGroupEnd","TbFolderPin","TbFolderStar","useFlagTimerOverView","id","expectedStart","useNextFlag","entry","plannedFlagStart","normalizedTimeStart","plannedTimeUntilDisplay","expectedTimeUntil","expectedTimeUntilDisplay","title","TbFlagPin","TbFlagStar","ProgressOverview","numEvents","selectedEventIndex","useProgressOverview","current","enDash","progressText","OffsetOverview","offset","useOffsetOverview","isPlaying","offsetState","getOffsetState","offsetText","getOffsetText","ClockOverview","useClock","formattedClock","clockClasses","TimerOverview","timer","useTimer","isWaiting","TimerPhase","display","timerState"],"mappings":"u2BAYO,SAASA,EACdC,EACAC,EAAmB,EACnBC,EACAC,EAAY,MACJ,CACR,OAAIH,IAAS,MAAQA,GAAQ,EAAUG,EAChCC,GAAcJ,EAAMC,EAAUC,CAAS,CAChD,CAKO,SAASE,GACdJ,EACAC,EAAmB,EACnBC,EACQ,CACD,OAAAG,EAAeL,EAAM,CAAE,SAAUC,IAAa,EAAIK,EAAmBC,EAAqB,UAAAL,EAAW,CAC9G,CAKO,SAASM,EAAuBC,EAAyC,CAC1E,OAAAA,IAAQ,MAAQA,EAAMC,EACjB,CAACD,EAAMC,EAAS,KAAK,MAAMD,EAAMC,CAAO,CAAC,EAG3C,CAACD,EAAK,CAAC,CAChB,iKC3BgB,SAAAE,EAAW,CAAE,MAAAC,EAAO,MAAAC,EAAO,MAAAC,EAAQ,SAAU,UAAAC,EAAW,OAAAC,GAA2B,CAE/F,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAWC,EAAG,CAACC,EAAM,OAAQJ,CAAS,CAAC,EAAG,aAAYD,EACzD,SAAA,CAAAM,EAAA,IAAC,OAAK,CAAA,UAAWD,EAAM,MAAQ,SAAMP,EAAA,QACpC,OAAK,CAAA,UAAWO,EAAM,MAAO,cAAaH,EACxC,SACHH,CAAA,CAAA,CAAA,EACF,CAEJ,CASO,SAASQ,GAAoB,CAAE,MAAAT,EAAO,MAAAE,EAAQ,SAAU,UAAAC,EAAW,OAAAO,GAAoC,CAE1G,OAAAL,EAAA,KAAC,MAAI,CAAA,UAAWC,EAAG,CAACC,EAAM,OAAQJ,CAAS,CAAC,EAAG,aAAYD,EACzD,SAAA,CAAAM,EAAA,IAAC,OAAK,CAAA,UAAWD,EAAM,MAAQ,SAAMP,EAAA,EACpCU,EAAOH,EAAM,KAAK,CAAA,EACrB,CAEJ,CAOO,SAASI,GAAU,CAAE,MAAAT,EAAO,MAAAD,EAAO,OAAAG,GAA0B,CAClE,cACG,MAAI,CAAA,UAAWG,EAAM,OAAQ,aAAYL,EACxC,SAAA,CAACG,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,MACpB,SAAA,CAAAC,EAAA,IAAC,OAAK,CAAA,UAAWD,EAAM,KAAM,SAAI,OAAA,EACjCC,EAAAA,IAAC,QAAK,SAAC,GAAA,CAAA,EACNA,EAAA,IAAA,OAAA,CAAK,UAAWD,EAAM,MAAO,SAAK,OAAA,CAAA,CAAA,EACrC,QACC,OAAK,CAAA,UAAWA,EAAM,MAAO,cAAaH,EACxC,SACHH,CAAA,CAAA,CAAA,EACF,CAEJ,iYCnBgB,SAAAW,GAAW,CAAE,aAAAC,GAA2C,CACtE,KAAM,CAAE,WAAAC,EAAY,aAAAC,EAAc,YAAAC,CAAA,EAAgBC,EAAsB,EAElEC,EAAgB,CAAE,SAAU,aAAc,SAAU,UAAW,EAE/DC,EACAJ,IAAiB,KAAarB,EAC9BmB,EAAqBO,EAAWL,EAAcG,CAAa,EACxDzB,EAAesB,EAAc,CAAE,SAAUrB,EAAkB,EAG9D2B,EACAL,IAAgB,KAAatB,EAC7BmB,EAAqBO,EAAWJ,EAAaE,CAAa,EACvDzB,EAAeuB,EAAa,CAAE,SAAUtB,EAAkB,EAG7D,CAAC4B,EAAiBC,CAAmB,EAAIC,EAAA,QAAQ,IAAM5B,EAAuBkB,CAAU,EAAG,CAACA,CAAU,CAAC,EAEvGW,EACAH,IAAoB,KAAa5B,EACjCmB,EAAqBO,EAAWE,EAAiBJ,CAAa,EAC3DzB,EAAe6B,EAAiB,CAAE,SAAU5B,EAAkB,EAGjEgC,EAAeH,EAAsB,EACrCI,EAAoBD,EACtB,wCAAwCH,EAAsB,CAAC,SAC/D,mBAEJ,OACGlB,EAAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,OACpB,SAAA,CAACF,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,IACpB,SAAA,CAAAC,EAAA,IAAC,OAAK,CAAA,UAAWD,EAAM,MAAO,SAAK,QAAA,EACnCC,EAAA,IAACoB,EAAA,CACC,KAAK,qBACL,OACEvB,EAAA,KAAC,MAAI,CAAA,UAAWE,EAAM,gBACpB,SAAA,CAACC,EAAAA,IAAAqB,EAAA,CAAc,UAAWtB,EAAM,IAAM,CAAA,EACtCC,EAAA,IAACsB,EAAA,CACC,UAAWxB,EAAG,CAACC,EAAM,KAAMQ,IAAiB,MAAQR,EAAM,KAAK,CAAC,EAChE,KAAMY,CAAA,CAAA,CACR,CACF,CAAA,CAAA,CAEJ,EACAX,EAAA,IAACoB,EAAA,CACC,KAAK,oBACL,OACGvB,EAAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,gBAAiB,cAAY,oBACjD,SAAA,CAACC,EAAAA,IAAAuB,EAAA,CAAgB,UAAWxB,EAAM,IAAM,CAAA,EACxCC,EAAA,IAACsB,EAAA,CACC,UAAWxB,EAAG,CAACC,EAAM,KAAMS,IAAgB,MAAQT,EAAM,KAAK,CAAC,EAC/D,KAAMc,CAAA,CAAA,CACR,CACF,CAAA,CAAA,CAAA,CAEJ,EACF,EAEChB,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,IACpB,SAAA,CAAAC,EAAA,IAAC,OAAK,CAAA,UAAWD,EAAM,MAAO,SAAG,MAAA,EACjCC,EAAA,IAACoB,EAAA,CACC,KAAMD,EACN,OACEtB,EAAA,KAAC,MAAI,CAAA,UAAWE,EAAM,gBACpB,SAAA,CAACC,EAAAA,IAAAqB,EAAA,CAAc,UAAWtB,EAAM,IAAM,CAAA,EACtCC,EAAA,IAACsB,EAAA,CACC,UAAWxB,EAAG,CAACC,EAAM,KAAMO,IAAe,MAAQP,EAAM,KAAK,CAAC,EAC9D,KAAMkB,CAAA,CACR,EACCC,GACClB,EAAAA,IAAC,OAAK,CAAA,UAAWF,EAAG,CAACC,EAAM,KAAMA,EAAM,OAAO,CAAC,EAAG,kBAAiBgB,CAAqB,CAAA,CAAA,CAE5F,CAAA,CAAA,CAEJ,EACAf,MAACwB,IAAmB,aAAAnB,CAA4B,CAAA,CAAA,CAClD,CAAA,CAAA,EACF,CAEJ,CAMA,SAASmB,GAAmB,CAAE,aAAAnB,GAA2C,CACjE,KAAA,CAAE,YAAAoB,CAAY,EAAIC,EAAsB,EAExC,CAACC,EAAkBC,CAAoB,EAAIZ,EAAA,QAAQ,IAAM5B,EAAuBqC,CAAW,EAAG,CAACA,CAAW,CAAC,EAC3GI,EACAF,IAAqB,KAAazC,EAClCmB,EAAqBO,EAAWe,EAAkB,CAAE,SAAU,aAAc,SAAU,WAAY,EAC/F1C,EAAe0C,EAAkB,CAAE,SAAUzC,EAAkB,EAGlEgC,EAAeS,IAAqB,MAAQC,EAAuB,EACnEE,EAAUZ,EACZ,yCAAyCU,EAAuB,CAAC,SACjE,oBAGF,OAAA5B,EAAA,IAACoB,EAAA,CACC,KAAMU,EACN,OACEjC,EAAA,KAAC,MAAI,CAAA,UAAWE,EAAM,gBACpB,SAAA,CAACC,EAAAA,IAAA+B,EAAA,CAAe,UAAWhC,EAAM,IAAM,CAAA,EACvCC,EAAA,IAACsB,EAAA,CACC,UAAWxB,EAAG,CAACC,EAAM,KAAM4B,IAAqB,MAAQ5B,EAAM,KAAK,CAAC,EACpE,KAAM8B,CAAA,CACR,EACCX,GAAgBlB,EAAAA,IAAC,OAAK,CAAA,UAAWF,EAAG,CAACC,EAAM,KAAMA,EAAM,OAAO,CAAC,EAAG,kBAAiB6B,CAAsB,CAAA,CAAA,CAC5G,CAAA,CAAA,CAEJ,CAEJ,CAEO,SAASI,IAAgB,CAC9B,OACGnC,EAAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,OACpB,SAAA,CAAAC,EAAA,IAACiC,GAAW,EAAA,QACXC,GAAU,CAAA,CAAA,CAAA,EACb,CAEJ,CAEA,SAASD,IAAa,CACd,KAAA,CAAE,MAAAE,EAAO,KAAAC,EAAM,iBAAAC,EAAkB,iBAAAC,EAAkB,WAAAC,EAAY,SAAAC,GAAaC,EAAsB,EAClG,CAAE,eAAAC,CAAe,EAAIC,EAAkB,EACvCC,EAAQC,EAASH,CAAc,EAE/BI,EAASC,EAAiBP,CAAQ,EAGlCQ,GAAmB,IAAM,CAE7B,GADI,CAACF,GACD,CAACF,GAASA,EAAM,YAAc,KAAa,OAAA,KACzC,MAAAK,EAAkBd,EAAQI,EAAajD,EAEtC,OAAA8C,IAASc,EAAW,SACvBN,EAAM,UAAYA,EAAM,SAAWK,EACnCX,EAAmBM,EAAM,SAAWK,CAAA,GACvC,EAEGE,EAA2BxE,EAAcqE,EAAiB,EAAGI,EAAU,SAAS,EAEhFC,EAAmBhB,IAAqB,KAAOA,EAAmBF,EAAQ,KAC1EmB,EAA4B3E,EAAc0E,EAAkB,EAAGD,EAAU,SAAS,EAExF,OACGvD,EAAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,YACpB,SAAA,CAAAC,EAAA,IAAC,OAAK,CAAA,UAAW4C,GAAA,MAAAA,EAAO,MAAQ7C,EAAM,WAAaA,EAAM,MAAQ,SAAG,IAAA6C,GAAA,YAAAA,EAAO,QAAS,OAAO,IAAI,EAC9F/C,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,gBACpB,SAAA,CAACC,EAAAA,IAAAoB,EAAA,CAAQ,KAAK,4BAA4B,aAASmC,EAAY,CAAA,UAAWxD,EAAM,IAAA,CAAM,CAAI,CAAA,EAC1FC,EAAA,IAAC,OAAA,CACC,UAAWF,EAAG,CACZC,EAAM,MACL,CAAC6C,GAAS,CAACE,IAAW/C,EAAM,MAC7BoD,IAA6B,OAASpD,EAAM,OAAA,CAC7C,EAEA,SAAAoD,CAAA,CAAA,CACH,EACF,EACCtD,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,gBACpB,SAAA,CAACC,EAAAA,IAAAoB,EAAA,CAAQ,KAAK,6BAA6B,aAASoC,EAAa,CAAA,UAAWzD,EAAM,IAAA,CAAM,CAAI,CAAA,EAC5FC,EAAA,IAAC,OAAA,CACC,UAAWF,EAAG,CACZC,EAAM,KACN,CAACsC,GAAoBtC,EAAM,MAC3BuD,IAA8B,OAASvD,EAAM,OAAA,CAC9C,EAEA,SAAAuD,CAAA,CAAA,CACH,CACF,CAAA,CAAA,EACF,CAEJ,CAEA,SAASpB,IAAY,CACb,KAAA,CAAE,MAAAC,EAAO,KAAAC,EAAM,YAAA5B,EAAa,aAAAD,EAAc,SAAAiC,EAAU,WAAAD,GAAekB,EAAqB,EACxF,CAAE,GAAAC,EAAI,cAAAC,CAAc,EAAIC,GAAY,EACpCC,EAAQhB,EAASa,CAAE,EAEnBZ,EAASC,EAAiBP,CAAQ,EAElCsB,GAAoB,IAAM,CAE1B,GADA,CAAChB,GACD,CAACe,EAAc,OAAA,KACnB,MAAME,EAAsBF,EAAM,UAAYA,EAAM,UAAYvE,EAC1D2D,EAAkBd,EAAQI,EAAajD,EAC7C,OAAO8C,IAASc,EAAW,SACvBa,EAAsBd,EACtBc,EAAsBvD,EAAcD,EAAe0C,CAAA,GACtD,EAEGe,EAA0BrF,EAAcmF,EAAkB,EAAGV,EAAU,SAAS,EAEhFa,EAAoBN,IAAkB,KAAOA,EAAgBxB,EAAQ,KACrE+B,EAA2BvF,EAAcsF,EAAmB,EAAGb,EAAU,SAAS,EAElFe,GAAQN,GAAA,YAAAA,EAAO,QAAS,KAE9B,OACGhE,EAAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,YACpB,SAAA,CAACC,EAAA,IAAA,OAAA,CAAK,UAAWmE,EAAQpE,EAAM,WAAaA,EAAM,MAAQ,SAAA,GAAGoE,GAAS,MAAM,GAAI,CAAA,EAC/EtE,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,gBACpB,SAAA,CAACC,EAAAA,IAAAoB,EAAA,CAAQ,KAAK,kCAAkC,aAASgD,EAAU,CAAA,UAAWrE,EAAM,IAAA,CAAM,CAAI,CAAA,EAC9FC,EAAA,IAAC,OAAA,CACC,cAAY,oBACZ,UAAWF,EAAG,CACZC,EAAM,MACL,CAAC8D,GAAS,CAACf,IAAW/C,EAAM,MAC7BiE,IAA4B,OAASjE,EAAM,OAAA,CAC5C,EAEA,SAAAiE,CAAA,CAAA,CACH,EACF,EACCnE,EAAA,KAAA,MAAA,CAAI,UAAWE,EAAM,gBACpB,SAAA,CAACC,EAAAA,IAAAoB,EAAA,CAAQ,KAAK,mCAAmC,aAASiD,EAAW,CAAA,UAAWtE,EAAM,IAAA,CAAM,CAAI,CAAA,EAChGC,EAAA,IAAC,OAAA,CACC,cAAY,qBACZ,UAAWF,EAAG,CACZC,EAAM,KACNkE,IAAsB,MAAQlE,EAAM,MACpCmE,IAA6B,OAASnE,EAAM,OAAA,CAC7C,EAEA,SAAAmE,CAAA,CAAA,CACH,CACF,CAAA,CAAA,EACF,CAEJ,CAEO,SAASI,IAAmB,CACjC,KAAM,CAAE,UAAAC,EAAW,mBAAAC,CAAmB,EAAIC,EAAoB,EAExDC,EAAUF,IAAuB,KAAOA,EAAqB,EAAIG,EACjEC,EAAeL,EAAY,GAAGG,CAAO,OAAOH,GAAaI,CAAM,GAAKA,EAEnE,OAAA3E,EAAA,IAACT,EAAW,CAAA,MAAM,WAAW,MAAOqF,EAAc,MAAOJ,IAAuB,KAAO,QAAU,QAAU,CAAA,CACpH,CAEO,SAASK,IAAiB,CAC/B,KAAM,CAAE,OAAAC,EAAQ,SAAAtC,CAAS,EAAIuC,EAAkB,EAEzCC,EAAYjC,EAAiBP,CAAQ,EACrCyC,EAAcC,GAAeF,EAAYF,EAAS,IAAI,EACtDK,EAAaC,GAAcJ,EAAYF,EAAS,IAAI,EAE1D,aAAQ3E,GAAU,CAAA,MAAO8E,EAAa,MAAOE,EAAY,OAAO,SAAS,CAC3E,CAEO,SAASE,GAAc,CAAE,aAAAhF,EAAc,UAAAV,GAAiE,CACvG,KAAA,CAAE,MAAAwC,CAAM,EAAImD,EAAS,EACrBC,EAAiBlF,EAAeO,EAAWuB,CAAK,EAAIlD,EAAekD,CAAK,EAG5E,OAAAnC,EAAA,IAACC,GAAA,CACC,MAAM,WACN,UAAAN,EACA,OAAS6F,GAAiBxF,MAACsB,GAAkB,UAAWkE,EAAc,KAAMD,CAAgB,CAAA,CAAA,CAC9F,CAEJ,CAEgB,SAAAE,GAAc,CAAE,UAAA9F,GAAqC,CACnE,MAAM+F,EAAQC,EAAS,EAEjBC,EAAYF,EAAM,QAAUG,EAAW,QACvC1B,EAAQyB,EAAY,iBAAmB,gBACvCE,EAAU7G,EAAe2G,EAAYF,EAAM,eAAiBA,EAAM,QAAS,CAAE,SAAUxG,EAAkB,EACzG6G,EACAH,EAAkB,UAClBF,EAAM,UAAY,KAAa,QAC5B,SAGF,OAAA1F,MAACT,GAAW,MAAO4E,EAAO,MAAO2B,EAAS,MAAOC,EAAY,UAAApG,EAAsB,CAC5F"}
@@ -0,0 +1 @@
1
+ @charset "UTF-8";._blink_1ahsu_2{animation:_blink_1ahsu_2 1s step-start infinite}@keyframes _blink_1ahsu_2{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1ahsu_14{transform:rotate(45deg)}._label_1ahsu_18{color:#8a8a8a;font-size:calc(1rem - 3px)}._clock_1ahsu_23{text-align:left;font-size:1.5rem;letter-spacing:.5px;min-width:5em;font-variant-numeric:tabular-nums;color:#f6f6f6}._clock_1ahsu_23:after{content:"​"}._column_1ahsu_35{display:flex;flex-direction:column;height:100%;justify-content:end}._column_1ahsu_35 ._label_1ahsu_18{line-height:.9em;width:7em;display:flex;gap:.25rem}._column_1ahsu_35 ._over_1ahsu_47,._column_1ahsu_35 ._under_1ahsu_48{transition:color .2s ease}._column_1ahsu_35[data-state=waiting] ._label_1ahsu_18{color:#22a0e9}._column_1ahsu_35[data-state=over] ._label_1ahsu_18 ._over_1ahsu_47{color:#f57c13;font-weight:600}._column_1ahsu_35[data-state=over] ._clock_1ahsu_23{color:#f57c13}._column_1ahsu_35[data-state=under] ._label_1ahsu_18 ._under_1ahsu_48{color:#55b469;font-weight:600}._column_1ahsu_35[data-state=under] ._clock_1ahsu_23{color:#55b469}._column_1ahsu_35[data-state=muted] ._clock_1ahsu_23{color:#8a8a8a}._blink_1uyfj_1{animation:_blink_1uyfj_1 1s step-start infinite}@keyframes _blink_1uyfj_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1uyfj_13{transform:rotate(45deg)}._column_1uyfj_17{height:100%;justify-content:center;display:flex;flex-direction:column;align-items:end;gap:2px}._row_1uyfj_26{display:grid;grid-template-columns:3rem 9rem 9rem;align-items:center;gap:.5rem}._metadataRow_1uyfj_33{display:grid;grid-template-columns:minmax(3rem,10rem) 8rem 8rem;align-items:center;gap:.5rem}._labelledElement_1uyfj_40{display:flex;align-items:center;gap:.25rem}._icon_1uyfj_46{font-size:1rem;color:#b1b1b1;flex-shrink:0}._label_1uyfj_40{color:#8a8a8a;font-size:calc(1rem - 2px);text-align:right}._time_1uyfj_58{font-size:1.25rem;letter-spacing:.25px;font-variant-numeric:tabular-nums;line-height:1.1}._daySpan_1uyfj_65{display:inline-flex;align-items:center;margin-left:.25rem}._daySpan_1uyfj_65:after{content:"+" attr(data-day-offset);font-size:.75rem;font-weight:400;color:#f6f6f6;background:#4c4c4c;padding:.125rem .25rem;border-radius:2px}._muted_1uyfj_80{color:#8a8a8a}._labelTitle_1uyfj_84{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#77c785;font-size:calc(1rem - 2px);text-align:right}._dueTime_1uyfj_93{text-transform:capitalize;font-size:1rem;letter-spacing:0;color:#f57c13;border-left:3px solid #F57C13;padding-left:.375rem;display:inline-block}
@@ -0,0 +1,2 @@
1
+ import{x as D,j as b,h as t}from"./vendor-BoH5HFNN.js";import{m as E,ah as T,e as N}from"./index-CDBQg2fh.js";import{p as j}from"./parseUserTime-Cp5iWS7y.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new s.Error().stack;n&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[n]="33658152-7aed-4d9a-a65e-0f23fa6a5412",s._sentryDebugIdIdentifier="sentry-dbid-33658152-7aed-4d9a-a65e-0f23fa6a5412")}catch{}})();const A="_link_6042u_17",R={link:A};function L({search:s,children:n}){const r=D(),a=()=>r({search:s});return b.jsx("button",{onClick:a,className:R.link,children:n})}const S="_timeInput_1u25s_17",w="_delayed_1u25s_23",y={timeInput:S,delayed:w};function M({id:s,name:n,submitHandler:r,time:a,placeholder:g,disabled:k,align:h="center",delayed:I,className:_}){const l=t.useRef(null),[m,i]=t.useState(""),c=t.useRef(!1),u=t.useCallback(()=>{typeof a!="number"||isNaN(a)?i("00:00:00"):i(E(a))},[a]),x=t.useCallback(()=>{var e;(e=l.current)==null||e.select()},[]),f=t.useCallback(e=>e===""?!1:e.startsWith("p")||e.startsWith("+")?(r(n,e),!0):j(e)===a?!1:(r(n,e),!0),[n,r,a]),d=t.useCallback(e=>{f(e)||u()},[f,u]),C=t.useCallback(e=>{var o,p;e.key==="Enter"&&((o=l.current)==null||o.blur()),e.key==="Escape"&&(c.current=!0,(p=l.current)==null||p.blur(),u())},[u]),v=t.useCallback(e=>{if(c.current){c.current=!1;return}d(e.target.value)},[d]);return t.useEffect(()=>{u()},[u]),b.jsx(T,{id:s,disabled:k,ref:l,"data-testid":`time-input-${n}`,className:N([y.timeInput,I&&y.delayed,_]),placeholder:g,onFocus:x,onChange:e=>i(e.target.value),onBlur:v,onKeyDown:C,value:m,maxLength:8,style:{textAlign:h}})}export{L as A,M as T,y as s};
2
+ //# sourceMappingURL=TimeInput-Bu_5GlHP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput-Dg1naiy3.js","sources":["../../src/common/components/link/app-link/AppLink.tsx","../../src/common/components/input/time-input/TimeInput.tsx"],"sourcesContent":["import { type PropsWithChildren } from 'react';\nimport { useNavigate } from 'react-router';\n\nimport style from './AppLink.module.scss';\n\ninterface AppLinkProps {\n search: string;\n}\n\n/**\n * Component used to navigate to an editor link inside the same window\n * Handles the path to respect Ontime Clouds base URL\n */\nexport default function AppLink({ search, children }: PropsWithChildren<AppLinkProps>) {\n const navigate = useNavigate();\n\n const handleClick = () => navigate({ search });\n\n return (\n <button onClick={handleClick} className={style.link}>\n {children}\n </button>\n );\n}\n","import { FocusEvent, KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { cx } from '../../../utils/styleUtils';\nimport Input from '../input/Input';\n\nimport style from './TimeInput.module.scss';\n\ninterface TimeInputProps<T extends string> {\n id?: T;\n name: T;\n submitHandler: (field: T, value: string) => void;\n time?: number;\n placeholder?: string;\n disabled?: boolean;\n align?: 'left' | 'center';\n delayed?: boolean;\n className?: string;\n}\n\nexport default function TimeInput<T extends string>({\n id,\n name,\n submitHandler,\n time,\n placeholder,\n disabled,\n align = 'center',\n delayed,\n className,\n}: TimeInputProps<T>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [value, setValue] = useState<string>('');\n const ignoreChange = useRef(false);\n\n /**\n * @description Resets input value to given\n */\n const resetValue = useCallback(() => {\n if (typeof time !== 'number' || isNaN(time)) {\n setValue('00:00:00');\n } else {\n setValue(millisToString(time));\n }\n }, [time]);\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = useCallback(() => {\n inputRef.current?.select();\n }, []);\n\n /**\n * @description Submit handler\n * @param {string} newValue\n */\n const handleSubmit = useCallback(\n (newValue: string) => {\n // Check if there is anything there\n if (newValue === '') {\n return false;\n }\n\n // we dont know the values in the rundown, escalate to handler\n if (newValue.startsWith('p') || newValue.startsWith('+')) {\n submitHandler(name, newValue);\n return true;\n }\n\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis === time) {\n return false;\n }\n\n submitHandler(name, newValue);\n return true;\n },\n [name, submitHandler, time],\n );\n\n /**\n * @description Prepare time fields\n * @param {string} value string to be parsed\n */\n const validateAndSubmit = useCallback(\n (newValue: string) => {\n const success = handleSubmit(newValue);\n if (!success) {\n resetValue();\n }\n },\n [handleSubmit, resetValue],\n );\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n }\n if (event.key === 'Escape') {\n ignoreChange.current = true;\n inputRef.current?.blur();\n resetValue();\n }\n },\n [resetValue],\n );\n\n const onBlurHandler = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (ignoreChange.current) {\n ignoreChange.current = false;\n return;\n }\n validateAndSubmit((event.target as HTMLInputElement).value);\n },\n [validateAndSubmit],\n );\n\n useEffect(() => {\n resetValue();\n }, [resetValue]);\n\n return (\n <Input\n id={id}\n disabled={disabled}\n ref={inputRef}\n data-testid={`time-input-${name}`}\n className={cx([style.timeInput, delayed && style.delayed, className])}\n placeholder={placeholder}\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlurHandler}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={8}\n style={{\n textAlign: align,\n }}\n />\n );\n}\n"],"names":["AppLink","search","children","navigate","useNavigate","handleClick","style","TimeInput","id","name","submitHandler","time","placeholder","disabled","align","delayed","className","inputRef","useRef","value","setValue","useState","ignoreChange","resetValue","useCallback","millisToString","handleFocus","_a","handleSubmit","newValue","parseUserTime","validateAndSubmit","onKeyDownHandler","event","_b","onBlurHandler","useEffect","jsx","Input","cx"],"mappings":"4hBAaA,SAAwBA,EAAQ,CAAE,OAAAC,EAAQ,SAAAC,GAA6C,CACrF,MAAMC,EAAWC,EAAY,EAEvBC,EAAc,IAAMF,EAAS,CAAE,OAAAF,EAAQ,EAE7C,aACG,SAAO,CAAA,QAASI,EAAa,UAAWC,EAAM,KAC5C,SAAAJ,EACH,CAEJ,+ECHA,SAAwBK,EAA4B,CAClD,GAAAC,EACA,KAAAC,EACA,cAAAC,EACA,KAAAC,EACA,YAAAC,EACA,SAAAC,EACA,MAAAC,EAAQ,SACR,QAAAC,EACA,UAAAC,CACF,EAAsB,CACd,MAAAC,EAAWC,SAAgC,IAAI,EAC/C,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAiB,EAAE,EACvCC,EAAeJ,SAAO,EAAK,EAK3BK,EAAaC,EAAAA,YAAY,IAAM,CAC/B,OAAOb,GAAS,UAAY,MAAMA,CAAI,EACxCS,EAAS,UAAU,EAEVA,EAAAK,EAAed,CAAI,CAAC,CAC/B,EACC,CAACA,CAAI,CAAC,EAKHe,EAAcF,EAAAA,YAAY,IAAM,QACpCG,EAAAV,EAAS,UAAT,MAAAU,EAAkB,QACpB,EAAG,EAAE,EAMCC,EAAeJ,EAAA,YAClBK,GAEKA,IAAa,GACR,GAILA,EAAS,WAAW,GAAG,GAAKA,EAAS,WAAW,GAAG,GACrDnB,EAAcD,EAAMoB,CAAQ,EACrB,IAGaC,EAAcD,CAAQ,IACtBlB,EACb,IAGTD,EAAcD,EAAMoB,CAAQ,EACrB,IAET,CAACpB,EAAMC,EAAeC,CAAI,CAC5B,EAMMoB,EAAoBP,EAAA,YACvBK,GAAqB,CACJD,EAAaC,CAAQ,GAExBN,EAAA,CAEf,EACA,CAACK,EAAcL,CAAU,CAC3B,EAMMS,EAAmBR,EAAA,YACtBS,GAA2C,SACtCA,EAAM,MAAQ,WAChBN,EAAAV,EAAS,UAAT,MAAAU,EAAkB,QAEhBM,EAAM,MAAQ,WAChBX,EAAa,QAAU,IACvBY,EAAAjB,EAAS,UAAT,MAAAiB,EAAkB,OACPX,EAAA,EAEf,EACA,CAACA,CAAU,CACb,EAEMY,EAAgBX,EAAA,YACnBS,GAAwC,CACvC,GAAIX,EAAa,QAAS,CACxBA,EAAa,QAAU,GACvB,MAAA,CAEiBS,EAAAE,EAAM,OAA4B,KAAK,CAC5D,EACA,CAACF,CAAiB,CACpB,EAEAK,OAAAA,EAAAA,UAAU,IAAM,CACHb,EAAA,CAAA,EACV,CAACA,CAAU,CAAC,EAGbc,EAAA,IAACC,EAAA,CACC,GAAA9B,EACA,SAAAK,EACA,IAAKI,EACL,cAAa,cAAcR,CAAI,GAC/B,UAAW8B,EAAG,CAACjC,EAAM,UAAWS,GAAWT,EAAM,QAASU,CAAS,CAAC,EACpE,YAAAJ,EACA,QAASc,EACT,SAAWO,GAAUb,EAASa,EAAM,OAAO,KAAK,EAChD,OAAQE,EACR,UAAWH,EACX,MAAAb,EACA,UAAW,EACX,MAAO,CACL,UAAWL,CAAA,CACb,CACF,CAEJ"}
1
+ {"version":3,"file":"TimeInput-Bu_5GlHP.js","sources":["../../src/common/components/link/app-link/AppLink.tsx","../../src/common/components/input/time-input/TimeInput.tsx"],"sourcesContent":["import { type PropsWithChildren } from 'react';\nimport { useNavigate } from 'react-router';\n\nimport style from './AppLink.module.scss';\n\ninterface AppLinkProps {\n search: string;\n}\n\n/**\n * Component used to navigate to an editor link inside the same window\n * Handles the path to respect Ontime Clouds base URL\n */\nexport default function AppLink({ search, children }: PropsWithChildren<AppLinkProps>) {\n const navigate = useNavigate();\n\n const handleClick = () => navigate({ search });\n\n return (\n <button onClick={handleClick} className={style.link}>\n {children}\n </button>\n );\n}\n","import { FocusEvent, KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { millisToString, parseUserTime } from 'ontime-utils';\n\nimport { cx } from '../../../utils/styleUtils';\nimport Input from '../input/Input';\n\nimport style from './TimeInput.module.scss';\n\ninterface TimeInputProps<T extends string> {\n id?: T;\n name: T;\n submitHandler: (field: T, value: string) => void;\n time?: number;\n placeholder?: string;\n disabled?: boolean;\n align?: 'left' | 'center';\n delayed?: boolean;\n className?: string;\n}\n\nexport default function TimeInput<T extends string>({\n id,\n name,\n submitHandler,\n time,\n placeholder,\n disabled,\n align = 'center',\n delayed,\n className,\n}: TimeInputProps<T>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [value, setValue] = useState<string>('');\n const ignoreChange = useRef(false);\n\n /**\n * @description Resets input value to given\n */\n const resetValue = useCallback(() => {\n if (typeof time !== 'number' || isNaN(time)) {\n setValue('00:00:00');\n } else {\n setValue(millisToString(time));\n }\n }, [time]);\n\n /**\n * @description Selects input text on focus\n */\n const handleFocus = useCallback(() => {\n inputRef.current?.select();\n }, []);\n\n /**\n * @description Submit handler\n * @param {string} newValue\n */\n const handleSubmit = useCallback(\n (newValue: string) => {\n // Check if there is anything there\n if (newValue === '') {\n return false;\n }\n\n // we dont know the values in the rundown, escalate to handler\n if (newValue.startsWith('p') || newValue.startsWith('+')) {\n submitHandler(name, newValue);\n return true;\n }\n\n const valueInMillis = parseUserTime(newValue);\n if (valueInMillis === time) {\n return false;\n }\n\n submitHandler(name, newValue);\n return true;\n },\n [name, submitHandler, time],\n );\n\n /**\n * @description Prepare time fields\n * @param {string} value string to be parsed\n */\n const validateAndSubmit = useCallback(\n (newValue: string) => {\n const success = handleSubmit(newValue);\n if (!success) {\n resetValue();\n }\n },\n [handleSubmit, resetValue],\n );\n\n /**\n * @description Handles common keys for submit and cancel\n * @param {KeyboardEvent} event\n */\n const onKeyDownHandler = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n inputRef.current?.blur();\n }\n if (event.key === 'Escape') {\n ignoreChange.current = true;\n inputRef.current?.blur();\n resetValue();\n }\n },\n [resetValue],\n );\n\n const onBlurHandler = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (ignoreChange.current) {\n ignoreChange.current = false;\n return;\n }\n validateAndSubmit((event.target as HTMLInputElement).value);\n },\n [validateAndSubmit],\n );\n\n useEffect(() => {\n resetValue();\n }, [resetValue]);\n\n return (\n <Input\n id={id}\n disabled={disabled}\n ref={inputRef}\n data-testid={`time-input-${name}`}\n className={cx([style.timeInput, delayed && style.delayed, className])}\n placeholder={placeholder}\n onFocus={handleFocus}\n onChange={(event) => setValue(event.target.value)}\n onBlur={onBlurHandler}\n onKeyDown={onKeyDownHandler}\n value={value}\n maxLength={8}\n style={{\n textAlign: align,\n }}\n />\n );\n}\n"],"names":["AppLink","search","children","navigate","useNavigate","handleClick","style","TimeInput","id","name","submitHandler","time","placeholder","disabled","align","delayed","className","inputRef","useRef","value","setValue","useState","ignoreChange","resetValue","useCallback","millisToString","handleFocus","_a","handleSubmit","newValue","parseUserTime","validateAndSubmit","onKeyDownHandler","event","_b","onBlurHandler","useEffect","jsx","Input","cx"],"mappings":"4hBAaA,SAAwBA,EAAQ,CAAE,OAAAC,EAAQ,SAAAC,GAA6C,CACrF,MAAMC,EAAWC,EAAY,EAEvBC,EAAc,IAAMF,EAAS,CAAE,OAAAF,EAAQ,EAE7C,aACG,SAAO,CAAA,QAASI,EAAa,UAAWC,EAAM,KAC5C,SAAAJ,EACH,CAEJ,+ECHA,SAAwBK,EAA4B,CAClD,GAAAC,EACA,KAAAC,EACA,cAAAC,EACA,KAAAC,EACA,YAAAC,EACA,SAAAC,EACA,MAAAC,EAAQ,SACR,QAAAC,EACA,UAAAC,CACF,EAAsB,CACd,MAAAC,EAAWC,SAAgC,IAAI,EAC/C,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAiB,EAAE,EACvCC,EAAeJ,SAAO,EAAK,EAK3BK,EAAaC,EAAAA,YAAY,IAAM,CAC/B,OAAOb,GAAS,UAAY,MAAMA,CAAI,EACxCS,EAAS,UAAU,EAEVA,EAAAK,EAAed,CAAI,CAAC,CAC/B,EACC,CAACA,CAAI,CAAC,EAKHe,EAAcF,EAAAA,YAAY,IAAM,QACpCG,EAAAV,EAAS,UAAT,MAAAU,EAAkB,QACpB,EAAG,EAAE,EAMCC,EAAeJ,EAAA,YAClBK,GAEKA,IAAa,GACR,GAILA,EAAS,WAAW,GAAG,GAAKA,EAAS,WAAW,GAAG,GACrDnB,EAAcD,EAAMoB,CAAQ,EACrB,IAGaC,EAAcD,CAAQ,IACtBlB,EACb,IAGTD,EAAcD,EAAMoB,CAAQ,EACrB,IAET,CAACpB,EAAMC,EAAeC,CAAI,CAC5B,EAMMoB,EAAoBP,EAAA,YACvBK,GAAqB,CACJD,EAAaC,CAAQ,GAExBN,EAAA,CAEf,EACA,CAACK,EAAcL,CAAU,CAC3B,EAMMS,EAAmBR,EAAA,YACtBS,GAA2C,SACtCA,EAAM,MAAQ,WAChBN,EAAAV,EAAS,UAAT,MAAAU,EAAkB,QAEhBM,EAAM,MAAQ,WAChBX,EAAa,QAAU,IACvBY,EAAAjB,EAAS,UAAT,MAAAiB,EAAkB,OACPX,EAAA,EAEf,EACA,CAACA,CAAU,CACb,EAEMY,EAAgBX,EAAA,YACnBS,GAAwC,CACvC,GAAIX,EAAa,QAAS,CACxBA,EAAa,QAAU,GACvB,MAAA,CAEiBS,EAAAE,EAAM,OAA4B,KAAK,CAC5D,EACA,CAACF,CAAiB,CACpB,EAEAK,OAAAA,EAAAA,UAAU,IAAM,CACHb,EAAA,CAAA,EACV,CAACA,CAAU,CAAC,EAGbc,EAAA,IAACC,EAAA,CACC,GAAA9B,EACA,SAAAK,EACA,IAAKI,EACL,cAAa,cAAcR,CAAI,GAC/B,UAAW8B,EAAG,CAACjC,EAAM,UAAWS,GAAWT,EAAM,QAASU,CAAS,CAAC,EACpE,YAAAJ,EACA,QAASc,EACT,SAAWO,GAAUb,EAASa,EAAM,OAAO,KAAK,EAChD,OAAQE,EACR,UAAWH,EACX,MAAAb,EACA,UAAW,EACX,MAAO,CACL,UAAWL,CAAA,CACb,CACF,CAEJ"}
@@ -1 +1 @@
1
- ._blink_1myua_1{animation:_blink_1myua_1 1s step-start infinite}@keyframes _blink_1myua_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1myua_13{transform:rotate(45deg)}._link_1myua_17{color:#b1b1b1;font-size:calc(1rem - 1px);text-decoration:underline;text-underline-offset:2px;color:#779be7}._link_1myua_17:hover{color:#578af4}._blink_1u25s_1{animation:_blink_1u25s_1 1s step-start infinite}@keyframes _blink_1u25s_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1u25s_13{transform:rotate(45deg)}._timeInput_1u25s_17{width:100%;max-width:7.5em;letter-spacing:.5px;font-variant-numeric:tabular-nums}._timeInput_1u25s_17._delayed_1u25s_23{border:1px solid #E69056}
1
+ ._blink_6042u_1{animation:_blink_6042u_1 1s step-start infinite}@keyframes _blink_6042u_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_6042u_13{transform:rotate(45deg)}._link_6042u_17{color:#8a8a8a;font-size:calc(1rem - 1px);text-decoration:underline;text-underline-offset:2px;color:#779be7}._link_6042u_17:hover{color:#578af4}._blink_1u25s_1{animation:_blink_1u25s_1 1s step-start infinite}@keyframes _blink_1u25s_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1u25s_13{transform:rotate(45deg)}._timeInput_1u25s_17{width:100%;max-width:7.5em;letter-spacing:.5px;font-variant-numeric:tabular-nums}._timeInput_1u25s_17._delayed_1u25s_23{border:1px solid #E69056}
@@ -0,0 +1,2 @@
1
+ import{h as p,l as R,j as i,o as U}from"./vendor-BoH5HFNN.js";import{s as S,P as W,I as E,k as N,M as C,f as O,J as F,e as _,K as G,q as V,d as M,w as q,b as J,L as K,o as Q,g as X,O as Y,v as Z}from"./index-CDBQg2fh.js";import{E as tt}from"./EmptyPage-Ct3d0DqJ.js";import{V as et}from"./ViewLogo-BHsV7Faa.js";import{O as B,V as nt}from"./ViewParamsEditor-BMHXOv-K.js";import{u as st}from"./useWindowTitle-DU8NlxIu.js";import{S as it}from"./SuperscriptTime-Nou92D8X.js";import{i as w,a as v,d as ot,u as at}from"./useRundown-BFae0_bU.js";import{g as rt,a as lt}from"./viewLoader.utils-BPOG1xso.js";import{i as I}from"./viewUtils-DI8_kmUZ.js";import{g as ct,a as D,b as ut,c as mt}from"./rundownUtils-DJKMt8Ih.js";import{g as dt}from"./getProgress-DlrSzpnf.js";import{u as ft}from"./useProjectData-DGA6K2Zs.js";import"./Empty-C0IdV_kI.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:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="ed8005c4-be08-4b39-8aed-ce08cd47380a",e._sentryDebugIdIdentifier="sentry-dbid-ed8005c4-be08-4b39-8aed-ce08cd47380a")}catch{}})();function ht(e,t){if(!t)return 0;const n=e.timeStart+e.dayOffset*S,s=t.timeStart+t.duration+t.dayOffset*S;return n===s?0:(n>s,n-s)}function z(e,t,n){if(!t.current)return;if(!(e!=null&&e.current)){t.current.scrollTo({left:0,behavior:"smooth"});return}const s=e.current.getBoundingClientRect(),a=t.current.getBoundingClientRect(),o=s.left-a.left+t.current.scrollLeft-n;t.current.scrollTo({left:o,behavior:"smooth"})}function pt({followRef:e,scrollRef:t,doFollow:n,selectedEventId:s,leftOffset:a=0,setScrollFlag:o}){return p.useEffect(()=>{!n||!t.current||(o==null||o(!0),window.requestAnimationFrame(()=>{z(s!==null?e:null,t,a),o==null||o(!1)}))},[e,t,n,a,o,s]),p.useCallback((m=e,u=t,c=a)=>{u.current&&z(s!==null?m:null,u,c)},[e,t,a,s])}const xt=e=>[{title:B.ClockOptions,collapsible:!0,options:[rt(e)]},{title:B.ElementVisibility,collapsible:!0,options:[{id:"hidePast",title:"Hide Past Events",description:"Whether to hide events that have passed",type:"boolean",defaultValue:!1},{id:"fixedSize",title:"Fixed timeline size",description:"Timeline will have a fixed size to prevent scrolling",type:"boolean",defaultValue:!1}]}];function yt(e,t){const n=s=>(t==null?void 0:t.get(s))??e.get(s);return{hidePast:I(n("hidePast")),fixedSize:I(n("fixedSize"))}}function $(){const[e]=R(),t=p.use(W);return p.useMemo(()=>{const s=t?new URLSearchParams(t.search):void 0;return yt(e,s)},[t,e])}function gt(e,t,n,s,a){const r=(t<e?t+S:t)-e,m=s*a/r;return{left:(n-e)*a/r,width:m}}function _t(e){return Math.floor(e/E)}function Tt(e){return Math.ceil(e/E)}function jt(e,t){const n=[];for(let s=e;s<t;s++)n.push(s);return n}function wt(e,t){return t==="done"||t==="live"?t:e<=0?"pending":N(e,e>C*10)}function St(e,t){const{hidePast:n}=$();return p.useMemo(()=>{if(e.length===0)return{scopedRundown:[],firstStart:0,totalDuration:0};const a=[];let o=t?1/0:-1,r=null,m=0,u=null;for(let c=0;c<e.length;c++){const l=e[c];if(w(l)&&v(l)){if(l.id===t&&(o=c),n&&c<o)continue;a.push(l),r===null&&(r=l.timeStart);const d=ht(l,u);d===0?m+=l.duration:d>0?m+=d+l.duration:d<0&&(m+=Math.max(l.duration+d,0)),ot(l,u)&&(u=l)}}return{scopedRundown:a,firstStart:r??0,totalDuration:m}},[n,e,t])}function bt(e,t){var o,r;if(e.length===0)return{now:null,next:null,followedBy:null};let n=t?ct(e,t):null;w(n)||(n=null);const s=n?(o=D(e,n.id))==null?void 0:o.nextEvent:ut(e).firstEvent,a=s?(r=D(e,s.id))==null?void 0:r.nextEvent:null;return{now:n,next:s,followedBy:a}}function vt(e,t,n,s,a,o=100){let r=1/0;const m=e.map(({start:l,duration:d})=>{const y=gt(t,n,l,d,s);return r=Math.min(r,y.width),y});if(!a)return{positions:m,scale:1,totalWidth:s};const u=r<o?o/r:1;return u===1?{positions:m,scale:1,totalWidth:s}:{positions:m.map(l=>({left:l.left*u,width:l.width*u})),scale:u,totalWidth:s*u}}const Et="_markers_gfywu_17",Nt={markers:Et};function Pt(e){const{startHour:t,endHour:n}=e,s=jt(t,n);return i.jsx("div",{className:Nt.markers,children:s.map(a=>i.jsx("span",{},a))})}const Lt="_timelineContainer_1qyn0_21",kt="_scroll_1qyn0_26",Ct="_timeline_1qyn0_21",Ot="_column_1qyn0_37",qt="_maybeInline_1qyn0_45",Mt="_timelineBlock_1qyn0_52",Bt="_smallArea_1qyn0_64",It="_content_1qyn0_64",Dt="_timeOverview_1qyn0_68",zt="_hide_1qyn0_72",Ht="_status_1qyn0_98",At="_due_1qyn0_112",Vt="_delay_1qyn0_116",$t="_cross_1qyn0_126",Rt="_separeLeft_1qyn0_132",h={timelineContainer:Lt,scroll:kt,timeline:Ct,column:Ot,maybeInline:qt,timelineBlock:Mt,smallArea:Bt,content:It,timeOverview:Dt,hide:zt,status:Ht,due:At,delay:Vt,cross:$t,separeLeft:Rt},H={format12:"h:mm a",format24:"HH:mm"};function Ut({colour:e,delay:t,duration:n,hasLink:s,left:a,status:o,start:r,dayOffset:m,totalGap:u,isLinkedToLoaded:c,title:l,width:d,cue:y,ref:b}){const P=O(r,H),L=N(n),T=r+t,j=t>0,f=F(e,.7),x=d>25,g=d<40;return i.jsxs("div",{ref:b,className:_([h.column,g&&h.smallArea]),style:{"--color":e,"--lighter":f??"",left:`${a}px`,width:`${d}px`},"data-testid":y,children:[o==="live"?i.jsx(Wt,{}):i.jsx("div",{"data-status":o,className:h.timelineBlock}),i.jsxs("div",{className:_([h.content,d<20&&h.hide,!s&&h.separeLeft]),"data-status":o,style:{"--color":e},children:[i.jsxs("div",{className:h.maybeInline,children:[i.jsx("div",{className:_([j&&h.cross]),children:P}),j&&i.jsx("div",{className:h.delay,children:O(T,H)}),g&&i.jsx(A,{delay:t,start:r,dayOffset:m,totalGap:u,isLinkedToLoaded:c,status:o})]}),x&&i.jsxs(i.Fragment,{children:[!g&&i.jsx(A,{delay:t,start:r,dayOffset:m,totalGap:u,isLinkedToLoaded:c,status:o}),i.jsx("div",{children:l})]})]}),i.jsx("div",{className:h.timeOverview,"data-status":o,children:o!=="done"&&i.jsx("div",{className:h.duration,children:L})})]})}function A({delay:e,start:t,dayOffset:n,totalGap:s,isLinkedToLoaded:a,status:o}){const r=V(),{getLocalizedString:m}=M(),{timeToStart:u}=q({timeStart:t,delay:e,dayOffset:n,totalGap:s,isLinkedToLoaded:a,countToEnd:!1,duration:0},r);let c=wt(u,o);c==="live"?c=m("timeline.live"):c==="pending"&&(c=m("timeline.due"));const l=o==="future"&&u<=0;return i.jsx("div",{className:_([h.status,l&&h.due]),children:c})}function Wt(){const{current:e,duration:t}=G(),n=dt(e,t);return i.jsx("div",{"data-status":"live",className:h.timelineBlock,style:{"--progress":`${n}%`}})}const Ft=p.memo(Gt);function Gt({firstStart:e,rundown:t,selectedEventId:n,totalDuration:s}){const{width:a}=U(),{hidePast:o,fixedSize:r}=$(),m=p.useRef(null),u=p.useRef(null),{lastEvent:c}=mt(t),l=_t(e),d=Tt(e+s+((c==null?void 0:c.delay)??0)),y=l*E,b=d*E;pt({followRef:m,scrollRef:u,doFollow:!r,selectedEventId:n,leftOffset:o?0:a/6});const{positions:P,totalWidth:L}=p.useMemo(()=>{const f=t.filter(x=>w(x)&&v(x)).map(x=>({start:x.timeStart+(x.dayOffset??0)*S+(x.delay??0),duration:x.duration}));return vt(f,y,b,a,!r)},[t,y,b,a,r]);if(s===0)return null;let T=n?"done":"future";const j={};return t.forEach(f=>{w(f)&&v(f)&&(T==="live"&&(T="future"),f.id===n&&(T="live"),j[f.id]=T)}),i.jsx("div",{ref:u,className:_([h.timelineContainer,!r&&h.scroll]),children:i.jsxs("div",{className:h.timeline,style:{width:L},children:[i.jsx(Pt,{startHour:l,endHour:d}),t.map((f,x)=>{if(!w(f)||!v(f))return null;const g=P[x];return g?i.jsx(Ut,{ref:f.id===n?m:void 0,colour:f.colour,delay:f.delay??0,duration:f.duration,hasLink:!!f.linkStart,left:g.left,status:j[f.id],start:f.timeStart+(f.dayOffset??0)*S,totalGap:f.totalGap,isLinkedToLoaded:f.isLinkedToLoaded,dayOffset:f.dayOffset,title:f.title,cue:f.cue,width:g.width},f.id):null})]})})}const k=p.memo(Jt);function Jt({category:e,content:t,title:n,status:s}){const a=_(["section",e==="now"&&"section--now"]),o=_(["section-content",t?`section-content--${e}`:"section-content--subdue"]);return i.jsxs("div",{className:a,"data-testid":e,children:[i.jsxs("div",{className:"section-title",children:[i.jsx("span",{className:"section-title__label",children:n}),s&&i.jsx("span",{className:"section-title__status",children:s})]}),i.jsx("div",{className:o,children:t??"-"})]})}function Kt({now:e,next:t,followedBy:n}){const{getLocalizedString:s}=M(),a=V(),o=(e==null?void 0:e.title)??"-",r=s("timeline.due").toUpperCase(),m=t!==null?t.title:"-",u=n!==null?n.title:"-";let c,l;if(t!==null){const{timeToStart:d}=q(t,a);d<=0?c=r:c=N(d,d>C*10)}if(n!==null){const{timeToStart:d}=q(n,a);d<=0?l=r:l=N(d,d>C*10)}return i.jsxs("div",{className:"title-grid",children:[i.jsx(k,{title:s("timeline.live"),content:o,category:"now"}),i.jsx(k,{title:s("common.next"),status:c,content:m,category:"next"}),i.jsx(k,{title:s("timeline.followedby"),status:l,content:u,category:"followedBy"})]})}function Qt(){const{data:e,status:t}=at(),{data:n,status:s}=ft(),{data:a,status:o}=J();return{data:{events:e,projectData:n,settings:a},status:lt([t,s,o])}}function pe(){const{data:e,status:t}=Qt();return st("Timeline"),t==="pending"?i.jsx(K,{}):t==="error"?i.jsx(tt,{text:"There was an error fetching data, please refresh the page."}):i.jsx(Xt,{...e})}function Xt({events:e,projectData:t,settings:n}){const{selectedEventId:s}=Q(),{scopedRundown:a,firstStart:o,totalDuration:r}=St(e,s),{now:m,next:u,followedBy:c}=p.useMemo(()=>bt(a,s),[a,s]),l=X(n==null?void 0:n.timeFormat),d=p.useMemo(()=>xt(l),[l]);return i.jsxs("div",{className:"timeline","data-testid":"timeline-view",children:[i.jsx(nt,{target:Y.Timeline,viewOptions:d}),i.jsxs("div",{className:"project-header",children:[(t==null?void 0:t.logo)&&i.jsx(et,{name:t.logo,className:"logo"}),i.jsx("div",{className:"title",children:t.title}),i.jsx(Yt,{})]}),i.jsx(Kt,{now:m,next:u,followedBy:c}),i.jsx(Ft,{firstStart:o,rundown:a,selectedEventId:s,totalDuration:r})]})}function Yt(){const{getLocalizedString:e}=M(),{clock:t}=Z(),n=O(t);return i.jsxs("div",{className:"clock-container",children:[i.jsx("div",{className:"label",children:e("common.time_now")}),i.jsx(it,{time:n,className:"time"})]})}export{pe as default};
2
+ //# sourceMappingURL=TimelinePage-CQqUB1KT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelinePage-CQqUB1KT.js","sources":["../../../../packages/utils/src/date-utils/getTimeFrom.ts","../../src/common/hooks/useHorizontalFollowComponent.ts","../../src/views/timeline/timeline.options.ts","../../src/views/timeline/timeline.utils.ts","../../src/views/timeline/timeline-markers/TimelineMarkers.tsx","../../src/views/timeline/TimelineEntry.tsx","../../src/views/timeline/Timeline.tsx","../../src/views/timeline/timeline-section/TimelineSection.tsx","../../src/views/timeline/TimelineSections.tsx","../../src/views/timeline/useTimelineData.ts","../../src/views/timeline/TimelinePage.tsx"],"sourcesContent":["import type { OntimeEvent } from 'ontime-types';\n\nimport { dayInMs } from './conversionUtils.js';\n\n/**\n * Utility returns the gap from a previous given event\n */\nexport function getTimeFrom(\n current: Pick<OntimeEvent, 'timeStart' | 'dayOffset'>,\n previous: Pick<OntimeEvent, 'timeStart' | 'duration' | 'dayOffset'> | null,\n): number {\n // there is no previous event\n if (!previous) {\n return 0;\n }\n\n const normalisedCurrentStart = current.timeStart + current.dayOffset * dayInMs;\n const normalisedPreviousEnd = previous.timeStart + previous.duration + previous.dayOffset * dayInMs;\n\n // event is linked to previous\n if (normalisedCurrentStart === normalisedPreviousEnd) {\n return 0;\n }\n\n // event has a gap from previous\n if (normalisedCurrentStart > normalisedPreviousEnd) {\n // time from previous is difference between start and previous end\n return normalisedCurrentStart - normalisedPreviousEnd;\n }\n\n // event overlaps with previous\n return normalisedCurrentStart - normalisedPreviousEnd;\n}\n","import { RefObject, useCallback, useEffect } from 'react';\nimport { EntryId } from 'ontime-types';\n\nfunction scrollToComponent<ComponentRef extends HTMLElement, ScrollRef extends HTMLElement>(\n componentRef: RefObject<ComponentRef> | null,\n scrollRef: RefObject<ScrollRef>,\n leftOffset: number,\n) {\n if (!scrollRef.current) {\n return;\n }\n\n if (!componentRef?.current) {\n // If no target component, scroll to start\n scrollRef.current.scrollTo({ left: 0, behavior: 'smooth' });\n return;\n }\n\n const componentRect = componentRef.current.getBoundingClientRect();\n const scrollRect = scrollRef.current.getBoundingClientRect();\n const left = componentRect.left - scrollRect.left + scrollRef.current.scrollLeft - leftOffset;\n\n scrollRef.current.scrollTo({ left, behavior: 'smooth' });\n}\n\ninterface UseHorizontalFollowComponentOptions {\n followRef: RefObject<HTMLElement | null>;\n scrollRef: RefObject<HTMLElement | null>;\n doFollow: boolean;\n selectedEventId: EntryId | null;\n leftOffset?: number;\n setScrollFlag?: (newValue: boolean) => void;\n}\n\n/**\n * This is a copy of useFollowComponent, but for horizontal scrolling\n * Designed with the timeline component in mind\n */\nexport default function useHorizontalFollowComponent({\n followRef,\n scrollRef,\n doFollow,\n selectedEventId,\n leftOffset = 0,\n setScrollFlag,\n}: UseHorizontalFollowComponentOptions) {\n useEffect(() => {\n if (!doFollow || !scrollRef.current) {\n return;\n }\n\n setScrollFlag?.(true);\n // Use requestAnimationFrame to ensure the component is fully loaded\n window.requestAnimationFrame(() => {\n scrollToComponent(\n selectedEventId !== null ? (followRef as RefObject<HTMLElement>) : null,\n scrollRef as RefObject<HTMLElement>,\n leftOffset,\n );\n setScrollFlag?.(false);\n });\n }, [followRef, scrollRef, doFollow, leftOffset, setScrollFlag, selectedEventId]);\n\n const scrollToRefComponent = useCallback(\n (componentRef = followRef, containerRef = scrollRef, offset = leftOffset) => {\n if (containerRef.current) {\n scrollToComponent(\n selectedEventId !== null ? (componentRef as RefObject<HTMLElement>) : null,\n containerRef as RefObject<HTMLElement>,\n offset,\n );\n }\n },\n [followRef, scrollRef, leftOffset, selectedEventId],\n );\n\n return scrollToRefComponent;\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\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 { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../features/viewers/common/viewUtils';\n\nexport const getTimelineOptions = (timeFormat: string): ViewOption[] => {\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hidePast',\n title: 'Hide Past Events',\n description: 'Whether to hide events that have passed',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'fixedSize',\n title: 'Fixed timeline size',\n description: 'Timeline will have a fixed size to prevent scrolling',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n ];\n};\n\ntype TimelineOptions = {\n hidePast: boolean;\n fixedSize: 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): TimelineOptions {\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 hidePast: isStringBoolean(getValue('hidePast')),\n fixedSize: isStringBoolean(getValue('fixedSize')),\n };\n}\n\n/**\n * Hook exposes the timeline view options\n */\nexport function useTimelineOptions(): TimelineOptions {\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 { useMemo } from 'react';\nimport { isOntimeEvent, isPlayableEvent, MaybeString, OntimeEntry, OntimeEvent, PlayableEvent } from 'ontime-types';\nimport {\n dayInMs,\n getEventWithId,\n getFirstEvent,\n getNextEvent,\n getTimeFrom,\n isNewLatest,\n MILLIS_PER_HOUR,\n MILLIS_PER_MINUTE,\n} from 'ontime-utils';\n\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatDuration } from '../../common/utils/time';\n\nimport { useTimelineOptions } from './timeline.options';\nimport type { ProgressStatus } from './TimelineEntry';\n\ntype CSSPosition = {\n left: number;\n width: number;\n};\n\n/**\n * Calculates the base position and width of an element based on schedule\n * The scaling of these values (if needed) is handled by calculateTimelineLayout\n */\nexport function getElementPosition(\n scheduleStart: number,\n scheduleEnd: number,\n eventStart: number,\n eventDuration: number,\n containerWidth: number,\n): CSSPosition {\n const normalEnd = scheduleEnd < scheduleStart ? scheduleEnd + dayInMs : scheduleEnd;\n const totalDuration = normalEnd - scheduleStart;\n\n // Calculate proportional width and position\n const width = (eventDuration * containerWidth) / totalDuration;\n const left = ((eventStart - scheduleStart) * containerWidth) / totalDuration;\n\n return { left, width };\n}\n\n/**\n * Gets rounded down hour for a given time\n */\nexport function getStartHour(startTime: number): number {\n const hours = Math.floor(startTime / MILLIS_PER_HOUR);\n return hours;\n}\n\n/**\n * Gets rounded up hour for a given time\n */\nexport function getEndHour(endTime: number): number {\n const hours = Math.ceil(endTime / MILLIS_PER_HOUR);\n return hours;\n}\n\n/**\n * converts a time span into an array of hours\n */\nexport function makeTimelineSections(firstHour: number, lastHour: number) {\n const timelineSections = [];\n for (let i = firstHour; i < lastHour; i++) {\n timelineSections.push(i);\n }\n return timelineSections;\n}\n\n/**\n * Returns a formatted label for a progress status\n */\nexport function getStatusLabel(timeToStart: number, status: ProgressStatus): string {\n if (status === 'done' || status === 'live') {\n return status;\n }\n\n if (timeToStart <= 0) {\n return 'pending';\n }\n\n return formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 10);\n}\n\ninterface ScopedRundownData {\n scopedRundown: ExtendedEntry<PlayableEvent>[];\n firstStart: number;\n totalDuration: number;\n}\n\nexport function useScopedRundown(\n rundown: ExtendedEntry<OntimeEntry>[],\n selectedEventId: MaybeString,\n): ScopedRundownData {\n const { hidePast } = useTimelineOptions();\n\n const data = useMemo(() => {\n if (rundown.length === 0) {\n return { scopedRundown: [], firstStart: 0, totalDuration: 0 };\n }\n\n const scopedRundown: ExtendedEntry<PlayableEvent>[] = [];\n let selectedIndex = selectedEventId ? Infinity : -1;\n let firstStart = null;\n let totalDuration = 0;\n let lastEntry: ExtendedEntry<PlayableEvent> | null = null;\n\n for (let i = 0; i < rundown.length; i++) {\n const currentEntry = rundown[i];\n // we only deal with playableEvents\n if (isOntimeEvent(currentEntry) && isPlayableEvent(currentEntry)) {\n if (currentEntry.id === selectedEventId) {\n selectedIndex = i;\n }\n\n // maybe filter past\n if (hidePast && i < selectedIndex) {\n continue;\n }\n\n // add to scopedRundown\n scopedRundown.push(currentEntry);\n\n /**\n * Derive timers\n * This logic is partially from rundownCache.generate\n * With the addition of deriving the current day offset\n */\n if (firstStart === null) {\n firstStart = currentEntry.timeStart;\n }\n\n const timeFromPrevious: number = getTimeFrom(currentEntry, lastEntry);\n\n if (timeFromPrevious === 0) {\n totalDuration += currentEntry.duration;\n } else if (timeFromPrevious > 0) {\n totalDuration += timeFromPrevious + currentEntry.duration;\n } else if (timeFromPrevious < 0) {\n totalDuration += Math.max(currentEntry.duration + timeFromPrevious, 0);\n }\n if (isNewLatest(currentEntry, lastEntry)) {\n lastEntry = currentEntry;\n }\n }\n }\n\n return { scopedRundown, firstStart: firstStart ?? 0, totalDuration };\n }, [hidePast, rundown, selectedEventId]);\n\n return data;\n}\n\ntype UpcomingEvents = {\n now: ExtendedEntry<OntimeEvent> | null;\n next: ExtendedEntry<OntimeEvent> | null;\n followedBy: ExtendedEntry<OntimeEvent> | null;\n};\n\n/**\n * Returns upcoming events from current: now, next and followedBy\n */\nexport function getUpcomingEvents(events: ExtendedEntry<PlayableEvent>[], selectedId: MaybeString): UpcomingEvents {\n if (events.length === 0) {\n return { now: null, next: null, followedBy: null };\n }\n\n let now = selectedId ? (getEventWithId(events, selectedId) as ExtendedEntry<OntimeEvent>) : null;\n if (!isOntimeEvent(now)) {\n now = null;\n }\n\n const next = now\n ? (getNextEvent(events, now.id)?.nextEvent as ExtendedEntry<OntimeEvent> | null)\n : (getFirstEvent(events).firstEvent as ExtendedEntry<OntimeEvent> | null);\n const followedBy = next ? (getNextEvent(events, next.id)?.nextEvent as ExtendedEntry<OntimeEvent> | null) : null;\n\n // Return the titles, handling nulls appropriately\n return {\n now,\n next,\n followedBy,\n };\n}\n\n/**\n * Utility function calculates time to start\n */\nexport function getTimeToStart(now: number, start: number, delay: number, offset: number): number {\n return start + delay - now + offset;\n}\n\ninterface TimelineLayout {\n positions: CSSPosition[];\n scale: number;\n totalWidth: number;\n}\n\n/**\n * Calculates positions for all events and applies scaling if needed\n */\nexport function calculateTimelineLayout(\n events: Array<{ start: number; duration: number }>,\n scheduleStart: number,\n scheduleEnd: number,\n containerWidth: number,\n canScroll: boolean,\n minWidth = 100,\n): TimelineLayout {\n // Calculate positions and track minimum width\n let smallestWidth = Infinity;\n const positions = events.map(({ start, duration }) => {\n const position = getElementPosition(scheduleStart, scheduleEnd, start, duration, containerWidth);\n smallestWidth = Math.min(smallestWidth, position.width);\n return position;\n });\n\n if (!canScroll) {\n return {\n positions: positions,\n scale: 1,\n totalWidth: containerWidth,\n };\n }\n\n // Determine if scaling is needed\n const scale = smallestWidth < minWidth ? minWidth / smallestWidth : 1;\n\n // If no scaling is needed, return base positions\n if (scale === 1) {\n return {\n positions,\n scale: 1,\n totalWidth: containerWidth,\n };\n }\n\n // Apply scale to all positions\n const scaledPositions = positions.map((pos) => ({\n left: pos.left * scale,\n width: pos.width * scale,\n }));\n\n return {\n positions: scaledPositions,\n scale,\n totalWidth: containerWidth * scale,\n };\n}\n","import { makeTimelineSections } from '../timeline.utils';\n\nimport style from './TimelineMarkers.module.scss';\n\ninterface TimelineMarkersProps {\n startHour: number;\n endHour: number;\n}\n\n/** Creates a line for every hour in the timeline */\nexport default function TimelineMarkers(props: TimelineMarkersProps) {\n const { startHour, endHour } = props;\n\n const elements = makeTimelineSections(startHour, endHour);\n\n return (\n <div className={style.markers}>\n {elements.map((tag) => (\n <span key={tag} />\n ))}\n </div>\n );\n}\n","import { RefObject } from 'react';\n\nimport { useExpectedStartData, useTimer } from '../../common/hooks/useSocket';\nimport { getProgress } from '../../common/utils/getProgress';\nimport { alpha, cx } from '../../common/utils/styleUtils';\nimport { formatDuration, formatTime, getExpectedTimesFromExtendedEvent } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\n\nimport { getStatusLabel } from './timeline.utils';\n\nimport style from './Timeline.module.scss';\n\nexport type ProgressStatus = 'done' | 'live' | 'future';\n\ninterface TimelineEntryProps {\n colour: string;\n delay: number;\n duration: number;\n hasLink: boolean;\n left: number;\n status: ProgressStatus;\n start: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n title: string;\n width: number;\n cue: string;\n ref?: RefObject<HTMLDivElement | null>;\n}\n\nconst formatOptions = {\n format12: 'h:mm a',\n format24: 'HH:mm',\n};\n\nexport function TimelineEntry({\n colour,\n delay,\n duration,\n hasLink,\n left,\n status,\n start,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n title,\n width,\n cue,\n ref,\n}: TimelineEntryProps) {\n const formattedStartTime = formatTime(start, formatOptions);\n const formattedDuration = formatDuration(duration);\n const delayedStart = start + delay;\n const hasDelay = delay > 0;\n\n const lighterColour = alpha(colour, 0.7);\n const showTitle = width > 25;\n const smallArea = width < 40;\n\n return (\n <div\n ref={ref}\n className={cx([style.column, smallArea && style.smallArea])}\n style={{\n '--color': colour,\n '--lighter': lighterColour ?? '',\n left: `${left}px`,\n width: `${width}px`,\n }}\n data-testid={cue}\n >\n {status === 'live' ? <ActiveBlock /> : <div data-status={status} className={style.timelineBlock} />}\n <div\n className={cx([style.content, width < 20 && style.hide, !hasLink && style.separeLeft])}\n data-status={status}\n style={{\n '--color': colour,\n }}\n >\n <div className={style.maybeInline}>\n <div className={cx([hasDelay && style.cross])}>{formattedStartTime}</div>\n {hasDelay && <div className={style.delay}>{formatTime(delayedStart, formatOptions)}</div>}\n {smallArea && (\n <TimelineEntryStatus\n delay={delay}\n start={start}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n status={status}\n />\n )}\n </div>\n {showTitle && (\n <>\n {!smallArea && (\n <TimelineEntryStatus\n delay={delay}\n start={start}\n dayOffset={dayOffset}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n status={status}\n />\n )}\n <div>{title}</div>\n </>\n )}\n </div>\n <div className={style.timeOverview} data-status={status}>\n {status !== 'done' && <div className={style.duration}>{formattedDuration}</div>}\n </div>\n </div>\n );\n}\n\ninterface TimelineEntryStatusProps {\n delay: number;\n start: number;\n dayOffset: number;\n totalGap: number;\n isLinkedToLoaded: boolean;\n status: ProgressStatus;\n}\n\n// extract component to isolate re-renders provoked by the clock changes\nfunction TimelineEntryStatus({\n delay,\n start,\n dayOffset,\n totalGap,\n isLinkedToLoaded,\n status,\n}: TimelineEntryStatusProps) {\n const state = useExpectedStartData();\n\n const { getLocalizedString } = useTranslation();\n\n const { timeToStart } = getExpectedTimesFromExtendedEvent(\n { timeStart: start, delay, dayOffset, totalGap, isLinkedToLoaded, countToEnd: false, duration: 0 },\n state,\n );\n\n let statusText = getStatusLabel(timeToStart, status);\n if (statusText === 'live') {\n statusText = getLocalizedString('timeline.live');\n } else if (statusText === 'pending') {\n statusText = getLocalizedString('timeline.due');\n }\n\n const isDue = status === 'future' && timeToStart <= 0;\n\n return <div className={cx([style.status, isDue && style.due])}>{statusText}</div>;\n}\n\n/** Generates a block level progress bar */\nfunction ActiveBlock() {\n const { current, duration } = useTimer();\n const progress = getProgress(current, duration);\n return <div data-status='live' className={style.timelineBlock} style={{ '--progress': `${progress}%` }} />;\n}\n","import { memo, useMemo, useRef } from 'react';\nimport { useViewportSize } from '@mantine/hooks';\nimport { isOntimeEvent, isPlayableEvent, OntimeEntry, PlayableEvent } from 'ontime-types';\nimport { dayInMs, getLastEvent, MILLIS_PER_HOUR } from 'ontime-utils';\n\nimport useHorizontalFollowComponent from '../../common/hooks/useHorizontalFollowComponent';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\n\nimport TimelineMarkers from './timeline-markers/TimelineMarkers';\nimport { useTimelineOptions } from './timeline.options';\nimport { calculateTimelineLayout, getEndHour, getStartHour } from './timeline.utils';\nimport { ProgressStatus, TimelineEntry } from './TimelineEntry';\n\nimport style from './Timeline.module.scss';\n\ninterface TimelineProps {\n firstStart: number;\n rundown: ExtendedEntry<OntimeEntry>[];\n selectedEventId: string | null;\n totalDuration: number;\n}\n\nexport default memo(Timeline);\nfunction Timeline({ firstStart, rundown, selectedEventId, totalDuration }: TimelineProps) {\n const { width: screenWidth } = useViewportSize();\n const { hidePast, fixedSize } = useTimelineOptions();\n const selectedRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n const { lastEvent } = getLastEvent(rundown);\n const startHour = getStartHour(firstStart);\n const endHour = getEndHour(firstStart + totalDuration + (lastEvent?.delay ?? 0));\n const scheduleStart = startHour * MILLIS_PER_HOUR;\n const scheduleEnd = endHour * MILLIS_PER_HOUR;\n\n // use horizontal follow when scroll is enabled\n useHorizontalFollowComponent({\n followRef: selectedRef,\n scrollRef: scrollContainerRef,\n doFollow: !fixedSize,\n selectedEventId: selectedEventId,\n // No offset when hiding past events to ensure content starts at 0\n leftOffset: hidePast ? 0 : screenWidth / 6,\n });\n\n const { positions, totalWidth } = useMemo(() => {\n const playableEvents = rundown\n .filter((event): event is ExtendedEntry<PlayableEvent> => isOntimeEvent(event) && isPlayableEvent(event))\n .map((event) => ({\n start: event.timeStart + (event.dayOffset ?? 0) * dayInMs + (event.delay ?? 0),\n duration: event.duration,\n }));\n\n return calculateTimelineLayout(playableEvents, scheduleStart, scheduleEnd, screenWidth, !fixedSize);\n }, [rundown, scheduleStart, scheduleEnd, screenWidth, fixedSize]);\n\n if (totalDuration === 0) {\n return null;\n }\n\n // Pre-calculate event statuses\n let currentStatus: ProgressStatus = selectedEventId ? 'done' : 'future';\n const statusMap: Record<string, ProgressStatus> = {};\n rundown.forEach((event) => {\n if (isOntimeEvent(event) && isPlayableEvent(event)) {\n if (currentStatus === 'live') {\n currentStatus = 'future';\n }\n if (event.id === selectedEventId) {\n currentStatus = 'live';\n }\n statusMap[event.id] = currentStatus;\n }\n });\n\n return (\n <div ref={scrollContainerRef} className={cx([style.timelineContainer, !fixedSize && style.scroll])}>\n <div className={style.timeline} style={{ width: totalWidth }}>\n <TimelineMarkers startHour={startHour} endHour={endHour} />\n {rundown.map((event, index) => {\n if (!isOntimeEvent(event) || !isPlayableEvent(event)) {\n return null;\n }\n\n const position = positions[index];\n if (!position) return null;\n\n return (\n <TimelineEntry\n key={event.id}\n ref={event.id === selectedEventId ? selectedRef : undefined}\n colour={event.colour}\n delay={event.delay ?? 0}\n duration={event.duration}\n hasLink={Boolean(event.linkStart)}\n left={position.left}\n status={statusMap[event.id]}\n start={event.timeStart + (event.dayOffset ?? 0) * dayInMs}\n totalGap={event.totalGap}\n isLinkedToLoaded={event.isLinkedToLoaded}\n dayOffset={event.dayOffset}\n title={event.title}\n cue={event.cue}\n width={position.width}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","import { memo } from 'react';\nimport { MaybeString } from 'ontime-types';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\ninterface SectionProps {\n category: 'now' | 'next' | 'followedBy';\n content: MaybeString;\n title: string;\n status?: string;\n}\n\nexport default memo(TimelineSection);\n\nfunction TimelineSection({ category, content, title, status }: SectionProps) {\n const sectionClasses = cx(['section', category === 'now' && 'section--now']);\n const contentClasses = cx(['section-content', content ? `section-content--${category}` : 'section-content--subdue']);\n return (\n <div className={sectionClasses} data-testid={category}>\n <div className='section-title'>\n <span className='section-title__label'>{title}</span>\n {status && <span className='section-title__status'>{status}</span>}\n </div>\n <div className={contentClasses}>{content ?? '-'}</div>\n </div>\n );\n}\n","import { OntimeEvent } from 'ontime-types';\nimport { MILLIS_PER_MINUTE } from 'ontime-utils';\n\nimport { useExpectedStartData } from '../../common/hooks/useSocket';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatDuration, getExpectedTimesFromExtendedEvent } from '../../common/utils/time';\nimport { useTranslation } from '../../translation/TranslationProvider';\n\nimport TimelineSection from './timeline-section/TimelineSection';\n\ninterface TimelineSectionsProps {\n now: ExtendedEntry<OntimeEvent> | null;\n next: ExtendedEntry<OntimeEvent> | null;\n followedBy: ExtendedEntry<OntimeEvent> | null;\n}\n\nexport default function TimelineSections({ now, next, followedBy }: TimelineSectionsProps) {\n const { getLocalizedString } = useTranslation();\n const state = useExpectedStartData();\n\n // gather card data\n const titleNow = now?.title ?? '-';\n const dueText = getLocalizedString('timeline.due').toUpperCase();\n const nextText = next !== null ? next.title : '-';\n const followedByText = followedBy !== null ? followedBy.title : '-';\n let nextStatus: string | undefined;\n let followedByStatus: string | undefined;\n\n if (next !== null) {\n const { timeToStart } = getExpectedTimesFromExtendedEvent(next, state);\n if (timeToStart <= 0) {\n nextStatus = dueText;\n } else {\n nextStatus = formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 10);\n }\n }\n\n if (followedBy !== null) {\n const { timeToStart } = getExpectedTimesFromExtendedEvent(followedBy, state);\n if (timeToStart <= 0) {\n followedByStatus = dueText;\n } else {\n followedByStatus = formatDuration(timeToStart, timeToStart > MILLIS_PER_MINUTE * 10);\n }\n }\n\n return (\n <div className='title-grid'>\n <TimelineSection title={getLocalizedString('timeline.live')} content={titleNow} category='now' />\n <TimelineSection\n title={getLocalizedString('common.next')}\n status={nextStatus}\n content={nextText}\n category='next'\n />\n <TimelineSection\n title={getLocalizedString('timeline.followedby')}\n status={followedByStatus}\n content={followedByText}\n category='followedBy'\n />\n </div>\n );\n}\n","import { OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimelineData {\n events: ExtendedEntry<OntimeEntry>[];\n projectData: ProjectData;\n settings: Settings;\n}\n\nexport function useTimelineData(): ViewData<TimelineData> {\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\n return {\n data: {\n events: rundownData,\n projectData,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\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, useSelectedEventId } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\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 Timeline from './Timeline';\nimport { getTimelineOptions } from './timeline.options';\nimport { getUpcomingEvents, useScopedRundown } from './timeline.utils';\nimport TimelineSections from './TimelineSections';\nimport { TimelineData, useTimelineData } from './useTimelineData';\n\nimport './TimelinePage.scss';\n\nexport default function TimelinePageLoader() {\n const { data, status } = useTimelineData();\n\n useWindowTitle('Timeline');\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 <TimelinePage {...data} />;\n}\n\nfunction TimelinePage({ events, projectData, settings }: TimelineData) {\n const { selectedEventId } = useSelectedEventId();\n // holds copy of the rundown with only relevant events\n const { scopedRundown, firstStart, totalDuration } = useScopedRundown(events, selectedEventId);\n\n // gather card options\n const { now, next, followedBy } = useMemo(() => {\n return getUpcomingEvents(scopedRundown, selectedEventId);\n }, [scopedRundown, selectedEventId]);\n\n // populate options\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const progressOptions = useMemo(() => getTimelineOptions(defaultFormat), [defaultFormat]);\n\n return (\n <div className='timeline' data-testid='timeline-view'>\n <ViewParamsEditor target={OntimeView.Timeline} viewOptions={progressOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <TimelineClock />\n </div>\n\n <TimelineSections now={now} next={next} followedBy={followedBy} />\n\n <Timeline\n firstStart={firstStart}\n rundown={scopedRundown}\n selectedEventId={selectedEventId}\n totalDuration={totalDuration}\n />\n </div>\n );\n}\n\nfunction TimelineClock() {\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":["getTimeFrom","current","previous","normalisedCurrentStart","dayInMs","normalisedPreviousEnd","scrollToComponent","componentRef","scrollRef","leftOffset","componentRect","scrollRect","left","useHorizontalFollowComponent","followRef","doFollow","selectedEventId","setScrollFlag","useEffect","useCallback","containerRef","offset","getTimelineOptions","timeFormat","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","isStringBoolean","useTimelineOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","getElementPosition","scheduleStart","scheduleEnd","eventStart","eventDuration","containerWidth","totalDuration","width","getStartHour","startTime","MILLIS_PER_HOUR","getEndHour","endTime","makeTimelineSections","firstHour","lastHour","timelineSections","i","getStatusLabel","timeToStart","status","formatDuration","MILLIS_PER_MINUTE","useScopedRundown","rundown","hidePast","scopedRundown","selectedIndex","firstStart","lastEntry","currentEntry","isOntimeEvent","isPlayableEvent","timeFromPrevious","isNewLatest","getUpcomingEvents","events","selectedId","now","getEventWithId","next","_a","getNextEvent","getFirstEvent","followedBy","_b","calculateTimelineLayout","canScroll","minWidth","smallestWidth","positions","start","duration","position","scale","pos","TimelineMarkers","props","startHour","endHour","elements","jsx","style","tag","formatOptions","TimelineEntry","colour","delay","hasLink","dayOffset","totalGap","isLinkedToLoaded","title","cue","ref","formattedStartTime","formatTime","formattedDuration","delayedStart","hasDelay","lighterColour","alpha","showTitle","smallArea","jsxs","cx","ActiveBlock","TimelineEntryStatus","Fragment","state","useExpectedStartData","getLocalizedString","useTranslation","getExpectedTimesFromExtendedEvent","statusText","isDue","useTimer","progress","getProgress","memo","Timeline","screenWidth","useViewportSize","fixedSize","selectedRef","useRef","scrollContainerRef","lastEvent","getLastEvent","totalWidth","playableEvents","event","currentStatus","statusMap","index","TimelineSection","category","content","sectionClasses","contentClasses","TimelineSections","titleNow","dueText","nextText","followedByText","nextStatus","followedByStatus","useTimelineData","rundownData","rundownStatus","useFlatRundownWithMetadata","projectData","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","aggregateQueryStatus","TimelinePageLoader","data","useWindowTitle","Loader","EmptyPage","TimelinePage","useSelectedEventId","defaultFormat","getDefaultFormat","progressOptions","ViewParamsEditor","OntimeView","ViewLogo","TimelineClock","clock","useClock","formattedClock","SuperscriptTime"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._blink_gfywu_1{animation:_blink_gfywu_1 1s step-start infinite}@keyframes _blink_gfywu_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_gfywu_13{transform:rotate(45deg)}._markers_gfywu_17{position:absolute;left:0;width:100%;height:100%;display:flex;justify-content:space-evenly}._markers_gfywu_17>span{flex-grow:1}._markers_gfywu_17>span:not(:first-child){border-left:1px solid rgba(255,255,255,.07)}._blink_1qyn0_1{animation:_blink_1qyn0_1 1s step-start infinite}@keyframes _blink_1qyn0_1{0%{opacity:100%}50%{opacity:20%}}._fourtyfive_1qyn0_13{transform:rotate(45deg)}._mirror_1qyn0_17{transform:rotate(180deg)}._timelineContainer_1qyn0_21{flex:1;color:var(--color-override, rgba(255, 255, 255, .8));background:var(--background-color-override, #101010)}._timelineContainer_1qyn0_21._scroll_1qyn0_26{overflow-x:scroll}._timeline_1qyn0_21{position:relative;font-weight:600;height:100%;box-shadow:inset 0 1rem 0 0 var(--card-background-color-override, rgba(255, 255, 255, .05))}._column_1qyn0_37{display:flex;flex-direction:column;position:absolute;border-left:1px solid var(--background-color-override, #101010);height:100%}._maybeInline_1qyn0_45{display:flex;align-items:center;gap:.5em;flex-wrap:wrap}._timelineBlock_1qyn0_52{height:1rem;background:color-mix(in srgb,transparent 60%,var(--background-color-override, #101010));width:100%}._timelineBlock_1qyn0_52[data-status=done]{background:#d20300}._timelineBlock_1qyn0_52[data-status=live]{background:linear-gradient(to right,#D20300 var(--progress, 0%),color-mix(in srgb,transparent 60%,var(--background-color-override, #101010)) var(--progress, 0%))}._smallArea_1qyn0_64 ._content_1qyn0_64{gap:0rem;writing-mode:vertical-rl}._smallArea_1qyn0_64 ._timeOverview_1qyn0_68{opacity:0}._hide_1qyn0_72>div{display:none}._content_1qyn0_64{flex:1;display:flex;flex-direction:column;gap:1rem;padding-top:.25rem;padding-inline-start:.25rem;overflow:hidden;line-height:1rem;background-color:var(--lighter, var(--card-background-color-override, rgba(255, 255, 255, .05)));border-bottom:2px solid var(--background-color-override, #101010);border-top:2px solid var(--background-color-override, #101010);box-shadow:0 .25rem 0 0 var(--color, #cfcfcf);text-transform:capitalize;white-space:normal}._content_1qyn0_64[data-status=done]{opacity:.4}._content_1qyn0_64[data-status=live]{box-shadow:0 .25rem #d20300}._content_1qyn0_64[data-status=live] ._status_1qyn0_98{padding:.125rem .25rem;border-radius:2px;background:#d20300;text-transform:uppercase}._content_1qyn0_64[data-status=future] ._status_1qyn0_98{padding:.125rem .25rem;border-radius:2px;background:#55b469}._content_1qyn0_64 ._status_1qyn0_98{width:fit-content}._content_1qyn0_64 ._status_1qyn0_98._due_1qyn0_112{background:#ffab33}._delay_1qyn0_116{color:#e69056}._timeOverview_1qyn0_68{padding-top:.25rem;padding-inline-start:.25em;height:3rem}._cross_1qyn0_126{text-decoration:line-through;text-decoration-thickness:2px;text-decoration-color:#e69056}._separeLeft_1qyn0_132{border-left:1px solid var(--color, #cfcfcf)}.blink{animation:blink 1s step-start infinite}@keyframes blink{0%{opacity:100%}50%{opacity:20%}}.fourtyfive{transform:rotate(45deg)}.mirror{transform:rotate(180deg)}.timeline{margin:0;box-sizing:border-box;overflow:hidden;width:100%;height:100vh;font-family:var(--font-family-override, "Open Sans", "Segoe UI", sans-serif);background:var(--background-color-override, #101010);color:var(--color-override, rgba(255, 255, 255, .8));display:flex;flex-direction:column;gap:min(2vh,16px)}.timeline .project-header{padding:min(2vh,16px) clamp(16px,2vw,24px);font-size:clamp(24px,2.5vw,48px);font-weight:600;display:flex;gap:1rem}.timeline .logo{max-width:min(200px,20vw)}.timeline .title{line-height:1.1em}.timeline .clock-container{margin-left:auto;font-weight:600}.timeline .clock-container .label{font-size:clamp(12px,1.25vw,20px);color:var(--label-color-override, rgba(255, 255, 255, .25));text-transform:uppercase}.timeline .clock-container .time{font-size:clamp(24px,2.5vw,48px);color:var(--secondary-color-override, rgba(255, 255, 255, .45));letter-spacing:.05em;line-height:.95em}.timeline .title-grid{display:grid;grid-template-columns:2fr 3fr;row-gap:1rem;column-gap:2rem;grid-template-areas:"now next" "now following";padding-inline:2rem}.timeline .section{background-color:var(--card-background-color-override, rgba(255, 255, 255, .05));padding:.5rem 1rem;display:flex;flex-direction:column;gap:.5rem;border-radius:4px}.timeline .section--now{grid-area:now}.timeline .section-title{line-height:1;font-size:clamp(15px,1.5vw,28px);display:flex;align-items:center;justify-content:space-between;font-weight:600}.timeline .section-title__label{font-size:clamp(12px,1.25vw,20px);color:var(--label-color-override, rgba(255, 255, 255, .25));text-transform:uppercase}.timeline .section-title__status{color:#55b469}.timeline .section-content{min-height:2em;line-height:1em;font-size:clamp(24px,2.5vw,48px);text-transform:uppercase;font-weight:600;max-height:2em;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.timeline .section-content--now{color:#fa5656}.timeline .section-content--followedBy .section-content--next{color:#55b469}.timeline .section-content--subdue{opacity:.4}@media (max-width: 500px){.timeline .title-grid{display:flex;flex-direction:column}}
@@ -1 +1 @@
1
- .blink{animation:blink 1s step-start infinite}@keyframes blink{0%{opacity:100%}50%{opacity:20%}}.fourtyfive{transform:rotate(45deg)}.mirror{transform:rotate(180deg)}.stage-timer{margin:0;box-sizing:border-box;overflow:hidden;width:100%;height:100vh;transition:opacity .5s ease-in-out;font-family:var(--font-family-override, "Open Sans", "Segoe UI", sans-serif);background:var(--timer-bg, var(--background-color-override, #101010));color:var(--color-override, rgba(255, 255, 255, .8));gap:min(2vh,16px);padding:min(2vh,16px) clamp(16px,2vw,24px);display:flex;flex-direction:column}.stage-timer--finished{outline:clamp(4px,1vw,16px) solid var(--timer-overtime-color-override, #FA5656);outline-offset:calc(clamp(4px,1vw,16px)*-1);transition:.5s}.stage-timer .blackout{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-color:#000;opacity:0;transition:opacity .5s}.stage-timer .blackout--active{z-index:101;opacity:1}.stage-timer .clock-container{margin-left:auto;font-weight:600;transition:opacity .5s}.stage-timer .clock-container .label{font-size:clamp(12px,1.25vw,20px);color:var(--label-color-override, rgba(255, 255, 255, .25));text-transform:uppercase}.stage-timer .clock-container .clock{font-size:clamp(24px,2.5vw,48px);color:var(--secondary-color-override, rgba(255, 255, 255, .45));letter-spacing:.05em;line-height:.95em}.stage-timer .clock-container--hidden{opacity:0}.stage-timer .event{background-color:var(--card-background-color-override, rgba(255, 255, 255, .05));padding:min(2vh,8px) clamp(16px,2vw,24px);border-radius:4px}.stage-timer .event.now{grid-area:now}.stage-timer .event.next{grid-area:next}.stage-timer .timer-container{flex:1;align-content:center;justify-self:center;align-self:center;width:100%;overflow:hidden}.stage-timer .timer-container .end-message{text-align:center;font-size:11.5vw;font-weight:600;color:var(--timer-overtime-color-override, #FA5656);padding:0;max-height:100%}.stage-timer .timer-container .timer{opacity:1;font-family:var(--timer-font, var(--font-family-override, "Open Sans", "Segoe UI", sans-serif));color:var(--timer-colour, var(--timer-color-override, #f6f6f6));line-height:.9em;text-align:center;letter-spacing:.05em;font-weight:600;transition-property:font-size;transition-duration:.5s}.stage-timer .timer-container .timer--paused{opacity:.6;transition:.5s}.stage-timer .timer-container .timer--finished{color:var(--timer-overtime-color-override, #FA5656)}.stage-timer .timer-container .timer[data-phase=warning]{color:var(--timer-colour, var(--timer-warning-color-override))}.stage-timer .timer-container .timer[data-phase=danger]{color:var(--timer-colour, var(--timer-danger-color-override))}.stage-timer .secondary{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:.125em;padding-block:.125em;font-weight:600;text-align:center;color:var(--external-color-override, rgba(255, 255, 255, .85));letter-spacing:.5px;line-height:1em;transition-property:opacity,height;transition-duration:.5s;border-top:1px solid color-mix(in srgb,var(--external-color-override, rgba(255, 255, 255, .85)) 10%,transparent)}.stage-timer .secondary--hidden{opacity:0;height:0}.stage-timer .progress-container{width:100%;margin:0 auto;opacity:1;transition:.5s}.stage-timer .progress-container--paused{opacity:.6;transition:.5s}.stage-timer .message-overlay{position:fixed;top:0;right:0;bottom:0;left:0;padding:2vw;background:var(--background-color-override, #101010);opacity:0;transition:opacity .5s}.stage-timer .message-overlay--active{z-index:100;opacity:1}.stage-timer .message{display:grid;place-content:center;height:100%;width:100%;color:var(--color-override, rgba(255, 255, 255, .8));text-align:center;font-weight:600}.stage-timer .logo{position:absolute;top:min(2vh,16px);left:clamp(16px,2vw,24px);max-width:min(200px,20vw)}@media screen and (max-width: 768px){.stage-timer .logo img{height:min(50px,10vh)}}
1
+ .blink{animation:blink 1s step-start infinite}@keyframes blink{0%{opacity:100%}50%{opacity:20%}}.fourtyfive{transform:rotate(45deg)}.mirror{transform:rotate(180deg)}.stage-timer{margin:0;box-sizing:border-box;overflow:hidden;width:100%;height:100vh;transition:opacity .5s ease-in-out;font-family:var(--font-family-override, "Open Sans", "Segoe UI", sans-serif);background:var(--timer-bg, var(--background-color-override, #101010));color:var(--color-override, rgba(255, 255, 255, .8));gap:min(2vh,16px);padding:min(2vh,16px) clamp(16px,2vw,24px);display:flex;flex-direction:column}.stage-timer--finished{outline:clamp(4px,1vw,16px) solid var(--timer-overtime-color-override, #FA5656);outline-offset:calc(clamp(4px,1vw,16px)*-1);transition:.5s}.stage-timer .blackout{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-color:#000;opacity:0;transition:opacity .5s}.stage-timer .blackout--active{z-index:101;opacity:1}.stage-timer .clock-container{margin-left:auto;font-weight:600;transition:opacity .5s}.stage-timer .clock-container .label{font-size:clamp(12px,1.25vw,20px);color:var(--label-color-override, rgba(255, 255, 255, .25));text-transform:uppercase}.stage-timer .clock-container .clock{font-size:clamp(24px,2.5vw,48px);color:var(--secondary-color-override, rgba(255, 255, 255, .45));letter-spacing:.05em;line-height:.95em}.stage-timer .clock-container--hidden{opacity:0}.stage-timer .event{background-color:var(--card-background-color-override, rgba(255, 255, 255, .05));padding:min(2vh,8px) clamp(16px,2vw,24px);border-radius:4px}.stage-timer .event.now{grid-area:now}.stage-timer .event.next{grid-area:next}.stage-timer .timer-container{flex:1;align-content:center;justify-self:center;align-self:center;width:100%;overflow:hidden}.stage-timer .timer-container .end-message{text-align:center;font-size:11.5vw;font-weight:600;color:var(--timer-overtime-color-override, #FA5656);padding:0;max-height:100%}.stage-timer .timer-container .timer{opacity:1;font-family:var(--timer-font, var(--font-family-override, "Open Sans", "Segoe UI", sans-serif));color:var(--timer-colour, var(--timer-color-override, #f6f6f6));line-height:.9em;text-align:center;letter-spacing:.05em;font-weight:600;transition-property:font-size;transition-duration:.5s}.stage-timer .timer-container .timer--paused{opacity:.6;transition:.5s}.stage-timer .timer-container .timer--finished{color:var(--timer-overtime-color-override, #FA5656)}.stage-timer .timer-container .timer[data-phase=warning]{color:var(--timer-colour, var(--timer-warning-color-override))}.stage-timer .timer-container .timer[data-phase=danger]{color:var(--timer-colour, var(--timer-danger-color-override))}.stage-timer .timer-container .timer[data-type=none]{transition:1s;opacity:0}.stage-timer .secondary{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:.125em;padding-block:.125em;font-weight:600;text-align:center;color:var(--external-color-override, rgba(255, 255, 255, .85));letter-spacing:.5px;line-height:1em;transition-property:opacity,height;transition-duration:.5s;border-top:1px solid color-mix(in srgb,var(--external-color-override, rgba(255, 255, 255, .85)) 10%,transparent)}.stage-timer .secondary--hidden{opacity:0;height:0}.stage-timer .progress-container{width:100%;margin:0 auto;opacity:1;transition:.5s}.stage-timer .progress-container--paused{opacity:.6;transition:.5s}.stage-timer .message-overlay{position:fixed;top:0;right:0;bottom:0;left:0;padding:2vw;background:var(--background-color-override, #101010);opacity:0;transition:opacity .5s}.stage-timer .message-overlay--active{z-index:100;opacity:1}.stage-timer .message{display:grid;place-content:center;height:100%;width:100%;color:var(--color-override, rgba(255, 255, 255, .8));text-align:center;font-weight:600}.stage-timer .logo{position:absolute;top:min(2vh,16px);left:clamp(16px,2vw,24px);max-width:min(200px,20vw)}@media screen and (max-width: 768px){.stage-timer .logo img{height:min(50px,10vh)}}
@@ -0,0 +1,2 @@
1
+ import{l as fe,h as T,j as o}from"./vendor-BoH5HFNN.js";import{P as he,T as u,u as ye,a as ve,b as be,L as Te,c as we,d as xe,f as Se,g as Ce,e as m,O as ke}from"./index-CDBQg2fh.js";import{g as Oe,a as Ne,b as Pe,c as je,d as Me,e as Fe,f as Ve,h as ze,i as Le,F as E}from"./timer.utils-ByC_bcT9.js";import{M as De}from"./MultiPartProgressBar-Cmw-gisu.js";import{E as Ee}from"./EmptyPage-Ct3d0DqJ.js";import{T as H}from"./TitleCard-1U35ek0D.js";import{V as He}from"./ViewLogo-BHsV7Faa.js";import{m as I,O as c,V as Ie}from"./ViewParamsEditor-BMHXOv-K.js";import{u as Be}from"./useWindowTitle-DU8NlxIu.js";import{S as Ze}from"./SuperscriptTime-Nou92D8X.js";import{m as B,i as n,g as _e,a as We}from"./viewUtils-DI8_kmUZ.js";import{g as Ae}from"./presentation.utils-B-wIv_a5.js";import{g as Ue,h as Re,s as $e,a as Ke}from"./viewLoader.utils-BPOG1xso.js";import{v as Qe}from"./validateEvent-3adKsP1N.js";import{u as qe}from"./useCustomFields-BUJkzZvM.js";import{u as Ge}from"./useProjectData-DGA6K2Zs.js";import"./playbackstate-B3BKJ8cT.js";import"./getProgress-DlrSzpnf.js";import"./Empty-C0IdV_kI.js";import"./Select-B5xNi_tM.js";/* empty css */(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="21d2aa8b-e49c-467a-bfff-96a3680b439a",s._sentryDebugIdIdentifier="sentry-dbid-21d2aa8b-e49c-467a-bfff-96a3680b439a")}catch{}})();const Je=[{value:"no-overrides",label:"No Overrides"},{value:u.CountUp,label:"Count Up"},{value:u.CountDown,label:"Count Down"},{value:u.Clock,label:"Clock"}],Xe=(s,t)=>{const e=I(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]),i=I(t,[{value:"none",label:"None"},{value:"title",label:"Title"},{value:"note",label:"Note"}]);return[{title:c.ClockOptions,collapsible:!0,options:[Ue(s)]},{title:c.TimerOptions,collapsible:!0,options:[Re,$e,{id:"timerType",title:"Timer type",description:"Override the timer type",type:"option",values:Je,defaultValue:"no-overrides"},{id:"freezeOvertime",title:"Freeze Overtime",description:"If active, the timer will not count into negative numbers",type:"boolean",defaultValue:!1},{id:"freezeMessage",title:"Freeze Message",description:"An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)",type:"string",defaultValue:"",placeholder:"e.g. Time is up!"},{id:"hidePhase",title:"Hide progress styles",description:"Whether to suppress the progress styles (warning, danger and overtime)",type:"boolean",defaultValue:!1}]},{title:c.DataSources,collapsible:!0,options:[{id:"main",title:"Main text",description:"Select the data source for the main text",type:"option",values:e,defaultValue:"title"},{id:"secondary-src",title:"Secondary text",description:"Select the data source for the secondary text",type:"option",values:i,defaultValue:"none"}]},{title:c.ElementVisibility,collapsible:!0,options:[{id:"hideClock",title:"Hide Time Now",description:"Hides the Time Now field",type:"boolean",defaultValue:!1},{id:"hideCards",title:"Hide Cards",description:"Hides the Now and Next cards",type:"boolean",defaultValue:!1},{id:"hideProgress",title:"Hide progress bar",description:"Hides the progress bar",type:"boolean",defaultValue:!1},{id:"hideMessage",title:"Hide Timer Message",description:"Prevents displaying fullscreen messages in the timer",type:"boolean",defaultValue:!1},{id:"hideSecondary",title:"Hide Auxiliary timer / Secondary message",description:"Prevents the screen from displaying the secondary timer field",type:"boolean",defaultValue:!1},{id:"hideLogo",title:"Hide the project logo",description:"Prevents the screen from displaying the given project logo",type:"boolean",defaultValue:!1}]},{title:c.StyleOverride,collapsible:!0,options:[{id:"font",title:"Font",description:"Font family, will use the fonts available in the system",type:"string",placeholder:"Open Sans (default)"},{id:"keyColour",title:"Key Colour",description:"Background or key colour for entire view. Default: #101010",type:"colour",defaultValue:"101010"},{id:"timerColour",title:"Timer Colour",description:"Timer colour. Default: #f6f6f6",type:"colour",defaultValue:"f6f6f6"}]}]};function Ye(s,t){const e=l=>(t==null?void 0:t.get(l))??s.get(l),i=Qe(e("timerType"),u.None);return{hideClock:n(e("hideClock")),hideCards:n(e("hideCards")),hideProgress:n(e("hideProgress")),hideMessage:n(e("hideMessage")),hideSecondary:n(e("hideSecondary")),hideLogo:n(e("hideLogo")),hideTimerSeconds:n(e("hideTimerSeconds")),removeLeadingZeros:!n(e("showLeadingZeros")),mainSource:e("main"),secondarySource:e("secondary-src"),timerType:i===u.None?void 0:i,freezeOvertime:n(e("freezeOvertime")),freezeMessage:e("freezeMessage")??"",hidePhase:n(e("hidePhase")),font:e("font")??void 0,keyColour:B(e("keyColour")),timerColour:B(e("timerColour"))}}function et(){const[s]=fe(),t=T.use(he);return T.useMemo(()=>{const i=t?new URLSearchParams(t.search):void 0;return Ye(s,i)},[t,s])}function tt(){const s=ye(p=>p.mirror),{data:t,status:e}=Ge(),{data:i,status:l}=ve(),{data:f,status:d}=be(),{data:r,status:a}=qe();return{data:{customFields:r,projectData:t,isMirrored:s,settings:f,viewSettings:i},status:Ke([e,l,d,a])}}function Ct(){const{data:s,status:t}=tt();return Be("Timer"),t==="pending"?o.jsx(Te,{}):t==="error"?o.jsx(Ee,{text:"There was an error fetching data, please refresh the page."}):o.jsx(ot,{...s})}function ot({customFields:s,projectData:t,isMirrored:e,settings:i,viewSettings:l}){const{eventNext:f,eventNow:d,message:r,time:a,clock:p,timerTypeNow:h,countToEndNow:w,auxTimer:y}=we(),{hideClock:Z,hideCards:_,hideProgress:W,hideMessage:A,hideSecondary:U,hideLogo:R,hideTimerSeconds:x,removeLeadingZeros:S,mainSource:$,secondarySource:K,timerType:C,freezeOvertime:k,freezeMessage:O,hidePhase:Q,font:N,keyColour:P,timerColour:q}=et(),{getLocalizedString:j}=xe(),M=j("common.minutes"),g=C??h,F=Oe(r.timer),{showEndMessage:G,showFinished:v,showWarning:J,showDanger:X}=Ne(h,w,a.phase,k,O,Q),V=Pe(a.playback),Y=!Z&&je(g),ee=!W&&Me(g),{showNow:te,nowMain:oe,nowSecondary:se,showNext:ie,nextMain:re,nextSecondary:ae}=Fe(d,f,$,K,a.playback,a.phase),ne=Ve(a.duration,a.addedTime),le=Se(p),de=_e(k,h,w,p,a,C),z=We(de,g,M,{removeSeconds:x,removeLeadingZero:S}),me=r.timer.secondarySource==="aux1"?y.aux1:r.timer.secondarySource==="aux2"?y.aux2:r.timer.secondarySource==="aux3"?y.aux3:null,b=ze(r,me,M,x,S,U),L=Ae(l,q,J,X),{timerFontSize:ce,externalFontSize:ue}=Le(z,b),pe={...P&&{"--timer-bg":P},...L&&{"--timer-colour":L},...N&&{"--timer-font":N}},D=Ce(i==null?void 0:i.timeFormat),ge=T.useMemo(()=>Xe(D,s),[s,D]);return o.jsxs("div",{"data-testid":"timer-view",className:m(["stage-timer",e&&"mirror",v&&"stage-timer--finished"]),style:pe,children:[!R&&(t==null?void 0:t.logo)&&o.jsx(He,{name:t.logo,className:"logo"}),o.jsx(Ie,{target:ke.Timer,viewOptions:ge}),o.jsx("div",{className:m(["blackout",r.timer.blackout&&"blackout--active"])}),!A&&o.jsx("div",{className:m(["message-overlay",F&&"message-overlay--active"]),children:o.jsx(E,{mode:"multi",min:32,max:256,className:m(["message",r.timer.blink&&"blink"]),children:r.timer.text})}),Y&&o.jsxs("div",{className:"clock-container",children:[o.jsx("div",{className:"label",children:j("common.time_now")}),o.jsx(Ze,{time:le,className:"clock"})]}),o.jsxs("div",{className:m(["timer-container",r.timer.blink&&!F&&"blink"]),children:[G?o.jsx(E,{mode:"multi",min:64,max:256,className:"end-message",children:O}):o.jsx("div",{className:m(["timer",!V&&"timer--paused",v&&"timer--finished"]),style:{fontSize:`${ce}vw`},"data-type":g,"data-phase":a.phase,children:z}),o.jsx("div",{className:m(["secondary",!b&&"secondary--hidden"]),style:{fontSize:`${ue}vw`},children:b})]}),ee&&o.jsx(De,{className:m(["progress-container",!V&&"progress-container--paused"]),now:a.current,complete:ne,normalColor:l.normalColor,warning:d==null?void 0:d.timeWarning,warningColor:l.warningColor,danger:d==null?void 0:d.timeDanger,dangerColor:l.dangerColor,hideOvertime:!v}),!_&&o.jsxs(o.Fragment,{children:[te&&o.jsx(H,{className:"event now",label:"now",title:oe,secondary:se}),ie&&o.jsx(H,{className:"event next",label:"next",title:re,secondary:ae})]})]})}export{Ct as default};
2
+ //# sourceMappingURL=Timer-CIr2L3gJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timer-CIr2L3gJ.js","sources":["../../src/views/timer/timer.options.ts","../../src/views/timer/useTimerData.ts","../../src/views/timer/Timer.tsx"],"sourcesContent":["import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, TimerType } from 'ontime-types';\nimport { validateTimerType } from 'ontime-utils';\n\nimport type { SelectOption } from '../../common/components/select/Select';\nimport {\n getTimeOption,\n hideTimerSeconds,\n showLeadingZeros,\n} 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, makeColourString } from '../../features/viewers/common/viewUtils';\n\n// manually match the properties of TimerType excluding the None\nconst timerDisplayOptions: SelectOption[] = [\n { value: 'no-overrides', label: 'No Overrides' },\n { value: TimerType.CountUp, label: 'Count Up' },\n { value: TimerType.CountDown, label: 'Count Down' },\n { value: TimerType.Clock, label: 'Clock' },\n];\n\nexport const getTimerOptions = (timeFormat: string, customFields: CustomFields): ViewOption[] => {\n const mainOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'title', label: 'Title' },\n { value: 'note', label: 'Note' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.TimerOptions,\n collapsible: true,\n options: [\n hideTimerSeconds,\n showLeadingZeros,\n {\n id: 'timerType',\n title: 'Timer type',\n description: 'Override the timer type',\n type: 'option',\n values: timerDisplayOptions,\n defaultValue: 'no-overrides',\n },\n {\n id: 'freezeOvertime',\n title: 'Freeze Overtime',\n description: 'If active, the timer will not count into negative numbers',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'freezeMessage',\n title: 'Freeze Message',\n description:\n 'An optional message to show when the timer is in overtime (must be set in combination with Freeze Overtime)',\n type: 'string',\n defaultValue: '',\n placeholder: 'e.g. Time is up!',\n },\n {\n id: 'hidePhase',\n title: 'Hide progress styles',\n description: 'Whether to suppress the progress styles (warning, danger and overtime)',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'main',\n title: 'Main text',\n description: 'Select the data source for the main text',\n type: 'option',\n values: mainOptions,\n defaultValue: 'title',\n },\n {\n id: 'secondary-src',\n title: 'Secondary text',\n description: 'Select the data source for the secondary text',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'hideClock',\n title: 'Hide Time Now',\n description: 'Hides the Time Now field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideCards',\n title: 'Hide Cards',\n description: 'Hides the Now and Next cards',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideProgress',\n title: 'Hide progress bar',\n description: 'Hides the progress bar',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideMessage',\n title: 'Hide Timer Message',\n description: 'Prevents displaying fullscreen messages in the timer',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideSecondary',\n title: 'Hide Auxiliary timer / Secondary message',\n description: 'Prevents the screen from displaying the secondary timer field',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'hideLogo',\n title: 'Hide the project logo',\n description: 'Prevents the screen from displaying the given project logo',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.StyleOverride,\n collapsible: true,\n options: [\n {\n id: 'font',\n title: 'Font',\n description: 'Font family, will use the fonts available in the system',\n type: 'string',\n placeholder: 'Open Sans (default)',\n },\n {\n id: 'keyColour',\n title: 'Key Colour',\n description: 'Background or key colour for entire view. Default: #101010',\n type: 'colour',\n defaultValue: '101010',\n },\n {\n id: 'timerColour',\n title: 'Timer Colour',\n description: 'Timer colour. Default: #f6f6f6',\n type: 'colour',\n defaultValue: 'f6f6f6',\n },\n ],\n },\n ];\n};\n\ntype TimerOptions = {\n hideClock: boolean;\n hideCards: boolean;\n hideProgress: boolean;\n hideMessage: boolean;\n hideSecondary: boolean;\n hideLogo: boolean;\n hideTimerSeconds: boolean;\n removeLeadingZeros: boolean;\n mainSource: keyof OntimeEvent | null;\n secondarySource: keyof OntimeEvent | null;\n timerType?: TimerType;\n freezeOvertime: boolean;\n freezeMessage: string;\n hidePhase: boolean;\n font?: string;\n keyColour?: string;\n timerColour?: string;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallbacks are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): TimerOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Get timerType from either source\n const timerType = validateTimerType(getValue('timerType'), TimerType.None);\n\n return {\n hideClock: isStringBoolean(getValue('hideClock')),\n hideCards: isStringBoolean(getValue('hideCards')),\n hideProgress: isStringBoolean(getValue('hideProgress')),\n hideMessage: isStringBoolean(getValue('hideMessage')),\n hideSecondary: isStringBoolean(getValue('hideSecondary')),\n hideLogo: isStringBoolean(getValue('hideLogo')),\n hideTimerSeconds: isStringBoolean(getValue('hideTimerSeconds')),\n removeLeadingZeros: !isStringBoolean(getValue('showLeadingZeros')),\n\n mainSource: getValue('main') as keyof OntimeEvent | null,\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n\n // none doesnt make sense as a configuration of the view\n timerType: timerType === TimerType.None ? undefined : timerType,\n freezeOvertime: isStringBoolean(getValue('freezeOvertime')),\n freezeMessage: getValue('freezeMessage') ?? '',\n hidePhase: isStringBoolean(getValue('hidePhase')),\n\n font: getValue('font') ?? undefined,\n keyColour: makeColourString(getValue('keyColour')),\n timerColour: makeColourString(getValue('timerColour')),\n };\n}\n\n/**\n * Hook exposes the timer view options\n */\nexport function useTimerOptions(): TimerOptions {\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 { CustomFields, ProjectData, Settings, ViewSettings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport useViewSettings from '../../common/hooks-query/useViewSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface TimerData {\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n viewSettings: ViewSettings;\n}\n\nexport function useTimerData(): ViewData<TimerData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: viewSettings, status: viewSettingsStatus } = useViewSettings();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n customFields,\n projectData,\n isMirrored,\n settings,\n viewSettings,\n },\n status: aggregateQueryStatus([projectDataStatus, viewSettingsStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useMemo } from 'react';\nimport { OntimeView } from 'ontime-types';\n\nimport { FitText } from '../../common/components/fit-text/FitText';\nimport MultiPartProgressBar from '../../common/components/multi-part-progress-bar/MultiPartProgressBar';\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 { useTimerSocket } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getFormattedTimer, getTimerByType } from '../../features/viewers/common/viewUtils';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport { getTimerColour } from '../utils/presentation.utils';\n\nimport { getTimerOptions, useTimerOptions } from './timer.options';\nimport {\n getCardData,\n getEstimatedFontSize,\n getIsPlaying,\n getSecondaryDisplay,\n getShowClock,\n getShowMessage,\n getShowModifiers,\n getShowProgressBar,\n getTotalTime,\n} from './timer.utils';\nimport { TimerData, useTimerData } from './useTimerData';\n\nimport './Timer.scss';\n\nexport default function TimerLoader() {\n const { data, status } = useTimerData();\n\n useWindowTitle('Timer');\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 <Timer {...data} />;\n}\n\nfunction Timer({ customFields, projectData, isMirrored, settings, viewSettings }: TimerData) {\n const { eventNext, eventNow, message, time, clock, timerTypeNow, countToEndNow, auxTimer } = useTimerSocket();\n const {\n hideClock,\n hideCards,\n hideProgress,\n hideMessage,\n hideSecondary,\n hideLogo,\n hideTimerSeconds,\n removeLeadingZeros,\n mainSource,\n secondarySource,\n timerType,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n font,\n keyColour,\n timerColour,\n } = useTimerOptions();\n\n const { getLocalizedString } = useTranslation();\n const localisedMinutes = getLocalizedString('common.minutes');\n\n // gather modifiers\n const viewTimerType = timerType ?? timerTypeNow;\n const showOverlay = getShowMessage(message.timer);\n const { showEndMessage, showFinished, showWarning, showDanger } = getShowModifiers(\n timerTypeNow,\n countToEndNow,\n time.phase,\n freezeOvertime,\n freezeMessage,\n hidePhase,\n );\n const isPlaying = getIsPlaying(time.playback);\n const showClock = !hideClock && getShowClock(viewTimerType);\n const showProgressBar = !hideProgress && getShowProgressBar(viewTimerType);\n\n // gather card data\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n mainSource,\n secondarySource,\n time.playback,\n time.phase,\n );\n\n // gather timer data\n const totalTime = getTotalTime(time.duration, time.addedTime);\n const formattedClock = formatTime(clock);\n const stageTimer = getTimerByType(freezeOvertime, timerTypeNow, countToEndNow, clock, time, timerType);\n const display = getFormattedTimer(stageTimer, viewTimerType, localisedMinutes, {\n removeSeconds: hideTimerSeconds,\n removeLeadingZero: removeLeadingZeros,\n });\n\n const currentAux = (() => {\n if (message.timer.secondarySource === 'aux1') {\n return auxTimer.aux1;\n }\n if (message.timer.secondarySource === 'aux2') {\n return auxTimer.aux2;\n }\n if (message.timer.secondarySource === 'aux3') {\n return auxTimer.aux3;\n }\n return null;\n })();\n\n const secondaryContent = getSecondaryDisplay(\n message,\n currentAux,\n localisedMinutes,\n hideTimerSeconds,\n removeLeadingZeros,\n hideSecondary,\n );\n\n // gather presentation styles\n const resolvedTimerColour = getTimerColour(viewSettings, timerColour, showWarning, showDanger);\n const { timerFontSize, externalFontSize } = getEstimatedFontSize(display, secondaryContent);\n const userStyles = {\n ...(keyColour && { '--timer-bg': keyColour }),\n ...(resolvedTimerColour && { '--timer-colour': resolvedTimerColour }),\n ...(font && { '--timer-font': font }),\n };\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const timerOptions = useMemo(() => getTimerOptions(defaultFormat, customFields), [customFields, defaultFormat]);\n\n return (\n <div\n data-testid='timer-view'\n className={cx(['stage-timer', isMirrored && 'mirror', showFinished && 'stage-timer--finished'])}\n style={userStyles}\n >\n {!hideLogo && projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n\n <ViewParamsEditor target={OntimeView.Timer} viewOptions={timerOptions} />\n\n <div className={cx(['blackout', message.timer.blackout && 'blackout--active'])} />\n\n {!hideMessage && (\n <div className={cx(['message-overlay', showOverlay && 'message-overlay--active'])}>\n <FitText mode='multi' min={32} max={256} className={cx(['message', message.timer.blink && 'blink'])}>\n {message.timer.text}\n </FitText>\n </div>\n )}\n\n {showClock && (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='clock' />\n </div>\n )}\n\n <div className={cx(['timer-container', message.timer.blink && !showOverlay && 'blink'])}>\n {showEndMessage ? (\n <FitText mode='multi' min={64} max={256} className='end-message'>\n {freezeMessage}\n </FitText>\n ) : (\n <div\n className={cx(['timer', !isPlaying && 'timer--paused', showFinished && 'timer--finished'])}\n style={{ fontSize: `${timerFontSize}vw` }}\n data-type={viewTimerType}\n data-phase={time.phase}\n >\n {display}\n </div>\n )}\n <div\n className={cx(['secondary', !secondaryContent && 'secondary--hidden'])}\n style={{ fontSize: `${externalFontSize}vw` }}\n >\n {secondaryContent}\n </div>\n </div>\n\n {showProgressBar && (\n <MultiPartProgressBar\n className={cx(['progress-container', !isPlaying && 'progress-container--paused'])}\n now={time.current}\n complete={totalTime}\n normalColor={viewSettings.normalColor}\n warning={eventNow?.timeWarning}\n warningColor={viewSettings.warningColor}\n danger={eventNow?.timeDanger}\n dangerColor={viewSettings.dangerColor}\n hideOvertime={!showFinished}\n />\n )}\n\n {!hideCards && (\n <>\n {showNow && <TitleCard className='event now' label='now' title={nowMain} secondary={nowSecondary} />}\n {showNext && <TitleCard className='event next' label='next' title={nextMain} secondary={nextSecondary} />}\n </>\n )}\n </div>\n );\n}\n"],"names":["timerDisplayOptions","TimerType","getTimerOptions","timeFormat","customFields","mainOptions","makeOptionsFromCustomFields","secondaryOptions","OptionTitle","getTimeOption","hideTimerSeconds","showLeadingZeros","getOptionsFromParams","searchParams","defaultValues","getValue","key","timerType","validateTimerType","isStringBoolean","makeColourString","useTimerOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","useTimerData","isMirrored","useViewOptionsStore","state","projectData","projectDataStatus","useProjectData","viewSettings","viewSettingsStatus","useViewSettings","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","TimerLoader","data","status","useWindowTitle","Loader","jsx","EmptyPage","Timer","eventNext","eventNow","message","time","clock","timerTypeNow","countToEndNow","auxTimer","useTimerSocket","hideClock","hideCards","hideProgress","hideMessage","hideSecondary","hideLogo","removeLeadingZeros","mainSource","secondarySource","freezeOvertime","freezeMessage","hidePhase","font","keyColour","timerColour","getLocalizedString","useTranslation","localisedMinutes","viewTimerType","showOverlay","getShowMessage","showEndMessage","showFinished","showWarning","showDanger","getShowModifiers","isPlaying","getIsPlaying","showClock","getShowClock","showProgressBar","getShowProgressBar","showNow","nowMain","nowSecondary","showNext","nextMain","nextSecondary","getCardData","totalTime","getTotalTime","formattedClock","formatTime","stageTimer","getTimerByType","display","getFormattedTimer","currentAux","secondaryContent","getSecondaryDisplay","resolvedTimerColour","getTimerColour","timerFontSize","externalFontSize","getEstimatedFontSize","userStyles","defaultFormat","getDefaultFormat","timerOptions","jsxs","cx","ViewLogo","ViewParamsEditor","OntimeView","FitText","SuperscriptTime","MultiPartProgressBar","Fragment","TitleCard"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{h as w,j as t,ay as Q,bJ as Y,T as Z,av as tt,y as st,bK as $,bL as q,bM as E,bN as et,bO as at,bP as nt}from"./vendor-BoH5HFNN.js";import{C as it}from"./EditorUtils-Bd3J5Dvf.js";import{h as n,y as T,e as z,I as ot,bF as c,bG as lt,bH as P,bI as h,bJ as I,bK as rt,m as g,bk as A,K as ct,k as S,s as dt,bL as mt,ax as ut,bz as xt,b8 as pt,bA as _t}from"./index-CDBQg2fh.js";import{P as bt}from"./ProtectRoute-Ci_AIozP.js";import{T as M,A as ht}from"./TimeInput-Bu_5GlHP.js";import{p as L}from"./parseUserTime-Cp5iWS7y.js";import{T as R}from"./Tooltip-B8y25e3n.js";import{u as yt}from"./useReport-BUCsRa2T.js";import{s as B}from"./Editor.module-DvV2efYs.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new s.Error().stack;e&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[e]="87c03242-a5c5-4d9d-b53e-c12625ed33f5",s._sentryDebugIdIdentifier="sentry-dbid-87c03242-a5c5-4d9d-b53e-c12625ed33f5")}catch{}})();function jt(s,e){return{start:s!==n.Stop&&s!==n.Play,pause:s===n.Play,roll:s!==n.Roll&&e!==T.Overtime,stop:s!==n.Stop,reload:s!==n.Stop&&s!==n.Roll}}const ft="_blink_yewzx_1",vt="_fourtyfive_yewzx_13",gt="_tapButton_yewzx_17",kt="_neutral_yewzx_29",Ct="_active_yewzx_51",Nt="_play_yewzx_66",Tt="_roll_yewzx_93",wt="_pause_yewzx_120",It="_ontime_yewzx_147",Pt="_stop_yewzx_174",At="_square_yewzx_201",St="_tight_yewzx_206",Rt="_fill_yewzx_211",f={blink:ft,fourtyfive:vt,tapButton:gt,neutral:kt,active:Ct,play:Nt,roll:Tt,pause:wt,ontime:It,stop:Pt,square:At,tight:St,fill:Rt},r=w.forwardRef((s,e)=>{const{children:a,disabled:i,onClick:l,theme:o="neutral",aspect:m="normal",active:u,className:x}=s;return t.jsx("button",{className:z([f.tapButton,x,f[o],f[m],u&&f.active]),disabled:i,type:"button",onClick:l,ref:e,children:a})});r.displayName="TabButton";const Bt="_addTime_18oax_17",Dt="_addButtons_18oax_24",$t="_tallButtons_18oax_30",v={addTime:Bt,addButtons:Dt,tallButtons:$t};function qt(s){const{playback:e}=s,[a,i]=Q({key:"add-time",defaultValue:3e5}),l=(x,k)=>{const _=L(k);i(Math.min(_,ot))},o=x=>{x==="add"?c.addTime(a):c.addTime(-1*a)},u=!(e===n.Play||e===n.Pause)||a===0;return t.jsxs("div",{className:v.addTime,children:[t.jsx(M,{name:"addtime",submitHandler:l,time:a,placeholder:"Add time"}),t.jsxs("div",{className:v.addButtons,children:[t.jsx(r,{onClick:()=>o("remove"),disabled:u,className:v.tallButtons,children:t.jsx(Y,{})}),t.jsx(r,{onClick:()=>o("add"),disabled:u,className:v.tallButtons,children:t.jsx(Z,{})})]})]})}const Et="_label_tat6w_17",zt="_controls_tat6w_24",Mt="_input_tat6w_28",Lt="_twoSides_tat6w_34",Ft="_fakeInput_tat6w_42",y={label:Et,controls:zt,input:Mt,twoSides:Lt,fakeInput:Ft};function C({index:s}){const{playback:e,direction:a}=lt(s),{stop:i,setDirection:l}=I,o=()=>{const x=a===h.CountDown?h.CountUp:h.CountDown;l(s,x)},m=e!==P.Stop,u=e===P.Start?"pause":"play";return t.jsxs("label",{className:y.label,children:["Aux Timer ",s,t.jsxs("div",{className:y.controls,children:[t.jsxs("div",{className:y.input,children:[t.jsx(Ot,{index:s,isActive:m}),t.jsxs(r,{onClick:o,aspect:"tight",disabled:m,children:[a===h.CountDown&&t.jsx(tt,{"data-testid":`aux-timer-direction-${s}`}),a===h.CountUp&&t.jsx(st,{"data-testid":`aux-timer-direction-${s}`})]})]}),t.jsxs("div",{className:y.twoSides,children:[t.jsx(Ut,{index:s,action:u}),t.jsx(r,{onClick:()=>i(s),theme:n.Stop,disabled:!m,children:t.jsx($,{"data-testid":`aux-timer-stop-${s}`})})]})]})]})}function Ot({index:s,isActive:e}){const a=rt(s),{setDuration:i}=I,l=(o,m)=>{const u=L(m);i(s,u)};return e?t.jsx("div",{className:y.fakeInput,"data-testid":`time-label-aux${s}`,children:g(a)}):t.jsx(M,{submitHandler:l,name:`aux${s}`,time:a,placeholder:`Aux ${s}`})}function Ut({index:s,action:e}){const{start:a,pause:i}=I;return e==="play"?t.jsx(r,{onClick:()=>a(s),theme:n.Play,children:t.jsx(q,{"data-testid":`aux-timer-start-${s}`})}):t.jsx(r,{onClick:()=>i(s),theme:n.Pause,children:t.jsx(E,{"data-testid":`aux-timer-pause-${s}`})})}const Ht="_buttonContainer_1mqxq_17",Xt="_go_1mqxq_25",Gt="_playbackContainer_1mqxq_30",Kt="_transportContainer_1mqxq_37",Jt="_extra_1mqxq_44",Vt="_invertX_1mqxq_51",p={buttonContainer:Ht,go:Xt,playbackContainer:Gt,transportContainer:Kt,extra:Jt,invertX:Vt};function Wt(s){const{playback:e,numEvents:a,selectedEventIndex:i,timerPhase:l}=s,o=e===n.Roll,m=e===n.Play,u=e===n.Pause,x=e===n.Armed,k=i===0,_=i===a-1,j=a===0,F=o||j,O=o||j||_,U=o||j||k,b=jt(e,l),H=!b.start,X=!b.pause,G=!b.roll||j,K=!b.stop,J=!b.reload,[V,W]=w.useMemo(()=>x?[c.start,"Start"]:_?[c.stop,"Finish"]:i===null?[c.startNext,"Start"]:[c.startNext,"Next"],[x,_,i]);return t.jsxs("div",{className:p.buttonContainer,children:[t.jsx(r,{disabled:F,onClick:V,aspect:"fill",className:p.go,children:W}),t.jsxs("div",{className:p.playbackContainer,children:[t.jsx(r,{onClick:c.start,disabled:H,theme:n.Play,active:m,children:t.jsx(q,{})}),t.jsx(r,{onClick:c.pause,disabled:X,theme:n.Pause,active:u,children:t.jsx(E,{})})]}),t.jsxs("div",{className:p.transportContainer,children:[t.jsx(r,{onClick:c.previous,disabled:U,children:t.jsx(et,{})}),t.jsx(r,{onClick:c.next,disabled:O,children:t.jsx(at,{})})]}),t.jsxs("div",{className:p.extra,children:[t.jsx(r,{onClick:c.roll,disabled:G,theme:n.Roll,active:o,children:"Roll"}),t.jsx(r,{onClick:c.reload,disabled:J,children:t.jsx(nt,{className:p.invertX})}),t.jsx(r,{onClick:c.stop,disabled:K,theme:n.Stop,children:t.jsx($,{})})]})]})}const Qt="_timer_1f17d_21",Yt="_finished_1f17d_33",Zt="_muted_1f17d_36",N={timer:Qt,finished:Yt,muted:Zt};function ts(s){const{time:e}=s,a=(e??0)<0,i=e==null?A:g(e,{fallback:A}).replace("-",""),l=z([N.timer,a?N.finished:null,e===null&&N.muted]);return t.jsx("div",{className:l,children:i})}const ss="_timeContainer_b9r86_17",es="_indicators_b9r86_25",as="_indicatorRoll_b9r86_34",ns="_indicatorDelay_b9r86_35",is="_indicatorNegative_b9r86_36",os="_status_b9r86_65",ls="_tag_b9r86_72",rs="_time_b9r86_17",cs="_rolltag_b9r86_84",d={timeContainer:ss,indicators:es,indicatorRoll:as,indicatorDelay:ns,indicatorNegative:is,status:os,tag:ls,time:rs,rolltag:cs};function ds(s){return s>0?`Added ${S(s,!1)}`:s<0?`Removed ${S(Math.abs(s),!1)}`:""}function ms({children:s}){const e=ct(),a=e.playback===n.Roll,i=e.phase===T.Pending,l=e.phase===T.Overtime,o=!!e.addedTime,m=a?"Roll mode active":"",u=ds(e.addedTime);return t.jsxs("div",{className:d.timeContainer,children:[t.jsxs("div",{className:d.indicators,children:[t.jsx(R,{text:m,render:t.jsx("div",{}),className:d.indicatorRoll,"data-active":a}),t.jsx("div",{className:d.indicatorNegative,"data-active":l}),t.jsx(R,{text:u,render:t.jsx("div",{}),className:d.indicatorDelay,"data-active":o})]}),t.jsx(ts,{time:i?e.secondaryTimer:e.current}),t.jsx("div",{className:d.status,children:i?t.jsx("span",{className:d.rolltag,children:"Roll: Countdown to start"}):t.jsx(us,{startedAt:e.startedAt,expectedFinish:e.expectedFinish,playback:e.playback})}),s]})}function us({startedAt:s,expectedFinish:e,playback:a}){if(a===n.Stop)return t.jsx(xs,{});const i=g(s),l=e!==null?e%dt:null,o=g(l);return t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:d.start,children:[t.jsx("span",{className:d.tag,children:"Started at"}),t.jsx("span",{className:d.time,children:i})]}),t.jsxs("span",{className:d.finish,children:[t.jsx("span",{className:d.tag,children:"Expect end"}),t.jsx("span",{className:d.time,children:o})]})]})}function xs(){const{data:s}=yt();return Object.keys(s).length>0?t.jsx(ht,{search:"settings=sharing__report",children:"Go to report management"}):null}const ps="_mainContainer_1qlxm_17",_s="_auxTimers_1qlxm_22",D={mainContainer:ps,auxTimers:_s};function bs(){const s=mt();return t.jsxs("div",{className:D.mainContainer,children:[t.jsx(ms,{children:t.jsx(qt,{playback:s.playback})}),t.jsx(Wt,{playback:s.playback,numEvents:s.numEvents,selectedEventIndex:s.selectedEventIndex,timerPhase:s.timerPhase}),t.jsxs("div",{className:D.auxTimers,children:[t.jsx(C,{index:1}),t.jsx(C,{index:2}),t.jsx(C,{index:3})]})]})}const ws=w.memo(hs);function hs(){const s=window.location.pathname.includes("/timercontrol");return t.jsx(bt,{permission:"editor",children:t.jsxs("div",{className:B.playback,"data-testid":"panel-timer-control",children:[!s&&t.jsx(it,{onClick:e=>ut("timercontrol",e)}),s&&t.jsx(xt,{suppressSettings:!0,isNavigationLocked:pt()}),t.jsx("div",{className:B.content,children:t.jsx(_t,{children:t.jsx(bs,{})})})]})})}export{ws as default};
2
+ //# sourceMappingURL=TimerControlExport-4a3Cd9x8.js.map