@getontime/cli 4.0.0 → 4.0.2

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 (331) hide show
  1. package/client/assets/{Backstage-ZSqb8OU6.js → Backstage-CAjkmeJm.js} +2 -2
  2. package/client/assets/Backstage-CAjkmeJm.js.br +0 -0
  3. package/client/assets/Backstage-CAjkmeJm.js.gz +0 -0
  4. package/client/assets/{Backstage-ZSqb8OU6.js.map → Backstage-CAjkmeJm.js.map} +1 -1
  5. package/client/assets/{Countdown-DVRZbeRP.js → Countdown-ChuA9az_.js} +2 -2
  6. package/client/assets/Countdown-ChuA9az_.js.br +0 -0
  7. package/client/assets/Countdown-ChuA9az_.js.gz +0 -0
  8. package/client/assets/{Countdown-DVRZbeRP.js.map → Countdown-ChuA9az_.js.map} +1 -1
  9. package/client/assets/{CustomTranslationModal-D_Cy0d_H.js → CustomTranslationModal-C3R_2T5s.js} +2 -2
  10. package/client/assets/CustomTranslationModal-C3R_2T5s.js.br +0 -0
  11. package/client/assets/CustomTranslationModal-C3R_2T5s.js.gz +0 -0
  12. package/client/assets/{CustomTranslationModal-D_Cy0d_H.js.map → CustomTranslationModal-C3R_2T5s.js.map} +1 -1
  13. package/client/assets/{DelayIndicator-B_JKLKYW.js → DelayIndicator-vT7n8ypf.js} +2 -2
  14. package/client/assets/DelayIndicator-vT7n8ypf.js.br +0 -0
  15. package/client/assets/DelayIndicator-vT7n8ypf.js.gz +0 -0
  16. package/client/assets/{DelayIndicator-B_JKLKYW.js.map → DelayIndicator-vT7n8ypf.js.map} +1 -1
  17. package/client/assets/{EditorFeatureWrapper-DzBxDvRn.js → EditorFeatureWrapper-DHfuO3EA.js} +2 -2
  18. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.br +0 -0
  19. package/client/assets/EditorFeatureWrapper-DHfuO3EA.js.gz +0 -0
  20. package/client/assets/{EditorFeatureWrapper-DzBxDvRn.js.map → EditorFeatureWrapper-DHfuO3EA.js.map} +1 -1
  21. package/client/assets/{EditorUtils-De0umjb-.js → EditorUtils-Da5ALK1P.js} +2 -2
  22. package/client/assets/EditorUtils-Da5ALK1P.js.br +0 -0
  23. package/client/assets/EditorUtils-Da5ALK1P.js.gz +0 -0
  24. package/client/assets/{EditorUtils-De0umjb-.js.map → EditorUtils-Da5ALK1P.js.map} +1 -1
  25. package/client/assets/{Empty-BYF0tVRk.js → Empty-gWT_HMeu.js} +2 -2
  26. package/client/assets/Empty-gWT_HMeu.js.br +0 -0
  27. package/client/assets/Empty-gWT_HMeu.js.gz +0 -0
  28. package/client/assets/{Empty-BYF0tVRk.js.map → Empty-gWT_HMeu.js.map} +1 -1
  29. package/client/assets/{EmptyPage-DYH2bswA.js → EmptyPage-Dcbg6rmF.js} +2 -2
  30. package/client/assets/EmptyPage-Dcbg6rmF.js.br +0 -0
  31. package/client/assets/EmptyPage-Dcbg6rmF.js.gz +0 -0
  32. package/client/assets/{EmptyPage-DYH2bswA.js.map → EmptyPage-Dcbg6rmF.js.map} +1 -1
  33. package/client/assets/{FollowButton-DyWsvyFF.js → FollowButton-CSqJSvix.js} +2 -2
  34. package/client/assets/FollowButton-CSqJSvix.js.br +0 -0
  35. package/client/assets/FollowButton-CSqJSvix.js.gz +0 -0
  36. package/client/assets/{FollowButton-DyWsvyFF.js.map → FollowButton-CSqJSvix.js.map} +1 -1
  37. package/client/assets/{MessageControlExport-yLGU2dMq.js → MessageControlExport-lXK21piH.js} +2 -2
  38. package/client/assets/MessageControlExport-lXK21piH.js.br +0 -0
  39. package/client/assets/MessageControlExport-lXK21piH.js.gz +0 -0
  40. package/client/assets/{MessageControlExport-yLGU2dMq.js.map → MessageControlExport-lXK21piH.js.map} +1 -1
  41. package/client/assets/{MilestoneEditor-GkzJ-h1C.js → MilestoneEditor-Bge8xLrV.js} +2 -2
  42. package/client/assets/MilestoneEditor-Bge8xLrV.js.br +0 -0
  43. package/client/assets/MilestoneEditor-Bge8xLrV.js.gz +0 -0
  44. package/client/assets/{MilestoneEditor-GkzJ-h1C.js.map → MilestoneEditor-Bge8xLrV.js.map} +1 -1
  45. package/client/assets/{Modal-BKL-5GzU.js → Modal-C2sFA0zf.js} +2 -2
  46. package/client/assets/Modal-C2sFA0zf.js.br +0 -0
  47. package/client/assets/Modal-C2sFA0zf.js.gz +0 -0
  48. package/client/assets/{Modal-BKL-5GzU.js.map → Modal-C2sFA0zf.js.map} +1 -1
  49. package/client/assets/{MultiPartProgressBar-BITERKS0.js → MultiPartProgressBar-D3jJZjb5.js} +2 -2
  50. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.br +0 -0
  51. package/client/assets/MultiPartProgressBar-D3jJZjb5.js.gz +0 -0
  52. package/client/assets/{MultiPartProgressBar-BITERKS0.js.map → MultiPartProgressBar-D3jJZjb5.js.map} +1 -1
  53. package/client/assets/{OperatorExport-DMZ6eQfT.js → OperatorExport-BUhxjLUx.js} +2 -2
  54. package/client/assets/OperatorExport-BUhxjLUx.js.br +0 -0
  55. package/client/assets/OperatorExport-BUhxjLUx.js.gz +0 -0
  56. package/client/assets/{OperatorExport-DMZ6eQfT.js.map → OperatorExport-BUhxjLUx.js.map} +1 -1
  57. package/client/assets/{OverviewWrapper-riM6vPno.js → OverviewWrapper-BveJ6GjK.js} +2 -2
  58. package/client/assets/OverviewWrapper-BveJ6GjK.js.br +0 -0
  59. package/client/assets/OverviewWrapper-BveJ6GjK.js.gz +0 -0
  60. package/client/assets/{OverviewWrapper-riM6vPno.js.map → OverviewWrapper-BveJ6GjK.js.map} +1 -1
  61. package/client/assets/{ProjectInfo-DxtMq70a.js → ProjectInfo-z4k3cipS.js} +2 -2
  62. package/client/assets/ProjectInfo-z4k3cipS.js.br +0 -0
  63. package/client/assets/ProjectInfo-z4k3cipS.js.gz +0 -0
  64. package/client/assets/{ProjectInfo-DxtMq70a.js.map → ProjectInfo-z4k3cipS.js.map} +1 -1
  65. package/client/assets/{ProtectRoute-p1fmtLeu.js → ProtectRoute-CrcWfOlG.js} +2 -2
  66. package/client/assets/ProtectRoute-CrcWfOlG.js.br +0 -0
  67. package/client/assets/ProtectRoute-CrcWfOlG.js.gz +0 -0
  68. package/client/assets/{ProtectRoute-p1fmtLeu.js.map → ProtectRoute-CrcWfOlG.js.map} +1 -1
  69. package/client/assets/{ProtectedCuesheet-CvRnqT0z.js → ProtectedCuesheet-Deo4Aw6f.js} +2 -2
  70. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.br +0 -0
  71. package/client/assets/ProtectedCuesheet-Deo4Aw6f.js.gz +0 -0
  72. package/client/assets/{ProtectedCuesheet-CvRnqT0z.js.map → ProtectedCuesheet-Deo4Aw6f.js.map} +1 -1
  73. package/client/assets/{ProtectedEditor-D4UXj1xL.js → ProtectedEditor-C_SYWpL2.js} +3 -3
  74. package/client/assets/ProtectedEditor-C_SYWpL2.js.br +0 -0
  75. package/client/assets/ProtectedEditor-C_SYWpL2.js.gz +0 -0
  76. package/client/assets/{ProtectedEditor-D4UXj1xL.js.map → ProtectedEditor-C_SYWpL2.js.map} +1 -1
  77. package/client/assets/{RundownEntry-B1dSz1wu.js → RundownEntry-D61IqkXb.js} +2 -2
  78. package/client/assets/RundownEntry-D61IqkXb.js.br +0 -0
  79. package/client/assets/RundownEntry-D61IqkXb.js.gz +0 -0
  80. package/client/assets/{RundownEntry-B1dSz1wu.js.map → RundownEntry-D61IqkXb.js.map} +1 -1
  81. package/client/assets/RundownExport-1zBZurIG.css +1 -0
  82. package/client/assets/RundownExport-1zBZurIG.css.br +0 -0
  83. package/client/assets/RundownExport-1zBZurIG.css.gz +0 -0
  84. package/client/assets/{RundownExport-WjLpncYT.js → RundownExport-C6YhMGOC.js} +3 -3
  85. package/client/assets/RundownExport-C6YhMGOC.js.br +0 -0
  86. package/client/assets/RundownExport-C6YhMGOC.js.gz +0 -0
  87. package/client/assets/{RundownExport-WjLpncYT.js.map → RundownExport-C6YhMGOC.js.map} +1 -1
  88. package/client/assets/{Select-niU9Razm.js → Select-CedN80WS.js} +2 -2
  89. package/client/assets/Select-CedN80WS.js.br +0 -0
  90. package/client/assets/Select-CedN80WS.js.gz +0 -0
  91. package/client/assets/{Select-niU9Razm.js.map → Select-CedN80WS.js.map} +1 -1
  92. package/client/assets/{Studio-CWdJq4bx.js → Studio-DUzPBS6P.js} +2 -2
  93. package/client/assets/Studio-DUzPBS6P.js.br +0 -0
  94. package/client/assets/Studio-DUzPBS6P.js.gz +0 -0
  95. package/client/assets/{Studio-CWdJq4bx.js.map → Studio-DUzPBS6P.js.map} +1 -1
  96. package/client/assets/{StyleEditor-BIFjHsgD.js → StyleEditor-D2z65PB7.js} +2 -2
  97. package/client/assets/StyleEditor-D2z65PB7.js.br +0 -0
  98. package/client/assets/StyleEditor-D2z65PB7.js.gz +0 -0
  99. package/client/assets/{StyleEditor-BIFjHsgD.js.map → StyleEditor-D2z65PB7.js.map} +1 -1
  100. package/client/assets/{SuperscriptTime-DCTyUARx.js → SuperscriptTime-CIrcMcyg.js} +2 -2
  101. package/client/assets/SuperscriptTime-CIrcMcyg.js.br +0 -0
  102. package/client/assets/SuperscriptTime-CIrcMcyg.js.gz +0 -0
  103. package/client/assets/{SuperscriptTime-DCTyUARx.js.map → SuperscriptTime-CIrcMcyg.js.map} +1 -1
  104. package/client/assets/{TimeElements-DBVGVx71.js → TimeElements-CALNfv6u.js} +2 -2
  105. package/client/assets/TimeElements-CALNfv6u.js.br +0 -0
  106. package/client/assets/TimeElements-CALNfv6u.js.gz +0 -0
  107. package/client/assets/{TimeElements-DBVGVx71.js.map → TimeElements-CALNfv6u.js.map} +1 -1
  108. package/client/assets/{TimeInput-wQ67FbW6.js → TimeInput-Dg1naiy3.js} +2 -2
  109. package/client/assets/TimeInput-Dg1naiy3.js.br +0 -0
  110. package/client/assets/TimeInput-Dg1naiy3.js.gz +0 -0
  111. package/client/assets/{TimeInput-wQ67FbW6.js.map → TimeInput-Dg1naiy3.js.map} +1 -1
  112. package/client/assets/{TimelinePage-DZefE2vQ.js → TimelinePage-Cwm0svjN.js} +2 -2
  113. package/client/assets/TimelinePage-Cwm0svjN.js.br +0 -0
  114. package/client/assets/TimelinePage-Cwm0svjN.js.gz +0 -0
  115. package/client/assets/{TimelinePage-DZefE2vQ.js.map → TimelinePage-Cwm0svjN.js.map} +1 -1
  116. package/client/assets/Timer-BVXskRjc.js +2 -0
  117. package/client/assets/Timer-BVXskRjc.js.br +0 -0
  118. package/client/assets/Timer-BVXskRjc.js.gz +0 -0
  119. package/client/assets/Timer-BVXskRjc.js.map +1 -0
  120. package/client/assets/Timer-BvEmZbmF.css +1 -0
  121. package/client/assets/Timer-BvEmZbmF.css.br +0 -0
  122. package/client/assets/Timer-BvEmZbmF.css.gz +0 -0
  123. package/client/assets/{TimerControlExport-C1C_vBX4.js → TimerControlExport-C8ECtLBd.js} +2 -2
  124. package/client/assets/TimerControlExport-C8ECtLBd.js.br +0 -0
  125. package/client/assets/TimerControlExport-C8ECtLBd.js.gz +0 -0
  126. package/client/assets/{TimerControlExport-C1C_vBX4.js.map → TimerControlExport-C8ECtLBd.js.map} +1 -1
  127. package/client/assets/{TitleCard-B4N-kCM3.js → TitleCard-CZl9wSHS.js} +2 -2
  128. package/client/assets/TitleCard-CZl9wSHS.js.br +0 -0
  129. package/client/assets/TitleCard-CZl9wSHS.js.gz +0 -0
  130. package/client/assets/{TitleCard-B4N-kCM3.js.map → TitleCard-CZl9wSHS.js.map} +1 -1
  131. package/client/assets/{Tooltip-DJ8Y4CO4.js → Tooltip-D9XRnwOW.js} +2 -2
  132. package/client/assets/Tooltip-D9XRnwOW.js.br +4 -0
  133. package/client/assets/Tooltip-D9XRnwOW.js.gz +0 -0
  134. package/client/assets/{Tooltip-DJ8Y4CO4.js.map → Tooltip-D9XRnwOW.js.map} +1 -1
  135. package/client/assets/{ViewLogo-Dd60EREE.js → ViewLogo-_3Z1hIHi.js} +2 -2
  136. package/client/assets/ViewLogo-_3Z1hIHi.js.br +0 -0
  137. package/client/assets/ViewLogo-_3Z1hIHi.js.gz +0 -0
  138. package/client/assets/{ViewLogo-Dd60EREE.js.map → ViewLogo-_3Z1hIHi.js.map} +1 -1
  139. package/client/assets/{ViewParamsEditor-BWEYbq_S.js → ViewParamsEditor-Bca1TIDW.js} +2 -2
  140. package/client/assets/ViewParamsEditor-Bca1TIDW.js.br +0 -0
  141. package/client/assets/ViewParamsEditor-Bca1TIDW.js.gz +0 -0
  142. package/client/assets/{ViewParamsEditor-BWEYbq_S.js.map → ViewParamsEditor-Bca1TIDW.js.map} +1 -1
  143. package/client/assets/{dateConfig-8rhb0Dbh.js → dateConfig-DRQGMWDF.js} +2 -2
  144. package/client/assets/dateConfig-DRQGMWDF.js.br +0 -0
  145. package/client/assets/dateConfig-DRQGMWDF.js.gz +0 -0
  146. package/client/assets/{dateConfig-8rhb0Dbh.js.map → dateConfig-DRQGMWDF.js.map} +1 -1
  147. package/client/assets/{editorSettings-LMnfWux6.js → editorSettings-BU0pTMSY.js} +2 -2
  148. package/client/assets/editorSettings-BU0pTMSY.js.br +0 -0
  149. package/client/assets/editorSettings-BU0pTMSY.js.gz +0 -0
  150. package/client/assets/{editorSettings-LMnfWux6.js.map → editorSettings-BU0pTMSY.js.map} +1 -1
  151. package/client/assets/{getProgress-CyJTu6f5.js → getProgress-Cw79NL_O.js} +2 -2
  152. package/client/assets/getProgress-Cw79NL_O.js.br +0 -0
  153. package/client/assets/getProgress-Cw79NL_O.js.gz +0 -0
  154. package/client/assets/{getProgress-CyJTu6f5.js.map → getProgress-Cw79NL_O.js.map} +1 -1
  155. package/client/assets/{index-5QAOtSTh.js → index-BQEUaoAf.js} +3 -3
  156. package/client/assets/index-BQEUaoAf.js.br +0 -0
  157. package/client/assets/index-BQEUaoAf.js.gz +0 -0
  158. package/client/assets/{index-5QAOtSTh.js.map → index-BQEUaoAf.js.map} +1 -1
  159. package/client/assets/{offset-CLDSqOP5.js → offset-DJAHqjFW.js} +2 -2
  160. package/client/assets/offset-DJAHqjFW.js.br +0 -0
  161. package/client/assets/offset-DJAHqjFW.js.gz +0 -0
  162. package/client/assets/{offset-CLDSqOP5.js.map → offset-DJAHqjFW.js.map} +1 -1
  163. package/client/assets/{parseUserTime-CCDHpp7D.js → parseUserTime-BeTKj08M.js} +2 -2
  164. package/client/assets/parseUserTime-BeTKj08M.js.br +0 -0
  165. package/client/assets/parseUserTime-BeTKj08M.js.gz +0 -0
  166. package/client/assets/{parseUserTime-CCDHpp7D.js.map → parseUserTime-BeTKj08M.js.map} +1 -1
  167. package/client/assets/{playbackstate-6lBh6omZ.js → playbackstate-B_khF6xU.js} +2 -2
  168. package/client/assets/playbackstate-B_khF6xU.js.br +0 -0
  169. package/client/assets/playbackstate-B_khF6xU.js.gz +0 -0
  170. package/client/assets/{playbackstate-6lBh6omZ.js.map → playbackstate-B_khF6xU.js.map} +1 -1
  171. package/client/assets/{presentation.utils-BUIuV_2e.js → presentation.utils-KwY-ACf7.js} +2 -2
  172. package/client/assets/presentation.utils-KwY-ACf7.js.br +0 -0
  173. package/client/assets/presentation.utils-KwY-ACf7.js.gz +0 -0
  174. package/client/assets/{presentation.utils-BUIuV_2e.js.map → presentation.utils-KwY-ACf7.js.map} +1 -1
  175. package/client/assets/{rundownUtils-Cnd2prRX.js → rundownUtils-BZHazkXR.js} +2 -2
  176. package/client/assets/rundownUtils-BZHazkXR.js.br +0 -0
  177. package/client/assets/rundownUtils-BZHazkXR.js.gz +0 -0
  178. package/client/assets/{rundownUtils-Cnd2prRX.js.map → rundownUtils-BZHazkXR.js.map} +1 -1
  179. package/client/assets/{useCustomFields-BuxKsqGS.js → useCustomFields-DqCYz8Kt.js} +2 -2
  180. package/client/assets/useCustomFields-DqCYz8Kt.js.br +0 -0
  181. package/client/assets/useCustomFields-DqCYz8Kt.js.gz +0 -0
  182. package/client/assets/{useCustomFields-BuxKsqGS.js.map → useCustomFields-DqCYz8Kt.js.map} +1 -1
  183. package/client/assets/{useFollowComponent-iGQv4zoS.js → useFollowComponent-Ctfhf2or.js} +2 -2
  184. package/client/assets/useFollowComponent-Ctfhf2or.js.br +0 -0
  185. package/client/assets/useFollowComponent-Ctfhf2or.js.gz +0 -0
  186. package/client/assets/{useFollowComponent-iGQv4zoS.js.map → useFollowComponent-Ctfhf2or.js.map} +1 -1
  187. package/client/assets/{useProjectData-CetvEK9E.js → useProjectData-C1hVamxc.js} +2 -2
  188. package/client/assets/useProjectData-C1hVamxc.js.br +0 -0
  189. package/client/assets/useProjectData-C1hVamxc.js.gz +0 -0
  190. package/client/assets/{useProjectData-CetvEK9E.js.map → useProjectData-C1hVamxc.js.map} +1 -1
  191. package/client/assets/{useReport-PEFRsOhF.js → useReport-B4dMYcNL.js} +2 -2
  192. package/client/assets/useReport-B4dMYcNL.js.br +0 -0
  193. package/client/assets/useReport-B4dMYcNL.js.gz +0 -0
  194. package/client/assets/{useReport-PEFRsOhF.js.map → useReport-B4dMYcNL.js.map} +1 -1
  195. package/client/assets/useRundown-BfpjcCEJ.js +2 -0
  196. package/client/assets/useRundown-BfpjcCEJ.js.br +0 -0
  197. package/client/assets/useRundown-BfpjcCEJ.js.gz +0 -0
  198. package/client/assets/{useRundown-D8CYATNi.js.map → useRundown-BfpjcCEJ.js.map} +1 -1
  199. package/client/assets/{useWindowTitle-b5fN0StF.js → useWindowTitle-DqdFTWns.js} +2 -2
  200. package/client/assets/useWindowTitle-DqdFTWns.js.br +0 -0
  201. package/client/assets/useWindowTitle-DqdFTWns.js.gz +0 -0
  202. package/client/assets/{useWindowTitle-b5fN0StF.js.map → useWindowTitle-DqdFTWns.js.map} +1 -1
  203. package/client/assets/{validateEvent-Bvgk1E-Y.js → validateEvent-P9sf7C10.js} +2 -2
  204. package/client/assets/validateEvent-P9sf7C10.js.br +3 -0
  205. package/client/assets/validateEvent-P9sf7C10.js.gz +0 -0
  206. package/client/assets/{validateEvent-Bvgk1E-Y.js.map → validateEvent-P9sf7C10.js.map} +1 -1
  207. package/client/assets/{vendor-Cu5xgv5K.js → vendor-CCiSQ9k9.js} +2 -2
  208. package/client/assets/vendor-CCiSQ9k9.js.br +0 -0
  209. package/client/assets/vendor-CCiSQ9k9.js.gz +0 -0
  210. package/client/assets/{vendor-Cu5xgv5K.js.map → vendor-CCiSQ9k9.js.map} +1 -1
  211. package/client/assets/{viewLoader.utils-BPhACxyG.js → viewLoader.utils-CmM-4-pk.js} +2 -2
  212. package/client/assets/viewLoader.utils-CmM-4-pk.js.br +0 -0
  213. package/client/assets/viewLoader.utils-CmM-4-pk.js.gz +0 -0
  214. package/client/assets/{viewLoader.utils-BPhACxyG.js.map → viewLoader.utils-CmM-4-pk.js.map} +1 -1
  215. package/client/index.html +2 -2
  216. package/external/demo/app.js +2 -2
  217. package/package.json +1 -1
  218. package/server/index.cjs +66 -57
  219. package/client/assets/Backstage-ZSqb8OU6.js.br +0 -0
  220. package/client/assets/Backstage-ZSqb8OU6.js.gz +0 -0
  221. package/client/assets/Countdown-DVRZbeRP.js.br +0 -0
  222. package/client/assets/Countdown-DVRZbeRP.js.gz +0 -0
  223. package/client/assets/CustomTranslationModal-D_Cy0d_H.js.br +0 -0
  224. package/client/assets/CustomTranslationModal-D_Cy0d_H.js.gz +0 -0
  225. package/client/assets/DelayIndicator-B_JKLKYW.js.br +0 -0
  226. package/client/assets/DelayIndicator-B_JKLKYW.js.gz +0 -0
  227. package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.br +0 -0
  228. package/client/assets/EditorFeatureWrapper-DzBxDvRn.js.gz +0 -0
  229. package/client/assets/EditorUtils-De0umjb-.js.br +0 -0
  230. package/client/assets/EditorUtils-De0umjb-.js.gz +0 -0
  231. package/client/assets/Empty-BYF0tVRk.js.br +0 -2
  232. package/client/assets/Empty-BYF0tVRk.js.gz +0 -0
  233. package/client/assets/EmptyPage-DYH2bswA.js.br +0 -0
  234. package/client/assets/EmptyPage-DYH2bswA.js.gz +0 -0
  235. package/client/assets/FollowButton-DyWsvyFF.js.br +0 -0
  236. package/client/assets/FollowButton-DyWsvyFF.js.gz +0 -0
  237. package/client/assets/MessageControlExport-yLGU2dMq.js.br +0 -0
  238. package/client/assets/MessageControlExport-yLGU2dMq.js.gz +0 -0
  239. package/client/assets/MilestoneEditor-GkzJ-h1C.js.br +0 -0
  240. package/client/assets/MilestoneEditor-GkzJ-h1C.js.gz +0 -0
  241. package/client/assets/Modal-BKL-5GzU.js.br +0 -0
  242. package/client/assets/Modal-BKL-5GzU.js.gz +0 -0
  243. package/client/assets/MultiPartProgressBar-BITERKS0.js.br +0 -0
  244. package/client/assets/MultiPartProgressBar-BITERKS0.js.gz +0 -0
  245. package/client/assets/OperatorExport-DMZ6eQfT.js.br +0 -0
  246. package/client/assets/OperatorExport-DMZ6eQfT.js.gz +0 -0
  247. package/client/assets/OverviewWrapper-riM6vPno.js.br +0 -0
  248. package/client/assets/OverviewWrapper-riM6vPno.js.gz +0 -0
  249. package/client/assets/ProjectInfo-DxtMq70a.js.br +0 -0
  250. package/client/assets/ProjectInfo-DxtMq70a.js.gz +0 -0
  251. package/client/assets/ProtectRoute-p1fmtLeu.js.br +0 -0
  252. package/client/assets/ProtectRoute-p1fmtLeu.js.gz +0 -0
  253. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.br +0 -0
  254. package/client/assets/ProtectedCuesheet-CvRnqT0z.js.gz +0 -0
  255. package/client/assets/ProtectedEditor-D4UXj1xL.js.br +0 -0
  256. package/client/assets/ProtectedEditor-D4UXj1xL.js.gz +0 -0
  257. package/client/assets/RundownEntry-B1dSz1wu.js.br +0 -0
  258. package/client/assets/RundownEntry-B1dSz1wu.js.gz +0 -0
  259. package/client/assets/RundownExport-CUtaG16H.css +0 -1
  260. package/client/assets/RundownExport-CUtaG16H.css.br +0 -0
  261. package/client/assets/RundownExport-CUtaG16H.css.gz +0 -0
  262. package/client/assets/RundownExport-WjLpncYT.js.br +0 -0
  263. package/client/assets/RundownExport-WjLpncYT.js.gz +0 -0
  264. package/client/assets/Select-niU9Razm.js.br +0 -0
  265. package/client/assets/Select-niU9Razm.js.gz +0 -0
  266. package/client/assets/Studio-CWdJq4bx.js.br +0 -0
  267. package/client/assets/Studio-CWdJq4bx.js.gz +0 -0
  268. package/client/assets/StyleEditor-BIFjHsgD.js.br +0 -0
  269. package/client/assets/StyleEditor-BIFjHsgD.js.gz +0 -0
  270. package/client/assets/SuperscriptTime-DCTyUARx.js.br +0 -0
  271. package/client/assets/SuperscriptTime-DCTyUARx.js.gz +0 -0
  272. package/client/assets/TimeElements-DBVGVx71.js.br +0 -0
  273. package/client/assets/TimeElements-DBVGVx71.js.gz +0 -0
  274. package/client/assets/TimeInput-wQ67FbW6.js.br +0 -0
  275. package/client/assets/TimeInput-wQ67FbW6.js.gz +0 -0
  276. package/client/assets/TimelinePage-DZefE2vQ.js.br +0 -0
  277. package/client/assets/TimelinePage-DZefE2vQ.js.gz +0 -0
  278. package/client/assets/Timer-Bs450x86.js +0 -2
  279. package/client/assets/Timer-Bs450x86.js.br +0 -0
  280. package/client/assets/Timer-Bs450x86.js.gz +0 -0
  281. package/client/assets/Timer-Bs450x86.js.map +0 -1
  282. package/client/assets/Timer-DGNfbBKM.css +0 -1
  283. package/client/assets/Timer-DGNfbBKM.css.br +0 -0
  284. package/client/assets/Timer-DGNfbBKM.css.gz +0 -0
  285. package/client/assets/TimerControlExport-C1C_vBX4.js.br +0 -0
  286. package/client/assets/TimerControlExport-C1C_vBX4.js.gz +0 -0
  287. package/client/assets/TitleCard-B4N-kCM3.js.br +0 -0
  288. package/client/assets/TitleCard-B4N-kCM3.js.gz +0 -0
  289. package/client/assets/Tooltip-DJ8Y4CO4.js.br +0 -0
  290. package/client/assets/Tooltip-DJ8Y4CO4.js.gz +0 -0
  291. package/client/assets/ViewLogo-Dd60EREE.js.br +0 -0
  292. package/client/assets/ViewLogo-Dd60EREE.js.gz +0 -0
  293. package/client/assets/ViewParamsEditor-BWEYbq_S.js.br +0 -0
  294. package/client/assets/ViewParamsEditor-BWEYbq_S.js.gz +0 -0
  295. package/client/assets/dateConfig-8rhb0Dbh.js.br +0 -0
  296. package/client/assets/dateConfig-8rhb0Dbh.js.gz +0 -0
  297. package/client/assets/editorSettings-LMnfWux6.js.br +0 -0
  298. package/client/assets/editorSettings-LMnfWux6.js.gz +0 -0
  299. package/client/assets/getProgress-CyJTu6f5.js.br +0 -0
  300. package/client/assets/getProgress-CyJTu6f5.js.gz +0 -0
  301. package/client/assets/index-5QAOtSTh.js.br +0 -0
  302. package/client/assets/index-5QAOtSTh.js.gz +0 -0
  303. package/client/assets/offset-CLDSqOP5.js.br +0 -0
  304. package/client/assets/offset-CLDSqOP5.js.gz +0 -0
  305. package/client/assets/parseUserTime-CCDHpp7D.js.br +0 -0
  306. package/client/assets/parseUserTime-CCDHpp7D.js.gz +0 -0
  307. package/client/assets/playbackstate-6lBh6omZ.js.br +0 -0
  308. package/client/assets/playbackstate-6lBh6omZ.js.gz +0 -0
  309. package/client/assets/presentation.utils-BUIuV_2e.js.br +0 -0
  310. package/client/assets/presentation.utils-BUIuV_2e.js.gz +0 -0
  311. package/client/assets/rundownUtils-Cnd2prRX.js.br +0 -0
  312. package/client/assets/rundownUtils-Cnd2prRX.js.gz +0 -0
  313. package/client/assets/useCustomFields-BuxKsqGS.js.br +0 -0
  314. package/client/assets/useCustomFields-BuxKsqGS.js.gz +0 -0
  315. package/client/assets/useFollowComponent-iGQv4zoS.js.br +0 -0
  316. package/client/assets/useFollowComponent-iGQv4zoS.js.gz +0 -0
  317. package/client/assets/useProjectData-CetvEK9E.js.br +0 -0
  318. package/client/assets/useProjectData-CetvEK9E.js.gz +0 -0
  319. package/client/assets/useReport-PEFRsOhF.js.br +0 -0
  320. package/client/assets/useReport-PEFRsOhF.js.gz +0 -0
  321. package/client/assets/useRundown-D8CYATNi.js +0 -2
  322. package/client/assets/useRundown-D8CYATNi.js.br +0 -0
  323. package/client/assets/useRundown-D8CYATNi.js.gz +0 -0
  324. package/client/assets/useWindowTitle-b5fN0StF.js.br +0 -0
  325. package/client/assets/useWindowTitle-b5fN0StF.js.gz +0 -0
  326. package/client/assets/validateEvent-Bvgk1E-Y.js.br +0 -0
  327. package/client/assets/validateEvent-Bvgk1E-Y.js.gz +0 -0
  328. package/client/assets/vendor-Cu5xgv5K.js.br +0 -0
  329. package/client/assets/vendor-Cu5xgv5K.js.gz +0 -0
  330. package/client/assets/viewLoader.utils-BPhACxyG.js.br +0 -0
  331. package/client/assets/viewLoader.utils-BPhACxyG.js.gz +0 -0
@@ -1,2 +1,2 @@
1
- import{j as e,l as G,h as d,y as te,ab as se}from"./vendor-Cu5xgv5K.js";import{i as o,q as ne,v as ae,g as f,P as ie,b as L,w as $,a as re,u as oe,d as ce,L as le,f as Q,x as de,y as ue,z as me,h as he,O as xe,s as fe,A as pe}from"./index-5QAOtSTh.js";import{g as ve}from"./getProgress-CyJTu6f5.js";import{E as ge}from"./Empty-BYF0tVRk.js";import{E as ye}from"./EmptyPage-DYH2bswA.js";import{T as z}from"./TitleCard-B4N-kCM3.js";import{V as _e}from"./ViewLogo-Dd60EREE.js";import{O as B,i as D,m as A,d as je,g as V,V as Ne}from"./ViewParamsEditor-BWEYbq_S.js";import{u as we}from"./useWindowTitle-b5fN0StF.js";import{S as p}from"./SuperscriptTime-DCTyUARx.js";import{b as Se,i as W,c as be}from"./useRundown-D8CYATNi.js";import{g as Ee}from"./offset-CLDSqOP5.js";import{g as ke,a as Pe}from"./viewLoader.utils-BPhACxyG.js";import{u as Ie}from"./useCustomFields-BuxKsqGS.js";import{u as Te}from"./useProjectData-CetvEK9E.js";import"./Select-niU9Razm.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="20d9b83a-1091-42b1-969f-47049994ca35",t._sentryDebugIdIdentifier="sentry-dbid-20d9b83a-1091-42b1-969f-47049994ca35")}catch{}})();function Oe(t){const{current:s,duration:n,className:a}=t,i=ve(s,n);return e.jsx("div",{className:`progress-bar__bg ${a}`,children:e.jsx("div",{className:"progress-bar__indicator",style:{width:`${i}%`}})})}const Ce=t=>({title:B.Schedule,collapsible:!0,options:[{id:"filter",title:"Filter",description:"Hide events without data in the selected custom field",type:"option",values:t,defaultValue:"none"},{id:"stopCycle",title:"Stop cycling through event pages",description:"Schedule will not auto-cycle through events",type:"boolean",defaultValue:!1},{id:"cycleInterval",title:"Cycle interval",description:"How long (in seconds) should each schedule page be shown.",type:"number",defaultValue:10},{id:"showExpected",title:"Show expected time",description:"Whether the times shown should account for the runtime offset.",type:"boolean",defaultValue:!1}]});function Fe(t){return{filter:t.get("filter"),cycleInterval:Number(t.get("cycleInterval"))||10,stopCycle:D(t.get("stopCycle")),showExpected:D(t.get("showExpected"))}}function K(){const[t]=G();return d.useMemo(()=>Fe(t),[t])}const U=d.createContext(void 0),Ve=({children:t,selectedEventId:s})=>{const{cycleInterval:n,stopCycle:a,filter:i}=K(),{data:r}=Se(c=>{if(i){const k=i.startsWith("custom-")?i.slice(7):i;return W(c)&&!!c.custom[k]}return W(c)}),[l,u]=d.useState(-1),[x,g]=d.useState(0),[v,y]=d.useState(0),m=d.useRef(-1),S=d.useRef(void 0),N=d.useRef(null);d.useLayoutEffect(()=>{if(!N.current)return;const c=Array.from(N.current.children);if(c.length===0)return;const k=N.current.clientHeight;let b=0,F=1,P=1,I=-1,_=!1;for(let h=0;h<c.length;h++){const j=c[h].clientHeight,O=b+j>k;O&&(b=0,P+=1),h<l?T(c[h]):I===-1?(_=!0,F=P):O&&(_=!1),_?(I=h,H(c[h],b)):T(c[h]),b+=j}y(F),g(P),m.current=I;function H(h,j){h.style.top=`${j}px`}function T(h){h.style.top="-1000px"}},[l,r]),d.useEffect(()=>{if(a){y(1),u(0);return}S.current&&clearInterval(S.current);const c=setInterval(()=>{u(v===x?0:m.current+1)},n*1e3);return S.current=c,()=>clearInterval(S.current)},[n,x,a,v]);let C=r.findIndex(c=>c.id===s);const w=r.slice(C+1);return C=0,e.jsx(U,{value:{events:w,selectedEventId:s,numPages:x,visiblePage:v,containerRef:N},children:t})},Z=()=>{const t=d.use(U);if(!t)throw new Error("useSchedule() can only be used inside a ScheduleContext");return t},E={format12:"hh:mm a",format24:"HH:mm"};function Be({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:l,duration:u,skip:x,title:g,timeEnd:v,cue:y}){const{showExpected:m}=K();return e.jsxs("li",{className:o(["entry",x&&"entry--skip"]),"data-testid":y,children:[e.jsx("div",{className:"entry-times",children:m?e.jsx(Me,{timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:u,colour:l}):n>0?e.jsx(Le,{timeStart:t,delay:n,colour:l,timeEnd:v}):e.jsx(He,{timeStart:t,timeEnd:v,colour:l})}),e.jsx("div",{className:"entry-title",children:g})]})}function He({timeStart:t,timeEnd:s,colour:n}){const a=f(t,E),i=f(s,E);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:n}}),e.jsx(p,{time:a}),"→",e.jsx(p,{time:i})]})}function Le({timeStart:t,timeEnd:s,colour:n,delay:a}){const i=f(t,E),r=f(s,E),l=f(t+a,E),u=f(s+a,E);return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"entry-times--delayed",children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:n}}),e.jsx(p,{time:i}),"→",e.jsx(p,{time:r})]}),e.jsxs("span",{className:"entry-times--delay",children:[e.jsx(p,{time:l}),"→",e.jsx(p,{time:u})]})]})}function Me({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:l,duration:u}){const x=ne(),{expectedStart:g,expectedEnd:v,plannedEnd:y}=ae({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:u},x);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:l}}),e.jsx(q,{expectedTime:g,plannedTime:t}),"→",e.jsx(q,{expectedTime:v,plannedTime:y})]})}function q({expectedTime:t,plannedTime:s}){const n=f(t),a=Ee(t-s);return e.jsx(p,{className:`entry-times--${a}`,time:n})}function Re({className:t}){const{events:s,containerRef:n}=Z();return(s==null?void 0:s.length)<1?null:e.jsx("ul",{className:o(["schedule",t]),ref:n,children:s.map(a=>e.jsx(Be,{timeStart:a.timeStart,dayOffset:a.dayOffset,delay:a.delay,totalGap:a.totalGap,isLinkedToLoaded:a.isLinkedToLoaded,countToEnd:a.countToEnd,duration:a.duration,colour:a.colour,skip:a.skip,title:a.title,timeEnd:a.timeEnd,cue:a.cue},a.id))})}function $e({className:t}){const{numPages:s,visiblePage:n}=Z();return s>10?e.jsxs("div",{className:o(["schedule-nav",t]),children:[e.jsx("div",{className:o(["schedule-nav__item",n===1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===5&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item","schedule-nav__item--indeterminate",n>5&&n<s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s&&"schedule-nav__item--selected"])})]}):e.jsx("div",{className:o(["schedule-nav",t]),children:s>1&&[...Array(s).keys()].map(a=>e.jsx("div",{className:o(["schedule-nav__item",a+1===n&&"schedule-nav__item--selected"])},a))})}const ze=d.memo(De);function De(t){const{selectedId:s}=t;return e.jsxs(Ve,{selectedEventId:s,children:[e.jsx($e,{className:"schedule-nav-container"}),e.jsx(Re,{className:"schedule-container"})]})}const Ae=(t,s,n)=>{const a=A(s,[{value:"none",label:"None"}]),i=A(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]),r=je(n,[{value:"none",label:"None"}]);return[{title:B.ClockOptions,collapsible:!0,options:[ke(t)]},{title:B.DataSources,collapsible:!0,options:[{id:"secondary-src",title:"Event secondary text",description:"Select the data source for auxiliary text shown in now and next cards",type:"option",values:i,defaultValue:"none"}]},Ce(a),{title:B.ElementVisibility,collapsible:!0,options:[{id:"extra-info",title:"Extra info",description:"Select a project data source to show in the view",type:"option",values:r,defaultValue:"none"}]}]};function We(t,s){const n=a=>(s==null?void 0:s.get(a))??t.get(a);return{secondarySource:n("secondary-src"),extraInfo:n("extra-info")}}function qe(){const[t]=G(),s=d.use(ie);return d.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return We(t,a)},[s,t])}function Ge(t){return(t??0)<0}function Qe(t){return t!==L.Stop}function Ke(t,s){return t===L.Roll&&s===re.Pending}function Ue(t,s,n,a,i){if(i===L.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const r=V(t,n)||$,l=V(t,a),u=V(s,n)||$,x=V(s,a);return{showNow:t!==null,nowMain:r,nowSecondary:l,showNext:s!==null,nextMain:u,nextSecondary:x}}function Ze(){const t=oe(g=>g.mirror),{data:s,status:n}=be(),{data:a,status:i}=Te(),{data:r,status:l}=ce(),{data:u,status:x}=Ie();return{data:{events:s,customFields:u,projectData:a,isMirrored:t,settings:r},status:Pe([n,i,l,x])}}function pt(){const{data:t,status:s}=Ze();return we("Backstage"),s==="pending"?e.jsx(le,{}):s==="error"?e.jsx(ye,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Je,{...t})}function Je({events:t,customFields:s,projectData:n,isMirrored:a,settings:i}){const{getLocalizedString:r}=Q(),{secondarySource:l,extraInfo:u}=qe(),{eventNext:x,eventNow:g,rundown:v,selectedEventId:y,time:m}=de(),[S,N]=d.useState(!1),{height:C}=te();d.useEffect(()=>{N(!1);const ee=setTimeout(()=>{N(!0)},10);return()=>clearTimeout(ee)},[y]);const w=t.length>0,{showNow:c,nowMain:k,nowSecondary:b,showNext:F,nextMain:P,nextSecondary:I}=Ue(g,x,"title",l,m.playback),_=Ke(m.playback,m.phase),H=_?f(m.secondaryTimer):f(m.startedAt),T=(()=>{if(!c&&w)return f(v.plannedStart,{format12:"hh:mm a",format24:"HH:mm"})})(),h=(()=>{if(!c&&w)return f(v.plannedEnd,{format12:"hh:mm a",format24:"HH:mm"})})();let j=ue(m.current,{fallback:pe});j=me(j);const O=Math.max(window.innerWidth/15,72),J=Qe(m.playback),M=w&&C>420,X=T&&h,R=he(i==null?void 0:i.timeFormat),Y=d.useMemo(()=>Ae(R,s,n),[R,s,n]);return e.jsxs("div",{className:`backstage ${a?"mirror":""}`,"data-testid":"backstage-view",children:[e.jsx(Ne,{target:xe.Backstage,viewOptions:Y}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(_e,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(Ye,{})]}),J&&e.jsx(Oe,{className:"progress-container",current:m.current,duration:m.duration}),!w&&e.jsx(ge,{text:r("common.no_data"),className:"empty-container"}),e.jsxs("div",{className:"card-container",children:[c&&e.jsxs("div",{className:o(["event","now",S&&"blink"]),children:[e.jsx(z,{title:k,secondary:b}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:o(["time-entry__label",_&&"time-entry--pending"]),children:r(_?"countdown.waiting":"common.started_at")}),e.jsx(p,{time:H,className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.expected_finish")}),Ge(m.current)?e.jsx("div",{className:"time-entry__value",children:r("countdown.overtime")}):e.jsx(p,{time:f(m.expectedFinish),className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.stage_timer")}),e.jsx("div",{className:"time-entry__value",children:j})]})]})]}),X&&e.jsxs("div",{className:"event",children:[e.jsx("div",{className:"title-card__placeholder",children:r("countdown.waiting")}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:o(["time-entry__label",_&&"time-entry--pending"]),children:r("common.scheduled_start")}),e.jsx(p,{time:T,className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.scheduled_end")}),e.jsx(p,{time:h,className:"time-entry__value"})]})]})]}),F&&w&&e.jsx(z,{className:"event",label:"next",title:P,secondary:I})]}),M&&e.jsx(ze,{selectedId:y}),e.jsxs("div",{className:o(["info",!M&&"info--stretch"]),children:[u&&e.jsx(Xe,{projectData:n,size:O,source:u}),e.jsxs("div",{className:"info-card",children:[n.url&&e.jsx(se,{value:n.url,size:O,level:"L",className:"info-card__qr"}),n.info&&e.jsx("div",{className:"info-card__message",children:n.info})]})]})]})}function Xe({projectData:t,size:s,source:n}){const a=t.custom.find((i,r)=>`${r}-${i.title}`===n);return a?e.jsxs("div",{className:"info-card",children:[a.url&&e.jsx("img",{className:"info-card__img",width:s,src:a.url,onError:i=>i.currentTarget.style.display="none"}),e.jsxs("div",{className:"info__column",children:[a.title&&e.jsx("div",{className:"info-card__label",children:a.title}),a.value&&e.jsx("div",{className:"info-card__message",children:a.value})]})]}):null}function Ye(){const{getLocalizedString:t}=Q(),{clock:s}=fe(),n=f(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(p,{time:n,className:"time"})]})}export{pt as default};
2
- //# sourceMappingURL=Backstage-ZSqb8OU6.js.map
1
+ import{j as e,l as G,h as d,y as te,ab as se}from"./vendor-CCiSQ9k9.js";import{i as o,q as ne,v as ae,g as f,P as ie,b as L,w as $,a as re,u as oe,d as ce,L as le,f as Q,x as de,y as ue,z as me,h as he,O as xe,s as fe,A as pe}from"./index-BQEUaoAf.js";import{g as ve}from"./getProgress-Cw79NL_O.js";import{E as ge}from"./Empty-gWT_HMeu.js";import{E as ye}from"./EmptyPage-Dcbg6rmF.js";import{T as z}from"./TitleCard-CZl9wSHS.js";import{V as _e}from"./ViewLogo-_3Z1hIHi.js";import{O as B,i as D,m as A,d as je,g as V,V as Ne}from"./ViewParamsEditor-Bca1TIDW.js";import{u as we}from"./useWindowTitle-DqdFTWns.js";import{S as p}from"./SuperscriptTime-CIrcMcyg.js";import{b as Se,i as W,c as be}from"./useRundown-BfpjcCEJ.js";import{g as Ee}from"./offset-DJAHqjFW.js";import{g as ke,a as Pe}from"./viewLoader.utils-CmM-4-pk.js";import{u as Ie}from"./useCustomFields-DqCYz8Kt.js";import{u as Te}from"./useProjectData-C1hVamxc.js";import"./Select-CedN80WS.js";(function(){try{var t=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new t.Error().stack;s&&(t._sentryDebugIds=t._sentryDebugIds||{},t._sentryDebugIds[s]="20d9b83a-1091-42b1-969f-47049994ca35",t._sentryDebugIdIdentifier="sentry-dbid-20d9b83a-1091-42b1-969f-47049994ca35")}catch{}})();function Oe(t){const{current:s,duration:n,className:a}=t,i=ve(s,n);return e.jsx("div",{className:`progress-bar__bg ${a}`,children:e.jsx("div",{className:"progress-bar__indicator",style:{width:`${i}%`}})})}const Ce=t=>({title:B.Schedule,collapsible:!0,options:[{id:"filter",title:"Filter",description:"Hide events without data in the selected custom field",type:"option",values:t,defaultValue:"none"},{id:"stopCycle",title:"Stop cycling through event pages",description:"Schedule will not auto-cycle through events",type:"boolean",defaultValue:!1},{id:"cycleInterval",title:"Cycle interval",description:"How long (in seconds) should each schedule page be shown.",type:"number",defaultValue:10},{id:"showExpected",title:"Show expected time",description:"Whether the times shown should account for the runtime offset.",type:"boolean",defaultValue:!1}]});function Fe(t){return{filter:t.get("filter"),cycleInterval:Number(t.get("cycleInterval"))||10,stopCycle:D(t.get("stopCycle")),showExpected:D(t.get("showExpected"))}}function K(){const[t]=G();return d.useMemo(()=>Fe(t),[t])}const U=d.createContext(void 0),Ve=({children:t,selectedEventId:s})=>{const{cycleInterval:n,stopCycle:a,filter:i}=K(),{data:r}=Se(c=>{if(i){const k=i.startsWith("custom-")?i.slice(7):i;return W(c)&&!!c.custom[k]}return W(c)}),[l,u]=d.useState(-1),[x,g]=d.useState(0),[v,y]=d.useState(0),m=d.useRef(-1),S=d.useRef(void 0),N=d.useRef(null);d.useLayoutEffect(()=>{if(!N.current)return;const c=Array.from(N.current.children);if(c.length===0)return;const k=N.current.clientHeight;let b=0,F=1,P=1,I=-1,_=!1;for(let h=0;h<c.length;h++){const j=c[h].clientHeight,O=b+j>k;O&&(b=0,P+=1),h<l?T(c[h]):I===-1?(_=!0,F=P):O&&(_=!1),_?(I=h,H(c[h],b)):T(c[h]),b+=j}y(F),g(P),m.current=I;function H(h,j){h.style.top=`${j}px`}function T(h){h.style.top="-1000px"}},[l,r]),d.useEffect(()=>{if(a){y(1),u(0);return}S.current&&clearInterval(S.current);const c=setInterval(()=>{u(v===x?0:m.current+1)},n*1e3);return S.current=c,()=>clearInterval(S.current)},[n,x,a,v]);let C=r.findIndex(c=>c.id===s);const w=r.slice(C+1);return C=0,e.jsx(U,{value:{events:w,selectedEventId:s,numPages:x,visiblePage:v,containerRef:N},children:t})},Z=()=>{const t=d.use(U);if(!t)throw new Error("useSchedule() can only be used inside a ScheduleContext");return t},E={format12:"hh:mm a",format24:"HH:mm"};function Be({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:l,duration:u,skip:x,title:g,timeEnd:v,cue:y}){const{showExpected:m}=K();return e.jsxs("li",{className:o(["entry",x&&"entry--skip"]),"data-testid":y,children:[e.jsx("div",{className:"entry-times",children:m?e.jsx(Me,{timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:u,colour:l}):n>0?e.jsx(Le,{timeStart:t,delay:n,colour:l,timeEnd:v}):e.jsx(He,{timeStart:t,timeEnd:v,colour:l})}),e.jsx("div",{className:"entry-title",children:g})]})}function He({timeStart:t,timeEnd:s,colour:n}){const a=f(t,E),i=f(s,E);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:n}}),e.jsx(p,{time:a}),"→",e.jsx(p,{time:i})]})}function Le({timeStart:t,timeEnd:s,colour:n,delay:a}){const i=f(t,E),r=f(s,E),l=f(t+a,E),u=f(s+a,E);return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"entry-times--delayed",children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:n}}),e.jsx(p,{time:i}),"→",e.jsx(p,{time:r})]}),e.jsxs("span",{className:"entry-times--delay",children:[e.jsx(p,{time:l}),"→",e.jsx(p,{time:u})]})]})}function Me({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,colour:l,duration:u}){const x=ne(),{expectedStart:g,expectedEnd:v,plannedEnd:y}=ae({timeStart:t,dayOffset:s,delay:n,totalGap:a,isLinkedToLoaded:i,countToEnd:r,duration:u},x);return e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"entry-colour",style:{backgroundColor:l}}),e.jsx(q,{expectedTime:g,plannedTime:t}),"→",e.jsx(q,{expectedTime:v,plannedTime:y})]})}function q({expectedTime:t,plannedTime:s}){const n=f(t),a=Ee(t-s);return e.jsx(p,{className:`entry-times--${a}`,time:n})}function Re({className:t}){const{events:s,containerRef:n}=Z();return(s==null?void 0:s.length)<1?null:e.jsx("ul",{className:o(["schedule",t]),ref:n,children:s.map(a=>e.jsx(Be,{timeStart:a.timeStart,dayOffset:a.dayOffset,delay:a.delay,totalGap:a.totalGap,isLinkedToLoaded:a.isLinkedToLoaded,countToEnd:a.countToEnd,duration:a.duration,colour:a.colour,skip:a.skip,title:a.title,timeEnd:a.timeEnd,cue:a.cue},a.id))})}function $e({className:t}){const{numPages:s,visiblePage:n}=Z();return s>10?e.jsxs("div",{className:o(["schedule-nav",t]),children:[e.jsx("div",{className:o(["schedule-nav__item",n===1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===5&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item","schedule-nav__item--indeterminate",n>5&&n<s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-4&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-3&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-2&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s-1&&"schedule-nav__item--selected"])}),e.jsx("div",{className:o(["schedule-nav__item",n===s&&"schedule-nav__item--selected"])})]}):e.jsx("div",{className:o(["schedule-nav",t]),children:s>1&&[...Array(s).keys()].map(a=>e.jsx("div",{className:o(["schedule-nav__item",a+1===n&&"schedule-nav__item--selected"])},a))})}const ze=d.memo(De);function De(t){const{selectedId:s}=t;return e.jsxs(Ve,{selectedEventId:s,children:[e.jsx($e,{className:"schedule-nav-container"}),e.jsx(Re,{className:"schedule-container"})]})}const Ae=(t,s,n)=>{const a=A(s,[{value:"none",label:"None"}]),i=A(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]),r=je(n,[{value:"none",label:"None"}]);return[{title:B.ClockOptions,collapsible:!0,options:[ke(t)]},{title:B.DataSources,collapsible:!0,options:[{id:"secondary-src",title:"Event secondary text",description:"Select the data source for auxiliary text shown in now and next cards",type:"option",values:i,defaultValue:"none"}]},Ce(a),{title:B.ElementVisibility,collapsible:!0,options:[{id:"extra-info",title:"Extra info",description:"Select a project data source to show in the view",type:"option",values:r,defaultValue:"none"}]}]};function We(t,s){const n=a=>(s==null?void 0:s.get(a))??t.get(a);return{secondarySource:n("secondary-src"),extraInfo:n("extra-info")}}function qe(){const[t]=G(),s=d.use(ie);return d.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return We(t,a)},[s,t])}function Ge(t){return(t??0)<0}function Qe(t){return t!==L.Stop}function Ke(t,s){return t===L.Roll&&s===re.Pending}function Ue(t,s,n,a,i){if(i===L.Stop)return{showNow:!1,nowMain:void 0,nowSecondary:void 0,showNext:!1,nextMain:void 0,nextSecondary:void 0};const r=V(t,n)||$,l=V(t,a),u=V(s,n)||$,x=V(s,a);return{showNow:t!==null,nowMain:r,nowSecondary:l,showNext:s!==null,nextMain:u,nextSecondary:x}}function Ze(){const t=oe(g=>g.mirror),{data:s,status:n}=be(),{data:a,status:i}=Te(),{data:r,status:l}=ce(),{data:u,status:x}=Ie();return{data:{events:s,customFields:u,projectData:a,isMirrored:t,settings:r},status:Pe([n,i,l,x])}}function pt(){const{data:t,status:s}=Ze();return we("Backstage"),s==="pending"?e.jsx(le,{}):s==="error"?e.jsx(ye,{text:"There was an error fetching data, please refresh the page."}):e.jsx(Je,{...t})}function Je({events:t,customFields:s,projectData:n,isMirrored:a,settings:i}){const{getLocalizedString:r}=Q(),{secondarySource:l,extraInfo:u}=qe(),{eventNext:x,eventNow:g,rundown:v,selectedEventId:y,time:m}=de(),[S,N]=d.useState(!1),{height:C}=te();d.useEffect(()=>{N(!1);const ee=setTimeout(()=>{N(!0)},10);return()=>clearTimeout(ee)},[y]);const w=t.length>0,{showNow:c,nowMain:k,nowSecondary:b,showNext:F,nextMain:P,nextSecondary:I}=Ue(g,x,"title",l,m.playback),_=Ke(m.playback,m.phase),H=_?f(m.secondaryTimer):f(m.startedAt),T=(()=>{if(!c&&w)return f(v.plannedStart,{format12:"hh:mm a",format24:"HH:mm"})})(),h=(()=>{if(!c&&w)return f(v.plannedEnd,{format12:"hh:mm a",format24:"HH:mm"})})();let j=ue(m.current,{fallback:pe});j=me(j);const O=Math.max(window.innerWidth/15,72),J=Qe(m.playback),M=w&&C>420,X=T&&h,R=he(i==null?void 0:i.timeFormat),Y=d.useMemo(()=>Ae(R,s,n),[R,s,n]);return e.jsxs("div",{className:`backstage ${a?"mirror":""}`,"data-testid":"backstage-view",children:[e.jsx(Ne,{target:xe.Backstage,viewOptions:Y}),e.jsxs("div",{className:"project-header",children:[(n==null?void 0:n.logo)&&e.jsx(_e,{name:n.logo,className:"logo"}),e.jsx("div",{className:"title",children:n.title}),e.jsx(Ye,{})]}),J&&e.jsx(Oe,{className:"progress-container",current:m.current,duration:m.duration}),!w&&e.jsx(ge,{text:r("common.no_data"),className:"empty-container"}),e.jsxs("div",{className:"card-container",children:[c&&e.jsxs("div",{className:o(["event","now",S&&"blink"]),children:[e.jsx(z,{title:k,secondary:b}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:o(["time-entry__label",_&&"time-entry--pending"]),children:r(_?"countdown.waiting":"common.started_at")}),e.jsx(p,{time:H,className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.expected_finish")}),Ge(m.current)?e.jsx("div",{className:"time-entry__value",children:r("countdown.overtime")}):e.jsx(p,{time:f(m.expectedFinish),className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.stage_timer")}),e.jsx("div",{className:"time-entry__value",children:j})]})]})]}),X&&e.jsxs("div",{className:"event",children:[e.jsx("div",{className:"title-card__placeholder",children:r("countdown.waiting")}),e.jsxs("div",{className:"timer-group",children:[e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:o(["time-entry__label",_&&"time-entry--pending"]),children:r("common.scheduled_start")}),e.jsx(p,{time:T,className:"time-entry__value"})]}),e.jsx("div",{className:"timer-gap"}),e.jsxs("div",{className:"time-entry",children:[e.jsx("div",{className:"time-entry__label",children:r("common.scheduled_end")}),e.jsx(p,{time:h,className:"time-entry__value"})]})]})]}),F&&w&&e.jsx(z,{className:"event",label:"next",title:P,secondary:I})]}),M&&e.jsx(ze,{selectedId:y}),e.jsxs("div",{className:o(["info",!M&&"info--stretch"]),children:[u&&e.jsx(Xe,{projectData:n,size:O,source:u}),e.jsxs("div",{className:"info-card",children:[n.url&&e.jsx(se,{value:n.url,size:O,level:"L",className:"info-card__qr"}),n.info&&e.jsx("div",{className:"info-card__message",children:n.info})]})]})]})}function Xe({projectData:t,size:s,source:n}){const a=t.custom.find((i,r)=>`${r}-${i.title}`===n);return a?e.jsxs("div",{className:"info-card",children:[a.url&&e.jsx("img",{className:"info-card__img",width:s,src:a.url,onError:i=>i.currentTarget.style.display="none"}),e.jsxs("div",{className:"info__column",children:[a.title&&e.jsx("div",{className:"info-card__label",children:a.title}),a.value&&e.jsx("div",{className:"info-card__message",children:a.value})]})]}):null}function Ye(){const{getLocalizedString:t}=Q(),{clock:s}=fe(),n=f(s);return e.jsxs("div",{className:"clock-container",children:[e.jsx("div",{className:"label",children:t("common.time_now")}),e.jsx(p,{time:n,className:"time"})]})}export{pt as default};
2
+ //# sourceMappingURL=Backstage-CAjkmeJm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Backstage-ZSqb8OU6.js","sources":["../../src/common/components/progress-bar/ProgressBar.tsx","../../src/views/common/schedule/schedule.options.ts","../../src/views/common/schedule/ScheduleContext.tsx","../../src/views/common/schedule/ScheduleItem.tsx","../../src/views/common/schedule/Schedule.tsx","../../src/views/common/schedule/ScheduleNav.tsx","../../src/views/common/schedule/ScheduleExport.tsx","../../src/views/backstage/backstage.options.ts","../../src/views/backstage/backstage.utils.ts","../../src/views/backstage/useBackstageData.ts","../../src/views/backstage/Backstage.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\n\nimport './ProgressBar.scss';\n\ninterface ProgressBarProps {\n current: MaybeNumber;\n duration: MaybeNumber;\n className?: string;\n}\n\nexport default function ProgressBar(props: ProgressBarProps) {\n const { current, duration, className } = props;\n const progress = getProgress(current, duration);\n\n return (\n <div className={`progress-bar__bg ${className}`}>\n <div className='progress-bar__indicator' style={{ width: `${progress}%` }} />\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { SelectOption } from '../../../common/components/select/Select';\nimport { OptionTitle } from '../../../common/components/view-params-editor/constants';\nimport type { ViewOption } from '../../../common/components/view-params-editor/viewParams.types';\nimport { isStringBoolean } from '../../../features/viewers/common/viewUtils';\n\nexport const getScheduleOptions = (customFieldOptions: SelectOption[]): ViewOption => ({\n title: OptionTitle.Schedule,\n collapsible: true,\n options: [\n {\n id: 'filter',\n title: 'Filter',\n description: 'Hide events without data in the selected custom field',\n type: 'option',\n values: customFieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'stopCycle',\n title: 'Stop cycling through event pages',\n description: 'Schedule will not auto-cycle through events',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'cycleInterval',\n title: 'Cycle interval',\n description: 'How long (in seconds) should each schedule page be shown.',\n type: 'number',\n defaultValue: 10,\n },\n {\n id: 'showExpected',\n title: 'Show expected time',\n description: 'Whether the times shown should account for the runtime offset.',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n});\n\ntype ScheduleOptions = {\n filter: string | null;\n cycleInterval: number;\n stopCycle: boolean;\n showExpected: boolean;\n};\n\nfunction getScheduleOptionsFromParams(searchParams: URLSearchParams): ScheduleOptions {\n return {\n filter: searchParams.get('filter'),\n cycleInterval: Number(searchParams.get('cycleInterval')) || 10,\n stopCycle: isStringBoolean(searchParams.get('stopCycle')),\n showExpected: isStringBoolean(searchParams.get('showExpected')),\n };\n}\n\n/**\n * Hook exposes the schedule component options\n */\nexport function useScheduleOptions() {\n const [searchParams] = useSearchParams();\n const options = useMemo(() => getScheduleOptionsFromParams(searchParams), [searchParams]);\n return options;\n}\n","import { createContext, PropsWithChildren, RefObject, use, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { EntryId, isOntimeEvent, OntimeEntry, OntimeEvent } from 'ontime-types';\n\nimport { usePartialRundown } from '../../../common/hooks-query/useRundown';\nimport { ExtendedEntry } from '../../../common/utils/rundownMetadata';\n\nimport { useScheduleOptions } from './schedule.options';\n\ninterface ScheduleContextState {\n events: ExtendedEntry<OntimeEvent>[];\n selectedEventId: string | null;\n numPages: number;\n visiblePage: number;\n containerRef: RefObject<HTMLUListElement | null>;\n}\n\nconst ScheduleContext = createContext<ScheduleContextState | undefined>(undefined);\n\ninterface ScheduleProviderProps {\n selectedEventId: EntryId | null;\n}\n\nexport const ScheduleProvider = ({ children, selectedEventId }: PropsWithChildren<ScheduleProviderProps>) => {\n const { cycleInterval, stopCycle, filter } = useScheduleOptions();\n const { data: events } = usePartialRundown((entry: ExtendedEntry<OntimeEntry>) => {\n if (filter) {\n // custom keys are prepended with custom-\n const customKey = filter.startsWith('custom-') ? filter.slice('custom-'.length) : filter;\n return isOntimeEvent(entry) && Boolean(entry.custom[customKey]);\n }\n return isOntimeEvent(entry);\n });\n\n const [firstIndex, setFirstIndex] = useState(-1);\n const [numPages, setNumPages] = useState(0);\n const [visiblePage, setVisiblePage] = useState(0);\n\n const lastIndex = useRef(-1);\n const paginator = useRef<NodeJS.Timeout>(undefined);\n\n const containerRef = useRef<HTMLUListElement>(null);\n\n // After the view is rendered, we paginate by hiding elements that dont fit\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n\n const children = Array.from(containerRef.current.children) as HTMLElement[];\n if (children.length === 0) {\n return;\n }\n\n const containerHeight = containerRef.current.clientHeight;\n let currentPageHeight = 0; // used to check when we need to paginate\n let currentPage = 1;\n let numPages = 1;\n let lastVisibleIndex = -1; // keep track of last index on screen\n let isShowingElements = false;\n\n for (let i = 0; i < children.length; i++) {\n const currentElementHeight = children[i].clientHeight;\n\n // can we fit this element in the current page?\n const isNextPage = currentPageHeight + currentElementHeight > containerHeight;\n if (isNextPage) {\n currentPageHeight = 0;\n numPages += 1;\n }\n\n // we hide elements that are before and after the first element to show\n if (i < firstIndex) {\n hideElement(children[i]);\n } else if (lastVisibleIndex === -1) {\n isShowingElements = true;\n currentPage = numPages;\n } else if (isNextPage) {\n isShowingElements = false;\n }\n\n if (!isShowingElements) {\n hideElement(children[i]);\n } else {\n lastVisibleIndex = i;\n showElement(children[i], currentPageHeight);\n }\n\n currentPageHeight += currentElementHeight;\n }\n\n setVisiblePage(currentPage);\n setNumPages(numPages);\n lastIndex.current = lastVisibleIndex;\n\n function showElement(element: HTMLElement, yPosition: number) {\n element.style.top = `${yPosition}px`;\n }\n\n function hideElement(element: HTMLElement) {\n element.style.top = `${-1000}px`;\n }\n // we need to add the events to make sure the effect runs on first render\n }, [firstIndex, events]);\n\n // schedule cycling through events\n useEffect(() => {\n if (stopCycle) {\n setVisiblePage(1);\n setFirstIndex(0);\n return;\n }\n\n if (paginator.current) {\n clearInterval(paginator.current);\n }\n\n const interval = setInterval(() => {\n // ensure we cycle back to the first event\n if (visiblePage === numPages) {\n setFirstIndex(0);\n } else {\n setFirstIndex(lastIndex.current + 1);\n }\n }, cycleInterval * 1000);\n paginator.current = interval;\n\n return () => clearInterval(paginator.current);\n }, [cycleInterval, numPages, stopCycle, visiblePage]);\n\n let selectedEventIndex = events.findIndex((event) => event.id === selectedEventId);\n\n // we want to show the event after the current\n const viewEvents = events.slice(selectedEventIndex + 1);\n selectedEventIndex = 0;\n\n return (\n <ScheduleContext\n value={{\n events: viewEvents as ExtendedEntry<OntimeEvent>[],\n selectedEventId,\n numPages,\n visiblePage,\n containerRef,\n }}\n >\n {children}\n </ScheduleContext>\n );\n};\n\nexport const useSchedule = () => {\n const context = use(ScheduleContext);\n if (!context) {\n throw new Error('useSchedule() can only be used inside a ScheduleContext');\n }\n return context;\n};\n","import { OntimeEvent } from 'ontime-types';\n\nimport { useExpectedStartData } from '../../../common/hooks/useSocket';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { ExtendedEntry } from '../../../common/utils/rundownMetadata';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { formatTime, getExpectedTimesFromExtendedEvent } from '../../../common/utils/time';\nimport SuperscriptTime from '../../../features/viewers/common/superscript-time/SuperscriptTime';\n\nimport { useScheduleOptions } from './schedule.options';\n\nimport './Schedule.scss';\n\nconst formatOptions = {\n format12: 'hh:mm a',\n format24: 'HH:mm',\n};\n\ntype ScheduleItemProps = Pick<\n ExtendedEntry<OntimeEvent>,\n | 'timeStart'\n | 'dayOffset'\n | 'delay'\n | 'totalGap'\n | 'isLinkedToLoaded'\n | 'countToEnd'\n | 'duration'\n | 'colour'\n | 'skip'\n | 'title'\n | 'timeEnd'\n | 'cue'\n>;\n\nexport default function ScheduleItem({\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n colour,\n duration,\n skip,\n title,\n timeEnd,\n cue,\n}: ScheduleItemProps) {\n const { showExpected } = useScheduleOptions();\n\n return (\n <li className={cx(['entry', skip && 'entry--skip'])} data-testid={cue}>\n <div className='entry-times'>\n {showExpected ? (\n <ExpectedScheduleItem\n timeStart={timeStart}\n dayOffset={dayOffset}\n delay={delay}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n countToEnd={countToEnd}\n duration={duration}\n colour={colour}\n />\n ) : delay > 0 ? (\n <DelayedScheduleItem timeStart={timeStart} delay={delay} colour={colour} timeEnd={timeEnd} />\n ) : (\n <PlannedScheduleItem timeStart={timeStart} timeEnd={timeEnd} colour={colour} />\n )}\n </div>\n <div className='entry-title'>{title}</div>\n </li>\n );\n}\n\nfunction PlannedScheduleItem({\n timeStart,\n timeEnd,\n colour,\n}: Pick<ScheduleItemProps, 'timeStart' | 'timeEnd' | 'colour'>) {\n const start = formatTime(timeStart, formatOptions);\n const end = formatTime(timeEnd, formatOptions);\n\n return (\n <>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <SuperscriptTime time={start} />\n →\n <SuperscriptTime time={end} />\n </>\n );\n}\n\nfunction DelayedScheduleItem({\n timeStart,\n timeEnd,\n colour,\n delay,\n}: Pick<ScheduleItemProps, 'timeStart' | 'timeEnd' | 'colour' | 'delay'>) {\n const start = formatTime(timeStart, formatOptions);\n const end = formatTime(timeEnd, formatOptions);\n const delayedStart = formatTime(timeStart + delay, formatOptions);\n const delayedEnd = formatTime(timeEnd + delay, formatOptions);\n\n return (\n <>\n <span className='entry-times--delayed'>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <SuperscriptTime time={start} />\n →\n <SuperscriptTime time={end} />\n </span>\n <span className='entry-times--delay'>\n <SuperscriptTime time={delayedStart} />\n →\n <SuperscriptTime time={delayedEnd} />\n </span>\n </>\n );\n}\n\nfunction ExpectedScheduleItem({\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n colour,\n duration,\n}: Omit<ScheduleItemProps, 'timeEnd' | 'cue' | 'skip' | 'title'>) {\n const expectedStartData = useExpectedStartData();\n const { expectedStart, expectedEnd, plannedEnd } = getExpectedTimesFromExtendedEvent(\n {\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n duration,\n },\n expectedStartData,\n );\n\n return (\n <>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <ExpectedTime expectedTime={expectedStart} plannedTime={timeStart} />\n →\n <ExpectedTime expectedTime={expectedEnd} plannedTime={plannedEnd} />\n </>\n );\n}\n\ninterface ExpectedTimeProps {\n expectedTime: number;\n plannedTime: number;\n}\n\nfunction ExpectedTime({ expectedTime, plannedTime }: ExpectedTimeProps) {\n const timeDisplay = formatTime(expectedTime);\n const expectedState = getOffsetState(expectedTime - plannedTime);\n return <SuperscriptTime className={`entry-times--${expectedState}`} time={timeDisplay} />;\n}\n","import { cx } from '../../../common/utils/styleUtils';\n\nimport { useSchedule } from './ScheduleContext';\nimport ScheduleItem from './ScheduleItem';\n\nimport './Schedule.scss';\n\ninterface ScheduleProps {\n className?: string;\n}\n\nexport default function Schedule({ className }: ScheduleProps) {\n const { events, containerRef } = useSchedule();\n\n if (events?.length < 1) {\n return null;\n }\n\n return (\n <ul className={cx(['schedule', className])} ref={containerRef}>\n {events.map((event) => {\n return (\n <ScheduleItem\n key={event.id}\n timeStart={event.timeStart}\n dayOffset={event.dayOffset}\n delay={event.delay}\n totalGap={event.totalGap}\n isLinkedToLoaded={event.isLinkedToLoaded}\n countToEnd={event.countToEnd}\n duration={event.duration}\n colour={event.colour}\n skip={event.skip}\n title={event.title}\n timeEnd={event.timeEnd}\n cue={event.cue}\n />\n );\n })}\n </ul>\n );\n}\n","import { cx } from '../../../common/utils/styleUtils';\n\nimport { useSchedule } from './ScheduleContext';\n\nimport './Schedule.scss';\n\ninterface ScheduleNavProps {\n className?: string;\n}\n\nexport default function ScheduleNav({ className }: ScheduleNavProps) {\n const { numPages, visiblePage } = useSchedule();\n\n // cap the amount of elements to 11\n if (numPages > 10) {\n return (\n <div className={cx(['schedule-nav', className])}>\n <div className={cx(['schedule-nav__item', visiblePage === 1 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 2 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 3 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 4 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 5 && 'schedule-nav__item--selected'])} />\n <div\n className={cx([\n 'schedule-nav__item',\n 'schedule-nav__item--indeterminate',\n visiblePage > 5 && visiblePage < numPages - 4 && 'schedule-nav__item--selected',\n ])}\n />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 4 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 3 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 2 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 1 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages && 'schedule-nav__item--selected'])} />\n </div>\n );\n }\n\n return (\n <div className={cx(['schedule-nav', className])}>\n {numPages > 1 &&\n [...Array(numPages).keys()].map((i) => (\n <div\n key={i}\n className={cx(['schedule-nav__item', i + 1 === visiblePage && 'schedule-nav__item--selected'])}\n />\n ))}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { MaybeString } from 'ontime-types';\n\nimport Schedule from './Schedule';\nimport { ScheduleProvider } from './ScheduleContext';\nimport ScheduleNav from './ScheduleNav';\n\ninterface ScheduleExportProps {\n selectedId: MaybeString;\n}\n\nexport default memo(ScheduleExport);\nfunction ScheduleExport(props: ScheduleExportProps) {\n const { selectedId } = props;\n return (\n <ScheduleProvider selectedEventId={selectedId}>\n <ScheduleNav className='schedule-nav-container' />\n <Schedule className='schedule-container' />\n </ScheduleProvider>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, ProjectData } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport {\n makeOptionsFromCustomFields,\n makeProjectDataOptions,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { getScheduleOptions } from '../common/schedule/schedule.options';\n\nexport const getBackstageOptions = (\n timeFormat: string,\n customFields: CustomFields,\n projectData: ProjectData,\n): ViewOption[] => {\n const customFieldOptions = makeOptionsFromCustomFields(customFields, [{ value: 'none', label: 'None' }]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'note', label: 'Note' },\n ]);\n const projectDataOptions = makeProjectDataOptions(projectData, [{ value: 'none', label: 'None' }]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'secondary-src',\n title: 'Event secondary text',\n description: 'Select the data source for auxiliary text shown in now and next cards',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n getScheduleOptions(customFieldOptions),\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'extra-info',\n title: 'Extra info',\n description: 'Select a project data source to show in the view',\n type: 'option',\n values: projectDataOptions,\n defaultValue: 'none',\n },\n ],\n },\n ];\n};\n\ntype BackstageOptions = {\n secondarySource: keyof OntimeEvent | null;\n extraInfo: string | null;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): BackstageOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n return {\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n extraInfo: getValue('extra-info'),\n };\n}\n\n/**\n * Hook exposes the backstage view options\n */\nexport function useBackstageOptions(): BackstageOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { MaybeNumber, OntimeEvent, Playback, TimerPhase } from 'ontime-types';\n\nimport { enDash } from '../../common/utils/styleUtils';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\n/**\n * Whether the current time is in overtime\n */\nexport function isOvertime(current: MaybeNumber): boolean {\n return (current ?? 0) < 0;\n}\n\n/**\n * Whether the progress bar should be shown\n */\nexport function getShowProgressBar(playback: Playback): boolean {\n return playback !== Playback.Stop;\n}\n\n/**\n * Whether the playback is pending start (ie: Roll mode waiting to start)\n */\nexport function getIsPendingStart(playback: Playback, phase: TimerPhase): boolean {\n return playback === Playback.Roll && phase === TimerPhase.Pending;\n}\n\n/**\n * What should we be showing in the cards?\n */\nexport function getCardData(\n eventNow: OntimeEvent | null,\n eventNext: OntimeEvent | null,\n mainSource: keyof OntimeEvent | null,\n secondarySource: keyof OntimeEvent | null,\n playback: Playback,\n) {\n if (playback === Playback.Stop) {\n return {\n showNow: false,\n nowMain: undefined,\n nowSecondary: undefined,\n showNext: false,\n nextMain: undefined,\n nextSecondary: undefined,\n };\n }\n\n // if we are loaded, we show the upcoming event as next\n const nowMain = getPropertyValue(eventNow, mainSource ?? 'title') || enDash;\n const nowSecondary = getPropertyValue(eventNow, secondarySource);\n const nextMain = getPropertyValue(eventNext, mainSource ?? 'title') || enDash;\n const nextSecondary = getPropertyValue(eventNext, secondarySource);\n\n return {\n showNow: eventNow !== null,\n nowMain,\n nowSecondary,\n showNext: eventNext !== null,\n nextMain,\n nextSecondary,\n };\n}\n","import { CustomFields, OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundown } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface BackstageData {\n events: OntimeEntry[];\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n}\n\nexport function useBackstageData(): ViewData<BackstageData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundown();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n events: rundownData,\n customFields,\n projectData,\n isMirrored,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport QRCode from 'react-qr-code';\nimport { useViewportSize } from '@mantine/hooks';\nimport { OntimeView, ProjectData } from 'ontime-types';\nimport { millisToString, removeLeadingZero } from 'ontime-utils';\n\nimport ProgressBar from '../../common/components/progress-bar/ProgressBar';\nimport Empty from '../../common/components/state/Empty';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useBackstageSocket, useClock } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx, timerPlaceholderMin } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport ScheduleExport from '../common/schedule/ScheduleExport';\n\nimport { getBackstageOptions, useBackstageOptions } from './backstage.options';\nimport { getCardData, getIsPendingStart, getShowProgressBar, isOvertime } from './backstage.utils';\nimport { BackstageData, useBackstageData } from './useBackstageData';\n\nimport './Backstage.scss';\n\nexport default function BackstageLoader() {\n const { data, status } = useBackstageData();\n\n useWindowTitle('Backstage');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Backstage {...data} />;\n}\n\nfunction Backstage({ events, customFields, projectData, isMirrored, settings }: BackstageData) {\n const { getLocalizedString } = useTranslation();\n const { secondarySource, extraInfo } = useBackstageOptions();\n const { eventNext, eventNow, rundown, selectedEventId, time } = useBackstageSocket();\n const [blinkClass, setBlinkClass] = useState(false);\n const { height: screenHeight } = useViewportSize();\n\n // blink on change\n useEffect(() => {\n setBlinkClass(false);\n\n const timer = setTimeout(() => {\n setBlinkClass(true);\n }, 10);\n\n return () => clearTimeout(timer);\n }, [selectedEventId]);\n\n // gather card data\n const hasEvents = events.length > 0;\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n 'title',\n secondarySource,\n time.playback,\n );\n\n // gather timer data\n const isPendingStart = getIsPendingStart(time.playback, time.phase);\n const startedAt = isPendingStart ? formatTime(time.secondaryTimer) : formatTime(time.startedAt);\n\n const scheduledStart = (() => {\n if (showNow) return undefined;\n if (!hasEvents) return undefined;\n return formatTime(rundown.plannedStart, { format12: 'hh:mm a', format24: 'HH:mm' });\n })();\n\n const scheduledEnd = (() => {\n if (showNow) return undefined;\n if (!hasEvents) return undefined;\n return formatTime(rundown.plannedEnd, { format12: 'hh:mm a', format24: 'HH:mm' });\n })();\n\n let displayTimer = millisToString(time.current, { fallback: timerPlaceholderMin });\n displayTimer = removeLeadingZero(displayTimer);\n\n // gather presentation styles\n const qrSize = Math.max(window.innerWidth / 15, 72);\n const showProgress = getShowProgressBar(time.playback);\n const showSchedule = hasEvents && screenHeight > 420; // in vertical screens we may not have space\n const showPending = scheduledStart && scheduledEnd;\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const backstageOptions = useMemo(\n () => getBackstageOptions(defaultFormat, customFields, projectData),\n [defaultFormat, customFields, projectData],\n );\n\n return (\n <div className={`backstage ${isMirrored ? 'mirror' : ''}`} data-testid='backstage-view'>\n <ViewParamsEditor target={OntimeView.Backstage} viewOptions={backstageOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <BackstageClock />\n </div>\n\n {showProgress && <ProgressBar className='progress-container' current={time.current} duration={time.duration} />}\n\n {!hasEvents && <Empty text={getLocalizedString('common.no_data')} className='empty-container' />}\n\n <div className='card-container'>\n {showNow && (\n <div className={cx(['event', 'now', blinkClass && 'blink'])}>\n <TitleCard title={nowMain} secondary={nowSecondary} />\n <div className='timer-group'>\n <div className='time-entry'>\n <div className={cx(['time-entry__label', isPendingStart && 'time-entry--pending'])}>\n {isPendingStart ? getLocalizedString('countdown.waiting') : getLocalizedString('common.started_at')}\n </div>\n <SuperscriptTime time={startedAt} className='time-entry__value' />\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.expected_finish')}</div>\n {isOvertime(time.current) ? (\n <div className='time-entry__value'>{getLocalizedString('countdown.overtime')}</div>\n ) : (\n <SuperscriptTime time={formatTime(time.expectedFinish)} className='time-entry__value' />\n )}\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.stage_timer')}</div>\n <div className='time-entry__value'>{displayTimer}</div>\n </div>\n </div>\n </div>\n )}\n\n {showPending && (\n <div className='event'>\n <div className='title-card__placeholder'>{getLocalizedString('countdown.waiting')}</div>\n <div className='timer-group'>\n <div className='time-entry'>\n <div className={cx(['time-entry__label', isPendingStart && 'time-entry--pending'])}>\n {getLocalizedString('common.scheduled_start')}\n </div>\n <SuperscriptTime time={scheduledStart} className='time-entry__value' />\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.scheduled_end')}</div>\n <SuperscriptTime time={scheduledEnd} className='time-entry__value' />\n </div>\n </div>\n </div>\n )}\n\n {showNext && hasEvents && (\n <TitleCard className='event' label='next' title={nextMain} secondary={nextSecondary} />\n )}\n </div>\n\n {showSchedule && <ScheduleExport selectedId={selectedEventId} />}\n\n <div className={cx(['info', !showSchedule && 'info--stretch'])}>\n {extraInfo && <ExtraInfo projectData={projectData} size={qrSize} source={extraInfo} />}\n <div className='info-card'>\n {projectData.url && <QRCode value={projectData.url} size={qrSize} level='L' className='info-card__qr' />}\n {projectData.info && <div className='info-card__message'>{projectData.info}</div>}\n </div>\n </div>\n </div>\n );\n}\n\ninterface ExtraInfoProps {\n projectData: ProjectData;\n size: number;\n source: string;\n}\nfunction ExtraInfo({ projectData, size, source }: ExtraInfoProps) {\n const info = projectData.custom.find((entry, index) => {\n const label = `${index}-${entry.title}`;\n return label === source;\n });\n\n if (!info) {\n return null;\n }\n\n return (\n <div className='info-card'>\n {info.url && (\n <img\n className='info-card__img'\n width={size}\n src={info.url}\n onError={(event) => (event.currentTarget.style.display = 'none')}\n />\n )}\n <div className='info__column'>\n {info.title && <div className='info-card__label'>{info.title}</div>}\n {info.value && <div className='info-card__message'>{info.value}</div>}\n </div>\n </div>\n );\n}\n\nfunction BackstageClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["ProgressBar","props","current","duration","className","progress","getProgress","jsx","getScheduleOptions","customFieldOptions","OptionTitle","getScheduleOptionsFromParams","searchParams","isStringBoolean","useScheduleOptions","useSearchParams","useMemo","ScheduleContext","createContext","ScheduleProvider","children","selectedEventId","cycleInterval","stopCycle","filter","events","usePartialRundown","entry","customKey","isOntimeEvent","firstIndex","setFirstIndex","useState","numPages","setNumPages","visiblePage","setVisiblePage","lastIndex","useRef","paginator","containerRef","useLayoutEffect","containerHeight","currentPageHeight","currentPage","lastVisibleIndex","isShowingElements","i","currentElementHeight","isNextPage","showElement","element","yPosition","hideElement","useEffect","interval","selectedEventIndex","event","viewEvents","useSchedule","context","use","formatOptions","ScheduleItem","timeStart","dayOffset","delay","totalGap","isLinkedToLoaded","countToEnd","colour","skip","title","timeEnd","cue","showExpected","jsxs","cx","ExpectedScheduleItem","DelayedScheduleItem","PlannedScheduleItem","start","formatTime","end","Fragment","SuperscriptTime","delayedStart","delayedEnd","expectedStartData","useExpectedStartData","expectedStart","expectedEnd","plannedEnd","getExpectedTimesFromExtendedEvent","ExpectedTime","expectedTime","plannedTime","timeDisplay","expectedState","getOffsetState","Schedule","ScheduleNav","memo","ScheduleExport","selectedId","getBackstageOptions","timeFormat","customFields","projectData","makeOptionsFromCustomFields","secondaryOptions","projectDataOptions","makeProjectDataOptions","getTimeOption","getOptionsFromParams","defaultValues","getValue","key","useBackstageOptions","maybePreset","PresetContext","isOvertime","getShowProgressBar","playback","Playback","getIsPendingStart","phase","TimerPhase","getCardData","eventNow","eventNext","mainSource","secondarySource","nowMain","getPropertyValue","enDash","nowSecondary","nextMain","nextSecondary","useBackstageData","isMirrored","useViewOptionsStore","state","rundownData","rundownStatus","useFlatRundown","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","BackstageLoader","data","status","useWindowTitle","Loader","EmptyPage","Backstage","getLocalizedString","useTranslation","extraInfo","rundown","time","useBackstageSocket","blinkClass","setBlinkClass","screenHeight","useViewportSize","timer","hasEvents","showNow","showNext","isPendingStart","startedAt","scheduledStart","scheduledEnd","displayTimer","millisToString","timerPlaceholderMin","removeLeadingZero","qrSize","showProgress","showSchedule","showPending","defaultFormat","getDefaultFormat","backstageOptions","ViewParamsEditor","OntimeView","ViewLogo","BackstageClock","Empty","TitleCard","ExtraInfo","QRCode","size","source","info","index","clock","useClock","formattedClock"],"mappings":"oxCAYA,SAAwBA,GAAYC,EAAyB,CAC3D,KAAM,CAAE,QAAAC,EAAS,SAAAC,EAAU,UAAAC,CAAc,EAAAH,EACnCI,EAAWC,GAAYJ,EAASC,CAAQ,EAE9C,aACG,MAAI,CAAA,UAAW,oBAAoBC,CAAS,GAC3C,SAACG,MAAA,MAAA,CAAI,UAAU,0BAA0B,MAAO,CAAE,MAAO,GAAGF,CAAQ,IAAO,CAAA,EAC7E,CAEJ,CCba,MAAAG,GAAsBC,IAAoD,CACrF,MAAOC,EAAY,SACnB,YAAa,GACb,QAAS,CACP,CACE,GAAI,SACJ,MAAO,SACP,YAAa,wDACb,KAAM,SACN,OAAQD,EACR,aAAc,MAChB,EACA,CACE,GAAI,YACJ,MAAO,mCACP,YAAa,8CACb,KAAM,UACN,aAAc,EAChB,EACA,CACE,GAAI,gBACJ,MAAO,iBACP,YAAa,4DACb,KAAM,SACN,aAAc,EAChB,EACA,CACE,GAAI,eACJ,MAAO,qBACP,YAAa,iEACb,KAAM,UACN,aAAc,EAAA,CAChB,CAEJ,GASA,SAASE,GAA6BC,EAAgD,CAC7E,MAAA,CACL,OAAQA,EAAa,IAAI,QAAQ,EACjC,cAAe,OAAOA,EAAa,IAAI,eAAe,CAAC,GAAK,GAC5D,UAAWC,EAAgBD,EAAa,IAAI,WAAW,CAAC,EACxD,aAAcC,EAAgBD,EAAa,IAAI,cAAc,CAAC,CAChE,CACF,CAKO,SAASE,GAAqB,CAC7B,KAAA,CAACF,CAAY,EAAIG,EAAgB,EAEhC,OADSC,EAAAA,QAAQ,IAAML,GAA6BC,CAAY,EAAG,CAACA,CAAY,CAAC,CAE1F,CCnDA,MAAMK,EAAkBC,gBAAgD,MAAS,EAMpEC,GAAmB,CAAC,CAAE,SAAAC,EAAU,gBAAAC,KAAgE,CAC3G,KAAM,CAAE,cAAAC,EAAe,UAAAC,EAAW,OAAAC,CAAA,EAAWV,EAAmB,EAC1D,CAAE,KAAMW,CAAW,EAAAC,GAAmBC,GAAsC,CAChF,GAAIH,EAAQ,CAEJ,MAAAI,EAAYJ,EAAO,WAAW,SAAS,EAAIA,EAAO,MAAM,CAAgB,EAAIA,EAClF,OAAOK,EAAcF,CAAK,GAAK,EAAQA,EAAM,OAAOC,CAAS,CAAC,CAEhE,OAAOC,EAAcF,CAAK,CAAA,CAC3B,EAEK,CAACG,EAAYC,CAAa,EAAIC,EAAAA,SAAS,EAAE,EACzC,CAACC,EAAUC,CAAW,EAAIF,EAAAA,SAAS,CAAC,EACpC,CAACG,EAAaC,CAAc,EAAIJ,EAAAA,SAAS,CAAC,EAE1CK,EAAYC,SAAO,EAAE,EACrBC,EAAYD,SAAuB,MAAS,EAE5CE,EAAeF,SAAyB,IAAI,EAGlDG,EAAAA,gBAAgB,IAAM,CAChB,GAAA,CAACD,EAAa,QAAS,OAE3B,MAAMpB,EAAW,MAAM,KAAKoB,EAAa,QAAQ,QAAQ,EACrDpB,GAAAA,EAAS,SAAW,EACtB,OAGI,MAAAsB,EAAkBF,EAAa,QAAQ,aAC7C,IAAIG,EAAoB,EACpBC,EAAc,EACdX,EAAW,EACXY,EAAmB,GACnBC,EAAoB,GAExB,QAASC,EAAI,EAAGA,EAAI3B,EAAS,OAAQ2B,IAAK,CAClC,MAAAC,EAAuB5B,EAAS2B,CAAC,EAAE,aAGnCE,EAAaN,EAAoBK,EAAuBN,EAC1DO,IACkBN,EAAA,EACpBV,GAAY,GAIVc,EAAIjB,EACMV,EAAAA,EAAS2B,CAAC,CAAC,EACdF,IAAqB,IACVC,EAAA,GACNb,EAAAA,GACLgB,IACWH,EAAA,IAGjBA,GAGgBD,EAAAE,EACP3B,EAAAA,EAAS2B,CAAC,EAAGJ,CAAiB,GAH9BvB,EAAAA,EAAS2B,CAAC,CAAC,EAMJJ,GAAAK,CAAA,CAGvBZ,EAAeQ,CAAW,EAC1BV,EAAYD,CAAQ,EACpBI,EAAU,QAAUQ,EAEX,SAAAK,EAAYC,EAAsBC,EAAmB,CACpDD,EAAA,MAAM,IAAM,GAAGC,CAAS,IAAA,CAGlC,SAASC,EAAYF,EAAsB,CACjCA,EAAA,MAAM,IAAM,SAAQ,CAC9B,EAEC,CAACrB,EAAYL,CAAM,CAAC,EAGvB6B,EAAAA,UAAU,IAAM,CACd,GAAI/B,EAAW,CACba,EAAe,CAAC,EAChBL,EAAc,CAAC,EACf,MAAA,CAGEQ,EAAU,SACZ,cAAcA,EAAU,OAAO,EAG3B,MAAAgB,EAAW,YAAY,IAAM,CAG/BxB,EADEI,IAAgBF,EACJ,EAEAI,EAAU,QAAU,CAFnB,CAGjB,EACCf,EAAgB,GAAI,EACvB,OAAAiB,EAAU,QAAUgB,EAEb,IAAM,cAAchB,EAAU,OAAO,GAC3C,CAACjB,EAAeW,EAAUV,EAAWY,CAAW,CAAC,EAEpD,IAAIqB,EAAqB/B,EAAO,UAAWgC,GAAUA,EAAM,KAAOpC,CAAe,EAGjF,MAAMqC,EAAajC,EAAO,MAAM+B,EAAqB,CAAC,EACjC,OAAAA,EAAA,EAGnBjD,EAAA,IAACU,EAAA,CACC,MAAO,CACL,OAAQyC,EACR,gBAAArC,EACA,SAAAY,EACA,YAAAE,EACA,aAAAK,CACF,EAEC,SAAApB,CAAA,CACH,CAEJ,EAEauC,EAAc,IAAM,CACzB,MAAAC,EAAUC,MAAI5C,CAAe,EACnC,GAAI,CAAC2C,EACG,MAAA,IAAI,MAAM,yDAAyD,EAEpE,OAAAA,CACT,EC7IME,EAAgB,CACpB,SAAU,UACV,SAAU,OACZ,EAkBA,SAAwBC,GAAa,CACnC,UAAAC,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,OAAAC,EACA,SAAAnE,EACA,KAAAoE,EACA,MAAAC,EACA,QAAAC,EACA,IAAAC,CACF,EAAsB,CACd,KAAA,CAAE,aAAAC,CAAa,EAAI7D,EAAmB,EAG1C,OAAA8D,EAAA,KAAC,KAAG,CAAA,UAAWC,EAAG,CAAC,QAASN,GAAQ,aAAa,CAAC,EAAG,cAAaG,EAChE,SAAA,CAACnE,EAAA,IAAA,MAAA,CAAI,UAAU,cACZ,SACCoE,EAAApE,EAAA,IAACuE,GAAA,CACC,UAAAd,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,SAAAlE,EACA,OAAAmE,CAAA,CAAA,EAEAJ,EAAQ,EACV3D,EAAA,IAACwE,IAAoB,UAAAf,EAAsB,MAAAE,EAAc,OAAAI,EAAgB,QAAAG,CAAA,CAAkB,EAE1FlE,EAAA,IAAAyE,GAAA,CAAoB,UAAAhB,EAAsB,QAAAS,EAAkB,OAAAH,CAAgB,CAAA,EAEjF,EACC/D,EAAA,IAAA,MAAA,CAAI,UAAU,cAAe,SAAMiE,CAAA,CAAA,CAAA,EACtC,CAEJ,CAEA,SAASQ,GAAoB,CAC3B,UAAAhB,EACA,QAAAS,EACA,OAAAH,CACF,EAAgE,CACxD,MAAAW,EAAQC,EAAWlB,EAAWF,CAAa,EAC3CqB,EAAMD,EAAWT,EAASX,CAAa,EAE7C,OAEIc,EAAA,KAAAQ,WAAA,CAAA,SAAA,CAAA7E,MAAC,QAAK,UAAU,eAAe,MAAO,CAAE,gBAAiB+D,GAAU,EACnE/D,EAAAA,IAAC8E,EAAgB,CAAA,KAAMJ,CAAO,CAAA,EAAE,IAEhC1E,EAAAA,IAAC8E,EAAgB,CAAA,KAAMF,CAAK,CAAA,CAAA,EAC9B,CAEJ,CAEA,SAASJ,GAAoB,CAC3B,UAAAf,EACA,QAAAS,EACA,OAAAH,EACA,MAAAJ,CACF,EAA0E,CAClE,MAAAe,EAAQC,EAAWlB,EAAWF,CAAa,EAC3CqB,EAAMD,EAAWT,EAASX,CAAa,EACvCwB,EAAeJ,EAAWlB,EAAYE,EAAOJ,CAAa,EAC1DyB,EAAaL,EAAWT,EAAUP,EAAOJ,CAAa,EAE5D,OAEIc,EAAA,KAAAQ,WAAA,CAAA,SAAA,CAACR,EAAAA,KAAA,OAAA,CAAK,UAAU,uBACd,SAAA,CAAArE,MAAC,QAAK,UAAU,eAAe,MAAO,CAAE,gBAAiB+D,GAAU,EACnE/D,EAAAA,IAAC8E,EAAgB,CAAA,KAAMJ,CAAO,CAAA,EAAE,IAEhC1E,EAAAA,IAAC8E,EAAgB,CAAA,KAAMF,CAAK,CAAA,CAAA,EAC9B,EACAP,EAAAA,KAAC,OAAK,CAAA,UAAU,qBACd,SAAA,CAACrE,EAAAA,IAAA8E,EAAA,CAAgB,KAAMC,CAAc,CAAA,EAAE,IAEvC/E,EAAAA,IAAC8E,EAAgB,CAAA,KAAME,CAAY,CAAA,CAAA,CACrC,CAAA,CAAA,EACF,CAEJ,CAEA,SAAST,GAAqB,CAC5B,UAAAd,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,OAAAC,EACA,SAAAnE,CACF,EAAkE,CAChE,MAAMqF,EAAoBC,GAAqB,EACzC,CAAE,cAAAC,EAAe,YAAAC,EAAa,WAAAC,CAAe,EAAAC,GACjD,CACE,UAAA7B,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,SAAAlE,CACF,EACAqF,CACF,EAEA,OAEIZ,EAAA,KAAAQ,WAAA,CAAA,SAAA,CAAA7E,MAAC,QAAK,UAAU,eAAe,MAAO,CAAE,gBAAiB+D,GAAU,EAClE/D,EAAA,IAAAuF,EAAA,CAAa,aAAcJ,EAAe,YAAa1B,EAAW,EAAE,IAEpEzD,EAAA,IAAAuF,EAAA,CAAa,aAAcH,EAAa,YAAaC,CAAY,CAAA,CAAA,EACpE,CAEJ,CAOA,SAASE,EAAa,CAAE,aAAAC,EAAc,YAAAC,GAAkC,CAChE,MAAAC,EAAcf,EAAWa,CAAY,EACrCG,EAAgBC,GAAeJ,EAAeC,CAAW,EAC/D,aAAQX,EAAgB,CAAA,UAAW,gBAAgBa,CAAa,GAAI,KAAMD,EAAa,CACzF,CCzJwB,SAAAG,GAAS,CAAE,UAAAhG,GAA4B,CAC7D,KAAM,CAAE,OAAAqB,EAAQ,aAAAe,CAAa,EAAImB,EAAY,EAEzC,OAAAlC,GAAA,YAAAA,EAAQ,QAAS,EACZ,KAINlB,EAAAA,IAAA,KAAA,CAAG,UAAWsE,EAAG,CAAC,WAAYzE,CAAS,CAAC,EAAG,IAAKoC,EAC9C,SAAOf,EAAA,IAAKgC,GAETlD,EAAA,IAACwD,GAAA,CAEC,UAAWN,EAAM,UACjB,UAAWA,EAAM,UACjB,MAAOA,EAAM,MACb,SAAUA,EAAM,SAChB,iBAAkBA,EAAM,iBACxB,WAAYA,EAAM,WAClB,SAAUA,EAAM,SAChB,OAAQA,EAAM,OACd,KAAMA,EAAM,KACZ,MAAOA,EAAM,MACb,QAASA,EAAM,QACf,IAAKA,EAAM,GAAA,EAZNA,EAAM,EAab,CAEH,EACH,CAEJ,CC/BwB,SAAA4C,GAAY,CAAE,UAAAjG,GAA+B,CACnE,KAAM,CAAE,SAAA6B,EAAU,YAAAE,CAAY,EAAIwB,EAAY,EAG9C,OAAI1B,EAAW,GAEX2C,EAAA,KAAC,OAAI,UAAWC,EAAG,CAAC,eAAgBzE,CAAS,CAAC,EAC5C,SAAA,CAACG,EAAAA,IAAA,MAAA,CAAI,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgB,GAAK,8BAA8B,CAAC,EAAG,EACjG5B,EAAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgB,GAAK,8BAA8B,CAAC,EAAG,EACjG5B,EAAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgB,GAAK,8BAA8B,CAAC,EAAG,EACjG5B,EAAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgB,GAAK,8BAA8B,CAAC,EAAG,EACjG5B,EAAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgB,GAAK,8BAA8B,CAAC,EAAG,EACjG5B,EAAA,IAAC,MAAA,CACC,UAAWsE,EAAG,CACZ,qBACA,oCACA1C,EAAc,GAAKA,EAAcF,EAAW,GAAK,8BAClD,CAAA,CAAA,CACH,EACA1B,EAAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgBF,EAAW,GAAK,8BAA8B,CAAC,CAAG,CAAA,EAC5G1B,EAAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgBF,EAAW,GAAK,8BAA8B,CAAC,CAAG,CAAA,EAC5G1B,EAAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgBF,EAAW,GAAK,8BAA8B,CAAC,CAAG,CAAA,EAC5G1B,EAAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgBF,EAAW,GAAK,8BAA8B,CAAC,CAAG,CAAA,EAC5G1B,MAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,qBAAsB1C,IAAgBF,GAAY,8BAA8B,CAAC,CAAG,CAAA,CAAA,EAC1G,EAKF1B,EAAA,IAAC,OAAI,UAAWsE,EAAG,CAAC,eAAgBzE,CAAS,CAAC,EAC3C,SAAA6B,EAAW,GACV,CAAC,GAAG,MAAMA,CAAQ,EAAE,MAAM,EAAE,IAAKc,GAC/BxC,EAAA,IAAC,MAAA,CAEC,UAAWsE,EAAG,CAAC,qBAAsB9B,EAAI,IAAMZ,GAAe,8BAA8B,CAAC,CAAA,EADxFY,CAGR,CAAA,EACL,CAEJ,CCtCA,MAAeuD,GAAAA,EAAAA,KAAKC,EAAc,EAClC,SAASA,GAAetG,EAA4B,CAC5C,KAAA,CAAE,WAAAuG,GAAevG,EAErB,OAAA2E,EAAA,KAACzD,GAAiB,CAAA,gBAAiBqF,EACjC,SAAA,CAACjG,EAAAA,IAAA8F,GAAA,CAAY,UAAU,wBAAyB,CAAA,EAChD9F,EAAAA,IAAC6F,GAAS,CAAA,UAAU,oBAAqB,CAAA,CAAA,EAC3C,CAEJ,CCNO,MAAMK,GAAsB,CACjCC,EACAC,EACAC,IACiB,CACX,MAAAnG,EAAqBoG,EAA4BF,EAAc,CAAC,CAAE,MAAO,OAAQ,MAAO,MAAO,CAAC,CAAC,EACjGG,EAAmBD,EAA4BF,EAAc,CACjE,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,OAAQ,MAAO,MAAO,CAAA,CAChC,EACKI,EAAqBC,GAAuBJ,EAAa,CAAC,CAAE,MAAO,OAAQ,MAAO,MAAO,CAAC,CAAC,EAE1F,MAAA,CACL,CAAE,MAAOlG,EAAY,aAAc,YAAa,GAAM,QAAS,CAACuG,GAAcP,CAAU,CAAC,CAAE,EAC3F,CACE,MAAOhG,EAAY,YACnB,YAAa,GACb,QAAS,CACP,CACE,GAAI,gBACJ,MAAO,uBACP,YAAa,wEACb,KAAM,SACN,OAAQoG,EACR,aAAc,MAAA,CAChB,CAEJ,EACAtG,GAAmBC,CAAkB,EACrC,CACE,MAAOC,EAAY,kBACnB,YAAa,GACb,QAAS,CACP,CACE,GAAI,aACJ,MAAO,aACP,YAAa,mDACb,KAAM,SACN,OAAQqG,EACR,aAAc,MAAA,CAChB,CACF,CAEJ,CACF,EAWA,SAASG,GAAqBtG,EAA+BuG,EAAmD,CAExG,MAAAC,EAAYC,IAAgBF,GAAA,YAAAA,EAAe,IAAIE,KAAQzG,EAAa,IAAIyG,CAAG,EAE1E,MAAA,CACL,gBAAiBD,EAAS,eAAe,EACzC,UAAWA,EAAS,YAAY,CAClC,CACF,CAKO,SAASE,IAAwC,CAChD,KAAA,CAAC1G,CAAY,EAAIG,EAAgB,EACjCwG,EAAc1D,MAAI2D,EAAa,EAO9B,OALSxG,EAAAA,QAAQ,IAAM,CAC5B,MAAMmG,EAAgBI,EAAc,IAAI,gBAAgBA,EAAY,MAAM,EAAI,OACvE,OAAAL,GAAqBtG,EAAcuG,CAAa,CAAA,EACtD,CAACI,EAAa3G,CAAY,CAAC,CAGhC,CCpFO,SAAS6G,GAAWvH,EAA+B,CACxD,OAAQA,GAAW,GAAK,CAC1B,CAKO,SAASwH,GAAmBC,EAA6B,CAC9D,OAAOA,IAAaC,EAAS,IAC/B,CAKgB,SAAAC,GAAkBF,EAAoBG,EAA4B,CAChF,OAAOH,IAAaC,EAAS,MAAQE,IAAUC,GAAW,OAC5D,CAKO,SAASC,GACdC,EACAC,EACAC,EACAC,EACAT,EACA,CACI,GAAAA,IAAaC,EAAS,KACjB,MAAA,CACL,QAAS,GACT,QAAS,OACT,aAAc,OACd,SAAU,GACV,SAAU,OACV,cAAe,MACjB,EAIF,MAAMS,EAAUC,EAAiBL,EAAUE,CAAqB,GAAKI,EAC/DC,EAAeF,EAAiBL,EAAUG,CAAe,EACzDK,EAAWH,EAAiBJ,EAAWC,CAAqB,GAAKI,EACjEG,EAAgBJ,EAAiBJ,EAAWE,CAAe,EAE1D,MAAA,CACL,QAASH,IAAa,KACtB,QAAAI,EACA,aAAAG,EACA,SAAUN,IAAc,KACxB,SAAAO,EACA,cAAAC,CACF,CACF,CC5CO,SAASC,IAA4C,CAE1D,MAAMC,EAAaC,GAAqBC,GAAUA,EAAM,MAAM,EAGxD,CAAE,KAAMC,EAAa,OAAQC,CAAA,EAAkBC,GAAe,EAC9D,CAAE,KAAMrC,EAAa,OAAQsC,CAAA,EAAsBC,GAAe,EAClE,CAAE,KAAMC,EAAU,OAAQC,CAAA,EAAmBC,GAAY,EACzD,CAAE,KAAM3C,EAAc,OAAQ4C,CAAA,EAAuBC,GAAgB,EAEpE,MAAA,CACL,KAAM,CACJ,OAAQT,EACR,aAAApC,EACA,YAAAC,EACA,WAAAgC,EACA,SAAAQ,CACF,EACA,OAAQK,GAAqB,CAACT,EAAeE,EAAmBG,EAAgBE,CAAkB,CAAC,CACrG,CACF,CCVA,SAAwBG,IAAkB,CACxC,KAAM,CAAE,KAAAC,EAAM,OAAAC,CAAO,EAAIjB,GAAiB,EAI1C,OAFAkB,GAAe,WAAW,EAEtBD,IAAW,gBACLE,GAAO,EAAA,EAGbF,IAAW,QACNrJ,EAAA,IAACwJ,GAAU,CAAA,KAAK,4DAA6D,CAAA,EAG/ExJ,MAACyJ,GAAW,CAAA,GAAGL,CAAM,CAAA,CAC9B,CAEA,SAASK,GAAU,CAAE,OAAAvI,EAAQ,aAAAkF,EAAc,YAAAC,EAAa,WAAAgC,EAAY,SAAAQ,GAA2B,CACvF,KAAA,CAAE,mBAAAa,CAAmB,EAAIC,EAAe,EACxC,CAAE,gBAAA9B,EAAiB,UAAA+B,CAAU,EAAI7C,GAAoB,EACrD,CAAE,UAAAY,EAAW,SAAAD,EAAU,QAAAmC,EAAS,gBAAA/I,EAAiB,KAAAgJ,GAASC,GAAmB,EAC7E,CAACC,EAAYC,CAAa,EAAIxI,EAAAA,SAAS,EAAK,EAC5C,CAAE,OAAQyI,CAAa,EAAIC,GAAgB,EAGjDpH,EAAAA,UAAU,IAAM,CACdkH,EAAc,EAAK,EAEb,MAAAG,GAAQ,WAAW,IAAM,CAC7BH,EAAc,EAAI,GACjB,EAAE,EAEE,MAAA,IAAM,aAAaG,EAAK,CAAA,EAC9B,CAACtJ,CAAe,CAAC,EAGd,MAAAuJ,EAAYnJ,EAAO,OAAS,EAC5B,CAAE,QAAAoJ,EAAS,QAAAxC,EAAS,aAAAG,EAAc,SAAAsC,EAAU,SAAArC,EAAU,cAAAC,GAAkBV,GAC5EC,EACAC,EACA,QACAE,EACAiC,EAAK,QACP,EAGMU,EAAiBlD,GAAkBwC,EAAK,SAAUA,EAAK,KAAK,EAC5DW,EAAYD,EAAiB7F,EAAWmF,EAAK,cAAc,EAAInF,EAAWmF,EAAK,SAAS,EAExFY,GAAkB,IAAM,CAC5B,GAAI,CAAAJ,GACCD,EACE,OAAA1F,EAAWkF,EAAQ,aAAc,CAAE,SAAU,UAAW,SAAU,QAAS,CAAA,GACjF,EAEGc,GAAgB,IAAM,CAC1B,GAAI,CAAAL,GACCD,EACE,OAAA1F,EAAWkF,EAAQ,WAAY,CAAE,SAAU,UAAW,SAAU,QAAS,CAAA,GAC/E,EAEH,IAAIe,EAAeC,GAAef,EAAK,QAAS,CAAE,SAAUgB,GAAqB,EACjFF,EAAeG,GAAkBH,CAAY,EAG7C,MAAMI,EAAS,KAAK,IAAI,OAAO,WAAa,GAAI,EAAE,EAC5CC,EAAe9D,GAAmB2C,EAAK,QAAQ,EAC/CoB,EAAeb,GAAaH,EAAe,IAC3CiB,EAAcT,GAAkBC,EAGhCS,EAAgBC,GAAiBxC,GAAA,YAAAA,EAAU,UAAU,EACrDyC,EAAmB7K,EAAA,QACvB,IAAMyF,GAAoBkF,EAAehF,EAAcC,CAAW,EAClE,CAAC+E,EAAehF,EAAcC,CAAW,CAC3C,EAGE,OAAAhC,EAAA,KAAC,OAAI,UAAW,aAAagE,EAAa,SAAW,EAAE,GAAI,cAAY,iBACrE,SAAA,CAAArI,EAAA,IAACuL,GAAiB,CAAA,OAAQC,GAAW,UAAW,YAAaF,EAAkB,EAC/EjH,EAAAA,KAAC,MAAI,CAAA,UAAU,iBACZ,SAAA,EAAAgC,GAAA,YAAAA,EAAa,OAASrG,EAAA,IAAAyL,GAAA,CAAS,KAAMpF,EAAY,KAAM,UAAU,OAAO,EACxErG,EAAA,IAAA,MAAA,CAAI,UAAU,QAAS,WAAY,MAAM,QACzC0L,GAAe,CAAA,CAAA,CAAA,EAClB,EAECT,GAAiBjL,EAAA,IAAAP,GAAA,CAAY,UAAU,qBAAqB,QAASqK,EAAK,QAAS,SAAUA,EAAK,QAAU,CAAA,EAE5G,CAACO,GAAcrK,MAAA2L,GAAA,CAAM,KAAMjC,EAAmB,gBAAgB,EAAG,UAAU,kBAAkB,EAE9FrF,EAAAA,KAAC,MAAI,CAAA,UAAU,iBACZ,SAAA,CACCiG,GAAAjG,EAAA,KAAC,MAAI,CAAA,UAAWC,EAAG,CAAC,QAAS,MAAO0F,GAAc,OAAO,CAAC,EACxD,SAAA,CAAAhK,EAAA,IAAC4L,EAAU,CAAA,MAAO9D,EAAS,UAAWG,EAAc,EACpD5D,EAAAA,KAAC,MAAI,CAAA,UAAU,cACb,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,aACb,SAAA,CAAArE,EAAA,IAAC,MAAI,CAAA,UAAWsE,EAAG,CAAC,oBAAqBkG,GAAkB,qBAAqB,CAAC,EAC9E,SAAiBd,IAAmB,oBAA0C,mBAAvB,EAC1D,EACC1J,EAAA,IAAA8E,EAAA,CAAgB,KAAM2F,EAAW,UAAU,mBAAoB,CAAA,CAAA,EAClE,EACAzK,EAAAA,IAAC,MAAI,CAAA,UAAU,WAAY,CAAA,EAC3BqE,EAAAA,KAAC,MAAI,CAAA,UAAU,aACb,SAAA,CAAArE,MAAC,MAAI,CAAA,UAAU,oBAAqB,SAAA0J,EAAmB,wBAAwB,EAAE,EAChFxC,GAAW4C,EAAK,OAAO,QACrB,MAAI,CAAA,UAAU,oBAAqB,SAAmBJ,EAAA,oBAAoB,EAAE,EAE7E1J,EAAAA,IAAC8E,GAAgB,KAAMH,EAAWmF,EAAK,cAAc,EAAG,UAAU,mBAAoB,CAAA,CAAA,EAE1F,EACA9J,EAAAA,IAAC,MAAI,CAAA,UAAU,WAAY,CAAA,EAC3BqE,EAAAA,KAAC,MAAI,CAAA,UAAU,aACb,SAAA,CAAArE,MAAC,MAAI,CAAA,UAAU,oBAAqB,SAAA0J,EAAmB,oBAAoB,EAAE,EAC5E1J,EAAA,IAAA,MAAA,CAAI,UAAU,oBAAqB,SAAa4K,CAAA,CAAA,CAAA,CACnD,CAAA,CAAA,CACF,CAAA,CAAA,EACF,EAGDO,GACC9G,EAAA,KAAC,MAAI,CAAA,UAAU,QACb,SAAA,CAAArE,MAAC,MAAI,CAAA,UAAU,0BAA2B,SAAA0J,EAAmB,mBAAmB,EAAE,EAClFrF,EAAAA,KAAC,MAAI,CAAA,UAAU,cACb,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,aACb,SAAA,CAACrE,EAAAA,IAAA,MAAA,CAAI,UAAWsE,EAAG,CAAC,oBAAqBkG,GAAkB,qBAAqB,CAAC,EAC9E,SAAmBd,EAAA,wBAAwB,CAC9C,CAAA,EACC1J,EAAA,IAAA8E,EAAA,CAAgB,KAAM4F,EAAgB,UAAU,mBAAoB,CAAA,CAAA,EACvE,EACA1K,EAAAA,IAAC,MAAI,CAAA,UAAU,WAAY,CAAA,EAC3BqE,EAAAA,KAAC,MAAI,CAAA,UAAU,aACb,SAAA,CAAArE,MAAC,MAAI,CAAA,UAAU,oBAAqB,SAAA0J,EAAmB,sBAAsB,EAAE,EAC9E1J,EAAA,IAAA8E,EAAA,CAAgB,KAAM6F,EAAc,UAAU,mBAAoB,CAAA,CAAA,CACrE,CAAA,CAAA,CACF,CAAA,CAAA,EACF,EAGDJ,GAAYF,GACXrK,EAAAA,IAAC4L,EAAU,CAAA,UAAU,QAAQ,MAAM,OAAO,MAAO1D,EAAU,UAAWC,CAAe,CAAA,CAAA,EAEzF,EAEC+C,GAAgBlL,EAAAA,IAACgG,GAAe,CAAA,WAAYlF,CAAiB,CAAA,EAE9DuD,EAAAA,KAAC,MAAI,CAAA,UAAWC,EAAG,CAAC,OAAQ,CAAC4G,GAAgB,eAAe,CAAC,EAC1D,SAAA,CAAAtB,SAAciC,GAAU,CAAA,YAAAxF,EAA0B,KAAM2E,EAAQ,OAAQpB,EAAW,EACpFvF,EAAAA,KAAC,MAAI,CAAA,UAAU,YACZ,SAAA,CAAYgC,EAAA,KAAQrG,EAAAA,IAAA8L,GAAA,CAAO,MAAOzF,EAAY,IAAK,KAAM2E,EAAQ,MAAM,IAAI,UAAU,eAAgB,CAAA,EACrG3E,EAAY,MAAQrG,EAAA,IAAC,OAAI,UAAU,qBAAsB,WAAY,IAAK,CAAA,CAAA,CAC7E,CAAA,CAAA,CACF,CAAA,CAAA,EACF,CAEJ,CAOA,SAAS6L,GAAU,CAAE,YAAAxF,EAAa,KAAA0F,EAAM,OAAAC,GAA0B,CAChE,MAAMC,EAAO5F,EAAY,OAAO,KAAK,CAACjF,EAAO8K,IAC7B,GAAGA,CAAK,IAAI9K,EAAM,KAAK,KACpB4K,CAClB,EAED,OAAKC,EAKH5H,EAAA,KAAC,MAAI,CAAA,UAAU,YACZ,SAAA,CAAA4H,EAAK,KACJjM,EAAA,IAAC,MAAA,CACC,UAAU,iBACV,MAAO+L,EACP,IAAKE,EAAK,IACV,QAAU/I,GAAWA,EAAM,cAAc,MAAM,QAAU,MAAA,CAC3D,EAEFmB,EAAAA,KAAC,MAAI,CAAA,UAAU,eACZ,SAAA,CAAA4H,EAAK,OAAUjM,EAAA,IAAA,MAAA,CAAI,UAAU,mBAAoB,WAAK,MAAM,EAC5DiM,EAAK,OAASjM,EAAA,IAAC,OAAI,UAAU,qBAAsB,WAAK,KAAM,CAAA,CAAA,CACjE,CAAA,CAAA,EACF,EAjBO,IAmBX,CAEA,SAAS0L,IAAiB,CAClB,KAAA,CAAE,mBAAAhC,CAAmB,EAAIC,EAAe,EACxC,CAAE,MAAAwC,CAAM,EAAIC,GAAS,EAGrBC,EAAiB1H,EAAWwH,CAAK,EAGrC,OAAA9H,EAAA,KAAC,MAAI,CAAA,UAAU,kBACb,SAAA,CAAArE,MAAC,MAAI,CAAA,UAAU,QAAS,SAAA0J,EAAmB,iBAAiB,EAAE,EAC7D1J,EAAA,IAAA8E,EAAA,CAAgB,KAAMuH,EAAgB,UAAU,MAAO,CAAA,CAAA,EAC1D,CAEJ"}
1
+ {"version":3,"file":"Backstage-CAjkmeJm.js","sources":["../../src/common/components/progress-bar/ProgressBar.tsx","../../src/views/common/schedule/schedule.options.ts","../../src/views/common/schedule/ScheduleContext.tsx","../../src/views/common/schedule/ScheduleItem.tsx","../../src/views/common/schedule/Schedule.tsx","../../src/views/common/schedule/ScheduleNav.tsx","../../src/views/common/schedule/ScheduleExport.tsx","../../src/views/backstage/backstage.options.ts","../../src/views/backstage/backstage.utils.ts","../../src/views/backstage/useBackstageData.ts","../../src/views/backstage/Backstage.tsx"],"sourcesContent":["import { MaybeNumber } from 'ontime-types';\n\nimport { getProgress } from '../../utils/getProgress';\n\nimport './ProgressBar.scss';\n\ninterface ProgressBarProps {\n current: MaybeNumber;\n duration: MaybeNumber;\n className?: string;\n}\n\nexport default function ProgressBar(props: ProgressBarProps) {\n const { current, duration, className } = props;\n const progress = getProgress(current, duration);\n\n return (\n <div className={`progress-bar__bg ${className}`}>\n <div className='progress-bar__indicator' style={{ width: `${progress}%` }} />\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\n\nimport { SelectOption } from '../../../common/components/select/Select';\nimport { OptionTitle } from '../../../common/components/view-params-editor/constants';\nimport type { ViewOption } from '../../../common/components/view-params-editor/viewParams.types';\nimport { isStringBoolean } from '../../../features/viewers/common/viewUtils';\n\nexport const getScheduleOptions = (customFieldOptions: SelectOption[]): ViewOption => ({\n title: OptionTitle.Schedule,\n collapsible: true,\n options: [\n {\n id: 'filter',\n title: 'Filter',\n description: 'Hide events without data in the selected custom field',\n type: 'option',\n values: customFieldOptions,\n defaultValue: 'none',\n },\n {\n id: 'stopCycle',\n title: 'Stop cycling through event pages',\n description: 'Schedule will not auto-cycle through events',\n type: 'boolean',\n defaultValue: false,\n },\n {\n id: 'cycleInterval',\n title: 'Cycle interval',\n description: 'How long (in seconds) should each schedule page be shown.',\n type: 'number',\n defaultValue: 10,\n },\n {\n id: 'showExpected',\n title: 'Show expected time',\n description: 'Whether the times shown should account for the runtime offset.',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n});\n\ntype ScheduleOptions = {\n filter: string | null;\n cycleInterval: number;\n stopCycle: boolean;\n showExpected: boolean;\n};\n\nfunction getScheduleOptionsFromParams(searchParams: URLSearchParams): ScheduleOptions {\n return {\n filter: searchParams.get('filter'),\n cycleInterval: Number(searchParams.get('cycleInterval')) || 10,\n stopCycle: isStringBoolean(searchParams.get('stopCycle')),\n showExpected: isStringBoolean(searchParams.get('showExpected')),\n };\n}\n\n/**\n * Hook exposes the schedule component options\n */\nexport function useScheduleOptions() {\n const [searchParams] = useSearchParams();\n const options = useMemo(() => getScheduleOptionsFromParams(searchParams), [searchParams]);\n return options;\n}\n","import { createContext, PropsWithChildren, RefObject, use, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { EntryId, isOntimeEvent, OntimeEntry, OntimeEvent } from 'ontime-types';\n\nimport { usePartialRundown } from '../../../common/hooks-query/useRundown';\nimport { ExtendedEntry } from '../../../common/utils/rundownMetadata';\n\nimport { useScheduleOptions } from './schedule.options';\n\ninterface ScheduleContextState {\n events: ExtendedEntry<OntimeEvent>[];\n selectedEventId: string | null;\n numPages: number;\n visiblePage: number;\n containerRef: RefObject<HTMLUListElement | null>;\n}\n\nconst ScheduleContext = createContext<ScheduleContextState | undefined>(undefined);\n\ninterface ScheduleProviderProps {\n selectedEventId: EntryId | null;\n}\n\nexport const ScheduleProvider = ({ children, selectedEventId }: PropsWithChildren<ScheduleProviderProps>) => {\n const { cycleInterval, stopCycle, filter } = useScheduleOptions();\n const { data: events } = usePartialRundown((entry: ExtendedEntry<OntimeEntry>) => {\n if (filter) {\n // custom keys are prepended with custom-\n const customKey = filter.startsWith('custom-') ? filter.slice('custom-'.length) : filter;\n return isOntimeEvent(entry) && Boolean(entry.custom[customKey]);\n }\n return isOntimeEvent(entry);\n });\n\n const [firstIndex, setFirstIndex] = useState(-1);\n const [numPages, setNumPages] = useState(0);\n const [visiblePage, setVisiblePage] = useState(0);\n\n const lastIndex = useRef(-1);\n const paginator = useRef<NodeJS.Timeout>(undefined);\n\n const containerRef = useRef<HTMLUListElement>(null);\n\n // After the view is rendered, we paginate by hiding elements that dont fit\n useLayoutEffect(() => {\n if (!containerRef.current) return;\n\n const children = Array.from(containerRef.current.children) as HTMLElement[];\n if (children.length === 0) {\n return;\n }\n\n const containerHeight = containerRef.current.clientHeight;\n let currentPageHeight = 0; // used to check when we need to paginate\n let currentPage = 1;\n let numPages = 1;\n let lastVisibleIndex = -1; // keep track of last index on screen\n let isShowingElements = false;\n\n for (let i = 0; i < children.length; i++) {\n const currentElementHeight = children[i].clientHeight;\n\n // can we fit this element in the current page?\n const isNextPage = currentPageHeight + currentElementHeight > containerHeight;\n if (isNextPage) {\n currentPageHeight = 0;\n numPages += 1;\n }\n\n // we hide elements that are before and after the first element to show\n if (i < firstIndex) {\n hideElement(children[i]);\n } else if (lastVisibleIndex === -1) {\n isShowingElements = true;\n currentPage = numPages;\n } else if (isNextPage) {\n isShowingElements = false;\n }\n\n if (!isShowingElements) {\n hideElement(children[i]);\n } else {\n lastVisibleIndex = i;\n showElement(children[i], currentPageHeight);\n }\n\n currentPageHeight += currentElementHeight;\n }\n\n setVisiblePage(currentPage);\n setNumPages(numPages);\n lastIndex.current = lastVisibleIndex;\n\n function showElement(element: HTMLElement, yPosition: number) {\n element.style.top = `${yPosition}px`;\n }\n\n function hideElement(element: HTMLElement) {\n element.style.top = `${-1000}px`;\n }\n // we need to add the events to make sure the effect runs on first render\n }, [firstIndex, events]);\n\n // schedule cycling through events\n useEffect(() => {\n if (stopCycle) {\n setVisiblePage(1);\n setFirstIndex(0);\n return;\n }\n\n if (paginator.current) {\n clearInterval(paginator.current);\n }\n\n const interval = setInterval(() => {\n // ensure we cycle back to the first event\n if (visiblePage === numPages) {\n setFirstIndex(0);\n } else {\n setFirstIndex(lastIndex.current + 1);\n }\n }, cycleInterval * 1000);\n paginator.current = interval;\n\n return () => clearInterval(paginator.current);\n }, [cycleInterval, numPages, stopCycle, visiblePage]);\n\n let selectedEventIndex = events.findIndex((event) => event.id === selectedEventId);\n\n // we want to show the event after the current\n const viewEvents = events.slice(selectedEventIndex + 1);\n selectedEventIndex = 0;\n\n return (\n <ScheduleContext\n value={{\n events: viewEvents as ExtendedEntry<OntimeEvent>[],\n selectedEventId,\n numPages,\n visiblePage,\n containerRef,\n }}\n >\n {children}\n </ScheduleContext>\n );\n};\n\nexport const useSchedule = () => {\n const context = use(ScheduleContext);\n if (!context) {\n throw new Error('useSchedule() can only be used inside a ScheduleContext');\n }\n return context;\n};\n","import { OntimeEvent } from 'ontime-types';\n\nimport { useExpectedStartData } from '../../../common/hooks/useSocket';\nimport { getOffsetState } from '../../../common/utils/offset';\nimport { ExtendedEntry } from '../../../common/utils/rundownMetadata';\nimport { cx } from '../../../common/utils/styleUtils';\nimport { formatTime, getExpectedTimesFromExtendedEvent } from '../../../common/utils/time';\nimport SuperscriptTime from '../../../features/viewers/common/superscript-time/SuperscriptTime';\n\nimport { useScheduleOptions } from './schedule.options';\n\nimport './Schedule.scss';\n\nconst formatOptions = {\n format12: 'hh:mm a',\n format24: 'HH:mm',\n};\n\ntype ScheduleItemProps = Pick<\n ExtendedEntry<OntimeEvent>,\n | 'timeStart'\n | 'dayOffset'\n | 'delay'\n | 'totalGap'\n | 'isLinkedToLoaded'\n | 'countToEnd'\n | 'duration'\n | 'colour'\n | 'skip'\n | 'title'\n | 'timeEnd'\n | 'cue'\n>;\n\nexport default function ScheduleItem({\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n colour,\n duration,\n skip,\n title,\n timeEnd,\n cue,\n}: ScheduleItemProps) {\n const { showExpected } = useScheduleOptions();\n\n return (\n <li className={cx(['entry', skip && 'entry--skip'])} data-testid={cue}>\n <div className='entry-times'>\n {showExpected ? (\n <ExpectedScheduleItem\n timeStart={timeStart}\n dayOffset={dayOffset}\n delay={delay}\n totalGap={totalGap}\n isLinkedToLoaded={isLinkedToLoaded}\n countToEnd={countToEnd}\n duration={duration}\n colour={colour}\n />\n ) : delay > 0 ? (\n <DelayedScheduleItem timeStart={timeStart} delay={delay} colour={colour} timeEnd={timeEnd} />\n ) : (\n <PlannedScheduleItem timeStart={timeStart} timeEnd={timeEnd} colour={colour} />\n )}\n </div>\n <div className='entry-title'>{title}</div>\n </li>\n );\n}\n\nfunction PlannedScheduleItem({\n timeStart,\n timeEnd,\n colour,\n}: Pick<ScheduleItemProps, 'timeStart' | 'timeEnd' | 'colour'>) {\n const start = formatTime(timeStart, formatOptions);\n const end = formatTime(timeEnd, formatOptions);\n\n return (\n <>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <SuperscriptTime time={start} />\n →\n <SuperscriptTime time={end} />\n </>\n );\n}\n\nfunction DelayedScheduleItem({\n timeStart,\n timeEnd,\n colour,\n delay,\n}: Pick<ScheduleItemProps, 'timeStart' | 'timeEnd' | 'colour' | 'delay'>) {\n const start = formatTime(timeStart, formatOptions);\n const end = formatTime(timeEnd, formatOptions);\n const delayedStart = formatTime(timeStart + delay, formatOptions);\n const delayedEnd = formatTime(timeEnd + delay, formatOptions);\n\n return (\n <>\n <span className='entry-times--delayed'>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <SuperscriptTime time={start} />\n →\n <SuperscriptTime time={end} />\n </span>\n <span className='entry-times--delay'>\n <SuperscriptTime time={delayedStart} />\n →\n <SuperscriptTime time={delayedEnd} />\n </span>\n </>\n );\n}\n\nfunction ExpectedScheduleItem({\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n colour,\n duration,\n}: Omit<ScheduleItemProps, 'timeEnd' | 'cue' | 'skip' | 'title'>) {\n const expectedStartData = useExpectedStartData();\n const { expectedStart, expectedEnd, plannedEnd } = getExpectedTimesFromExtendedEvent(\n {\n timeStart,\n dayOffset,\n delay,\n totalGap,\n isLinkedToLoaded,\n countToEnd,\n duration,\n },\n expectedStartData,\n );\n\n return (\n <>\n <span className='entry-colour' style={{ backgroundColor: colour }} />\n <ExpectedTime expectedTime={expectedStart} plannedTime={timeStart} />\n →\n <ExpectedTime expectedTime={expectedEnd} plannedTime={plannedEnd} />\n </>\n );\n}\n\ninterface ExpectedTimeProps {\n expectedTime: number;\n plannedTime: number;\n}\n\nfunction ExpectedTime({ expectedTime, plannedTime }: ExpectedTimeProps) {\n const timeDisplay = formatTime(expectedTime);\n const expectedState = getOffsetState(expectedTime - plannedTime);\n return <SuperscriptTime className={`entry-times--${expectedState}`} time={timeDisplay} />;\n}\n","import { cx } from '../../../common/utils/styleUtils';\n\nimport { useSchedule } from './ScheduleContext';\nimport ScheduleItem from './ScheduleItem';\n\nimport './Schedule.scss';\n\ninterface ScheduleProps {\n className?: string;\n}\n\nexport default function Schedule({ className }: ScheduleProps) {\n const { events, containerRef } = useSchedule();\n\n if (events?.length < 1) {\n return null;\n }\n\n return (\n <ul className={cx(['schedule', className])} ref={containerRef}>\n {events.map((event) => {\n return (\n <ScheduleItem\n key={event.id}\n timeStart={event.timeStart}\n dayOffset={event.dayOffset}\n delay={event.delay}\n totalGap={event.totalGap}\n isLinkedToLoaded={event.isLinkedToLoaded}\n countToEnd={event.countToEnd}\n duration={event.duration}\n colour={event.colour}\n skip={event.skip}\n title={event.title}\n timeEnd={event.timeEnd}\n cue={event.cue}\n />\n );\n })}\n </ul>\n );\n}\n","import { cx } from '../../../common/utils/styleUtils';\n\nimport { useSchedule } from './ScheduleContext';\n\nimport './Schedule.scss';\n\ninterface ScheduleNavProps {\n className?: string;\n}\n\nexport default function ScheduleNav({ className }: ScheduleNavProps) {\n const { numPages, visiblePage } = useSchedule();\n\n // cap the amount of elements to 11\n if (numPages > 10) {\n return (\n <div className={cx(['schedule-nav', className])}>\n <div className={cx(['schedule-nav__item', visiblePage === 1 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 2 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 3 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 4 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === 5 && 'schedule-nav__item--selected'])} />\n <div\n className={cx([\n 'schedule-nav__item',\n 'schedule-nav__item--indeterminate',\n visiblePage > 5 && visiblePage < numPages - 4 && 'schedule-nav__item--selected',\n ])}\n />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 4 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 3 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 2 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages - 1 && 'schedule-nav__item--selected'])} />\n <div className={cx(['schedule-nav__item', visiblePage === numPages && 'schedule-nav__item--selected'])} />\n </div>\n );\n }\n\n return (\n <div className={cx(['schedule-nav', className])}>\n {numPages > 1 &&\n [...Array(numPages).keys()].map((i) => (\n <div\n key={i}\n className={cx(['schedule-nav__item', i + 1 === visiblePage && 'schedule-nav__item--selected'])}\n />\n ))}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { MaybeString } from 'ontime-types';\n\nimport Schedule from './Schedule';\nimport { ScheduleProvider } from './ScheduleContext';\nimport ScheduleNav from './ScheduleNav';\n\ninterface ScheduleExportProps {\n selectedId: MaybeString;\n}\n\nexport default memo(ScheduleExport);\nfunction ScheduleExport(props: ScheduleExportProps) {\n const { selectedId } = props;\n return (\n <ScheduleProvider selectedEventId={selectedId}>\n <ScheduleNav className='schedule-nav-container' />\n <Schedule className='schedule-container' />\n </ScheduleProvider>\n );\n}\n","import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, OntimeEvent, ProjectData } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport {\n makeOptionsFromCustomFields,\n makeProjectDataOptions,\n} from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { getScheduleOptions } from '../common/schedule/schedule.options';\n\nexport const getBackstageOptions = (\n timeFormat: string,\n customFields: CustomFields,\n projectData: ProjectData,\n): ViewOption[] => {\n const customFieldOptions = makeOptionsFromCustomFields(customFields, [{ value: 'none', label: 'None' }]);\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'note', label: 'Note' },\n ]);\n const projectDataOptions = makeProjectDataOptions(projectData, [{ value: 'none', label: 'None' }]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'secondary-src',\n title: 'Event secondary text',\n description: 'Select the data source for auxiliary text shown in now and next cards',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n getScheduleOptions(customFieldOptions),\n {\n title: OptionTitle.ElementVisibility,\n collapsible: true,\n options: [\n {\n id: 'extra-info',\n title: 'Extra info',\n description: 'Select a project data source to show in the view',\n type: 'option',\n values: projectDataOptions,\n defaultValue: 'none',\n },\n ],\n },\n ];\n};\n\ntype BackstageOptions = {\n secondarySource: keyof OntimeEvent | null;\n extraInfo: string | null;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): BackstageOptions {\n // Helper to get value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n return {\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n extraInfo: getValue('extra-info'),\n };\n}\n\n/**\n * Hook exposes the backstage view options\n */\nexport function useBackstageOptions(): BackstageOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { MaybeNumber, OntimeEvent, Playback, TimerPhase } from 'ontime-types';\n\nimport { enDash } from '../../common/utils/styleUtils';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\n/**\n * Whether the current time is in overtime\n */\nexport function isOvertime(current: MaybeNumber): boolean {\n return (current ?? 0) < 0;\n}\n\n/**\n * Whether the progress bar should be shown\n */\nexport function getShowProgressBar(playback: Playback): boolean {\n return playback !== Playback.Stop;\n}\n\n/**\n * Whether the playback is pending start (ie: Roll mode waiting to start)\n */\nexport function getIsPendingStart(playback: Playback, phase: TimerPhase): boolean {\n return playback === Playback.Roll && phase === TimerPhase.Pending;\n}\n\n/**\n * What should we be showing in the cards?\n */\nexport function getCardData(\n eventNow: OntimeEvent | null,\n eventNext: OntimeEvent | null,\n mainSource: keyof OntimeEvent | null,\n secondarySource: keyof OntimeEvent | null,\n playback: Playback,\n) {\n if (playback === Playback.Stop) {\n return {\n showNow: false,\n nowMain: undefined,\n nowSecondary: undefined,\n showNext: false,\n nextMain: undefined,\n nextSecondary: undefined,\n };\n }\n\n // if we are loaded, we show the upcoming event as next\n const nowMain = getPropertyValue(eventNow, mainSource ?? 'title') || enDash;\n const nowSecondary = getPropertyValue(eventNow, secondarySource);\n const nextMain = getPropertyValue(eventNext, mainSource ?? 'title') || enDash;\n const nextSecondary = getPropertyValue(eventNext, secondarySource);\n\n return {\n showNow: eventNow !== null,\n nowMain,\n nowSecondary,\n showNext: eventNext !== null,\n nextMain,\n nextSecondary,\n };\n}\n","import { CustomFields, OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundown } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface BackstageData {\n events: OntimeEntry[];\n customFields: CustomFields;\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n}\n\nexport function useBackstageData(): ViewData<BackstageData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundown();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n events: rundownData,\n customFields,\n projectData,\n isMirrored,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport QRCode from 'react-qr-code';\nimport { useViewportSize } from '@mantine/hooks';\nimport { OntimeView, ProjectData } from 'ontime-types';\nimport { millisToString, removeLeadingZero } from 'ontime-utils';\n\nimport ProgressBar from '../../common/components/progress-bar/ProgressBar';\nimport Empty from '../../common/components/state/Empty';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport TitleCard from '../../common/components/title-card/TitleCard';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useBackstageSocket, useClock } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { cx, timerPlaceholderMin } from '../../common/utils/styleUtils';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\nimport ScheduleExport from '../common/schedule/ScheduleExport';\n\nimport { getBackstageOptions, useBackstageOptions } from './backstage.options';\nimport { getCardData, getIsPendingStart, getShowProgressBar, isOvertime } from './backstage.utils';\nimport { BackstageData, useBackstageData } from './useBackstageData';\n\nimport './Backstage.scss';\n\nexport default function BackstageLoader() {\n const { data, status } = useBackstageData();\n\n useWindowTitle('Backstage');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Backstage {...data} />;\n}\n\nfunction Backstage({ events, customFields, projectData, isMirrored, settings }: BackstageData) {\n const { getLocalizedString } = useTranslation();\n const { secondarySource, extraInfo } = useBackstageOptions();\n const { eventNext, eventNow, rundown, selectedEventId, time } = useBackstageSocket();\n const [blinkClass, setBlinkClass] = useState(false);\n const { height: screenHeight } = useViewportSize();\n\n // blink on change\n useEffect(() => {\n setBlinkClass(false);\n\n const timer = setTimeout(() => {\n setBlinkClass(true);\n }, 10);\n\n return () => clearTimeout(timer);\n }, [selectedEventId]);\n\n // gather card data\n const hasEvents = events.length > 0;\n const { showNow, nowMain, nowSecondary, showNext, nextMain, nextSecondary } = getCardData(\n eventNow,\n eventNext,\n 'title',\n secondarySource,\n time.playback,\n );\n\n // gather timer data\n const isPendingStart = getIsPendingStart(time.playback, time.phase);\n const startedAt = isPendingStart ? formatTime(time.secondaryTimer) : formatTime(time.startedAt);\n\n const scheduledStart = (() => {\n if (showNow) return undefined;\n if (!hasEvents) return undefined;\n return formatTime(rundown.plannedStart, { format12: 'hh:mm a', format24: 'HH:mm' });\n })();\n\n const scheduledEnd = (() => {\n if (showNow) return undefined;\n if (!hasEvents) return undefined;\n return formatTime(rundown.plannedEnd, { format12: 'hh:mm a', format24: 'HH:mm' });\n })();\n\n let displayTimer = millisToString(time.current, { fallback: timerPlaceholderMin });\n displayTimer = removeLeadingZero(displayTimer);\n\n // gather presentation styles\n const qrSize = Math.max(window.innerWidth / 15, 72);\n const showProgress = getShowProgressBar(time.playback);\n const showSchedule = hasEvents && screenHeight > 420; // in vertical screens we may not have space\n const showPending = scheduledStart && scheduledEnd;\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const backstageOptions = useMemo(\n () => getBackstageOptions(defaultFormat, customFields, projectData),\n [defaultFormat, customFields, projectData],\n );\n\n return (\n <div className={`backstage ${isMirrored ? 'mirror' : ''}`} data-testid='backstage-view'>\n <ViewParamsEditor target={OntimeView.Backstage} viewOptions={backstageOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <BackstageClock />\n </div>\n\n {showProgress && <ProgressBar className='progress-container' current={time.current} duration={time.duration} />}\n\n {!hasEvents && <Empty text={getLocalizedString('common.no_data')} className='empty-container' />}\n\n <div className='card-container'>\n {showNow && (\n <div className={cx(['event', 'now', blinkClass && 'blink'])}>\n <TitleCard title={nowMain} secondary={nowSecondary} />\n <div className='timer-group'>\n <div className='time-entry'>\n <div className={cx(['time-entry__label', isPendingStart && 'time-entry--pending'])}>\n {isPendingStart ? getLocalizedString('countdown.waiting') : getLocalizedString('common.started_at')}\n </div>\n <SuperscriptTime time={startedAt} className='time-entry__value' />\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.expected_finish')}</div>\n {isOvertime(time.current) ? (\n <div className='time-entry__value'>{getLocalizedString('countdown.overtime')}</div>\n ) : (\n <SuperscriptTime time={formatTime(time.expectedFinish)} className='time-entry__value' />\n )}\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.stage_timer')}</div>\n <div className='time-entry__value'>{displayTimer}</div>\n </div>\n </div>\n </div>\n )}\n\n {showPending && (\n <div className='event'>\n <div className='title-card__placeholder'>{getLocalizedString('countdown.waiting')}</div>\n <div className='timer-group'>\n <div className='time-entry'>\n <div className={cx(['time-entry__label', isPendingStart && 'time-entry--pending'])}>\n {getLocalizedString('common.scheduled_start')}\n </div>\n <SuperscriptTime time={scheduledStart} className='time-entry__value' />\n </div>\n <div className='timer-gap' />\n <div className='time-entry'>\n <div className='time-entry__label'>{getLocalizedString('common.scheduled_end')}</div>\n <SuperscriptTime time={scheduledEnd} className='time-entry__value' />\n </div>\n </div>\n </div>\n )}\n\n {showNext && hasEvents && (\n <TitleCard className='event' label='next' title={nextMain} secondary={nextSecondary} />\n )}\n </div>\n\n {showSchedule && <ScheduleExport selectedId={selectedEventId} />}\n\n <div className={cx(['info', !showSchedule && 'info--stretch'])}>\n {extraInfo && <ExtraInfo projectData={projectData} size={qrSize} source={extraInfo} />}\n <div className='info-card'>\n {projectData.url && <QRCode value={projectData.url} size={qrSize} level='L' className='info-card__qr' />}\n {projectData.info && <div className='info-card__message'>{projectData.info}</div>}\n </div>\n </div>\n </div>\n );\n}\n\ninterface ExtraInfoProps {\n projectData: ProjectData;\n size: number;\n source: string;\n}\nfunction ExtraInfo({ projectData, size, source }: ExtraInfoProps) {\n const info = projectData.custom.find((entry, index) => {\n const label = `${index}-${entry.title}`;\n return label === source;\n });\n\n if (!info) {\n return null;\n }\n\n return (\n <div className='info-card'>\n {info.url && (\n <img\n className='info-card__img'\n width={size}\n src={info.url}\n onError={(event) => (event.currentTarget.style.display = 'none')}\n />\n )}\n <div className='info__column'>\n {info.title && <div className='info-card__label'>{info.title}</div>}\n {info.value && <div className='info-card__message'>{info.value}</div>}\n </div>\n </div>\n );\n}\n\nfunction BackstageClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["ProgressBar","props","current","duration","className","progress","getProgress","jsx","getScheduleOptions","customFieldOptions","OptionTitle","getScheduleOptionsFromParams","searchParams","isStringBoolean","useScheduleOptions","useSearchParams","useMemo","ScheduleContext","createContext","ScheduleProvider","children","selectedEventId","cycleInterval","stopCycle","filter","events","usePartialRundown","entry","customKey","isOntimeEvent","firstIndex","setFirstIndex","useState","numPages","setNumPages","visiblePage","setVisiblePage","lastIndex","useRef","paginator","containerRef","useLayoutEffect","containerHeight","currentPageHeight","currentPage","lastVisibleIndex","isShowingElements","i","currentElementHeight","isNextPage","showElement","element","yPosition","hideElement","useEffect","interval","selectedEventIndex","event","viewEvents","useSchedule","context","use","formatOptions","ScheduleItem","timeStart","dayOffset","delay","totalGap","isLinkedToLoaded","countToEnd","colour","skip","title","timeEnd","cue","showExpected","jsxs","cx","ExpectedScheduleItem","DelayedScheduleItem","PlannedScheduleItem","start","formatTime","end","Fragment","SuperscriptTime","delayedStart","delayedEnd","expectedStartData","useExpectedStartData","expectedStart","expectedEnd","plannedEnd","getExpectedTimesFromExtendedEvent","ExpectedTime","expectedTime","plannedTime","timeDisplay","expectedState","getOffsetState","Schedule","ScheduleNav","memo","ScheduleExport","selectedId","getBackstageOptions","timeFormat","customFields","projectData","makeOptionsFromCustomFields","secondaryOptions","projectDataOptions","makeProjectDataOptions","getTimeOption","getOptionsFromParams","defaultValues","getValue","key","useBackstageOptions","maybePreset","PresetContext","isOvertime","getShowProgressBar","playback","Playback","getIsPendingStart","phase","TimerPhase","getCardData","eventNow","eventNext","mainSource","secondarySource","nowMain","getPropertyValue","enDash","nowSecondary","nextMain","nextSecondary","useBackstageData","isMirrored","useViewOptionsStore","state","rundownData","rundownStatus","useFlatRundown","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","BackstageLoader","data","status","useWindowTitle","Loader","EmptyPage","Backstage","getLocalizedString","useTranslation","extraInfo","rundown","time","useBackstageSocket","blinkClass","setBlinkClass","screenHeight","useViewportSize","timer","hasEvents","showNow","showNext","isPendingStart","startedAt","scheduledStart","scheduledEnd","displayTimer","millisToString","timerPlaceholderMin","removeLeadingZero","qrSize","showProgress","showSchedule","showPending","defaultFormat","getDefaultFormat","backstageOptions","ViewParamsEditor","OntimeView","ViewLogo","BackstageClock","Empty","TitleCard","ExtraInfo","QRCode","size","source","info","index","clock","useClock","formattedClock"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{l as tt,h as g,j as t,v as et,a8 as st,t as nt,a9 as ot,aa as U,T as z}from"./vendor-Cu5xgv5K.js";import{P as at,b as E,j as B,k as rt,f as O,g as P,M as V,l as it,F as ct,m as lt,i as D,B as w,n as dt,o as ut,p as $,q as W,r as mt,t as pt,u as ft,d as xt,L as ht,h as gt,O as jt,s as St}from"./index-5QAOtSTh.js";import{u as yt,i as wt,a as bt}from"./useRundown-D8CYATNi.js";import{E as L}from"./Empty-BYF0tVRk.js";import{E as vt}from"./EmptyPage-DYH2bswA.js";import{V as _t}from"./ViewLogo-Dd60EREE.js";import{m as Ct,O as F,i as Nt,g as G,V as kt}from"./ViewParamsEditor-BWEYbq_S.js";import{u as Dt}from"./useWindowTitle-b5fN0StF.js";import{S as T}from"./SuperscriptTime-DCTyUARx.js";import{g as Ft,a as Et}from"./viewLoader.utils-BPhACxyG.js";import{u as Ot}from"./useFollowComponent-iGQv4zoS.js";import{u as q}from"./useReport-PEFRsOhF.js";import{g as H}from"./offset-CLDSqOP5.js";import{F as Tt}from"./FollowButton-DyWsvyFF.js";import{u as At}from"./useCustomFields-BuxKsqGS.js";import{u as Lt}from"./useProjectData-CetvEK9E.js";import"./Select-niU9Razm.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="7eb8c97a-7df1-4ba7-9a75-a460f4b249ab",e._sentryDebugIdIdentifier="sentry-dbid-7eb8c97a-7df1-4ba7-9a75-a460f4b249ab")}catch{}})();const Pt=(e,s,o)=>{const a=Ct(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]);return[{title:F.ClockOptions,collapsible:!0,options:[Ft(e)]},{title:F.DataSources,collapsible:!0,options:[{id:"secondary-src",title:"Event secondary text",description:"Select the data source for auxiliary text shown in the card",type:"option",values:a,defaultValue:"none"}]},{title:F.BehaviourOptions,collapsible:!0,options:[{id:"showExpected",title:"Show expected time",description:"Whether the times shown should account for the runtime offset.",type:"boolean",defaultValue:!1}]},{title:F.Hidden,options:[{id:"sub",title:"Event subscription",description:"The events to follow",values:o,type:"persist"}]}]};function It(e,s){const o=n=>(s==null?void 0:s.get(n))??e.get(n);return{subscriptions:(n=>s!=null&&s.has(n)?s.getAll(n):e.getAll(n))("sub"),secondarySource:o("secondary-src"),showExpected:Nt(o("showExpected"))}}function I(){const[e]=tt(),s=g.use(at);return g.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return It(e,a)},[s,e])}const N="h:mm a",k="HH:mm";function Rt(e,s,o){return e===s&&o!==E.Armed}const y={future:"countdown.to_start",due:"timeline.due",live:"countdown.running",pending:"countdown.waiting",loaded:"countdown.loaded",done:"countdown.ended"};function K(e){const{playback:s,current:o,clock:a}=rt(),{getLocalizedString:n}=O(),r=c=>c<=0?n("countdown.overtime").toUpperCase():it(c,c>V*2).replace("m",`${n("common.minutes")} `).replace("s",n("common.seconds"));return e.isLoaded?s===E.Armed?{status:"loaded",statusDisplay:n(y.loaded),timeDisplay:r(e.duration)}:{status:"live",statusDisplay:n(y.live),timeDisplay:r(o??0)}:s===E.Stop||s===E.Armed?{status:"pending",statusDisplay:n(y.pending),timeDisplay:" "}:e.isPast?{status:"done",statusDisplay:n(y.done),timeDisplay:P(e.endedAt,{format12:N,format24:k})}:e.expectedStart-a<=0?{status:"due",statusDisplay:n(y.future),timeDisplay:n(y.due).toUpperCase()}:{status:"future",statusDisplay:n(y.future),timeDisplay:r(e.expectedStart-a)}}function Mt(e,s){const o=new URL(e),a=new URLSearchParams;for(const[n,r]of o.searchParams.entries())n!=="sub"&&a.append(n,r);return s.forEach(n=>{a.append("sub",n)}),o.search=a.toString(),o}function zt(e,s){return s.filter(o=>e.includes(o.id))}function Ht(e,s){return Math.abs(e-s)>V}function Ut(e,s,o,a,n,r,c){const{totalGap:m,isLinkedToLoaded:d}=e,i=B(e,{currentDay:s,totalGap:m,actualStart:o,plannedStart:a,isLinkedToLoaded:d,offset:n,mode:r}),{endedAt:l}=c[e.id]??{endedAt:null};return{...e,expectedStart:i,endedAt:l}}function _(e){const{value:s,preferredFormat12:o=ct,preferredFormat24:a=lt,className:n}=e,r=P(s,{format12:o,format24:a});return t.jsx(T,{className:n,time:r})}function Bt({events:e,subscriptions:s,disableEdit:o}){const[a,n]=g.useState(s),r=et(),c=i=>{n(l=>l.includes(i)?l.filter(p=>p!==i):[...l,i])},m=()=>{const i=a.filter(p=>e.some(f=>f.id===p)),l=Mt(window.location.href,i);o(),n([]),r(l.search.toString())},d=new Set(a);return t.jsxs("div",{className:"list-container",children:[e.map((i,l)=>{const p=i.title||"{no title}",f=d.has(i.id);return t.jsxs("div",{role:"button",tabIndex:0,onClick:()=>c(i.id),onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(c(i.id),x.stopPropagation())},className:D(["sub",f&&"sub--selected"]),children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":(i==null?void 0:i.colour)??""}}),t.jsxs("div",{className:"sub__schedule",children:[t.jsx(_,{value:i.timeStart,preferredFormat12:"h:mm",preferredFormat24:"HH:mm"}),"→",t.jsx(_,{value:i.timeEnd,preferredFormat12:"h:mm",preferredFormat24:"HH:mm"})]}),t.jsx("div",{className:"sub__label",children:f?"Click to remove":"Click to add"}),t.jsx("div",{className:"sub__title",children:p})]},l)}),t.jsxs("div",{className:"fab-container",children:[t.jsxs(w,{variant:"subtle",size:"xlarge",onClick:o,children:[t.jsx(st,{})," Go back"]}),t.jsxs(w,{variant:"subtle",size:"xlarge",onClick:()=>n([]),disabled:a.length===0,children:[t.jsx(nt,{})," Clear"]}),t.jsxs(w,{variant:"primary",size:"xlarge",disabled:e.length<1,onClick:m,children:[t.jsx(ot,{})," Save"]})]})]})}function Vt({subscribedEvents:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=I(),{playback:n}=dt(),{selectedEventId:r}=ut(),c=$(!0),{data:m}=q(),{offset:d,currentDay:i,actualStart:l,plannedStart:p,mode:f}=W(),x=g.useRef(null),[j,b]=g.useState(!1),S=g.useRef(null),h=g.useRef(null),J=Ot({followRef:S,scrollRef:h,doFollow:!j,topOffset:0,followTrigger:r});g.useEffect(()=>{var u;r||j||(u=h.current)==null||u.scrollTo(0,0)},[r,j,h]);const X=()=>{r&&J(),b(!1)},Y=pt(()=>{if(S!=null&&S.current&&(h!=null&&h.current)){const u=S.current.getBoundingClientRect(),C=h.current.getBoundingClientRect();if(u&&C){const v=u.top-C.top,A=v<-8||v>50;b(A)}}},1e3),R=()=>{x.current&&clearTimeout(x.current),Y()};return t.jsxs("div",{className:"list-container",onWheel:R,onTouchMove:R,ref:h,children:[e.map(u=>{const C=G(u,o),v=Rt(u.id,r,n),A=!v&&u.id===r,M=Ut(u,i,l,p,d,f,m),Z=u.title.length?u.title:" ";return t.jsxs("div",{ref:v?S:void 0,className:D(["sub",v&&"sub--live",A&&"sub--armed"]),"data-testid":u.cue,children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":u.colour}}),t.jsx(Q,{event:M,showExpected:a}),t.jsx($t,{event:M}),t.jsx("div",{className:D(["sub__title",!u.title&&"subdued"]),children:Z}),C&&t.jsx("div",{className:"sub__secondary",children:C})]},u.id)}),t.jsx("div",{className:D(["fab-container",!c&&"fab-container--hidden"]),children:t.jsxs(w,{variant:"primary",size:"xlarge",onClick:s,children:[t.jsx(U,{})," Edit"]})}),t.jsx(Tt,{isVisible:j,onClickHandler:X})]})}function Q(e){const{event:s,showExpected:o}=e,{timeStart:a,duration:n,delay:r,expectedStart:c,countToEnd:m}=s,d=a+r+s.dayOffset*mt,i=o&&Ht(d,c),l=i?"sub__schedule--strike":r!==0?"sub__schedule--delayed":"",p=`sub__schedule--${H(c-d)}`,f=d+n+r,x=m?Math.max(c+n,f):c+n,j=`sub__schedule--${H(x-f)}`;return t.jsxs("div",{className:"sub__schedule",children:[t.jsx(_,{value:d,preferredFormat12:N,preferredFormat24:k,className:l}),!i&&t.jsxs(t.Fragment,{children:["→",t.jsx(_,{value:f,preferredFormat12:N,preferredFormat24:k,className:l})]}),i&&t.jsxs(t.Fragment,{children:[t.jsx(_,{value:c,className:p,preferredFormat12:N,preferredFormat24:k}),"→",t.jsx(_,{value:x,className:j,preferredFormat12:N,preferredFormat24:k})]})]})}function $t({event:e}){const{status:s,statusDisplay:o,timeDisplay:a}=K(e);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"sub__status",children:o}),s==="done"?t.jsx(T,{className:"sub__timer",time:a}):t.jsx("div",{className:"sub__timer",children:a})]})}function Wt({subscribedEvent:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=I(),n=$(!0),{data:r}=q(),{offset:c,currentDay:m,actualStart:d,plannedStart:i,mode:l}=W(),{totalGap:p,isLinkedToLoaded:f}=e,x=B(e,{currentDay:m,totalGap:p,actualStart:d,plannedStart:i,isLinkedToLoaded:f,offset:c,mode:l}),{endedAt:j}=r[e.id]??{endedAt:null},b={...e,expectedStart:x,endedAt:j},S=e.title.length?e.title:" ",h=G(e,o);return t.jsxs("div",{className:"single-container","data-testid":"countdown-event",children:[t.jsx(Gt,{event:b}),t.jsxs("div",{className:"event__title",style:{borderColor:b.colour},children:[t.jsx(Q,{event:b,showExpected:a}),S,h&&t.jsx("div",{className:"secondary",children:h})]}),t.jsx("div",{className:D(["fab-container",!n&&"fab-container--hidden"]),children:t.jsxs(w,{variant:"primary",size:"xlarge",onClick:s,children:[t.jsx(U,{})," Edit"]})})]})}function Gt({event:e}){const{status:s,statusDisplay:o,timeDisplay:a}=K(e);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"event__status",children:o}),s==="done"?t.jsx(T,{className:"event__timer",time:a}):t.jsx("div",{className:"event__timer",children:a})]})}function qt(){const e=ft(i=>i.mirror),{data:s,status:o}=yt(),{data:a,status:n}=Lt(),{data:r,status:c}=xt(),{data:m,status:d}=At();return{data:{customFields:m,rundownData:s,projectData:a,isMirrored:e,settings:r},status:Et([o,n,c,d])}}function xe(){const{data:e,status:s}=qt();return Dt("Countdown"),s==="pending"?t.jsx(ht,{}):s==="error"?t.jsx(vt,{text:"There was an error fetching data, please refresh the page."}):t.jsx(Kt,{...e})}function Kt({customFields:e,rundownData:s,projectData:o,isMirrored:a,settings:n}){const{getLocalizedString:r}=O(),{subscriptions:c}=I(),[m,d]=g.useState(!1),i=s.filter(x=>wt(x)&&bt(x)),l=i.length>0,p=gt(n==null?void 0:n.timeFormat),f=g.useMemo(()=>Pt(p,e,c),[p,e,c]);return t.jsxs("div",{className:`countdown ${a?"mirror":""}`,"data-testid":"countdown-view",children:[t.jsx(kt,{target:jt.Countdown,viewOptions:f}),t.jsxs("div",{className:"project-header",children:[(o==null?void 0:o.logo)&&t.jsx(_t,{name:o.logo,className:"logo"}),t.jsx("div",{className:"title",children:o.title}),t.jsx(Jt,{})]}),!l&&t.jsx(L,{text:r("common.no_data"),className:"empty-container"}),l&&m&&t.jsx(Bt,{events:i,subscriptions:c,disableEdit:()=>d(!1)}),l&&!m&&t.jsx(Qt,{playableEvents:i,subscriptions:c,goToEditMode:()=>d(!0)})]})}function Qt({playableEvents:e,subscriptions:s,goToEditMode:o}){const{getLocalizedString:a}=O();if(s.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(L,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(z,{})," Add"]})]});const n=zt(s,e);if(n.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(L,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(z,{})," Add"]})]});if(n.length===1){const r=n.at(0);return r?t.jsx(Wt,{subscribedEvent:r,goToEditMode:o}):null}return t.jsx(Vt,{subscribedEvents:n,goToEditMode:o})}function Jt(){const{getLocalizedString:e}=O(),{clock:s}=St(),o=P(s);return t.jsxs("div",{className:"clock-container",children:[t.jsx("div",{className:"label",children:e("common.time_now")}),t.jsx(T,{time:o,className:"time"})]})}export{xe as default};
2
- //# sourceMappingURL=Countdown-DVRZbeRP.js.map
1
+ import{l as tt,h as g,j as t,v as et,a8 as st,t as nt,a9 as ot,aa as U,T as z}from"./vendor-CCiSQ9k9.js";import{P as at,b as E,j as B,k as rt,f as O,g as P,M as V,l as it,F as ct,m as lt,i as D,B as w,n as dt,o as ut,p as $,q as W,r as mt,t as pt,u as ft,d as xt,L as ht,h as gt,O as jt,s as St}from"./index-BQEUaoAf.js";import{u as yt,i as wt,a as bt}from"./useRundown-BfpjcCEJ.js";import{E as L}from"./Empty-gWT_HMeu.js";import{E as vt}from"./EmptyPage-Dcbg6rmF.js";import{V as _t}from"./ViewLogo-_3Z1hIHi.js";import{m as Ct,O as F,i as Nt,g as G,V as kt}from"./ViewParamsEditor-Bca1TIDW.js";import{u as Dt}from"./useWindowTitle-DqdFTWns.js";import{S as T}from"./SuperscriptTime-CIrcMcyg.js";import{g as Ft,a as Et}from"./viewLoader.utils-CmM-4-pk.js";import{u as Ot}from"./useFollowComponent-Ctfhf2or.js";import{u as q}from"./useReport-B4dMYcNL.js";import{g as H}from"./offset-DJAHqjFW.js";import{F as Tt}from"./FollowButton-CSqJSvix.js";import{u as At}from"./useCustomFields-DqCYz8Kt.js";import{u as Lt}from"./useProjectData-C1hVamxc.js";import"./Select-CedN80WS.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},s=new e.Error().stack;s&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[s]="7eb8c97a-7df1-4ba7-9a75-a460f4b249ab",e._sentryDebugIdIdentifier="sentry-dbid-7eb8c97a-7df1-4ba7-9a75-a460f4b249ab")}catch{}})();const Pt=(e,s,o)=>{const a=Ct(s,[{value:"none",label:"None"},{value:"note",label:"Note"}]);return[{title:F.ClockOptions,collapsible:!0,options:[Ft(e)]},{title:F.DataSources,collapsible:!0,options:[{id:"secondary-src",title:"Event secondary text",description:"Select the data source for auxiliary text shown in the card",type:"option",values:a,defaultValue:"none"}]},{title:F.BehaviourOptions,collapsible:!0,options:[{id:"showExpected",title:"Show expected time",description:"Whether the times shown should account for the runtime offset.",type:"boolean",defaultValue:!1}]},{title:F.Hidden,options:[{id:"sub",title:"Event subscription",description:"The events to follow",values:o,type:"persist"}]}]};function It(e,s){const o=n=>(s==null?void 0:s.get(n))??e.get(n);return{subscriptions:(n=>s!=null&&s.has(n)?s.getAll(n):e.getAll(n))("sub"),secondarySource:o("secondary-src"),showExpected:Nt(o("showExpected"))}}function I(){const[e]=tt(),s=g.use(at);return g.useMemo(()=>{const a=s?new URLSearchParams(s.search):void 0;return It(e,a)},[s,e])}const N="h:mm a",k="HH:mm";function Rt(e,s,o){return e===s&&o!==E.Armed}const y={future:"countdown.to_start",due:"timeline.due",live:"countdown.running",pending:"countdown.waiting",loaded:"countdown.loaded",done:"countdown.ended"};function K(e){const{playback:s,current:o,clock:a}=rt(),{getLocalizedString:n}=O(),r=c=>c<=0?n("countdown.overtime").toUpperCase():it(c,c>V*2).replace("m",`${n("common.minutes")} `).replace("s",n("common.seconds"));return e.isLoaded?s===E.Armed?{status:"loaded",statusDisplay:n(y.loaded),timeDisplay:r(e.duration)}:{status:"live",statusDisplay:n(y.live),timeDisplay:r(o??0)}:s===E.Stop||s===E.Armed?{status:"pending",statusDisplay:n(y.pending),timeDisplay:" "}:e.isPast?{status:"done",statusDisplay:n(y.done),timeDisplay:P(e.endedAt,{format12:N,format24:k})}:e.expectedStart-a<=0?{status:"due",statusDisplay:n(y.future),timeDisplay:n(y.due).toUpperCase()}:{status:"future",statusDisplay:n(y.future),timeDisplay:r(e.expectedStart-a)}}function Mt(e,s){const o=new URL(e),a=new URLSearchParams;for(const[n,r]of o.searchParams.entries())n!=="sub"&&a.append(n,r);return s.forEach(n=>{a.append("sub",n)}),o.search=a.toString(),o}function zt(e,s){return s.filter(o=>e.includes(o.id))}function Ht(e,s){return Math.abs(e-s)>V}function Ut(e,s,o,a,n,r,c){const{totalGap:m,isLinkedToLoaded:d}=e,i=B(e,{currentDay:s,totalGap:m,actualStart:o,plannedStart:a,isLinkedToLoaded:d,offset:n,mode:r}),{endedAt:l}=c[e.id]??{endedAt:null};return{...e,expectedStart:i,endedAt:l}}function _(e){const{value:s,preferredFormat12:o=ct,preferredFormat24:a=lt,className:n}=e,r=P(s,{format12:o,format24:a});return t.jsx(T,{className:n,time:r})}function Bt({events:e,subscriptions:s,disableEdit:o}){const[a,n]=g.useState(s),r=et(),c=i=>{n(l=>l.includes(i)?l.filter(p=>p!==i):[...l,i])},m=()=>{const i=a.filter(p=>e.some(f=>f.id===p)),l=Mt(window.location.href,i);o(),n([]),r(l.search.toString())},d=new Set(a);return t.jsxs("div",{className:"list-container",children:[e.map((i,l)=>{const p=i.title||"{no title}",f=d.has(i.id);return t.jsxs("div",{role:"button",tabIndex:0,onClick:()=>c(i.id),onKeyDown:x=>{(x.key==="Enter"||x.key===" ")&&(c(i.id),x.stopPropagation())},className:D(["sub",f&&"sub--selected"]),children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":(i==null?void 0:i.colour)??""}}),t.jsxs("div",{className:"sub__schedule",children:[t.jsx(_,{value:i.timeStart,preferredFormat12:"h:mm",preferredFormat24:"HH:mm"}),"→",t.jsx(_,{value:i.timeEnd,preferredFormat12:"h:mm",preferredFormat24:"HH:mm"})]}),t.jsx("div",{className:"sub__label",children:f?"Click to remove":"Click to add"}),t.jsx("div",{className:"sub__title",children:p})]},l)}),t.jsxs("div",{className:"fab-container",children:[t.jsxs(w,{variant:"subtle",size:"xlarge",onClick:o,children:[t.jsx(st,{})," Go back"]}),t.jsxs(w,{variant:"subtle",size:"xlarge",onClick:()=>n([]),disabled:a.length===0,children:[t.jsx(nt,{})," Clear"]}),t.jsxs(w,{variant:"primary",size:"xlarge",disabled:e.length<1,onClick:m,children:[t.jsx(ot,{})," Save"]})]})]})}function Vt({subscribedEvents:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=I(),{playback:n}=dt(),{selectedEventId:r}=ut(),c=$(!0),{data:m}=q(),{offset:d,currentDay:i,actualStart:l,plannedStart:p,mode:f}=W(),x=g.useRef(null),[j,b]=g.useState(!1),S=g.useRef(null),h=g.useRef(null),J=Ot({followRef:S,scrollRef:h,doFollow:!j,topOffset:0,followTrigger:r});g.useEffect(()=>{var u;r||j||(u=h.current)==null||u.scrollTo(0,0)},[r,j,h]);const X=()=>{r&&J(),b(!1)},Y=pt(()=>{if(S!=null&&S.current&&(h!=null&&h.current)){const u=S.current.getBoundingClientRect(),C=h.current.getBoundingClientRect();if(u&&C){const v=u.top-C.top,A=v<-8||v>50;b(A)}}},1e3),R=()=>{x.current&&clearTimeout(x.current),Y()};return t.jsxs("div",{className:"list-container",onWheel:R,onTouchMove:R,ref:h,children:[e.map(u=>{const C=G(u,o),v=Rt(u.id,r,n),A=!v&&u.id===r,M=Ut(u,i,l,p,d,f,m),Z=u.title.length?u.title:" ";return t.jsxs("div",{ref:v?S:void 0,className:D(["sub",v&&"sub--live",A&&"sub--armed"]),"data-testid":u.cue,children:[t.jsx("div",{className:"sub__binder",style:{"--user-color":u.colour}}),t.jsx(Q,{event:M,showExpected:a}),t.jsx($t,{event:M}),t.jsx("div",{className:D(["sub__title",!u.title&&"subdued"]),children:Z}),C&&t.jsx("div",{className:"sub__secondary",children:C})]},u.id)}),t.jsx("div",{className:D(["fab-container",!c&&"fab-container--hidden"]),children:t.jsxs(w,{variant:"primary",size:"xlarge",onClick:s,children:[t.jsx(U,{})," Edit"]})}),t.jsx(Tt,{isVisible:j,onClickHandler:X})]})}function Q(e){const{event:s,showExpected:o}=e,{timeStart:a,duration:n,delay:r,expectedStart:c,countToEnd:m}=s,d=a+r+s.dayOffset*mt,i=o&&Ht(d,c),l=i?"sub__schedule--strike":r!==0?"sub__schedule--delayed":"",p=`sub__schedule--${H(c-d)}`,f=d+n+r,x=m?Math.max(c+n,f):c+n,j=`sub__schedule--${H(x-f)}`;return t.jsxs("div",{className:"sub__schedule",children:[t.jsx(_,{value:d,preferredFormat12:N,preferredFormat24:k,className:l}),!i&&t.jsxs(t.Fragment,{children:["→",t.jsx(_,{value:f,preferredFormat12:N,preferredFormat24:k,className:l})]}),i&&t.jsxs(t.Fragment,{children:[t.jsx(_,{value:c,className:p,preferredFormat12:N,preferredFormat24:k}),"→",t.jsx(_,{value:x,className:j,preferredFormat12:N,preferredFormat24:k})]})]})}function $t({event:e}){const{status:s,statusDisplay:o,timeDisplay:a}=K(e);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"sub__status",children:o}),s==="done"?t.jsx(T,{className:"sub__timer",time:a}):t.jsx("div",{className:"sub__timer",children:a})]})}function Wt({subscribedEvent:e,goToEditMode:s}){const{secondarySource:o,showExpected:a}=I(),n=$(!0),{data:r}=q(),{offset:c,currentDay:m,actualStart:d,plannedStart:i,mode:l}=W(),{totalGap:p,isLinkedToLoaded:f}=e,x=B(e,{currentDay:m,totalGap:p,actualStart:d,plannedStart:i,isLinkedToLoaded:f,offset:c,mode:l}),{endedAt:j}=r[e.id]??{endedAt:null},b={...e,expectedStart:x,endedAt:j},S=e.title.length?e.title:" ",h=G(e,o);return t.jsxs("div",{className:"single-container","data-testid":"countdown-event",children:[t.jsx(Gt,{event:b}),t.jsxs("div",{className:"event__title",style:{borderColor:b.colour},children:[t.jsx(Q,{event:b,showExpected:a}),S,h&&t.jsx("div",{className:"secondary",children:h})]}),t.jsx("div",{className:D(["fab-container",!n&&"fab-container--hidden"]),children:t.jsxs(w,{variant:"primary",size:"xlarge",onClick:s,children:[t.jsx(U,{})," Edit"]})})]})}function Gt({event:e}){const{status:s,statusDisplay:o,timeDisplay:a}=K(e);return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"event__status",children:o}),s==="done"?t.jsx(T,{className:"event__timer",time:a}):t.jsx("div",{className:"event__timer",children:a})]})}function qt(){const e=ft(i=>i.mirror),{data:s,status:o}=yt(),{data:a,status:n}=Lt(),{data:r,status:c}=xt(),{data:m,status:d}=At();return{data:{customFields:m,rundownData:s,projectData:a,isMirrored:e,settings:r},status:Et([o,n,c,d])}}function xe(){const{data:e,status:s}=qt();return Dt("Countdown"),s==="pending"?t.jsx(ht,{}):s==="error"?t.jsx(vt,{text:"There was an error fetching data, please refresh the page."}):t.jsx(Kt,{...e})}function Kt({customFields:e,rundownData:s,projectData:o,isMirrored:a,settings:n}){const{getLocalizedString:r}=O(),{subscriptions:c}=I(),[m,d]=g.useState(!1),i=s.filter(x=>wt(x)&&bt(x)),l=i.length>0,p=gt(n==null?void 0:n.timeFormat),f=g.useMemo(()=>Pt(p,e,c),[p,e,c]);return t.jsxs("div",{className:`countdown ${a?"mirror":""}`,"data-testid":"countdown-view",children:[t.jsx(kt,{target:jt.Countdown,viewOptions:f}),t.jsxs("div",{className:"project-header",children:[(o==null?void 0:o.logo)&&t.jsx(_t,{name:o.logo,className:"logo"}),t.jsx("div",{className:"title",children:o.title}),t.jsx(Jt,{})]}),!l&&t.jsx(L,{text:r("common.no_data"),className:"empty-container"}),l&&m&&t.jsx(Bt,{events:i,subscriptions:c,disableEdit:()=>d(!1)}),l&&!m&&t.jsx(Qt,{playableEvents:i,subscriptions:c,goToEditMode:()=>d(!0)})]})}function Qt({playableEvents:e,subscriptions:s,goToEditMode:o}){const{getLocalizedString:a}=O();if(s.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(L,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(z,{})," Add"]})]});const n=zt(s,e);if(n.length===0)return t.jsxs("div",{className:"empty-container",children:[t.jsx(L,{text:a("countdown.select_event"),className:"empty-container"}),t.jsxs(w,{variant:"primary",size:"xlarge",onClick:o,children:[t.jsx(z,{})," Add"]})]});if(n.length===1){const r=n.at(0);return r?t.jsx(Wt,{subscribedEvent:r,goToEditMode:o}):null}return t.jsx(Vt,{subscribedEvents:n,goToEditMode:o})}function Jt(){const{getLocalizedString:e}=O(),{clock:s}=St(),o=P(s);return t.jsxs("div",{className:"clock-container",children:[t.jsx("div",{className:"label",children:e("common.time_now")}),t.jsx(T,{time:o,className:"time"})]})}export{xe as default};
2
+ //# sourceMappingURL=Countdown-ChuA9az_.js.map