@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 +1 @@
1
- {"version":3,"file":"Countdown-DVRZbeRP.js","sources":["../../src/views/countdown/countdown.options.ts","../../src/views/countdown/countdown.utils.ts","../../src/features/viewers/common/clock-time/ClockTime.tsx","../../src/views/countdown/CountdownSelect.tsx","../../src/views/countdown/CountdownSubscriptions.tsx","../../src/views/countdown/SingleEventCountdown.tsx","../../src/views/countdown/useCountdownData.ts","../../src/views/countdown/Countdown.tsx"],"sourcesContent":["import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, EntryId, OntimeEvent } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../features/viewers/common/viewUtils';\n\nexport const getCountdownOptions = (\n timeFormat: string,\n customFields: CustomFields,\n persistedSubscriptions: EntryId[],\n): ViewOption[] => {\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'note', label: 'Note' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'secondary-src',\n title: 'Event secondary text',\n description: 'Select the data source for auxiliary text shown in the card',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.BehaviourOptions,\n collapsible: true,\n options: [\n {\n id: 'showExpected',\n title: 'Show expected time',\n description: 'Whether the times shown should account for the runtime offset.',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.Hidden,\n options: [\n {\n id: 'sub',\n title: 'Event subscription',\n description: 'The events to follow',\n values: persistedSubscriptions,\n type: 'persist',\n },\n ],\n },\n ];\n};\n\ntype CountdownOptions = {\n subscriptions: EntryId[];\n secondarySource: keyof OntimeEvent | null;\n showExpected: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): CountdownOptions {\n // Helper to get single value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Helper to get array values from either source\n const getArrayValues = (key: string): EntryId[] => {\n if (defaultValues?.has(key)) {\n return defaultValues.getAll(key) as EntryId[];\n }\n return searchParams.getAll(key) as EntryId[];\n };\n\n return {\n subscriptions: getArrayValues('sub'),\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n showExpected: isStringBoolean(getValue('showExpected')),\n };\n}\n\n/**\n * Hook exposes the countdown view options\n */\nexport function useCountdownOptions(): CountdownOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { EntryId, MaybeNumber, OffsetMode, OntimeEntry, OntimeEvent, OntimeReport, Playback } from 'ontime-types';\nimport { getExpectedStart, MILLIS_PER_MINUTE, removeSeconds } from 'ontime-utils';\n\nimport { useCountdownSocket } from '../../common/hooks/useSocket';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { timerPlaceholderMin } from '../../common/utils/styleUtils';\nimport { formatDuration, formatTime } from '../../common/utils/time';\nimport { type TranslationKey, useTranslation } from '../../translation/TranslationProvider';\n\n/**\n * Parses string as a title\n */\nexport function sanitiseTitle(title: string | null) {\n return title ?? '{no title}';\n}\n\nexport const preferredFormat12 = 'h:mm a';\nexport const preferredFormat24 = 'HH:mm';\n\n/**\n * Whether the current event is live\n */\nexport function getIsLive(currentId: EntryId, selectedId: EntryId | null, playback: Playback): boolean {\n return currentId === selectedId && playback !== Playback.Armed;\n}\n\nexport type ProgressStatus = 'future' | 'due' | 'live' | 'done' | 'pending' | 'loaded';\ntype TimerMessage = Record<ProgressStatus, TranslationKey>;\n\nexport const timerProgress: TimerMessage = {\n future: 'countdown.to_start',\n due: 'timeline.due',\n live: 'countdown.running',\n pending: 'countdown.waiting',\n loaded: 'countdown.loaded',\n done: 'countdown.ended',\n};\n\nexport function getFormattedTime(\n value: MaybeNumber,\n status: ProgressStatus,\n minText: string,\n secText: string,\n dueText: string,\n) {\n if (value === null) return timerPlaceholderMin;\n if (status === 'future' || status === 'live') {\n if (value <= 0) return dueText.toUpperCase();\n return formatDuration(value, value > MILLIS_PER_MINUTE * 2)\n .replace('m', `${minText} `)\n .replace('s', secText);\n }\n return removeSeconds(formatTime(value));\n}\n\n/**\n * Returns a parsed timer and relevant status message\n * Handles events in different days but disregards whether an event has actually played\n */\nexport function useSubscriptionDisplayData(\n subscribedEvent: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number },\n): { status: ProgressStatus; statusDisplay: string; timeDisplay: string } {\n const { playback, current, clock } = useCountdownSocket();\n const { getLocalizedString } = useTranslation();\n\n const bigDuration = (value: number) => {\n if (value <= 0) return getLocalizedString('countdown.overtime').toUpperCase();\n return formatDuration(value, value > MILLIS_PER_MINUTE * 2)\n .replace('m', `${getLocalizedString('common.minutes')} `)\n .replace('s', getLocalizedString('common.seconds'));\n };\n\n if (subscribedEvent.isLoaded) {\n if (playback === Playback.Armed) {\n return {\n status: 'loaded',\n statusDisplay: getLocalizedString(timerProgress['loaded']),\n timeDisplay: bigDuration(subscribedEvent.duration),\n };\n }\n\n return {\n status: 'live',\n statusDisplay: getLocalizedString(timerProgress['live']),\n timeDisplay: bigDuration(current ?? 0),\n };\n }\n\n if (playback === Playback.Stop || playback === Playback.Armed) {\n return {\n status: 'pending',\n statusDisplay: getLocalizedString(timerProgress['pending']),\n timeDisplay: ' ',\n };\n }\n\n if (subscribedEvent.isPast) {\n return {\n status: 'done',\n statusDisplay: getLocalizedString(timerProgress['done']),\n timeDisplay: formatTime(subscribedEvent.endedAt, { format12: preferredFormat12, format24: preferredFormat24 }),\n };\n }\n\n if (subscribedEvent.expectedStart - clock <= 0) {\n return {\n status: 'due',\n statusDisplay: getLocalizedString(timerProgress['future']), // We use future here on purpose for the look of it\n timeDisplay: getLocalizedString(timerProgress['due']).toUpperCase(),\n };\n }\n\n return {\n status: 'future',\n statusDisplay: getLocalizedString(timerProgress['future']),\n timeDisplay: bigDuration(subscribedEvent.expectedStart - clock),\n };\n}\n\n/**\n * Adds a set of subscriptions to the URL parameters\n */\nexport function makeSubscriptionsUrl(urlRef: string, subscriptions: EntryId[]) {\n const url = new URL(urlRef);\n const newParams = new URLSearchParams();\n\n // copy existing parameters except for 'sub'\n for (const [key, value] of url.searchParams.entries()) {\n if (key !== 'sub') {\n newParams.append(key, value);\n }\n }\n\n // add new subscriptions\n subscriptions.forEach((id) => {\n newParams.append('sub', id);\n });\n\n url.search = newParams.toString();\n\n return url;\n}\n\n/**\n * Returns an array of events subscribed events ordered by scheduled\n * Since the original array is already ordered, we simply filter out the events\n * which are not in the subscriptions list.\n */\nexport function getOrderedSubscriptions<T extends OntimeEntry>(subscriptions: EntryId[], playableEvents: T[]): T[] {\n return playableEvents.filter((event) => subscriptions.includes(event.id));\n}\n\n/**\n * Checks through the rundown whether the current event is linked to the loaded event\n */\nexport function isLinkedToLoadedEvent(events: OntimeEvent[], loadedId: EntryId | null, currentId: EntryId): boolean {\n // if nothing is loaded, we return true to simplify the logic\n if (!loadedId) {\n return true;\n }\n\n const loadedIndex = events.findIndex((event) => event.id === loadedId);\n if (loadedIndex === -1) {\n return true;\n }\n\n for (let i = loadedIndex; i < events.length; i++) {\n const event = events[i];\n if (event.id === currentId) {\n return true;\n }\n\n if (event.linkStart === null) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function isOutsideRange(a: number, b: number): boolean {\n return Math.abs(a - b) > MILLIS_PER_MINUTE;\n}\n\nexport type CountdownEvent = ExtendedEntry<OntimeEvent> & { expectedStart: number; endedAt: MaybeNumber };\n\nexport function extendEventData(\n event: ExtendedEntry<OntimeEvent>,\n currentDay: number,\n actualStart: MaybeNumber,\n plannedStart: MaybeNumber,\n offset: number,\n mode: OffsetMode,\n reportData: OntimeReport,\n): CountdownEvent {\n const { totalGap, isLinkedToLoaded } = event;\n const expectedStart = getExpectedStart(event, {\n currentDay,\n totalGap,\n actualStart,\n plannedStart,\n isLinkedToLoaded,\n offset,\n mode,\n });\n const { endedAt } = reportData[event.id] ?? { endedAt: null };\n return { ...event, expectedStart, endedAt };\n}\n","/**\n * encapsulate logic related to showing a clock timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\n\nimport { formatTime } from '../../../../common/utils/time';\nimport { FORMAT_12, FORMAT_24 } from '../../../../viewerConfig';\nimport SuperscriptTime from '../superscript-time/SuperscriptTime';\n\ninterface ClockTimeProps {\n value: MaybeNumber;\n preferredFormat12?: string;\n preferredFormat24?: string;\n className?: string;\n}\n\nexport default function ClockTime(props: ClockTimeProps) {\n const { value, preferredFormat12 = FORMAT_12, preferredFormat24 = FORMAT_24, className } = props;\n\n // TODO: should we get the params from URL here to see if the user is overriding the default?\n const formattedTime = formatTime(value, { format12: preferredFormat12, format24: preferredFormat24 });\n\n return <SuperscriptTime className={className} time={formattedTime} />;\n}\n","import { useState } from 'react';\nimport { IoArrowBack, IoClose, IoSaveOutline } from 'react-icons/io5';\nimport { useNavigate } from 'react-router';\nimport { EntryId, PlayableEvent } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport { cx } from '../../common/utils/styleUtils';\nimport ClockTime from '../../features/viewers/common/clock-time/ClockTime';\n\nimport { makeSubscriptionsUrl } from './countdown.utils';\n\nimport './Countdown.scss';\n\ninterface CountdownSelectProps {\n events: PlayableEvent[];\n subscriptions: EntryId[];\n disableEdit: () => void;\n}\n\nexport default function CountdownSelect({ events, subscriptions, disableEdit }: CountdownSelectProps) {\n const [selected, setSelected] = useState<EntryId[]>(subscriptions);\n const navigate = useNavigate();\n\n /**\n * Toggles an entry from the selected set\n */\n const toggleSelect = (entryId: EntryId) => {\n setSelected((prev) => {\n if (prev.includes(entryId)) {\n // If the entry is already selected, remove it\n return prev.filter((id) => id !== entryId);\n }\n return [...prev, entryId];\n });\n };\n\n /**\n * Creates a URL with the selected subscriptions\n * and navigates to it\n */\n const applySelection = () => {\n // we remove events that no longer exist to avoid stale subscriptions\n const filteredSelected = selected.filter((id) => events.some((event) => event.id === id));\n const url = makeSubscriptionsUrl(window.location.href, filteredSelected);\n disableEdit();\n setSelected([]);\n navigate(url.search.toString());\n };\n\n // make a copy of the selected array for quick lookup\n const selectedIds = new Set(selected);\n\n return (\n <div className='list-container'>\n {events.map((event, index) => {\n const title = event.title || '{no title}';\n const isSelected = selectedIds.has(event.id);\n\n return (\n <div\n key={index}\n role='button'\n tabIndex={0}\n onClick={() => toggleSelect(event.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n toggleSelect(event.id);\n e.stopPropagation();\n }\n }}\n className={cx(['sub', isSelected && 'sub--selected'])}\n >\n <div className='sub__binder' style={{ '--user-color': event?.colour ?? '' }} />\n <div className='sub__schedule'>\n <ClockTime value={event.timeStart} preferredFormat12='h:mm' preferredFormat24='HH:mm' />\n →\n <ClockTime value={event.timeEnd} preferredFormat12='h:mm' preferredFormat24='HH:mm' />\n </div>\n <div className='sub__label'>{isSelected ? 'Click to remove' : 'Click to add'}</div>\n <div className='sub__title'>{title}</div>\n </div>\n );\n })}\n\n <div className='fab-container'>\n <Button variant='subtle' size='xlarge' onClick={disableEdit}>\n <IoArrowBack /> Go back\n </Button>\n <Button variant='subtle' size='xlarge' onClick={() => setSelected([])} disabled={selected.length === 0}>\n <IoClose /> Clear\n </Button>\n <Button variant='primary' size='xlarge' disabled={events.length < 1} onClick={applySelection}>\n <IoSaveOutline /> Save\n </Button>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { IoPencil } from 'react-icons/io5';\nimport { MaybeNumber, OntimeEvent } from 'ontime-types';\nimport { dayInMs } from 'ontime-utils';\n\nimport Button from '../../common/components/buttons/Button';\nimport { useFadeOutOnInactivity } from '../../common/hooks/useFadeOutOnInactivity';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useExpectedStartData, usePlayback, useSelectedEventId } from '../../common/hooks/useSocket';\nimport useReport from '../../common/hooks-query/useReport';\nimport { getOffsetState } from '../../common/utils/offset';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport FollowButton from '../../features/operator/follow-button/FollowButton';\nimport ClockTime from '../../features/viewers/common/clock-time/ClockTime';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\nimport { useCountdownOptions } from './countdown.options';\nimport {\n CountdownEvent,\n extendEventData,\n getIsLive,\n isOutsideRange,\n preferredFormat12,\n preferredFormat24,\n useSubscriptionDisplayData,\n} from './countdown.utils';\n\nimport './Countdown.scss';\n\ninterface CountdownSubscriptionsProps {\n subscribedEvents: ExtendedEntry<OntimeEvent>[];\n goToEditMode: () => void;\n}\n\nexport default function CountdownSubscriptions({ subscribedEvents, goToEditMode }: CountdownSubscriptionsProps) {\n const { secondarySource, showExpected } = useCountdownOptions();\n const { playback } = usePlayback();\n const { selectedEventId } = useSelectedEventId();\n const showFab = useFadeOutOnInactivity(true);\n\n const { data: reportData } = useReport();\n const { offset, currentDay, actualStart, plannedStart, mode } = useExpectedStartData();\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n const [lockAutoScroll, setLockAutoScroll] = useState(false);\n const selectedRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollToComponent = useFollowComponent({\n followRef: selectedRef,\n scrollRef,\n doFollow: !lockAutoScroll,\n topOffset: 0,\n followTrigger: selectedEventId,\n });\n\n // reset scroll if nothing is selected\n useEffect(() => {\n if (!selectedEventId) {\n if (!lockAutoScroll) {\n scrollRef.current?.scrollTo(0, 0);\n }\n }\n }, [selectedEventId, lockAutoScroll, scrollRef]);\n\n // scroll to component if user clicks the Follow button\n const handleOffset = () => {\n if (selectedEventId) {\n scrollToComponent();\n }\n setLockAutoScroll(false);\n };\n\n // prevent considering automated scrolls as user scrolls\n const handleUserScroll = () => {\n if (selectedRef?.current && scrollRef?.current) {\n const selectedRect = selectedRef.current.getBoundingClientRect();\n const scrollerRect = scrollRef.current.getBoundingClientRect();\n if (selectedRect && scrollerRect) {\n const distanceFromTop = selectedRect.top - scrollerRect.top;\n const hasScrolledOutOfThreshold = distanceFromTop < -8 || distanceFromTop > 50;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n // when the user scrolls we check if we need to show the button\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n\n throttledHandleScroll();\n };\n\n return (\n <div className='list-container' onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {subscribedEvents.map((event) => {\n const secondaryData = getPropertyValue(event, secondarySource);\n const isLive = getIsLive(event.id, selectedEventId, playback);\n const isArmed = !isLive && event.id === selectedEventId;\n const countdownEvent = extendEventData(event, currentDay, actualStart, plannedStart, offset, mode, reportData);\n const title = event.title.length ? event.title : ' '; // insert utf-8 empty space to avoid the line collapsing\n return (\n <div\n key={event.id}\n ref={isLive ? selectedRef : undefined}\n className={cx(['sub', isLive && 'sub--live', isArmed && 'sub--armed'])}\n data-testid={event.cue}\n >\n <div className='sub__binder' style={{ '--user-color': event.colour }} />\n <ScheduleTime event={countdownEvent} showExpected={showExpected} />\n <SubscriptionStatus event={countdownEvent} />\n <div className={cx(['sub__title', !event.title && 'subdued'])}>{title}</div>\n {secondaryData && <div className='sub__secondary'>{secondaryData}</div>}\n </div>\n );\n })}\n <div className={cx(['fab-container', !showFab && 'fab-container--hidden'])}>\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoPencil /> Edit\n </Button>\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n\ntype ScheduleTimeProps = {\n event: CountdownEvent;\n showExpected: boolean;\n};\n//TODO: consider relative mode\nexport function ScheduleTime(props: ScheduleTimeProps) {\n const { event, showExpected } = props;\n const { timeStart, duration, delay, expectedStart, countToEnd } = event;\n\n const plannedStart = timeStart + delay + event.dayOffset * dayInMs;\n\n // only show new exacted value if outside range of the planned value\n const isExpectedValueShow = showExpected && isOutsideRange(plannedStart, expectedStart);\n\n const plannedStateClass = isExpectedValueShow ? 'sub__schedule--strike' : delay !== 0 ? 'sub__schedule--delayed' : '';\n\n const expectedStateClass = `sub__schedule--${getOffsetState(expectedStart - plannedStart)}`;\n const plannedEnd = plannedStart + duration + delay;\n const expectedEnd = countToEnd ? Math.max(expectedStart + duration, plannedEnd) : expectedStart + duration;\n const expectedEndClass = `sub__schedule--${getOffsetState(expectedEnd - plannedEnd)}`;\n\n return (\n <div className='sub__schedule'>\n <ClockTime\n value={plannedStart}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n className={plannedStateClass}\n />\n {!isExpectedValueShow && (\n <>\n →\n <ClockTime\n value={plannedEnd}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n className={plannedStateClass}\n />\n </>\n )}\n {isExpectedValueShow && (\n <>\n <ClockTime\n value={expectedStart}\n className={expectedStateClass}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n />\n →\n <ClockTime\n value={expectedEnd}\n className={expectedEndClass}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n />\n </>\n )}\n </div>\n );\n}\n\ninterface SubscriptionStatusProps {\n event: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number };\n}\n\nfunction SubscriptionStatus({ event }: SubscriptionStatusProps) {\n const { status, statusDisplay, timeDisplay } = useSubscriptionDisplayData(event);\n\n return (\n <>\n <div className='sub__status'>{statusDisplay}</div>\n {status === 'done' ? (\n <SuperscriptTime className='sub__timer' time={timeDisplay} />\n ) : (\n <div className='sub__timer'>{timeDisplay}</div>\n )}\n </>\n );\n}\n","import { IoPencil } from 'react-icons/io5';\nimport { MaybeNumber, OntimeEvent } from 'ontime-types';\nimport { getExpectedStart } from 'ontime-utils';\n\nimport Button from '../../common/components/buttons/Button';\nimport { useFadeOutOnInactivity } from '../../common/hooks/useFadeOutOnInactivity';\nimport { useExpectedStartData } from '../../common/hooks/useSocket';\nimport useReport from '../../common/hooks-query/useReport';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\nimport { useCountdownOptions } from './countdown.options';\nimport { useSubscriptionDisplayData } from './countdown.utils';\nimport { ScheduleTime } from './CountdownSubscriptions';\n\nimport './SingleEventCountdown.scss';\n\ninterface SingleEventCountdownProps {\n subscribedEvent: ExtendedEntry<OntimeEvent>;\n goToEditMode: () => void;\n}\n\nexport default function SingleEventCountdown({ subscribedEvent, goToEditMode }: SingleEventCountdownProps) {\n const { secondarySource, showExpected } = useCountdownOptions();\n const showFab = useFadeOutOnInactivity(true);\n const { data: reportData } = useReport();\n\n const { offset, currentDay, actualStart, plannedStart, mode } = useExpectedStartData();\n const { totalGap, isLinkedToLoaded } = subscribedEvent;\n const expectedStart = getExpectedStart(subscribedEvent, {\n currentDay,\n totalGap,\n actualStart,\n plannedStart,\n isLinkedToLoaded,\n offset,\n mode,\n });\n\n const { endedAt } = reportData[subscribedEvent.id] ?? { endedAt: null };\n const countdownEvent = { ...subscribedEvent, expectedStart, endedAt };\n const title = subscribedEvent.title.length ? subscribedEvent.title : ' '; // insert utf-8 empty space to avoid the line collapsing\n const secondaryData = getPropertyValue(subscribedEvent, secondarySource);\n\n return (\n <div className='single-container' data-testid='countdown-event'>\n <SubscriptionStatus event={countdownEvent} />\n <div className='event__title' style={{ borderColor: countdownEvent.colour }}>\n <ScheduleTime event={countdownEvent} showExpected={showExpected} />\n {title}\n {secondaryData && <div className='secondary'>{secondaryData}</div>}\n </div>\n <div className={cx(['fab-container', !showFab && 'fab-container--hidden'])}>\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoPencil /> Edit\n </Button>\n </div>\n </div>\n );\n}\n\ninterface SubscriptionStatusProps {\n event: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number };\n}\n\nfunction SubscriptionStatus({ event }: SubscriptionStatusProps) {\n const { status, statusDisplay, timeDisplay } = useSubscriptionDisplayData(event);\n\n return (\n <>\n <div className='event__status'>{statusDisplay}</div>\n {status === 'done' ? (\n <SuperscriptTime className='event__timer' time={timeDisplay} />\n ) : (\n <div className='event__timer'>{timeDisplay}</div>\n )}\n </>\n );\n}\n","import { CustomFields, OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface CountdownData {\n customFields: CustomFields;\n rundownData: ExtendedEntry<OntimeEntry>[];\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n}\n\nexport function useCountdownData(): ViewData<CountdownData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundownWithMetadata();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n customFields,\n rundownData,\n projectData,\n isMirrored,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useMemo, useState } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { EntryId, isOntimeEvent, isPlayableEvent, OntimeEvent, OntimeView } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport Empty from '../../common/components/state/Empty';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useClock } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport { getCountdownOptions, useCountdownOptions } from './countdown.options';\nimport { getOrderedSubscriptions } from './countdown.utils';\nimport CountdownSelect from './CountdownSelect';\nimport CountdownSubscriptions from './CountdownSubscriptions';\nimport SingleEventCountdown from './SingleEventCountdown';\nimport { CountdownData, useCountdownData } from './useCountdownData';\n\nimport './Countdown.scss';\n\nexport default function CountdownLoader() {\n const { data, status } = useCountdownData();\n\n useWindowTitle('Countdown');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Countdown {...data} />;\n}\n\nfunction Countdown({ customFields, rundownData, projectData, isMirrored, settings }: CountdownData) {\n const { getLocalizedString } = useTranslation();\n const { subscriptions } = useCountdownOptions();\n\n const [editMode, setEditMode] = useState(false);\n\n // gather rundown data\n const playableEvents = rundownData.filter((entry) => isOntimeEvent(entry) && isPlayableEvent(entry));\n\n // gather presentation data\n const hasEvents = playableEvents.length > 0;\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const countdownOptions = useMemo(\n () => getCountdownOptions(defaultFormat, customFields, subscriptions),\n [defaultFormat, customFields, subscriptions],\n );\n\n return (\n <div className={`countdown ${isMirrored ? 'mirror' : ''}`} data-testid='countdown-view'>\n <ViewParamsEditor target={OntimeView.Countdown} viewOptions={countdownOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <CountdownClock />\n </div>\n\n {!hasEvents && <Empty text={getLocalizedString('common.no_data')} className='empty-container' />}\n\n {hasEvents && editMode && (\n <CountdownSelect events={playableEvents} subscriptions={subscriptions} disableEdit={() => setEditMode(false)} />\n )}\n\n {hasEvents && !editMode && (\n <CountdownContents\n playableEvents={playableEvents}\n subscriptions={subscriptions}\n goToEditMode={() => setEditMode(true)}\n />\n )}\n </div>\n );\n}\n\ninterface CountdownContentsProps {\n playableEvents: ExtendedEntry<OntimeEvent>[];\n subscriptions: EntryId[];\n goToEditMode: () => void;\n}\n\nfunction CountdownContents({ playableEvents, subscriptions, goToEditMode }: CountdownContentsProps) {\n const { getLocalizedString } = useTranslation();\n\n if (subscriptions.length === 0) {\n return (\n <div className='empty-container'>\n <Empty text={getLocalizedString('countdown.select_event')} className='empty-container' />\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoAdd /> Add\n </Button>\n </div>\n );\n }\n\n const subscribedEvents = getOrderedSubscriptions(subscriptions, playableEvents);\n\n if (subscribedEvents.length === 0) {\n return (\n <div className='empty-container'>\n <Empty text={getLocalizedString('countdown.select_event')} className='empty-container' />\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoAdd /> Add\n </Button>\n </div>\n );\n }\n\n if (subscribedEvents.length === 1) {\n const event = subscribedEvents.at(0);\n if (!event) return null;\n return <SingleEventCountdown subscribedEvent={event} goToEditMode={goToEditMode} />;\n }\n\n return <CountdownSubscriptions subscribedEvents={subscribedEvents} goToEditMode={goToEditMode} />;\n}\n\nfunction CountdownClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["getCountdownOptions","timeFormat","customFields","persistedSubscriptions","secondaryOptions","makeOptionsFromCustomFields","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","isStringBoolean","useCountdownOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","preferredFormat12","preferredFormat24","getIsLive","currentId","selectedId","playback","Playback","timerProgress","useSubscriptionDisplayData","subscribedEvent","current","clock","useCountdownSocket","getLocalizedString","useTranslation","bigDuration","value","formatDuration","MILLIS_PER_MINUTE","formatTime","makeSubscriptionsUrl","urlRef","subscriptions","url","newParams","id","getOrderedSubscriptions","playableEvents","event","isOutsideRange","a","b","extendEventData","currentDay","actualStart","plannedStart","offset","mode","reportData","totalGap","isLinkedToLoaded","expectedStart","getExpectedStart","endedAt","ClockTime","props","FORMAT_12","FORMAT_24","className","formattedTime","jsx","SuperscriptTime","CountdownSelect","events","disableEdit","selected","setSelected","useState","navigate","useNavigate","toggleSelect","entryId","prev","applySelection","filteredSelected","selectedIds","jsxs","index","title","isSelected","e","cx","Button","IoArrowBack","IoClose","IoSaveOutline","CountdownSubscriptions","subscribedEvents","goToEditMode","secondarySource","showExpected","usePlayback","selectedEventId","useSelectedEventId","showFab","useFadeOutOnInactivity","useReport","useExpectedStartData","timeoutId","useRef","lockAutoScroll","setLockAutoScroll","selectedRef","scrollRef","scrollToComponent","useFollowComponent","useEffect","_a","handleOffset","throttledHandleScroll","throttle","selectedRect","scrollerRect","distanceFromTop","hasScrolledOutOfThreshold","handleScroll","secondaryData","getPropertyValue","isLive","isArmed","countdownEvent","ScheduleTime","SubscriptionStatus","IoPencil","FollowButton","timeStart","duration","delay","countToEnd","dayInMs","isExpectedValueShow","plannedStateClass","expectedStateClass","getOffsetState","plannedEnd","expectedEnd","expectedEndClass","Fragment","status","statusDisplay","timeDisplay","SingleEventCountdown","useCountdownData","isMirrored","useViewOptionsStore","state","rundownData","rundownStatus","useFlatRundownWithMetadata","projectData","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","CountdownLoader","data","useWindowTitle","Loader","EmptyPage","Countdown","editMode","setEditMode","entry","isOntimeEvent","isPlayableEvent","hasEvents","defaultFormat","getDefaultFormat","countdownOptions","ViewParamsEditor","OntimeView","ViewLogo","CountdownClock","Empty","CountdownContents","IoAdd","useClock","formattedClock"],"mappings":"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"}
1
+ {"version":3,"file":"Countdown-ChuA9az_.js","sources":["../../src/views/countdown/countdown.options.ts","../../src/views/countdown/countdown.utils.ts","../../src/features/viewers/common/clock-time/ClockTime.tsx","../../src/views/countdown/CountdownSelect.tsx","../../src/views/countdown/CountdownSubscriptions.tsx","../../src/views/countdown/SingleEventCountdown.tsx","../../src/views/countdown/useCountdownData.ts","../../src/views/countdown/Countdown.tsx"],"sourcesContent":["import { use, useMemo } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { CustomFields, EntryId, OntimeEvent } from 'ontime-types';\n\nimport { getTimeOption } from '../../common/components/view-params-editor/common.options';\nimport { OptionTitle } from '../../common/components/view-params-editor/constants';\nimport { ViewOption } from '../../common/components/view-params-editor/viewParams.types';\nimport { makeOptionsFromCustomFields } from '../../common/components/view-params-editor/viewParams.utils';\nimport { PresetContext } from '../../common/context/PresetContext';\nimport { isStringBoolean } from '../../features/viewers/common/viewUtils';\n\nexport const getCountdownOptions = (\n timeFormat: string,\n customFields: CustomFields,\n persistedSubscriptions: EntryId[],\n): ViewOption[] => {\n const secondaryOptions = makeOptionsFromCustomFields(customFields, [\n { value: 'none', label: 'None' },\n { value: 'note', label: 'Note' },\n ]);\n\n return [\n { title: OptionTitle.ClockOptions, collapsible: true, options: [getTimeOption(timeFormat)] },\n {\n title: OptionTitle.DataSources,\n collapsible: true,\n options: [\n {\n id: 'secondary-src',\n title: 'Event secondary text',\n description: 'Select the data source for auxiliary text shown in the card',\n type: 'option',\n values: secondaryOptions,\n defaultValue: 'none',\n },\n ],\n },\n {\n title: OptionTitle.BehaviourOptions,\n collapsible: true,\n options: [\n {\n id: 'showExpected',\n title: 'Show expected time',\n description: 'Whether the times shown should account for the runtime offset.',\n type: 'boolean',\n defaultValue: false,\n },\n ],\n },\n {\n title: OptionTitle.Hidden,\n options: [\n {\n id: 'sub',\n title: 'Event subscription',\n description: 'The events to follow',\n values: persistedSubscriptions,\n type: 'persist',\n },\n ],\n },\n ];\n};\n\ntype CountdownOptions = {\n subscriptions: EntryId[];\n secondarySource: keyof OntimeEvent | null;\n showExpected: boolean;\n};\n\n/**\n * Utility extract the view options from URL Params\n * the names and fallback are manually matched with timerOptions\n */\nfunction getOptionsFromParams(searchParams: URLSearchParams, defaultValues?: URLSearchParams): CountdownOptions {\n // Helper to get single value from either source, prioritizing defaultValues\n const getValue = (key: string) => defaultValues?.get(key) ?? searchParams.get(key);\n\n // Helper to get array values from either source\n const getArrayValues = (key: string): EntryId[] => {\n if (defaultValues?.has(key)) {\n return defaultValues.getAll(key) as EntryId[];\n }\n return searchParams.getAll(key) as EntryId[];\n };\n\n return {\n subscriptions: getArrayValues('sub'),\n secondarySource: getValue('secondary-src') as keyof OntimeEvent | null,\n showExpected: isStringBoolean(getValue('showExpected')),\n };\n}\n\n/**\n * Hook exposes the countdown view options\n */\nexport function useCountdownOptions(): CountdownOptions {\n const [searchParams] = useSearchParams();\n const maybePreset = use(PresetContext);\n\n const options = useMemo(() => {\n const defaultValues = maybePreset ? new URLSearchParams(maybePreset.search) : undefined;\n return getOptionsFromParams(searchParams, defaultValues);\n }, [maybePreset, searchParams]);\n\n return options;\n}\n","import { EntryId, MaybeNumber, OffsetMode, OntimeEntry, OntimeEvent, OntimeReport, Playback } from 'ontime-types';\nimport { getExpectedStart, MILLIS_PER_MINUTE, removeSeconds } from 'ontime-utils';\n\nimport { useCountdownSocket } from '../../common/hooks/useSocket';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { timerPlaceholderMin } from '../../common/utils/styleUtils';\nimport { formatDuration, formatTime } from '../../common/utils/time';\nimport { type TranslationKey, useTranslation } from '../../translation/TranslationProvider';\n\n/**\n * Parses string as a title\n */\nexport function sanitiseTitle(title: string | null) {\n return title ?? '{no title}';\n}\n\nexport const preferredFormat12 = 'h:mm a';\nexport const preferredFormat24 = 'HH:mm';\n\n/**\n * Whether the current event is live\n */\nexport function getIsLive(currentId: EntryId, selectedId: EntryId | null, playback: Playback): boolean {\n return currentId === selectedId && playback !== Playback.Armed;\n}\n\nexport type ProgressStatus = 'future' | 'due' | 'live' | 'done' | 'pending' | 'loaded';\ntype TimerMessage = Record<ProgressStatus, TranslationKey>;\n\nexport const timerProgress: TimerMessage = {\n future: 'countdown.to_start',\n due: 'timeline.due',\n live: 'countdown.running',\n pending: 'countdown.waiting',\n loaded: 'countdown.loaded',\n done: 'countdown.ended',\n};\n\nexport function getFormattedTime(\n value: MaybeNumber,\n status: ProgressStatus,\n minText: string,\n secText: string,\n dueText: string,\n) {\n if (value === null) return timerPlaceholderMin;\n if (status === 'future' || status === 'live') {\n if (value <= 0) return dueText.toUpperCase();\n return formatDuration(value, value > MILLIS_PER_MINUTE * 2)\n .replace('m', `${minText} `)\n .replace('s', secText);\n }\n return removeSeconds(formatTime(value));\n}\n\n/**\n * Returns a parsed timer and relevant status message\n * Handles events in different days but disregards whether an event has actually played\n */\nexport function useSubscriptionDisplayData(\n subscribedEvent: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number },\n): { status: ProgressStatus; statusDisplay: string; timeDisplay: string } {\n const { playback, current, clock } = useCountdownSocket();\n const { getLocalizedString } = useTranslation();\n\n const bigDuration = (value: number) => {\n if (value <= 0) return getLocalizedString('countdown.overtime').toUpperCase();\n return formatDuration(value, value > MILLIS_PER_MINUTE * 2)\n .replace('m', `${getLocalizedString('common.minutes')} `)\n .replace('s', getLocalizedString('common.seconds'));\n };\n\n if (subscribedEvent.isLoaded) {\n if (playback === Playback.Armed) {\n return {\n status: 'loaded',\n statusDisplay: getLocalizedString(timerProgress['loaded']),\n timeDisplay: bigDuration(subscribedEvent.duration),\n };\n }\n\n return {\n status: 'live',\n statusDisplay: getLocalizedString(timerProgress['live']),\n timeDisplay: bigDuration(current ?? 0),\n };\n }\n\n if (playback === Playback.Stop || playback === Playback.Armed) {\n return {\n status: 'pending',\n statusDisplay: getLocalizedString(timerProgress['pending']),\n timeDisplay: ' ',\n };\n }\n\n if (subscribedEvent.isPast) {\n return {\n status: 'done',\n statusDisplay: getLocalizedString(timerProgress['done']),\n timeDisplay: formatTime(subscribedEvent.endedAt, { format12: preferredFormat12, format24: preferredFormat24 }),\n };\n }\n\n if (subscribedEvent.expectedStart - clock <= 0) {\n return {\n status: 'due',\n statusDisplay: getLocalizedString(timerProgress['future']), // We use future here on purpose for the look of it\n timeDisplay: getLocalizedString(timerProgress['due']).toUpperCase(),\n };\n }\n\n return {\n status: 'future',\n statusDisplay: getLocalizedString(timerProgress['future']),\n timeDisplay: bigDuration(subscribedEvent.expectedStart - clock),\n };\n}\n\n/**\n * Adds a set of subscriptions to the URL parameters\n */\nexport function makeSubscriptionsUrl(urlRef: string, subscriptions: EntryId[]) {\n const url = new URL(urlRef);\n const newParams = new URLSearchParams();\n\n // copy existing parameters except for 'sub'\n for (const [key, value] of url.searchParams.entries()) {\n if (key !== 'sub') {\n newParams.append(key, value);\n }\n }\n\n // add new subscriptions\n subscriptions.forEach((id) => {\n newParams.append('sub', id);\n });\n\n url.search = newParams.toString();\n\n return url;\n}\n\n/**\n * Returns an array of events subscribed events ordered by scheduled\n * Since the original array is already ordered, we simply filter out the events\n * which are not in the subscriptions list.\n */\nexport function getOrderedSubscriptions<T extends OntimeEntry>(subscriptions: EntryId[], playableEvents: T[]): T[] {\n return playableEvents.filter((event) => subscriptions.includes(event.id));\n}\n\n/**\n * Checks through the rundown whether the current event is linked to the loaded event\n */\nexport function isLinkedToLoadedEvent(events: OntimeEvent[], loadedId: EntryId | null, currentId: EntryId): boolean {\n // if nothing is loaded, we return true to simplify the logic\n if (!loadedId) {\n return true;\n }\n\n const loadedIndex = events.findIndex((event) => event.id === loadedId);\n if (loadedIndex === -1) {\n return true;\n }\n\n for (let i = loadedIndex; i < events.length; i++) {\n const event = events[i];\n if (event.id === currentId) {\n return true;\n }\n\n if (event.linkStart === null) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function isOutsideRange(a: number, b: number): boolean {\n return Math.abs(a - b) > MILLIS_PER_MINUTE;\n}\n\nexport type CountdownEvent = ExtendedEntry<OntimeEvent> & { expectedStart: number; endedAt: MaybeNumber };\n\nexport function extendEventData(\n event: ExtendedEntry<OntimeEvent>,\n currentDay: number,\n actualStart: MaybeNumber,\n plannedStart: MaybeNumber,\n offset: number,\n mode: OffsetMode,\n reportData: OntimeReport,\n): CountdownEvent {\n const { totalGap, isLinkedToLoaded } = event;\n const expectedStart = getExpectedStart(event, {\n currentDay,\n totalGap,\n actualStart,\n plannedStart,\n isLinkedToLoaded,\n offset,\n mode,\n });\n const { endedAt } = reportData[event.id] ?? { endedAt: null };\n return { ...event, expectedStart, endedAt };\n}\n","/**\n * encapsulate logic related to showing a clock timer\n */\n\nimport { MaybeNumber } from 'ontime-types';\n\nimport { formatTime } from '../../../../common/utils/time';\nimport { FORMAT_12, FORMAT_24 } from '../../../../viewerConfig';\nimport SuperscriptTime from '../superscript-time/SuperscriptTime';\n\ninterface ClockTimeProps {\n value: MaybeNumber;\n preferredFormat12?: string;\n preferredFormat24?: string;\n className?: string;\n}\n\nexport default function ClockTime(props: ClockTimeProps) {\n const { value, preferredFormat12 = FORMAT_12, preferredFormat24 = FORMAT_24, className } = props;\n\n // TODO: should we get the params from URL here to see if the user is overriding the default?\n const formattedTime = formatTime(value, { format12: preferredFormat12, format24: preferredFormat24 });\n\n return <SuperscriptTime className={className} time={formattedTime} />;\n}\n","import { useState } from 'react';\nimport { IoArrowBack, IoClose, IoSaveOutline } from 'react-icons/io5';\nimport { useNavigate } from 'react-router';\nimport { EntryId, PlayableEvent } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport { cx } from '../../common/utils/styleUtils';\nimport ClockTime from '../../features/viewers/common/clock-time/ClockTime';\n\nimport { makeSubscriptionsUrl } from './countdown.utils';\n\nimport './Countdown.scss';\n\ninterface CountdownSelectProps {\n events: PlayableEvent[];\n subscriptions: EntryId[];\n disableEdit: () => void;\n}\n\nexport default function CountdownSelect({ events, subscriptions, disableEdit }: CountdownSelectProps) {\n const [selected, setSelected] = useState<EntryId[]>(subscriptions);\n const navigate = useNavigate();\n\n /**\n * Toggles an entry from the selected set\n */\n const toggleSelect = (entryId: EntryId) => {\n setSelected((prev) => {\n if (prev.includes(entryId)) {\n // If the entry is already selected, remove it\n return prev.filter((id) => id !== entryId);\n }\n return [...prev, entryId];\n });\n };\n\n /**\n * Creates a URL with the selected subscriptions\n * and navigates to it\n */\n const applySelection = () => {\n // we remove events that no longer exist to avoid stale subscriptions\n const filteredSelected = selected.filter((id) => events.some((event) => event.id === id));\n const url = makeSubscriptionsUrl(window.location.href, filteredSelected);\n disableEdit();\n setSelected([]);\n navigate(url.search.toString());\n };\n\n // make a copy of the selected array for quick lookup\n const selectedIds = new Set(selected);\n\n return (\n <div className='list-container'>\n {events.map((event, index) => {\n const title = event.title || '{no title}';\n const isSelected = selectedIds.has(event.id);\n\n return (\n <div\n key={index}\n role='button'\n tabIndex={0}\n onClick={() => toggleSelect(event.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n toggleSelect(event.id);\n e.stopPropagation();\n }\n }}\n className={cx(['sub', isSelected && 'sub--selected'])}\n >\n <div className='sub__binder' style={{ '--user-color': event?.colour ?? '' }} />\n <div className='sub__schedule'>\n <ClockTime value={event.timeStart} preferredFormat12='h:mm' preferredFormat24='HH:mm' />\n →\n <ClockTime value={event.timeEnd} preferredFormat12='h:mm' preferredFormat24='HH:mm' />\n </div>\n <div className='sub__label'>{isSelected ? 'Click to remove' : 'Click to add'}</div>\n <div className='sub__title'>{title}</div>\n </div>\n );\n })}\n\n <div className='fab-container'>\n <Button variant='subtle' size='xlarge' onClick={disableEdit}>\n <IoArrowBack /> Go back\n </Button>\n <Button variant='subtle' size='xlarge' onClick={() => setSelected([])} disabled={selected.length === 0}>\n <IoClose /> Clear\n </Button>\n <Button variant='primary' size='xlarge' disabled={events.length < 1} onClick={applySelection}>\n <IoSaveOutline /> Save\n </Button>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { IoPencil } from 'react-icons/io5';\nimport { MaybeNumber, OntimeEvent } from 'ontime-types';\nimport { dayInMs } from 'ontime-utils';\n\nimport Button from '../../common/components/buttons/Button';\nimport { useFadeOutOnInactivity } from '../../common/hooks/useFadeOutOnInactivity';\nimport useFollowComponent from '../../common/hooks/useFollowComponent';\nimport { useExpectedStartData, usePlayback, useSelectedEventId } from '../../common/hooks/useSocket';\nimport useReport from '../../common/hooks-query/useReport';\nimport { getOffsetState } from '../../common/utils/offset';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport { throttle } from '../../common/utils/throttle';\nimport FollowButton from '../../features/operator/follow-button/FollowButton';\nimport ClockTime from '../../features/viewers/common/clock-time/ClockTime';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\nimport { useCountdownOptions } from './countdown.options';\nimport {\n CountdownEvent,\n extendEventData,\n getIsLive,\n isOutsideRange,\n preferredFormat12,\n preferredFormat24,\n useSubscriptionDisplayData,\n} from './countdown.utils';\n\nimport './Countdown.scss';\n\ninterface CountdownSubscriptionsProps {\n subscribedEvents: ExtendedEntry<OntimeEvent>[];\n goToEditMode: () => void;\n}\n\nexport default function CountdownSubscriptions({ subscribedEvents, goToEditMode }: CountdownSubscriptionsProps) {\n const { secondarySource, showExpected } = useCountdownOptions();\n const { playback } = usePlayback();\n const { selectedEventId } = useSelectedEventId();\n const showFab = useFadeOutOnInactivity(true);\n\n const { data: reportData } = useReport();\n const { offset, currentDay, actualStart, plannedStart, mode } = useExpectedStartData();\n\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n const [lockAutoScroll, setLockAutoScroll] = useState(false);\n const selectedRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollToComponent = useFollowComponent({\n followRef: selectedRef,\n scrollRef,\n doFollow: !lockAutoScroll,\n topOffset: 0,\n followTrigger: selectedEventId,\n });\n\n // reset scroll if nothing is selected\n useEffect(() => {\n if (!selectedEventId) {\n if (!lockAutoScroll) {\n scrollRef.current?.scrollTo(0, 0);\n }\n }\n }, [selectedEventId, lockAutoScroll, scrollRef]);\n\n // scroll to component if user clicks the Follow button\n const handleOffset = () => {\n if (selectedEventId) {\n scrollToComponent();\n }\n setLockAutoScroll(false);\n };\n\n // prevent considering automated scrolls as user scrolls\n const handleUserScroll = () => {\n if (selectedRef?.current && scrollRef?.current) {\n const selectedRect = selectedRef.current.getBoundingClientRect();\n const scrollerRect = scrollRef.current.getBoundingClientRect();\n if (selectedRect && scrollerRect) {\n const distanceFromTop = selectedRect.top - scrollerRect.top;\n const hasScrolledOutOfThreshold = distanceFromTop < -8 || distanceFromTop > 50;\n setLockAutoScroll(hasScrolledOutOfThreshold);\n }\n }\n };\n const throttledHandleScroll = throttle(handleUserScroll, 1000);\n\n // when the user scrolls we check if we need to show the button\n const handleScroll = () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n\n throttledHandleScroll();\n };\n\n return (\n <div className='list-container' onWheel={handleScroll} onTouchMove={handleScroll} ref={scrollRef}>\n {subscribedEvents.map((event) => {\n const secondaryData = getPropertyValue(event, secondarySource);\n const isLive = getIsLive(event.id, selectedEventId, playback);\n const isArmed = !isLive && event.id === selectedEventId;\n const countdownEvent = extendEventData(event, currentDay, actualStart, plannedStart, offset, mode, reportData);\n const title = event.title.length ? event.title : ' '; // insert utf-8 empty space to avoid the line collapsing\n return (\n <div\n key={event.id}\n ref={isLive ? selectedRef : undefined}\n className={cx(['sub', isLive && 'sub--live', isArmed && 'sub--armed'])}\n data-testid={event.cue}\n >\n <div className='sub__binder' style={{ '--user-color': event.colour }} />\n <ScheduleTime event={countdownEvent} showExpected={showExpected} />\n <SubscriptionStatus event={countdownEvent} />\n <div className={cx(['sub__title', !event.title && 'subdued'])}>{title}</div>\n {secondaryData && <div className='sub__secondary'>{secondaryData}</div>}\n </div>\n );\n })}\n <div className={cx(['fab-container', !showFab && 'fab-container--hidden'])}>\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoPencil /> Edit\n </Button>\n </div>\n <FollowButton isVisible={lockAutoScroll} onClickHandler={handleOffset} />\n </div>\n );\n}\n\ntype ScheduleTimeProps = {\n event: CountdownEvent;\n showExpected: boolean;\n};\n//TODO: consider relative mode\nexport function ScheduleTime(props: ScheduleTimeProps) {\n const { event, showExpected } = props;\n const { timeStart, duration, delay, expectedStart, countToEnd } = event;\n\n const plannedStart = timeStart + delay + event.dayOffset * dayInMs;\n\n // only show new exacted value if outside range of the planned value\n const isExpectedValueShow = showExpected && isOutsideRange(plannedStart, expectedStart);\n\n const plannedStateClass = isExpectedValueShow ? 'sub__schedule--strike' : delay !== 0 ? 'sub__schedule--delayed' : '';\n\n const expectedStateClass = `sub__schedule--${getOffsetState(expectedStart - plannedStart)}`;\n const plannedEnd = plannedStart + duration + delay;\n const expectedEnd = countToEnd ? Math.max(expectedStart + duration, plannedEnd) : expectedStart + duration;\n const expectedEndClass = `sub__schedule--${getOffsetState(expectedEnd - plannedEnd)}`;\n\n return (\n <div className='sub__schedule'>\n <ClockTime\n value={plannedStart}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n className={plannedStateClass}\n />\n {!isExpectedValueShow && (\n <>\n →\n <ClockTime\n value={plannedEnd}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n className={plannedStateClass}\n />\n </>\n )}\n {isExpectedValueShow && (\n <>\n <ClockTime\n value={expectedStart}\n className={expectedStateClass}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n />\n →\n <ClockTime\n value={expectedEnd}\n className={expectedEndClass}\n preferredFormat12={preferredFormat12}\n preferredFormat24={preferredFormat24}\n />\n </>\n )}\n </div>\n );\n}\n\ninterface SubscriptionStatusProps {\n event: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number };\n}\n\nfunction SubscriptionStatus({ event }: SubscriptionStatusProps) {\n const { status, statusDisplay, timeDisplay } = useSubscriptionDisplayData(event);\n\n return (\n <>\n <div className='sub__status'>{statusDisplay}</div>\n {status === 'done' ? (\n <SuperscriptTime className='sub__timer' time={timeDisplay} />\n ) : (\n <div className='sub__timer'>{timeDisplay}</div>\n )}\n </>\n );\n}\n","import { IoPencil } from 'react-icons/io5';\nimport { MaybeNumber, OntimeEvent } from 'ontime-types';\nimport { getExpectedStart } from 'ontime-utils';\n\nimport Button from '../../common/components/buttons/Button';\nimport { useFadeOutOnInactivity } from '../../common/hooks/useFadeOutOnInactivity';\nimport { useExpectedStartData } from '../../common/hooks/useSocket';\nimport useReport from '../../common/hooks-query/useReport';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { cx } from '../../common/utils/styleUtils';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { getPropertyValue } from '../../features/viewers/common/viewUtils';\n\nimport { useCountdownOptions } from './countdown.options';\nimport { useSubscriptionDisplayData } from './countdown.utils';\nimport { ScheduleTime } from './CountdownSubscriptions';\n\nimport './SingleEventCountdown.scss';\n\ninterface SingleEventCountdownProps {\n subscribedEvent: ExtendedEntry<OntimeEvent>;\n goToEditMode: () => void;\n}\n\nexport default function SingleEventCountdown({ subscribedEvent, goToEditMode }: SingleEventCountdownProps) {\n const { secondarySource, showExpected } = useCountdownOptions();\n const showFab = useFadeOutOnInactivity(true);\n const { data: reportData } = useReport();\n\n const { offset, currentDay, actualStart, plannedStart, mode } = useExpectedStartData();\n const { totalGap, isLinkedToLoaded } = subscribedEvent;\n const expectedStart = getExpectedStart(subscribedEvent, {\n currentDay,\n totalGap,\n actualStart,\n plannedStart,\n isLinkedToLoaded,\n offset,\n mode,\n });\n\n const { endedAt } = reportData[subscribedEvent.id] ?? { endedAt: null };\n const countdownEvent = { ...subscribedEvent, expectedStart, endedAt };\n const title = subscribedEvent.title.length ? subscribedEvent.title : ' '; // insert utf-8 empty space to avoid the line collapsing\n const secondaryData = getPropertyValue(subscribedEvent, secondarySource);\n\n return (\n <div className='single-container' data-testid='countdown-event'>\n <SubscriptionStatus event={countdownEvent} />\n <div className='event__title' style={{ borderColor: countdownEvent.colour }}>\n <ScheduleTime event={countdownEvent} showExpected={showExpected} />\n {title}\n {secondaryData && <div className='secondary'>{secondaryData}</div>}\n </div>\n <div className={cx(['fab-container', !showFab && 'fab-container--hidden'])}>\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoPencil /> Edit\n </Button>\n </div>\n </div>\n );\n}\n\ninterface SubscriptionStatusProps {\n event: ExtendedEntry<OntimeEvent> & { endedAt: MaybeNumber; expectedStart: number };\n}\n\nfunction SubscriptionStatus({ event }: SubscriptionStatusProps) {\n const { status, statusDisplay, timeDisplay } = useSubscriptionDisplayData(event);\n\n return (\n <>\n <div className='event__status'>{statusDisplay}</div>\n {status === 'done' ? (\n <SuperscriptTime className='event__timer' time={timeDisplay} />\n ) : (\n <div className='event__timer'>{timeDisplay}</div>\n )}\n </>\n );\n}\n","import { CustomFields, OntimeEntry, ProjectData, Settings } from 'ontime-types';\n\nimport useCustomFields from '../../common/hooks-query/useCustomFields';\nimport useProjectData from '../../common/hooks-query/useProjectData';\nimport { useFlatRundownWithMetadata } from '../../common/hooks-query/useRundown';\nimport useSettings from '../../common/hooks-query/useSettings';\nimport { useViewOptionsStore } from '../../common/stores/viewOptions';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { aggregateQueryStatus, ViewData } from '../utils/viewLoader.utils';\n\nexport interface CountdownData {\n customFields: CustomFields;\n rundownData: ExtendedEntry<OntimeEntry>[];\n projectData: ProjectData;\n isMirrored: boolean;\n settings: Settings;\n}\n\nexport function useCountdownData(): ViewData<CountdownData> {\n // persisted app state\n const isMirrored = useViewOptionsStore((state) => state.mirror);\n\n // HTTP API data\n const { data: rundownData, status: rundownStatus } = useFlatRundownWithMetadata();\n const { data: projectData, status: projectDataStatus } = useProjectData();\n const { data: settings, status: settingsStatus } = useSettings();\n const { data: customFields, status: customFieldsStatus } = useCustomFields();\n\n return {\n data: {\n customFields,\n rundownData,\n projectData,\n isMirrored,\n settings,\n },\n status: aggregateQueryStatus([rundownStatus, projectDataStatus, settingsStatus, customFieldsStatus]),\n };\n}\n","import { useMemo, useState } from 'react';\nimport { IoAdd } from 'react-icons/io5';\nimport { EntryId, isOntimeEvent, isPlayableEvent, OntimeEvent, OntimeView } from 'ontime-types';\n\nimport Button from '../../common/components/buttons/Button';\nimport Empty from '../../common/components/state/Empty';\nimport EmptyPage from '../../common/components/state/EmptyPage';\nimport ViewLogo from '../../common/components/view-logo/ViewLogo';\nimport ViewParamsEditor from '../../common/components/view-params-editor/ViewParamsEditor';\nimport { useClock } from '../../common/hooks/useSocket';\nimport { useWindowTitle } from '../../common/hooks/useWindowTitle';\nimport { ExtendedEntry } from '../../common/utils/rundownMetadata';\nimport { formatTime, getDefaultFormat } from '../../common/utils/time';\nimport SuperscriptTime from '../../features/viewers/common/superscript-time/SuperscriptTime';\nimport { useTranslation } from '../../translation/TranslationProvider';\nimport Loader from '../common/loader/Loader';\n\nimport { getCountdownOptions, useCountdownOptions } from './countdown.options';\nimport { getOrderedSubscriptions } from './countdown.utils';\nimport CountdownSelect from './CountdownSelect';\nimport CountdownSubscriptions from './CountdownSubscriptions';\nimport SingleEventCountdown from './SingleEventCountdown';\nimport { CountdownData, useCountdownData } from './useCountdownData';\n\nimport './Countdown.scss';\n\nexport default function CountdownLoader() {\n const { data, status } = useCountdownData();\n\n useWindowTitle('Countdown');\n\n if (status === 'pending') {\n return <Loader />;\n }\n\n if (status === 'error') {\n return <EmptyPage text='There was an error fetching data, please refresh the page.' />;\n }\n\n return <Countdown {...data} />;\n}\n\nfunction Countdown({ customFields, rundownData, projectData, isMirrored, settings }: CountdownData) {\n const { getLocalizedString } = useTranslation();\n const { subscriptions } = useCountdownOptions();\n\n const [editMode, setEditMode] = useState(false);\n\n // gather rundown data\n const playableEvents = rundownData.filter((entry) => isOntimeEvent(entry) && isPlayableEvent(entry));\n\n // gather presentation data\n const hasEvents = playableEvents.length > 0;\n\n // gather option data\n const defaultFormat = getDefaultFormat(settings?.timeFormat);\n const countdownOptions = useMemo(\n () => getCountdownOptions(defaultFormat, customFields, subscriptions),\n [defaultFormat, customFields, subscriptions],\n );\n\n return (\n <div className={`countdown ${isMirrored ? 'mirror' : ''}`} data-testid='countdown-view'>\n <ViewParamsEditor target={OntimeView.Countdown} viewOptions={countdownOptions} />\n <div className='project-header'>\n {projectData?.logo && <ViewLogo name={projectData.logo} className='logo' />}\n <div className='title'>{projectData.title}</div>\n <CountdownClock />\n </div>\n\n {!hasEvents && <Empty text={getLocalizedString('common.no_data')} className='empty-container' />}\n\n {hasEvents && editMode && (\n <CountdownSelect events={playableEvents} subscriptions={subscriptions} disableEdit={() => setEditMode(false)} />\n )}\n\n {hasEvents && !editMode && (\n <CountdownContents\n playableEvents={playableEvents}\n subscriptions={subscriptions}\n goToEditMode={() => setEditMode(true)}\n />\n )}\n </div>\n );\n}\n\ninterface CountdownContentsProps {\n playableEvents: ExtendedEntry<OntimeEvent>[];\n subscriptions: EntryId[];\n goToEditMode: () => void;\n}\n\nfunction CountdownContents({ playableEvents, subscriptions, goToEditMode }: CountdownContentsProps) {\n const { getLocalizedString } = useTranslation();\n\n if (subscriptions.length === 0) {\n return (\n <div className='empty-container'>\n <Empty text={getLocalizedString('countdown.select_event')} className='empty-container' />\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoAdd /> Add\n </Button>\n </div>\n );\n }\n\n const subscribedEvents = getOrderedSubscriptions(subscriptions, playableEvents);\n\n if (subscribedEvents.length === 0) {\n return (\n <div className='empty-container'>\n <Empty text={getLocalizedString('countdown.select_event')} className='empty-container' />\n <Button variant='primary' size='xlarge' onClick={goToEditMode}>\n <IoAdd /> Add\n </Button>\n </div>\n );\n }\n\n if (subscribedEvents.length === 1) {\n const event = subscribedEvents.at(0);\n if (!event) return null;\n return <SingleEventCountdown subscribedEvent={event} goToEditMode={goToEditMode} />;\n }\n\n return <CountdownSubscriptions subscribedEvents={subscribedEvents} goToEditMode={goToEditMode} />;\n}\n\nfunction CountdownClock() {\n const { getLocalizedString } = useTranslation();\n const { clock } = useClock();\n\n // gather timer data\n const formattedClock = formatTime(clock);\n\n return (\n <div className='clock-container'>\n <div className='label'>{getLocalizedString('common.time_now')}</div>\n <SuperscriptTime time={formattedClock} className='time' />\n </div>\n );\n}\n"],"names":["getCountdownOptions","timeFormat","customFields","persistedSubscriptions","secondaryOptions","makeOptionsFromCustomFields","OptionTitle","getTimeOption","getOptionsFromParams","searchParams","defaultValues","getValue","key","isStringBoolean","useCountdownOptions","useSearchParams","maybePreset","use","PresetContext","useMemo","preferredFormat12","preferredFormat24","getIsLive","currentId","selectedId","playback","Playback","timerProgress","useSubscriptionDisplayData","subscribedEvent","current","clock","useCountdownSocket","getLocalizedString","useTranslation","bigDuration","value","formatDuration","MILLIS_PER_MINUTE","formatTime","makeSubscriptionsUrl","urlRef","subscriptions","url","newParams","id","getOrderedSubscriptions","playableEvents","event","isOutsideRange","a","b","extendEventData","currentDay","actualStart","plannedStart","offset","mode","reportData","totalGap","isLinkedToLoaded","expectedStart","getExpectedStart","endedAt","ClockTime","props","FORMAT_12","FORMAT_24","className","formattedTime","jsx","SuperscriptTime","CountdownSelect","events","disableEdit","selected","setSelected","useState","navigate","useNavigate","toggleSelect","entryId","prev","applySelection","filteredSelected","selectedIds","jsxs","index","title","isSelected","e","cx","Button","IoArrowBack","IoClose","IoSaveOutline","CountdownSubscriptions","subscribedEvents","goToEditMode","secondarySource","showExpected","usePlayback","selectedEventId","useSelectedEventId","showFab","useFadeOutOnInactivity","useReport","useExpectedStartData","timeoutId","useRef","lockAutoScroll","setLockAutoScroll","selectedRef","scrollRef","scrollToComponent","useFollowComponent","useEffect","_a","handleOffset","throttledHandleScroll","throttle","selectedRect","scrollerRect","distanceFromTop","hasScrolledOutOfThreshold","handleScroll","secondaryData","getPropertyValue","isLive","isArmed","countdownEvent","ScheduleTime","SubscriptionStatus","IoPencil","FollowButton","timeStart","duration","delay","countToEnd","dayInMs","isExpectedValueShow","plannedStateClass","expectedStateClass","getOffsetState","plannedEnd","expectedEnd","expectedEndClass","Fragment","status","statusDisplay","timeDisplay","SingleEventCountdown","useCountdownData","isMirrored","useViewOptionsStore","state","rundownData","rundownStatus","useFlatRundownWithMetadata","projectData","projectDataStatus","useProjectData","settings","settingsStatus","useSettings","customFieldsStatus","useCustomFields","aggregateQueryStatus","CountdownLoader","data","useWindowTitle","Loader","EmptyPage","Countdown","editMode","setEditMode","entry","isOntimeEvent","isPlayableEvent","hasEvents","defaultFormat","getDefaultFormat","countdownOptions","ViewParamsEditor","OntimeView","ViewLogo","CountdownClock","Empty","CountdownContents","IoAdd","useClock","formattedClock"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{h as w,ad as I,j as e}from"./vendor-Cu5xgv5K.js";import{f as v,bO as d,X as S,a7 as u,B as m,_ as T,ac as _,ad as O,ae as C,af as D,ag as B}from"./index-5QAOtSTh.js";import{I as M}from"./useWindowTitle-b5fN0StF.js";import{M as F}from"./Modal-BKL-5GzU.js";import"./useProjectData-CetvEK9E.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new s.Error().stack;n&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[n]="c7ce6bf0-6312-4b11-a524-065c45c86de8",s._sentryDebugIdIdentifier="sentry-dbid-c7ce6bf0-6312-4b11-a524-065c45c86de8")}catch{}})();function K({isOpen:s,onClose:n}){const{userTranslation:i,postUserTranslation:f}=v(),h=w.useMemo(()=>{const t={};return Object.keys(d).forEach(r=>{t[l(r)]=i[r]||""}),t},[i]),{handleSubmit:b,register:p,reset:g,formState:{isSubmitting:c,isDirty:x,errors:a,isValid:j},setError:y}=I({defaultValues:h,resetOptions:{keepDirtyValues:!0},mode:"onChange"}),E=async t=>{try{const r={};Object.keys(t).forEach(o=>{r[L(o)]=t[o]}),await f(r),g(t)}catch(r){y("root",{message:B(r)})}};return e.jsx(F,{title:"Edit custom translations",isOpen:s,onClose:n,showCloseButton:!0,showBackdrop:!0,bodyElements:e.jsxs(T,{as:"form",onSubmit:b(E),id:"custom-translations-form",children:[e.jsxs(M,{children:["Provide custom translations for the public views of Ontime. ",e.jsx("br",{}),'You will need to activate this in the settings by selecting "Custom" as the views language.']}),e.jsx(_,{children:Object.entries(d).map(([t,r])=>{var o;return e.jsxs(O,{children:[e.jsx(C,{title:r,description:"",error:(o=a[l(t)])==null?void 0:o.message}),e.jsx(D,{maxLength:150,...p(l(t),{required:"This field is required"}),placeholder:r})]},t)})})]}),footerElements:e.jsxs("div",{children:[(a==null?void 0:a.root)&&e.jsx(S,{children:a.root.message}),e.jsx(u,{align:"apart",children:e.jsxs(u,{children:[e.jsx(m,{size:"large",onClick:n,children:"Cancel"}),e.jsx(m,{variant:"primary",size:"large",type:"submit",form:"custom-translations-form",disabled:c||!x||!j,loading:c,children:"Save changes"})]})})]})})}function l(s){return s.replace(".","_")}function L(s){return s.replace("_",".")}export{K as default};
2
- //# sourceMappingURL=CustomTranslationModal-D_Cy0d_H.js.map
1
+ import{h as w,ad as I,j as e}from"./vendor-CCiSQ9k9.js";import{f as v,bO as d,X as S,a7 as u,B as m,_ as T,ac as _,ad as O,ae as C,af as D,ag as B}from"./index-BQEUaoAf.js";import{I as M}from"./useWindowTitle-DqdFTWns.js";import{M as F}from"./Modal-C2sFA0zf.js";import"./useProjectData-C1hVamxc.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new s.Error().stack;n&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[n]="c7ce6bf0-6312-4b11-a524-065c45c86de8",s._sentryDebugIdIdentifier="sentry-dbid-c7ce6bf0-6312-4b11-a524-065c45c86de8")}catch{}})();function K({isOpen:s,onClose:n}){const{userTranslation:i,postUserTranslation:f}=v(),h=w.useMemo(()=>{const t={};return Object.keys(d).forEach(r=>{t[l(r)]=i[r]||""}),t},[i]),{handleSubmit:b,register:p,reset:g,formState:{isSubmitting:c,isDirty:x,errors:a,isValid:j},setError:y}=I({defaultValues:h,resetOptions:{keepDirtyValues:!0},mode:"onChange"}),E=async t=>{try{const r={};Object.keys(t).forEach(o=>{r[L(o)]=t[o]}),await f(r),g(t)}catch(r){y("root",{message:B(r)})}};return e.jsx(F,{title:"Edit custom translations",isOpen:s,onClose:n,showCloseButton:!0,showBackdrop:!0,bodyElements:e.jsxs(T,{as:"form",onSubmit:b(E),id:"custom-translations-form",children:[e.jsxs(M,{children:["Provide custom translations for the public views of Ontime. ",e.jsx("br",{}),'You will need to activate this in the settings by selecting "Custom" as the views language.']}),e.jsx(_,{children:Object.entries(d).map(([t,r])=>{var o;return e.jsxs(O,{children:[e.jsx(C,{title:r,description:"",error:(o=a[l(t)])==null?void 0:o.message}),e.jsx(D,{maxLength:150,...p(l(t),{required:"This field is required"}),placeholder:r})]},t)})})]}),footerElements:e.jsxs("div",{children:[(a==null?void 0:a.root)&&e.jsx(S,{children:a.root.message}),e.jsx(u,{align:"apart",children:e.jsxs(u,{children:[e.jsx(m,{size:"large",onClick:n,children:"Cancel"}),e.jsx(m,{variant:"primary",size:"large",type:"submit",form:"custom-translations-form",disabled:c||!x||!j,loading:c,children:"Save changes"})]})})]})})}function l(s){return s.replace(".","_")}function L(s){return s.replace("_",".")}export{K as default};
2
+ //# sourceMappingURL=CustomTranslationModal-C3R_2T5s.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomTranslationModal-D_Cy0d_H.js","sources":["../../src/features/app-settings/panel/settings-panel/composite/CustomTranslationModal.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { langEn, TranslationObject } from 'ontime-types';\n\nimport { maybeAxiosError } from '../../../../../common/api/utils';\nimport Button from '../../../../../common/components/buttons/Button';\nimport Info from '../../../../../common/components/info/Info';\nimport Input from '../../../../../common/components/input/input/Input';\nimport Modal from '../../../../../common/components/modal/Modal';\nimport { useTranslation } from '../../../../../translation/TranslationProvider';\nimport * as Panel from '../../../panel-utils/PanelUtils';\n\ninterface CustomTranslationModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function CustomTranslationModal({ isOpen, onClose }: CustomTranslationModalProps) {\n const { userTranslation, postUserTranslation } = useTranslation();\n\n const defaultValues = useMemo(() => {\n const values: Record<string, string> = {};\n Object.keys(langEn).forEach((key) => {\n values[toFormKey(key)] = userTranslation[key as keyof TranslationObject] || '';\n });\n return values;\n }, [userTranslation]);\n\n const {\n handleSubmit,\n register,\n reset,\n formState: { isSubmitting, isDirty, errors, isValid },\n setError,\n } = useForm({\n defaultValues,\n resetOptions: {\n keepDirtyValues: true,\n },\n mode: 'onChange',\n });\n\n const onSubmit = async (formData: Record<string, string>) => {\n try {\n const translationData: Record<string, string> = {};\n Object.keys(formData).forEach((key) => {\n translationData[toApiKey(key)] = formData[key];\n });\n\n await postUserTranslation(translationData as TranslationObject);\n reset(formData);\n } catch (error) {\n setError('root', { message: maybeAxiosError(error) });\n }\n };\n\n return (\n <Modal\n title='Edit custom translations'\n isOpen={isOpen}\n onClose={onClose}\n showCloseButton\n showBackdrop\n bodyElements={\n <Panel.Section as='form' onSubmit={handleSubmit(onSubmit)} id='custom-translations-form'>\n <Info>\n Provide custom translations for the public views of Ontime. <br />\n You will need to activate this in the settings by selecting &quot;Custom&quot; as the views language.\n </Info>\n <Panel.ListGroup>\n {Object.entries(langEn).map(([key, value]) => (\n <Panel.ListItem key={key}>\n <Panel.Field title={value} description='' error={errors[toFormKey(key)]?.message} />\n <Input\n maxLength={150}\n {...register(toFormKey(key), {\n required: 'This field is required',\n })}\n placeholder={value}\n />\n </Panel.ListItem>\n ))}\n </Panel.ListGroup>\n </Panel.Section>\n }\n footerElements={\n <div>\n {errors?.root && <Panel.Error>{errors.root.message}</Panel.Error>}\n <Panel.InlineElements align='apart'>\n <Panel.InlineElements>\n <Button size='large' onClick={onClose}>\n Cancel\n </Button>\n <Button\n variant='primary'\n size='large'\n type='submit'\n form='custom-translations-form'\n disabled={isSubmitting || !isDirty || !isValid}\n loading={isSubmitting}\n >\n Save changes\n </Button>\n </Panel.InlineElements>\n </Panel.InlineElements>\n </div>\n }\n />\n );\n}\n\nfunction toFormKey(key: string) {\n return key.replace('.', '_');\n}\n\nfunction toApiKey(key: string) {\n return key.replace('_', '.');\n}\n"],"names":["CustomTranslationModal","isOpen","onClose","userTranslation","postUserTranslation","useTranslation","defaultValues","useMemo","values","langEn","key","toFormKey","handleSubmit","register","reset","isSubmitting","isDirty","errors","isValid","setError","useForm","onSubmit","formData","translationData","toApiKey","error","maybeAxiosError","jsx","Modal","jsxs","Panel.Section","Info","Panel.ListGroup","value","Panel.ListItem","Panel.Field","_a","Input","Panel.Error","Panel.InlineElements","Button"],"mappings":"qoBAiBA,SAAwBA,EAAuB,CAAE,OAAAC,EAAQ,QAAAC,GAAwC,CAC/F,KAAM,CAAE,gBAAAC,EAAiB,oBAAAC,CAAoB,EAAIC,EAAe,EAE1DC,EAAgBC,EAAAA,QAAQ,IAAM,CAClC,MAAMC,EAAiC,CAAC,EACxC,cAAO,KAAKC,CAAM,EAAE,QAASC,GAAQ,CACnCF,EAAOG,EAAUD,CAAG,CAAC,EAAIP,EAAgBO,CAA8B,GAAK,EAAA,CAC7E,EACMF,CAAA,EACN,CAACL,CAAe,CAAC,EAEd,CACJ,aAAAS,EACA,SAAAC,EACA,MAAAC,EACA,UAAW,CAAE,aAAAC,EAAc,QAAAC,EAAS,OAAAC,EAAQ,QAAAC,CAAQ,EACpD,SAAAC,GACEC,EAAQ,CACV,cAAAd,EACA,aAAc,CACZ,gBAAiB,EACnB,EACA,KAAM,UAAA,CACP,EAEKe,EAAW,MAAOC,GAAqC,CACvD,GAAA,CACF,MAAMC,EAA0C,CAAC,EACjD,OAAO,KAAKD,CAAQ,EAAE,QAASZ,GAAQ,CACrCa,EAAgBC,EAASd,CAAG,CAAC,EAAIY,EAASZ,CAAG,CAAA,CAC9C,EAED,MAAMN,EAAoBmB,CAAoC,EAC9DT,EAAMQ,CAAQ,QACPG,EAAO,CACdN,EAAS,OAAQ,CAAE,QAASO,EAAgBD,CAAK,EAAG,CAAA,CAExD,EAGE,OAAAE,EAAA,IAACC,EAAA,CACC,MAAM,2BACN,OAAA3B,EACA,QAAAC,EACA,gBAAe,GACf,aAAY,GACZ,aACE2B,EAAA,KAACC,EAAA,CAAc,GAAG,OAAO,SAAUlB,EAAaS,CAAQ,EAAG,GAAG,2BAC5D,SAAA,CAAAQ,OAACE,EAAK,CAAA,SAAA,CAAA,qEACyD,KAAG,EAAA,EAAE,6FAAA,EAEpE,QACCC,EAAA,CACE,SAAA,OAAO,QAAQvB,CAAM,EAAE,IAAI,CAAC,CAACC,EAAKuB,CAAK,IACrCJ,OAAAA,OAAAA,EAAAA,KAAAK,EAAA,CACC,SAAA,CAAAP,EAAAA,IAACQ,EAAA,CAAY,MAAOF,EAAO,YAAY,GAAG,OAAOG,EAAAnB,EAAON,EAAUD,CAAG,CAAC,IAArB,YAAA0B,EAAwB,OAAS,CAAA,EAClFT,EAAA,IAACU,EAAA,CACC,UAAW,IACV,GAAGxB,EAASF,EAAUD,CAAG,EAAG,CAC3B,SAAU,wBAAA,CACX,EACD,YAAauB,CAAA,CAAA,CACf,CARmB,EAAAvB,CASrB,EACD,CACH,CAAA,CAAA,EACF,EAEF,sBACG,MACE,CAAA,SAAA,EAAAO,GAAA,YAAAA,EAAQ,OAASU,EAAAA,IAAAW,EAAA,CAAa,SAAArB,EAAO,KAAK,QAAQ,EACnDU,MAACY,EAAA,CAAqB,MAAM,QAC1B,SAAAV,EAAA,KAACU,EAAA,CACC,SAAA,CAAAZ,MAACa,EAAO,CAAA,KAAK,QAAQ,QAAStC,EAAS,SAEvC,SAAA,EACAyB,EAAA,IAACa,EAAA,CACC,QAAQ,UACR,KAAK,QACL,KAAK,SACL,KAAK,2BACL,SAAUzB,GAAgB,CAACC,GAAW,CAACE,EACvC,QAASH,EACV,SAAA,cAAA,CAAA,CAED,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CAEA,SAASJ,EAAUD,EAAa,CACvB,OAAAA,EAAI,QAAQ,IAAK,GAAG,CAC7B,CAEA,SAASc,EAASd,EAAa,CACtB,OAAAA,EAAI,QAAQ,IAAK,GAAG,CAC7B"}
1
+ {"version":3,"file":"CustomTranslationModal-C3R_2T5s.js","sources":["../../src/features/app-settings/panel/settings-panel/composite/CustomTranslationModal.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { langEn, TranslationObject } from 'ontime-types';\n\nimport { maybeAxiosError } from '../../../../../common/api/utils';\nimport Button from '../../../../../common/components/buttons/Button';\nimport Info from '../../../../../common/components/info/Info';\nimport Input from '../../../../../common/components/input/input/Input';\nimport Modal from '../../../../../common/components/modal/Modal';\nimport { useTranslation } from '../../../../../translation/TranslationProvider';\nimport * as Panel from '../../../panel-utils/PanelUtils';\n\ninterface CustomTranslationModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function CustomTranslationModal({ isOpen, onClose }: CustomTranslationModalProps) {\n const { userTranslation, postUserTranslation } = useTranslation();\n\n const defaultValues = useMemo(() => {\n const values: Record<string, string> = {};\n Object.keys(langEn).forEach((key) => {\n values[toFormKey(key)] = userTranslation[key as keyof TranslationObject] || '';\n });\n return values;\n }, [userTranslation]);\n\n const {\n handleSubmit,\n register,\n reset,\n formState: { isSubmitting, isDirty, errors, isValid },\n setError,\n } = useForm({\n defaultValues,\n resetOptions: {\n keepDirtyValues: true,\n },\n mode: 'onChange',\n });\n\n const onSubmit = async (formData: Record<string, string>) => {\n try {\n const translationData: Record<string, string> = {};\n Object.keys(formData).forEach((key) => {\n translationData[toApiKey(key)] = formData[key];\n });\n\n await postUserTranslation(translationData as TranslationObject);\n reset(formData);\n } catch (error) {\n setError('root', { message: maybeAxiosError(error) });\n }\n };\n\n return (\n <Modal\n title='Edit custom translations'\n isOpen={isOpen}\n onClose={onClose}\n showCloseButton\n showBackdrop\n bodyElements={\n <Panel.Section as='form' onSubmit={handleSubmit(onSubmit)} id='custom-translations-form'>\n <Info>\n Provide custom translations for the public views of Ontime. <br />\n You will need to activate this in the settings by selecting &quot;Custom&quot; as the views language.\n </Info>\n <Panel.ListGroup>\n {Object.entries(langEn).map(([key, value]) => (\n <Panel.ListItem key={key}>\n <Panel.Field title={value} description='' error={errors[toFormKey(key)]?.message} />\n <Input\n maxLength={150}\n {...register(toFormKey(key), {\n required: 'This field is required',\n })}\n placeholder={value}\n />\n </Panel.ListItem>\n ))}\n </Panel.ListGroup>\n </Panel.Section>\n }\n footerElements={\n <div>\n {errors?.root && <Panel.Error>{errors.root.message}</Panel.Error>}\n <Panel.InlineElements align='apart'>\n <Panel.InlineElements>\n <Button size='large' onClick={onClose}>\n Cancel\n </Button>\n <Button\n variant='primary'\n size='large'\n type='submit'\n form='custom-translations-form'\n disabled={isSubmitting || !isDirty || !isValid}\n loading={isSubmitting}\n >\n Save changes\n </Button>\n </Panel.InlineElements>\n </Panel.InlineElements>\n </div>\n }\n />\n );\n}\n\nfunction toFormKey(key: string) {\n return key.replace('.', '_');\n}\n\nfunction toApiKey(key: string) {\n return key.replace('_', '.');\n}\n"],"names":["CustomTranslationModal","isOpen","onClose","userTranslation","postUserTranslation","useTranslation","defaultValues","useMemo","values","langEn","key","toFormKey","handleSubmit","register","reset","isSubmitting","isDirty","errors","isValid","setError","useForm","onSubmit","formData","translationData","toApiKey","error","maybeAxiosError","jsx","Modal","jsxs","Panel.Section","Info","Panel.ListGroup","value","Panel.ListItem","Panel.Field","_a","Input","Panel.Error","Panel.InlineElements","Button"],"mappings":"qoBAiBA,SAAwBA,EAAuB,CAAE,OAAAC,EAAQ,QAAAC,GAAwC,CAC/F,KAAM,CAAE,gBAAAC,EAAiB,oBAAAC,CAAoB,EAAIC,EAAe,EAE1DC,EAAgBC,EAAAA,QAAQ,IAAM,CAClC,MAAMC,EAAiC,CAAC,EACxC,cAAO,KAAKC,CAAM,EAAE,QAASC,GAAQ,CACnCF,EAAOG,EAAUD,CAAG,CAAC,EAAIP,EAAgBO,CAA8B,GAAK,EAAA,CAC7E,EACMF,CAAA,EACN,CAACL,CAAe,CAAC,EAEd,CACJ,aAAAS,EACA,SAAAC,EACA,MAAAC,EACA,UAAW,CAAE,aAAAC,EAAc,QAAAC,EAAS,OAAAC,EAAQ,QAAAC,CAAQ,EACpD,SAAAC,GACEC,EAAQ,CACV,cAAAd,EACA,aAAc,CACZ,gBAAiB,EACnB,EACA,KAAM,UAAA,CACP,EAEKe,EAAW,MAAOC,GAAqC,CACvD,GAAA,CACF,MAAMC,EAA0C,CAAC,EACjD,OAAO,KAAKD,CAAQ,EAAE,QAASZ,GAAQ,CACrCa,EAAgBC,EAASd,CAAG,CAAC,EAAIY,EAASZ,CAAG,CAAA,CAC9C,EAED,MAAMN,EAAoBmB,CAAoC,EAC9DT,EAAMQ,CAAQ,QACPG,EAAO,CACdN,EAAS,OAAQ,CAAE,QAASO,EAAgBD,CAAK,EAAG,CAAA,CAExD,EAGE,OAAAE,EAAA,IAACC,EAAA,CACC,MAAM,2BACN,OAAA3B,EACA,QAAAC,EACA,gBAAe,GACf,aAAY,GACZ,aACE2B,EAAA,KAACC,EAAA,CAAc,GAAG,OAAO,SAAUlB,EAAaS,CAAQ,EAAG,GAAG,2BAC5D,SAAA,CAAAQ,OAACE,EAAK,CAAA,SAAA,CAAA,qEACyD,KAAG,EAAA,EAAE,6FAAA,EAEpE,QACCC,EAAA,CACE,SAAA,OAAO,QAAQvB,CAAM,EAAE,IAAI,CAAC,CAACC,EAAKuB,CAAK,IACrCJ,OAAAA,OAAAA,EAAAA,KAAAK,EAAA,CACC,SAAA,CAAAP,EAAAA,IAACQ,EAAA,CAAY,MAAOF,EAAO,YAAY,GAAG,OAAOG,EAAAnB,EAAON,EAAUD,CAAG,CAAC,IAArB,YAAA0B,EAAwB,OAAS,CAAA,EAClFT,EAAA,IAACU,EAAA,CACC,UAAW,IACV,GAAGxB,EAASF,EAAUD,CAAG,EAAG,CAC3B,SAAU,wBAAA,CACX,EACD,YAAauB,CAAA,CAAA,CACf,CARmB,EAAAvB,CASrB,EACD,CACH,CAAA,CAAA,EACF,EAEF,sBACG,MACE,CAAA,SAAA,EAAAO,GAAA,YAAAA,EAAQ,OAASU,EAAAA,IAAAW,EAAA,CAAa,SAAArB,EAAO,KAAK,QAAQ,EACnDU,MAACY,EAAA,CAAqB,MAAM,QAC1B,SAAAV,EAAA,KAACU,EAAA,CACC,SAAA,CAAAZ,MAACa,EAAO,CAAA,KAAK,QAAQ,QAAStC,EAAS,SAEvC,SAAA,EACAyB,EAAA,IAACa,EAAA,CACC,QAAQ,UACR,KAAK,QACL,KAAK,SACL,KAAK,2BACL,SAAUzB,GAAgB,CAACC,GAAW,CAACE,EACvC,QAASH,EACV,SAAA,cAAA,CAAA,CAED,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,CAEA,SAASJ,EAAUD,EAAa,CACvB,OAAAA,EAAI,QAAQ,IAAK,GAAG,CAC7B,CAEA,SAASc,EAASd,EAAa,CACtB,OAAAA,EAAI,QAAQ,IAAK,GAAG,CAC7B"}
@@ -1,2 +1,2 @@
1
- import{j as a,aT as s,b2 as l}from"./vendor-Cu5xgv5K.js";import{m as t}from"./dateConfig-8rhb0Dbh.js";import{T as d}from"./Tooltip-DJ8Y4CO4.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new o.Error().stack;e&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[e]="e74baa9a-fa50-4164-a40c-bed9689a6193",o._sentryDebugIdIdentifier="sentry-dbid-e74baa9a-fa50-4164-a40c-bed9689a6193")}catch{}})();const i="_delaySymbol_1i27r_17",y={delaySymbol:i};function m(o){const{delayValue:e,tooltipPrefix:n}=o;if(typeof e!="number"||e===0)return null;const r=n?`${n} ${t(e)}`:t(e);return a.jsx(d,{text:r,render:a.jsx("span",{}),className:y.delaySymbol,children:e<0?a.jsx(s,{}):a.jsx(l,{})})}export{m as D};
2
- //# sourceMappingURL=DelayIndicator-B_JKLKYW.js.map
1
+ import{j as a,aT as s,b2 as l}from"./vendor-CCiSQ9k9.js";import{m as t}from"./dateConfig-DRQGMWDF.js";import{T as d}from"./Tooltip-D9XRnwOW.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},e=new o.Error().stack;e&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[e]="e74baa9a-fa50-4164-a40c-bed9689a6193",o._sentryDebugIdIdentifier="sentry-dbid-e74baa9a-fa50-4164-a40c-bed9689a6193")}catch{}})();const i="_delaySymbol_1i27r_17",y={delaySymbol:i};function m(o){const{delayValue:e,tooltipPrefix:n}=o;if(typeof e!="number"||e===0)return null;const r=n?`${n} ${t(e)}`:t(e);return a.jsx(d,{text:r,render:a.jsx("span",{}),className:y.delaySymbol,children:e<0?a.jsx(s,{}):a.jsx(l,{})})}export{m as D};
2
+ //# sourceMappingURL=DelayIndicator-vT7n8ypf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DelayIndicator-B_JKLKYW.js","sources":["../../src/common/components/delay-indicator/DelayIndicator.tsx"],"sourcesContent":["import { IoChevronDown, IoChevronUp } from 'react-icons/io5';\n\nimport { millisToDelayString } from '../../utils/dateConfig';\nimport Tooltip from '../tooltip/Tooltip';\n\nimport style from './DelayIndicator.module.scss';\n\ninterface DelayIndicatorProps {\n delayValue?: number;\n tooltipPrefix?: string;\n}\n\nexport default function DelayIndicator(props: DelayIndicatorProps) {\n const { delayValue, tooltipPrefix } = props;\n\n if (typeof delayValue !== 'number' || delayValue === 0) {\n return null;\n }\n\n const delayString = tooltipPrefix\n ? `${tooltipPrefix} ${millisToDelayString(delayValue)}`\n : millisToDelayString(delayValue);\n\n return (\n <Tooltip text={delayString} render={<span />} className={style.delaySymbol}>\n {delayValue < 0 ? <IoChevronDown /> : <IoChevronUp />}\n </Tooltip>\n );\n}\n"],"names":["DelayIndicator","props","delayValue","tooltipPrefix","delayString","millisToDelayString","Tooltip","jsx","style","IoChevronDown","IoChevronUp"],"mappings":"4hBAYA,SAAwBA,EAAeC,EAA4B,CAC3D,KAAA,CAAE,WAAAC,EAAY,cAAAC,CAAA,EAAkBF,EAEtC,GAAI,OAAOC,GAAe,UAAYA,IAAe,EAC5C,OAAA,KAGH,MAAAE,EAAcD,EAChB,GAAGA,CAAa,IAAIE,EAAoBH,CAAU,CAAC,GACnDG,EAAoBH,CAAU,EAElC,aACGI,EAAQ,CAAA,KAAMF,EAAa,OAAQG,EAAAA,IAAC,SAAK,EAAI,UAAWC,EAAM,YAC5D,WAAa,EAAID,MAACE,GAAc,CAAA,EAAKF,EAAA,IAACG,IAAY,CACrD,CAAA,CAEJ"}
1
+ {"version":3,"file":"DelayIndicator-vT7n8ypf.js","sources":["../../src/common/components/delay-indicator/DelayIndicator.tsx"],"sourcesContent":["import { IoChevronDown, IoChevronUp } from 'react-icons/io5';\n\nimport { millisToDelayString } from '../../utils/dateConfig';\nimport Tooltip from '../tooltip/Tooltip';\n\nimport style from './DelayIndicator.module.scss';\n\ninterface DelayIndicatorProps {\n delayValue?: number;\n tooltipPrefix?: string;\n}\n\nexport default function DelayIndicator(props: DelayIndicatorProps) {\n const { delayValue, tooltipPrefix } = props;\n\n if (typeof delayValue !== 'number' || delayValue === 0) {\n return null;\n }\n\n const delayString = tooltipPrefix\n ? `${tooltipPrefix} ${millisToDelayString(delayValue)}`\n : millisToDelayString(delayValue);\n\n return (\n <Tooltip text={delayString} render={<span />} className={style.delaySymbol}>\n {delayValue < 0 ? <IoChevronDown /> : <IoChevronUp />}\n </Tooltip>\n );\n}\n"],"names":["DelayIndicator","props","delayValue","tooltipPrefix","delayString","millisToDelayString","Tooltip","jsx","style","IoChevronDown","IoChevronUp"],"mappings":"4hBAYA,SAAwBA,EAAeC,EAA4B,CAC3D,KAAA,CAAE,WAAAC,EAAY,cAAAC,CAAA,EAAkBF,EAEtC,GAAI,OAAOC,GAAe,UAAYA,IAAe,EAC5C,OAAA,KAGH,MAAAE,EAAcD,EAChB,GAAGA,CAAa,IAAIE,EAAoBH,CAAU,CAAC,GACnDG,EAAoBH,CAAU,EAElC,aACGI,EAAQ,CAAA,KAAMF,EAAa,OAAQG,EAAAA,IAAC,SAAK,EAAI,UAAWC,EAAM,YAC5D,WAAa,EAAID,MAACE,GAAc,CAAA,EAAKF,EAAA,IAACG,IAAY,CACrD,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as t}from"./vendor-Cu5xgv5K.js";import{P as o}from"./ProtectRoute-p1fmtLeu.js";import"./index-5QAOtSTh.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new e.Error().stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="8ca23f32-8b16-4bad-9476-9f27952185b5",e._sentryDebugIdIdentifier="sentry-dbid-8ca23f32-8b16-4bad-9476-9f27952185b5")}catch{}})();const s="_wrapper_1t7jb_17",n={wrapper:s};function p({children:e}){return t.jsx(o,{permission:"editor",children:t.jsx("div",{className:n.wrapper,children:e})})}export{p as default};
2
- //# sourceMappingURL=EditorFeatureWrapper-DzBxDvRn.js.map
1
+ import{j as t}from"./vendor-CCiSQ9k9.js";import{P as o}from"./ProtectRoute-CrcWfOlG.js";import"./index-BQEUaoAf.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},r=new e.Error().stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="8ca23f32-8b16-4bad-9476-9f27952185b5",e._sentryDebugIdIdentifier="sentry-dbid-8ca23f32-8b16-4bad-9476-9f27952185b5")}catch{}})();const s="_wrapper_1t7jb_17",n={wrapper:s};function p({children:e}){return t.jsx(o,{permission:"editor",children:t.jsx("div",{className:n.wrapper,children:e})})}export{p as default};
2
+ //# sourceMappingURL=EditorFeatureWrapper-DHfuO3EA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditorFeatureWrapper-DzBxDvRn.js","sources":["../../src/features/EditorFeatureWrapper.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\n\nimport ProtectRoute from '../common/components/protect-route/ProtectRoute';\n\nimport style from './EditorFeatureWrapper.module.scss';\n\nexport default function EditorFeatureWrapper({ children }: PropsWithChildren) {\n return (\n <ProtectRoute permission='editor'>\n <div className={style.wrapper}>{children}</div>\n </ProtectRoute>\n );\n}\n"],"names":["EditorFeatureWrapper","children","jsx","ProtectRoute","style"],"mappings":"wfAMwB,SAAAA,EAAqB,CAAE,SAAAC,GAA+B,CAE1E,OAAAC,EAAA,IAACC,EAAa,CAAA,WAAW,SACvB,SAAAD,EAAAA,IAAC,OAAI,UAAWE,EAAM,QAAU,SAAAH,CAAA,CAAS,CAC3C,CAAA,CAEJ"}
1
+ {"version":3,"file":"EditorFeatureWrapper-DHfuO3EA.js","sources":["../../src/features/EditorFeatureWrapper.tsx"],"sourcesContent":["import { PropsWithChildren } from 'react';\n\nimport ProtectRoute from '../common/components/protect-route/ProtectRoute';\n\nimport style from './EditorFeatureWrapper.module.scss';\n\nexport default function EditorFeatureWrapper({ children }: PropsWithChildren) {\n return (\n <ProtectRoute permission='editor'>\n <div className={style.wrapper}>{children}</div>\n </ProtectRoute>\n );\n}\n"],"names":["EditorFeatureWrapper","children","jsx","ProtectRoute","style"],"mappings":"wfAMwB,SAAAA,EAAqB,CAAE,SAAAC,GAA+B,CAE1E,OAAAC,EAAA,IAACC,EAAa,CAAA,WAAW,SACvB,SAAAD,EAAAA,IAAC,OAAI,UAAWE,EAAM,QAAU,SAAAH,CAAA,CAAS,CAC3C,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as o,x as c}from"./vendor-Cu5xgv5K.js";import{i as a}from"./index-5QAOtSTh.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="ebb179af-b686-4c02-8241-b0ad08c460e9",e._sentryDebugIdIdentifier="sentry-dbid-ebb179af-b686-4c02-8241-b0ad08c460e9")}catch{}})();const l="_blink_xcz5k_1",i="_fourtyfive_xcz5k_13",_="_corner_xcz5k_17",b="_header_xcz5k_36",f="_title_xcz5k_40",d="_label_xcz5k_48",u="_separator_xcz5k_56",x="_horizontal_xcz5k_59",p="_vertical_xcz5k_63",s={blink:l,fourtyfive:i,corner:_,header:b,title:f,label:d,separator:u,horizontal:x,vertical:p};function z({className:e,...t}){return o.jsx(c,{className:a([s.corner,e]),...t})}function h({children:e,className:t,...r}){const n=a([s.title,t]);return o.jsx("h3",{className:n,...r,children:e})}function m({children:e,className:t,...r}){const n=a([s.label,t]);return o.jsx("label",{className:n,...r,children:e})}function v({className:e,orientation:t="vertical",...r}){return o.jsx("div",{className:a([s.separator,s[t],e]),role:"separator",...r})}export{z as C,m as L,v as S,h as T};
2
- //# sourceMappingURL=EditorUtils-De0umjb-.js.map
1
+ import{j as o,x as c}from"./vendor-CCiSQ9k9.js";import{i as a}from"./index-BQEUaoAf.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="ebb179af-b686-4c02-8241-b0ad08c460e9",e._sentryDebugIdIdentifier="sentry-dbid-ebb179af-b686-4c02-8241-b0ad08c460e9")}catch{}})();const l="_blink_xcz5k_1",i="_fourtyfive_xcz5k_13",_="_corner_xcz5k_17",b="_header_xcz5k_36",f="_title_xcz5k_40",d="_label_xcz5k_48",u="_separator_xcz5k_56",x="_horizontal_xcz5k_59",p="_vertical_xcz5k_63",s={blink:l,fourtyfive:i,corner:_,header:b,title:f,label:d,separator:u,horizontal:x,vertical:p};function z({className:e,...t}){return o.jsx(c,{className:a([s.corner,e]),...t})}function h({children:e,className:t,...r}){const n=a([s.title,t]);return o.jsx("h3",{className:n,...r,children:e})}function m({children:e,className:t,...r}){const n=a([s.label,t]);return o.jsx("label",{className:n,...r,children:e})}function v({className:e,orientation:t="vertical",...r}){return o.jsx("div",{className:a([s.separator,s[t],e]),role:"separator",...r})}export{z as C,m as L,v as S,h as T};
2
+ //# sourceMappingURL=EditorUtils-Da5ALK1P.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditorUtils-De0umjb-.js","sources":["../../src/common/components/editor-utils/EditorUtils.tsx"],"sourcesContent":["import type { HTMLAttributes, LabelHTMLAttributes } from 'react';\nimport { IconBaseProps } from 'react-icons';\nimport { IoArrowUp } from 'react-icons/io5';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './EditorUtils.module.scss';\n\nexport function Corner({ className, ...elementProps }: IconBaseProps) {\n return <IoArrowUp className={cx([style.corner, className])} {...elementProps} />;\n}\n\nexport function Title({ children, className, ...elementProps }: HTMLAttributes<HTMLHeadingElement>) {\n const classes = cx([style.title, className]);\n return (\n <h3 className={classes} {...elementProps}>\n {children}\n </h3>\n );\n}\n\nexport function Label({ children, className, ...elementProps }: LabelHTMLAttributes<HTMLLabelElement>) {\n const classes = cx([style.label, className]);\n return (\n <label className={classes} {...elementProps}>\n {children}\n </label>\n );\n}\n\ninterface SeparatorProps extends HTMLAttributes<HTMLDivElement> {\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport function Separator({ className, orientation = 'vertical', ...elementProps }: SeparatorProps) {\n return <div className={cx([style.separator, style[orientation], className])} role='separator' {...elementProps} />;\n}\n"],"names":["Corner","className","elementProps","jsx","IoArrowUp","cx","style","Title","children","classes","Label","Separator","orientation"],"mappings":"6tBAQO,SAASA,EAAO,CAAE,UAAAC,EAAW,GAAGC,GAA+B,CAC7D,OAAAC,MAACC,EAAU,CAAA,UAAWC,EAAG,CAACC,EAAM,OAAQL,CAAS,CAAC,EAAI,GAAGC,CAAc,CAAA,CAChF,CAEO,SAASK,EAAM,CAAE,SAAAC,EAAU,UAAAP,EAAW,GAAGC,GAAoD,CAClG,MAAMO,EAAUJ,EAAG,CAACC,EAAM,MAAOL,CAAS,CAAC,EAC3C,aACG,KAAG,CAAA,UAAWQ,EAAU,GAAGP,EACzB,SAAAM,EACH,CAEJ,CAEO,SAASE,EAAM,CAAE,SAAAF,EAAU,UAAAP,EAAW,GAAGC,GAAuD,CACrG,MAAMO,EAAUJ,EAAG,CAACC,EAAM,MAAOL,CAAS,CAAC,EAC3C,aACG,QAAM,CAAA,UAAWQ,EAAU,GAAGP,EAC5B,SAAAM,EACH,CAEJ,CAMO,SAASG,EAAU,CAAE,UAAAV,EAAW,YAAAW,EAAc,WAAY,GAAGV,GAAgC,CAClG,aAAQ,MAAI,CAAA,UAAWG,EAAG,CAACC,EAAM,UAAWA,EAAMM,CAAW,EAAGX,CAAS,CAAC,EAAG,KAAK,YAAa,GAAGC,EAAc,CAClH"}
1
+ {"version":3,"file":"EditorUtils-Da5ALK1P.js","sources":["../../src/common/components/editor-utils/EditorUtils.tsx"],"sourcesContent":["import type { HTMLAttributes, LabelHTMLAttributes } from 'react';\nimport { IconBaseProps } from 'react-icons';\nimport { IoArrowUp } from 'react-icons/io5';\n\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './EditorUtils.module.scss';\n\nexport function Corner({ className, ...elementProps }: IconBaseProps) {\n return <IoArrowUp className={cx([style.corner, className])} {...elementProps} />;\n}\n\nexport function Title({ children, className, ...elementProps }: HTMLAttributes<HTMLHeadingElement>) {\n const classes = cx([style.title, className]);\n return (\n <h3 className={classes} {...elementProps}>\n {children}\n </h3>\n );\n}\n\nexport function Label({ children, className, ...elementProps }: LabelHTMLAttributes<HTMLLabelElement>) {\n const classes = cx([style.label, className]);\n return (\n <label className={classes} {...elementProps}>\n {children}\n </label>\n );\n}\n\ninterface SeparatorProps extends HTMLAttributes<HTMLDivElement> {\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport function Separator({ className, orientation = 'vertical', ...elementProps }: SeparatorProps) {\n return <div className={cx([style.separator, style[orientation], className])} role='separator' {...elementProps} />;\n}\n"],"names":["Corner","className","elementProps","jsx","IoArrowUp","cx","style","Title","children","classes","Label","Separator","orientation"],"mappings":"6tBAQO,SAASA,EAAO,CAAE,UAAAC,EAAW,GAAGC,GAA+B,CAC7D,OAAAC,MAACC,EAAU,CAAA,UAAWC,EAAG,CAACC,EAAM,OAAQL,CAAS,CAAC,EAAI,GAAGC,CAAc,CAAA,CAChF,CAEO,SAASK,EAAM,CAAE,SAAAC,EAAU,UAAAP,EAAW,GAAGC,GAAoD,CAClG,MAAMO,EAAUJ,EAAG,CAACC,EAAM,MAAOL,CAAS,CAAC,EAC3C,aACG,KAAG,CAAA,UAAWQ,EAAU,GAAGP,EACzB,SAAAM,EACH,CAEJ,CAEO,SAASE,EAAM,CAAE,SAAAF,EAAU,UAAAP,EAAW,GAAGC,GAAuD,CACrG,MAAMO,EAAUJ,EAAG,CAACC,EAAM,MAAOL,CAAS,CAAC,EAC3C,aACG,QAAM,CAAA,UAAWQ,EAAU,GAAGP,EAC5B,SAAAM,EACH,CAEJ,CAMO,SAASG,EAAU,CAAE,UAAAV,EAAW,YAAAW,EAAc,WAAY,GAAGV,GAAgC,CAClG,aAAQ,MAAI,CAAA,UAAWG,EAAG,CAACC,EAAM,UAAWA,EAAMM,CAAW,EAAGX,CAAS,CAAC,EAAG,KAAK,YAAa,GAAGC,EAAc,CAClH"}
@@ -1,2 +1,2 @@
1
- import{j as n}from"./vendor-Cu5xgv5K.js";import{i as o,b1 as a}from"./index-5QAOtSTh.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="896b8487-ed05-4973-9a31-a50ff9e0836c",e._sentryDebugIdIdentifier="sentry-dbid-896b8487-ed05-4973-9a31-a50ff9e0836c")}catch{}})();const r="_emptyContainer_xiuvv_17",d="_empty_xiuvv_17",y="_text_xiuvv_26",s={emptyContainer:r,empty:d,text:y};function m({text:e,className:t,injectedStyles:i}){return n.jsxs("div",{className:o([s.emptyContainer,t]),style:i,children:[n.jsx(a,{className:s.empty}),e&&n.jsx("span",{className:s.text,children:e})]})}export{m as E};
2
- //# sourceMappingURL=Empty-BYF0tVRk.js.map
1
+ import{j as n}from"./vendor-CCiSQ9k9.js";import{i as o,b1 as a}from"./index-BQEUaoAf.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="896b8487-ed05-4973-9a31-a50ff9e0836c",e._sentryDebugIdIdentifier="sentry-dbid-896b8487-ed05-4973-9a31-a50ff9e0836c")}catch{}})();const r="_emptyContainer_xiuvv_17",d="_empty_xiuvv_17",y="_text_xiuvv_26",s={emptyContainer:r,empty:d,text:y};function m({text:e,className:t,injectedStyles:i}){return n.jsxs("div",{className:o([s.emptyContainer,t]),style:i,children:[n.jsx(a,{className:s.empty}),e&&n.jsx("span",{className:s.text,children:e})]})}export{m as E};
2
+ //# sourceMappingURL=Empty-gWT_HMeu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Empty-BYF0tVRk.js","sources":["../../src/common/components/state/Empty.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\n\nimport EmptyImage from '../../../assets/images/empty.svg?react';\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './Empty.module.scss';\n\ninterface EmptyProps {\n text?: string;\n injectedStyles?: CSSProperties;\n className?: string;\n}\n\nexport default function Empty({ text, className, injectedStyles }: EmptyProps) {\n return (\n <div className={cx([style.emptyContainer, className])} style={injectedStyles}>\n <EmptyImage className={style.empty} />\n {text && <span className={style.text}>{text}</span>}\n </div>\n );\n}\n"],"names":["Empty","text","className","injectedStyles","jsxs","cx","style","jsx","EmptyImage"],"mappings":"iiBAaA,SAAwBA,EAAM,CAAE,KAAAC,EAAM,UAAAC,EAAW,eAAAC,GAA8B,CAE3E,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAWC,EAAG,CAACC,EAAM,eAAgBJ,CAAS,CAAC,EAAG,MAAOC,EAC5D,SAAA,CAACI,EAAAA,IAAAC,EAAA,CAAW,UAAWF,EAAM,KAAO,CAAA,EACnCL,GAASM,EAAAA,IAAA,OAAA,CAAK,UAAWD,EAAM,KAAO,SAAKL,CAAA,CAAA,CAAA,EAC9C,CAEJ"}
1
+ {"version":3,"file":"Empty-gWT_HMeu.js","sources":["../../src/common/components/state/Empty.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\n\nimport EmptyImage from '../../../assets/images/empty.svg?react';\nimport { cx } from '../../utils/styleUtils';\n\nimport style from './Empty.module.scss';\n\ninterface EmptyProps {\n text?: string;\n injectedStyles?: CSSProperties;\n className?: string;\n}\n\nexport default function Empty({ text, className, injectedStyles }: EmptyProps) {\n return (\n <div className={cx([style.emptyContainer, className])} style={injectedStyles}>\n <EmptyImage className={style.empty} />\n {text && <span className={style.text}>{text}</span>}\n </div>\n );\n}\n"],"names":["Empty","text","className","injectedStyles","jsxs","cx","style","jsx","EmptyImage"],"mappings":"iiBAaA,SAAwBA,EAAM,CAAE,KAAAC,EAAM,UAAAC,EAAW,eAAAC,GAA8B,CAE3E,OAAAC,EAAA,KAAC,MAAI,CAAA,UAAWC,EAAG,CAACC,EAAM,eAAgBJ,CAAS,CAAC,EAAG,MAAOC,EAC5D,SAAA,CAACI,EAAAA,IAAAC,EAAA,CAAW,UAAWF,EAAM,KAAO,CAAA,EACnCL,GAASM,EAAAA,IAAA,OAAA,CAAK,UAAWD,EAAM,KAAO,SAAKL,CAAA,CAAA,CAAA,EAC9C,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as n}from"./vendor-Cu5xgv5K.js";import{E as s}from"./Empty-BYF0tVRk.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="6a2fc055-09c3-4c46-a7fd-6a27bcc357e8",e._sentryDebugIdIdentifier="sentry-dbid-6a2fc055-09c3-4c46-a7fd-6a27bcc357e8")}catch{}})();const a="_page_27rqx_22",d={page:a};function f({text:e,injectedStyles:t}){return n.jsx("div",{className:d.page,children:n.jsx(s,{text:e,injectedStyles:t})})}export{f as E};
2
- //# sourceMappingURL=EmptyPage-DYH2bswA.js.map
1
+ import{j as n}from"./vendor-CCiSQ9k9.js";import{E as s}from"./Empty-gWT_HMeu.js";(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new e.Error().stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="6a2fc055-09c3-4c46-a7fd-6a27bcc357e8",e._sentryDebugIdIdentifier="sentry-dbid-6a2fc055-09c3-4c46-a7fd-6a27bcc357e8")}catch{}})();const a="_page_27rqx_22",d={page:a};function f({text:e,injectedStyles:t}){return n.jsx("div",{className:d.page,children:n.jsx(s,{text:e,injectedStyles:t})})}export{f as E};
2
+ //# sourceMappingURL=EmptyPage-Dcbg6rmF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyPage-DYH2bswA.js","sources":["../../src/common/components/state/EmptyPage.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\n\nimport Empty from './Empty';\n\nimport style from './EmptyPage.module.scss';\n\ninterface EmptyPageProps {\n text?: string;\n injectedStyles?: CSSProperties;\n}\n\nexport default function EmptyPage({ text, injectedStyles }: EmptyPageProps) {\n return (\n <div className={style.page}>\n <Empty text={text} injectedStyles={injectedStyles} />\n </div>\n );\n}\n"],"names":["EmptyPage","text","injectedStyles","jsx","style","Empty"],"mappings":"+cAWA,SAAwBA,EAAU,CAAE,KAAAC,EAAM,eAAAC,GAAkC,CAExE,OAAAC,EAAA,IAAC,OAAI,UAAWC,EAAM,KACpB,SAACD,EAAAA,IAAAE,EAAA,CAAM,KAAAJ,EAAY,eAAAC,CAAA,CAAgC,CACrD,CAAA,CAEJ"}
1
+ {"version":3,"file":"EmptyPage-Dcbg6rmF.js","sources":["../../src/common/components/state/EmptyPage.tsx"],"sourcesContent":["import { CSSProperties } from 'react';\n\nimport Empty from './Empty';\n\nimport style from './EmptyPage.module.scss';\n\ninterface EmptyPageProps {\n text?: string;\n injectedStyles?: CSSProperties;\n}\n\nexport default function EmptyPage({ text, injectedStyles }: EmptyPageProps) {\n return (\n <div className={style.page}>\n <Empty text={text} injectedStyles={injectedStyles} />\n </div>\n );\n}\n"],"names":["EmptyPage","text","injectedStyles","jsx","style","Empty"],"mappings":"+cAWA,SAAwBA,EAAU,CAAE,KAAAC,EAAM,eAAAC,GAAkC,CAExE,OAAAC,EAAA,IAAC,OAAI,UAAWC,EAAM,KACpB,SAACD,EAAAA,IAAAE,EAAA,CAAM,KAAAJ,EAAY,eAAAC,CAAA,CAAgC,CACrD,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e,b1 as d}from"./vendor-Cu5xgv5K.js";import{i}from"./index-5QAOtSTh.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new o.Error().stack;t&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[t]="0c586c03-1aa6-405b-816c-116786379711",o._sentryDebugIdIdentifier="sentry-dbid-0c586c03-1aa6-405b-816c-116786379711")}catch{}})();const c="_followButton_58wqq_17",r="_hidden_58wqq_38",s={followButton:c,hidden:r};function u(o){const{isVisible:t,onClickHandler:n}=o,l=i([s.followButton,!t&&s.hidden]);return e.jsxs("button",{className:l,onClick:n,type:"button",children:[e.jsx(d,{}),"Follow"]})}export{u as F};
2
- //# sourceMappingURL=FollowButton-DyWsvyFF.js.map
1
+ import{j as e,b1 as d}from"./vendor-CCiSQ9k9.js";import{i}from"./index-BQEUaoAf.js";(function(){try{var o=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new o.Error().stack;t&&(o._sentryDebugIds=o._sentryDebugIds||{},o._sentryDebugIds[t]="0c586c03-1aa6-405b-816c-116786379711",o._sentryDebugIdIdentifier="sentry-dbid-0c586c03-1aa6-405b-816c-116786379711")}catch{}})();const c="_followButton_58wqq_17",r="_hidden_58wqq_38",s={followButton:c,hidden:r};function u(o){const{isVisible:t,onClickHandler:n}=o,l=i([s.followButton,!t&&s.hidden]);return e.jsxs("button",{className:l,onClick:n,type:"button",children:[e.jsx(d,{}),"Follow"]})}export{u as F};
2
+ //# sourceMappingURL=FollowButton-CSqJSvix.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FollowButton-DyWsvyFF.js","sources":["../../src/features/operator/follow-button/FollowButton.tsx"],"sourcesContent":["import { IoLocate } from 'react-icons/io5';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './FollowButton.module.scss';\n\ninterface FollowButtonProps {\n isVisible: boolean;\n onClickHandler: () => void;\n}\n\nexport default function FollowButton(props: FollowButtonProps) {\n const { isVisible, onClickHandler } = props;\n\n const classes = cx([style.followButton, !isVisible && style.hidden]);\n\n return (\n <button className={classes} onClick={onClickHandler} type='button'>\n <IoLocate />\n Follow\n </button>\n );\n}\n"],"names":["FollowButton","props","isVisible","onClickHandler","classes","cx","style","jsx","IoLocate"],"mappings":"ggBAWA,SAAwBA,EAAaC,EAA0B,CACvD,KAAA,CAAE,UAAAC,EAAW,eAAAC,CAAA,EAAmBF,EAEhCG,EAAUC,EAAG,CAACC,EAAM,aAAc,CAACJ,GAAaI,EAAM,MAAM,CAAC,EAEnE,cACG,SAAO,CAAA,UAAWF,EAAS,QAASD,EAAgB,KAAK,SACxD,SAAA,CAAAI,EAAA,IAACC,EAAS,EAAA,EAAE,QAAA,EAEd,CAEJ"}
1
+ {"version":3,"file":"FollowButton-CSqJSvix.js","sources":["../../src/features/operator/follow-button/FollowButton.tsx"],"sourcesContent":["import { IoLocate } from 'react-icons/io5';\n\nimport { cx } from '../../../common/utils/styleUtils';\n\nimport style from './FollowButton.module.scss';\n\ninterface FollowButtonProps {\n isVisible: boolean;\n onClickHandler: () => void;\n}\n\nexport default function FollowButton(props: FollowButtonProps) {\n const { isVisible, onClickHandler } = props;\n\n const classes = cx([style.followButton, !isVisible && style.hidden]);\n\n return (\n <button className={classes} onClick={onClickHandler} type='button'>\n <IoLocate />\n Follow\n </button>\n );\n}\n"],"names":["FollowButton","props","isVisible","onClickHandler","classes","cx","style","jsx","IoLocate"],"mappings":"ggBAWA,SAAwBA,EAAaC,EAA0B,CACvD,KAAA,CAAE,UAAAC,EAAW,eAAAC,CAAA,EAAmBF,EAEhCG,EAAUC,EAAG,CAACC,EAAM,aAAc,CAACJ,GAAaI,EAAM,MAAM,CAAC,EAEnE,cACG,SAAO,CAAA,UAAWF,EAAS,QAASD,EAAgB,KAAK,SACxD,SAAA,CAAAI,EAAA,IAACC,EAAS,EAAA,EAAE,QAAA,EAEd,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{h as l,j as e,aL as A,x as B,bR as P,br as R,bS as D,bT as S,bU as w}from"./vendor-Cu5xgv5K.js";import{C as I,S as L}from"./EditorUtils-De0umjb-.js";import{i as _,af as V,bI as F,c as O,T as d,bg as q,a as y,av as k,bJ as T,B as C,bK as o,bL as H,ai as N,bM as U,bv as $,bw as z}from"./index-5QAOtSTh.js";import{P as J}from"./ProtectRoute-p1fmtLeu.js";import{S as K}from"./Select-niU9Razm.js";import{T as g}from"./Tooltip-DJ8Y4CO4.js";import{s as j}from"./Editor.module-DvV2efYs.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="34a975dc-77bc-49c8-9b4e-918d39012530",s._sentryDebugIdIdentifier="sentry-dbid-34a975dc-77bc-49c8-9b4e-918d39012530")}catch{}})();const W="_label_o0qma_17",G="_active_o0qma_21",Q="_inputItems_o0qma_90",h={label:W,active:G,inputItems:Q};function E(s){const{label:t,placeholder:n,text:a,visible:u,changeHandler:f,children:c}=s,[m,x]=l.useState(a),i=l.useRef(null),p=l.useRef(0);l.useEffect(()=>{i.current&&i.current!==document.activeElement&&(i.current.selectionStart=p.current,i.current.selectionEnd=p.current)},[a]),l.useEffect(()=>{i.current!==document.activeElement&&x(a)},[a]);const v=b=>{p.current=b.target.selectionStart??0,x(b.target.value),f(b.target.value)};return e.jsxs("div",{className:h.inputRow,children:[e.jsx("label",{className:_([h.label,u??h.active]),htmlFor:t,children:t}),e.jsxs("div",{className:h.inputItems,children:[e.jsx(V,{id:t,ref:i,value:m,onChange:v,placeholder:n}),c]})]})}const X="_blink_18658_1",Y="_previewContainer_18658_25",Z="_preview_18658_25",ee="_options_18658_39",te="_eventStatus_18658_45",se="_mainContent_18658_54",ne="_secondaryContent_18658_70",ae="_blackout_18658_74",re="_statusIcon_18658_83",r={blink:X,previewContainer:Y,preview:Z,options:ee,eventStatus:te,mainContent:se,secondaryContent:ne,blackout:ae,statusIcon:re},oe={aux1:"Aux 1",aux2:"Aux 2",aux3:"Aux 3",secondary:"Secondary message"};function ie(){const{blink:s,blackout:t,countToEnd:n,phase:a,secondarySource:u,showTimerMessage:f,timerType:c}=F(),{data:m}=O(),x=f?"Message":c===d.None?q:a===y.Pending?"Standby to start":a===y.Overtime?"Timer Overtime":c===d.Clock?"Clock":n?"Count to End":"Timer",i=f||!u?null:oe[u],p=a===y.Warning?m.warningColor??"#ffa528":a===y.Danger?m.dangerColor??"#ff7300":m.normalColor??"#FFFC",v=x=="Timer",b=_([s&&r.blink,t&&r.blackout]);return e.jsxs("div",{className:r.preview,children:[e.jsx(I,{onClick:M=>k("timer",M)}),e.jsxs("div",{className:b,children:[e.jsx("div",{className:r.mainContent,"data-phase":v&&a,style:v?{"--override-colour":p}:{},children:x}),i!==null&&e.jsx("div",{className:r.secondaryContent,children:i})]}),e.jsxs("div",{className:r.eventStatus,children:[e.jsx(g,{text:"Time type: Count down",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.CountDown,children:e.jsx(A,{})}),e.jsx(g,{text:"Time type: Count up",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.CountUp,children:e.jsx(B,{})}),e.jsx(g,{text:"Time type: Clock",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.Clock,children:e.jsx(P,{})}),e.jsx(g,{text:"Time type: None",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.None,children:e.jsx(R,{})}),e.jsx(g,{text:n?"Count to end":"Count duration",render:e.jsx("span",{}),className:r.statusIcon,"data-active":n,children:e.jsx(D,{})})]})]})}function ce(){const{blackout:s,blink:t}=T();return e.jsxs("div",{className:r.previewContainer,children:[e.jsx(ie,{}),e.jsxs("div",{className:r.options,children:[e.jsx(le,{}),e.jsx(L,{orientation:"horizontal"}),e.jsx(C,{variant:t?"primary":"subtle",fluid:!0,onClick:()=>o.timerBlink(!t),"data-testid":"toggle timer blink",children:"Blink"}),e.jsx(C,{variant:s?"primary":"subtle",fluid:!0,onClick:()=>o.timerBlackout(!s),"data-testid":"toggle timer blackout",children:"Blackout screen"})]})]})}function le(){const{secondarySource:s}=T(),[t,n]=l.useState("aux1");l.useEffect(()=>{s!==null&&n(s)},[s]);const a=()=>{s===t?o.timerSecondarySource(null):o.timerSecondarySource(t)};return e.jsxs(e.Fragment,{children:[e.jsx(K,{value:t,options:[{value:"aux1",label:"Aux 1"},{value:"aux2",label:"Aux 2"},{value:"aux3",label:"Aux 3"},{value:"secondary",label:"Secondary message"}],onValueChange:u=>{s!==null&&o.timerSecondarySource(u),n(u)}}),e.jsx(C,{variant:s!==null?"primary":"subtle",fluid:!0,onClick:a,"data-testid":"toggle secondary",children:"Show secondary"})]})}function ue(){return e.jsxs(e.Fragment,{children:[e.jsx(ce,{}),e.jsx(de,{}),e.jsx(me,{})]})}function de(){const{text:s,visible:t}=H();return e.jsx(E,{label:"Timer Message",placeholder:"Message shown fullscreen in stage timer",text:s,visible:t,changeHandler:n=>o.timerText(n),children:e.jsx(N,{"aria-label":"Toggle timer message visibility",onClick:()=>o.timerVisible(!t),variant:t?"primary":"subtle",children:t?e.jsx(S,{}):e.jsx(w,{})})})}function me(){const{text:s,visible:t}=U(),n=()=>{t?o.timerSecondarySource(null):o.timerSecondarySource("secondary")};return e.jsx(E,{label:"Secondary Message",placeholder:"Message shown as secondary text in stage timer",text:s,visible:t,changeHandler:a=>o.secondaryMessage(a),children:e.jsx(N,{"aria-label":"Toggle secondary message visibility",onClick:n,variant:t?"primary":"subtle",children:t?e.jsx(S,{}):e.jsx(w,{})})})}const je=l.memo(xe);function xe(){const s=window.location.pathname.includes("/messagecontrol"),t=_([j.content,j.contentColumnLayout]);return e.jsx(J,{permission:"editor",children:e.jsxs("div",{className:j.messages,"data-testid":"panel-messages-control",children:[!s&&e.jsx(I,{onClick:n=>k("messagecontrol",n)}),s&&e.jsx($,{suppressSettings:!0}),e.jsx("div",{className:t,children:e.jsx(z,{children:e.jsx(ue,{})})})]})})}export{je as default};
2
- //# sourceMappingURL=MessageControlExport-yLGU2dMq.js.map
1
+ import{h as l,j as e,aL as A,x as B,bR as P,br as R,bS as D,bT as S,bU as w}from"./vendor-CCiSQ9k9.js";import{C as I,S as L}from"./EditorUtils-Da5ALK1P.js";import{i as _,af as V,bI as F,c as O,T as d,bg as q,a as y,av as k,bJ as T,B as C,bK as o,bL as H,ai as N,bM as U,bv as $,bw as z}from"./index-BQEUaoAf.js";import{P as J}from"./ProtectRoute-CrcWfOlG.js";import{S as K}from"./Select-CedN80WS.js";import{T as g}from"./Tooltip-D9XRnwOW.js";import{s as j}from"./Editor.module-DvV2efYs.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="34a975dc-77bc-49c8-9b4e-918d39012530",s._sentryDebugIdIdentifier="sentry-dbid-34a975dc-77bc-49c8-9b4e-918d39012530")}catch{}})();const W="_label_o0qma_17",G="_active_o0qma_21",Q="_inputItems_o0qma_90",h={label:W,active:G,inputItems:Q};function E(s){const{label:t,placeholder:n,text:a,visible:u,changeHandler:f,children:c}=s,[m,x]=l.useState(a),i=l.useRef(null),p=l.useRef(0);l.useEffect(()=>{i.current&&i.current!==document.activeElement&&(i.current.selectionStart=p.current,i.current.selectionEnd=p.current)},[a]),l.useEffect(()=>{i.current!==document.activeElement&&x(a)},[a]);const v=b=>{p.current=b.target.selectionStart??0,x(b.target.value),f(b.target.value)};return e.jsxs("div",{className:h.inputRow,children:[e.jsx("label",{className:_([h.label,u??h.active]),htmlFor:t,children:t}),e.jsxs("div",{className:h.inputItems,children:[e.jsx(V,{id:t,ref:i,value:m,onChange:v,placeholder:n}),c]})]})}const X="_blink_18658_1",Y="_previewContainer_18658_25",Z="_preview_18658_25",ee="_options_18658_39",te="_eventStatus_18658_45",se="_mainContent_18658_54",ne="_secondaryContent_18658_70",ae="_blackout_18658_74",re="_statusIcon_18658_83",r={blink:X,previewContainer:Y,preview:Z,options:ee,eventStatus:te,mainContent:se,secondaryContent:ne,blackout:ae,statusIcon:re},oe={aux1:"Aux 1",aux2:"Aux 2",aux3:"Aux 3",secondary:"Secondary message"};function ie(){const{blink:s,blackout:t,countToEnd:n,phase:a,secondarySource:u,showTimerMessage:f,timerType:c}=F(),{data:m}=O(),x=f?"Message":c===d.None?q:a===y.Pending?"Standby to start":a===y.Overtime?"Timer Overtime":c===d.Clock?"Clock":n?"Count to End":"Timer",i=f||!u?null:oe[u],p=a===y.Warning?m.warningColor??"#ffa528":a===y.Danger?m.dangerColor??"#ff7300":m.normalColor??"#FFFC",v=x=="Timer",b=_([s&&r.blink,t&&r.blackout]);return e.jsxs("div",{className:r.preview,children:[e.jsx(I,{onClick:M=>k("timer",M)}),e.jsxs("div",{className:b,children:[e.jsx("div",{className:r.mainContent,"data-phase":v&&a,style:v?{"--override-colour":p}:{},children:x}),i!==null&&e.jsx("div",{className:r.secondaryContent,children:i})]}),e.jsxs("div",{className:r.eventStatus,children:[e.jsx(g,{text:"Time type: Count down",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.CountDown,children:e.jsx(A,{})}),e.jsx(g,{text:"Time type: Count up",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.CountUp,children:e.jsx(B,{})}),e.jsx(g,{text:"Time type: Clock",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.Clock,children:e.jsx(P,{})}),e.jsx(g,{text:"Time type: None",render:e.jsx("span",{}),className:r.statusIcon,"data-active":c===d.None,children:e.jsx(R,{})}),e.jsx(g,{text:n?"Count to end":"Count duration",render:e.jsx("span",{}),className:r.statusIcon,"data-active":n,children:e.jsx(D,{})})]})]})}function ce(){const{blackout:s,blink:t}=T();return e.jsxs("div",{className:r.previewContainer,children:[e.jsx(ie,{}),e.jsxs("div",{className:r.options,children:[e.jsx(le,{}),e.jsx(L,{orientation:"horizontal"}),e.jsx(C,{variant:t?"primary":"subtle",fluid:!0,onClick:()=>o.timerBlink(!t),"data-testid":"toggle timer blink",children:"Blink"}),e.jsx(C,{variant:s?"primary":"subtle",fluid:!0,onClick:()=>o.timerBlackout(!s),"data-testid":"toggle timer blackout",children:"Blackout screen"})]})]})}function le(){const{secondarySource:s}=T(),[t,n]=l.useState("aux1");l.useEffect(()=>{s!==null&&n(s)},[s]);const a=()=>{s===t?o.timerSecondarySource(null):o.timerSecondarySource(t)};return e.jsxs(e.Fragment,{children:[e.jsx(K,{value:t,options:[{value:"aux1",label:"Aux 1"},{value:"aux2",label:"Aux 2"},{value:"aux3",label:"Aux 3"},{value:"secondary",label:"Secondary message"}],onValueChange:u=>{s!==null&&o.timerSecondarySource(u),n(u)}}),e.jsx(C,{variant:s!==null?"primary":"subtle",fluid:!0,onClick:a,"data-testid":"toggle secondary",children:"Show secondary"})]})}function ue(){return e.jsxs(e.Fragment,{children:[e.jsx(ce,{}),e.jsx(de,{}),e.jsx(me,{})]})}function de(){const{text:s,visible:t}=H();return e.jsx(E,{label:"Timer Message",placeholder:"Message shown fullscreen in stage timer",text:s,visible:t,changeHandler:n=>o.timerText(n),children:e.jsx(N,{"aria-label":"Toggle timer message visibility",onClick:()=>o.timerVisible(!t),variant:t?"primary":"subtle",children:t?e.jsx(S,{}):e.jsx(w,{})})})}function me(){const{text:s,visible:t}=U(),n=()=>{t?o.timerSecondarySource(null):o.timerSecondarySource("secondary")};return e.jsx(E,{label:"Secondary Message",placeholder:"Message shown as secondary text in stage timer",text:s,visible:t,changeHandler:a=>o.secondaryMessage(a),children:e.jsx(N,{"aria-label":"Toggle secondary message visibility",onClick:n,variant:t?"primary":"subtle",children:t?e.jsx(S,{}):e.jsx(w,{})})})}const je=l.memo(xe);function xe(){const s=window.location.pathname.includes("/messagecontrol"),t=_([j.content,j.contentColumnLayout]);return e.jsx(J,{permission:"editor",children:e.jsxs("div",{className:j.messages,"data-testid":"panel-messages-control",children:[!s&&e.jsx(I,{onClick:n=>k("messagecontrol",n)}),s&&e.jsx($,{suppressSettings:!0}),e.jsx("div",{className:t,children:e.jsx(z,{children:e.jsx(ue,{})})})]})})}export{je as default};
2
+ //# sourceMappingURL=MessageControlExport-lXK21piH.js.map